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