<!--Chapter 6 PCI-->
<sect>PCI<label id="chapter_pci">
<p>
<figure><ph vspace="1"><img src="./The-Linux-Kernel-images/penguin2.gif">
</figure>

<!--
Peripheral Component Interconnect (PCI), as its name implies is a standard that
describes how to connect the peripheral components of a system together in a
structured and controlled way. The standard describes the way that the system
components are electrically connected and the way that they should behave. This
chapter looks at how the Linux kernel initializes the system's PCI buses and
devices. 
-->
<p>PCI (Peripheral Component Interconnect)とは、その名前から分かるように、
周辺機器(peripheral)とシステムの接続方法について、構造と制御方法を解説した
規格である。この規格(<ref id="bibliography" 
name="[3, PCI Local Bus Specification]">)
では、システム上の機器を電気的に接続する方法と、それらが振る舞うべき方法とが
述べられている。この章では、Linux カーネルがシステムの PCI バスとデバイスを
初期化する方法について説明する。


<label id="figure6-1">
<!--                Figure 6.1: Example PCI Based System-->
<#if>
<figure><ph vspace="1"><img src="./The-Linux-Kernel-images/figure6-1.gif">
</figure>
</#if>
<#unless output="html">
<verb>
                            +-------------+
                            |             |
                            |     CPU     |
                            |             |
                            +------+------+
                                   |                     PCI Bus 0
---------+----------------+--------+--------+-----------------------
         |                |                 |
         |                |                 |          *
   +-----+-----+     +----+----+      +-----+-----+   /| Upstream
   |           |     |         |      |           |    |
   |  PCI-ISA  |     |         |      |  PCI-PCI  |    |
   |  Bridge   |     |         |      |  Bridge   |     
   |           |     +---------+      |           |    | Downstream
   +-----+-----+        Video         +-----+-----+    |
         |                                  |          |/
         |                                  |          *
         | ISA Bus                          |            PCI Bus 1
 ------+-+------------   ----------+--------+---------+-------------
       |                           |                  |
       |                           |                  |
  +----+----+                 +----+----+        +----+----+
  |         |                 |         |        |         |
  |         |                 |         |        |         |
  |         |                 |         |        |         |
  |         |                 |         |        |         |
  +---------+                 +---------+        +---------+
 Super I/O Controller            SCSI              Ethernet
</verb>
</#if>
<p>図表(6.1) PCI バスシステムの例


<!--
Figure  6.1 is a logical diagram of an example PCI based system. The PCI buses
and PCI-PCI bridges are the glue connecting the system components together;
the CPU is connected to PCI bus 0, the primary PCI bus as is the video device.
A special PCI device, a PCI-PCI bridge connects the primary bus to the 
secondary PCI bus, PCI bus 1. In the jargon of the PCI specification, PCI bus 
1 is described as being downstream of the PCI-PCI bridge and PCI bus 0 is 
up-stream of the bridge. Connected to the secondary PCI bus are the SCSI and 
ethernet devices for the system. Physically the bridge, secondary PCI bus and 
two devices would all be contained on the same combination PCI card. The 
PCI-ISA bridge in the system supports older, legacy ISA devices and the 
diagram shows a super I/O controller chip, which controls the keyboard, mouse 
and floppy. 1 
-->
<p>図表(6.1) では、PCI ベースのシステム例を論理的なダイアグラムで示している。
PCI バスと PCI-PCI ブリッジとは、システム機器を相互に接続する仕組み(glue)で
ある。
CPU は、ビデオデバイスと一緒にプライマリ PCI バスである PCI Bus 0 に接続され
ている。特別な PCI デバイスである PCI-PCI ブリッジが、プライマリバスを
セカンダリ PCI バスである PCI Bus 1 に接続している。PCI 規格の専門用語では、
PCI bus 1 は、PCI-PCI ブリッジの下流(downstream)であり、PCI Bus 0 は PCI-PCI 
ブリッジの上流(up-stream)である。
セカンダリ PCI バスには、システムの SCSI とイーサネットデバイスが接続されてい
る。物理的には、ブリッジとセカンダリ PCI バスとふたつのデバイスは、これらが
組み合わされ、同じ PCI カード上にすべて含まれている。
システムの PCI-ISA ブリッジは、旧弊な遺物たる ISA デバイスをサポートするもの
である。またこのダイアグラムでは、Super I/O チップコントローラが示されている
が、これはキーボードやマウス、フロッピーを制御するコントローラである。 
<ref id="chapter_pci_fn" name="(脚注1)">

<!--6.1  PCI Address Spaces-->
<sect1>PCI アドレス空間<label id="chapter_pci_sect1">

<!--
The CPU and the PCI devices need to access memory that is shared between
them. This memory is used by device drivers to control the PCI devices and to
pass information between them. Typically the shared memory contains control
and status registers for the device. These registers are used to control the 
device and to read its status. For example, the PCI SCSI device driver would 
read its status register to find out if the SCSI device was ready to write a 
block of information to the SCSI disk. Or it might write to the control 
register to start the device running after it has been turned on. 
-->
<p>CPU と PCI デバイスとは、両者で共有されたメモリにアクセスする必要がある。
そのメモリは、デバイスドライバが PCI デバイスを制御したり、それらの
間で情報をやり取りするために使用される。通常その共有メモリには、デバイスの
コントロールレジスタやステータスレジスタの情報が含まれる。それらのレジス
タ情報は、デバイスを制御し、その状態を読みとるために利用される。たとえば、PCI 
上の SCSI デバイス (コントローラ) 用のデバイスドライバは、そのステータスレジ
スタを読んで、SCSI デバイスが 
SCSI ディスクに情報ブロックを書き込む準備が出来ているかを調べる。あるいは、
デバイスに電源が入った後、デバイスドライバは、デバイスを起動するために
コントロールレジスタに書き込みをしたりする。

<!--
The CPU's system memory could be used for this shared memory but if it were,
then every time a PCI device accessed memory, the CPU would have to stall,
waiting for the PCI device to finish. Access to memory is generally limited to
one system component at a time. This would slow the system down. It is also 
not a good idea to allow the system's peripheral devices to access main memory
in an uncontrolled way. This would be very dangerous; a rogue device could 
make the system very unstable. 
-->
<p>CPU のシステムメモリをこの共有メモリの代わりに使用することもできるが、
そうしたことがなされると、PCI デバイスがメモリにアクセスするたびに、CPU は
一時停止し、PCI デバイスがメモリの使用を終えるまで待たなければならなくなる。
メモリへのアクセスも、通常、一度にひとつのシステム機器だけに限られる。
したがって、その場合、システムの処理速度が遅くなる。
また、適切な管理方法のないままシステムの周辺機器にメインメモリへのアクセスを
許すことは、よい考えとはいえない。それは非常に危険な場合がある。悪質なデバイス
がシステムを不安定にするからである。

<!--
Peripheral devices have their own memory spaces. The CPU can access these
spaces but access by the devices into the system's memory is very strictly
controlled using DMA (Direct Memory Access) channels. ISA devices have
access to two address spaces, ISA I/O (Input/Output) and ISA memory. PCI has
three; PCI I/O, PCI Memory and PCI Configuration space. All of these address
spaces are also accessible by the CPU with the the PCI I/O and PCI Memory
address spaces being used by the device drivers and the PCI Configuration space
being used by the PCI initialization code within the Linux kernel. 
-->
<p>周辺機器は独自のメモリ空間を持っていて、CPU はそれらの空間へアクセスできる。
しかし、デバイス側からのシステムメモリへのアクセスは、DMA(Direct Memory Access)
チャンネルを使用して厳しく制御される。ISA デバイスは、ISA I/O(Input/Output)空間
と ISA メモリ空間のふたつのアドレス空間へアクセスできる。PCI には三つあり、PCI 
I/O 空間と PCI メモリ空間、PCI コンフィグレーション空間(configuration space)
へアクセスできる。
これらすべてのアドレス空間は CPU からもアクセス可能である。その際、CPU は、
デバイスドライバを使って PCI I/O 空間と PCI メモリ空間へアクセスし、Linux 
カーネル内の PCI 初期化コードを使って PCI コンフィグレーション空間へアクセス
する。

<!--
The Alpha AXP processor does not have natural access to addresses spaces
other than the system address space. It uses support chipsets to access other
address spaces such as PCI Configuration space. It uses a sparse address
mapping scheme which steals part of the large virtual address space and maps it
 to the PCI address spaces. 
-->
<p>Alpha AXP プロセッサは、本来、システムアドレス空間以外のアドレス空間へは
アクセスできない。それゆえ、Alpha AXP プロセッサは、サポートチップを使用して、
PCI コンフィグレーション空間等の他のアドレス空間にアクセスしている。サポート
チップは、スパースアドレスマッピングスキーム(<ref id="sparse" 
name="sparse address mapping scheme">)を使用して、巨大な仮想アドレス空間の一部
を使い、それを PCI アドレス空間にマップしている。

<!--6.2  PCI Configuration Headers-->
<sect1>PCI コンフィグレーションヘッダ<label id="chapter_pci_sect2">
<p>

<label id="figure6-2">
<!--               Figure 6.2: The PCI Configuration Header-->
<#if output="html">
<figure><ph vspace="1"><img src="./The-Linux-Kernel-images/figure6-2.gif">
</figure>
</#if>
<#unless output="html">
<verb>
31            16 15            0
+---------------+--------------+
|  デバイス ID  |  ベンダ ID   |00h
|---------------+--------------|
|  ステータス   |   コマンド   |04h
|---------------+------+-------|
|   クラスコード       |       |08h
|-------+-------+------+-------|
|       |       |      |       |10h
|-------+-------+------+-------|
|                              |
|                              |
|                              |
|   ベースアドレスレジスタ     |
|                              |
|                              |
|                              |24h
|------------------------------|
|                              |
|                              |
|                              |
|                              |
|                              |
|                              |
|                              |
|                              |
|                              |
|                              |
|                              |
|---------------+------+-------|
|               | Line |  Pin  |3Ch
+---------------+------+-------+
</verb>
</#if>
<p>図表(6.2) PCI コンフィグレーションヘッダ


