]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
of: reserved_mem: switch to ops based OF_DECLARE()
authorMarek Szyprowski <m.szyprowski@samsung.com>
Wed, 25 Mar 2026 09:00:19 +0000 (10:00 +0100)
committerRob Herring (Arm) <robh@kernel.org>
Thu, 26 Mar 2026 19:12:02 +0000 (14:12 -0500)
Move init function from OF_DECLARE() argument to the given reserved
memory region ops structure and then pass that structure to the
OF_DECLARE() initializer. This node_init callback is mandatory for the
reserved mem driver. Such change makes it possible in the future to add
more functions called by the generic code before given memory region is
initialized and rmem object is created.

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Link: https://patch.msgid.link/20260325090023.3175348-4-m.szyprowski@samsung.com
Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
drivers/memory/tegra/tegra210-emc-table.c
drivers/of/of_reserved_mem.c
include/linux/of_reserved_mem.h
kernel/dma/coherent.c
kernel/dma/contiguous.c
kernel/dma/swiotlb.c

index ac1d1e13482a323b879fc6d5ebb553a3b303771f..4b3c478b27435b79d7093736962613429f64bac2 100644 (file)
@@ -70,20 +70,20 @@ static void tegra210_emc_table_device_release(struct reserved_mem *rmem,
        memunmap(timings);
 }
 
-static const struct reserved_mem_ops tegra210_emc_table_ops = {
-       .device_init = tegra210_emc_table_device_init,
-       .device_release = tegra210_emc_table_device_release,
-};
-
 static int tegra210_emc_table_init(unsigned long node,
                                   struct reserved_mem *rmem)
 {
        pr_debug("Tegra210 EMC table at %pa, size %lu bytes\n", &rmem->base,
                 (unsigned long)rmem->size);
 
-       rmem->ops = &tegra210_emc_table_ops;
-
        return 0;
 }
