hw/cxl: Add poison injection via the mailbox.
Very simple implementation to allow testing of corresponding kernel code. Note that for now we track each 64 byte section independently. Whilst a valid implementation choice, it may make sense to fuse entries so as to prove out more complex corners of the kernel code. Reviewed-by: Ira Weiny <ira.weiny@intel.com> Reviewed-by: Fan Ni <fan.ni@samsung.com> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Message-Id: <20230526170010.574-4-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
9547754f40
commit
ff04b207a0
|
@ -64,6 +64,7 @@ enum {
|
|||
#define SET_LSA 0x3
|
||||
MEDIA_AND_POISON = 0x43,
|
||||
#define GET_POISON_LIST 0x0
|
||||
#define INJECT_POISON 0x1
|
||||
};
|
||||
|
||||
/* 8.2.8.4.5.1 Command Return Codes */
|
||||
|
@ -472,6 +473,45 @@ static CXLRetCode cmd_media_get_poison_list(struct cxl_cmd *cmd,
|
|||
return CXL_MBOX_SUCCESS;
|
||||
}
|
||||
|
||||
static CXLRetCode cmd_media_inject_poison(struct cxl_cmd *cmd,
|
||||
CXLDeviceState *cxl_dstate,
|
||||
uint16_t *len_unused)
|
||||
{
|
||||
CXLType3Dev *ct3d = container_of(cxl_dstate, CXLType3Dev, cxl_dstate);
|
||||
CXLPoisonList *poison_list = &ct3d->poison_list;
|
||||
CXLPoison *ent;
|
||||
struct inject_poison_pl {
|
||||
uint64_t dpa;
|
||||
};
|
||||
struct inject_poison_pl *in = (void *)cmd->payload;
|
||||
uint64_t dpa = ldq_le_p(&in->dpa);
|
||||
CXLPoison *p;
|
||||
|
||||
QLIST_FOREACH(ent, poison_list, node) {
|
||||
if (dpa >= ent->start &&
|
||||
dpa + CXL_CACHE_LINE_SIZE <= ent->start + ent->length) {
|
||||
return CXL_MBOX_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
if (ct3d->poison_list_cnt == CXL_POISON_LIST_LIMIT) {
|
||||
return CXL_MBOX_INJECT_POISON_LIMIT;
|
||||
}
|
||||
p = g_new0(CXLPoison, 1);
|
||||
|
||||
p->length = CXL_CACHE_LINE_SIZE;
|
||||
p->start = dpa;
|
||||
p->type = CXL_POISON_TYPE_INJECTED;
|
||||
|
||||
/*
|
||||
* Possible todo: Merge with existing entry if next to it and if same type
|
||||
*/
|
||||
QLIST_INSERT_HEAD(poison_list, p, node);
|
||||
ct3d->poison_list_cnt++;
|
||||
|
||||
return CXL_MBOX_SUCCESS;
|
||||
}
|
||||
|
||||
#define IMMEDIATE_CONFIG_CHANGE (1 << 1)
|
||||
#define IMMEDIATE_DATA_CHANGE (1 << 2)
|
||||
#define IMMEDIATE_POLICY_CHANGE (1 << 3)
|
||||
|
@ -501,6 +541,8 @@ static struct cxl_cmd cxl_cmd_set[256][256] = {
|
|||
~0, IMMEDIATE_CONFIG_CHANGE | IMMEDIATE_DATA_CHANGE },
|
||||
[MEDIA_AND_POISON][GET_POISON_LIST] = { "MEDIA_AND_POISON_GET_POISON_LIST",
|
||||
cmd_media_get_poison_list, 16, 0 },
|
||||
[MEDIA_AND_POISON][INJECT_POISON] = { "MEDIA_AND_POISON_INJECT_POISON",
|
||||
cmd_media_inject_poison, 8, 0 },
|
||||
};
|
||||
|
||||
void cxl_process_mailbox(CXLDeviceState *cxl_dstate)
|
||||
|
|
Loading…
Reference in New Issue