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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [include/] [asm-ia64/] [sn/] [pci/] [pciio.h] - Blame information for rev 1774

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

Line No. Rev Author Line
1 1275 phoenix
/* $Id: pciio.h,v 1.1.1.1 2004-04-15 02:42:54 phoenix Exp $
2
 *
3
 * This file is subject to the terms and conditions of the GNU General Public
4
 * License.  See the file "COPYING" in the main directory of this archive
5
 * for more details.
6
 *
7
 * Copyright (C) 1992 - 1997, 2000-2003 Silicon Graphics, Inc. All rights reserved.
8
 */
9
#ifndef _ASM_SN_PCI_PCIIO_H
10
#define _ASM_SN_PCI_PCIIO_H
11
 
12
/*
13
 * pciio.h -- platform-independent PCI interface
14
 */
15
 
16
#ifdef __KERNEL__
17
#include <linux/config.h>
18
#include <linux/ioport.h>
19
#include <asm/sn/ioerror.h>
20
#include <asm/sn/driver.h>
21
#include <asm/sn/invent.h>
22
#include <asm/sn/hcl.h>
23
#else
24
#include <linux/config.h>
25
#include <linux/ioport.h>
26
#include <ioerror.h>
27
#include <driver.h>
28
#include <hcl.h>
29
#endif
30
 
31
#ifndef __ASSEMBLY__
32
 
33
#ifdef __KERNEL__
34
#include <asm/sn/dmamap.h>
35
#include <asm/sn/alenlist.h>
36
#else
37
#include <dmamap.h>
38
#include <alenlist.h>
39
#endif
40
 
41
typedef int pciio_vendor_id_t;
42
 
43
#define PCIIO_VENDOR_ID_NONE    (-1)
44
 
45
typedef int pciio_device_id_t;
46
 
47
#define PCIIO_DEVICE_ID_NONE    (-1)
48
 
49
typedef uint8_t pciio_bus_t;       /* PCI bus number (0..255) */
50
typedef uint8_t pciio_slot_t;      /* PCI slot number (0..31, 255) */
51
typedef uint8_t pciio_function_t;  /* PCI func number (0..7, 255) */
52
 
53
#define PCIIO_SLOTS             ((pciio_slot_t)32)
54
#define PCIIO_FUNCS             ((pciio_function_t)8)
55
 
56
#define PCIIO_SLOT_NONE         ((pciio_slot_t)255)
57
#define PCIIO_FUNC_NONE         ((pciio_function_t)255)
58
 
59
typedef int pciio_intr_line_t;          /* PCI interrupt line(s) */
60
 
61
#define PCIIO_INTR_LINE(n)      (0x1 << (n))
62
#define PCIIO_INTR_LINE_A       (0x1)
63
#define PCIIO_INTR_LINE_B       (0x2)
64
#define PCIIO_INTR_LINE_C       (0x4)
65
#define PCIIO_INTR_LINE_D       (0x8)
66
 
67
typedef int pciio_space_t;              /* PCI address space designation */
68
 
69
#define PCIIO_SPACE_NONE        (0)
70
#define PCIIO_SPACE_ROM         (1)
71
#define PCIIO_SPACE_IO          (2)
72
/*      PCIIO_SPACE_            (3) */
73
#define PCIIO_SPACE_MEM         (4)
74
#define PCIIO_SPACE_MEM32       (5)
75
#define PCIIO_SPACE_MEM64       (6)
76
#define PCIIO_SPACE_CFG         (7)
77
#define PCIIO_SPACE_WIN0        (8)
78
#define PCIIO_SPACE_WIN(n)      (PCIIO_SPACE_WIN0+(n))  /* 8..13 */
79
/*      PCIIO_SPACE_            (14) */
80
#define PCIIO_SPACE_BAD         (15)
81
 
82
#if 1   /* does anyone really use these? */
83
#define PCIIO_SPACE_USER0       (20)
84
#define PCIIO_SPACE_USER(n)     (PCIIO_SPACE_USER0+(n)) /* 20 .. ? */
85
#endif
86
 
87
/*
88
 * PCI_NOWHERE is the error value returned in
89
 * place of a PCI address when there is no
90
 * corresponding address.
91
 */
92
#define PCI_NOWHERE             (0)
93
 
