1*79e3f901SStefano Ceccherini #ifndef _KERNEL_ARCH_x86_MSI_H 2*79e3f901SStefano Ceccherini #define _KERNEL_ARCH_x86_MSI_H 3*79e3f901SStefano Ceccherini 4*79e3f901SStefano Ceccherini #include <SupportDefs.h> 5*79e3f901SStefano Ceccherini 6*79e3f901SStefano Ceccherini // address register 7*79e3f901SStefano Ceccherini #define MSI_ADDRESS_BASE 0xfee00000 8*79e3f901SStefano Ceccherini #define MSI_DESTINATION_ID_SHIFT 12 9*79e3f901SStefano Ceccherini #define MSI_REDIRECTION 0x00000008 10*79e3f901SStefano Ceccherini #define MSI_NO_REDIRECTION 0x00000000 11*79e3f901SStefano Ceccherini #define MSI_DESTINATION_MODE_LOGICAL 0x00000004 12*79e3f901SStefano Ceccherini #define MSI_DESTINATION_MODE_PHYSICAL 0x00000000 13*79e3f901SStefano Ceccherini 14*79e3f901SStefano Ceccherini // data register 15*79e3f901SStefano Ceccherini #define MSI_TRIGGER_MODE_EDGE 0x00000000 16*79e3f901SStefano Ceccherini #define MSI_TRIGGER_MODE_LEVEL 0x00008000 17*79e3f901SStefano Ceccherini #define MSI_LEVEL_DEASSERT 0x00000000 18*79e3f901SStefano Ceccherini #define MSI_LEVEL_ASSERT 0x00004000 19*79e3f901SStefano Ceccherini #define MSI_DELIVERY_MODE_FIXED 0x00000000 20*79e3f901SStefano Ceccherini #define MSI_DELIVERY_MODE_LOWEST_PRIO 0x00000100 21*79e3f901SStefano Ceccherini #define MSI_DELIVERY_MODE_SMI 0x00000200 22*79e3f901SStefano Ceccherini #define MSI_DELIVERY_MODE_NMI 0x00000400 23*79e3f901SStefano Ceccherini #define MSI_DELIVERY_MODE_INIT 0x00000500 24*79e3f901SStefano Ceccherini #define MSI_DELIVERY_MODE_EXT_INT 0x00000700 25*79e3f901SStefano Ceccherini 26*79e3f901SStefano Ceccherini 27*79e3f901SStefano Ceccherini void msi_init(); 28*79e3f901SStefano Ceccherini bool msi_supported(); 29*79e3f901SStefano Ceccherini status_t msi_allocate_vectors(uint8 count, uint8 *startVector, 30*79e3f901SStefano Ceccherini uint64 *address, uint16 *data); 31*79e3f901SStefano Ceccherini void msi_free_vectors(uint8 count, uint8 startVector); 32*79e3f901SStefano Ceccherini 33*79e3f901SStefano Ceccherini #endif // _KERNEL_ARCH_x86_MSI_H 34