Freescale p1020& pcie
网上有很多讲pcie控制器的文章,然而结合一款处理器并且结合一个设备一起来讲的文章很少,现在我将结合p1020和pcie接口sata控制器sil3132从软件的角度来诉说pcie控制器如何操作的。U-boot和linux是我们学习一款处理器和驱动很好的软件,关键大家要有耐心认真阅读。下面我会先从u-boot来讲,我们知道u-boot里面的驱动都是不带中断的,各个接口的读写操作都是轮训,但是却是我们学习各个接口基础操作很棒的软件。接下来也会介绍linux下关于pcie的软件,并且会介绍pcie设备的驱动的pci_bus机制和设备驱动的编写,大家知道在进行pcie或者usb操作前,都需要对下面的设备进行枚举,我会把pcie介绍完,再介绍关于p1020&ehciusb2.0。虽然是介绍的p1020这款powerpc处理器上面的pcie,但是这些外设比如pcie,usb,spi,i2c在freescale处理器包括arm平台,他们的寄存器操作都是差不多的,这些外设驱动的处理也是差不多的,所以有很大的一致性,希望大家多多关注我的博文。我会每周更新一遍。
下面我会进行一些必要的与软件驱动编写有关的一些硬件结构。如下图是pcie一个lane
的示意图,一个lane(数据链路)由两组差分信号组成,tx和rx,一个lane就是X1,pcie有X1,X2,X4,X8,X16,X32宽度的数据链路,p1020的SerDes有4个lane可以配置成一个pcie(x4)或者2个pcie(x1)和两个sgmll(串行千兆以太网接口)或者1个pcie(x2)和两个sgmll。Freescale的p1020rdb_pd这块开发包是把serdes配置成两个pcie(x1)一个连接了sata控制器sil3132另一个做成接口可以供用户插拔。P1020的pcie控制器的版本是v1.a,这个版本的pcie要求总线频率1.25GHZ,单lane带宽是2.5GT/s和serdes是一致的。
在介绍pcie控制器如何访问pcie设备的配置空间前,先介绍下储存器域和pcie总线域这个概念。储存器域包括的是e500v2的4G(0x0-0xffffffff)或者64G(0x0-0xfffffffff,使能的情况默认是32位地址),当处理器访问pcie设备时,首先访问的是这个设备在储存器域上的pcie设备空间,之后rc把这个储存器域的pcie总线地址转换成pcie总线域的物理地址。
配置pcie设备的配置空间是通过p1020的pcie控制的CFG_ADDR和CFG_DATA这两个寄存器。CFG_ADDR各个字段的详细说明:
Enable位。当这个位为1时,rc主桥是能对pcie设备配置空间的访问
BusNumber字段记录pcie设备所在的总线号。
DeviceNumber字段记录pcie设备的设备号
Fuction Number字段记录pcie设备的功能号。
Register Number字段记录pcie设备的配置寄存器号。
Pcie设备的配置空间网上有很多介绍请大家自行baidu。
P1020处理器使用ATMU寄存器组进行储存器到pcie总线域,以及pci总线域到储存器域的地址映射。ATMU寄存器组由两大寄存器组成,分别为Outbound和Inbound寄存器组,其中Outbound寄存器组将储存器域的地址转换成pcie总线域的地址,而Inbound寄存器组将pcie总线域的地址转换成储存器域的地址。
Outbound寄存器
1 POTARn和POTEARn寄存器
这两个寄存器保存当前Outbound窗口在PCIe总线域中的64位地址空间。
2 POWARn和POWARn寄存器
这两个寄存器保存当前Outbound窗口在储存器域中的36位地址空间的基地址。
P1020处理器使用Outbound寄存器组访问pcie总线地址空间的步骤如下:
1. 首先p1020需要将程序使用的有效地址转化成41位的虚拟地址,E500 V2内核是不能关闭mmu的,因此不能直接访问物理地址。
2. p1020处理器通过mmu将41位虚拟地址转换成36位的物理地址,在E500V2内核中,物理地址是36位(缺省是32位,需要使能)。
3. 检查LAWBAR和LAWAR寄存器,判断当前36位的物理地址是否属于PCIE总线空间。
4. 判断当前的36位物理地址是否在POWBARn寄存器1-4描述的窗口中,如果在则将36位的处理器物理空间通过寄存器POTARn和POTEARn转换为64位的pcie总线地址,如果不在POWBARn寄存器1-4描述的窗口中,POWBAR0寄存器作为缺省窗口,接管这个储存器访问。
Inbound寄存器
1 PITARn和PITEARn寄存器
这两个寄存器保存当前Outbound窗口在储存器域中的36位地址空间的基地址。2 PIWARn和PIWARn寄存器
这两个寄存器保存当前Outbound窗口在PCIe总线域中的64位地址空间。
我们主要通过Outbound通过访问储存器域的地址读写pcie设备中的寄存器,而通过Inbound,设备可以访问储存器比如ddr。
接下来再说下p1020的pcie的中断机制
在p1020中有message中断也就是往MSIIR寄存器中写入数据就会引起p1020中断,如果pcie设备支持MSI机制,那么系统软件就可以设置MSI Capability结构的Message Address和Massge Data字段,其中Massage Address字段填写的是MSSIIR寄存器在pcie总线域中的物理地址,在powerpc处理器中,pcie设备使用MSIIR寄存器时,可以不使用Inboud寄存器组进行pcie总线地址到处理器地址的转换,在p1020处理器中,专门设置了一个PEXCSRBAR窗口,进行pcie总线域到储存器域的地址转换。
这周先介绍到这儿下周会结合u-boot代码对pcie设备的枚举和初始化进行介绍。下下周会结合pcie结合的sata硬盘控制器sil3132进行源代码解释并对硬盘进行读写。下下下周将结合linux代码对pcie设备的枚举和初始化进行介绍,下下下下周会进行在linux下pcie设备驱动的pci_bus的介绍和驱动的编写。接下来也会结合源代码介绍p1020的usb2.0。因为工作日需要上班所以更新的会比较慢,敬请关注!!!!