94
/*
95
 *    Acceptable flag bits for pciio service calls
96
 *
97
 * PCIIO_FIXED: require that mappings be established
98
 *      using fixed sharable resources; address
99
 *      translation results will be permanently
100
 *      available. (PIOMAP_FIXED and DMAMAP_FIXED are
101
 *      the same numeric value and are acceptable).
102
 * PCIIO_NOSLEEP: if any part of the operation would
103
 *      sleep waiting for resoruces, return an error
104
 *      instead. (PIOMAP_NOSLEEP and DMAMAP_NOSLEEP are
105
 *      the same numeric value and are acceptable).
106
 * PCIIO_INPLACE: when operating on alenlist structures,
107
 *      reuse the source alenlist rather than creating a
108
 *      new one. (PIOMAP_INPLACE and DMAMAP_INPLACE are
109
 *      the same numeric value and are acceptable).
110
 *
111
 * PCIIO_DMA_CMD: configure this stream as a
112
 *      generic "command" stream. Generally this
113
 *      means turn off prefetchers and write
114
 *      gatherers, and whatever else might be
115
 *      necessary to make command ring DMAs
116
 *      work as expected.
117
 * PCIIO_DMA_DATA: configure this stream as a
118
 *      generic "data" stream. Generally, this
119
 *      means turning on prefetchers and write
120
 *      gatherers, and anything else that might
121
 *      increase the DMA throughput (short of
122
 *      using "high priority" or "real time"
123
 *      resources that may lower overall system
124
 *      performance).
125
 * PCIIO_DMA_A64: this device is capable of
126
 *      using 64-bit DMA addresses. Unless this
127
 *      flag is specified, it is assumed that
128
 *      the DMA address must be in the low 4G
129
 *      of PCI space.
130
 * PCIIO_PREFETCH: if there are prefetchers
131
 *      available, they can be turned on.
132
 * PCIIO_NOPREFETCH: any prefetchers along
133
 *      the dma path should be turned off.
134
 * PCIIO_WRITE_GATHER: if there are write gatherers
135
 *      available, they can be turned on.
136
 * PCIIO_NOWRITE_GATHER: any write gatherers along
137
 *      the dma path should be turned off.
138
 *
139
 * PCIIO_BYTE_STREAM: the DMA stream represents a group
140
 *      of ordered bytes. Arrange all byte swapping
141
 *      hardware so that the bytes land in the correct
142
 *      order. This is a common setting for data
143
 *      channels, but is NOT implied by PCIIO_DMA_DATA.
144
 * PCIIO_WORD_VALUES: the DMA stream is used to
145
 *      communicate quantities stored in multiple bytes,
146
 *      and the device doing the DMA is little-endian;
147
 *      arrange any swapping hardware so that
148
 *      32-bit-wide values are maintained. This is a
149
 *      common setting for command rings that contain
150
 *      DMA addresses and counts, but is NOT implied by
151
 *      PCIIO_DMA_CMD. CPU Accesses to 16-bit fields
152
 *      must have their address xor-ed with 2, and
153
 *      accesses to individual bytes must have their
154
 *      addresses xor-ed with 3 relative to what the
155
 *      device expects.
156
 *
157
 * NOTE: any "provider specific" flags that
158
 * conflict with the generic flags will
159
 * override the generic flags, locally
160
 * at that provider.
161
 *
162
 * Also, note that PCI-generic flags (PCIIO_) are
163
 * in bits 0-14. The upper bits, 15-31, are reserved
164
 * for PCI implementation-specific flags.
165
 */
166
 
167
#define PCIIO_FIXED             DMAMAP_FIXED
168
#define PCIIO_NOSLEEP           DMAMAP_NOSLEEP
169
#define PCIIO_INPLACE           DMAMAP_INPLACE
170
 
171
#define PCIIO_DMA_CMD           0x0010
172
#define PCIIO_DMA_DATA          0x0020
173
#define PCIIO_DMA_A64           0x0040
174
 
175
#define PCIIO_WRITE_GATHER      0x0100
176
#define PCIIO_NOWRITE_GATHER    0x0200
177
#define PCIIO_PREFETCH          0x0400
178
#define PCIIO_NOPREFETCH        0x0800
179
 
180
/* Requesting an endianness setting that the
181
 * underlieing hardware can not support
182
 * WILL result in a failure to allocate
183
 * dmamaps or complete a dmatrans.
184
 */
185
#define PCIIO_BYTE_STREAM       0x1000  /* set BYTE SWAP for "byte stream" */
186
#define PCIIO_WORD_VALUES       0x2000  /* set BYTE SWAP for "word values" */
187
 
188
/*
189
 * Interface to deal with PCI endianness.
190
 * The driver calls pciio_endian_set once, supplying the actual endianness of
191
 * the device and the desired endianness.  On SGI systems, only use LITTLE if
192
 * dealing with a driver that does software swizzling.  Most of the time,
193
 * it's preferable to request BIG.  The return value indicates the endianness
194
 * that is actually achieved.  On systems that support hardware swizzling,
195
 * the achieved endianness will be the desired endianness.  On systems without
196
 * swizzle hardware, the achieved endianness will be the device's endianness.
197
 */
