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