]> Gentwo Git Trees - linux/.git/commitdiff
cxl: Simplify cxl_rd_ops allocation and handling
authorRobert Richter <rrichter@amd.com>
Fri, 14 Nov 2025 07:58:41 +0000 (08:58 +0100)
committerDave Jiang <dave.jiang@intel.com>
Fri, 14 Nov 2025 17:37:13 +0000 (10:37 -0700)
A root decoder's callback handlers are collected in struct cxl_rd_ops.
The structure is dynamically allocated, though it contains only a few
pointers in it. This also requires to check two pointes to check for
the existence of a callback.

Simplify the allocation, release and handler check by embedding the
ops statically in struct cxl_root_decoder.

Implementation is equivalent to how struct cxl_root_ops handles the
callbacks.

[ dj: Fix spelling error in commit log. ]

Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
Signed-off-by: Robert Richter <rrichter@amd.com>
Link: https://patch.msgid.link/20251114075844.1315805-2-rrichter@amd.com
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
drivers/cxl/acpi.c
drivers/cxl/core/port.c
drivers/cxl/core/region.c
drivers/cxl/cxl.h

index bd2e282ca93a059f12ba96fdf2e30f4ddbbaddb9..cef3e07244fd76908a97714be63a221440868abf 100644 (file)
@@ -475,12 +475,8 @@ static int __cxl_parse_cfmws(struct acpi_cedt_cfmws *cfmws,
        cxlrd->qos_class = cfmws->qtg_id;
 
        if (cfmws->interleave_arithmetic == ACPI_CEDT_CFMWS_ARITHMETIC_XOR) {
-               cxlrd->ops = kzalloc(sizeof(*cxlrd->ops), GFP_KERNEL);
-               if (!cxlrd->ops)
-                       return -ENOMEM;
-
-               cxlrd->ops->hpa_to_spa = cxl_apply_xor_maps;
-               cxlrd->ops->spa_to_hpa = cxl_apply_xor_maps;
+               cxlrd->ops.hpa_to_spa = cxl_apply_xor_maps;
+               cxlrd->ops.spa_to_hpa = cxl_apply_xor_maps;
        }
 
        rc = cxl_decoder_add(cxld);
index 8128fd2b5b317f3e6d823e730508ef245a537083..fef3aa0c6680c0308d68e12794cc2ee3bfc507d8 100644 (file)
@@ -459,7 +459,6 @@ static void cxl_root_decoder_release(struct device *dev)
        if (atomic_read(&cxlrd->region_id) >= 0)
                memregion_free(atomic_read(&cxlrd->region_id));
        __cxl_decoder_release(&cxlrd->cxlsd.cxld);
-       kfree(cxlrd->ops);
        kfree(cxlrd);
 }
 
index b06fee1978ba468e9e2a9bb63148d286c796e288..095af0f4760fb8f22087cd30cf61d27011c4f131 100644 (file)
@@ -2924,16 +2924,6 @@ static bool cxl_is_hpa_in_chunk(u64 hpa, struct cxl_region *cxlr, int pos)
        return false;
 }
 
-static bool has_hpa_to_spa(struct cxl_root_decoder *cxlrd)
-{
-       return cxlrd->ops && cxlrd->ops->hpa_to_spa;
-}
-
-static bool has_spa_to_hpa(struct cxl_root_decoder *cxlrd)
-{
-       return cxlrd->ops && cxlrd->ops->spa_to_hpa;
-}
-
 u64 cxl_dpa_to_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd,
                   u64 dpa)
 {
@@ -2988,8 +2978,8 @@ u64 cxl_dpa_to_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd,
        hpa = hpa_offset + p->res->start + p->cache_size;
 
        /* Root decoder translation overrides typical modulo decode */
-       if (has_hpa_to_spa(cxlrd))
-               hpa = cxlrd->ops->hpa_to_spa(cxlrd, hpa);
+       if (cxlrd->ops.hpa_to_spa)
+               hpa = cxlrd->ops.hpa_to_spa(cxlrd, hpa);
 
        if (!cxl_resource_contains_addr(p->res, hpa)) {
                dev_dbg(&cxlr->dev,
@@ -2998,7 +2988,7 @@ u64 cxl_dpa_to_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd,
        }
 
        /* Simple chunk check, by pos & gran, only applies to modulo decodes */
-       if (!has_hpa_to_spa(cxlrd) && (!cxl_is_hpa_in_chunk(hpa, cxlr, pos)))
+       if (!cxlrd->ops.hpa_to_spa && !cxl_is_hpa_in_chunk(hpa, cxlr, pos))
                return ULLONG_MAX;
 
        return hpa;
@@ -3033,8 +3023,8 @@ static int region_offset_to_dpa_result(struct cxl_region *cxlr, u64 offset,
         * If the root decoder has SPA to CXL HPA callback, use it. Otherwise
         * CXL HPA is assumed to equal SPA.
         */
-       if (has_spa_to_hpa(cxlrd)) {
-               hpa = cxlrd->ops->spa_to_hpa(cxlrd, p->res->start + offset);
+       if (cxlrd->ops.spa_to_hpa) {
+               hpa = cxlrd->ops.spa_to_hpa(cxlrd, p->res->start + offset);
                hpa_offset = hpa - p->res->start;
        } else {
                hpa_offset = offset;
index 231ddccf897736543469f1d9c340031153a86979..6524b242e8c4ba9b097140e05a99c08512c2bdf1 100644 (file)
@@ -451,7 +451,7 @@ struct cxl_root_decoder {
        void *platform_data;
        struct mutex range_lock;
        int qos_class;
-       struct cxl_rd_ops *ops;
+       struct cxl_rd_ops ops;
        struct cxl_switch_decoder cxlsd;
 };