acpi_stub.c revision 119880
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: head/sys/boot/ia64/ski/acpi_stub.c 119880 2003-09-08 09:11:32Z obrien $");
29
30#include <contrib/dev/acpica/acpi.h>
31
32#define APIC_IO_SAPIC                   6
33#define APIC_LOCAL_SAPIC                7
34
35#pragma pack(1)
36
37typedef struct  /* LOCAL SAPIC */
38{
39        APIC_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
48typedef struct  /* IO SAPIC */
49{
50        APIC_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
60struct {
61	APIC_TABLE		Header;
62	LOCAL_SAPIC		cpu0;
63	LOCAL_SAPIC		cpu1;
64	LOCAL_SAPIC		cpu2;
65	LOCAL_SAPIC		cpu3;
66	IO_SAPIC		sapic;
67} apic = {
68	/* Header. */
69	{
70		{
71			APIC_SIG,		/* Signature. */
72			sizeof(apic),		/* Length of table. */
73			0,			/* ACPI minor revision. */
74			0,			/* XXX checksum. */
75			"FBSD",			/* OEM Id. */
76			"SKI",			/* OEM table Id. */
77			0,			/* OEM revision. */
78			"FBSD",			/* ASL compiler Id. */
79			0			/* ASL revision. */
80		},
81		0xfee00000,
82	},
83	/* cpu0. */
84	{
85		{
86			APIC_LOCAL_SAPIC,	/* Type. */
87			sizeof(apic.cpu0)	/* Length. */
88		},
89		0,				/* ACPI processor id */
90		0,				/* Processor local SAPIC id */
91		0,				/* Processor local SAPIC eid */
92		{ 0, 0, 0 },
93		1,				/* FL: Enabled. */
94	},
95	/* cpu1. */
96	{
97		{
98			APIC_LOCAL_SAPIC,	/* Type. */
99			sizeof(apic.cpu1)	/* Length. */
100		},
101		1,				/* ACPI processor id */
102		0,				/* Processor local SAPIC id */
103		1,				/* Processor local SAPIC eid */
104		{ 0, 0, 0 },
105		1,				/* FL: Enabled. */
106	},
107	/* cpu2. */
108	{
109		{
110			APIC_LOCAL_SAPIC,	/* Type. */
111			sizeof(apic.cpu2)	/* Length. */
112		},
113		2,				/* ACPI processor id */
114		1,				/* Processor local SAPIC id */
115		0,				/* Processor local SAPIC eid */
116		{ 0, 0, 0 },
117		0,				/* FL: Enabled. */
118	},
119	/* cpu3. */
120	{
121		{
122			APIC_LOCAL_SAPIC,	/* Type. */
123			sizeof(apic.cpu3)	/* Length. */
124		},
125		3,				/* ACPI processor id */
126		1,				/* Processor local SAPIC id */
127		1,				/* Processor local SAPIC eid */
128		{ 0, 0, 0 },
129		0,				/* FL: Enabled. */
130	},
131	/* sapic. */
132	{
133		{
134			APIC_IO_SAPIC,		/* Type. */
135			sizeof(apic.sapic)	/* Length. */
136		},
137		4,				/* IO SAPIC id. */
138		0,
139		16,				/* Interrupt base. */
140		0xfec00000			/* IO SAPIC address. */
141	}
142};
143
144struct {
145	ACPI_TABLE_HEADER	Header;
146	UINT64			apic_tbl;
147} xsdt = {
148	{
149		XSDT_SIG,		/* Signature. */
150		sizeof(xsdt),		/* Length of table. */
151		0,			/* ACPI minor revision. */
152		0,			/* XXX checksum. */
153		"FBSD",			/* OEM Id. */
154		"SKI",			/* OEM table Id. */
155		0,			/* OEM revision. */
156		"FBSD",			/* ASL compiler Id. */
157		0			/* ASL revision. */
158	},
159	NULL				/* XXX APIC table address. */
160};
161
162RSDP_DESCRIPTOR acpi_root = {
163	RSDP_SIG,
164	0,				/* XXX checksum. */
165	"FBSD",
166	2,				/* ACPI Rev 2.0. */
167	NULL,
168	sizeof(xsdt),			/* XSDT length. */
169	NULL,				/* XXX PA of XSDT. */
170	0,				/* XXX Extended checksum. */
171};
172
173static void
174cksum(void *addr, int sz, UINT8 *sum)
175{
176	UINT8 *p, s;
177
178	p = addr;
179	s = 0;
180	while (sz--)
181		s += *p++;
182	*sum = -s;
183}
184
185void
186acpi_stub_init(void)
187{
188	acpi_root.XsdtPhysicalAddress = (UINT64)&xsdt;
189	cksum(&acpi_root, 20, &acpi_root.Checksum);
190	cksum(&acpi_root, sizeof(acpi_root), &acpi_root.ExtendedChecksum);
191
192	xsdt.apic_tbl = (UINT32)&apic;
193	cksum(&xsdt, sizeof(xsdt), &xsdt.Header.Checksum);
194}
195