<!--
Every PCI device in the system, including the PCI-PCI bridges has a
configuration data structure that is somewhere in the PCI configuration address
space. The PCI Configuration header allows the system to identify and control
the device. Exactly where the header is in the PCI Configuration address space
depends on where in the PCI topology that device is. For example, a PCI video
card plugged into one PCI slot on the PC motherboard will have its 
configuration header at one location and if it is plugged into another PCI 
slot then its header will appear in another location in PCI Configuration 
memory. This does not matter, for wherever the PCI devices and bridges are the
system will find and configure them using the status and configuration 
registers in their configuration headers. 
-->
<p>PCI-PCI ブリッジを含むシステム上のすべての PCI デバイスは、PCI コンフィグ
レーションアドレス空間内に設定用のデータ構造を保持している。
システムは、PCI コンフィグレーションヘッダ(PCI configuration header)を使用する
ことで、デバイスを識別し制御している。
PCI コンフィグレーションアドレス空間内における
ヘッダの正確な位置は、そのデバイスが PCI トポロジーのどこに位置するかに依存す
る。たとえば、PC のマザーボード上のある PCI スロットに差された PCI ビデオ
カードは、そのスロット番号の位置にコンフィグレーションヘッダを持つことになり、
違うスロットに差されていれば、そのヘッダは、PCI コンフィグレーションアドレス
空間の違うメモリ位置にあることになる。
しかし、そうした位置は問題ではない。というのも、PCI デバイスやブリッジが
どこにある場合でも、システムは、それらのコンフィグレーションヘッダ内のステータ
スレジスタとコンフィグレーションレジスタ(configuration register)を使用して、
デバイスを検出し、設定するからである。

<!--
Typically, systems are designed so that every PCI slot has it's PCI 
Configuration Header in an offset that is related to its slot on the board. 
So, for example, the first slot on the board might have its PCI Configuration 
at offset 0 and the second slot at offset 256 (all headers are the same 
length, 256 bytes) and so on. A system specific hardware mechanism is defined 
so that the PCI configuration code can attempt to examine all possible PCI 
Configuration Headers for a given PCI bus and know which devices are present 
and which devices are absent simply by trying to read one of the fields in the
header (usually the Vendor Identification field) and getting some sort of 
error. The (PS 版で規格書が参照されている)describes one possible error message
as returning 0xFFFFFFFF when 
attempting to read the Vendor Identification and Device Identification fields 
for an empty PCI slot. 
-->
<p>一般的に言って、システムは、すべての PCI スロットが、ボード上のスロットの
場所に関連したオフセット位置に PCI コンフィグレーションヘッダを持つように設計
されている。
したがって、たとえば、ボードの最初のスロットは PCI コンフィグレーションアドレス
空間をオフセット 0 の位置に持ち、二つ目のスロットはオフセット 256 の位置に
持つ。(ヘッダは、256 バイトのコンフィグレーション空間のなかで、先頭 64 バイトを
占めている。) そしてこれ以降のスロットについても同様にそれぞれの場所が決められ
ている。
システム固有のハードウェアのメカニズムを設計する場合、PCI 設定コードが、
すべての PCI バス上にあるすべての PCI コンフィグレーションヘッダを調べることが
でき、その際に、ヘッダのフィールド(通常はベンダ識別フィールド)を読み込むことで
エラーが取得されるかどうかによって、デバイスがそのバス上にあるのかどうかを確認
できるように設計されなければならない。
規格書(<ref id="bibliography" name="参考文献 3">)では、空の PCI スロットのベ
ンダ ID とデバイス ID を読み取ろうとしたときは、0xFFFFFFFF というエラー
メッセージだけしか返してはいけないことが記述されている。

<!--
Figure  6.2 shows the layout of the 256 byte PCI configuration header. It 
contains the following fields: 
-->
<p><ref id="figure6-2" name="図表(6.2)">では、256 バイトある PCI コンフィグレー
ションヘッダのレイアウトが示されている。それには、次のようなフィールドが含ま
れる。
<newline>[see: <htmlurl 
url="./The-Linux-Kernel-images/linux/include/linux/pci.h" 
name="include/linux/pic.h">]<newline>
<descrip>
<!--
Vendor Identification
      A unique number describing the originator of the PCI device. Digital's
      PCI Vendor Identification is 0x1011 and Intel's is 0x8086. 
-->
<tag>ベンダ ID (Vendor Identification)</tag>
その PCI デバイスの製造会社を示す固有の数字である。DEC の PCI ベンダ ID は、
0x1011 であり、Intel は、0x8086 である。

<!--
Device Identification
      A unique number describing the device itself. For example, Digital's
      21141 fast ethernet device has a device identification of 0x0009. 
-->
<tag>デバイス ID (device Identification)</tag>
デバイスそのものを示す固有の数字。たとえば、DEC の 21141 ファストイーサネット
デバイスは、デバイス ID として 0x0009 を持っている。

<!--
Status This field gives the status of the device with the meaning of the bits 
      of this field set by the standard. . 
-->
<tag>ステータス (Status)</tag>
このフィールドは、規格上定められた意味を持つビットによって、デバイスの状態
(status)を表すものである。(<ref id="bibliography" name="参考文献 3">)

<!--
Command
      By writing to this field the system controls the device, for example
      allowing the device to access PCI I/O memory, 
-->
<tag>コマンド (Command)</tag>
このフィールドに書き込むことで、システムはデバイスを制御する。たとえば、デバイ
スに PCI I/O メモリへのアクセスを許すなど。

<!--
Class Code
      This identifies the type of device that this is. There are standard 
      classes for every sort of device; video, SCSI and so on. The class code 
      for SCSI is 0x0100. 
-->
<tag>クラスコード (Class Code)</tag>
これは、そのデバイスのタイプを特定するものである。ビデオ、SCSI など、すべての
種類のデバイスには、規格上のクラスがある。SCSI のクラスコードは 0x0100 である。

<!--
Base Address Registers
      These registers are used to determine and allocate the type, amount and
      location of PCI I/O and PCI memory space that the device can use. 
-->
<tag>ベースアドレスレジスタ (Base Address Register)</tag>
このレジスタは、デバイスが使用できる PC I/O 空間と PCI メモリ空間のタイプと
容量と位置とを決定し割り当てるために使用される。

<!--
Interrupt Pin
      Four of the physical pins on the PCI card carry interrupts from the card
      to the PCI bus. The standard labels these as A, B, C and D. The Interrupt
      Pin field describes which of these pins this PCI device uses. Generally 
      it is hardwired for a pariticular device. That is, every time the system
      boots, the device uses the same interrupt pin. This information allows 
      the interrupt handling subsystem to manage interrupts from this device, 
-->
<tag>割り込みピン (Interrupt Pin)</tag>
PCI カード上の 4 つの物理ピンが、カードから PCI バスへの割り込み信号を
伝えている。規格では、それらを A, B, C, D とラベル付けしている。割り込みピン
フィールドは、PCI デバイスがそれらのうちどのピンを使うかを記述している。
一般的には、それは特定のデバイスごとにハードウェア的に固定されている。
すなわち、システム起動のたびに、デバイスは同じ割り込みピンを使用するわけであ
る。この情報により、割り込み処理サブシステムはそのデバイスからの割り込みを管理
できる。

<!--
Interrupt Line
      The Interrupt Line field of the device's PCI Configuration header is used
      to pass an interrupt handle between the PCI initialisation code, the
      device's driver and Linux's interrupt handling subsystem. The number
      written there is meaningless to the the device driver but it allows the
      interrupt handler to correctly route an interrupt from the PCI device to
      the correct device driver's interrupt handling code within the Linux 
      operating system. See Chapter  interrupt-chapter on page  for details on
      how Linux handles interrupts. 
-->
<tag>割り込みライン (Interrupt Line)</tag>
デバイスの PCI コンフィグレーションヘッダ内の割り込みラインのフィールドは、 
PCI 初期化コードやデバイスドライバ、そして Linux の割り込み処理サブシステムの
間で割り込みハンドルをやり取りするために使用される。
このフィールドに書かれた番号は、デバイスドライバにとっては無意味である。
しかし、Linux オペレーティングシステム上で、割り込み処理ルーチンが、 PCI デバイ
スから発せられた割り込みシグナルを正しいデバイスドライバの割り込み処理コードへ
と手渡すために必要である。
Linux の割り込み処理の方法についての詳細は、<ref id="chapter_i" 
name="「割り込みと割り込み処理」">の章を参考にしてほしい。

</descrip>

<!--6.3  PCI I/O and PCI Memory Addresses-->
<sect1>PCI I/O と PCI メモリアドレス<label id="chapter_pci_sect3">

<!--
These two address spaces are used by the devices to communicate with their
device drivers running in the Linux kernel on the CPU. For example, the DECchip
21141 fast ethernet device maps its internal registers into PCI I/O space. Its
Linux device driver then reads and writes those registers to control the 
device. Video drivers typically use large amounts of PCI memory space to 
contain video information. 
-->
<p>PCI I/O 空間と PCI メモリ空間のふたつのアドレス空間は、デバイスが、
CPU 上で実行されている Linux カーネル内のデバイスドライバと通信をするために
使用される。
たとえば、DEC チップ 21141 ファーストイーサネットデバイスは、内部レジスタ情報
を PCI I/O 空間にマップする。デバイスドライバは、それらのレジスタを読み書きしな
がら、そのデバイスを制御する。ビデオドライバは、一般に巨大な PCI メモリ空間を
使用して、ビデオ情報を保持する。

<!--
Until the PCI system has been set up and the device's access to these address
spaces has been turned on using the Command field in the PCI Configuration
header, nothing can access them. It should be noted that only the PCI
configuration code reads and writes PCI configuration addresses; the Linux
device drivers only read and write PCI I/O and PCI memory addresses. 
-->
<p>PCI システムの設定が行われ、さらに PCI コンフィグレーションヘッダ内のコマン
ドフィールドを使用して、デバイスの PCI I/O と PCI メモリアドレス空間へのアクセ
スが有効と設定されて、初めてそれらのアドレス空間へのアクセスが可能になる。
注意すべきなのは、PCI 設定コードだけが PCI コンフィグレーションアドレス空間に
対する読み書きができるということである。Linux デバイスドライバは、PCI I/O と 
PCI メモリアドレス空間に対してだけしか読み書きできない。

<!--6.4  PCI-ISA Bridges-->
<sect1>PCI-ISA ブリッジ<label id="chapter_pci_sect4">

