msi.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #pragma once
  2. #include <common/glib.h>
  3. /**
  4. * @brief msi消息内容结构体
  5. *
  6. */
  7. struct msi_msg_t
  8. {
  9. uint32_t address_lo;
  10. uint32_t address_hi;
  11. uint32_t data;
  12. uint32_t vector_control;
  13. };
  14. struct pci_msi_desc_t
  15. {
  16. union
  17. {
  18. uint32_t msi_mask; // [PCI MSI] MSI cached mask bits
  19. uint32_t msix_ctrl; // [PCI MSI-X] MSI-X cached per vector control bits
  20. };
  21. struct
  22. {
  23. uint8_t is_msix : 1; // [PCI MSI/X] True if MSI-X
  24. uint8_t can_mask : 1; // [PCI MSI/X] Masking supported?
  25. uint8_t is_64 : 1; // [PCI MSI/X] Address size: 0=32bit 1=64bit
  26. } msi_attribute;
  27. };
  28. /**
  29. * @brief msi capability list的结构
  30. *
  31. */
  32. struct pci_msi_cap_t
  33. {
  34. uint8_t cap_id;
  35. uint8_t next_off;
  36. uint16_t msg_ctrl;
  37. uint32_t msg_addr_lo;
  38. uint32_t msg_addr_hi;
  39. uint16_t msg_data;
  40. uint16_t Rsvd;
  41. uint32_t mask;
  42. uint32_t pending;
  43. };
  44. /**
  45. * @brief MSI-X的capability list结构体
  46. *
  47. */
  48. struct pci_msix_cap_t
  49. {
  50. uint8_t cap_id;
  51. uint8_t next_off;
  52. uint16_t msg_ctrl;
  53. uint32_t dword1; // 该DWORD的组成为:[Table Offset][BIR2:0].
  54. // 由于Table Offset是8字节对齐的,因此mask掉该dword的BIR部分,就是table offset的值
  55. uint32_t dword2; // 该DWORD的组成为:[Pending Bit Offset][Pending Bit BIR2:0].
  56. // 由于Pending Bit Offset是8字节对齐的,因此mask掉该dword的BIR部分,就是Pending Bit Offset的值
  57. };
  58. /**
  59. * @brief msi描述符
  60. *
  61. */
  62. struct msi_desc_t
  63. {
  64. uint16_t irq_num; // 中断向量号
  65. uint16_t processor; // 定向投递的处理器
  66. uint16_t edge_trigger; // 是否边缘触发
  67. uint16_t assert; // 是否高电平触发
  68. struct pci_device_structure_header_t *pci_dev; // 对应的pci设备的结构体
  69. struct msi_msg_t msg; // msi消息
  70. uint16_t msi_index; // msi描述符的index
  71. struct pci_msi_desc_t pci; // 与pci相关的msi描述符数据
  72. };
  73. /**
  74. * @brief 启用 Message Signaled Interrupts
  75. *
  76. * @param header 设备header
  77. * @param vector 中断向量号
  78. * @param processor 要投递到的处理器
  79. * @param edge_trigger 是否边缘触发
  80. * @param assert 是否高电平触发
  81. *
  82. * @return 返回码
  83. */
  84. int pci_enable_msi(struct msi_desc_t *msi_desc);
  85. /**
  86. * @brief 禁用指定设备的msi
  87. *
  88. * @param header pci header
  89. * @return int
  90. */
  91. int pci_disable_msi(void *header);
  92. /**
  93. * @brief 在已配置好msi寄存器的设备上,使能msi
  94. *
  95. * @param header 设备头部
  96. * @return int 返回码
  97. */
  98. int pci_start_msi(void *header);