pci_milan.c revision 1.7 1 1.7 dsl /* $NetBSD: pci_milan.c,v 1.7 2006/01/29 21:42:41 dsl Exp $ */
2 1.1 leo
3 1.1 leo /*-
4 1.1 leo * Copyright (c) 2001 The NetBSD Foundation, Inc.
5 1.1 leo * All rights reserved.
6 1.1 leo *
7 1.1 leo * This code is derived from software contributed to The NetBSD Foundation
8 1.1 leo * by Leo Weppelman.
9 1.1 leo *
10 1.1 leo * Redistribution and use in source and binary forms, with or without
11 1.1 leo * modification, are permitted provided that the following conditions
12 1.1 leo * are met:
13 1.1 leo * 1. Redistributions of source code must retain the above copyright
14 1.1 leo * notice, this list of conditions and the following disclaimer.
15 1.1 leo * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 leo * notice, this list of conditions and the following disclaimer in the
17 1.1 leo * documentation and/or other materials provided with the distribution.
18 1.1 leo * 3. All advertising materials mentioning features or use of this software
19 1.1 leo * must display the following acknowledgement:
20 1.1 leo * This product includes software developed by the NetBSD
21 1.1 leo * Foundation, Inc. and its contributors.
22 1.1 leo * 4. Neither the name of The NetBSD Foundation nor the names of its
23 1.1 leo * contributors may be used to endorse or promote products derived
24 1.1 leo * from this software without specific prior written permission.
25 1.1 leo *
26 1.1 leo * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 1.1 leo * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 1.1 leo * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 1.1 leo * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 1.1 leo * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 1.1 leo * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 1.1 leo * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 1.1 leo * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 1.1 leo * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 1.1 leo * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 1.1 leo * POSSIBILITY OF SUCH DAMAGE.
37 1.1 leo */
38 1.5 lukem
39 1.5 lukem #include <sys/cdefs.h>
40 1.7 dsl __KERNEL_RCSID(0, "$NetBSD: pci_milan.c,v 1.7 2006/01/29 21:42:41 dsl Exp $");
41 1.1 leo
42 1.1 leo #include <sys/types.h>
43 1.1 leo #include <sys/param.h>
44 1.1 leo #include <sys/systm.h>
45 1.1 leo #include <sys/device.h>
46 1.1 leo
47 1.1 leo #include <dev/pci/pcivar.h>
48 1.1 leo #include <dev/pci/pcireg.h>
49 1.1 leo
50 1.3 leo #include <dev/isa/isavar.h> /* isa_intr_{dis}establish */
51 1.3 leo #include <dev/isa/isareg.h> /* isa_intr_{dis}establish */
52 1.3 leo
53 1.7 dsl #include <sys/bswap.h>
54 1.3 leo #include <machine/isa_machdep.h> /* isa_intr_{dis}establish */
55 1.1 leo
56 1.2 leo #include <atari/pci/pci_vga.h>
57 1.2 leo #include <atari/dev/grf_etreg.h>
58 1.2 leo
59 1.1 leo int
60 1.1 leo pci_bus_maxdevs(pc, busno)
61 1.1 leo pci_chipset_tag_t pc;
62 1.1 leo int busno;
63 1.1 leo {
64 1.1 leo return (6);
65 1.1 leo }
66 1.1 leo
67 1.1 leo /*
68 1.1 leo * These are defined in locore.s:
69 1.1 leo */
70 1.1 leo pcireg_t milan_pci_confread(pcitag_t);
71 1.1 leo void milan_pci_confwrite(u_long, pcireg_t);
72 1.1 leo u_long plx_status;
73 1.1 leo
74 1.1 leo pcireg_t
75 1.1 leo pci_conf_read(pc, tag, reg)
76 1.1 leo pci_chipset_tag_t pc;
77 1.1 leo pcitag_t tag;
78 1.1 leo int reg;
79 1.1 leo {
80 1.1 leo u_long data;
81 1.1 leo
82 1.1 leo data = bswap32(milan_pci_confread(tag | reg));
83 1.1 leo if ((plx_status) & 0xf9000000) {
84 1.1 leo /*
85 1.1 leo * Access error, assume nothing there...
86 1.1 leo */
87 1.1 leo data = 0xffffffff;
88 1.1 leo }
89 1.1 leo return(data);
90 1.1 leo }
91 1.1 leo
92 1.1 leo
93 1.1 leo void
94 1.1 leo pci_conf_write(pc, tag, reg, data)
95 1.1 leo pci_chipset_tag_t pc;
96 1.1 leo pcitag_t tag;
97 1.1 leo int reg;
98 1.1 leo pcireg_t data;
99 1.1 leo {
100 1.1 leo milan_pci_confwrite(tag | reg, bswap32(data));
101 1.1 leo }
102 1.1 leo
103 1.1 leo void *
104 1.1 leo pci_intr_establish(pc, ih, level, ih_fun, ih_arg)
105 1.1 leo pci_chipset_tag_t pc;
106 1.1 leo pci_intr_handle_t ih;
107 1.1 leo int level;
108 1.1 leo int (*ih_fun) __P((void *));
109 1.1 leo void *ih_arg;
110 1.1 leo {
111 1.3 leo if (ih == 0 || ih >= 16 || ih == 2)
112 1.4 provos panic("pci_intr_establish: bogus handle 0x%x", ih);
113 1.3 leo return isa_intr_establish(NULL, ih, IST_LEVEL, level, ih_fun, ih_arg);
114 1.1 leo }
115 1.1 leo
116 1.1 leo void
117 1.1 leo pci_intr_disestablish(pc, cookie)
118 1.1 leo pci_chipset_tag_t pc;
119 1.1 leo void *cookie;
120 1.1 leo {
121 1.3 leo isa_intr_disestablish(NULL, cookie);
122 1.2 leo }
123 1.2 leo
124 1.2 leo /*
125 1.2 leo * VGA related stuff...
126 1.2 leo * XXX: Currently, you can only boot the Milan through loadbsd.ttp, hence the
127 1.2 leo * text mode ;-)
128 1.2 leo * It looks like the Milan BIOS is initializing the VGA card in a reasonably
129 1.2 leo * standard text mode. However, the screen mode is 640*480 instead of 640*400.
130 1.2 leo * Since wscons does not handle the right by default, the card is reprogrammed
131 1.2 leo * to 640*400 using only 'standard' VGA registers (I hope!). So this ought to
132 1.2 leo * work on cards other than the S3Trio card I have tested it on.
133 1.2 leo */
134 1.2 leo static u_char crt_tab[] = {
135 1.2 leo 0x60, 0x53, 0x4f, 0x14, 0x56, 0x05, 0xc1, 0x1f,
136 1.2 leo 0x00, 0x4f, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
137 1.2 leo 0x98, 0x3d, 0x8f, 0x28, 0x0f, 0x8f, 0xc1, 0xc3,
138 1.2 leo 0xff };
139 1.2 leo
140 1.2 leo /*
141 1.2 leo * XXX: Why are we repeating this everywhere! (Leo)
142 1.2 leo */
143 1.2 leo #define PCI_LINMEMBASE 0x0e000000
144 1.2 leo
145 1.2 leo void
146 1.2 leo milan_vga_init(pc, tag, id, ba, fb)
147 1.2 leo pci_chipset_tag_t pc;
148 1.2 leo pcitag_t tag;
149 1.2 leo int id;
150 1.2 leo volatile u_char *ba;
151 1.2 leo u_char *fb;
152 1.2 leo {
153 1.2 leo int i, csr;
154 1.2 leo
155 1.2 leo /* Turn on the card */
156 1.2 leo pci_conf_write(pc, tag, PCI_MAPREG_START, PCI_LINMEMBASE);
157 1.2 leo csr = pci_conf_read(pc, tag, PCI_COMMAND_STATUS_REG);
158 1.2 leo csr |= (PCI_COMMAND_MEM_ENABLE|PCI_COMMAND_IO_ENABLE);
159 1.2 leo csr |= PCI_COMMAND_MASTER_ENABLE;
160 1.2 leo pci_conf_write(pc, tag, PCI_COMMAND_STATUS_REG, csr);
161 1.2 leo
162 1.2 leo /*
163 1.2 leo * Make sure we're allowed to write all crt-registers and reload them.
164 1.2 leo */
165 1.2 leo WCrt(ba, CRT_ID_END_VER_RETR, (RCrt(ba, CRT_ID_END_VER_RETR) & 0x7f));
166 1.2 leo
167 1.2 leo for (i = 0; i < 0x18; i++)
168 1.2 leo WCrt(ba, i, crt_tab[i]);
169 1.2 leo
170 1.2 leo /*
171 1.2 leo * The Milan has a white border... make it black
172 1.2 leo */
173 1.2 leo WAttr(ba, 0x11, 0|0x20);
174 1.1 leo }
175