annotate vidix/pci.c @ 28615:15e7abed4291

Use the same code to convert fps in float to fraction as used in mencoder, it ensures all the common frame rates work right. If this causes issues, it should be changed in the same way in mencoder.c
author reimar
date Wed, 18 Feb 2009 16:49:12 +0000
parents 7de310806281
children 0f1b5b68af32
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__
24511
263c0b282d90 this flag needs to be defined for pread() on powerpc
ben
parents: 24510
diff changeset
59 #define __USE_UNIX98
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
60 #include <unistd.h>
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
61 #endif
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
62 #include "AsmMacros.h"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
63 /* OS depended stuff */
27250
dcf62171257b Remove -std=gnu99/gnu89/default dialect linux define, as it violates the
michael
parents: 27005
diff changeset
64 #if defined (__linux__)
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
65 #include "sysdep/pci_linux.c"
21848
3ff1eade91f9 GNU/kFreeBSD support, closes Bugzilla #704.
diego
parents: 17971
diff changeset
66 #elif defined (__FreeBSD__) || defined (__FreeBSD_kernel__) || defined(__DragonFly__)
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
67 #include "sysdep/pci_freebsd.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
68 #elif defined (__386BSD__)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
69 #include "sysdep/pci_386bsd.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
70 #elif defined (__NetBSD__)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
71 #include "sysdep/pci_netbsd.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
72 #elif defined (__OpenBSD__)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
73 #include "sysdep/pci_openbsd.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
74 #elif defined (__bsdi__)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
75 #include "sysdep/pci_bsdi.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
76 #elif defined (Lynx)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
77 #include "sysdep/pci_lynx.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
78 #elif defined (MACH386)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
79 #include "sysdep/pci_mach386.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
80 #elif defined (__SVR4)
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
81 #if !defined(SVR4)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
82 #define SVR4
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
83 #endif
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
84 #include "sysdep/pci_svr4.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
85 #elif defined (SCO)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
86 #include "sysdep/pci_sco.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
87 #elif defined (ISC)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
88 #include "sysdep/pci_isc.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
89 #elif defined (__EMX__)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
90 #include "sysdep/pci_os2.c"
4173
250f39dedede cygwin compile fix
atmos4
parents: 4164
diff changeset
91 #elif defined (_WIN32) || defined(__CYGWIN__)
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
92 #include "sysdep/pci_win32.c"
10980
e687fa1d55c6 port libdha to mingw
faust3
parents: 9767
diff changeset
93 #ifdef __MINGW32__
e687fa1d55c6 port libdha to mingw
faust3
parents: 9767
diff changeset
94 #define ENOTSUP 134 /* Not supported */
e687fa1d55c6 port libdha to mingw
faust3
parents: 9767
diff changeset
95 #endif
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
96 #endif
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
97
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
98 #if defined(Lynx) && defined(__powerpc__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
99 /* 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
100 * to change too much code
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
101 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
102 #include <smem.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
103
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
104 static unsigned char *pciConfBase;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
105
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
106 static __inline__ unsigned long
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
107 static swapl(unsigned long val)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
108 {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
109 unsigned char *p = (unsigned char *)&val;
26753
502f04b67653 cosmetics: Remove useless parentheses from return statements.
diego
parents: 24511
diff changeset
110 return (p[3] << 24) | (p[2] << 16) | (p[1] << 8) | (p[0] << 0);
3973
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
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
114 #define BUS(tag) (((tag)>>16)&0xff)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
115 #define DFN(tag) (((tag)>>8)&0xff)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
116
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
117 #define PCIBIOS_DEVICE_NOT_FOUND 0x86
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
118 #define PCIBIOS_SUCCESSFUL 0x00
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
119
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
120 int pciconfig_read(
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
121 unsigned char bus,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
122 unsigned char dev,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
123 unsigned char offset,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
124 int len, /* unused, alway 4 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
125 unsigned long *val)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
126 {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
127 unsigned long _val;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
128 unsigned long *ptr;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
129
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
130 dev >>= 3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
131 if (bus || dev >= 16) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
132 *val = 0xFFFFFFFF;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
133 return PCIBIOS_DEVICE_NOT_FOUND;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
134 } else {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
135 ptr = (unsigned long *)(pciConfBase + ((1<<dev) | offset));
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
136 _val = swapl(*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 *val = _val;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
139 return PCIBIOS_SUCCESSFUL;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
140 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
141
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
142 int pciconfig_write(
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
143 unsigned char bus,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
144 unsigned char dev,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
145 unsigned char offset,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
146 int len, /* unused, alway 4 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
147 unsigned long val)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
148 {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
149 unsigned long _val;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
150 unsigned long *ptr;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
151
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
152 dev >>= 3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
153 _val = swapl(val);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
154 if (bus || dev >= 16) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
155 return PCIBIOS_DEVICE_NOT_FOUND;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
156 } else {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
157 ptr = (unsigned long *)(pciConfBase + ((1<<dev) | offset));
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
158 *ptr = _val;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
159 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
160 return PCIBIOS_SUCCESSFUL;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
161 }
27005
0a7f07b761e1 Add comments to a few #endif preprocessor directives.
diego
parents: 26753
diff changeset
162 #endif /* defined(Lynx) && defined(__powerpc__) */
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
163
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
164 #if !defined(__powerpc__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
165 struct pci_config_reg {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
166 /* start of official PCI config space header */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
167 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
168 unsigned long device_vendor;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
169 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
170 unsigned short vendor;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
171 unsigned short device;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
172 } dv;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
173 } dv_id;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
174 #define _device_vendor dv_id.device_vendor
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
175 #define _vendor dv_id.dv.vendor
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
176 #define _device dv_id.dv.device
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
177 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
178 unsigned long status_command;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
179 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
180 unsigned short command;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
181 unsigned short status;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
182 } sc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
183 } stat_cmd;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
184 #define _status_command stat_cmd.status_command
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
185 #define _command stat_cmd.sc.command
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
186 #define _status stat_cmd.sc.status
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
187 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
188 unsigned long class_revision;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
189 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
190 unsigned char rev_id;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
191 unsigned char prog_if;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
192 unsigned char sub_class;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
193 unsigned char base_class;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
194 } cr;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
195 } class_rev;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
196 #define _class_revision class_rev.class_revision
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
197 #define _rev_id class_rev.cr.rev_id
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
198 #define _prog_if class_rev.cr.prog_if
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
199 #define _sub_class class_rev.cr.sub_class
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
200 #define _base_class class_rev.cr.base_class
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
201 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
202 unsigned long bist_header_latency_cache;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
203 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
204 unsigned char cache_line_size;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
205 unsigned char latency_timer;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
206 unsigned char header_type;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
207 unsigned char bist;
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 } bhlc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
210 #define _bist_header_latency_cache bhlc.bist_header_latency_cache
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
211 #define _cache_line_size bhlc.bhlc.cache_line_size
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
212 #define _latency_timer bhlc.bhlc.latency_timer
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
213 #define _header_type bhlc.bhlc.header_type
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
214 #define _bist bhlc.bhlc.bist
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
215 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
216 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
217 unsigned long dv_base0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
218 unsigned long dv_base1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
219 unsigned long dv_base2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
220 unsigned long dv_base3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
221 unsigned long dv_base4;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
222 unsigned long dv_base5;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
223 } dv;
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 bg_rsrvd[2];
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
226 unsigned char primary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
227 unsigned char secondary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
228 unsigned char subordinate_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
229 unsigned char secondary_latency_timer;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
230 unsigned char io_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
231 unsigned char io_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
232 unsigned short secondary_status;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
233 unsigned short mem_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
234 unsigned short mem_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
235 unsigned short prefetch_mem_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
236 unsigned short prefetch_mem_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
237 } bg;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
238 } bc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
239 #define _base0 bc.dv.dv_base0
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
240 #define _base1 bc.dv.dv_base1
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
241 #define _base2 bc.dv.dv_base2
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
242 #define _base3 bc.dv.dv_base3
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
243 #define _base4 bc.dv.dv_base4
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
244 #define _base5 bc.dv.dv_base5
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
245 #define _primary_bus_number bc.bg.primary_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
246 #define _secondary_bus_number bc.bg.secondary_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
247 #define _subordinate_bus_number bc.bg.subordinate_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
248 #define _secondary_latency_timer bc.bg.secondary_latency_timer
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
249 #define _io_base bc.bg.io_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
250 #define _io_limit bc.bg.io_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
251 #define _secondary_status bc.bg.secondary_status
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
252 #define _mem_base bc.bg.mem_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
253 #define _mem_limit bc.bg.mem_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
254 #define _prefetch_mem_base bc.bg.prefetch_mem_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
255 #define _prefetch_mem_limit bc.bg.prefetch_mem_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
256 unsigned long rsvd1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
257 unsigned long rsvd2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
258 unsigned long _baserom;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
259 unsigned long rsvd3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
260 unsigned long rsvd4;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
261 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
262 unsigned long max_min_ipin_iline;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
263 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
264 unsigned char int_line;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
265 unsigned char int_pin;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
266 unsigned char min_gnt;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
267 unsigned char max_lat;
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 } mmii;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
270 #define _max_min_ipin_iline mmii.max_min_ipin_iline
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
271 #define _int_line mmii.mmii.int_line
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
272 #define _int_pin mmii.mmii.int_pin
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
273 #define _min_gnt mmii.mmii.min_gnt
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
274 #define _max_lat mmii.mmii.max_lat
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
275 /* I don't know how accurate or standard this is (DHD) */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
276 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
277 unsigned long user_config;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
278 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
279 unsigned char user_config_0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
280 unsigned char user_config_1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
281 unsigned char user_config_2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
282 unsigned char user_config_3;
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 } uc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
285 #define _user_config uc.user_config
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
286 #define _user_config_0 uc.uc.user_config_0
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
287 #define _user_config_1 uc.uc.user_config_1
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
288 #define _user_config_2 uc.uc.user_config_2
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
289 #define _user_config_3 uc.uc.user_config_3
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
290 /* end of official PCI config space header */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
291 unsigned long _pcibusidx;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
292 unsigned long _pcinumbus;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
293 unsigned long _pcibuses[16];
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
294 unsigned short _configtype; /* config type found */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
295 unsigned short _ioaddr; /* config type 1 - private I/O addr */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
296 unsigned long _cardnum; /* config type 2 - private card number */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
297 };
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
298 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
299 /* ppc is big endian, swapping bytes is not quite enough
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
300 * to interpret the PCI config registers...
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
301 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
302 struct pci_config_reg {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
303 /* start of official PCI config space header */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
304 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
305 unsigned long device_vendor;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
306 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
307 unsigned short device;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
308 unsigned short vendor;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
309 } dv;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
310 } dv_id;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
311 #define _device_vendor dv_id.device_vendor
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
312 #define _vendor dv_id.dv.vendor
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
313 #define _device dv_id.dv.device
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
314 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
315 unsigned long status_command;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
316 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
317 unsigned short status;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
318 unsigned short command;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
319 } sc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
320 } stat_cmd;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
321 #define _status_command stat_cmd.status_command
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
322 #define _command stat_cmd.sc.command
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
323 #define _status stat_cmd.sc.status
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
324 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
325 unsigned long class_revision;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
326 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
327 unsigned char base_class;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
328 unsigned char sub_class;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
329 unsigned char prog_if;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
330 unsigned char rev_id;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
331 } cr;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
332 } class_rev;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
333 #define _class_revision class_rev.class_revision
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
334 #define _rev_id class_rev.cr.rev_id
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
335 #define _prog_if class_rev.cr.prog_if
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
336 #define _sub_class class_rev.cr.sub_class
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
337 #define _base_class class_rev.cr.base_class
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
338 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
339 unsigned long bist_header_latency_cache;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
340 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
341 unsigned char bist;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
342 unsigned char header_type;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
343 unsigned char latency_timer;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
344 unsigned char cache_line_size;
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 } bhlc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
347 #define _bist_header_latency_cache bhlc.bist_header_latency_cache
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
348 #define _cache_line_size bhlc.bhlc.cache_line_size
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
349 #define _latency_timer bhlc.bhlc.latency_timer
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
350 #define _header_type bhlc.bhlc.header_type
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
351 #define _bist bhlc.bhlc.bist
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
352 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
353 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
354 unsigned long dv_base0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
355 unsigned long dv_base1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
356 unsigned long dv_base2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
357 unsigned long dv_base3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
358 unsigned long dv_base4;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
359 unsigned long dv_base5;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
360 } dv;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
361 /* ?? */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
362 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
363 unsigned long bg_rsrvd[2];
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
364
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
365 unsigned char secondary_latency_timer;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
366 unsigned char subordinate_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
367 unsigned char secondary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
368 unsigned char primary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
369
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
370 unsigned short secondary_status;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
371 unsigned char io_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
372 unsigned char io_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
373
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
374 unsigned short mem_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
375 unsigned short mem_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
376
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
377 unsigned short prefetch_mem_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
378 unsigned short prefetch_mem_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
379 } bg;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
380 } bc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
381 #define _base0 bc.dv.dv_base0
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
382 #define _base1 bc.dv.dv_base1
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
383 #define _base2 bc.dv.dv_base2
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
384 #define _base3 bc.dv.dv_base3
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
385 #define _base4 bc.dv.dv_base4
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
386 #define _base5 bc.dv.dv_base5
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
387 #define _primary_bus_number bc.bg.primary_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
388 #define _secondary_bus_number bc.bg.secondary_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
389 #define _subordinate_bus_number bc.bg.subordinate_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
390 #define _secondary_latency_timer bc.bg.secondary_latency_timer
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
391 #define _io_base bc.bg.io_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
392 #define _io_limit bc.bg.io_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
393 #define _secondary_status bc.bg.secondary_status
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
394 #define _mem_base bc.bg.mem_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
395 #define _mem_limit bc.bg.mem_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
396 #define _prefetch_mem_base bc.bg.prefetch_mem_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
397 #define _prefetch_mem_limit bc.bg.prefetch_mem_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
398 unsigned long rsvd1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
399 unsigned long rsvd2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
400 unsigned long _baserom;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
401 unsigned long rsvd3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
402 unsigned long rsvd4;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
403 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
404 unsigned long max_min_ipin_iline;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
405 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
406 unsigned char max_lat;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
407 unsigned char min_gnt;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
408 unsigned char int_pin;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
409 unsigned char int_line;
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 } mmii;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
412 #define _max_min_ipin_iline mmii.max_min_ipin_iline
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
413 #define _int_line mmii.mmii.int_line
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
414 #define _int_pin mmii.mmii.int_pin
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
415 #define _min_gnt mmii.mmii.min_gnt
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
416 #define _max_lat mmii.mmii.max_lat
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
417 /* I don't know how accurate or standard this is (DHD) */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
418 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
419 unsigned long user_config;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
420 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
421 unsigned char user_config_3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
422 unsigned char user_config_2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
423 unsigned char user_config_1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
424 unsigned char user_config_0;
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 } uc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
427 #define _user_config uc.user_config
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
428 #define _user_config_0 uc.uc.user_config_0
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
429 #define _user_config_1 uc.uc.user_config_1
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
430 #define _user_config_2 uc.uc.user_config_2
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
431 #define _user_config_3 uc.uc.user_config_3
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
432 /* end of official PCI config space header */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
433 unsigned long _pcibusidx;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
434 unsigned long _pcinumbus;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
435 unsigned long _pcibuses[16];
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
436 unsigned short _ioaddr; /* config type 1 - private I/O addr */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
437 unsigned short _configtype; /* config type found */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
438 unsigned long _cardnum; /* config type 2 - private card number */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
439 };
27005
0a7f07b761e1 Add comments to a few #endif preprocessor directives.
diego
parents: 26753
diff changeset
440 #endif /* !defined(__powerpc__) */
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
441
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
442 #define NF ((void (*)())NULL), { 0.0, 0, 0, NULL }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
443 #define PCI_MULTIFUNC_DEV 0x80
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
444 #define PCI_ID_REG 0x00
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
445 #define PCI_CMD_STAT_REG 0x04
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
446 #define PCI_CLASS_REG 0x08
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
447 #define PCI_HEADER_MISC 0x0C
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
448 #define PCI_MAP_REG_START 0x10
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
449 #define PCI_MAP_ROM_REG 0x30
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
450 #define PCI_INTERRUPT_REG 0x3C
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
451 #define PCI_REG_USERCONFIG 0x40
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
452
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
453 static int pcibus=-1, pcicard=-1, pcifunc=-1 ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
454 /*static struct pci_device *pcidev=NULL ;*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
455
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
456 #if defined(__alpha__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
457 #define PCI_EN 0x00000000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
458 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
459 #define PCI_EN 0x80000000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
460 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
461
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
462 #define PCI_MODE1_ADDRESS_REG 0xCF8
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
463 #define PCI_MODE1_DATA_REG 0xCFC
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
464
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
465 #define PCI_MODE2_ENABLE_REG 0xCF8
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
466 #ifdef PC98
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
467 #define PCI_MODE2_FORWARD_REG 0xCF9
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
468 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
469 #define PCI_MODE2_FORWARD_REG 0xCFA
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
470 #endif
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
471
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
472 /* 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
473 #ifndef CONFIG_SVGAHELPER
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
474 #if defined(__alpha__)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
475 #include "sysdep/pci_alpha.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
476 #elif defined(__ia64__)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
477 #include "sysdep/pci_ia64.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
478 #elif defined(__sparc__)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
479 #include "sysdep/pci_sparc.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
480 #elif defined( __arm32__ )
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
481 #include "sysdep/pci_arm32.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
482 #elif defined(__powerpc__)
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
483 #include "sysdep/pci_powerpc.c"
27419
3f6d802c6ea8 Add proper VIDIX support for SuperH architecture.
ben
parents: 27250
diff changeset
484 #elif defined(__x86_64__) || defined(__sh__)
12687
cb35163ef0a1 x86-64 (amd64) support by Kenny Root
alex
parents: 10980
diff changeset
485 /* Nothing here right now */
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
486 #else
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
487 #include "sysdep/pci_x86.c"
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
488 #endif
27005
0a7f07b761e1 Add comments to a few #endif preprocessor directives.
diego
parents: 26753
diff changeset
489 #endif /*CONFIG_SVGAHELPER */
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
490
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
491 static pciinfo_t *pci_lst;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
492
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
493 static void identify_card(struct pci_config_reg *pcr, int idx)
3973
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 /* local overflow test */
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
496 if (idx>=MAX_PCI_DEVICES) return ;
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
497
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
498 pci_lst[idx].bus = pcibus ;
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
499 pci_lst[idx].card = pcicard ;
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
500 pci_lst[idx].func = pcifunc ;
9767
f6d2772efca3 Ignore disabled cards. (Jon Burgess <jburgess@uklinux.net>)
ranma
parents: 8776
diff changeset
501 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
502 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
503 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
504 pci_lst[idx].base0 = 0xFFFFFFFF ;
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
505 pci_lst[idx].base1 = 0xFFFFFFFF ;
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
506 pci_lst[idx].base2 = 0xFFFFFFFF ;
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
507 pci_lst[idx].baserom = 0x000C0000 ;
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
508 if (pcr->_base0) pci_lst[idx].base0 = pcr->_base0 &
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
509 ((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
510 if (pcr->_base1) pci_lst[idx].base1 = pcr->_base1 &
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
511 ((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
512 if (pcr->_base2) pci_lst[idx].base2 = pcr->_base2 &
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
513 ((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
514 if (pcr->_baserom) pci_lst[idx].baserom = pcr->_baserom ;
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
515 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
516
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
517 /*main(int argc, char *argv[])*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
518 int pci_scan(pciinfo_t *pci_list,unsigned *num_pci)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
519 {
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
520 unsigned int idx = 0;
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
521 struct pci_config_reg pcr;
24510
e7f836a459ea ifdef one variable that is not used with alpha and powerpc architectures
ben
parents: 23734
diff changeset
522 int do_mode1_scan = 0;
e7f836a459ea ifdef one variable that is not used with alpha and powerpc architectures
ben
parents: 23734
diff changeset
523 #if !defined(__alpha__) && !defined(__powerpc__)
e7f836a459ea ifdef one variable that is not used with alpha and powerpc architectures
ben
parents: 23734
diff changeset
524 int do_mode2_scan = 0;
e7f836a459ea ifdef one variable that is not used with alpha and powerpc architectures
ben
parents: 23734
diff changeset
525 #endif
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
526 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
527 int ret = -1;
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
528
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
529 pci_lst = pci_list;
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
530 *num_pci = 0;
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
531
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
532 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
533 if (ret != 0)
26753
502f04b67653 cosmetics: Remove useless parentheses from return statements.
diego
parents: 24511
diff changeset
534 return ret;
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
535
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
536 if((pcr._configtype = pci_config_type()) == 0xFFFF) return ENODEV;
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
537
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
538 /* Try pci config 1 probe first */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
539
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
540 if ((pcr._configtype == 1) || do_mode1_scan) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
541 /*printf("\nPCI probing configuration type 1\n");*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
542
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
543 pcr._ioaddr = 0xFFFF;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
544
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
545 pcr._pcibuses[0] = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
546 pcr._pcinumbus = 1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
547 pcr._pcibusidx = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
548
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
549 do {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
550 /*printf("Probing for devices on PCI bus %d:\n\n", pcr._pcibusidx);*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
551
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
552 for (pcr._cardnum = 0x0; pcr._cardnum < MAX_PCI_DEVICES_PER_BUS;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
553 pcr._cardnum += 0x1) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
554 func = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
555 do { /* loop over the different functions, if present */
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
556 pcr._device_vendor = pci_get_vendor(pcr._pcibuses[pcr._pcibusidx], pcr._cardnum,
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
557 func);
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
558 if ((pcr._vendor == 0xFFFF) || (pcr._device == 0xFFFF))
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
559 break; /* nothing there */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
560
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
561 /*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
562 pcr._pcibuses[pcr._pcibusidx], pcr._cardnum, func,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
563 pcr._vendor, pcr._device);*/
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
564 pcibus = pcr._pcibuses[pcr._pcibusidx];
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
565 pcicard = pcr._cardnum;
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
566 pcifunc = func;
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
567
4164
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
568 pcr._status_command = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
569 pcr._cardnum,func,PCI_CMD_STAT_REG);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
570 pcr._class_revision = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
571 pcr._cardnum,func,PCI_CLASS_REG);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
572 pcr._bist_header_latency_cache = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
573 pcr._cardnum,func,PCI_HEADER_MISC);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
574 pcr._base0 = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
575 pcr._cardnum,func,PCI_MAP_REG_START);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
576 pcr._base1 = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
577 pcr._cardnum,func,PCI_MAP_REG_START+4);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
578 pcr._base2 = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
579 pcr._cardnum,func,PCI_MAP_REG_START+8);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
580 pcr._base3 = 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+0x0C);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
582 pcr._base4 = 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+0x10);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
584 pcr._base5 = 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+0x14);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
586 pcr._baserom = 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_ROM_REG);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
588 pcr._max_min_ipin_iline = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
589 pcr._cardnum,func,PCI_INTERRUPT_REG);
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
590 pcr._user_config = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx],
2e3262002acb Improved readability and new stuffs
nick
parents: 4112
diff changeset
591 pcr._cardnum,func,PCI_REG_USERCONFIG);
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
592 /* check for pci-pci bridges */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
593 #define PCI_CLASS_MASK 0xff000000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
594 #define PCI_SUBCLASS_MASK 0x00ff0000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
595 #define PCI_CLASS_BRIDGE 0x06000000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
596 #define PCI_SUBCLASS_BRIDGE_PCI 0x00040000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
597 switch(pcr._class_revision & (PCI_CLASS_MASK|PCI_SUBCLASS_MASK)) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
598 case PCI_CLASS_BRIDGE|PCI_SUBCLASS_BRIDGE_PCI:
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
599 if (pcr._secondary_bus_number > 0) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
600 pcr._pcibuses[pcr._pcinumbus++] = pcr._secondary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
601 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
602 break;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
603 case PCI_CLASS_BRIDGE:
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
604 if ( ++hostbridges > 1) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
605 pcr._pcibuses[pcr._pcinumbus] = pcr._pcinumbus;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
606 pcr._pcinumbus++;
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 default:
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
610 break;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
611 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
612 if((func==0) && ((pcr._header_type & PCI_MULTIFUNC_DEV) == 0)) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
613 /* not a multi function device */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
614 func = 8;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
615 } else {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
616 func++;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
617 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
618
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
619 if (idx++ >= MAX_PCI_DEVICES)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
620 continue;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
621
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
622 identify_card(&pcr, (*num_pci)++);
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
623 } while( func < 8 );
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
624 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
625 } while (++pcr._pcibusidx < pcr._pcinumbus);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
626 }
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
627
27419
3f6d802c6ea8 Add proper VIDIX support for SuperH architecture.
ben
parents: 27250
diff changeset
628 #if !defined(__alpha__) && !defined(__powerpc__) && !defined(__sh__)
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
629 /* Now try pci config 2 probe (deprecated) */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
630
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
631 if ((pcr._configtype == 2) || do_mode2_scan) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
632 outb(PCI_MODE2_ENABLE_REG, 0xF1);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
633 outb(PCI_MODE2_FORWARD_REG, 0x00); /* bus 0 for now */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
634
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
635 /*printf("\nPCI probing configuration type 2\n");*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
636
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
637 pcr._pcibuses[0] = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
638 pcr._pcinumbus = 1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
639 pcr._pcibusidx = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
640 idx = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
641
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
642 do {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
643 for (pcr._ioaddr = 0xC000; pcr._ioaddr < 0xD000; pcr._ioaddr += 0x0100){
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
644 outb(PCI_MODE2_FORWARD_REG, pcr._pcibuses[pcr._pcibusidx]); /* bus 0 for now */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
645 pcr._device_vendor = inl(pcr._ioaddr);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
646 outb(PCI_MODE2_FORWARD_REG, 0x00); /* bus 0 for now */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
647
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
648 if ((pcr._vendor == 0xFFFF) || (pcr._device == 0xFFFF))
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
649 continue;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
650 if ((pcr._vendor == 0xF0F0) || (pcr._device == 0xF0F0))
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
651 continue; /* catch ASUS P55TP4XE motherboards */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
652
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
653 /*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
654 pcr._pcibuses[pcr._pcibusidx], pcr._ioaddr, pcr._vendor,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
655 pcr._device);*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
656 pcibus = pcr._pcibuses[pcr._pcibusidx] ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
657 pcicard = pcr._ioaddr ; pcifunc = 0 ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
658
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
659 outb(PCI_MODE2_FORWARD_REG, pcr._pcibuses[pcr._pcibusidx]); /* bus 0 for now */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
660 pcr._status_command = inl(pcr._ioaddr + 0x04);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
661 pcr._class_revision = inl(pcr._ioaddr + 0x08);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
662 pcr._bist_header_latency_cache = inl(pcr._ioaddr + 0x0C);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
663 pcr._base0 = inl(pcr._ioaddr + 0x10);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
664 pcr._base1 = inl(pcr._ioaddr + 0x14);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
665 pcr._base2 = inl(pcr._ioaddr + 0x18);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
666 pcr._base3 = inl(pcr._ioaddr + 0x1C);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
667 pcr._base4 = inl(pcr._ioaddr + 0x20);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
668 pcr._base5 = inl(pcr._ioaddr + 0x24);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
669 pcr._baserom = inl(pcr._ioaddr + 0x30);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
670 pcr._max_min_ipin_iline = inl(pcr._ioaddr + 0x3C);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
671 pcr._user_config = inl(pcr._ioaddr + 0x40);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
672 outb(PCI_MODE2_FORWARD_REG, 0x00); /* bus 0 for now */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
673
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
674 /* check for pci-pci bridges (currently we only know Digital) */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
675 if ((pcr._vendor == 0x1011) && (pcr._device == 0x0001))
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
676 if (pcr._secondary_bus_number > 0)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
677 pcr._pcibuses[pcr._pcinumbus++] = pcr._secondary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
678
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
679 if (idx++ >= MAX_PCI_DEVICES)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
680 continue;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
681
8776
298208d7a703 pci_scan cleanup, idea and initial patch by Aurelien Jacobs <aurel@gnuage.org>
alex
parents: 8503
diff changeset
682 identify_card(&pcr, (*num_pci)++);
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
683 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
684 } while (++pcr._pcibusidx < pcr._pcinumbus);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
685
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
686 outb(PCI_MODE2_ENABLE_REG, 0x00);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
687 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
688
27419
3f6d802c6ea8 Add proper VIDIX support for SuperH architecture.
ben
parents: 27250
diff changeset
689 #endif /* !__alpha__ && !__powerpc__ && !__sh__ */
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
690
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
691 disable_os_io();
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
692
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
693 return 0 ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
694
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
695 }
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
696
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(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
698 #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
699 #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
700 #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
701 #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
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 #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
704
4277
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
705 int pci_config_read(unsigned char bus, unsigned char dev, unsigned char func,
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
706 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
707 {
4277
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
708 int ret;
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
709
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
710 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
711 {
17971
fd0d4b94b5ec Change some printf calls to fprintf.
diego
parents: 15566
diff changeset
712 fprintf(stderr,"pci_config_read: Reading non-dword not supported!\n");
26753
502f04b67653 cosmetics: Remove useless parentheses from return statements.
diego
parents: 24511
diff changeset
713 return ENOTSUP;
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
714 }
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
715
4277
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
716 ret = enable_os_io();
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
717 if (ret != 0)
26753
502f04b67653 cosmetics: Remove useless parentheses from return statements.
diego
parents: 24511
diff changeset
718 return ret;
4277
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
719 ret = pci_config_read_long(bus, dev, func, cmd);
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
720 disable_os_io();
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
721
5f74792b6d5e pci_config_read working
alex
parents: 4192
diff changeset
722 *val = ret;
26753
502f04b67653 cosmetics: Remove useless parentheses from return statements.
diego
parents: 24511
diff changeset
723 return 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
724 }
4192
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
725
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
726 int enable_app_io( void )
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
727 {
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
728 return enable_os_io();
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
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
731 int disable_app_io( void )
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
732 {
fb092b45c9cc en(dis)able app io should be exported too
nick
parents: 4174
diff changeset
733 return disable_os_io();
5702
567de708ab3a sync with mplayerxp
nick
parents: 4278
diff changeset
734 }