acrn-config: build a hardware-reduced only ACPI

Change ACPI version from V3 to V5 to support hardware-reduced ACPI, which
is a V5 feature

Remove/obsolete the PM1X related stuff as they are not used for hardware-reduced
ACPI

Add the _S5 method in DSDT table

Using hardware-reduced mode allows to use a much simpler form of ACPI that
does not require supporting the legacy of previous versions of the specification
such as SCI IRQ.

Hardware-reduced mode is specified by setting the Hardware Reduced (HW_REDUCED_ACPI)
flag in FADT table.

If the HW_REDUCED_ACPI flag in the FADT table is set, OSPM will ignore fields related
to the ACPI HW register interface such as the PM1x control register. Instead, sleep
control/status registers can be used for system sleep state entry on hardware-reduced
ACPI systems.

Tracked-On: #5411
Signed-off-by: dongshen <dongsheng.x.zhang@intel.com>
This commit is contained in:
dongshen 2020-10-22 13:45:37 -07:00 committed by wenlingz
parent 3cf476dc1d
commit 7cc9c8fe06
4 changed files with 33 additions and 47 deletions

View File

@ -21,10 +21,10 @@ ACPI_BASE = 0x7ff00000
ACPI_RSDP_ADDR_OFFSET = 0x0 # (36 bytes fixed)
ACPI_XSDT_ADDR_OFFSET = 0x80 # (36 bytes + 8*7 table addrs)
ACPI_FADT_ADDR_OFFSET = 0x100 # (244 bytes)
ACPI_DSDT_ADDR_OFFSET = 0x200 # (variable)
ACPI_MCFG_ADDR_OFFSET = 0x400 # (60 bytes)
ACPI_MADT_ADDR_OFFSET = 0x440 # (depends on #CPUs)
ACPI_FADT_ADDR_OFFSET = 0x100 # (268 bytes)
ACPI_DSDT_ADDR_OFFSET = 0x240 # (variable)
ACPI_MCFG_ADDR_OFFSET = 0x440 # (60 bytes)
ACPI_MADT_ADDR_OFFSET = 0x480 # (depends on #CPUs)
ACPI_PTCT_ADDR_OFFSET = 0xF00
ACPI_TPM2_ADDR_OFFSET = 0x1100 # (52 bytes)
@ -38,10 +38,6 @@ ACPI_DSDT_ADDR = (ACPI_BASE + ACPI_DSDT_ADDR_OFFSET)
ACPI_PTCT_ADDR = (ACPI_BASE + ACPI_PTCT_ADDR_OFFSET)
ACPI_FACS_ADDR = 0x0
PM1A_EVN_LEN = 0x4
PM1A_CNT_LEN = 0x2
FADT_FLAGS = 0x00001125
VIRT_PCI_MMCFG_BASE = 0xE0000000
ACPI_MADT_TYPE_IOAPIC = 1

View File

