OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [Documentation/] [pci.txt] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
                         How To Write Linux PCI Drivers
2
 
3
                   by Martin Mares  on 07-Feb-2000
4
 
5
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6
The world of PCI is vast and it's full of (mostly unpleasant) surprises.
7
Different PCI devices have different requirements and different bugs --
8
because of this, the PCI support layer in Linux kernel is not as trivial
9
as one would wish. This short pamphlet tries to help all potential driver
10
authors to find their way through the deep forests of PCI handling.
11
 
12
 
13
0. Structure of PCI drivers
14
~~~~~~~~~~~~~~~~~~~~~~~~~~~
15
There exist two kinds of PCI drivers: new-style ones (which leave most of
16
probing for devices to the PCI layer and support online insertion and removal
17
of devices [thus supporting PCI, hot-pluggable PCI and CardBus in single
18
driver]) and old-style ones which just do all the probing themselves. Unless
19
you have a very good reason to do so, please don't use the old way of probing
20
in any new code. After the driver finds the devices it wishes to operate
21
on (either the old or the new way), it needs to perform the following steps:
22
 
23
        Enable the device
24
        Access device configuration space
25
        Discover resources (addresses and IRQ numbers) provided by the device
26
        Allocate these resources
27
        Communicate with the device
28
 
29
Most of these topics are covered by the following sections, for the rest
30
look at , it's hopefully well commented.
31
 
32
If the PCI subsystem is not configured (CONFIG_PCI is not set), most of
33
the functions described below are defined as inline functions either completely
34
empty or just returning an appropriate error codes to avoid lots of ifdefs
35
in the drivers.
36
 
37
 
38
1. New-style drivers
39
~~~~~~~~~~~~~~~~~~~~
40
The new-style drivers just call pci_register_driver during their initialization
41
with a pointer to a structure describing the driver (struct pci_driver) which
42
contains:
43
 
44
        name            Name of the driver
45
        id_table        Pointer to table of device ID's the driver is
46
                        interested in.  Most drivers should export this
47
                        table using MODULE_DEVICE_TABLE(pci,...).
48
                        Set to NULL to call probe() function for every
49
                        PCI device known to the system.
50
        probe           Pointer to a probing function which gets called (during
51
                        execution of pci_register_driver for already existing
52
                        devices or later if a new device gets inserted) for all
53
                        PCI devices which match the ID table and are not handled
54
                        by the other drivers yet. This function gets passed a
55
                        pointer to the pci_dev structure representing the device
56
                        and also which entry in the ID table did the device
57
                        match. It returns zero when the driver has accepted the
58
                        device or an error code (negative number) otherwise.
59
                        This function always gets called from process context,
60
                        so it can sleep.
61
        remove          Pointer to a function which gets called whenever a
62
                        device being handled by this driver is removed (either
63
                        during deregistration of the driver or when it's
64
                        manually pulled out of a hot-pluggable slot). This
65
                        function always gets called from process context, so it
66
                        can sleep.
67
        save_state      Save a device's state before it's suspend.
68
        suspend         Put device into low power state.
69
        resume          Wake device from low power state.
70
        enable_wake     Enable device to generate wake events from a low power
71
                        state.
72
 
73
                        (Please see Documentation/power/pci.txt for descriptions
74
                        of PCI Power Management and the related functions)
75
 
76
The ID table is an array of struct pci_device_id ending with a all-zero entry.
77
Each entry consists of:
78
 
79
        vendor, device  Vendor and device ID to match (or PCI_ANY_ID)
80
        subvendor,      Subsystem vendor and device ID to match (or PCI_ANY_ID)
81
        subdevice
82
        class,          Device class to match. The class_mask tells which bits
83
        class_mask      of the class are honored during the comparison.
84
        driver_data     Data private to the driver.
85
 
86
When the driver exits, it just calls pci_unregister_driver() and the PCI layer
87
automatically calls the remove hook for all devices handled by the driver.
88
 
89
Please mark the initialization and cleanup functions where appropriate
90
(the corresponding macros are defined in ):
91
 
92
        __init          Initialization code. Thrown away after the driver
93
                        initializes.
94
        __exit          Exit code. Ignored for non-modular drivers.
95
        __devinit       Device initialization code. Identical to __init if
96
                        the kernel is not compiled with CONFIG_HOTPLUG, normal
97
                        function otherwise.
98
        __devexit       The same for __exit.
99
 
100
Tips:
101
        The module_init()/module_exit() functions (and all initialization
102
        functions called only from these) should be marked __init/exit.
103
        The struct pci_driver shouldn't be marked with any of these tags.
104
        The ID table array should be marked __devinitdata.
105
        The probe() and remove() functions (and all initialization
106
        functions called only from these) should be marked __devinit/exit.
107
        If you are sure the driver is not a hotplug driver then use only
108
        __init/exit __initdata/exitdata.
109
 
110
        Pointers to functions marked as __devexit must be created using
111
        __devexit_p(function_name).  That will generate the function
112
        name or NULL if the __devexit function will be discarded.
113
 
114
 
115
2. How to find PCI devices manually (the old style)
116
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
117
PCI drivers not using the pci_register_driver() interface search
118
for PCI devices manually using the following constructs:
119
 
120
Searching by vendor and device ID:
121
 
122
        struct pci_dev *dev = NULL;
123
        while (dev = pci_find_device(VENDOR_ID, DEVICE_ID, dev))
124
                configure_device(dev);
125
 