<!--
These bridges support legacy ISA devices by translating PCI I/O and PCI
Memory space accesses into ISA I/O and ISA Memory accesses. A lot of
systems now sold contain several ISA bus slots and several PCI bus slots. Over
time the need for this backwards compatibility will dwindle and PCI only 
systems will be sold. Where in the ISA address spaces (I/O and Memory) the ISA
devices of the system have their registers was fixed in the dim mists of time 
by the early Intel 8080 based PCs. Even a $5000 Alpha AXP based computer
systems will have its ISA floppy controller at the same place in ISA I/O space
as the first IBM PC. The PCI specification copes with this by reserving the 
lower regions of the PCI I/O and PCI Memory address spaces for use by the ISA
peripherals in the system and using a single PCI-ISA bridge to translate any 
PCI memory accesses to those regions into ISA accesses. 
-->
<p>PCI-ISA ブリッジは、PCI I/O 空間と PCI メモリ空間へのアクセスを ISA I/O 空間
と ISA メモリ空間へのアクセスに変換することで、古い ISA デバイスをサポートして
いる。現在販売されている多くのシステムには ISA スロットと PCI スロットの両方が
いくつか付属している。しばらくすれば、この下位互換性の必要は減少して、PCI のみ
のシステムが販売されるだろう。
システムの ISA デバイスが ISA アドレス空間(I/O 空間とメモリ空間)内でレジスタを
保持している場所は、今では遠い昔となっている初期の Intel 8088 ベースの PC 時代
からずっと固定されたままである。5000 ドルの Alpha AXP ベースのコンピュータ
システムでさえ、ISA フロッピーコントローラが置かれる ISA I/O 空間内の位置は、
初期の IBM PC と同じである。PCI の仕様では、それに対処するために、PCI I/O と 
PCI メモリアドレス空間の下位アドレス領域をシステムの ISA 周辺機器用に予約し、
単一の PCI-ISA ブリッジを使用してそれらの領域にある PCI メモリ空間へのアクセス
を ISA メモリ空間へのアクセスに変換している。

<!--6.5  PCI-PCI Bridges-->
<sect1>PCI-PCI ブリッジ<label id="chapter_pci_sect5">

<!--
PCI-PCI bridges are special PCI devices that glue the PCI buses of the system
together. Simple systems have a single PCI bus but there is an electrical 
limit on the number of PCI devices that a single PCI bus can support. Using 
PCI-PCI bridges to add more PCI buses allows the system to support many more 
PCI devices. This is particularly important for a high performance server. Of 
course, Linux fully supports the use of PCI-PCI bridges. 
-->
<p>PCI-PCI ブリッジは、システム上にある複数の PCI バスを結合するための特別な 
PCI デバイスである。シンプルなシステムは、単一の PCI バスしか持たないが、単一
の PCI バスでサポートできる PCI デバイスの数には電気的な制限がある。PCI-PCI 
ブリッジを使用して多くの PCI バスを加えれば、システムは、より多くの PCI 
デバイスをサポートできる。これは、高いパフォーマンスを要求されるサーバの場合
特に重要である。もちろん、Linux は、PCI-PCI ブリッジを完全にサポートしている。

<!--6.5.1  PCI-PCI Bridges: PCI I/O and PCI Memory Windows-->
<sect2>PCI-PCI ブリッジ: PCI I/O と PCI メモリウィンドウ<label 
id="chapter_pci_sect5-1">

<!--
PCI-PCI bridges only pass a subset of PCI I/O and PCI memory read and write
requests downstream. For example, in Figure  6.1 on page pageref, 
(on page pageref は、PS 版では、on page 62 であり、図表の場所を指示もの)
the PCI-PCI
bridge will only pass read and write addresses from PCI bus 0 to PCI bus 1 if
they are for PCI I/O or PCI memory addresses owned by either the SCSI or
ethernet device; all other PCI I/O and memory addresses are ignored. This
filtering stops addresses propogating needlessly throughout the system. To do
this, the PCI-PCI bridges must be programmed with a base and limit for PCI I/O
and PCI Memory space access that they have to pass from their primary bus
onto their secondary bus. Once the PCI-PCI Bridges in a system have been
configured then so long as the Linux device drivers only access PCI I/O and PCI
Memory space via these windows, the PCI-PCI Bridges are invisible. This is an
important feature that makes life easier for Linux PCI device driver writers.
However, it also makes PCI-PCI bridges somewhat tricky for Linux to configure
as we shall see later on. 
-->
<p>PCI-PCI ブリッジは、PCI I/O 空間と PCI メモリ空間に対する読み書きのリクエス
トのサブセットを下流領域(downstream)のバスに渡すだけである。
たとえば、<ref id="figure6-1"  name="図表(6.1)">では、
PCI-PCI ブリッジは、読み出しと書き込みのアドレスが、SCSI かイーサネットが所有
する PCI I/O アドレス空間か PCI メモリアドレス空間へのものであるならば、その
アドレスを PCI バス 0 から、PCI バス 1 に渡すだけである。それ以外の PCI I/O 
アドレス空間と PCI メモリアドレス空間に関するアドレスはすべて無視される。
このフィルタリングによって、アドレスが不必要にシステム全体に流れるのを防いで
いる。これを実現するためには、PCI-PCI ブリッジは、プライマリバスからセカンダリ
バスに渡す必要のある PCI I/O 空間と PCI メモリ空間のベースアドレスとその上限の
アドレスとをプログラムされていなければならない。
システム上の PCI-PCI ブリッジの設定が完了すると、Linux デバイスドライバが 
PCI I/O 空間と PCI メモリ空間に上記の範囲内でアクセスする限り、デバイスドライ
バからは、PCI-PCI ブリッジが見えなくなる。これは、Linux の PCI デバイスドライバ
の作者にとっては、ドライバの作成が少し楽になるという点で非常に重要な機能で
ある。しかし、これは、Linux からすると、後に述べるように PCI-PCI ブリッジの設
定をややトリッキーにする機能でもある。


<!--6.5.2  PCI-PCI Bridges: PCI Configuration Cycles and PCI Bus Numbering-->
<sect2>PCI-PCI ブリッジ: PCI コンフィグレーションサイクルと PCI バスの番号付け
<label 
id="chapter_pci_sect5-2">
<p>

<label id="figure6-3">
<!--          Figure 6.3: Type 0 PCI Configuration Cycle-->
<#if output="html">
<figure><ph vspace="1"><img src="./The-Linux-Kernel-images/figure6-3.gif">
</figure>
</#if>
<#unless output="html">
<verb>
31                                    11 10    8 7        2   1   0
+---------------------------------------+-------+----------+---+---+
|                                       |       |          |   |   |
|     Device Select                     | Func  | Register | 0 | 0 |
|                                       |       |          |   |   |
+---------------------------------------+-------+----------+---+---+
</verb>
</#if>
<p>図表(6.3) Type 0 PCI コンフィグレーションサイクル


<label id="figure6-4">
<!--          Figure 6.4: Type 1 PCI Configuration Cycle-->
<#if output="html">
<figure><ph vspace="1"><img src="./The-Linux-Kernel-images/figure6-4.gif">
</figure>
</#if>
<#unless output="html">
<verb>
31           24 23       16 15        11 10    8 7        2   1   0
+--------------+-----------+------------+-------+----------+---+---+
|              |           |            |       |          |   |   |
|   Reserved   |     Bus   |    Device  | Func  | Register | 0 | 1 |
|              |           |            |       |          |   |   |
+--------------+-----------+------------+-------+----------+---+---+
</verb>
</#if>
<p>図表(6.4) Type 1 PCI コンフィグレーションサイクル


<!--
So that the CPU's PCI initialization code can address devices that are not on 
the main PCI bus, there has to be a mechanism that allows bridges to decide 
whether or not to pass Configuration cycles from their primary interface to 
their secondary interface. A cycle is just an address as it appears on the PCI
bus. The PCI specification defines two formats for the PCI Configuration 
addresses; Type 0 and Type 1; these are shown in Figure  6.3 and Figure  6.4 
respectively. Type 0 PCI Configuration cycles do not contain a bus number and 
these are interpretted by all devices as being for PCI configuration addresses
on this PCI bus. Bits 31:11 of the Type 0 configuraration cycles are treated 
as the device select field. One way to design a system is to have each bit 
select a different device. In this case bit 11 would select the PCI device in 
slot 0, bit 12 would select the PCI device in slot 1 and so on. Another way is
to write the device's slot number directly into bits 31:11. Which mechanism is
used in a system depends on the system's PCI memory controller. 
-->
<p>CPU の PCI 初期化コードがメイン PCI バス上にないデバイスを初期化できるように
するには、コンフィグレーションサイクル(Configuration cycle)を PCI のプライマリ
インターフェイスからセカンダリインターフェイスへと渡すか否かをブリッジが決定で
きるような仕組みが存在しなければならない。
コンフィグレーションサイクルは、PCI バス上では単なるアドレスとして表現される。
PCI の規格書では、PCI コンフィグレーションアドレス空間設定のために、Type 0 と 
Type 1 のふたつのフォーマットが定義されていて、それらは図表(6.3)と図表(6.4)と
にそれぞれ示されている。
Type 0 の PCI コンフィグレーションサイクルにはバス番号が含まれない。そして、
Type 0 の PCI コンフィグレーションサイクルは、すべてのデバイスによって、その 
PCI バス上の PCI コンフィグレーションアドレスであると解釈される。
Type 0 のコンフィグレーションサイクルのビット 31 から 11 までは、
デバイス選択フィールドとして扱われる。システムを設計する際のひとつの方法とし
て、個々のビットが違うデバイスを選択するようにする方法がある。その場合、
ビット 11 は、スロット 0 にある PCI デバイスを選択し、ビット 12 は、スロット 1 
にある PCI デバイスを選択する等ということになる。もうひとつの方法は、デバイスの
スロット番号を直接ビット 31 から 11 の領域に書き込むことである。どちらの方法が
利用されるかは、システムの PCI メモリ空間のコントローラに依存する。

