acpi_machdep.c revision 222769
1/*- 2 * Copyright (c) 2001 Doug Rabson 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 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $FreeBSD: head/sys/ia64/acpica/acpi_machdep.c 222769 2011-06-06 19:06:15Z marcel $ 27 */ 28 29#include <sys/param.h> 30#include <sys/bus.h> 31#include <machine/md_var.h> 32#include <machine/pal.h> 33 34#include <contrib/dev/acpica/include/acpi.h> 35#include <contrib/dev/acpica/include/actables.h> 36#include <dev/acpica/acpivar.h> 37 38int 39acpi_machdep_init(device_t dev) 40{ 41 struct acpi_softc *sc; 42 43 sc = device_get_softc(dev); 44 45 acpi_install_wakeup_handler(sc); 46 47 return (0); 48} 49 50int 51acpi_machdep_quirks(int *quirks) 52{ 53 return (0); 54} 55 56void 57acpi_cpu_c1() 58{ 59#ifdef INVARIANTS 60 register_t ie; 61 62 ie = intr_disable(); 63 KASSERT(ie == 0, ("%s called with interrupts enabled\n", __func__)); 64#endif 65 ia64_call_pal_static(PAL_HALT_LIGHT, 0, 0, 0); 66 ia64_enable_intr(); 67} 68 69void * 70acpi_find_table(const char *sig) 71{ 72 ACPI_PHYSICAL_ADDRESS rsdp_ptr; 73 ACPI_TABLE_RSDP *rsdp; 74 ACPI_TABLE_XSDT *xsdt; 75 ACPI_TABLE_HEADER *table; 76 UINT64 addr; 77 u_int i, count; 78 79 if ((rsdp_ptr = AcpiOsGetRootPointer()) == 0) 80 return (NULL); 81 82 rsdp = (ACPI_TABLE_RSDP *)IA64_PHYS_TO_RR7(rsdp_ptr); 83 xsdt = (ACPI_TABLE_XSDT *)IA64_PHYS_TO_RR7(rsdp->XsdtPhysicalAddress); 84 85 count = (UINT64 *)((char *)xsdt + xsdt->Header.Length) - 86 xsdt->TableOffsetEntry; 87 88 for (i = 0; i < count; i++) { 89 addr = xsdt->TableOffsetEntry[i]; 90 table = (ACPI_TABLE_HEADER *)IA64_PHYS_TO_RR7(addr); 91 92 if (strncmp(table->Signature, sig, ACPI_NAME_SIZE) != 0) 93 continue; 94 if (ACPI_FAILURE(AcpiTbChecksum((void *)table, table->Length))) 95 continue; 96 97 return (table); 98 } 99 100 return (NULL); 101} 102