| *** Memory binding *** |
| |
| The /memory node provides basic information about the address and size |
| of the physical memory. This node is usually filled or updated by the |
| bootloader, depending on the actual memory configuration of the given |
| hardware. |
| |
| The memory layout is described by the following node: |
| |
| / { |
| #address-cells = <(n)>; |
| #size-cells = <(m)>; |
| memory { |
| device_type = "memory"; |
| reg = <(baseaddr1) (size1) |
| (baseaddr2) (size2) |
| ... |
| (baseaddrN) (sizeN)>; |
| }; |
| ... |
| }; |
| |
| A memory node follows the typical device tree rules for "reg" property: |
| n: number of cells used to store base address value |
| m: number of cells used to store size value |
| baseaddrX: defines a base address of the defined memory bank |
| sizeX: the size of the defined memory bank |
| |
| |
| More than one memory bank can be defined. |
| |
| |
| *** Reserved memory regions *** |
| |
| In /memory/reserved-memory node 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. A good example are contiguous memory allocations or |
| memory sharing with other operating system on the same hardware board. |
| Those special memory regions might depend on the board configuration and |
| devices used on the target system. |
| |
| Parameters for each memory region can be encoded into the device tree |
| with the following convention: |
| |
| [(label):] (name) { |
| compatible = "linux,contiguous-memory-region", "reserved-memory-region"; |
| reg = <(address) (size)>; |
| (linux,default-contiguous-region); |
| }; |
| |
| compatible: one or more of: |
| - "linux,contiguous-memory-region" - enables binding of this |
| region to Contiguous Memory Allocator (special region for |
| contiguous memory allocations, shared with movable system |
| memory, Linux kernel-specific). |
| - "reserved-memory-region" - compatibility is defined, given |
| region is assigned for exclusive usage for by the respective |
| devices. |
| |
| reg: standard property defining the base address and size of |
| the memory region |
| |
| linux,default-contiguous-region: property indicating that the region |
| is the default region for all contiguous memory |
| allocations, Linux specific (optional) |
| |
| It is optional to specify the base address, so if one wants to use |
| autoconfiguration of the base address, '0' can be specified as a base |
| address in the 'reg' property. |
| |
| The /memory/reserved-memory node must contain the same #address-cells |
| and #size-cells value as the root node. |
| |
| |
| *** Device node's properties *** |
| |
| Once regions in the /memory/reserved-memory node have been defined, they |
| may be referenced by other device nodes. Bindings that wish to reference |
| memory regions should explicitly document their use of the following |
| property: |
| |
| memory-region = <&phandle_to_defined_region>; |
| |
| This property indicates that the device driver should use the memory |
| region pointed by the given phandle. |
| |
| |
| *** Example *** |
| |
| This example defines a memory consisting of 4 memory banks. 3 contiguous |
| regions are defined for Linux kernel, one default of all device drivers |
| (named contig_mem, placed at 0x72000000, 64MiB), one dedicated to the |
| framebuffer device (labelled display_mem, placed at 0x78000000, 8MiB) |
| and one for multimedia processing (labelled multimedia_mem, placed at |
| 0x77000000, 64MiB). 'display_mem' region is then assigned to fb@12300000 |
| device for DMA memory allocations (Linux kernel drivers will use CMA is |
| available or dma-exclusive usage otherwise). 'multimedia_mem' is |
| assigned to scaler@12500000 and codec@12600000 devices for contiguous |
| memory allocations when CMA driver is enabled. |
| |
| The reason for creating a separate region for framebuffer device is to |
| match the framebuffer base address to the one configured by bootloader, |
| so once Linux kernel drivers starts no glitches on the displayed boot |
| logo appears. Scaller and codec drivers should share the memory |
| allocations. |
| |
| / { |
| #address-cells = <1>; |
| #size-cells = <1>; |
| |
| /* ... */ |
| |
| memory { |
| reg = <0x40000000 0x10000000 |
| 0x50000000 0x10000000 |
| 0x60000000 0x10000000 |
| 0x70000000 0x10000000>; |
| |
| reserved-memory { |
| #address-cells = <1>; |
| #size-cells = <1>; |
| |
| /* |
| * global autoconfigured region for contiguous allocations |
| * (used only with Contiguous Memory Allocator) |
| */ |
| contig_region@0 { |
| compatible = "linux,contiguous-memory-region"; |
| reg = <0x0 0x4000000>; |
| linux,default-contiguous-region; |
| }; |
| |
| /* |
| * special region for framebuffer |
| */ |
| display_region: region@78000000 { |
| compatible = "linux,contiguous-memory-region", "reserved-memory-region"; |
| reg = <0x78000000 0x800000>; |
| }; |
| |
| /* |
| * special region for multimedia processing devices |
| */ |
| multimedia_region: region@77000000 { |
| compatible = "linux,contiguous-memory-region"; |
| reg = <0x77000000 0x4000000>; |
| }; |
| }; |
| }; |
| |
| /* ... */ |
| |
| fb0: fb@12300000 { |
| status = "okay"; |
| memory-region = <&display_region>; |
| }; |
| |
| scaler: scaler@12500000 { |
| status = "okay"; |
| memory-region = <&multimedia_region>; |
| }; |
| |
| codec: codec@12600000 { |
| status = "okay"; |
| memory-region = <&multimedia_region>; |
| }; |
| }; |