Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 2292 → Rev 2293

/drivers/devman/acpinfo/acpi.c
0,0 → 1,164
#include <ddk.h>
#include <syscall.h>
#include "acpi.h"
 
extern acpi_rsdp_t* acpi_rsdp;
extern acpi_rsdt_t* acpi_rsdt;
 
addr_t acpi_ioapic;
addr_t acpi_local_apic;
 
u8_t __fastcall acpi_table_checksum(u32_t length, u8_t *buffer);
 
u8_t __fastcall acpi_table_checksum(u32_t length, u8_t *buffer)
{
u8_t sum = 0;
u8_t *end = buffer + length;
 
while (buffer < end)
{
sum = (u8_t)(sum + *(buffer++));
}
 
return sum;
};
 
void* acpi_remap_table(addr_t table)
{
addr_t ptr;
 
if( (table >= acpi_rsdp->rsdt_ptr)&&
(table < acpi_rsdp->rsdt_ptr+0x10000))
ptr = (table - acpi_rsdp->rsdt_ptr+(addr_t)acpi_rsdt);
return (void*)ptr;
};
 
 
void print_rsdt(acpi_rsdt_t *rsdt)
{
u32_t i;
dbgprintf("ACPI RSD Table\n");
for (i = 0; i < ((rsdt->header.len-sizeof(acpi_thead_t))/
sizeof(rsdt->ptrs[0])); i++)
{
acpi_thead_t* t = (acpi_thead_t*)acpi_remap_table(rsdt->ptrs[i]);
char *p = (char*)&t->sig;
dbgprintf("sig %d: %c%c%c%c base %x\n", i,
p[0],p[1],p[2],p[3], t);
};
};
 
 
void print_madt (acpi_madt_t * madt)
{
u32_t i;
 
acpi_local_apic = madt->local_apic_addr;
 
dbgprintf ("Local APIC at 0x%x\n\n", acpi_local_apic);
 
for (i = 0; i < (madt->header.len - sizeof (acpi_madt_t));)
{
acpi_madt_hdr_t * h = (acpi_madt_hdr_t*) &madt->data[i];
switch (h->type)
{
case 0:
{
// Local APIC
acpi_madt_lapic_t * lapic = (acpi_madt_lapic_t *) h;
dbgprintf ("Local APIC ");
dbgprintf ("[Id: 0x%x, CPU Id: 0x%x, %s]\n",
lapic->id, lapic->apic_processor_id,
lapic->flags.enabled ? "enabled" : "disabled");
break;
}
case 1:
{
// I/O Apic
acpi_madt_ioapic_t * ioapic = (acpi_madt_ioapic_t *) h;
 
acpi_ioapic = ioapic->address;
 
dbgprintf ("I/O APIC ");
dbgprintf ("[Id: 0x%x, IRQ base: %d, Addr: 0x%x]\n",
ioapic->id, ioapic->irq_base, acpi_ioapic);
break;
}
case 2:
{
// Interrupt Source Override
acpi_madt_irq_t * irq = (acpi_madt_irq_t *) h;
polarity_t p = irq_get_polarity(irq);
trigger_mode_t t = irq_get_trigger_mode(irq);
 
dbgprintf ("Interrupt Override ");
dbgprintf ("[%s, Bus IRQ: %d, Glob IRQ: %d, Pol: %s, Trigger: %s]\n",
irq->src_bus == 0 ? "ISA" : "unknown bus",
irq->src_irq, irq->dest,
p == conform_polarity ? "conform" :
p == active_high ? "active high" :
p == active_low ? "active low" : "?",
t == conform_trigger ? "conform" :
t == edge ? "edge" :
t == level ? "level" : "?");
break;
}
case 3:
{
// NMI Source
 
acpi_madt_nmi_t * nmi = (acpi_madt_nmi_t *) h;
polarity_t p = nmi_get_polarity(nmi);
trigger_mode_t t = nmi_get_trigger_mode(nmi);
dbgprintf ("NMI Source ");
dbgprintf ("[Glob IRQ: %d, Pol: %s, Trigger: %s]\n",
nmi->irq,
p == conform_polarity ? "conform" :
p == active_high ? "active high" :
p == active_low ? "active low" : "?",
t == conform_trigger ? "conform" :
t == edge ? "edge" :
t == level ? "level" : "?");
 
break;
}
case 4:
{
// Local APIC NMI
acpi_lapic_nmi_t *nmi = (acpi_lapic_nmi_t *) h;
 
polarity_t p = lapic_nmi_get_polarity(nmi);
trigger_mode_t t = lapic_nmi_get_trigger_mode(nmi);
 
dbgprintf ("Local APIC NMI\n");
 
dbgprintf ("[CPU id: %d, LINT#: %d Pol: %s, Trigger: %s]\n",
nmi->apic_processor_id,
nmi->lint,
p == conform_polarity ? "conform" :
p == active_high ? "active high" :
p == active_low ? "active low" : "?",
t == conform_trigger ? "conform" :
t == edge ? "edge" :
t == level ? "level" : "?");
break;
}
case 5:
{
// Local APIC Address Override
dbgprintf ("Local APIC Address Override\n");
break;
}
case 8:
{
// Platform Interrupt Source
dbgprintf ("Platform Interrupt Source\n");
break;
}
}
 
i += h->len;
}
};