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

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [rtos/] [ecos-2.0/] [packages/] [io/] [pci/] [v2_0/] [include/] [pci.h] - Blame information for rev 307

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 27 unneback
#ifndef CYGONCE_PCI_H
2
#define CYGONCE_PCI_H
3
//=============================================================================
4
//
5
//      pci.h
6
//
7
//      PCI library
8
//
9
//=============================================================================
10
//####ECOSGPLCOPYRIGHTBEGIN####
11
// -------------------------------------------
12
// This file is part of eCos, the Embedded Configurable Operating System.
13
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
14
//
15
// eCos is free software; you can redistribute it and/or modify it under
16
// the terms of the GNU General Public License as published by the Free
17
// Software Foundation; either version 2 or (at your option) any later version.
18
//
19
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
20
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
21
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
22
// for more details.
23
//
24
// You should have received a copy of the GNU General Public License along
25
// with eCos; if not, write to the Free Software Foundation, Inc.,
26
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
27
//
28
// As a special exception, if other files instantiate templates or use macros
29
// or inline functions from this file, or you compile this file and link it
30
// with other works to produce a work based on this file, this file does not
31
// by itself cause the resulting work to be covered by the GNU General Public
32
// License. However the source code for this file must still be made available
33
// in accordance with section (3) of the GNU General Public License.
34
//
35
// This exception does not invalidate any other reasons why a work based on
36
// this file might be covered by the GNU General Public License.
37
//
38
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
39
// at http://sources.redhat.com/ecos/ecos-license/
40
// -------------------------------------------
41
//####ECOSGPLCOPYRIGHTEND####
42
//=============================================================================
43
//#####DESCRIPTIONBEGIN####
44
//
45
// Author(s):    jskov, from design by nickg 
46
// Contributors: jskov
47
// Date:         1999-08-09
48
// Purpose:      PCI configuration access
49
// Usage:
50
//              #include <cyg/io/pci.h>
51
// Description: 
52
//             This library provides a set of routines for accessing 
53
//             the PCI bus configuration space in a portable manner. 
54
//             This is provided by two APIs. The high level API (defined
55
//             by this file) is used by device drivers, or other code, to
56
//             access the PCI configuration space portably. The low level
57
//             API (see pci_hw.h) is used  by the PCI library itself
58
//             to access the hardware in a platform-specific manner and
59
//             may also be used by device drivers to access the PCI
60
//             configuration space directly.
61
//
62
//####DESCRIPTIONEND####
63
//
64
//=============================================================================
65
 
66
#include <cyg/infra/cyg_type.h>
67
#include <cyg/io/pci_cfg.h>
68
#include <cyg/io/pci_hw.h>
69
 
70
//------------------------------------------------------------------
71
// The PCI memory space can span 64 bits, IO space only 32 bits
72
typedef CYG_WORD64 CYG_PCI_ADDRESS64;
73
typedef CYG_WORD32 CYG_PCI_ADDRESS32;
74
 
75
//------------------------------------------------------------------
76
// Macros for manufacturing and decomposing device ids
77
typedef CYG_WORD32 cyg_pci_device_id;           // PCI device ID
78
 
79
#define CYG_PCI_DEV_MAKE_ID(__bus,__devfn) (((__bus)<<16)|((__devfn)<<8))
80
#define CYG_PCI_DEV_GET_BUS(__devid) ((__devid>>16)&0xFF)
81
#define CYG_PCI_DEV_GET_DEVFN(__devid) ((__devid>>8)&0xFF)
82
 
83
#define CYG_PCI_NULL_DEVID 0xffffffff
84
#define CYG_PCI_NULL_DEVFN 0xffff
85
 
86
//------------------------------------------------------------------
87
// PCI device data definitions and structures
88
 
89
typedef enum {
90
    CYG_PCI_HEADER_NORMAL = 0,
91
    CYG_PCI_HEADER_BRIDGE = 1,
92
    CYG_PCI_HEADER_CARDBUS_BRIDGE = 2
93
} cyg_pci_header_type;
94
 
