dev/acpi: Implement uACPI kernel APIs
This commit is contained in:
+25
-10
@@ -61,11 +61,7 @@ static void apic_msi_eoi(struct irq_line* self) {
|
||||
lapic_eoi(&percpu_ref(arch_data)->lapic);
|
||||
}
|
||||
|
||||
errno_t arch_irq_alloc_msi(struct msi_line** out) {
|
||||
struct apic_msi_line* line = mem_alloc(sizeof(*line), 0);
|
||||
if (!line)
|
||||
return ENOMEM;
|
||||
|
||||
errno_t apic_alloc_vector(struct irq_line* line, uint8_t* out_vector, uint32_t* out_lapic) {
|
||||
irq_lock();
|
||||
struct arch_percpu* arch_cpu = percpu_ref(arch_data);
|
||||
size_t slot;
|
||||
@@ -75,20 +71,39 @@ errno_t arch_irq_alloc_msi(struct msi_line** out) {
|
||||
}
|
||||
if (slot == ARRAY_SIZE(arch_cpu->irq_lines)) {
|
||||
irq_unlock();
|
||||
mem_free(line);
|
||||
return ENOSPC;
|
||||
}
|
||||
|
||||
*out_vector = slot + 0x20;
|
||||
*out_lapic = arch_cpu->lapic.id;
|
||||
arch_cpu->irq_lines[slot] = line;
|
||||
irq_unlock();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void apic_free_vector(uint8_t vector) {
|
||||
irq_lock();
|
||||
percpu_ref(arch_data)->irq_lines[vector - 0x20] = nullptr;
|
||||
irq_unlock();
|
||||
}
|
||||
|
||||
errno_t arch_irq_alloc_msi(struct msi_line** out) {
|
||||
struct apic_msi_line* line = mem_alloc(sizeof(*line), 0);
|
||||
if (!line)
|
||||
return ENOMEM;
|
||||
|
||||
line->msi.line.set_config = apic_msi_set_config;
|
||||
line->msi.line.mask = apic_msi_mask;
|
||||
line->msi.line.unmask = apic_msi_unmask;
|
||||
line->msi.line.eoi = apic_msi_eoi;
|
||||
line->msi.msg_addr = apic_msi_msg_addr;
|
||||
line->msi.msg_data = apic_msi_msg_data;
|
||||
line->vector = slot + 0x20;
|
||||
line->lapic = arch_cpu->lapic.id;
|
||||
arch_cpu->irq_lines[slot] = &line->msi.line;
|
||||
irq_unlock();
|
||||
|
||||
errno_t status = apic_alloc_vector(&line->msi.line, &line->vector, &line->lapic);
|
||||
if (status) {
|
||||
mem_free(line);
|
||||
return status;
|
||||
}
|
||||
|
||||
*out = &line->msi;
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user