annotate libdha/pci.c @ 11330:a974c00c779d

Removed temporary .cpp file used during the Matroska test. Updated the libebml and libmatroska requirements to at least v0.6.0 for both. There have been changes in the lacing code, and users WILL come and complain why mplayer, linked against older versions, will have issues playing newer files.
author mosu
date Thu, 30 Oct 2003 14:57:06 +0000
parents e687fa1d55c6
children cb35163ef0a1
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
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
3 XFree86 3.3.3 scanpci.c, modified for GATOS/win/gfxdump by Øyvind Aabling.
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
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
54 #include "libdha.h"
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"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
65 #elif defined (__FreeBSD__)
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
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
97 #if 0
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
98 #if defined(__SUNPRO_C) || defined(sun) || defined(__sun)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
99 #include <sys/psw.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
100 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
101 #include <sys/seg.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
102 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
103 #include <sys/v86.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
104 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
105
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
106 #if defined(Lynx) && defined(__powerpc__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
107 /* 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
108 * to change too much code
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
109 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
110 #include <smem.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
111
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
112 static unsigned char *pciConfBase;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
113
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
114 static __inline__ unsigned long
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
115 static swapl(unsigned long val)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
116 {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
117 unsigned char *p = (unsigned char *)&val;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
118 return ((p[3] << 24) | (p[2] << 16) | (p[1] << 8) | (p[0] << 0));
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
119 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
120
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
121
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
122 #define BUS(tag) (((tag)>>16)&0xff)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
123 #define DFN(tag) (((tag)>>8)&0xff)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
124
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
125 #define PCIBIOS_DEVICE_NOT_FOUND 0x86
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
126 #define PCIBIOS_SUCCESSFUL 0x00
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
127
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
128 int pciconfig_read(
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
129 unsigned char bus,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
130 unsigned char dev,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
131 unsigned char offset,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
132 int len, /* unused, alway 4 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
133 unsigned long *val)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
134 {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
135 unsigned long _val;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
136 unsigned long *ptr;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
137
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
138 dev >>= 3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
139 if (bus || dev >= 16) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
140 *val = 0xFFFFFFFF;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
141 return PCIBIOS_DEVICE_NOT_FOUND;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
142 } else {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
143 ptr = (unsigned long *)(pciConfBase + ((1<<dev) | offset));
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
144 _val = swapl(*ptr);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
145 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
146 *val = _val;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
147 return PCIBIOS_SUCCESSFUL;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
148 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
149
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
150 int pciconfig_write(
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
151 unsigned char bus,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
152 unsigned char dev,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
153 unsigned char offset,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
154 int len, /* unused, alway 4 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
155 unsigned long val)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
156 {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
157 unsigned long _val;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
158 unsigned long *ptr;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
159
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
160 dev >>= 3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
161 _val = swapl(val);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
162 if (bus || dev >= 16) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
163 return PCIBIOS_DEVICE_NOT_FOUND;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
164 } else {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
165 ptr = (unsigned long *)(pciConfBase + ((1<<dev) | offset));
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
166 *ptr = _val;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
167 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
168 return PCIBIOS_SUCCESSFUL;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
169 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
170 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
171
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
172 #if !defined(__powerpc__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
173 struct pci_config_reg {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
174 /* start of official PCI config space header */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
175 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
176 unsigned long device_vendor;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
177 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
178 unsigned short vendor;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
179 unsigned short device;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
180 } dv;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
181 } dv_id;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
182 #define _device_vendor dv_id.device_vendor
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
183 #define _vendor dv_id.dv.vendor
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
184 #define _device dv_id.dv.device
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
185 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
186 unsigned long status_command;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
187 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
188 unsigned short command;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
189 unsigned short status;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
190 } sc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
191 } stat_cmd;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
192 #define _status_command stat_cmd.status_command
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
193 #define _command stat_cmd.sc.command
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
194 #define _status stat_cmd.sc.status
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
195 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
196 unsigned long class_revision;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
197 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
198 unsigned char rev_id;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
199 unsigned char prog_if;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
200 unsigned char sub_class;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
201 unsigned char base_class;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
202 } cr;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
203 } class_rev;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
204 #define _class_revision class_rev.class_revision
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
205 #define _rev_id class_rev.cr.rev_id
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
206 #define _prog_if class_rev.cr.prog_if
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
207 #define _sub_class class_rev.cr.sub_class
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
208 #define _base_class class_rev.cr.base_class
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
209 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
210 unsigned long bist_header_latency_cache;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
211 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
212 unsigned char cache_line_size;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
213 unsigned char latency_timer;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
214 unsigned char header_type;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
215 unsigned char bist;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
216 } bhlc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
217 } bhlc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
218 #define _bist_header_latency_cache bhlc.bist_header_latency_cache
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
219 #define _cache_line_size bhlc.bhlc.cache_line_size
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
220 #define _latency_timer bhlc.bhlc.latency_timer
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
221 #define _header_type bhlc.bhlc.header_type
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
222 #define _bist bhlc.bhlc.bist
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
223 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
224 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
225 unsigned long dv_base0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
226 unsigned long dv_base1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
227 unsigned long dv_base2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
228 unsigned long dv_base3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
229 unsigned long dv_base4;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
230 unsigned long dv_base5;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
231 } dv;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
232 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
233 unsigned long bg_rsrvd[2];
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
234 unsigned char primary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
235 unsigned char secondary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
236 unsigned char subordinate_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
237 unsigned char secondary_latency_timer;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
238 unsigned char io_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
239 unsigned char io_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
240 unsigned short secondary_status;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
241 unsigned short mem_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
242 unsigned short mem_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
243 unsigned short prefetch_mem_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
244 unsigned short prefetch_mem_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
245 } bg;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
246 } bc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
247 #define _base0 bc.dv.dv_base0
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
248 #define _base1 bc.dv.dv_base1
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
249 #define _base2 bc.dv.dv_base2
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
250 #define _base3 bc.dv.dv_base3
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
251 #define _base4 bc.dv.dv_base4
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
252 #define _base5 bc.dv.dv_base5
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
253 #define _primary_bus_number bc.bg.primary_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
254 #define _secondary_bus_number bc.bg.secondary_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
255 #define _subordinate_bus_number bc.bg.subordinate_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
256 #define _secondary_latency_timer bc.bg.secondary_latency_timer
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
257 #define _io_base bc.bg.io_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
258 #define _io_limit bc.bg.io_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
259 #define _secondary_status bc.bg.secondary_status
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
260 #define _mem_base bc.bg.mem_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
261 #define _mem_limit bc.bg.mem_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
262 #define _prefetch_mem_base bc.bg.prefetch_mem_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
263 #define _prefetch_mem_limit bc.bg.prefetch_mem_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
264 unsigned long rsvd1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
265 unsigned long rsvd2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
266 unsigned long _baserom;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
267 unsigned long rsvd3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
268 unsigned long rsvd4;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
269 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
270 unsigned long max_min_ipin_iline;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
271 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
272 unsigned char int_line;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
273 unsigned char int_pin;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
274 unsigned char min_gnt;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
275 unsigned char max_lat;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
276 } mmii;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
277 } mmii;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
278 #define _max_min_ipin_iline mmii.max_min_ipin_iline
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
279 #define _int_line mmii.mmii.int_line
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
280 #define _int_pin mmii.mmii.int_pin
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
281 #define _min_gnt mmii.mmii.min_gnt
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
282 #define _max_lat mmii.mmii.max_lat
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
283 /* I don't know how accurate or standard this is (DHD) */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
284 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
285 unsigned long user_config;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
286 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
287 unsigned char user_config_0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
288 unsigned char user_config_1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
289 unsigned char user_config_2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
290 unsigned char user_config_3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
291 } uc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
292 } uc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
293 #define _user_config uc.user_config
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
294 #define _user_config_0 uc.uc.user_config_0
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
295 #define _user_config_1 uc.uc.user_config_1
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
296 #define _user_config_2 uc.uc.user_config_2
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
297 #define _user_config_3 uc.uc.user_config_3
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
298 /* end of official PCI config space header */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
299 unsigned long _pcibusidx;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
300 unsigned long _pcinumbus;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
301 unsigned long _pcibuses[16];
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
302 unsigned short _configtype; /* config type found */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
303 unsigned short _ioaddr; /* config type 1 - private I/O addr */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
304 unsigned long _cardnum; /* config type 2 - private card number */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
305 };
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
306 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
307 /* ppc is big endian, swapping bytes is not quite enough
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
308 * to interpret the PCI config registers...
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
309 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
310 struct pci_config_reg {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
311 /* start of official PCI config space header */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
312 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
313 unsigned long device_vendor;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
314 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
315 unsigned short device;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
316 unsigned short vendor;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
317 } dv;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
318 } dv_id;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
319 #define _device_vendor dv_id.device_vendor
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
320 #define _vendor dv_id.dv.vendor
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
321 #define _device dv_id.dv.device
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
322 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
323 unsigned long status_command;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
324 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
325 unsigned short status;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
326 unsigned short command;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
327 } sc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
328 } stat_cmd;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
329 #define _status_command stat_cmd.status_command
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
330 #define _command stat_cmd.sc.command
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
331 #define _status stat_cmd.sc.status
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
332 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
333 unsigned long class_revision;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
334 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
335 unsigned char base_class;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
336 unsigned char sub_class;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
337 unsigned char prog_if;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
338 unsigned char rev_id;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
339 } cr;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
340 } class_rev;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
341 #define _class_revision class_rev.class_revision
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
342 #define _rev_id class_rev.cr.rev_id
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
343 #define _prog_if class_rev.cr.prog_if
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
344 #define _sub_class class_rev.cr.sub_class
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
345 #define _base_class class_rev.cr.base_class
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
346 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
347 unsigned long bist_header_latency_cache;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
348 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
349 unsigned char bist;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
350 unsigned char header_type;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
351 unsigned char latency_timer;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
352 unsigned char cache_line_size;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
353 } bhlc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
354 } bhlc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
355 #define _bist_header_latency_cache bhlc.bist_header_latency_cache
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
356 #define _cache_line_size bhlc.bhlc.cache_line_size
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
357 #define _latency_timer bhlc.bhlc.latency_timer
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
358 #define _header_type bhlc.bhlc.header_type
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
359 #define _bist bhlc.bhlc.bist
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
360 union {
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 dv_base0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
363 unsigned long dv_base1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
364 unsigned long dv_base2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
365 unsigned long dv_base3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
366 unsigned long dv_base4;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
367 unsigned long dv_base5;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
368 } dv;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
369 /* ?? */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
370 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
371 unsigned long bg_rsrvd[2];
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 char secondary_latency_timer;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
374 unsigned char subordinate_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
375 unsigned char secondary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
376 unsigned char primary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
377
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
378 unsigned short secondary_status;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
379 unsigned char io_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
380 unsigned char io_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
381
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
382 unsigned short mem_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
383 unsigned short mem_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
384
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
385 unsigned short prefetch_mem_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
386 unsigned short prefetch_mem_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
387 } bg;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
388 } bc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
389 #define _base0 bc.dv.dv_base0
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
390 #define _base1 bc.dv.dv_base1
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
391 #define _base2 bc.dv.dv_base2
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
392 #define _base3 bc.dv.dv_base3
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
393 #define _base4 bc.dv.dv_base4
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
394 #define _base5 bc.dv.dv_base5
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
395 #define _primary_bus_number bc.bg.primary_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
396 #define _secondary_bus_number bc.bg.secondary_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
397 #define _subordinate_bus_number bc.bg.subordinate_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
398 #define _secondary_latency_timer bc.bg.secondary_latency_timer
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
399 #define _io_base bc.bg.io_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
400 #define _io_limit bc.bg.io_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
401 #define _secondary_status bc.bg.secondary_status
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
402 #define _mem_base bc.bg.mem_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
403 #define _mem_limit bc.bg.mem_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
404 #define _prefetch_mem_base bc.bg.prefetch_mem_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
405 #define _prefetch_mem_limit bc.bg.prefetch_mem_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
406 unsigned long rsvd1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
407 unsigned long rsvd2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
408 unsigned long _baserom;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
409 unsigned long rsvd3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
410 unsigned long rsvd4;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
411 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
412 unsigned long max_min_ipin_iline;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
413 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
414 unsigned char max_lat;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
415 unsigned char min_gnt;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
416 unsigned char int_pin;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
417 unsigned char int_line;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
418 } mmii;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
419 } mmii;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
420 #define _max_min_ipin_iline mmii.max_min_ipin_iline
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
421 #define _int_line mmii.mmii.int_line
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
422 #define _int_pin mmii.mmii.int_pin
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
423 #define _min_gnt mmii.mmii.min_gnt
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
424 #define _max_lat mmii.mmii.max_lat
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
425 /* I don't know how accurate or standard this is (DHD) */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
426 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
427 unsigned long user_config;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
428 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
429 unsigned char user_config_3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
430 unsigned char user_config_2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
431 unsigned char user_config_1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
432 unsigned char user_config_0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
433 } uc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
434 } uc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
435 #define _user_config uc.user_config
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
436 #define _user_config_0 uc.uc.user_config_0
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
437 #define _user_config_1 uc.uc.user_config_1
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
438 #define _user_config_2 uc.uc.user_config_2
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
439 #define _user_config_3 uc.uc.user_config_3
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
440 /* end of official PCI config space header */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
441 unsigned long _pcibusidx;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
442 unsigned long _pcinumbus;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
443 unsigned long _pcibuses[16];
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
444 unsigned short _ioaddr; /* config type 1 - private I/O addr */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
445 unsigned short _configtype; /* config type found */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
446 unsigned long _cardnum; /* config type 2 - private card number */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
447 };
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
448 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
449
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
450 #define MAX_DEV_PER_VENDOR_CFG1 64
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
451 #define MAX_PCI_DEVICES_PER_BUS 32
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
452 #define MAX_PCI_DEVICES 64
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
453 #define NF ((void (*)())NULL), { 0.0, 0, 0, NULL }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
454 #define PCI_MULTIFUNC_DEV 0x80
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
455 #define PCI_ID_REG 0x00
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
456 #define PCI_CMD_STAT_REG 0x04
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
457 #define PCI_CLASS_REG 0x08
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
458 #define PCI_HEADER_MISC 0x0C
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
459 #define PCI_MAP_REG_START 0x10
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
460 #define PCI_MAP_ROM_REG 0x30
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
461 #define PCI_INTERRUPT_REG 0x3C
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
462 #define PCI_REG_USERCONFIG 0x40
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
463
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
464 static int pcibus=-1, pcicard=-1, pcifunc=-1 ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
465 /*static struct pci_device *pcidev=NULL ;*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
466
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
467 #if defined(__alpha__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
468 #define PCI_EN 0x00000000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
469 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
470 #define PCI_EN 0x80000000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
471 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
472
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
473 #define PCI_MODE1_ADDRESS_REG 0xCF8
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
474 #define PCI_MODE1_DATA_REG 0xCFC
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
475
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
476 #define PCI_MODE2_ENABLE_REG 0xCF8
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
477 #ifdef PC98
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
478 #define PCI_MODE2_FORWARD_REG 0xCF9
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
479 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
480 #define PCI_MODE2_FORWARD_REG 0xCFA
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
481 #endif
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
482
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
483 /* 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
484 #ifndef CONFIG_SVGAHELPER
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
485 #if defined(__alpha__)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
486 #include "sysdep/pci_alpha.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
487 #elif defined(__ia64__)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
488 #include "sysdep/pci_ia64.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
489 #elif defined(__sparc__)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
490 #include "sysdep/pci_sparc.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
491 #elif defined( __arm32__ )
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
492 #include "sysdep/pci_arm32.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
493 #elif defined(__powerpc__)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
494 #include "sysdep/pci_powerpc.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
495 #else
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
496 #include "sysdep/pci_x86.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
497 #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
498 #endif
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
499
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
500 static pciinfo_t *pci_lst;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
501
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
502 static void identify_card(struct pci_config_reg *pcr, int idx)
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
503 {
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
504 /* local overflow test */
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
505 if (idx>=MAX_PCI_DEVICES) return ;
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
506
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
507 pci_lst[idx].bus = pcibus ;
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
508 pci_lst[idx].card = pcicard ;
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
509 pci_lst[idx].func = pcifunc ;
9767
f6d2772efca3 Ignore disabled cards. (Jon Burgess <jburgess@uklinux.net>)
ranma
parents: 8776
diff changeset
510 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
511 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
512 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
513 pci_lst[idx].base0 = 0xFFFFFFFF ;
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
514 pci_lst[idx].base1 = 0xFFFFFFFF ;
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
515 pci_lst[idx].base2 = 0xFFFFFFFF ;
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
516 pci_lst[idx].baserom = 0x000C0000 ;
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
517 if (pcr->_base0) pci_lst[idx].base0 = pcr->_base0 &
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
518 ((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
519 if (pcr->_base1) pci_lst[idx].base1 = pcr->_base1 &
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
520 ((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
521 if (pcr->_base2) pci_lst[idx].base2 = pcr->_base2 &
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
522 ((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
523 if (pcr->_baserom) pci_lst[idx].baserom = pcr->_baserom ;
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
524 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
525
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
526 /*main(int argc, char *argv[])*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
527 int pci_scan(pciinfo_t *pci_list,unsigned *num_pci)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
528 {
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
529 unsigned int idx = 0;
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
530 struct pci_config_reg pcr;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
531 int do_mode1_scan = 0, do_mode2_scan = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
532 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
533 int ret = -1;
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
534
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
535 pci_lst = pci_list;
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
536 *num_pci = 0;
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
537
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
538 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
539 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
540 return(ret);
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
541
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
542 if((pcr._configtype = pci_config_type()) == 0xFFFF) return ENODEV;
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
543
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
544 /* Try pci config 1 probe first */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
545
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
546 if ((pcr._configtype == 1) || do_mode1_scan) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
547 /*printf("\nPCI probing configuration type 1\n");*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
548
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
549 pcr._ioaddr = 0xFFFF;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
550
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
551 pcr._pcibuses[0] = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
552 pcr._pcinumbus = 1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
553 pcr._pcibusidx = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
554
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
555 do {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
556 /*printf("Probing for devices on PCI bus %d:\n\n", pcr._pcibusidx);*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
557
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
558 for (pcr._cardnum = 0x0; pcr._cardnum < MAX_PCI_DEVICES_PER_BUS;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
559 pcr._cardnum += 0x1) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
560 func = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
561 do { /* loop over the different functions, if present */
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
562 pcr._device_vendor = pci_get_vendor(pcr._pcibuses[pcr._pcibusidx], pcr._cardnum,
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
563 func);
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
564 if ((pcr._vendor == 0xFFFF) || (pcr._device == 0xFFFF))
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
565 break; /* nothing there */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
566
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
567 /*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
568 pcr._pcibuses[pcr._pcibusidx], pcr._cardnum, func,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
569 pcr._vendor, pcr._device);*/
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
570 pcibus = pcr._pcibuses[pcr._pcibusidx];
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
571 pcicard = pcr._cardnum;
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
572 pcifunc = func;
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
573
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
574 pcr._status_command = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
575 pcr._cardnum,func,PCI_CMD_STAT_REG);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
576 pcr._class_revision = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
577 pcr._cardnum,func,PCI_CLASS_REG);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
578 pcr._bist_header_latency_cache = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
579 pcr._cardnum,func,PCI_HEADER_MISC);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
580 pcr._base0 = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
581 pcr._cardnum,func,PCI_MAP_REG_START);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
582 pcr._base1 = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
583 pcr._cardnum,func,PCI_MAP_REG_START+4);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
584 pcr._base2 = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
585 pcr._cardnum,func,PCI_MAP_REG_START+8);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
586 pcr._base3 = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
587 pcr._cardnum,func,PCI_MAP_REG_START+0x0C);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
588 pcr._base4 = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
589 pcr._cardnum,func,PCI_MAP_REG_START+0x10);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
590 pcr._base5 = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
591 pcr._cardnum,func,PCI_MAP_REG_START+0x14);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
592 pcr._baserom = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
593 pcr._cardnum,func,PCI_MAP_ROM_REG);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
594 pcr._max_min_ipin_iline = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
595 pcr._cardnum,func,PCI_INTERRUPT_REG);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
596 pcr._user_config = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
597 pcr._cardnum,func,PCI_REG_USERCONFIG);
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
598 /* check for pci-pci bridges */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
599 #define PCI_CLASS_MASK 0xff000000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
600 #define PCI_SUBCLASS_MASK 0x00ff0000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
601 #define PCI_CLASS_BRIDGE 0x06000000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
602 #define PCI_SUBCLASS_BRIDGE_PCI 0x00040000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
603 switch(pcr._class_revision & (PCI_CLASS_MASK|PCI_SUBCLASS_MASK)) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
604 case PCI_CLASS_BRIDGE|PCI_SUBCLASS_BRIDGE_PCI:
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
605 if (pcr._secondary_bus_number > 0) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
606 pcr._pcibuses[pcr._pcinumbus++] = pcr._secondary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
607 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
608 break;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
609 case PCI_CLASS_BRIDGE:
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
610 if ( ++hostbridges > 1) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
611 pcr._pcibuses[pcr._pcinumbus] = pcr._pcinumbus;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
612 pcr._pcinumbus++;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
613 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
614 break;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
615 default:
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
616 break;
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((func==0) && ((pcr._header_type & PCI_MULTIFUNC_DEV) == 0)) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
619 /* not a multi function device */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
620 func = 8;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
621 } else {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
622 func++;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
623 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
624
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
625 if (idx++ >= MAX_PCI_DEVICES)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
626 continue;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
627
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
628 identify_card(&pcr, (*num_pci)++);
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
629 } while( func < 8 );
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
630 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
631 } while (++pcr._pcibusidx < pcr._pcinumbus);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
632 }
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
633
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
634 #if !defined(__alpha__) && !defined(__powerpc__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
635 /* Now try pci config 2 probe (deprecated) */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
636
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
637 if ((pcr._configtype == 2) || do_mode2_scan) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
638 outb(PCI_MODE2_ENABLE_REG, 0xF1);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
639 outb(PCI_MODE2_FORWARD_REG, 0x00); /* bus 0 for now */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
640
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
641 /*printf("\nPCI probing configuration type 2\n");*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
642
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
643 pcr._pcibuses[0] = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
644 pcr._pcinumbus = 1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
645 pcr._pcibusidx = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
646 idx = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
647
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
648 do {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
649 for (pcr._ioaddr = 0xC000; pcr._ioaddr < 0xD000; pcr._ioaddr += 0x0100){
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
650 outb(PCI_MODE2_FORWARD_REG, pcr._pcibuses[pcr._pcibusidx]); /* bus 0 for now */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
651 pcr._device_vendor = inl(pcr._ioaddr);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
652 outb(PCI_MODE2_FORWARD_REG, 0x00); /* bus 0 for now */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
653
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
654 if ((pcr._vendor == 0xFFFF) || (pcr._device == 0xFFFF))
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
655 continue;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
656 if ((pcr._vendor == 0xF0F0) || (pcr._device == 0xF0F0))
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
657 continue; /* catch ASUS P55TP4XE motherboards */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
658
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
659 /*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
660 pcr._pcibuses[pcr._pcibusidx], pcr._ioaddr, pcr._vendor,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
661 pcr._device);*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
662 pcibus = pcr._pcibuses[pcr._pcibusidx] ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
663 pcicard = pcr._ioaddr ; pcifunc = 0 ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
664
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
665 outb(PCI_MODE2_FORWARD_REG, pcr._pcibuses[pcr._pcibusidx]); /* bus 0 for now */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
666 pcr._status_command = inl(pcr._ioaddr + 0x04);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
667 pcr._class_revision = inl(pcr._ioaddr + 0x08);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
668 pcr._bist_header_latency_cache = inl(pcr._ioaddr + 0x0C);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
669 pcr._base0 = inl(pcr._ioaddr + 0x10);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
670 pcr._base1 = inl(pcr._ioaddr + 0x14);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
671 pcr._base2 = inl(pcr._ioaddr + 0x18);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
672 pcr._base3 = inl(pcr._ioaddr + 0x1C);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
673 pcr._base4 = inl(pcr._ioaddr + 0x20);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
674 pcr._base5 = inl(pcr._ioaddr + 0x24);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
675 pcr._baserom = inl(pcr._ioaddr + 0x30);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
676 pcr._max_min_ipin_iline = inl(pcr._ioaddr + 0x3C);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
677 pcr._user_config = inl(pcr._ioaddr + 0x40);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
678 outb(PCI_MODE2_FORWARD_REG, 0x00); /* bus 0 for now */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
679
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
680 /* check for pci-pci bridges (currently we only know Digital) */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
681 if ((pcr._vendor == 0x1011) && (pcr._device == 0x0001))
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
682 if (pcr._secondary_bus_number > 0)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
683 pcr._pcibuses[pcr._pcinumbus++] = pcr._secondary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
684
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
685 if (idx++ >= MAX_PCI_DEVICES)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
686 continue;
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 identify_card(&pcr, (*num_pci)++);
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 } while (++pcr._pcibusidx < pcr._pcinumbus);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
691
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
692 outb(PCI_MODE2_ENABLE_REG, 0x00);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
693 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
694
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
695 #endif /* !__alpha__ && !__powerpc__ */
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
696
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
697 disable_os_io();
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
698
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
699 return 0 ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
700
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
701 }
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
702
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 #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
704 #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
705 #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
706 #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
707 #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
708 #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
709 #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
710
4277
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
711 int pci_config_read(unsigned char bus, unsigned char dev, unsigned char func,
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
712 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
713 {
4277
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
714 int ret;
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
715
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
716 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
717 {
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
718 printf("pci_config_read: reading non-dword not supported!\n");
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
719 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
720 }
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
721
4277
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
722 ret = enable_os_io();
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
723 if (ret != 0)
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
724 return(ret);
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
725 ret = pci_config_read_long(bus, dev, func, cmd);
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
726 disable_os_io();
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
727
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
728 *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
729 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
730 }
4192
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 int enable_app_io( void )
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
733 {
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
734 return enable_os_io();
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
735 }
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
736
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
737 int disable_app_io( void )
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
738 {
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
739 return disable_os_io();
5702
567de708ab3a sync with mplayerxp
nick
parents: 4278
diff changeset
740 }