요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
# SPDX-License-Identifier: GPL-2.0
%YAML 1.2
---
$id: http://devicetree.org/schemas/sram/sram.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Generic on-chip SRAM
maintainers:
- Rob Herring <robh@kernel.org>
description: |+
Simple IO memory regions to be managed by the genalloc API.
Each child of the sram node specifies a region of reserved memory. Each
child node should use a 'reg' property to specify a specific range of
reserved memory.
Following the generic-names recommended practice, node names should
reflect the purpose of the node. Unit address (@<address>) should be
appended to the name.
properties:
$nodename:
pattern: "^sram(@.*)?"
compatible:
contains:
enum:
- mmio-sram
- amlogic,meson-gxbb-sram
- arm,juno-sram-ns
- atmel,sama5d2-securam
- nvidia,tegra186-sysram
- nvidia,tegra194-sysram
- nvidia,tegra234-sysram
- qcom,rpm-msg-ram
- rockchip,rk3288-pmu-sram
reg:
maxItems: 1
clocks:
maxItems: 1
description:
A list of phandle and clock specifier pair that controls the single
SRAM clock.
"#address-cells":
const: 1
"#size-cells":
const: 1
ranges:
maxItems: 1
description:
Should translate from local addresses within the sram to bus addresses.
no-memory-wc:
description:
The flag indicating, that SRAM memory region has not to be remapped
as write combining. WC is used by default.
type: boolean
patternProperties:
"^([a-z0-9]*-)?sram(-section)?@[a-f0-9]+$":
type: object
description:
Each child of the sram node specifies a region of reserved memory.
properties:
compatible:
description:
Should contain a vendor specific string in the form
<vendor>,[<device>-]<usage>
contains:
enum:
- allwinner,sun4i-a10-sram-a3-a4
- allwinner,sun4i-a10-sram-c1
- allwinner,sun4i-a10-sram-d
- allwinner,sun9i-a80-smp-sram
- allwinner,sun50i-a64-sram-c
- amlogic,meson8-ao-arc-sram
- amlogic,meson8b-ao-arc-sram
- amlogic,meson8-smp-sram
- amlogic,meson8b-smp-sram
- amlogic,meson-gxbb-scp-shmem
- amlogic,meson-axg-scp-shmem
- arm,juno-scp-shmem
- arm,scmi-shmem
- arm,scp-shmem
- renesas,smp-sram
- rockchip,rk3066-smp-sram
- samsung,exynos4210-sysram
- samsung,exynos4210-sysram-ns
- socionext,milbeaut-smp-sram
- stericsson,u8500-esram
reg:
description:
IO mem address range, relative to the SRAM range.
maxItems: 1
reg-io-width:
description:
The size (in bytes) of the IO accesses that should be performed on the
SRAM.
enum: [1, 2, 4, 8]
pool:
description:
Indicates that the particular reserved SRAM area is addressable
and in use by another device or devices.
type: boolean
export:
description:
Indicates that the reserved SRAM area may be accessed outside
of the kernel, e.g. by bootloader or userspace.
type: boolean
protect-exec:
description: |
Same as 'pool' above but with the additional constraint that code
will be run from the region and that the memory is maintained as
read-only, executable during code execution. NOTE: This region must
be page aligned on start and end in order to properly allow
manipulation of the page attributes.
type: boolean
label:
description:
The name for the reserved partition, if omitted, the label is taken
from the node name excluding the unit address.
required:
- reg
additionalProperties: false
required:
- compatible
- reg
if:
not:
properties:
compatible:
contains:
enum:
- qcom,rpm-msg-ram
- rockchip,rk3288-pmu-sram
then:
required:
- "#address-cells"
- "#size-cells"
- ranges
additionalProperties: false
examples:
- |
sram@5c000000 {
compatible = "mmio-sram";
reg = <0x5c000000 0x40000>; /* 256 KiB SRAM at address 0x5c000000 */
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0x5c000000 0x40000>;
smp-sram@100 {
reg = <0x100 0x50>;
};
device-sram@1000 {
reg = <0x1000 0x1000>;
pool;
};
exported-sram@20000 {
reg = <0x20000 0x20000>;
export;
};
};
- |
// Samsung SMP-capable Exynos SoCs use part of the SYSRAM for the bringup
// of the secondary cores. Once the core gets powered up it executes the
// code that is residing at some specific location of the SYSRAM.
//
// Therefore reserved section sub-nodes have to be added to the mmio-sram
// declaration. These nodes are of two types depending upon secure or
// non-secure execution environment.
sram@2020000 {
compatible = "mmio-sram";
reg = <0x02020000 0x54000>;
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0x02020000 0x54000>;
smp-sram@0 {
compatible = "samsung,exynos4210-sysram";
reg = <0x0 0x1000>;
};
smp-sram@53000 {
compatible = "samsung,exynos4210-sysram-ns";
reg = <0x53000 0x1000>;
};
};
- |
// Amlogic's SMP-capable SoCs use part of the sram for the bringup of the cores.
// Once the core gets powered up it executes the code that is residing at a
// specific location.
//
// Therefore a reserved section sub-node has to be added to the mmio-sram
// declaration.
sram@d9000000 {
compatible = "mmio-sram";
reg = <0xd9000000 0x20000>;
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0xd9000000 0x20000>;
smp-sram@1ff80 {
compatible = "amlogic,meson8b-smp-sram";
reg = <0x1ff80 0x8>;
};
};
- |
sram@e63c0000 {
compatible = "mmio-sram";
reg = <0xe63c0000 0x1000>;
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0xe63c0000 0x1000>;
smp-sram@0 {
compatible = "renesas,smp-sram";
reg = <0 0x10>;
};
};
- |
sram@10080000 {
compatible = "mmio-sram";
reg = <0x10080000 0x10000>;
#address-cells = <1>;
#size-cells = <1>;
ranges;
smp-sram@10080000 {
compatible = "rockchip,rk3066-smp-sram";
reg = <0x10080000 0x50>;
};
};
- |
// Rockchip's rk3288 SoC uses the sram of pmu to store the function of
// resume from maskrom(the 1st level loader). This is a common use of
// the "pmu-sram" because it keeps power even in low power states
// in the system.
sram@ff720000 {
compatible = "rockchip,rk3288-pmu-sram", "mmio-sram";
reg = <0xff720000 0x1000>;
};
- |
// Allwinner's A80 SoC uses part of the secure sram for hotplugging of the
// primary core (cpu0). Once the core gets powered up it checks if a magic
// value is set at a specific location. If it is then the BROM will jump
// to the software entry address, instead of executing a standard boot.
//
// Also there are no "secure-only" properties. The implementation should
// check if this SRAM is usable first.
sram@20000 {
// 256 KiB secure SRAM at 0x20000
compatible = "mmio-sram";
reg = <0x00020000 0x40000>;
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0x00020000 0x40000>;
smp-sram@1000 {
// This is checked by BROM to determine if
// cpu0 should jump to SMP entry vector
compatible = "allwinner,sun9i-a80-smp-sram";
reg = <0x1000 0x8>;
};
};
- |
sram@0 {
compatible = "mmio-sram";
reg = <0x0 0x10000>;
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0x0 0x10000>;
smp-sram@f100 {
compatible = "socionext,milbeaut-smp-sram";
reg = <0xf100 0x20>;
};
};
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
Generic on-chip SRAM
1-22이 GPL-2.0 YAML schema는 genalloc API가 관리하는 simple IO memory region인 generic on-chip SRAM을 정의합니다. Maintainer는 Rob Herring입니다.
SRAM node의 각 child는 reserved memory region 하나를 나타내며 `reg`로 구체적인 범위를 지정해야 합니다. Generic-name 권장 관례에 따라 node name은 용도를 반영하고 unit address `@<address>`를 덧붙여야 합니다.
SRAM controller 속성
23-65Node name은 `^sram(@.*)?` pattern을 따릅니다. `compatible`은 `mmio-sram`, `amlogic,meson-gxbb-sram`, `arm,juno-sram-ns`, `atmel,sama5d2-securam`, `nvidia,tegra186-sysram`, `nvidia,tegra194-sysram`, `nvidia,tegra234-sysram`, `qcom,rpm-msg-ram`, `rockchip,rk3288-pmu-sram` 중 하나를 포함합니다.
`reg`와 SRAM을 제어하는 단일 `clocks`는 각각 최대 한 항목입니다. `#address-cells`와 `#size-cells`는 모두 1이며 `ranges`는 local SRAM address를 bus address로 변환하는 최대 한 항목입니다.
Boolean `no-memory-wc`는 SRAM region을 write-combining으로 remap하지 말아야 함을 나타냅니다. 기본값은 write combining입니다.
Reserved SRAM child와 compatible
66-103`^([a-z0-9]*-)?sram(-section)?@[a-f0-9]+$`에 맞는 각 child object는 reserved memory region 하나를 나타냅니다. Vendor-specific compatible은 `<vendor>,[<device>-]<usage>` 형식이어야 합니다.
지원 목록은 `allwinner,sun4i-a10-sram-a3-a4`, `allwinner,sun4i-a10-sram-c1`, `allwinner,sun4i-a10-sram-d`, `allwinner,sun9i-a80-smp-sram`, `allwinner,sun50i-a64-sram-c`, `amlogic,meson8-ao-arc-sram`, `amlogic,meson8b-ao-arc-sram`, `amlogic,meson8-smp-sram`, `amlogic,meson8b-smp-sram`, `amlogic,meson-gxbb-scp-shmem`, `amlogic,meson-axg-scp-shmem`입니다.
또한 `arm,juno-scp-shmem`, `arm,scmi-shmem`, `arm,scp-shmem`, `renesas,smp-sram`, `rockchip,rk3066-smp-sram`, `samsung,exynos4210-sysram`, `samsung,exynos4210-sysram-ns`, `socionext,milbeaut-smp-sram`, `stericsson,u8500-esram`을 지원합니다. `reg`는 SRAM 전체 범위에 상대적인 IO memory address range이며 최대 한 항목입니다.
접근 폭과 pool·export·실행 보호
104-140`reg-io-width`는 SRAM에 수행할 IO access 크기(byte)이며 1, 2, 4, 8 중 하나입니다. Boolean `pool`은 해당 reserved SRAM area를 다른 device 하나 이상이 address할 수 있고 사용 중임을 나타냅니다.
Boolean `export`는 bootloader나 userspace처럼 kernel 외부에서도 reserved SRAM area에 접근할 수 있음을 나타냅니다. `protect-exec`는 `pool`과 같지만 그 region에서 code를 실행하고 실행 중 memory를 read-only executable로 유지합니다. Page attribute 조작을 위해 시작과 끝이 page-aligned여야 합니다.
`label`은 reserved partition 이름입니다. 생략하면 unit address를 제외한 node name에서 label을 가져옵니다. 각 child에는 `reg`가 필수이고 추가 속성은 허용하지 않습니다.
필수 속성과 예외 조건
141-160SRAM node에는 `compatible`, `reg`가 필수입니다. Compatible이 `qcom,rpm-msg-ram` 또는 `rockchip,rk3288-pmu-sram`을 포함하지 않는 경우 `#address-cells`, `#size-cells`, `ranges`도 필수입니다. 정의하지 않은 추가 속성은 금지합니다.
Generic SRAM 사용 예제
161-306예제들은 256 KiB generic SRAM의 SMP·device pool·export partition, Samsung Exynos의 secure/non-secure SMP SYSRAM, Amlogic core bring-up SRAM, Renesas와 Rockchip RK3066 SMP SRAM을 보여 줍니다.
이어지는 예제는 low-power 상태에서도 유지되는 RK3288 PMU SRAM, BROM magic value로 CPU0 hotplug entry를 선택하는 Allwinner A80 secure SRAM, Socionext Milbeaut SMP SRAM을 구성합니다. Secure-only 속성은 별도로 없으므로 A80 구현은 SRAM 사용 가능 여부를 먼저 확인해야 합니다.
- |
sram@5c000000 {
compatible = "mmio-sram";
reg = <0x5c000000 0x40000>; /* 256 KiB SRAM at address 0x5c000000 */
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0x5c000000 0x40000>;
smp-sram@100 {
reg = <0x100 0x50>;
};
device-sram@1000 {
reg = <0x1000 0x1000>;
pool;
};
exported-sram@20000 {
reg = <0x20000 0x20000>;
export;
};
};
- |
// Samsung SMP-capable Exynos SoCs use part of the SYSRAM for the bringup
// of the secondary cores. Once the core gets powered up it executes the
// code that is residing at some specific location of the SYSRAM.
//
// Therefore reserved section sub-nodes have to be added to the mmio-sram
// declaration. These nodes are of two types depending upon secure or
// non-secure execution environment.
sram@2020000 {
compatible = "mmio-sram";
reg = <0x02020000 0x54000>;
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0x02020000 0x54000>;
smp-sram@0 {
compatible = "samsung,exynos4210-sysram";
reg = <0x0 0x1000>;
};
smp-sram@53000 {
compatible = "samsung,exynos4210-sysram-ns";
reg = <0x53000 0x1000>;
};
};
- |
// Amlogic's SMP-capable SoCs use part of the sram for the bringup of the cores.
// Once the core gets powered up it executes the code that is residing at a
// specific location.
//
// Therefore a reserved section sub-node has to be added to the mmio-sram
// declaration.
sram@d9000000 {
compatible = "mmio-sram";
reg = <0xd9000000 0x20000>;
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0xd9000000 0x20000>;
smp-sram@1ff80 {
compatible = "amlogic,meson8b-smp-sram";
reg = <0x1ff80 0x8>;
};
};
- |
sram@e63c0000 {
compatible = "mmio-sram";
reg = <0xe63c0000 0x1000>;
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0xe63c0000 0x1000>;
smp-sram@0 {
compatible = "renesas,smp-sram";
reg = <0 0x10>;
};
};
- |
sram@10080000 {
compatible = "mmio-sram";
reg = <0x10080000 0x10000>;
#address-cells = <1>;
#size-cells = <1>;
ranges;
smp-sram@10080000 {
compatible = "rockchip,rk3066-smp-sram";
reg = <0x10080000 0x50>;
};
};
- |
// Rockchip's rk3288 SoC uses the sram of pmu to store the function of
// resume from maskrom(the 1st level loader). This is a common use of
// the "pmu-sram" because it keeps power even in low power states
// in the system.
sram@ff720000 {
compatible = "rockchip,rk3288-pmu-sram", "mmio-sram";
reg = <0xff720000 0x1000>;
};
- |
// Allwinner's A80 SoC uses part of the secure sram for hotplugging of the
// primary core (cpu0). Once the core gets powered up it checks if a magic
// value is set at a specific location. If it is then the BROM will jump
// to the software entry address, instead of executing a standard boot.
//
// Also there are no "secure-only" properties. The implementation should
// check if this SRAM is usable first.
sram@20000 {
// 256 KiB secure SRAM at 0x20000
compatible = "mmio-sram";
reg = <0x00020000 0x40000>;
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0x00020000 0x40000>;
smp-sram@1000 {
// This is checked by BROM to determine if
// cpu0 should jump to SMP entry vector
compatible = "allwinner,sun9i-a80-smp-sram";
reg = <0x1000 0x8>;
};
};
- |
sram@0 {
compatible = "mmio-sram";
reg = <0x0 0x10000>;
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0x0 0x10000>;
smp-sram@f100 {
compatible = "socionext,milbeaut-smp-sram";
reg = <0xf100 0x20>;
};
};
요약과 해설
sram.yaml:1-306Generic SRAM controller와 reserved region의 pool·export·실행 보호 규칙을 설명합니다. 접을 수 있는 영어 원문 전체와 줄 좌표를 보존하고, 한국어 전문 번역에서는 compatible·property·symbol·source path·수치·예제 코드를 원형대로 유지합니다.