| *** Reserved memory regions *** | |
| 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. | |
| Parameters for each memory region can be encoded into the device tree | |
| with the following nodes: | |
| /reserved-memory node | |
| --------------------- | |
| #address-cells, #size-cells (required) - standard definition | |
| - Should use the same values as the root node | |
| ranges (required) - standard definition | |
| - Should be empty | |
| /reserved-memory/ child nodes | |
| ----------------------------- | |
| 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: | |
| Requires either a) or b) below. | |
| a) static allocation | |
| reg (required) - standard definition | |
| b) dynamic allocation | |
| size (required) - length based on parent's #size-cells | |
| - Size in bytes of memory to reserve. | |
| alignment (optional) - length based on parent's #size-cells | |
| - Address boundary for alignment of allocation. | |
| alloc-ranges (optional) - prop-encoded-array (address, length pairs). | |
| - Specifies regions of memory that are | |
| acceptable to allocate from. | |
| If both reg and size are present, then the reg property takes precedence | |
| and size is ignored. | |
| Additional properties: | |
| compatible (optional) - standard definition | |
| - may contain the following strings: | |
| - shared-dma-pool: This indicates a region of memory meant to be | |
| used as a shared pool of DMA buffers for a set of devices. It can | |
| be used by an operating system to instantiate the necessary pool | |
| management subsystem if necessary. | |
| - vendor specific string in the form <vendor>,[<device>-]<usage> | |
| no-map (optional) - empty property | |
| - 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 (optional) - empty property | |
| - 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. | |
| Linux implementation note: | |
| - If a "linux,cma-default" property is present, then Linux will use the | |
| region for the default pool of the contiguous memory allocator. | |
| - If a "linux,dma-default" property is present, then Linux will use the | |
| region for the default pool of the consistent DMA allocator. | |
| Device node references to reserved memory | |
| ----------------------------------------- | |
| Regions in the /reserved-memory node may be referenced by other device | |
| nodes by adding a memory-region property to the device node. | |
| memory-region (optional) - phandle, specifier pairs to children of /reserved-memory | |
| Example | |
| ------- | |
| This example defines 3 contiguous regions are defined for Linux kernel: | |
| one default of all device drivers (named linux,cma@72000000 and 64MiB in size), | |
| one dedicated to the framebuffer device (named framebuffer@78000000, 8MiB), and | |
| one for multimedia processing (named multimedia-memory@77000000, 64MiB). | |
| / { | |
| #address-cells = <1>; | |
| #size-cells = <1>; | |
| memory { | |
| reg = <0x40000000 0x40000000>; | |
| }; | |
| reserved-memory { | |
| #address-cells = <1>; | |
| #size-cells = <1>; | |
| ranges; | |
| /* global autoconfigured region for contiguous allocations */ | |
| linux,cma { | |
| compatible = "shared-dma-pool"; | |
| reusable; | |
| size = <0x4000000>; | |
| alignment = <0x2000>; | |
| linux,cma-default; | |
| }; | |
| display_reserved: framebuffer@78000000 { | |
| reg = <0x78000000 0x800000>; | |
| }; | |
| multimedia_reserved: multimedia@77000000 { | |
| compatible = "acme,multimedia-memory"; | |
| reg = <0x77000000 0x4000000>; | |
| }; | |
| }; | |
| /* ... */ | |
| fb0: video@12300000 { | |
| memory-region = <&display_reserved>; | |
| /* ... */ | |
| }; | |
| scaler: scaler@12500000 { | |
| memory-region = <&multimedia_reserved>; | |
| /* ... */ | |
| }; | |
| codec: codec@12600000 { | |
| memory-region = <&multimedia_reserved>; | |
| /* ... */ | |
| }; | |
| }; |