@@ -800,6 +800,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)
@@ -1059,6 +1073,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) &&
@@ -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);
@@ -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);
A singular Dynamic RAM partition is exposed via the kernel. Use this partition in cxl-cli. Signed-off-by: Ira Weiny <ira.weiny@intel.com> --- 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(-)