/[gxemul]/upstream/0.4.4.1/src/devices/dev_eagle.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.4.1/src/devices/dev_eagle.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 37 - (show annotations)
Mon Oct 8 16:21:43 2007 UTC (16 years, 8 months ago) by dpavlin
File MIME type: text/plain
File size: 6050 byte(s)
0.4.4.1
1 /*
2 * Copyright (C) 2003-2007 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: dev_eagle.c,v 1.18 2007/02/16 19:57:56 debug Exp $
29 *
30 * Motorola MPC105 "Eagle" host bridge.
31 */
32
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <string.h>
36
37 #include "bus_isa.h"
38 #include "bus_pci.h"
39 #include "cpu.h"
40 #include "device.h"
41 #include "interrupt.h"
42 #include "machine.h"
43 #include "memory.h"
44 #include "misc.h"
45
46
47 struct eagle_data {
48 struct interrupt irq;
49
50 struct pci_data *pci_data;
51 };
52
53
54 DEVICE_ACCESS(eagle)
55 {
56 uint64_t idata = 0, odata = 0;
57 struct eagle_data *d = extra;
58 int bus, dev, func, reg;
59
60 if (writeflag == MEM_WRITE)
61 idata = memory_readmax64(cpu, data, len|MEM_PCI_LITTLE_ENDIAN);
62
63 /*
64 * Pass accesses to ISA ports 0xcf8 and 0xcfc onto bus_pci_*:
65 */
66
67 switch (relative_addr) {
68 case 0: /* Address: */
69 bus_pci_decompose_1(idata, &bus, &dev, &func, &reg);
70 bus_pci_setaddr(cpu, d->pci_data, bus, dev, func, reg);
71 break;
72
73 case 4: /* Data: */
74 bus_pci_data_access(cpu, d->pci_data, writeflag == MEM_READ?
75 &odata : &idata, len, writeflag);
76 break;
77 }
78
79 if (writeflag == MEM_READ)
80 memory_writemax64(cpu, data, len|MEM_PCI_LITTLE_ENDIAN, odata);
81
82 return 1;
83 }
84
85
86 DEVINIT(eagle)
87 {
88 struct eagle_data *d;
89 uint64_t pci_io_offset, pci_mem_offset;
90 uint64_t isa_portbase = 0, isa_membase = 0;
91 uint64_t pci_portbase = 0, pci_membase = 0;
92 char pci_irq_base[300];
93 char isa_irq_base[300];
94
95 d = malloc(sizeof(struct eagle_data));
96 if (d == NULL) {
97 fprintf(stderr, "out of memory\n");
98 exit(1);
99 }
100 memset(d, 0, sizeof(struct eagle_data));
101
102 /* The interrupt path to the CPU at which we are connected: */
103 INTERRUPT_CONNECT(devinit->interrupt_path, d->irq);
104
105 /*
106 * According to http://www.beatjapan.org/mirror/www.be.com/
107 * aboutbe/benewsletter/Issue27.html#Cookbook :
108 *
109 * "HARDWARE MEMORY MAP
110 * The MPC105 defines the physical memory map of the system as
111 * follows:
112 *
113 * Start Size Description
114 *
115 * 0x00000000 0x40000000 Physical RAM
116 * 0x40000000 0x40000000 Other system memory
117 * (motherboard glue regs)
118 * 0x80000000 0x00800000 ISA I/O
119 * 0x81000000 0x3E800000 PCI I/O
120 * 0xBFFFFFF0 0x00000010 PCI/ISA interrupt acknowledge
121 * 0xC0000000 0x3F000000 PCI memory
122 * 0xFF000000 0x01000000 ROM/flash
123 */
124
125 /* TODO: Make these work like the BE web page stated... */
126 pci_io_offset = 0x80000000ULL;
127 pci_mem_offset = 0xc0000000ULL;
128 pci_portbase = 0x00000000ULL;
129 pci_membase = 0x00000000ULL;
130 isa_portbase = 0x80000000ULL;
131 isa_membase = 0xc0000000ULL;
132
133 switch (devinit->machine->machine_type) {
134 case MACHINE_BEBOX:
135 snprintf(pci_irq_base, sizeof(pci_irq_base), "%s.bebox",
136 devinit->interrupt_path);
137 snprintf(isa_irq_base, sizeof(isa_irq_base), "%s.bebox.5",
138 devinit->interrupt_path);
139 break;
140 default:
141 snprintf(pci_irq_base, sizeof(pci_irq_base), "%s",
142 devinit->interrupt_path);
143 snprintf(isa_irq_base, sizeof(isa_irq_base), "%s",
144 devinit->interrupt_path);
145 }
146
147 /* Create a PCI bus: */
148 d->pci_data = bus_pci_init(devinit->machine, devinit->interrupt_path,
149 pci_io_offset, pci_mem_offset,
150 pci_portbase, pci_membase, pci_irq_base,
151 isa_portbase, isa_membase, isa_irq_base);
152
153 /* Add the PCI glue for the controller itself: */
154 bus_pci_add(devinit->machine, d->pci_data,
155 devinit->machine->memory, 0, 0, 0, "eagle");
156
157 /* ADDR and DATA configuration ports in ISA space: */
158 memory_device_register(devinit->machine->memory, "eagle",
159 isa_portbase + BUS_PCI_ADDR, 8, dev_eagle_access, d,
160 DM_DEFAULT, NULL);
161
162 switch (devinit->machine->machine_type) {
163 case MACHINE_BEBOX:
164 bus_isa_init(devinit->machine, isa_irq_base,
165 BUS_ISA_IDE0 | BUS_ISA_VGA, isa_portbase, isa_membase);
166 bus_pci_add(devinit->machine, d->pci_data,
167 devinit->machine->memory, 0, 11, 0, "i82378zb");
168 break;
169 case MACHINE_PREP:
170 bus_pci_add(devinit->machine, d->pci_data,
171 devinit->machine->memory, 0, 11, 0, "ibm_isa");
172 break;
173 case MACHINE_MVMEPPC:
174 bus_isa_init(devinit->machine, isa_irq_base,
175 BUS_ISA_LPTBASE_3BC, isa_portbase, isa_membase);
176 switch (devinit->machine->machine_subtype) {
177 case MACHINE_MVMEPPC_1600:
178 bus_pci_add(devinit->machine, d->pci_data,
179 devinit->machine->memory, 0, 11, 0, "i82378zb");
180 break;
181 default:fatal("unimplemented machine subtype for "
182 "eagle/mvmeppc\n");
183 exit(1);
184 }
185 break;
186 default:fatal("unimplemented machine type for eagle\n");
187 exit(1);
188 }
189
190 devinit->return_ptr = d->pci_data;
191
192 return 1;
193 }
194

  ViewVC Help
Powered by ViewVC 1.1.26