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