kmem.h 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #ifndef _PCILIB_KMEM_H
  2. #define _PCILIB_KMEM_H
  3. #include "pcilib.h"
  4. typedef struct pcilib_kmem_list_s pcilib_kmem_list_t;
  5. #include "tools.h"
  6. typedef enum {
  7. PCILIB_KMEM_FLAG_REUSE = KMEM_FLAG_REUSE,
  8. PCILIB_KMEM_FLAG_EXCLUSIVE = KMEM_FLAG_EXCLUSIVE,
  9. PCILIB_KMEM_FLAG_PERSISTENT = KMEM_FLAG_PERSISTENT,
  10. PCILIB_KMEM_FLAG_HARDWARE = KMEM_FLAG_HW,
  11. PCILIB_KMEM_FLAG_FORCE = KMEM_FLAG_FORCE,
  12. PCILIB_KMEM_FLAG_TRY = KMEM_FLAG_TRY
  13. } pcilib_kmem_flags_t;
  14. typedef enum {
  15. PCILIB_KMEM_REUSE_ALLOCATED = PCILIB_TRISTATE_NO,
  16. PCILIB_KMEM_REUSE_REUSED = PCILIB_TRISTATE_YES,
  17. PCILIB_KMEM_REUSE_PARTIAL = PCILIB_TRISTATE_PARTIAL,
  18. PCILIB_KMEM_REUSE_PERSISTENT = 0x100,
  19. PCILIB_KMEM_REUSE_HARDWARE = 0x200
  20. } pcilib_kmem_reuse_state_t;
  21. typedef struct {
  22. int handle_id;
  23. pcilib_kmem_reuse_state_t reused;
  24. uintptr_t pa;
  25. // uintptr_t va;
  26. void *ua;
  27. size_t size;
  28. size_t alignment_offset;
  29. size_t mmap_offset;
  30. } pcilib_kmem_addr_t;
  31. /**
  32. * single allocation - we set only addr, n_blocks = 0
  33. * multiple allocation - addr is not set, blocks are set, n_blocks > 0
  34. * sgmap allocation - addr contains ua, but pa's are set in blocks, n_blocks > 0
  35. */
  36. typedef struct {
  37. pcilib_kmem_addr_t addr;
  38. pcilib_kmem_reuse_state_t reused;
  39. size_t n_blocks;
  40. pcilib_kmem_addr_t blocks[];
  41. } pcilib_kmem_buffer_t;
  42. typedef void pcilib_kmem_handle_t;
  43. struct pcilib_kmem_list_s {
  44. pcilib_kmem_list_t *next, *prev;
  45. pcilib_kmem_buffer_t buf; // variable size, should be last item in struct
  46. };
  47. 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);
  48. void pcilib_free_kernel_memory(pcilib_t *ctx, pcilib_kmem_handle_t *k, pcilib_kmem_flags_t flags);
  49. //int pcilib_kmem_sync(pcilib_t *ctx, pcilib_kmem_handle_t *k, pcilib_kmem_sync_direction_t dir);
  50. int pcilib_kmem_sync_block(pcilib_t *ctx, pcilib_kmem_handle_t *k, pcilib_kmem_sync_direction_t dir, size_t block);
  51. void *pcilib_kmem_get_ua(pcilib_t *ctx, pcilib_kmem_handle_t *k);
  52. uintptr_t pcilib_kmem_get_pa(pcilib_t *ctx, pcilib_kmem_handle_t *k);
  53. uintptr_t pcilib_kmem_get_ba(pcilib_t *ctx, pcilib_kmem_handle_t *k);
  54. void *pcilib_kmem_get_block_ua(pcilib_t *ctx, pcilib_kmem_handle_t *k, size_t block);
  55. uintptr_t pcilib_kmem_get_block_pa(pcilib_t *ctx, pcilib_kmem_handle_t *k, size_t block);
  56. uintptr_t pcilib_kmem_get_block_ba(pcilib_t *ctx, pcilib_kmem_handle_t *k, size_t block);
  57. size_t pcilib_kmem_get_block_size(pcilib_t *ctx, pcilib_kmem_handle_t *k, size_t block);
  58. pcilib_kmem_reuse_state_t pcilib_kmem_is_reused(pcilib_t *ctx, pcilib_kmem_handle_t *k);
  59. int pcilib_clean_kernel_memory(pcilib_t *ctx, pcilib_kmem_use_t use, pcilib_kmem_flags_t flags);
  60. #endif /* _PCILIB_KMEM_H */