acpi: add interface to build device specific AML
There is already ISADeviceClass::build_aml() callback which builds device specific AML blob for some ISA devices. To extend the same idea to other devices, add TYPE_ACPI_DEV_AML_IF Interface that will provide a more generic callback which will be used not only for ISA but other devices. It will allow get rid of some data-mining and ad-hoc AML building, by asking device(s) to generate its own AML blob like it's done for ISA devices. Signed-off-by: Igor Mammedov <imammedo@redhat.com> Acked-by: Gerd Hoffmann <kraxel@redhat.com> Message-Id: <20220608135340.3304695-2-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:
		
							parent
							
								
									6d940eff47
								
							
						
					
					
						commit
						23609e47c0
					
				| @ -1,5 +1,6 @@ | ||||
| #include "qemu/osdep.h" | ||||
| #include "hw/acpi/acpi_dev_interface.h" | ||||
| #include "hw/acpi/acpi_aml_interface.h" | ||||
| #include "qemu/module.h" | ||||
| 
 | ||||
| void acpi_send_event(DeviceState *dev, AcpiEventStatusBits event) | ||||
| @ -18,8 +19,15 @@ static void register_types(void) | ||||
|         .parent        = TYPE_INTERFACE, | ||||
|         .class_size = sizeof(AcpiDeviceIfClass), | ||||
|     }; | ||||
|     static const TypeInfo acpi_dev_aml_if_info = { | ||||
|         .name          = TYPE_ACPI_DEV_AML_IF, | ||||
|         .parent        = TYPE_INTERFACE, | ||||
|         .class_size = sizeof(AcpiDevAmlIfClass), | ||||
|     }; | ||||
| 
 | ||||
| 
 | ||||
|     type_register_static(&acpi_dev_if_info); | ||||
|     type_register_static(&acpi_dev_aml_if_info); | ||||
| } | ||||
| 
 | ||||
| type_init(register_types) | ||||
|  | ||||
| @ -29,7 +29,7 @@ acpi_ss.add(when: 'CONFIG_PC', if_false: files('acpi-x86-stub.c')) | ||||
| if have_tpm | ||||
|   acpi_ss.add(files('tpm.c')) | ||||
| endif | ||||
| softmmu_ss.add(when: 'CONFIG_ACPI', if_false: files('acpi-stub.c', 'aml-build-stub.c', 'ghes-stub.c')) | ||||
| softmmu_ss.add(when: 'CONFIG_ACPI', if_false: files('acpi-stub.c', 'aml-build-stub.c', 'ghes-stub.c', 'acpi_interface.c')) | ||||
| softmmu_ss.add_all(when: 'CONFIG_ACPI', if_true: acpi_ss) | ||||
| softmmu_ss.add(when: 'CONFIG_ALL', if_true: files('acpi-stub.c', 'aml-build-stub.c', | ||||
|                                                   'acpi-x86-stub.c', 'ipmi-stub.c', 'ghes-stub.c', | ||||
|  | ||||
							
								
								
									
										40
									
								
								include/hw/acpi/acpi_aml_interface.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								include/hw/acpi/acpi_aml_interface.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,40 @@ | ||||
| #ifndef ACPI_AML_INTERFACE_H | ||||
| #define ACPI_AML_INTERFACE_H | ||||
| 
 | ||||
| #include "qom/object.h" | ||||
| #include "hw/acpi/aml-build.h" | ||||
| 
 | ||||
| #define TYPE_ACPI_DEV_AML_IF "acpi-dev-aml-interface" | ||||
| typedef struct AcpiDevAmlIfClass AcpiDevAmlIfClass; | ||||
| DECLARE_CLASS_CHECKERS(AcpiDevAmlIfClass, ACPI_DEV_AML_IF, TYPE_ACPI_DEV_AML_IF) | ||||
| #define ACPI_DEV_AML_IF(obj) \ | ||||
|      INTERFACE_CHECK(AcpiDevAmlIf, (obj), TYPE_ACPI_DEV_AML_IF) | ||||
| 
 | ||||
| typedef struct AcpiDevAmlIf AcpiDevAmlIf; | ||||
| typedef void (*dev_aml_fn)(AcpiDevAmlIf *adev, Aml *scope); | ||||
| 
 | ||||
| /**
 | ||||
|  * AcpiDevAmlIfClass: | ||||
|  * | ||||
|  * build_dev_aml: adds device specific AML blob to provided scope | ||||
|  * | ||||
|  * Interface is designed for providing generic callback that builds device | ||||
|  * specific AML blob. | ||||
|  */ | ||||
| struct AcpiDevAmlIfClass { | ||||
|     /* <private> */ | ||||
|     InterfaceClass parent_class; | ||||
| 
 | ||||
|     /* <public> */ | ||||
|     dev_aml_fn build_dev_aml; | ||||
| }; | ||||
| 
 | ||||
| static inline void call_dev_aml_func(DeviceState *dev, Aml *scope) | ||||
| { | ||||
|     if (object_dynamic_cast(OBJECT(dev), TYPE_ACPI_DEV_AML_IF)) { | ||||
|         AcpiDevAmlIfClass *klass = ACPI_DEV_AML_IF_GET_CLASS(dev); | ||||
|         klass->build_dev_aml(ACPI_DEV_AML_IF(dev), scope); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Igor Mammedov
						Igor Mammedov