drm_pagemap_util.h 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /* SPDX-License-Identifier: MIT */
  2. /*
  3. * Copyright © 2025 Intel Corporation
  4. */
  5. #ifndef _DRM_PAGEMAP_UTIL_H_
  6. #define _DRM_PAGEMAP_UTIL_H_
  7. #include <linux/list.h>
  8. #include <linux/mutex.h>
  9. struct drm_device;
  10. struct drm_pagemap;
  11. struct drm_pagemap_cache;
  12. struct drm_pagemap_owner;
  13. struct drm_pagemap_shrinker;
  14. /**
  15. * struct drm_pagemap_peer - Structure representing a fast interconnect peer
  16. * @list: Pointer to a &struct drm_pagemap_owner_list used to keep track of peers
  17. * @link: List link for @list's list of peers.
  18. * @owner: Pointer to a &struct drm_pagemap_owner, common for a set of peers having
  19. * fast interconnects.
  20. * @private: Pointer private to the struct embedding this struct.
  21. */
  22. struct drm_pagemap_peer {
  23. struct drm_pagemap_owner_list *list;
  24. struct list_head link;
  25. struct drm_pagemap_owner *owner;
  26. void *private;
  27. };
  28. /**
  29. * struct drm_pagemap_owner_list - Keeping track of peers and owners
  30. * @peer: List of peers.
  31. *
  32. * The owner list defines the scope where we identify peers having fast interconnects
  33. * and a common owner. Typically a driver has a single global owner list to
  34. * keep track of common owners for the driver's pagemaps.
  35. */
  36. struct drm_pagemap_owner_list {
  37. /** @lock: Mutex protecting the @peers list. */
  38. struct mutex lock;
  39. /** @peers: List of peers. */
  40. struct list_head peers;
  41. };
  42. /*
  43. * Convenience macro to define an owner list.
  44. * Typically the owner list statically declared
  45. * driver-wide.
  46. */
  47. #define DRM_PAGEMAP_OWNER_LIST_DEFINE(_name) \
  48. struct drm_pagemap_owner_list _name = { \
  49. .lock = __MUTEX_INITIALIZER((_name).lock), \
  50. .peers = LIST_HEAD_INIT((_name).peers) }
  51. void drm_pagemap_shrinker_add(struct drm_pagemap *dpagemap);
  52. int drm_pagemap_cache_lock_lookup(struct drm_pagemap_cache *cache);
  53. void drm_pagemap_cache_unlock_lookup(struct drm_pagemap_cache *cache);
  54. struct drm_pagemap_shrinker *drm_pagemap_shrinker_create_devm(struct drm_device *drm);
  55. struct drm_pagemap_cache *drm_pagemap_cache_create_devm(struct drm_pagemap_shrinker *shrinker);
  56. struct drm_pagemap *drm_pagemap_get_from_cache(struct drm_pagemap_cache *cache);
  57. void drm_pagemap_cache_set_pagemap(struct drm_pagemap_cache *cache, struct drm_pagemap *dpagemap);
  58. struct drm_pagemap *drm_pagemap_get_from_cache_if_active(struct drm_pagemap_cache *cache);
  59. #ifdef CONFIG_PROVE_LOCKING
  60. void drm_pagemap_shrinker_might_lock(struct drm_pagemap *dpagemap);
  61. #else
  62. static inline void drm_pagemap_shrinker_might_lock(struct drm_pagemap *dpagemap)
  63. {
  64. }
  65. #endif /* CONFIG_PROVE_LOCKING */
  66. void drm_pagemap_release_owner(struct drm_pagemap_peer *peer);
  67. int drm_pagemap_acquire_owner(struct drm_pagemap_peer *peer,
  68. struct drm_pagemap_owner_list *owner_list,
  69. bool (*has_interconnect)(struct drm_pagemap_peer *peer1,
  70. struct drm_pagemap_peer *peer2));
  71. #endif