Add non-MSI IRQ functionality to PCI

This commit is contained in:
Mark
2020-03-19 15:31:58 +02:00
parent 1ddd1b9cc8
commit b40d495e4e
6 changed files with 401 additions and 16 deletions
+3 -1
View File
@@ -3,6 +3,8 @@
// irq.h header to provide controller-agnostic interface
#include "sys/types.h"
struct pci_device;
#define IOAPIC_REG_ID 0x00
#define IOAPIC_REG_VER 0x01
#define IOAPIC_REG_REDIR 0x10
@@ -50,4 +52,4 @@ uint8_t amd64_ioapic_leg_gsi(uint8_t leg_irq);
#define PCI_IRQ_INVALID 0xFFFFFFFE
int amd64_pci_init_irqs(void);
uint32_t amd64_pci_pin_irq_route(uint8_t bus, uint8_t dev, uint8_t func, uint8_t pin);
uint32_t amd64_pci_pin_irq_route(struct pci_device *dev, uint8_t pin);
+2 -1
View File
@@ -9,6 +9,7 @@
#define IRQ_UNHANDLED ((uint32_t) -1)
typedef uint32_t (*irq_handler_func_t) (void *);
struct pci_device;
struct irq_handler {
irq_handler_func_t func;
@@ -18,7 +19,7 @@ struct irq_handler {
int irq_add_handler(uint8_t gsi, irq_handler_func_t handler, void *ctx);
int irq_add_leg_handler(uint8_t leg_irq, irq_handler_func_t handler, void *ctx);
int irq_add_msi_handler(irq_handler_func_t handler, void *ctx, uint8_t *vector);
//int irq_add_pci_handler(pci_addr_t addr, uint8_t pin, irq_handler_func_t handler, void *ctx);
int irq_add_pci_handler(struct pci_device *dev, uint8_t pin, irq_handler_func_t handler, void *ctx);
int irq_has_handler(uint8_t gsi);
+5
View File
@@ -21,14 +21,19 @@
struct pci_device;
typedef void (*pci_driver_func_t)(struct pci_device *dev);
void pci_get_device_address(const struct pci_device *dev, uint8_t *b, uint8_t *d, uint8_t *f);
void pci_init(void);
void pci_add_root_bus(uint8_t n);
uint32_t pci_config_read_dword_legacy(uint8_t bus, uint8_t dev, uint8_t func, uint32_t off);
uint32_t pci_config_read_dword(struct pci_device *dev, uint16_t off);
void pci_config_write_dword_legacy(uint8_t bus, uint8_t dev, uint8_t func, uint32_t off, uint32_t val);
void pci_config_write_dword(struct pci_device *dev, uint16_t off, uint32_t val);
void pci_add_irq(struct pci_device *dev, irq_handler_func_t handler, void *ctx);
void pci_add_class_driver(uint32_t full_class, pci_driver_func_t func, const char *name);
void pci_add_device_driver(uint32_t id, pci_driver_func_t func, const char *name);
// pcidb.c
const char *pci_class_string(uint16_t full_class);