source: rtems-docs/c_user/pci_library.rst @ f916fca

4.115
Last change on this file since f916fca was d389819, checked in by Amar Takhar <amar@…>, on 01/18/16 at 05:37:40

Convert all Unicode to ASCII(128)

  • Property mode set to 100644
File size: 17.9 KB
Line 
1PCI Library
2###########
3
4.. index:: libpci
5
6Introduction
7============
8
9The Peripheral Component Interconnect (PCI) bus is a very common computer
10bus architecture that is found in almost every PC today. The PCI bus is
11normally located at the motherboard where some PCI devices are soldered
12directly onto the PCB and expansion slots allows the user to add custom
13devices easily. There is a wide range of PCI hardware available implementing
14all sorts of interfaces and functions.
15
16This section describes the PCI Library available in RTEMS used to access the
17PCI bus in a portable way across computer architectures supported by RTEMS.
18
19The PCI Library aims to be compatible with PCI 2.3 with a couple of
20limitations, for example there is no support for hot-plugging, 64-bit
21memory space and cardbus bridges.
22
23In order to support different architectures and with small foot-print embedded
24systems in mind the PCI Library offers four different configuration options
25listed below. It is selected during compile time by defining the appropriate
26macros in confdefs.h. It is also possible to enable PCI_LIB_NONE (No
27Configuration) which can be used for debuging PCI access functions.
28
29- Auto Configuration (do Plug & Play)
30
31- Read Configuration (read BIOS or boot loader configuration)
32
33- Static Configuration (write user defined configuration)
34
35- Peripheral Configuration (no access to cfg-space)
36
37Background
38==========
39
40The PCI bus is constructed in a way where on-board devices and devices
41in expansion slots can be automatically found (probed) and configured
42using Plug & Play completely implemented in software. The bus is set up once
43during boot up. The Plug & Play information can be read and written from
44PCI configuration space. A PCI device is identified in configuration space by
45a unique bus, slot and function number. Each PCI slot can have up to 8
46functions and interface to another PCI sub-bus by implementing a PCI-to-PCI
47bridge according to the PCI Bridge Architecture specification.
48
49Using the unique \[bus:slot:func] any device can be configured regardless of how
50PCI is currently set up as long as all PCI buses are enumerated correctly. The
51enumeration is done during probing, all bridges are given a bus number in
52order for the bridges to respond to accesses from both directions. The PCI
53library can assign address ranges to which a PCI device should respond using
54Plug & Play technique or a static user defined configuration. After the
55configuration has been performed the PCI device drivers can find devices by
56the read-only PCI Class type, Vendor ID and Device ID information found in
57configuration space for each device.
58
59In some systems there is a boot loader or BIOS which have already configured
60all PCI devices, but on embedded targets it is quite common that there is no
61BIOS or boot loader, thus RTEMS must configure the PCI bus. Only the PCI host
62may do configuration space access, the host driver or BSP is responsible to
63translate the \[bus:slot:func] into a valid PCI configuration space access.
64
65If the target is not a host, but a peripheral, configuration space can not be
66accessed, the peripheral is set up by the host during start up. In complex
67embedded PCI systems the peripheral may need to access other PCI boards than
68the host. In such systems a custom (static) configuration of both the host
69and peripheral may be a convenient solution.
70
71The PCI bus defines four interrupt signals INTA#..INTD#. The interrupt signals
72must be mapped into a system interrupt/vector, it is up to the BSP or host
73driver to know the mapping, however the BIOS or boot loader may use the
748-bit read/write "Interrupt Line" register to pass the knowledge along to the
75OS.
76
77The PCI standard defines and recommends that the backplane route the interupt
78lines in a systematic way, however in standard there is no such requirement.
79The PCI Auto Configuration Library implements the recommended way of routing
80which is very common but it is also supported to some extent to override the
81interrupt routing from the BSP or Host Bridge driver using the configuration
82structure.
83
84Software Components
85-------------------
86
87The PCI library is located in cpukit/libpci, it consists of different parts:
88
89- PCI Host bridge driver interface
90
91- Configuration routines
92
93- Access (Configuration, I/O and Memory space) routines
94
95- Interrupt routines (implemented by BSP)
96
97- Print routines
98
99- Static/peripheral configuration creation
100
101- PCI shell command
102
103PCI Configuration
104-----------------
105
106During start up the PCI bus must be configured in order for host and
107peripherals to access one another using Memory or I/O accesses and that
108interrupts are properly handled. Three different spaces are defined and
109mapped separately:
110
111# I/O space (IO)
112
113# non-prefetchable Memory space (MEMIO)
114
115# prefetchable Memory space (MEM)
116
117Regions of the same type (I/O or Memory) may not overlap which is guaranteed
118by the software. MEM regions may be mapped into MEMIO regions, but MEMIO
119regions can not be mapped into MEM, for that could lead to prefetching of
120registers. The interrupt pin which a board is driving can be read out from
121PCI configuration space, however it is up to software to know how interrupt
122signals are routed between PCI-to-PCI bridges and how PCI INT[A..D]# pins are
123mapped to system IRQ. In systems where previous software (boot loader or BIOS)
124has already set up this the configuration is overwritten or simply read out.
125
126In order to support different configuration methods the following configuration
127libraries are selectable by the user:
128
129- Auto Configuration (run Plug & Play software)
130
131- Read Configuration (relies on a boot loader or BIOS)
132
133- Static Configuration (write user defined setup, no Plug & Play)
134
135- Peripheral Configuration (user defined setup, no access to
136  configuration space)
137
138A host driver can be made to support all three configuration methods, or any
139combination. It may be defined by the BSP which approach is used.
140
141The configuration software is called from the PCI driver (pci_config_init()).
142
143Regardless of configuration method a PCI device tree is created in RAM during
144initialization, the tree can be accessed to find devices and resources without
145accessing configuration space later on. The user is responsible to create the
146device tree at compile time when using the static/peripheral method.
147
148RTEMS Configuration selection
149~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
150
151The active configuration method can be selected at compile time in the same
152way as other project parameters by including rtems/confdefs.h and setting
153
154- CONFIGURE_INIT
155
156- RTEMS_PCI_CONFIG_LIB
157
158- CONFIGURE_PCI_LIB = PCI_LIB_(AUTO,STATIC,READ,PERIPHERAL)
159
160See the RTEMS configuration section how to setup the PCI library.
161
162Auto Configuration
163~~~~~~~~~~~~~~~~~~
164
165The auto configuration software enumerates PCI buses and initializes all PCI
166devices found using Plug & Play. The auto configuration software requires
167that a configuration setup has been registered by the driver or BSP in order
168to setup the I/O and Memory regions at the correct address ranges. PCI
169interrupt pins can optionally be routed over PCI-to-PCI bridges and mapped
170to a system interrupt number. BAR resources are sorted by size and required
171alignment, unused "dead" space may be created when PCI bridges are present
172due to the PCI bridge window size does not equal the alignment. To cope with
173that resources are reordered to fit smaller BARs into the dead space to minimize
174the PCI space required. If a BAR or ROM register can not be allocated a PCI
175address region (due to too few resources available) the register will be given
176the value of pci_invalid_address which defaults to 0.
177
178The auto configuration routines support:
179
180- PCI 2.3
181
182- Little and big endian PCI bus
183
184- one I/O 16 or 32-bit range (IO)
185
186- memory space (MEMIO)
187
188- prefetchable memory space (MEM), if not present MEM will be mapped into
189  MEMIO
190
191- multiple PCI buses - PCI-to-PCI bridges
192
193- standard BARs, PCI-to-PCI bridge BARs, ROM BARs
194
195- Interrupt routing over bridges
196
197- Interrupt pin to system interrupt mapping
198
199Not supported:
200
201- hot-pluggable devices
202
203- Cardbus bridges
204
205- 64-bit memory space
206
207- 16-bit and 32-bit I/O address ranges at the same time
208
209In PCI 2.3 there may exist I/O BARs that must be located at the low 64kBytes
210address range, in order to support this the host driver or BSP must make sure
211that I/O addresses region is within this region.
212
213Read Configuration
214~~~~~~~~~~~~~~~~~~
215
216When a BIOS or boot loader already has setup the PCI bus the configuration can
217be read directly from the PCI resource registers and buses are already
218enumerated, this is a much simpler approach than configuring PCI ourselves. The
219PCI device tree is automatically created based on the current configuration and
220devices present. After initialization is done there is no difference between
221the auto or read configuration approaches.
222
223Static Configuration
224~~~~~~~~~~~~~~~~~~~~
225
226To support custom configurations and small-footprint PCI systems, the user may
227provide the PCI device tree which contains the current configuration. The
228PCI buses are enumerated and all resources are written to PCI devices during
229initialization. When this approach is selected PCI boards must be located at
230the same slots every time and devices can not be removed or added, Plug & Play
231is not performed. Boards of the same type may of course be exchanged.
232
233The user can create a configuration by calling pci_cfg_print() on a running
234system that has had PCI setup by the auto or read configuration routines, it
235can be called from the PCI shell command. The user must provide the PCI device
236tree named pci_hb.
237
238Peripheral Configuration
239~~~~~~~~~~~~~~~~~~~~~~~~
240
241On systems where a peripheral PCI device needs to access other PCI devices than
242the host the peripheral configuration approach may be handy. Most PCI devices
243answers on the PCI host's requests and start DMA accesses into the Hosts memory,
244however in some complex systems PCI devices may want to access other devices
245on the same bus or at another PCI bus.
246
247A PCI peripheral is not allowed to do PCI configuration cycles, which
248means that it must either rely on the host to give it the addresses it
249needs, or that the addresses are predefined.
250
251This configuration approach is very similar to the static option, however the
252configuration is never written to PCI bus, instead it is only used for drivers
253to find PCI devices and resources using the same PCI API as for the host
254
255PCI Access
256----------
257
258The PCI access routines are low-level routines provided for drivers,
259configuration software, etc. in order to access different regions in a way
260not dependent upon the host driver, BSP or platform.
261
262- PCI configuration space
263
264- PCI I/O space
265
266- Registers over PCI memory space
267
268- Translate PCI address into CPU accessible address and vice versa
269
270By using the access routines drivers can be made portable over different
271architectures. The access routines take the architecture endianness into
272consideration and let the host driver or BSP implement I/O space and
273configuration space access.
274
275Some non-standard hardware may also define the PCI bus big-endian, for example
276the LEON2 AT697 PCI host bridge and some LEON3 systems may be configured that
277way. It is up to the BSP to set the appropriate PCI endianness on compile time
278(BSP_PCI_BIG_ENDIAN) in order for inline macros to be correctly defined.
279Another possibility is to use the function pointers defined by the access
280layer to implement drivers that support "run-time endianness detection".
281
282Configuration space
283~~~~~~~~~~~~~~~~~~~
284
285Configuration space is accessed using the routines listed below. The
286pci_dev_t type is used to specify a specific PCI bus, device and function. It
287is up to the host driver or BSP to create a valid access to the requested
288PCI slot. Requests made to slots that are not supported by hardware should
289result in PCISTS_MSTABRT and/or data must be ignored (writes) or 0xffffffff
290is always returned (reads).
291.. code:: c
292
293    /* Configuration Space Access Read Routines \*/
294    extern int pci_cfg_r8(pci_dev_t dev, int ofs, uint8_t \*data);
295    extern int pci_cfg_r16(pci_dev_t dev, int ofs, uint16_t \*data);
296    extern int pci_cfg_r32(pci_dev_t dev, int ofs, uint32_t \*data);
297    /* Configuration Space Access Write Routines \*/
298    extern int pci_cfg_w8(pci_dev_t dev, int ofs, uint8_t data);
299    extern int pci_cfg_w16(pci_dev_t dev, int ofs, uint16_t data);
300    extern int pci_cfg_w32(pci_dev_t dev, int ofs, uint32_t data);
301
302I/O space
303~~~~~~~~~
304
305The BSP or driver provide special routines in order to access I/O space. Some
306architectures have a special instruction accessing I/O space, others have it
307mapped into a "PCI I/O window" in the standard address space accessed by the
308CPU. The window size may vary and must be taken into consideration by the
309host driver. The below routines must be used to access I/O space. The address
310given to the functions is not the PCI I/O addresses, the caller must have
311translated PCI I/O addresses (available in the PCI BARs) into a BSP or host
312driver custom address, see `Access functions`_ for how
313addresses are translated.
314
315.. code:: c
316
317    /* Read a register over PCI I/O Space \*/
318    extern uint8_t pci_io_r8(uint32_t adr);
319    extern uint16_t pci_io_r16(uint32_t adr);
320    extern uint32_t pci_io_r32(uint32_t adr);
321    /* Write a register over PCI I/O Space \*/
322    extern void pci_io_w8(uint32_t adr, uint8_t data);
323    extern void pci_io_w16(uint32_t adr, uint16_t data);
324    extern void pci_io_w32(uint32_t adr, uint32_t data);
325
326Registers over Memory space
327~~~~~~~~~~~~~~~~~~~~~~~~~~~
328
329PCI host bridge hardware normally swap data accesses into the endianness of the
330host architecture in order to lower the load of the CPU, peripherals can do DMA
331without swapping. However, the host controller can not separate a standard
332memory access from a memory access to a register, registers may be mapped into
333memory space. This leads to register content being swapped, which must be
334swapped back. The below routines makes it possible to access registers over PCI
335memory space in a portable way on different architectures, the BSP or
336architecture must provide necessary functions in order to implement this.
337.. code:: c
338
339    static inline uint16_t pci_ld_le16(volatile uint16_t \*addr);
340    static inline void pci_st_le16(volatile uint16_t \*addr, uint16_t val);
341    static inline uint32_t pci_ld_le32(volatile uint32_t \*addr);
342    static inline void pci_st_le32(volatile uint32_t \*addr, uint32_t val);
343    static inline uint16_t pci_ld_be16(volatile uint16_t \*addr);
344    static inline void pci_st_be16(volatile uint16_t \*addr, uint16_t val);
345    static inline uint32_t pci_ld_be32(volatile uint32_t \*addr);
346    static inline void pci_st_be32(volatile uint32_t \*addr, uint32_t val);
347
348In order to support non-standard big-endian PCI bus the above pci_* functions
349is required, pci_ld_le16 != ld_le16 on big endian PCI buses.
350
351Access functions
352~~~~~~~~~~~~~~~~
353
354The PCI Access Library can provide device drivers with function pointers
355executing the above Configuration, I/O and Memory space accesses. The
356functions have the same arguments and return values as the above
357functions.
358
359The pci_access_func() function defined below can be used to get a function
360pointer of a specific access type.
361.. code:: c
362
363    /* Get Read/Write function for accessing a register over PCI Memory Space
364    * (non-inline functions).
365    *
366    * Arguments
367    *  wr             0(Read), 1(Write)
368    *  size           1(Byte), 2(Word), 4(Double Word)
369    *  func           Where function pointer will be stored
370    *  endian         PCI_LITTLE_ENDIAN or PCI_BIG_ENDIAN
371    *  type           1(I/O), 3(REG over MEM), 4(CFG)
372    *
373    * Return
374    *  0              Found function
375    *  others         No such function defined by host driver or BSP
376    \*/
377    int pci_access_func(int wr, int size, void \**func, int endian, int type);
378
379PCI device drivers may be written to support run-time detection of endianess,
380this is mosly for debugging or for development systems. When the product is
381finally deployed macros switch to using the inline functions instead which
382have been configured for the correct endianness.
383
384PCI address translation
385~~~~~~~~~~~~~~~~~~~~~~~
386
387When PCI addresses, both I/O and memory space, is not mapped 1:1 address
388translation before access is needed. If drivers read the PCI resources directly
389using configuration space routines or in the device tree, the addresses given
390are PCI addresses. The below functions can be used to translate PCI addresses
391into CPU accessible addresses or vice versa, translation may be different for
392different PCI spaces/regions.
393.. code:: c
394
395    /* Translate PCI address into CPU accessible address \*/
396    static inline int pci_pci2cpu(uint32_t \*address, int type);
397    /* Translate CPU accessible address into PCI address (for DMA) \*/
398    static inline int pci_cpu2pci(uint32_t \*address, int type);
399
400PCI Interrupt
401-------------
402
403The PCI specification defines four different interrupt lines INTA#..INTD#,
404the interrupts are low level sensitive which make it possible to support
405multiple interrupt sources on the same interrupt line. Since the lines are
406level sensitive the interrupt sources must be acknowledged before clearing the
407interrupt contoller, or the interrupt controller must be masked. The BSP must
408provide a routine for clearing/acknowledging the interrupt controller, it is
409up to the interrupt service routine to acknowledge the interrupt source.
410
411The PCI Library relies on the BSP for implementing shared interrupt handling
412through the BSP_PCI_shared_interrupt_* functions/macros, they must be defined
413when including bsp.h.
414
415PCI device drivers may use the pci_interrupt_* routines in order to call the
416BSP specific functions in a platform independent way. The PCI interrupt
417interface has been made similar to the RTEMS IRQ extension so that a BSP can
418use the standard RTEMS interrupt functions directly.
419
420PCI Shell command
421-----------------
422
423The RTEMS shell has a PCI command 'pci' which makes it possible to read/write
424configuration space, print the current PCI configuration and print out a
425configuration C-file for the static or peripheral library.
426
427.. COMMENT: COPYRIGHT (c) 1988-2007.
428
429.. COMMENT: On-Line Applications Research Corporation (OAR).
430
431.. COMMENT: All rights reserved.
432
Note: See TracBrowser for help on using the repository browser.