1/* @title: I/O APIC */
2#pragma once
3#include <stdbool.h>
4#include <stdint.h>
5#include <types/types.h>
6struct ioapic_info {
7 uint8_t id;
8 uint32_t gsi_base;
9 uint32_t *mmio_base;
10};
11
12union ioapic_redirection_entry {
13 uint64_t raw;
14 struct {
15 uint8_t vector; // bits 0-7
16 uint8_t delivery_mode : 3; // bits 8-10
17 uint8_t dest_mode : 1; // bit 11
18 uint8_t delivery_status : 1; // bit 12 (read-only)
19 uint8_t polarity : 1; // bit 13
20 uint8_t remote_irr : 1; // bit 14 (read-only)
21 uint8_t trigger_mode : 1; // bit 15
22 uint8_t mask : 1; // bit 16
23 uint16_t reserved : 15; // bits 17-31
24 uint8_t reserved2; // bits 32-39 (lower part of 64-bit)
25 uint8_t reserved3; // bits 40-47
26 uint8_t reserved4; // bits 48-55
27 uint8_t dest_apic_id; // bits 56-63
28 };
29};
30
31void ioapic_init(void);
32void ioapic_set_redirection_entry(int irq, uint64_t entry);
33void ioapic_route_irq(irq_t irq, uint8_t vector, uint8_t dest_apic_id,
34 bool masked);
35