On 11/3/25 3:58 PM, Eric Auger wrote:
>
>
> On 10/31/25 11:49 AM, Shameer Kolothum wrote:
>> Introduce a new pci_preserve_config field in virt machine state which
>> allows the generation of DSM #5. This field is only set if accel SMMU
>> is instantiated.
>>
>> In a subsequent patch, SMMUv3 accel mode will make use of IORT RMR nodes
>> to enable nested translation of MSI doorbell addresses. IORT RMR requires
>> _DSM #5 to be set for the PCI host bridge so that the Guest kernel
>> preserves the PCI boot configuration.
>>
>> Reviewed-by: Jonathan Cameron <[email protected]>
>> Tested-by: Zhangfei Gao <[email protected]>
>> Signed-off-by: Shameer Kolothum <[email protected]>
>> ---
>> hw/arm/virt-acpi-build.c | 8 ++++++++
>> hw/arm/virt.c | 4 ++++
>> include/hw/arm/virt.h | 1 +
>> 3 files changed, 13 insertions(+)
>>
>> diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
>> index 8bb6b60515..d51da6e27d 100644
>> --- a/hw/arm/virt-acpi-build.c
>> +++ b/hw/arm/virt-acpi-build.c
>> @@ -163,6 +163,14 @@ static void acpi_dsdt_add_pci(Aml *scope, const
>> MemMapEntry *memmap,
>> .pci_native_hotplug = !acpi_pcihp,
>> };
>>
>> + /*
>> + * Accel SMMU requires RMRs for MSI 1-1 mapping, which require _DSM for
>> + * preserving PCI Boot Configurations
> as suggested in v4 you can be more precise and explictly state
>
> _DSM function 5 (Ignore PCI Boot Configuration)
>
>> + */
>> + if (vms->pci_preserve_config) {
>> + cfg.preserve_config = true;
>> + }
>> +
>> if (vms->highmem_mmio) {
>> cfg.mmio64 = memmap[VIRT_HIGH_PCIE_MMIO];
>> }
>> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
>> index 175023897a..8a347a6e39 100644
>> --- a/hw/arm/virt.c
>> +++ b/hw/arm/virt.c
>> @@ -3091,6 +3091,10 @@ static void
>> virt_machine_device_plug_cb(HotplugHandler *hotplug_dev,
>> }
>>
>> create_smmuv3_dev_dtb(vms, dev, bus);
>> + if (object_property_find(OBJECT(dev), "accel") &&
> why do you need to test
>
> object_property_find(OBJECT(dev), "accel")?
Hum, because at that moment it does not exist yet. So you can remove it
in 25/32 I think
Eric
>
>> + object_property_get_bool(OBJECT(dev), "accel",
>> &error_abort)) {
>> + vms->pci_preserve_config = true;
>> + }
>> }
>> }
>>
>> diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
>> index 04a09af354..60db5d40b2 100644
>> --- a/include/hw/arm/virt.h
>> +++ b/include/hw/arm/virt.h
>> @@ -182,6 +182,7 @@ struct VirtMachineState {
>> bool ns_el2_virt_timer_irq;
>> CXLState cxl_devices_state;
>> bool legacy_smmuv3_present;
>> + bool pci_preserve_config;
>> };
>>
>> #define VIRT_ECAM_ID(high) (high ? VIRT_HIGH_PCIE_ECAM : VIRT_PCIE_ECAM)
> With those changes takin into account
> Reviewed-by: Eric Auger <[email protected]>
>
> Eric
>