Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/src/acpi/acpi.c

    r96b02eb9 r103bb68  
    3333/**
    3434 * @file
    35  * @brief Advanced Configuration and Power Interface (ACPI) initialization.
     35 * @brief       Advanced Configuration and Power Interface (ACPI) initialization.
    3636 */
    37 
     37 
    3838#include <genarch/acpi/acpi.h>
    3939#include <genarch/acpi/madt.h>
     
    4343#include <print.h>
    4444
    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
    5347
    5448struct acpi_rsdp *acpi_rsdp = NULL;
     
    6458};
    6559
    66 static int rsdp_check(uint8_t *_rsdp) {
    67         struct acpi_rsdp *rsdp = (struct acpi_rsdp *) _rsdp;
     60static int rsdp_check(uint8_t *rsdp) {
     61        struct acpi_rsdp *r = (struct acpi_rsdp *) rsdp;
    6862        uint8_t sum = 0;
    69         uint32_t i;
     63        unsigned int i;
    7064       
    7165        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;
    7378       
    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;
    8479}
    8580
    8681int acpi_sdt_check(uint8_t *sdt)
    8782{
    88         struct acpi_sdt_header *hdr = (struct acpi_sdt_header *) sdt;
     83        struct acpi_sdt_header *h = (struct acpi_sdt_header *) sdt;
    8984        uint8_t sum = 0;
    9085        unsigned int i;
    91        
    92         for (i = 0; i < hdr->length; i++)
     86
     87        for (i = 0; i < h->length; i++)
    9388                sum = (uint8_t) (sum + sdt[i]);
    94        
     89               
    9590        return !sum;
    9691}
     
    9893static void map_sdt(struct acpi_sdt_header *sdt)
    9994{
    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);
    10396        map_structure((uintptr_t) sdt, sdt->length);
    104         page_table_unlock(AS_KERNEL, true);
    10597}
    10698
    10799static void configure_via_rsdt(void)
    108100{
    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);
    113102       
    114103        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);
    128113                        }
    129114                }
     115next:
     116                ;
    130117        }
    131118}
     
    133120static void configure_via_xsdt(void)
    134121{
    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);
    139123       
    140124        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);
    154134                        }
    155135                }
     136next:
     137                ;
    156138        }
     139
    157140}
    158141
     
    160143{
    161144        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 };
    165146        uint64_t *sig = (uint64_t *) RSDP_SIGNATURE;
    166        
     147
    167148        /*
    168149         * Find Root System Description Pointer
     
    170151         * 2. search 128K starting at 0xe0000
    171152         */
    172        
     153
    173154        addr[0] = (uint8_t *) PA2KA(ebda);
    174155        for (i = (ebda ? 0 : 1); i < 2; i++) {
    175156                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])) {
    178158                                acpi_rsdp = (struct acpi_rsdp *) &addr[i][j];
    179159                                goto rsdp_found;
     
    181161                }
    182162        }
    183        
     163
    184164        return;
    185        
     165
    186166rsdp_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;
    190170        if (acpi_rsdp->revision)
    191171                acpi_xsdt = (struct acpi_xsdt *) ((uintptr_t) acpi_rsdp->xsdt_address);
    192        
     172
    193173        if (acpi_rsdt)
    194174                map_sdt((struct acpi_sdt_header *) acpi_rsdt);
    195        
    196175        if (acpi_xsdt)
    197176                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)) {
    200179                printf("RSDT: bad checksum\n");
    201180                return;
    202181        }
    203        
    204         if ((acpi_xsdt) && (!acpi_sdt_check((uint8_t *) acpi_xsdt))) {
     182        if (acpi_xsdt && !acpi_sdt_check((uint8_t *) acpi_xsdt)) {
    205183                printf("XSDT: bad checksum\n");
    206184                return;
    207185        }
    208        
     186
    209187        if (acpi_xsdt)
    210188                configure_via_xsdt();
    211189        else if (acpi_rsdt)
    212190                configure_via_rsdt();
     191
    213192}
    214193
Note: See TracChangeset for help on using the changeset viewer.