Ignore:
File:
1 edited

Legend:

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

    r103bb68 r96b02eb9  
    3333/**
    3434 * @file
    35  * @brief       Advanced Configuration and Power Interface (ACPI) initialization.
    36  */
    37  
     35 * @brief Advanced Configuration and Power Interface (ACPI) initialization.
     36 */
     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
     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]))
    4753
    4854struct acpi_rsdp *acpi_rsdp = NULL;
     
    5864};
    5965
    60 static int rsdp_check(uint8_t *rsdp) {
    61         struct acpi_rsdp *r = (struct acpi_rsdp *) rsdp;
     66static 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
     86int acpi_sdt_check(uint8_t *sdt)
     87{
     88        struct acpi_sdt_header *hdr = (struct acpi_sdt_header *) sdt;
    6289        uint8_t sum = 0;
    6390        unsigned int i;
    6491       
    65         for (i = 0; i < 20; 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                
     92        for (i = 0; i < hdr->length; i++)
     93                sum = (uint8_t) (sum + sdt[i]);
     94       
    7795        return !sum;
    78        
    79 }
    80 
    81 int acpi_sdt_check(uint8_t *sdt)
    82 {
    83         struct acpi_sdt_header *h = (struct acpi_sdt_header *) sdt;
    84         uint8_t sum = 0;
    85         unsigned int i;
    86 
    87         for (i = 0; i < h->length; i++)
    88                 sum = (uint8_t) (sum + sdt[i]);
    89                
    90         return !sum;
    9196}
    9297
    9398static void map_sdt(struct acpi_sdt_header *sdt)
    9499{
    95         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);
    96103        map_structure((uintptr_t) sdt, sdt->length);
     104        page_table_unlock(AS_KERNEL, true);
    97105}
    98106
    99107static void configure_via_rsdt(void)
    100108{
    101         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);
    102113       
    103114        for (i = 0; i < cnt; i++) {
    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);
     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);
    113128                        }
    114129                }
    115 next:
    116                 ;
    117130        }
    118131}
     
    120133static void configure_via_xsdt(void)
    121134{
    122         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);
    123139       
    124140        for (i = 0; i < cnt; i++) {
    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);
     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);
    134154                        }
    135155                }
    136 next:
    137                 ;
    138         }
    139 
     156        }
    140157}
    141158
     
    143160{
    144161        uint8_t *addr[2] = { NULL, (uint8_t *) PA2KA(0xe0000) };
    145         int i, j, length[2] = { 1024, 128*1024 };
     162        unsigned int i;
     163        unsigned int j;
     164        unsigned int length[2] = { 1024, 128 * 1024 };
    146165        uint64_t *sig = (uint64_t *) RSDP_SIGNATURE;
    147 
     166       
    148167        /*
    149168         * Find Root System Description Pointer
     
    151170         * 2. search 128K starting at 0xe0000
    152171         */
    153 
     172       
    154173        addr[0] = (uint8_t *) PA2KA(ebda);
    155174        for (i = (ebda ? 0 : 1); i < 2; i++) {
    156175                for (j = 0; j < length[i]; j += 16) {
    157                         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]))) {
    158178                                acpi_rsdp = (struct acpi_rsdp *) &addr[i][j];
    159179                                goto rsdp_found;
     
    161181                }
    162182        }
    163 
     183       
    164184        return;
    165 
     185       
    166186rsdp_found:
    167         LOG("%p: ACPI Root System Description Pointer\n", acpi_rsdp);
    168 
    169         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);
    170190        if (acpi_rsdp->revision)
    171191                acpi_xsdt = (struct acpi_xsdt *) ((uintptr_t) acpi_rsdp->xsdt_address);
    172 
     192       
    173193        if (acpi_rsdt)
    174194                map_sdt((struct acpi_sdt_header *) acpi_rsdt);
     195       
    175196        if (acpi_xsdt)
    176197                map_sdt((struct acpi_sdt_header *) acpi_xsdt);
    177 
    178         if (acpi_rsdt && !acpi_sdt_check((uint8_t *) acpi_rsdt)) {
     198       
     199        if ((acpi_rsdt) && (!acpi_sdt_check((uint8_t *) acpi_rsdt))) {
    179200                printf("RSDT: bad checksum\n");
    180201                return;
    181202        }
    182         if (acpi_xsdt && !acpi_sdt_check((uint8_t *) acpi_xsdt)) {
     203       
     204        if ((acpi_xsdt) && (!acpi_sdt_check((uint8_t *) acpi_xsdt))) {
    183205                printf("XSDT: bad checksum\n");
    184206                return;
    185207        }
    186 
     208       
    187209        if (acpi_xsdt)
    188210                configure_via_xsdt();
    189211        else if (acpi_rsdt)
    190212                configure_via_rsdt();
    191 
    192213}
    193214
Note: See TracChangeset for help on using the changeset viewer.