+
+static const struct reserved_mem_ops tegra210_emc_table_ops = {
+       .node_init = tegra210_emc_table_init,
+       .device_init = tegra210_emc_table_device_init,
+       .device_release = tegra210_emc_table_device_release,
+};
+
 RESERVEDMEM_OF_DECLARE(tegra210_emc_table, "nvidia,tegra210-emc-table",
-                      tegra210_emc_table_init);
+                      &tegra210_emc_table_ops);
index 9aff460a0420d00ae23f57e02b5a5d6ee5211220..4dd0d6f6a4b0d4a5feaeb836038b800af64223a2 100644 (file)
@@ -480,8 +480,16 @@ static int __init __reserved_mem_alloc_size(unsigned long node, const char *unam
 static const struct of_device_id __rmem_of_table_sentinel
        __used __section("__reservedmem_of_table_end");
 
-/*
- * __reserved_mem_init_node() - call region specific reserved memory init code
+/**
+ * __reserved_mem_init_node() - initialize a reserved memory region
+ * @rmem: reserved_mem structure to initialize
+ * @node: FDT node describing the reserved memory region
+ *
+ * This function iterates through the reserved memory drivers and calls the
+ * node_init callback for the compatible entry matching the node. On success,
+ * the operations pointer is stored in the reserved_mem structure.
+ *
+ * Return: 0 on success, -ENODEV if no compatible match found
  */
 static int __init __reserved_mem_init_node(struct reserved_mem *rmem,
                                           unsigned long node)
@@ -492,14 +500,15 @@ static int __init __reserved_mem_init_node(struct reserved_mem *rmem,
 
        for (i = __reservedmem_of_table; ret == -ENODEV &&
             i < &__rmem_of_table_sentinel; i++) {
-               reservedmem_of_init_fn initfn = i->data;
+               const struct reserved_mem_ops *ops = i->data;
                const char *compat = i->compatible;
 
                if (!of_flat_dt_is_compatible(node, compat))
                        continue;
 
-               ret = initfn(node, rmem);
+               ret = ops->node_init(node, rmem);
                if (ret == 0) {
+                       rmem->ops = ops;
                        pr_info("initialized node %s, compatible id %s\n",
                                rmem->name, compat);
                        break;
index 5159938bfe03c87f5020133f512a868a2b2e13f8..747a1e73d5dd99b73adc478c53473c79e1f7011b 100644 (file)
@@ -18,19 +18,17 @@ struct reserved_mem {
 };
 
 struct reserved_mem_ops {
+       int     (*node_init)(unsigned long fdt_node, struct reserved_mem *rmem);
        int     (*device_init)(struct reserved_mem *rmem,
                               struct device *dev);
        void    (*device_release)(struct reserved_mem *rmem,
                                  struct device *dev);
 };
 
-typedef int (*reservedmem_of_init_fn)(unsigned long node,
-                                     struct reserved_mem *rmem);
-
 #ifdef CONFIG_OF_RESERVED_MEM
 
-#define RESERVEDMEM_OF_DECLARE(name, compat, init)                     \
-       _OF_DECLARE(reservedmem, name, compat, init, reservedmem_of_init_fn)
+#define RESERVEDMEM_OF_DECLARE(name, compat, ops)                      \
+       _OF_DECLARE(reservedmem, name, compat, ops, struct reserved_mem_ops *)
 
 int of_reserved_mem_device_init_by_idx(struct device *dev,
                                       struct device_node *np, int idx);
@@ -48,8 +46,9 @@ int of_reserved_mem_region_count(const struct device_node *np);
 
 #else
 
-#define RESERVEDMEM_OF_DECLARE(name, compat, init)                     \
-       _OF_DECLARE_STUB(reservedmem, name, compat, init, reservedmem_of_init_fn)
+#define RESERVEDMEM_OF_DECLARE(name, compat, ops)                      \
+       _OF_DECLARE_STUB(reservedmem, name, compat, ops,                \
+                        struct reserved_mem_ops *)
 
 static inline int of_reserved_mem_device_init_by_idx(struct device *dev,
                                        struct device_node *np, int idx)
index 64f9ba618e194426f69fc3e1ac9c98338a98d841..bcdc0f76d2e80a84c2831756f07e4e4c8571e72a 100644 (file)
@@ -362,10 +362,6 @@ static void rmem_dma_device_release(struct reserved_mem *rmem,
                dev->dma_mem = NULL;
 }
 
-static const struct reserved_mem_ops rmem_dma_ops = {
-       .device_init    = rmem_dma_device_init,
-       .device_release = rmem_dma_device_release,
-};
 
 static int __init rmem_dma_setup(unsigned long node, struct reserved_mem *rmem)
 {
@@ -388,7 +384,6 @@ static int __init rmem_dma_setup(unsigned long node, struct reserved_mem *rmem)
        }
 #endif
 
-       rmem->ops = &rmem_dma_ops;
        pr_info("Reserved memory: created DMA memory pool at %pa, size %ld MiB\n",
                &rmem->base, (unsigned long)rmem->size / SZ_1M);
        return 0;
@@ -405,5 +400,11 @@ static int __init dma_init_reserved_memory(void)
 core_initcall(dma_init_reserved_memory);
 #endif /* CONFIG_DMA_GLOBAL_POOL */
 
-RESERVEDMEM_OF_DECLARE(dma, "shared-dma-pool", rmem_dma_setup);
+static const struct reserved_mem_ops rmem_dma_ops = {
+       .node_init      = rmem_dma_setup,
+       .device_init    = rmem_dma_device_init,
+       .device_release = rmem_dma_device_release,
+};
+
+RESERVEDMEM_OF_DECLARE(dma, "shared-dma-pool", &rmem_dma_ops);
 #endif
index e6fc6906b5c039d702b8807607790c56d1bab7d4..efeebda925371ec9e4fc5912604f2a9ebbfa1f6d 100644 (file)
@@ -470,11 +470,6 @@ static void rmem_cma_device_release(struct reserved_mem *rmem,
        dev->cma_area = NULL;
 }
 
-static const struct reserved_mem_ops rmem_cma_ops = {
-       .device_init    = rmem_cma_device_init,
-       .device_release = rmem_cma_device_release,
-};
-
 static int __init rmem_cma_setup(unsigned long node, struct reserved_mem *rmem)
 {
        bool default_cma = of_get_flat_dt_prop(node, "linux,cma-default", NULL);
@@ -499,7 +494,6 @@ static int __init rmem_cma_setup(unsigned long node, struct reserved_mem *rmem)
        if (default_cma)
                dma_contiguous_default_area = cma;
 
-       rmem->ops = &rmem_cma_ops;
        rmem->priv = cma;
 
        pr_info("Reserved memory: created CMA memory pool at %pa, size %ld MiB\n",
@@ -511,5 +505,12 @@ static int __init rmem_cma_setup(unsigned long node, struct reserved_mem *rmem)
 
        return 0;
 }
-RESERVEDMEM_OF_DECLARE(cma, "shared-dma-pool", rmem_cma_setup);
+
+static const struct reserved_mem_ops rmem_cma_ops = {
+       .node_init      = rmem_cma_setup,
+       .device_init    = rmem_cma_device_init,
+       .device_release = rmem_cma_device_release,
+};
+
+RESERVEDMEM_OF_DECLARE(cma, "shared-dma-pool", &rmem_cma_ops);
 #endif
index f3a12e15a95173eb5e4b7ec1ada11ece32246193..44b566d20e04451527be0240257cef6991aac43c 100644 (file)
@@ -1855,11 +1855,6 @@ static void rmem_swiotlb_device_release(struct reserved_mem *rmem,
        dev->dma_io_tlb_mem = &io_tlb_default_mem;
 }
 
-static const struct reserved_mem_ops rmem_swiotlb_ops = {
-       .device_init = rmem_swiotlb_device_init,
-       .device_release = rmem_swiotlb_device_release,
-};
-
 static int __init rmem_swiotlb_setup(unsigned long node,
                                     struct reserved_mem *rmem)
 {
@@ -1869,11 +1864,16 @@ static int __init rmem_swiotlb_setup(unsigned long node,
            of_get_flat_dt_prop(node, "no-map", NULL))
                return -EINVAL;
 
-       rmem->ops = &rmem_swiotlb_ops;
        pr_info("Reserved memory: created restricted DMA pool at %pa, size %ld MiB\n",
                &rmem->base, (unsigned long)rmem->size / SZ_1M);
        return 0;
 }
 
-RESERVEDMEM_OF_DECLARE(dma, "restricted-dma-pool", rmem_swiotlb_setup);
+static const struct reserved_mem_ops rmem_swiotlb_ops = {
+       .node_init = rmem_swiotlb_setup,
+       .device_init = rmem_swiotlb_device_init,
+       .device_release = rmem_swiotlb_device_release,
+};
+
+RESERVEDMEM_OF_DECLARE(dma, "restricted-dma-pool", &rmem_swiotlb_ops);
 #endif /* CONFIG_DMA_RESTRICTED_POOL */