On Thu, 8 May 2025 00:01:05 +0000
[email protected] wrote:
> From: Anisa Su <[email protected]>
>
> FM DCD Management command 0x5604 implemented per CXL r3.2 Spec Section
> 7.6.7.6.5
>
> Signed-off-by: Anisa Su <[email protected]>
A few really minor things inline.
> ---
> hw/cxl/cxl-mailbox-utils.c | 195 +++++++++++++++++++++++++++++++++++
> hw/mem/cxl_type3.c | 8 +-
> include/hw/cxl/cxl_device.h | 4 +
> include/hw/cxl/cxl_opcodes.h | 1 +
> 4 files changed, 204 insertions(+), 4 deletions(-)
>
> diff --git a/hw/cxl/cxl-mailbox-utils.c b/hw/cxl/cxl-mailbox-utils.c
> index a897a34ef9..9b176dea08 100644
> --- a/hw/cxl/cxl-mailbox-utils.c
> +++ b/hw/cxl/cxl-mailbox-utils.c
> @@ -3589,6 +3589,194 @@ static CXLRetCode
> cmd_fm_get_dc_region_extent_list(const struct cxl_cmd *cmd,
> return CXL_MBOX_SUCCESS;
> }
>
> +static CXLRetCode cxl_mbox_dc_prescriptive_sanity_check(CXLType3Dev *dcd,
> + uint16_t host_id,
> + uint32_t ext_count,
> + CXLDCExtentRaw
> extents[],
> + CXLDCEventType type)
> +{
> + CXLDCExtentRaw ext;
> + CXLDCRegion *reg = NULL;
I'd move reg declaration into the loop and not initialize it to NULL.
Probably also j and ext.
> + int i, j;
> +
> + if (host_id != 0) {
> + return CXL_MBOX_INVALID_INPUT;
> + }
> +
> + for (i = 0; i < ext_count; i++) {
> + ext = extents[i];
> +
> + if (ext.len == 0) {
> + return CXL_MBOX_INVALID_EXTENT_LIST;
> + }
> +
> + reg = cxl_find_dc_region(dcd, ext.start_dpa, ext.len);
> + if (!reg) {
> + return CXL_MBOX_INVALID_EXTENT_LIST;
> + }
> +
> + if (ext.len % reg->block_size || ext.start_dpa % reg->block_size) {
> + return CXL_MBOX_INVALID_EXTENT_LIST;
> + }
> +
> + /* Check requested extents do not overlap with each other. */
> + for (j = i + 1; j < ext_count; j++) {
> + if (ranges_overlap(ext.start_dpa, ext.len, extents[j].start_dpa,
> + extents[j].len)) {
> + return CXL_MBOX_INVALID_EXTENT_LIST;
> + }
> + }
> +
> + if (type == DC_EVENT_ADD_CAPACITY) {
> + /* Check requested extents do not overlap with pending extents.
> */
> + if
> (cxl_extent_groups_overlaps_dpa_range(&dcd->dc.extents_pending,
> + ext.start_dpa, ext.len)) {
Misaligned parameters.
> + return CXL_MBOX_INVALID_EXTENT_LIST;
> + }
> + /* Check requested extents do not overlap with existing extents.
> */
> + if (cxl_extents_overlaps_dpa_range(&dcd->dc.extents,
> + ext.start_dpa, ext.len)) {
> + return CXL_MBOX_INVALID_EXTENT_LIST;
> + }
> + }
> + }
> +
> + return CXL_MBOX_SUCCESS;
> +}