<!--
Type 1 PCI Configuration cycles contain a PCI bus number and this type of
configuration cycle is ignored by all PCI devices except the PCI-PCI bridges. 
All of the PCI-PCI Bridges seeing Type 1 configuration cycles may choose to 
pass them to the PCI buses downstream of themselves. Whether the PCI-PCI Bridge
ignores the Type 1 configuration cycle or passes it onto the downstream PCI bus
depends on how the PCI-PCI Bridge has been configured. Every PCI-PCI bridge
has a primary bus interface number and a secondary bus interface number. The
primary bus interface being the one nearest the CPU and the secondary bus
interface being the one furthest away. Each PCI-PCI Bridge also has a
subordinate bus number and this is the maximum bus number of all the PCI buses
that are bridged beyond the secondary bus interface. Or to put it another way,
the subordinate bus number is the highest numbered PCI bus downstream of the
PCI-PCI bridge. When the PCI-PCI bridge sees a Type 1 PCI configuration cycle
it does one of the following things: 
-->
<p>Type 1 の PCI コンフィグレーションサイクルには、PCI バス番号が含まれる。
そして、Type 1 のコンフィグレーションサイクルは、PCI-PCI ブリッジ以外のすべて
の PCI デバイスから無視される。
Type 1 のコンフィグレーションサイクルを見たすべての PCI-PCI ブリッジは、それら
を、自分の下流(downstream)側に渡すかどうかを選択する。PCI-PCI ブリッジが 
Type 1 コンフィグレーションサイクルを無視するか、それとも下流の PCI バスに
渡すかは、PCI-PCI ブリッジの設定次第である。
PCI-PCI ブリッジはすべて、プライマリバスインターフェイス番号とセカンダリバス
インターフェイス番号とを持っている。個々の PCI-PCI ブリッジにとって、プライマリ
バスインターフェイスは、CPU に最も近い側のインターフェイスであり、セカンダリ
バスインターフェイスは CPU に最も遠い側になるインターフェイスである。
また、それぞれの PCI-PCI ブリッジは、サブオーディネイトバス番号(subordinate 
bus number)も
持っている。これは、そのセカンダリバスインターフェイスを越えてブリッジされて
いるすべての PCI バスの中で最大のバス番号に該当する。言い換えるとサブオーディ
ネイトバス番号は、その PCI-PCI ブリッジの下流に位置する PCI バス番号の
なかで最も大きいバス番号である。PCI-PCI ブリッジが Type 1 の PCI コンフィグレー
ションサイクルを見るとき、PCI-PCI ブリッジは次のような処理をする。

<!--
      Ignore it if the bus number specified is not in between the bridge's
      secondary bus number and subordinate bus number (inclusive), 
-->
<itemize>
<item>指定されたバス番号がブリッジのセカンダリバス番号とサブオーディネイトバス
番号の間にない場合(両方の番号を含む)、Type 1 のコンフィグレーションサイクルを
無視する。

<!--
      Convert it to a Type 0 configuration command if the bus number specified
      matches the secondary bus number of the bridge, 
-->
<item>指定されたバス番号がそのブリッジのセカンダリバス番号と一致する場合、
Type 1 コンフィグレーションサイクルを Type 0 の設定コマンドに変換する。
<!--
      Pass it onto the secondary bus interface unchanged if the bus number
      specified is greater than the secondary bus number and less than or equal
      to the subordinate bus number. 
-->
<item>指定されたバス番号がそのブリッジのセカンダリバス番号よりも大きく、かつ
サブオーティネイトバス番号以下である場合、それをそのままセカンダリバスに渡す。
</itemize>

<!--
So, if we want to address Device 1 on bus 3 of the topology Figure 
pci-pci-config-eg-4 on page  we must generate a Type 1 Configuration
command from the CPU. Bridge1 passes this unchanged onto Bus 1. Bridge2
ignores it but Bridge3 converts it into a Type 0 Configuration command and 
sends it out on Bus 3 where Device 1 responds to it. 
-->
<p>したがって、もし<ref id="figure6-9" name="図表(6.9)">のトポロジーの Bus 3 
上のデバイス 1 (D1)と通信したい場合は、Type 1 コンフィグレーションコマンドを 
CPU から送り出さなければならない。ブリッジ 1 は、これを変更せずに Bus 1 に渡
す。ブリッジ 2 は、これを無視するが、ブリッジ 3 は、これを Type 0 コンフィグ
レーションコマンドに変換し、バス 3 上に送信するので、そこにあるデバイス 1 が
これに応答する。

<!--
It is up to each individual operating system to allocate bus numbers during PCI
configuration but whatever the numbering scheme used the following statement
must be true for all of the PCI-PCI bridges in the system: 
-->
<p>PCI の初期化の過程でバス番号を割り当てることは個々のオペレーティングシステム
の責任であるが、どのような番号割り当て方法が取られた場合でも、次の説明は
システムのすべての PCI-PCI ブリッジに当てはまらなければならない。

<!--
``All PCI buses located behind a PCI-PCI bridge must reside between the
seondary bus number and the subordinate bus number (inclusive).'' 
-->
<p><quote>
「PCI-PCI ブリッジの下流にあるすべての PCI バスは、セカンダリバスのバス番号と
サブオーティネイトバス番号との間(その番号を含む)のバス番号を持たなけ
ればならない。」
</quote>

<!--
If this rule is broken then the PCI-PCI Bridges will not pass and translate 
Type 1 PCI configuration cycles correctly and the system will fail to find and
initialise the PCI devices in the system. To achieve this numbering scheme, 
Linux configures these special devices in a particular order. Section 
pci-pci-bus-numbering on page  describes Linux's PCI bridge and bus
numbering scheme in detail together with a worked example. 
-->
<p>このルールが破られた場合、PCI-PCI ブリッジは、Type 1 コンフィグレーション
サイクルを正しく渡したり変換したりできないので、システムはシステム上の PCI 
デバイスを見つけて初期化することに失敗することになる。
この番号割り当て方法を実現するために、
Linux は、それらの特殊なデバイスである PCI-PCI ブリッジをある決まった順番で
設定する。<ref id="chapter_pci_sect6-2-sub" name="「PCI バス番号の割り当て」">
のセクションでは、Linux の PCI ブリッジとバス番号当ての方法について、その実際の
例も交えて詳解している。


<!--6.6  Linux PCI Initialization-->
<sect1>Linux の PCI 初期化方法<label id="chapter_pci_sect6">

<!--
The PCI initialisation code in Linux is broken into three logical parts: 
-->
<p>Linux の PCI 初期化コードは、論理的に 3 つの部分に分かれる。

<!--
PCI Device Driver
      This pseudo-device driver searches the PCI system starting at Bus 0
      and locates all PCI devices and bridges in the system. It builds a linked
      list of data structures describing the topology of the system.
      Additionally, it numbers all of the bridges that it finds. 
-->
<descrip>
<tag>PCI デバイスドライバ</tag>
この仮想デバイスドライバは、Bus 0 から PCI システムの検索を始めて、システム内
のすべての PCI デバイスとブリッジの所在を検出する。そのドライバは、システムの
トポロジーを示すデータ構造体の連結リストを作成する。さらに、発見したブリッジ
すべてに番号付けをする。
<newline>[see: <htmlurl 
url="./The-Linux-Kernel-images/linux/drivers/pci/pci.c" 
name="drivers/pci/pci.c">, <htmlurl 
url="./The-Linux-Kernel-images/linux/include/linux/pci.h" 
name="include/linux/pci.h">]<newline>

<!--
PCI BIOS
      This software layer provides the services described in
      bib-pci-bios-specification. Even though Alpha AXP does not have
      BIOS services, there is equivalent code in the Linux kernel providing the
      same functions, 
-->
<tag>PCI BIOS</tag>
このソフトウェア層(layer)は、<ref id="chapter_pci_sect6-3" 
name="「PCI BIOS の機能」">で述べる
サービスを提供する。Alpha AXP は BIOS サービスを持たないが、同様の機能を提供
するコードが Linux カーネルの中にある。
<newline>[see: arch/*/kernel/bios32.c](<htmlurl 
url="./The-Linux-Kernel-images/linux/arch/i386/kernel/bios32.c"
name="i386">, <htmlurl 
url="./The-Linux-Kernel-images/linux/arch/alpha/kernel/bios32.c" 
name="alpha">)<newline>

<!--
PCI Fixup
      System specific fixup code tidies up the system specific loose ends of
      PCI initialization. 
-->
<tag>PCI フィックスアップ(fixup)</tag>
システム固有のフィックスアップコード(fixup code)は、PCI の初期化におけるシステ
ム固有の設定の隙間を埋める役割を果たす。
<newline>[see: arch/*/kernel/bios32.c](<htmlurl 
url="./The-Linux-Kernel-images/linux/arch/i386/kernel/bios32.c"
name="i386">, <htmlurl 
url="./The-Linux-Kernel-images/linux/arch/alpha/kernel/bios32.c"
name="alpha">)<newline>

</descrip>

<!--6.6.1  The Linux Kernel PCI Data Structures-->
<sect2>Linux カーネルの PCI データ構造<label id="chapter_pci_sect6-1">
<p>

<label id="figure6-5">
<!--          Figure 6.5: Linux Kernel PCI Data Structures-->
<#if output="html">
<figure><ph vspace="1"><img src="./The-Linux-Kernel-images/figure6-5.gif">
</figure>
</#if>
<#unless output="html">
<verb>
                pci_bus
pci_root      +----------+
------------->| parent   |
              | children |--------+
              | next     |        |
              | self     |        |
              | devices  |--+     |
              | bus = 0  |  |     |
              +----------+  |     |
        +-------------------+-----+
        |                   |
        |    +--------------+
        |    |
        |    |     pci_dev          pci_dev           pci_dev
        |    |   +---------+      +---------+       +---------+
        |    +-->| bus     |  +-->| bus     |  +--->| bus     |
        |        | sibling |  |   | sibling |  | +->| sibling |
        |        | next    |--+   | next    |--+ |  | next    |
        |        |         |      |         |    |  |         |
        |        |         |      |         |    |  |         |
        |        +---------+      +---------+    |  +---------+
        |      PCI-ISA Bridge        Video       | PCI-PCI Bridge
        |                                        |
        |      pci_bus                           |
        |     +----------+                       |
        +---->| parent   |                       |
              | children |                       |
              | next     |                       |
              | self     |-----------------------+
              | devices  |--+
              | bus = 1  |  |       pci_dev           pci_dev
              +----------+  |     +---------+       +---------+
                            +---->| bus     |  +--->| bus     |
                                  | sibling |  |    | sibling |
                                  | next    |--+    | next    |
                                  |         |       |         |
                                  |         |       |         |
                                  +---------+       +---------+
                                     SCSI             Ethernet
</verb>
</#if>
<p>図表(6.5) Linux カーネルの PCI データ構造


<!--
As the Linux kernel initialises the PCI system it builds data structures 
mirroring the real PCI topology of the system. Figure  6.5 shows the 
relationships of the data structures that it would build for the example PCI 
system in Figure  6.1 on page pageref. 
-->
<p>Linux カーネルが PCI システムを初期化する際、カーネルは、システムの実際上の
 PCI トポロジーを忠実に反映するため PCI データ構造体を作成する。上記図表(6.5)