95
typedef struct                          // PCI device data
96
{
97
    cyg_pci_device_id devid;            // ID of this device
98
 
99
    // The following fields are read out of the
100
    // config space for this device.
101
 
102
    cyg_uint16  vendor;                 // vendor ID
103
    cyg_uint16  device;                 // device ID
104
    cyg_uint16  command;                // command register
105
    cyg_uint16  status;                 // status register
106
    cyg_uint32  class_rev;              // class+revision
107
    cyg_uint8   cache_line_size;        // cache line size
108
    cyg_uint8   latency_timer;          // latency timer
109
    cyg_pci_header_type header_type;    // header type
110
    cyg_uint8   bist;                   // Built-in Self-Test
111
    cyg_uint32  base_address[6];        // Memory base address registers
112
 
113
    // The following fields are used by the resource allocation
114
    // routines to keep track of allocated resources.
115
    cyg_uint32 num_bars;
116
 
117
    cyg_uint32 base_size[6];            // Memory size for each base address
118
    cyg_uint32 base_map[6];             // Physical address mapped
119
 
120
    CYG_ADDRWORD hal_vector;            // HAL interrupt vector used by
121
                                        // device if int_line!=0
122
 
123
    // One of the following unions will be filled in according to
124
    // the value of the header_type field.
125
 
126
    union
127
    {
128
        struct
129
        {
130
            cyg_uint32  cardbus_cis;    // CardBus CIS Pointer
131
            cyg_uint16  sub_vendor;     // subsystem vendor id
132
            cyg_uint16  sub_id;         // subsystem id
133
            cyg_uint32  rom_address;    // ROM address register
134
            cyg_uint8   cap_list;       // capability list
135
            cyg_uint8   reserved1[7];
136
            cyg_uint8   int_line;       // interrupt line
137
            cyg_uint8   int_pin;        // interrupt pin
138
            cyg_uint8   min_gnt;        // timeslice request
139
            cyg_uint8   max_lat;        // priority-level request
140
        } normal;
141
        struct
142
        {
143
            cyg_uint8   pri_bus;                // primary bus number
144
            cyg_uint8   sec_bus;                // secondary bus number
145
            cyg_uint8   sub_bus;                // subordinate bus number
146
            cyg_uint8   sec_latency_timer;      // secondary bus latency
147
            cyg_uint8   io_base;
148
            cyg_uint8   io_limit;
149
            cyg_uint16  sec_status;             // secondary bus status
150
            cyg_uint16  mem_base;
151
            cyg_uint16  mem_limit;
152
            cyg_uint16  prefetch_base;
153
            cyg_uint16  prefetch_limit;
154
            cyg_uint32  prefetch_base_upper32;
155
            cyg_uint32  prefetch_limit_upper32;
156
            cyg_uint16  io_base_upper16;
157
            cyg_uint16  io_limit_upper16;
158
            cyg_uint8   reserved1[4];
159
            cyg_uint32  rom_address;            // ROM address register
160
            cyg_uint8   int_line;               // interrupt line
161
            cyg_uint8   int_pin;                // interrupt pin
162
            cyg_uint16  control;                // bridge control
163
        } bridge;
164
        struct
165
        {
166
            // Not yet supported
167
        } cardbus_bridge;
168
    } header;
169
} cyg_pci_device;
170
 
171
//------------------------------------------------------------------------
172
// Init
173
externC void cyg_pci_init( void );
174
 
175
//------------------------------------------------------------------------
176
// Common device configuration access functions
177
 
178
// This function gets the PCI configuration information for the
179
// device indicated in devid. The common fields of the cyg_pci_device
180
// structure, and the appropriate fields of the relevant header union
181
// member are filled in from the device's configuration space. If the
182
// device has not been enabled, then this function will also fetch
183
// the size and type information from the base address registers and
184
// place it in the base_size[] array.
185
externC void cyg_pci_get_device_info ( cyg_pci_device_id devid,
186
                                        cyg_pci_device *dev_info );
187
 
188
 
189
// This function sets the PCI configuration information for the
190
// device indicated in devid. Only the configuration space registers
191
// that are writable are actually written. Once all the fields have
192
// been written, the device info will be read back into *dev_info, so
193
// that it reflects the true state of the hardware.
194
externC void cyg_pci_set_device_info ( cyg_pci_device_id devid,
195
                                       cyg_pci_device *dev_info );
