hw/cxl: Create helper function to create DC Event Records from extents
Prepatory patch for following FMAPI Add/Release Patches. Refactors part of qmp_cxl_process_dynamic_capacity_prescriptive() into a helper function to create DC Event Records and insert in the event log. Moves definition for CXL_NUM_EXTENTS_SUPPORTED to cxl.h so it can be accessed by cxl-mailbox-utils.c and cxl-events.c, where the helper function is defined. Reviewed-by: Fan Ni <fan.ni@samsung.com> Signed-off-by: Anisa Su <anisa.su@samsung.com> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Message-Id: <20250714174509.1984430-10-Jonathan.Cameron@huawei.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
21af9a917e
commit
0a362772e0
5 changed files with 44 additions and 37 deletions
|
|
@ -258,3 +258,41 @@ void cxl_event_irq_assert(CXLType3Dev *ct3d)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
void cxl_create_dc_event_records_for_extents(CXLType3Dev *ct3d,
|
||||
CXLDCEventType type,
|
||||
CXLDCExtentRaw extents[],
|
||||
uint32_t ext_count)
|
||||
{
|
||||
CXLEventDynamicCapacity event_rec = {};
|
||||
int i;
|
||||
|
||||
cxl_assign_event_header(&event_rec.hdr,
|
||||
&dynamic_capacity_uuid,
|
||||
(1 << CXL_EVENT_TYPE_INFO),
|
||||
sizeof(event_rec),
|
||||
cxl_device_get_timestamp(&ct3d->cxl_dstate));
|
||||
event_rec.type = type;
|
||||
event_rec.validity_flags = 1;
|
||||
event_rec.host_id = 0;
|
||||
event_rec.updated_region_id = 0;
|
||||
event_rec.extents_avail = CXL_NUM_EXTENTS_SUPPORTED -
|
||||
ct3d->dc.total_extent_count;
|
||||
|
||||
for (i = 0; i < ext_count; i++) {
|
||||
memcpy(&event_rec.dynamic_capacity_extent,
|
||||
&extents[i],
|
||||
sizeof(CXLDCExtentRaw));
|
||||
event_rec.flags = 0;
|
||||
if (i < 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,7 +28,6 @@
|
|||
|
||||
#define CXL_CAPACITY_MULTIPLIER (256 * MiB)
|
||||
#define CXL_DC_EVENT_LOG_SIZE 8
|
||||
#define CXL_NUM_EXTENTS_SUPPORTED 512
|
||||
#define CXL_NUM_TAGS_SUPPORTED 0
|
||||
#define CXL_ALERTS_LIFE_USED_WARN_THRESH (1 << 0)
|
||||
#define CXL_ALERTS_OVER_TEMP_WARN_THRESH (1 << 1)
|
||||
|
|
|
|||
|
|
@ -1957,15 +1957,11 @@ static void qmp_cxl_process_dynamic_capacity_prescriptive(const char *path,
|
|||
CxlDynamicCapacityExtentList *records, Error **errp)
|
||||
{
|
||||
Object *obj;
|
||||
CXLEventDynamicCapacity dCap = {};
|
||||
CXLEventRecordHdr *hdr = &dCap.hdr;
|
||||
CXLType3Dev *dcd;
|
||||
uint8_t flags = 1 << CXL_EVENT_TYPE_INFO;
|
||||
uint32_t num_extents = 0;
|
||||
CxlDynamicCapacityExtentList *list;
|
||||
CXLDCExtentGroup *group = NULL;
|
||||
g_autofree CXLDCExtentRaw *extents = NULL;
|
||||
uint8_t enc_log = CXL_EVENT_TYPE_DYNAMIC_CAP;
|
||||
uint64_t dpa, offset, len, block_size;
|
||||
g_autofree unsigned long *blk_bitmap = NULL;
|
||||
int i;
|
||||
|
|
@ -2078,38 +2074,7 @@ static void qmp_cxl_process_dynamic_capacity_prescriptive(const char *path,
|
|||
dcd->dc.total_extent_count += num_extents;
|
||||
}
|
||||
|
||||
/*
|
||||
* CXL r3.1 section 8.2.9.2.1.6: Dynamic Capacity Event Record
|
||||
*
|
||||
* All Dynamic Capacity event records shall set the Event Record Severity
|
||||
* field in the Common Event Record Format to Informational Event. All
|
||||
* Dynamic Capacity related events shall be logged in the Dynamic Capacity
|
||||
* Event Log.
|
||||
*/
|
||||
cxl_assign_event_header(hdr, &dynamic_capacity_uuid, flags, sizeof(dCap),
|
||||
cxl_device_get_timestamp(&dcd->cxl_dstate));
|
||||
|
||||
dCap.type = type;
|
||||
/* FIXME: for now, validity flag is cleared */
|
||||
dCap.validity_flags = 0;
|
||||
stw_le_p(&dCap.host_id, hid);
|
||||
/* only valid for DC_REGION_CONFIG_UPDATED event */
|
||||
dCap.updated_region_id = 0;
|
||||
for (i = 0; i < num_extents; i++) {
|
||||
memcpy(&dCap.dynamic_capacity_extent, &extents[i],
|
||||
sizeof(CXLDCExtentRaw));
|
||||
|
||||
dCap.flags = 0;
|
||||
if (i < num_extents - 1) {
|
||||
/* Set "More" flag */
|
||||
dCap.flags |= BIT(0);
|
||||
}
|
||||
|
||||
if (cxl_event_insert(&dcd->cxl_dstate, enc_log,
|
||||
(CXLEventRecordRaw *)&dCap)) {
|
||||
cxl_event_irq_assert(dcd);
|
||||
}
|
||||
}
|
||||
cxl_create_dc_event_records_for_extents(dcd, type, extents, num_extents);
|
||||
}
|
||||
|
||||
void qmp_cxl_add_dynamic_capacity(const char *path, uint16_t host_id,
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@
|
|||
#define CXL_DEVICE_REG_BAR_IDX 2
|
||||
|
||||
#define CXL_WINDOW_MAX 10
|
||||
#define CXL_NUM_EXTENTS_SUPPORTED 512
|
||||
|
||||
typedef struct PXBCXLDev PXBCXLDev;
|
||||
|
||||
|
|
|
|||
|
|
@ -724,4 +724,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);
|
||||
void cxl_create_dc_event_records_for_extents(CXLType3Dev *ct3d,
|
||||
CXLDCEventType type,
|
||||
CXLDCExtentRaw extents[],
|
||||
uint32_t ext_count);
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue