关于dma_alloc_coherent()返回总线地址的问题

问题描述 投票:0回答:1

a PCIe EP测试驱动中,它调用

dma_alloc_coherent()
分配16K dma空间,并分别打印返回的虚拟地址和总线地址。

在我的 aarch64 系统上,打印如下所示:

[  106.426075] edev 0000:01:00.0: Allocated DMA region virt 000000009ddf3f42, phys 00000000b8ade6d9

根据我的理解,第二个地址

00000000b8ade6d9
是总线地址,不一定是物理地址。但如果系统禁用了 IOMMU/SMMU,则总线地址应与物理地址相同。

为了简化问题,我已经在系统中禁用了 IOMMU/SMMU(通过在 Kconfig 中禁用

CONFIG_IOMMU_SUPPORT
,并在 dts 中禁用
smmu
设备),因此第二个地址应该是物理地址。

令人困惑的是,我的系统只有从

0
开始的2G物理内存,地址
00000000b8ade6d9
不属于这个范围。怎么可能?

顺便说一句,我正在使用 PetaLinux 2023.1 为 Versal 设备的 PS 构建内核。内核版本是

6.1.5-xilinx-v2023.1
。以下是一些相关信息:

root@a72:/home/cmic# dmesg|more
[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd083]
[    0.000000] Linux version 6.1.5-xilinx-v2023.1 (oe-user@oe-host) (aarch64-xilinx-linux-gcc (GCC) 12.
2.0, GNU ld (GNU Binutils) 2.39.0.20220819) #1 SMP Fri Apr 21 07:47:58 UTC 2023
[    0.000000] Machine model: Xilinx Versal
[    0.000000] earlycon: pl11 at MMIO32 0x00000000ff000000 (options '115200n8')
[    0.000000] printk: bootconsole [pl11] enabled
[    0.000000] efi: UEFI not found.
[    0.000000] Zone ranges:
[    0.000000]   DMA32    [mem 0x0000000000000000-0x000000007fffffff]
[    0.000000]   Normal   empty
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000000000000-0x000000007fffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x000000007fffffff]
[    0.000000] cma: Reserved 256 MiB at 0x000000006be00000
[    0.000000] psci: probing for conduit method from DT.
[    0.000000] psci: PSCIv1.1 detected in firmware.
[    0.000000] psci: Using standard PSCI v0.2 function IDs
[    0.000000] psci: MIGRATE_INFO_TYPE not supported.
[    0.000000] psci: SMC Calling Convention v1.2
[    0.000000] percpu: Embedded 18 pages/cpu s35816 r8192 d29720 u73728
[    0.000000] pcpu-alloc: s35816 r8192 d29720 u73728 alloc=18*4096
[    0.000000] pcpu-alloc: [0] 0 [0] 1
[    0.000000] Detected PIPT I-cache on CPU0
[    0.000000] CPU features: detected: GIC system register CPU interface
[    0.000000] CPU features: detected: Spectre-v2
[    0.000000] CPU features: detected: Spectre-BHB
[    0.000000] CPU features: detected: ARM erratum 1742098
[    0.000000] CPU features: detected: ARM errata 1165522, 1319367, or 1530923
[    0.000000] alternatives: applying boot alternatives
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 516096
[    0.000000] Kernel command line: console=ttyAMA0 earlycon=pl011,mmio32,0xFF000000,115200n8 clk_ignor
e_unused root=/dev/mmcblk0p2 rw rootwait
[    0.000000] Dentry cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)
[    0.000000] Inode-cache hash table entries: 131072 (order: 8, 1048576 bytes, linear)
[    0.000000] mem auto-init: stack:all(zero), heap alloc:off, heap free:off
[    0.000000] Memory: 1763520K/2097152K available (14464K kernel code, 7962K rwdata, 4080K rodata, 217
6K init, 2358K bss, 71488K reserved, 262144K cma-reserved)

...

root@a72:/home/cmic# cat /proc/iomem
00000000-7fffffff : System RAM
  00210000-0143ffff : Kernel code
  01440000-0165ffff : reserved
  01660000-0207ffff : Kernel data
  6be00000-7ddfffff : reserved
  7deb6000-7debcfff : reserved
  7f8a2000-7fba2fff : reserved
  7fba3000-7fbc6fff : reserved
  7fbc9000-7fbcbfff : reserved
  7fbcc000-7fbdcfff : reserved
  7fbdd000-7fffffff : reserved
f1000000-f1000fff : f1000000.i2c i2c@f1000000
f1020000-f1020fff : f1020000.gpio gpio@f1020000
f1030000-f1030fff : f1030000.spi spi@f1030000
f1050000-f105ffff : f1050000.mmc mmc@f1050000
f1270000-f1273fff : f1270000.sysmon sysmon@f1270000
f12a0000-f12a00ff : f12a0000.rtc rtc@f12a0000
f6070000-f608ffff : f6150000.memory-controller ddrmc_noc_base
f6150000-f6151fff : f6150000.memory-controller ddrmc_base
f9000000-f907ffff : GICD
f9080000-f90fffff : GICR
fd010000-fd09ffff : fd010000.pmu pmu@10000
ff000000-ff000fff : serial@ff000000
  ff000000-ff000fff : ff000000.serial serial@ff000000
ff010000-ff010fff : serial@ff010000
  ff010000-ff010fff : ff010000.serial serial@ff010000
ff020000-ff020fff : ff020000.i2c i2c@ff020000
ff030000-ff030fff : ff030000.i2c i2c@ff030000
ff040000-ff040fff : ff040000.spi spi@ff040000
ff0c0000-ff0c0fff : ff0c0000.ethernet ethernet@ff0c0000
ffa80000-ffa80fff : ffa80000.dma dma@ffa80000
ffa90000-ffa90fff : ffa90000.dma dma@ffa90000
ffaa0000-ffaa0fff : ffaa0000.dma dma@ffaa0000
ffab0000-ffab0fff : ffab0000.dma dma@ffab0000
ffac0000-ffac0fff : ffac0000.dma dma@ffac0000
ffad0000-ffad0fff : ffad0000.dma dma@ffad0000
ffae0000-ffae0fff : ffae0000.dma dma@ffae0000
ffaf0000-ffaf0fff : ffaf0000.dma dma@ffaf0000
20100000000-2010fffffff : axi-pcie@20100000000
  20100000000-201027fffff : PCI Bus 0000:01
    20100000000-20100ffffff : 0000:01:00.0
      20100000000-20100ffffff : edev
    20101000000-20101ffffff : 0000:01:00.0
      20101000000-20101ffffff : edev
    20102000000-2010200ffff : 0000:01:00.0
      20102000000-2010200ffff : edev
20140000000-2014fffffff : 20140000000.axi-pcie cfg
20180000000-2018000ffff : 20140000000.axi-pcie breg
linux-kernel
1个回答
0
投票

事实证明,驱动程序使用

%p
(而不是
%px
)来打印地址。所以根据this,地址只是哈希值。

© www.soinside.com 2019 - 2024. All rights reserved.