|
| 1 | +*** Memory binding *** |
| 2 | + |
| 3 | +The /memory node provides basic information about the address and size |
| 4 | +of the physical memory. This node is usually filled or updated by the |
| 5 | +bootloader, depending on the actual memory configuration of the given |
| 6 | +hardware. |
| 7 | + |
| 8 | +The memory layout is described by the following node: |
| 9 | + |
| 10 | +/ { |
| 11 | + #address-cells = <(n)>; |
| 12 | + #size-cells = <(m)>; |
| 13 | + memory { |
| 14 | + device_type = "memory"; |
| 15 | + reg = <(baseaddr1) (size1) |
| 16 | + (baseaddr2) (size2) |
| 17 | + ... |
| 18 | + (baseaddrN) (sizeN)>; |
| 19 | + }; |
| 20 | + ... |
| 21 | +}; |
| 22 | + |
| 23 | +A memory node follows the typical device tree rules for "reg" property: |
| 24 | +n: number of cells used to store base address value |
| 25 | +m: number of cells used to store size value |
| 26 | +baseaddrX: defines a base address of the defined memory bank |
| 27 | +sizeX: the size of the defined memory bank |
| 28 | + |
| 29 | + |
| 30 | +More than one memory bank can be defined. |
| 31 | + |
| 32 | + |
| 33 | +*** Reserved memory regions *** |
| 34 | + |
| 35 | +In /memory/reserved-memory node one can create child nodes describing |
| 36 | +particular reserved (excluded from normal use) memory regions. Such |
| 37 | +memory regions are usually designed for the special usage by various |
| 38 | +device drivers. A good example are contiguous memory allocations or |
| 39 | +memory sharing with other operating system on the same hardware board. |
| 40 | +Those special memory regions might depend on the board configuration and |
| 41 | +devices used on the target system. |
| 42 | + |
| 43 | +Parameters for each memory region can be encoded into the device tree |
| 44 | +with the following convention: |
| 45 | + |
| 46 | +[(label):] (name) { |
| 47 | + compatible = "linux,contiguous-memory-region", "reserved-memory-region"; |
| 48 | + reg = <(address) (size)>; |
| 49 | + (linux,default-contiguous-region); |
| 50 | +}; |
| 51 | + |
| 52 | +compatible: one or more of: |
| 53 | + - "linux,contiguous-memory-region" - enables binding of this |
| 54 | + region to Contiguous Memory Allocator (special region for |
| 55 | + contiguous memory allocations, shared with movable system |
| 56 | + memory, Linux kernel-specific). |
| 57 | + - "reserved-memory-region" - compatibility is defined, given |
| 58 | + region is assigned for exclusive usage for by the respective |
| 59 | + devices. |
| 60 | + |
| 61 | +reg: standard property defining the base address and size of |
| 62 | + the memory region |
| 63 | + |
| 64 | +linux,default-contiguous-region: property indicating that the region |
| 65 | + is the default region for all contiguous memory |
| 66 | + allocations, Linux specific (optional) |
| 67 | + |
| 68 | +It is optional to specify the base address, so if one wants to use |
| 69 | +autoconfiguration of the base address, '0' can be specified as a base |
| 70 | +address in the 'reg' property. |
| 71 | + |
| 72 | +The /memory/reserved-memory node must contain the same #address-cells |
| 73 | +and #size-cells value as the root node. |
| 74 | + |
| 75 | + |
| 76 | +*** Device node's properties *** |
| 77 | + |
| 78 | +Once regions in the /memory/reserved-memory node have been defined, they |
| 79 | +may be referenced by other device nodes. Bindings that wish to reference |
| 80 | +memory regions should explicitly document their use of the following |
| 81 | +property: |
| 82 | + |
| 83 | +memory-region = <&phandle_to_defined_region>; |
| 84 | + |
| 85 | +This property indicates that the device driver should use the memory |
| 86 | +region pointed by the given phandle. |
| 87 | + |
| 88 | + |
| 89 | +*** Example *** |
| 90 | + |
| 91 | +This example defines a memory consisting of 4 memory banks. 3 contiguous |
| 92 | +regions are defined for Linux kernel, one default of all device drivers |
| 93 | +(named contig_mem, placed at 0x72000000, 64MiB), one dedicated to the |
| 94 | +framebuffer device (labelled display_mem, placed at 0x78000000, 8MiB) |
| 95 | +and one for multimedia processing (labelled multimedia_mem, placed at |
| 96 | +0x77000000, 64MiB). 'display_mem' region is then assigned to fb@12300000 |
| 97 | +device for DMA memory allocations (Linux kernel drivers will use CMA is |
| 98 | +available or dma-exclusive usage otherwise). 'multimedia_mem' is |
| 99 | +assigned to scaler@12500000 and codec@12600000 devices for contiguous |
| 100 | +memory allocations when CMA driver is enabled. |
| 101 | + |
| 102 | +The reason for creating a separate region for framebuffer device is to |
| 103 | +match the framebuffer base address to the one configured by bootloader, |
| 104 | +so once Linux kernel drivers starts no glitches on the displayed boot |
| 105 | +logo appears. Scaller and codec drivers should share the memory |
| 106 | +allocations. |
| 107 | + |
| 108 | +/ { |
| 109 | + #address-cells = <1>; |
| 110 | + #size-cells = <1>; |
| 111 | + |
| 112 | + /* ... */ |
| 113 | + |
| 114 | + memory { |
| 115 | + reg = <0x40000000 0x10000000 |
| 116 | + 0x50000000 0x10000000 |
| 117 | + 0x60000000 0x10000000 |
| 118 | + 0x70000000 0x10000000>; |
| 119 | + |
| 120 | + reserved-memory { |
| 121 | + #address-cells = <1>; |
| 122 | + #size-cells = <1>; |
| 123 | + |
| 124 | + /* |
| 125 | + * global autoconfigured region for contiguous allocations |
| 126 | + * (used only with Contiguous Memory Allocator) |
| 127 | + */ |
| 128 | + contig_region@0 { |
| 129 | + compatible = "linux,contiguous-memory-region"; |
| 130 | + reg = <0x0 0x4000000>; |
| 131 | + linux,default-contiguous-region; |
| 132 | + }; |
| 133 | + |
| 134 | + /* |
| 135 | + * special region for framebuffer |
| 136 | + */ |
| 137 | + display_region: region@78000000 { |
| 138 | + compatible = "linux,contiguous-memory-region", "reserved-memory-region"; |
| 139 | + reg = <0x78000000 0x800000>; |
| 140 | + }; |
| 141 | + |
| 142 | + /* |
| 143 | + * special region for multimedia processing devices |
| 144 | + */ |
| 145 | + multimedia_region: region@77000000 { |
| 146 | + compatible = "linux,contiguous-memory-region"; |
| 147 | + reg = <0x77000000 0x4000000>; |
| 148 | + }; |
| 149 | + }; |
| 150 | + }; |
| 151 | + |
| 152 | + /* ... */ |
| 153 | + |
| 154 | + fb0: fb@12300000 { |
| 155 | + status = "okay"; |
| 156 | + memory-region = <&display_region>; |
| 157 | + }; |
| 158 | + |
| 159 | + scaler: scaler@12500000 { |
| 160 | + status = "okay"; |
| 161 | + memory-region = <&multimedia_region>; |
| 162 | + }; |
| 163 | + |
| 164 | + codec: codec@12600000 { |
| 165 | + status = "okay"; |
| 166 | + memory-region = <&multimedia_region>; |
| 167 | + }; |
| 168 | +}; |
0 commit comments