Changes in kernel/genarch/src/acpi/acpi.c [96b02eb9:103bb68] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/acpi/acpi.c
r96b02eb9 r103bb68 33 33 /** 34 34 * @file 35 * @brief 35 * @brief Advanced Configuration and Power Interface (ACPI) initialization. 36 36 */ 37 37 38 38 #include <genarch/acpi/acpi.h> 39 39 #include <genarch/acpi/madt.h> … … 43 43 #include <print.h> 44 44 45 #define RSDP_SIGNATURE "RSD PTR " 46 #define RSDP_REVISION_OFFS 15 47 48 #define CMP_SIGNATURE(left, right) \ 49 (((left)[0] == (right)[0]) && \ 50 ((left)[1] == (right)[1]) && \ 51 ((left)[2] == (right)[2]) && \ 52 ((left)[3] == (right)[3])) 45 #define RSDP_SIGNATURE "RSD PTR " 46 #define RSDP_REVISION_OFFS 15 53 47 54 48 struct acpi_rsdp *acpi_rsdp = NULL; … … 64 58 }; 65 59 66 static int rsdp_check(uint8_t * _rsdp) {67 struct acpi_rsdp *r sdp = (struct acpi_rsdp *) _rsdp;60 static int rsdp_check(uint8_t *rsdp) { 61 struct acpi_rsdp *r = (struct acpi_rsdp *) rsdp; 68 62 uint8_t sum = 0; 69 u int32_t i;63 unsigned int i; 70 64 71 65 for (i = 0; i < 20; i++) 72 sum = (uint8_t) (sum + _rsdp[i]); 66 sum = (uint8_t) (sum + rsdp[i]); 67 68 if (sum) 69 return 0; /* bad checksum */ 70 71 if (r->revision == 0) 72 return 1; /* ACPI 1.0 */ 73 74 for (; i < r->length; i++) 75 sum = (uint8_t) (sum + rsdp[i]); 76 77 return !sum; 73 78 74 if (sum)75 return 0; /* bad checksum */76 77 if (rsdp->revision == 0)78 return 1; /* ACPI 1.0 */79 80 for (; i < rsdp->length; i++)81 sum = (uint8_t) (sum + _rsdp[i]);82 83 return !sum;84 79 } 85 80 86 81 int acpi_sdt_check(uint8_t *sdt) 87 82 { 88 struct acpi_sdt_header *h dr= (struct acpi_sdt_header *) sdt;83 struct acpi_sdt_header *h = (struct acpi_sdt_header *) sdt; 89 84 uint8_t sum = 0; 90 85 unsigned int i; 91 92 for (i = 0; i < h dr->length; i++)86 87 for (i = 0; i < h->length; i++) 93 88 sum = (uint8_t) (sum + sdt[i]); 94 89 95 90 return !sum; 96 91 } … … 98 93 static void map_sdt(struct acpi_sdt_header *sdt) 99 94 { 100 page_table_lock(AS_KERNEL, true); 101 page_mapping_insert(AS_KERNEL, (uintptr_t) sdt, (uintptr_t) sdt, 102 PAGE_NOT_CACHEABLE | PAGE_WRITE); 95 page_mapping_insert(AS_KERNEL, (uintptr_t) sdt, (uintptr_t) sdt, PAGE_NOT_CACHEABLE | PAGE_WRITE); 103 96 map_structure((uintptr_t) sdt, sdt->length); 104 page_table_unlock(AS_KERNEL, true);105 97 } 106 98 107 99 static void configure_via_rsdt(void) 108 100 { 109 size_t i; 110 size_t j; 111 size_t cnt = (acpi_rsdt->header.length - sizeof(struct acpi_sdt_header)) 112 / sizeof(uint32_t); 101 unsigned int i, j, cnt = (acpi_rsdt->header.length - sizeof(struct acpi_sdt_header)) / sizeof(uint32_t); 113 102 114 103 for (i = 0; i < cnt; i++) { 115 for (j = 0; j < sizeof(signature_map) 116 / sizeof(struct acpi_signature_map); j++) { 117 struct acpi_sdt_header *hdr = 118 (struct acpi_sdt_header *) (sysarg_t) acpi_rsdt->entry[i]; 119 120 map_sdt(hdr); 121 if (CMP_SIGNATURE(hdr->signature, signature_map[j].signature)) { 122 if (!acpi_sdt_check((uint8_t *) hdr)) 123 break; 124 125 *signature_map[j].sdt_ptr = hdr; 126 LOG("%p: ACPI %s", *signature_map[j].sdt_ptr, 127 signature_map[j].description); 104 for (j = 0; j < sizeof(signature_map) / sizeof(struct acpi_signature_map); j++) { 105 struct acpi_sdt_header *h = (struct acpi_sdt_header *) (unative_t) acpi_rsdt->entry[i]; 106 107 map_sdt(h); 108 if (*((uint32_t *) &h->signature[0]) == *((uint32_t *) &signature_map[j].signature[0])) { 109 if (!acpi_sdt_check((uint8_t *) h)) 110 goto next; 111 *signature_map[j].sdt_ptr = h; 112 LOG("%p: ACPI %s\n", *signature_map[j].sdt_ptr, signature_map[j].description); 128 113 } 129 114 } 115 next: 116 ; 130 117 } 131 118 } … … 133 120 static void configure_via_xsdt(void) 134 121 { 135 size_t i; 136 size_t j; 137 size_t cnt = (acpi_xsdt->header.length - sizeof(struct acpi_sdt_header)) 138 / sizeof(uint64_t); 122 unsigned int i, j, cnt = (acpi_xsdt->header.length - sizeof(struct acpi_sdt_header)) / sizeof(uint64_t); 139 123 140 124 for (i = 0; i < cnt; i++) { 141 for (j = 0; j < sizeof(signature_map) 142 / sizeof(struct acpi_signature_map); j++) { 143 struct acpi_sdt_header *hdr = 144 (struct acpi_sdt_header *) ((uintptr_t) acpi_xsdt->entry[i]); 145 146 map_sdt(hdr); 147 if (CMP_SIGNATURE(hdr->signature, signature_map[j].signature)) { 148 if (!acpi_sdt_check((uint8_t *) hdr)) 149 break; 150 151 *signature_map[j].sdt_ptr = hdr; 152 LOG("%p: ACPI %s", *signature_map[j].sdt_ptr, 153 signature_map[j].description); 125 for (j = 0; j < sizeof(signature_map) / sizeof(struct acpi_signature_map); j++) { 126 struct acpi_sdt_header *h = (struct acpi_sdt_header *) ((uintptr_t) acpi_rsdt->entry[i]); 127 128 map_sdt(h); 129 if (*((uint32_t *) &h->signature[0]) == *((uint32_t *) &signature_map[j].signature[0])) { 130 if (!acpi_sdt_check((uint8_t *) h)) 131 goto next; 132 *signature_map[j].sdt_ptr = h; 133 LOG("%p: ACPI %s\n", *signature_map[j].sdt_ptr, signature_map[j].description); 154 134 } 155 135 } 136 next: 137 ; 156 138 } 139 157 140 } 158 141 … … 160 143 { 161 144 uint8_t *addr[2] = { NULL, (uint8_t *) PA2KA(0xe0000) }; 162 unsigned int i; 163 unsigned int j; 164 unsigned int length[2] = { 1024, 128 * 1024 }; 145 int i, j, length[2] = { 1024, 128*1024 }; 165 146 uint64_t *sig = (uint64_t *) RSDP_SIGNATURE; 166 147 167 148 /* 168 149 * Find Root System Description Pointer … … 170 151 * 2. search 128K starting at 0xe0000 171 152 */ 172 153 173 154 addr[0] = (uint8_t *) PA2KA(ebda); 174 155 for (i = (ebda ? 0 : 1); i < 2; i++) { 175 156 for (j = 0; j < length[i]; j += 16) { 176 if ((*((uint64_t *) &addr[i][j]) == *sig) 177 && (rsdp_check(&addr[i][j]))) { 157 if (*((uint64_t *) &addr[i][j]) == *sig && rsdp_check(&addr[i][j])) { 178 158 acpi_rsdp = (struct acpi_rsdp *) &addr[i][j]; 179 159 goto rsdp_found; … … 181 161 } 182 162 } 183 163 184 164 return; 185 165 186 166 rsdp_found: 187 LOG("%p: ACPI Root System Description Pointer ", acpi_rsdp);188 189 acpi_rsdt = (struct acpi_rsdt *) ( (uintptr_t) acpi_rsdp->rsdt_address);167 LOG("%p: ACPI Root System Description Pointer\n", acpi_rsdp); 168 169 acpi_rsdt = (struct acpi_rsdt *) (unative_t) acpi_rsdp->rsdt_address; 190 170 if (acpi_rsdp->revision) 191 171 acpi_xsdt = (struct acpi_xsdt *) ((uintptr_t) acpi_rsdp->xsdt_address); 192 172 193 173 if (acpi_rsdt) 194 174 map_sdt((struct acpi_sdt_header *) acpi_rsdt); 195 196 175 if (acpi_xsdt) 197 176 map_sdt((struct acpi_sdt_header *) acpi_xsdt); 198 199 if ( (acpi_rsdt) && (!acpi_sdt_check((uint8_t *) acpi_rsdt))) {177 178 if (acpi_rsdt && !acpi_sdt_check((uint8_t *) acpi_rsdt)) { 200 179 printf("RSDT: bad checksum\n"); 201 180 return; 202 181 } 203 204 if ((acpi_xsdt) && (!acpi_sdt_check((uint8_t *) acpi_xsdt))) { 182 if (acpi_xsdt && !acpi_sdt_check((uint8_t *) acpi_xsdt)) { 205 183 printf("XSDT: bad checksum\n"); 206 184 return; 207 185 } 208 186 209 187 if (acpi_xsdt) 210 188 configure_via_xsdt(); 211 189 else if (acpi_rsdt) 212 190 configure_via_rsdt(); 191 213 192 } 214 193
Note:
See TracChangeset
for help on using the changeset viewer.