diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2013-03-06 21:50:09 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2013-03-06 21:55:46 -0500 |
commit | 76e58028d28e78431f9de3cee0b3c88d807fa39d (patch) | |
tree | 19cad753b137f93b77ada7cadc6d3e638d311747 /src/acpi.c | |
parent | 3f8d735dd85edc9fc4da8d4018925012a8626877 (diff) | |
download | seabios-76e58028d28e78431f9de3cee0b3c88d807fa39d.zip seabios-76e58028d28e78431f9de3cee0b3c88d807fa39d.tar.gz seabios-76e58028d28e78431f9de3cee0b3c88d807fa39d.tar.bz2 |
acpi: Eliminate BDAT parameter passing to DSDT code.
The "BDAT" construct is the only ACPI mechanism that relies on SeaBIOS
reserved memory. Replace it with the SSDT based template system.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'src/acpi.c')
-rw-r--r-- | src/acpi.c | 39 |
1 files changed, 13 insertions, 26 deletions
@@ -501,7 +501,6 @@ build_ssdt(void) + (acpi_cpus * PROC_SIZEOF) // procs + (1+2+5+(12*acpi_cpus)) // NTFY + (6+2+1+(1*acpi_cpus)) // CPON - + 17 // BDAT + (1+3+4) // Scope(PCI0) + ((PCI_SLOTS - 1) * PCIHP_SIZEOF) // slots + (1+2+5+(12*(PCI_SLOTS - 1)))); // PCNT @@ -525,6 +524,19 @@ build_ssdt(void) ssdt_ptr[acpi_s4_name[0]] = 'X'; else ssdt_ptr[acpi_s4_pkg[0] + 1] = ssdt[acpi_s4_pkg[0] + 3] = sys_states[4] & 127; + + // store pci io windows + *(u32*)&ssdt_ptr[acpi_pci32_start[0]] = pcimem_start; + *(u32*)&ssdt_ptr[acpi_pci32_end[0]] = pcimem_end - 1; + if (pcimem64_start) { + ssdt_ptr[acpi_pci64_valid[0]] = 1; + *(u64*)&ssdt_ptr[acpi_pci64_start[0]] = pcimem64_start; + *(u64*)&ssdt_ptr[acpi_pci64_end[0]] = pcimem64_end - 1; + *(u64*)&ssdt_ptr[acpi_pci64_length[0]] = pcimem64_end - pcimem64_start; + } else { + ssdt_ptr[acpi_pci64_valid[0]] = 0; + } + ssdt_ptr += sizeof(ssdp_misc_aml); // build Scope(_SB_) header @@ -562,31 +574,6 @@ build_ssdt(void) for (i=0; i<acpi_cpus; i++) *(ssdt_ptr++) = (apic_id_is_present(i)) ? 0x01 : 0x00; - // store pci io windows: start, end, length - // this way we don't have to do the math in the dsdt - struct bfld *bfld = malloc_high(sizeof(struct bfld)); - bfld->p0s = pcimem_start; - bfld->p0e = pcimem_end - 1; - bfld->p0l = pcimem_end - pcimem_start; - bfld->p1s = pcimem64_start; - bfld->p1e = pcimem64_end - 1; - bfld->p1l = pcimem64_end - pcimem64_start; - - // build "OperationRegion(BDAT, SystemMemory, 0x12345678, 0x87654321)" - *(ssdt_ptr++) = 0x5B; // ExtOpPrefix - *(ssdt_ptr++) = 0x80; // OpRegionOp - *(ssdt_ptr++) = 'B'; - *(ssdt_ptr++) = 'D'; - *(ssdt_ptr++) = 'A'; - *(ssdt_ptr++) = 'T'; - *(ssdt_ptr++) = 0x00; // SystemMemory - *(ssdt_ptr++) = 0x0C; // DWordPrefix - *(u32*)ssdt_ptr = (u32)bfld; - ssdt_ptr += 4; - *(ssdt_ptr++) = 0x0C; // DWordPrefix - *(u32*)ssdt_ptr = sizeof(struct bfld); - ssdt_ptr += 4; - // build Scope(PCI0) opcode *(ssdt_ptr++) = 0x10; // ScopeOp ssdt_ptr = encodeLen(ssdt_ptr, length - (ssdt_ptr - ssdt), 3); |