198
typedef enum pciio_endian_e {
199
    PCIDMA_ENDIAN_BIG,
200
    PCIDMA_ENDIAN_LITTLE
201
} pciio_endian_t;
202
 
203
/*
204
 * handles of various sorts
205
 */
206
typedef struct pciio_piomap_s *pciio_piomap_t;
207
typedef struct pciio_dmamap_s *pciio_dmamap_t;
208
typedef struct pciio_intr_s *pciio_intr_t;
209
typedef struct pciio_info_s *pciio_info_t;
210
typedef struct pciio_piospace_s *pciio_piospace_t;
211
typedef struct pciio_win_info_s *pciio_win_info_t;
212
typedef struct pciio_win_map_s *pciio_win_map_t;
213
typedef struct pciio_win_alloc_s *pciio_win_alloc_t;
214
 
215
/* PIO MANAGEMENT */
216
 
217
/*
218
 *    A NOTE ON PCI PIO ADDRESSES
219
 *
220
 *      PCI supports three different address spaces: CFG
221
 *      space, MEM space and I/O space. Further, each
222
 *      card always accepts CFG accesses at an address
223
 *      based on which slot it is attached to, but can
224
 *      decode up to six address ranges.
225
 *
226
 *      Assignment of the base address registers for all
227
 *      PCI devices is handled centrally; most commonly,
228
 *      device drivers will want to talk to offsets
229
 *      within one or another of the address ranges. In
230
 *      order to do this, which of these "address
231
 *      spaces" the PIO is directed into must be encoded
232
 *      in the flag word.
233
 *
234
 *      We reserve the right to defer allocation of PCI
235
 *      address space for a device window until the
236
 *      driver makes a piomap_alloc or piotrans_addr
237
 *      request.
238
 *
239
 *      If a device driver mucks with its device's base
240
 *      registers through a PIO mapping to CFG space,
241
 *      results of further PIO through the corresponding
242
 *      window are UNDEFINED.
243
 *
244
 *      Windows are named by the index in the base
245
 *      address register set for the device of the
246
 *      desired register; IN THE CASE OF 64 BIT base
247
 *      registers, the index should be to the word of
248
 *      the register that contains the mapping type
249
 *      bits; since the PCI CFG space is natively
250
 *      organized little-endian fashion, this is the
251
 *      first of the two words.
252
 *
253
 *      AT THE MOMENT, any required corrections for
254
 *      endianness are the responsibility of the device
255
 *      driver; not all platforms support control in
256
 *      hardware of byteswapping hardware. We anticipate
257
 *      providing flag bits to the PIO and DMA
258
 *      management interfaces to request different
259
 *      configurations of byteswapping hardware.
260
 *
261
 *      PIO Accesses to CFG space via the "Bridge" ASIC
262
 *      used in IP30 platforms preserve the native byte
263
 *      significance within the 32-bit word; byte
264
 *      addresses for single byte accesses need to be
265
 *      XORed with 3, and addresses for 16-bit accesses
266
 *      need to be XORed with 2.
267
 *
268
 *      The IOC3 used on IP30, and other SGI PCI devices
269
 *      as well, require use of 32-bit accesses to their
270
 *      configuration space registers. Any potential PCI
271
 *      bus providers need to be aware of this requirement.
272
 */
273
 
274
#define PCIIO_PIOMAP_CFG        (0x1)
275
#define PCIIO_PIOMAP_MEM        (0x2)
276
#define PCIIO_PIOMAP_IO         (0x4)
277
#define PCIIO_PIOMAP_WIN(n)     (0x8+(n))
278
 
279
typedef pciio_piomap_t
280
pciio_piomap_alloc_f    (vertex_hdl_t dev,      /* set up mapping for this device */
281
                         device_desc_t dev_desc,        /* device descriptor */
282
                         pciio_space_t space,   /* which address space */
283
                         iopaddr_t pcipio_addr,         /* starting address */
284
                         size_t byte_count,
285
                         size_t byte_count_max,         /* maximum size of a mapping */
286
                         unsigned flags);       /* defined in sys/pio.h */
287
 
288
typedef void
289
pciio_piomap_free_f     (pciio_piomap_t pciio_piomap);
290
 
291
typedef caddr_t
292
pciio_piomap_addr_f     (pciio_piomap_t pciio_piomap,   /* mapping resources */
293
                         iopaddr_t pciio_addr,  /* map for this pcipio address */
294
                         size_t byte_count);    /* map this many bytes */
