作者hizuki (入赘桧月家,我妻彩花)
标题Re: [问题] 如何关掉/打开 arm cpu 快取记忆体
时间Fri Apr 10 14:23:55 2020
一直忘记讲我的思路
我有段时间没有碰FPGA,可能有写错的地方了
※ 引述《hirofumisyo (Ami)》之铭言:
: 标题: [问题] 如何关掉/打开 arm cpu 快取记忆体
: 时间: Thu Apr 2 16:43:16 2020
:
: 大家好,
:
: 我的作业平台是FPGA zynq 开发板,里面有arm cpu。
:
: 最近在试用dma将写进DDR的资料搬出来,
:
: 但发现搬出来的资料都有问题。
:
: 後来发现在dma开始搬资料前使用sdk开发平台的date cache disable这个功能就能让
:
: 结果是正常的。
:
: 不过我之後希望将这个流程搬到灌了linux作业系统的环境下去执行,
:
: 因此想要问一下在linux开发环境下要如何去关掉跟打开快取呢?
:
: 我是用ubuntu的linux,
:
: 谢谢大家。
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.161.58.88 (台湾)
: ※ 文章网址: https://webptt.com/cn.aspx?n=bbs/LinuxDev/M.1585817001.A.3E3.html
: → descent: dma 要记忆体的 function 可以配置non cacahe/non buffer 04/02 22:43
: → hizuki: linux dma coherent 了解下,划dma区段可用cma实现,如许 04/05 13:32
: → hizuki: 详细答覆我回头写给你 04/05 13:32
: 感谢回应,我找了一些dma coherent的资料来看後,我的理解是CPU在读写DDR时不是直接
: 读写DDR,而是透过cache; 但DMA却是直接搬运DDR的资料,所以才会产生搬的data跟从
: CPU写入的不一样。我不太懂你提到的用cma划dma区段是什麽意思,在我使用的FPGA手册
: 有给出DDR对应到的memory address range,因此我使用mmap的方法将data写到对应的
: address上(共4MB)
FGPA因为没有Iommu,所以必须访问continguous memory
因此我们使用dts当中将一段memory设定为reserved-memory
https://www.kernel.org/doc/Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt
这样linux kernel就不会去使用这一段
Linux当中有两种memory是不会有cache的问题,一个是io的memory region,一个是dma memory
後者的问题是device/host的一致性问题
我们
唯独需要确保的就是FPGA写入的东西,在我们读取的时候不被写入。这边的同步请自行
和FPGA进行通讯确保。
效率的关键就在这里
然後关於Linux上访问该区段的问题,我这里写一个比较傻的方法,想必你也不需要别的DMA Memory
首先初始化该区段 of_reserved_mem_device_init()
https://elixir.bootlin.com/linux/v5.6.3/source/drivers/media/platform/mtk-vpu/mtk_vpu.c#L854
然後去这个区段取一段memory出来进行mapping(这样kernel才可以访问)
dma_alloc_coherent()
https://www.kernel.org/doc/Documentation/DMA-API-HOWTO.txt
https://elixir.bootlin.com/linux/v5.6.3/source/drivers/media/platform/mtk-vpu/mtk_vpu.c#L679
一般论的话,这段memory其实都是从开头开始分的
当然还有更简单的做法,只做reserved-memory那一步,然後对 /dev/mem 进行mmap()操作
这部分只要编译kernel的时候有许可访问 /dev/mem 就可以,记忆体的物理位置要自行在程式中配置,
或者从/proc 当中读dts出来
复杂点的做法可以用 memremap() 就好了
: → WPC001: flush_tlb_mm() / flush_tlb_range() /update_mmu_cache() 04/06 22:38
: → WPC001: 有空自己看一下... 04/06 22:38
别闹啊,哪个driver这样写,很简单的事情非要用非推荐的书写方式
: → leolarrel: 参考 volatile 关键字 04/07 16:07
这完全就是胡说八道了,这优化的是compiler
--
起初,皇军进占满州, 我没有反对,因为我要去满州捞钱。
接着,皇军发动对支战争, 我没有反对,因为那是支那人自找苦吃。
後来,皇军发动太平洋战争,我没有反对,因为看鬼畜米英四处奔逃出了一口恶气。
以後,鬼畜米英来轰炸, 我全力反对,因为我们台湾是无辜的,这是米英的战争罪行
最後,天皇宣布无条件投降,我没有反对。因为我们台湾人是战胜国国民,
战争责任与我无关,我要有跟战胜国一样的物资配给好赚钱,也不要坐祥瑞回家!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 38.106.22.59 (美国)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/LinuxDev/M.1586499854.A.907.html
打了半天会发现别的FPGA有文档了,思路是万年不变的
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841683/Linux+Reserved+Memory
※ 编辑: hizuki (38.106.22.59 美国), 04/10/2020 14:30:07
1F:→ leolarrel: 抱歉我胡说八道了 04/10 17:49
2F:推 bearbox: 感谢分享 06/09 10:02