@samitouri / QOSamiQemu / commits / 5f0348bf6c

hw/tpm: gate PPI support on tpm-tis-device behind a device property

Add a "ppi" boolean property (default: true) to tpm-tis-device. When ppi=off the RAMBlock is never registered and the migration stream omits "tpm-ppi", restoring backward compatibility. Move sysbus_init_mmio() calls from instance_init to realizefn so the memory regions are initialized before being registered. When ppi=off, the PPI MMIO region is simply not exposed. Fixes: 46cd2c1050f0 ("hw/tpm: add PPI support to tpm-tis-device for ARM64 virt") Signed-off-by: Mohammadfaiz Bawa <mbawa@redhat.com> Reviewed-by: Stefan Berger <stefanb@linux.ibm.com> Link: https://lore.kernel.org/qemu-devel/20260619093140.832136-3-mbawa@redhat.com Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>

Mohammadfaiz Bawa committed Jun 19, 2026 at 15:01 UTC 5f0348bf6ca17707475c5ccb10909b7a4407513b
2 files changed +12 -7
hw/tpm/tpm_tis.h
+1
@@ -76,6 +76,7 @@ typedef struct TPMState {
76 size_t be_buffer_size;
77
78 TPMPPI ppi;
79 + bool ppi_enabled;
80 } TPMState;
81
82 extern const VMStateDescription vmstate_locty;
hw/tpm/tpm_tis_sysbus.c
+11 -7
@@ -94,6 +94,7 @@ static void tpm_tis_sysbus_reset(DeviceState *dev)
94 static const Property tpm_tis_sysbus_properties[] = {
95 DEFINE_PROP_UINT32("irq", TPMStateSysBus, state.irq_num, TPM_TIS_IRQ),
96 DEFINE_PROP_TPMBE("tpmdev", TPMStateSysBus, state.be_driver),
97 + DEFINE_PROP_BOOL("ppi", TPMStateSysBus, state.ppi_enabled, true),
98 };
99
100 static void tpm_tis_sysbus_initfn(Object *obj)
@@ -101,9 +102,7 @@ static void tpm_tis_sysbus_initfn(Object *obj)
102 TPMStateSysBus *sbdev = TPM_TIS_SYSBUS(obj);
103 TPMState *s = &sbdev->state;
104
104 - sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio);
105 sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irq);
106 - sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->ppi.ram);
106 }
107
108 static void tpm_tis_sysbus_realizefn(DeviceState *dev, Error **errp)
@@ -122,14 +121,19 @@ static void tpm_tis_sysbus_realizefn(DeviceState *dev, Error **errp)
121 return;
122 }
123
125 - s->ppi.buf = qemu_memalign(host_page_size,
126 - ROUND_UP(TPM_PPI_ADDR_SIZE, host_page_size));
124 memory_region_init_io(&s->mmio, OBJECT(dev), &tpm_tis_memory_ops,
125 s, "tpm-tis-mmio",
126 TPM_TIS_NUM_LOCALITIES << TPM_TIS_LOCALITY_SHIFT);
130 - memory_region_init_ram_device_ptr(&s->ppi.ram, OBJECT(dev), "tpm-ppi",
131 - TPM_PPI_ADDR_SIZE, s->ppi.buf);
132 - vmstate_register_ram(&s->ppi.ram, dev);
127 + sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->mmio);
128 +
129 + if (s->ppi_enabled) {
130 + s->ppi.buf = qemu_memalign(host_page_size,
131 + ROUND_UP(TPM_PPI_ADDR_SIZE, host_page_size));
132 + memory_region_init_ram_device_ptr(&s->ppi.ram, OBJECT(dev), "tpm-ppi",
133 + TPM_PPI_ADDR_SIZE, s->ppi.buf);
134 + sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->ppi.ram);
135 + vmstate_register_ram(&s->ppi.ram, dev);
136 + }
137 }
138
139 static void tpm_tis_sysbus_class_init(ObjectClass *klass, const void *data)