295
 
296
typedef void
297
pciio_piomap_done_f     (pciio_piomap_t pciio_piomap);
298
 
299
typedef caddr_t
300
pciio_piotrans_addr_f   (vertex_hdl_t dev,      /* translate for this device */
301
                         device_desc_t dev_desc,        /* device descriptor */
302
                         pciio_space_t space,   /* which address space */
303
                         iopaddr_t pciio_addr,  /* starting address */
304
                         size_t byte_count,     /* map this many bytes */
305
                         unsigned flags);
306
 
307
typedef caddr_t
308
pciio_pio_addr_f        (vertex_hdl_t dev,      /* translate for this device */
309
                         device_desc_t dev_desc,        /* device descriptor */
310
                         pciio_space_t space,   /* which address space */
311
                         iopaddr_t pciio_addr,  /* starting address */
312
                         size_t byte_count,     /* map this many bytes */
313
                         pciio_piomap_t *mapp,  /* in case a piomap was needed */
314
                         unsigned flags);
315
 
316
typedef iopaddr_t
317
pciio_piospace_alloc_f  (vertex_hdl_t dev,      /* PIO space for this device */
318
                         device_desc_t dev_desc,        /* Device descriptor   */
319
                         pciio_space_t space,   /* which address space  */
320
                         size_t byte_count,     /* Number of bytes of space */
321
                         size_t alignment);     /* Alignment of allocation  */
322
 
323
typedef void
324
pciio_piospace_free_f   (vertex_hdl_t dev,      /* Device freeing space */
325
                         pciio_space_t space,   /* Which space is freed */
326
                         iopaddr_t pci_addr,    /* Address being freed */
327
                         size_t size);  /* Size freed           */
328
 
329
/* DMA MANAGEMENT */
330
 
331
typedef pciio_dmamap_t
332
pciio_dmamap_alloc_f    (vertex_hdl_t dev,      /* set up mappings for this device */
333
                         device_desc_t dev_desc,        /* device descriptor */
334
                         size_t byte_count_max,         /* max size of a mapping */
335
                         unsigned flags);       /* defined in dma.h */
336
 
337
typedef void
338
pciio_dmamap_free_f     (pciio_dmamap_t dmamap);
339
 
340
typedef iopaddr_t
341
pciio_dmamap_addr_f     (pciio_dmamap_t dmamap,         /* use these mapping resources */
342
                         paddr_t paddr, /* map for this address */
343
                         size_t byte_count);    /* map this many bytes */
344
 
345
typedef void
346
pciio_dmamap_done_f     (pciio_dmamap_t dmamap);
347
 
348
typedef iopaddr_t
349
pciio_dmatrans_addr_f   (vertex_hdl_t dev,      /* translate for this device */
350
                         device_desc_t dev_desc,        /* device descriptor */
351
                         paddr_t paddr, /* system physical address */
352
                         size_t byte_count,     /* length */
353
                         unsigned flags);       /* defined in dma.h */
354
 
355
typedef void
356
pciio_dmamap_drain_f    (pciio_dmamap_t map);
357
 
358
typedef void
359
pciio_dmaaddr_drain_f   (vertex_hdl_t vhdl,
360
                         paddr_t addr,
361
                         size_t bytes);
362
 
363
typedef void
364
pciio_dmalist_drain_f   (vertex_hdl_t vhdl,
365
                         alenlist_t list);
366
 
367
/* INTERRUPT MANAGEMENT */
368
 
369
typedef pciio_intr_t
370
pciio_intr_alloc_f      (vertex_hdl_t dev,      /* which PCI device */
371
                         device_desc_t dev_desc,        /* device descriptor */
372
                         pciio_intr_line_t lines,       /* which line(s) will be used */
373
                         vertex_hdl_t owner_dev);       /* owner of this intr */
374
 
375
typedef void
376
pciio_intr_free_f       (pciio_intr_t intr_hdl);
377
 
378
typedef int
379
pciio_intr_connect_f    (pciio_intr_t intr_hdl, intr_func_t intr_func, intr_arg_t intr_arg);    /* pciio intr resource handle */
380
 
381
typedef void
382
pciio_intr_disconnect_f (pciio_intr_t intr_hdl);
383
 
384
typedef vertex_hdl_t
385
pciio_intr_cpu_get_f    (pciio_intr_t intr_hdl);        /* pciio intr resource handle */
386
 
387
/* CONFIGURATION MANAGEMENT */
388
 
389
typedef void
390
pciio_provider_startup_f (vertex_hdl_t pciio_provider);
391
 