126
Searching by class ID (iterate in a similar way):
127
 
128
        pci_find_class(CLASS_ID, dev)
129
 
130
Searching by both vendor/device and subsystem vendor/device ID:
131
 
132
        pci_find_subsys(VENDOR_ID, DEVICE_ID, SUBSYS_VENDOR_ID, SUBSYS_DEVICE_ID, dev).
133
 
134
   You can use the constant PCI_ANY_ID as a wildcard replacement for
135
VENDOR_ID or DEVICE_ID.  This allows searching for any device from a
136
specific vendor, for example.
137
 
138
   In case you need to decide according to some more complex criteria,
139
you can walk the list of all known PCI devices yourself:
140
 
141
        struct pci_dev *dev;
142
        pci_for_each_dev(dev) {
143
                ... do anything you want with dev ...
144
        }
145
 
146
For compatibility with device ordering in older kernels, you can also
147
use pci_for_each_dev_reverse(dev) for walking the list in the opposite
148
direction.
149
 
150
 
151
3. Enabling devices
152
~~~~~~~~~~~~~~~~~~~
153
   Before you do anything with the device you've found, you need to enable
154
it by calling pci_enable_device() which enables I/O and memory regions of
155
the device, assigns missing resources if needed and wakes up the device
156
if it was in suspended state. Please note that this function can fail.
157
 
158
   If you want to use the device in bus mastering mode, call pci_set_master()
159
which enables the bus master bit in PCI_COMMAND register and also fixes
160
the latency timer value if it's set to something bogus by the BIOS.
161
 
162
   If you want to use the PCI Memory-Write-Invalidate transaction,
163
call pci_set_mwi().  This enables bit PCI_COMMAND bit for Mem-Wr-Inval
164
and also ensures that the cache line size register is set correctly.
165
Make sure to check the return value of pci_set_mwi(), not all architectures
166
may support Memory-Write-Invalidate.
167
 
168
4. How to access PCI config space
169
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
170
   You can use pci_(read|write)_config_(byte|word|dword) to access the config
171
space of a device represented by struct pci_dev *. All these functions return 0
172
when successful or an error code (PCIBIOS_...) which can be translated to a text
173
string by pcibios_strerror. Most drivers expect that accesses to valid PCI
174
devices don't fail.
175
 
176
   If you access fields in the standard portion of the config header, please
177
use symbolic names of locations and bits declared in .
178
 
179
   If you need to access Extended PCI Capability registers, just call
180
pci_find_capability() for the particular capability and it will find the
181
corresponding register block for you.
182
 
183
 
184
5. Addresses and interrupts
185
~~~~~~~~~~~~~~~~~~~~~~~~~~~
186
   Memory and port addresses and interrupt numbers should NOT be read from the
187
config space. You should use the values in the pci_dev structure as they might
188
have been remapped by the kernel.
189
 
190
   See Documentation/IO-mapping.txt for how to access device memory.
191
 
192
   You still need to call request_region() for I/O regions and
193
request_mem_region() for memory regions to make sure nobody else is using the
194
same device.
195
 
196
   All interrupt handlers should be registered with SA_SHIRQ and use the devid
197
to map IRQs to devices (remember that all PCI interrupts are shared).
198
 
199
 
200
6. Other interesting functions
201
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
202
pci_find_slot()                 Find pci_dev corresponding to given bus and
203
                                slot numbers.
204
pci_set_power_state()           Set PCI Power Management state (0=D0 ... 3=D3)
205
pci_find_capability()           Find specified capability in device's capability
206
                                list.
207
pci_module_init()               Inline helper function for ensuring correct
208
                                pci_driver initialization and error handling.
209
pci_resource_start()            Returns bus start address for a given PCI region
210
pci_resource_end()              Returns bus end address for a given PCI region
211
pci_resource_len()              Returns the byte length of a PCI region
212
pci_set_drvdata()               Set private driver data pointer for a pci_dev
213
pci_get_drvdata()               Return private driver data pointer for a pci_dev
214
pci_set_mwi()                   Enable Memory-Write-Invalidate transactions.
215
pci_clear_mwi()                 Disable Memory-Write-Invalidate transactions.
216
 
217
 
218
7. Miscellaneous hints
219
~~~~~~~~~~~~~~~~~~~~~~
220
When displaying PCI slot names to the user (for example when a driver wants
221
to tell the user what card has it found), please use pci_dev->slot_name
222
for this purpose.
223
 
224
Always refer to the PCI devices by a pointer to the pci_dev structure.
225
All PCI layer functions use this identification and it's the only
226
reasonable one. Don't use bus/slot/function numbers except for very
227
special purposes -- on systems with multiple primary buses their semantics
228
can be pretty complex.
229
 
230
If you're going to use PCI bus mastering DMA, take a look at
231
Documentation/DMA-mapping.txt.
232
 
233
 
234
8. Obsolete functions
235
~~~~~~~~~~~~~~~~~~~~~
236
There are several functions kept only for compatibility with old drivers
237
not updated to the new PCI interface. Please don't use them in new code.
238
 
239
pcibios_present()               Since ages, you don't need to test presence
240
                                of PCI subsystem when trying to talk with it.
241
                                If it's not there, the list of PCI devices
242
                                is empty and all functions for searching for
243
                                devices just return NULL.
244
pcibios_(read|write)_*          Superseded by their pci_(read|write)_*
245
                                counterparts.
246
pcibios_find_*                  Superseded by their pci_find_* counterparts.

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.