xref: /illumos-gate/usr/src/boot/efi/loader/acpi.c (revision ed093b41a93e8563e6e1e5dae0768dda2a7bcc27)
1 /*
2  * This file and its contents are supplied under the terms of the
3  * Common Development and Distribution License ("CDDL"), version 1.0.
4  * You may only use this file in accordance with the terms of version
5  * 1.0 of the CDDL.
6  *
7  * A full copy of the text of the CDDL should have accompanied this
8  * source.  A copy of the CDDL is also available via the Internet at
9  * http://www.illumos.org/license/CDDL.
10  */
11 
12 /*
13  * Copyright 2016 Tooams Soome <tsoome@me.com>
14  */
15 
16 #include <sys/cdefs.h>
17 
18 #include <stand.h>
19 #include <machine/stdarg.h>
20 #include <bootstrap.h>
21 #include <efi.h>
22 #include <efilib.h>
23 
24 #include "platform/acfreebsd.h"
25 #include "acconfig.h"
26 #define ACPI_SYSTEM_XFACE
27 #include "actypes.h"
28 #include "actbl.h"
29 
30 ACPI_TABLE_RSDP	*rsdp;
31 static EFI_GUID acpi_guid = ACPI_TABLE_GUID;
32 static EFI_GUID acpi20_guid = ACPI_20_TABLE_GUID;
33 
34 void
35 acpi_detect(void)
36 {
37     char		buf[24];
38     int			revision;
39 
40     if ((rsdp = efi_get_table(&acpi20_guid)) == NULL)
41 	rsdp = efi_get_table(&acpi_guid);
42 
43     if (rsdp == NULL)
44 	return;
45 
46     /* export values from the RSDP */
47 #ifdef _LP64
48     snprintf(buf, sizeof (buf), "0x%016llx", (unsigned long long)rsdp);
49 #else
50     snprintf(buf, sizeof (buf), "0x%08x", (unsigned int)rsdp);
51 #endif
52     setenv("acpi.rsdp", buf, 1);
53     revision = rsdp->Revision;
54     if (revision == 0)
55 	revision = 1;
56     snprintf(buf, sizeof (buf), "%d", revision);
57     setenv("acpi.revision", buf, 1);
58     strncpy(buf, rsdp->OemId, sizeof(rsdp->OemId));
59     buf[sizeof(rsdp->OemId)] = '\0';
60     setenv("acpi.oem", buf, 1);
61 #ifdef _LP64
62     snprintf(buf, sizeof (buf), "0x%016llx",
63 	(unsigned long long)rsdp->RsdtPhysicalAddress);
64 #else
65     snprintf(buf, sizeof (buf), "0x%08x", rsdp->RsdtPhysicalAddress);
66 #endif
67     setenv("acpi.rsdt", buf, 1);
68     if (revision >= 2) {
69 	snprintf(buf, sizeof (buf), "0x%016llx",
70 	    (unsigned long long)rsdp->XsdtPhysicalAddress);
71 	setenv("acpi.xsdt", buf, 1);
72 	snprintf(buf, sizeof (buf), "%d", rsdp->Length);
73 	setenv("acpi.xsdt_length", buf, 1);
74     }
75 }
76