は、<ref id="figure6-1" name="図表(6.1)">の PCI システムの例に対して作成される
データ構造体の相互関係を表したものである。

<!--
Each PCI device (including the PCI-PCI Bridges) is described by a pci_dev
data structure. Each PCI bus is described by a pci_bus data structure. The
result is a tree structure of PCI buses each of which has a number of child PCI
devices attached to it. As a PCI bus can only be reached using a PCI-PCI Bridge
(except the primary PCI bus, bus 0), each pci_bus contains a pointer to the PCI
device (the PCI-PCI Bridge) that it is accessed through. That PCI device is a
child of the the PCI Bus's parent PCI bus. 
-->
<p>個々の PCI デバイス(PCI-PCI ブリッジも含む)は、<tt><ref id="pci_dev" 
name="pci_dev"></tt> データ構造体によって記述される。
個々の PCI バスは、<tt><ref id="pci_bus" name="pci_bus"></tt> データ構造体で
記述される。その結果、PCI バスのツリー構造が生成され、個々の PCI バスに
いくつかの子 PCI デバイスが繋がる構造ができる。PCI バスには、
(プライマリ PCI バスである Bus 0 を除いて) PCI-PCI ブリッジを使ってのみ到達が
可能なので、個々の <tt>pci_bus</tt> 構造体には、そのバスへアクセスするための 
PCI デバイス(すなわち PCI-PCI ブリッジ)へのポインタが含まれている。
(<tt>pci_bus</tt> 構造体では)PCI ブリッジは、もとのバスの親に当たる PCI バス
から見て子に該当する。

<!--
Not shown in the Figure  6.5 is a pointer to all of the PCI devices in the 
system, pci_devices. All of the PCI devices in the system have their pci_dev 
data structures queued onto this queue.. This queue is used by the Linux 
kernel to quickly find all of the PCI devices in the system. 
-->
<p><ref id="figure6-5" name="図表(6.5)">では表示されていないが、システム上の
すべての PCI デバイスに対するポインタとして <tt><ref id="pci_dev" 
name="pci_devices"></tt> がある。システム上のすべての PCI デバイスは、
そのキューの上に <tt>pci_dev</tt> データ構造体を登録する。
このキューは、Linux カーネルがシステム上のすべての PCI デバイスをすばやく
探すために使用される。


<!--6.6.2  The PCI Device Driver-->
<sect2>PCI デバイスドライバ<label id="chapter_pci_sect6-2">

<!--
The PCI device driver is not really a device driver at all but a function of 
the operating system called at system initialisation time. The PCI 
initialisation code must scan all of the PCI buses in the system looking for 
all PCI devices in the system (including PCI-PCI bridge devices). 
-->
<p>PCI デバイスドライバは、実際にはデバイスドライバではなく、システムの初期化
の際にコールされるオペレーティングシステムの関数である。PCI 初期化コードは、
システム上のあらゆる PCI バスをスキャンして、すべての PCI 
デバイスを捜す(これには、PCI-PCI ブリッジデバイスも含まれる)。
<newline>[see: Scan_bus(), in <htmlurl 
url="./The-Linux-Kernel-images/linux/drivers/pci/pci.c" 
name="drivers/pci/pci/c">]<newline>
<!--
It uses the PCI BIOS code to find out if every possible slot in the current 
PCI bus that it is scanning is occupied. If the PCI slot is occupied, it 
builds a pci_dev data structure describing the device and links into the list 
of known PCI devices (pointed at by pci_devices). 
-->
<p>PCI 初期化コードは、PCI BIOS のコードを使用して、現在スキャン中の PCI バス
上に存在するスロットが占有されているかどうかをすべて調べる。PCI スロットが占有
されている場合、PCI 初期化コードは、<tt><ref id="pci_dev" name="pci_dev"></tt> 
構造体を作成してそのデバイスを記述し、その構造体を(<tt><ref id="pci_dev" 
name="pci_devices"></tt> によってポイントされた)既知の PCI デバイスのリストに
リンクする。

<!--
The PCI initialisation code starts by scanning PCI Bus 0. It tries to read the
Vendor Identification and Device Identification fields for every possible PCI
device in every possible PCI slot. When it finds an occupied slot it builds a
pci_dev data structure describing the device. All of the pci_dev data
structures built by the PCI initialisation code (including all of the PCI-PCI
Bridges) are linked into a singly linked list; pci_devices. 
-->
<p>PCI 初期化コードは、PCI バスの Bus 0 をスキャンすることから始める。それは、
存在する全 PCI スロットの全 PCI デバイスに対して、そのベンダ ID とデバイス 
ID を読み出そうとする。占有されたスロットを見つけたら、<tt><ref 
id="pci_dev" name="pci_dev"></tt> データ構造体を作成し、デバイス情報を書き込
む。PCI 初期化コードによって作成された <tt>pci_dev</tt> データ構造はすべて(す
べての PCI-PCI ブリッジも含めて)、単純な連結リストである <tt>pci_devices</tt> 
にリンクされる。

<!--
If the PCI device that was found was a PCI-PCI bridge then a pci_bus data
structure is built and linked into the tree of pci_bus and pci_dev data
structures pointed at by pci_root. The PCI initialisation code can tell if the
PCI device is a PCI-PCI Bridge because it has a class code of 0x060400. The 
Linux kernel then configures the PCI bus on the other (downstream) side of the
PCI-PCI Bridge that it has just found. If more PCI-PCI Bridges are found then
these are also configured. This process is known as a depthwise algorithm; the
system's PCI topology is fully mapped depthwise before searching breadthwise.
Looking at Figure  6.1 on page pageref, Linux would configure PCI Bus 1 with 
its Ethernet and SCSI device before it configured the video device on 
PCI Bus 0. 
-->
<p>発見された PCI デバイスが PCI-PCI ブリッジであった場合は、<tt><ref 
id="pci_bus" name="pci_bus"></tt> データ構造体が作成され、<tt>pci_bus</tt> と 
<tt><ref id="pci_dev" name="pci_dev"></tt> データ構造体から成るツリーにリンク
される。そのツリーは、
<tt><ref id="pci_bus" name="pci_root"></tt> によって参照される。PCI-PCI ブリッ
ジは、クラスコード<ref id="chapter_pci_sect2" name="(class code)"> 0x060400 を
持っているので、PCI 初期化コードは、PCI デバイスが PCI-PCI ブリッジであるかど
うかを判別できる。
次に、Linux カーネルは、発見された PCI-PCI ブリッジの反対側(下流側)にある 
PCI バスを設定する。そのバス上でさらに PCI-PCI ブリッジが発見された場合、それら
にも設定がなされる。このプロセスは、デプスワイズアルゴリズム(depthwise 
algorithm)と呼ばれる。システムの PCI トポロジーは、まずひとつの階層が一番奥まで
マップされてから、並列する部分の検出が行われる。<ref id="figure6-1" 
name="図表(6.1)">では、Linux は、まず PCI Bus 1 にあるイーサネットと SCSI 
デバイスを設定してから、PCI Bus 0 にあるビデオデバイスを設定する。

<!--
As Linux searches for downstream PCI buses it must also configure the
intervening PCI-PCI bridges' secondary and subordinate bus numbers. This is
described in detail in Section  pci-pci-bus-numbering below. 
-->
<p>Linux が下流の PCI バスを検出する際は、介在する PCI-PCI ブリッジの
セカンダリバス番号とサブオーディネイトバス番号も設定しなければなら
ない。これについては、以下の<ref id="chapter_pci_sect6-2-sub" 
name="「PCI-PCI ブリッジの設定: PCI バス番号の割り当て」">で詳しく説明する。


<!--Configuring PCI-PCI Bridges - Assigning PCI Bus Numbers-->
<sect3>PCI-PCI ブリッジの設定 - PCI バス番号の割り当て<label 
id="chapter_pci_sect6-2-sub">
<p>

<label id="figure6-6">
<!--              Figure 6.6: Configuring a PCI System: Part 1-->
<#if output="html">
<figure><ph vspace="1"><img src="./The-Linux-Kernel-images/figure6-6.gif">
</figure>
</#if>
<#unless output="html">
<verb>
                          +-----------+
                          |           |
                          |           |
         +-------+        |    CPU    |        +-------+
         |       |        |           |        |       |
         |  D 1  |        |           |        |  D 2  |
         |       |        |           |        |       |
         +---+---+        +-----+-----+        +---+---+
  Bus 0      |                  |                  |
  -----------+------------------+------------------+------------------
                                |
                                |
+-------+  +-------+       +----+----+
|       |  |       |       |         |Primary Bus  =  0
|  D 1  |  |  D 2  |       | Bridge  |Secondary Bus = 1
|       |  |       |       |    1    |Subordinate = 0xFF
+---+---+  +---+---+       +----+----+
     |         |                |                              Bus 1
 ----+---------+-+--------------+-------------+---------------------
                 |                            |
                 |                            |
+-------+  +-----+---+                   +----+----+
|       |  |         |                   |         |
|  D 1  |  | Bridge  |                   | Bridge  |
|       |  |    3    |                   |    2    |
+---+---+  +----+----+                   +----+----+
    |           |       Bus ?                 |                 Bus ?
----+-------+---+------------     ------------+----------------------
            |
            |
       +----+----+                   +-------+  +-------+
       |         |                   |       |  |       |
       | Bridge  |                   |  D 1  |  |  D 2  |
       |    4    |                   |       |  |       |
       +----+----+                   +---+---+  +---+---+
            |                            |          |           Bus ?
 -----------+----------------------------+----------+----------------
</verb>
</#if>
<p>図表(6.6) PCI システムの設定: Part 1

<!--
For PCI-PCI bridges to pass PCI I/O, PCI Memory or PCI Configuration address
space reads and writes across them, they need to know the following: 
-->
<p>PCI-PCI ブリッジを介して PCI I/O アドレス空間、PCI メモリアドレス空間、
または PCI コンフィグレーションアドレス空間への読み書きを行うためには、各 
PCI-PCI ブリッジについて以下の情報が必要である。

<!--
Primary Bus Number
      The bus number immediately upstream of the PCI-PCI Bridge, 
Secondary Bus Number
      The bus number immediately downstream of the PCI-PCI Bridge, 
Subordinate Bus Number
      The highest bus number of all of the buses that can be reached
      downstream of the bridge. 
