| # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) |
| %YAML 1.2 |
| --- |
| $id: http://devicetree.org/schemas/reserved-memory/reserved-memory.yaml# |
| $schema: http://devicetree.org/meta-schemas/core.yaml# |
| |
| title: /reserved-memory Child Node Common |
| |
| maintainers: |
| - devicetree-spec@vger.kernel.org |
| |
| description: > |
| Reserved memory is specified as a node under the /reserved-memory node. The |
| operating system shall exclude reserved memory from normal usage one can |
| create child nodes describing particular reserved (excluded from normal use) |
| memory regions. Such memory regions are usually designed for the special |
| usage by various device drivers. |
| |
| Each child of the reserved-memory node specifies one or more regions |
| of reserved memory. Each child node may either use a 'reg' property to |
| specify a specific range of reserved memory, or a 'size' property with |
| optional constraints to request a dynamically allocated block of |
| memory. |
| |
| Following the generic-names recommended practice, node names should |
| reflect the purpose of the node (ie. "framebuffer" or "dma-pool"). |
| Unit address (@<address>) should be appended to the name if the node |
| is a static allocation. |
| |
| properties: |
| reg: true |
| |
| size: |
| oneOf: |
| - $ref: /schemas/types.yaml#/definitions/uint32 |
| - $ref: /schemas/types.yaml#/definitions/uint64 |
| description: > |
| Length based on parent's \#size-cells. Size in bytes of memory to |
| reserve. |
| |
| alignment: |
| oneOf: |
| - $ref: /schemas/types.yaml#/definitions/uint32 |
| - $ref: /schemas/types.yaml#/definitions/uint64 |
| description: > |
| Length based on parent's \#size-cells. Address boundary for |
| alignment of allocation. |
| |
| alloc-ranges: |
| $ref: /schemas/types.yaml#/definitions/uint32-array |
| description: > |
| Address and Length pairs. Specifies regions of memory that are |
| acceptable to allocate from. |
| |
| iommu-addresses: |
| $ref: /schemas/types.yaml#/definitions/phandle-array |
| description: > |
| A list of phandle and specifier pairs that describe static IO virtual |
| address space mappings and carveouts associated with a given reserved |
| memory region. The phandle in the first cell refers to the device for |
| which the mapping or carveout is to be created. |
| |
| The specifier consists of an address/size pair and denotes the IO |
| virtual address range of the region for the given device. The exact |
| format depends on the values of the "#address-cells" and "#size-cells" |
| properties of the device referenced via the phandle. |
| |
| When used in combination with a "reg" property, an IOVA mapping is to |
| be established for this memory region. One example where this can be |
| useful is to create an identity mapping for physical memory that the |
| firmware has configured some hardware to access (such as a bootsplash |
| framebuffer). |
| |
| If no "reg" property is specified, the "iommu-addresses" property |
| defines carveout regions in the IOVA space for the given device. This |
| can be useful if a certain memory region should not be mapped through |
| the IOMMU. |
| |
| no-map: |
| type: boolean |
| description: > |
| Indicates the operating system must not create a virtual mapping |
| of the region as part of its standard mapping of system memory, |
| nor permit speculative access to it under any circumstances other |
| than under the control of the device driver using the region. |
| |
| reusable: |
| type: boolean |
| description: > |
| The operating system can use the memory in this region with the |
| limitation that the device driver(s) owning the region need to be |
| able to reclaim it back. Typically that means that the operating |
| system can use that region to store volatile or cached data that |
| can be otherwise regenerated or migrated elsewhere. |
| |
| allOf: |
| - if: |
| required: |
| - no-map |
| |
| then: |
| not: |
| required: |
| - reusable |
| |
| - if: |
| required: |
| - reusable |
| |
| then: |
| not: |
| required: |
| - no-map |
| |
| oneOf: |
| - oneOf: |
| - required: |
| - reg |
| |
| - required: |
| - size |
| |
| - oneOf: |
| # IOMMU reservations |
| - required: |
| - iommu-addresses |
| |
| # IOMMU mappings |
| - required: |
| - reg |
| - iommu-addresses |
| |
| additionalProperties: true |
| |
| examples: |
| - | |
| / { |
| compatible = "foo"; |
| model = "foo"; |
| |
| #address-cells = <2>; |
| #size-cells = <2>; |
| |
| reserved-memory { |
| #address-cells = <2>; |
| #size-cells = <2>; |
| ranges; |
| |
| adsp_resv: reservation-adsp { |
| /* |
| * Restrict IOVA mappings for ADSP buffers to the 512 MiB region |
| * from 0x40000000 - 0x5fffffff. Anything outside is reserved by |
| * the ADSP for I/O memory and private memory allocations. |
| */ |
| iommu-addresses = <&adsp 0x0 0x00000000 0x00 0x40000000>, |
| <&adsp 0x0 0x60000000 0xff 0xa0000000>; |
| }; |
| |
| fb: framebuffer@90000000 { |
| reg = <0x0 0x90000000 0x0 0x00800000>; |
| iommu-addresses = <&dc0 0x0 0x90000000 0x0 0x00800000>; |
| }; |
| }; |
| |
| bus@0 { |
| #address-cells = <1>; |
| #size-cells = <1>; |
| ranges = <0x0 0x0 0x0 0x40000000>; |
| |
| adsp: adsp@2990000 { |
| reg = <0x2990000 0x2000>; |
| memory-region = <&adsp_resv>; |
| }; |
| |
| dc0: display@15200000 { |
| reg = <0x15200000 0x10000>; |
| memory-region = <&fb>; |
| }; |
| }; |
| }; |
| ... |