Iros
 
Loading...
Searching...
No Matches
io_apic.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/assert/prelude.h"
4#include "di/bit/prelude.h"
7#include "iris/hw/acpi/acpi.h"
10
16
17namespace iris::x86::amd64 {
21enum class IoApicAccessOffset : u8 {
23 Window = 0x10,
24};
25
29enum class IoApicOffset : u8 {
30 Id = 0x00,
31 Version = 0x01,
34};
35
39struct IoApicVersion : di::BitField<0, 8> {};
42
48 Logical = 1,
49};
50
55struct IoApicRedirectionTableEntryDeliveryMode : di::BitEnum<ApicMessageType, 8, 3> {};
56struct IoApicRedirectionTableEntryDestinationMode : di::BitEnum<IoApicDestinationMode, 11, 1> {};
69
70class IoApic {
71public:
72 IoApic(mm::PhysicalAddress access_base, u8 global_offset);
73
74 auto id() const -> u8 { return m_id; }
75 auto max_redirection_entry() const -> u8 { return m_max_redirection_entry; }
76
78 auto direct_read64(IoApicOffset offset) -> u64 {
79 auto low = direct_read(offset);
80 auto high = direct_read(IoApicOffset(di::to_underlying(offset) + 1));
81 return (static_cast<u64>(high) << 32) | low;
82 }
84 void direct_write64(IoApicOffset offset, u64 value) {
85 direct_write(offset, static_cast<u32>(value));
86 direct_write(IoApicOffset(di::to_underlying(offset) + 1), static_cast<u32>(value >> 32));
87 }
88
90 return di::bit_cast<IoApicRedirectionTableEntry>(direct_read64(offset_for_redirection_entry(offset)));
91 }
93 direct_write64(offset_for_redirection_entry(offset), di::bit_cast<u64>(entry));
94 }
95
96private:
97 friend void tag_invoke(di::Tag<send_eoi>, IoApic&, IrqLine irq_line);
98 friend void tag_invoke(di::Tag<disable_irq_line>, IoApic&, IrqLine irq_line);
99 friend void tag_invoke(di::Tag<enable_irq_line>, IoApic&, IrqLine irq_line);
101
102 auto offset_for_redirection_entry(u8 number) -> IoApicOffset {
103 ASSERT_LT_EQ(number, m_max_redirection_entry);
105 }
106
108
109 u32 volatile* m_access { nullptr };
110 u8 m_global_offset { 0 };
111 u8 m_id { 0 };
112 u8 m_max_redirection_entry { 0 };
113};
114
115void init_io_apic();
116}
#define ASSERT_LT_EQ
Definition assert_binary.h:88
Definition bit_struct.h:11
Definition tuple_forward_declaration.h:5
Definition io_apic.h:70
auto read_redirection_entry(u8 offset) -> IoApicRedirectionTableEntry
Definition io_apic.h:89
void write_redirection_entry(u8 offset, IoApicRedirectionTableEntry entry)
Definition io_apic.h:92
void direct_write64(IoApicOffset offset, u64 value)
Definition io_apic.h:84
auto max_redirection_entry() const -> u8
Definition io_apic.h:75
void direct_write(IoApicOffset, u32)
Definition io_apic.cpp:34
IoApic(mm::PhysicalAddress access_base, u8 global_offset)
Definition io_apic.cpp:12
friend void tag_invoke(di::Tag< send_eoi >, IoApic &, IrqLine irq_line)
Definition io_apic.cpp:39
auto id() const -> u8
Definition io_apic.h:74
auto direct_read64(IoApicOffset offset) -> u64
Definition io_apic.h:78
auto direct_read(IoApicOffset) -> u32
Definition io_apic.cpp:29
__UINT64_TYPE__ u64
Definition integers.h:12
__UINT8_TYPE__ u8
Definition integers.h:9
__UINT32_TYPE__ u32
Definition integers.h:11
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
constexpr auto to_underlying
Definition to_underlying.h:15
di::StrongInt< PhysicalAddressTag > PhysicalAddress
Definition physical_address.h:12
Definition gdt.cpp:38
di::BitStruct< 4, IoApicVersion, IoApicMaxRedirectionEntry > IoApicVersionRegister
Definition io_apic.h:41
void init_io_apic()
Definition io_apic.cpp:121
IoApicOffset
IO APIC Register Offsets.
Definition io_apic.h:29
@ ArbitrationId
Definition io_apic.h:32
@ Version
Definition io_apic.h:31
@ Id
Definition io_apic.h:30
@ RedirectionTable
Definition io_apic.h:33
IoApicDestinationMode
IO APIC Destination Mode.
Definition io_apic.h:46
@ Physical
Send to a single processor.
Definition io_apic.h:47
@ Logical
Send to a bit mask of processors.
Definition io_apic.h:48
di::BitStruct< 8, IoApicRedirectionTableEntryVector, IoApicRedirectionTableEntryDeliveryMode, IoApicRedirectionTableEntryDestinationMode, IoApicRedirectionTableEntryDeliveryStatus, IoApicRedirectionTableEntryPolarity, IoApicRedirectionTableEntryRemoteIrr, IoApicRedirectionTableEntryTriggerMode, IoApicRedirectionTableEntryMask, IoApicRedirectionTableEntryDestination > IoApicRedirectionTableEntry
Definition io_apic.h:63
IoApicAccessOffset
IO APIC Access Register Offsets.
Definition io_apic.h:21
@ RegisterSelect
Definition io_apic.h:22
@ Window
Definition io_apic.h:23
di::StrongInt< IrqLineTag > IrqLine
Definition irq_controller.h:18
Definition bit_enum.h:9
Definition bit_field.h:9
Definition bit_flag.h:7
Definition irq_controller.h:20
IO APIC Redirection Table Entry.
Definition io_apic.h:54
IO APIC Version Register.
Definition io_apic.h:39