PCI I/O and PCI Memory Windows
      The window base and size for PCI I/O address space and PCI Memory
      address space for all addresses downstream of the PCI-PCI Bridge. 
-->
<descrip>
<tag>プライマリバス番号</tag>
PCI-PCI ブリッジの直上のバス番号

<tag>セカンダリバス番号</tag>
PCI-PCI ブリッジの直下のバス番号

<tag>サブオーディネイトバス番号(subordinate bus number)</tag>
ブリッジの下流に位置する到達可能なバスの中で、最も大きなバス番号

<tag>PCI I/O と PCI メモリウィンドウ</tag>
PCI-PCI ブリッジの下流にある、PCI I/O アドレス空間と PCI メモリアドレス
空間のすべてのアドレスに対するウィンドウのベースアドレスとそのサイズ
</descrip>

<!--
The problem is that at the time when you wish to configure any given PCI-PCI
bridge you do not know the subordinate bus number for that bridge. You do not
know if there are further PCI-PCI bridges downstream and if you did, you do not
know what numbers will be assigned to them. The answer is to use a depthwise
recursive algorithm and scan each bus for any PCI-PCI bridges assigning them
numbers as they are found. As each PCI-PCI bridge is found and its secondary
bus numbered, assign it a temporary subordinate number of 0xFF and scan and
assign numbers to all PCI-PCI bridges downstream of it. This all seems
complicated but the worked example below makes this process clearer. 
-->
<p>問題は、ある PCI-PCI ブリッジを設定しようとするとき、そのブリッジに関する
サブオーディネイトバス番号をその時点では知り得ないということである。
さらに下流の PCI-PCI ブリッジがあるかどうか分からず、分かったとしてもそれらに
割り当てる番号は分からない。
解決策は、デプスワイズ再帰的アルゴリズム(depthwise recursive 
algorithm)を使用して PCI-PCI ブリッジの個々のバスをスキャンして、発見された
時点で番号を当てていくことである。
個々の PCI-PCI ブリッジが発見されて、そのセカンダリバス番号が割り当てられたら、
それに一時的なサブオーディネイトバス番号として 0xFF を割り当てておいて、その
下流にあるすべての PCI-PCI ブリッジをスキャンして番号を割り当てる。
こうした処理全体は複雑に思えるかもしれないが、下記の実際の例を見れば、その
プロセスが分かりやすくなるだろう。

<!--
PCI-PCI Bridge Numbering: Step 1
      Taking the topology in Figure  6.6, the first bridge the scan would find
      is Bridge1. The PCI bus downstream of Bridge1 would be numbered as 1 and
      Bridge1 assigned a secondary bus number of 1 and a temporary
      subordinate bus number of 0xFF. This means that all Type 1 PCI
      Configuration addresses specifying a PCI bus number of 1 or higher
      would be passed across Bridge1 and onto PCI Bus 1. They would be
      translated into Type 0 Configuration cycles if they have a bus number of
      1 but left untranslated for all other bus numbers. This is exactly what 
      the Linux PCI initialisation code needs to do in order to go and scan 
      PCI Bus 1. 
-->
<descrip>
<tag>PCI-PCI ブリッジ番号割り当て: Step 1</tag>
<ref id="figure6-6" name="図表(6.6)">のトポロジーを使うと、スキャンによって、
最初のブリッジとして Bridge 1 が発見される。Bridge 1 の下流に位置する PCI バス
は、バス 1 と番号付けられ、Bridge 1 は、セカンダリバス番号として 1 が、一時的な
サブオーディネイトバス番号として OxFF が割り当てられる。
これは、PCI バス番号として 1 かそれ以上を指定するType 1 の PCI コンフィグレー
ションアドレスが、Bridge 1 を通って PCI バス 1 に渡されることを意味する。
それらは、バス番号 1 を持つ場合は Type 0 のコンフィグレーションサイクルに変換
されるが、それ以外の番号の場合は変換されない。このことは、PCI バス 1 に降りて
スキャンするために、Linux PCI 初期化コードがしなければならないことそのもので
ある。
</descrip>

<label id="figure6-7">
<!--                 Figure 6.7: Configuring a PCI System: Part 2-->
<#if output="html">
<figure><ph vspace="1"><img src="./The-Linux-Kernel-images/figure6-7.gif">
</figure>
</#if>
<#unless output="html">
<verb>
                          +-----------+
                          |           |
                          |           |
         +-------+        |    CPU    |        +-------+
         |       |        |           |        |       |
         |  D 1  |        |           |        |  D 2  |
         |       |        |           |        |       |
         +---+---+        +-----+-----+        +---+---+
  Bus 0      |                  |                  |
  -----------+------------------+------------------+------------------
                                |
                                |
+-------+  +-------+       +----+----+
|       |  |       |       |         |Primary Bus  =  0
|  D 1  |  |  D 2  |       | Bridge  |Secondary Bus = 1
|       |  |       |       |    1    |Subordinate = 0xFF
+---+---+  +---+---+       +----+----+
     |         |                |                              Bus 1
 ----+---------+-+--------------+-------------+---------------------
                 |                            |
                 |                            |
+-------+  +-----+---+                   +----+----+
|       |  |         |                   |         |Primary Bus  =  1
|  D 1  |  | Bridge  |                   | Bridge  |Secondary Bus = 2
|       |  |    3    |                   |    2    |Subordinate  =  2
+---+---+  +----+----+                   +----+----+
    |           |       Bus ?                 |                 Bus 2
----+-------+---+------------     ------------+----------------------
            |
            |
       +----+----+                   +-------+  +-------+
       |         |                   |       |  |       |
       | Bridge  |                   |  D 1  |  |  D 2  |
       |    4    |                   |       |  |       |
       +----+----+                   +---+---+  +---+---+
            |                            |          |           Bus ?
 -----------+----------------------------+----------+----------------
</verb>
</#if>
<p>図表(6.7) PCI システムの設定: Part 2



<!--
PCI-PCI Bridge Numbering: Step 2
      Linux uses a depthwise algorithm and so the initialisation code goes on
      to scan PCI Bus 1. Here it finds PCI-PCI Bridge2. There are no further
      PCI-PCI bridges beyond PCI-PCI Bridge2, so it is assigned a
       subordinate bus number of 2 which matches the number assigned to its
      secondary interface. Figure  6.7 shows how the buses and PCI-PCI
      bridges are numbered at this point. 
-->
<descrip>
<tag>PCI-PCI ブリッジの番号割り当て: Part 2</tag>
Linux は、デプスワイズアルゴリズム(depthwise algorithm)を使うので、初期化コード
は PCI バス 1 へと進んでスキャンする。ここで、初期化コードは、PCI-PCI Bridge 2 
を発見する。PCI-PCI ブリッジ 2 以下には PCI-PCI ブリッジは存在しないので、それ
にはサブオーディネイトバス番号 2 が割り当てられ、それはそのセカンダリインター
フェイスに割り当てられた番号と合致する。
<ref id="figure6-7" name="図表(6.7)">では、バスと 
PCI-PCI ブリッジとがこの時点で番号付けされたことを示している。
</descrip>

<label id="figure6-8">
<!--                 Figure 6.8: Configuring a PCI System: Part 3-->
<#if output="html">
<figure><ph vspace="1"><img src="./The-Linux-Kernel-images/figure6-8.gif">
</figure>
</#if>
<#unless output="html">
<verb>
                          +-----------+
                          |           |
                          |           |
         +-------+        |    CPU    |        +-------+
         |       |        |           |        |       |
         |  D 1  |        |           |        |  D 2  |
         |       |        |           |        |       |
         +---+---+        +-----+-----+        +---+---+
  Bus 0      |                  |                  |
  -----------+------------------+------------------+------------------
                                |
                                |
+-------+  +-------+       +----+----+
|       |  |       |       |         |Primary Bus  =  0
|  D 1  |  |  D 2  |       | Bridge  |Secondary Bus = 1
|       |  |       |       |    1    |Subordinate = 0xFF
+---+---+  +---+---+       +----+----+
     |         |                |                              Bus 1
 ----+---------+-+--------------+-------------+---------------------
                 |                            |
                 |                            |
+-------+  +-----+---+                   +----+----+
|       |  |         |Primary Bus  =  1  |         |Primary Bus  =  1
|  D 1  |  | Bridge  |Secondary Bus = 3  | Bridge  |Secondary Bus = 2
|       |  |    3    |Subordinate = 0xFF |    2    |Subordinate  =  2
+---+---+  +----+----+                   +----+----+
    |           |       Bus 3                 |                 Bus 2
----+-------+---+------------     ------------+----------------------
            |
            |
       +----+----+                   +-------+  +-------+
       |         |                   |       |  |       |
       | Bridge  |                   |  D 1  |  |  D 2  |
       |    4    |                   |       |  |       |
       +----+----+                   +---+---+  +---+---+
            |                            |          |           Bus ?
 -----------+----------------------------+----------+----------------
</verb>
</#if>
<p>図表(6.8) PCI システム設定: Part 3

<!--
PCI-PCI Bridge Numbering: Step 3
      The PCI initialisation code returns to scanning PCI Bus 1 and finds
      another PCI-PCI bridge, Bridge3. It is assigned 1 as its primary bus
      interface number, 3 as its secondary bus interface number and 0xFF as
      its subordinate bus number. Figure  6.8 on page pageref shows how the
      system is configured now. Type 1 PCI configuration cycles with a bus
      number of 1, 2 or 3 wil be correctly delivered to the appropriate PCI
      buses. 
-->
<descrip>
<tag>PCI-PCI ブリッジの番号割り当て: Step 3</tag>
PCI 初期化コードは、PCI バス 1 のスキャニングに戻り、もうひとつの PCI-PCI 
ブリッジである Bridge 3 を発見する。それは、そのプライマリバスインターフェイス
として 1 を割り当てられ、セカンダリインターフェイスの番号として 3 を、
サブオーディネイトバス番号として 0xFF を割り当てられる。
<ref id="figure6-8" name="図表(6.8)">では、システムが現在どのように設定されたの
かを示している。バス番号 1, 2, 3 についての Type 1 の PCI コンフィグレーション
サイクルは、適切な PCI バスに対して正しく伝達される。
</descrip>

