On Mon, 5 May 2025 16:40:18 +0000 Anisa Su <anisa.su...@gmail.com> wrote:
> 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. Ah. That makes sense. Thanks! > 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 > > >