kmem.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #ifndef _PCILIB_KMEM_H
  2. #define _PCILIB_KMEM_H
  3. typedef struct pcilib_s pcilib_t;
  4. typedef struct pcilib_kmem_list_s pcilib_kmem_list_t;
  5. typedef enum {
  6. PCILIB_TRISTATE_NO = 0,
  7. PCILIB_TRISTATE_PARTIAL = 1,
  8. PCILIB_TRISTATE_YES = 2
  9. } pcilib_tristate_t;
  10. #define PCILIB_KMEM_TYPE_MASK 0xFFFF0000
  11. #define PCILIB_KMEM_USE(type, subtype) (((type) << 16)|(subtype))
  12. typedef enum {
  13. PCILIB_KMEM_TYPE_CONSISTENT = 0x00000,
  14. PCILIB_KMEM_TYPE_PAGE = 0x10000,
  15. PCILIB_KMEM_TYPE_DMA_S2C_PAGE = 0x10001,
  16. PCILIB_KMEM_TYPE_DMA_C2S_PAGE = 0x10002,
  17. PCILIB_KMEM_TYPE_REGION = 0x20000,
  18. PCILIB_KMEM_TYPE_REGION_S2C = 0x20001,
  19. PCILIB_KMEM_TYPE_REGION_C2S = 0x20002
  20. } pcilib_kmem_type_t;
  21. typedef enum {
  22. PCILIB_KMEM_USE_STANDARD = 0,
  23. PCILIB_KMEM_USE_DMA_RING = 1,
  24. PCILIB_KMEM_USE_DMA_PAGES = 2,
  25. PCILIB_KMEM_USE_USER = 0x10
  26. } pcilib_kmem_use_t;
  27. typedef enum {
  28. PCILIB_KMEM_SYNC_BIDIRECTIONAL = 0,
  29. PCILIB_KMEM_SYNC_TODEVICE = 1,
  30. PCILIB_KMEM_SYNC_FROMDEVICE = 2
  31. } pcilib_kmem_sync_direction_t;
  32. typedef enum {
  33. PCILIB_KMEM_FLAG_REUSE = 1, /**< Try to reuse existing buffer with the same use & item */
  34. PCILIB_KMEM_FLAG_EXCLUSIVE = 2, /**< Allow only a single application accessing a specified use & item */
  35. PCILIB_KMEM_FLAG_PERSISTENT = 4, /**< Sets persistent mode */
  36. PCILIB_KMEM_FLAG_HARDWARE = 8, /**< The buffer may be accessed by hardware, the hardware access will not occur any more if passed to _free function */
  37. PCILIB_KMEM_FLAG_FORCE = 16, /**< Force memory cleanup even if references are present */
  38. PCILIB_KMEM_FLAG_MASS = 32, /**< Apply to all buffers of selected use */
  39. PCILIB_KMEM_FLAG_TRY = 64 /**< Do not allocate buffers, try to reuse and fail if not possible */
  40. } pcilib_kmem_flags_t;
  41. typedef enum {
  42. PCILIB_KMEM_REUSE_ALLOCATED = PCILIB_TRISTATE_NO,
  43. PCILIB_KMEM_REUSE_REUSED = PCILIB_TRISTATE_YES,
  44. PCILIB_KMEM_REUSE_PARTIAL = PCILIB_TRISTATE_PARTIAL,
  45. PCILIB_KMEM_REUSE_PERSISTENT = 0x100,
  46. PCILIB_KMEM_REUSE_HARDWARE = 0x200
  47. } pcilib_kmem_reuse_state_t;
  48. typedef struct {
  49. int handle_id;
  50. pcilib_kmem_reuse_state_t reused;
  51. uintptr_t pa;
  52. // uintptr_t va;
  53. void *ua;
  54. size_t size;
  55. size_t alignment_offset;
  56. size_t mmap_offset;
  57. } pcilib_kmem_addr_t;
  58. /**
  59. * single allocation - we set only addr, n_blocks = 0
  60. * multiple allocation - addr is not set, blocks are set, n_blocks > 0
  61. * sgmap allocation - addr contains ua, but pa's are set in blocks, n_blocks > 0
  62. */
  63. typedef struct {
  64. pcilib_kmem_addr_t addr;
  65. pcilib_kmem_reuse_state_t reused;
  66. size_t n_blocks;
  67. pcilib_kmem_addr_t blocks[];
  68. } pcilib_kmem_buffer_t;
  69. typedef void pcilib_kmem_handle_t;
  70. struct pcilib_kmem_list_s {
  71. pcilib_kmem_list_t *next, *prev;
  72. pcilib_kmem_buffer_t buf; // variable size, should be last item in struct
  73. };
  74. pcilib_kmem_handle_t *pcilib_alloc_kernel_memory(pcilib_t *ctx, pcilib_kmem_type_t type, size_t nmemb, size_t size, size_t alignment, pcilib_kmem_use_t use, pcilib_kmem_flags_t flags);
  75. void pcilib_free_kernel_memory(pcilib_t *ctx, pcilib_kmem_handle_t *k, pcilib_kmem_flags_t flags);
  76. //int pcilib_kmem_sync(pcilib_t *ctx, pcilib_kmem_handle_t *k, pcilib_kmem_sync_direction_t dir);
  77. int pcilib_kmem_sync_block(pcilib_t *ctx, pcilib_kmem_handle_t *k, pcilib_kmem_sync_direction_t dir, size_t block);
  78. void *pcilib_kmem_get_ua(pcilib_t *ctx, pcilib_kmem_handle_t *k);
  79. uintptr_t pcilib_kmem_get_pa(pcilib_t *ctx, pcilib_kmem_handle_t *k);
  80. uintptr_t pcilib_kmem_get_ba(pcilib_t *ctx, pcilib_kmem_handle_t *k);
  81. void *pcilib_kmem_get_block_ua(pcilib_t *ctx, pcilib_kmem_handle_t *k, size_t block);
  82. uintptr_t pcilib_kmem_get_block_pa(pcilib_t *ctx, pcilib_kmem_handle_t *k, size_t block);
  83. uintptr_t pcilib_kmem_get_block_ba(pcilib_t *ctx, pcilib_kmem_handle_t *k, size_t block);
  84. size_t pcilib_kmem_get_block_size(pcilib_t *ctx, pcilib_kmem_handle_t *k, size_t block);
  85. pcilib_kmem_reuse_state_t pcilib_kmem_is_reused(pcilib_t *ctx, pcilib_kmem_handle_t *k);
  86. int pcilib_clean_kernel_memory(pcilib_t *ctx, pcilib_kmem_use_t use, pcilib_kmem_flags_t flags);
  87. #endif /* _PCILIB_KMEM_H */