pci_milan.c revision 1.11 1 1.11 dsl /* $NetBSD: pci_milan.c,v 1.11 2009/03/14 15:36:03 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 *
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.11 dsl __KERNEL_RCSID(0, "$NetBSD: pci_milan.c,v 1.11 2009/03/14 15:36:03 dsl 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.11 dsl pci_bus_maxdevs(pci_chipset_tag_t pc, int busno)
54 1.1 leo {
55 1.1 leo return (6);
56 1.1 leo }
57 1.1 leo
58 1.1 leo /*
59 1.1 leo * These are defined in locore.s:
60 1.1 leo */
61 1.1 leo pcireg_t milan_pci_confread(pcitag_t);
62 1.1 leo void milan_pci_confwrite(u_long, pcireg_t);
63 1.1 leo u_long plx_status;
64 1.1 leo
65 1.1 leo pcireg_t
66 1.11 dsl pci_conf_read(pci_chipset_tag_t pc, pcitag_t tag, int reg)
67 1.1 leo {
68 1.1 leo u_long data;
69 1.1 leo
70 1.1 leo data = bswap32(milan_pci_confread(tag | reg));
71 1.1 leo if ((plx_status) & 0xf9000000) {
72 1.1 leo /*
73 1.1 leo * Access error, assume nothing there...
74 1.1 leo */
75 1.1 leo data = 0xffffffff;
76 1.1 leo }
77 1.1 leo return(data);
78 1.1 leo }
79 1.1 leo
80 1.1 leo
81 1.1 leo void
82 1.11 dsl pci_conf_write(pci_chipset_tag_t pc, pcitag_t tag, int reg, pcireg_t data)
83 1.1 leo {
84 1.1 leo milan_pci_confwrite(tag | reg, bswap32(data));
85 1.1 leo }
86 1.1 leo
87 1.9 ad int
88 1.9 ad pci_intr_setattr(pci_chipset_tag_t pc, pci_intr_handle_t *ih,
89 1.9 ad int attr, uint64_t data)
90 1.9 ad {
91 1.9 ad
92 1.9 ad switch (attr) {
93 1.9 ad case PCI_INTR_MPSAFE:
94 1.9 ad return 0;
95 1.9 ad default:
96 1.9 ad return ENODEV;
97 1.9 ad }
98 1.9 ad }
99 1.9 ad
100 1.1 leo void *
101 1.1 leo pci_intr_establish(pc, ih, level, ih_fun, ih_arg)
102 1.1 leo pci_chipset_tag_t pc;
103 1.1 leo pci_intr_handle_t ih;
104 1.1 leo int level;
105 1.10 dsl int (*ih_fun)(void *);
106 1.1 leo void *ih_arg;
107 1.1 leo {
108 1.3 leo if (ih == 0 || ih >= 16 || ih == 2)
109 1.4 provos panic("pci_intr_establish: bogus handle 0x%x", ih);
110 1.3 leo return isa_intr_establish(NULL, ih, IST_LEVEL, level, ih_fun, ih_arg);
111 1.1 leo }
112 1.1 leo
113 1.1 leo void
114 1.11 dsl pci_intr_disestablish(pci_chipset_tag_t pc, void *cookie)
115 1.1 leo {
116 1.3 leo isa_intr_disestablish(NULL, cookie);
117 1.2 leo }
118 1.2 leo
119 1.2 leo /*
120 1.2 leo * VGA related stuff...
121 1.2 leo * XXX: Currently, you can only boot the Milan through loadbsd.ttp, hence the
122 1.2 leo * text mode ;-)
123 1.2 leo * It looks like the Milan BIOS is initializing the VGA card in a reasonably
124 1.2 leo * standard text mode. However, the screen mode is 640*480 instead of 640*400.
125 1.2 leo * Since wscons does not handle the right by default, the card is reprogrammed
126 1.2 leo * to 640*400 using only 'standard' VGA registers (I hope!). So this ought to
127 1.2 leo * work on cards other than the S3Trio card I have tested it on.
128 1.2 leo */
129 1.2 leo static u_char crt_tab[] = {
130 1.2 leo 0x60, 0x53, 0x4f, 0x14, 0x56, 0x05, 0xc1, 0x1f,
131 1.2 leo 0x00, 0x4f, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
132 1.2 leo 0x98, 0x3d, 0x8f, 0x28, 0x0f, 0x8f, 0xc1, 0xc3,
133 1.2 leo 0xff };
134 1.2 leo
135 1.2 leo /*
136 1.2 leo * XXX: Why are we repeating this everywhere! (Leo)
137 1.2 leo */
138 1.2 leo #define PCI_LINMEMBASE 0x0e000000
139 1.2 leo
140 1.2 leo void
141 1.11 dsl milan_vga_init(pci_chipset_tag_t pc, pcitag_t tag, int id, volatile u_char *ba, u_char *fb)
142 1.2 leo {
143 1.2 leo int i, csr;
144 1.2 leo
145 1.2 leo /* Turn on the card */
146 1.2 leo pci_conf_write(pc, tag, PCI_MAPREG_START, PCI_LINMEMBASE);
147 1.2 leo csr = pci_conf_read(pc, tag, PCI_COMMAND_STATUS_REG);
148 1.2 leo csr |= (PCI_COMMAND_MEM_ENABLE|PCI_COMMAND_IO_ENABLE);
149 1.2 leo csr |= PCI_COMMAND_MASTER_ENABLE;
150 1.2 leo pci_conf_write(pc, tag, PCI_COMMAND_STATUS_REG, csr);
151 1.2 leo
152 1.2 leo /*
153 1.2 leo * Make sure we're allowed to write all crt-registers and reload them.
154 1.2 leo */
155 1.2 leo WCrt(ba, CRT_ID_END_VER_RETR, (RCrt(ba, CRT_ID_END_VER_RETR) & 0x7f));
156 1.2 leo
157 1.2 leo for (i = 0; i < 0x18; i++)
158 1.2 leo WCrt(ba, i, crt_tab[i]);
159 1.2 leo
160 1.2 leo /*
161 1.2 leo * The Milan has a white border... make it black
162 1.2 leo */
163 1.2 leo WAttr(ba, 0x11, 0|0x20);
164 1.1 leo }
165