| * 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 folllowing node: |
| |
| memory { |
| reg = <(baseaddr1) (size1) |
| (baseaddr2) (size2) |
| ... |
| (baseaddrN) (sizeN)>; |
| }; |
| |
| baseaddrX: the base address of the defined memory bank |
| sizeX: the size of the defined memory bank |
| |
| More than one memory bank can be defined. |
| |
| |
| * Memory regions |
| |
| In /memory node one can create additional nodes describing particular |
| memory regions, usually 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 |
| wit the following convention: |
| |
| (name): region@(base-address) { |
| reg = <(baseaddr) (size)>; |
| (linux,contiguous-region); |
| (linux,default-contiguous-region); |
| label = (unique_name); |
| }; |
| |
| name: an name given to the defined region. |
| base-address: the base address of the defined region. |
| size: the size of the memory region. |
| linux,contiguous-region: property indicating that the defined memory |
| region is used for contiguous memory allocations, |
| Linux specific (optional) |
| linux,default-contiguous-region: property indicating that the region |
| is the default region for all contiguous memory |
| allocations, Linux specific (optional) |
| label: an internal name used for automatically associating the |
| cma region with a given device. The label is optional; |
| if the label is not given the client is responsible for |
| calling the appropriate functions to associate the region |
| with a device. |
| |
| * Device nodes |
| |
| Once the regions in the /memory node are defined, they can be assigned |
| to device some device nodes for their special use. The following |
| properties are defined: |
| |
| linux,contiguous-region = <&phandle>; |
| 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. 2 contiguous |
| regions are defined for Linux kernel, one default of all device drivers |
| (named contig_mem, placed at 0x72000000, 64MiB) and one dedicated to the |
| framebuffer device (named display_mem, placed at 0x78000000, 16MiB). The |
| display_mem region is then assigned to fb@12300000 device for contiguous |
| memory allocation with Linux kernel drivers. |
| |
| The reason for creating a separate region for framebuffer device is to |
| match the framebuffer address of from configuration done by bootloader, |
| so once Linux kernel drivers starts, no glitches on the displayed boot |
| logo appears. |
| |
| / { |
| /* ... */ |
| memory { |
| reg = <0x40000000 0x10000000 |
| 0x50000000 0x10000000 |
| 0x60000000 0x10000000 |
| 0x70000000 0x10000000>; |
| |
| contig_mem: region@72000000 { |
| linux,contiguous-region; |
| linux,default-contiguous-region; |
| reg = <0x72000000 0x4000000>; |
| }; |
| |
| display_mem: region@78000000 { |
| linux,contiguous-region; |
| reg = <0x78000000 0x1000000>; |
| }; |
| }; |
| |
| fb@12300000 { |
| linux,contiguous-region = <&display_mem>; |
| status = "okay"; |
| }; |
| }; |