tinoo_dong 发表于 2015-9-11 11:21:16

SoC 15.0版本下preloader和uboot源码的两个bug

Altera的SoC软件已经升级到了15.0,在preloader和uboot中也增加了不少新的功能,但是也出现一些不大不小的bug。

Bug 1:
出现场景:如果使用了DDR3 的ECC功能,也就是在配置DDR3的数据位宽为40位时,新版本的preloader/uboot编译时要求使能SDRAM SCRUBBING,同时还会默认使能SDRAM SCRUB REMAIN REGION。
出错现象:一旦使能SDRAM SCRUB REMAIN REGION,在板卡启动后就会停留在preloader下,无法启动uboot,也就更不用提Linux启动了。
出错原因:SDRAM SCRUB这个功能,其实就是利用SoC自带的PL330 DMA模块来快速的给DDR3填零,从而保证ECC不会出错。但是在做SDRAM SCRUB REMAIN REGION这个动作时,Altera把关闭PL330 DMA模块的函数放到了preloader读取uboot代码并写入DDR3这个动作之后。大家可以想到吧,此时DDR3被DMA给占了,无法正常的向里面写数据了,所以uboot就启不来了。
解决办法:相信大家都已经想到了,关闭SDRAM SCRUB REMAIN REGION这个功能。如果有人觉得这样还是不稳妥,那就只好自己动手修改preloader源代码了。这个相关源码的路径是:spl_bsp\uboot-socfpga\common\spl\spl.c

Bug 2:
出现场景:15.0版本的preloader/uboot来引导Linux启动。
出错现象:Linux无法正常启动或者只有单核能工作。
出错原因:说到SoC中的memory保护功能,可能没几个人知道。SoC中号称对memory有硬件保护机制,可以设置20种不同的保护规则,可以指定设备访问固定地址空间,也可以让设备什么地址空间都访问不了。说了这么多,其实问题就出在这里,Altera在代码中增加了memory保护代码,结果人家简单粗暴的设置了一个全保护,也就是任谁也别想访问memory了!
解决办法:看来也只能简单粗暴的修改代码了。要修改的文件:spl_bsp\uboot-socfpga\arch\arm\cpu\armv7\socfpga\sdram.c,第336行改成rule.portmask = 0x0; 第346行改成writel(0x0, (SOCFPGA_SDR_ADDRESS + regoffs));

土豆 发表于 2018-3-27 10:21:57

这个bug困扰我2周。。。希望骏龙能多多更新这种信息。
页: [1]
查看完整版本: SoC 15.0版本下preloader和uboot源码的两个bug