<label id="figure6-9">
<!--                 Figure 6.9: Configuring a PCI System: Part 4-->
<#if output="html">
<figure><ph vspace="1"><img src="./The-Linux-Kernel-images/figure6-9.gif">
</figure>
</#if>
<#unless output="html">
<verb>
                          +-----------+
                          |           |
                          |           |
         +-------+        |    CPU    |        +-------+
         |       |        |           |        |       |
         |  D 1  |        |           |        |  D 2  |
         |       |        |           |        |       |
         +---+---+        +-----+-----+        +---+---+
  Bus 0      |                  |                  |
  -----------+------------------+------------------+------------------
                                |
                                |
+-------+  +-------+       +----+----+
|       |  |       |       |         |Primary Bus  =  0
|  D 1  |  |  D 2  |       | Bridge  |Secondary Bus = 1
|       |  |       |       |    1    |Subordinate  =  4
+---+---+  +---+---+       +----+----+
     |         |                |                              Bus 1
 ----+---------+-+--------------+-------------+---------------------
                 |                            |
                 |                            |
+-------+  +-----+---+                   +----+----+
|       |  |         |Primary Bus  =  1  |         |Primary Bus  =  1
|  D 1  |  | Bridge  |Secondary Bus = 3  | Bridge  |Secondary Bus = 2
|       |  |    3    |Subordinate  =  4  |    2    |Subordinate  =  2
+---+---+  +----+----+                   +----+----+
    |           |       Bus 3                 |                 Bus 2
----+-------+---+------------     ------------+----------------------
            |
            |
       +----+----+                   +-------+  +-------+
       |         |Primary Bus  =  3  |       |  |       |
       | Bridge  |Secondary Bus = 4  |  D 1  |  |  D 2  |
       |    4    |Subordinate  =  4  |       |  |       |
       +----+----+                   +---+---+  +---+---+
            |                            |          |           Bus 4
 -----------+----------------------------+----------+----------------
</verb>
</#if>
<p>図表(6.9) PCI システムの設定: Part4


<!--
PCI-PCI Bridge Numbering: Step 4
      Linux starts scanning PCI Bus 3, downstream of PCI-PCI Bridge3. PCI
      Bus 3 has another PCI-PCI bridge (Bridge4) on it, it is assigned 3 as its
      primary bus number and 4 as its secondary bus number. It is the last
      bridge on this branch and so it is assigned a subordinate bus interface
      number of 4. The initialisation code returns to PCI-PCI Bridge3 and
      assigns it a subordinate bus number of 4. Finally, the PCI initialisation
      code can assign 4 as the subordinate bus number for PCI-PCI Bridge1.
      Figure  6.9 on page pageref shows the final bus numbers. 
-->
<descrip>
<tag>PCI-PCI ブリッジの番号当て: Step 4</tag>
Linux は、PCI-PCI ブリッジ Bridge 3 の下流にある PCI バス 3 のスキャニング
を始める。PCI バス 3 は、次の PCI-PCI ブリッジ(Bridge 4)をバス上に持っている
ので、それは、プライマリバス番号として 3 を、セカンダリバス番号として 4 を割り
当てられる。これはそのバス上の最後のブリッジなので、ブリッジにはサブオーディネ
イトバスインターフェイス番号 4 が割り当てられる。
初期化コードは、PCI-PCI Bridge 3 に戻り、それにサブオーディネイトバス番号 4 を
割り当てる。最後に、PCI 初期化コードは、PCI-PCI Bridge 1 にサブオーディネイト
バス番号 4 を割り当てることができる。<ref id="figure6-9" 
name="図表(6.9)">では、最後のバス番号が示されている。
</descrip>

<label id="chapter_pci_sect6-3">
<!--6.6.3  PCI BIOS Functions-->
<sect2>PCI BIOS 関数

<!--
The PCI BIOS functions are a series of standard routines which are common
across all platforms. For example, they are the same for both Intel and Alpha
AXP based systems. They allow the CPU controlled access to all of the PCI
address spaces. 
Only Linux kernel code and device drivers may use them. 
-->
<p>PCI BIOS 関数は、全プラットフォームに共通な、一連の標準ルーチンである。
たとえば、それらは、Intel や Alpah AXP ベースのシステムの両方で同一である。
PCI BIOS 関数は、PCI アドレス空間への CPU で制御されたアクセスを可能にする。
<newline>[see: arch/*/kernel/bios32.c]( <htmlurl 
url="./The-Linux-Kernel-images/linux/arch/i386/kernel/bios32.c" 
name="i386">, <htmlurl 
url="./The-Linux-Kernel-images/linux/arch/i386/kernel/bios32.c" 
name="alpha"> )<newline>
それらを使用できるのは、Linux カーネルコードとデバイスドライバだけである。


<!--6.6.4  PCI Fixup-->
<sect2>PCI フィックスアップ(fixup)

<!--
The PCI fixup code for Alpha AXP does rather more than that for Intel (which
basically does nothing). 
For Intel based systems the system BIOS, which ran at boot time, has already
fully configured the PCI system. This leaves Linux with little to do other than
map that configuration. For non-Intel based systems further configuration needs
to happen to: 
-->
<p>Alpah AXP の PCI フィックスアップ(fixup)コードは、Intel のもの(Intel 版の
コードは基本的に何もしない)以上の役割を果たす。
<newline>[see: arch/*/kernel/bios32.c]( <htmlurl 
url="./The-Linux-Kernel-images/arch/i386/kernel/bios32.c" 
name="i386">, <htmlurl 
url="./The-Linux-Kernel-images/arch/alpha/kernel/bios32.c" 
name="alpha"> )<newline>
Intel ベースのシステムでは、ブート時に実行されるシステム BIOS が、PCI 
システムを完全に設定する。そのために、Linux は、そこでの設定をマップする以外
はほとんどすることがない。Intel ベースでないシステムの場合、次のようなさら
なる設定作業がなされる必要がある。

<!--
      Allocate PCI I/O and PCI Memory space to each device, 
      Configure the PCI I/O and PCI Memory address windows for each
      PCI-PCI bridge in the system, 
      Generate Interrupt Line values for the devices; these control interrupt
      handling for the device. 
-->
<itemize>
<item>個々のデバイスに PCI I/O と PCI メモリ空間を割り当てること。
<item>システムの PCI-PCI ブリッジそれぞれに、PCI I/O アドレスと PCI メモリ
アドレスのウィンドウを設定すること。
<item>デバイスの割り込み処理を制御する、割り込みライン値を生成すること。
</itemize>

<!--
The next subsections describe how that code works. 
-->
<p>次のサブセクションでは、それらのコードの働きを説明する。


<!--Finding Out How Much PCI I/O and PCI Memory Space a Device Needs-->
<sect3>デバイスが必要とする PCI I/O と PCI メモリ空間の容量を調べる

<!--
Each PCI device found is queried to find out how much PCI I/O and PCI Memory
address space it requires. To do this, each Base Address Register has all 1's
written to it and then read. The device will return 0's in the don't-care 
address bits, effectively specifying the address space required. 
-->
<p>検出された PCI デバイスは、その PCI I/O と PCI メモリがアドレス空間をどの
程度必要とするのか調べるために、検査される。その検査のために、個々のベース
アドレスレジスタには、すべて 1 が書き込まれ、その後で読み出される。デバイスは、
使用しないアドレスのビットに関しては 0 を返すので、必要とされるアドレス空間を
効率的に確定することができる。

<label id="figure6-10">
<!--       Figure 6.10: PCI Configuration Header: Base Address Registers-->
<#if output="html">
<figure><ph vspace="1"><img src="./The-Linux-Kernel-images/figure6-10.gif">
</figure>
</#if>
<#unless output="html">
<verb>
31                                                4  3  2  1  0
+--------------------------------------------------+--+-----+--+
|                                                  |  |     |  |
|                   Base Address                   |  |     | 0|
|                                                  |  |     |  |
+--------------------------------------------------+--+-----+--+
                                                     |   |
                                    prefetchable-----+  Type

                PCI メモリ空間のベースアドレス


31                                                       2  1  0
+---------------------------------------------------------+--+--+
|                                                         |  |  |
|                   Base Address                          |  |  |
|                                                         |  |  |
+---------------------------------------------------------+--+--+
                                                            |
                                                          Reserved

                PCI I/O 空間のベースアドレス
</verb>
</#if>
<p>図表(6.10) PCI コンフィグレーションヘッダ: ベースアドレスレジスタ


<!--
There are two basic types of Base Address Register, the first indicates within
which address space the devices registers must reside; either PCI I/O or PCI
Memory space. This is indicated by Bit 0 of the register. Figure  6.10 shows 
the two forms of the Base Address Register for PCI Memory and for PCI I/O. 
-->
<p>ベースアドレスレジスタには、基本的にふたつのタイプがある。ひとつは、デバイス
レジスタが、PCI I/O もしくは PCI メモリ空間のどの範囲になければならないかを示
す。これは、レジスタのビット 0 によって示される。
<ref id="figure6-10" name="図表(6.10)">では、PCI メモリと PCI I/O についての
二種類のフォームのベースアドレスレジスタが示されている。

<!--
To find out just how much of each address space a given Base Address Register
is requesting, you write all 1s into the register and then read it back. The 
device will specify zeros in the don't care address bits, effectively 
specifying the address space required. This design implies that all address 
spaces used are a power of two and are naturally aligned. 
-->
<p>そのベースアドレスレジスタがどの程度のアドレス空間を要求しているのかを正確に
知るために、そのレジスタにすべて 1 を書き込んで、そのあとでそれを読み出す。
デバイスは、使用しないアドレス空間ではビット値 0 を返すので、効果的に必要な
アドレス空間を確定できる。こうした設計方法によって、利用されるアドレス空間全体
は 2 の n 乗となり、自然な境界に整合する位置に置かれることになる。

<!--
For example when you initialize the DECChip 21142 PCI Fast Ethernet device, it
tells you that it needs 0x100 bytes of space of either PCI I/O or PCI Memory. 
The initialization code allocates it space. The moment that it allocates 
space, the 21142's control and status registers can be seen at those 
addresses. 
-->
<p>たとえば、DEC チップ 21142 PCI ファーストイーサネットデバイスを初期化すると
き、デバイスは、PCI I/O か PCI メモリのいずれかのスペースとして 0x100 バイトが
必要であると告げるとする。初期化コードは、デバイスにその空間を割り当てる。
空間を割り当てた瞬間、21142 のコントロールレジスタとステータスレジスタが、
それらのアドレス上に存在するのがわかるようになる。

