二、PCI总线命令

    技术2022-07-11  108

    1、总线命令

    总线命令的作用是用来规定主、从设备之间的传输类型,它出现于地址期的C/BE[3..0]#线上。这里的主设备是指通过仲裁而获得总线控制权的设备;从设备是指在C/BE[3..0]#上出现命令的同时,被AD[31..0]线上的地址所选中的设备。

    1.1、总线命令编码

    下表给出了总线命令的编码及类型说明。其中,命令编码中的“1”表示高电平,“0”表示低电平。

    C/BE[3..0]#命令类型说明0 0 0 0中断应答(中断识别)0 0 0 1特殊周期0 0 1 0I/O读(从I/O口地址张读数据)0 0 1 1I/O写(从I/O地址空间写数据)0 1 0 0保留0 1 0 1保留0 1 1 0存储器读(从内存空间映像中读数据)0 1 1 1存储器写(向内存空间映像中写数据)1 0 0 0保留1 0 0 1保留1 0 1 0配置读1 0 1 1配置写1 1 0 0存储器多行读1 1 0 1双地址周期1 1 1 0存储器一行读1 1 1 1存储器写并无效

    下面对各条命令作较为详细的说明。

    1、中断应答命令

    中断应答命令是一个读命令,并且对中断控制器的寻址采用隐含方式,也就是说,该地址是逻辑地址而不明显出现于地址期,回送的中断矢量的长度由字节使能信号来表示。如下图所示,途中互相指着对方尾部的两个小箭头表示过度周期,该周期的设定,是为了避免当一个设备停止驱动该信号而两一个设备开始驱动时可能发生的冲突。

    上图说明了一个X86的中断应答在PCI总线上进行的情况。这仅作为一个例子,其中的字节使能是单一字节。一般情况下,字节使能信号用来确定哪些字节是传输中要设计的。从图中可以看出,在地址期,尽管AD[31..0]中不含有有效地址,但必须将它们驱动到稳定状态。在中断应答过程中,PAR信号是有效的,而且别用来进行奇偶校验。对中断应答命令的响应只能是一个设备,并且响应的设别必须发出响应的DEVSEL#信号,同时在TRDY#信号有效时必须返回中断向量。另外中断应答周期于其它周期一样可插入等待周期。

    由于PCI总线中的中断应答采用的是单个周期,这与传统的8259双周期的应答是不同的,因此在桥路应把处理机的双周期格式变换成PCI上的单次格式,这只要将处理机上送出的第一个中断应答请求丢掉即可。

    2、特殊周期命令

    该命令的作用是为PCI提供一个简单的信息广播机制。它不但能报告处理机的状态,而且可用来作为PCI设备间逻辑的侧面连接信号(当这些信号不要求精确的时间关系或物理信号同步时)。

    特殊周期命令不包含目标地址,而是以广播的形式发给所有设备。每个接收设备必须自我确定广播的消息是否适合于它。在特殊周期命令期,不允许PCI设备发出DEVSEL#信号。也就是说,此类对话不需要目标设备的应答,同时负责译码的桥也不能将特殊周期命令传到它的下级总线上,更不能跨桥传播特殊周期命令。

    一个特殊命令周期可以包含可选的由消息决定的数据,它不是由PCI序列器来解释,而是根据需要传给与PCI序列器相连的应用硬件。在大多数情况下,显式的寻址信息时由PCI总线上的三种物理地址空间之一来处理,而不是用特殊周期命令。

    特殊周期命令也像其它总线命令一样,具有一个地址期和一个数据期。地址期开始于FRAME#信号的建立,结束于FRAME#和IRDY#信号的同时撤销。该命令与其它总线命令的唯一区别就是没有目标设备响应信号DEVSEL#。

    该命令在地址期除了命令字外不含其它有效信息,也没有地址信息,但是,AD[31..0]要驱动到稳定的电平,并产生奇偶检验位。在数据期,AD[31..0]山更罕有消息类型和一个可选的数据字段,消息用AD[15..0]这低16位编码表示,可选的数据字段用AD[31..16]这高16位编码表示,但高16位并非所有消息都需要。在特殊周期内无固定的从设备。消息和数据仅在IRDY#有效后的第一个时钟内有效,以后数据期中所含信息及时序关系由消息来决定。

    在地址期中,当C/BE[3..0]# = 0001时,表示时特殊周期命令,而AD[31..0]被驱动位随机值且忽略不计。在数据期,C/BE[3..0]#要有效,而AD[31..0]各位的情况如下:

    1)当AD[15..0] = 0000H时为SHUTDOWN;

    2)当AD[15..0] = 0001H时为HALT;

    3)当AD[15..0] = 0002H时为X86有关消息;

    4)当AD[15..0] = 0003H~FFFH保留;

    5)而AD[31..16]含有消息所决定的可选数据字段。

    PCI总线定序器启动该命令的方式与其它命令相同,但终止该命令要由主设备完成。当从设备得到主设备的终止信息时,就知道一次访问已文成。在这种情况下,配置空间的状态寄存器的“接收主设备终止位”不能置1。特殊周期命令的完成最快也要5个时钟周期,同时还要附加一个时钟周期作为下一个访问开始之前的过度周期。

    3、I/O读命令

    该命令用来从一个映射到I/O地址i空间的设备中读取数据。AD[31..0]上提供一个字节地址,全部32位必须完全译码;而字节使能信号表示传送数的多少,必须与字节地址一致。

    4、保留命令

    该类编码是为将来的用途而保留的。PCI的任何设备都不能将它们挪作它用,任何设备也不允许对保留命令编码作出反应。如果接口中使用了一条保留命令,通常要由主设备终止操作来结束本此访问。

    5、I/O写命令

    该命令用来向一个映射到I/O地址空间的设备写入数据。全部32位地址必须参加译码,字节使能信号表示数据长度,且必须和字节地址一致。

    6、存储器读命令

    该命令用来从一个映射到存储器地址空间的设备读取数据。如果能保证无副作用产生时,从设备可以位该命令进行预先读取。另外,目标设备也要保证在本次PCI传输之后保存于临时缓冲器中的数的一致性(包括数据次序)。这个缓冲器在任何同步事件(如更新I/O状态寄存器或存储器标志)通过此访问通路之前必须被置为无效。

    7、存储器写命令

    该命令用来向一个映射到存储器空间的设备写入数据。当从设备发出“准备好”信号后,它已经准备对所设计的数据的一致性(包括次序)负责。因此,对于该命令的实现可采用完全同步的方式,或采用其它方法。但应保证任何同步事件通过该访问路径之前使数据缓冲区被冲洗。也就是说,主设备在使用了该命令之后可以立即创造一个同步事件。

    8、配置读命令

    该命令用来从每个设备的配置空间读取数据。如果一个设备的IDESEL引脚有效,且AD[1..0] = 00时,那么该设备即被选定位配置读命令的目标。在一个配置命令的地址期内,AD[4..2]用于从每个设备的配置空间中的64个双字寄存器中选出一个。AD[31..11]无意义,AD[10..8]表示一个多功能设备的哪个功能设备被选中。

    9、配置写命令

    该命令用来向每个设备的配置空间写入数据。一个设备被选中的条件是:它的IDSEL信号有效且AD[1..0] = 00。其余和配置读命令相同。

    10、存储器多行读命令

    该命令的作用是试图在主设备断开连接之前预读取多行Cache数据。存储器控制器应保证,只要FRAME#有效,就连续不断的以流水方式发存储器请求。该命令预定用于大块连续数据的传输,如果一个对软件透明的缓冲器来暂存数据的话,通过顺序地预读一个附件的Cache行,可使存储器系统得到某些性能上的改善。

    11、双地址周期(DAC)命令

    该命令用来给支持64位寻址的设备发送64位地址。发送过程需要两个时钟周期。对于只有32位寻址能力设备,不得以任何方式对该命令作出反应,只能把它当作保留命令。

    12、存储器一行读命令

    该命令与存储器读命令基本相同,不同之处在于它还表示主设备试图完成多于两个32位的PCI数据期。此命令也预定用于大块连续数据的传输。这样存储器系统的性能会得到一些改进,道理是响应一次请求不仅仅完成一个存储器的读周期,而是一直读到一个Cache的行边界。和存储器读命令的情形一样,预取缓冲器必须在任何同步事件通过访问通路之前变为无效。

    13、存储器写并无效命令

    该命令在语义上与存储器写命令相同,不同点是它要保证最小的传输量是一个告诉缓存(Cache)的行,也就是说,主设备要在一次PCI传输中将寻址的Cache行每个字节都写入。如果要传输下一行的所有字节,允许主设备跨边界写入。该命令同时要求主设备的配置寄存器指出Cache行的尺寸。存储器写并无效命令也是保证Cache一致性的措施。

    1.2、命令使用规则 

    配置读命令和配置写命令要求所有的PCI设备都以目标设备的形式给予响应,其它所有命令都为可选项。再PCI总线上执行I/O读命令时,应保证其执行顺序。CPI上的设备应具有可在定位功能或寄存器,以便通过配置寄存器将它们映射到存储器空间,所有的主、从设备都可根据需要来实现选项命令。但是,某个设备实现了基本的存储器命令,那么,它就必须支持所有的存储器命令,否则,就必须利用别名将这些为优化性能而设的命令(存储器一行读、存储器多行读及存储器写并无效命令)转变为基本的存储器命令。例如,一个从设备可以不实现存储器一行读命令,但是它必须能接受该命令的请求,并按存储器读命令来处理。同理,一个从设备可以不实现存储器写并无效命令,但它必须能接受该命令的请求,并按存储器写命令来处理。

    对于系统存储器的块数据读写,建议在主设备支持的情况下尽量采用存储器写并无效命令和存储器行读命令。如果主设备确实不能支持上述优化性能的命令,可采用存储器读写命令。

    对于使用存储器读命令的主设备,所有命令都可进行任何长度的访问,但最好遵循下述用法原则。尽管存储器写并无效命令的实现,要求具有Cache行长度寄存器,但存储器读命令最好也使用它。下面是在有和没有行长度寄存器情况下的用法建议:

    1)具有Cache行长度寄存器时

    存储器读命令用来读半行或更少;存储器一行读用来读取半行以上到三行;存储器多行用来读取三行以上。

    2)无Cache行长度寄存器时

    存储器读命令用于1~2次的数据突然传输;存储器一行读用于3~12次的数据突发传输;存储器多行读命令用于13次或更多数据的突发传输。

     

    Processed: 0.012, SQL: 9