紫光同创logos2 FPGA PCIe软件栈
基于同创logos2系列FPGA自研PCIe软件栈驱动层设备初始化Device operation设备卸载 API层配置空间访问接口bar访问接口dma操作接口其他操作接口 APP层接口测试性能测试 总结当前国际形势,美丽国对我们的制裁进一步加剧,高端FPGA“一票难求”,国产FPGA起步较晚,且生态落后,同创logos2芯片虽然硬件资源可达100K,但相关的软件栈及IP发展相对滞后,如高速PCIe接口仅有硬核IP。
基于此背景,自研基于同创logos2的标准pcie开发板,实现gen2*4 pcie接口并适配到国产服务器(海光、龙芯、飞腾);开发app对板卡的基本性能进行测试。
基于同创logos2系列FPGA自研PCIe软件栈
自研PCIe软件栈已适配RHEL,centos,ubuntu(包括中标麒麟、统信UOS、银河麒麟)等,采用标准linux设备模型及分层设计的思想,自下而上可分为驱动层,api层,app层。
驱动层
驱动层实现标准pcie字符设备注册、提供用户层交互接口;API层
api层为用户提供友好的调度接口;APP层
app层实现几个应用demo,进行板卡功能、性能测试。
整体框架如下图所示
驱动层
驱动层主要实现以下功能:设备初始化,设备operation,设备卸载。设备初始化包括pcie驱动注册,msi中断注册等等;设备operation包括bar读写、dma操作;设备卸载包括pcie设备注销、内核资源释放等。
设备初始化
列举设备初始化过程中使用到的几个接口:
pci_register_driver:注册pci设备驱动alloc_chrdev_region:动态申请设备号cdev_init(&device.cdev,&device_fops):初始化字符设备cdev_add:添加字符设备class_create:创建设备类device_create:生成设备节点
pcie驱动注册probe中主要完成以下几点工作:
pci_enable_device:使能pcie设备pci_set_master:pcie获取设备总线pci_resource_start系列接口:bar地址映射系列接口pci_alloc_consistent:申请dma一致性内存pci_enable_msi:使能msirequest_irq:msi中断注册
Device operation
提供丰富的bar、dma操作接口
Bar相关操作接口:
char_open:打开设备操作char_release:释放设备操作char_read:bar读取操作char_write:bar写入操作char_llseek:移位操作char_mmap:重映射操作
DMA相关接口:
dma_init:dma初始化操作dma_start:启动dma操作dma_set_desc:设置dma描述符dma_queue:初始化dma队列dma_send:dma数据交互(收发)
设备卸载
释放pcie设备注册时占用的资源,将资源释放给内核。
API层
API层提供丰富的接口供用户APP调用,用户根据API定义,传入指定的参数即可实现对设备的读取访问。
配置空间访问接口
cfg_read8:读取8bit bar配置空间信息cfg_read16:读取16bit bar配置空间信息cfg_read32:读取32bit bar配置空间信息cfg_write8:配置8bit bar配置空间信息cfg_write16:配置16bit bar配置空间信息cfg_write32:配置32bit bar配置空间信息bar访问接口
read8:读取8bit bar空间信息read16:读取16bit bar空间信息read32:读取32bit bar空间信息read64:读取64bit bar空间信息write8:配置8bit bar空间信息write16:配置16bit bar空间信息write32:配置32bit bar空间信息write64:配置64bit bar空间信息dma操作接口
dma_queue_read:配置dma读取信息序列dma_queue_write:配置dma写入信息序列dma_send_write:发送dma写入启动命令dma_send_read:发送dma读取启动命令dma_send_all:发送dma同时读写启动命令其他操作接口
get_ktimer:获取dma执行时间get_bar:获取barset_bar:切换barAPP层
APP层实现几个应用测试demo,一方面用于测试API接口设计友好性,一方面用于进行板卡的功能(如bar读写、msi中断上报等)、性能(pcie读、写、同时读写带宽)测试等。
接口测试
读写bar配置空间//配置32位bar空间配置信息dev->cfg_write32(reinterpret_cast<void *>(addr),uint32_t write_data);//获取32位bar空间配置信息dev->cfg_read32(reinterpret_cast<void *>(addr),uint32_t read_data);
读写bar空间
//配置32位bar空间信息dev->write32(reinterpret_cast<void *>(addr),uint32_t write_data);//获取32位bar空间信息dev->read32(reinterpret_cast<void *>(addr),uint32_t read_data);
性能测试
dma测试//映射内存空间dev->kmem_mmap(unsigned int size,unsigned int offset);//配置dma队列读写信息dev->dma_queue_read/write(uint64_t ep_offset,unsigned int size,uint64_t kmem_offset);//配置读、写队列//启动dma传输dev->dma_send_read/write/all();//发送读、写、同时读写操作//获取dma运行时间dev->get_ktimer();//获取dma运行时间,计算dma带宽
总结
面对严峻的国际形势以及国产FPGA落后的发展现状,本案基于同创logos2 FPGA实现高速PCIE软件栈开发与性能测试,亮点在于实现基于描述符的高带宽利用率PCIE软件栈设计与实现,并在多个国产服务器平台下进行适配与性能验证。结果表明,在国产服务器平台下,该软件栈都有良好的读写性能,即使是龙芯服务器,带宽利用率都有70%的表现。