簡體   English   中英

Linux 4.4 PCIe DMA進入用戶空間頁面不起作用 - highmem不能用於DMA?

[英]Linux 4.4 PCIe DMA into userspace pages not working - highmem not usable for DMA?

我正在更新一個舊的Linux驅動程序,它通過DMA將數據傳輸到用戶空間頁面,這些頁面通過get_user_pages()從應用程序傳遞下來。

我的硬件是一個新的基於x86 Xeon的板,具有12GB的RAM。

驅動程序從VME獲取數據到PCIe FPGA,並且應該將其寫入主存儲器。 我為每個頁面做了一個dma_map_pages() ,我用dma_mapping_error()檢查它, dma_mapping_error()返回的物理DMA地址寫入DMA控制器的緩沖區描述符。 然后我開始DMA。 (我們也可以看到從FPGA跟蹤器開始的傳輸)。

但是,當我獲得DMA完成IRQ時,我看不到任何數據。 為了控制,我可以通過PIO模式訪問相同的VME地址空間並且可以工作。 我還嘗試將值寫入用戶頁面的page_address(頁面),應用程序可以看到這些。 一切都好。

深入研究這個問題我檢查了像DMA-API.txt這樣的常用文檔,但我找不到任何其他方法,也沒有找到其他驅動程序。

我的內核是自編譯的4.4.59 64位,各種調試(調試DMA-API等)設置為yes。

我還試圖通過驅動程序/ iommu /來查看這里的調試可能性,但只有幾個pr_debugs。

有趣的是:我有另一個驅動程序,一個以太網驅動程序,它支持連接到PCI的NIC。 這個沒有問題!

轉儲並比較檢索到的DMA dma_addr_t ,我看到:

NIC驅動程序通過dma_alloc_coherent()為緩沖區描述符等分配內存,它的地址是“低4 GB”:

 [ 3127.800567] dma_alloc_coherent: memVirtDma = ffff88006eeab000, memPhysDma = 000000006eeab000
 [ 3127.801041] dma_alloc_coherent: memVirtDma = ffff880035d9b000, memPhysDma = 0000000035d9b000
 [ 3127.801373] dma_alloc_coherent: memVirtDma = ffff88006ecd4000, memPhysDma = 000000006ecd4000

用戶空間頁面的VME驅動程序dma_map_page> 4GB,DMA地址看起來不同:0xffffe010(與應用程序的偏移量)。

pageAddr=ffff88026b4b1000 off=10 dmaAddr=00000000ffffe010 length=100

DMA_BIT_MASK(32)設置在兩個驅動器中,我們的FPGA內核為32位寬。

問題:為了使這個DMA工作,我必須有特殊的先決條件嗎? 我讀到highmem內存不能用於DMA,這仍然是這樣嗎?

dmesg的一部分:

[    0.539839] debug: unmapping init [mem 0xffff880037576000-0xffff880037ab2fff]
[    0.549502] DMA-API: preallocated 65536 debug entries
[    0.549509] DMA-API: debugging enabled by kernel config
[    0.549545] DMAR: Host address width 46
[    0.549550] DMAR: DRHD base: 0x000000fbffc000 flags: 0x1
[    0.549573] DMAR: dmar0: reg_base_addr fbffc000 ver 1:0 cap     8d2078c106f0466 ecap f020df
[    0.549580] DMAR: RMRR base: 0x0000007bc14000 end: 0x0000007bc23fff
[    0.549585] DMAR: ATSR flags: 0x0
[    0.549590] DMAR: RHSA base: 0x000000fbffc000 proximity domain: 0x0
[    0.549779] DMAR: dmar0: Using Queued invalidation
[    0.549784] DMAR: dmar0: Number of Domains supported <65536>
[    0.549796] DMAR: Setting RMRR:
[    0.549809] DMAR: Set context mapping for 00:14.0
[    0.549812] DMAR: Setting identity map for device 0000:00:14.0     [0x7bc14000 - 0x7bc23fff]
[    0.549820] DMAR: Mapping reserved region 7bc14000-7bc23fff
[    0.549829] DMAR: Set context mapping for 00:1d.0
[    0.549831] DMAR: Setting identity map for device 0000:00:1d.0     [0x7bc14000 - 0x7bc23fff]
[    0.549838] DMAR: Mapping reserved region 7bc14000-7bc23fff
[    0.549845] DMAR: Prepare 0-16MiB unity mapping for LPC
[    0.549853] DMAR: Set context mapping for 00:1f.0
[    0.549855] DMAR: Setting identity map for device 0000:00:1f.0 [0x0 -     0xffffff]
[    0.549861] DMAR: Mapping reserved region 0-ffffff
[    0.549892] DMAR: Intel(R) Virtualization Technology for Directed I/O
...
[    0.551725] iommu: Adding device 0000:00:00.0 to group 10
[    0.551753] iommu: Adding device 0000:00:01.0 to group 11
[    0.551780] iommu: Adding device 0000:00:01.1 to group 12
[    0.551806] iommu: Adding device 0000:00:02.0 to group 13
[    0.551833] iommu: Adding device 0000:00:02.2 to group 14
[    0.551860] iommu: Adding device 0000:00:03.0 to group 15
[    0.551886] iommu: Adding device 0000:00:03.2 to group 16
[    0.551962] iommu: Adding device 0000:00:05.0 to group 17
[    0.551995] iommu: Adding device 0000:00:05.1 to group 17
[    0.552027] iommu: Adding device 0000:00:05.2 to group 17
[    0.552059] iommu: Adding device 0000:00:05.4 to group 17
[    0.552083] iommu: Adding device 0000:00:14.0 to group 18
[    0.552134] iommu: Adding device 0000:00:16.0 to group 19
[    0.552166] iommu: Adding device 0000:00:16.1 to group 19
[    0.552191] iommu: Adding device 0000:00:19.0 to group 20
[    0.552216] iommu: Adding device 0000:00:1d.0 to group 21
[    0.552272] iommu: Adding device 0000:00:1f.0 to group 22
[    0.552305] iommu: Adding device 0000:00:1f.3 to group 22
[    0.552332] iommu: Adding device 0000:01:00.0 to group 23
[    0.552360] iommu: Adding device 0000:03:00.0 to group 24
[    0.552437] iommu: Adding device 0000:04:00.0 to group 25
[    0.552473] iommu: Adding device 0000:04:00.1 to group 25
[    0.552510] iommu: Adding device 0000:04:00.2 to group 25
[    0.552546] iommu: Adding device 0000:04:00.3 to group 25
[    0.552575] iommu: Adding device 0000:05:00.0 to group 26
[    0.552605] iommu: Adding device 0000:05:00.1 to group 27

為了完整性,我們找到了答案。 完全不同的原因:FPGA PCIe核心中的PCIe協議錯誤......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM