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