1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
|
/*
* Copyright (c) 1994 Charles Hannum. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Charles Hannum.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _PCIVAR_H_
#define _PCIVAR_H_
/*
* Definitions for PCI autoconfiguration.
*
* The initial segment of this file describes types and functions
* that are exported for PCI configuration and address mapping. */
#include "pci_machdep.h"
/* From <cpu>_pci_machdep.c */
pcitag_t pci_make_tag(int, int, int);
pcireg_t pci_conf_read(pcitag_t, int);
void pci_conf_write(pcitag_t, int, pcireg_t);
typedef enum {
PCI_MATCH_BYTES = 0,
PCI_MATCH_BITS = 1
} pci_endian_t;
int pci_map_io(pcitag_t, int, pci_endian_t, phys_addr_t *);
int pci_map_mem(pcitag_t, int, pci_endian_t, phys_addr_t *);
uint8_t inb(unsigned int port);
uint16_t inw(unsigned int port);
uint32_t inl(unsigned int port);
void outb(unsigned int port, uint8_t val);
void outw(unsigned int port, uint16_t val);
void outl(unsigned int port, uint32_t val);
int pci_map_window(phys_addr_t pa,
unsigned int offset, unsigned int len,
int l2ca, int endian);
int pci_unmap_window(unsigned int offset, unsigned int len);
/* From pciconf.c */
/* Flags controlling PCI/LDT configuration options */
typedef unsigned int pci_flags_t;
#define PCI_FLG_NORMAL 0x00000001
#define PCI_FLG_VERBOSE 0x00000003
#define PCI_FLG_LDT_PREFETCH 0x00000004
#define PCI_FLG_LDT_REV_017 0x00000008
void pci_configure(pci_flags_t flags);
void pci_show_configuration(void);
int pci_foreachdev(int (*fn)(pcitag_t tag));
int pci_cacheline_log2 (void);
int pci_maxburst_log2 (void);
int pci_find_device(uint32_t vid, uint32_t did, int enumidx, pcitag_t *tag);
int pci_find_class(uint32_t class, int enumidx, pcitag_t *tag);
/* From pci_subr.c */
void pci_devinfo(pcireg_t, pcireg_t, int, char *);
void pci_conf_print(pcitag_t tag);
void pci_tagprintf (pcitag_t tag, const char *fmt, ...)
#ifdef __long64
__attribute__((__format__(__printf__,2,3)))
#endif
;
/*
* Definitions for PCI autoconfiguration.
*
* The remainder of this file describes types and functions
* that are used only for communication among the PCI modules
* implementing autoconfiguration.
* XXX This should be split into a separate file. */
/* Build options. Debug levels >1 are for helping to bring up new
LDT hardware and will be annoyingly verbose otherwise. */
/* PCI_DEBUG enables general checking and tracing. */
#ifndef PCI_DEBUG
#define PCI_DEBUG 0
#endif
/* LDT_DEBUG enables progress/error reports for LDT fabric initialization. */
#ifndef LDT_DEBUG
#define LDT_DEBUG 0
#endif
struct pci_attach_args {
pcitag_t pa_tag;
pcireg_t pa_id;
pcireg_t pa_class;
};
struct pci_match {
pcireg_t class, classmask;
pcireg_t id, idmask;
};
/* From <cpu>_pci_machdep.c */
int pci_hwinit(pci_flags_t flags);
void pci_hwreinit(pci_flags_t flags);
int pci_device_preset (pcitag_t tag);
void pci_device_setup(pcitag_t tag);
void pci_bridge_setup(pcitag_t tag, pci_flags_t flags);
void pci_flush(void);
void pci_break_tag(pcitag_t, int *, int *, int *);
int pci_canscan(pcitag_t);
int pci_probe_tag(pcitag_t tag);
pcireg_t pci_conf_read8(pcitag_t, int);
void pci_conf_write8(pcitag_t, int, pcireg_t);
pcireg_t pci_conf_read16(pcitag_t, int);
void pci_conf_write16(pcitag_t, int, pcireg_t);
pcireg_t pci_conf_read(pcitag_t, int);
void pci_conf_write(pcitag_t, int, pcireg_t);
#define pci_conf_read32 pci_conf_read
#define pci_conf_write32 pci_conf_write
int pci_conf_write_acked(pcitag_t, int, pcireg_t);
uint8_t pci_int_line(uint8_t);
/* From <board>_pci.c */
uint8_t pci_int_shift_0(pcitag_t);
uint8_t pci_int_map_0(pcitag_t);
/* From ldtinit.c */
#define LDT_PRIMARY 0
#define LDT_SECONDARY 1
unsigned pci_find_ldt_cap (pcitag_t tag, int secondary);
void ldt_link_reset (pcitag_t tag, int delay);
int ldt_chain_init (pcitag_t tag, int bus, pci_flags_t flags);
/* From pci_subr.c */
void pci_bdfprintf(int bus, int device, int function, const char *fmt, ...)
#ifdef __long64
__attribute__((__format__(__printf__,4,5)))
#endif
;
/* PCI bus parameters */
struct pci_bus {
unsigned char min_gnt; /* largest min grant */
unsigned char max_lat; /* smallest max latency */
unsigned char devsel; /* slowest devsel */
char fast_b2b; /* support fast b2b */
char prefetch; /* support prefetch */
char freq66; /* support 66MHz */
char width64; /* 64 bit bus */
int bandwidth; /* # of .25us ticks/sec @ 33MHz */
unsigned char ndev; /* # devices (functions) on bus */
unsigned char def_ltim; /* default ltim counter */
unsigned char max_ltim; /* maximum ltim counter */
uint8_t primary; /* primary bus number */
pcitag_t tag; /* tag for this bus */
uint32_t min_io_addr; /* min I/O address allocated to bus */
uint32_t max_io_addr; /* max I/O address allocated to bus */
uint32_t min_mem_addr; /* min mem address allocated to bus */
uint32_t max_mem_addr; /* max mem address allocated to bus */
uint8_t inta_shift; /* base rotation of interrupt pins */
char no_probe; /* skip businit and query probes */
};
extern pcireg_t minpcimemaddr;
extern pcireg_t maxpcimemaddr;
extern pcireg_t minpciioaddr;
extern pcireg_t maxpciioaddr;
extern struct pci_bus _pci_bus[];
extern int _pci_nbus;
extern const int _pci_maxbus;
#endif /* _PCIVAR_H_ */
|