dma.h 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #ifndef _PCILIB_DMA_H
  2. #define _PCILIB_DMA_H
  3. #define PCILIB_DMA_BUFFER_INVALID ((size_t)-1)
  4. typedef struct {
  5. int started;
  6. size_t ring_size, buffer_size;
  7. size_t ring_head, ring_tail;
  8. } pcilib_dma_engine_status_t;
  9. typedef enum {
  10. PCILIB_DMA_TYPE_BLOCK,
  11. PCILIB_DMA_TYPE_PACKET,
  12. PCILIB_DMA_TYPE_UNKNOWN
  13. } pcilib_dma_engine_type_t;
  14. typedef struct {
  15. pcilib_dma_engine_addr_t addr;
  16. pcilib_dma_engine_type_t type;
  17. pcilib_dma_direction_t direction;
  18. size_t addr_bits;
  19. const char *name;
  20. const char *description;
  21. } pcilib_dma_engine_description_t;
  22. typedef struct {
  23. int used;
  24. int error;
  25. int first;
  26. int last;
  27. size_t size;
  28. } pcilib_dma_buffer_status_t;
  29. /*
  30. typedef struct {
  31. int ignore_eop;
  32. } pcilib_dma_parameters_t;
  33. */
  34. typedef struct {
  35. // pcilib_dma_parameters_t params;
  36. pcilib_t *pcilib;
  37. } pcilib_dma_context_t;
  38. typedef struct {
  39. pcilib_dma_context_t *(*init)(pcilib_t *ctx, const char *model, const void *arg);
  40. void (*free)(pcilib_dma_context_t *ctx);
  41. int (*status)(pcilib_dma_context_t *ctx, pcilib_dma_engine_t dma, pcilib_dma_engine_status_t *status, size_t n_buffers, pcilib_dma_buffer_status_t *buffers);
  42. int (*enable_irq)(pcilib_dma_context_t *ctx, pcilib_irq_type_t irq_type, pcilib_dma_flags_t flags);
  43. int (*disable_irq)(pcilib_dma_context_t *ctx, pcilib_dma_flags_t flags);
  44. int (*acknowledge_irq)(pcilib_dma_context_t *ctx, pcilib_irq_type_t irq_type, pcilib_irq_source_t irq_source);
  45. int (*start_dma)(pcilib_dma_context_t *ctx, pcilib_dma_engine_t dma, pcilib_dma_flags_t flags);
  46. int (*stop_dma)(pcilib_dma_context_t *ctx, pcilib_dma_engine_t dma, pcilib_dma_flags_t flags);
  47. int (*push)(pcilib_dma_context_t *ctx, pcilib_dma_engine_t dma, uintptr_t addr, size_t size, pcilib_dma_flags_t flags, pcilib_timeout_t timeout, void *buf, size_t *written);
  48. int (*stream)(pcilib_dma_context_t *ctx, pcilib_dma_engine_t dma, uintptr_t addr, size_t size, pcilib_dma_flags_t flags, pcilib_timeout_t timeout, pcilib_dma_callback_t cb, void *cbattr);
  49. double (*benchmark)(pcilib_dma_context_t *ctx, pcilib_dma_engine_addr_t dma, uintptr_t addr, size_t size, size_t iterations, pcilib_dma_direction_t direction);
  50. } pcilib_dma_api_description_t;
  51. typedef struct {
  52. const pcilib_dma_api_description_t *api;
  53. const pcilib_register_bank_description_t *banks;
  54. const pcilib_register_description_t *registers;
  55. const pcilib_dma_engine_description_t *engines;
  56. const char *model;
  57. const void *args;
  58. const char *name;
  59. const char *description;
  60. } pcilib_dma_description_t;
  61. const pcilib_dma_description_t *pcilib_get_dma_info(pcilib_t *ctx);
  62. pcilib_dma_engine_t pcilib_add_dma_engine(pcilib_t *ctx, pcilib_dma_engine_description_t *desc);
  63. int pcilib_get_dma_status(pcilib_t *ctx, pcilib_dma_engine_t dma, pcilib_dma_engine_status_t *status, size_t n_buffers, pcilib_dma_buffer_status_t *buffers);
  64. int pcilib_init_dma(pcilib_t *ctx);
  65. #endif /* _PCILIB_DMA_H */