On 5/23/26 2:50 AM, Anisa Su wrote: > From: Ira Weiny <[email protected]> > > A singular Dynamic RAM partition is exposed via the kernel. > > Use this partition in cxl-cli. > > Signed-off-by: Ira Weiny <[email protected]> Missing Anisa sign off Reviewed-by: Dave Jiang <[email protected]> > > --- > Changes: > [iweiny: New patch for decoder_ram_a] > --- > cxl/json.c | 20 ++++++++++++++++++++ > cxl/memdev.c | 4 +++- > cxl/region.c | 27 ++++++++++++++++++++++++--- > 3 files changed, 47 insertions(+), 4 deletions(-) > > diff --git a/cxl/json.c b/cxl/json.c > index a925488..e94c809 100644 > --- a/cxl/json.c > +++ b/cxl/json.c > @@ -620,6 +620,20 @@ struct json_object *util_cxl_memdev_to_json(struct > cxl_memdev *memdev, > } > } > > + size = cxl_memdev_get_dynamic_ram_a_size(memdev); > + if (size) { > + jobj = util_json_object_size(size, flags); > + if (jobj) > + json_object_object_add(jdev, "dynamic_ram_a_size", > jobj); > + > + qos_class = cxl_memdev_get_dynamic_ram_a_qos_class(memdev); > + if (qos_class != CXL_QOS_CLASS_NONE) { > + jobj = json_object_new_int(qos_class); > + if (jobj) > + json_object_object_add(jdev, > "dynamic_ram_a_qos_class", jobj); > + } > + } > + > if (flags & UTIL_JSON_HEALTH) { > jobj = util_cxl_memdev_health_to_json(memdev, flags); > if (jobj) > @@ -917,6 +931,12 @@ struct json_object *util_cxl_decoder_to_json(struct > cxl_decoder *decoder, > json_object_object_add( > jdecoder, "volatile_capable", jobj); > } > + if (cxl_decoder_is_dynamic_ram_a_capable(decoder)) { > + jobj = json_object_new_boolean(true); > + if (jobj) > + json_object_object_add( > + jdecoder, "dynamic_ram_a_capable", > jobj); > + } > } > > if (cxl_port_is_root(port) && > diff --git a/cxl/memdev.c b/cxl/memdev.c > index 6e44d15..bdcb008 100644 > --- a/cxl/memdev.c > +++ b/cxl/memdev.c > @@ -269,8 +269,10 @@ static int __reserve_dpa(struct cxl_memdev *memdev, > > if (mode == CXL_DECODER_MODE_RAM) > avail_dpa = cxl_memdev_get_ram_size(memdev); > - else > + else if (mode == CXL_DECODER_MODE_PMEM) > avail_dpa = cxl_memdev_get_pmem_size(memdev); > + else > + avail_dpa = cxl_memdev_get_dynamic_ram_a_size(memdev); > > cxl_decoder_foreach(port, decoder) { > size = cxl_decoder_get_dpa_size(decoder); > diff --git a/cxl/region.c b/cxl/region.c > index 85d4d9b..3c935bf 100644 > --- a/cxl/region.c > +++ b/cxl/region.c > @@ -303,7 +303,8 @@ static int parse_create_options(struct cxl_ctx *ctx, int > count, > > if (param.type) { > p->mode = cxl_decoder_mode_from_ident(param.type); > - if (p->mode == CXL_DECODER_MODE_RAM && param.uuid) { > + if ((p->mode == CXL_DECODER_MODE_RAM || > + p->mode == CXL_DECODER_MODE_DYNAMIC_RAM_A) && param.uuid) { > log_err(&rl, > "can't set UUID for ram / volatile regions"); > goto err; > @@ -417,6 +418,9 @@ static void collect_minsize(struct cxl_ctx *ctx, struct > parsed_params *p) > case CXL_DECODER_MODE_PMEM: > size = cxl_memdev_get_pmem_size(memdev); > break; > + case CXL_DECODER_MODE_DYNAMIC_RAM_A: > + size = cxl_memdev_get_dynamic_ram_a_size(memdev); > + break; > default: > /* Shouldn't ever get here */ ; > } > @@ -448,8 +452,10 @@ static int create_region_validate_qos_class(struct > parsed_params *p) > > if (p->mode == CXL_DECODER_MODE_RAM) > qos_class = cxl_memdev_get_ram_qos_class(memdev); > - else > + else if (p->mode == CXL_DECODER_MODE_PMEM) > qos_class = cxl_memdev_get_pmem_qos_class(memdev); > + else > + qos_class = > cxl_memdev_get_dynamic_ram_a_qos_class(memdev); > > /* No qos_class entries. Possibly no kernel support */ > if (qos_class == CXL_QOS_CLASS_NONE) > @@ -488,6 +494,12 @@ static int validate_decoder(struct cxl_decoder *decoder, > return -EINVAL; > } > break; > + case CXL_DECODER_MODE_DYNAMIC_RAM_A: > + if (!cxl_decoder_is_dynamic_ram_a_capable(decoder)) { > + log_err(&rl, "%s is not dynamic_ram_a capable\n", > devname); > + return -EINVAL; > + } > + break; > default: > log_err(&rl, "unknown type: %s\n", param.type); > return -EINVAL; > @@ -509,9 +521,11 @@ static void set_type_from_decoder(struct cxl_ctx *ctx, > struct parsed_params *p) > return; > > /* > - * default to pmem if both types are set, otherwise the single > + * default to pmem if all types are set, otherwise the single > * capability dominates. > */ > + if (cxl_decoder_is_dynamic_ram_a_capable(p->root_decoder)) > + p->mode = CXL_DECODER_MODE_DYNAMIC_RAM_A; > if (cxl_decoder_is_volatile_capable(p->root_decoder)) > p->mode = CXL_DECODER_MODE_RAM; > if (cxl_decoder_is_pmem_capable(p->root_decoder)) > @@ -699,6 +713,13 @@ static int create_region(struct cxl_ctx *ctx, int *count, > param.root_decoder); > return -ENXIO; > } > + } else if (p->mode == CXL_DECODER_MODE_DYNAMIC_RAM_A) { > + region = > cxl_decoder_create_dynamic_ram_a_region(p->root_decoder); > + if (!region) { > + log_err(&rl, "failed to create region under %s\n", > + param.root_decoder); > + return -ENXIO; > + } > } else { > log_err(&rl, "region type '%s' is not supported\n", > param.type);

