root / hw / ide / macio.c @ c65bcef3
History | View | Annotate | Download (8.7 kB)
1 | b8842209 | Gerd Hoffmann | /*
|
---|---|---|---|
2 | b8842209 | Gerd Hoffmann | * QEMU IDE Emulation: MacIO support.
|
3 | b8842209 | Gerd Hoffmann | *
|
4 | b8842209 | Gerd Hoffmann | * Copyright (c) 2003 Fabrice Bellard
|
5 | b8842209 | Gerd Hoffmann | * Copyright (c) 2006 Openedhand Ltd.
|
6 | b8842209 | Gerd Hoffmann | *
|
7 | b8842209 | Gerd Hoffmann | * Permission is hereby granted, free of charge, to any person obtaining a copy
|
8 | b8842209 | Gerd Hoffmann | * of this software and associated documentation files (the "Software"), to deal
|
9 | b8842209 | Gerd Hoffmann | * in the Software without restriction, including without limitation the rights
|
10 | b8842209 | Gerd Hoffmann | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
11 | b8842209 | Gerd Hoffmann | * copies of the Software, and to permit persons to whom the Software is
|
12 | b8842209 | Gerd Hoffmann | * furnished to do so, subject to the following conditions:
|
13 | b8842209 | Gerd Hoffmann | *
|
14 | b8842209 | Gerd Hoffmann | * The above copyright notice and this permission notice shall be included in
|
15 | b8842209 | Gerd Hoffmann | * all copies or substantial portions of the Software.
|
16 | b8842209 | Gerd Hoffmann | *
|
17 | b8842209 | Gerd Hoffmann | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18 | b8842209 | Gerd Hoffmann | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19 | b8842209 | Gerd Hoffmann | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
20 | b8842209 | Gerd Hoffmann | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21 | b8842209 | Gerd Hoffmann | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
22 | b8842209 | Gerd Hoffmann | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
23 | b8842209 | Gerd Hoffmann | * THE SOFTWARE.
|
24 | b8842209 | Gerd Hoffmann | */
|
25 | 59f2a787 | Gerd Hoffmann | #include <hw/hw.h> |
26 | 59f2a787 | Gerd Hoffmann | #include <hw/ppc_mac.h> |
27 | 59f2a787 | Gerd Hoffmann | #include <hw/mac_dbdma.h> |
28 | b8842209 | Gerd Hoffmann | #include "block.h" |
29 | b8842209 | Gerd Hoffmann | #include "dma.h" |
30 | 59f2a787 | Gerd Hoffmann | |
31 | 59f2a787 | Gerd Hoffmann | #include <hw/ide/internal.h> |
32 | b8842209 | Gerd Hoffmann | |
33 | b8842209 | Gerd Hoffmann | /***********************************************************/
|
34 | b8842209 | Gerd Hoffmann | /* MacIO based PowerPC IDE */
|
35 | b8842209 | Gerd Hoffmann | |
36 | b8842209 | Gerd Hoffmann | typedef struct MACIOIDEState { |
37 | 23c5e4ca | Avi Kivity | MemoryRegion mem; |
38 | b8842209 | Gerd Hoffmann | IDEBus bus; |
39 | b8842209 | Gerd Hoffmann | BlockDriverAIOCB *aiocb; |
40 | b8842209 | Gerd Hoffmann | } MACIOIDEState; |
41 | b8842209 | Gerd Hoffmann | |
42 | 02c7c992 | Blue Swirl | #define MACIO_PAGE_SIZE 4096 |
43 | 02c7c992 | Blue Swirl | |
44 | b8842209 | Gerd Hoffmann | static void pmac_ide_atapi_transfer_cb(void *opaque, int ret) |
45 | b8842209 | Gerd Hoffmann | { |
46 | b8842209 | Gerd Hoffmann | DBDMA_io *io = opaque; |
47 | b8842209 | Gerd Hoffmann | MACIOIDEState *m = io->opaque; |
48 | b8842209 | Gerd Hoffmann | IDEState *s = idebus_active_if(&m->bus); |
49 | b8842209 | Gerd Hoffmann | |
50 | b8842209 | Gerd Hoffmann | if (ret < 0) { |
51 | b8842209 | Gerd Hoffmann | m->aiocb = NULL;
|
52 | b8842209 | Gerd Hoffmann | qemu_sglist_destroy(&s->sg); |
53 | b8842209 | Gerd Hoffmann | ide_atapi_io_error(s, ret); |
54 | a597e79c | Christoph Hellwig | goto done;
|
55 | b8842209 | Gerd Hoffmann | } |
56 | b8842209 | Gerd Hoffmann | |
57 | b8842209 | Gerd Hoffmann | if (s->io_buffer_size > 0) { |
58 | b8842209 | Gerd Hoffmann | m->aiocb = NULL;
|
59 | b8842209 | Gerd Hoffmann | qemu_sglist_destroy(&s->sg); |
60 | b8842209 | Gerd Hoffmann | |
61 | b8842209 | Gerd Hoffmann | s->packet_transfer_size -= s->io_buffer_size; |
62 | b8842209 | Gerd Hoffmann | |
63 | b8842209 | Gerd Hoffmann | s->io_buffer_index += s->io_buffer_size; |
64 | b8842209 | Gerd Hoffmann | s->lba += s->io_buffer_index >> 11;
|
65 | b8842209 | Gerd Hoffmann | s->io_buffer_index &= 0x7ff;
|
66 | b8842209 | Gerd Hoffmann | } |
67 | b8842209 | Gerd Hoffmann | |
68 | b8842209 | Gerd Hoffmann | if (s->packet_transfer_size <= 0) |
69 | b8842209 | Gerd Hoffmann | ide_atapi_cmd_ok(s); |
70 | b8842209 | Gerd Hoffmann | |
71 | b8842209 | Gerd Hoffmann | if (io->len == 0) { |
72 | a597e79c | Christoph Hellwig | goto done;
|
73 | b8842209 | Gerd Hoffmann | } |
74 | b8842209 | Gerd Hoffmann | |
75 | b8842209 | Gerd Hoffmann | /* launch next transfer */
|
76 | b8842209 | Gerd Hoffmann | |
77 | b8842209 | Gerd Hoffmann | s->io_buffer_size = io->len; |
78 | b8842209 | Gerd Hoffmann | |
79 | c65bcef3 | David Gibson | qemu_sglist_init(&s->sg, io->len / MACIO_PAGE_SIZE + 1, NULL); |
80 | b8842209 | Gerd Hoffmann | qemu_sglist_add(&s->sg, io->addr, io->len); |
81 | b8842209 | Gerd Hoffmann | io->addr += io->len; |
82 | b8842209 | Gerd Hoffmann | io->len = 0;
|
83 | b8842209 | Gerd Hoffmann | |
84 | b8842209 | Gerd Hoffmann | m->aiocb = dma_bdrv_read(s->bs, &s->sg, |
85 | b8842209 | Gerd Hoffmann | (int64_t)(s->lba << 2) + (s->io_buffer_index >> 9), |
86 | b8842209 | Gerd Hoffmann | pmac_ide_atapi_transfer_cb, io); |
87 | a597e79c | Christoph Hellwig | return;
|
88 | a597e79c | Christoph Hellwig | |
89 | a597e79c | Christoph Hellwig | done:
|
90 | a597e79c | Christoph Hellwig | bdrv_acct_done(s->bs, &s->acct); |
91 | a597e79c | Christoph Hellwig | io->dma_end(opaque); |
92 | a597e79c | Christoph Hellwig | return;
|
93 | b8842209 | Gerd Hoffmann | } |
94 | b8842209 | Gerd Hoffmann | |
95 | b8842209 | Gerd Hoffmann | static void pmac_ide_transfer_cb(void *opaque, int ret) |
96 | b8842209 | Gerd Hoffmann | { |
97 | b8842209 | Gerd Hoffmann | DBDMA_io *io = opaque; |
98 | b8842209 | Gerd Hoffmann | MACIOIDEState *m = io->opaque; |
99 | b8842209 | Gerd Hoffmann | IDEState *s = idebus_active_if(&m->bus); |
100 | b8842209 | Gerd Hoffmann | int n;
|
101 | b8842209 | Gerd Hoffmann | int64_t sector_num; |
102 | b8842209 | Gerd Hoffmann | |
103 | b8842209 | Gerd Hoffmann | if (ret < 0) { |
104 | b8842209 | Gerd Hoffmann | m->aiocb = NULL;
|
105 | b8842209 | Gerd Hoffmann | qemu_sglist_destroy(&s->sg); |
106 | b8842209 | Gerd Hoffmann | ide_dma_error(s); |
107 | a597e79c | Christoph Hellwig | goto done;
|
108 | b8842209 | Gerd Hoffmann | } |
109 | b8842209 | Gerd Hoffmann | |
110 | b8842209 | Gerd Hoffmann | sector_num = ide_get_sector(s); |
111 | b8842209 | Gerd Hoffmann | if (s->io_buffer_size > 0) { |
112 | b8842209 | Gerd Hoffmann | m->aiocb = NULL;
|
113 | b8842209 | Gerd Hoffmann | qemu_sglist_destroy(&s->sg); |
114 | b8842209 | Gerd Hoffmann | n = (s->io_buffer_size + 0x1ff) >> 9; |
115 | b8842209 | Gerd Hoffmann | sector_num += n; |
116 | b8842209 | Gerd Hoffmann | ide_set_sector(s, sector_num); |
117 | b8842209 | Gerd Hoffmann | s->nsector -= n; |
118 | b8842209 | Gerd Hoffmann | } |
119 | b8842209 | Gerd Hoffmann | |
120 | b8842209 | Gerd Hoffmann | /* end of transfer ? */
|
121 | b8842209 | Gerd Hoffmann | if (s->nsector == 0) { |
122 | b8842209 | Gerd Hoffmann | s->status = READY_STAT | SEEK_STAT; |
123 | 9cdd03a7 | Gerd Hoffmann | ide_set_irq(s->bus); |
124 | b8842209 | Gerd Hoffmann | } |
125 | b8842209 | Gerd Hoffmann | |
126 | b8842209 | Gerd Hoffmann | /* end of DMA ? */
|
127 | b8842209 | Gerd Hoffmann | if (io->len == 0) { |
128 | a597e79c | Christoph Hellwig | goto done;
|
129 | b8842209 | Gerd Hoffmann | } |
130 | b8842209 | Gerd Hoffmann | |
131 | b8842209 | Gerd Hoffmann | /* launch next transfer */
|
132 | b8842209 | Gerd Hoffmann | |
133 | b8842209 | Gerd Hoffmann | s->io_buffer_index = 0;
|
134 | b8842209 | Gerd Hoffmann | s->io_buffer_size = io->len; |
135 | b8842209 | Gerd Hoffmann | |
136 | c65bcef3 | David Gibson | qemu_sglist_init(&s->sg, io->len / MACIO_PAGE_SIZE + 1, NULL); |
137 | b8842209 | Gerd Hoffmann | qemu_sglist_add(&s->sg, io->addr, io->len); |
138 | b8842209 | Gerd Hoffmann | io->addr += io->len; |
139 | b8842209 | Gerd Hoffmann | io->len = 0;
|
140 | b8842209 | Gerd Hoffmann | |
141 | 4e1e0051 | Christoph Hellwig | switch (s->dma_cmd) {
|
142 | 4e1e0051 | Christoph Hellwig | case IDE_DMA_READ:
|
143 | b8842209 | Gerd Hoffmann | m->aiocb = dma_bdrv_read(s->bs, &s->sg, sector_num, |
144 | b8842209 | Gerd Hoffmann | pmac_ide_transfer_cb, io); |
145 | 4e1e0051 | Christoph Hellwig | break;
|
146 | 4e1e0051 | Christoph Hellwig | case IDE_DMA_WRITE:
|
147 | b8842209 | Gerd Hoffmann | m->aiocb = dma_bdrv_write(s->bs, &s->sg, sector_num, |
148 | b8842209 | Gerd Hoffmann | pmac_ide_transfer_cb, io); |
149 | 4e1e0051 | Christoph Hellwig | break;
|
150 | d353fb72 | Christoph Hellwig | case IDE_DMA_TRIM:
|
151 | d353fb72 | Christoph Hellwig | m->aiocb = dma_bdrv_io(s->bs, &s->sg, sector_num, |
152 | 43cf8ae6 | David Gibson | ide_issue_trim, pmac_ide_transfer_cb, s, |
153 | 43cf8ae6 | David Gibson | DMA_DIRECTION_TO_DEVICE); |
154 | d353fb72 | Christoph Hellwig | break;
|
155 | 4e1e0051 | Christoph Hellwig | } |
156 | a597e79c | Christoph Hellwig | return;
|
157 | b9b2008b | Paolo Bonzini | |
158 | a597e79c | Christoph Hellwig | done:
|
159 | a597e79c | Christoph Hellwig | if (s->dma_cmd == IDE_DMA_READ || s->dma_cmd == IDE_DMA_WRITE) {
|
160 | a597e79c | Christoph Hellwig | bdrv_acct_done(s->bs, &s->acct); |
161 | a597e79c | Christoph Hellwig | } |
162 | a597e79c | Christoph Hellwig | io->dma_end(io); |
163 | b8842209 | Gerd Hoffmann | } |
164 | b8842209 | Gerd Hoffmann | |
165 | b8842209 | Gerd Hoffmann | static void pmac_ide_transfer(DBDMA_io *io) |
166 | b8842209 | Gerd Hoffmann | { |
167 | b8842209 | Gerd Hoffmann | MACIOIDEState *m = io->opaque; |
168 | b8842209 | Gerd Hoffmann | IDEState *s = idebus_active_if(&m->bus); |
169 | b8842209 | Gerd Hoffmann | |
170 | b8842209 | Gerd Hoffmann | s->io_buffer_size = 0;
|
171 | cd8722bb | Markus Armbruster | if (s->drive_kind == IDE_CD) {
|
172 | a597e79c | Christoph Hellwig | bdrv_acct_start(s->bs, &s->acct, io->len, BDRV_ACCT_READ); |
173 | b8842209 | Gerd Hoffmann | pmac_ide_atapi_transfer_cb(io, 0);
|
174 | b8842209 | Gerd Hoffmann | return;
|
175 | b8842209 | Gerd Hoffmann | } |
176 | b8842209 | Gerd Hoffmann | |
177 | a597e79c | Christoph Hellwig | switch (s->dma_cmd) {
|
178 | a597e79c | Christoph Hellwig | case IDE_DMA_READ:
|
179 | a597e79c | Christoph Hellwig | bdrv_acct_start(s->bs, &s->acct, io->len, BDRV_ACCT_READ); |
180 | a597e79c | Christoph Hellwig | break;
|
181 | a597e79c | Christoph Hellwig | case IDE_DMA_WRITE:
|
182 | a597e79c | Christoph Hellwig | bdrv_acct_start(s->bs, &s->acct, io->len, BDRV_ACCT_WRITE); |
183 | a597e79c | Christoph Hellwig | break;
|
184 | a597e79c | Christoph Hellwig | default:
|
185 | a597e79c | Christoph Hellwig | break;
|
186 | a597e79c | Christoph Hellwig | } |
187 | a597e79c | Christoph Hellwig | |
188 | b8842209 | Gerd Hoffmann | pmac_ide_transfer_cb(io, 0);
|
189 | b8842209 | Gerd Hoffmann | } |
190 | b8842209 | Gerd Hoffmann | |
191 | b8842209 | Gerd Hoffmann | static void pmac_ide_flush(DBDMA_io *io) |
192 | b8842209 | Gerd Hoffmann | { |
193 | b8842209 | Gerd Hoffmann | MACIOIDEState *m = io->opaque; |
194 | b8842209 | Gerd Hoffmann | |
195 | 922453bc | Stefan Hajnoczi | if (m->aiocb) {
|
196 | 922453bc | Stefan Hajnoczi | bdrv_drain_all(); |
197 | 922453bc | Stefan Hajnoczi | } |
198 | b8842209 | Gerd Hoffmann | } |
199 | b8842209 | Gerd Hoffmann | |
200 | b8842209 | Gerd Hoffmann | /* PowerMac IDE memory IO */
|
201 | b8842209 | Gerd Hoffmann | static void pmac_ide_writeb (void *opaque, |
202 | c227f099 | Anthony Liguori | target_phys_addr_t addr, uint32_t val) |
203 | b8842209 | Gerd Hoffmann | { |
204 | b8842209 | Gerd Hoffmann | MACIOIDEState *d = opaque; |
205 | b8842209 | Gerd Hoffmann | |
206 | b8842209 | Gerd Hoffmann | addr = (addr & 0xFFF) >> 4; |
207 | b8842209 | Gerd Hoffmann | switch (addr) {
|
208 | b8842209 | Gerd Hoffmann | case 1 ... 7: |
209 | b8842209 | Gerd Hoffmann | ide_ioport_write(&d->bus, addr, val); |
210 | b8842209 | Gerd Hoffmann | break;
|
211 | b8842209 | Gerd Hoffmann | case 8: |
212 | b8842209 | Gerd Hoffmann | case 22: |
213 | b8842209 | Gerd Hoffmann | ide_cmd_write(&d->bus, 0, val);
|
214 | b8842209 | Gerd Hoffmann | break;
|
215 | b8842209 | Gerd Hoffmann | default:
|
216 | b8842209 | Gerd Hoffmann | break;
|
217 | b8842209 | Gerd Hoffmann | } |
218 | b8842209 | Gerd Hoffmann | } |
219 | b8842209 | Gerd Hoffmann | |
220 | c227f099 | Anthony Liguori | static uint32_t pmac_ide_readb (void *opaque,target_phys_addr_t addr) |
221 | b8842209 | Gerd Hoffmann | { |
222 | b8842209 | Gerd Hoffmann | uint8_t retval; |
223 | b8842209 | Gerd Hoffmann | MACIOIDEState *d = opaque; |
224 | b8842209 | Gerd Hoffmann | |
225 | b8842209 | Gerd Hoffmann | addr = (addr & 0xFFF) >> 4; |
226 | b8842209 | Gerd Hoffmann | switch (addr) {
|
227 | b8842209 | Gerd Hoffmann | case 1 ... 7: |
228 | b8842209 | Gerd Hoffmann | retval = ide_ioport_read(&d->bus, addr); |
229 | b8842209 | Gerd Hoffmann | break;
|
230 | b8842209 | Gerd Hoffmann | case 8: |
231 | b8842209 | Gerd Hoffmann | case 22: |
232 | b8842209 | Gerd Hoffmann | retval = ide_status_read(&d->bus, 0);
|
233 | b8842209 | Gerd Hoffmann | break;
|
234 | b8842209 | Gerd Hoffmann | default:
|
235 | b8842209 | Gerd Hoffmann | retval = 0xFF;
|
236 | b8842209 | Gerd Hoffmann | break;
|
237 | b8842209 | Gerd Hoffmann | } |
238 | b8842209 | Gerd Hoffmann | return retval;
|
239 | b8842209 | Gerd Hoffmann | } |
240 | b8842209 | Gerd Hoffmann | |
241 | b8842209 | Gerd Hoffmann | static void pmac_ide_writew (void *opaque, |
242 | c227f099 | Anthony Liguori | target_phys_addr_t addr, uint32_t val) |
243 | b8842209 | Gerd Hoffmann | { |
244 | b8842209 | Gerd Hoffmann | MACIOIDEState *d = opaque; |
245 | b8842209 | Gerd Hoffmann | |
246 | b8842209 | Gerd Hoffmann | addr = (addr & 0xFFF) >> 4; |
247 | b8842209 | Gerd Hoffmann | val = bswap16(val); |
248 | b8842209 | Gerd Hoffmann | if (addr == 0) { |
249 | b8842209 | Gerd Hoffmann | ide_data_writew(&d->bus, 0, val);
|
250 | b8842209 | Gerd Hoffmann | } |
251 | b8842209 | Gerd Hoffmann | } |
252 | b8842209 | Gerd Hoffmann | |
253 | c227f099 | Anthony Liguori | static uint32_t pmac_ide_readw (void *opaque,target_phys_addr_t addr) |
254 | b8842209 | Gerd Hoffmann | { |
255 | b8842209 | Gerd Hoffmann | uint16_t retval; |
256 | b8842209 | Gerd Hoffmann | MACIOIDEState *d = opaque; |
257 | b8842209 | Gerd Hoffmann | |
258 | b8842209 | Gerd Hoffmann | addr = (addr & 0xFFF) >> 4; |
259 | b8842209 | Gerd Hoffmann | if (addr == 0) { |
260 | b8842209 | Gerd Hoffmann | retval = ide_data_readw(&d->bus, 0);
|
261 | b8842209 | Gerd Hoffmann | } else {
|
262 | b8842209 | Gerd Hoffmann | retval = 0xFFFF;
|
263 | b8842209 | Gerd Hoffmann | } |
264 | b8842209 | Gerd Hoffmann | retval = bswap16(retval); |
265 | b8842209 | Gerd Hoffmann | return retval;
|
266 | b8842209 | Gerd Hoffmann | } |
267 | b8842209 | Gerd Hoffmann | |
268 | b8842209 | Gerd Hoffmann | static void pmac_ide_writel (void *opaque, |
269 | c227f099 | Anthony Liguori | target_phys_addr_t addr, uint32_t val) |
270 | b8842209 | Gerd Hoffmann | { |
271 | b8842209 | Gerd Hoffmann | MACIOIDEState *d = opaque; |
272 | b8842209 | Gerd Hoffmann | |
273 | b8842209 | Gerd Hoffmann | addr = (addr & 0xFFF) >> 4; |
274 | b8842209 | Gerd Hoffmann | val = bswap32(val); |
275 | b8842209 | Gerd Hoffmann | if (addr == 0) { |
276 | b8842209 | Gerd Hoffmann | ide_data_writel(&d->bus, 0, val);
|
277 | b8842209 | Gerd Hoffmann | } |
278 | b8842209 | Gerd Hoffmann | } |
279 | b8842209 | Gerd Hoffmann | |
280 | c227f099 | Anthony Liguori | static uint32_t pmac_ide_readl (void *opaque,target_phys_addr_t addr) |
281 | b8842209 | Gerd Hoffmann | { |
282 | b8842209 | Gerd Hoffmann | uint32_t retval; |
283 | b8842209 | Gerd Hoffmann | MACIOIDEState *d = opaque; |
284 | b8842209 | Gerd Hoffmann | |
285 | b8842209 | Gerd Hoffmann | addr = (addr & 0xFFF) >> 4; |
286 | b8842209 | Gerd Hoffmann | if (addr == 0) { |
287 | b8842209 | Gerd Hoffmann | retval = ide_data_readl(&d->bus, 0);
|
288 | b8842209 | Gerd Hoffmann | } else {
|
289 | b8842209 | Gerd Hoffmann | retval = 0xFFFFFFFF;
|
290 | b8842209 | Gerd Hoffmann | } |
291 | b8842209 | Gerd Hoffmann | retval = bswap32(retval); |
292 | b8842209 | Gerd Hoffmann | return retval;
|
293 | b8842209 | Gerd Hoffmann | } |
294 | b8842209 | Gerd Hoffmann | |
295 | a348f108 | Stefan Weil | static const MemoryRegionOps pmac_ide_ops = { |
296 | 23c5e4ca | Avi Kivity | .old_mmio = { |
297 | 23c5e4ca | Avi Kivity | .write = { |
298 | 23c5e4ca | Avi Kivity | pmac_ide_writeb, |
299 | 23c5e4ca | Avi Kivity | pmac_ide_writew, |
300 | 23c5e4ca | Avi Kivity | pmac_ide_writel, |
301 | 23c5e4ca | Avi Kivity | }, |
302 | 23c5e4ca | Avi Kivity | .read = { |
303 | 23c5e4ca | Avi Kivity | pmac_ide_readb, |
304 | 23c5e4ca | Avi Kivity | pmac_ide_readw, |
305 | 23c5e4ca | Avi Kivity | pmac_ide_readl, |
306 | 23c5e4ca | Avi Kivity | }, |
307 | 23c5e4ca | Avi Kivity | }, |
308 | 23c5e4ca | Avi Kivity | .endianness = DEVICE_NATIVE_ENDIAN, |
309 | b8842209 | Gerd Hoffmann | }; |
310 | b8842209 | Gerd Hoffmann | |
311 | 44bfa332 | Juan Quintela | static const VMStateDescription vmstate_pmac = { |
312 | 44bfa332 | Juan Quintela | .name = "ide",
|
313 | 44bfa332 | Juan Quintela | .version_id = 3,
|
314 | 44bfa332 | Juan Quintela | .minimum_version_id = 0,
|
315 | 44bfa332 | Juan Quintela | .minimum_version_id_old = 0,
|
316 | 44bfa332 | Juan Quintela | .fields = (VMStateField []) { |
317 | 44bfa332 | Juan Quintela | VMSTATE_IDE_BUS(bus, MACIOIDEState), |
318 | 44bfa332 | Juan Quintela | VMSTATE_IDE_DRIVES(bus.ifs, MACIOIDEState), |
319 | 44bfa332 | Juan Quintela | VMSTATE_END_OF_LIST() |
320 | b8842209 | Gerd Hoffmann | } |
321 | 44bfa332 | Juan Quintela | }; |
322 | b8842209 | Gerd Hoffmann | |
323 | b8842209 | Gerd Hoffmann | static void pmac_ide_reset(void *opaque) |
324 | b8842209 | Gerd Hoffmann | { |
325 | b8842209 | Gerd Hoffmann | MACIOIDEState *d = opaque; |
326 | b8842209 | Gerd Hoffmann | |
327 | 4a643563 | Blue Swirl | ide_bus_reset(&d->bus); |
328 | b8842209 | Gerd Hoffmann | } |
329 | b8842209 | Gerd Hoffmann | |
330 | b8842209 | Gerd Hoffmann | /* hd_table must contain 4 block drivers */
|
331 | b8842209 | Gerd Hoffmann | /* PowerMac uses memory mapped registers, not I/O. Return the memory
|
332 | b8842209 | Gerd Hoffmann | I/O index to access the ide. */
|
333 | 23c5e4ca | Avi Kivity | MemoryRegion *pmac_ide_init (DriveInfo **hd_table, qemu_irq irq, |
334 | 23c5e4ca | Avi Kivity | void *dbdma, int channel, qemu_irq dma_irq) |
335 | b8842209 | Gerd Hoffmann | { |
336 | b8842209 | Gerd Hoffmann | MACIOIDEState *d; |
337 | b8842209 | Gerd Hoffmann | |
338 | 7267c094 | Anthony Liguori | d = g_malloc0(sizeof(MACIOIDEState));
|
339 | 57234ee4 | Markus Armbruster | ide_init2_with_non_qdev_drives(&d->bus, hd_table[0], hd_table[1], irq); |
340 | b8842209 | Gerd Hoffmann | |
341 | b8842209 | Gerd Hoffmann | if (dbdma)
|
342 | b8842209 | Gerd Hoffmann | DBDMA_register_channel(dbdma, channel, dma_irq, pmac_ide_transfer, pmac_ide_flush, d); |
343 | b8842209 | Gerd Hoffmann | |
344 | 23c5e4ca | Avi Kivity | memory_region_init_io(&d->mem, &pmac_ide_ops, d, "pmac-ide", 0x1000); |
345 | 0be71e32 | Alex Williamson | vmstate_register(NULL, 0, &vmstate_pmac, d); |
346 | b8842209 | Gerd Hoffmann | qemu_register_reset(pmac_ide_reset, d); |
347 | b8842209 | Gerd Hoffmann | |
348 | 23c5e4ca | Avi Kivity | return &d->mem;
|
349 | b8842209 | Gerd Hoffmann | } |