pci_irq.c 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include "pci_irq.h"
  2. #include "exception/irq.h"
  3. #include <common/errno.h>
  4. #include <common/kprint.h>
  5. // 现在pci设备的中断由自己进行控制,这些不执行内容的函数是为了适配旧的中断处理机制
  6. void pci_irq_enable(ul irq_num)
  7. {
  8. }
  9. void pci_irq_disable(ul irq_num)
  10. {
  11. }
  12. void pci_irq_install(ul irq_num)
  13. {
  14. }
  15. void pci_irq_uninstall(ul irq_num)
  16. {
  17. }
  18. /// @brief 与本操作系统的中断机制进行交互,把中断处理函数等注册到中断结构体中(被rust调用)
  19. /// @param irq_num 要进行注册的中断号
  20. /// @param pci_irq_handler 对应的中断处理函数
  21. /// @param parameter 中断处理函数传入参数
  22. /// @param irq_name 中断名字
  23. /// @param pci_irq_ack 对于中断的回复,为NULL时会使用默认回应
  24. uint16_t c_irq_install(ul irq_num,void (*pci_irq_handler)(ul irq_num, ul parameter, struct pt_regs *regs),ul parameter,const char *irq_name,void (*pci_irq_ack)(ul irq_num))
  25. {
  26. // 由于为I/O APIC分配的中断向量号是从32开始的,因此要减去32才是对应的interrupt_desc的元素
  27. irq_desc_t *p = NULL;
  28. if (irq_num >= 32 && irq_num < 0x80)
  29. p = &interrupt_desc[irq_num - 32];
  30. else if (irq_num >= 150 && irq_num < 200)
  31. p = &local_apic_interrupt_desc[irq_num - 150];
  32. else
  33. {
  34. //kerror("irq install for pci irq: invalid irq num: %ld.", irq_num);
  35. return EINVAL;
  36. }
  37. if(p->irq_name!=NULL)
  38. {
  39. return EAGAIN;
  40. }
  41. hardware_intr_controller* pci_interrupt_controller = kmalloc(sizeof(hardware_intr_controller),0);
  42. pci_interrupt_controller->enable = pci_irq_enable;
  43. pci_interrupt_controller->disable = pci_irq_disable;
  44. pci_interrupt_controller->install= pci_irq_install;
  45. pci_interrupt_controller->uninstall= pci_irq_uninstall;
  46. if(pci_irq_ack)
  47. pci_interrupt_controller->ack = pci_irq_ack;
  48. int namelen = sizeof(strlen(irq_name) + 1);
  49. p->irq_name = (char *)kmalloc(namelen, 0);
  50. memset(p->irq_name, 0, namelen);
  51. strncpy(p->irq_name, irq_name, namelen);
  52. p->parameter = parameter;
  53. p->flags = 0;
  54. p->handler = pci_irq_handler;
  55. return 0;
  56. };
  57. /// @brief 与本操作系统的中断机制进行交互,把中断处理函数等从中断结构体中移除,需要释放空间的进行空间的释放
  58. /// @param irq_num 要进行注销的中断号
  59. void c_irq_uninstall(ul irq_num)
  60. {
  61. // 由于为I/O APIC分配的中断向量号是从32开始的,因此要减去32才是对应的interrupt_desc的元素
  62. irq_desc_t *p = NULL;
  63. if (irq_num >= 32 && irq_num < 0x80)
  64. p = &interrupt_desc[irq_num - 32];
  65. else if (irq_num >= 150 && irq_num < 200)
  66. p = &local_apic_interrupt_desc[irq_num - 150];
  67. else
  68. {
  69. kerror("irq install for pci irq: invalid irq num: %ld.", irq_num);
  70. }
  71. if(p->irq_name!=NULL)
  72. {
  73. kfree(p->irq_name);
  74. p->irq_name = NULL;
  75. }
  76. if(p->controller!=NULL)
  77. {
  78. kfree(p->controller);
  79. p->controller = NULL;
  80. }
  81. p->parameter = 0;
  82. p->handler = NULL;
  83. }