]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/boot/ia64/ski/acpi_stub.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / boot / ia64 / ski / acpi_stub.c
1 /*-
2  * Copyright (c) 2003 Marcel Moolenaar
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #include <sys/cdefs.h>
28 __FBSDID("$FreeBSD$");
29
30 #include <contrib/dev/acpica/include/acpi.h>
31
32 #define APIC_IO_SAPIC                   6
33 #define APIC_LOCAL_SAPIC                7
34
35 #pragma pack(1)
36
37 typedef struct  /* LOCAL SAPIC */
38 {
39         ACPI_SUBTABLE_HEADER Header;
40         UINT8           ProcessorId;            /* ACPI processor id */
41         UINT8           LocalSapicId;           /* Processor local SAPIC id */
42         UINT8           LocalSapicEid;          /* Processor local SAPIC eid */
43         UINT8           Reserved[3];
44         UINT32          ProcessorEnabled: 1;
45         UINT32          FlagsReserved: 31;
46 } LOCAL_SAPIC;
47
48 typedef struct  /* IO SAPIC */
49 {
50         ACPI_SUBTABLE_HEADER Header;
51         UINT8           IoSapicId;              /* I/O SAPIC ID */
52         UINT8           Reserved;               /* reserved - must be zero */
53         UINT32          Vector;                 /* interrupt base */
54         UINT64          IoSapicAddress;         /* SAPIC's physical address */
55 } IO_SAPIC;
56
57 /*
58  */
59
60 struct {
61         ACPI_TABLE_MADT         MADT;
62         ACPI_MADT_LOCAL_SAPIC   cpu0;
63         ACPI_MADT_LOCAL_SAPIC   cpu1;
64         ACPI_MADT_LOCAL_SAPIC   cpu2;
65         ACPI_MADT_LOCAL_SAPIC   cpu3;
66         ACPI_MADT_IO_SAPIC      sapic;
67 } apic = {
68         /* Header. */
69         {
70                 ACPI_SIG_MADT,                  /* Signature. */
71                 sizeof(apic),                   /* Length of table. */
72                 0,                              /* ACPI minor revision. */
73                 0,                              /* Checksum. */
74                 "FBSD",                         /* OEM Id. */
75                 "SKI",                          /* OEM table Id. */
76                 0,                              /* OEM revision. */
77                 "FBSD",                         /* ASL compiler Id. */
78                 0,                              /* ASL revision. */
79                 0xfee00000,
80         },
81         /* cpu0. */
82         {
83                 APIC_LOCAL_SAPIC,               /* Type. */
84                 sizeof(apic.cpu0),              /* Length. */
85                 0,                              /* ACPI processor id */
86                 0,                              /* Processor local SAPIC id */
87                 0,                              /* Processor local SAPIC eid */
88                 { 0, 0, 0 },
89                 1,                              /* FL: Enabled. */
90         },
91         /* cpu1. */
92         {
93                 APIC_LOCAL_SAPIC,               /* Type. */
94                 sizeof(apic.cpu1),              /* Length. */
95                 1,                              /* ACPI processor id */
96                 0,                              /* Processor local SAPIC id */
97                 1,                              /* Processor local SAPIC eid */
98                 { 0, 0, 0 },
99                 1,                              /* FL: Enabled. */
100         },
101         /* cpu2. */
102         {
103                 APIC_LOCAL_SAPIC,               /* Type. */
104                 sizeof(apic.cpu2),              /* Length. */
105                 2,                              /* ACPI processor id */
106                 1,                              /* Processor local SAPIC id */
107                 0,                              /* Processor local SAPIC eid */
108                 { 0, 0, 0 },
109                 0,                              /* FL: Enabled. */
110         },
111         /* cpu3. */
112         {
113                 APIC_LOCAL_SAPIC,               /* Type. */
114                 sizeof(apic.cpu3),              /* Length. */
115                 3,                              /* ACPI processor id */
116                 1,                              /* Processor local SAPIC id */
117                 1,                              /* Processor local SAPIC eid */
118                 { 0, 0, 0 },
119                 0,                              /* FL: Enabled. */
120         },
121         /* sapic. */
122         {
123                 APIC_IO_SAPIC,                  /* Type. */
124                 sizeof(apic.sapic),             /* Length. */
125                 4,                              /* IO SAPIC id. */
126                 0,
127                 16,                             /* Interrupt base. */
128                 0xfec00000                      /* IO SAPIC address. */
129         }
130 };
131
132 struct {
133         ACPI_TABLE_HEADER       Header;
134         UINT64                  apic_tbl;
135 } xsdt = {
136         {
137                 ACPI_SIG_XSDT,          /* Signature. */
138                 sizeof(xsdt),           /* Length of table. */
139                 0,                      /* ACPI minor revision. */
140                 0,                      /* XXX checksum. */
141                 "FBSD",                 /* OEM Id. */
142                 "SKI",                  /* OEM table Id. */
143                 0,                      /* OEM revision. */
144                 "FBSD",                 /* ASL compiler Id. */
145                 0                       /* ASL revision. */
146         },
147         0UL                             /* XXX APIC table address. */
148 };
149
150 ACPI_TABLE_RSDP acpi_root = {
151         ACPI_SIG_RSDP,
152         0,                              /* XXX checksum. */
153         "FBSD",
154         2,                              /* ACPI Rev 2.0. */
155         0UL,
156         sizeof(xsdt),                   /* XSDT length. */
157         0UL,                            /* XXX PA of XSDT. */
158         0,                              /* XXX Extended checksum. */
159 };
160
161 static void
162 cksum(void *addr, int sz, UINT8 *sum)
163 {
164         UINT8 *p, s;
165
166         p = addr;
167         s = 0;
168         while (sz--)
169                 s += *p++;
170         *sum = -s;
171 }
172
173 void
174 acpi_stub_init(void)
175 {
176         acpi_root.XsdtPhysicalAddress = (UINT64)&xsdt;
177         cksum(&acpi_root, 20, &acpi_root.Checksum);
178         cksum(&acpi_root, sizeof(acpi_root), &acpi_root.ExtendedChecksum);
179
180         cksum(&apic, sizeof(apic), &apic.MADT.Header.Checksum);
181         xsdt.apic_tbl = (UINT32)&apic;
182         cksum(&xsdt, sizeof(xsdt), &xsdt.Header.Checksum);
183 }