392
typedef void
393
pciio_provider_shutdown_f (vertex_hdl_t pciio_provider);
394
 
395
typedef int
396
pciio_reset_f           (vertex_hdl_t conn);    /* pci connection point */
397
 
398
typedef pciio_endian_t                  /* actual endianness */
399
pciio_endian_set_f      (vertex_hdl_t dev,      /* specify endianness for this device */
400
                         pciio_endian_t device_end,     /* endianness of device */
401
                         pciio_endian_t desired_end);   /* desired endianness */
402
 
403
typedef uint64_t
404
pciio_config_get_f      (vertex_hdl_t conn,     /* pci connection point */
405
                         unsigned reg,          /* register byte offset */
406
                         unsigned size);        /* width in bytes (1..4) */
407
 
408
typedef void
409
pciio_config_set_f      (vertex_hdl_t conn,     /* pci connection point */
410
                         unsigned reg,          /* register byte offset */
411
                         unsigned size,         /* width in bytes (1..4) */
412
                         uint64_t value);       /* value to store */
413
 
414
typedef int
415
pciio_error_devenable_f (vertex_hdl_t pconn_vhdl, int error_code);
416
 
417
typedef pciio_slot_t
418
pciio_error_extract_f   (vertex_hdl_t vhdl,
419
                         pciio_space_t *spacep,
420
                         iopaddr_t *addrp);
421
 
422
typedef void
423
pciio_driver_reg_callback_f     (vertex_hdl_t conn,
424
                                int key1,
425
                                int key2,
426
                                int error);
427
 
428
typedef void
429
pciio_driver_unreg_callback_f   (vertex_hdl_t conn, /* pci connection point */
430
                                 int key1,
431
                                 int key2,
432
                                 int error);
433
 
434
typedef int
435
pciio_device_unregister_f       (vertex_hdl_t conn);
436
 
437
typedef int
438
pciio_dma_enabled_f             (vertex_hdl_t conn);
439
 
440
/*
441
 * Adapters that provide a PCI interface adhere to this software interface.
442
 */
443
typedef struct pciio_provider_s {
444
    /* PIO MANAGEMENT */
445
    pciio_piomap_alloc_f   *piomap_alloc;
446
    pciio_piomap_free_f    *piomap_free;
447
    pciio_piomap_addr_f    *piomap_addr;
448
    pciio_piomap_done_f    *piomap_done;
449
    pciio_piotrans_addr_f  *piotrans_addr;
450
    pciio_piospace_alloc_f *piospace_alloc;
451
    pciio_piospace_free_f  *piospace_free;
452
 
453
    /* DMA MANAGEMENT */
454
    pciio_dmamap_alloc_f   *dmamap_alloc;
455
    pciio_dmamap_free_f    *dmamap_free;
456
    pciio_dmamap_addr_f    *dmamap_addr;
457
    pciio_dmamap_done_f    *dmamap_done;
458
    pciio_dmatrans_addr_f  *dmatrans_addr;
459
    pciio_dmamap_drain_f   *dmamap_drain;
460
    pciio_dmaaddr_drain_f  *dmaaddr_drain;
461
    pciio_dmalist_drain_f  *dmalist_drain;
462
 
463
    /* INTERRUPT MANAGEMENT */
464
    pciio_intr_alloc_f     *intr_alloc;
465
    pciio_intr_free_f      *intr_free;
466
    pciio_intr_connect_f   *intr_connect;
467
    pciio_intr_disconnect_f *intr_disconnect;
468
    pciio_intr_cpu_get_f   *intr_cpu_get;
469
 
470
    /* CONFIGURATION MANAGEMENT */
471
    pciio_provider_startup_f *provider_startup;
472
    pciio_provider_shutdown_f *provider_shutdown;
473
    pciio_reset_f          *reset;
474
    pciio_endian_set_f     *endian_set;
475
    pciio_config_get_f     *config_get;
476
    pciio_config_set_f     *config_set;
477
 
478
    /* Error handling interface */
479
    pciio_error_devenable_f *error_devenable;
480
    pciio_error_extract_f *error_extract;
481
 
482
    /* Callback support */
483
    pciio_driver_reg_callback_f *driver_reg_callback;
484
    pciio_driver_unreg_callback_f *driver_unreg_callback;
485
    pciio_device_unregister_f   *device_unregister;
486
    pciio_dma_enabled_f         *dma_enabled;
487
} pciio_provider_t;
488
 
