Cavium SSL加速卡驱动移植到Ubuntu
来源:互联网 发布:linux查看log日志 编辑:程序博客网 时间:2024/06/11 18:40
因为cavium ssl加速卡的驱动指定的系统是Fedora,而我们的系统是Ubuntu,所以肯定要移植了,看一下Release_Notes.txt里面的Supported Features:
Supported Features ================== System architecture ------------------- - 32/64 bit Intel/AMD platforms - Little Endian - SMP and Non-SMP Operating System and Kernel versions ------------------------------------ OS: - Fedora Core 12 Kernel Versions: - v2.6.31 - v2.6.32 - v2.6.34可见这个驱动只在v2.6.31、32、34这几个版本的内核上测试过,想在3.0以上版本内核上编译,肯定也要修改一下代码。果不其然,拿它的源码在Ubuntu上make一下报了很多错,这里就不贴编译错误的图了,下面是所做的修改:
1、源码
需要修改的文件有cavium_proc.c、linux_main.c、linux_sysdep.h、Makefile、Makefile.Linux,用Beyond Compare比较如下:
static intproc_write_timeout(struct file *file, const char *buffer, unsigned long count, void *data){ char str[count+1], *strend; Uint32 timeout; CAVIUM_MOD_INC_USE_COUNT; if(cavium_copy_in(str, buffer, count)) { cavium_error("cavium_copy_out failed\n"); return -EFAULT; } str[count] = '\0'; timeout = simple_strtoul(str, &strend, 0); if (timeout > (2*60*60)) { cavium_error("Timeout too high. The maximum value is 7200\n"); return -EFAULT; } cavium_command_timeout = timeout*HZ; CAVIUM_MOD_DEC_USE_COUNT; return count;}static intproc_read_timeout(char *page, char **start, off_t off, int count, int *eof, void *data){ int len = 0; CAVIUM_MOD_INC_USE_COUNT; len = sprintf(page + len, "%d\n", (cavium_command_timeout/HZ)); CAVIUM_MOD_DEC_USE_COUNT; return len;}int cavium_init_proc(void){ int rv = 0; /* create directory /proc/cavium */ cavium_dir = proc_mkdir("cavium", NULL); if(cavium_dir == NULL) { rv = -ENOMEM; goto out; }#if LINUX_VERSION_CODE < KERNEL_VERSION (2,6,30) cavium_dir->owner = THIS_MODULE;#endif /* create timeout file */ timeout_file = create_proc_entry("command_timeout", 0644, cavium_dir); if(timeout_file == NULL) { rv = -ENOMEM; goto out; } timeout_file->data = &cavium_command_timeout; timeout_file->read_proc = proc_read_timeout; timeout_file->write_proc = proc_write_timeout;#if LINUX_VERSION_CODE < KERNEL_VERSION (2,6,30) timeout_file->owner = THIS_MODULE;#endif ……}
而在3.10以及3.10之后的内核版本proc文件系统是这么用的:
static ssize_t proc_write_timeout(struct file *file, const char __user *buffer, size_t count, loff_t *ppos){ Uint32 timeout; unsigned long val; int err; CAVIUM_MOD_INC_USE_COUNT; err = kstrtoul_from_user(buffer, count, 0, &val); if (err) return err; timeout = val; if (timeout > (2*60*60)) { cavium_error("Timeout too high. The maximum value is 7200\n"); return -EFAULT; } cavium_command_timeout = timeout*HZ; CAVIUM_MOD_DEC_USE_COUNT; return count;}static int proc_read_timeout(struct seq_file *m, void *v){ int len = 0; CAVIUM_MOD_INC_USE_COUNT; len = seq_printf(m, "%d\n", (cavium_command_timeout/HZ)); CAVIUM_MOD_DEC_USE_COUNT; return len;}static struct file_operations cavium_proc_timeout_operations = { .open = open_proc_timeout, .read = seq_read, .llseek = seq_lseek, .write = proc_write_timeout,};int cavium_init_proc(void){ int rv = 0; /* create directory /proc/cavium */ cavium_dir = proc_mkdir("cavium", NULL); if(cavium_dir == NULL) { rv = -ENOMEM; goto out; } timeout_file = proc_create("command_timeout", 0644, cavium_dir, &cavium_proc_timeout_operations); if(timeout_file == NULL) { rv = -ENOMEM; goto out; } ……}对比一下就会发现接口名变了,参数也变了,所以在cavium_proc.c文件中要做相应的修改,这个文件里面修改的行数还挺多,基本都是修改proc文件系统的使用接口,参考上面的例子就可以了。
文件linux_main.c改得不多,主要是加几个宏定义就可以了,这是因为在内核版本3.7.0之后内核去掉了devinit、devinitdata、devexit_p这几个宏,我们加上这几个宏的定义就可以了:
#if LINUX_VERSION_CODE > KERNEL_VERSION (3,7,0)#define __devinit#define __devinitdata#define __devexit_p(x) x#endif
文件driver\linux\Makefile做了只能在2.6内核上编译的限制,要在新版Ubuntu(内核版本3.13)上编译,肯定要去掉这个限制:
文件Makefile.Linux也做了一些修改:
2、编译
经过上面源码的修改,再看看linux_install_driver_pf.txt基本上make clean和make一下就可以了,如果还出错那就再根据出错信息去做相应的修改就可以了。编译还是很简单的。
3、加载
编译成功了的话,在编译目录的bin底下应该有驱动模块:
root@BJDEVR720:~/work/cavium/Cavium_Networks/NITROX-SDK# ls -l bin/total 0lrwxrwxrwx 1 root root 69 Apr 14 14:29 csp1_init -> /root/work/cavium/Cavium_Networks/NITROX-SDK/utils/csp1_init*lrwxrwxrwx 1 root root 71 Apr 14 14:29 init_nitrox -> /root/work/cavium/Cavium_Networks/NITROX-SDK/utils/init_nitrox*lrwxrwxrwx 1 root root 77 Apr 14 14:29 pkp_drv.ko -> /root/work/cavium/Cavium_Networks/NITROX-SDK/driver/linux/pkp_drv.ko 然后在bin目录底下执行命令:./init_nitrox ssl就可以加载驱动模块了,如果不出意外,基本上就完事了,但在Ubuntu一些版本上总是出现硬件无法分配资源以及驱动初始化失败的问题:root@BJDEVR720:~/work/cavium/Cavium_Networks/NITROX-SDK/bin# lspci -vvv -s 05:00.0 05:00.0 Network and computing encryption device: Cavium Networks Device 0011 (rev 01) Subsystem: Cavium Networks Device 0011 Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0, Cache Line Size: 64 bytes Interrupt: pin A routed to IRQ 48 Region 0: Memory at <ignored> (64-bit, prefetchable) Capabilities: [40] Power Management version 3 Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME- Capabilities: [50] MSI: Enable- Count=1/1 Maskable+ 64bit+ Address: 0000000000000000 Data: 0000 Masking: 00000000 Pending: 00000000 Capabilities: [70] Express (v2) Endpoint, MSI 00 DevCap: MaxPayload 256 bytes, PhantFunc 0, Latency L0s <1us, L1 <8us ExtTag+ AttnBtn- AttnInd- PwrInd- RBE+ FLReset+ DevCtl: Report errors: Correctable- Non-Fatal+ Fatal+ Unsupported+ RlxdOrd+ ExtTag- PhantFunc- AuxPwr- NoSnoop+ FLReset- MaxPayload 256 bytes, MaxReadReq 512 bytes DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr- TransPend- LnkCap: Port #0, Speed 5GT/s, Width x16, ASPM L0s L1, Exit Latency L0s <1us, L1 <64us ClockPM- Surprise- LLActRep- BwNot- LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- CommClk+ ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt- LnkSta: Speed 5GT/s, Width x8, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt- DevCap2: Completion Timeout: Not Supported, TimeoutDis+, LTR-, OBFF Not Supported DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis+, LTR-, OBFF Disabled LnkCtl2: Target Link Speed: 5GT/s, EnterCompliance- SpeedDis- Transmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS- Compliance De-emphasis: -6dB LnkSta2: Current De-emphasis Level: -6dB, EqualizationComplete-, EqualizationPhase1- EqualizationPhase2-, EqualizationPhase3-, LinkEqualizationRequest- Capabilities: [b0] MSI-X: Enable- Count=19 Masked- Vector table: BAR=0 offset=00001000 PBA: BAR=0 offset=00002000 Capabilities: [100 v2] Advanced Error Reporting UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol- UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt+ UnxCmplt+ RxOF- MalfTLP- ECRC- UnsupReq- ACSViol- UESvrt: DLP+ SDES+ TLP+ FCP+ CmpltTO+ CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC+ UnsupReq- ACSViol- CESta: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr- CEMsk: RxErr+ BadTLP+ BadDLLP+ Rollover+ Timeout+ NonFatalErr+ AERCap: First Error Pointer: 00, GenCap+ CGenEn- ChkCap+ ChkEn- Capabilities: [140 v1] Alternative Routing-ID Interpretation (ARI) ARICap: MFVC- ACS-, Next Function: 0 ARICtl: MFVC- ACS-, Function Group: 0 Capabilities: [150 v1] Single Root I/O Virtualization (SR-IOV) IOVCap: Migration-, Interrupt Message Number: 000 IOVCtl: Enable- Migration- Interrupt- MSE- ARIHierarchy+ IOVSta: Migration- Initial VFs: 64, Total VFs: 64, Number of VFs: 0, Function Dependency Link: 00 VF offset: 1, stride: 1, Device ID: 0011 Supported Page Size: 00000553, System Page Size: 00000001 Region 0: Memory at 0000000000000000 (64-bit, prefetchable) VF Migration: offset: 00000000, BIR: 0root@BJDEVR720:~/work/cavium/Cavium_Networks/NITROX-SDK/bin# dmesg [ 239.840522] VFCOUNT 0[ 239.840604] requested mem region for bar 0 cannot be allocated[ 239.840610] Cavium Init failed for device [ 239.840644] pkp: probe of 0000:05:00.0 failed with error -12[ 239.840697] requested mem region for bar 0 cannot be allocated[ 239.840702] Cavium Init failed for device [ 239.840719] pkp: probe of 0000:43:00.0 failed with error -12root@BJDEVR720:~/work/cavium/Cavium_Networks/NITROX-SDK/bin#
这个问题困扰我很长时间,看内核pci驱动初始化代码也没找出是啥问题,后来峰哥在https://bugzilla.kernel.org/show_bug.cgi?id=10461上看到人家只要加一个内核参数就能解决问题了,在我们系统试了一下果然也能解决掉这个问题,加的内核启动参数是pci=nocrs,这个参数对应到代码是在arch/x86/pci/common.c和arch/x86/pci/acpi.c文件中有用到,最后体现在acpi.c的函数pci_acpi_scan_root中:
如果加了内核启动参数pci=nocrs的话,应该执行的是上图else分支,看样子是先释放一些资源再添加一些资源,具体原因就没有往更深层次去挖掘了,因为这个需要熟悉pci一整套流程和玩法才好理解,这个还是比较复杂的,目前功力尚未达到这个境界,先这么着吧。添加内核启动参数只需要在/boot/grub/grub.cfg加一下就可以了:
修改完重启之后加载驱动:
root@BJDEVR720:~/work/cavium/Cavium_Networks/NITROX-SDK/bin# ./init_nitrox sslinsmod ./pkp_drv.ko ssl=0 ./csp1_init ssl=0 File: ../microcode/boot_mc2_n3.out Version = CN35x-MC-Boot-0001 Code length = 14060 Data length = 2000: name=../microcode/boot_mc2_n3.out, index=0, core=0File: ../microcode/main_ssl2_n3.out Version = CNN35x-MC-SSL-0008 Code length = 59620 Data length = 3201: name=../microcode/main_ssl2_n3.out, index=1, core=0Microcode Load Succeedroot@BJDEVR720:~/work/cavium/Cavium_Networks/NITROX-SDK/bin# dmesg [ 4151.317917] VFCOUNT 0[ 4151.318649] Nitrox3 found at Bus 5 Slot 0[ 4151.318827] Using memory-mapped bar for device 0x177D:0x11[ 4151.320505] bar 0: d9200000[ 4151.331446] SERDES_TUNING register value is already set: 0x458cc58[ 4151.334542] detect_n3_sku: Invalid zip mask 0x0000000f[ 4151.431688] part number=CNN35XX has 16 cores[ 4151.431691] Finished Initializing this device[ 4151.431693] Total Number of Nitrox Devices: 1[ 4151.432981] Loaded Cavium Driver --- 5.03-[ 4152.456226] got boot microcode[ 4152.456243] Code type = 02, code size = 36ec, data size = c8[ 4152.456246] got mainline microcode[ 4152.456269] Code type = 01, code size = e8e4, data size = 140[ 4152.812956] UEN = 0xffff[ 4152.812960] Final Core Mask = 0x0000ffff[ 4152.812962] Loaded Boot microcode[ 4154.315289] Loaded Main microcode[ 4154.350374] Loading of Microcodes successful[ 4154.370396] [ 4154.370396] Core Frequency 500 MHzroot@BJDEVR720:~/work/cavium/Cavium_Networks/NITROX-SDK/bin#从加载结果和dmesg调试信息可见已经正常加载驱动了,再lspci一下看看:
root@rdserver5:~/work/cavium/Cavium_Networks/NITROX-SDK/bin# lspci -vvv -s 05:00.005:00.0 Network and computing encryption device: Cavium Networks Device 0011 (rev 01) Subsystem: Cavium Networks Device 0011 Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0, Cache Line Size: 64 bytes Interrupt: pin A routed to IRQ 48 Region 0: Memory at d9200000 (64-bit, prefetchable) [size=1M] Capabilities: [40] Power Management version 3 Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME- Capabilities: [50] MSI: Enable- Count=1/1 Maskable+ 64bit+ Address: 0000000000000000 Data: 0000 Masking: 00000000 Pending: 00000000 Capabilities: [70] Express (v2) Endpoint, MSI 00 DevCap: MaxPayload 256 bytes, PhantFunc 0, Latency L0s <1us, L1 <8us ExtTag+ AttnBtn- AttnInd- PwrInd- RBE+ FLReset+ DevCtl: Report errors: Correctable- Non-Fatal+ Fatal+ Unsupported+ RlxdOrd+ ExtTag+ PhantFunc- AuxPwr- NoSnoop+ FLReset- MaxPayload 256 bytes, MaxReadReq 2048 bytes DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr- TransPend- LnkCap: Port #0, Speed 5GT/s, Width x16, ASPM L0s L1, Latency L0 <1us, L1 <64us ClockPM- Surprise- LLActRep- BwNot- LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk+ ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt- LnkSta: Speed 5GT/s, Width x8, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt- DevCap2: Completion Timeout: Not Supported, TimeoutDis+ DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis+ LnkCtl2: Target Link Speed: 5GT/s, EnterCompliance- SpeedDis-, Selectable De-emphasis: -6dB Transmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS- Compliance De-emphasis: -6dB LnkSta2: Current De-emphasis Level: -6dB Capabilities: [b0] MSI-X: Enable- Count=19 Masked- Vector table: BAR=0 offset=00001000 PBA: BAR=0 offset=00002000 Capabilities: [100 v2] Advanced Error Reporting UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol- UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt+ UnxCmplt+ RxOF- MalfTLP- ECRC- UnsupReq- ACSViol- UESvrt: DLP+ SDES+ TLP+ FCP+ CmpltTO+ CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC+ UnsupReq- ACSViol- CESta: RxErr+ BadTLP- BadDLLP- Rollover+ Timeout+ NonFatalErr- CEMsk: RxErr+ BadTLP+ BadDLLP+ Rollover+ Timeout+ NonFatalErr+ AERCap: First Error Pointer: 00, GenCap+ CGenEn- ChkCap+ ChkEn- Capabilities: [140 v1] Alternative Routing-ID Interpretation (ARI) ARICap: MFVC- ACS-, Next Function: 0 ARICtl: MFVC- ACS-, Function Group: 0 Capabilities: [150 v1] Single Root I/O Virtualization (SR-IOV) IOVCap: Migration-, Interrupt Message Number: 000 IOVCtl: Enable- Migration- Interrupt- MSE- ARIHierarchy+ IOVSta: Migration- Initial VFs: 64, Total VFs: 64, Number of VFs: 0, Function Dependency Link: 00 VF offset: 1, stride: 1, Device ID: 0011 Supported Page Size: 00000553, System Page Size: 00000001 Region 0: Memory at 00000000c0000000 (64-bit, prefetchable) VF Migration: offset: 00000000, BIR: 0 Kernel driver in use: pkp
可以看出两个Region所在行是正常值而不是ignored了。
整个移植过程完成。
- Cavium SSL加速卡驱动移植到Ubuntu
- Cavium SSL加速卡驱动移植到Ubuntu
- 移植IXP驱动到uClinux2008
- JRTPLib 移植到Android - Ubuntu
- wpa 移植到ubuntu上
- 移植dm9000ae驱动到u-boot
- 移植dm9000ae驱动到u-boot
- enc28j60网卡驱动移植到tcc8900上
- 移植ads7846驱动到tiny6410(tiny6410)
- rt3070驱动移植到fsl imx51上
- 9713音频驱动移植到210
- 移植RT5370驱动到MIPS架构上
- 移植DM9000网卡驱动到uboot
- 移植ads7846驱动到tiny6410(tiny6410)
- 移植RT5370无线网卡驱动到mini2440
- 移植RT2870无线网卡驱动到s3c2416
- 移植RT5370无线网卡驱动到mini2440
- 移植RT3070无线网卡驱动到s5pv210
- 复制对象(一)copy和mutableCopy方法
- LintCode-赋值运算符重载
- 通过NFSv3挂载HDFS到本地目录
- 折腾gcc/g++链接时.o文件及库的顺序问题
- 分析iOS Crash文件:符号化iOS Crash文件的3种方法
- Cavium SSL加速卡驱动移植到Ubuntu
- android 切换主题
- 日历问题
- create table as select
- [学习记录]Objective-C回调函数(函数指针)
- Mybatis入门教程
- iOS Crash文件的解析
- 复制对象(二)<NSCopying>协议和属性的copy特性
- Algolia的分布式搜索网络架构