annotate libdha/pci.c @ 4112:3822582553d6

Alpha patch by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
author nick
date Sat, 12 Jan 2002 18:00:25 +0000
parents 138800dfbe22
children 2e3262002acb
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
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
6 #include "libdha.h"
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
7
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
8 #include <errno.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
9 #include <string.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
10 #include "AsmMacros.h"
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
11 #ifdef __unix__
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
12 #include <unistd.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
13 #include <sys/mman.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
14 #elif defined ( _WIN32 )
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
15 #include <windows.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
16 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
17 #include <dos.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
18 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
19
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
20 #define outb pcioutb
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
21 #define outl pcioutl
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
22 #define inb pciinb
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
23 #define inl pciinl
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
24
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
25 /* $XConsortium: scanpci.c /main/25 1996/10/27 11:48:40 kaleb $ */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
26 /*
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
27 * name: scanpci.c
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
28 *
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
29 * purpose: This program will scan for and print details of
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
30 * devices on the PCI bus.
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
31
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
32 * author: Robin Cutshaw (robin@xfree86.org)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
33 *
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
34 * supported O/S's: SVR4, UnixWare, SCO, Solaris,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
35 * FreeBSD, NetBSD, 386BSD, BSDI BSD/386,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
36 * Linux, Mach/386, ISC
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
37 * DOS (WATCOM 9.5 compiler)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
38 *
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
39 * compiling: [g]cc scanpci.c -o scanpci
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
40 * for SVR4 (not Solaris), UnixWare use:
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
41 * [g]cc -DSVR4 scanpci.c -o scanpci
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
42 * for DOS, watcom 9.5:
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
43 * wcc386p -zq -omaxet -7 -4s -s -w3 -d2 name.c
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
44 * and link with PharLap or other dos extender for exe
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
45 *
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
46 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
47
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
48 /* $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
49
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
50 /*
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
51 * Copyright 1995 by Robin Cutshaw <robin@XFree86.Org>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
52 *
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
53 * Permission to use, copy, modify, distribute, and sell this software and its
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
54 * documentation for any purpose is hereby granted without fee, provided that
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
55 * the above copyright notice appear in all copies and that both that
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
56 * copyright notice and this permission notice appear in supporting
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
57 * documentation, and that the names of the above listed copyright holder(s)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
58 * not be used in advertising or publicity pertaining to distribution of
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
59 * the software without specific, written prior permission. The above listed
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
60 * copyright holder(s) make(s) no representations about the suitability of this
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
61 * software for any purpose. It is provided "as is" without express or
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
62 * implied warranty.
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
63 *
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
64 * THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
65 * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
66 * AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
67 * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
68 * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
69 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
70 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
71 *
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
72 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
73
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
74 #if defined(__SVR4)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
75 #if !defined(SVR4)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
76 #define SVR4
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
77 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
78 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
79
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
80 #ifdef __EMX__
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
81 #define INCL_DOSFILEMGR
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
82 #include <os2.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
83 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
84
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
85 #include <stdio.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
86 #include <sys/types.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
87 #if defined(SVR4)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
88 #if defined(sun)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
89 #ifndef __EXTENSIONS__
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
90 #define __EXTENSIONS__
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
91 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
92 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
93 #include <sys/proc.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
94 #include <sys/tss.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
95 #if defined(NCR)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
96 #define __STDC
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
97 #include <sys/sysi86.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
98 #undef __STDC
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
99 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
100 #include <sys/sysi86.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
101 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
102 #if defined(__SUNPRO_C) || defined(sun) || defined(__sun)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
103 #include <sys/psw.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
104 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
105 #include <sys/seg.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
106 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
107 #include <sys/v86.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
108 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
109 #if defined(__FreeBSD__) || defined(__386BSD__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
110 #include <sys/file.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
111 #include <machine/console.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
112 #ifndef GCCUSESGAS
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
113 #define GCCUSESGAS
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
114 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
115 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
116 #if defined(__NetBSD__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
117 #include <sys/param.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
118 #include <sys/file.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
119 #include <machine/sysarch.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
120 #ifndef GCCUSESGAS
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
121 #define GCCUSESGAS
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
122 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
123 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
124 #if defined(__bsdi__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
125 #include <sys/file.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
126 #include <sys/ioctl.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
127 #include <i386/isa/pcconsioctl.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
128 #ifndef GCCUSESGAS
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
129 #define GCCUSESGAS
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
130 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
131 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
132 #if defined(SCO) || defined(ISC)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
133 #ifndef ISC
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
134 #include <sys/console.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
135 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
136 #include <sys/param.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
137 #include <sys/immu.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
138 #include <sys/region.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
139 #include <sys/proc.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
140 #include <sys/tss.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
141 #include <sys/sysi86.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
142 #include <sys/v86.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
143 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
144 #if defined(Lynx_22)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
145 #ifndef GCCUSESGAS
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
146 #define GCCUSESGAS
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
147 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
148 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
149
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
150
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
151 #if defined(__WATCOMC__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
152
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
153 #include <stdlib.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
154 static void outl(unsigned port, unsigned data);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
155 #pragma aux outl = "out dx, eax" parm [dx] [eax];
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
156 static void outb(unsigned port, unsigned data);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
157 #pragma aux outb = "out dx, al" parm [dx] [eax];
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
158 static unsigned inl(unsigned port);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
159 #pragma aux inl = "in eax, dx" parm [dx];
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
160 static unsigned inb(unsigned port);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
161 #pragma aux inb = "xor eax,eax" "in al, dx" parm [dx];
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
162
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
163 #else /* __WATCOMC__ */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
164
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
165 #if defined(__GNUC__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
166
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
167 #if !defined(__alpha__) && !defined(__powerpc__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
168 #if defined(GCCUSESGAS)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
169 #define OUTB_GCC "outb %0,%1"
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
170 #define OUTL_GCC "outl %0,%1"
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
171 #define INB_GCC "inb %1,%0"
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
172 #define INL_GCC "inl %1,%0"
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
173 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
174 #define OUTB_GCC "out%B0 (%1)"
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
175 #define OUTL_GCC "out%L0 (%1)"
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
176 #define INB_GCC "in%B0 (%1)"
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
177 #define INL_GCC "in%L0 (%1)"
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
178 #endif /* GCCUSESGAS */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
179
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
180 static void outb(unsigned short port, unsigned char val) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
181 __asm__ __volatile__(OUTB_GCC : :"a" (val), "d" (port)); }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
182 static void outl(unsigned short port, unsigned long val) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
183 __asm__ __volatile__(OUTL_GCC : :"a" (val), "d" (port)); }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
184 static unsigned char inb(unsigned short port) { unsigned char ret;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
185 __asm__ __volatile__(INB_GCC : "=a" (ret) : "d" (port)); return ret; }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
186 static unsigned long inl(unsigned short port) { unsigned long ret;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
187 __asm__ __volatile__(INL_GCC : "=a" (ret) : "d" (port)); return ret; }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
188
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
189 #endif /* !defined(__alpha__) && !defined(__powerpc__) */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
190 #else /* __GNUC__ */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
191
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
192 #if defined(__STDC__) && (__STDC__ == 1)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
193 # if !defined(NCR)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
194 # define asm __asm
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
195 # endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
196 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
197
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
198 #if defined(__SUNPRO_C)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
199 /*
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
200 * This section is a gross hack in if you tell anyone that I wrote it,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
201 * I'll deny it. :-)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
202 * The leave/ret instructions are the big hack to leave %eax alone on return.
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
203 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
204 static unsigned char inb(int port) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
205 asm(" movl 8(%esp),%edx");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
206 asm(" subl %eax,%eax");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
207 asm(" inb (%dx)");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
208 asm(" leave");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
209 asm(" ret");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
210 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
211
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
212 static unsigned short inw(int port) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
213 asm(" movl 8(%esp),%edx");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
214 asm(" subl %eax,%eax");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
215 asm(" inw (%dx)");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
216 asm(" leave");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
217 asm(" ret");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
218 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
219
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
220 static unsigned long inl(int port) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
221 asm(" movl 8(%esp),%edx");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
222 asm(" inl (%dx)");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
223 asm(" leave");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
224 asm(" ret");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
225 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
226
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
227 static void outb(int port, unsigned char value) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
228 asm(" movl 8(%esp),%edx");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
229 asm(" movl 12(%esp),%eax");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
230 asm(" outb (%dx)");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
231 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
232
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
233 static void outw(int port, unsigned short value) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
234 asm(" movl 8(%esp),%edx");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
235 asm(" movl 12(%esp),%eax");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
236 asm(" outw (%dx)");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
237 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
238
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
239 static void outl(int port, unsigned long value) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
240 asm(" movl 8(%esp),%edx");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
241 asm(" movl 12(%esp),%eax");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
242 asm(" outl (%dx)");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
243 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
244 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
245
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
246 #if defined(SVR4)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
247 # if !defined(__USLC__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
248 # define __USLC__
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
249 # endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
250 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
251
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
252 #ifdef __unix__
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
253 #ifndef SCO325
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
254 # include <sys/inline.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
255 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
256 # include "scoasm.h"
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
257 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
258 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
259
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
260 #endif /* SUNPRO_C */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
261
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
262 #endif /* __GNUC__ */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
263 #endif /* __WATCOMC__ */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
264
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
265 #undef outb
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
266 #undef outl
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
267 #undef inb
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
268 #undef inl
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
269
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
270 #if defined(__GLIBC__) && __GLIBC__ >= 2
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
271 #if defined(linux)
4112
3822582553d6 Alpha patch by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nick
parents: 3973
diff changeset
272 #ifdef __i386__
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
273 #include <sys/perm.h>
4112
3822582553d6 Alpha patch by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nick
parents: 3973
diff changeset
274 #else
3822582553d6 Alpha patch by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nick
parents: 3973
diff changeset
275 #include <sys/io.h>
3822582553d6 Alpha patch by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nick
parents: 3973
diff changeset
276 #endif
3973
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
277 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
278 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
279
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
280 #if defined(__alpha__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
281 #if defined(linux)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
282 #include <asm/unistd.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
283 #define BUS(tag) (((tag)>>16)&0xff)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
284 #define DFN(tag) (((tag)>>8)&0xff)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
285 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
286 Generate compiler error - scanpci unsupported on non-linux alpha platforms
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
287 #endif /* linux */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
288 #endif /* __alpha__ */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
289 #if defined(Lynx) && defined(__powerpc__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
290 /* 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
291 * to change too much code
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
292 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
293 #include <smem.h>
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
294
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
295 static unsigned char *pciConfBase;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
296
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
297 static __inline__ unsigned long
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
298 static swapl(unsigned long val)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
299 {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
300 unsigned char *p = (unsigned char *)&val;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
301 return ((p[3] << 24) | (p[2] << 16) | (p[1] << 8) | (p[0] << 0));
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
302 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
303
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
304
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
305 #define BUS(tag) (((tag)>>16)&0xff)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
306 #define DFN(tag) (((tag)>>8)&0xff)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
307
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
308 #define PCIBIOS_DEVICE_NOT_FOUND 0x86
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
309 #define PCIBIOS_SUCCESSFUL 0x00
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
310
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
311 static int pciconfig_read(
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
312 unsigned char bus,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
313 unsigned char dev,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
314 unsigned char offset,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
315 int len, /* unused, alway 4 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
316 unsigned long *val)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
317 {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
318 unsigned long _val;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
319 unsigned long *ptr;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
320
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
321 dev >>= 3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
322 if (bus || dev >= 16) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
323 *val = 0xFFFFFFFF;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
324 return PCIBIOS_DEVICE_NOT_FOUND;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
325 } else {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
326 ptr = (unsigned long *)(pciConfBase + ((1<<dev) | offset));
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
327 _val = swapl(*ptr);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
328 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
329 *val = _val;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
330 return PCIBIOS_SUCCESSFUL;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
331 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
332
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
333 static int pciconfig_write(
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
334 unsigned char bus,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
335 unsigned char dev,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
336 unsigned char offset,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
337 int len, /* unused, alway 4 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
338 unsigned long val)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
339 {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
340 unsigned long _val;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
341 unsigned long *ptr;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
342
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
343 dev >>= 3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
344 _val = swapl(val);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
345 if (bus || dev >= 16) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
346 return PCIBIOS_DEVICE_NOT_FOUND;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
347 } else {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
348 ptr = (unsigned long *)(pciConfBase + ((1<<dev) | offset));
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
349 *ptr = _val;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
350 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
351 return PCIBIOS_SUCCESSFUL;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
352 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
353 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
354
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
355 #if !defined(__powerpc__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
356 struct pci_config_reg {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
357 /* start of official PCI config space header */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
358 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
359 unsigned long device_vendor;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
360 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
361 unsigned short vendor;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
362 unsigned short device;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
363 } dv;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
364 } dv_id;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
365 #define _device_vendor dv_id.device_vendor
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
366 #define _vendor dv_id.dv.vendor
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
367 #define _device dv_id.dv.device
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
368 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
369 unsigned long status_command;
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 short command;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
372 unsigned short status;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
373 } sc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
374 } stat_cmd;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
375 #define _status_command stat_cmd.status_command
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
376 #define _command stat_cmd.sc.command
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
377 #define _status stat_cmd.sc.status
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
378 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
379 unsigned long class_revision;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
380 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
381 unsigned char rev_id;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
382 unsigned char prog_if;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
383 unsigned char sub_class;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
384 unsigned char base_class;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
385 } cr;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
386 } class_rev;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
387 #define _class_revision class_rev.class_revision
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
388 #define _rev_id class_rev.cr.rev_id
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
389 #define _prog_if class_rev.cr.prog_if
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
390 #define _sub_class class_rev.cr.sub_class
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
391 #define _base_class class_rev.cr.base_class
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
392 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
393 unsigned long bist_header_latency_cache;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
394 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
395 unsigned char cache_line_size;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
396 unsigned char latency_timer;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
397 unsigned char header_type;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
398 unsigned char bist;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
399 } bhlc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
400 } bhlc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
401 #define _bist_header_latency_cache bhlc.bist_header_latency_cache
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
402 #define _cache_line_size bhlc.bhlc.cache_line_size
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
403 #define _latency_timer bhlc.bhlc.latency_timer
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
404 #define _header_type bhlc.bhlc.header_type
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
405 #define _bist bhlc.bhlc.bist
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
406 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
407 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
408 unsigned long dv_base0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
409 unsigned long dv_base1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
410 unsigned long dv_base2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
411 unsigned long dv_base3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
412 unsigned long dv_base4;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
413 unsigned long dv_base5;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
414 } dv;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
415 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
416 unsigned long bg_rsrvd[2];
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
417 unsigned char primary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
418 unsigned char secondary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
419 unsigned char subordinate_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
420 unsigned char secondary_latency_timer;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
421 unsigned char io_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
422 unsigned char io_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
423 unsigned short secondary_status;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
424 unsigned short mem_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
425 unsigned short mem_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
426 unsigned short prefetch_mem_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
427 unsigned short prefetch_mem_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
428 } bg;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
429 } bc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
430 #define _base0 bc.dv.dv_base0
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
431 #define _base1 bc.dv.dv_base1
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
432 #define _base2 bc.dv.dv_base2
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
433 #define _base3 bc.dv.dv_base3
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
434 #define _base4 bc.dv.dv_base4
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
435 #define _base5 bc.dv.dv_base5
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
436 #define _primary_bus_number bc.bg.primary_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
437 #define _secondary_bus_number bc.bg.secondary_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
438 #define _subordinate_bus_number bc.bg.subordinate_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
439 #define _secondary_latency_timer bc.bg.secondary_latency_timer
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
440 #define _io_base bc.bg.io_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
441 #define _io_limit bc.bg.io_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
442 #define _secondary_status bc.bg.secondary_status
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
443 #define _mem_base bc.bg.mem_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
444 #define _mem_limit bc.bg.mem_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
445 #define _prefetch_mem_base bc.bg.prefetch_mem_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
446 #define _prefetch_mem_limit bc.bg.prefetch_mem_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
447 unsigned long rsvd1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
448 unsigned long rsvd2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
449 unsigned long _baserom;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
450 unsigned long rsvd3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
451 unsigned long rsvd4;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
452 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
453 unsigned long max_min_ipin_iline;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
454 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
455 unsigned char int_line;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
456 unsigned char int_pin;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
457 unsigned char min_gnt;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
458 unsigned char max_lat;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
459 } mmii;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
460 } mmii;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
461 #define _max_min_ipin_iline mmii.max_min_ipin_iline
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
462 #define _int_line mmii.mmii.int_line
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
463 #define _int_pin mmii.mmii.int_pin
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
464 #define _min_gnt mmii.mmii.min_gnt
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
465 #define _max_lat mmii.mmii.max_lat
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
466 /* I don't know how accurate or standard this is (DHD) */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
467 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
468 unsigned long user_config;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
469 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
470 unsigned char user_config_0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
471 unsigned char user_config_1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
472 unsigned char user_config_2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
473 unsigned char user_config_3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
474 } uc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
475 } uc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
476 #define _user_config uc.user_config
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
477 #define _user_config_0 uc.uc.user_config_0
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
478 #define _user_config_1 uc.uc.user_config_1
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
479 #define _user_config_2 uc.uc.user_config_2
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
480 #define _user_config_3 uc.uc.user_config_3
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
481 /* end of official PCI config space header */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
482 unsigned long _pcibusidx;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
483 unsigned long _pcinumbus;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
484 unsigned long _pcibuses[16];
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
485 unsigned short _configtype; /* config type found */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
486 unsigned short _ioaddr; /* config type 1 - private I/O addr */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
487 unsigned long _cardnum; /* config type 2 - private card number */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
488 };
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
489 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
490 /* ppc is big endian, swapping bytes is not quite enough
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
491 * to interpret the PCI config registers...
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
492 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
493 struct pci_config_reg {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
494 /* start of official PCI config space header */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
495 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
496 unsigned long device_vendor;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
497 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
498 unsigned short device;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
499 unsigned short vendor;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
500 } dv;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
501 } dv_id;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
502 #define _device_vendor dv_id.device_vendor
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
503 #define _vendor dv_id.dv.vendor
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
504 #define _device dv_id.dv.device
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
505 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
506 unsigned long status_command;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
507 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
508 unsigned short status;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
509 unsigned short command;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
510 } sc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
511 } stat_cmd;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
512 #define _status_command stat_cmd.status_command
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
513 #define _command stat_cmd.sc.command
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
514 #define _status stat_cmd.sc.status
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
515 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
516 unsigned long class_revision;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
517 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
518 unsigned char base_class;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
519 unsigned char sub_class;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
520 unsigned char prog_if;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
521 unsigned char rev_id;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
522 } cr;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
523 } class_rev;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
524 #define _class_revision class_rev.class_revision
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
525 #define _rev_id class_rev.cr.rev_id
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
526 #define _prog_if class_rev.cr.prog_if
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
527 #define _sub_class class_rev.cr.sub_class
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
528 #define _base_class class_rev.cr.base_class
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
529 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
530 unsigned long bist_header_latency_cache;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
531 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
532 unsigned char bist;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
533 unsigned char header_type;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
534 unsigned char latency_timer;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
535 unsigned char cache_line_size;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
536 } bhlc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
537 } bhlc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
538 #define _bist_header_latency_cache bhlc.bist_header_latency_cache
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
539 #define _cache_line_size bhlc.bhlc.cache_line_size
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
540 #define _latency_timer bhlc.bhlc.latency_timer
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
541 #define _header_type bhlc.bhlc.header_type
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
542 #define _bist bhlc.bhlc.bist
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
543 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
544 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
545 unsigned long dv_base0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
546 unsigned long dv_base1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
547 unsigned long dv_base2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
548 unsigned long dv_base3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
549 unsigned long dv_base4;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
550 unsigned long dv_base5;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
551 } dv;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
552 /* ?? */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
553 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
554 unsigned long bg_rsrvd[2];
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
555
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
556 unsigned char secondary_latency_timer;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
557 unsigned char subordinate_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
558 unsigned char secondary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
559 unsigned char primary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
560
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
561 unsigned short secondary_status;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
562 unsigned char io_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
563 unsigned char io_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
564
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
565 unsigned short mem_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
566 unsigned short mem_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
567
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
568 unsigned short prefetch_mem_limit;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
569 unsigned short prefetch_mem_base;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
570 } bg;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
571 } bc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
572 #define _base0 bc.dv.dv_base0
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
573 #define _base1 bc.dv.dv_base1
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
574 #define _base2 bc.dv.dv_base2
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
575 #define _base3 bc.dv.dv_base3
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
576 #define _base4 bc.dv.dv_base4
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
577 #define _base5 bc.dv.dv_base5
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
578 #define _primary_bus_number bc.bg.primary_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
579 #define _secondary_bus_number bc.bg.secondary_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
580 #define _subordinate_bus_number bc.bg.subordinate_bus_number
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
581 #define _secondary_latency_timer bc.bg.secondary_latency_timer
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
582 #define _io_base bc.bg.io_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
583 #define _io_limit bc.bg.io_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
584 #define _secondary_status bc.bg.secondary_status
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
585 #define _mem_base bc.bg.mem_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
586 #define _mem_limit bc.bg.mem_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
587 #define _prefetch_mem_base bc.bg.prefetch_mem_base
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
588 #define _prefetch_mem_limit bc.bg.prefetch_mem_limit
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
589 unsigned long rsvd1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
590 unsigned long rsvd2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
591 unsigned long _baserom;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
592 unsigned long rsvd3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
593 unsigned long rsvd4;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
594 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
595 unsigned long max_min_ipin_iline;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
596 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
597 unsigned char max_lat;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
598 unsigned char min_gnt;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
599 unsigned char int_pin;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
600 unsigned char int_line;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
601 } mmii;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
602 } mmii;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
603 #define _max_min_ipin_iline mmii.max_min_ipin_iline
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
604 #define _int_line mmii.mmii.int_line
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
605 #define _int_pin mmii.mmii.int_pin
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
606 #define _min_gnt mmii.mmii.min_gnt
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
607 #define _max_lat mmii.mmii.max_lat
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
608 /* I don't know how accurate or standard this is (DHD) */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
609 union {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
610 unsigned long user_config;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
611 struct {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
612 unsigned char user_config_3;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
613 unsigned char user_config_2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
614 unsigned char user_config_1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
615 unsigned char user_config_0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
616 } uc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
617 } uc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
618 #define _user_config uc.user_config
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
619 #define _user_config_0 uc.uc.user_config_0
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
620 #define _user_config_1 uc.uc.user_config_1
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
621 #define _user_config_2 uc.uc.user_config_2
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
622 #define _user_config_3 uc.uc.user_config_3
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
623 /* end of official PCI config space header */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
624 unsigned long _pcibusidx;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
625 unsigned long _pcinumbus;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
626 unsigned long _pcibuses[16];
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
627 unsigned short _ioaddr; /* config type 1 - private I/O addr */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
628 unsigned short _configtype; /* config type found */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
629 unsigned long _cardnum; /* config type 2 - private card number */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
630 };
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
631 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
632
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
633 #define MAX_DEV_PER_VENDOR_CFG1 64
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
634 #define MAX_PCI_DEVICES_PER_BUS 32
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
635 #define MAX_PCI_DEVICES 64
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
636 #define NF ((void (*)())NULL), { 0.0, 0, 0, NULL }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
637 #define PCI_MULTIFUNC_DEV 0x80
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
638 #if defined(__alpha__) || defined(__powerpc__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
639 #define PCI_ID_REG 0x00
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
640 #define PCI_CMD_STAT_REG 0x04
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
641 #define PCI_CLASS_REG 0x08
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
642 #define PCI_HEADER_MISC 0x0C
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
643 #define PCI_MAP_REG_START 0x10
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
644 #define PCI_MAP_ROM_REG 0x30
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
645 #define PCI_INTERRUPT_REG 0x3C
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
646 #define PCI_REG_USERCONFIG 0x40
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
647 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
648
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
649 static int pcibus=-1, pcicard=-1, pcifunc=-1 ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
650 /*static struct pci_device *pcidev=NULL ;*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
651
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
652 #if defined(__alpha__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
653 #define PCI_EN 0x00000000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
654 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
655 #define PCI_EN 0x80000000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
656 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
657
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
658 #define PCI_MODE1_ADDRESS_REG 0xCF8
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
659 #define PCI_MODE1_DATA_REG 0xCFC
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
660
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
661 #define PCI_MODE2_ENABLE_REG 0xCF8
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
662 #ifdef PC98
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
663 #define PCI_MODE2_FORWARD_REG 0xCF9
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
664 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
665 #define PCI_MODE2_FORWARD_REG 0xCFA
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
666 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
667
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
668 static int pcicards=0 ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
669 static pciinfo_t *pci_lst;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
670
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
671 static void identify_card(struct pci_config_reg *pcr)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
672 {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
673
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
674 if (pcicards>=MAX_PCI_DEVICES) return ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
675
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
676 pci_lst[pcicards].bus = pcibus ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
677 pci_lst[pcicards].card = pcicard ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
678 pci_lst[pcicards].func = pcifunc ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
679 pci_lst[pcicards].vendor = pcr->_vendor ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
680 pci_lst[pcicards].device = pcr->_device ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
681 pci_lst[pcicards].base0 = 0xFFFFFFFF ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
682 pci_lst[pcicards].base1 = 0xFFFFFFFF ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
683 pci_lst[pcicards].base2 = 0xFFFFFFFF ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
684 pci_lst[pcicards].baserom = 0x000C0000 ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
685 if (pcr->_base0) pci_lst[pcicards].base0 = pcr->_base0 &
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
686 ((pcr->_base0&0x1) ? 0xFFFFFFFC : 0xFFFFFFF0) ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
687 if (pcr->_base1) pci_lst[pcicards].base1 = pcr->_base1 &
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
688 ((pcr->_base1&0x1) ? 0xFFFFFFFC : 0xFFFFFFF0) ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
689 if (pcr->_base2) pci_lst[pcicards].base2 = pcr->_base2 &
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
690 ((pcr->_base2&0x1) ? 0xFFFFFFFC : 0xFFFFFFF0) ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
691 if (pcr->_baserom) pci_lst[pcicards].baserom = pcr->_baserom ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
692
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
693 pcicards++;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
694 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
695
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
696 static int io_fd;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
697 #ifdef __EMX__
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
698 static USHORT callgate[3] = {0,0,0};
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
699 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
700
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
701 static void enable_os_io(void)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
702 {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
703 io_fd = -1 ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
704 #if defined(SVR4) || defined(SCO) || defined(ISC)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
705 #if defined(SI86IOPL)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
706 sysi86(SI86IOPL, 3);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
707 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
708 sysi86(SI86V86, V86SC_IOPL, PS_IOPL);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
709 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
710 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
711 #if defined(linux)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
712 iopl(3);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
713 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
714 #if defined(__FreeBSD__) || defined(__386BSD__) || defined(__bsdi__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
715 if ((io_fd = open("/dev/console", O_RDWR, 0)) < 0) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
716 perror("/dev/console");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
717 exit(1);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
718 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
719 #if defined(__FreeBSD__) || defined(__386BSD__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
720 if (ioctl(io_fd, KDENABIO, 0) < 0) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
721 perror("ioctl(KDENABIO)");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
722 exit(1);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
723 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
724 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
725 #if defined(__bsdi__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
726 if (ioctl(io_fd, PCCONENABIOPL, 0) < 0) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
727 perror("ioctl(PCCONENABIOPL)");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
728 exit(1);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
729 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
730 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
731 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
732 #if defined(__NetBSD__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
733 #if !defined(USE_I386_IOPL)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
734 if ((io_fd = open("/dev/io", O_RDWR, 0)) < 0) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
735 perror("/dev/io");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
736 exit(1);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
737 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
738 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
739 if (i386_iopl(1) < 0) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
740 perror("i386_iopl");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
741 exit(1);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
742 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
743 #endif /* USE_I386_IOPL */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
744 #endif /* __NetBSD__ */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
745 #if defined(__OpenBSD__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
746 if (i386_iopl(1) < 0) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
747 perror("i386_iopl");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
748 exit(1);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
749 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
750 #endif /* __OpenBSD__ */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
751 #if defined(MACH386)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
752 if ((io_fd = open("/dev/iopl", O_RDWR, 0)) < 0) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
753 perror("/dev/iopl");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
754 exit(1);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
755 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
756 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
757 #ifdef __EMX__
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
758 {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
759 HFILE hfd;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
760 ULONG dlen,action;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
761 APIRET rc;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
762 static char *ioDrvPath = "/dev/fastio$";
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
763
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
764 if (DosOpen((PSZ)ioDrvPath, (PHFILE)&hfd, (PULONG)&action,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
765 (ULONG)0, FILE_SYSTEM, FILE_OPEN,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
766 OPEN_SHARE_DENYNONE|OPEN_FLAGS_NOINHERIT|OPEN_ACCESS_READONLY,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
767 (ULONG)0) != 0) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
768 fprintf(stderr,"Error opening fastio$ driver...\n");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
769 fprintf(stderr,"Please install xf86sup.sys in config.sys!\n");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
770 exit(42);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
771 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
772 callgate[0] = callgate[1] = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
773
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
774 /* Get callgate from driver for fast io to ports and other stuff */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
775
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
776 rc = DosDevIOCtl(hfd, (ULONG)0x76, (ULONG)0x64,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
777 NULL, 0, NULL,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
778 (ULONG*)&callgate[2], sizeof(USHORT), &dlen);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
779 if (rc) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
780 fprintf(stderr,"xf86-OS/2: EnableIOPorts failed, rc=%d, dlen=%d; emergency exit\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
781 rc,dlen);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
782 DosClose(hfd);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
783 exit(42);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
784 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
785
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
786 /* Calling callgate with function 13 sets IOPL for the program */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
787
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
788 asm volatile ("movl $13,%%ebx;.byte 0xff,0x1d;.long _callgate"
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
789 : /*no outputs */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
790 : /*no inputs */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
791 : "eax","ebx","ecx","edx","cc");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
792
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
793 DosClose(hfd);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
794 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
795 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
796 #if defined(Lynx) && defined(__powerpc__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
797 pciConfBase = (unsigned char *) smem_create("PCI-CONF",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
798 (char *)0x80800000, 64*1024, SM_READ|SM_WRITE);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
799 if (pciConfBase == (void *) -1)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
800 exit(1);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
801 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
802 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
803
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
804
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
805 static void disable_os_io(void)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
806 {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
807 #if defined(SVR4) || defined(SCO) || defined(ISC)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
808 #if defined(SI86IOPL)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
809 sysi86(SI86IOPL, 0);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
810 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
811 sysi86(SI86V86, V86SC_IOPL, 0);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
812 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
813 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
814 #if defined(linux)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
815 iopl(0);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
816 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
817 #if defined(__FreeBSD__) || defined(__386BSD__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
818 if (ioctl(io_fd, KDDISABIO, 0) < 0) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
819 perror("ioctl(KDDISABIO)");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
820 close(io_fd);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
821 exit(1);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
822 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
823 close(io_fd);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
824 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
825 #if defined(__NetBSD__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
826 #if !defined(USE_I386_IOPL)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
827 close(io_fd);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
828 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
829 if (i386_iopl(0) < 0) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
830 perror("i386_iopl");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
831 exit(1);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
832 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
833 #endif /* NetBSD1_1 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
834 #endif /* __NetBSD__ */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
835 #if defined(__bsdi__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
836 if (ioctl(io_fd, PCCONDISABIOPL, 0) < 0) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
837 perror("ioctl(PCCONDISABIOPL)");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
838 close(io_fd);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
839 exit(1);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
840 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
841 close(io_fd);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
842 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
843 #if defined(MACH386)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
844 close(io_fd);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
845 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
846 #if defined(Lynx) && defined(__powerpc__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
847 smem_create(NULL, (char *) pciConfBase, 0, SM_DETACH);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
848 smem_remove("PCI-CONF");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
849 pciConfBase = NULL;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
850 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
851 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
852
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
853 /*main(int argc, char *argv[])*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
854 int pci_scan(pciinfo_t *pci_list,unsigned *num_pci)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
855 {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
856 unsigned long tmplong1, tmplong2, config_cmd;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
857 unsigned char tmp1, tmp2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
858 unsigned int idx;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
859 struct pci_config_reg pcr;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
860 int do_mode1_scan = 0, do_mode2_scan = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
861 int func, hostbridges=0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
862
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
863 pci_lst = pci_list;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
864
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
865 enable_os_io();
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
866
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
867 #if !defined(__alpha__) && !defined(__powerpc__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
868 pcr._configtype = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
869
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
870 outb(PCI_MODE2_ENABLE_REG, 0x00);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
871 outb(PCI_MODE2_FORWARD_REG, 0x00);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
872 tmp1 = inb(PCI_MODE2_ENABLE_REG);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
873 tmp2 = inb(PCI_MODE2_FORWARD_REG);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
874 if ((tmp1 == 0x00) && (tmp2 == 0x00)) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
875 pcr._configtype = 2;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
876 /*printf("PCI says configuration type 2\n");*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
877 } else {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
878 tmplong1 = inl(PCI_MODE1_ADDRESS_REG);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
879 outl(PCI_MODE1_ADDRESS_REG, PCI_EN);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
880 tmplong2 = inl(PCI_MODE1_ADDRESS_REG);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
881 outl(PCI_MODE1_ADDRESS_REG, tmplong1);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
882 if (tmplong2 == PCI_EN) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
883 pcr._configtype = 1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
884 /*printf("PCI says configuration type 1\n");*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
885 } else {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
886 /*printf("No PCI !\n");*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
887 disable_os_io();
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
888 /*exit(1);*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
889 return ENODEV ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
890 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
891 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
892 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
893 pcr._configtype = 1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
894 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
895
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
896 /* Try pci config 1 probe first */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
897
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
898 if ((pcr._configtype == 1) || do_mode1_scan) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
899 /*printf("\nPCI probing configuration type 1\n");*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
900
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
901 pcr._ioaddr = 0xFFFF;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
902
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
903 pcr._pcibuses[0] = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
904 pcr._pcinumbus = 1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
905 pcr._pcibusidx = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
906 idx = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
907
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
908 do {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
909 /*printf("Probing for devices on PCI bus %d:\n\n", pcr._pcibusidx);*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
910
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
911 for (pcr._cardnum = 0x0; pcr._cardnum < MAX_PCI_DEVICES_PER_BUS;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
912 pcr._cardnum += 0x1) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
913 func = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
914 do { /* loop over the different functions, if present */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
915 #if !defined(__alpha__) && !defined(__powerpc__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
916 config_cmd = PCI_EN | (pcr._pcibuses[pcr._pcibusidx]<<16) |
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
917 (pcr._cardnum<<11) | (func<<8);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
918
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
919 outl(PCI_MODE1_ADDRESS_REG, config_cmd); /* ioreg 0 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
920 pcr._device_vendor = inl(PCI_MODE1_DATA_REG);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
921 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
922 pciconfig_read(pcr._pcibuses[pcr._pcibusidx], pcr._cardnum<<3,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
923 PCI_ID_REG, 4, &pcr._device_vendor);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
924 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
925
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
926 if ((pcr._vendor == 0xFFFF) || (pcr._device == 0xFFFF))
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
927 break; /* nothing there */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
928
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
929 /*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
930 pcr._pcibuses[pcr._pcibusidx], pcr._cardnum, func,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
931 pcr._vendor, pcr._device);*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
932 pcibus = pcr._pcibuses[pcr._pcibusidx] ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
933 pcicard = pcr._cardnum ; pcifunc = func ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
934
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
935 #if !defined(__alpha__) && !defined(__powerpc__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
936 outl(PCI_MODE1_ADDRESS_REG, config_cmd | 0x04);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
937 pcr._status_command = inl(PCI_MODE1_DATA_REG);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
938 outl(PCI_MODE1_ADDRESS_REG, config_cmd | 0x08);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
939 pcr._class_revision = inl(PCI_MODE1_DATA_REG);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
940 outl(PCI_MODE1_ADDRESS_REG, config_cmd | 0x0C);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
941 pcr._bist_header_latency_cache = inl(PCI_MODE1_DATA_REG);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
942 outl(PCI_MODE1_ADDRESS_REG, config_cmd | 0x10);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
943 pcr._base0 = inl(PCI_MODE1_DATA_REG);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
944 outl(PCI_MODE1_ADDRESS_REG, config_cmd | 0x14);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
945 pcr._base1 = inl(PCI_MODE1_DATA_REG);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
946 outl(PCI_MODE1_ADDRESS_REG, config_cmd | 0x18);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
947 pcr._base2 = inl(PCI_MODE1_DATA_REG);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
948 outl(PCI_MODE1_ADDRESS_REG, config_cmd | 0x1C);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
949 pcr._base3 = inl(PCI_MODE1_DATA_REG);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
950 outl(PCI_MODE1_ADDRESS_REG, config_cmd | 0x20);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
951 pcr._base4 = inl(PCI_MODE1_DATA_REG);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
952 outl(PCI_MODE1_ADDRESS_REG, config_cmd | 0x24);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
953 pcr._base5 = inl(PCI_MODE1_DATA_REG);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
954 outl(PCI_MODE1_ADDRESS_REG, config_cmd | 0x30);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
955 pcr._baserom = inl(PCI_MODE1_DATA_REG);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
956 outl(PCI_MODE1_ADDRESS_REG, config_cmd | 0x3C);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
957 pcr._max_min_ipin_iline = inl(PCI_MODE1_DATA_REG);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
958 outl(PCI_MODE1_ADDRESS_REG, config_cmd | 0x40);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
959 pcr._user_config = inl(PCI_MODE1_DATA_REG);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
960 #else
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
961 pciconfig_read(pcr._pcibuses[pcr._pcibusidx], pcr._cardnum<<3,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
962 PCI_CMD_STAT_REG, 4, &pcr._status_command);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
963 pciconfig_read(pcr._pcibuses[pcr._pcibusidx], pcr._cardnum<<3,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
964 PCI_CLASS_REG, 4, &pcr._class_revision);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
965 pciconfig_read(pcr._pcibuses[pcr._pcibusidx], pcr._cardnum<<3,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
966 PCI_HEADER_MISC, 4, &pcr._bist_header_latency_cache);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
967 pciconfig_read(pcr._pcibuses[pcr._pcibusidx], pcr._cardnum<<3,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
968 PCI_MAP_REG_START, 4, &pcr._base0);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
969 pciconfig_read(pcr._pcibuses[pcr._pcibusidx], pcr._cardnum<<3,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
970 PCI_MAP_REG_START + 0x04, 4, &pcr._base1);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
971 pciconfig_read(pcr._pcibuses[pcr._pcibusidx], pcr._cardnum<<3,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
972 PCI_MAP_REG_START + 0x08, 4, &pcr._base2);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
973 pciconfig_read(pcr._pcibuses[pcr._pcibusidx], pcr._cardnum<<3,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
974 PCI_MAP_REG_START + 0x0C, 4, &pcr._base3);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
975 pciconfig_read(pcr._pcibuses[pcr._pcibusidx], pcr._cardnum<<3,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
976 PCI_MAP_REG_START + 0x10, 4, &pcr._base4);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
977 pciconfig_read(pcr._pcibuses[pcr._pcibusidx], pcr._cardnum<<3,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
978 PCI_MAP_REG_START + 0x14, 4, &pcr._base5);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
979 pciconfig_read(pcr._pcibuses[pcr._pcibusidx], pcr._cardnum<<3,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
980 PCI_MAP_ROM_REG, 4, &pcr._baserom);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
981 pciconfig_read(pcr._pcibuses[pcr._pcibusidx], pcr._cardnum<<3,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
982 PCI_INTERRUPT_REG, 4, &pcr._max_min_ipin_iline);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
983 pciconfig_read(pcr._pcibuses[pcr._pcibusidx], pcr._cardnum<<3,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
984 PCI_REG_USERCONFIG, 4, &pcr._user_config);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
985 #endif
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
986
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
987 /* check for pci-pci bridges */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
988 #define PCI_CLASS_MASK 0xff000000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
989 #define PCI_SUBCLASS_MASK 0x00ff0000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
990 #define PCI_CLASS_BRIDGE 0x06000000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
991 #define PCI_SUBCLASS_BRIDGE_PCI 0x00040000
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
992 switch(pcr._class_revision & (PCI_CLASS_MASK|PCI_SUBCLASS_MASK)) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
993 case PCI_CLASS_BRIDGE|PCI_SUBCLASS_BRIDGE_PCI:
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
994 if (pcr._secondary_bus_number > 0) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
995 pcr._pcibuses[pcr._pcinumbus++] = pcr._secondary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
996 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
997 break;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
998 case PCI_CLASS_BRIDGE:
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
999 if ( ++hostbridges > 1) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1000 pcr._pcibuses[pcr._pcinumbus] = pcr._pcinumbus;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1001 pcr._pcinumbus++;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1002 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1003 break;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1004 default:
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1005 break;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1006 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1007 if((func==0) && ((pcr._header_type & PCI_MULTIFUNC_DEV) == 0)) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1008 /* not a multi function device */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1009 func = 8;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1010 } else {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1011 func++;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1012 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1013
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1014 if (idx++ >= MAX_PCI_DEVICES)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1015 continue;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1016
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1017 identify_card(&pcr);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1018 } while( func < 8 );
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1019 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1020 } while (++pcr._pcibusidx < pcr._pcinumbus);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1021 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1022
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1023 #if !defined(__alpha__) && !defined(__powerpc__)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1024 /* Now try pci config 2 probe (deprecated) */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1025
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1026 if ((pcr._configtype == 2) || do_mode2_scan) {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1027 outb(PCI_MODE2_ENABLE_REG, 0xF1);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1028 outb(PCI_MODE2_FORWARD_REG, 0x00); /* bus 0 for now */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1029
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1030 /*printf("\nPCI probing configuration type 2\n");*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1031
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1032 pcr._pcibuses[0] = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1033 pcr._pcinumbus = 1;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1034 pcr._pcibusidx = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1035 idx = 0;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1036
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1037 do {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1038 for (pcr._ioaddr = 0xC000; pcr._ioaddr < 0xD000; pcr._ioaddr += 0x0100){
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1039 outb(PCI_MODE2_FORWARD_REG, pcr._pcibuses[pcr._pcibusidx]); /* bus 0 for now */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1040 pcr._device_vendor = inl(pcr._ioaddr);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1041 outb(PCI_MODE2_FORWARD_REG, 0x00); /* bus 0 for now */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1042
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1043 if ((pcr._vendor == 0xFFFF) || (pcr._device == 0xFFFF))
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1044 continue;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1045 if ((pcr._vendor == 0xF0F0) || (pcr._device == 0xF0F0))
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1046 continue; /* catch ASUS P55TP4XE motherboards */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1047
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1048 /*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
1049 pcr._pcibuses[pcr._pcibusidx], pcr._ioaddr, pcr._vendor,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1050 pcr._device);*/
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1051 pcibus = pcr._pcibuses[pcr._pcibusidx] ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1052 pcicard = pcr._ioaddr ; pcifunc = 0 ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1053
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1054 outb(PCI_MODE2_FORWARD_REG, pcr._pcibuses[pcr._pcibusidx]); /* bus 0 for now */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1055 pcr._status_command = inl(pcr._ioaddr + 0x04);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1056 pcr._class_revision = inl(pcr._ioaddr + 0x08);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1057 pcr._bist_header_latency_cache = inl(pcr._ioaddr + 0x0C);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1058 pcr._base0 = inl(pcr._ioaddr + 0x10);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1059 pcr._base1 = inl(pcr._ioaddr + 0x14);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1060 pcr._base2 = inl(pcr._ioaddr + 0x18);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1061 pcr._base3 = inl(pcr._ioaddr + 0x1C);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1062 pcr._base4 = inl(pcr._ioaddr + 0x20);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1063 pcr._base5 = inl(pcr._ioaddr + 0x24);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1064 pcr._baserom = inl(pcr._ioaddr + 0x30);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1065 pcr._max_min_ipin_iline = inl(pcr._ioaddr + 0x3C);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1066 pcr._user_config = inl(pcr._ioaddr + 0x40);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1067 outb(PCI_MODE2_FORWARD_REG, 0x00); /* bus 0 for now */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1068
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1069 /* check for pci-pci bridges (currently we only know Digital) */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1070 if ((pcr._vendor == 0x1011) && (pcr._device == 0x0001))
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1071 if (pcr._secondary_bus_number > 0)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1072 pcr._pcibuses[pcr._pcinumbus++] = pcr._secondary_bus_number;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1073
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1074 if (idx++ >= MAX_PCI_DEVICES)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1075 continue;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1076
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1077 identify_card(&pcr);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1078 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1079 } while (++pcr._pcibusidx < pcr._pcinumbus);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1080
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1081 outb(PCI_MODE2_ENABLE_REG, 0x00);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1082 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1083
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1084 #endif /* __alpha__ */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1085
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1086 disable_os_io();
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1087 *num_pci = pcicards;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1088
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1089 return 0 ;
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1090
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1091 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1092
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1093 #if 0
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1094 void
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1095 print_i128(struct pci_config_reg *pcr)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1096 {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1097 /*
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1098 if (pcr->_status_command)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1099 printf(" STATUS 0x%04x COMMAND 0x%04x\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1100 pcr->_status, pcr->_command);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1101 if (pcr->_class_revision)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1102 printf(" CLASS 0x%02x 0x%02x 0x%02x REVISION 0x%02x\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1103 pcr->_base_class, pcr->_sub_class, pcr->_prog_if, pcr->_rev_id);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1104 if (pcr->_bist_header_latency_cache)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1105 printf(" BIST 0x%02x HEADER 0x%02x LATENCY 0x%02x CACHE 0x%02x\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1106 pcr->_bist, pcr->_header_type, pcr->_latency_timer,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1107 pcr->_cache_line_size);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1108 printf(" MW0_AD 0x%08x addr 0x%08x %spre-fetchable\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1109 pcr->_base0, pcr->_base0 & 0xFFC00000,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1110 pcr->_base0 & 0x8 ? "" : "not-");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1111 printf(" MW1_AD 0x%08x addr 0x%08x %spre-fetchable\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1112 pcr->_base1, pcr->_base1 & 0xFFC00000,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1113 pcr->_base1 & 0x8 ? "" : "not-");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1114 printf(" XYW_AD(A) 0x%08x addr 0x%08x\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1115 pcr->_base2, pcr->_base2 & 0xFFC00000);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1116 printf(" XYW_AD(B) 0x%08x addr 0x%08x\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1117 pcr->_base3, pcr->_base3 & 0xFFC00000);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1118 printf(" RBASE_G 0x%08x addr 0x%08x\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1119 pcr->_base4, pcr->_base4 & 0xFFFF0000);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1120 printf(" IO 0x%08x addr 0x%08x\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1121 pcr->_base5, pcr->_base5 & 0xFFFFFF00);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1122 printf(" RBASE_E 0x%08x addr 0x%08x %sdecode-enabled\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1123 pcr->_baserom, pcr->_baserom & 0xFFFF8000,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1124 pcr->_baserom & 0x1 ? "" : "not-");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1125 if (pcr->_max_min_ipin_iline)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1126 printf(" MAX_LAT 0x%02x MIN_GNT 0x%02x INT_PIN 0x%02x INT_LINE 0x%02x\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1127 pcr->_max_lat, pcr->_min_gnt, pcr->_int_pin, pcr->_int_line);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1128 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1129 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1130
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1131 void
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1132 print_pcibridge(struct pci_config_reg *pcr)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1133 {
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1134 /*
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1135 if (pcr->_status_command)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1136 printf(" STATUS 0x%04x COMMAND 0x%04x\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1137 pcr->_status, pcr->_command);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1138 if (pcr->_class_revision)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1139 printf(" CLASS 0x%02x 0x%02x 0x%02x REVISION 0x%02x\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1140 pcr->_base_class, pcr->_sub_class, pcr->_prog_if, pcr->_rev_id);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1141 if (pcr->_bist_header_latency_cache)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1142 printf(" BIST 0x%02x HEADER 0x%02x LATENCY 0x%02x CACHE 0x%02x\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1143 pcr->_bist, pcr->_header_type, pcr->_latency_timer,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1144 pcr->_cache_line_size);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1145 printf(" PRIBUS 0x%02x SECBUS 0x%02x SUBBUS 0x%02x SECLT 0x%02x\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1146 pcr->_primary_bus_number, pcr->_secondary_bus_number,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1147 pcr->_subordinate_bus_number, pcr->_secondary_latency_timer);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1148 printf(" IOBASE: 0x%02x00 IOLIM 0x%02x00 SECSTATUS 0x%04x\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1149 pcr->_io_base, pcr->_io_limit, pcr->_secondary_status);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1150 printf(" NOPREFETCH MEMBASE: 0x%08x MEMLIM 0x%08x\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1151 pcr->_mem_base, pcr->_mem_limit);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1152 printf(" PREFETCH MEMBASE: 0x%08x MEMLIM 0x%08x\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1153 pcr->_prefetch_mem_base, pcr->_prefetch_mem_limit);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1154 printf(" RBASE_E 0x%08x addr 0x%08x %sdecode-enabled\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1155 pcr->_baserom, pcr->_baserom & 0xFFFF8000,
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1156 pcr->_baserom & 0x1 ? "" : "not-");
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1157 if (pcr->_max_min_ipin_iline)
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1158 printf(" MAX_LAT 0x%02x MIN_GNT 0x%02x INT_PIN 0x%02x INT_LINE 0x%02x\n",
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1159 pcr->_max_lat, pcr->_min_gnt, pcr->_int_pin, pcr->_int_line);
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1160 */
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1161 }
138800dfbe22 preliminary support of direct hardware access
nick
parents:
diff changeset
1162 #endif