Commit 8b5690d5 authored by Maxime Ripard's avatar Maxime Ripard Committed by Sumit Semwal
Browse files

dma-buf: heaps: cma: Register list of CMA regions at boot



In order to create a CMA heap instance for each CMA region found in the
system, we need to register each of these instances.

While it would appear trivial, the CMA regions are created super early
in the kernel boot process, before most of the subsystems are
initialized. Thus, we can't just create an exported function to create a
heap from the CMA region being initialized.

What we can do however is create a two-step process, where we collect
all the CMA regions into an array early on, and then when we initialize
the heaps we iterate over that array and create the heaps from the CMA
regions we collected.

Reviewed-by: default avatarT.J. Mercier <tjmercier@google.com>
Signed-off-by: default avatarMaxime Ripard <mripard@kernel.org>
Signed-off-by: default avatarSumit Semwal <sumit.semwal@linaro.org>
Link: https://lore.kernel.org/r/20251013-dma-buf-ecc-heap-v8-2-04ce150ea3d9@kernel.org
parent 2034134d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -7308,6 +7308,7 @@ F: Documentation/userspace-api/dma-buf-alloc-exchange.rst
F:	drivers/dma-buf/
F:	include/linux/*fence.h
F:	include/linux/dma-buf.h
F:	include/linux/dma-buf/
F:	include/linux/dma-resv.h
K:	\bdma_(?:buf|fence|resv)\b
+14 −0
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@

#include <linux/cma.h>
#include <linux/dma-buf.h>
#include <linux/dma-buf/heaps/cma.h>
#include <linux/dma-heap.h>
#include <linux/dma-map-ops.h>
#include <linux/err.h>
@@ -27,6 +28,19 @@

#define DEFAULT_CMA_NAME "default_cma_region"

static struct cma *dma_areas[MAX_CMA_AREAS] __initdata;
static unsigned int dma_areas_num __initdata;

int __init dma_heap_cma_register_heap(struct cma *cma)
{
	if (dma_areas_num >= ARRAY_SIZE(dma_areas))
		return -EINVAL;

	dma_areas[dma_areas_num++] = cma;

	return 0;
}

struct cma_heap {
	struct dma_heap *heap;
	struct cma *cma;
+16 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef DMA_BUF_HEAP_CMA_H_
#define DMA_BUF_HEAP_CMA_H_

struct cma;

#ifdef CONFIG_DMABUF_HEAPS_CMA
int dma_heap_cma_register_heap(struct cma *cma);
#else
static inline int dma_heap_cma_register_heap(struct cma *cma)
{
	return 0;
}
#endif // CONFIG_DMABUF_HEAPS_CMA

#endif // DMA_BUF_HEAP_CMA_H_