489
/* PCI devices use these standard PCI provider interfaces */
490
extern pciio_piomap_alloc_f pciio_piomap_alloc;
491
extern pciio_piomap_free_f pciio_piomap_free;
492
extern pciio_piomap_addr_f pciio_piomap_addr;
493
extern pciio_piomap_done_f pciio_piomap_done;
494
extern pciio_piotrans_addr_f pciio_piotrans_addr;
495
extern pciio_pio_addr_f pciio_pio_addr;
496
extern pciio_piospace_alloc_f pciio_piospace_alloc;
497
extern pciio_piospace_free_f pciio_piospace_free;
498
extern pciio_dmamap_alloc_f pciio_dmamap_alloc;
499
extern pciio_dmamap_free_f pciio_dmamap_free;
500
extern pciio_dmamap_addr_f pciio_dmamap_addr;
501
extern pciio_dmamap_done_f pciio_dmamap_done;
502
extern pciio_dmatrans_addr_f pciio_dmatrans_addr;
503
extern pciio_dmamap_drain_f pciio_dmamap_drain;
504
extern pciio_dmaaddr_drain_f pciio_dmaaddr_drain;
505
extern pciio_dmalist_drain_f pciio_dmalist_drain;
506
extern pciio_intr_alloc_f pciio_intr_alloc;
507
extern pciio_intr_free_f pciio_intr_free;
508
extern pciio_intr_connect_f pciio_intr_connect;
509
extern pciio_intr_disconnect_f pciio_intr_disconnect;
510
extern pciio_intr_cpu_get_f pciio_intr_cpu_get;
511
extern pciio_provider_startup_f pciio_provider_startup;
512
extern pciio_provider_shutdown_f pciio_provider_shutdown;
513
extern pciio_reset_f pciio_reset;
514
extern pciio_endian_set_f pciio_endian_set;
515
extern pciio_config_get_f pciio_config_get;
516
extern pciio_config_set_f pciio_config_set;
517
 
518
/* Widgetdev in the IOERROR structure is encoded as follows.
519
 *      +---------------------------+
520
 *      | slot (7:3) | function(2:0)|
521
 *      +---------------------------+
522
 * Following are the convenience interfaces to get at form
523
 * a widgetdev or to break it into its constituents.
524
 */
525
 
526
#define PCIIO_WIDGETDEV_SLOT_SHFT               3
527
#define PCIIO_WIDGETDEV_SLOT_MASK               0x1f
528
#define PCIIO_WIDGETDEV_FUNC_MASK               0x7
529
 
530
#define pciio_widgetdev_create(slot,func)       \
531
        (((slot) << PCIIO_WIDGETDEV_SLOT_SHFT) + (func))
532
 
533
#define pciio_widgetdev_slot_get(wdev)          \
534
        (((wdev) >> PCIIO_WIDGETDEV_SLOT_SHFT) & PCIIO_WIDGETDEV_SLOT_MASK)
535
 
536
#define pciio_widgetdev_func_get(wdev)          \
537
        ((wdev) & PCIIO_WIDGETDEV_FUNC_MASK)
538
 
539
 
540
/* Generic PCI card initialization interface
541
 */
542
 
543
extern int
544
pciio_driver_register  (pciio_vendor_id_t vendor_id,    /* card's vendor number */
545
                        pciio_device_id_t device_id,    /* card's device number */
546
                        char *driver_prefix,    /* driver prefix */
547
                        unsigned flags);
548
 
549
extern void
550
pciio_error_register   (vertex_hdl_t pconn,     /* which slot */
551
                        error_handler_f *efunc, /* function to call */
552
                        error_handler_arg_t einfo);     /* first parameter */
553
 
554
extern void             pciio_driver_unregister(char *driver_prefix);
555
 
556
typedef void            pciio_iter_f(vertex_hdl_t pconn);       /* a connect point */
557
 
558
/* Interfaces used by PCI Bus Providers to talk to
559
 * the Generic PCI layer.
560
 */
561
extern vertex_hdl_t
562
pciio_device_register  (vertex_hdl_t connectpt, /* vertex at center of bus */
563
                        vertex_hdl_t master,    /* card's master ASIC (pci provider) */
564
                        pciio_slot_t slot,      /* card's slot (0..?) */
565
                        pciio_function_t func,  /* card's func (0..?) */
566
                        pciio_vendor_id_t vendor,       /* card's vendor number */
567
                        pciio_device_id_t device);      /* card's device number */
568
 
569
extern void
570
pciio_device_unregister(vertex_hdl_t connectpt);
571
 
