find -type f | xargs sed -i 's/[\t ]*$//g' # Yes, again. Note the star in the regex.
[qemu] / hw / ide.c
1 /*
2  * QEMU IDE disk and CD-ROM Emulator
3  *
4  * Copyright (c) 2003 Fabrice Bellard
5  * Copyright (c) 2006 Openedhand Ltd.
6  *
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  */
25 #include "vl.h"
26
27 /* debug IDE devices */
28 //#define DEBUG_IDE
29 //#define DEBUG_IDE_ATAPI
30 //#define DEBUG_AIO
31 #define USE_DMA_CDROM
32
33 /* Bits of HD_STATUS */
34 #define ERR_STAT                0x01
35 #define INDEX_STAT              0x02
36 #define ECC_STAT                0x04    /* Corrected error */
37 #define DRQ_STAT                0x08
38 #define SEEK_STAT               0x10
39 #define SRV_STAT                0x10
40 #define WRERR_STAT              0x20
41 #define READY_STAT              0x40
42 #define BUSY_STAT               0x80
43
44 /* Bits for HD_ERROR */
45 #define MARK_ERR                0x01    /* Bad address mark */
46 #define TRK0_ERR                0x02    /* couldn't find track 0 */
47 #define ABRT_ERR                0x04    /* Command aborted */
48 #define MCR_ERR                 0x08    /* media change request */
49 #define ID_ERR                  0x10    /* ID field not found */
50 #define MC_ERR                  0x20    /* media changed */
51 #define ECC_ERR                 0x40    /* Uncorrectable ECC error */
52 #define BBD_ERR                 0x80    /* pre-EIDE meaning:  block marked bad */
53 #define ICRC_ERR                0x80    /* new meaning:  CRC error during transfer */
54
55 /* Bits of HD_NSECTOR */
56 #define CD                      0x01
57 #define IO                      0x02
58 #define REL                     0x04
59 #define TAG_MASK                0xf8
60
61 #define IDE_CMD_RESET           0x04
62 #define IDE_CMD_DISABLE_IRQ     0x02
63
64 /* ATA/ATAPI Commands pre T13 Spec */
65 #define WIN_NOP                         0x00
66 /*
67  *      0x01->0x02 Reserved
68  */
69 #define CFA_REQ_EXT_ERROR_CODE          0x03 /* CFA Request Extended Error Code */
70 /*
71  *      0x04->0x07 Reserved
72  */
73 #define WIN_SRST                        0x08 /* ATAPI soft reset command */
74 #define WIN_DEVICE_RESET                0x08
75 /*
76  *      0x09->0x0F Reserved
77  */
78 #define WIN_RECAL                       0x10
79 #define WIN_RESTORE                     WIN_RECAL
80 /*
81  *      0x10->0x1F Reserved
82  */
83 #define WIN_READ                        0x20 /* 28-Bit */
84 #define WIN_READ_ONCE                   0x21 /* 28-Bit without retries */
85 #define WIN_READ_LONG                   0x22 /* 28-Bit */
86 #define WIN_READ_LONG_ONCE              0x23 /* 28-Bit without retries */
87 #define WIN_READ_EXT                    0x24 /* 48-Bit */
88 #define WIN_READDMA_EXT                 0x25 /* 48-Bit */
89 #define WIN_READDMA_QUEUED_EXT          0x26 /* 48-Bit */
90 #define WIN_READ_NATIVE_MAX_EXT         0x27 /* 48-Bit */
91 /*
92  *      0x28
93  */
94 #define WIN_MULTREAD_EXT                0x29 /* 48-Bit */
95 /*
96  *      0x2A->0x2F Reserved
97  */
98 #define WIN_WRITE                       0x30 /* 28-Bit */
99 #define WIN_WRITE_ONCE                  0x31 /* 28-Bit without retries */
100 #define WIN_WRITE_LONG                  0x32 /* 28-Bit */
101 #define WIN_WRITE_LONG_ONCE             0x33 /* 28-Bit without retries */
102 #define WIN_WRITE_EXT                   0x34 /* 48-Bit */
103 #define WIN_WRITEDMA_EXT                0x35 /* 48-Bit */
104 #define WIN_WRITEDMA_QUEUED_EXT         0x36 /* 48-Bit */
105 #define WIN_SET_MAX_EXT                 0x37 /* 48-Bit */
106 #define CFA_WRITE_SECT_WO_ERASE         0x38 /* CFA Write Sectors without erase */
107 #define WIN_MULTWRITE_EXT               0x39 /* 48-Bit */
108 /*
109  *      0x3A->0x3B Reserved
110  */
111 #define WIN_WRITE_VERIFY                0x3C /* 28-Bit */
112 /*
113  *      0x3D->0x3F Reserved
114  */
115 #define WIN_VERIFY                      0x40 /* 28-Bit - Read Verify Sectors */
116 #define WIN_VERIFY_ONCE                 0x41 /* 28-Bit - without retries */
117 #define WIN_VERIFY_EXT                  0x42 /* 48-Bit */
118 /*
119  *      0x43->0x4F Reserved
120  */
121 #define WIN_FORMAT                      0x50
122 /*
123  *      0x51->0x5F Reserved
124  */
125 #define WIN_INIT                        0x60
126 /*
127  *      0x61->0x5F Reserved
128  */
129 #define WIN_SEEK                        0x70 /* 0x70-0x7F Reserved */
130 #define CFA_TRANSLATE_SECTOR            0x87 /* CFA Translate Sector */
131 #define WIN_DIAGNOSE                    0x90
132 #define WIN_SPECIFY                     0x91 /* set drive geometry translation */
133 #define WIN_DOWNLOAD_MICROCODE          0x92
134 #define WIN_STANDBYNOW2                 0x94
135 #define CFA_IDLEIMMEDIATE               0x95 /* force drive to become "ready" */
136 #define WIN_STANDBY2                    0x96
137 #define WIN_SETIDLE2                    0x97
138 #define WIN_CHECKPOWERMODE2             0x98
139 #define WIN_SLEEPNOW2                   0x99
140 /*
141  *      0x9A VENDOR
142  */
143 #define WIN_PACKETCMD                   0xA0 /* Send a packet command. */
144 #define WIN_PIDENTIFY                   0xA1 /* identify ATAPI device   */
145 #define WIN_QUEUED_SERVICE              0xA2
146 #define WIN_SMART                       0xB0 /* self-monitoring and reporting */
147 #define CFA_ACCESS_METADATA_STORAGE     0xB8
148 #define CFA_ERASE_SECTORS               0xC0 /* microdrives implement as NOP */
149 #define WIN_MULTREAD                    0xC4 /* read sectors using multiple mode*/
150 #define WIN_MULTWRITE                   0xC5 /* write sectors using multiple mode */
151 #define WIN_SETMULT                     0xC6 /* enable/disable multiple mode */
152 #define WIN_READDMA_QUEUED              0xC7 /* read sectors using Queued DMA transfers */
153 #define WIN_READDMA                     0xC8 /* read sectors using DMA transfers */
154 #define WIN_READDMA_ONCE                0xC9 /* 28-Bit - without retries */
155 #define WIN_WRITEDMA                    0xCA /* write sectors using DMA transfers */
156 #define WIN_WRITEDMA_ONCE               0xCB /* 28-Bit - without retries */
157 #define WIN_WRITEDMA_QUEUED             0xCC /* write sectors using Queued DMA transfers */
158 #define CFA_WRITE_MULTI_WO_ERASE        0xCD /* CFA Write multiple without erase */
159 #define WIN_GETMEDIASTATUS              0xDA
160 #define WIN_ACKMEDIACHANGE              0xDB /* ATA-1, ATA-2 vendor */
161 #define WIN_POSTBOOT                    0xDC
162 #define WIN_PREBOOT                     0xDD
163 #define WIN_DOORLOCK                    0xDE /* lock door on removable drives */
164 #define WIN_DOORUNLOCK                  0xDF /* unlock door on removable drives */
165 #define WIN_STANDBYNOW1                 0xE0
166 #define WIN_IDLEIMMEDIATE               0xE1 /* force drive to become "ready" */
167 #define WIN_STANDBY                     0xE2 /* Set device in Standby Mode */
168 #define WIN_SETIDLE1                    0xE3
169 #define WIN_READ_BUFFER                 0xE4 /* force read only 1 sector */
170 #define WIN_CHECKPOWERMODE1             0xE5
171 #define WIN_SLEEPNOW1                   0xE6
172 #define WIN_FLUSH_CACHE                 0xE7
173 #define WIN_WRITE_BUFFER                0xE8 /* force write only 1 sector */
174 #define WIN_WRITE_SAME                  0xE9 /* read ata-2 to use */
175         /* SET_FEATURES 0x22 or 0xDD */
176 #define WIN_FLUSH_CACHE_EXT             0xEA /* 48-Bit */
177 #define WIN_IDENTIFY                    0xEC /* ask drive to identify itself    */
178 #define WIN_MEDIAEJECT                  0xED
179 #define WIN_IDENTIFY_DMA                0xEE /* same as WIN_IDENTIFY, but DMA */
180 #define WIN_SETFEATURES                 0xEF /* set special drive features */
181 #define EXABYTE_ENABLE_NEST             0xF0
182 #define IBM_SENSE_CONDITION             0xF0 /* measure disk temperature */
183 #define WIN_SECURITY_SET_PASS           0xF1
184 #define WIN_SECURITY_UNLOCK             0xF2
185 #define WIN_SECURITY_ERASE_PREPARE      0xF3
186 #define WIN_SECURITY_ERASE_UNIT         0xF4
187 #define WIN_SECURITY_FREEZE_LOCK        0xF5
188 #define CFA_WEAR_LEVEL                  0xF5 /* microdrives implement as NOP */
189 #define WIN_SECURITY_DISABLE            0xF6
190 #define WIN_READ_NATIVE_MAX             0xF8 /* return the native maximum address */
191 #define WIN_SET_MAX                     0xF9
192 #define DISABLE_SEAGATE                 0xFB
193
194 /* set to 1 set disable mult support */
195 #define MAX_MULT_SECTORS 16
196
197 /* ATAPI defines */
198
199 #define ATAPI_PACKET_SIZE 12
200
201 /* The generic packet command opcodes for CD/DVD Logical Units,
202  * From Table 57 of the SFF8090 Ver. 3 (Mt. Fuji) draft standard. */
203 #define GPCMD_BLANK                         0xa1
204 #define GPCMD_CLOSE_TRACK                   0x5b
205 #define GPCMD_FLUSH_CACHE                   0x35
206 #define GPCMD_FORMAT_UNIT                   0x04
207 #define GPCMD_GET_CONFIGURATION             0x46
208 #define GPCMD_GET_EVENT_STATUS_NOTIFICATION 0x4a
209 #define GPCMD_GET_PERFORMANCE               0xac
210 #define GPCMD_INQUIRY                       0x12
211 #define GPCMD_LOAD_UNLOAD                   0xa6
212 #define GPCMD_MECHANISM_STATUS              0xbd
213 #define GPCMD_MODE_SELECT_10                0x55
214 #define GPCMD_MODE_SENSE_10                 0x5a
215 #define GPCMD_PAUSE_RESUME                  0x4b
216 #define GPCMD_PLAY_AUDIO_10                 0x45
217 #define GPCMD_PLAY_AUDIO_MSF                0x47
218 #define GPCMD_PLAY_AUDIO_TI                 0x48
219 #define GPCMD_PLAY_CD                       0xbc
220 #define GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL  0x1e
221 #define GPCMD_READ_10                       0x28
222 #define GPCMD_READ_12                       0xa8
223 #define GPCMD_READ_CDVD_CAPACITY            0x25
224 #define GPCMD_READ_CD                       0xbe
225 #define GPCMD_READ_CD_MSF                   0xb9
226 #define GPCMD_READ_DISC_INFO                0x51
227 #define GPCMD_READ_DVD_STRUCTURE            0xad
228 #define GPCMD_READ_FORMAT_CAPACITIES        0x23
229 #define GPCMD_READ_HEADER                   0x44
230 #define GPCMD_READ_TRACK_RZONE_INFO         0x52
231 #define GPCMD_READ_SUBCHANNEL               0x42
232 #define GPCMD_READ_TOC_PMA_ATIP             0x43
233 #define GPCMD_REPAIR_RZONE_TRACK            0x58
234 #define GPCMD_REPORT_KEY                    0xa4
235 #define GPCMD_REQUEST_SENSE                 0x03
236 #define GPCMD_RESERVE_RZONE_TRACK           0x53
237 #define GPCMD_SCAN                          0xba
238 #define GPCMD_SEEK                          0x2b
239 #define GPCMD_SEND_DVD_STRUCTURE            0xad
240 #define GPCMD_SEND_EVENT                    0xa2
241 #define GPCMD_SEND_KEY                      0xa3
242 #define GPCMD_SEND_OPC                      0x54
243 #define GPCMD_SET_READ_AHEAD                0xa7
244 #define GPCMD_SET_STREAMING                 0xb6
245 #define GPCMD_START_STOP_UNIT               0x1b
246 #define GPCMD_STOP_PLAY_SCAN                0x4e
247 #define GPCMD_TEST_UNIT_READY               0x00
248 #define GPCMD_VERIFY_10                     0x2f
249 #define GPCMD_WRITE_10                      0x2a
250 #define GPCMD_WRITE_AND_VERIFY_10           0x2e
251 /* This is listed as optional in ATAPI 2.6, but is (curiously)
252  * missing from Mt. Fuji, Table 57.  It _is_ mentioned in Mt. Fuji
253  * Table 377 as an MMC command for SCSi devices though...  Most ATAPI
254  * drives support it. */
255 #define GPCMD_SET_SPEED                     0xbb
256 /* This seems to be a SCSI specific CD-ROM opcode
257  * to play data at track/index */
258 #define GPCMD_PLAYAUDIO_TI                  0x48
259 /*
260  * From MS Media Status Notification Support Specification. For
261  * older drives only.
262  */
263 #define GPCMD_GET_MEDIA_STATUS              0xda
264 #define GPCMD_MODE_SENSE_6                  0x1a
265
266 /* Mode page codes for mode sense/set */
267 #define GPMODE_R_W_ERROR_PAGE           0x01
268 #define GPMODE_WRITE_PARMS_PAGE         0x05
269 #define GPMODE_AUDIO_CTL_PAGE           0x0e
270 #define GPMODE_POWER_PAGE               0x1a
271 #define GPMODE_FAULT_FAIL_PAGE          0x1c
272 #define GPMODE_TO_PROTECT_PAGE          0x1d
273 #define GPMODE_CAPABILITIES_PAGE        0x2a
274 #define GPMODE_ALL_PAGES                0x3f
275 /* Not in Mt. Fuji, but in ATAPI 2.6 -- depricated now in favor
276  * of MODE_SENSE_POWER_PAGE */
277 #define GPMODE_CDROM_PAGE               0x0d
278
279 #define ATAPI_INT_REASON_CD             0x01 /* 0 = data transfer */
280 #define ATAPI_INT_REASON_IO             0x02 /* 1 = transfer to the host */
281 #define ATAPI_INT_REASON_REL            0x04
282 #define ATAPI_INT_REASON_TAG            0xf8
283
284 /* same constants as bochs */
285 #define ASC_ILLEGAL_OPCODE                   0x20
286 #define ASC_LOGICAL_BLOCK_OOR                0x21
287 #define ASC_INV_FIELD_IN_CMD_PACKET          0x24
288 #define ASC_MEDIUM_NOT_PRESENT               0x3a
289 #define ASC_SAVING_PARAMETERS_NOT_SUPPORTED  0x39
290
291 #define CFA_NO_ERROR            0x00
292 #define CFA_MISC_ERROR          0x09
293 #define CFA_INVALID_COMMAND     0x20
294 #define CFA_INVALID_ADDRESS     0x21
295 #define CFA_ADDRESS_OVERFLOW    0x2f
296
297 #define SENSE_NONE            0
298 #define SENSE_NOT_READY       2
299 #define SENSE_ILLEGAL_REQUEST 5
300 #define SENSE_UNIT_ATTENTION  6
301
302 struct IDEState;
303
304 typedef void EndTransferFunc(struct IDEState *);
305
306 /* NOTE: IDEState represents in fact one drive */
307 typedef struct IDEState {
308     /* ide config */
309     int is_cdrom;
310     int is_cf;
311     int cylinders, heads, sectors;
312     int64_t nb_sectors;
313     int mult_sectors;
314     int identify_set;
315     uint16_t identify_data[256];
316     qemu_irq irq;
317     PCIDevice *pci_dev;
318     struct BMDMAState *bmdma;
319     int drive_serial;
320     /* ide regs */
321     uint8_t feature;
322     uint8_t error;
323     uint32_t nsector;
324     uint8_t sector;
325     uint8_t lcyl;
326     uint8_t hcyl;
327     /* other part of tf for lba48 support */
328     uint8_t hob_feature;
329     uint8_t hob_nsector;
330     uint8_t hob_sector;
331     uint8_t hob_lcyl;
332     uint8_t hob_hcyl;
333
334     uint8_t select;
335     uint8_t status;
336
337     /* 0x3f6 command, only meaningful for drive 0 */
338     uint8_t cmd;
339     /* set for lba48 access */
340     uint8_t lba48;
341     /* depends on bit 4 in select, only meaningful for drive 0 */
342     struct IDEState *cur_drive;
343     BlockDriverState *bs;
344     /* ATAPI specific */
345     uint8_t sense_key;
346     uint8_t asc;
347     int packet_transfer_size;
348     int elementary_transfer_size;
349     int io_buffer_index;
350     int lba;
351     int cd_sector_size;
352     int atapi_dma; /* true if dma is requested for the packet cmd */
353     /* ATA DMA state */
354     int io_buffer_size;
355     /* PIO transfer handling */
356     int req_nb_sectors; /* number of sectors per interrupt */
357     EndTransferFunc *end_transfer_func;
358     uint8_t *data_ptr;
359     uint8_t *data_end;
360     uint8_t io_buffer[MAX_MULT_SECTORS*512 + 4];
361     QEMUTimer *sector_write_timer; /* only used for win2k instal hack */
362     uint32_t irq_count; /* counts IRQs when using win2k install hack */
363     /* CF-ATA extended error */
364     uint8_t ext_error;
365     /* CF-ATA metadata storage */
366     uint32_t mdata_size;
367     uint8_t *mdata_storage;
368     int media_changed;
369 } IDEState;
370
371 #define BM_STATUS_DMAING 0x01
372 #define BM_STATUS_ERROR  0x02
373 #define BM_STATUS_INT    0x04
374
375 #define BM_CMD_START     0x01
376 #define BM_CMD_READ      0x08
377
378 #define IDE_TYPE_PIIX3   0
379 #define IDE_TYPE_CMD646  1
380 #define IDE_TYPE_PIIX4   2
381
382 /* CMD646 specific */
383 #define MRDMODE         0x71
384 #define   MRDMODE_INTR_CH0      0x04
385 #define   MRDMODE_INTR_CH1      0x08
386 #define   MRDMODE_BLK_CH0       0x10
387 #define   MRDMODE_BLK_CH1       0x20
388 #define UDIDETCR0       0x73
389 #define UDIDETCR1       0x7B
390
391 typedef struct BMDMAState {
392     uint8_t cmd;
393     uint8_t status;
394     uint32_t addr;
395
396     struct PCIIDEState *pci_dev;
397     /* current transfer state */
398     uint32_t cur_addr;
399     uint32_t cur_prd_last;
400     uint32_t cur_prd_addr;
401     uint32_t cur_prd_len;
402     IDEState *ide_if;
403     BlockDriverCompletionFunc *dma_cb;
404     BlockDriverAIOCB *aiocb;
405 } BMDMAState;
406
407 typedef struct PCIIDEState {
408     PCIDevice dev;
409     IDEState ide_if[4];
410     BMDMAState bmdma[2];
411     int type; /* see IDE_TYPE_xxx */
412 } PCIIDEState;
413
414 static void ide_dma_start(IDEState *s, BlockDriverCompletionFunc *dma_cb);
415 static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret);
416
417 static void padstr(char *str, const char *src, int len)
418 {
419     int i, v;
420     for(i = 0; i < len; i++) {
421         if (*src)
422             v = *src++;
423         else
424             v = ' ';
425         *(char *)((long)str ^ 1) = v;
426         str++;
427     }
428 }
429
430 static void padstr8(uint8_t *buf, int buf_size, const char *src)
431 {
432     int i;
433     for(i = 0; i < buf_size; i++) {
434         if (*src)
435             buf[i] = *src++;
436         else
437             buf[i] = ' ';
438     }
439 }
440
441 static void put_le16(uint16_t *p, unsigned int v)
442 {
443     *p = cpu_to_le16(v);
444 }
445
446 static void ide_identify(IDEState *s)
447 {
448     uint16_t *p;
449     unsigned int oldsize;
450     char buf[20];
451
452     if (s->identify_set) {
453         memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
454         return;
455     }
456
457     memset(s->io_buffer, 0, 512);
458     p = (uint16_t *)s->io_buffer;
459     put_le16(p + 0, 0x0040);
460     put_le16(p + 1, s->cylinders);
461     put_le16(p + 3, s->heads);
462     put_le16(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */
463     put_le16(p + 5, 512); /* XXX: retired, remove ? */
464     put_le16(p + 6, s->sectors);
465     snprintf(buf, sizeof(buf), "QM%05d", s->drive_serial);
466     padstr((uint8_t *)(p + 10), buf, 20); /* serial number */
467     put_le16(p + 20, 3); /* XXX: retired, remove ? */
468     put_le16(p + 21, 512); /* cache size in sectors */
469     put_le16(p + 22, 4); /* ecc bytes */
470     padstr((uint8_t *)(p + 23), QEMU_VERSION, 8); /* firmware version */
471     padstr((uint8_t *)(p + 27), "QEMU HARDDISK", 40); /* model */
472 #if MAX_MULT_SECTORS > 1
473     put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
474 #endif
475     put_le16(p + 48, 1); /* dword I/O */
476     put_le16(p + 49, (1 << 11) | (1 << 9) | (1 << 8)); /* DMA and LBA supported */
477     put_le16(p + 51, 0x200); /* PIO transfer cycle */
478     put_le16(p + 52, 0x200); /* DMA transfer cycle */
479     put_le16(p + 53, 1 | (1 << 1) | (1 << 2)); /* words 54-58,64-70,88 are valid */
480     put_le16(p + 54, s->cylinders);
481     put_le16(p + 55, s->heads);
482     put_le16(p + 56, s->sectors);
483     oldsize = s->cylinders * s->heads * s->sectors;
484     put_le16(p + 57, oldsize);
485     put_le16(p + 58, oldsize >> 16);
486     if (s->mult_sectors)
487         put_le16(p + 59, 0x100 | s->mult_sectors);
488     put_le16(p + 60, s->nb_sectors);
489     put_le16(p + 61, s->nb_sectors >> 16);
490     put_le16(p + 63, 0x07); /* mdma0-2 supported */
491     put_le16(p + 65, 120);
492     put_le16(p + 66, 120);
493     put_le16(p + 67, 120);
494     put_le16(p + 68, 120);
495     put_le16(p + 80, 0xf0); /* ata3 -> ata6 supported */
496     put_le16(p + 81, 0x16); /* conforms to ata5 */
497     put_le16(p + 82, (1 << 14));
498     /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
499     put_le16(p + 83, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
500     put_le16(p + 84, (1 << 14));
501     put_le16(p + 85, (1 << 14));
502     /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
503     put_le16(p + 86, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
504     put_le16(p + 87, (1 << 14));
505     put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
506     put_le16(p + 93, 1 | (1 << 14) | 0x2000);
507     put_le16(p + 100, s->nb_sectors);
508     put_le16(p + 101, s->nb_sectors >> 16);
509     put_le16(p + 102, s->nb_sectors >> 32);
510     put_le16(p + 103, s->nb_sectors >> 48);
511
512     memcpy(s->identify_data, p, sizeof(s->identify_data));
513     s->identify_set = 1;
514 }
515
516 static void ide_atapi_identify(IDEState *s)
517 {
518     uint16_t *p;
519     char buf[20];
520
521     if (s->identify_set) {
522         memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
523         return;
524     }
525
526     memset(s->io_buffer, 0, 512);
527     p = (uint16_t *)s->io_buffer;
528     /* Removable CDROM, 50us response, 12 byte packets */
529     put_le16(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
530     snprintf(buf, sizeof(buf), "QM%05d", s->drive_serial);
531     padstr((uint8_t *)(p + 10), buf, 20); /* serial number */
532     put_le16(p + 20, 3); /* buffer type */
533     put_le16(p + 21, 512); /* cache size in sectors */
534     put_le16(p + 22, 4); /* ecc bytes */
535     padstr((uint8_t *)(p + 23), QEMU_VERSION, 8); /* firmware version */
536     padstr((uint8_t *)(p + 27), "QEMU CD-ROM", 40); /* model */
537     put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
538 #ifdef USE_DMA_CDROM
539     put_le16(p + 49, 1 << 9 | 1 << 8); /* DMA and LBA supported */
540     put_le16(p + 53, 7); /* words 64-70, 54-58, 88 valid */
541     put_le16(p + 63, 7);  /* mdma0-2 supported */
542     put_le16(p + 64, 0x3f); /* PIO modes supported */
543 #else
544     put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
545     put_le16(p + 53, 3); /* words 64-70, 54-58 valid */
546     put_le16(p + 63, 0x103); /* DMA modes XXX: may be incorrect */
547     put_le16(p + 64, 1); /* PIO modes */
548 #endif
549     put_le16(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */
550     put_le16(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */
551     put_le16(p + 67, 0x12c); /* minimum PIO cycle time without flow control */
552     put_le16(p + 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */
553
554     put_le16(p + 71, 30); /* in ns */
555     put_le16(p + 72, 30); /* in ns */
556
557     put_le16(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */
558 #ifdef USE_DMA_CDROM
559     put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
560 #endif
561     memcpy(s->identify_data, p, sizeof(s->identify_data));
562     s->identify_set = 1;
563 }
564
565 static void ide_cfata_identify(IDEState *s)
566 {
567     uint16_t *p;
568     uint32_t cur_sec;
569     char buf[20];
570
571     p = (uint16_t *) s->identify_data;
572     if (s->identify_set)
573         goto fill_buffer;
574
575     memset(p, 0, sizeof(s->identify_data));
576
577     cur_sec = s->cylinders * s->heads * s->sectors;
578
579     put_le16(p + 0, 0x848a);                    /* CF Storage Card signature */
580     put_le16(p + 1, s->cylinders);              /* Default cylinders */
581     put_le16(p + 3, s->heads);                  /* Default heads */
582     put_le16(p + 6, s->sectors);                /* Default sectors per track */
583     put_le16(p + 7, s->nb_sectors >> 16);       /* Sectors per card */
584     put_le16(p + 8, s->nb_sectors);             /* Sectors per card */
585     snprintf(buf, sizeof(buf), "QM%05d", s->drive_serial);
586     padstr((uint8_t *)(p + 10), buf, 20);       /* Serial number in ASCII */
587     put_le16(p + 22, 0x0004);                   /* ECC bytes */
588     padstr((uint8_t *) (p + 23), QEMU_VERSION, 8);      /* Firmware Revision */
589     padstr((uint8_t *) (p + 27), "QEMU MICRODRIVE", 40);/* Model number */
590 #if MAX_MULT_SECTORS > 1
591     put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
592 #else
593     put_le16(p + 47, 0x0000);
594 #endif
595     put_le16(p + 49, 0x0f00);                   /* Capabilities */
596     put_le16(p + 51, 0x0002);                   /* PIO cycle timing mode */
597     put_le16(p + 52, 0x0001);                   /* DMA cycle timing mode */
598     put_le16(p + 53, 0x0003);                   /* Translation params valid */
599     put_le16(p + 54, s->cylinders);             /* Current cylinders */
600     put_le16(p + 55, s->heads);                 /* Current heads */
601     put_le16(p + 56, s->sectors);               /* Current sectors */
602     put_le16(p + 57, cur_sec);                  /* Current capacity */
603     put_le16(p + 58, cur_sec >> 16);            /* Current capacity */
604     if (s->mult_sectors)                        /* Multiple sector setting */
605         put_le16(p + 59, 0x100 | s->mult_sectors);
606     put_le16(p + 60, s->nb_sectors);            /* Total LBA sectors */
607     put_le16(p + 61, s->nb_sectors >> 16);      /* Total LBA sectors */
608     put_le16(p + 63, 0x0203);                   /* Multiword DMA capability */
609     put_le16(p + 64, 0x0001);                   /* Flow Control PIO support */
610     put_le16(p + 65, 0x0096);                   /* Min. Multiword DMA cycle */
611     put_le16(p + 66, 0x0096);                   /* Rec. Multiword DMA cycle */
612     put_le16(p + 68, 0x00b4);                   /* Min. PIO cycle time */
613     put_le16(p + 82, 0x400c);                   /* Command Set supported */
614     put_le16(p + 83, 0x7068);                   /* Command Set supported */
615     put_le16(p + 84, 0x4000);                   /* Features supported */
616     put_le16(p + 85, 0x000c);                   /* Command Set enabled */
617     put_le16(p + 86, 0x7044);                   /* Command Set enabled */
618     put_le16(p + 87, 0x4000);                   /* Features enabled */
619     put_le16(p + 91, 0x4060);                   /* Current APM level */
620     put_le16(p + 129, 0x0002);                  /* Current features option */
621     put_le16(p + 130, 0x0005);                  /* Reassigned sectors */
622     put_le16(p + 131, 0x0001);                  /* Initial power mode */
623     put_le16(p + 132, 0x0000);                  /* User signature */
624     put_le16(p + 160, 0x8100);                  /* Power requirement */
625     put_le16(p + 161, 0x8001);                  /* CF command set */
626
627     s->identify_set = 1;
628
629 fill_buffer:
630     memcpy(s->io_buffer, p, sizeof(s->identify_data));
631 }
632
633 static void ide_set_signature(IDEState *s)
634 {
635     s->select &= 0xf0; /* clear head */
636     /* put signature */
637     s->nsector = 1;
638     s->sector = 1;
639     if (s->is_cdrom) {
640         s->lcyl = 0x14;
641         s->hcyl = 0xeb;
642     } else if (s->bs) {
643         s->lcyl = 0;
644         s->hcyl = 0;
645     } else {
646         s->lcyl = 0xff;
647         s->hcyl = 0xff;
648     }
649 }
650
651 static inline void ide_abort_command(IDEState *s)
652 {
653     s->status = READY_STAT | ERR_STAT;
654     s->error = ABRT_ERR;
655 }
656
657 static inline void ide_set_irq(IDEState *s)
658 {
659     BMDMAState *bm = s->bmdma;
660     if (!(s->cmd & IDE_CMD_DISABLE_IRQ)) {
661         if (bm) {
662             bm->status |= BM_STATUS_INT;
663         }
664         qemu_irq_raise(s->irq);
665     }
666 }
667
668 /* prepare data transfer and tell what to do after */
669 static void ide_transfer_start(IDEState *s, uint8_t *buf, int size,
670                                EndTransferFunc *end_transfer_func)
671 {
672     s->end_transfer_func = end_transfer_func;
673     s->data_ptr = buf;
674     s->data_end = buf + size;
675     if (!(s->status & ERR_STAT))
676         s->status |= DRQ_STAT;
677 }
678
679 static void ide_transfer_stop(IDEState *s)
680 {
681     s->end_transfer_func = ide_transfer_stop;
682     s->data_ptr = s->io_buffer;
683     s->data_end = s->io_buffer;
684     s->status &= ~DRQ_STAT;
685 }
686
687 static int64_t ide_get_sector(IDEState *s)
688 {
689     int64_t sector_num;
690     if (s->select & 0x40) {
691         /* lba */
692         if (!s->lba48) {
693             sector_num = ((s->select & 0x0f) << 24) | (s->hcyl << 16) |
694                 (s->lcyl << 8) | s->sector;
695         } else {
696             sector_num = ((int64_t)s->hob_hcyl << 40) |
697                 ((int64_t) s->hob_lcyl << 32) |
698                 ((int64_t) s->hob_sector << 24) |
699                 ((int64_t) s->hcyl << 16) |
700                 ((int64_t) s->lcyl << 8) | s->sector;
701         }
702     } else {
703         sector_num = ((s->hcyl << 8) | s->lcyl) * s->heads * s->sectors +
704             (s->select & 0x0f) * s->sectors + (s->sector - 1);
705     }
706     return sector_num;
707 }
708
709 static void ide_set_sector(IDEState *s, int64_t sector_num)
710 {
711     unsigned int cyl, r;
712     if (s->select & 0x40) {
713         if (!s->lba48) {
714             s->select = (s->select & 0xf0) | (sector_num >> 24);
715             s->hcyl = (sector_num >> 16);
716             s->lcyl = (sector_num >> 8);
717             s->sector = (sector_num);
718         } else {
719             s->sector = sector_num;
720             s->lcyl = sector_num >> 8;
721             s->hcyl = sector_num >> 16;
722             s->hob_sector = sector_num >> 24;
723             s->hob_lcyl = sector_num >> 32;
724             s->hob_hcyl = sector_num >> 40;
725         }
726     } else {
727         cyl = sector_num / (s->heads * s->sectors);
728         r = sector_num % (s->heads * s->sectors);
729         s->hcyl = cyl >> 8;
730         s->lcyl = cyl;
731         s->select = (s->select & 0xf0) | ((r / s->sectors) & 0x0f);
732         s->sector = (r % s->sectors) + 1;
733     }
734 }
735
736 static void ide_sector_read(IDEState *s)
737 {
738     int64_t sector_num;
739     int ret, n;
740
741     s->status = READY_STAT | SEEK_STAT;
742     s->error = 0; /* not needed by IDE spec, but needed by Windows */
743     sector_num = ide_get_sector(s);
744     n = s->nsector;
745     if (n == 0) {
746         /* no more sector to read from disk */
747         ide_transfer_stop(s);
748     } else {
749 #if defined(DEBUG_IDE)
750         printf("read sector=%Ld\n", sector_num);
751 #endif
752         if (n > s->req_nb_sectors)
753             n = s->req_nb_sectors;
754         ret = bdrv_read(s->bs, sector_num, s->io_buffer, n);
755         ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_read);
756         ide_set_irq(s);
757         ide_set_sector(s, sector_num + n);
758         s->nsector -= n;
759     }
760 }
761
762 /* return 0 if buffer completed */
763 static int dma_buf_rw(BMDMAState *bm, int is_write)
764 {
765     IDEState *s = bm->ide_if;
766     struct {
767         uint32_t addr;
768         uint32_t size;
769     } prd;
770     int l, len;
771
772     for(;;) {
773         l = s->io_buffer_size - s->io_buffer_index;
774         if (l <= 0)
775             break;
776         if (bm->cur_prd_len == 0) {
777             /* end of table (with a fail safe of one page) */
778             if (bm->cur_prd_last ||
779                 (bm->cur_addr - bm->addr) >= 4096)
780                 return 0;
781             cpu_physical_memory_read(bm->cur_addr, (uint8_t *)&prd, 8);
782             bm->cur_addr += 8;
783             prd.addr = le32_to_cpu(prd.addr);
784             prd.size = le32_to_cpu(prd.size);
785             len = prd.size & 0xfffe;
786             if (len == 0)
787                 len = 0x10000;
788             bm->cur_prd_len = len;
789             bm->cur_prd_addr = prd.addr;
790             bm->cur_prd_last = (prd.size & 0x80000000);
791         }
792         if (l > bm->cur_prd_len)
793             l = bm->cur_prd_len;
794         if (l > 0) {
795             if (is_write) {
796                 cpu_physical_memory_write(bm->cur_prd_addr,
797                                           s->io_buffer + s->io_buffer_index, l);
798             } else {
799                 cpu_physical_memory_read(bm->cur_prd_addr,
800                                           s->io_buffer + s->io_buffer_index, l);
801             }
802             bm->cur_prd_addr += l;
803             bm->cur_prd_len -= l;
804             s->io_buffer_index += l;
805         }
806     }
807     return 1;
808 }
809
810 /* XXX: handle errors */
811 static void ide_read_dma_cb(void *opaque, int ret)
812 {
813     BMDMAState *bm = opaque;
814     IDEState *s = bm->ide_if;
815     int n;
816     int64_t sector_num;
817
818     n = s->io_buffer_size >> 9;
819     sector_num = ide_get_sector(s);
820     if (n > 0) {
821         sector_num += n;
822         ide_set_sector(s, sector_num);
823         s->nsector -= n;
824         if (dma_buf_rw(bm, 1) == 0)
825             goto eot;
826     }
827
828     /* end of transfer ? */
829     if (s->nsector == 0) {
830         s->status = READY_STAT | SEEK_STAT;
831         ide_set_irq(s);
832     eot:
833         bm->status &= ~BM_STATUS_DMAING;
834         bm->status |= BM_STATUS_INT;
835         bm->dma_cb = NULL;
836         bm->ide_if = NULL;
837         bm->aiocb = NULL;
838         return;
839     }
840
841     /* launch next transfer */
842     n = s->nsector;
843     if (n > MAX_MULT_SECTORS)
844         n = MAX_MULT_SECTORS;
845     s->io_buffer_index = 0;
846     s->io_buffer_size = n * 512;
847 #ifdef DEBUG_AIO
848     printf("aio_read: sector_num=%lld n=%d\n", sector_num, n);
849 #endif
850     bm->aiocb = bdrv_aio_read(s->bs, sector_num, s->io_buffer, n,
851                               ide_read_dma_cb, bm);
852 }
853
854 static void ide_sector_read_dma(IDEState *s)
855 {
856     s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT;
857     s->io_buffer_index = 0;
858     s->io_buffer_size = 0;
859     ide_dma_start(s, ide_read_dma_cb);
860 }
861
862 static void ide_sector_write_timer_cb(void *opaque)
863 {
864     IDEState *s = opaque;
865     ide_set_irq(s);
866 }
867
868 static void ide_sector_write_aio_cb(void *opaque, int ret)
869 {
870     BMDMAState *bm = opaque;
871     IDEState *s = bm->ide_if;
872
873 #ifdef TARGET_I386
874     if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
875         /* It seems there is a bug in the Windows 2000 installer HDD
876            IDE driver which fills the disk with empty logs when the
877            IDE write IRQ comes too early. This hack tries to correct
878            that at the expense of slower write performances. Use this
879            option _only_ to install Windows 2000. You must disable it
880            for normal use. */
881         qemu_mod_timer(s->sector_write_timer,
882                        qemu_get_clock(vm_clock) + (ticks_per_sec / 1000));
883     } else
884 #endif
885     {
886         ide_set_irq(s);
887     }
888     bm->aiocb = NULL;
889 }
890
891 static void ide_sector_write(IDEState *s)
892 {
893     BMDMAState *bm;
894     int64_t sector_num;
895     int n, n1;
896
897     s->io_buffer_index = 0;
898     s->io_buffer_size = 0;
899     bm = s->bmdma;
900     if(bm == NULL) {
901         bm = qemu_mallocz(sizeof(BMDMAState));
902         s->bmdma = bm;
903     }
904     bm->ide_if = s;
905     bm->dma_cb = ide_sector_write_aio_cb;
906
907     s->status = READY_STAT | SEEK_STAT;
908     sector_num = ide_get_sector(s);
909 #if defined(DEBUG_IDE)
910     printf("write sector=%Ld\n", sector_num);
911 #endif
912     n = s->nsector;
913     if (n > s->req_nb_sectors)
914         n = s->req_nb_sectors;
915     s->nsector -= n;
916     if (s->nsector == 0) {
917         /* no more sectors to write */
918         ide_transfer_stop(s);
919     } else {
920         n1 = s->nsector;
921         if (n1 > s->req_nb_sectors)
922             n1 = s->req_nb_sectors;
923         ide_transfer_start(s, s->io_buffer, 512 * n1, ide_sector_write);
924     }
925     ide_set_sector(s, sector_num + n);
926
927     bm->aiocb = bdrv_aio_write(s->bs, sector_num, s->io_buffer, n,
928                                ide_sector_write_aio_cb, bm);
929 }
930
931 /* XXX: handle errors */
932 static void ide_write_dma_cb(void *opaque, int ret)
933 {
934     BMDMAState *bm = opaque;
935     IDEState *s = bm->ide_if;
936     int n;
937     int64_t sector_num;
938
939     n = s->io_buffer_size >> 9;
940     sector_num = ide_get_sector(s);
941     if (n > 0) {
942         sector_num += n;
943         ide_set_sector(s, sector_num);
944         s->nsector -= n;
945     }
946
947     /* end of transfer ? */
948     if (s->nsector == 0) {
949         s->status = READY_STAT | SEEK_STAT;
950         ide_set_irq(s);
951     eot:
952         bm->status &= ~BM_STATUS_DMAING;
953         bm->status |= BM_STATUS_INT;
954         bm->dma_cb = NULL;
955         bm->ide_if = NULL;
956         bm->aiocb = NULL;
957         return;
958     }
959
960     /* launch next transfer */
961     n = s->nsector;
962     if (n > MAX_MULT_SECTORS)
963         n = MAX_MULT_SECTORS;
964     s->io_buffer_index = 0;
965     s->io_buffer_size = n * 512;
966
967     if (dma_buf_rw(bm, 0) == 0)
968         goto eot;
969 #ifdef DEBUG_AIO
970     printf("aio_write: sector_num=%lld n=%d\n", sector_num, n);
971 #endif
972     bm->aiocb = bdrv_aio_write(s->bs, sector_num, s->io_buffer, n,
973                                ide_write_dma_cb, bm);
974 }
975
976 static void ide_sector_write_dma(IDEState *s)
977 {
978     s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT;
979     s->io_buffer_index = 0;
980     s->io_buffer_size = 0;
981     ide_dma_start(s, ide_write_dma_cb);
982 }
983
984 static void ide_atapi_cmd_ok(IDEState *s)
985 {
986     s->error = 0;
987     s->status = READY_STAT;
988     s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
989     ide_set_irq(s);
990 }
991
992 static void ide_atapi_cmd_error(IDEState *s, int sense_key, int asc)
993 {
994 #ifdef DEBUG_IDE_ATAPI
995     printf("atapi_cmd_error: sense=0x%x asc=0x%x\n", sense_key, asc);
996 #endif
997     s->error = sense_key << 4;
998     s->status = READY_STAT | ERR_STAT;
999     s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
1000     s->sense_key = sense_key;
1001     s->asc = asc;
1002     ide_set_irq(s);
1003 }
1004
1005 static inline void cpu_to_ube16(uint8_t *buf, int val)
1006 {
1007     buf[0] = val >> 8;
1008     buf[1] = val;
1009 }
1010
1011 static inline void cpu_to_ube32(uint8_t *buf, unsigned int val)
1012 {
1013     buf[0] = val >> 24;
1014     buf[1] = val >> 16;
1015     buf[2] = val >> 8;
1016     buf[3] = val;
1017 }
1018
1019 static inline int ube16_to_cpu(const uint8_t *buf)
1020 {
1021     return (buf[0] << 8) | buf[1];
1022 }
1023
1024 static inline int ube32_to_cpu(const uint8_t *buf)
1025 {
1026     return (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
1027 }
1028
1029 static void lba_to_msf(uint8_t *buf, int lba)
1030 {
1031     lba += 150;
1032     buf[0] = (lba / 75) / 60;
1033     buf[1] = (lba / 75) % 60;
1034     buf[2] = lba % 75;
1035 }
1036
1037 static void cd_data_to_raw(uint8_t *buf, int lba)
1038 {
1039     /* sync bytes */
1040     buf[0] = 0x00;
1041     memset(buf + 1, 0xff, 10);
1042     buf[11] = 0x00;
1043     buf += 12;
1044     /* MSF */
1045     lba_to_msf(buf, lba);
1046     buf[3] = 0x01; /* mode 1 data */
1047     buf += 4;
1048     /* data */
1049     buf += 2048;
1050     /* XXX: ECC not computed */
1051     memset(buf, 0, 288);
1052 }
1053
1054 static int cd_read_sector(BlockDriverState *bs, int lba, uint8_t *buf,
1055                            int sector_size)
1056 {
1057     int ret;
1058
1059     switch(sector_size) {
1060     case 2048:
1061         ret = bdrv_read(bs, (int64_t)lba << 2, buf, 4);
1062         break;
1063     case 2352:
1064         ret = bdrv_read(bs, (int64_t)lba << 2, buf + 16, 4);
1065         if (ret < 0)
1066             return ret;
1067         cd_data_to_raw(buf, lba);
1068         break;
1069     default:
1070         ret = -EIO;
1071         break;
1072     }
1073     return ret;
1074 }
1075
1076 static void ide_atapi_io_error(IDEState *s, int ret)
1077 {
1078     /* XXX: handle more errors */
1079     if (ret == -ENOMEDIUM) {
1080         ide_atapi_cmd_error(s, SENSE_NOT_READY,
1081                             ASC_MEDIUM_NOT_PRESENT);
1082     } else {
1083         ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1084                             ASC_LOGICAL_BLOCK_OOR);
1085     }
1086 }
1087
1088 /* The whole ATAPI transfer logic is handled in this function */
1089 static void ide_atapi_cmd_reply_end(IDEState *s)
1090 {
1091     int byte_count_limit, size, ret;
1092 #ifdef DEBUG_IDE_ATAPI
1093     printf("reply: tx_size=%d elem_tx_size=%d index=%d\n",
1094            s->packet_transfer_size,
1095            s->elementary_transfer_size,
1096            s->io_buffer_index);
1097 #endif
1098     if (s->packet_transfer_size <= 0) {
1099         /* end of transfer */
1100         ide_transfer_stop(s);
1101         s->status = READY_STAT;
1102         s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
1103         ide_set_irq(s);
1104 #ifdef DEBUG_IDE_ATAPI
1105         printf("status=0x%x\n", s->status);
1106 #endif
1107     } else {
1108         /* see if a new sector must be read */
1109         if (s->lba != -1 && s->io_buffer_index >= s->cd_sector_size) {
1110             ret = cd_read_sector(s->bs, s->lba, s->io_buffer, s->cd_sector_size);
1111             if (ret < 0) {
1112                 ide_transfer_stop(s);
1113                 ide_atapi_io_error(s, ret);
1114                 return;
1115             }
1116             s->lba++;
1117             s->io_buffer_index = 0;
1118         }
1119         if (s->elementary_transfer_size > 0) {
1120             /* there are some data left to transmit in this elementary
1121                transfer */
1122             size = s->cd_sector_size - s->io_buffer_index;
1123             if (size > s->elementary_transfer_size)
1124                 size = s->elementary_transfer_size;
1125             ide_transfer_start(s, s->io_buffer + s->io_buffer_index,
1126                                size, ide_atapi_cmd_reply_end);
1127             s->packet_transfer_size -= size;
1128             s->elementary_transfer_size -= size;
1129             s->io_buffer_index += size;
1130         } else {
1131             /* a new transfer is needed */
1132             s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO;
1133             byte_count_limit = s->lcyl | (s->hcyl << 8);
1134 #ifdef DEBUG_IDE_ATAPI
1135             printf("byte_count_limit=%d\n", byte_count_limit);
1136 #endif
1137             if (byte_count_limit == 0xffff)
1138                 byte_count_limit--;
1139             size = s->packet_transfer_size;
1140             if (size > byte_count_limit) {
1141                 /* byte count limit must be even if this case */
1142                 if (byte_count_limit & 1)
1143                     byte_count_limit--;
1144                 size = byte_count_limit;
1145             }
1146             s->lcyl = size;
1147             s->hcyl = size >> 8;
1148             s->elementary_transfer_size = size;
1149             /* we cannot transmit more than one sector at a time */
1150             if (s->lba != -1) {
1151                 if (size > (s->cd_sector_size - s->io_buffer_index))
1152                     size = (s->cd_sector_size - s->io_buffer_index);
1153             }
1154             ide_transfer_start(s, s->io_buffer + s->io_buffer_index,
1155                                size, ide_atapi_cmd_reply_end);
1156             s->packet_transfer_size -= size;
1157             s->elementary_transfer_size -= size;
1158             s->io_buffer_index += size;
1159             ide_set_irq(s);
1160 #ifdef DEBUG_IDE_ATAPI
1161             printf("status=0x%x\n", s->status);
1162 #endif
1163         }
1164     }
1165 }
1166
1167 /* send a reply of 'size' bytes in s->io_buffer to an ATAPI command */
1168 static void ide_atapi_cmd_reply(IDEState *s, int size, int max_size)
1169 {
1170     if (size > max_size)
1171         size = max_size;
1172     s->lba = -1; /* no sector read */
1173     s->packet_transfer_size = size;
1174     s->io_buffer_size = size;    /* dma: send the reply data as one chunk */
1175     s->elementary_transfer_size = 0;
1176     s->io_buffer_index = 0;
1177
1178     if (s->atapi_dma) {
1179         s->status = READY_STAT | DRQ_STAT;
1180         ide_dma_start(s, ide_atapi_cmd_read_dma_cb);
1181     } else {
1182         s->status = READY_STAT;
1183         ide_atapi_cmd_reply_end(s);
1184     }
1185 }
1186
1187 /* start a CD-CDROM read command */
1188 static void ide_atapi_cmd_read_pio(IDEState *s, int lba, int nb_sectors,
1189                                    int sector_size)
1190 {
1191     s->lba = lba;
1192     s->packet_transfer_size = nb_sectors * sector_size;
1193     s->elementary_transfer_size = 0;
1194     s->io_buffer_index = sector_size;
1195     s->cd_sector_size = sector_size;
1196
1197     s->status = READY_STAT;
1198     ide_atapi_cmd_reply_end(s);
1199 }
1200
1201 /* ATAPI DMA support */
1202
1203 /* XXX: handle read errors */
1204 static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret)
1205 {
1206     BMDMAState *bm = opaque;
1207     IDEState *s = bm->ide_if;
1208     int data_offset, n;
1209
1210     if (ret < 0) {
1211         ide_atapi_io_error(s, ret);
1212         goto eot;
1213     }
1214
1215     if (s->io_buffer_size > 0) {
1216         /*
1217          * For a cdrom read sector command (s->lba != -1),
1218          * adjust the lba for the next s->io_buffer_size chunk
1219          * and dma the current chunk.
1220          * For a command != read (s->lba == -1), just transfer
1221          * the reply data.
1222          */
1223         if (s->lba != -1) {
1224             if (s->cd_sector_size == 2352) {
1225                 n = 1;
1226                 cd_data_to_raw(s->io_buffer, s->lba);
1227             } else {
1228                 n = s->io_buffer_size >> 11;
1229             }
1230             s->lba += n;
1231         }
1232         s->packet_transfer_size -= s->io_buffer_size;
1233         if (dma_buf_rw(bm, 1) == 0)
1234             goto eot;
1235     }
1236
1237     if (s->packet_transfer_size <= 0) {
1238         s->status = READY_STAT;
1239         s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
1240         ide_set_irq(s);
1241     eot:
1242         bm->status &= ~BM_STATUS_DMAING;
1243         bm->status |= BM_STATUS_INT;
1244         bm->dma_cb = NULL;
1245         bm->ide_if = NULL;
1246         bm->aiocb = NULL;
1247         return;
1248     }
1249
1250     s->io_buffer_index = 0;
1251     if (s->cd_sector_size == 2352) {
1252         n = 1;
1253         s->io_buffer_size = s->cd_sector_size;
1254         data_offset = 16;
1255     } else {
1256         n = s->packet_transfer_size >> 11;
1257         if (n > (MAX_MULT_SECTORS / 4))
1258             n = (MAX_MULT_SECTORS / 4);
1259         s->io_buffer_size = n * 2048;
1260         data_offset = 0;
1261     }
1262 #ifdef DEBUG_AIO
1263     printf("aio_read_cd: lba=%u n=%d\n", s->lba, n);
1264 #endif
1265     bm->aiocb = bdrv_aio_read(s->bs, (int64_t)s->lba << 2,
1266                               s->io_buffer + data_offset, n * 4,
1267                               ide_atapi_cmd_read_dma_cb, bm);
1268     if (!bm->aiocb) {
1269         /* Note: media not present is the most likely case */
1270         ide_atapi_cmd_error(s, SENSE_NOT_READY,
1271                             ASC_MEDIUM_NOT_PRESENT);
1272         goto eot;
1273     }
1274 }
1275
1276 /* start a CD-CDROM read command with DMA */
1277 /* XXX: test if DMA is available */
1278 static void ide_atapi_cmd_read_dma(IDEState *s, int lba, int nb_sectors,
1279                                    int sector_size)
1280 {
1281     s->lba = lba;
1282     s->packet_transfer_size = nb_sectors * sector_size;
1283     s->io_buffer_index = 0;
1284     s->io_buffer_size = 0;
1285     s->cd_sector_size = sector_size;
1286
1287     /* XXX: check if BUSY_STAT should be set */
1288     s->status = READY_STAT | DRQ_STAT | BUSY_STAT;
1289     ide_dma_start(s, ide_atapi_cmd_read_dma_cb);
1290 }
1291
1292 static void ide_atapi_cmd_read(IDEState *s, int lba, int nb_sectors,
1293                                int sector_size)
1294 {
1295 #ifdef DEBUG_IDE_ATAPI
1296     printf("read %s: LBA=%d nb_sectors=%d\n", s->atapi_dma ? "dma" : "pio",
1297         lba, nb_sectors);
1298 #endif
1299     if (s->atapi_dma) {
1300         ide_atapi_cmd_read_dma(s, lba, nb_sectors, sector_size);
1301     } else {
1302         ide_atapi_cmd_read_pio(s, lba, nb_sectors, sector_size);
1303     }
1304 }
1305
1306 static void ide_atapi_cmd(IDEState *s)
1307 {
1308     const uint8_t *packet;
1309     uint8_t *buf;
1310     int max_len;
1311
1312     packet = s->io_buffer;
1313     buf = s->io_buffer;
1314 #ifdef DEBUG_IDE_ATAPI
1315     {
1316         int i;
1317         printf("ATAPI limit=0x%x packet:", s->lcyl | (s->hcyl << 8));
1318         for(i = 0; i < ATAPI_PACKET_SIZE; i++) {
1319             printf(" %02x", packet[i]);
1320         }
1321         printf("\n");
1322     }
1323 #endif
1324     switch(s->io_buffer[0]) {
1325     case GPCMD_TEST_UNIT_READY:
1326         if (bdrv_is_inserted(s->bs)) {
1327             ide_atapi_cmd_ok(s);
1328         } else {
1329             ide_atapi_cmd_error(s, SENSE_NOT_READY,
1330                                 ASC_MEDIUM_NOT_PRESENT);
1331         }
1332         break;
1333     case GPCMD_MODE_SENSE_6:
1334     case GPCMD_MODE_SENSE_10:
1335         {
1336             int action, code;
1337             if (packet[0] == GPCMD_MODE_SENSE_10)
1338                 max_len = ube16_to_cpu(packet + 7);
1339             else
1340                 max_len = packet[4];
1341             action = packet[2] >> 6;
1342             code = packet[2] & 0x3f;
1343             switch(action) {
1344             case 0: /* current values */
1345                 switch(code) {
1346                 case 0x01: /* error recovery */
1347                     cpu_to_ube16(&buf[0], 16 + 6);
1348                     buf[2] = 0x70;
1349                     buf[3] = 0;
1350                     buf[4] = 0;
1351                     buf[5] = 0;
1352                     buf[6] = 0;
1353                     buf[7] = 0;
1354
1355                     buf[8] = 0x01;
1356                     buf[9] = 0x06;
1357                     buf[10] = 0x00;
1358                     buf[11] = 0x05;
1359                     buf[12] = 0x00;
1360                     buf[13] = 0x00;
1361                     buf[14] = 0x00;
1362                     buf[15] = 0x00;
1363                     ide_atapi_cmd_reply(s, 16, max_len);
1364                     break;
1365                 case 0x2a:
1366                     cpu_to_ube16(&buf[0], 28 + 6);
1367                     buf[2] = 0x70;
1368                     buf[3] = 0;
1369                     buf[4] = 0;
1370                     buf[5] = 0;
1371                     buf[6] = 0;
1372                     buf[7] = 0;
1373
1374                     buf[8] = 0x2a;
1375                     buf[9] = 0x12;
1376                     buf[10] = 0x08;
1377                     buf[11] = 0x00;
1378
1379                     buf[12] = 0x70;
1380                     buf[13] = 3 << 5;
1381                     buf[14] = (1 << 0) | (1 << 3) | (1 << 5);
1382                     if (bdrv_is_locked(s->bs))
1383                         buf[6] |= 1 << 1;
1384                     buf[15] = 0x00;
1385                     cpu_to_ube16(&buf[16], 706);
1386                     buf[18] = 0;
1387                     buf[19] = 2;
1388                     cpu_to_ube16(&buf[20], 512);
1389                     cpu_to_ube16(&buf[22], 706);
1390                     buf[24] = 0;
1391                     buf[25] = 0;
1392                     buf[26] = 0;
1393                     buf[27] = 0;
1394                     ide_atapi_cmd_reply(s, 28, max_len);
1395                     break;
1396                 default:
1397                     goto error_cmd;
1398                 }
1399                 break;
1400             case 1: /* changeable values */
1401                 goto error_cmd;
1402             case 2: /* default values */
1403                 goto error_cmd;
1404             default:
1405             case 3: /* saved values */
1406                 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1407                                     ASC_SAVING_PARAMETERS_NOT_SUPPORTED);
1408                 break;
1409             }
1410         }
1411         break;
1412     case GPCMD_REQUEST_SENSE:
1413         max_len = packet[4];
1414         memset(buf, 0, 18);
1415         buf[0] = 0x70 | (1 << 7);
1416         buf[2] = s->sense_key;
1417         buf[7] = 10;
1418         buf[12] = s->asc;
1419         ide_atapi_cmd_reply(s, 18, max_len);
1420         break;
1421     case GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL:
1422         if (bdrv_is_inserted(s->bs)) {
1423             bdrv_set_locked(s->bs, packet[4] & 1);
1424             ide_atapi_cmd_ok(s);
1425         } else {
1426             ide_atapi_cmd_error(s, SENSE_NOT_READY,
1427                                 ASC_MEDIUM_NOT_PRESENT);
1428         }
1429         break;
1430     case GPCMD_READ_10:
1431     case GPCMD_READ_12:
1432         {
1433             int nb_sectors, lba;
1434
1435             if (packet[0] == GPCMD_READ_10)
1436                 nb_sectors = ube16_to_cpu(packet + 7);
1437             else
1438                 nb_sectors = ube32_to_cpu(packet + 6);
1439             lba = ube32_to_cpu(packet + 2);
1440             if (nb_sectors == 0) {
1441                 ide_atapi_cmd_ok(s);
1442                 break;
1443             }
1444             ide_atapi_cmd_read(s, lba, nb_sectors, 2048);
1445         }
1446         break;
1447     case GPCMD_READ_CD:
1448         {
1449             int nb_sectors, lba, transfer_request;
1450
1451             nb_sectors = (packet[6] << 16) | (packet[7] << 8) | packet[8];
1452             lba = ube32_to_cpu(packet + 2);
1453             if (nb_sectors == 0) {
1454                 ide_atapi_cmd_ok(s);
1455                 break;
1456             }
1457             transfer_request = packet[9];
1458             switch(transfer_request & 0xf8) {
1459             case 0x00:
1460                 /* nothing */
1461                 ide_atapi_cmd_ok(s);
1462                 break;
1463             case 0x10:
1464                 /* normal read */
1465                 ide_atapi_cmd_read(s, lba, nb_sectors, 2048);
1466                 break;
1467             case 0xf8:
1468                 /* read all data */
1469                 ide_atapi_cmd_read(s, lba, nb_sectors, 2352);
1470                 break;
1471             default:
1472                 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1473                                     ASC_INV_FIELD_IN_CMD_PACKET);
1474                 break;
1475             }
1476         }
1477         break;
1478     case GPCMD_SEEK:
1479         {
1480             int lba;
1481             int64_t total_sectors;
1482
1483             bdrv_get_geometry(s->bs, &total_sectors);
1484             total_sectors >>= 2;
1485             if (total_sectors <= 0) {
1486                 ide_atapi_cmd_error(s, SENSE_NOT_READY,
1487                                     ASC_MEDIUM_NOT_PRESENT);
1488                 break;
1489             }
1490             lba = ube32_to_cpu(packet + 2);
1491             if (lba >= total_sectors) {
1492                 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1493                                     ASC_LOGICAL_BLOCK_OOR);
1494                 break;
1495             }
1496             ide_atapi_cmd_ok(s);
1497         }
1498         break;
1499     case GPCMD_START_STOP_UNIT:
1500         {
1501             int start, eject;
1502             start = packet[4] & 1;
1503             eject = (packet[4] >> 1) & 1;
1504
1505             if (eject && !start) {
1506                 /* eject the disk */
1507                 bdrv_eject(s->bs, 1);
1508             } else if (eject && start) {
1509                 /* close the tray */
1510                 bdrv_eject(s->bs, 0);
1511             }
1512             ide_atapi_cmd_ok(s);
1513         }
1514         break;
1515     case GPCMD_MECHANISM_STATUS:
1516         {
1517             max_len = ube16_to_cpu(packet + 8);
1518             cpu_to_ube16(buf, 0);
1519             /* no current LBA */
1520             buf[2] = 0;
1521             buf[3] = 0;
1522             buf[4] = 0;
1523             buf[5] = 1;
1524             cpu_to_ube16(buf + 6, 0);
1525             ide_atapi_cmd_reply(s, 8, max_len);
1526         }
1527         break;
1528     case GPCMD_READ_TOC_PMA_ATIP:
1529         {
1530             int format, msf, start_track, len;
1531             int64_t total_sectors;
1532
1533             bdrv_get_geometry(s->bs, &total_sectors);
1534             total_sectors >>= 2;
1535             if (total_sectors <= 0) {
1536                 ide_atapi_cmd_error(s, SENSE_NOT_READY,
1537                                     ASC_MEDIUM_NOT_PRESENT);
1538                 break;
1539             }
1540             max_len = ube16_to_cpu(packet + 7);
1541             format = packet[9] >> 6;
1542             msf = (packet[1] >> 1) & 1;
1543             start_track = packet[6];
1544             switch(format) {
1545             case 0:
1546                 len = cdrom_read_toc(total_sectors, buf, msf, start_track);
1547                 if (len < 0)
1548                     goto error_cmd;
1549                 ide_atapi_cmd_reply(s, len, max_len);
1550                 break;
1551             case 1:
1552                 /* multi session : only a single session defined */
1553                 memset(buf, 0, 12);
1554                 buf[1] = 0x0a;
1555                 buf[2] = 0x01;
1556                 buf[3] = 0x01;
1557                 ide_atapi_cmd_reply(s, 12, max_len);
1558                 break;
1559             case 2:
1560                 len = cdrom_read_toc_raw(total_sectors, buf, msf, start_track);
1561                 if (len < 0)
1562                     goto error_cmd;
1563                 ide_atapi_cmd_reply(s, len, max_len);
1564                 break;
1565             default:
1566             error_cmd:
1567                 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1568                                     ASC_INV_FIELD_IN_CMD_PACKET);
1569                 break;
1570             }
1571         }
1572         break;
1573     case GPCMD_READ_CDVD_CAPACITY:
1574         {
1575             int64_t total_sectors;
1576
1577             bdrv_get_geometry(s->bs, &total_sectors);
1578             total_sectors >>= 2;
1579             if (total_sectors <= 0) {
1580                 ide_atapi_cmd_error(s, SENSE_NOT_READY,
1581                                     ASC_MEDIUM_NOT_PRESENT);
1582                 break;
1583             }
1584             /* NOTE: it is really the number of sectors minus 1 */
1585             cpu_to_ube32(buf, total_sectors - 1);
1586             cpu_to_ube32(buf + 4, 2048);
1587             ide_atapi_cmd_reply(s, 8, 8);
1588         }
1589         break;
1590     case GPCMD_READ_DVD_STRUCTURE:
1591         {
1592             int media = packet[1];
1593             int layer = packet[6];
1594             int format = packet[2];
1595             int64_t total_sectors;
1596
1597             if (media != 0 || layer != 0)
1598             {
1599                 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1600                                     ASC_INV_FIELD_IN_CMD_PACKET);
1601             }
1602
1603             switch (format) {
1604                 case 0:
1605                     bdrv_get_geometry(s->bs, &total_sectors);
1606                     total_sectors >>= 2;
1607
1608                     memset(buf, 0, 2052);
1609
1610                     buf[4] = 1;   // DVD-ROM, part version 1
1611                     buf[5] = 0xf; // 120mm disc, maximum rate unspecified
1612                     buf[6] = 0;   // one layer, embossed data
1613                     buf[7] = 0;
1614
1615                     cpu_to_ube32(buf + 8, 0);
1616                     cpu_to_ube32(buf + 12, total_sectors - 1);
1617                     cpu_to_ube32(buf + 16, total_sectors - 1);
1618
1619                     cpu_to_be16wu((uint16_t *)buf, 2048 + 4);
1620
1621                     ide_atapi_cmd_reply(s, 2048 + 3, 2048 + 4);
1622                     break;
1623
1624                 default:
1625                     ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1626                                         ASC_INV_FIELD_IN_CMD_PACKET);
1627                     break;
1628             }
1629         }
1630         break;
1631     case GPCMD_SET_SPEED:
1632         ide_atapi_cmd_ok(s);
1633         break;
1634     case GPCMD_INQUIRY:
1635         max_len = packet[4];
1636         buf[0] = 0x05; /* CD-ROM */
1637         buf[1] = 0x80; /* removable */
1638         buf[2] = 0x00; /* ISO */
1639         buf[3] = 0x21; /* ATAPI-2 (XXX: put ATAPI-4 ?) */
1640         buf[4] = 31; /* additional length */
1641         buf[5] = 0; /* reserved */
1642         buf[6] = 0; /* reserved */
1643         buf[7] = 0; /* reserved */
1644         padstr8(buf + 8, 8, "QEMU");
1645         padstr8(buf + 16, 16, "QEMU CD-ROM");
1646         padstr8(buf + 32, 4, QEMU_VERSION);
1647         ide_atapi_cmd_reply(s, 36, max_len);
1648         break;
1649     case GPCMD_GET_CONFIGURATION:
1650         {
1651             int64_t total_sectors;
1652
1653             /* only feature 0 is supported */
1654             if (packet[2] != 0 || packet[3] != 0) {
1655                 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1656                                     ASC_INV_FIELD_IN_CMD_PACKET);
1657                 break;
1658             }
1659             memset(buf, 0, 32);
1660             bdrv_get_geometry(s->bs, &total_sectors);
1661             buf[3] = 16;
1662             buf[7] = total_sectors <= 1433600 ? 0x08 : 0x10; /* current profile */
1663             buf[10] = 0x10 | 0x1;
1664             buf[11] = 0x08; /* size of profile list */
1665             buf[13] = 0x10; /* DVD-ROM profile */
1666             buf[14] = buf[7] == 0x10; /* (in)active */
1667             buf[17] = 0x08; /* CD-ROM profile */
1668             buf[18] = buf[7] == 0x08; /* (in)active */
1669             ide_atapi_cmd_reply(s, 32, 32);
1670             break;
1671         }
1672     default:
1673         ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1674                             ASC_ILLEGAL_OPCODE);
1675         break;
1676     }
1677 }
1678
1679 static void ide_cfata_metadata_inquiry(IDEState *s)
1680 {
1681     uint16_t *p;
1682     uint32_t spd;
1683
1684     p = (uint16_t *) s->io_buffer;
1685     memset(p, 0, 0x200);
1686     spd = ((s->mdata_size - 1) >> 9) + 1;
1687
1688     put_le16(p + 0, 0x0001);                    /* Data format revision */
1689     put_le16(p + 1, 0x0000);                    /* Media property: silicon */
1690     put_le16(p + 2, s->media_changed);          /* Media status */
1691     put_le16(p + 3, s->mdata_size & 0xffff);    /* Capacity in bytes (low) */
1692     put_le16(p + 4, s->mdata_size >> 16);       /* Capacity in bytes (high) */
1693     put_le16(p + 5, spd & 0xffff);              /* Sectors per device (low) */
1694     put_le16(p + 6, spd >> 16);                 /* Sectors per device (high) */
1695 }
1696
1697 static void ide_cfata_metadata_read(IDEState *s)
1698 {
1699     uint16_t *p;
1700
1701     if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
1702         s->status = ERR_STAT;
1703         s->error = ABRT_ERR;
1704         return;
1705     }
1706
1707     p = (uint16_t *) s->io_buffer;
1708     memset(p, 0, 0x200);
1709
1710     put_le16(p + 0, s->media_changed);          /* Media status */
1711     memcpy(p + 1, s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
1712                     MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
1713                                     s->nsector << 9), 0x200 - 2));
1714 }
1715
1716 static void ide_cfata_metadata_write(IDEState *s)
1717 {
1718     if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
1719         s->status = ERR_STAT;
1720         s->error = ABRT_ERR;
1721         return;
1722     }
1723
1724     s->media_changed = 0;
1725
1726     memcpy(s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
1727                     s->io_buffer + 2,
1728                     MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
1729                                     s->nsector << 9), 0x200 - 2));
1730 }
1731
1732 /* called when the inserted state of the media has changed */
1733 static void cdrom_change_cb(void *opaque)
1734 {
1735     IDEState *s = opaque;
1736     int64_t nb_sectors;
1737
1738     /* XXX: send interrupt too */
1739     bdrv_get_geometry(s->bs, &nb_sectors);
1740     s->nb_sectors = nb_sectors;
1741 }
1742
1743 static void ide_cmd_lba48_transform(IDEState *s, int lba48)
1744 {
1745     s->lba48 = lba48;
1746
1747     /* handle the 'magic' 0 nsector count conversion here. to avoid
1748      * fiddling with the rest of the read logic, we just store the
1749      * full sector count in ->nsector and ignore ->hob_nsector from now
1750      */
1751     if (!s->lba48) {
1752         if (!s->nsector)
1753             s->nsector = 256;
1754     } else {
1755         if (!s->nsector && !s->hob_nsector)
1756             s->nsector = 65536;
1757         else {
1758             int lo = s->nsector;
1759             int hi = s->hob_nsector;
1760
1761             s->nsector = (hi << 8) | lo;
1762         }
1763     }
1764 }
1765
1766 static void ide_clear_hob(IDEState *ide_if)
1767 {
1768     /* any write clears HOB high bit of device control register */
1769     ide_if[0].select &= ~(1 << 7);
1770     ide_if[1].select &= ~(1 << 7);
1771 }
1772
1773 static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
1774 {
1775     IDEState *ide_if = opaque;
1776     IDEState *s;
1777     int unit, n;
1778     int lba48 = 0;
1779
1780 #ifdef DEBUG_IDE
1781     printf("IDE: write addr=0x%x val=0x%02x\n", addr, val);
1782 #endif
1783
1784     addr &= 7;
1785     switch(addr) {
1786     case 0:
1787         break;
1788     case 1:
1789         ide_clear_hob(ide_if);
1790         /* NOTE: data is written to the two drives */
1791         ide_if[0].hob_feature = ide_if[0].feature;
1792         ide_if[1].hob_feature = ide_if[1].feature;
1793         ide_if[0].feature = val;
1794         ide_if[1].feature = val;
1795         break;
1796     case 2:
1797         ide_clear_hob(ide_if);
1798         ide_if[0].hob_nsector = ide_if[0].nsector;
1799         ide_if[1].hob_nsector = ide_if[1].nsector;
1800         ide_if[0].nsector = val;
1801         ide_if[1].nsector = val;
1802         break;
1803     case 3:
1804         ide_clear_hob(ide_if);
1805         ide_if[0].hob_sector = ide_if[0].sector;
1806         ide_if[1].hob_sector = ide_if[1].sector;
1807         ide_if[0].sector = val;
1808         ide_if[1].sector = val;
1809         break;
1810     case 4:
1811         ide_clear_hob(ide_if);
1812         ide_if[0].hob_lcyl = ide_if[0].lcyl;
1813         ide_if[1].hob_lcyl = ide_if[1].lcyl;
1814         ide_if[0].lcyl = val;
1815         ide_if[1].lcyl = val;
1816         break;
1817     case 5:
1818         ide_clear_hob(ide_if);
1819         ide_if[0].hob_hcyl = ide_if[0].hcyl;
1820         ide_if[1].hob_hcyl = ide_if[1].hcyl;
1821         ide_if[0].hcyl = val;
1822         ide_if[1].hcyl = val;
1823         break;
1824     case 6:
1825         /* FIXME: HOB readback uses bit 7 */
1826         ide_if[0].select = (val & ~0x10) | 0xa0;
1827         ide_if[1].select = (val | 0x10) | 0xa0;
1828         /* select drive */
1829         unit = (val >> 4) & 1;
1830         s = ide_if + unit;
1831         ide_if->cur_drive = s;
1832         break;
1833     default:
1834     case 7:
1835         /* command */
1836 #if defined(DEBUG_IDE)
1837         printf("ide: CMD=%02x\n", val);
1838 #endif
1839         s = ide_if->cur_drive;
1840         /* ignore commands to non existant slave */
1841         if (s != ide_if && !s->bs)
1842             break;
1843
1844         switch(val) {
1845         case WIN_IDENTIFY:
1846             if (s->bs && !s->is_cdrom) {
1847                 if (!s->is_cf)
1848                     ide_identify(s);
1849                 else
1850                     ide_cfata_identify(s);
1851                 s->status = READY_STAT | SEEK_STAT;
1852                 ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1853             } else {
1854                 if (s->is_cdrom) {
1855                     ide_set_signature(s);
1856                 }
1857                 ide_abort_command(s);
1858             }
1859             ide_set_irq(s);
1860             break;
1861         case WIN_SPECIFY:
1862         case WIN_RECAL:
1863             s->error = 0;
1864             s->status = READY_STAT | SEEK_STAT;
1865             ide_set_irq(s);
1866             break;
1867         case WIN_SETMULT:
1868             if (s->is_cf && s->nsector == 0) {
1869                 /* Disable Read and Write Multiple */
1870                 s->mult_sectors = 0;
1871                 s->status = READY_STAT;
1872             } else if ((s->nsector & 0xff) != 0 &&
1873                 ((s->nsector & 0xff) > MAX_MULT_SECTORS ||
1874                  (s->nsector & (s->nsector - 1)) != 0)) {
1875                 ide_abort_command(s);
1876             } else {
1877                 s->mult_sectors = s->nsector & 0xff;
1878                 s->status = READY_STAT;
1879             }
1880             ide_set_irq(s);
1881             break;
1882         case WIN_VERIFY_EXT:
1883             lba48 = 1;
1884         case WIN_VERIFY:
1885         case WIN_VERIFY_ONCE:
1886             /* do sector number check ? */
1887             ide_cmd_lba48_transform(s, lba48);
1888             s->status = READY_STAT;
1889             ide_set_irq(s);
1890             break;
1891         case WIN_READ_EXT:
1892             lba48 = 1;
1893         case WIN_READ:
1894         case WIN_READ_ONCE:
1895             if (!s->bs)
1896                 goto abort_cmd;
1897             ide_cmd_lba48_transform(s, lba48);
1898             s->req_nb_sectors = 1;
1899             ide_sector_read(s);
1900             break;
1901         case WIN_WRITE_EXT:
1902             lba48 = 1;
1903         case WIN_WRITE:
1904         case WIN_WRITE_ONCE:
1905         case CFA_WRITE_SECT_WO_ERASE:
1906         case WIN_WRITE_VERIFY:
1907             ide_cmd_lba48_transform(s, lba48);
1908             s->error = 0;
1909             s->status = SEEK_STAT | READY_STAT;
1910             s->req_nb_sectors = 1;
1911             ide_transfer_start(s, s->io_buffer, 512, ide_sector_write);
1912             s->media_changed = 1;
1913             break;
1914         case WIN_MULTREAD_EXT:
1915             lba48 = 1;
1916         case WIN_MULTREAD:
1917             if (!s->mult_sectors)
1918                 goto abort_cmd;
1919             ide_cmd_lba48_transform(s, lba48);
1920             s->req_nb_sectors = s->mult_sectors;
1921             ide_sector_read(s);
1922             break;
1923         case WIN_MULTWRITE_EXT:
1924             lba48 = 1;
1925         case WIN_MULTWRITE:
1926         case CFA_WRITE_MULTI_WO_ERASE:
1927             if (!s->mult_sectors)
1928                 goto abort_cmd;
1929             ide_cmd_lba48_transform(s, lba48);
1930             s->error = 0;
1931             s->status = SEEK_STAT | READY_STAT;
1932             s->req_nb_sectors = s->mult_sectors;
1933             n = s->nsector;
1934             if (n > s->req_nb_sectors)
1935                 n = s->req_nb_sectors;
1936             ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_write);
1937             s->media_changed = 1;
1938             break;
1939         case WIN_READDMA_EXT:
1940             lba48 = 1;
1941         case WIN_READDMA:
1942         case WIN_READDMA_ONCE:
1943             if (!s->bs)
1944                 goto abort_cmd;
1945             ide_cmd_lba48_transform(s, lba48);
1946             ide_sector_read_dma(s);
1947             break;
1948         case WIN_WRITEDMA_EXT:
1949             lba48 = 1;
1950         case WIN_WRITEDMA:
1951         case WIN_WRITEDMA_ONCE:
1952             if (!s->bs)
1953                 goto abort_cmd;
1954             ide_cmd_lba48_transform(s, lba48);
1955             ide_sector_write_dma(s);
1956             s->media_changed = 1;
1957             break;
1958         case WIN_READ_NATIVE_MAX_EXT:
1959             lba48 = 1;
1960         case WIN_READ_NATIVE_MAX:
1961             ide_cmd_lba48_transform(s, lba48);
1962             ide_set_sector(s, s->nb_sectors - 1);
1963             s->status = READY_STAT;
1964             ide_set_irq(s);
1965             break;
1966         case WIN_CHECKPOWERMODE1:
1967         case WIN_CHECKPOWERMODE2:
1968             s->nsector = 0xff; /* device active or idle */
1969             s->status = READY_STAT;
1970             ide_set_irq(s);
1971             break;
1972         case WIN_SETFEATURES:
1973             if (!s->bs)
1974                 goto abort_cmd;
1975             /* XXX: valid for CDROM ? */
1976             switch(s->feature) {
1977             case 0xcc: /* reverting to power-on defaults enable */
1978             case 0x66: /* reverting to power-on defaults disable */
1979             case 0x02: /* write cache enable */
1980             case 0x82: /* write cache disable */
1981             case 0xaa: /* read look-ahead enable */
1982             case 0x55: /* read look-ahead disable */
1983             case 0x05: /* set advanced power management mode */
1984             case 0x85: /* disable advanced power management mode */
1985             case 0x69: /* NOP */
1986             case 0x67: /* NOP */
1987             case 0x96: /* NOP */
1988             case 0x9a: /* NOP */
1989             case 0x42: /* enable Automatic Acoustic Mode */
1990             case 0xc2: /* disable Automatic Acoustic Mode */
1991                 s->status = READY_STAT | SEEK_STAT;
1992                 ide_set_irq(s);
1993                 break;
1994             case 0x03: { /* set transfer mode */
1995                 uint8_t val = s->nsector & 0x07;
1996
1997                 switch (s->nsector >> 3) {
1998                     case 0x00: /* pio default */
1999                     case 0x01: /* pio mode */
2000                         put_le16(s->identify_data + 63,0x07);
2001                         put_le16(s->identify_data + 88,0x3f);
2002                         break;
2003                     case 0x04: /* mdma mode */
2004                         put_le16(s->identify_data + 63,0x07 | (1 << (val + 8)));
2005                         put_le16(s->identify_data + 88,0x3f);
2006                         break;
2007                     case 0x08: /* udma mode */
2008                         put_le16(s->identify_data + 63,0x07);
2009                         put_le16(s->identify_data + 88,0x3f | (1 << (val + 8)));
2010                         break;
2011                     default:
2012                         goto abort_cmd;
2013                 }
2014                 s->status = READY_STAT | SEEK_STAT;
2015                 ide_set_irq(s);
2016                 break;
2017             }
2018             default:
2019                 goto abort_cmd;
2020             }
2021             break;
2022         case WIN_FLUSH_CACHE:
2023         case WIN_FLUSH_CACHE_EXT:
2024             if (s->bs)
2025                 bdrv_flush(s->bs);
2026             s->status = READY_STAT;
2027             ide_set_irq(s);
2028             break;
2029         case WIN_STANDBY:
2030         case WIN_STANDBY2:
2031         case WIN_STANDBYNOW1:
2032         case WIN_STANDBYNOW2:
2033         case WIN_IDLEIMMEDIATE:
2034         case CFA_IDLEIMMEDIATE:
2035         case WIN_SETIDLE1:
2036         case WIN_SETIDLE2:
2037         case WIN_SLEEPNOW1:
2038         case WIN_SLEEPNOW2:
2039             s->status = READY_STAT;
2040             ide_set_irq(s);
2041             break;
2042             /* ATAPI commands */
2043         case WIN_PIDENTIFY:
2044             if (s->is_cdrom) {
2045                 ide_atapi_identify(s);
2046                 s->status = READY_STAT | SEEK_STAT;
2047                 ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
2048             } else {
2049                 ide_abort_command(s);
2050             }
2051             ide_set_irq(s);
2052             break;
2053         case WIN_DIAGNOSE:
2054             ide_set_signature(s);
2055             s->status = 0x00; /* NOTE: READY is _not_ set */
2056             s->error = 0x01;
2057             break;
2058         case WIN_SRST:
2059             if (!s->is_cdrom)
2060                 goto abort_cmd;
2061             ide_set_signature(s);
2062             s->status = 0x00; /* NOTE: READY is _not_ set */
2063             s->error = 0x01;
2064             break;
2065         case WIN_PACKETCMD:
2066             if (!s->is_cdrom)
2067                 goto abort_cmd;
2068             /* overlapping commands not supported */
2069             if (s->feature & 0x02)
2070                 goto abort_cmd;
2071             s->status = READY_STAT;
2072             s->atapi_dma = s->feature & 1;
2073             s->nsector = 1;
2074             ide_transfer_start(s, s->io_buffer, ATAPI_PACKET_SIZE,
2075                                ide_atapi_cmd);
2076             break;
2077         /* CF-ATA commands */
2078         case CFA_REQ_EXT_ERROR_CODE:
2079             if (!s->is_cf)
2080                 goto abort_cmd;
2081             s->error = 0x09;    /* miscellaneous error */
2082             s->status = READY_STAT;
2083             ide_set_irq(s);
2084             break;
2085         case CFA_ERASE_SECTORS:
2086         case CFA_WEAR_LEVEL:
2087             if (!s->is_cf)
2088                 goto abort_cmd;
2089             if (val == CFA_WEAR_LEVEL)
2090                 s->nsector = 0;
2091             if (val == CFA_ERASE_SECTORS)
2092                 s->media_changed = 1;
2093             s->error = 0x00;
2094             s->status = READY_STAT;
2095             ide_set_irq(s);
2096             break;
2097         case CFA_TRANSLATE_SECTOR:
2098             if (!s->is_cf)
2099                 goto abort_cmd;
2100             s->error = 0x00;
2101             s->status = READY_STAT;
2102             memset(s->io_buffer, 0, 0x200);
2103             s->io_buffer[0x00] = s->hcyl;                       /* Cyl MSB */
2104             s->io_buffer[0x01] = s->lcyl;                       /* Cyl LSB */
2105             s->io_buffer[0x02] = s->select;                     /* Head */
2106             s->io_buffer[0x03] = s->sector;                     /* Sector */
2107             s->io_buffer[0x04] = ide_get_sector(s) >> 16;       /* LBA MSB */
2108             s->io_buffer[0x05] = ide_get_sector(s) >> 8;        /* LBA */
2109             s->io_buffer[0x06] = ide_get_sector(s) >> 0;        /* LBA LSB */
2110             s->io_buffer[0x13] = 0x00;                          /* Erase flag */
2111             s->io_buffer[0x18] = 0x00;                          /* Hot count */
2112             s->io_buffer[0x19] = 0x00;                          /* Hot count */
2113             s->io_buffer[0x1a] = 0x01;                          /* Hot count */
2114             ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
2115             ide_set_irq(s);
2116             break;
2117         case CFA_ACCESS_METADATA_STORAGE:
2118             if (!s->is_cf)
2119                 goto abort_cmd;
2120             switch (s->feature) {
2121             case 0x02:  /* Inquiry Metadata Storage */
2122                 ide_cfata_metadata_inquiry(s);
2123                 break;
2124             case 0x03:  /* Read Metadata Storage */
2125                 ide_cfata_metadata_read(s);
2126                 break;
2127             case 0x04:  /* Write Metadata Storage */
2128                 ide_cfata_metadata_write(s);
2129                 break;
2130             default:
2131                 goto abort_cmd;
2132             }
2133             ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
2134             s->status = 0x00; /* NOTE: READY is _not_ set */
2135             ide_set_irq(s);
2136             break;
2137         case IBM_SENSE_CONDITION:
2138             if (!s->is_cf)
2139                 goto abort_cmd;
2140             switch (s->feature) {
2141             case 0x01:  /* sense temperature in device */
2142                 s->nsector = 0x50;      /* +20 C */
2143                 break;
2144             default:
2145                 goto abort_cmd;
2146             }
2147             s->status = READY_STAT;
2148             ide_set_irq(s);
2149             break;
2150         default:
2151         abort_cmd:
2152             ide_abort_command(s);
2153             ide_set_irq(s);
2154             break;
2155         }
2156     }
2157 }
2158
2159 static uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
2160 {
2161     IDEState *ide_if = opaque;
2162     IDEState *s = ide_if->cur_drive;
2163     uint32_t addr;
2164     int ret, hob;
2165
2166     addr = addr1 & 7;
2167     /* FIXME: HOB readback uses bit 7, but it's always set right now */
2168     //hob = s->select & (1 << 7);
2169     hob = 0;
2170     switch(addr) {
2171     case 0:
2172         ret = 0xff;
2173         break;
2174     case 1:
2175         if (!ide_if[0].bs && !ide_if[1].bs)
2176             ret = 0;
2177         else if (!hob)
2178             ret = s->error;
2179         else
2180             ret = s->hob_feature;
2181         break;
2182     case 2:
2183         if (!ide_if[0].bs && !ide_if[1].bs)
2184             ret = 0;
2185         else if (!hob)
2186             ret = s->nsector & 0xff;
2187         else
2188             ret = s->hob_nsector;
2189         break;
2190     case 3:
2191         if (!ide_if[0].bs && !ide_if[1].bs)
2192             ret = 0;
2193         else if (!hob)
2194             ret = s->sector;
2195         else
2196             ret = s->hob_sector;
2197         break;
2198     case 4:
2199         if (!ide_if[0].bs && !ide_if[1].bs)
2200             ret = 0;
2201         else if (!hob)
2202             ret = s->lcyl;
2203         else
2204             ret = s->hob_lcyl;
2205         break;
2206     case 5:
2207         if (!ide_if[0].bs && !ide_if[1].bs)
2208             ret = 0;
2209         else if (!hob)
2210             ret = s->hcyl;
2211         else
2212             ret = s->hob_hcyl;
2213         break;
2214     case 6:
2215         if (!ide_if[0].bs && !ide_if[1].bs)
2216             ret = 0;
2217         else
2218             ret = s->select;
2219         break;
2220     default:
2221     case 7:
2222         if ((!ide_if[0].bs && !ide_if[1].bs) ||
2223             (s != ide_if && !s->bs))
2224             ret = 0;
2225         else
2226             ret = s->status;
2227         qemu_irq_lower(s->irq);
2228         break;
2229     }
2230 #ifdef DEBUG_IDE
2231     printf("ide: read addr=0x%x val=%02x\n", addr1, ret);
2232 #endif
2233     return ret;
2234 }
2235
2236 static uint32_t ide_status_read(void *opaque, uint32_t addr)
2237 {
2238     IDEState *ide_if = opaque;
2239     IDEState *s = ide_if->cur_drive;
2240     int ret;
2241
2242     if ((!ide_if[0].bs && !ide_if[1].bs) ||
2243         (s != ide_if && !s->bs))
2244         ret = 0;
2245     else
2246         ret = s->status;
2247 #ifdef DEBUG_IDE
2248     printf("ide: read status addr=0x%x val=%02x\n", addr, ret);
2249 #endif
2250     return ret;
2251 }
2252
2253 static void ide_cmd_write(void *opaque, uint32_t addr, uint32_t val)
2254 {
2255     IDEState *ide_if = opaque;
2256     IDEState *s;
2257     int i;
2258
2259 #ifdef DEBUG_IDE
2260     printf("ide: write control addr=0x%x val=%02x\n", addr, val);
2261 #endif
2262     /* common for both drives */
2263     if (!(ide_if[0].cmd & IDE_CMD_RESET) &&
2264         (val & IDE_CMD_RESET)) {
2265         /* reset low to high */
2266         for(i = 0;i < 2; i++) {
2267             s = &ide_if[i];
2268             s->status = BUSY_STAT | SEEK_STAT;
2269             s->error = 0x01;
2270         }
2271     } else if ((ide_if[0].cmd & IDE_CMD_RESET) &&
2272                !(val & IDE_CMD_RESET)) {
2273         /* high to low */
2274         for(i = 0;i < 2; i++) {
2275             s = &ide_if[i];
2276             if (s->is_cdrom)
2277                 s->status = 0x00; /* NOTE: READY is _not_ set */
2278             else
2279                 s->status = READY_STAT | SEEK_STAT;
2280             ide_set_signature(s);
2281         }
2282     }
2283
2284     ide_if[0].cmd = val;
2285     ide_if[1].cmd = val;
2286 }
2287
2288 static void ide_data_writew(void *opaque, uint32_t addr, uint32_t val)
2289 {
2290     IDEState *s = ((IDEState *)opaque)->cur_drive;
2291     uint8_t *p;
2292
2293     p = s->data_ptr;
2294     *(uint16_t *)p = le16_to_cpu(val);
2295     p += 2;
2296     s->data_ptr = p;
2297     if (p >= s->data_end)
2298         s->end_transfer_func(s);
2299 }
2300
2301 static uint32_t ide_data_readw(void *opaque, uint32_t addr)
2302 {
2303     IDEState *s = ((IDEState *)opaque)->cur_drive;
2304     uint8_t *p;
2305     int ret;
2306     p = s->data_ptr;
2307     ret = cpu_to_le16(*(uint16_t *)p);
2308     p += 2;
2309     s->data_ptr = p;
2310     if (p >= s->data_end)
2311         s->end_transfer_func(s);
2312     return ret;
2313 }
2314
2315 static void ide_data_writel(void *opaque, uint32_t addr, uint32_t val)
2316 {
2317     IDEState *s = ((IDEState *)opaque)->cur_drive;
2318     uint8_t *p;
2319
2320     p = s->data_ptr;
2321     *(uint32_t *)p = le32_to_cpu(val);
2322     p += 4;
2323     s->data_ptr = p;
2324     if (p >= s->data_end)
2325         s->end_transfer_func(s);
2326 }
2327
2328 static uint32_t ide_data_readl(void *opaque, uint32_t addr)
2329 {
2330     IDEState *s = ((IDEState *)opaque)->cur_drive;
2331     uint8_t *p;
2332     int ret;
2333
2334     p = s->data_ptr;
2335     ret = cpu_to_le32(*(uint32_t *)p);
2336     p += 4;
2337     s->data_ptr = p;
2338     if (p >= s->data_end)
2339         s->end_transfer_func(s);
2340     return ret;
2341 }
2342
2343 static void ide_dummy_transfer_stop(IDEState *s)
2344 {
2345     s->data_ptr = s->io_buffer;
2346     s->data_end = s->io_buffer;
2347     s->io_buffer[0] = 0xff;
2348     s->io_buffer[1] = 0xff;
2349     s->io_buffer[2] = 0xff;
2350     s->io_buffer[3] = 0xff;
2351 }
2352
2353 static void ide_reset(IDEState *s)
2354 {
2355     if (s->is_cf)
2356         s->mult_sectors = 0;
2357     else
2358         s->mult_sectors = MAX_MULT_SECTORS;
2359     s->cur_drive = s;
2360     s->select = 0xa0;
2361     s->status = READY_STAT;
2362     ide_set_signature(s);
2363     /* init the transfer handler so that 0xffff is returned on data
2364        accesses */
2365     s->end_transfer_func = ide_dummy_transfer_stop;
2366     ide_dummy_transfer_stop(s);
2367     s->media_changed = 0;
2368 }
2369
2370 struct partition {
2371         uint8_t boot_ind;               /* 0x80 - active */
2372         uint8_t head;           /* starting head */
2373         uint8_t sector;         /* starting sector */
2374         uint8_t cyl;            /* starting cylinder */
2375         uint8_t sys_ind;                /* What partition type */
2376         uint8_t end_head;               /* end head */
2377         uint8_t end_sector;     /* end sector */
2378         uint8_t end_cyl;                /* end cylinder */
2379         uint32_t start_sect;    /* starting sector counting from 0 */
2380         uint32_t nr_sects;              /* nr of sectors in partition */
2381 } __attribute__((packed));
2382
2383 /* try to guess the disk logical geometry from the MSDOS partition table. Return 0 if OK, -1 if could not guess */
2384 static int guess_disk_lchs(IDEState *s,
2385                            int *pcylinders, int *pheads, int *psectors)
2386 {
2387     uint8_t buf[512];
2388     int ret, i, heads, sectors, cylinders;
2389     struct partition *p;
2390     uint32_t nr_sects;
2391
2392     ret = bdrv_read(s->bs, 0, buf, 1);
2393     if (ret < 0)
2394         return -1;
2395     /* test msdos magic */
2396     if (buf[510] != 0x55 || buf[511] != 0xaa)
2397         return -1;
2398     for(i = 0; i < 4; i++) {
2399         p = ((struct partition *)(buf + 0x1be)) + i;
2400         nr_sects = le32_to_cpu(p->nr_sects);
2401         if (nr_sects && p->end_head) {
2402             /* We make the assumption that the partition terminates on
2403                a cylinder boundary */
2404             heads = p->end_head + 1;
2405             sectors = p->end_sector & 63;
2406             if (sectors == 0)
2407                 continue;
2408             cylinders = s->nb_sectors / (heads * sectors);
2409             if (cylinders < 1 || cylinders > 16383)
2410                 continue;
2411             *pheads = heads;
2412             *psectors = sectors;
2413             *pcylinders = cylinders;
2414 #if 0
2415             printf("guessed geometry: LCHS=%d %d %d\n",
2416                    cylinders, heads, sectors);
2417 #endif
2418             return 0;
2419         }
2420     }
2421     return -1;
2422 }
2423
2424 static void ide_init2(IDEState *ide_state,
2425                       BlockDriverState *hd0, BlockDriverState *hd1,
2426                       qemu_irq irq)
2427 {
2428     IDEState *s;
2429     static int drive_serial = 1;
2430     int i, cylinders, heads, secs, translation, lba_detected = 0;
2431     int64_t nb_sectors;
2432
2433     for(i = 0; i < 2; i++) {
2434         s = ide_state + i;
2435         if (i == 0)
2436             s->bs = hd0;
2437         else
2438             s->bs = hd1;
2439         if (s->bs) {
2440             bdrv_get_geometry(s->bs, &nb_sectors);
2441             s->nb_sectors = nb_sectors;
2442             /* if a geometry hint is available, use it */
2443             bdrv_get_geometry_hint(s->bs, &cylinders, &heads, &secs);
2444             translation = bdrv_get_translation_hint(s->bs);
2445             if (cylinders != 0) {
2446                 s->cylinders = cylinders;
2447                 s->heads = heads;
2448                 s->sectors = secs;
2449             } else {
2450                 if (guess_disk_lchs(s, &cylinders, &heads, &secs) == 0) {
2451                     if (heads > 16) {
2452                         /* if heads > 16, it means that a BIOS LBA
2453                            translation was active, so the default
2454                            hardware geometry is OK */
2455                         lba_detected = 1;
2456                         goto default_geometry;
2457                     } else {
2458                         s->cylinders = cylinders;
2459                         s->heads = heads;
2460                         s->sectors = secs;
2461                         /* disable any translation to be in sync with
2462                            the logical geometry */
2463                         if (translation == BIOS_ATA_TRANSLATION_AUTO) {
2464                             bdrv_set_translation_hint(s->bs,
2465                                                       BIOS_ATA_TRANSLATION_NONE);
2466                         }
2467                     }
2468                 } else {
2469                 default_geometry:
2470                     /* if no geometry, use a standard physical disk geometry */
2471                     cylinders = nb_sectors / (16 * 63);
2472                     if (cylinders > 16383)
2473                         cylinders = 16383;
2474                     else if (cylinders < 2)
2475                         cylinders = 2;
2476                     s->cylinders = cylinders;
2477                     s->heads = 16;
2478                     s->sectors = 63;
2479                     if ((lba_detected == 1) && (translation == BIOS_ATA_TRANSLATION_AUTO)) {
2480                       if ((s->cylinders * s->heads) <= 131072) {
2481                         bdrv_set_translation_hint(s->bs,
2482                                                   BIOS_ATA_TRANSLATION_LARGE);
2483                       } else {
2484                         bdrv_set_translation_hint(s->bs,
2485                                                   BIOS_ATA_TRANSLATION_LBA);
2486                       }
2487                     }
2488                 }
2489                 bdrv_set_geometry_hint(s->bs, s->cylinders, s->heads, s->sectors);
2490             }
2491             if (bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM) {
2492                 s->is_cdrom = 1;
2493                 bdrv_set_change_cb(s->bs, cdrom_change_cb, s);
2494             }
2495         }
2496         s->drive_serial = drive_serial++;
2497         s->irq = irq;
2498         s->sector_write_timer = qemu_new_timer(vm_clock,
2499                                                ide_sector_write_timer_cb, s);
2500         ide_reset(s);
2501     }
2502 }
2503
2504 static void ide_init_ioport(IDEState *ide_state, int iobase, int iobase2)
2505 {
2506     register_ioport_write(iobase, 8, 1, ide_ioport_write, ide_state);
2507     register_ioport_read(iobase, 8, 1, ide_ioport_read, ide_state);
2508     if (iobase2) {
2509         register_ioport_read(iobase2, 1, 1, ide_status_read, ide_state);
2510         register_ioport_write(iobase2, 1, 1, ide_cmd_write, ide_state);
2511     }
2512
2513     /* data ports */
2514     register_ioport_write(iobase, 2, 2, ide_data_writew, ide_state);
2515     register_ioport_read(iobase, 2, 2, ide_data_readw, ide_state);
2516     register_ioport_write(iobase, 4, 4, ide_data_writel, ide_state);
2517     register_ioport_read(iobase, 4, 4, ide_data_readl, ide_state);
2518 }
2519
2520 /* save per IDE drive data */
2521 static void ide_save(QEMUFile* f, IDEState *s)
2522 {
2523     qemu_put_be32s(f, &s->mult_sectors);
2524     qemu_put_be32s(f, &s->identify_set);
2525     if (s->identify_set) {
2526         qemu_put_buffer(f, (const uint8_t *)s->identify_data, 512);
2527     }
2528     qemu_put_8s(f, &s->feature);
2529     qemu_put_8s(f, &s->error);
2530     qemu_put_be32s(f, &s->nsector);
2531     qemu_put_8s(f, &s->sector);
2532     qemu_put_8s(f, &s->lcyl);
2533     qemu_put_8s(f, &s->hcyl);
2534     qemu_put_8s(f, &s->hob_feature);
2535     qemu_put_8s(f, &s->hob_nsector);
2536     qemu_put_8s(f, &s->hob_sector);
2537     qemu_put_8s(f, &s->hob_lcyl);
2538     qemu_put_8s(f, &s->hob_hcyl);
2539     qemu_put_8s(f, &s->select);
2540     qemu_put_8s(f, &s->status);
2541     qemu_put_8s(f, &s->lba48);
2542
2543     qemu_put_8s(f, &s->sense_key);
2544     qemu_put_8s(f, &s->asc);
2545     /* XXX: if a transfer is pending, we do not save it yet */
2546 }
2547
2548 /* load per IDE drive data */
2549 static void ide_load(QEMUFile* f, IDEState *s)
2550 {
2551     qemu_get_be32s(f, &s->mult_sectors);
2552     qemu_get_be32s(f, &s->identify_set);
2553     if (s->identify_set) {
2554         qemu_get_buffer(f, (uint8_t *)s->identify_data, 512);
2555     }
2556     qemu_get_8s(f, &s->feature);
2557     qemu_get_8s(f, &s->error);
2558     qemu_get_be32s(f, &s->nsector);
2559     qemu_get_8s(f, &s->sector);
2560     qemu_get_8s(f, &s->lcyl);
2561     qemu_get_8s(f, &s->hcyl);
2562     qemu_get_8s(f, &s->hob_feature);
2563     qemu_get_8s(f, &s->hob_nsector);
2564     qemu_get_8s(f, &s->hob_sector);
2565     qemu_get_8s(f, &s->hob_lcyl);
2566     qemu_get_8s(f, &s->hob_hcyl);
2567     qemu_get_8s(f, &s->select);
2568     qemu_get_8s(f, &s->status);
2569     qemu_get_8s(f, &s->lba48);
2570
2571     qemu_get_8s(f, &s->sense_key);
2572     qemu_get_8s(f, &s->asc);
2573     /* XXX: if a transfer is pending, we do not save it yet */
2574 }
2575
2576 /***********************************************************/
2577 /* ISA IDE definitions */
2578
2579 void isa_ide_init(int iobase, int iobase2, qemu_irq irq,
2580                   BlockDriverState *hd0, BlockDriverState *hd1)
2581 {
2582     IDEState *ide_state;
2583
2584     ide_state = qemu_mallocz(sizeof(IDEState) * 2);
2585     if (!ide_state)
2586         return;
2587
2588     ide_init2(ide_state, hd0, hd1, irq);
2589     ide_init_ioport(ide_state, iobase, iobase2);
2590 }
2591
2592 /***********************************************************/
2593 /* PCI IDE definitions */
2594
2595 static void cmd646_update_irq(PCIIDEState *d);
2596
2597 static void ide_map(PCIDevice *pci_dev, int region_num,
2598                     uint32_t addr, uint32_t size, int type)
2599 {
2600     PCIIDEState *d = (PCIIDEState *)pci_dev;
2601     IDEState *ide_state;
2602
2603     if (region_num <= 3) {
2604         ide_state = &d->ide_if[(region_num >> 1) * 2];
2605         if (region_num & 1) {
2606             register_ioport_read(addr + 2, 1, 1, ide_status_read, ide_state);
2607             register_ioport_write(addr + 2, 1, 1, ide_cmd_write, ide_state);
2608         } else {
2609             register_ioport_write(addr, 8, 1, ide_ioport_write, ide_state);
2610             register_ioport_read(addr, 8, 1, ide_ioport_read, ide_state);
2611
2612             /* data ports */
2613             register_ioport_write(addr, 2, 2, ide_data_writew, ide_state);
2614             register_ioport_read(addr, 2, 2, ide_data_readw, ide_state);
2615             register_ioport_write(addr, 4, 4, ide_data_writel, ide_state);
2616             register_ioport_read(addr, 4, 4, ide_data_readl, ide_state);
2617         }
2618     }
2619 }
2620
2621 static void ide_dma_start(IDEState *s, BlockDriverCompletionFunc *dma_cb)
2622 {
2623     BMDMAState *bm = s->bmdma;
2624     if(!bm)
2625         return;
2626     bm->ide_if = s;
2627     bm->dma_cb = dma_cb;
2628     bm->cur_prd_last = 0;
2629     bm->cur_prd_addr = 0;
2630     bm->cur_prd_len = 0;
2631     if (bm->status & BM_STATUS_DMAING) {
2632         bm->dma_cb(bm, 0);
2633     }
2634 }
2635
2636 static void bmdma_cmd_writeb(void *opaque, uint32_t addr, uint32_t val)
2637 {
2638     BMDMAState *bm = opaque;
2639 #ifdef DEBUG_IDE
2640     printf("%s: 0x%08x\n", __func__, val);
2641 #endif
2642     if (!(val & BM_CMD_START)) {
2643         /* XXX: do it better */
2644         if (bm->status & BM_STATUS_DMAING) {
2645             bm->status &= ~BM_STATUS_DMAING;
2646             /* cancel DMA request */
2647             bm->ide_if = NULL;
2648             bm->dma_cb = NULL;
2649             if (bm->aiocb) {
2650 #ifdef DEBUG_AIO
2651                 printf("aio_cancel\n");
2652 #endif
2653                 bdrv_aio_cancel(bm->aiocb);
2654                 bm->aiocb = NULL;
2655             }
2656         }
2657         bm->cmd = val & 0x09;
2658     } else {
2659         if (!(bm->status & BM_STATUS_DMAING)) {
2660             bm->status |= BM_STATUS_DMAING;
2661             /* start dma transfer if possible */
2662             if (bm->dma_cb)
2663                 bm->dma_cb(bm, 0);
2664         }
2665         bm->cmd = val & 0x09;
2666     }
2667 }
2668
2669 static uint32_t bmdma_readb(void *opaque, uint32_t addr)
2670 {
2671     BMDMAState *bm = opaque;
2672     PCIIDEState *pci_dev;
2673     uint32_t val;
2674
2675     switch(addr & 3) {
2676     case 0:
2677         val = bm->cmd;
2678         break;
2679     case 1:
2680         pci_dev = bm->pci_dev;
2681         if (pci_dev->type == IDE_TYPE_CMD646) {
2682             val = pci_dev->dev.config[MRDMODE];
2683         } else {
2684             val = 0xff;
2685         }
2686         break;
2687     case 2:
2688         val = bm->status;
2689         break;
2690     case 3:
2691         pci_dev = bm->pci_dev;
2692         if (pci_dev->type == IDE_TYPE_CMD646) {
2693             if (bm == &pci_dev->bmdma[0])
2694                 val = pci_dev->dev.config[UDIDETCR0];
2695             else
2696                 val = pci_dev->dev.config[UDIDETCR1];
2697         } else {
2698             val = 0xff;
2699         }
2700         break;
2701     default:
2702         val = 0xff;
2703         break;
2704     }
2705 #ifdef DEBUG_IDE
2706     printf("bmdma: readb 0x%02x : 0x%02x\n", addr, val);
2707 #endif
2708     return val;
2709 }
2710
2711 static void bmdma_writeb(void *opaque, uint32_t addr, uint32_t val)
2712 {
2713     BMDMAState *bm = opaque;
2714     PCIIDEState *pci_dev;
2715 #ifdef DEBUG_IDE
2716     printf("bmdma: writeb 0x%02x : 0x%02x\n", addr, val);
2717 #endif
2718     switch(addr & 3) {
2719     case 1:
2720         pci_dev = bm->pci_dev;
2721         if (pci_dev->type == IDE_TYPE_CMD646) {
2722             pci_dev->dev.config[MRDMODE] =
2723                 (pci_dev->dev.config[MRDMODE] & ~0x30) | (val & 0x30);
2724             cmd646_update_irq(pci_dev);
2725         }
2726         break;
2727     case 2:
2728         bm->status = (val & 0x60) | (bm->status & 1) | (bm->status & ~val & 0x06);
2729         break;
2730     case 3:
2731         pci_dev = bm->pci_dev;
2732         if (pci_dev->type == IDE_TYPE_CMD646) {
2733             if (bm == &pci_dev->bmdma[0])
2734                 pci_dev->dev.config[UDIDETCR0] = val;
2735             else
2736                 pci_dev->dev.config[UDIDETCR1] = val;
2737         }
2738         break;
2739     }
2740 }
2741
2742 static uint32_t bmdma_addr_readl(void *opaque, uint32_t addr)
2743 {
2744     BMDMAState *bm = opaque;
2745     uint32_t val;
2746     val = bm->addr;
2747 #ifdef DEBUG_IDE
2748     printf("%s: 0x%08x\n", __func__, val);
2749 #endif
2750     return val;
2751 }
2752
2753 static void bmdma_addr_writel(void *opaque, uint32_t addr, uint32_t val)
2754 {
2755     BMDMAState *bm = opaque;
2756 #ifdef DEBUG_IDE
2757     printf("%s: 0x%08x\n", __func__, val);
2758 #endif
2759     bm->addr = val & ~3;
2760     bm->cur_addr = bm->addr;
2761 }
2762
2763 static void bmdma_map(PCIDevice *pci_dev, int region_num,
2764                     uint32_t addr, uint32_t size, int type)
2765 {
2766     PCIIDEState *d = (PCIIDEState *)pci_dev;
2767     int i;
2768
2769     for(i = 0;i < 2; i++) {
2770         BMDMAState *bm = &d->bmdma[i];
2771         d->ide_if[2 * i].bmdma = bm;
2772         d->ide_if[2 * i + 1].bmdma = bm;
2773         bm->pci_dev = (PCIIDEState *)pci_dev;
2774
2775         register_ioport_write(addr, 1, 1, bmdma_cmd_writeb, bm);
2776
2777         register_ioport_write(addr + 1, 3, 1, bmdma_writeb, bm);
2778         register_ioport_read(addr, 4, 1, bmdma_readb, bm);
2779
2780         register_ioport_write(addr + 4, 4, 4, bmdma_addr_writel, bm);
2781         register_ioport_read(addr + 4, 4, 4, bmdma_addr_readl, bm);
2782         addr += 8;
2783     }
2784 }
2785
2786 /* XXX: call it also when the MRDMODE is changed from the PCI config
2787    registers */
2788 static void cmd646_update_irq(PCIIDEState *d)
2789 {
2790     int pci_level;
2791     pci_level = ((d->dev.config[MRDMODE] & MRDMODE_INTR_CH0) &&
2792                  !(d->dev.config[MRDMODE] & MRDMODE_BLK_CH0)) ||
2793         ((d->dev.config[MRDMODE] & MRDMODE_INTR_CH1) &&
2794          !(d->dev.config[MRDMODE] & MRDMODE_BLK_CH1));
2795     qemu_set_irq(d->dev.irq[0], pci_level);
2796 }
2797
2798 /* the PCI irq level is the logical OR of the two channels */
2799 static void cmd646_set_irq(void *opaque, int channel, int level)
2800 {
2801     PCIIDEState *d = opaque;
2802     int irq_mask;
2803
2804     irq_mask = MRDMODE_INTR_CH0 << channel;
2805     if (level)
2806         d->dev.config[MRDMODE] |= irq_mask;
2807     else
2808         d->dev.config[MRDMODE] &= ~irq_mask;
2809     cmd646_update_irq(d);
2810 }
2811
2812 /* CMD646 PCI IDE controller */
2813 void pci_cmd646_ide_init(PCIBus *bus, BlockDriverState **hd_table,
2814                          int secondary_ide_enabled)
2815 {
2816     PCIIDEState *d;
2817     uint8_t *pci_conf;
2818     int i;
2819     qemu_irq *irq;
2820
2821     d = (PCIIDEState *)pci_register_device(bus, "CMD646 IDE",
2822                                            sizeof(PCIIDEState),
2823                                            -1,
2824                                            NULL, NULL);
2825     d->type = IDE_TYPE_CMD646;
2826     pci_conf = d->dev.config;
2827     pci_conf[0x00] = 0x95; // CMD646
2828     pci_conf[0x01] = 0x10;
2829     pci_conf[0x02] = 0x46;
2830     pci_conf[0x03] = 0x06;
2831
2832     pci_conf[0x08] = 0x07; // IDE controller revision
2833     pci_conf[0x09] = 0x8f;
2834
2835     pci_conf[0x0a] = 0x01; // class_sub = PCI_IDE
2836     pci_conf[0x0b] = 0x01; // class_base = PCI_mass_storage
2837     pci_conf[0x0e] = 0x00; // header_type
2838
2839     if (secondary_ide_enabled) {
2840         /* XXX: if not enabled, really disable the seconday IDE controller */
2841         pci_conf[0x51] = 0x80; /* enable IDE1 */
2842     }
2843
2844     pci_register_io_region((PCIDevice *)d, 0, 0x8,
2845                            PCI_ADDRESS_SPACE_IO, ide_map);
2846     pci_register_io_region((PCIDevice *)d, 1, 0x4,
2847                            PCI_ADDRESS_SPACE_IO, ide_map);
2848     pci_register_io_region((PCIDevice *)d, 2, 0x8,
2849                            PCI_ADDRESS_SPACE_IO, ide_map);
2850     pci_register_io_region((PCIDevice *)d, 3, 0x4,
2851                            PCI_ADDRESS_SPACE_IO, ide_map);
2852     pci_register_io_region((PCIDevice *)d, 4, 0x10,
2853                            PCI_ADDRESS_SPACE_IO, bmdma_map);
2854
2855     pci_conf[0x3d] = 0x01; // interrupt on pin 1
2856
2857     for(i = 0; i < 4; i++)
2858         d->ide_if[i].pci_dev = (PCIDevice *)d;
2859
2860     irq = qemu_allocate_irqs(cmd646_set_irq, d, 2);
2861     ide_init2(&d->ide_if[0], hd_table[0], hd_table[1], irq[0]);
2862     ide_init2(&d->ide_if[2], hd_table[2], hd_table[3], irq[1]);
2863 }
2864
2865 static void pci_ide_save(QEMUFile* f, void *opaque)
2866 {
2867     PCIIDEState *d = opaque;
2868     int i;
2869
2870     pci_device_save(&d->dev, f);
2871
2872     for(i = 0; i < 2; i++) {
2873         BMDMAState *bm = &d->bmdma[i];
2874         qemu_put_8s(f, &bm->cmd);
2875         qemu_put_8s(f, &bm->status);
2876         qemu_put_be32s(f, &bm->addr);
2877         /* XXX: if a transfer is pending, we do not save it yet */
2878     }
2879
2880     /* per IDE interface data */
2881     for(i = 0; i < 2; i++) {
2882         IDEState *s = &d->ide_if[i * 2];
2883         uint8_t drive1_selected;
2884         qemu_put_8s(f, &s->cmd);
2885         drive1_selected = (s->cur_drive != s);
2886         qemu_put_8s(f, &drive1_selected);
2887     }
2888
2889     /* per IDE drive data */
2890     for(i = 0; i < 4; i++) {
2891         ide_save(f, &d->ide_if[i]);
2892     }
2893 }
2894
2895 static int pci_ide_load(QEMUFile* f, void *opaque, int version_id)
2896 {
2897     PCIIDEState *d = opaque;
2898     int ret, i;
2899
2900     if (version_id != 1)
2901         return -EINVAL;
2902     ret = pci_device_load(&d->dev, f);
2903     if (ret < 0)
2904         return ret;
2905
2906     for(i = 0; i < 2; i++) {
2907         BMDMAState *bm = &d->bmdma[i];
2908         qemu_get_8s(f, &bm->cmd);
2909         qemu_get_8s(f, &bm->status);
2910         qemu_get_be32s(f, &bm->addr);
2911         /* XXX: if a transfer is pending, we do not save it yet */
2912     }
2913
2914     /* per IDE interface data */
2915     for(i = 0; i < 2; i++) {
2916         IDEState *s = &d->ide_if[i * 2];
2917         uint8_t drive1_selected;
2918         qemu_get_8s(f, &s->cmd);
2919         qemu_get_8s(f, &drive1_selected);
2920         s->cur_drive = &d->ide_if[i * 2 + (drive1_selected != 0)];
2921     }
2922
2923     /* per IDE drive data */
2924     for(i = 0; i < 4; i++) {
2925         ide_load(f, &d->ide_if[i]);
2926     }
2927     return 0;
2928 }
2929
2930 static void piix3_reset(PCIIDEState *d)
2931 {
2932     uint8_t *pci_conf = d->dev.config;
2933
2934     pci_conf[0x04] = 0x00;
2935     pci_conf[0x05] = 0x00;
2936     pci_conf[0x06] = 0x80; /* FBC */
2937     pci_conf[0x07] = 0x02; // PCI_status_devsel_medium
2938     pci_conf[0x20] = 0x01; /* BMIBA: 20-23h */
2939 }
2940
2941 /* hd_table must contain 4 block drivers */
2942 /* NOTE: for the PIIX3, the IRQs and IOports are hardcoded */
2943 void pci_piix3_ide_init(PCIBus *bus, BlockDriverState **hd_table, int devfn,
2944                         qemu_irq *pic)
2945 {
2946     PCIIDEState *d;
2947     uint8_t *pci_conf;
2948
2949     /* register a function 1 of PIIX3 */
2950     d = (PCIIDEState *)pci_register_device(bus, "PIIX3 IDE",
2951                                            sizeof(PCIIDEState),
2952                                            devfn,
2953                                            NULL, NULL);
2954     d->type = IDE_TYPE_PIIX3;
2955
2956     pci_conf = d->dev.config;
2957     pci_conf[0x00] = 0x86; // Intel
2958     pci_conf[0x01] = 0x80;
2959     pci_conf[0x02] = 0x10;
2960     pci_conf[0x03] = 0x70;
2961     pci_conf[0x09] = 0x80; // legacy ATA mode
2962     pci_conf[0x0a] = 0x01; // class_sub = PCI_IDE
2963     pci_conf[0x0b] = 0x01; // class_base = PCI_mass_storage
2964     pci_conf[0x0e] = 0x00; // header_type
2965
2966     piix3_reset(d);
2967
2968     pci_register_io_region((PCIDevice *)d, 4, 0x10,
2969                            PCI_ADDRESS_SPACE_IO, bmdma_map);
2970
2971     ide_init2(&d->ide_if[0], hd_table[0], hd_table[1], pic[14]);
2972     ide_init2(&d->ide_if[2], hd_table[2], hd_table[3], pic[15]);
2973     ide_init_ioport(&d->ide_if[0], 0x1f0, 0x3f6);
2974     ide_init_ioport(&d->ide_if[2], 0x170, 0x376);
2975
2976     register_savevm("ide", 0, 1, pci_ide_save, pci_ide_load, d);
2977 }
2978
2979 /* hd_table must contain 4 block drivers */
2980 /* NOTE: for the PIIX4, the IRQs and IOports are hardcoded */
2981 void pci_piix4_ide_init(PCIBus *bus, BlockDriverState **hd_table, int devfn,
2982                         qemu_irq *pic)
2983 {
2984     PCIIDEState *d;
2985     uint8_t *pci_conf;
2986
2987     /* register a function 1 of PIIX4 */
2988     d = (PCIIDEState *)pci_register_device(bus, "PIIX4 IDE",
2989                                            sizeof(PCIIDEState),
2990                                            devfn,
2991                                            NULL, NULL);
2992     d->type = IDE_TYPE_PIIX4;
2993
2994     pci_conf = d->dev.config;
2995     pci_conf[0x00] = 0x86; // Intel
2996     pci_conf[0x01] = 0x80;
2997     pci_conf[0x02] = 0x11;
2998     pci_conf[0x03] = 0x71;
2999     pci_conf[0x09] = 0x80; // legacy ATA mode
3000     pci_conf[0x0a] = 0x01; // class_sub = PCI_IDE
3001     pci_conf[0x0b] = 0x01; // class_base = PCI_mass_storage
3002     pci_conf[0x0e] = 0x00; // header_type
3003
3004     piix3_reset(d);
3005
3006     pci_register_io_region((PCIDevice *)d, 4, 0x10,
3007                            PCI_ADDRESS_SPACE_IO, bmdma_map);
3008
3009     ide_init2(&d->ide_if[0], hd_table[0], hd_table[1], pic[14]);
3010     ide_init2(&d->ide_if[2], hd_table[2], hd_table[3], pic[15]);
3011     ide_init_ioport(&d->ide_if[0], 0x1f0, 0x3f6);
3012     ide_init_ioport(&d->ide_if[2], 0x170, 0x376);
3013
3014     register_savevm("ide", 0, 1, pci_ide_save, pci_ide_load, d);
3015 }
3016
3017 /***********************************************************/
3018 /* MacIO based PowerPC IDE */
3019
3020 /* PowerMac IDE memory IO */
3021 static void pmac_ide_writeb (void *opaque,
3022                              target_phys_addr_t addr, uint32_t val)
3023 {
3024     addr = (addr & 0xFFF) >> 4;
3025     switch (addr) {
3026     case 1 ... 7:
3027         ide_ioport_write(opaque, addr, val);
3028         break;
3029     case 8:
3030     case 22:
3031         ide_cmd_write(opaque, 0, val);
3032         break;
3033     default:
3034         break;
3035     }
3036 }
3037
3038 static uint32_t pmac_ide_readb (void *opaque,target_phys_addr_t addr)
3039 {
3040     uint8_t retval;
3041
3042     addr = (addr & 0xFFF) >> 4;
3043     switch (addr) {
3044     case 1 ... 7:
3045         retval = ide_ioport_read(opaque, addr);
3046         break;
3047     case 8:
3048     case 22:
3049         retval = ide_status_read(opaque, 0);
3050         break;
3051     default:
3052         retval = 0xFF;
3053         break;
3054     }
3055     return retval;
3056 }
3057
3058 static void pmac_ide_writew (void *opaque,
3059                              target_phys_addr_t addr, uint32_t val)
3060 {
3061     addr = (addr & 0xFFF) >> 4;
3062 #ifdef TARGET_WORDS_BIGENDIAN
3063     val = bswap16(val);
3064 #endif
3065     if (addr == 0) {
3066         ide_data_writew(opaque, 0, val);
3067     }
3068 }
3069
3070 static uint32_t pmac_ide_readw (void *opaque,target_phys_addr_t addr)
3071 {
3072     uint16_t retval;
3073
3074     addr = (addr & 0xFFF) >> 4;
3075     if (addr == 0) {
3076         retval = ide_data_readw(opaque, 0);
3077     } else {
3078         retval = 0xFFFF;
3079     }
3080 #ifdef TARGET_WORDS_BIGENDIAN
3081     retval = bswap16(retval);
3082 #endif
3083     return retval;
3084 }
3085
3086 static void pmac_ide_writel (void *opaque,
3087                              target_phys_addr_t addr, uint32_t val)
3088 {
3089     addr = (addr & 0xFFF) >> 4;
3090 #ifdef TARGET_WORDS_BIGENDIAN
3091     val = bswap32(val);
3092 #endif
3093     if (addr == 0) {
3094         ide_data_writel(opaque, 0, val);
3095     }
3096 }
3097
3098 static uint32_t pmac_ide_readl (void *opaque,target_phys_addr_t addr)
3099 {
3100     uint32_t retval;
3101
3102     addr = (addr & 0xFFF) >> 4;
3103     if (addr == 0) {
3104         retval = ide_data_readl(opaque, 0);
3105     } else {
3106         retval = 0xFFFFFFFF;
3107     }
3108 #ifdef TARGET_WORDS_BIGENDIAN
3109     retval = bswap32(retval);
3110 #endif
3111     return retval;
3112 }
3113
3114 static CPUWriteMemoryFunc *pmac_ide_write[] = {
3115     pmac_ide_writeb,
3116     pmac_ide_writew,
3117     pmac_ide_writel,
3118 };
3119
3120 static CPUReadMemoryFunc *pmac_ide_read[] = {
3121     pmac_ide_readb,
3122     pmac_ide_readw,
3123     pmac_ide_readl,
3124 };
3125
3126 /* hd_table must contain 4 block drivers */
3127 /* PowerMac uses memory mapped registers, not I/O. Return the memory
3128    I/O index to access the ide. */
3129 int pmac_ide_init (BlockDriverState **hd_table, qemu_irq irq)
3130 {
3131     IDEState *ide_if;
3132     int pmac_ide_memory;
3133
3134     ide_if = qemu_mallocz(sizeof(IDEState) * 2);
3135     ide_init2(&ide_if[0], hd_table[0], hd_table[1], irq);
3136
3137     pmac_ide_memory = cpu_register_io_memory(0, pmac_ide_read,
3138                                              pmac_ide_write, &ide_if[0]);
3139     return pmac_ide_memory;
3140 }
3141
3142 /***********************************************************/
3143 /* CF-ATA Microdrive */
3144
3145 #define METADATA_SIZE   0x20
3146
3147 /* DSCM-1XXXX Microdrive hard disk with CF+ II / PCMCIA interface.  */
3148 struct md_s {
3149     IDEState ide[2];
3150     struct pcmcia_card_s card;
3151     uint32_t attr_base;
3152     uint32_t io_base;
3153
3154     /* Card state */
3155     uint8_t opt;
3156     uint8_t stat;
3157     uint8_t pins;
3158
3159     uint8_t ctrl;
3160     uint16_t io;
3161     int cycle;
3162 };
3163
3164 /* Register bitfields */
3165 enum md_opt {
3166     OPT_MODE_MMAP       = 0,
3167     OPT_MODE_IOMAP16    = 1,
3168     OPT_MODE_IOMAP1     = 2,
3169     OPT_MODE_IOMAP2     = 3,
3170     OPT_MODE            = 0x3f,
3171     OPT_LEVIREQ         = 0x40,
3172     OPT_SRESET          = 0x80,
3173 };
3174 enum md_cstat {
3175     STAT_INT            = 0x02,
3176     STAT_PWRDWN         = 0x04,
3177     STAT_XE             = 0x10,
3178     STAT_IOIS8          = 0x20,
3179     STAT_SIGCHG         = 0x40,
3180     STAT_CHANGED        = 0x80,
3181 };
3182 enum md_pins {
3183     PINS_MRDY           = 0x02,
3184     PINS_CRDY           = 0x20,
3185 };
3186 enum md_ctrl {
3187     CTRL_IEN            = 0x02,
3188     CTRL_SRST           = 0x04,
3189 };
3190
3191 static inline void md_interrupt_update(struct md_s *s)
3192 {
3193     if (!s->card.slot)
3194         return;
3195
3196     qemu_set_irq(s->card.slot->irq,
3197                     !(s->stat & STAT_INT) &&    /* Inverted */
3198                     !(s->ctrl & (CTRL_IEN | CTRL_SRST)) &&
3199                     !(s->opt & OPT_SRESET));
3200 }
3201
3202 static void md_set_irq(void *opaque, int irq, int level)
3203 {
3204     struct md_s *s = (struct md_s *) opaque;
3205     if (level)
3206         s->stat |= STAT_INT;
3207     else
3208         s->stat &= ~STAT_INT;
3209
3210     md_interrupt_update(s);
3211 }
3212
3213 static void md_reset(struct md_s *s)
3214 {
3215     s->opt = OPT_MODE_MMAP;
3216     s->stat = 0;
3217     s->pins = 0;
3218     s->cycle = 0;
3219     s->ctrl = 0;
3220     ide_reset(s->ide);
3221 }
3222
3223 static uint8_t md_attr_read(void *opaque, uint32_t at)
3224 {
3225     struct md_s *s = (struct md_s *) opaque;
3226     if (at < s->attr_base) {
3227         if (at < s->card.cis_len)
3228             return s->card.cis[at];
3229         else
3230             return 0x00;
3231     }
3232
3233     at -= s->attr_base;
3234
3235     switch (at) {
3236     case 0x00:  /* Configuration Option Register */
3237         return s->opt;
3238     case 0x02:  /* Card Configuration Status Register */
3239         if (s->ctrl & CTRL_IEN)
3240             return s->stat & ~STAT_INT;
3241         else
3242             return s->stat;
3243     case 0x04:  /* Pin Replacement Register */
3244         return (s->pins & PINS_CRDY) | 0x0c;
3245     case 0x06:  /* Socket and Copy Register */
3246         return 0x00;
3247 #ifdef VERBOSE
3248     default:
3249         printf("%s: Bad attribute space register %02x\n", __FUNCTION__, at);
3250 #endif
3251     }
3252
3253     return 0;
3254 }
3255
3256 static void md_attr_write(void *opaque, uint32_t at, uint8_t value)
3257 {
3258     struct md_s *s = (struct md_s *) opaque;
3259     at -= s->attr_base;
3260
3261     switch (at) {
3262     case 0x00:  /* Configuration Option Register */
3263         s->opt = value & 0xcf;
3264         if (value & OPT_SRESET)
3265             md_reset(s);
3266         md_interrupt_update(s);
3267         break;
3268     case 0x02:  /* Card Configuration Status Register */
3269         if ((s->stat ^ value) & STAT_PWRDWN)
3270             s->pins |= PINS_CRDY;
3271         s->stat &= 0x82;
3272         s->stat |= value & 0x74;
3273         md_interrupt_update(s);
3274         /* Word 170 in Identify Device must be equal to STAT_XE */
3275         break;
3276     case 0x04:  /* Pin Replacement Register */
3277         s->pins &= PINS_CRDY;
3278         s->pins |= value & PINS_MRDY;
3279         break;
3280     case 0x06:  /* Socket and Copy Register */
3281         break;
3282     default:
3283         printf("%s: Bad attribute space register %02x\n", __FUNCTION__, at);
3284     }
3285 }
3286
3287 static uint16_t md_common_read(void *opaque, uint32_t at)
3288 {
3289     struct md_s *s = (struct md_s *) opaque;
3290     uint16_t ret;
3291     at -= s->io_base;
3292
3293     switch (s->opt & OPT_MODE) {
3294     case OPT_MODE_MMAP:
3295         if ((at & ~0x3ff) == 0x400)
3296             at = 0;
3297         break;
3298     case OPT_MODE_IOMAP16:
3299         at &= 0xf;
3300         break;
3301     case OPT_MODE_IOMAP1:
3302         if ((at & ~0xf) == 0x3f0)
3303             at -= 0x3e8;
3304         else if ((at & ~0xf) == 0x1f0)
3305             at -= 0x1f0;
3306         break;
3307     case OPT_MODE_IOMAP2:
3308         if ((at & ~0xf) == 0x370)
3309             at -= 0x368;
3310         else if ((at & ~0xf) == 0x170)
3311             at -= 0x170;
3312     }
3313
3314     switch (at) {
3315     case 0x0:   /* Even RD Data */
3316     case 0x8:
3317         return ide_data_readw(s->ide, 0);
3318
3319         /* TODO: 8-bit accesses */
3320         if (s->cycle)
3321             ret = s->io >> 8;
3322         else {
3323             s->io = ide_data_readw(s->ide, 0);
3324             ret = s->io & 0xff;
3325         }
3326         s->cycle = !s->cycle;
3327         return ret;
3328     case 0x9:   /* Odd RD Data */
3329         return s->io >> 8;
3330     case 0xd:   /* Error */
3331         return ide_ioport_read(s->ide, 0x1);
3332     case 0xe:   /* Alternate Status */
3333         if (s->ide->cur_drive->bs)
3334             return s->ide->cur_drive->status;
3335         else
3336             return 0;
3337     case 0xf:   /* Device Address */
3338         return 0xc2 | ((~s->ide->select << 2) & 0x3c);
3339     default:
3340         return ide_ioport_read(s->ide, at);
3341     }
3342
3343     return 0;
3344 }
3345
3346 static void md_common_write(void *opaque, uint32_t at, uint16_t value)
3347 {
3348     struct md_s *s = (struct md_s *) opaque;
3349     at -= s->io_base;
3350
3351     switch (s->opt & OPT_MODE) {
3352     case OPT_MODE_MMAP:
3353         if ((at & ~0x3ff) == 0x400)
3354             at = 0;
3355         break;
3356     case OPT_MODE_IOMAP16:
3357         at &= 0xf;
3358         break;
3359     case OPT_MODE_IOMAP1:
3360         if ((at & ~0xf) == 0x3f0)
3361             at -= 0x3e8;
3362         else if ((at & ~0xf) == 0x1f0)
3363             at -= 0x1f0;
3364         break;
3365     case OPT_MODE_IOMAP2:
3366         if ((at & ~0xf) == 0x370)
3367             at -= 0x368;
3368         else if ((at & ~0xf) == 0x170)
3369             at -= 0x170;
3370     }
3371
3372     switch (at) {
3373     case 0x0:   /* Even WR Data */
3374     case 0x8:
3375         ide_data_writew(s->ide, 0, value);
3376         break;
3377
3378         /* TODO: 8-bit accesses */
3379         if (s->cycle)
3380             ide_data_writew(s->ide, 0, s->io | (value << 8));
3381         else
3382             s->io = value & 0xff;
3383         s->cycle = !s->cycle;
3384         break;
3385     case 0x9:
3386         s->io = value & 0xff;
3387         s->cycle = !s->cycle;
3388         break;
3389     case 0xd:   /* Features */
3390         ide_ioport_write(s->ide, 0x1, value);
3391         break;
3392     case 0xe:   /* Device Control */
3393         s->ctrl = value;
3394         if (value & CTRL_SRST)
3395             md_reset(s);
3396         md_interrupt_update(s);
3397         break;
3398     default:
3399         if (s->stat & STAT_PWRDWN) {
3400             s->pins |= PINS_CRDY;
3401             s->stat &= ~STAT_PWRDWN;
3402         }
3403         ide_ioport_write(s->ide, at, value);
3404     }
3405 }
3406
3407 static void md_save(QEMUFile *f, void *opaque)
3408 {
3409     struct md_s *s = (struct md_s *) opaque;
3410     int i;
3411     uint8_t drive1_selected;
3412
3413     qemu_put_8s(f, &s->opt);
3414     qemu_put_8s(f, &s->stat);
3415     qemu_put_8s(f, &s->pins);
3416
3417     qemu_put_8s(f, &s->ctrl);
3418     qemu_put_be16s(f, &s->io);
3419     qemu_put_byte(f, s->cycle);
3420
3421     drive1_selected = (s->ide->cur_drive != s->ide);
3422     qemu_put_8s(f, &s->ide->cmd);
3423     qemu_put_8s(f, &drive1_selected);
3424
3425     for (i = 0; i < 2; i ++)
3426         ide_save(f, &s->ide[i]);
3427 }
3428
3429 static int md_load(QEMUFile *f, void *opaque, int version_id)
3430 {
3431     struct md_s *s = (struct md_s *) opaque;
3432     int i;
3433     uint8_t drive1_selected;
3434
3435     qemu_get_8s(f, &s->opt);
3436     qemu_get_8s(f, &s->stat);
3437     qemu_get_8s(f, &s->pins);
3438
3439     qemu_get_8s(f, &s->ctrl);
3440     qemu_get_be16s(f, &s->io);
3441     s->cycle = qemu_get_byte(f);
3442
3443     qemu_get_8s(f, &s->ide->cmd);
3444     qemu_get_8s(f, &drive1_selected);
3445     s->ide->cur_drive = &s->ide[(drive1_selected != 0)];
3446
3447     for (i = 0; i < 2; i ++)
3448         ide_load(f, &s->ide[i]);
3449
3450     return 0;
3451 }
3452
3453 static int md_iid = 0;
3454
3455 static const uint8_t dscm1xxxx_cis[0x14a] = {
3456     [0x000] = CISTPL_DEVICE,    /* 5V Device Information */
3457     [0x002] = 0x03,             /* Tuple length = 4 bytes */
3458     [0x004] = 0xdb,             /* ID: DTYPE_FUNCSPEC, non WP, DSPEED_150NS */
3459     [0x006] = 0x01,             /* Size = 2K bytes */
3460     [0x008] = CISTPL_ENDMARK,
3461
3462     [0x00a] = CISTPL_DEVICE_OC, /* Additional Device Information */
3463     [0x00c] = 0x04,             /* Tuple length = 4 byest */
3464     [0x00e] = 0x03,             /* Conditions: Ext = 0, Vcc 3.3V, MWAIT = 1 */
3465     [0x010] = 0xdb,             /* ID: DTYPE_FUNCSPEC, non WP, DSPEED_150NS */
3466     [0x012] = 0x01,             /* Size = 2K bytes */
3467     [0x014] = CISTPL_ENDMARK,
3468
3469     [0x016] = CISTPL_JEDEC_C,   /* JEDEC ID */
3470     [0x018] = 0x02,             /* Tuple length = 2 bytes */
3471     [0x01a] = 0xdf,             /* PC Card ATA with no Vpp required */
3472     [0x01c] = 0x01,
3473
3474     [0x01e] = CISTPL_MANFID,    /* Manufacture ID */
3475     [0x020] = 0x04,             /* Tuple length = 4 bytes */
3476     [0x022] = 0xa4,             /* TPLMID_MANF = 00a4 (IBM) */
3477     [0x024] = 0x00,
3478     [0x026] = 0x00,             /* PLMID_CARD = 0000 */
3479     [0x028] = 0x00,
3480
3481     [0x02a] = CISTPL_VERS_1,    /* Level 1 Version */
3482     [0x02c] = 0x12,             /* Tuple length = 23 bytes */
3483     [0x02e] = 0x04,             /* Major Version = JEIDA 4.2 / PCMCIA 2.1 */
3484     [0x030] = 0x01,             /* Minor Version = 1 */
3485     [0x032] = 'I',
3486     [0x034] = 'B',
3487     [0x036] = 'M',
3488     [0x038] = 0x00,
3489     [0x03a] = 'm',
3490     [0x03c] = 'i',
3491     [0x03e] = 'c',
3492     [0x040] = 'r',
3493     [0x042] = 'o',
3494     [0x044] = 'd',
3495     [0x046] = 'r',
3496     [0x048] = 'i',
3497     [0x04a] = 'v',
3498     [0x04c] = 'e',
3499     [0x04e] = 0x00,
3500     [0x050] = CISTPL_ENDMARK,
3501
3502     [0x052] = CISTPL_FUNCID,    /* Function ID */
3503     [0x054] = 0x02,             /* Tuple length = 2 bytes */
3504     [0x056] = 0x04,             /* TPLFID_FUNCTION = Fixed Disk */
3505     [0x058] = 0x01,             /* TPLFID_SYSINIT: POST = 1, ROM = 0 */
3506
3507     [0x05a] = CISTPL_FUNCE,     /* Function Extension */
3508     [0x05c] = 0x02,             /* Tuple length = 2 bytes */
3509     [0x05e] = 0x01,             /* TPLFE_TYPE = Disk Device Interface */
3510     [0x060] = 0x01,             /* TPLFE_DATA = PC Card ATA Interface */
3511
3512     [0x062] = CISTPL_FUNCE,     /* Function Extension */
3513     [0x064] = 0x03,             /* Tuple length = 3 bytes */
3514     [0x066] = 0x02,             /* TPLFE_TYPE = Basic PC Card ATA Interface */
3515     [0x068] = 0x08,             /* TPLFE_DATA: Rotating, Unique, Single */
3516     [0x06a] = 0x0f,             /* TPLFE_DATA: Sleep, Standby, Idle, Auto */
3517
3518     [0x06c] = CISTPL_CONFIG,    /* Configuration */
3519     [0x06e] = 0x05,             /* Tuple length = 5 bytes */
3520     [0x070] = 0x01,             /* TPCC_RASZ = 2 bytes, TPCC_RMSZ = 1 byte */
3521     [0x072] = 0x07,             /* TPCC_LAST = 7 */
3522     [0x074] = 0x00,             /* TPCC_RADR = 0200 */
3523     [0x076] = 0x02,
3524     [0x078] = 0x0f,             /* TPCC_RMSK = 200, 202, 204, 206 */
3525
3526     [0x07a] = CISTPL_CFTABLE_ENTRY,     /* 16-bit PC Card Configuration */
3527     [0x07c] = 0x0b,             /* Tuple length = 11 bytes */
3528     [0x07e] = 0xc0,             /* TPCE_INDX = Memory Mode, Default, Iface */
3529     [0x080] = 0xc0,             /* TPCE_IF = Memory, no BVDs, no WP, READY */
3530     [0x082] = 0xa1,             /* TPCE_FS = Vcc only, no I/O, Memory, Misc */
3531     [0x084] = 0x27,             /* NomV = 1, MinV = 1, MaxV = 1, Peakl = 1 */
3532     [0x086] = 0x55,             /* NomV: 5.0 V */
3533     [0x088] = 0x4d,             /* MinV: 4.5 V */
3534     [0x08a] = 0x5d,             /* MaxV: 5.5 V */
3535     [0x08c] = 0x4e,             /* Peakl: 450 mA */
3536     [0x08e] = 0x08,             /* TPCE_MS = 1 window, 1 byte, Host address */
3537     [0x090] = 0x00,             /* Window descriptor: Window length = 0 */
3538     [0x092] = 0x20,             /* TPCE_MI: support power down mode, RW */
3539
3540     [0x094] = CISTPL_CFTABLE_ENTRY,     /* 16-bit PC Card Configuration */
3541     [0x096] = 0x06,             /* Tuple length = 6 bytes */
3542     [0x098] = 0x00,             /* TPCE_INDX = Memory Mode, no Default */
3543     [0x09a] = 0x01,             /* TPCE_FS = Vcc only, no I/O, no Memory */
3544     [0x09c] = 0x21,             /* NomV = 1, MinV = 0, MaxV = 0, Peakl = 1 */
3545     [0x09e] = 0xb5,             /* NomV: 3.3 V */
3546     [0x0a0] = 0x1e,
3547     [0x0a2] = 0x3e,             /* Peakl: 350 mA */
3548
3549     [0x0a4] = CISTPL_CFTABLE_ENTRY,     /* 16-bit PC Card Configuration */
3550     [0x0a6] = 0x0d,             /* Tuple length = 13 bytes */
3551     [0x0a8] = 0xc1,             /* TPCE_INDX = I/O and Memory Mode, Default */
3552     [0x0aa] = 0x41,             /* TPCE_IF = I/O and Memory, no BVD, no WP */
3553     [0x0ac] = 0x99,             /* TPCE_FS = Vcc only, I/O, Interrupt, Misc */
3554     [0x0ae] = 0x27,             /* NomV = 1, MinV = 1, MaxV = 1, Peakl = 1 */
3555     [0x0b0] = 0x55,             /* NomV: 5.0 V */
3556     [0x0b2] = 0x4d,             /* MinV: 4.5 V */
3557     [0x0b4] = 0x5d,             /* MaxV: 5.5 V */
3558     [0x0b6] = 0x4e,             /* Peakl: 450 mA */
3559     [0x0b8] = 0x64,             /* TPCE_IO = 16-byte boundary, 16/8 accesses */
3560     [0x0ba] = 0xf0,             /* TPCE_IR =  MASK, Level, Pulse, Share */
3561     [0x0bc] = 0xff,             /* IRQ0..IRQ7 supported */
3562     [0x0be] = 0xff,             /* IRQ8..IRQ15 supported */
3563     [0x0c0] = 0x20,             /* TPCE_MI = support power down mode */
3564
3565     [0x0c2] = CISTPL_CFTABLE_ENTRY,     /* 16-bit PC Card Configuration */
3566     [0x0c4] = 0x06,             /* Tuple length = 6 bytes */
3567     [0x0c6] = 0x01,             /* TPCE_INDX = I/O and Memory Mode */
3568     [0x0c8] = 0x01,             /* TPCE_FS = Vcc only, no I/O, no Memory */
3569     [0x0ca] = 0x21,             /* NomV = 1, MinV = 0, MaxV = 0, Peakl = 1 */
3570     [0x0cc] = 0xb5,             /* NomV: 3.3 V */
3571     [0x0ce] = 0x1e,
3572     [0x0d0] = 0x3e,             /* Peakl: 350 mA */
3573
3574     [0x0d2] = CISTPL_CFTABLE_ENTRY,     /* 16-bit PC Card Configuration */
3575     [0x0d4] = 0x12,             /* Tuple length = 18 bytes */
3576     [0x0d6] = 0xc2,             /* TPCE_INDX = I/O Primary Mode */
3577     [0x0d8] = 0x41,             /* TPCE_IF = I/O and Memory, no BVD, no WP */
3578     [0x0da] = 0x99,             /* TPCE_FS = Vcc only, I/O, Interrupt, Misc */
3579     [0x0dc] = 0x27,             /* NomV = 1, MinV = 1, MaxV = 1, Peakl = 1 */
3580     [0x0de] = 0x55,             /* NomV: 5.0 V */
3581     [0x0e0] = 0x4d,             /* MinV: 4.5 V */
3582     [0x0e2] = 0x5d,             /* MaxV: 5.5 V */
3583     [0x0e4] = 0x4e,             /* Peakl: 450 mA */
3584     [0x0e6] = 0xea,             /* TPCE_IO = 1K boundary, 16/8 access, Range */
3585     [0x0e8] = 0x61,             /* Range: 2 fields, 2 bytes addr, 1 byte len */
3586     [0x0ea] = 0xf0,             /* Field 1 address = 0x01f0 */
3587     [0x0ec] = 0x01,
3588     [0x0ee] = 0x07,             /* Address block length = 8 */
3589     [0x0f0] = 0xf6,             /* Field 2 address = 0x03f6 */
3590     [0x0f2] = 0x03,
3591     [0x0f4] = 0x01,             /* Address block length = 2 */
3592     [0x0f6] = 0xee,             /* TPCE_IR = IRQ E, Level, Pulse, Share */
3593     [0x0f8] = 0x20,             /* TPCE_MI = support power down mode */
3594
3595     [0x0fa] = CISTPL_CFTABLE_ENTRY,     /* 16-bit PC Card Configuration */
3596     [0x0fc] = 0x06,             /* Tuple length = 6 bytes */
3597     [0x0fe] = 0x02,             /* TPCE_INDX = I/O Primary Mode, no Default */
3598     [0x100] = 0x01,             /* TPCE_FS = Vcc only, no I/O, no Memory */
3599     [0x102] = 0x21,             /* NomV = 1, MinV = 0, MaxV = 0, Peakl = 1 */
3600     [0x104] = 0xb5,             /* NomV: 3.3 V */
3601     [0x106] = 0x1e,
3602     [0x108] = 0x3e,             /* Peakl: 350 mA */
3603
3604     [0x10a] = CISTPL_CFTABLE_ENTRY,     /* 16-bit PC Card Configuration */
3605     [0x10c] = 0x12,             /* Tuple length = 18 bytes */
3606     [0x10e] = 0xc3,             /* TPCE_INDX = I/O Secondary Mode, Default */
3607     [0x110] = 0x41,             /* TPCE_IF = I/O and Memory, no BVD, no WP */
3608     [0x112] = 0x99,             /* TPCE_FS = Vcc only, I/O, Interrupt, Misc */
3609     [0x114] = 0x27,             /* NomV = 1, MinV = 1, MaxV = 1, Peakl = 1 */
3610     [0x116] = 0x55,             /* NomV: 5.0 V */
3611     [0x118] = 0x4d,             /* MinV: 4.5 V */
3612     [0x11a] = 0x5d,             /* MaxV: 5.5 V */
3613     [0x11c] = 0x4e,             /* Peakl: 450 mA */
3614     [0x11e] = 0xea,             /* TPCE_IO = 1K boundary, 16/8 access, Range */
3615     [0x120] = 0x61,             /* Range: 2 fields, 2 byte addr, 1 byte len */
3616     [0x122] = 0x70,             /* Field 1 address = 0x0170 */
3617     [0x124] = 0x01,
3618     [0x126] = 0x07,             /* Address block length = 8 */
3619     [0x128] = 0x76,             /* Field 2 address = 0x0376 */
3620     [0x12a] = 0x03,
3621     [0x12c] = 0x01,             /* Address block length = 2 */
3622     [0x12e] = 0xee,             /* TPCE_IR = IRQ E, Level, Pulse, Share */
3623     [0x130] = 0x20,             /* TPCE_MI = support power down mode */
3624
3625     [0x132] = CISTPL_CFTABLE_ENTRY,     /* 16-bit PC Card Configuration */
3626     [0x134] = 0x06,             /* Tuple length = 6 bytes */
3627     [0x136] = 0x03,             /* TPCE_INDX = I/O Secondary Mode */
3628     [0x138] = 0x01,             /* TPCE_FS = Vcc only, no I/O, no Memory */
3629     [0x13a] = 0x21,             /* NomV = 1, MinV = 0, MaxV = 0, Peakl = 1 */
3630     [0x13c] = 0xb5,             /* NomV: 3.3 V */
3631     [0x13e] = 0x1e,
3632     [0x140] = 0x3e,             /* Peakl: 350 mA */
3633
3634     [0x142] = CISTPL_NO_LINK,   /* No Link */
3635     [0x144] = 0x00,             /* Tuple length = 0 bytes */
3636
3637     [0x146] = CISTPL_END,       /* Tuple End */
3638 };
3639
3640 static int dscm1xxxx_attach(void *opaque)
3641 {
3642     struct md_s *md = (struct md_s *) opaque;
3643     md->card.attr_read = md_attr_read;
3644     md->card.attr_write = md_attr_write;
3645     md->card.common_read = md_common_read;
3646     md->card.common_write = md_common_write;
3647     md->card.io_read = md_common_read;
3648     md->card.io_write = md_common_write;
3649
3650     md->attr_base = md->card.cis[0x74] | (md->card.cis[0x76] << 8);
3651     md->io_base = 0x0;
3652
3653     md_reset(md);
3654     md_interrupt_update(md);
3655
3656     md->card.slot->card_string = "DSCM-1xxxx Hitachi Microdrive";
3657     return 0;
3658 }
3659
3660 static int dscm1xxxx_detach(void *opaque)
3661 {
3662     struct md_s *md = (struct md_s *) opaque;
3663     md_reset(md);
3664     return 0;
3665 }
3666
3667 struct pcmcia_card_s *dscm1xxxx_init(BlockDriverState *bdrv)
3668 {
3669     struct md_s *md = (struct md_s *) qemu_mallocz(sizeof(struct md_s));
3670     md->card.state = md;
3671     md->card.attach = dscm1xxxx_attach;
3672     md->card.detach = dscm1xxxx_detach;
3673     md->card.cis = dscm1xxxx_cis;
3674     md->card.cis_len = sizeof(dscm1xxxx_cis);
3675
3676     ide_init2(md->ide, bdrv, 0, qemu_allocate_irqs(md_set_irq, md, 1)[0]);
3677     md->ide->is_cf = 1;
3678     md->ide->mdata_size = METADATA_SIZE;
3679     md->ide->mdata_storage = (uint8_t *) qemu_mallocz(METADATA_SIZE);
3680
3681     register_savevm("microdrive", md_iid ++, 0, md_save, md_load, md);
3682
3683     return &md->card;
3684 }