Message ID | 771534be8dfa2a3bdc3876502752f518224b9298.1738228114.git.florent.tomasin@arm.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [RFC,1/5] dt-bindings: dma: Add CMA Heap bindings | expand |
Hi, On Thu, Jan 30, 2025 at 01:08:57PM +0000, Florent Tomasin wrote: > Introduce a CMA Heap dt-binding allowing custom > CMA heap registrations. > > * Note to the reviewers: > The patch was used for the development of the protected mode > feature in Panthor CSF kernel driver and is not initially thought > to land in the Linux kernel. It is mostly relevant if someone > wants to reproduce the environment of testing. Please, raise > interest if you think the patch has value in the Linux kernel. > > Signed-off-by: Florent Tomasin <florent.tomasin@arm.com> > --- > .../devicetree/bindings/dma/linux,cma.yml | 43 +++++++++++++++++++ > 1 file changed, 43 insertions(+) > create mode 100644 Documentation/devicetree/bindings/dma/linux,cma.yml > > diff --git a/Documentation/devicetree/bindings/dma/linux,cma.yml b/Documentation/devicetree/bindings/dma/linux,cma.yml > new file mode 100644 > index 000000000000..c532e016bbe5 > --- /dev/null > +++ b/Documentation/devicetree/bindings/dma/linux,cma.yml > @@ -0,0 +1,43 @@ > +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/dma/linux-cma.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Custom Linux CMA heap > + > +description: > + The custom Linux CMA heap device tree node allows registering > + of multiple CMA heaps. > + > + The CMA heap name will match the node name of the "memory-region". > + > +properties: > + compatible: > + enum: > + - linux,cma > + > + memory-region: > + maxItems: 1 > + description: | > + Phandle to the reserved memory node associated with the CMA Heap. > + The reserved memory node must follow this binding convention: > + - Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt > + > +examples: > + - | > + reserved-memory { > + #address-cells = <2>; > + #size-cells = <2>; > + > + custom_cma_heap: custom-cma-heap { > + compatible = "shared-dma-pool"; > + reg = <0x0 0x90600000 0x0 0x1000000>; > + reusable; > + }; > + }; > + > + device_cma_heap: device-cma-heap { > + compatible = "linux,cma"; > + memory-region = <&custom_cma_heap>; > + }; Isn't it redundant with the linux,cma-default shared-dma-pool property already? Maxime
On Thu, Jan 30, 2025 at 01:08:57PM +0000, Florent Tomasin wrote: > Introduce a CMA Heap dt-binding allowing custom > CMA heap registrations. > > * Note to the reviewers: > The patch was used for the development of the protected mode > feature in Panthor CSF kernel driver and is not initially thought > to land in the Linux kernel. It is mostly relevant if someone > wants to reproduce the environment of testing. Please, raise > interest if you think the patch has value in the Linux kernel. Why would panthor need CMA, it has an MMU. In any case, I agree with Maxime that this is redundant. Rob
On 30/01/2025 13:28, Maxime Ripard wrote: > Hi, > > On Thu, Jan 30, 2025 at 01:08:57PM +0000, Florent Tomasin wrote: >> Introduce a CMA Heap dt-binding allowing custom >> CMA heap registrations. >> >> * Note to the reviewers: >> The patch was used for the development of the protected mode >> feature in Panthor CSF kernel driver and is not initially thought >> to land in the Linux kernel. It is mostly relevant if someone >> wants to reproduce the environment of testing. Please, raise >> interest if you think the patch has value in the Linux kernel. >> >> Signed-off-by: Florent Tomasin <florent.tomasin@arm.com> >> --- >> .../devicetree/bindings/dma/linux,cma.yml | 43 +++++++++++++++++++ >> 1 file changed, 43 insertions(+) >> create mode 100644 Documentation/devicetree/bindings/dma/linux,cma.yml >> >> diff --git a/Documentation/devicetree/bindings/dma/linux,cma.yml b/Documentation/devicetree/bindings/dma/linux,cma.yml >> new file mode 100644 >> index 000000000000..c532e016bbe5 >> --- /dev/null >> +++ b/Documentation/devicetree/bindings/dma/linux,cma.yml >> @@ -0,0 +1,43 @@ >> +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause >> +%YAML 1.2 >> +--- >> +$id: http://devicetree.org/schemas/dma/linux-cma.yaml# >> +$schema: http://devicetree.org/meta-schemas/core.yaml# >> + >> +title: Custom Linux CMA heap >> + >> +description: >> + The custom Linux CMA heap device tree node allows registering >> + of multiple CMA heaps. >> + >> + The CMA heap name will match the node name of the "memory-region". >> + >> +properties: >> + compatible: >> + enum: >> + - linux,cma >> + >> + memory-region: >> + maxItems: 1 >> + description: | >> + Phandle to the reserved memory node associated with the CMA Heap. >> + The reserved memory node must follow this binding convention: >> + - Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt >> + >> +examples: >> + - | >> + reserved-memory { >> + #address-cells = <2>; >> + #size-cells = <2>; >> + >> + custom_cma_heap: custom-cma-heap { >> + compatible = "shared-dma-pool"; >> + reg = <0x0 0x90600000 0x0 0x1000000>; >> + reusable; >> + }; >> + }; >> + >> + device_cma_heap: device-cma-heap { >> + compatible = "linux,cma"; >> + memory-region = <&custom_cma_heap>; >> + }; > > Isn't it redundant with the linux,cma-default shared-dma-pool property > already? > > Maxime Hi Maxime, Please correct me if my understanding is wrong, The existing properties: linux,cma-default and shared-dma-pool, do not allow the creations of multiple standalone CMA heaps, those will create a single CMA heap: `dma_contiguous_default_area`? Other CMA heaps will be bound to a driver. I introduced the "linux,cma" to allow creating multiple standalone CMA heaps, with the intention of validating the protected mode support on Mali CSG GPUs. It was included in the RFC in there are interests in this approach. Since the Panthor CSF kernel driver does not own or manage a heap, I needed a way to create a standalone heap. The idea here is for the kernel driver to be an importer. I relied on a patch series to retrieve the heap and allocate a DMA buffer from it: - dma_heap_find() - dma_heap_buffer_alloc() - dma_heap_put() Ref: https://lore.kernel.org/lkml/20230911023038.30649-1-yong.wu@mediatek.com/#t Since the protected/secure memory management is integration specific, I needed a generic way for Panthor to allocate from such heap. In some scenarios it might be a carved-out memory, in others a FW will reside in the system (TEE) and require a secure heap driver to allocate memory (e.g: a similar approach is followd by MTK). Such driver would implement the allocation and free logic. Florent
Hi Rob On 30/01/2025 23:20, Rob Herring wrote: > > Why would panthor need CMA, it has an MMU. > > In any case, I agree with Maxime that this is redundant. > This is correct, the GPU has an MMU. The reason I introduced this custom CMA DTB entry is to allow creation of a standalone DMA heap which can be retrieved by Panthor using the API exposed by: - https://lore.kernel.org/lkml/20230911023038.30649-1-yong.wu@mediatek.com/#t My understanding might be wrong, I am under the impression that current CMA driver only has `dma_contiguous_default_area` as standalone carved-out heap and we cannot have more than one. Please correct me if this is invalid. With the DMA Heap API I based the RFC on, Panthor kernel driver does not manage the protected heap itself, it relies on an exporter to do it. On some system the secure heap will communicate with a secure FW, on others it will be a carved-out memory with restricted access. This is integration specific. Panthor kernel driver will expect to import a DMA buffer obtained from a heap. For the development of the protected mode feature, I decided to modify the CMA driver to create a standalone DMA heap and allocate a DMA buffer from it. It helped me abstract the importing of a heap in Panthor kernel driver. Someone may use a different heap driver to reproduce the setup. * Additional information to help with the context: Mali CSF GPU requires protected memory at the device level which does not belong to a user space process in order to allow the FW to enter protected mode. There is a single FW per GPU instance and the FW is loaded a probe time. Regards, Florent
diff --git a/Documentation/devicetree/bindings/dma/linux,cma.yml b/Documentation/devicetree/bindings/dma/linux,cma.yml new file mode 100644 index 000000000000..c532e016bbe5 --- /dev/null +++ b/Documentation/devicetree/bindings/dma/linux,cma.yml @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/dma/linux-cma.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Custom Linux CMA heap + +description: + The custom Linux CMA heap device tree node allows registering + of multiple CMA heaps. + + The CMA heap name will match the node name of the "memory-region". + +properties: + compatible: + enum: + - linux,cma + + memory-region: + maxItems: 1 + description: | + Phandle to the reserved memory node associated with the CMA Heap. + The reserved memory node must follow this binding convention: + - Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt + +examples: + - | + reserved-memory { + #address-cells = <2>; + #size-cells = <2>; + + custom_cma_heap: custom-cma-heap { + compatible = "shared-dma-pool"; + reg = <0x0 0x90600000 0x0 0x1000000>; + reusable; + }; + }; + + device_cma_heap: device-cma-heap { + compatible = "linux,cma"; + memory-region = <&custom_cma_heap>; + };
Introduce a CMA Heap dt-binding allowing custom CMA heap registrations. * Note to the reviewers: The patch was used for the development of the protected mode feature in Panthor CSF kernel driver and is not initially thought to land in the Linux kernel. It is mostly relevant if someone wants to reproduce the environment of testing. Please, raise interest if you think the patch has value in the Linux kernel. Signed-off-by: Florent Tomasin <florent.tomasin@arm.com> --- .../devicetree/bindings/dma/linux,cma.yml | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 Documentation/devicetree/bindings/dma/linux,cma.yml