1 |
dpavlin |
20 |
/* |
2 |
|
|
* Copyright (C) 2005 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.5 2005/11/21 11:10:11 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 |
|
|
#include "bus_isa.h" |
39 |
|
|
#include "device.h" |
40 |
|
|
#include "devices.h" |
41 |
|
|
#include "diskimage.h" |
42 |
|
|
#include "machine.h" |
43 |
|
|
#include "misc.h" |
44 |
|
|
|
45 |
|
|
|
46 |
|
|
/* |
47 |
|
|
* bus_isa(): |
48 |
|
|
* |
49 |
|
|
* Flags are zero or more of the following, ORed together: |
50 |
|
|
* |
51 |
|
|
* BUS_ISA_IDE0 Include wdc0. |
52 |
|
|
* BUS_ISA_IDE1 Include wdc1. |
53 |
|
|
* BUS_ISA_FDC Include a floppy controller. (Dummy.) |
54 |
|
|
* BUS_ISA_VGA Include old-style (non-PCI) VGA. (*1) |
55 |
|
|
* BUS_ISA_VGA_FORCE Include VGA even when running without X11. (*2) |
56 |
|
|
* BUS_ISA_PCKBC_FORCE_USE Always assume keyboard console, not serial. (*3) |
57 |
|
|
* BUS_ISA_PCKBC_NONPCSTYLE Don't set the pc-style flag for the keyboard. |
58 |
|
|
* BUS_ISA_NO_SECOND_PIC Only useful for 8086 XT (pre-AT) emulation. :-) |
59 |
|
|
* |
60 |
|
|
* (*1) For machines with a PCI bus, this flag should not be used. Instead, a |
61 |
|
|
* PCI VGA card should be added to the PCI bus. |
62 |
|
|
* |
63 |
|
|
* (*2) For machines where it is easy to select VGA vs serial console during |
64 |
|
|
* boot, this flag should not be used. Machines that "always" boot up |
65 |
|
|
* in VGA console mode should have it set. |
66 |
|
|
* |
67 |
|
|
* (*3) Similar to *2 above; machines that always boot up with VGA console |
68 |
|
|
* should have this flag set, so that the keyboard is always used. |
69 |
|
|
*/ |
70 |
|
|
void bus_isa(struct machine *machine, uint32_t bus_isa_flags, |
71 |
|
|
uint64_t isa_portbase, uint64_t isa_membase, int isa_irqbase, |
72 |
|
|
int reassert_irq) |
73 |
|
|
{ |
74 |
|
|
char tmpstr[300]; |
75 |
|
|
int wdc0_irq = 14, wdc1_irq = 15; |
76 |
|
|
int tmp_handle, kbd_in_use; |
77 |
|
|
|
78 |
|
|
kbd_in_use = ((bus_isa_flags & BUS_ISA_PCKBC_FORCE_USE) || |
79 |
|
|
(machine->use_x11))? 1 : 0; |
80 |
|
|
|
81 |
|
|
if (machine->machine_type == MACHINE_PREP) { |
82 |
|
|
/* PReP with obio controller has both WDCs on irq 13! */ |
83 |
|
|
wdc0_irq = wdc1_irq = 13; |
84 |
|
|
} |
85 |
|
|
|
86 |
|
|
snprintf(tmpstr, sizeof(tmpstr), "8259 irq=%i addr=0x%llx", |
87 |
|
|
reassert_irq, (long long)(isa_portbase + 0x20)); |
88 |
|
|
machine->isa_pic_data.pic1 = device_add(machine, tmpstr); |
89 |
|
|
|
90 |
|
|
if (bus_isa_flags & BUS_ISA_NO_SECOND_PIC) |
91 |
|
|
bus_isa_flags &= ~BUS_ISA_NO_SECOND_PIC; |
92 |
|
|
else { |
93 |
|
|
snprintf(tmpstr, sizeof(tmpstr), "8259 irq=%i addr=0x%llx", |
94 |
|
|
reassert_irq, (long long)(isa_portbase + 0xa0)); |
95 |
|
|
machine->isa_pic_data.pic2 = device_add(machine, tmpstr); |
96 |
|
|
} |
97 |
|
|
|
98 |
|
|
snprintf(tmpstr, sizeof(tmpstr), "8253 irq=%i addr=0x%llx in_use=0", |
99 |
|
|
isa_irqbase + 0, (long long)(isa_portbase + 0x40)); |
100 |
|
|
device_add(machine, tmpstr); |
101 |
|
|
|
102 |
|
|
snprintf(tmpstr, sizeof(tmpstr), "pccmos addr=0x%llx", |
103 |
|
|
(long long)(isa_portbase + 0x70)); |
104 |
|
|
device_add(machine, tmpstr); |
105 |
|
|
|
106 |
|
|
snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=%i addr=0x%llx name2=" |
107 |
|
|
"tty0 in_use=%i", isa_irqbase+4, (long long)(isa_portbase + 0x3f8), |
108 |
|
|
1 - kbd_in_use); |
109 |
|
|
machine->main_console_handle = (size_t)device_add(machine, tmpstr); |
110 |
|
|
|
111 |
|
|
snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=%i addr=0x%llx name2=tty1" |
112 |
|
|
" in_use=0", isa_irqbase +3, (long long)(isa_portbase + 0x2f8)); |
113 |
|
|
device_add(machine, tmpstr); |
114 |
|
|
|
115 |
|
|
snprintf(tmpstr, sizeof(tmpstr), "lpt irq=%i addr=0x%llx name2=lpt" |
116 |
|
|
" in_use=0", isa_irqbase + 7, (long long)(isa_portbase + 0x378)); |
117 |
|
|
device_add(machine, tmpstr); |
118 |
|
|
|
119 |
|
|
if (bus_isa_flags & BUS_ISA_IDE0) { |
120 |
|
|
bus_isa_flags &= ~BUS_ISA_IDE0; |
121 |
|
|
snprintf(tmpstr, sizeof(tmpstr), "wdc irq=%i addr=0x%llx", |
122 |
|
|
isa_irqbase + wdc0_irq, (long long)(isa_portbase + 0x1f0)); |
123 |
|
|
if (diskimage_exist(machine, 0, DISKIMAGE_IDE) || |
124 |
|
|
diskimage_exist(machine, 1, DISKIMAGE_IDE)) |
125 |
|
|
device_add(machine, tmpstr); |
126 |
|
|
} |
127 |
|
|
|
128 |
|
|
if (bus_isa_flags & BUS_ISA_IDE1) { |
129 |
|
|
bus_isa_flags &= ~BUS_ISA_IDE1; |
130 |
|
|
snprintf(tmpstr, sizeof(tmpstr), "wdc irq=%i addr=0x%llx", |
131 |
|
|
isa_irqbase + wdc1_irq, (long long)(isa_portbase + 0x170)); |
132 |
|
|
if (diskimage_exist(machine, 2, DISKIMAGE_IDE) || |
133 |
|
|
diskimage_exist(machine, 3, DISKIMAGE_IDE)) |
134 |
|
|
device_add(machine, tmpstr); |
135 |
|
|
} |
136 |
|
|
|
137 |
|
|
if (bus_isa_flags & BUS_ISA_FDC) { |
138 |
|
|
bus_isa_flags &= ~BUS_ISA_FDC; |
139 |
|
|
snprintf(tmpstr, sizeof(tmpstr), "fdc irq=%i addr=0x%llx", |
140 |
|
|
isa_irqbase + 6, (long long)(isa_portbase + 0x3f0)); |
141 |
|
|
device_add(machine, tmpstr); |
142 |
|
|
} |
143 |
|
|
|
144 |
|
|
if (bus_isa_flags & BUS_ISA_VGA) { |
145 |
|
|
if (machine->use_x11 || bus_isa_flags & BUS_ISA_VGA_FORCE) |
146 |
|
|
dev_vga_init(machine, machine->memory, |
147 |
|
|
isa_membase + 0xa0000, isa_portbase + 0x3c0, |
148 |
|
|
machine->machine_name); |
149 |
|
|
bus_isa_flags &= ~(BUS_ISA_VGA | BUS_ISA_VGA_FORCE); |
150 |
|
|
} |
151 |
|
|
|
152 |
|
|
tmp_handle = dev_pckbc_init(machine, machine->memory, |
153 |
|
|
isa_portbase + 0x60, PCKBC_8042, isa_irqbase + 1, isa_irqbase + 12, |
154 |
|
|
kbd_in_use, bus_isa_flags & BUS_ISA_PCKBC_NONPCSTYLE? 0 : 1); |
155 |
|
|
|
156 |
|
|
if (kbd_in_use) |
157 |
|
|
machine->main_console_handle = tmp_handle; |
158 |
|
|
|
159 |
|
|
bus_isa_flags &= ~(BUS_ISA_PCKBC_NONPCSTYLE | BUS_ISA_PCKBC_FORCE_USE); |
160 |
|
|
|
161 |
|
|
if (bus_isa_flags != 0) |
162 |
|
|
fatal("WARNING! bus_isa(): unimplemented bus_isa_flags 0x%x\n", |
163 |
|
|
bus_isa_flags); |
164 |
|
|
} |
165 |
|
|
|