pc: acpi-build: generate pvpanic device description dynamically
Drops AML template patching and allows to save some space in SSDT if pvpanic device doesn't exist by not including disabled device description into SSDT. It also makes device description smaller by replacing _STA method with named value and dropping _INI method. Signed-off-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
		
				
					committed by
					
						 Michael S. Tsirkin
						Michael S. Tsirkin
					
				
			
			
				
	
			
			
			
						parent
						
							d5e5830f56
						
					
				
				
					commit
					cd61cb2e2c
				
			| @@ -924,7 +924,7 @@ build_ssdt(GArray *table_data, GArray *linker, | ||||
|     uint32_t nr_mem = machine->ram_slots; | ||||
|     unsigned acpi_cpus = guest_info->apic_id_limit; | ||||
|     uint8_t *ssdt_ptr; | ||||
|     Aml *ssdt, *sb_scope, *scope, *pkg; | ||||
|     Aml *ssdt, *sb_scope, *scope, *pkg, *dev, *method, *crs, *field; | ||||
|     int i; | ||||
|  | ||||
|     ssdt = init_aml_allocator(); | ||||
| @@ -939,9 +939,6 @@ build_ssdt(GArray *table_data, GArray *linker, | ||||
|  | ||||
|     patch_pci_windows(pci, ssdt_ptr, sizeof(ssdp_misc_aml)); | ||||
|  | ||||
|     ACPI_BUILD_SET_LE(ssdt_ptr, sizeof(ssdp_misc_aml), | ||||
|                       ssdt_isa_pest[0], 16, misc->pvpanic_port); | ||||
|  | ||||
|     ACPI_BUILD_SET_LE(ssdt_ptr, sizeof(ssdp_misc_aml), | ||||
|                       ssdt_mctrl_nr_slots[0], 32, nr_mem); | ||||
|  | ||||
| @@ -974,6 +971,37 @@ build_ssdt(GArray *table_data, GArray *linker, | ||||
|     aml_append(scope, aml_name_decl("_S5", pkg)); | ||||
|     aml_append(ssdt, scope); | ||||
|  | ||||
|     if (misc->pvpanic_port) { | ||||
|         scope = aml_scope("\\_SB.PCI0.ISA"); | ||||
|  | ||||
|         dev = aml_device("PEVR"); | ||||
|         aml_append(dev, aml_name_decl("_HID", aml_string("QEMU0002"))); | ||||
|  | ||||
|         crs = aml_resource_template(); | ||||
|         aml_append(crs, | ||||
|             aml_io(aml_decode16, misc->pvpanic_port, misc->pvpanic_port, 1, 1) | ||||
|         ); | ||||
|         aml_append(dev, aml_name_decl("_CRS", crs)); | ||||
|  | ||||
|         aml_append(dev, aml_operation_region("PEOR", aml_system_io, | ||||
|                                               misc->pvpanic_port, 1)); | ||||
|         field = aml_field("PEOR", aml_byte_acc); | ||||
|         aml_append(field, aml_named_field("PEPT", 8)); | ||||
|         aml_append(dev, field); | ||||
|  | ||||
|         method = aml_method("RDPT", 0); | ||||
|         aml_append(method, aml_store(aml_name("PEPT"), aml_local(0))); | ||||
|         aml_append(method, aml_return(aml_local(0))); | ||||
|         aml_append(dev, method); | ||||
|  | ||||
|         method = aml_method("WRPT", 1); | ||||
|         aml_append(method, aml_store(aml_arg(0), aml_name("PEPT"))); | ||||
|         aml_append(dev, method); | ||||
|  | ||||
|         aml_append(scope, dev); | ||||
|         aml_append(ssdt, scope); | ||||
|     } | ||||
|  | ||||
|     sb_scope = aml_scope("_SB"); | ||||
|     { | ||||
|         /* build Processor object for each processor */ | ||||
|   | ||||
| @@ -39,51 +39,4 @@ DefinitionBlock ("ssdt-misc.aml", "SSDT", 0x01, "BXPC", "BXSSDTSUSP", 0x1) | ||||
|        ACPI_EXTRACT_NAME_DWORD_CONST ssdt_mctrl_nr_slots | ||||
|        Name(MEMORY_SLOTS_NUMBER, 0x12345678) | ||||
|     } | ||||
|  | ||||
|  | ||||
|     External(\_SB.PCI0, DeviceObj) | ||||
|     External(\_SB.PCI0.ISA, DeviceObj) | ||||
|  | ||||
|     Scope(\_SB.PCI0.ISA) { | ||||
|         Device(PEVT) { | ||||
|             Name(_HID, "QEMU0001") | ||||
|             /* PEST will be patched to be Zero if no such device */ | ||||
|             ACPI_EXTRACT_NAME_WORD_CONST ssdt_isa_pest | ||||
|             Name(PEST, 0xFFFF) | ||||
|             OperationRegion(PEOR, SystemIO, PEST, 0x01) | ||||
|             Field(PEOR, ByteAcc, NoLock, Preserve) { | ||||
|                 PEPT,   8, | ||||
|             } | ||||
|  | ||||
|             Method(_STA, 0, NotSerialized) { | ||||
|                 Store(PEST, Local0) | ||||
|                 If (LEqual(Local0, Zero)) { | ||||
|                     Return (0x00) | ||||
|                 } Else { | ||||
|                     Return (0x0F) | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             Method(RDPT, 0, NotSerialized) { | ||||
|                 Store(PEPT, Local0) | ||||
|                 Return (Local0) | ||||
|             } | ||||
|  | ||||
|             Method(WRPT, 1, NotSerialized) { | ||||
|                 Store(Arg0, PEPT) | ||||
|             } | ||||
|  | ||||
|             Name(_CRS, ResourceTemplate() { | ||||
|                 IO(Decode16, 0x00, 0x00, 0x01, 0x01, IO) | ||||
|             }) | ||||
|  | ||||
|             CreateWordField(_CRS, IO._MIN, IOMN) | ||||
|             CreateWordField(_CRS, IO._MAX, IOMX) | ||||
|  | ||||
|             Method(_INI, 0, NotSerialized) { | ||||
|                 Store(PEST, IOMN) | ||||
|                 Store(PEST, IOMX) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user