1/*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 2000,2001 Michael Smith
5 * Copyright (c) 2000 BSDi
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
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 AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#include <sys/cdefs.h>
31__FBSDID("$FreeBSD$");
32
33#include <sys/param.h>
34#include <sys/bus.h>
35#include <sys/kernel.h>
36#include <sys/sysctl.h>
37
38#include <contrib/dev/acpica/include/acpi.h>
39#include <contrib/dev/acpica/include/aclocal.h>
40#include <contrib/dev/acpica/include/actables.h>
41
42static u_long acpi_root_phys;
43
44SYSCTL_ULONG(_machdep, OID_AUTO, acpi_root, CTLFLAG_RD, &acpi_root_phys, 0,
45    "The physical address of the RSDP");
46
47ACPI_STATUS
48AcpiOsInitialize(void)
49{
50
51	return (AE_OK);
52}
53
54ACPI_STATUS
55AcpiOsTerminate(void)
56{
57
58	return (AE_OK);
59}
60
61static u_long
62acpi_get_root_from_loader(void)
63{
64	long acpi_root;
65
66	if (TUNABLE_ULONG_FETCH("acpi.rsdp", &acpi_root))
67		return (acpi_root);
68
69	/*
70	 * The hints mechanism is unreliable (it fails if anybody ever
71	 * compiled in hints to the kernel). It has been replaced
72	 * by the tunable method, but is used here as a fallback to
73	 * retain maximum compatibility between old loaders and new
74	 * kernels. It can be removed after 11.0R.
75	 */
76	if (resource_long_value("acpi", 0, "rsdp", &acpi_root) == 0)
77		return (acpi_root);
78
79	return (0);
80}
81
82static u_long
83acpi_get_root_from_memory(void)
84{
85	ACPI_PHYSICAL_ADDRESS acpi_root;
86
87	if (ACPI_SUCCESS(AcpiFindRootPointer(&acpi_root)))
88		return (acpi_root);
89
90	return (0);
91}
92
93ACPI_PHYSICAL_ADDRESS
94AcpiOsGetRootPointer(void)
95{
96
97	if (acpi_root_phys == 0) {
98		acpi_root_phys = acpi_get_root_from_loader();
99		if (acpi_root_phys == 0)
100			acpi_root_phys = acpi_get_root_from_memory();
101	}
102
103	return (acpi_root_phys);
104}
105