For multi-headed type 3 devices, this command reports logical device mappings for each head. Implement a callback which can be initialized by MHD devices to field these commands.
Reports "unsupported" if the command is called but the callback is not implemented. Signed-off-by: Gregory Price <gregory.pr...@memverge.com> --- hw/cxl/cxl-mailbox-utils.c | 21 +++++++++++++++++++++ hw/mem/cxl_type3.c | 1 + include/hw/cxl/cxl_device.h | 6 ++++++ 3 files changed, 28 insertions(+) diff --git a/hw/cxl/cxl-mailbox-utils.c b/hw/cxl/cxl-mailbox-utils.c index b64bbdf45d..3177a59de3 100644 --- a/hw/cxl/cxl-mailbox-utils.c +++ b/hw/cxl/cxl-mailbox-utils.c @@ -91,6 +91,8 @@ enum { #define GET_PHYSICAL_PORT_STATE 0x1 TUNNEL = 0x53, #define MANAGEMENT_COMMAND 0x0 + MHD = 0x55, + #define GET_MHD_INFO 0x0 }; /* CCI Message Format CXL r3.0 Figure 7-19 */ @@ -184,6 +186,23 @@ static CXLRetCode cmd_tunnel_management_cmd(const struct cxl_cmd *cmd, return CXL_MBOX_INVALID_INPUT; } +/* + * CXL r3.0 section 7.6.7.5.1 - Get Multi-Headed Info (Opcode 5500h) + */ +static CXLRetCode cmd_mhd_get_info(const struct cxl_cmd *cmd, + uint8_t *payload_in, size_t len_in, + uint8_t *payload_out, size_t *len_out, + CXLCCI *cci) +{ + CXLType3Dev *ct3d = CXL_TYPE3(cci->d); + CXLType3Class *cvc = CXL_TYPE3_GET_CLASS(ct3d); + if (cvc->mhd_get_info) { + return cvc->mhd_get_info(cmd, payload_in, len_in, payload_out, + len_out, cci); + } + return CXL_MBOX_UNSUPPORTED; +} + static CXLRetCode cmd_events_get_records(const struct cxl_cmd *cmd, uint8_t *payload_in, size_t len_in, uint8_t *payload_out, size_t *len_out, @@ -1598,6 +1617,8 @@ static const struct cxl_cmd cxl_cmd_set[256][256] = { cmd_media_inject_poison, 8, 0 }, [MEDIA_AND_POISON][CLEAR_POISON] = { "MEDIA_AND_POISON_CLEAR_POISON", cmd_media_clear_poison, 72, 0 }, + [MHD][GET_MHD_INFO] = {"GET_MULTI_HEADED_INFO", + cmd_mhd_get_info, 2, 0}, }; static const struct cxl_cmd cxl_cmd_set_dcd[256][256] = { diff --git a/hw/mem/cxl_type3.c b/hw/mem/cxl_type3.c index 1fb3ffeca8..307d7c1fd8 100644 --- a/hw/mem/cxl_type3.c +++ b/hw/mem/cxl_type3.c @@ -2120,6 +2120,7 @@ static void ct3_class_init(ObjectClass *oc, void *data) cvc->get_lsa = get_lsa; cvc->set_lsa = set_lsa; cvc->set_cacheline = set_cacheline; + cvc->mhd_get_info = NULL; cvc->mhd_access_valid = NULL; } diff --git a/include/hw/cxl/cxl_device.h b/include/hw/cxl/cxl_device.h index 37893f8626..4a5d4bd98b 100644 --- a/include/hw/cxl/cxl_device.h +++ b/include/hw/cxl/cxl_device.h @@ -508,6 +508,12 @@ struct CXLType3Class { bool (*set_cacheline)(CXLType3Dev *ct3d, uint64_t dpa_offset, uint8_t *data); /* Multi-headed Device */ + CXLRetCode (*mhd_get_info)(const struct cxl_cmd *cmd, + uint8_t *payload_in, + size_t len_in, + uint8_t *payload_out, + size_t *len_out, + CXLCCI *cci); bool (*mhd_access_valid)(PCIDevice *d, uint64_t addr, unsigned int size); }; -- 2.39.1