196
 
197
//------------------------------------------------------------------------
198
// Device find functions
199
 
200
// Searches the PCI bus configuration space for a device with the
201
// given vendor and device ids. The search starts at the device
202
// pointed to by devid, or at the first slot if it contains
203
// CYG_PCI_NULL_DEVID. *devid will be updated with the ID of the next
204
// device found. Returns true if one is found and false if not.
205
externC cyg_bool cyg_pci_find_device( cyg_uint16 vendor, cyg_uint16 device,
206
                                      cyg_pci_device_id *devid );
207
 
208
 
209
// Searches the PCI bus configuration space for a device with the
210
// given class code.  The search starts at the device pointed to by
211
// devid, or at the first slot if it contains CYG_PCI_NULL_DEVID.
212
// *devid will be updated with the ID of the next device found.
213
// Returns true if one is found and false if not.
214
externC cyg_bool cyg_pci_find_class( cyg_uint32 dev_class,
215
                                     cyg_pci_device_id *devid );
216
 
217
 
218
 
219
// Searches the PCI bus configuration space for a device whose properties
220
// match those required by the match_func, which the user supplies.  The
221
// match_func's arguments are vendor, device, class exactly as they might
222
// be in the two APIs above.  The additional parameter is for any state
223
// which a caller might wish available to its callback routine.
224
// The search starts at the device pointed to by
225
// devid, or at the first slot if it contains CYG_PCI_NULL_DEVID.  *devid
226
// will be updated with the ID of the next device found.  Returns true if
227
// one is found and false if not.
228
typedef cyg_bool (cyg_pci_match_func)( cyg_uint16,/* vendor */
229
                                       cyg_uint16,/* device */
230
                                       cyg_uint32,/* class  */
231
                                       void * /* arbitrary user data */ );
232
externC cyg_bool cyg_pci_find_matching( cyg_pci_match_func *matchp,
233
                                        void * match_callback_data,
234
                                        cyg_pci_device_id *devid );
235
 
236
 
237
// Searches the PCI configuration space for the next valid device
238
// after cur_devid. If cur_devid is given the value
239
// CYG_PCI_NULL_DEVID, then the search starts at the first slot. It
240
// is permitted for next_devid to point to the cur_devid.  Returns
241
// true if another device is found and false if not.
242
externC cyg_bool cyg_pci_find_next( cyg_pci_device_id cur_devid,
243
                                    cyg_pci_device_id *next_devid );
244
 
245
//------------------------------------------------------------------------
246
// Resource Allocation
247
// These routines allocate memory and IO space to PCI devices.
248
 
249
// Allocate memory and IO space to all base address registers using
250
// the current memory and IO base addresses in the library. If
251
// dev_info does not contain valid base_size[] entries, then the
252
// result is false.
253
externC cyg_bool cyg_pci_configure_device( cyg_pci_device *dev_info );
254
 
255
// Allocate memory and IO space for all devices found on the given
256
// bus and its subordinate busses. This routine recurses when a
257
// PCI-to-PCI bridge is encountered. The next_bus argument points
258
// to a variable holding the bus number of the next PCI bus to
259
// be allocated when a bridge is encountered. This routine returns
260
// true if successful, false if unsuccessful.
261
externC cyg_bool cyg_pci_configure_bus( cyg_uint8 bus,
262
                                        cyg_uint8 *next_bus );
263
 
264
// These routines set the base addresses for memory and IO mappings
265
// to be used by the memory allocation routines. Normally these base
266
// addresses will be set to default values based on the platform,
267
// these routines allow those to be changed by application code if
268
// necessary.
269
externC void cyg_pci_set_memory_base( CYG_PCI_ADDRESS64 base );
270
externC void cyg_pci_set_io_base( CYG_PCI_ADDRESS32 base );
271
 
272
// These routines allocate memory or IO space to the base address
273
// register indicated by bar. The base address in *base will be
274
// correctly aligned and the address of the next free location will
275
// be written back into it if the allocation succeeds. If the base
276
// address register is of the wrong type for this allocation, or
277
// dev_info does not contain valid base_size[] entries, the result is
278
// false.
279
externC cyg_bool cyg_pci_allocate_memory( cyg_pci_device *dev_info,
280
                                          cyg_uint32 bar,
281
                                          CYG_PCI_ADDRESS64 *base );
