紫光同创logos2 FPGA PCIe软件栈
当前国际形势,美丽国对我们的制裁进一步加剧,高端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:使能msi
- request_irq:msi中断注册
Device operation
提供丰富的bar、dma操作接口
Bar相关操作接口:
- char_open:打开设备操作
- char_release:释放设备操作
- char_read:bar读取操作
- char_write:bar写入操作
- char_llseek:移位操作
- char_mmap:重映射操作