<!--Allocating PCI I/O and PCI Memory to PCI-PCI Bridges and Devices-->
<sect3>PCI-PCI ブリッジとデバイスに対して PCI I/O と PCI メモリを割り当てる

<!--
Like all memory the PCI I/O and PCI memory spaces are finite, and to some
extent scarce. The PCI Fixup code for non-Intel systems (and the BIOS code for
Intel systems) has to allocate each device the amount of memory that it is
requesting in an efficient manner. Both PCI I/O and PCI Memory must be
allocated to a device in a naturally aligned way. For example, if a device 
asks for 0xB0 of PCI I/O space then it must be aligned on an address that is a
multiple of 0xB0. In addition to this, the PCI I/O and PCI Memory bases for 
any given bridge must be aligned on 4K and on 1Mbyte boundaries respectively. 
Given that the address spaces for downstream devices must lie within all of 
the upstream PCI-PCI Bridge's memory ranges for any given device, it is a 
somewhat difficult problem to allocate space efficiently. 
-->
<p>すべてのメモリと同様に、PCI I/O と PCI メモリ空間は有限であり、ときにやや
不足することもある。Intel 以外のシステムにおける PCI フィックスアップコード
(fixup code)(および、Intel システムにおける BIOS コード)は、個々のデバイスに
対して、それが要求する量のメモリを効率的に割り当てなければならない。
一方、PCI I/O と PCI メモリ空間のアドレスは、自然な境界に整合するような方法
で各デバイスに割り当てられなければならない。
たとえば、デバイスが PCI I/O 空間に 0xB0 バイトの容量を要求する場合、それは 
0xB0 の倍数となるアドレス上に割り当てられる必要がある。
これに加えて、各ブリッジに関する PCI I/O と PCI メモリのベースアドレス
は、それぞれ 4 k と 1 M バイトの境界に整合しなければならない。
下流に位置するデバイスのアドレス空間は、上流にあるすべてのブリッジが下流デバイ
ス用として確保するメモリ領域内になければならない。
したがって、空間を効率的に割り当てるのは、やや難しい問題である。

<!--
The algorithm that Linux uses relies on each device described by the bus/device
tree built by the PCI Device Driver being allocated address space in ascending
PCI I/O memory order. Again a recursive algorithm is used to walk the pci_bus
and pci_dev data structures built by the PCI initialisation code. Starting at 
the root PCI bus (pointed at by pci_root) the BIOS fixup code: 
-->
<p>Linux が使っているアルゴリズムでは、PCI デバイスドライバによって作成された
バスとデバイスとのツリー構造によって記述される個々のデバイスに対して、PCI 
I/O 空間および PCI メモリ空間にそれぞれが使うアドレスを昇順に割り当てるという
方法でこの問題に対処している。
この場合も、再帰的アルゴリズムが使用され、PCI 初期化コードによって作成された 
<tt><ref id="pci_bus" name="pci_bus"></tt> と <tt><ref id="pci_dev" 
name="pci_dev"></tt> データ構造体が順番に調べられる。
ルート PCI バス(これは、<tt><ref id="pci_bus" name="pci_root"></tt> によって
ポイントされている)から調査を始めて、BIOS 関数やフィックスアップコードは次の
ようなことをする。

<!--
      Aligns the current global PCI I/O and Memory bases on 4K and 1 Mbyte
      boundaries respectively, 
-->
<itemize>
<item>グローバルな PCI I/O と PCI メモリのカレント(current)ベースアドレ
スを 4 k と 1 M バイトの境界に合わせてそれぞれ設定する。

<!--
      For every device on the current bus (in ascending PCI I/O memory
      needs), 
            allocates it space in PCI I/O and/or PCI Memory, 

            moves on the global PCI I/O and Memory bases by the
            appropriate amounts, 

            enables the device's use of PCI I/O and PCI Memory, 
-->
<item>カレントバス上のすべてのデバイスに対して、(要求された PCI I/O 
および PCI メモリ空間上のアドレスについては昇順で)、次のことをする。
<itemize>
<item>デバイスに、PCI I/O と PCI メモリの両方か一方の空間を割り当てる。
<item>適切な容量分だけ、グローバルな PCI I/O と PCI メモリのベースアドレスを
移動させる。
<item>デバイスが PCI I/O と PCI メモリを使用できるようにする。
</itemize>

<!--
      Allocates space recursively to all of the buses downstream of the current
      bus. Note that this will change the global PCI I/O and Memory bases, 
-->
<item>カレントバスの下流にあるすべてのバスに対して、再帰的に空間を
割り当てる。これには、グローバル　PCI I/O と PCI メモリのベースアドレスの変更が
伴うことに注意。

<!--
      Aligns the current global PCI I/O and Memory bases on 4K and 1 Mbyte
      boundaries respectively and in doing so figure out the size and base of
      PCI I/O and PCI Memory windows required by the current PCI-PCI
      bridge, 
-->
<item>グローバルな PCI I/O と PCI メモリのカレントベースアドレスをそれぞれ 4 k 
と 1 M バイトの境界に合わせて設定し、その際に、現在の PCI-PCI ブリッジが必要と
する PCI I/O と PCI メモリのウィンドウのサイズとベースアドレスとを調べる。

<!--
      Programs the PCI-PCI bridge that links to this bus with its PCI I/O and
      PCI Memory bases and limits, 
-->
<item>そのバスに繋がっている PCI-PCI ブリッジを、その PCI I/O と PCI メモリの
ベースアドレスと上限アドレスとを使って、プログラムする。

<!--
      Turns on bridging of PCI I/O and PCI Memory accesses in the PCI-PCI
      Bridge. This means that if any PCI I/O or PCI Memory addresses seen on
      the Bridge's primary PCI bus that are within its PCI I/O and PCI Memory
      address windows will be bridged onto its secondary PCI bus. 
-->
<item>PCI-PCI ブリッジにプログラムされた PCI I/O と PCI メモリへのアクセスが
ある場合にそれを通過させる機能を、有効にする。このことは、サイズとベース
アドレスによって指定されたそのブリッジのアドレス空間ウィンドウ内にある
 PCI I/O または PCI メモリアドレスがブリッジのプライマリバスに現れた場合、
それをセカンダリ PCI バスに通過させる (bridge する) ことを意味する。
</itemize>

<!--
Taking the PCI system in Figure  6.1 on page pageref as our example the PCI
Fixup code would set up the system in the following way: 
-->
<p><ref id="figure6-1" name="図表(6.1)">にある PCI システムを例に取ると、
PCI フィックスアップコードは、次のような方法でシステムを設定することになる。

<!--
Align the PCI bases
      PCI I/O is 0x4000 and PCI Memory is 0x100000. This allows the
      PCI-ISA bridges to translate all addresses below these into ISA address
      cycles, 
-->
<descrip>
<tag>PCI ベースアドレスの初期設定</tag>
ベースアドレスについて、PCI I/O を 0x4000 とし、PCI メモリを 0x100000 とする。
これによって、PCI-ISA ブリッジは、これより下位のアドレスを ISA アドレスサイクル
に変換できるようになる。

<!--
The Video Device
      This is asking for 0x200000 of PCI Memory and so we allocate it that
      amount starting at the current PCI Memory base of 0x200000 as it has to
      be naturally aligned to the size requested. The PCI Memory base is
      moved to 0x400000 and the PCI I/O base remains at 0x4000. 
-->
<tag>ビデオデバイス</tag>
このデバイスは、PCI メモリの容量として 0x200000 を要求している。したがって、
要求されたサイズのメモリを連続的に割り当てる必要があるので、その容量を
現在の PCI メモリのベースアドレスである 0x200000 から始まる領域に割り当てる。
これによって、PCI メモリのベースアドレスは 0x400000 に移動し、PCI I/O の
ベースアドレスは 0x4000 のままである。

<!--
The PCI-PCI Bridge
      We now cross the PCI-PCI Bridge and allocate PCI memory there, note
      that we do not need to align the bases as they are already correctly
      aligned: 
      The Ethernet Device
            This is asking for 0xB0 bytes of both PCI I/O and PCI Memory
            space. It gets allocated PCI I/O at 0x4000 and PCI Memory at
            0x400000. The PCI Memory base is moved to 0x4000B0 and the
            PCI I/O base to 0x40B0. 
      The SCSI Device
            This is asking for 0x1000 PCI Memory and so it is allocated it at
            0x401000 after it has been naturally aligned. The PCI I/O base is
            still 0x40B0 and the PCI Memory base has been moved to
            0x402000. 
-->
<tag>PCI-PCI ブリッジ</tag>
この時点で、PCI-PCI ブリッジを通過して、その下流にあるデバイスに PCI メモリ
を割り当てる。注意: ベースアドレスは既に正しく設定されており、ここで再設定する
必要はない。

<descrip>
<tag>イーサネットデバイス</tag>
このデバイスは、PCI I/O と PCI メモリ空間両方に 0xB0 バイトを要求している。
したがって、0x4000 に PCI I/O が、0x400000 に PCI メモリが割り当てられる。
PCI メモリのベースアドレスは、0x4000B0 に移動し、PCI I/O ベースアドレスは 
0x40B0 に移動する。

<tag>SCSI デバイス</tag>
このデバイスは、PCI メモリに 0x1000 を要求しているので、それが自然な境界に
沿って配置されるように、0x401000 に必要な空間を割り当てられる。
PCI I/O ベースアドレスは、そのまま 0x40B0 であり、PCI メモリのベースアドレス
は、0x402000 に移動する。
</descrip>

<!--
The PCI-PCI Bridge's PCI I/O and Memory Windows
      We now return to the bridge and set its PCI I/O window at between
      0x4000 and 0x40B0 and it's PCI Memory window at between 0x400000
      and 0x402000. This means that the PCI-PCI Bridge will ignore the PCI
      Memory accesses for the video device and pass them on if they are for
      the ethernet or SCSI devices. 
-->
<tag>PCI-PCI ブリッジの PCI I/O と PCI メモリのウィンドウ</tag>
ここで、ブリッジに戻って、PCI I/O ウィンドウを 0x4000 と 0x40B0 の間に設定し
て、その PCI メモリウィンドウを 0x400000 と 0x402000 との間に設定する。
これは、PCI-PCI ブリッジがビデオデバイスのための PCI メモリアクセスを無視
して、それらがイーサネットか SCSI デバイスのためのものなら通すということを
意味する。

</descrip>

<!--
Footnotes:

1 For example? 
-->
<label id="chapter_pci_fn">
<footnote>
(脚註1)たとえば？
</footnote>