282
externC cyg_bool cyg_pci_allocate_io( cyg_pci_device *dev_info,
283
                                      cyg_uint32 bar,
284
                                      CYG_PCI_ADDRESS32 *base );
285
 
286
// Translate the device's PCI interrupt (INTA#-INTD#) to the
287
// associated HAL vector. This may also depend on which slot the
288
// device occupies. If the device may generate interrupts, the
289
// translated vector number will be stored in vec and the result is
290
// true. Otherwise the result is false.
291
externC cyg_bool cyg_pci_translate_interrupt( cyg_pci_device *dev_info,
292
                                              CYG_ADDRWORD *vec );
293
 
294
 
295
//----------------------------------------------------------------------
296
// Specific device configuration access functions
297
 
298
// Read functions
299
// These functions read registers of the appropriate size from the
300
// configuration space of the given device. They should mainly be
301
// used to access registers that are device specific. General PCI
302
// registers are best accessed through cyg_pci_get_device_info().
303
externC void cyg_pci_read_config_uint8( cyg_pci_device_id devid,
304
                                        cyg_uint8 offset, cyg_uint8 *val);
305
externC void cyg_pci_read_config_uint16( cyg_pci_device_id devid,
306
                                         cyg_uint8 offset, cyg_uint16 *val);
307
externC void cyg_pci_read_config_uint32( cyg_pci_device_id devid,
308
                                         cyg_uint8 offset, cyg_uint32 *val);
309
 
310
// Write functions
311
// These functions write registers of the appropriate size to the
312
// configuration space of the given device. They should mainly be
313
// used to access registers that are device specific. General PCI
314
// registers are best accessed through
315
// cyg_pci_get_device_info(). Writing the general registers this way
316
// may render the contents of a cyg_pci_device structure invalid.
317
externC void cyg_pci_write_config_uint8( cyg_pci_device_id devid,
318
                                         cyg_uint8 offset, cyg_uint8 val);
319
externC void cyg_pci_write_config_uint16( cyg_pci_device_id devid,
320
                                          cyg_uint8 offset, cyg_uint16 val);
321
externC void cyg_pci_write_config_uint32( cyg_pci_device_id devid,
322
                                          cyg_uint8 offset, cyg_uint32 val);
323
 
324
 
325
//----------------------------------------------------------------------
326
// Functions private to the PCI library. These should only be used by
327
// tests.
328
externC cyg_bool cyg_pci_allocate_memory_priv(cyg_pci_device *dev_info,
329
                                              cyg_uint32 bar,
330
                                              CYG_PCI_ADDRESS64 *base,
331
                                             CYG_PCI_ADDRESS64 *assigned_addr);
332
externC cyg_bool cyg_pci_allocate_io_priv( cyg_pci_device *dev_info,
333
                                           cyg_uint32 bar,
334
                                           CYG_PCI_ADDRESS32 *base,
335
                                           CYG_PCI_ADDRESS32 *assigned_addr);
336
 
337
 
338
//----------------------------------------------------------------------
339
// Bus probing limits.
340
// Note: these can be overridden by the platform
341
#ifndef CYG_PCI_MAX_BUS
342
#define CYG_PCI_MAX_BUS                      8  // Eight is enough?
343
#endif
344
#ifndef CYG_PCI_MAX_DEV
345
#define CYG_PCI_MAX_DEV                      32
346
#endif
347
#ifndef CYG_PCI_MIN_DEV
348
#define CYG_PCI_MIN_DEV                      0
349
#endif
350
#ifndef CYG_PCI_MAX_FN
351
#define CYG_PCI_MAX_FN                       8
352
#endif
353
#ifndef CYG_PCI_MAX_BAR
354
#define CYG_PCI_MAX_BAR                      6
355
#endif
356
 
357
//-----------------------------------------------------------------------------
358
#endif // ifndef CYGONCE_PCI_H
359
// End of pci.h

powered by: WebSVN 2.1.0

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