msi.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. };
  13. struct pci_msi_desc_t
  14. {
  15. union
  16. {
  17. uint32_t msi_mask; // [PCI MSI] MSI cached mask bits
  18. uint32_t msix_ctrl; // [PCI MSI-X] MSI-X cached per vector control bits
  19. };
  20. struct
  21. {
  22. uint8_t is_msix : 1; // [PCI MSI/X] True if MSI-X
  23. uint8_t can_mask : 1; // [PCI MSI/X] Masking supported?
  24. uint8_t is_64 : 1; // [PCI MSI/X] Address size: 0=32bit 1=64bit
  25. } msi_attribute;
  26. };
  27. /**
  28. * @brief msi描述符
  29. *
  30. */
  31. struct msi_desc_t
  32. {
  33. uint16_t irq_num; // 中断向量号
  34. uint16_t processor; // 定向投递的处理器
  35. uint16_t edge_trigger; // 是否边缘触发
  36. uint16_t assert; // 是否高电平触发
  37. struct pci_device_structure_header_t *pci_dev; // 对应的pci设备的结构体
  38. struct msi_msg_t msg; // msi消息
  39. uint16_t msi_index; // msi描述符的index
  40. struct pci_msi_desc_t pci; // 与pci相关的msi描述符数据
  41. };
  42. /**
  43. * @brief 启用 Message Signaled Interrupts
  44. *
  45. * @param header 设备header
  46. * @param vector 中断向量号
  47. * @param processor 要投递到的处理器
  48. * @param edge_trigger 是否边缘触发
  49. * @param assert 是否高电平触发
  50. *
  51. * @return 返回码
  52. */
  53. int pci_enable_msi(struct msi_desc_t * msi_desc);
  54. /**
  55. * @brief 禁用指定设备的msi
  56. *
  57. * @param header pci header
  58. * @return int
  59. */
  60. int pci_disable_msi(void *header);
  61. /**
  62. * @brief 在已配置好msi寄存器的设备上,使能msi
  63. *
  64. * @param header 设备头部
  65. * @return int 返回码
  66. */
  67. int pci_start_msi(void *header);