572
extern pciio_info_t
573
pciio_device_info_new  (pciio_info_t pciio_info,        /* preallocated info struct */
574
                        vertex_hdl_t master,    /* card's master ASIC (pci provider) */
575
                        pciio_slot_t slot,      /* card's slot (0..?) */
576
                        pciio_function_t func,  /* card's func (0..?) */
577
                        pciio_vendor_id_t vendor,       /* card's vendor number */
578
                        pciio_device_id_t device);      /* card's device number */
579
 
580
extern void
581
pciio_device_info_free(pciio_info_t pciio_info);
582
 
583
extern vertex_hdl_t
584
pciio_device_info_register(
585
                        vertex_hdl_t connectpt, /* vertex at center of bus */
586
                        pciio_info_t pciio_info);       /* details about conn point */
587
 
588
extern void
589
pciio_device_info_unregister(
590
                        vertex_hdl_t connectpt, /* vertex at center of bus */
591
                        pciio_info_t pciio_info);       /* details about conn point */
592
 
593
 
594
extern int
595
pciio_device_attach(
596
                        vertex_hdl_t pcicard,   /* vertex created by pciio_device_register */
597
                        int drv_flags);
598
extern int
599
pciio_device_detach(
600
                        vertex_hdl_t pcicard,   /* vertex created by pciio_device_register */
601
                        int drv_flags);
602
 
603
 
604
/* create and initialize empty window mapping resource */
605
extern pciio_win_map_t
606
pciio_device_win_map_new(pciio_win_map_t win_map,       /* preallocated win map structure */
607
                         size_t region_size,            /* size of region to be tracked */
608
                         size_t page_size);             /* allocation page size */
609
 
610
/* destroy window mapping resource freeing up ancillary resources */
611
extern void
612
pciio_device_win_map_free(pciio_win_map_t win_map);     /* preallocated win map structure */
613
 
614
/* populate window mapping with free range of addresses */
615
extern void
616
pciio_device_win_populate(pciio_win_map_t win_map,      /* win map */
617
                          iopaddr_t ioaddr,             /* base address of free range */
618
                          size_t size);                 /* size of free range */
619
 
620
/* allocate window from mapping resource */
621
extern iopaddr_t
622
pciio_device_win_alloc(struct resource * res,
623
                       pciio_win_alloc_t win_alloc,     /* opaque allocation cookie */
624
                       size_t start,                    /* start unit, or 0 */
625
                       size_t size,                     /* size of allocation */
626
                       size_t align);                   /* alignment of allocation */
627
 
628
/* free previously allocated window */
629
extern void
630
pciio_device_win_free(pciio_win_alloc_t win_alloc);     /* opaque allocation cookie */
631
 
632
 
633
/*
634
 * Generic PCI interface, for use with all PCI providers
635
 * and all PCI devices.
636
 */
637
 
638
/* Generic PCI interrupt interfaces */
639
extern vertex_hdl_t     pciio_intr_dev_get(pciio_intr_t pciio_intr);
640
extern vertex_hdl_t     pciio_intr_cpu_get(pciio_intr_t pciio_intr);
641
 
642
/* Generic PCI pio interfaces */
643
extern vertex_hdl_t     pciio_pio_dev_get(pciio_piomap_t pciio_piomap);
644
extern pciio_slot_t     pciio_pio_slot_get(pciio_piomap_t pciio_piomap);
645
extern pciio_space_t    pciio_pio_space_get(pciio_piomap_t pciio_piomap);
646
extern iopaddr_t        pciio_pio_pciaddr_get(pciio_piomap_t pciio_piomap);
647
extern ulong            pciio_pio_mapsz_get(pciio_piomap_t pciio_piomap);
648
extern caddr_t          pciio_pio_kvaddr_get(pciio_piomap_t pciio_piomap);
649
 
650
/* Generic PCI dma interfaces */
651
extern vertex_hdl_t     pciio_dma_dev_get(pciio_dmamap_t pciio_dmamap);
652
 
653
/* Register/unregister PCI providers and get implementation handle */
654
extern void             pciio_provider_register(vertex_hdl_t provider, pciio_provider_t *pciio_fns);
655
extern void             pciio_provider_unregister(vertex_hdl_t provider);
656
extern pciio_provider_t *pciio_provider_fns_get(vertex_hdl_t provider);
657
 
