From 5f0348bf6ca17707475c5ccb10909b7a4407513b Mon Sep 17 00:00:00 2001 From: Mohammadfaiz Bawa Date: Fri, 19 Jun 2026 15:01:39 +0530 Subject: [PATCH] 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 Reviewed-by: Stefan Berger Link: https://lore.kernel.org/qemu-devel/20260619093140.832136-3-mbawa@redhat.com Signed-off-by: Stefan Berger --- hw/tpm/tpm_tis.h | 1 + hw/tpm/tpm_tis_sysbus.c | 18 +++++++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/hw/tpm/tpm_tis.h b/hw/tpm/tpm_tis.h index 1531620bf9..6ac9804050 100644 --- a/hw/tpm/tpm_tis.h +++ b/hw/tpm/tpm_tis.h @@ -76,6 +76,7 @@ typedef struct TPMState { size_t be_buffer_size; TPMPPI ppi; + bool ppi_enabled; } TPMState; extern const VMStateDescription vmstate_locty; diff --git a/hw/tpm/tpm_tis_sysbus.c b/hw/tpm/tpm_tis_sysbus.c index 16bb17874b..a7b0002d82 100644 --- a/hw/tpm/tpm_tis_sysbus.c +++ b/hw/tpm/tpm_tis_sysbus.c @@ -94,6 +94,7 @@ static void tpm_tis_sysbus_reset(DeviceState *dev) static const Property tpm_tis_sysbus_properties[] = { DEFINE_PROP_UINT32("irq", TPMStateSysBus, state.irq_num, TPM_TIS_IRQ), DEFINE_PROP_TPMBE("tpmdev", TPMStateSysBus, state.be_driver), + DEFINE_PROP_BOOL("ppi", TPMStateSysBus, state.ppi_enabled, true), }; static void tpm_tis_sysbus_initfn(Object *obj) @@ -101,9 +102,7 @@ static void tpm_tis_sysbus_initfn(Object *obj) TPMStateSysBus *sbdev = TPM_TIS_SYSBUS(obj); TPMState *s = &sbdev->state; - sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio); sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irq); - sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->ppi.ram); } static void tpm_tis_sysbus_realizefn(DeviceState *dev, Error **errp) @@ -122,14 +121,19 @@ static void tpm_tis_sysbus_realizefn(DeviceState *dev, Error **errp) return; } - s->ppi.buf = qemu_memalign(host_page_size, - ROUND_UP(TPM_PPI_ADDR_SIZE, host_page_size)); memory_region_init_io(&s->mmio, OBJECT(dev), &tpm_tis_memory_ops, s, "tpm-tis-mmio", TPM_TIS_NUM_LOCALITIES << TPM_TIS_LOCALITY_SHIFT); - memory_region_init_ram_device_ptr(&s->ppi.ram, OBJECT(dev), "tpm-ppi", - TPM_PPI_ADDR_SIZE, s->ppi.buf); - vmstate_register_ram(&s->ppi.ram, dev); + sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->mmio); + + if (s->ppi_enabled) { + s->ppi.buf = qemu_memalign(host_page_size, + ROUND_UP(TPM_PPI_ADDR_SIZE, host_page_size)); + memory_region_init_ram_device_ptr(&s->ppi.ram, OBJECT(dev), "tpm-ppi", + TPM_PPI_ADDR_SIZE, s->ppi.buf); + sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->ppi.ram); + vmstate_register_ram(&s->ppi.ram, dev); + } } static void tpm_tis_sysbus_class_init(ObjectClass *klass, const void *data)