zoukankan      html  css  js  c++  java
  • PCI规范学习笔记

    以前看过一段时间Cyclone FPGA控制PEX8111的程序,没看懂,最近又结合PCI规范重新看了一下。

    PCI Speci rev2.3

      

    FRAME# is driven by the master to indicate the beginning and end of a

    transaction.

     

    IRDY# is driven by the master to indicate that it is ready to transfer data.

    TRDY# is driven by the target to indicate that it is ready to transfer data.

     

    IDSEL in Initialization Device Select is used as a chip select during

    configuration read and write transactions.

     

    STOP# s/t/s Stop indicates the current target is requesting the master to

    stop the current transaction.

     

    In all cases, data is only

    transferred when IRDY# and TRDY# are both asserted on the same rising clock edge.

     

    只有当IRDY# and TRDY#都有效时,数据才能传输。

     

    3.2.2. Addressing

     

     

    PCI targets (except host bus bridges) are required to implement Base Address register(s)

    to request a range of addresses which can be used to provide access to internal registers

    or functions (refer to Chapter 6 for more details). The configuration software uses the

    Base Address register to determine how much space a device requires in a given address

    space and then assigns (if possible) where in that space the device will reside.

    BAR确定一个设备需要多少空间。

     

     

    A

    device may map its internal register into both Memory Space and optionally I/O Space

    by using two Base Address registers, one for I/O and the other for Memory.

     

     

     

    When a transaction is initiated on the interface, each potential target compares the

    address with its Base Address register(s) to determine if it is the target of the current

    transaction. If it is the target, the device asserts DEVSEL# to claim the access. For

    more details about DEVSEL# generation, refer to Section 3.2.2.3.2. How a target

    completes address decode in each address space is discussed in the following sections.

    当一个交易初始后,每个潜在设备将自己的BAR与总线上的地址比较,来确定自己是不是当前交易的目标。

     

     

    3.2.2.1. I/O Space Decoding

    In the I/O Address Space, all 32 AD lines are used to provide a full byte address. The

    master that initiates an I/O transaction is required to ensure that AD[1::0] indicate the

    least significant valid byte for the transaction.

    The byte enables indicate the size of the transfer and the affected bytes within the

    DWORD and must be consistent with AD[1::0]. Table 3-1 lists the valid combinations

    for AD[1::0] and the byte enables for the initial data phase.

     

     

    3.2.2.2. Memory Space Decoding

    In the Memory Address Space, the AD[31::02] bus provides a DWORD aligned

    address. AD[1::0] are not part of the address decode. However, AD[1::0] indicate the

    order in which the master is requesting the data to be transferred.

     

     

    3.2.2.3. Configuration Space Decoding

    In the

    Configuration Address Space, each function is assigned a unique 256-byte space that is

    accessed differently than I/O or Memory Address Spaces.

     

     

     

    To support hierarchical PCI buses, two types of configuration transactions are used.

    They have the formats illustrated in Figure 3-1, which shows the interpretation of AD

    lines during the address phase of a configuration transaction.

    Type 1 and Type 0 configuration transactions are differentiated by the values on

    AD[1::0]. A Type 0 configuration transaction (when AD[1::0] = "00") is used to select

    a device on the bus where the transaction is being run. A Type 1 configuration

    transaction (when AD[1::0] = "01") is used to pass a configuration request to another

    bus segment.

     

     

    3.2.2.3.2. Software Generation of Configuration Transactions

    Two DWORD I/O locations are used to generate configuration transactions for PC-AT

    compatible systems. The first DWORD location (CF8h) references a read/write register

    that is named CONFIG_ADDRESS. The second DWORD address (CFCh) references a

    read/write register named CONFIG_DATA. The CONFIG_ADDRESS register is 32

    bits with the format shown in Figure 3-2. Bit 31 is an enable flag for determining when

    accesses to CONFIG_DATA are to be translated to configuration transactions on the PCI

    bus. Bits 30 to 24 are reserved, read-only, and must return 0's when read. Bits 23

    through 16 choose a specific PCI bus in the system. Bits 15 through 11 choose a specific

    device on the bus. Bits 10 through 8 choose a specific function in a device (if the device

    supports multiple functions). Bits 7 through 2 choose a DWORD in the device's

    Configuration Space. Bits 1 and 0 are read-only and must return 0's when read.

     

    Anytime a host bridge sees a full DWORD I/O write from the host to

    CONFIG_ADDRESS, the bridge must latch the data into its CONFIG_ADDRESS

    register. On full DWORD I/O reads to CONFIG_ADDRESS, the bridge must return the

    data in CONFIG_ADDRESS.

     

     

    配置空间的读写是通过读写两个IO端口实现的。

     

     

    3.2.2.3.4. Selection of a Device’s Configuration Space

    A single function device asserts DEVSEL# to claim a configuration transaction when:

    • a configuration command is decoded;

    • the device’s IDSEL is asserted; and

    • AD[1::0] is "00" (Type 0 Configuration Command) during the Address Phase.

     

     

     

    PCI系统的PC-AT系统,有2套总线系统,一套为PC-AT的总线,一套为PCI local bus的总线。

    PCIO端口CF8HCFCH写数据,是通过PC-AT的总线写入CONFIG_ADDRESSCONFIG_DATA的寄存器,然后PCI local bus根据CONFIG_ADDRESSCONFIG_DATA的寄存器的值,产生PCI local bus的时序,诸如ADCMBFRAME等。

     

    PCI配置空间有6BAR,这些BAR既提供大小又提供数据类型信息。

     

     

    if rst='0' then

                         basereg0<="11111111111111111111111100000001";

                  elsif rising_edge(clk) then

                         if (cfgwr='1' and base0='1' and wrsel='1') then

                                basereg0(31 downto 8)<=wrreg(31 downto 8);

                                basereg0(7 downto 0)<="00000001";

                         end if;

                  end if;

                  if rst='0' then

                         basereg1<="11111111110000000000000000000000";

                  elsif rising_edge(clk) then

                         if (cfgwr='1' and base1='1' and wrsel='1') then

                                basereg1(31 downto 22)<=wrreg(31 downto 22);

                                basereg1(21 downto 0)<="0000000000000000000000";

                         end if;

                  end if;

    以上代码是PCIE开发板代码。

    Base07-0位和Base121-0位是不能写的,PC机对其不能控制,第一位不是0的数的权值代表需要分配的大小。

    所以,IO space要求分配的大小为2^8=256 byteMemory space要求分配的大小为2^22=4M byte

     

     

    6.2.5. Base Addresses

    One of the most important functions for enabling superior configurability and ease of use

    is the ability to relocate PCI devices in the address spaces.

    可以把PCI设备地址重映射是PCI的一个优点之一。

     

    Power-up softwareBIOS?) needs to build a consistent address map before booting the machine to an operating system.

     

    The number of upper bits that a device actually implements depends on how much of the

    address space the device will respond to. A 32-bit register can be implemented to

    support a single memory size that is a power of 2 from 16 bytes to 2 GB.

    16 bytes to 2 GB.

    2^4=16byte~2^31=1GB,因为Memory0,1~2,3位有特殊意义。

    A device that wants a 1 MB memory address space (using a 32-bit base address register) would build the top 12 bits of the address register, hardwiring the other bits to 0.

    一个需要1MB内存地址空间的设备,需要将20~0bit,设为0,这样,可以提供2^21=1MB的空间。

    hardwiring the other bits to 0.在一个有FPGA的设备中,就可以这样实现。

    if rst='0' then

                         basereg0<="11111111111111111111111100000001";

                  elsif rising_edge(clk) then

                         if (cfgwr='1' and base0='1' and wrsel='1') then

                                basereg0(31 downto 8)<=wrreg(31 downto 8);

                                basereg0(7 downto 0)<="00000001";

                         end if;

                  end if;

     

    Power-up software can determine how much address space the device requires by

    writing a value of all 1's to the register and then reading the value back. The device will

    return 0's in all don't-care address bits, effectively specifying the address space required.

    Unimplemented Base Address registers are hardwired to zero.

    加电软件(BIOS)可以确定设备需要多少地址空间,通过,向寄存器所有位写1,然后回读,回读数据中,第一个为1的位置的权值,即为设备请求的空间的大小,因为其他位,设备将其硬件置为0FPGA实现)。

     

    Devices that map control functions into I/O Space must not consume more than 256

    bytes per I/O Base Address register. The upper 16 bits of the I/O Base Address register

    may be hardwired to zero for devices intended for 16-bit I/O systems, such as PC

    compatibles. However, a full 32-bit decode of I/O addresses must still be done.

    PCI设备的每个IO BAR消耗的空间不得大于256 byte

     

     

    Implementation Note: Sizing a 32-bit Base Address Register

    Example

    Decode (I/O or memory) of a register is disabled via the command register before sizing

    a Base Address register.

    在设置BAR之前,IOMemory空间的访问通过command寄存器被禁止了。

    Software saves the original value of the Base Address register,

    writes 0FFFFFFFFh to the register, then reads it back.

    软件(BIOS?)先保存原来的BAR的值,然后对BAR寄存器写0FFFFFFFFh,再读回寄存器的值。

    Size calculation can be done from

    the 32-bit value read by first clearing encoding information bits (bit 0 for I/O, bits 0-3

    for memory), inverting all 32 bits (logical NOT), then incrementing by 1. The resultant

    32-bit value is the memory/I/O range size decoded by the register.

    比如读回的是IO BAR(通过检查bit0),对编码信息清零(bit 0 for I/O, bits 0-3

    for memory),取反,加1,即为IO空间请求的大小。然后软件为其分配地址空间,然后重新写回该BAR,而该BARn位硬件置为0,所以,自动进行了对齐。

    Note that the upper

    16 bits of the result is ignored if the Base Address register is for I/O and bits 16-31

    returned zero upon read. The original value in the Base Address register is restored

    before re-enabling decode in the command register of the device.

     

     

    最小IO译码器,可以实现[31:2]的可写,PCI IO译码器的最小IO块为4

    最大IO译码器,可以实现[31:8]的可写,PCI IO译码器的最大IO块为256

     

     

  • 相关阅读:
    Python第二天 (数据类型,变量 )
    python第一天(安装运行python)
    Linux shell 整数运算 let [ ] (( )) expr以及 浮点数 bc用法(转)
    2018年3月大事件
    2018年2月大事件
    项目假设与制约因素
    调用微信红包接口,本地可以服务器不可以。 请求被中止: 未能创建 SSL/TLS 安全通道
    【转】AddMvcCore,AddControllers,AddControllersWithViews,AddRazorPages的区别
    sql server create table 给字段添加注释说明
    HttpContext.SignInAsync 失效(表面解决了问题,未深入到.net core 源码去找问题,记录一下,等有时间翻一下.net core 源码试试能不能找到根本原因)
  • 原文地址:https://www.cnblogs.com/yanhc/p/2175248.html
Copyright © 2011-2022 走看看