658
/* Generic pci slot information access interface */
659
extern pciio_info_t     pciio_info_chk(vertex_hdl_t vhdl);
660
extern pciio_info_t     pciio_info_get(vertex_hdl_t vhdl);
661
extern pciio_info_t     pciio_hostinfo_get(vertex_hdl_t vhdl);
662
extern void             pciio_info_set(vertex_hdl_t vhdl, pciio_info_t widget_info);
663
extern vertex_hdl_t     pciio_info_dev_get(pciio_info_t pciio_info);
664
extern vertex_hdl_t     pciio_info_hostdev_get(pciio_info_t pciio_info);
665
extern pciio_bus_t      pciio_info_bus_get(pciio_info_t pciio_info);
666
extern pciio_slot_t     pciio_info_slot_get(pciio_info_t pciio_info);
667
extern pciio_function_t pciio_info_function_get(pciio_info_t pciio_info);
668
extern pciio_vendor_id_t pciio_info_vendor_id_get(pciio_info_t pciio_info);
669
extern pciio_device_id_t pciio_info_device_id_get(pciio_info_t pciio_info);
670
extern vertex_hdl_t     pciio_info_master_get(pciio_info_t pciio_info);
671
extern arbitrary_info_t pciio_info_mfast_get(pciio_info_t pciio_info);
672
extern pciio_provider_t *pciio_info_pops_get(pciio_info_t pciio_info);
673
extern error_handler_f *pciio_info_efunc_get(pciio_info_t);
674
extern error_handler_arg_t *pciio_info_einfo_get(pciio_info_t);
675
extern pciio_space_t    pciio_info_bar_space_get(pciio_info_t, int);
676
extern iopaddr_t        pciio_info_bar_base_get(pciio_info_t, int);
677
extern size_t           pciio_info_bar_size_get(pciio_info_t, int);
678
extern iopaddr_t        pciio_info_rom_base_get(pciio_info_t);
679
extern size_t           pciio_info_rom_size_get(pciio_info_t);
680
extern int              pciio_info_type1_get(pciio_info_t);
681
extern int              pciio_error_handler(vertex_hdl_t, int, ioerror_mode_t, ioerror_t *);
682
extern int              pciio_dma_enabled(vertex_hdl_t);
683
 
684
/**
685
 * sn_pci_set_vchan - Set the requested Virtual Channel bits into the mapped DMA
686
 *                    address.
687
 * @pci_dev: pci device pointer
688
 * @addr: mapped dma address
689
 * @vchan: Virtual Channel to use 0 or 1.
690
 *
691
 * Set the Virtual Channel bit in the mapped dma address.
692
 */
693
static inline int
694
sn_pci_set_vchan(struct pci_dev *pci_dev,
695
        dma_addr_t *addr,
696
        int vchan)
697
{
698
 
699
        if (vchan > 1) {
700
                return -1;
701
        }
702
 
703
        if (!(*addr >> 32))     /* Using a mask here would be cleaner */
704
                return 0;        /* but this generates better code */
705
 
706
        if (vchan == 1) {
707
                /* Set Bit 57 */
708
                *addr |= (1UL << 57);
709
        } else {
710
                /* Clear Bit 57 */
711
                *addr &= ~(1UL << 57);
712
        }
713
 
714
        return 0;
715
}
716
 
717
#endif                          /* C or C++ */
718
 
719
 
720
/*
721
 * Prototypes
722
 */
723
 
724
int snia_badaddr_val(volatile void *addr, int len, volatile void *ptr);
725
nasid_t snia_get_console_nasid(void);
726
nasid_t snia_get_master_baseio_nasid(void);
727
void snia_ioerror_dump(char *name, int error_code, int error_mode, ioerror_t *ioerror);
728
int snia_pcibr_rrb_alloc(struct pci_dev *pci_dev, int *count_vchan0, int *count_vchan1);
729
pciio_endian_t snia_pciio_endian_set(struct pci_dev *pci_dev,
730
        pciio_endian_t device_end, pciio_endian_t desired_end);
731
iopaddr_t snia_pciio_dmatrans_addr(struct pci_dev *pci_dev, device_desc_t dev_desc,
732
        paddr_t paddr, size_t byte_count, unsigned flags);
733
pciio_dmamap_t snia_pciio_dmamap_alloc(struct pci_dev *pci_dev,
734
        device_desc_t dev_desc, size_t byte_count_max, unsigned flags);
735
void snia_pciio_dmamap_free(pciio_dmamap_t pciio_dmamap);
736
iopaddr_t snia_pciio_dmamap_addr(pciio_dmamap_t pciio_dmamap, paddr_t paddr,
737
        size_t byte_count);
738
void snia_pciio_dmamap_done(pciio_dmamap_t pciio_dmamap);
739
void *snia_kmem_zalloc(size_t size);
740
void snia_kmem_free(void *ptr, size_t size);
741
void *snia_kmem_alloc_node(register size_t size, cnodeid_t node);
742
 
743
#endif                          /* _ASM_SN_PCI_PCIIO_H */

powered by: WebSVN 2.1.0

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