【问题标题】:How to interpret this part of device tree?如何解释设备树的这一部分?
【发布时间】:2018-08-23 13:44:05
【问题描述】:

.dts 中的以下 sn-p 描述了保留的内存:

reserved-memory {
    #address-cells = <0x2>;
    #size-cells = <0x2>;
    ranges;

    cma_reserved: linux,cma {
        compatible = "shared-dma-pool";
        reusable;
        size = <0x0 0x1000000>; // 16MB
        alignment = <0x0 0x2000>; // 8KB
        linux,cma-default;
    };

    ion_reserved: ion@200000000 {
        compatible = "ion-region";
        reg = <0x2 0x0 0x1 0x0>; // 4GB
    };
};

我可以理解ion_reserved 部分,但不理解cma_reserved 部分,尤其是这16MB 内存的地址。

谢谢!

【问题讨论】:

  • 使用compatible 属性字符串来识别依赖于该节点的驱动程序。

标签: device-tree


【解决方案1】:

CMA(连续内存分配):使用此分配是因为 dma 需要连续内存,并且使用可用的分配器,我们最多只能分配 8 MB。所以我们在启动时使用 cma(reserve memory)。

上述节点中使用的属性:

  • Compatible 属性将指定哪个驱动程序可以使用此节点。 驱动程序在其设备中提及 .compatible="shared-dma-pool" id表,可以用这个节点做驱动。
  • 可重用属性 - 它是可选的,也是空属性。 当一个节点指定这个属性意味着,操作系统可以在 这个区域,但它们是设备驱动程序在需要时的限制 这些有争议的记忆,他们可以收回。

  • Size 属性 - 此属性告诉您 cma 的总大小和 as 在上面的节点中是 16 MB。

  • 对齐属性 - 分配对齐的地址边界。它 还使用父级指定的大小为 2 的单元格。这就是为什么 "对齐 = ;"

  • linux,cma-default 属性 - 它也是一个空属性。如果这 提到属性,那么 Linux 将使用这个内存区域 默认为连续内存分配。他们也是类似的 属性 "linux,dma-default" 如果提到此属性,则 Linux 将将此池区域用于 DMA 分配器。如果首先使用 cma 使用属性,dma 使用第二个属性。

欲了解更多信息,请访问:https://www.kernel.org/doc/Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt

【讨论】:

  • 感谢您的回答。从您提供的链接中,我看到以下内容`每个子节点可以使用“reg”属性来指定特定范围的保留内存,或者使用带有可选约束的“size”属性来请求动态分配的内存块。所以基本上这块内存的地址是动态分配的,这就是我寻求帮助的地方。所以如果我理解正确的话,这块内存会被内核从memory节点分配并传递给驱动...
  • ps:来自内核的引导日志确认 16MiB cma 内存是从系统内存(在它的顶部)分配的。
  • 我不明白你在问什么问题?? @bruin
  • 我的问题是关于 16MB cma 内存的基地址,因为设备树只指定块的大小,而不是它的基地址。现在我想我有了答案:内存是由内核从系统内存中分配的(我的问题中没有列出的memory 节点),因此基地址是由内核决定的。控制台日志显示此 cma 块位于物理系统内存的顶部。
【解决方案2】:

文档(如 Jitender 所示)加上来自内核的控制台日志表明 cma 块是从系统内存中分配的。

设备树中的memory 节点:

memory {
  reg = <0x1 0x0 0x0 0xB0000000>; // 2.75GB, lease last 1.25GB to video codec
  device_type = "memory";
};

cma 块的内核日志:

[    0.000000] Reserved memory: created CMA memory pool at 0x00000001af000000, size 16 MiB
[    0.000000] OF: reserved mem: initialized node linux,cma, compatible id shared-dma-pool

我猜下面的内容反映了与设备树的那部分确认的物理内存映射:

+=========================+ 0x3:0000:0000
|                         |
|                         |
|                         |
|        ION (4G)         |
|                         |
|                         |
|                         |
+=========================+  0x2:0000:0000
|                         |
|   Video decode (1.25G)  |
|                         |
+-------------------------+  0x1:b000:0000
|     CMA pool (16M)      |
|  ---------------------  |  0x1:af00:0000
|   crash kernel (64M)    |
|  ---------------------  |  0x1:ab00:0000
|                         |
|                         |
|     System (2.75G)      |
|                         |
+=========================+  0x1:0000:0000

谢谢!

【讨论】:

    猜你喜欢
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多