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