Qemu Virt平台集成ARM PL080 DMA
背景
最近有比较多的新员工入职,新员工入职如何更快的适应工作,需要通过一些虚拟项目进行工作培训;但是如果利用现有的芯片平台进行验证,有几个缺陷:
- 当前芯片略显复杂,新员工接手理解难度较高
- 平台已经solid,并且有参考的代码以及测试用例,对于新员工而言,没有起到端到端cover一个模块的作用
- 难以预埋bug,无法通过挖掘设计bug,衡量验证效果
因此根据实际工作需求,设计了一个可以给到新员工练兵的验证项目,利用qemu平台,集成一个简单的DMA模块,并且在模块中预埋一些bug,让新员工提前感知在后续验证过程中,应该要重点关注的一些验证重点,验证难点,同时也可以观察在整个新员工项目过程中,新员工的表现,识别高潜人才;
验证平台开发
集成开发环境
Qemu针对arm类的处理器,提供了一个单纯的开发环境,Virt平台,如下是virt平台的一些简述:
‘virt’ Generic Virtual Platform
The virt board is a platform which does not correspond to any real hardware; it is designed for use in virtual machines. It is the recommended board type if you simply want to run a guest such as Linux and do not care about reproducing the idiosyncrasies and limitations of a particular bit of real-world hardware.
Supported devices
The virt machine supports the following devices:
- Up to 512 generic RV32GC/RV64GC cores, with optional extensions
- Core Local Interruptor (CLINT)
- Platform-Level Interrupt Controller (PLIC)
*CFI parallel NOR flash memory- 1 NS16550 compatible UART
- 1 Google Goldfish RTC
- 1 SiFive Test device
- 8 virtio-mmio transport devices
- 1 generic PCIe host bridge
- The fw_cfg device that allows a guest to obtain data from QEMU
The hypervisor extension has been enabled for the default CPU, so virtual machines with hypervisor extension can simply be used without explicitly declaring.
所以在Virt平台中,简单集成一下virtio-mmio设备即可;
于此同时,对于验证新手项目而言,DMA设备是一个能够比较小巧又比较全面的设备,因此可以选择一个相对简单的DMA集成到环境中即可;
DMA选型
在原生qemu 代码中,提供了如下几款DMA设备:
- bcm2835_dma
- omap_dma
- arm pl080 dma
- arm pl330 dma
- xlnx的3款dma
- …
从选择的几个dma spec内容看起来,arm的pl080 dma相对简单,并且有完善的spec资料以及开源支持的驱动代码,因此在选型上个人更偏向arm PL080 DMA设备;
集成DMA
qemu virt集成的方式比较简单,首先看一下pl080的设备描述:
1 | static Property pl080_properties[] = { |
PL080的属性只有一个downstream, 类型是memory region类型,表示dma 链接系统memory的区域, 因此在qemu virt平台中集成只要对downstream进行处理即可:
1 | //virt.c |
为了验证集成dma的寄存器访问正确性, 单独将0x64寄存器设置为魔术字寄存器,可读,可写
1 | //dma集成读写测试用 |
编译
将qemu编译完成后,使用如下命令启动系统:
1 | build/qemu-system-aarch64 \ |
测试
dump dma寄存器
通过dump dma的寄存器,简单看一下dma寄存器是否按照预期集成完成
1 | [root:DMA: ~]# devmem 0x9012040 |
寄存器读写功能正常
dma搬运测试
dma测试驱动
简单写一个dma测试代码,搬运两个地址的数据,并进行搬运后数据检查,看看中断是否正常上报
1 | static ssize_t memcpy_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { |
Qemu Virt平台集成ARM PL080 DMA
http://www.markel.top/2024/06/04/Qemu.Virt平台集成ARM.PL080.DMA/