mirror of https://gitee.com/openkylin/linux.git
169 lines
5.0 KiB
Plaintext
169 lines
5.0 KiB
Plaintext
*** 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>;
|
|
};
|
|
};
|