1*cedd86caSJung-uk Kim /*- 2*cedd86caSJung-uk Kim * Copyright (c) 2000,2001 Michael Smith 3*cedd86caSJung-uk Kim * Copyright (c) 2000 BSDi 4*cedd86caSJung-uk Kim * All rights reserved. 5*cedd86caSJung-uk Kim * 6*cedd86caSJung-uk Kim * Redistribution and use in source and binary forms, with or without 7*cedd86caSJung-uk Kim * modification, are permitted provided that the following conditions 8*cedd86caSJung-uk Kim * are met: 9*cedd86caSJung-uk Kim * 1. Redistributions of source code must retain the above copyright 10*cedd86caSJung-uk Kim * notice, this list of conditions and the following disclaimer. 11*cedd86caSJung-uk Kim * 2. Redistributions in binary form must reproduce the above copyright 12*cedd86caSJung-uk Kim * notice, this list of conditions and the following disclaimer in the 13*cedd86caSJung-uk Kim * documentation and/or other materials provided with the distribution. 14*cedd86caSJung-uk Kim * 15*cedd86caSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16*cedd86caSJung-uk Kim * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17*cedd86caSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18*cedd86caSJung-uk Kim * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19*cedd86caSJung-uk Kim * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20*cedd86caSJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21*cedd86caSJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22*cedd86caSJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23*cedd86caSJung-uk Kim * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24*cedd86caSJung-uk Kim * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25*cedd86caSJung-uk Kim * SUCH DAMAGE. 26*cedd86caSJung-uk Kim */ 27*cedd86caSJung-uk Kim 28*cedd86caSJung-uk Kim #include <sys/cdefs.h> 29*cedd86caSJung-uk Kim __FBSDID("$FreeBSD$"); 30*cedd86caSJung-uk Kim 31*cedd86caSJung-uk Kim #include <sys/types.h> 32*cedd86caSJung-uk Kim #include <sys/bus.h> 33*cedd86caSJung-uk Kim #include <sys/linker_set.h> 34*cedd86caSJung-uk Kim #include <sys/sysctl.h> 35*cedd86caSJung-uk Kim 36*cedd86caSJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 37*cedd86caSJung-uk Kim #include <contrib/dev/acpica/include/actables.h> 38*cedd86caSJung-uk Kim 39*cedd86caSJung-uk Kim static u_long acpi_root_phys; 40*cedd86caSJung-uk Kim 41*cedd86caSJung-uk Kim SYSCTL_ULONG(_machdep, OID_AUTO, acpi_root, CTLFLAG_RD, &acpi_root_phys, 0, 42*cedd86caSJung-uk Kim "The physical address of the RSDP"); 43*cedd86caSJung-uk Kim 44*cedd86caSJung-uk Kim ACPI_STATUS 45*cedd86caSJung-uk Kim AcpiOsInitialize(void) 46*cedd86caSJung-uk Kim { 47*cedd86caSJung-uk Kim 48*cedd86caSJung-uk Kim return (AE_OK); 49*cedd86caSJung-uk Kim } 50*cedd86caSJung-uk Kim 51*cedd86caSJung-uk Kim ACPI_STATUS 52*cedd86caSJung-uk Kim AcpiOsTerminate(void) 53*cedd86caSJung-uk Kim { 54*cedd86caSJung-uk Kim 55*cedd86caSJung-uk Kim return (AE_OK); 56*cedd86caSJung-uk Kim } 57*cedd86caSJung-uk Kim 58*cedd86caSJung-uk Kim static u_long 59*cedd86caSJung-uk Kim acpi_get_root_from_loader(void) 60*cedd86caSJung-uk Kim { 61*cedd86caSJung-uk Kim long acpi_root; 62*cedd86caSJung-uk Kim 63*cedd86caSJung-uk Kim if (resource_long_value("acpi", 0, "rsdp", &acpi_root) == 0) 64*cedd86caSJung-uk Kim return (acpi_root); 65*cedd86caSJung-uk Kim 66*cedd86caSJung-uk Kim return (0); 67*cedd86caSJung-uk Kim } 68*cedd86caSJung-uk Kim 69*cedd86caSJung-uk Kim static u_long 70*cedd86caSJung-uk Kim acpi_get_root_from_memory(void) 71*cedd86caSJung-uk Kim { 72*cedd86caSJung-uk Kim ACPI_SIZE acpi_root; 73*cedd86caSJung-uk Kim 74*cedd86caSJung-uk Kim if (ACPI_SUCCESS(AcpiFindRootPointer(&acpi_root))) 75*cedd86caSJung-uk Kim return (acpi_root); 76*cedd86caSJung-uk Kim 77*cedd86caSJung-uk Kim return (0); 78*cedd86caSJung-uk Kim } 79*cedd86caSJung-uk Kim 80*cedd86caSJung-uk Kim ACPI_PHYSICAL_ADDRESS 81*cedd86caSJung-uk Kim AcpiOsGetRootPointer(void) 82*cedd86caSJung-uk Kim { 83*cedd86caSJung-uk Kim 84*cedd86caSJung-uk Kim if (acpi_root_phys == 0) { 85*cedd86caSJung-uk Kim acpi_root_phys = acpi_get_root_from_loader(); 86*cedd86caSJung-uk Kim if (acpi_root_phys == 0) 87*cedd86caSJung-uk Kim acpi_root_phys = acpi_get_root_from_memory(); 88*cedd86caSJung-uk Kim } 89*cedd86caSJung-uk Kim 90*cedd86caSJung-uk Kim return (acpi_root_phys); 91*cedd86caSJung-uk Kim } 92