The primary CCI teardown is open-coded, guarded by .initialized, at the two places that need it: the reset path (before cxl_device_register_init_t3() brings the mailbox back up) and ct3_exit().
Factor it into cxl_destroy_mailbox_t3(), the teardown counterpart of cxl_initialize_mailbox_t3(), keeping the .initialized guard inside the helper: the primary CCI is only brought up from the reset path, so the first reset after realize and an unrealize before any reset must both skip the teardown. No functional change. Suggested-by: Philippe Mathieu-Daudé <[email protected]> Signed-off-by: Junjie Cao <[email protected]> --- hw/cxl/cxl-mailbox-utils.c | 7 +++++++ hw/mem/cxl_type3.c | 8 ++------ include/hw/cxl/cxl_device.h | 1 + 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/hw/cxl/cxl-mailbox-utils.c b/hw/cxl/cxl-mailbox-utils.c index 603677a97b..bc00fec9f8 100644 --- a/hw/cxl/cxl-mailbox-utils.c +++ b/hw/cxl/cxl-mailbox-utils.c @@ -4843,6 +4843,13 @@ void cxl_initialize_mailbox_t3(CXLCCI *cci, DeviceState *d, size_t payload_max) cxl_init_cci(cci, payload_max); } +void cxl_destroy_mailbox_t3(CXLType3Dev *ct3d) +{ + if (ct3d->cci.initialized) { + cxl_destroy_cci(&ct3d->cci); + } +} + static const struct cxl_cmd cxl_cmd_set_t3_ld[256][256] = { [INFOSTAT][IS_IDENTIFY] = { "IDENTIFY", cmd_infostat_identify, 0, 0 }, [LOGS][GET_SUPPORTED] = { "LOGS_GET_SUPPORTED", cmd_logs_get_supported, 0, diff --git a/hw/mem/cxl_type3.c b/hw/mem/cxl_type3.c index ce2cb6558c..3a5eea76f2 100644 --- a/hw/mem/cxl_type3.c +++ b/hw/mem/cxl_type3.c @@ -1076,9 +1076,7 @@ static void ct3_exit(PCIDevice *pci_dev) cxl_doe_cdat_release(cxl_cstate); msix_uninit_exclusive_bar(pci_dev); g_free(regs->special_ops); - if (ct3d->cci.initialized) { - cxl_destroy_cci(&ct3d->cci); - } + cxl_destroy_mailbox_t3(ct3d); if (ct3d->vdm_fm_owned_ld_mctp_cci.initialized) { cxl_destroy_cci(&ct3d->vdm_fm_owned_ld_mctp_cci); } @@ -1344,9 +1342,7 @@ static void ct3d_reset_hold(Object *obj, ResetType type) ct3d->flitmode); cxl_component_register_init_common(reg_state, write_msk, CXL2_TYPE3_DEVICE, ct3d->hdmdb); - if (ct3d->cci.initialized) { - cxl_destroy_cci(&ct3d->cci); - } + cxl_destroy_mailbox_t3(ct3d); cxl_device_register_init_t3(ct3d, CXL_T3_MSIX_MBOX); /* diff --git a/include/hw/cxl/cxl_device.h b/include/hw/cxl/cxl_device.h index b7e20e3fe4..608d05165a 100644 --- a/include/hw/cxl/cxl_device.h +++ b/include/hw/cxl/cxl_device.h @@ -325,6 +325,7 @@ CXL_DEVICE_CAPABILITY_HEADER_REGISTER(MEMORY_DEVICE, CXL_DEVICE_CAP_REG_SIZE * 2) void cxl_initialize_mailbox_t3(CXLCCI *cci, DeviceState *d, size_t payload_max); +void cxl_destroy_mailbox_t3(CXLType3Dev *ct3d); void cxl_initialize_mailbox_swcci(CXLCCI *cci, DeviceState *intf, DeviceState *d, size_t payload_max); void cxl_init_cci(CXLCCI *cci, size_t payload_max); -- 2.43.0
