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