kmem.h 2.6 KB

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