]> git.proxmox.com Git - qemu.git/blame - hw/ide/core.c
vdi: change goto to loop
[qemu.git] / hw / ide / core.c
CommitLineData
5391d806 1/*
38cdea7c 2 * QEMU IDE disk and CD/DVD-ROM Emulator
5fafdf24 3 *
5391d806 4 * Copyright (c) 2003 Fabrice Bellard
201a51fc 5 * Copyright (c) 2006 Openedhand Ltd.
5fafdf24 6 *
5391d806
FB
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal
9 * in the Software without restriction, including without limitation the rights
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 * copies of the Software, and to permit persons to whom the Software is
12 * furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 * THE SOFTWARE.
24 */
59f2a787
GH
25#include <hw/hw.h>
26#include <hw/pc.h>
27#include <hw/pci.h>
4a91d3b3 28#include <hw/isa.h>
c4d74df7 29#include "qemu-error.h"
87ecb68b
PB
30#include "qemu-timer.h"
31#include "sysemu.h"
1fb8648d 32#include "dma.h"
2446333c 33#include "blockdev.h"
59f2a787
GH
34
35#include <hw/ide/internal.h>
e8b54394 36
b93af93d
BW
37/* These values were based on a Seagate ST3500418AS but have been modified
38 to make more sense in QEMU */
39static const int smart_attributes[][12] = {
40 /* id, flags, hflags, val, wrst, raw (6 bytes), threshold */
41 /* raw read error rate*/
42 { 0x01, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06},
43 /* spin up */
44 { 0x03, 0x03, 0x00, 0x64, 0x64, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
45 /* start stop count */
46 { 0x04, 0x02, 0x00, 0x64, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14},
47 /* remapped sectors */
48 { 0x05, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24},
49 /* power on hours */
50 { 0x09, 0x03, 0x00, 0x64, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
51 /* power cycle count */
52 { 0x0c, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
53 /* airflow-temperature-celsius */
54 { 190, 0x03, 0x00, 0x45, 0x45, 0x1f, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x32},
55 /* end of list */
56 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
e8b54394
BW
57};
58
ce4b6522 59static int ide_handle_rw_error(IDEState *s, int error, int op);
40c4ed3f 60static void ide_dummy_transfer_stop(IDEState *s);
98087450 61
5391d806
FB
62static void padstr(char *str, const char *src, int len)
63{
64 int i, v;
65 for(i = 0; i < len; i++) {
66 if (*src)
67 v = *src++;
68 else
69 v = ' ';
69b34976 70 str[i^1] = v;
5391d806
FB
71 }
72}
73
67b915a5
FB
74static void put_le16(uint16_t *p, unsigned int v)
75{
0c4ad8dc 76 *p = cpu_to_le16(v);
67b915a5
FB
77}
78
5391d806
FB
79static void ide_identify(IDEState *s)
80{
81 uint16_t *p;
82 unsigned int oldsize;
d353fb72 83 IDEDevice *dev = s->unit ? s->bus->slave : s->bus->master;
5391d806 84
94458802
FB
85 if (s->identify_set) {
86 memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
87 return;
88 }
89
5391d806
FB
90 memset(s->io_buffer, 0, 512);
91 p = (uint16_t *)s->io_buffer;
67b915a5 92 put_le16(p + 0, 0x0040);
5fafdf24 93 put_le16(p + 1, s->cylinders);
67b915a5
FB
94 put_le16(p + 3, s->heads);
95 put_le16(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */
96 put_le16(p + 5, 512); /* XXX: retired, remove ? */
5fafdf24 97 put_le16(p + 6, s->sectors);
fa879c64 98 padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
67b915a5
FB
99 put_le16(p + 20, 3); /* XXX: retired, remove ? */
100 put_le16(p + 21, 512); /* cache size in sectors */
101 put_le16(p + 22, 4); /* ecc bytes */
47c06340 102 padstr((char *)(p + 23), s->version, 8); /* firmware version */
27e0c9a1 103 padstr((char *)(p + 27), s->drive_model_str, 40); /* model */
3b46e624 104#if MAX_MULT_SECTORS > 1
67b915a5 105 put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
5391d806 106#endif
67b915a5 107 put_le16(p + 48, 1); /* dword I/O */
94458802 108 put_le16(p + 49, (1 << 11) | (1 << 9) | (1 << 8)); /* DMA and LBA supported */
67b915a5
FB
109 put_le16(p + 51, 0x200); /* PIO transfer cycle */
110 put_le16(p + 52, 0x200); /* DMA transfer cycle */
94458802 111 put_le16(p + 53, 1 | (1 << 1) | (1 << 2)); /* words 54-58,64-70,88 are valid */
67b915a5
FB
112 put_le16(p + 54, s->cylinders);
113 put_le16(p + 55, s->heads);
114 put_le16(p + 56, s->sectors);
5391d806 115 oldsize = s->cylinders * s->heads * s->sectors;
67b915a5
FB
116 put_le16(p + 57, oldsize);
117 put_le16(p + 58, oldsize >> 16);
5391d806 118 if (s->mult_sectors)
67b915a5
FB
119 put_le16(p + 59, 0x100 | s->mult_sectors);
120 put_le16(p + 60, s->nb_sectors);
121 put_le16(p + 61, s->nb_sectors >> 16);
d1b5c20d 122 put_le16(p + 62, 0x07); /* single word dma0-2 supported */
94458802 123 put_le16(p + 63, 0x07); /* mdma0-2 supported */
79d1d331 124 put_le16(p + 64, 0x03); /* pio3-4 supported */
94458802
FB
125 put_le16(p + 65, 120);
126 put_le16(p + 66, 120);
127 put_le16(p + 67, 120);
128 put_le16(p + 68, 120);
d353fb72
CH
129 if (dev && dev->conf.discard_granularity) {
130 put_le16(p + 69, (1 << 14)); /* determinate TRIM behavior */
131 }
ccf0fd8b
RE
132
133 if (s->ncq_queues) {
134 put_le16(p + 75, s->ncq_queues - 1);
135 /* NCQ supported */
136 put_le16(p + 76, (1 << 8));
137 }
138
94458802
FB
139 put_le16(p + 80, 0xf0); /* ata3 -> ata6 supported */
140 put_le16(p + 81, 0x16); /* conforms to ata5 */
a58b8d54
CH
141 /* 14=NOP supported, 5=WCACHE supported, 0=SMART supported */
142 put_le16(p + 82, (1 << 14) | (1 << 5) | 1);
c2ff060f
FB
143 /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
144 put_le16(p + 83, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
95ebda85
FB
145 /* 14=set to 1, 8=has WWN, 1=SMART self test, 0=SMART error logging */
146 if (s->wwn) {
147 put_le16(p + 84, (1 << 14) | (1 << 8) | 0);
148 } else {
149 put_le16(p + 84, (1 << 14) | 0);
150 }
e900a7b7
CH
151 /* 14 = NOP supported, 5=WCACHE enabled, 0=SMART feature set enabled */
152 if (bdrv_enable_write_cache(s->bs))
153 put_le16(p + 85, (1 << 14) | (1 << 5) | 1);
154 else
155 put_le16(p + 85, (1 << 14) | 1);
c2ff060f 156 /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
2844bdd9 157 put_le16(p + 86, (1 << 13) | (1 <<12) | (1 << 10));
95ebda85
FB
158 /* 14=set to 1, 8=has WWN, 1=SMART self test, 0=SMART error logging */
159 if (s->wwn) {
160 put_le16(p + 87, (1 << 14) | (1 << 8) | 0);
161 } else {
162 put_le16(p + 87, (1 << 14) | 0);
163 }
94458802
FB
164 put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
165 put_le16(p + 93, 1 | (1 << 14) | 0x2000);
c2ff060f
FB
166 put_le16(p + 100, s->nb_sectors);
167 put_le16(p + 101, s->nb_sectors >> 16);
168 put_le16(p + 102, s->nb_sectors >> 32);
169 put_le16(p + 103, s->nb_sectors >> 48);
d353fb72 170
57dac7ef
MA
171 if (dev && dev->conf.physical_block_size)
172 put_le16(p + 106, 0x6000 | get_physical_block_exp(&dev->conf));
95ebda85
FB
173 if (s->wwn) {
174 /* LE 16-bit words 111-108 contain 64-bit World Wide Name */
175 put_le16(p + 108, s->wwn >> 48);
176 put_le16(p + 109, s->wwn >> 32);
177 put_le16(p + 110, s->wwn >> 16);
178 put_le16(p + 111, s->wwn);
179 }
d353fb72
CH
180 if (dev && dev->conf.discard_granularity) {
181 put_le16(p + 169, 1); /* TRIM support */
182 }
94458802
FB
183
184 memcpy(s->identify_data, p, sizeof(s->identify_data));
185 s->identify_set = 1;
5391d806
FB
186}
187
188static void ide_atapi_identify(IDEState *s)
189{
190 uint16_t *p;
191
94458802
FB
192 if (s->identify_set) {
193 memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
194 return;
195 }
196
5391d806
FB
197 memset(s->io_buffer, 0, 512);
198 p = (uint16_t *)s->io_buffer;
199 /* Removable CDROM, 50us response, 12 byte packets */
67b915a5 200 put_le16(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
fa879c64 201 padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
67b915a5
FB
202 put_le16(p + 20, 3); /* buffer type */
203 put_le16(p + 21, 512); /* cache size in sectors */
204 put_le16(p + 22, 4); /* ecc bytes */
47c06340 205 padstr((char *)(p + 23), s->version, 8); /* firmware version */
27e0c9a1 206 padstr((char *)(p + 27), s->drive_model_str, 40); /* model */
67b915a5 207 put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
8ccad811
FB
208#ifdef USE_DMA_CDROM
209 put_le16(p + 49, 1 << 9 | 1 << 8); /* DMA and LBA supported */
210 put_le16(p + 53, 7); /* words 64-70, 54-58, 88 valid */
d1b5c20d 211 put_le16(p + 62, 7); /* single word dma0-2 supported */
8ccad811 212 put_le16(p + 63, 7); /* mdma0-2 supported */
8ccad811 213#else
67b915a5
FB
214 put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
215 put_le16(p + 53, 3); /* words 64-70, 54-58 valid */
216 put_le16(p + 63, 0x103); /* DMA modes XXX: may be incorrect */
8ccad811 217#endif
79d1d331 218 put_le16(p + 64, 3); /* pio3-4 supported */
67b915a5
FB
219 put_le16(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */
220 put_le16(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */
221 put_le16(p + 67, 0x12c); /* minimum PIO cycle time without flow control */
222 put_le16(p + 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */
94458802 223
67b915a5
FB
224 put_le16(p + 71, 30); /* in ns */
225 put_le16(p + 72, 30); /* in ns */
5391d806 226
1bdaa28d
AG
227 if (s->ncq_queues) {
228 put_le16(p + 75, s->ncq_queues - 1);
229 /* NCQ supported */
230 put_le16(p + 76, (1 << 8));
231 }
232
67b915a5 233 put_le16(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */
8ccad811
FB
234#ifdef USE_DMA_CDROM
235 put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
236#endif
94458802
FB
237 memcpy(s->identify_data, p, sizeof(s->identify_data));
238 s->identify_set = 1;
5391d806
FB
239}
240
201a51fc
AZ
241static void ide_cfata_identify(IDEState *s)
242{
243 uint16_t *p;
244 uint32_t cur_sec;
201a51fc
AZ
245
246 p = (uint16_t *) s->identify_data;
247 if (s->identify_set)
248 goto fill_buffer;
249
250 memset(p, 0, sizeof(s->identify_data));
251
252 cur_sec = s->cylinders * s->heads * s->sectors;
253
254 put_le16(p + 0, 0x848a); /* CF Storage Card signature */
255 put_le16(p + 1, s->cylinders); /* Default cylinders */
256 put_le16(p + 3, s->heads); /* Default heads */
257 put_le16(p + 6, s->sectors); /* Default sectors per track */
258 put_le16(p + 7, s->nb_sectors >> 16); /* Sectors per card */
259 put_le16(p + 8, s->nb_sectors); /* Sectors per card */
fa879c64 260 padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
201a51fc 261 put_le16(p + 22, 0x0004); /* ECC bytes */
47c06340 262 padstr((char *) (p + 23), s->version, 8); /* Firmware Revision */
27e0c9a1 263 padstr((char *) (p + 27), s->drive_model_str, 40);/* Model number */
201a51fc
AZ
264#if MAX_MULT_SECTORS > 1
265 put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
266#else
267 put_le16(p + 47, 0x0000);
268#endif
269 put_le16(p + 49, 0x0f00); /* Capabilities */
270 put_le16(p + 51, 0x0002); /* PIO cycle timing mode */
271 put_le16(p + 52, 0x0001); /* DMA cycle timing mode */
272 put_le16(p + 53, 0x0003); /* Translation params valid */
273 put_le16(p + 54, s->cylinders); /* Current cylinders */
274 put_le16(p + 55, s->heads); /* Current heads */
275 put_le16(p + 56, s->sectors); /* Current sectors */
276 put_le16(p + 57, cur_sec); /* Current capacity */
277 put_le16(p + 58, cur_sec >> 16); /* Current capacity */
278 if (s->mult_sectors) /* Multiple sector setting */
279 put_le16(p + 59, 0x100 | s->mult_sectors);
280 put_le16(p + 60, s->nb_sectors); /* Total LBA sectors */
281 put_le16(p + 61, s->nb_sectors >> 16); /* Total LBA sectors */
282 put_le16(p + 63, 0x0203); /* Multiword DMA capability */
283 put_le16(p + 64, 0x0001); /* Flow Control PIO support */
284 put_le16(p + 65, 0x0096); /* Min. Multiword DMA cycle */
285 put_le16(p + 66, 0x0096); /* Rec. Multiword DMA cycle */
286 put_le16(p + 68, 0x00b4); /* Min. PIO cycle time */
287 put_le16(p + 82, 0x400c); /* Command Set supported */
288 put_le16(p + 83, 0x7068); /* Command Set supported */
289 put_le16(p + 84, 0x4000); /* Features supported */
290 put_le16(p + 85, 0x000c); /* Command Set enabled */
291 put_le16(p + 86, 0x7044); /* Command Set enabled */
292 put_le16(p + 87, 0x4000); /* Features enabled */
293 put_le16(p + 91, 0x4060); /* Current APM level */
294 put_le16(p + 129, 0x0002); /* Current features option */
295 put_le16(p + 130, 0x0005); /* Reassigned sectors */
296 put_le16(p + 131, 0x0001); /* Initial power mode */
297 put_le16(p + 132, 0x0000); /* User signature */
298 put_le16(p + 160, 0x8100); /* Power requirement */
299 put_le16(p + 161, 0x8001); /* CF command set */
300
301 s->identify_set = 1;
302
303fill_buffer:
304 memcpy(s->io_buffer, p, sizeof(s->identify_data));
305}
306
5391d806
FB
307static void ide_set_signature(IDEState *s)
308{
309 s->select &= 0xf0; /* clear head */
310 /* put signature */
311 s->nsector = 1;
312 s->sector = 1;
cd8722bb 313 if (s->drive_kind == IDE_CD) {
5391d806
FB
314 s->lcyl = 0x14;
315 s->hcyl = 0xeb;
316 } else if (s->bs) {
317 s->lcyl = 0;
318 s->hcyl = 0;
319 } else {
320 s->lcyl = 0xff;
321 s->hcyl = 0xff;
322 }
323}
324
d353fb72
CH
325typedef struct TrimAIOCB {
326 BlockDriverAIOCB common;
327 QEMUBH *bh;
328 int ret;
329} TrimAIOCB;
330
331static void trim_aio_cancel(BlockDriverAIOCB *acb)
332{
333 TrimAIOCB *iocb = container_of(acb, TrimAIOCB, common);
334
335 qemu_bh_delete(iocb->bh);
336 iocb->bh = NULL;
337 qemu_aio_release(iocb);
338}
339
340static AIOPool trim_aio_pool = {
341 .aiocb_size = sizeof(TrimAIOCB),
342 .cancel = trim_aio_cancel,
343};
344
345static void ide_trim_bh_cb(void *opaque)
346{
347 TrimAIOCB *iocb = opaque;
348
349 iocb->common.cb(iocb->common.opaque, iocb->ret);
350
351 qemu_bh_delete(iocb->bh);
352 iocb->bh = NULL;
353
354 qemu_aio_release(iocb);
355}
356
357BlockDriverAIOCB *ide_issue_trim(BlockDriverState *bs,
358 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
359 BlockDriverCompletionFunc *cb, void *opaque)
360{
361 TrimAIOCB *iocb;
362 int i, j, ret;
363
364 iocb = qemu_aio_get(&trim_aio_pool, bs, cb, opaque);
365 iocb->bh = qemu_bh_new(ide_trim_bh_cb, iocb);
366 iocb->ret = 0;
367
368 for (j = 0; j < qiov->niov; j++) {
369 uint64_t *buffer = qiov->iov[j].iov_base;
370
371 for (i = 0; i < qiov->iov[j].iov_len / 8; i++) {
372 /* 6-byte LBA + 2-byte range per entry */
373 uint64_t entry = le64_to_cpu(buffer[i]);
374 uint64_t sector = entry & 0x0000ffffffffffffULL;
375 uint16_t count = entry >> 48;
376
377 if (count == 0) {
378 break;
379 }
380
381 ret = bdrv_discard(bs, sector, count);
382 if (!iocb->ret) {
383 iocb->ret = ret;
384 }
385 }
386 }
387
388 qemu_bh_schedule(iocb->bh);
389
390 return &iocb->common;
391}
392
5391d806
FB
393static inline void ide_abort_command(IDEState *s)
394{
395 s->status = READY_STAT | ERR_STAT;
396 s->error = ABRT_ERR;
397}
398
5391d806 399/* prepare data transfer and tell what to do after */
33231e0e
KW
400void ide_transfer_start(IDEState *s, uint8_t *buf, int size,
401 EndTransferFunc *end_transfer_func)
5391d806
FB
402{
403 s->end_transfer_func = end_transfer_func;
404 s->data_ptr = buf;
405 s->data_end = buf + size;
40a6238a 406 if (!(s->status & ERR_STAT)) {
7603d156 407 s->status |= DRQ_STAT;
40a6238a
AG
408 }
409 s->bus->dma->ops->start_transfer(s->bus->dma);
5391d806
FB
410}
411
33231e0e 412void ide_transfer_stop(IDEState *s)
5391d806
FB
413{
414 s->end_transfer_func = ide_transfer_stop;
415 s->data_ptr = s->io_buffer;
416 s->data_end = s->io_buffer;
417 s->status &= ~DRQ_STAT;
418}
419
356721ae 420int64_t ide_get_sector(IDEState *s)
5391d806
FB
421{
422 int64_t sector_num;
423 if (s->select & 0x40) {
424 /* lba */
c2ff060f
FB
425 if (!s->lba48) {
426 sector_num = ((s->select & 0x0f) << 24) | (s->hcyl << 16) |
427 (s->lcyl << 8) | s->sector;
428 } else {
429 sector_num = ((int64_t)s->hob_hcyl << 40) |
430 ((int64_t) s->hob_lcyl << 32) |
431 ((int64_t) s->hob_sector << 24) |
432 ((int64_t) s->hcyl << 16) |
433 ((int64_t) s->lcyl << 8) | s->sector;
434 }
5391d806
FB
435 } else {
436 sector_num = ((s->hcyl << 8) | s->lcyl) * s->heads * s->sectors +
c2ff060f 437 (s->select & 0x0f) * s->sectors + (s->sector - 1);
5391d806
FB
438 }
439 return sector_num;
440}
441
356721ae 442void ide_set_sector(IDEState *s, int64_t sector_num)
5391d806
FB
443{
444 unsigned int cyl, r;
445 if (s->select & 0x40) {
c2ff060f
FB
446 if (!s->lba48) {
447 s->select = (s->select & 0xf0) | (sector_num >> 24);
448 s->hcyl = (sector_num >> 16);
449 s->lcyl = (sector_num >> 8);
450 s->sector = (sector_num);
451 } else {
452 s->sector = sector_num;
453 s->lcyl = sector_num >> 8;
454 s->hcyl = sector_num >> 16;
455 s->hob_sector = sector_num >> 24;
456 s->hob_lcyl = sector_num >> 32;
457 s->hob_hcyl = sector_num >> 40;
458 }
5391d806
FB
459 } else {
460 cyl = sector_num / (s->heads * s->sectors);
461 r = sector_num % (s->heads * s->sectors);
462 s->hcyl = cyl >> 8;
463 s->lcyl = cyl;
1b8eb456 464 s->select = (s->select & 0xf0) | ((r / s->sectors) & 0x0f);
5391d806
FB
465 s->sector = (r % s->sectors) + 1;
466 }
467}
468
e162cfb0
AZ
469static void ide_rw_error(IDEState *s) {
470 ide_abort_command(s);
9cdd03a7 471 ide_set_irq(s->bus);
e162cfb0
AZ
472}
473
40a6238a 474void ide_sector_read(IDEState *s)
5391d806
FB
475{
476 int64_t sector_num;
477 int ret, n;
478
479 s->status = READY_STAT | SEEK_STAT;
a136e5a8 480 s->error = 0; /* not needed by IDE spec, but needed by Windows */
5391d806
FB
481 sector_num = ide_get_sector(s);
482 n = s->nsector;
483 if (n == 0) {
484 /* no more sector to read from disk */
485 ide_transfer_stop(s);
486 } else {
487#if defined(DEBUG_IDE)
18c5f8ea 488 printf("read sector=%" PRId64 "\n", sector_num);
5391d806
FB
489#endif
490 if (n > s->req_nb_sectors)
491 n = s->req_nb_sectors;
a597e79c
CH
492
493 bdrv_acct_start(s->bs, &s->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ);
5391d806 494 ret = bdrv_read(s->bs, sector_num, s->io_buffer, n);
a597e79c 495 bdrv_acct_done(s->bs, &s->acct);
e162cfb0 496 if (ret != 0) {
ce4b6522
KW
497 if (ide_handle_rw_error(s, -ret,
498 BM_STATUS_PIO_RETRY | BM_STATUS_RETRY_READ))
499 {
500 return;
501 }
e162cfb0 502 }
5391d806 503 ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_read);
9cdd03a7 504 ide_set_irq(s->bus);
5391d806
FB
505 ide_set_sector(s, sector_num + n);
506 s->nsector -= n;
507 }
508}
509
b61744b3 510static void dma_buf_commit(IDEState *s)
7aea4412 511{
1fb8648d 512 qemu_sglist_destroy(&s->sg);
7aea4412
AL
513}
514
33231e0e 515void ide_set_inactive(IDEState *s)
8337606d 516{
40a6238a
AG
517 s->bus->dma->aiocb = NULL;
518 s->bus->dma->ops->set_inactive(s->bus->dma);
8337606d
KW
519}
520
356721ae 521void ide_dma_error(IDEState *s)
e162cfb0
AZ
522{
523 ide_transfer_stop(s);
524 s->error = ABRT_ERR;
525 s->status = READY_STAT | ERR_STAT;
40a6238a 526 ide_set_inactive(s);
9cdd03a7 527 ide_set_irq(s->bus);
e162cfb0
AZ
528}
529
ce4b6522 530static int ide_handle_rw_error(IDEState *s, int error, int op)
428c5705 531{
ce4b6522 532 int is_read = (op & BM_STATUS_RETRY_READ);
abd7f68d 533 BlockErrorAction action = bdrv_get_on_error(s->bs, is_read);
428c5705 534
7ad7e3c3 535 if (action == BLOCK_ERR_IGNORE) {
329c0a48 536 bdrv_emit_qmp_error_event(s->bs, BDRV_ACTION_IGNORE, is_read);
428c5705 537 return 0;
7ad7e3c3 538 }
428c5705
AL
539
540 if ((error == ENOSPC && action == BLOCK_ERR_STOP_ENOSPC)
541 || action == BLOCK_ERR_STOP_ANY) {
40a6238a 542 s->bus->dma->ops->set_unit(s->bus->dma, s->unit);
def93791 543 s->bus->error_status = op;
329c0a48 544 bdrv_emit_qmp_error_event(s->bs, BDRV_ACTION_STOP, is_read);
0461d5a6 545 vm_stop(RUN_STATE_IO_ERROR);
50fb1900 546 bdrv_iostatus_set_err(s->bs, error);
428c5705 547 } else {
ce4b6522 548 if (op & BM_STATUS_DMA_RETRY) {
b61744b3 549 dma_buf_commit(s);
428c5705 550 ide_dma_error(s);
7aea4412 551 } else {
428c5705 552 ide_rw_error(s);
7aea4412 553 }
329c0a48 554 bdrv_emit_qmp_error_event(s->bs, BDRV_ACTION_REPORT, is_read);
428c5705
AL
555 }
556
557 return 1;
558}
559
cd369c46 560void ide_dma_cb(void *opaque, int ret)
98087450 561{
40a6238a 562 IDEState *s = opaque;
8ccad811
FB
563 int n;
564 int64_t sector_num;
565
e162cfb0 566 if (ret < 0) {
cd369c46
CH
567 int op = BM_STATUS_DMA_RETRY;
568
4e1e0051 569 if (s->dma_cmd == IDE_DMA_READ)
cd369c46 570 op |= BM_STATUS_RETRY_READ;
d353fb72
CH
571 else if (s->dma_cmd == IDE_DMA_TRIM)
572 op |= BM_STATUS_RETRY_TRIM;
573
cd369c46 574 if (ide_handle_rw_error(s, -ret, op)) {
ce4b6522
KW
575 return;
576 }
e162cfb0
AZ
577 }
578
8ccad811
FB
579 n = s->io_buffer_size >> 9;
580 sector_num = ide_get_sector(s);
581 if (n > 0) {
b61744b3 582 dma_buf_commit(s);
8ccad811
FB
583 sector_num += n;
584 ide_set_sector(s, sector_num);
585 s->nsector -= n;
8ccad811
FB
586 }
587
588 /* end of transfer ? */
589 if (s->nsector == 0) {
98087450 590 s->status = READY_STAT | SEEK_STAT;
9cdd03a7 591 ide_set_irq(s->bus);
cd369c46 592 goto eot;
98087450 593 }
8ccad811
FB
594
595 /* launch next transfer */
596 n = s->nsector;
596bb44d 597 s->io_buffer_index = 0;
8ccad811 598 s->io_buffer_size = n * 512;
4e1e0051 599 if (s->bus->dma->ops->prepare_buf(s->bus->dma, ide_cmd_is_read(s)) == 0) {
69c38b8f
KW
600 /* The PRDs were too short. Reset the Active bit, but don't raise an
601 * interrupt. */
7aea4412 602 goto eot;
69c38b8f 603 }
cd369c46 604
8ccad811 605#ifdef DEBUG_AIO
4e1e0051
CH
606 printf("ide_dma_cb: sector_num=%" PRId64 " n=%d, cmd_cmd=%d\n",
607 sector_num, n, s->dma_cmd);
8ccad811 608#endif
cd369c46 609
4e1e0051
CH
610 switch (s->dma_cmd) {
611 case IDE_DMA_READ:
cd369c46
CH
612 s->bus->dma->aiocb = dma_bdrv_read(s->bs, &s->sg, sector_num,
613 ide_dma_cb, s);
4e1e0051
CH
614 break;
615 case IDE_DMA_WRITE:
cd369c46
CH
616 s->bus->dma->aiocb = dma_bdrv_write(s->bs, &s->sg, sector_num,
617 ide_dma_cb, s);
4e1e0051 618 break;
d353fb72
CH
619 case IDE_DMA_TRIM:
620 s->bus->dma->aiocb = dma_bdrv_io(s->bs, &s->sg, sector_num,
bbca72c6 621 ide_issue_trim, ide_dma_cb, s, true);
d353fb72 622 break;
cd369c46 623 }
cd369c46
CH
624 return;
625
626eot:
a597e79c
CH
627 if (s->dma_cmd == IDE_DMA_READ || s->dma_cmd == IDE_DMA_WRITE) {
628 bdrv_acct_done(s->bs, &s->acct);
629 }
630 ide_set_inactive(s);
98087450
FB
631}
632
4e1e0051 633static void ide_sector_start_dma(IDEState *s, enum ide_dma_cmd dma_cmd)
98087450 634{
8ccad811 635 s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT;
98087450
FB
636 s->io_buffer_index = 0;
637 s->io_buffer_size = 0;
4e1e0051 638 s->dma_cmd = dma_cmd;
a597e79c
CH
639
640 switch (dma_cmd) {
641 case IDE_DMA_READ:
642 bdrv_acct_start(s->bs, &s->acct, s->nsector * BDRV_SECTOR_SIZE,
643 BDRV_ACCT_READ);
644 break;
645 case IDE_DMA_WRITE:
646 bdrv_acct_start(s->bs, &s->acct, s->nsector * BDRV_SECTOR_SIZE,
647 BDRV_ACCT_WRITE);
648 break;
649 default:
650 break;
651 }
652
cd369c46 653 s->bus->dma->ops->start_dma(s->bus->dma, s, ide_dma_cb);
98087450
FB
654}
655
a09db21f
FB
656static void ide_sector_write_timer_cb(void *opaque)
657{
658 IDEState *s = opaque;
9cdd03a7 659 ide_set_irq(s->bus);
a09db21f
FB
660}
661
40a6238a 662void ide_sector_write(IDEState *s)
5391d806
FB
663{
664 int64_t sector_num;
31c2a146 665 int ret, n, n1;
5391d806
FB
666
667 s->status = READY_STAT | SEEK_STAT;
668 sector_num = ide_get_sector(s);
669#if defined(DEBUG_IDE)
18c5f8ea 670 printf("write sector=%" PRId64 "\n", sector_num);
5391d806
FB
671#endif
672 n = s->nsector;
673 if (n > s->req_nb_sectors)
674 n = s->req_nb_sectors;
a597e79c
CH
675
676 bdrv_acct_start(s->bs, &s->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ);
31c2a146 677 ret = bdrv_write(s->bs, sector_num, s->io_buffer, n);
a597e79c 678 bdrv_acct_done(s->bs, &s->acct);
428c5705 679
e162cfb0 680 if (ret != 0) {
ce4b6522 681 if (ide_handle_rw_error(s, -ret, BM_STATUS_PIO_RETRY))
428c5705 682 return;
e162cfb0
AZ
683 }
684
5391d806
FB
685 s->nsector -= n;
686 if (s->nsector == 0) {
292eef5a 687 /* no more sectors to write */
5391d806
FB
688 ide_transfer_stop(s);
689 } else {
690 n1 = s->nsector;
691 if (n1 > s->req_nb_sectors)
692 n1 = s->req_nb_sectors;
693 ide_transfer_start(s, s->io_buffer, 512 * n1, ide_sector_write);
694 }
695 ide_set_sector(s, sector_num + n);
3b46e624 696
31c2a146
TS
697 if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
698 /* It seems there is a bug in the Windows 2000 installer HDD
699 IDE driver which fills the disk with empty logs when the
700 IDE write IRQ comes too early. This hack tries to correct
701 that at the expense of slower write performances. Use this
702 option _only_ to install Windows 2000. You must disable it
703 for normal use. */
f7736b91 704 qemu_mod_timer(s->sector_write_timer,
74475455 705 qemu_get_clock_ns(vm_clock) + (get_ticks_per_sec() / 1000));
f7736b91 706 } else {
9cdd03a7 707 ide_set_irq(s->bus);
31c2a146 708 }
5391d806
FB
709}
710
b0484ae4
CH
711static void ide_flush_cb(void *opaque, int ret)
712{
713 IDEState *s = opaque;
714
e2bcadad
KW
715 if (ret < 0) {
716 /* XXX: What sector number to set here? */
717 if (ide_handle_rw_error(s, -ret, BM_STATUS_RETRY_FLUSH)) {
718 return;
719 }
720 }
b0484ae4 721
a597e79c 722 bdrv_acct_done(s->bs, &s->acct);
b0484ae4
CH
723 s->status = READY_STAT | SEEK_STAT;
724 ide_set_irq(s->bus);
725}
726
40a6238a 727void ide_flush_cache(IDEState *s)
6bcb1a79 728{
b2df7531 729 if (s->bs == NULL) {
6bcb1a79 730 ide_flush_cb(s, 0);
b2df7531
KW
731 return;
732 }
733
a597e79c 734 bdrv_acct_start(s->bs, &s->acct, 0, BDRV_ACCT_FLUSH);
ad54ae80 735 bdrv_aio_flush(s->bs, ide_flush_cb, s);
6bcb1a79
KW
736}
737
201a51fc
AZ
738static void ide_cfata_metadata_inquiry(IDEState *s)
739{
740 uint16_t *p;
741 uint32_t spd;
742
743 p = (uint16_t *) s->io_buffer;
744 memset(p, 0, 0x200);
745 spd = ((s->mdata_size - 1) >> 9) + 1;
746
747 put_le16(p + 0, 0x0001); /* Data format revision */
748 put_le16(p + 1, 0x0000); /* Media property: silicon */
749 put_le16(p + 2, s->media_changed); /* Media status */
750 put_le16(p + 3, s->mdata_size & 0xffff); /* Capacity in bytes (low) */
751 put_le16(p + 4, s->mdata_size >> 16); /* Capacity in bytes (high) */
752 put_le16(p + 5, spd & 0xffff); /* Sectors per device (low) */
753 put_le16(p + 6, spd >> 16); /* Sectors per device (high) */
754}
755
756static void ide_cfata_metadata_read(IDEState *s)
757{
758 uint16_t *p;
759
760 if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
761 s->status = ERR_STAT;
762 s->error = ABRT_ERR;
763 return;
764 }
765
766 p = (uint16_t *) s->io_buffer;
767 memset(p, 0, 0x200);
768
769 put_le16(p + 0, s->media_changed); /* Media status */
770 memcpy(p + 1, s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
771 MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
772 s->nsector << 9), 0x200 - 2));
773}
774
775static void ide_cfata_metadata_write(IDEState *s)
776{
777 if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
778 s->status = ERR_STAT;
779 s->error = ABRT_ERR;
780 return;
781 }
782
783 s->media_changed = 0;
784
785 memcpy(s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
786 s->io_buffer + 2,
787 MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
788 s->nsector << 9), 0x200 - 2));
789}
790
bd491d6a 791/* called when the inserted state of the media has changed */
7d4b4ba5 792static void ide_cd_change_cb(void *opaque, bool load)
bd491d6a
TS
793{
794 IDEState *s = opaque;
96b8f136 795 uint64_t nb_sectors;
bd491d6a 796
25ad22bc 797 s->tray_open = !load;
bd491d6a
TS
798 bdrv_get_geometry(s->bs, &nb_sectors);
799 s->nb_sectors = nb_sectors;
9118e7f0 800
4b9b7092
AS
801 /*
802 * First indicate to the guest that a CD has been removed. That's
803 * done on the next command the guest sends us.
804 *
67cc61e4 805 * Then we set UNIT_ATTENTION, by which the guest will
4b9b7092
AS
806 * detect a new CD in the drive. See ide_atapi_cmd() for details.
807 */
93c8cfd9 808 s->cdrom_changed = 1;
996faf1a 809 s->events.new_media = true;
2df0a3a3
PB
810 s->events.eject_request = false;
811 ide_set_irq(s->bus);
812}
813
814static void ide_cd_eject_request_cb(void *opaque, bool force)
815{
816 IDEState *s = opaque;
817
818 s->events.eject_request = true;
819 if (force) {
820 s->tray_locked = false;
821 }
9cdd03a7 822 ide_set_irq(s->bus);
bd491d6a
TS
823}
824
c2ff060f
FB
825static void ide_cmd_lba48_transform(IDEState *s, int lba48)
826{
827 s->lba48 = lba48;
828
829 /* handle the 'magic' 0 nsector count conversion here. to avoid
830 * fiddling with the rest of the read logic, we just store the
831 * full sector count in ->nsector and ignore ->hob_nsector from now
832 */
833 if (!s->lba48) {
834 if (!s->nsector)
835 s->nsector = 256;
836 } else {
837 if (!s->nsector && !s->hob_nsector)
838 s->nsector = 65536;
839 else {
840 int lo = s->nsector;
841 int hi = s->hob_nsector;
842
843 s->nsector = (hi << 8) | lo;
844 }
845 }
846}
847
bcbdc4d3 848static void ide_clear_hob(IDEBus *bus)
c2ff060f
FB
849{
850 /* any write clears HOB high bit of device control register */
bcbdc4d3
GH
851 bus->ifs[0].select &= ~(1 << 7);
852 bus->ifs[1].select &= ~(1 << 7);
c2ff060f
FB
853}
854
356721ae 855void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
caed8802 856{
bcbdc4d3 857 IDEBus *bus = opaque;
5391d806
FB
858
859#ifdef DEBUG_IDE
860 printf("IDE: write addr=0x%x val=0x%02x\n", addr, val);
861#endif
c2ff060f 862
5391d806 863 addr &= 7;
fcdd25ab
AL
864
865 /* ignore writes to command block while busy with previous command */
bcbdc4d3 866 if (addr != 7 && (idebus_active_if(bus)->status & (BUSY_STAT|DRQ_STAT)))
fcdd25ab
AL
867 return;
868
5391d806
FB
869 switch(addr) {
870 case 0:
871 break;
872 case 1:
bcbdc4d3 873 ide_clear_hob(bus);
c45c3d00 874 /* NOTE: data is written to the two drives */
bcbdc4d3
GH
875 bus->ifs[0].hob_feature = bus->ifs[0].feature;
876 bus->ifs[1].hob_feature = bus->ifs[1].feature;
877 bus->ifs[0].feature = val;
878 bus->ifs[1].feature = val;
5391d806
FB
879 break;
880 case 2:
bcbdc4d3
GH
881 ide_clear_hob(bus);
882 bus->ifs[0].hob_nsector = bus->ifs[0].nsector;
883 bus->ifs[1].hob_nsector = bus->ifs[1].nsector;
884 bus->ifs[0].nsector = val;
885 bus->ifs[1].nsector = val;
5391d806
FB
886 break;
887 case 3:
bcbdc4d3
GH
888 ide_clear_hob(bus);
889 bus->ifs[0].hob_sector = bus->ifs[0].sector;
890 bus->ifs[1].hob_sector = bus->ifs[1].sector;
891 bus->ifs[0].sector = val;
892 bus->ifs[1].sector = val;
5391d806
FB
893 break;
894 case 4:
bcbdc4d3
GH
895 ide_clear_hob(bus);
896 bus->ifs[0].hob_lcyl = bus->ifs[0].lcyl;
897 bus->ifs[1].hob_lcyl = bus->ifs[1].lcyl;
898 bus->ifs[0].lcyl = val;
899 bus->ifs[1].lcyl = val;
5391d806
FB
900 break;
901 case 5:
bcbdc4d3
GH
902 ide_clear_hob(bus);
903 bus->ifs[0].hob_hcyl = bus->ifs[0].hcyl;
904 bus->ifs[1].hob_hcyl = bus->ifs[1].hcyl;
905 bus->ifs[0].hcyl = val;
906 bus->ifs[1].hcyl = val;
5391d806
FB
907 break;
908 case 6:
c2ff060f 909 /* FIXME: HOB readback uses bit 7 */
bcbdc4d3
GH
910 bus->ifs[0].select = (val & ~0x10) | 0xa0;
911 bus->ifs[1].select = (val | 0x10) | 0xa0;
5391d806 912 /* select drive */
bcbdc4d3 913 bus->unit = (val >> 4) & 1;
5391d806
FB
914 break;
915 default:
916 case 7:
917 /* command */
7cff87ff
AG
918 ide_exec_cmd(bus, val);
919 break;
920 }
921}
922
844505b1
MA
923#define HD_OK (1u << IDE_HD)
924#define CD_OK (1u << IDE_CD)
925#define CFA_OK (1u << IDE_CFATA)
926#define HD_CFA_OK (HD_OK | CFA_OK)
927#define ALL_OK (HD_OK | CD_OK | CFA_OK)
928
929/* See ACS-2 T13/2015-D Table B.2 Command codes */
930static const uint8_t ide_cmd_table[0x100] = {
931 /* NOP not implemented, mandatory for CD */
932 [CFA_REQ_EXT_ERROR_CODE] = CFA_OK,
933 [WIN_DSM] = ALL_OK,
934 [WIN_DEVICE_RESET] = CD_OK,
3cfc2269 935 [WIN_RECAL] = HD_CFA_OK,
844505b1
MA
936 [WIN_READ] = ALL_OK,
937 [WIN_READ_ONCE] = ALL_OK,
3cfc2269
MA
938 [WIN_READ_EXT] = HD_CFA_OK,
939 [WIN_READDMA_EXT] = HD_CFA_OK,
940 [WIN_READ_NATIVE_MAX_EXT] = HD_CFA_OK,
941 [WIN_MULTREAD_EXT] = HD_CFA_OK,
942 [WIN_WRITE] = HD_CFA_OK,
943 [WIN_WRITE_ONCE] = HD_CFA_OK,
944 [WIN_WRITE_EXT] = HD_CFA_OK,
945 [WIN_WRITEDMA_EXT] = HD_CFA_OK,
946 [CFA_WRITE_SECT_WO_ERASE] = CFA_OK,
947 [WIN_MULTWRITE_EXT] = HD_CFA_OK,
948 [WIN_WRITE_VERIFY] = HD_CFA_OK,
949 [WIN_VERIFY] = HD_CFA_OK,
950 [WIN_VERIFY_ONCE] = HD_CFA_OK,
951 [WIN_VERIFY_EXT] = HD_CFA_OK,
844505b1
MA
952 [WIN_SEEK] = HD_CFA_OK,
953 [CFA_TRANSLATE_SECTOR] = CFA_OK,
954 [WIN_DIAGNOSE] = ALL_OK,
3cfc2269 955 [WIN_SPECIFY] = HD_CFA_OK,
844505b1
MA
956 [WIN_STANDBYNOW2] = ALL_OK,
957 [WIN_IDLEIMMEDIATE2] = ALL_OK,
958 [WIN_STANDBY2] = ALL_OK,
959 [WIN_SETIDLE2] = ALL_OK,
960 [WIN_CHECKPOWERMODE2] = ALL_OK,
961 [WIN_SLEEPNOW2] = ALL_OK,
962 [WIN_PACKETCMD] = CD_OK,
963 [WIN_PIDENTIFY] = CD_OK,
964 [WIN_SMART] = HD_CFA_OK,
965 [CFA_ACCESS_METADATA_STORAGE] = CFA_OK,
966 [CFA_ERASE_SECTORS] = CFA_OK,
3cfc2269
MA
967 [WIN_MULTREAD] = HD_CFA_OK,
968 [WIN_MULTWRITE] = HD_CFA_OK,
969 [WIN_SETMULT] = HD_CFA_OK,
970 [WIN_READDMA] = HD_CFA_OK,
971 [WIN_READDMA_ONCE] = HD_CFA_OK,
972 [WIN_WRITEDMA] = HD_CFA_OK,
973 [WIN_WRITEDMA_ONCE] = HD_CFA_OK,
974 [CFA_WRITE_MULTI_WO_ERASE] = CFA_OK,
844505b1
MA
975 [WIN_STANDBYNOW1] = ALL_OK,
976 [WIN_IDLEIMMEDIATE] = ALL_OK,
977 [WIN_STANDBY] = ALL_OK,
978 [WIN_SETIDLE1] = ALL_OK,
979 [WIN_CHECKPOWERMODE1] = ALL_OK,
980 [WIN_SLEEPNOW1] = ALL_OK,
981 [WIN_FLUSH_CACHE] = ALL_OK,
3cfc2269 982 [WIN_FLUSH_CACHE_EXT] = HD_CFA_OK,
844505b1
MA
983 [WIN_IDENTIFY] = ALL_OK,
984 [WIN_SETFEATURES] = ALL_OK,
985 [IBM_SENSE_CONDITION] = CFA_OK,
986 [CFA_WEAR_LEVEL] = CFA_OK,
987 [WIN_READ_NATIVE_MAX] = ALL_OK,
988};
989
990static bool ide_cmd_permitted(IDEState *s, uint32_t cmd)
991{
992 return cmd < ARRAY_SIZE(ide_cmd_table)
993 && (ide_cmd_table[cmd] & (1u << s->drive_kind));
994}
7cff87ff
AG
995
996void ide_exec_cmd(IDEBus *bus, uint32_t val)
997{
998 IDEState *s;
999 int n;
1000 int lba48 = 0;
1001
5391d806 1002#if defined(DEBUG_IDE)
6ef2ba5e 1003 printf("ide: CMD=%02x\n", val);
5391d806 1004#endif
6ef2ba5e 1005 s = idebus_active_if(bus);
66a0a2cb 1006 /* ignore commands to non existent slave */
6ef2ba5e
AG
1007 if (s != bus->ifs && !s->bs)
1008 return;
c2ff060f 1009
6ef2ba5e
AG
1010 /* Only DEVICE RESET is allowed while BSY or/and DRQ are set */
1011 if ((s->status & (BUSY_STAT|DRQ_STAT)) && val != WIN_DEVICE_RESET)
1012 return;
fcdd25ab 1013
844505b1
MA
1014 if (!ide_cmd_permitted(s, val)) {
1015 goto abort_cmd;
1016 }
1017
6ef2ba5e 1018 switch(val) {
d353fb72
CH
1019 case WIN_DSM:
1020 switch (s->feature) {
1021 case DSM_TRIM:
1022 if (!s->bs) {
1023 goto abort_cmd;
1024 }
1025 ide_sector_start_dma(s, IDE_DMA_TRIM);
1026 break;
1027 default:
1028 goto abort_cmd;
1029 }
1030 break;
6ef2ba5e
AG
1031 case WIN_IDENTIFY:
1032 if (s->bs && s->drive_kind != IDE_CD) {
1033 if (s->drive_kind != IDE_CFATA)
1034 ide_identify(s);
1035 else
1036 ide_cfata_identify(s);
769bec72 1037 s->status = READY_STAT | SEEK_STAT;
6ef2ba5e
AG
1038 ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1039 } else {
1040 if (s->drive_kind == IDE_CD) {
1041 ide_set_signature(s);
5391d806 1042 }
6ef2ba5e
AG
1043 ide_abort_command(s);
1044 }
1045 ide_set_irq(s->bus);
1046 break;
1047 case WIN_SPECIFY:
1048 case WIN_RECAL:
1049 s->error = 0;
1050 s->status = READY_STAT | SEEK_STAT;
1051 ide_set_irq(s->bus);
1052 break;
1053 case WIN_SETMULT:
1054 if (s->drive_kind == IDE_CFATA && s->nsector == 0) {
1055 /* Disable Read and Write Multiple */
1056 s->mult_sectors = 0;
41a2b959 1057 s->status = READY_STAT | SEEK_STAT;
6ef2ba5e
AG
1058 } else if ((s->nsector & 0xff) != 0 &&
1059 ((s->nsector & 0xff) > MAX_MULT_SECTORS ||
1060 (s->nsector & (s->nsector - 1)) != 0)) {
1061 ide_abort_command(s);
1062 } else {
1063 s->mult_sectors = s->nsector & 0xff;
1064 s->status = READY_STAT | SEEK_STAT;
1065 }
1066 ide_set_irq(s->bus);
1067 break;
1068 case WIN_VERIFY_EXT:
1069 lba48 = 1;
1070 case WIN_VERIFY:
1071 case WIN_VERIFY_ONCE:
1072 /* do sector number check ? */
1073 ide_cmd_lba48_transform(s, lba48);
1074 s->status = READY_STAT | SEEK_STAT;
1075 ide_set_irq(s->bus);
1076 break;
814839c0 1077 case WIN_READ_EXT:
6ef2ba5e
AG
1078 lba48 = 1;
1079 case WIN_READ:
1080 case WIN_READ_ONCE:
3f76a7c3
MA
1081 if (s->drive_kind == IDE_CD) {
1082 ide_set_signature(s); /* odd, but ATA4 8.27.5.2 requires it */
6ef2ba5e 1083 goto abort_cmd;
3f76a7c3 1084 }
d53cdb30
PB
1085 if (!s->bs) {
1086 goto abort_cmd;
1087 }
6ef2ba5e
AG
1088 ide_cmd_lba48_transform(s, lba48);
1089 s->req_nb_sectors = 1;
1090 ide_sector_read(s);
1091 break;
814839c0 1092 case WIN_WRITE_EXT:
6ef2ba5e
AG
1093 lba48 = 1;
1094 case WIN_WRITE:
1095 case WIN_WRITE_ONCE:
1096 case CFA_WRITE_SECT_WO_ERASE:
1097 case WIN_WRITE_VERIFY:
d53cdb30
PB
1098 if (!s->bs) {
1099 goto abort_cmd;
1100 }
6ef2ba5e
AG
1101 ide_cmd_lba48_transform(s, lba48);
1102 s->error = 0;
1103 s->status = SEEK_STAT | READY_STAT;
1104 s->req_nb_sectors = 1;
1105 ide_transfer_start(s, s->io_buffer, 512, ide_sector_write);
1106 s->media_changed = 1;
1107 break;
814839c0 1108 case WIN_MULTREAD_EXT:
6ef2ba5e
AG
1109 lba48 = 1;
1110 case WIN_MULTREAD:
d53cdb30
PB
1111 if (!s->bs) {
1112 goto abort_cmd;
1113 }
1114 if (!s->mult_sectors) {
6ef2ba5e 1115 goto abort_cmd;
d53cdb30 1116 }
6ef2ba5e
AG
1117 ide_cmd_lba48_transform(s, lba48);
1118 s->req_nb_sectors = s->mult_sectors;
1119 ide_sector_read(s);
1120 break;
1121 case WIN_MULTWRITE_EXT:
1122 lba48 = 1;
1123 case WIN_MULTWRITE:
1124 case CFA_WRITE_MULTI_WO_ERASE:
d53cdb30
PB
1125 if (!s->bs) {
1126 goto abort_cmd;
1127 }
1128 if (!s->mult_sectors) {
6ef2ba5e 1129 goto abort_cmd;
d53cdb30 1130 }
6ef2ba5e
AG
1131 ide_cmd_lba48_transform(s, lba48);
1132 s->error = 0;
1133 s->status = SEEK_STAT | READY_STAT;
1134 s->req_nb_sectors = s->mult_sectors;
1135 n = s->nsector;
1136 if (n > s->req_nb_sectors)
1137 n = s->req_nb_sectors;
1138 ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_write);
1139 s->media_changed = 1;
1140 break;
814839c0 1141 case WIN_READDMA_EXT:
6ef2ba5e
AG
1142 lba48 = 1;
1143 case WIN_READDMA:
1144 case WIN_READDMA_ONCE:
d53cdb30 1145 if (!s->bs) {
6ef2ba5e 1146 goto abort_cmd;
d53cdb30 1147 }
6ef2ba5e 1148 ide_cmd_lba48_transform(s, lba48);
4e1e0051 1149 ide_sector_start_dma(s, IDE_DMA_READ);
6ef2ba5e 1150 break;
814839c0 1151 case WIN_WRITEDMA_EXT:
6ef2ba5e
AG
1152 lba48 = 1;
1153 case WIN_WRITEDMA:
1154 case WIN_WRITEDMA_ONCE:
d53cdb30 1155 if (!s->bs) {
6ef2ba5e 1156 goto abort_cmd;
d53cdb30 1157 }
6ef2ba5e 1158 ide_cmd_lba48_transform(s, lba48);
4e1e0051 1159 ide_sector_start_dma(s, IDE_DMA_WRITE);
6ef2ba5e
AG
1160 s->media_changed = 1;
1161 break;
1162 case WIN_READ_NATIVE_MAX_EXT:
1163 lba48 = 1;
1164 case WIN_READ_NATIVE_MAX:
1165 ide_cmd_lba48_transform(s, lba48);
1166 ide_set_sector(s, s->nb_sectors - 1);
1167 s->status = READY_STAT | SEEK_STAT;
1168 ide_set_irq(s->bus);
1169 break;
1170 case WIN_CHECKPOWERMODE1:
1171 case WIN_CHECKPOWERMODE2:
b93af93d 1172 s->error = 0;
6ef2ba5e
AG
1173 s->nsector = 0xff; /* device active or idle */
1174 s->status = READY_STAT | SEEK_STAT;
1175 ide_set_irq(s->bus);
1176 break;
1177 case WIN_SETFEATURES:
1178 if (!s->bs)
1179 goto abort_cmd;
1180 /* XXX: valid for CDROM ? */
1181 switch(s->feature) {
1182 case 0xcc: /* reverting to power-on defaults enable */
1183 case 0x66: /* reverting to power-on defaults disable */
1184 case 0x02: /* write cache enable */
1185 case 0x82: /* write cache disable */
1186 case 0xaa: /* read look-ahead enable */
1187 case 0x55: /* read look-ahead disable */
1188 case 0x05: /* set advanced power management mode */
1189 case 0x85: /* disable advanced power management mode */
1190 case 0x69: /* NOP */
1191 case 0x67: /* NOP */
1192 case 0x96: /* NOP */
1193 case 0x9a: /* NOP */
1194 case 0x42: /* enable Automatic Acoustic Mode */
1195 case 0xc2: /* disable Automatic Acoustic Mode */
41a2b959 1196 s->status = READY_STAT | SEEK_STAT;
9cdd03a7 1197 ide_set_irq(s->bus);
a136e5a8 1198 break;
6ef2ba5e 1199 case 0x03: { /* set transfer mode */
94458802 1200 uint8_t val = s->nsector & 0x07;
6ef2ba5e 1201 uint16_t *identify_data = (uint16_t *)s->identify_data;
94458802
FB
1202
1203 switch (s->nsector >> 3) {
6ef2ba5e
AG
1204 case 0x00: /* pio default */
1205 case 0x01: /* pio mode */
96c35ceb
JQ
1206 put_le16(identify_data + 62,0x07);
1207 put_le16(identify_data + 63,0x07);
1208 put_le16(identify_data + 88,0x3f);
d1b5c20d 1209 break;
6ef2ba5e 1210 case 0x02: /* sigle word dma mode*/
96c35ceb
JQ
1211 put_le16(identify_data + 62,0x07 | (1 << (val + 8)));
1212 put_le16(identify_data + 63,0x07);
1213 put_le16(identify_data + 88,0x3f);
94458802 1214 break;
6ef2ba5e 1215 case 0x04: /* mdma mode */
96c35ceb
JQ
1216 put_le16(identify_data + 62,0x07);
1217 put_le16(identify_data + 63,0x07 | (1 << (val + 8)));
1218 put_le16(identify_data + 88,0x3f);
94458802 1219 break;
6ef2ba5e 1220 case 0x08: /* udma mode */
96c35ceb
JQ
1221 put_le16(identify_data + 62,0x07);
1222 put_le16(identify_data + 63,0x07);
1223 put_le16(identify_data + 88,0x3f | (1 << (val + 8)));
94458802 1224 break;
6ef2ba5e 1225 default:
94458802
FB
1226 goto abort_cmd;
1227 }
4fbfcd6d 1228 s->status = READY_STAT | SEEK_STAT;
9cdd03a7 1229 ide_set_irq(s->bus);
4fbfcd6d 1230 break;
6ef2ba5e
AG
1231 }
1232 default:
1233 goto abort_cmd;
1234 }
1235 break;
1236 case WIN_FLUSH_CACHE:
1237 case WIN_FLUSH_CACHE_EXT:
1238 ide_flush_cache(s);
1239 break;
1240 case WIN_STANDBY:
1241 case WIN_STANDBY2:
1242 case WIN_STANDBYNOW1:
1243 case WIN_STANDBYNOW2:
1244 case WIN_IDLEIMMEDIATE:
1d4316d3 1245 case WIN_IDLEIMMEDIATE2:
6ef2ba5e
AG
1246 case WIN_SETIDLE1:
1247 case WIN_SETIDLE2:
1248 case WIN_SLEEPNOW1:
1249 case WIN_SLEEPNOW2:
1250 s->status = READY_STAT;
1251 ide_set_irq(s->bus);
1252 break;
1253 case WIN_SEEK:
6ef2ba5e
AG
1254 /* XXX: Check that seek is within bounds */
1255 s->status = READY_STAT | SEEK_STAT;
1256 ide_set_irq(s->bus);
1257 break;
1258 /* ATAPI commands */
1259 case WIN_PIDENTIFY:
844505b1
MA
1260 ide_atapi_identify(s);
1261 s->status = READY_STAT | SEEK_STAT;
1262 ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
6ef2ba5e
AG
1263 ide_set_irq(s->bus);
1264 break;
1265 case WIN_DIAGNOSE:
1266 ide_set_signature(s);
1267 if (s->drive_kind == IDE_CD)
1268 s->status = 0; /* ATAPI spec (v6) section 9.10 defines packet
1269 * devices to return a clear status register
1270 * with READY_STAT *not* set. */
1271 else
41a2b959 1272 s->status = READY_STAT | SEEK_STAT;
6ef2ba5e
AG
1273 s->error = 0x01; /* Device 0 passed, Device 1 passed or not
1274 * present.
1275 */
1276 ide_set_irq(s->bus);
1277 break;
1d4316d3 1278 case WIN_DEVICE_RESET:
6ef2ba5e
AG
1279 ide_set_signature(s);
1280 s->status = 0x00; /* NOTE: READY is _not_ set */
1281 s->error = 0x01;
1282 break;
1283 case WIN_PACKETCMD:
6ef2ba5e
AG
1284 /* overlapping commands not supported */
1285 if (s->feature & 0x02)
1286 goto abort_cmd;
1287 s->status = READY_STAT | SEEK_STAT;
1288 s->atapi_dma = s->feature & 1;
1289 s->nsector = 1;
1290 ide_transfer_start(s, s->io_buffer, ATAPI_PACKET_SIZE,
1291 ide_atapi_cmd);
1292 break;
1293 /* CF-ATA commands */
1294 case CFA_REQ_EXT_ERROR_CODE:
6ef2ba5e
AG
1295 s->error = 0x09; /* miscellaneous error */
1296 s->status = READY_STAT | SEEK_STAT;
1297 ide_set_irq(s->bus);
1298 break;
1299 case CFA_ERASE_SECTORS:
1300 case CFA_WEAR_LEVEL:
6ef2ba5e
AG
1301 if (val == CFA_WEAR_LEVEL)
1302 s->nsector = 0;
1303 if (val == CFA_ERASE_SECTORS)
1304 s->media_changed = 1;
1305 s->error = 0x00;
1306 s->status = READY_STAT | SEEK_STAT;
1307 ide_set_irq(s->bus);
1308 break;
1309 case CFA_TRANSLATE_SECTOR:
6ef2ba5e
AG
1310 s->error = 0x00;
1311 s->status = READY_STAT | SEEK_STAT;
1312 memset(s->io_buffer, 0, 0x200);
1313 s->io_buffer[0x00] = s->hcyl; /* Cyl MSB */
1314 s->io_buffer[0x01] = s->lcyl; /* Cyl LSB */
1315 s->io_buffer[0x02] = s->select; /* Head */
1316 s->io_buffer[0x03] = s->sector; /* Sector */
1317 s->io_buffer[0x04] = ide_get_sector(s) >> 16; /* LBA MSB */
1318 s->io_buffer[0x05] = ide_get_sector(s) >> 8; /* LBA */
1319 s->io_buffer[0x06] = ide_get_sector(s) >> 0; /* LBA LSB */
1320 s->io_buffer[0x13] = 0x00; /* Erase flag */
1321 s->io_buffer[0x18] = 0x00; /* Hot count */
1322 s->io_buffer[0x19] = 0x00; /* Hot count */
1323 s->io_buffer[0x1a] = 0x01; /* Hot count */
1324 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1325 ide_set_irq(s->bus);
1326 break;
1327 case CFA_ACCESS_METADATA_STORAGE:
6ef2ba5e
AG
1328 switch (s->feature) {
1329 case 0x02: /* Inquiry Metadata Storage */
1330 ide_cfata_metadata_inquiry(s);
201a51fc 1331 break;
6ef2ba5e
AG
1332 case 0x03: /* Read Metadata Storage */
1333 ide_cfata_metadata_read(s);
201a51fc 1334 break;
6ef2ba5e
AG
1335 case 0x04: /* Write Metadata Storage */
1336 ide_cfata_metadata_write(s);
201a51fc 1337 break;
6ef2ba5e
AG
1338 default:
1339 goto abort_cmd;
1340 }
1341 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1342 s->status = 0x00; /* NOTE: READY is _not_ set */
1343 ide_set_irq(s->bus);
1344 break;
1345 case IBM_SENSE_CONDITION:
6ef2ba5e
AG
1346 switch (s->feature) {
1347 case 0x01: /* sense temperature in device */
1348 s->nsector = 0x50; /* +20 C */
201a51fc 1349 break;
6ef2ba5e
AG
1350 default:
1351 goto abort_cmd;
1352 }
1353 s->status = READY_STAT | SEEK_STAT;
1354 ide_set_irq(s->bus);
1355 break;
e8b54394 1356
814839c0 1357 case WIN_SMART:
6ef2ba5e 1358 if (s->hcyl != 0xc2 || s->lcyl != 0x4f)
e8b54394 1359 goto abort_cmd;
6ef2ba5e 1360 if (!s->smart_enabled && s->feature != SMART_ENABLE)
e8b54394 1361 goto abort_cmd;
6ef2ba5e
AG
1362 switch (s->feature) {
1363 case SMART_DISABLE:
e8b54394
BW
1364 s->smart_enabled = 0;
1365 s->status = READY_STAT | SEEK_STAT;
9cdd03a7 1366 ide_set_irq(s->bus);
e8b54394 1367 break;
6ef2ba5e 1368 case SMART_ENABLE:
e8b54394
BW
1369 s->smart_enabled = 1;
1370 s->status = READY_STAT | SEEK_STAT;
9cdd03a7 1371 ide_set_irq(s->bus);
e8b54394 1372 break;
6ef2ba5e 1373 case SMART_ATTR_AUTOSAVE:
e8b54394
BW
1374 switch (s->sector) {
1375 case 0x00:
6ef2ba5e
AG
1376 s->smart_autosave = 0;
1377 break;
e8b54394 1378 case 0xf1:
6ef2ba5e
AG
1379 s->smart_autosave = 1;
1380 break;
e8b54394 1381 default:
6ef2ba5e 1382 goto abort_cmd;
e8b54394
BW
1383 }
1384 s->status = READY_STAT | SEEK_STAT;
9cdd03a7 1385 ide_set_irq(s->bus);
e8b54394 1386 break;
6ef2ba5e 1387 case SMART_STATUS:
e8b54394 1388 if (!s->smart_errors) {
6ef2ba5e
AG
1389 s->hcyl = 0xc2;
1390 s->lcyl = 0x4f;
e8b54394 1391 } else {
6ef2ba5e
AG
1392 s->hcyl = 0x2c;
1393 s->lcyl = 0xf4;
e8b54394
BW
1394 }
1395 s->status = READY_STAT | SEEK_STAT;
9cdd03a7 1396 ide_set_irq(s->bus);
e8b54394 1397 break;
6ef2ba5e 1398 case SMART_READ_THRESH:
e8b54394
BW
1399 memset(s->io_buffer, 0, 0x200);
1400 s->io_buffer[0] = 0x01; /* smart struct version */
1401 for (n=0; n<30; n++) {
6ef2ba5e 1402 if (smart_attributes[n][0] == 0)
e8b54394 1403 break;
6ef2ba5e 1404 s->io_buffer[2+0+(n*12)] = smart_attributes[n][0];
b93af93d 1405 s->io_buffer[2+1+(n*12)] = smart_attributes[n][11];
e8b54394
BW
1406 }
1407 for (n=0; n<511; n++) /* checksum */
6ef2ba5e 1408 s->io_buffer[511] += s->io_buffer[n];
e8b54394
BW
1409 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1410 s->status = READY_STAT | SEEK_STAT;
1411 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
9cdd03a7 1412 ide_set_irq(s->bus);
e8b54394 1413 break;
6ef2ba5e 1414 case SMART_READ_DATA:
e8b54394
BW
1415 memset(s->io_buffer, 0, 0x200);
1416 s->io_buffer[0] = 0x01; /* smart struct version */
1417 for (n=0; n<30; n++) {
b93af93d 1418 if (smart_attributes[n][0] == 0) {
e8b54394 1419 break;
b93af93d
BW
1420 }
1421 int i;
1422 for(i = 0; i < 11; i++) {
1423 s->io_buffer[2+i+(n*12)] = smart_attributes[n][i];
1424 }
e8b54394
BW
1425 }
1426 s->io_buffer[362] = 0x02 | (s->smart_autosave?0x80:0x00);
1427 if (s->smart_selftest_count == 0) {
6ef2ba5e 1428 s->io_buffer[363] = 0;
e8b54394 1429 } else {
6ef2ba5e 1430 s->io_buffer[363] =
e8b54394 1431 s->smart_selftest_data[3 +
6ef2ba5e
AG
1432 (s->smart_selftest_count - 1) *
1433 24];
e8b54394
BW
1434 }
1435 s->io_buffer[364] = 0x20;
1436 s->io_buffer[365] = 0x01;
1437 /* offline data collection capacity: execute + self-test*/
1438 s->io_buffer[367] = (1<<4 | 1<<3 | 1);
1439 s->io_buffer[368] = 0x03; /* smart capability (1) */
1440 s->io_buffer[369] = 0x00; /* smart capability (2) */
1441 s->io_buffer[370] = 0x01; /* error logging supported */
1442 s->io_buffer[372] = 0x02; /* minutes for poll short test */
1443 s->io_buffer[373] = 0x36; /* minutes for poll ext test */
1444 s->io_buffer[374] = 0x01; /* minutes for poll conveyance */
1445
1446 for (n=0; n<511; n++)
6ef2ba5e 1447 s->io_buffer[511] += s->io_buffer[n];
e8b54394
BW
1448 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1449 s->status = READY_STAT | SEEK_STAT;
1450 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
9cdd03a7 1451 ide_set_irq(s->bus);
e8b54394 1452 break;
6ef2ba5e 1453 case SMART_READ_LOG:
e8b54394
BW
1454 switch (s->sector) {
1455 case 0x01: /* summary smart error log */
6ef2ba5e
AG
1456 memset(s->io_buffer, 0, 0x200);
1457 s->io_buffer[0] = 0x01;
1458 s->io_buffer[1] = 0x00; /* no error entries */
1459 s->io_buffer[452] = s->smart_errors & 0xff;
1460 s->io_buffer[453] = (s->smart_errors & 0xff00) >> 8;
e8b54394 1461
6ef2ba5e 1462 for (n=0; n<511; n++)
e8b54394 1463 s->io_buffer[511] += s->io_buffer[n];
6ef2ba5e
AG
1464 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1465 break;
e8b54394 1466 case 0x06: /* smart self test log */
6ef2ba5e
AG
1467 memset(s->io_buffer, 0, 0x200);
1468 s->io_buffer[0] = 0x01;
1469 if (s->smart_selftest_count == 0) {
e8b54394 1470 s->io_buffer[508] = 0;
6ef2ba5e 1471 } else {
e8b54394
BW
1472 s->io_buffer[508] = s->smart_selftest_count;
1473 for (n=2; n<506; n++)
6ef2ba5e
AG
1474 s->io_buffer[n] = s->smart_selftest_data[n];
1475 }
1476 for (n=0; n<511; n++)
e8b54394 1477 s->io_buffer[511] += s->io_buffer[n];
6ef2ba5e
AG
1478 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1479 break;
e8b54394 1480 default:
6ef2ba5e 1481 goto abort_cmd;
e8b54394
BW
1482 }
1483 s->status = READY_STAT | SEEK_STAT;
1484 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
9cdd03a7 1485 ide_set_irq(s->bus);
e8b54394 1486 break;
6ef2ba5e 1487 case SMART_EXECUTE_OFFLINE:
e8b54394
BW
1488 switch (s->sector) {
1489 case 0: /* off-line routine */
1490 case 1: /* short self test */
1491 case 2: /* extended self test */
6ef2ba5e
AG
1492 s->smart_selftest_count++;
1493 if(s->smart_selftest_count > 21)
e8b54394 1494 s->smart_selftest_count = 0;
6ef2ba5e
AG
1495 n = 2 + (s->smart_selftest_count - 1) * 24;
1496 s->smart_selftest_data[n] = s->sector;
1497 s->smart_selftest_data[n+1] = 0x00; /* OK and finished */
1498 s->smart_selftest_data[n+2] = 0x34; /* hour count lsb */
1499 s->smart_selftest_data[n+3] = 0x12; /* hour count msb */
1500 s->status = READY_STAT | SEEK_STAT;
1501 ide_set_irq(s->bus);
1502 break;
e8b54394 1503 default:
6ef2ba5e 1504 goto abort_cmd;
e8b54394
BW
1505 }
1506 break;
6ef2ba5e 1507 default:
e8b54394 1508 goto abort_cmd;
6ef2ba5e
AG
1509 }
1510 break;
1511 default:
844505b1 1512 /* should not be reachable */
6ef2ba5e
AG
1513 abort_cmd:
1514 ide_abort_command(s);
1515 ide_set_irq(s->bus);
1516 break;
1517 }
5391d806
FB
1518}
1519
356721ae 1520uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
5391d806 1521{
bcbdc4d3
GH
1522 IDEBus *bus = opaque;
1523 IDEState *s = idebus_active_if(bus);
5391d806 1524 uint32_t addr;
c2ff060f 1525 int ret, hob;
5391d806
FB
1526
1527 addr = addr1 & 7;
c2ff060f
FB
1528 /* FIXME: HOB readback uses bit 7, but it's always set right now */
1529 //hob = s->select & (1 << 7);
1530 hob = 0;
5391d806
FB
1531 switch(addr) {
1532 case 0:
1533 ret = 0xff;
1534 break;
1535 case 1:
bcbdc4d3
GH
1536 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1537 (s != bus->ifs && !s->bs))
c45c3d00 1538 ret = 0;
c2ff060f 1539 else if (!hob)
c45c3d00 1540 ret = s->error;
c2ff060f
FB
1541 else
1542 ret = s->hob_feature;
5391d806
FB
1543 break;
1544 case 2:
bcbdc4d3 1545 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
c45c3d00 1546 ret = 0;
c2ff060f 1547 else if (!hob)
c45c3d00 1548 ret = s->nsector & 0xff;
c2ff060f
FB
1549 else
1550 ret = s->hob_nsector;
5391d806
FB
1551 break;
1552 case 3:
bcbdc4d3 1553 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
c45c3d00 1554 ret = 0;
c2ff060f 1555 else if (!hob)
c45c3d00 1556 ret = s->sector;
c2ff060f
FB
1557 else
1558 ret = s->hob_sector;
5391d806
FB
1559 break;
1560 case 4:
bcbdc4d3 1561 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
c45c3d00 1562 ret = 0;
c2ff060f 1563 else if (!hob)
c45c3d00 1564 ret = s->lcyl;
c2ff060f
FB
1565 else
1566 ret = s->hob_lcyl;
5391d806
FB
1567 break;
1568 case 5:
bcbdc4d3 1569 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
c45c3d00 1570 ret = 0;
c2ff060f 1571 else if (!hob)
c45c3d00 1572 ret = s->hcyl;
c2ff060f
FB
1573 else
1574 ret = s->hob_hcyl;
5391d806
FB
1575 break;
1576 case 6:
bcbdc4d3 1577 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
c45c3d00
FB
1578 ret = 0;
1579 else
7ae98627 1580 ret = s->select;
5391d806
FB
1581 break;
1582 default:
1583 case 7:
bcbdc4d3
GH
1584 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1585 (s != bus->ifs && !s->bs))
c45c3d00
FB
1586 ret = 0;
1587 else
1588 ret = s->status;
9cdd03a7 1589 qemu_irq_lower(bus->irq);
5391d806
FB
1590 break;
1591 }
1592#ifdef DEBUG_IDE
1593 printf("ide: read addr=0x%x val=%02x\n", addr1, ret);
1594#endif
1595 return ret;
1596}
1597
356721ae 1598uint32_t ide_status_read(void *opaque, uint32_t addr)
5391d806 1599{
bcbdc4d3
GH
1600 IDEBus *bus = opaque;
1601 IDEState *s = idebus_active_if(bus);
5391d806 1602 int ret;
7ae98627 1603
bcbdc4d3
GH
1604 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1605 (s != bus->ifs && !s->bs))
7ae98627
FB
1606 ret = 0;
1607 else
1608 ret = s->status;
5391d806
FB
1609#ifdef DEBUG_IDE
1610 printf("ide: read status addr=0x%x val=%02x\n", addr, ret);
1611#endif
1612 return ret;
1613}
1614
356721ae 1615void ide_cmd_write(void *opaque, uint32_t addr, uint32_t val)
5391d806 1616{
bcbdc4d3 1617 IDEBus *bus = opaque;
5391d806
FB
1618 IDEState *s;
1619 int i;
1620
1621#ifdef DEBUG_IDE
1622 printf("ide: write control addr=0x%x val=%02x\n", addr, val);
1623#endif
1624 /* common for both drives */
9cdd03a7 1625 if (!(bus->cmd & IDE_CMD_RESET) &&
5391d806
FB
1626 (val & IDE_CMD_RESET)) {
1627 /* reset low to high */
1628 for(i = 0;i < 2; i++) {
bcbdc4d3 1629 s = &bus->ifs[i];
5391d806
FB
1630 s->status = BUSY_STAT | SEEK_STAT;
1631 s->error = 0x01;
1632 }
9cdd03a7 1633 } else if ((bus->cmd & IDE_CMD_RESET) &&
5391d806
FB
1634 !(val & IDE_CMD_RESET)) {
1635 /* high to low */
1636 for(i = 0;i < 2; i++) {
bcbdc4d3 1637 s = &bus->ifs[i];
cd8722bb 1638 if (s->drive_kind == IDE_CD)
6b136f9e
FB
1639 s->status = 0x00; /* NOTE: READY is _not_ set */
1640 else
56bf1d37 1641 s->status = READY_STAT | SEEK_STAT;
5391d806
FB
1642 ide_set_signature(s);
1643 }
1644 }
1645
9cdd03a7 1646 bus->cmd = val;
5391d806
FB
1647}
1648
40c4ed3f
KW
1649/*
1650 * Returns true if the running PIO transfer is a PIO out (i.e. data is
1651 * transferred from the device to the guest), false if it's a PIO in
1652 */
1653static bool ide_is_pio_out(IDEState *s)
1654{
1655 if (s->end_transfer_func == ide_sector_write ||
1656 s->end_transfer_func == ide_atapi_cmd) {
1657 return false;
1658 } else if (s->end_transfer_func == ide_sector_read ||
1659 s->end_transfer_func == ide_transfer_stop ||
1660 s->end_transfer_func == ide_atapi_cmd_reply_end ||
1661 s->end_transfer_func == ide_dummy_transfer_stop) {
1662 return true;
1663 }
1664
1665 abort();
1666}
1667
356721ae 1668void ide_data_writew(void *opaque, uint32_t addr, uint32_t val)
5391d806 1669{
bcbdc4d3
GH
1670 IDEBus *bus = opaque;
1671 IDEState *s = idebus_active_if(bus);
5391d806
FB
1672 uint8_t *p;
1673
40c4ed3f
KW
1674 /* PIO data access allowed only when DRQ bit is set. The result of a write
1675 * during PIO out is indeterminate, just ignore it. */
1676 if (!(s->status & DRQ_STAT) || ide_is_pio_out(s)) {
fcdd25ab 1677 return;
40c4ed3f 1678 }
fcdd25ab 1679
5391d806 1680 p = s->data_ptr;
0c4ad8dc 1681 *(uint16_t *)p = le16_to_cpu(val);
5391d806
FB
1682 p += 2;
1683 s->data_ptr = p;
1684 if (p >= s->data_end)
1685 s->end_transfer_func(s);
1686}
1687
356721ae 1688uint32_t ide_data_readw(void *opaque, uint32_t addr)
5391d806 1689{
bcbdc4d3
GH
1690 IDEBus *bus = opaque;
1691 IDEState *s = idebus_active_if(bus);
5391d806
FB
1692 uint8_t *p;
1693 int ret;
fcdd25ab 1694
40c4ed3f
KW
1695 /* PIO data access allowed only when DRQ bit is set. The result of a read
1696 * during PIO in is indeterminate, return 0 and don't move forward. */
1697 if (!(s->status & DRQ_STAT) || !ide_is_pio_out(s)) {
fcdd25ab 1698 return 0;
40c4ed3f 1699 }
fcdd25ab 1700
5391d806 1701 p = s->data_ptr;
0c4ad8dc 1702 ret = cpu_to_le16(*(uint16_t *)p);
5391d806
FB
1703 p += 2;
1704 s->data_ptr = p;
1705 if (p >= s->data_end)
1706 s->end_transfer_func(s);
1707 return ret;
1708}
1709
356721ae 1710void ide_data_writel(void *opaque, uint32_t addr, uint32_t val)
5391d806 1711{
bcbdc4d3
GH
1712 IDEBus *bus = opaque;
1713 IDEState *s = idebus_active_if(bus);
5391d806
FB
1714 uint8_t *p;
1715
40c4ed3f
KW
1716 /* PIO data access allowed only when DRQ bit is set. The result of a write
1717 * during PIO out is indeterminate, just ignore it. */
1718 if (!(s->status & DRQ_STAT) || ide_is_pio_out(s)) {
fcdd25ab 1719 return;
40c4ed3f 1720 }
fcdd25ab 1721
5391d806 1722 p = s->data_ptr;
0c4ad8dc 1723 *(uint32_t *)p = le32_to_cpu(val);
5391d806
FB
1724 p += 4;
1725 s->data_ptr = p;
1726 if (p >= s->data_end)
1727 s->end_transfer_func(s);
1728}
1729
356721ae 1730uint32_t ide_data_readl(void *opaque, uint32_t addr)
5391d806 1731{
bcbdc4d3
GH
1732 IDEBus *bus = opaque;
1733 IDEState *s = idebus_active_if(bus);
5391d806
FB
1734 uint8_t *p;
1735 int ret;
3b46e624 1736
40c4ed3f
KW
1737 /* PIO data access allowed only when DRQ bit is set. The result of a read
1738 * during PIO in is indeterminate, return 0 and don't move forward. */
1739 if (!(s->status & DRQ_STAT) || !ide_is_pio_out(s)) {
fcdd25ab 1740 return 0;
40c4ed3f 1741 }
fcdd25ab 1742
5391d806 1743 p = s->data_ptr;
0c4ad8dc 1744 ret = cpu_to_le32(*(uint32_t *)p);
5391d806
FB
1745 p += 4;
1746 s->data_ptr = p;
1747 if (p >= s->data_end)
1748 s->end_transfer_func(s);
1749 return ret;
1750}
1751
a7dfe172
FB
1752static void ide_dummy_transfer_stop(IDEState *s)
1753{
1754 s->data_ptr = s->io_buffer;
1755 s->data_end = s->io_buffer;
1756 s->io_buffer[0] = 0xff;
1757 s->io_buffer[1] = 0xff;
1758 s->io_buffer[2] = 0xff;
1759 s->io_buffer[3] = 0xff;
1760}
1761
4a643563 1762static void ide_reset(IDEState *s)
5391d806 1763{
4a643563
BS
1764#ifdef DEBUG_IDE
1765 printf("ide: reset\n");
1766#endif
cd8722bb 1767 if (s->drive_kind == IDE_CFATA)
201a51fc
AZ
1768 s->mult_sectors = 0;
1769 else
1770 s->mult_sectors = MAX_MULT_SECTORS;
4a643563
BS
1771 /* ide regs */
1772 s->feature = 0;
1773 s->error = 0;
1774 s->nsector = 0;
1775 s->sector = 0;
1776 s->lcyl = 0;
1777 s->hcyl = 0;
1778
1779 /* lba48 */
1780 s->hob_feature = 0;
1781 s->hob_sector = 0;
1782 s->hob_nsector = 0;
1783 s->hob_lcyl = 0;
1784 s->hob_hcyl = 0;
1785
5391d806 1786 s->select = 0xa0;
41a2b959 1787 s->status = READY_STAT | SEEK_STAT;
4a643563
BS
1788
1789 s->lba48 = 0;
1790
1791 /* ATAPI specific */
1792 s->sense_key = 0;
1793 s->asc = 0;
1794 s->cdrom_changed = 0;
1795 s->packet_transfer_size = 0;
1796 s->elementary_transfer_size = 0;
1797 s->io_buffer_index = 0;
1798 s->cd_sector_size = 0;
1799 s->atapi_dma = 0;
1800 /* ATA DMA state */
1801 s->io_buffer_size = 0;
1802 s->req_nb_sectors = 0;
1803
5391d806 1804 ide_set_signature(s);
a7dfe172
FB
1805 /* init the transfer handler so that 0xffff is returned on data
1806 accesses */
1807 s->end_transfer_func = ide_dummy_transfer_stop;
1808 ide_dummy_transfer_stop(s);
201a51fc 1809 s->media_changed = 0;
5391d806
FB
1810}
1811
4a643563
BS
1812void ide_bus_reset(IDEBus *bus)
1813{
1814 bus->unit = 0;
1815 bus->cmd = 0;
1816 ide_reset(&bus->ifs[0]);
1817 ide_reset(&bus->ifs[1]);
1818 ide_clear_hob(bus);
40a6238a
AG
1819
1820 /* pending async DMA */
1821 if (bus->dma->aiocb) {
1822#ifdef DEBUG_AIO
1823 printf("aio_cancel\n");
1824#endif
1825 bdrv_aio_cancel(bus->dma->aiocb);
1826 bus->dma->aiocb = NULL;
1827 }
1828
1829 /* reset dma provider too */
1830 bus->dma->ops->reset(bus->dma);
4a643563
BS
1831}
1832
e4def80b
MA
1833static bool ide_cd_is_tray_open(void *opaque)
1834{
1835 return ((IDEState *)opaque)->tray_open;
1836}
1837
f107639a
MA
1838static bool ide_cd_is_medium_locked(void *opaque)
1839{
1840 return ((IDEState *)opaque)->tray_locked;
1841}
1842
0e49de52 1843static const BlockDevOps ide_cd_block_ops = {
145feb17 1844 .change_media_cb = ide_cd_change_cb,
2df0a3a3 1845 .eject_request_cb = ide_cd_eject_request_cb,
e4def80b 1846 .is_tray_open = ide_cd_is_tray_open,
f107639a 1847 .is_medium_locked = ide_cd_is_medium_locked,
0e49de52
MA
1848};
1849
1f56e32a 1850int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
95ebda85
FB
1851 const char *version, const char *serial, const char *model,
1852 uint64_t wwn)
88804180
GH
1853{
1854 int cylinders, heads, secs;
1855 uint64_t nb_sectors;
1856
f8b6cc00 1857 s->bs = bs;
1f56e32a
MA
1858 s->drive_kind = kind;
1859
f8b6cc00
MA
1860 bdrv_get_geometry(bs, &nb_sectors);
1861 bdrv_guess_geometry(bs, &cylinders, &heads, &secs);
dce9e928
MA
1862 if (cylinders < 1 || cylinders > 16383) {
1863 error_report("cyls must be between 1 and 16383");
1864 return -1;
1865 }
1866 if (heads < 1 || heads > 16) {
1867 error_report("heads must be between 1 and 16");
1868 return -1;
1869 }
1870 if (secs < 1 || secs > 63) {
1871 error_report("secs must be between 1 and 63");
1872 return -1;
1873 }
870111c8
MA
1874 s->cylinders = cylinders;
1875 s->heads = heads;
1876 s->sectors = secs;
1877 s->nb_sectors = nb_sectors;
95ebda85 1878 s->wwn = wwn;
870111c8
MA
1879 /* The SMART values should be preserved across power cycles
1880 but they aren't. */
1881 s->smart_enabled = 1;
1882 s->smart_autosave = 1;
1883 s->smart_errors = 0;
1884 s->smart_selftest_count = 0;
1f56e32a 1885 if (kind == IDE_CD) {
0e49de52 1886 bdrv_set_dev_ops(bs, &ide_cd_block_ops, s);
7b6f9300 1887 bdrv_set_buffer_alignment(bs, 2048);
7aa9c811 1888 } else {
98f28ad7
MA
1889 if (!bdrv_is_inserted(s->bs)) {
1890 error_report("Device needs media, but drive is empty");
1891 return -1;
1892 }
7aa9c811
MA
1893 if (bdrv_is_read_only(bs)) {
1894 error_report("Can't use a read-only drive");
1895 return -1;
1896 }
88804180 1897 }
f8b6cc00 1898 if (serial) {
aa2c91bd 1899 pstrcpy(s->drive_serial_str, sizeof(s->drive_serial_str), serial);
6ced55a5 1900 } else {
88804180
GH
1901 snprintf(s->drive_serial_str, sizeof(s->drive_serial_str),
1902 "QM%05d", s->drive_serial);
870111c8 1903 }
27e0c9a1
FB
1904 if (model) {
1905 pstrcpy(s->drive_model_str, sizeof(s->drive_model_str), model);
1906 } else {
1907 switch (kind) {
1908 case IDE_CD:
1909 strcpy(s->drive_model_str, "QEMU DVD-ROM");
1910 break;
1911 case IDE_CFATA:
1912 strcpy(s->drive_model_str, "QEMU MICRODRIVE");
1913 break;
1914 default:
1915 strcpy(s->drive_model_str, "QEMU HARDDISK");
1916 break;
1917 }
1918 }
1919
47c06340
GH
1920 if (version) {
1921 pstrcpy(s->version, sizeof(s->version), version);
1922 } else {
1923 pstrcpy(s->version, sizeof(s->version), QEMU_VERSION);
1924 }
40a6238a 1925
88804180 1926 ide_reset(s);
50fb1900 1927 bdrv_iostatus_enable(bs);
c4d74df7 1928 return 0;
88804180
GH
1929}
1930
57234ee4 1931static void ide_init1(IDEBus *bus, int unit)
d459da0e
MA
1932{
1933 static int drive_serial = 1;
1934 IDEState *s = &bus->ifs[unit];
1935
1936 s->bus = bus;
1937 s->unit = unit;
1938 s->drive_serial = drive_serial++;
1b2adf28 1939 /* we need at least 2k alignment for accessing CDROMs using O_DIRECT */
50641c5c 1940 s->io_buffer_total_len = IDE_DMA_BUF_SECTORS*512 + 4;
c925400b
KW
1941 s->io_buffer = qemu_memalign(2048, s->io_buffer_total_len);
1942 memset(s->io_buffer, 0, s->io_buffer_total_len);
1943
d459da0e 1944 s->smart_selftest_data = qemu_blockalign(s->bs, 512);
c925400b
KW
1945 memset(s->smart_selftest_data, 0, 512);
1946
74475455 1947 s->sector_write_timer = qemu_new_timer_ns(vm_clock,
d459da0e 1948 ide_sector_write_timer_cb, s);
57234ee4
MA
1949}
1950
40a6238a
AG
1951static void ide_nop_start(IDEDMA *dma, IDEState *s,
1952 BlockDriverCompletionFunc *cb)
1953{
1954}
1955
1956static int ide_nop(IDEDMA *dma)
1957{
1958 return 0;
1959}
1960
1961static int ide_nop_int(IDEDMA *dma, int x)
1962{
1963 return 0;
1964}
1965
1dfb4dd9 1966static void ide_nop_restart(void *opaque, int x, RunState y)
40a6238a
AG
1967{
1968}
1969
1970static const IDEDMAOps ide_dma_nop_ops = {
1971 .start_dma = ide_nop_start,
1972 .start_transfer = ide_nop,
1973 .prepare_buf = ide_nop_int,
1974 .rw_buf = ide_nop_int,
1975 .set_unit = ide_nop_int,
1976 .add_status = ide_nop_int,
1977 .set_inactive = ide_nop,
1978 .restart_cb = ide_nop_restart,
1979 .reset = ide_nop,
1980};
1981
1982static IDEDMA ide_dma_nop = {
1983 .ops = &ide_dma_nop_ops,
1984 .aiocb = NULL,
1985};
1986
57234ee4
MA
1987void ide_init2(IDEBus *bus, qemu_irq irq)
1988{
1989 int i;
1990
1991 for(i = 0; i < 2; i++) {
1992 ide_init1(bus, i);
1993 ide_reset(&bus->ifs[i]);
870111c8 1994 }
57234ee4 1995 bus->irq = irq;
40a6238a 1996 bus->dma = &ide_dma_nop;
d459da0e
MA
1997}
1998
57234ee4
MA
1999/* TODO convert users to qdev and remove */
2000void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0,
2001 DriveInfo *hd1, qemu_irq irq)
5391d806 2002{
88804180 2003 int i;
57234ee4 2004 DriveInfo *dinfo;
5391d806 2005
caed8802 2006 for(i = 0; i < 2; i++) {
57234ee4
MA
2007 dinfo = i == 0 ? hd0 : hd1;
2008 ide_init1(bus, i);
2009 if (dinfo) {
1f56e32a 2010 if (ide_init_drive(&bus->ifs[i], dinfo->bdrv,
95b5edcd 2011 dinfo->media_cd ? IDE_CD : IDE_HD, NULL,
27e0c9a1 2012 *dinfo->serial ? dinfo->serial : NULL,
95ebda85 2013 NULL, 0) < 0) {
c4d74df7
MA
2014 error_report("Can't set up IDE drive %s", dinfo->id);
2015 exit(1);
2016 }
fa879d62 2017 bdrv_attach_dev_nofail(dinfo->bdrv, &bus->ifs[i]);
57234ee4
MA
2018 } else {
2019 ide_reset(&bus->ifs[i]);
2020 }
5391d806 2021 }
9cdd03a7 2022 bus->irq = irq;
40a6238a 2023 bus->dma = &ide_dma_nop;
69b91039
FB
2024}
2025
4a91d3b3
RH
2026static const MemoryRegionPortio ide_portio_list[] = {
2027 { 0, 8, 1, .read = ide_ioport_read, .write = ide_ioport_write },
2028 { 0, 2, 2, .read = ide_data_readw, .write = ide_data_writew },
2029 { 0, 4, 4, .read = ide_data_readl, .write = ide_data_writel },
2030 PORTIO_END_OF_LIST(),
2031};
2032
2033static const MemoryRegionPortio ide_portio2_list[] = {
2034 { 0, 1, 1, .read = ide_status_read, .write = ide_cmd_write },
2035 PORTIO_END_OF_LIST(),
2036};
2037
2038void ide_init_ioport(IDEBus *bus, ISADevice *dev, int iobase, int iobase2)
69b91039 2039{
4a91d3b3
RH
2040 /* ??? Assume only ISA and PCI configurations, and that the PCI-ISA
2041 bridge has been setup properly to always register with ISA. */
2042 isa_register_portio_list(dev, iobase, ide_portio_list, bus, "ide");
2043
caed8802 2044 if (iobase2) {
4a91d3b3 2045 isa_register_portio_list(dev, iobase2, ide_portio2_list, bus, "ide");
5391d806 2046 }
5391d806 2047}
69b91039 2048
37159f13 2049static bool is_identify_set(void *opaque, int version_id)
aa941b94 2050{
37159f13
JQ
2051 IDEState *s = opaque;
2052
2053 return s->identify_set != 0;
2054}
2055
50641c5c
JQ
2056static EndTransferFunc* transfer_end_table[] = {
2057 ide_sector_read,
2058 ide_sector_write,
2059 ide_transfer_stop,
2060 ide_atapi_cmd_reply_end,
2061 ide_atapi_cmd,
2062 ide_dummy_transfer_stop,
2063};
2064
2065static int transfer_end_table_idx(EndTransferFunc *fn)
2066{
2067 int i;
2068
2069 for (i = 0; i < ARRAY_SIZE(transfer_end_table); i++)
2070 if (transfer_end_table[i] == fn)
2071 return i;
2072
2073 return -1;
2074}
2075
37159f13 2076static int ide_drive_post_load(void *opaque, int version_id)
aa941b94 2077{
37159f13
JQ
2078 IDEState *s = opaque;
2079
2080 if (version_id < 3) {
67cc61e4 2081 if (s->sense_key == UNIT_ATTENTION &&
37159f13 2082 s->asc == ASC_MEDIUM_MAY_HAVE_CHANGED) {
93c8cfd9 2083 s->cdrom_changed = 1;
37159f13 2084 }
93c8cfd9 2085 }
37159f13 2086 return 0;
aa941b94
AZ
2087}
2088
50641c5c
JQ
2089static int ide_drive_pio_post_load(void *opaque, int version_id)
2090{
2091 IDEState *s = opaque;
2092
fb60105d 2093 if (s->end_transfer_fn_idx >= ARRAY_SIZE(transfer_end_table)) {
50641c5c
JQ
2094 return -EINVAL;
2095 }
2096 s->end_transfer_func = transfer_end_table[s->end_transfer_fn_idx];
2097 s->data_ptr = s->io_buffer + s->cur_io_buffer_offset;
2098 s->data_end = s->data_ptr + s->cur_io_buffer_len;
2099
2100 return 0;
2101}
2102
2103static void ide_drive_pio_pre_save(void *opaque)
2104{
2105 IDEState *s = opaque;
2106 int idx;
2107
2108 s->cur_io_buffer_offset = s->data_ptr - s->io_buffer;
2109 s->cur_io_buffer_len = s->data_end - s->data_ptr;
2110
2111 idx = transfer_end_table_idx(s->end_transfer_func);
2112 if (idx == -1) {
2113 fprintf(stderr, "%s: invalid end_transfer_func for DRQ_STAT\n",
2114 __func__);
2115 s->end_transfer_fn_idx = 2;
2116 } else {
2117 s->end_transfer_fn_idx = idx;
2118 }
2119}
2120
2121static bool ide_drive_pio_state_needed(void *opaque)
2122{
2123 IDEState *s = opaque;
2124
fdc650d7
KW
2125 return ((s->status & DRQ_STAT) != 0)
2126 || (s->bus->error_status & BM_STATUS_PIO_RETRY);
50641c5c
JQ
2127}
2128
db118fe7
MA
2129static bool ide_tray_state_needed(void *opaque)
2130{
2131 IDEState *s = opaque;
2132
2133 return s->tray_open || s->tray_locked;
2134}
2135
996faf1a
AS
2136static bool ide_atapi_gesn_needed(void *opaque)
2137{
2138 IDEState *s = opaque;
2139
2140 return s->events.new_media || s->events.eject_request;
2141}
2142
def93791
KW
2143static bool ide_error_needed(void *opaque)
2144{
2145 IDEBus *bus = opaque;
2146
2147 return (bus->error_status != 0);
2148}
2149
996faf1a 2150/* Fields for GET_EVENT_STATUS_NOTIFICATION ATAPI command */
656fbeff 2151static const VMStateDescription vmstate_ide_atapi_gesn_state = {
996faf1a
AS
2152 .name ="ide_drive/atapi/gesn_state",
2153 .version_id = 1,
2154 .minimum_version_id = 1,
2155 .minimum_version_id_old = 1,
2156 .fields = (VMStateField []) {
2157 VMSTATE_BOOL(events.new_media, IDEState),
2158 VMSTATE_BOOL(events.eject_request, IDEState),
0754f9ec 2159 VMSTATE_END_OF_LIST()
996faf1a
AS
2160 }
2161};
2162
db118fe7
MA
2163static const VMStateDescription vmstate_ide_tray_state = {
2164 .name = "ide_drive/tray_state",
2165 .version_id = 1,
2166 .minimum_version_id = 1,
2167 .minimum_version_id_old = 1,
db118fe7
MA
2168 .fields = (VMStateField[]) {
2169 VMSTATE_BOOL(tray_open, IDEState),
2170 VMSTATE_BOOL(tray_locked, IDEState),
2171 VMSTATE_END_OF_LIST()
2172 }
2173};
2174
656fbeff 2175static const VMStateDescription vmstate_ide_drive_pio_state = {
50641c5c
JQ
2176 .name = "ide_drive/pio_state",
2177 .version_id = 1,
2178 .minimum_version_id = 1,
2179 .minimum_version_id_old = 1,
2180 .pre_save = ide_drive_pio_pre_save,
2181 .post_load = ide_drive_pio_post_load,
2182 .fields = (VMStateField []) {
2183 VMSTATE_INT32(req_nb_sectors, IDEState),
2184 VMSTATE_VARRAY_INT32(io_buffer, IDEState, io_buffer_total_len, 1,
2185 vmstate_info_uint8, uint8_t),
2186 VMSTATE_INT32(cur_io_buffer_offset, IDEState),
2187 VMSTATE_INT32(cur_io_buffer_len, IDEState),
2188 VMSTATE_UINT8(end_transfer_fn_idx, IDEState),
2189 VMSTATE_INT32(elementary_transfer_size, IDEState),
2190 VMSTATE_INT32(packet_transfer_size, IDEState),
2191 VMSTATE_END_OF_LIST()
2192 }
2193};
2194
37159f13
JQ
2195const VMStateDescription vmstate_ide_drive = {
2196 .name = "ide_drive",
3abb6260 2197 .version_id = 3,
37159f13
JQ
2198 .minimum_version_id = 0,
2199 .minimum_version_id_old = 0,
2200 .post_load = ide_drive_post_load,
2201 .fields = (VMStateField []) {
2202 VMSTATE_INT32(mult_sectors, IDEState),
2203 VMSTATE_INT32(identify_set, IDEState),
2204 VMSTATE_BUFFER_TEST(identify_data, IDEState, is_identify_set),
2205 VMSTATE_UINT8(feature, IDEState),
2206 VMSTATE_UINT8(error, IDEState),
2207 VMSTATE_UINT32(nsector, IDEState),
2208 VMSTATE_UINT8(sector, IDEState),
2209 VMSTATE_UINT8(lcyl, IDEState),
2210 VMSTATE_UINT8(hcyl, IDEState),
2211 VMSTATE_UINT8(hob_feature, IDEState),
2212 VMSTATE_UINT8(hob_sector, IDEState),
2213 VMSTATE_UINT8(hob_nsector, IDEState),
2214 VMSTATE_UINT8(hob_lcyl, IDEState),
2215 VMSTATE_UINT8(hob_hcyl, IDEState),
2216 VMSTATE_UINT8(select, IDEState),
2217 VMSTATE_UINT8(status, IDEState),
2218 VMSTATE_UINT8(lba48, IDEState),
2219 VMSTATE_UINT8(sense_key, IDEState),
2220 VMSTATE_UINT8(asc, IDEState),
2221 VMSTATE_UINT8_V(cdrom_changed, IDEState, 3),
37159f13 2222 VMSTATE_END_OF_LIST()
50641c5c
JQ
2223 },
2224 .subsections = (VMStateSubsection []) {
2225 {
2226 .vmsd = &vmstate_ide_drive_pio_state,
2227 .needed = ide_drive_pio_state_needed,
db118fe7
MA
2228 }, {
2229 .vmsd = &vmstate_ide_tray_state,
2230 .needed = ide_tray_state_needed,
996faf1a
AS
2231 }, {
2232 .vmsd = &vmstate_ide_atapi_gesn_state,
2233 .needed = ide_atapi_gesn_needed,
50641c5c
JQ
2234 }, {
2235 /* empty */
2236 }
37159f13
JQ
2237 }
2238};
2239
656fbeff 2240static const VMStateDescription vmstate_ide_error_status = {
def93791
KW
2241 .name ="ide_bus/error",
2242 .version_id = 1,
2243 .minimum_version_id = 1,
2244 .minimum_version_id_old = 1,
2245 .fields = (VMStateField []) {
2246 VMSTATE_INT32(error_status, IDEBus),
2247 VMSTATE_END_OF_LIST()
2248 }
2249};
2250
6521dc62
JQ
2251const VMStateDescription vmstate_ide_bus = {
2252 .name = "ide_bus",
2253 .version_id = 1,
2254 .minimum_version_id = 1,
2255 .minimum_version_id_old = 1,
2256 .fields = (VMStateField []) {
2257 VMSTATE_UINT8(cmd, IDEBus),
2258 VMSTATE_UINT8(unit, IDEBus),
2259 VMSTATE_END_OF_LIST()
def93791
KW
2260 },
2261 .subsections = (VMStateSubsection []) {
2262 {
2263 .vmsd = &vmstate_ide_error_status,
2264 .needed = ide_error_needed,
2265 }, {
2266 /* empty */
2267 }
6521dc62
JQ
2268 }
2269};
75717903
IY
2270
2271void ide_drive_get(DriveInfo **hd, int max_bus)
2272{
2273 int i;
2274
2275 if (drive_get_max_bus(IF_IDE) >= max_bus) {
2276 fprintf(stderr, "qemu: too many IDE bus: %d\n", max_bus);
2277 exit(1);
2278 }
2279
2280 for(i = 0; i < max_bus * MAX_IDE_DEVS; i++) {
2281 hd[i] = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
2282 }
2283}