Changeset 10a2e22 in mainline for arch/ia32/src/acpi/acpi.c


Ignore:
Timestamp:
2005-04-30T00:37:35Z (20 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
ed0dd65
Parents:
babcb148
Message:

ACPI update (RSDT/XSDT configuration).
Cosmetic changes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • arch/ia32/src/acpi/acpi.c

    rbabcb148 r10a2e22  
    2828
    2929#include <arch/acpi/acpi.h>
     30#include <arch/acpi/madt.h>
    3031#include <arch/bios/bios.h>
     32
     33#include <mm/page.h>
    3134
    3235#define RSDP_SIGNATURE          "RSD PTR "
     
    3437
    3538struct acpi_rsdp *acpi_rsdp = NULL;
     39struct acpi_rsdt *acpi_rsdt = NULL;
     40struct acpi_xsdt *acpi_xsdt = NULL;
     41
     42struct acpi_signature_map signature_map[] = {
     43        { "APIC", (struct acpi_sdt_header **) &acpi_madt, "Multiple APIC Description Table" }
     44};
    3645
    3746int rsdp_check(__u8 *rsdp) {
     
    5463        return !sum;
    5564       
     65}
     66
     67int acpi_sdt_check(__u8 *sdt)
     68{
     69        struct acpi_sdt_header *h = (struct acpi_sdt_header *) sdt;
     70        __u8 sum = 0;
     71        int i;
     72
     73        for (i=0; i<h->length; i++)
     74                sum += sdt[i];
     75               
     76        return !sum;
     77}
     78
     79void map_sdt(struct acpi_sdt_header *sdt)
     80{
     81        map_page_to_frame((__address) sdt, (__address) sdt, PAGE_NOT_CACHEABLE, 0);
    5682}
    5783
     
    81107
    82108rsdp_found:
    83         printf("%L: ACPI Root System Description Pointer\n", acpi_rsdp);               
     109        printf("%L: ACPI Root System Description Pointer\n", acpi_rsdp);
     110       
     111        acpi_rsdt = (struct acpi_rsdt *) acpi_rsdp->rsdt_address;
     112        if (acpi_rsdp->revision) acpi_xsdt = (struct acpi_xsdt *) ((__address) acpi_rsdp->xsdt_address);
     113
     114        if (acpi_rsdt) map_sdt((struct acpi_sdt_header *) acpi_rsdt);
     115        if (acpi_xsdt) map_sdt((struct acpi_sdt_header *) acpi_xsdt);   
     116
     117        if (acpi_rsdt && !acpi_sdt_check((__u8 *) acpi_rsdt)) {
     118                printf("RSDT: %s\n", "bad checksum");
     119                return;
     120        }
     121        if (acpi_xsdt && !acpi_sdt_check((__u8 *) acpi_xsdt)) {
     122                printf("XSDT: %s\n", "bad checksum");
     123                return;
     124        }
     125
     126        if (acpi_xsdt) configure_via_xsdt();
     127        else if (acpi_rsdt) configure_via_rsdt();
     128
    84129}
     130
     131void configure_via_rsdt(void)
     132{
     133        int i, j, cnt = (acpi_rsdt->header.length - sizeof(struct acpi_sdt_header))/sizeof(__u32);
     134       
     135        for (i=0; i<cnt; i++) {
     136                for (j=0; j<sizeof(signature_map)/sizeof(struct acpi_signature_map); j++) {
     137                        struct acpi_sdt_header *h = (struct acpi_sdt_header *) acpi_rsdt->entry[i];
     138               
     139                        map_sdt(h);     
     140                        if (*((__u32 *) &h->signature[0])==*((__u32 *) &signature_map[j].signature[0])) {
     141                                if (!acpi_sdt_check((__u8 *) h))
     142                                        goto next;
     143                                *signature_map[j].sdt_ptr = h;
     144                                printf("%L: ACPI %s\n", *signature_map[j].sdt_ptr, signature_map[j].description);
     145                        }
     146                }
     147next:
     148                ;
     149        }
     150}
     151
     152void configure_via_xsdt(void)
     153{
     154        int i, j, cnt = (acpi_xsdt->header.length - sizeof(struct acpi_sdt_header))/sizeof(__u64);
     155       
     156        for (i=0; i<cnt; i++) {
     157                for (j=0; j<sizeof(signature_map)/sizeof(struct acpi_signature_map); j++) {
     158                        struct acpi_sdt_header *h = (struct acpi_sdt_header *) ((__address) acpi_rsdt->entry[i]);
     159
     160                        map_sdt(h);
     161                        if (*((__u32 *) &h->signature[0])==*((__u32 *) &signature_map[j].signature[0])) {
     162                                if (!acpi_sdt_check((__u8 *) h))
     163                                        goto next;
     164                                *signature_map[j].sdt_ptr = h;
     165                                printf("%L: ACPI %s\n", *signature_map[j].sdt_ptr, signature_map[j].description);
     166                        }
     167                }
     168next:
     169                ;
     170        }
     171
     172}
Note: See TracChangeset for help on using the changeset viewer.