/[gxemul]/upstream/0.4.2/src/devices/bus_isa.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /upstream/0.4.2/src/devices/bus_isa.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 31 - (show annotations)
Mon Oct 8 16:20:48 2007 UTC (16 years, 8 months ago) by dpavlin
File MIME type: text/plain
File size: 7417 byte(s)
0.4.2
1 /*
2 * Copyright (C) 2005-2006 Anders Gavare. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * 3. The name of the author may not be used to endorse or promote products
13 * derived from this software without specific prior written permission.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
27 *
28 * $Id: bus_isa.c,v 1.9 2006/01/16 01:45:27 debug Exp $
29 *
30 * Generic ISA bus. This is not a normal device, but it can be used as a quick
31 * way of adding most of the common legacy ISA devices to a machine.
32 */
33
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include <string.h>
37
38 #define BUS_ISA_C
39
40 #include "bus_isa.h"
41 #include "device.h"
42 #include "devices.h"
43 #include "diskimage.h"
44 #include "machine.h"
45 #include "misc.h"
46
47
48 /*
49 * bus_isa_debug_dump():
50 */
51 void bus_isa_debug_dump(void *extra)
52 {
53 struct bus_isa_data *d = (struct bus_isa_data *) extra;
54
55 debug("isa:\n");
56 debug_indentation(DEBUG_INDENTATION);
57 debug("portbase: 0x%llx\n", (long long)d->isa_portbase);
58 debug("membase: 0x%llx\n", (long long)d->isa_membase);
59 debug("irqbase: %i\n", (int)d->isa_irqbase);
60 debug("reassert_irq: %i\n", (int)d->reassert_irq);
61 debug_indentation(-DEBUG_INDENTATION);
62 }
63
64
65 /*
66 * bus_isa_init():
67 *
68 * Flags are zero or more of the following, ORed together:
69 *
70 * BUS_ISA_IDE0 Include wdc0.
71 * BUS_ISA_IDE1 Include wdc1.
72 * BUS_ISA_FDC Include a floppy controller. (Dummy.)
73 * BUS_ISA_VGA Include old-style (non-PCI) VGA. (*1)
74 * BUS_ISA_VGA_FORCE Include VGA even when running without X11. (*2)
75 * BUS_ISA_PCKBC_FORCE_USE Always assume keyboard console, not serial. (*3)
76 * BUS_ISA_PCKBC_NONPCSTYLE Don't set the pc-style flag for the keyboard.
77 * BUS_ISA_NO_SECOND_PIC Only useful for 8086 XT (pre-AT) emulation. :-)
78 * BUS_ISA_LPTBASE_3BC Set lptbase to 0x3bc instead of 0x378.
79 *
80 * (*1) For machines with a PCI bus, this flag should not be used. Instead, a
81 * PCI VGA card should be added to the PCI bus.
82 *
83 * (*2) For machines where it is easy to select VGA vs serial console during
84 * boot, this flag should not be used. Machines that "always" boot up
85 * in VGA console mode should have it set.
86 *
87 * (*3) Similar to *2 above; machines that always boot up with VGA console
88 * should have this flag set, so that the keyboard is always used.
89 */
90 struct bus_isa_data *bus_isa_init(struct machine *machine,
91 uint32_t bus_isa_flags, uint64_t isa_portbase, uint64_t isa_membase,
92 int isa_irqbase, int reassert_irq)
93 {
94 struct bus_isa_data *d = malloc(sizeof(struct bus_isa_data));
95 char tmpstr[300];
96 int wdc0_irq = 14, wdc1_irq = 15;
97 int tmp_handle, kbd_in_use;
98 int lptbase = 0x378;
99
100 memset(d, 0, sizeof(struct bus_isa_data));
101 d->isa_portbase = isa_portbase;
102 d->isa_membase = isa_membase;
103 d->isa_irqbase = isa_irqbase;
104 d->reassert_irq = reassert_irq;
105 machine_bus_register(machine, "isa", bus_isa_debug_dump, d);
106
107 kbd_in_use = ((bus_isa_flags & BUS_ISA_PCKBC_FORCE_USE) ||
108 (machine->use_x11))? 1 : 0;
109
110 if (machine->machine_type == MACHINE_PREP) {
111 /* PReP with obio controller has both WDCs on irq 13! */
112 wdc0_irq = wdc1_irq = 13;
113 }
114
115 snprintf(tmpstr, sizeof(tmpstr), "8259 irq=%i addr=0x%llx",
116 reassert_irq, (long long)(isa_portbase + 0x20));
117 machine->isa_pic_data.pic1 = device_add(machine, tmpstr);
118
119 if (bus_isa_flags & BUS_ISA_NO_SECOND_PIC)
120 bus_isa_flags &= ~BUS_ISA_NO_SECOND_PIC;
121 else {
122 snprintf(tmpstr, sizeof(tmpstr), "8259 irq=%i addr=0x%llx",
123 reassert_irq, (long long)(isa_portbase + 0xa0));
124 machine->isa_pic_data.pic2 = device_add(machine, tmpstr);
125 }
126
127 snprintf(tmpstr, sizeof(tmpstr), "8253 irq=%i addr=0x%llx in_use=0",
128 isa_irqbase + 0, (long long)(isa_portbase + 0x40));
129 device_add(machine, tmpstr);
130
131 snprintf(tmpstr, sizeof(tmpstr), "pccmos addr=0x%llx",
132 (long long)(isa_portbase + 0x70));
133 device_add(machine, tmpstr);
134
135 snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=%i addr=0x%llx name2="
136 "tty0 in_use=%i", isa_irqbase+4, (long long)(isa_portbase + 0x3f8),
137 1 - kbd_in_use);
138 machine->main_console_handle = (size_t)device_add(machine, tmpstr);
139
140 snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=%i addr=0x%llx name2=tty1"
141 " in_use=0", isa_irqbase +3, (long long)(isa_portbase + 0x2f8));
142 device_add(machine, tmpstr);
143
144 if (bus_isa_flags & BUS_ISA_LPTBASE_3BC) {
145 bus_isa_flags &= ~BUS_ISA_LPTBASE_3BC;
146 lptbase = 0x3bc;
147 }
148
149 snprintf(tmpstr, sizeof(tmpstr), "lpt irq=%i addr=0x%llx name2=lpt"
150 " in_use=0", isa_irqbase + 7, (long long)(isa_portbase + lptbase));
151 device_add(machine, tmpstr);
152
153 if (bus_isa_flags & BUS_ISA_IDE0) {
154 bus_isa_flags &= ~BUS_ISA_IDE0;
155 snprintf(tmpstr, sizeof(tmpstr), "wdc irq=%i addr=0x%llx",
156 isa_irqbase + wdc0_irq, (long long)(isa_portbase + 0x1f0));
157 if (diskimage_exist(machine, 0, DISKIMAGE_IDE) ||
158 diskimage_exist(machine, 1, DISKIMAGE_IDE))
159 device_add(machine, tmpstr);
160 }
161
162 if (bus_isa_flags & BUS_ISA_IDE1) {
163 bus_isa_flags &= ~BUS_ISA_IDE1;
164 snprintf(tmpstr, sizeof(tmpstr), "wdc irq=%i addr=0x%llx",
165 isa_irqbase + wdc1_irq, (long long)(isa_portbase + 0x170));
166 if (diskimage_exist(machine, 2, DISKIMAGE_IDE) ||
167 diskimage_exist(machine, 3, DISKIMAGE_IDE))
168 device_add(machine, tmpstr);
169 }
170
171 if (bus_isa_flags & BUS_ISA_FDC) {
172 bus_isa_flags &= ~BUS_ISA_FDC;
173 snprintf(tmpstr, sizeof(tmpstr), "fdc irq=%i addr=0x%llx",
174 isa_irqbase + 6, (long long)(isa_portbase + 0x3f0));
175 device_add(machine, tmpstr);
176 }
177
178 if (bus_isa_flags & BUS_ISA_VGA) {
179 if (machine->use_x11 || bus_isa_flags & BUS_ISA_VGA_FORCE)
180 dev_vga_init(machine, machine->memory,
181 isa_membase + 0xa0000, isa_portbase + 0x3c0,
182 machine->machine_name);
183 bus_isa_flags &= ~(BUS_ISA_VGA | BUS_ISA_VGA_FORCE);
184 }
185
186 tmp_handle = dev_pckbc_init(machine, machine->memory,
187 isa_portbase + 0x60, PCKBC_8042, isa_irqbase + 1, isa_irqbase + 12,
188 kbd_in_use, bus_isa_flags & BUS_ISA_PCKBC_NONPCSTYLE? 0 : 1);
189
190 if (kbd_in_use)
191 machine->main_console_handle = tmp_handle;
192
193 bus_isa_flags &= ~(BUS_ISA_PCKBC_NONPCSTYLE | BUS_ISA_PCKBC_FORCE_USE);
194
195 if (bus_isa_flags != 0)
196 fatal("WARNING! bus_isa(): unimplemented bus_isa_flags 0x%x\n",
197 bus_isa_flags);
198
199 return d;
200 }
201

  ViewVC Help
Powered by ViewVC 1.1.26