On Thu, Apr 24, 2025 at 12:19:59PM +0100, Jonathan Cameron wrote: > On Mon, 17 Mar 2025 16:31:35 +0000 > anisa.su...@gmail.com wrote: > > > From: Anisa Su <anisa...@samsung.com> > > > > FM DCD Management command 0x5604 implemented per CXL r3.2 Spec Section > > 7.6.7.6.5 > > > > Signed-off-by: Anisa Su <anisa...@samsung.com> > > --- ... > > + /* Create event record and insert to event log */ > > + cxl_mbox_dc_event_create_record_hdr(ct3d, &event_rec.hdr); > > + event_rec.type = DC_EVENT_ADD_CAPACITY; > > + /* FIXME: for now, validity flag is cleared */ > > This stuff is probably all valid. If we can return remaining extents though > we might > as well. > > > + event_rec.validity_flags = 0; > > + /* FIXME: Currently only support 1 host */ > > + event_rec.host_id = 0; > > + /* updated_region_id only valid for DC_EVENT_REGION_CONFIG_UPDATED > > */ > > + event_rec.updated_region_id = 0; > > The event_rec is zeroed anyway so probably just don't set this at all > and no need for the comment. > > > + for (i = 0; i < in->ext_count; i++) { > > Why can't we combine this with the earlier loop and avoid the > need for separate storage of extents in event_rec_exts? > I discussed with Fan and for add specifically, we will need 2 loops because the pending list is of type CXLDCExtentGroupList. We must use the first loop to create a CXLDCExtentGroup from all of the extents and append the entire thing to the pending list before triggering any interrupts for event records. This is necessary to preserve the ordering/grouping in order for the memdev_add_rsp command to know what to remove from the pending list if no extents were accepted. But the storage of extents in event_rec_exts is unnecessary and for release, we only need 1 loop.
Thanks, Anisa > > + memcpy(&event_rec.dynamic_capacity_extent, > > + &event_rec_exts[i], > > + sizeof(CXLDCExtentRaw)); > > + > > + event_rec.flags = 0; > > + if (i < in->ext_count - 1) { > > + /* Set "More" flag */ > > + event_rec.flags |= BIT(0); > > + } > > + > > + if (cxl_event_insert(&ct3d->cxl_dstate, > > + CXL_EVENT_TYPE_DYNAMIC_CAP, > > + (CXLEventRecordRaw *)&event_rec)) { > > + cxl_event_irq_assert(ct3d); > > + } > > + } > > + > > + return CXL_MBOX_SUCCESS; > > + default: > > + qemu_log_mask(LOG_UNIMP, > > + "CXL extent selection policy not supported.\n"); > > + return CXL_MBOX_INVALID_INPUT; > > + } > > + > > + return CXL_MBOX_SUCCESS; > > +} > > + > > static const struct cxl_cmd cxl_cmd_set[256][256] = { > > [INFOSTAT][BACKGROUND_OPERATION_ABORT] = { > > "BACKGROUND_OPERATION_ABORT", > > cmd_infostat_bg_op_abort, 0, 0 }, > > @@ -3804,6 +3970,13 @@ static const struct cxl_cmd > > cxl_cmd_set_fm_dcd[256][256] = { > > CXL_MBOX_IMMEDIATE_DATA_CHANGE)}, > > [FMAPI_DCD_MGMT][GET_DC_REGION_EXTENT_LIST] = { > > "GET_DC_REGION_EXTENT_LIST", > > cmd_fm_get_dc_region_extent_list, 12, 0}, > > + [FMAPI_DCD_MGMT][INITIATE_DC_ADD] = { "INIT_DC_ADD", > > + cmd_fm_initiate_dc_add, ~0, > > + (CXL_MBOX_CONFIG_CHANGE_COLD_RESET | > > + CXL_MBOX_CONFIG_CHANGE_CONV_RESET | > > + CXL_MBOX_CONFIG_CHANGE_CXL_RESET | > > + CXL_MBOX_IMMEDIATE_CONFIG_CHANGE | > > + CXL_MBOX_IMMEDIATE_DATA_CHANGE)}, > > }; > > > > /* > > diff --git a/hw/mem/cxl_type3.c b/hw/mem/cxl_type3.c > > index b742b2bb8d..ccc619fe10 100644 > > --- a/hw/mem/cxl_type3.c > > +++ b/hw/mem/cxl_type3.c > > @@ -1982,8 +1982,8 @@ void qmp_cxl_inject_memory_module_event(const char > > *path, CxlEventLog log, > > * the list. > > * Return value: return true if has overlaps; otherwise, return false > > */ > > -static bool cxl_extents_overlaps_dpa_range(CXLDCExtentList *list, > > - uint64_t dpa, uint64_t len) > > +bool cxl_extents_overlaps_dpa_range(CXLDCExtentList *list, > > + uint64_t dpa, uint64_t len) > > { > > CXLDCExtent *ent; > > Range range1, range2; > > @@ -2028,8 +2028,8 @@ bool cxl_extents_contains_dpa_range(CXLDCExtentList > > *list, > > return false; > > } > > > > -static bool cxl_extent_groups_overlaps_dpa_range(CXLDCExtentGroupList > > *list, > > - uint64_t dpa, uint64_t > > len) > > +bool cxl_extent_groups_overlaps_dpa_range(CXLDCExtentGroupList *list, > > + uint64_t dpa, uint64_t len) > > { > > CXLDCExtentGroup *group; > > > > diff --git a/include/hw/cxl/cxl_device.h b/include/hw/cxl/cxl_device.h > > index 217003a29d..1d5831a0b6 100644 > > --- a/include/hw/cxl/cxl_device.h > > +++ b/include/hw/cxl/cxl_device.h > > @@ -809,4 +809,8 @@ bool ct3_test_region_block_backed(CXLType3Dev *ct3d, > > uint64_t dpa, > > void cxl_assign_event_header(CXLEventRecordHdr *hdr, > > const QemuUUID *uuid, uint32_t flags, > > uint8_t length, uint64_t timestamp); > > +bool cxl_extents_overlaps_dpa_range(CXLDCExtentList *list, > > + uint64_t dpa, uint64_t len); > > +bool cxl_extent_groups_overlaps_dpa_range(CXLDCExtentGroupList *list, > > + uint64_t dpa, uint64_t len); > > #endif >