A singular Dynamic RAM partition is exposed via the kernel.

Use this partition in cxl-cli.

Signed-off-by: Ira Weiny <ira.we...@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(-)

diff --git a/cxl/json.c b/cxl/json.c
index e65bd803b706..79b2b527f740 100644
--- a/cxl/json.c
+++ b/cxl/json.c
@@ -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) &&
diff --git a/cxl/memdev.c b/cxl/memdev.c
index 6e44d1578d03..bdcb008f1d73 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 207cf2d00314..824274e25ed8 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);

-- 
2.49.0


Reply via email to