source: mainline/arch/ia32/src/acpi/acpi.c@ d0c30f7

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since d0c30f7 was 9c0a9b3, checked in by Jakub Vana <jakub.vana@…>, 20 years ago

1) memcopy and _memcopy functions rewriten to ANSI C norm.
2) Repaired ia32,ia64 and mips version of SPARTAN to work with this memcopy functions
3) Warning for non declared funcions added and repaired ia32,ia64 and mips versions to pass build process with this warning and Werror option

  • Property mode set to 100644
File size: 4.9 KB
Line 
1/*
2 * Copyright (C) 2005 Jakub Jermar
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 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
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#include <arch/acpi/acpi.h>
30#include <arch/acpi/madt.h>
31#include <arch/bios/bios.h>
32
33#include <mm/page.h>
34#include <print.h>
35
36#define RSDP_SIGNATURE "RSD PTR "
37#define RSDP_REVISION_OFFS 15
38
39struct acpi_rsdp *acpi_rsdp = NULL;
40struct acpi_rsdt *acpi_rsdt = NULL;
41struct acpi_xsdt *acpi_xsdt = NULL;
42
43struct acpi_signature_map signature_map[] = {
44 { "APIC", (struct acpi_sdt_header **) &acpi_madt, "Multiple APIC Description Table" }
45};
46
47int rsdp_check(__u8 *rsdp) {
48 struct acpi_rsdp *r = (struct acpi_rsdp *) rsdp;
49 __u8 sum = 0;
50 int i;
51
52 for (i=0; i<20; i++)
53 sum += rsdp[i];
54
55 if (sum)
56 return 0; /* bad checksum */
57
58 if (r->revision == 0)
59 return 1; /* ACPI 1.0 */
60
61 for (; i<r->length; i++)
62 sum += rsdp[i];
63
64 return !sum;
65
66}
67
68int acpi_sdt_check(__u8 *sdt)
69{
70 struct acpi_sdt_header *h = (struct acpi_sdt_header *) sdt;
71 __u8 sum = 0;
72 int i;
73
74 for (i=0; i<h->length; i++)
75 sum += sdt[i];
76
77 return !sum;
78}
79
80void map_sdt(struct acpi_sdt_header *sdt)
81{
82 map_page_to_frame((__address) sdt, (__address) sdt, PAGE_NOT_CACHEABLE, 0);
83 map_structure((__address) sdt, sdt->length);
84}
85
86void acpi_init(void)
87{
88 __u8 *addr[2] = { NULL, (__u8 *) 0xe0000 };
89 int i, j, length[2] = { 1024, 128*1024 };
90 __u64 *sig = (__u64 *) RSDP_SIGNATURE;
91
92 /*
93 * Find Root System Description Pointer
94 * 1. search first 1K of EBDA
95 * 2. search 128K starting at 0xe0000
96 */
97
98 addr[0] = (__u8 *) ebda;
99 for (i = (ebda ? 0 : 1); i < 2; i++) {
100 for (j = 0; j < length[i]; j += 16) {
101 if (*((__u64 *) &addr[i][j]) == *sig && rsdp_check(&addr[i][j])) {
102 acpi_rsdp = (struct acpi_rsdp *) &addr[i][j];
103 goto rsdp_found;
104 }
105 }
106 }
107
108 return;
109
110rsdp_found:
111 printf("%L: ACPI Root System Description Pointer\n", acpi_rsdp);
112
113 acpi_rsdt = (struct acpi_rsdt *) acpi_rsdp->rsdt_address;
114 if (acpi_rsdp->revision) acpi_xsdt = (struct acpi_xsdt *) ((__address) acpi_rsdp->xsdt_address);
115
116 if (acpi_rsdt) map_sdt((struct acpi_sdt_header *) acpi_rsdt);
117 if (acpi_xsdt) map_sdt((struct acpi_sdt_header *) acpi_xsdt);
118
119 if (acpi_rsdt && !acpi_sdt_check((__u8 *) acpi_rsdt)) {
120 printf("RSDT: %s\n", "bad checksum");
121 return;
122 }
123 if (acpi_xsdt && !acpi_sdt_check((__u8 *) acpi_xsdt)) {
124 printf("XSDT: %s\n", "bad checksum");
125 return;
126 }
127
128 if (acpi_xsdt) configure_via_xsdt();
129 else if (acpi_rsdt) configure_via_rsdt();
130
131}
132
133void configure_via_rsdt(void)
134{
135 int i, j, cnt = (acpi_rsdt->header.length - sizeof(struct acpi_sdt_header))/sizeof(__u32);
136
137 for (i=0; i<cnt; i++) {
138 for (j=0; j<sizeof(signature_map)/sizeof(struct acpi_signature_map); j++) {
139 struct acpi_sdt_header *h = (struct acpi_sdt_header *) acpi_rsdt->entry[i];
140
141 map_sdt(h);
142 if (*((__u32 *) &h->signature[0])==*((__u32 *) &signature_map[j].signature[0])) {
143 if (!acpi_sdt_check((__u8 *) h))
144 goto next;
145 *signature_map[j].sdt_ptr = h;
146 printf("%L: ACPI %s\n", *signature_map[j].sdt_ptr, signature_map[j].description);
147 }
148 }
149next:
150 ;
151 }
152}
153
154void configure_via_xsdt(void)
155{
156 int i, j, cnt = (acpi_xsdt->header.length - sizeof(struct acpi_sdt_header))/sizeof(__u64);
157
158 for (i=0; i<cnt; i++) {
159 for (j=0; j<sizeof(signature_map)/sizeof(struct acpi_signature_map); j++) {
160 struct acpi_sdt_header *h = (struct acpi_sdt_header *) ((__address) acpi_rsdt->entry[i]);
161
162 map_sdt(h);
163 if (*((__u32 *) &h->signature[0])==*((__u32 *) &signature_map[j].signature[0])) {
164 if (!acpi_sdt_check((__u8 *) h))
165 goto next;
166 *signature_map[j].sdt_ptr = h;
167 printf("%L: ACPI %s\n", *signature_map[j].sdt_ptr, signature_map[j].description);
168 }
169 }
170next:
171 ;
172 }
173
174}
Note: See TracBrowser for help on using the repository browser.