kmem.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #ifndef _PCILIB_KMEM_H
  2. #define _PCILIB_KMEM_H
  3. #include "pcilib.h"
  4. typedef int pcilib_kmem_flags_t;
  5. typedef struct {
  6. int handle_id;
  7. uintptr_t pa;
  8. // uintptr_t va;
  9. void *ua;
  10. size_t size;
  11. size_t alignment_offset;
  12. size_t mmap_offset;
  13. } pcilib_kmem_addr_t;
  14. /**
  15. * single allocation - we set only addr, n_blocks = 0
  16. * multiple allocation - addr is not set, blocks are set, n_blocks > 0
  17. * sgmap allocation - addr contains ua, but pa's are set in blocks, n_blocks > 0
  18. */
  19. typedef struct {
  20. pcilib_kmem_addr_t addr;
  21. size_t n_blocks;
  22. pcilib_kmem_addr_t blocks[];
  23. } pcilib_kmem_buffer_t;
  24. typedef void pcilib_kmem_handle_t;
  25. typedef struct pcilib_kmem_list_s pcilib_kmem_list_t;
  26. struct pcilib_kmem_list_s {
  27. pcilib_kmem_list_t *next, *prev;
  28. pcilib_kmem_buffer_t buf; // variable size, should be last item in struct
  29. };
  30. 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);
  31. void pcilib_free_kernel_memory(pcilib_t *ctx, pcilib_kmem_handle_t *k);
  32. int pcilib_sync_kernel_memory(pcilib_t *ctx, pcilib_kmem_handle_t *k, pcilib_kmem_sync_direction_t dir);
  33. void *pcilib_kmem_get_ua(pcilib_t *ctx, pcilib_kmem_handle_t *k);
  34. uintptr_t pcilib_kmem_get_pa(pcilib_t *ctx, pcilib_kmem_handle_t *k);
  35. void *pcilib_kmem_get_block_ua(pcilib_t *ctx, pcilib_kmem_handle_t *k, size_t block);
  36. uintptr_t pcilib_kmem_get_block_pa(pcilib_t *ctx, pcilib_kmem_handle_t *k, size_t block);
  37. size_t pcilib_kmem_get_block_size(pcilib_t *ctx, pcilib_kmem_handle_t *k, size_t block);
  38. #endif /* _PCILIB_KMEM_H */