annotate vidix/pci.c @ 23980:27bac14b4ce4

More simple and correct font reselection. Since ass_font_t contains a list of font faces, there is no need to select the face with maximum charset coverage each time. It is enough to select any face with the required glyph.
author eugeni
date Fri, 03 Aug 2007 13:43:11 +0000
parents acfe034e5386
children e7f836a459ea
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1 /*
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
2 (C) 2002 - library implementation by Nick Kyrshev
23734
acfe034e5386 ISO8859-1 --> UTF-8
diego
parents: 23048
diff changeset
3 XFree86 3.3.3 scanpci.c, modified for GATOS/win/gfxdump by Øyvind Aabling.
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
4 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
5 /* $XConsortium: scanpci.c /main/25 1996/10/27 11:48:40 kaleb $ */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
6 /*
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
7 * name: scanpci.c
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
8 *
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
9 * purpose: This program will scan for and print details of
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
10 * devices on the PCI bus.
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
11
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
12 * author: Robin Cutshaw (robin@xfree86.org)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
13 *
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
14 * supported O/S's: SVR4, UnixWare, SCO, Solaris,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
15 * FreeBSD, NetBSD, 386BSD, BSDI BSD/386,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
16 * Linux, Mach/386, ISC
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
17 * DOS (WATCOM 9.5 compiler)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
18 *
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
19 * compiling: [g]cc scanpci.c -o scanpci
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
20 * for SVR4 (not Solaris), UnixWare use:
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
21 * [g]cc -DSVR4 scanpci.c -o scanpci
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
22 * for DOS, watcom 9.5:
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
23 * wcc386p -zq -omaxet -7 -4s -s -w3 -d2 name.c
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
24 * and link with PharLap or other dos extender for exe
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
25 *
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
26 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
27
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
28 /* $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $ */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
29
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
30 /*
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
31 * Copyright 1995 by Robin Cutshaw <robin@XFree86.Org>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
32 *
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
33 * Permission to use, copy, modify, distribute, and sell this software and its
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
34 * documentation for any purpose is hereby granted without fee, provided that
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
35 * the above copyright notice appear in all copies and that both that
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
36 * copyright notice and this permission notice appear in supporting
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
37 * documentation, and that the names of the above listed copyright holder(s)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
38 * not be used in advertising or publicity pertaining to distribution of
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
39 * the software without specific, written prior permission. The above listed
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
40 * copyright holder(s) make(s) no representations about the suitability of this
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
41 * software for any purpose. It is provided "as is" without express or
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
42 * implied warranty.
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
43 *
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
44 * THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
45 * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
46 * AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
47 * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
48 * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
49 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
50 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
51 *
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
52 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
53
22901
a7605669b114 renamed libdha.[hc] to dha.[hc]
ben
parents: 22900
diff changeset
54 #include "dha.h"
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
55 #include <errno.h>
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
56 #include <string.h>
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
57 #include <stdio.h>
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
58 #ifdef __unix__
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
59 #include <unistd.h>
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
60 #endif
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
61 #include "AsmMacros.h"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
62 /* OS depended stuff */
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
63 #if defined (linux)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
64 #include "sysdep/pci_linux.c"
21848
3ff1eade91f9 GNU/kFreeBSD support, closes Bugzilla #704.
diego
parents: 17971
diff changeset
65 #elif defined (__FreeBSD__) || defined (__FreeBSD_kernel__) || defined(__DragonFly__)
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
66 #include "sysdep/pci_freebsd.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
67 #elif defined (__386BSD__)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
68 #include "sysdep/pci_386bsd.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
69 #elif defined (__NetBSD__)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
70 #include "sysdep/pci_netbsd.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
71 #elif defined (__OpenBSD__)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
72 #include "sysdep/pci_openbsd.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
73 #elif defined (__bsdi__)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
74 #include "sysdep/pci_bsdi.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
75 #elif defined (Lynx)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
76 #include "sysdep/pci_lynx.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
77 #elif defined (MACH386)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
78 #include "sysdep/pci_mach386.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
79 #elif defined (__SVR4)
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
80 #if !defined(SVR4)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
81 #define SVR4
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
82 #endif
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
83 #include "sysdep/pci_svr4.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
84 #elif defined (SCO)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
85 #include "sysdep/pci_sco.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
86 #elif defined (ISC)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
87 #include "sysdep/pci_isc.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
88 #elif defined (__EMX__)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
89 #include "sysdep/pci_os2.c"
4173
250f39dedede cygwin compile fix
atmos4
parents: 4164
diff changeset
90 #elif defined (_WIN32) || defined(__CYGWIN__)
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
91 #include "sysdep/pci_win32.c"
10980
e687fa1d55c6 port libdha to mingw
faust3
parents: 9767
diff changeset
92 #ifdef __MINGW32__
e687fa1d55c6 port libdha to mingw
faust3
parents: 9767
diff changeset
93 #define ENOTSUP 134 /* Not supported */
e687fa1d55c6 port libdha to mingw
faust3
parents: 9767
diff changeset
94 #endif
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
95 #endif
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
96
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
97 #if defined(Lynx) && defined(__powerpc__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
98 /* let's mimick the Linux Alpha stuff for LynxOS so we don't have
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
99 * to change too much code
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
100 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
101 #include <smem.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
102
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
103 static unsigned char *pciConfBase;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
104
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
105 static __inline__ unsigned long
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
106 static swapl(unsigned long val)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
107 {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
108 unsigned char *p = (unsigned char *)&val;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
109 return ((p[3] << 24) | (p[2] << 16) | (p[1] << 8) | (p[0] << 0));
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
110 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
111
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
112
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
113 #define BUS(tag) (((tag)>>16)&0xff)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
114 #define DFN(tag) (((tag)>>8)&0xff)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
115
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
116 #define PCIBIOS_DEVICE_NOT_FOUND 0x86
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
117 #define PCIBIOS_SUCCESSFUL 0x00
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
118
4174
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
119 int pciconfig_read(
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
120 unsigned char bus,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
121 unsigned char dev,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
122 unsigned char offset,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
123 int len, /* unused, alway 4 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
124 unsigned long *val)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
125 {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
126 unsigned long _val;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
127 unsigned long *ptr;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
128
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
129 dev >>= 3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
130 if (bus || dev >= 16) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
131 *val = 0xFFFFFFFF;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
132 return PCIBIOS_DEVICE_NOT_FOUND;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
133 } else {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
134 ptr = (unsigned long *)(pciConfBase + ((1<<dev) | offset));
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
135 _val = swapl(*ptr);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
136 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
137 *val = _val;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
138 return PCIBIOS_SUCCESSFUL;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
139 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
140
4174
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
141 int pciconfig_write(
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
142 unsigned char bus,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
143 unsigned char dev,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
144 unsigned char offset,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
145 int len, /* unused, alway 4 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
146 unsigned long val)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
147 {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
148 unsigned long _val;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
149 unsigned long *ptr;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
150
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
151 dev >>= 3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
152 _val = swapl(val);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
153 if (bus || dev >= 16) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
154 return PCIBIOS_DEVICE_NOT_FOUND;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
155 } else {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
156 ptr = (unsigned long *)(pciConfBase + ((1<<dev) | offset));
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
157 *ptr = _val;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
158 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
159 return PCIBIOS_SUCCESSFUL;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
160 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
161 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
162
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
163 #if !defined(__powerpc__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
164 struct pci_config_reg {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
165 /* start of official PCI config space header */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
166 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
167 unsigned long device_vendor;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
168 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
169 unsigned short vendor;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
170 unsigned short device;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
171 } dv;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
172 } dv_id;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
173 #define _device_vendor dv_id.device_vendor
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
174 #define _vendor dv_id.dv.vendor
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
175 #define _device dv_id.dv.device
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
176 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
177 unsigned long status_command;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
178 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
179 unsigned short command;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
180 unsigned short status;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
181 } sc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
182 } stat_cmd;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
183 #define _status_command stat_cmd.status_command
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
184 #define _command stat_cmd.sc.command
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
185 #define _status stat_cmd.sc.status
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
186 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
187 unsigned long class_revision;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
188 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
189 unsigned char rev_id;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
190 unsigned char prog_if;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
191 unsigned char sub_class;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
192 unsigned char base_class;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
193 } cr;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
194 } class_rev;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
195 #define _class_revision class_rev.class_revision
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
196 #define _rev_id class_rev.cr.rev_id
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
197 #define _prog_if class_rev.cr.prog_if
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
198 #define _sub_class class_rev.cr.sub_class
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
199 #define _base_class class_rev.cr.base_class
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
200 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
201 unsigned long bist_header_latency_cache;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
202 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
203 unsigned char cache_line_size;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
204 unsigned char latency_timer;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
205 unsigned char header_type;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
206 unsigned char bist;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
207 } bhlc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
208 } bhlc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
209 #define _bist_header_latency_cache bhlc.bist_header_latency_cache
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
210 #define _cache_line_size bhlc.bhlc.cache_line_size
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
211 #define _latency_timer bhlc.bhlc.latency_timer
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
212 #define _header_type bhlc.bhlc.header_type
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
213 #define _bist bhlc.bhlc.bist
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
214 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
215 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
216 unsigned long dv_base0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
217 unsigned long dv_base1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
218 unsigned long dv_base2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
219 unsigned long dv_base3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
220 unsigned long dv_base4;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
221 unsigned long dv_base5;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
222 } dv;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
223 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
224 unsigned long bg_rsrvd[2];
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
225 unsigned char primary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
226 unsigned char secondary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
227 unsigned char subordinate_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
228 unsigned char secondary_latency_timer;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
229 unsigned char io_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
230 unsigned char io_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
231 unsigned short secondary_status;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
232 unsigned short mem_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
233 unsigned short mem_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
234 unsigned short prefetch_mem_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
235 unsigned short prefetch_mem_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
236 } bg;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
237 } bc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
238 #define _base0 bc.dv.dv_base0
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
239 #define _base1 bc.dv.dv_base1
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
240 #define _base2 bc.dv.dv_base2
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
241 #define _base3 bc.dv.dv_base3
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
242 #define _base4 bc.dv.dv_base4
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
243 #define _base5 bc.dv.dv_base5
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
244 #define _primary_bus_number bc.bg.primary_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
245 #define _secondary_bus_number bc.bg.secondary_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
246 #define _subordinate_bus_number bc.bg.subordinate_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
247 #define _secondary_latency_timer bc.bg.secondary_latency_timer
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
248 #define _io_base bc.bg.io_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
249 #define _io_limit bc.bg.io_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
250 #define _secondary_status bc.bg.secondary_status
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
251 #define _mem_base bc.bg.mem_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
252 #define _mem_limit bc.bg.mem_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
253 #define _prefetch_mem_base bc.bg.prefetch_mem_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
254 #define _prefetch_mem_limit bc.bg.prefetch_mem_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
255 unsigned long rsvd1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
256 unsigned long rsvd2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
257 unsigned long _baserom;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
258 unsigned long rsvd3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
259 unsigned long rsvd4;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
260 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
261 unsigned long max_min_ipin_iline;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
262 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
263 unsigned char int_line;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
264 unsigned char int_pin;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
265 unsigned char min_gnt;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
266 unsigned char max_lat;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
267 } mmii;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
268 } mmii;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
269 #define _max_min_ipin_iline mmii.max_min_ipin_iline
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
270 #define _int_line mmii.mmii.int_line
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
271 #define _int_pin mmii.mmii.int_pin
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
272 #define _min_gnt mmii.mmii.min_gnt
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
273 #define _max_lat mmii.mmii.max_lat
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
274 /* I don't know how accurate or standard this is (DHD) */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
275 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
276 unsigned long user_config;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
277 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
278 unsigned char user_config_0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
279 unsigned char user_config_1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
280 unsigned char user_config_2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
281 unsigned char user_config_3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
282 } uc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
283 } uc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
284 #define _user_config uc.user_config
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
285 #define _user_config_0 uc.uc.user_config_0
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
286 #define _user_config_1 uc.uc.user_config_1
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
287 #define _user_config_2 uc.uc.user_config_2
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
288 #define _user_config_3 uc.uc.user_config_3
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
289 /* end of official PCI config space header */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
290 unsigned long _pcibusidx;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
291 unsigned long _pcinumbus;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
292 unsigned long _pcibuses[16];
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
293 unsigned short _configtype; /* config type found */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
294 unsigned short _ioaddr; /* config type 1 - private I/O addr */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
295 unsigned long _cardnum; /* config type 2 - private card number */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
296 };
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
297 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
298 /* ppc is big endian, swapping bytes is not quite enough
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
299 * to interpret the PCI config registers...
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
300 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
301 struct pci_config_reg {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
302 /* start of official PCI config space header */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
303 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
304 unsigned long device_vendor;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
305 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
306 unsigned short device;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
307 unsigned short vendor;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
308 } dv;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
309 } dv_id;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
310 #define _device_vendor dv_id.device_vendor
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
311 #define _vendor dv_id.dv.vendor
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
312 #define _device dv_id.dv.device
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
313 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
314 unsigned long status_command;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
315 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
316 unsigned short status;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
317 unsigned short command;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
318 } sc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
319 } stat_cmd;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
320 #define _status_command stat_cmd.status_command
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
321 #define _command stat_cmd.sc.command
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
322 #define _status stat_cmd.sc.status
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
323 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
324 unsigned long class_revision;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
325 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
326 unsigned char base_class;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
327 unsigned char sub_class;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
328 unsigned char prog_if;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
329 unsigned char rev_id;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
330 } cr;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
331 } class_rev;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
332 #define _class_revision class_rev.class_revision
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
333 #define _rev_id class_rev.cr.rev_id
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
334 #define _prog_if class_rev.cr.prog_if
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
335 #define _sub_class class_rev.cr.sub_class
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
336 #define _base_class class_rev.cr.base_class
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
337 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
338 unsigned long bist_header_latency_cache;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
339 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
340 unsigned char bist;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
341 unsigned char header_type;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
342 unsigned char latency_timer;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
343 unsigned char cache_line_size;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
344 } bhlc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
345 } bhlc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
346 #define _bist_header_latency_cache bhlc.bist_header_latency_cache
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
347 #define _cache_line_size bhlc.bhlc.cache_line_size
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
348 #define _latency_timer bhlc.bhlc.latency_timer
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
349 #define _header_type bhlc.bhlc.header_type
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
350 #define _bist bhlc.bhlc.bist
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
351 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
352 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
353 unsigned long dv_base0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
354 unsigned long dv_base1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
355 unsigned long dv_base2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
356 unsigned long dv_base3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
357 unsigned long dv_base4;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
358 unsigned long dv_base5;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
359 } dv;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
360 /* ?? */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
361 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
362 unsigned long bg_rsrvd[2];
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
363
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
364 unsigned char secondary_latency_timer;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
365 unsigned char subordinate_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
366 unsigned char secondary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
367 unsigned char primary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
368
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
369 unsigned short secondary_status;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
370 unsigned char io_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
371 unsigned char io_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
372
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
373 unsigned short mem_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
374 unsigned short mem_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
375
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
376 unsigned short prefetch_mem_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
377 unsigned short prefetch_mem_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
378 } bg;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
379 } bc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
380 #define _base0 bc.dv.dv_base0
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
381 #define _base1 bc.dv.dv_base1
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
382 #define _base2 bc.dv.dv_base2
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
383 #define _base3 bc.dv.dv_base3
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
384 #define _base4 bc.dv.dv_base4
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
385 #define _base5 bc.dv.dv_base5
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
386 #define _primary_bus_number bc.bg.primary_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
387 #define _secondary_bus_number bc.bg.secondary_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
388 #define _subordinate_bus_number bc.bg.subordinate_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
389 #define _secondary_latency_timer bc.bg.secondary_latency_timer
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
390 #define _io_base bc.bg.io_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
391 #define _io_limit bc.bg.io_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
392 #define _secondary_status bc.bg.secondary_status
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
393 #define _mem_base bc.bg.mem_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
394 #define _mem_limit bc.bg.mem_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
395 #define _prefetch_mem_base bc.bg.prefetch_mem_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
396 #define _prefetch_mem_limit bc.bg.prefetch_mem_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
397 unsigned long rsvd1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
398 unsigned long rsvd2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
399 unsigned long _baserom;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
400 unsigned long rsvd3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
401 unsigned long rsvd4;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
402 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
403 unsigned long max_min_ipin_iline;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
404 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
405 unsigned char max_lat;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
406 unsigned char min_gnt;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
407 unsigned char int_pin;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
408 unsigned char int_line;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
409 } mmii;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
410 } mmii;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
411 #define _max_min_ipin_iline mmii.max_min_ipin_iline
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
412 #define _int_line mmii.mmii.int_line
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
413 #define _int_pin mmii.mmii.int_pin
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
414 #define _min_gnt mmii.mmii.min_gnt
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
415 #define _max_lat mmii.mmii.max_lat
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
416 /* I don't know how accurate or standard this is (DHD) */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
417 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
418 unsigned long user_config;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
419 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
420 unsigned char user_config_3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
421 unsigned char user_config_2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
422 unsigned char user_config_1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
423 unsigned char user_config_0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
424 } uc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
425 } uc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
426 #define _user_config uc.user_config
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
427 #define _user_config_0 uc.uc.user_config_0
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
428 #define _user_config_1 uc.uc.user_config_1
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
429 #define _user_config_2 uc.uc.user_config_2
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
430 #define _user_config_3 uc.uc.user_config_3
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
431 /* end of official PCI config space header */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
432 unsigned long _pcibusidx;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
433 unsigned long _pcinumbus;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
434 unsigned long _pcibuses[16];
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
435 unsigned short _ioaddr; /* config type 1 - private I/O addr */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
436 unsigned short _configtype; /* config type found */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
437 unsigned long _cardnum; /* config type 2 - private card number */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
438 };
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
439 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
440
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
441 #define MAX_DEV_PER_VENDOR_CFG1 64
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
442 #define MAX_PCI_DEVICES_PER_BUS 32
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
443 #define MAX_PCI_DEVICES 64
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
444 #define NF ((void (*)())NULL), { 0.0, 0, 0, NULL }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
445 #define PCI_MULTIFUNC_DEV 0x80
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
446 #define PCI_ID_REG 0x00
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
447 #define PCI_CMD_STAT_REG 0x04
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
448 #define PCI_CLASS_REG 0x08
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
449 #define PCI_HEADER_MISC 0x0C
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
450 #define PCI_MAP_REG_START 0x10
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
451 #define PCI_MAP_ROM_REG 0x30
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
452 #define PCI_INTERRUPT_REG 0x3C
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
453 #define PCI_REG_USERCONFIG 0x40
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
454
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
455 static int pcibus=-1, pcicard=-1, pcifunc=-1 ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
456 /*static struct pci_device *pcidev=NULL ;*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
457
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
458 #if defined(__alpha__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
459 #define PCI_EN 0x00000000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
460 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
461 #define PCI_EN 0x80000000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
462 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
463
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
464 #define PCI_MODE1_ADDRESS_REG 0xCF8
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
465 #define PCI_MODE1_DATA_REG 0xCFC
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
466
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
467 #define PCI_MODE2_ENABLE_REG 0xCF8
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
468 #ifdef PC98
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
469 #define PCI_MODE2_FORWARD_REG 0xCF9
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
470 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
471 #define PCI_MODE2_FORWARD_REG 0xCFA
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
472 #endif
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
473
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
474 /* cpu depended stuff */
8503
9dbb9c710480 svgalib kernelhelper support (based on patch by Matan Ziv-Av <matan@svgalib.org>) and some reordering/cleanup (part #1 ;)
alex
parents: 5702
diff changeset
475 #ifndef CONFIG_SVGAHELPER
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
476 #if defined(__alpha__)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
477 #include "sysdep/pci_alpha.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
478 #elif defined(__ia64__)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
479 #include "sysdep/pci_ia64.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
480 #elif defined(__sparc__)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
481 #include "sysdep/pci_sparc.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
482 #elif defined( __arm32__ )
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
483 #include "sysdep/pci_arm32.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
484 #elif defined(__powerpc__)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
485 #include "sysdep/pci_powerpc.c"
12687
cb35163ef0a1 x86-64 (amd64) support by Kenny Root
alex
parents: 10980
diff changeset
486 #elif defined(__x86_64__)
cb35163ef0a1 x86-64 (amd64) support by Kenny Root
alex
parents: 10980
diff changeset
487 /* Nothing here right now */
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
488 #else
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
489 #include "sysdep/pci_x86.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
490 #endif
8503
9dbb9c710480 svgalib kernelhelper support (based on patch by Matan Ziv-Av <matan@svgalib.org>) and some reordering/cleanup (part #1 ;)
alex
parents: 5702
diff changeset
491 #endif
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
492
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
493 static pciinfo_t *pci_lst;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
494
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
495 static void identify_card(struct pci_config_reg *pcr, int idx)
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
496 {
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
497 /* local overflow test */
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
498 if (idx>=MAX_PCI_DEVICES) return ;
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
499
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
500 pci_lst[idx].bus = pcibus ;
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
501 pci_lst[idx].card = pcicard ;
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
502 pci_lst[idx].func = pcifunc ;
9767
f6d2772efca3 Ignore disabled cards. (Jon Burgess <jburgess@uklinux.net>)
ranma
parents: 8776
diff changeset
503 pci_lst[idx].command = pcr->_status_command & 0xFFFF;
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
504 pci_lst[idx].vendor = pcr->_vendor ;
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
505 pci_lst[idx].device = pcr->_device ;
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
506 pci_lst[idx].base0 = 0xFFFFFFFF ;
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
507 pci_lst[idx].base1 = 0xFFFFFFFF ;
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
508 pci_lst[idx].base2 = 0xFFFFFFFF ;
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
509 pci_lst[idx].baserom = 0x000C0000 ;
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
510 if (pcr->_base0) pci_lst[idx].base0 = pcr->_base0 &
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
511 ((pcr->_base0&0x1) ? 0xFFFFFFFC : 0xFFFFFFF0) ;
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
512 if (pcr->_base1) pci_lst[idx].base1 = pcr->_base1 &
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
513 ((pcr->_base1&0x1) ? 0xFFFFFFFC : 0xFFFFFFF0) ;
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
514 if (pcr->_base2) pci_lst[idx].base2 = pcr->_base2 &
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
515 ((pcr->_base2&0x1) ? 0xFFFFFFFC : 0xFFFFFFF0) ;
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
516 if (pcr->_baserom) pci_lst[idx].baserom = pcr->_baserom ;
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
517 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
518
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
519 /*main(int argc, char *argv[])*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
520 int pci_scan(pciinfo_t *pci_list,unsigned *num_pci)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
521 {
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
522 unsigned int idx = 0;
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
523 struct pci_config_reg pcr;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
524 int do_mode1_scan = 0, do_mode2_scan = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
525 int func, hostbridges=0;
4174
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
526 int ret = -1;
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
527
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
528 pci_lst = pci_list;
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
529 *num_pci = 0;
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
530
4174
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
531 ret = enable_os_io();
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
532 if (ret != 0)
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
533 return(ret);
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
534
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
535 if((pcr._configtype = pci_config_type()) == 0xFFFF) return ENODEV;
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
536
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
537 /* Try pci config 1 probe first */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
538
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
539 if ((pcr._configtype == 1) || do_mode1_scan) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
540 /*printf("\nPCI probing configuration type 1\n");*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
541
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
542 pcr._ioaddr = 0xFFFF;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
543
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
544 pcr._pcibuses[0] = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
545 pcr._pcinumbus = 1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
546 pcr._pcibusidx = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
547
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
548 do {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
549 /*printf("Probing for devices on PCI bus %d:\n\n", pcr._pcibusidx);*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
550
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
551 for (pcr._cardnum = 0x0; pcr._cardnum < MAX_PCI_DEVICES_PER_BUS;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
552 pcr._cardnum += 0x1) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
553 func = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
554 do { /* loop over the different functions, if present */
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
555 pcr._device_vendor = pci_get_vendor(pcr._pcibuses[pcr._pcibusidx], pcr._cardnum,
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
556 func);
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
557 if ((pcr._vendor == 0xFFFF) || (pcr._device == 0xFFFF))
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
558 break; /* nothing there */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
559
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
560 /*printf("\npci bus 0x%x cardnum 0x%02x function 0x%04x: vendor 0x%04x device 0x%04x\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
561 pcr._pcibuses[pcr._pcibusidx], pcr._cardnum, func,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
562 pcr._vendor, pcr._device);*/
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
563 pcibus = pcr._pcibuses[pcr._pcibusidx];
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
564 pcicard = pcr._cardnum;
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
565 pcifunc = func;
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
566
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
567 pcr._status_command = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
568 pcr._cardnum,func,PCI_CMD_STAT_REG);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
569 pcr._class_revision = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
570 pcr._cardnum,func,PCI_CLASS_REG);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
571 pcr._bist_header_latency_cache = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
572 pcr._cardnum,func,PCI_HEADER_MISC);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
573 pcr._base0 = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
574 pcr._cardnum,func,PCI_MAP_REG_START);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
575 pcr._base1 = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
576 pcr._cardnum,func,PCI_MAP_REG_START+4);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
577 pcr._base2 = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
578 pcr._cardnum,func,PCI_MAP_REG_START+8);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
579 pcr._base3 = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
580 pcr._cardnum,func,PCI_MAP_REG_START+0x0C);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
581 pcr._base4 = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
582 pcr._cardnum,func,PCI_MAP_REG_START+0x10);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
583 pcr._base5 = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
584 pcr._cardnum,func,PCI_MAP_REG_START+0x14);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
585 pcr._baserom = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
586 pcr._cardnum,func,PCI_MAP_ROM_REG);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
587 pcr._max_min_ipin_iline = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
588 pcr._cardnum,func,PCI_INTERRUPT_REG);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
589 pcr._user_config = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
590 pcr._cardnum,func,PCI_REG_USERCONFIG);
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
591 /* check for pci-pci bridges */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
592 #define PCI_CLASS_MASK 0xff000000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
593 #define PCI_SUBCLASS_MASK 0x00ff0000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
594 #define PCI_CLASS_BRIDGE 0x06000000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
595 #define PCI_SUBCLASS_BRIDGE_PCI 0x00040000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
596 switch(pcr._class_revision & (PCI_CLASS_MASK|PCI_SUBCLASS_MASK)) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
597 case PCI_CLASS_BRIDGE|PCI_SUBCLASS_BRIDGE_PCI:
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
598 if (pcr._secondary_bus_number > 0) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
599 pcr._pcibuses[pcr._pcinumbus++] = pcr._secondary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
600 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
601 break;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
602 case PCI_CLASS_BRIDGE:
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
603 if ( ++hostbridges > 1) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
604 pcr._pcibuses[pcr._pcinumbus] = pcr._pcinumbus;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
605 pcr._pcinumbus++;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
606 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
607 break;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
608 default:
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
609 break;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
610 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
611 if((func==0) && ((pcr._header_type & PCI_MULTIFUNC_DEV) == 0)) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
612 /* not a multi function device */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
613 func = 8;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
614 } else {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
615 func++;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
616 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
617
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
618 if (idx++ >= MAX_PCI_DEVICES)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
619 continue;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
620
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
621 identify_card(&pcr, (*num_pci)++);
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
622 } while( func < 8 );
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
623 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
624 } while (++pcr._pcibusidx < pcr._pcinumbus);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
625 }
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
626
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
627 #if !defined(__alpha__) && !defined(__powerpc__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
628 /* Now try pci config 2 probe (deprecated) */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
629
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
630 if ((pcr._configtype == 2) || do_mode2_scan) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
631 outb(PCI_MODE2_ENABLE_REG, 0xF1);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
632 outb(PCI_MODE2_FORWARD_REG, 0x00); /* bus 0 for now */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
633
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
634 /*printf("\nPCI probing configuration type 2\n");*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
635
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
636 pcr._pcibuses[0] = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
637 pcr._pcinumbus = 1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
638 pcr._pcibusidx = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
639 idx = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
640
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
641 do {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
642 for (pcr._ioaddr = 0xC000; pcr._ioaddr < 0xD000; pcr._ioaddr += 0x0100){
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
643 outb(PCI_MODE2_FORWARD_REG, pcr._pcibuses[pcr._pcibusidx]); /* bus 0 for now */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
644 pcr._device_vendor = inl(pcr._ioaddr);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
645 outb(PCI_MODE2_FORWARD_REG, 0x00); /* bus 0 for now */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
646
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
647 if ((pcr._vendor == 0xFFFF) || (pcr._device == 0xFFFF))
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
648 continue;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
649 if ((pcr._vendor == 0xF0F0) || (pcr._device == 0xF0F0))
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
650 continue; /* catch ASUS P55TP4XE motherboards */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
651
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
652 /*printf("\npci bus 0x%x slot at 0x%04x, vendor 0x%04x device 0x%04x\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
653 pcr._pcibuses[pcr._pcibusidx], pcr._ioaddr, pcr._vendor,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
654 pcr._device);*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
655 pcibus = pcr._pcibuses[pcr._pcibusidx] ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
656 pcicard = pcr._ioaddr ; pcifunc = 0 ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
657
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
658 outb(PCI_MODE2_FORWARD_REG, pcr._pcibuses[pcr._pcibusidx]); /* bus 0 for now */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
659 pcr._status_command = inl(pcr._ioaddr + 0x04);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
660 pcr._class_revision = inl(pcr._ioaddr + 0x08);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
661 pcr._bist_header_latency_cache = inl(pcr._ioaddr + 0x0C);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
662 pcr._base0 = inl(pcr._ioaddr + 0x10);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
663 pcr._base1 = inl(pcr._ioaddr + 0x14);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
664 pcr._base2 = inl(pcr._ioaddr + 0x18);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
665 pcr._base3 = inl(pcr._ioaddr + 0x1C);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
666 pcr._base4 = inl(pcr._ioaddr + 0x20);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
667 pcr._base5 = inl(pcr._ioaddr + 0x24);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
668 pcr._baserom = inl(pcr._ioaddr + 0x30);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
669 pcr._max_min_ipin_iline = inl(pcr._ioaddr + 0x3C);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
670 pcr._user_config = inl(pcr._ioaddr + 0x40);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
671 outb(PCI_MODE2_FORWARD_REG, 0x00); /* bus 0 for now */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
672
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
673 /* check for pci-pci bridges (currently we only know Digital) */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
674 if ((pcr._vendor == 0x1011) && (pcr._device == 0x0001))
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
675 if (pcr._secondary_bus_number > 0)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
676 pcr._pcibuses[pcr._pcinumbus++] = pcr._secondary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
677
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
678 if (idx++ >= MAX_PCI_DEVICES)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
679 continue;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
680
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
681 identify_card(&pcr, (*num_pci)++);
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
682 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
683 } while (++pcr._pcibusidx < pcr._pcinumbus);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
684
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
685 outb(PCI_MODE2_ENABLE_REG, 0x00);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
686 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
687
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
688 #endif /* !__alpha__ && !__powerpc__ */
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
689
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
690 disable_os_io();
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
691
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
692 return 0 ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
693
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
694 }
4174
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
695
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
696 #if !defined(ENOTSUP)
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
697 #if defined(EOPNOTSUPP)
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
698 #define ENOTSUP EOPNOTSUPP
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
699 #else
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
700 #warning "ENOTSUP nor EOPNOTSUPP defined!"
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
701 #endif
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
702 #endif
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
703
4277
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
704 int pci_config_read(unsigned char bus, unsigned char dev, unsigned char func,
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
705 unsigned char cmd, int len, unsigned long *val)
4174
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
706 {
4277
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
707 int ret;
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
708
4174
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
709 if (len != 4)
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
710 {
17971
fd0d4b94b5ec Change some printf calls to fprintf.
diego
parents: 15566
diff changeset
711 fprintf(stderr,"pci_config_read: Reading non-dword not supported!\n");
4174
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
712 return(ENOTSUP);
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
713 }
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
714
4277
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
715 ret = enable_os_io();
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
716 if (ret != 0)
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
717 return(ret);
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
718 ret = pci_config_read_long(bus, dev, func, cmd);
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
719 disable_os_io();
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
720
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
721 *val = ret;
4174
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
722 return(0);
4cfb6b9a6da3 api changed: enable/disable_os_io returns error-code (or zero if ok) and pciconfig_read exported for mga_vid
alex
parents: 4173
diff changeset
723 }
4192
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
724
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
725 int enable_app_io( void )
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
726 {
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
727 return enable_os_io();
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
728 }
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
729
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
730 int disable_app_io( void )
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
731 {
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
732 return disable_os_io();
5702
567de708ab3a sync with mplayerxp
nick
parents: 4278
diff changeset
733 }