Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2293 Serge 1
#include 
2
#include 
3
#include "acpi.h"
4
 
5
extern acpi_rsdp_t* acpi_rsdp;
6
extern acpi_rsdt_t* acpi_rsdt;
7
 
8
addr_t acpi_ioapic;
9
addr_t acpi_local_apic;
10
 
11
u8_t __fastcall acpi_table_checksum(u32_t length, u8_t *buffer);
12
 
13
u8_t __fastcall acpi_table_checksum(u32_t length, u8_t *buffer)
14
{
15
    u8_t  sum = 0;
16
    u8_t *end = buffer + length;
17
 
18
    while (buffer < end)
19
    {
20
        sum = (u8_t)(sum + *(buffer++));
21
    }
22
 
23
    return sum;
24
};
25
 
26
void* acpi_remap_table(addr_t table)
27
{
28
    addr_t ptr;
29
 
30
    if( (table >= acpi_rsdp->rsdt_ptr)&&
31
        (table < acpi_rsdp->rsdt_ptr+0x10000))
32
        ptr = (table - acpi_rsdp->rsdt_ptr+(addr_t)acpi_rsdt);
33
    return (void*)ptr;
34
};
35
 
36
 
37
void print_rsdt(acpi_rsdt_t *rsdt)
38
{
39
    u32_t i;
40
    dbgprintf("ACPI RSD Table\n");
41
    for (i = 0; i < ((rsdt->header.len-sizeof(acpi_thead_t))/
42
                sizeof(rsdt->ptrs[0])); i++)
43
    {
44
        acpi_thead_t* t = (acpi_thead_t*)acpi_remap_table(rsdt->ptrs[i]);
45
        char *p = (char*)&t->sig;
46
        dbgprintf("sig %d: %c%c%c%c  base %x\n", i,
47
        p[0],p[1],p[2],p[3], t);
48
    };
49
};
50
 
51
 
52
void print_madt (acpi_madt_t * madt)
53
{
54
    u32_t i;
55
 
56
    acpi_local_apic = madt->local_apic_addr;
57
 
58
    dbgprintf ("Local APIC at 0x%x\n\n", acpi_local_apic);
59
 
60
    for (i = 0; i < (madt->header.len - sizeof (acpi_madt_t));)
61
    {
62
        acpi_madt_hdr_t * h = (acpi_madt_hdr_t*) &madt->data[i];
63
        switch (h->type)
64
        {
65
            case 0:
66
            {
67
                // Local APIC
68
                acpi_madt_lapic_t * lapic = (acpi_madt_lapic_t *) h;
69
                dbgprintf ("Local APIC  ");
70
                dbgprintf ("[Id: 0x%x, CPU Id: 0x%x, %s]\n",
71
                lapic->id, lapic->apic_processor_id,
72
                lapic->flags.enabled ? "enabled" : "disabled");
73
                break;
74
            }
75
            case 1:
76
            {
77
                // I/O Apic
78
                acpi_madt_ioapic_t * ioapic = (acpi_madt_ioapic_t *) h;
79
 
80
                acpi_ioapic = ioapic->address;
81
 
82
                dbgprintf ("I/O APIC    ");
83
                dbgprintf ("[Id: 0x%x, IRQ base: %d, Addr: 0x%x]\n",
84
                ioapic->id, ioapic->irq_base, acpi_ioapic);
85
                break;
86
            }
87
            case 2:
88
            {
89
                // Interrupt Source Override
90
                acpi_madt_irq_t * irq = (acpi_madt_irq_t *) h;
91
                polarity_t p = irq_get_polarity(irq);
92
                trigger_mode_t t = irq_get_trigger_mode(irq);
93
 
94
                dbgprintf ("Interrupt Override  ");
95
                dbgprintf ("[%s, Bus IRQ: %d, Glob IRQ: %d, Pol: %s, Trigger: %s]\n",
96
                irq->src_bus == 0 ? "ISA" : "unknown bus",
97
                irq->src_irq, irq->dest,
98
                p == conform_polarity ? "conform" :
99
                p == active_high ? "active high" :
100
                p == active_low ? "active low" : "?",
101
                t == conform_trigger ? "conform" :
102
                t == edge ? "edge" :
103
                t == level ? "level" : "?");
104
                break;
105
            }
106
            case 3:
107
            {
108
                // NMI Source
109
 
110
                acpi_madt_nmi_t * nmi = (acpi_madt_nmi_t *) h;
111
                polarity_t p = nmi_get_polarity(nmi);
112
                trigger_mode_t t = nmi_get_trigger_mode(nmi);
113
                dbgprintf ("NMI Source  ");
114
                dbgprintf ("[Glob IRQ: %d, Pol: %s, Trigger: %s]\n",
115
                    nmi->irq,
116
                    p == conform_polarity ? "conform" :
117
                    p == active_high ? "active high" :
118
                    p == active_low ? "active low" : "?",
119
                    t == conform_trigger ? "conform" :
120
                    t == edge ? "edge" :
121
                    t == level ? "level" : "?");
122
 
123
                break;
124
            }
125
            case 4:
126
            {
127
                // Local APIC NMI
128
                acpi_lapic_nmi_t *nmi = (acpi_lapic_nmi_t *) h;
129
 
130
                polarity_t p = lapic_nmi_get_polarity(nmi);
131
                trigger_mode_t t = lapic_nmi_get_trigger_mode(nmi);
132
 
133
                dbgprintf ("Local APIC NMI\n");
134
 
135
                dbgprintf ("[CPU id: %d, LINT#: %d Pol: %s, Trigger: %s]\n",
136
                    nmi->apic_processor_id,
137
                    nmi->lint,
138
                    p == conform_polarity ? "conform" :
139
                    p == active_high ? "active high" :
140
                    p == active_low ? "active low" : "?",
141
                    t == conform_trigger ? "conform" :
142
                    t == edge ? "edge" :
143
                    t == level ? "level" : "?");
144
                break;
145
            }
146
            case 5:
147
            {
148
                // Local APIC Address Override
149
                dbgprintf ("Local APIC Address Override\n");
150
                break;
151
            }
152
            case 8:
153
            {
154
                // Platform Interrupt Source
155
                dbgprintf ("Platform Interrupt Source\n");
156
                break;
157
            }
158
        }
159
 
160
        i += h->len;
161
    }
162
};
163