@ -9,6 +9,7 @@ import os, re, argparse, shutil
import xml.etree.ElementTree as ElementTree
from acpi_const import *
import board_cfg_lib
import collections
def calculate_checksum8():
'''
@ -84,24 +85,6 @@ def gen_fadt(dest_vm_acpi_path, board_root):
fadt_asl = 'facp.asl'
p_facs_addr = r'FACS Address : ([0-9a-fA-F]{8})'
p_dsdt_addr = r'DSDT Address : ([0-9a-fA-F]{8})$'
p_pm1a_event_block_addr = r'PM1A Event Block Address : (\d+)'
p_pm1a_control_block_addr = r'PM1A Control Block Address : (\d+)'
p_pm1_event_length = r'PM1 Event Block Length : (\d+)'
p_pm1_control_length = r'PM1 Control Block Length : (\d+)'
p_flasg = r' Flags (decoded below) : (\d+)'
PM1A_EVT_ADDRESS = 0x0
PM1A_CNT_ADDRESS = 0x0
e_pm_info = board_root.find('PM_INFO')
for line in e_pm_info.text.split('\n'):
s = re.search(r'#define PM1A_EVT_ADDRESS (0x\d+)UL', line)
if s is not None and len(s.groups()) > 0:
PM1A_EVT_ADDRESS = int(s.groups()[0], 16)
continue
s = re.search(r'#define PM1A_CNT_ADDRESS (0x\d+)UL', line)
if s is not None and len(s.groups()) > 0:
PM1A_CNT_ADDRESS = int(s.groups()[0], 16)
continue
with open(os.path.join(dest_vm_acpi_path, fadt_asl), 'w') as dest:
lines = []
@ -111,16 +94,6 @@ def gen_fadt(dest_vm_acpi_path, board_root):
lines.append(re.sub(p_facs_addr, 'FACS Address : {0:08X}'.format(ACPI_FACS_ADDR), line))
elif re.search(p_dsdt_addr, line):
lines.append(re.sub(p_dsdt_addr, 'DSDT Address : {0:08X}'.format(ACPI_DSDT_ADDR), line))
elif re.search(p_pm1a_event_block_addr, line):
lines.append(re.sub(p_pm1a_event_block_addr, 'PM1A Event Block Address : {0:08X}'.format(PM1A_EVT_ADDRESS), line))
elif re.search(p_pm1a_control_block_addr, line):
lines.append(re.sub(p_pm1a_control_block_addr, 'PM1A Control Block Address : {0:08X}'.format(PM1A_CNT_ADDRESS), line))
elif re.search(p_pm1_event_length, line):
lines.append(re.sub(p_pm1_event_length, 'PM1 Event Block Length : {0:02X}'.format(PM1A_EVN_LEN), line))
elif re.search(p_pm1_control_length, line):
lines.append(re.sub(p_pm1_control_length, 'PM1 Control Block Length : {0:02X}'.format(PM1A_CNT_LEN), line))
elif re.search(p_flasg, line):
lines.append(re.sub(p_flasg, 'Flags (decoded below) : {0:08X}'.format(FADT_FLAGS), line))
else:
lines.append(line)
dest.writelines(lines)
@ -438,8 +411,8 @@ def main(args):
if config.startswith('VM') and os.path.isdir(os.path.join(DEST_ACPI_PATH, config)):
shutil.rmtree(os.path.join(DEST_ACPI_PATH, config))
dict_passthru_devices = {}
dict_vcpu_list = {}
dict_passthru_devices = collections.OrderedDict()
dict_vcpu_list = collections.OrderedDict()
for vm in scenario_root.findall('vm'):
vm_id = vm.attrib['id']
vm_type_node = vm.find('vm_type')

View File

@ -16,6 +16,10 @@
*/
DefinitionBlock ("", "DSDT", 3, "ACRN ", "ACRNDSDT", 0x00000001)
{
Name (_S5, Package ()
{
0x05,
Zero,
})
}

View File

@ -9,9 +9,9 @@
*/
[0004] Signature : "FACP" [Fixed ACPI Description Table (FADT)]
[0004] Table Length : 000000F4
[0001] Revision : 03
[0001] Checksum : 28
[0004] Table Length : 0000010C
[0001] Revision : 05
[0001] Checksum : 00
[0006] Oem ID : "ACRN "
[0008] Oem Table ID : "ACRNFADT"
[0004] Oem Revision : 00000001
@ -28,16 +28,16 @@
[0001] ACPI Disable Value : 00
[0001] S4BIOS Command : 00
[0001] P-State Control : 00
[0004] PM1A Event Block Address : 00001800
[0004] PM1A Event Block Address : 00000000
[0004] PM1B Event Block Address : 00000000
[0004] PM1A Control Block Address : 00001804
[0004] PM1A Control Block Address : 00000000
[0004] PM1B Control Block Address : 00000000
[0004] PM2 Control Block Address : 00000000
[0004] PM Timer Block Address : 00000000
[0004] GPE0 Block Address : 00000000
[0004] GPE1 Block Address : 00000000
[0001] PM1 Event Block Length : 04
[0001] PM1 Control Block Length : 02
[0001] PM1 Event Block Length : 00
[0001] PM1 Control Block Length : 00
[0001] PM2 Control Block Length : 00
[0001] PM Timer Block Length : 00
[0001] GPE0 Block Length : 00
@ -82,7 +82,7 @@
Remote Power-on capable (V4) : 0
Use APIC Cluster Model (V4) : 0
Use APIC Physical Destination Mode (V4) : 0
Hardware Reduced (V5) : 0
Hardware Reduced (V5) : 1
Low Power S0 Idle (V5) : 0
[0012] Reset Register : [Generic Address Structure]
@ -155,3 +155,16 @@ Use APIC Physical Destination Mode (V4) : 0
[0001] Bit Offset : 00
[0001] Encoded Access Width : 00 [Undefined/Legacy]
[0008] Address : 0000000000000000
[0012] Sleep Control Register : [Generic Address Structure]
[0001] Space ID : 01 [SystemIO]
[0001] Bit Width : 08
[0001] Bit Offset : 00
[0001] Encoded Access Width : 01 [Byte Access:8]
[0008] Address : 0000000000000400
[0012] Sleep Status Register : [Generic Address Structure]
[0001] Space ID : 01 [SystemIO]
[0001] Bit Width : 08
[0001] Bit Offset : 00
[0001] Encoded Access Width : 01 [Byte Access:8]
[0008] Address : 0000000000000401