基于同创logos2系列FPGA自研PCIe DMA驱动与软件栈

前言:本驱动适配基于同创logos2的国产FPGA PCIe加速器板卡,板卡相关资料见:https://blog.csdn.net/whlzywy/article/details/125844174

紫光同创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,进行板卡功能、性能测试。

整体框架如下图所示
logos2 FPGA软件栈架构图

驱动层

驱动层主要实现以下功能:设备初始化,设备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:重映射操作

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:获取bar
  • set_bar:切换bar

APP层

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);

 
 
  • 1
  • 2
  • 3
  • 4
  • 读写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);

 
 
  • 1
  • 2
  • 3
  • 4

性能测试

  • 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带宽

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

总结

面对严峻的国际形势以及国产FPGA落后的发展现状,本案基于同创logos2 FPGA实现高速PCIE软件栈开发与性能测试,亮点在于实现基于描述符的高带宽利用率PCIE软件栈设计与实现,并在多个国产服务器平台下进行适配与性能验证。结果表明,在国产服务器平台下,该软件栈都有良好的读写性能,即使是龙芯服务器,带宽利用率都有70%的表现。
在这里插入图片描述

技术交流

    近两年国产FPGA发展迅速,在部分领域已有不错市场份额,相信未来会有一席之地,欢迎技术交流!

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值