Statistics
| Branch: | Revision:

root / hw / ide.c @ 69b91039

History | View | Annotate | Download (48.5 kB)

1
/*
2
 * QEMU IDE disk and CD-ROM Emulator
3
 * 
4
 * Copyright (c) 2003 Fabrice Bellard
5
 * 
6
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7
 * of this software and associated documentation files (the "Software"), to deal
8
 * in the Software without restriction, including without limitation the rights
9
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
 * copies of the Software, and to permit persons to whom the Software is
11
 * furnished to do so, subject to the following conditions:
12
 *
13
 * The above copyright notice and this permission notice shall be included in
14
 * all copies or substantial portions of the Software.
15
 *
16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
 * THE SOFTWARE.
23
 */
24
#include "vl.h"
25

    
26
/* debug IDE devices */
27
//#define DEBUG_IDE
28
//#define DEBUG_IDE_ATAPI
29

    
30
/* Bits of HD_STATUS */
31
#define ERR_STAT                0x01
32
#define INDEX_STAT                0x02
33
#define ECC_STAT                0x04        /* Corrected error */
34
#define DRQ_STAT                0x08
35
#define SEEK_STAT                0x10
36
#define SRV_STAT                0x10
37
#define WRERR_STAT                0x20
38
#define READY_STAT                0x40
39
#define BUSY_STAT                0x80
40

    
41
/* Bits for HD_ERROR */
42
#define MARK_ERR                0x01        /* Bad address mark */
43
#define TRK0_ERR                0x02        /* couldn't find track 0 */
44
#define ABRT_ERR                0x04        /* Command aborted */
45
#define MCR_ERR                        0x08        /* media change request */
46
#define ID_ERR                        0x10        /* ID field not found */
47
#define MC_ERR                        0x20        /* media changed */
48
#define ECC_ERR                        0x40        /* Uncorrectable ECC error */
49
#define BBD_ERR                        0x80        /* pre-EIDE meaning:  block marked bad */
50
#define ICRC_ERR                0x80        /* new meaning:  CRC error during transfer */
51

    
52
/* Bits of HD_NSECTOR */
53
#define CD                        0x01
54
#define IO                        0x02
55
#define REL                        0x04
56
#define TAG_MASK                0xf8
57

    
58
#define IDE_CMD_RESET           0x04
59
#define IDE_CMD_DISABLE_IRQ     0x02
60

    
61
/* ATA/ATAPI Commands pre T13 Spec */
62
#define WIN_NOP                                0x00
63
/*
64
 *        0x01->0x02 Reserved
65
 */
66
#define CFA_REQ_EXT_ERROR_CODE                0x03 /* CFA Request Extended Error Code */
67
/*
68
 *        0x04->0x07 Reserved
69
 */
70
#define WIN_SRST                        0x08 /* ATAPI soft reset command */
71
#define WIN_DEVICE_RESET                0x08
72
/*
73
 *        0x09->0x0F Reserved
74
 */
75
#define WIN_RECAL                        0x10
76
#define WIN_RESTORE                        WIN_RECAL
77
/*
78
 *        0x10->0x1F Reserved
79
 */
80
#define WIN_READ                        0x20 /* 28-Bit */
81
#define WIN_READ_ONCE                        0x21 /* 28-Bit without retries */
82
#define WIN_READ_LONG                        0x22 /* 28-Bit */
83
#define WIN_READ_LONG_ONCE                0x23 /* 28-Bit without retries */
84
#define WIN_READ_EXT                        0x24 /* 48-Bit */
85
#define WIN_READDMA_EXT                        0x25 /* 48-Bit */
86
#define WIN_READDMA_QUEUED_EXT                0x26 /* 48-Bit */
87
#define WIN_READ_NATIVE_MAX_EXT                0x27 /* 48-Bit */
88
/*
89
 *        0x28
90
 */
91
#define WIN_MULTREAD_EXT                0x29 /* 48-Bit */
92
/*
93
 *        0x2A->0x2F Reserved
94
 */
95
#define WIN_WRITE                        0x30 /* 28-Bit */
96
#define WIN_WRITE_ONCE                        0x31 /* 28-Bit without retries */
97
#define WIN_WRITE_LONG                        0x32 /* 28-Bit */
98
#define WIN_WRITE_LONG_ONCE                0x33 /* 28-Bit without retries */
99
#define WIN_WRITE_EXT                        0x34 /* 48-Bit */
100
#define WIN_WRITEDMA_EXT                0x35 /* 48-Bit */
101
#define WIN_WRITEDMA_QUEUED_EXT                0x36 /* 48-Bit */
102
#define WIN_SET_MAX_EXT                        0x37 /* 48-Bit */
103
#define CFA_WRITE_SECT_WO_ERASE                0x38 /* CFA Write Sectors without erase */
104
#define WIN_MULTWRITE_EXT                0x39 /* 48-Bit */
105
/*
106
 *        0x3A->0x3B Reserved
107
 */
108
#define WIN_WRITE_VERIFY                0x3C /* 28-Bit */
109
/*
110
 *        0x3D->0x3F Reserved
111
 */
112
#define WIN_VERIFY                        0x40 /* 28-Bit - Read Verify Sectors */
113
#define WIN_VERIFY_ONCE                        0x41 /* 28-Bit - without retries */
114
#define WIN_VERIFY_EXT                        0x42 /* 48-Bit */
115
/*
116
 *        0x43->0x4F Reserved
117
 */
118
#define WIN_FORMAT                        0x50
119
/*
120
 *        0x51->0x5F Reserved
121
 */
122
#define WIN_INIT                        0x60
123
/*
124
 *        0x61->0x5F Reserved
125
 */
126
#define WIN_SEEK                        0x70 /* 0x70-0x7F Reserved */
127
#define CFA_TRANSLATE_SECTOR                0x87 /* CFA Translate Sector */
128
#define WIN_DIAGNOSE                        0x90
129
#define WIN_SPECIFY                        0x91 /* set drive geometry translation */
130
#define WIN_DOWNLOAD_MICROCODE                0x92
131
#define WIN_STANDBYNOW2                        0x94
132
#define WIN_STANDBY2                        0x96
133
#define WIN_SETIDLE2                        0x97
134
#define WIN_CHECKPOWERMODE2                0x98
135
#define WIN_SLEEPNOW2                        0x99
136
/*
137
 *        0x9A VENDOR
138
 */
139
#define WIN_PACKETCMD                        0xA0 /* Send a packet command. */
140
#define WIN_PIDENTIFY                        0xA1 /* identify ATAPI device        */
141
#define WIN_QUEUED_SERVICE                0xA2
142
#define WIN_SMART                        0xB0 /* self-monitoring and reporting */
143
#define CFA_ERASE_SECTORS               0xC0
144
#define WIN_MULTREAD                        0xC4 /* read sectors using multiple mode*/
145
#define WIN_MULTWRITE                        0xC5 /* write sectors using multiple mode */
146
#define WIN_SETMULT                        0xC6 /* enable/disable multiple mode */
147
#define WIN_READDMA_QUEUED                0xC7 /* read sectors using Queued DMA transfers */
148
#define WIN_READDMA                        0xC8 /* read sectors using DMA transfers */
149
#define WIN_READDMA_ONCE                0xC9 /* 28-Bit - without retries */
150
#define WIN_WRITEDMA                        0xCA /* write sectors using DMA transfers */
151
#define WIN_WRITEDMA_ONCE                0xCB /* 28-Bit - without retries */
152
#define WIN_WRITEDMA_QUEUED                0xCC /* write sectors using Queued DMA transfers */
153
#define CFA_WRITE_MULTI_WO_ERASE        0xCD /* CFA Write multiple without erase */
154
#define WIN_GETMEDIASTATUS                0xDA        
155
#define WIN_ACKMEDIACHANGE                0xDB /* ATA-1, ATA-2 vendor */
156
#define WIN_POSTBOOT                        0xDC
157
#define WIN_PREBOOT                        0xDD
158
#define WIN_DOORLOCK                        0xDE /* lock door on removable drives */
159
#define WIN_DOORUNLOCK                        0xDF /* unlock door on removable drives */
160
#define WIN_STANDBYNOW1                        0xE0
161
#define WIN_IDLEIMMEDIATE                0xE1 /* force drive to become "ready" */
162
#define WIN_STANDBY                     0xE2 /* Set device in Standby Mode */
163
#define WIN_SETIDLE1                        0xE3
164
#define WIN_READ_BUFFER                        0xE4 /* force read only 1 sector */
165
#define WIN_CHECKPOWERMODE1                0xE5
166
#define WIN_SLEEPNOW1                        0xE6
167
#define WIN_FLUSH_CACHE                        0xE7
168
#define WIN_WRITE_BUFFER                0xE8 /* force write only 1 sector */
169
#define WIN_WRITE_SAME                        0xE9 /* read ata-2 to use */
170
        /* SET_FEATURES 0x22 or 0xDD */
171
#define WIN_FLUSH_CACHE_EXT                0xEA /* 48-Bit */
172
#define WIN_IDENTIFY                        0xEC /* ask drive to identify itself        */
173
#define WIN_MEDIAEJECT                        0xED
174
#define WIN_IDENTIFY_DMA                0xEE /* same as WIN_IDENTIFY, but DMA */
175
#define WIN_SETFEATURES                        0xEF /* set special drive features */
176
#define EXABYTE_ENABLE_NEST                0xF0
177
#define WIN_SECURITY_SET_PASS                0xF1
178
#define WIN_SECURITY_UNLOCK                0xF2
179
#define WIN_SECURITY_ERASE_PREPARE        0xF3
180
#define WIN_SECURITY_ERASE_UNIT                0xF4
181
#define WIN_SECURITY_FREEZE_LOCK        0xF5
182
#define WIN_SECURITY_DISABLE                0xF6
183
#define WIN_READ_NATIVE_MAX                0xF8 /* return the native maximum address */
184
#define WIN_SET_MAX                        0xF9
185
#define DISABLE_SEAGATE                        0xFB
186

    
187
/* set to 1 set disable mult support */
188
#define MAX_MULT_SECTORS 8
189

    
190
/* ATAPI defines */
191

    
192
#define ATAPI_PACKET_SIZE 12
193

    
194
/* The generic packet command opcodes for CD/DVD Logical Units,
195
 * From Table 57 of the SFF8090 Ver. 3 (Mt. Fuji) draft standard. */
196
#define GPCMD_BLANK                            0xa1
197
#define GPCMD_CLOSE_TRACK                    0x5b
198
#define GPCMD_FLUSH_CACHE                    0x35
199
#define GPCMD_FORMAT_UNIT                    0x04
200
#define GPCMD_GET_CONFIGURATION                    0x46
201
#define GPCMD_GET_EVENT_STATUS_NOTIFICATION 0x4a
202
#define GPCMD_GET_PERFORMANCE                    0xac
203
#define GPCMD_INQUIRY                            0x12
204
#define GPCMD_LOAD_UNLOAD                    0xa6
205
#define GPCMD_MECHANISM_STATUS                    0xbd
206
#define GPCMD_MODE_SELECT_10                    0x55
207
#define GPCMD_MODE_SENSE_10                    0x5a
208
#define GPCMD_PAUSE_RESUME                    0x4b
209
#define GPCMD_PLAY_AUDIO_10                    0x45
210
#define GPCMD_PLAY_AUDIO_MSF                    0x47
211
#define GPCMD_PLAY_AUDIO_TI                    0x48
212
#define GPCMD_PLAY_CD                            0xbc
213
#define GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL  0x1e
214
#define GPCMD_READ_10                            0x28
215
#define GPCMD_READ_12                            0xa8
216
#define GPCMD_READ_CDVD_CAPACITY            0x25
217
#define GPCMD_READ_CD                            0xbe
218
#define GPCMD_READ_CD_MSF                    0xb9
219
#define GPCMD_READ_DISC_INFO                    0x51
220
#define GPCMD_READ_DVD_STRUCTURE            0xad
221
#define GPCMD_READ_FORMAT_CAPACITIES            0x23
222
#define GPCMD_READ_HEADER                    0x44
223
#define GPCMD_READ_TRACK_RZONE_INFO            0x52
224
#define GPCMD_READ_SUBCHANNEL                    0x42
225
#define GPCMD_READ_TOC_PMA_ATIP                    0x43
226
#define GPCMD_REPAIR_RZONE_TRACK            0x58
227
#define GPCMD_REPORT_KEY                    0xa4
228
#define GPCMD_REQUEST_SENSE                    0x03
229
#define GPCMD_RESERVE_RZONE_TRACK            0x53
230
#define GPCMD_SCAN                            0xba
231
#define GPCMD_SEEK                            0x2b
232
#define GPCMD_SEND_DVD_STRUCTURE            0xad
233
#define GPCMD_SEND_EVENT                    0xa2
234
#define GPCMD_SEND_KEY                            0xa3
235
#define GPCMD_SEND_OPC                            0x54
236
#define GPCMD_SET_READ_AHEAD                    0xa7
237
#define GPCMD_SET_STREAMING                    0xb6
238
#define GPCMD_START_STOP_UNIT                    0x1b
239
#define GPCMD_STOP_PLAY_SCAN                    0x4e
240
#define GPCMD_TEST_UNIT_READY                    0x00
241
#define GPCMD_VERIFY_10                            0x2f
242
#define GPCMD_WRITE_10                            0x2a
243
#define GPCMD_WRITE_AND_VERIFY_10            0x2e
244
/* This is listed as optional in ATAPI 2.6, but is (curiously) 
245
 * missing from Mt. Fuji, Table 57.  It _is_ mentioned in Mt. Fuji
246
 * Table 377 as an MMC command for SCSi devices though...  Most ATAPI
247
 * drives support it. */
248
#define GPCMD_SET_SPEED                            0xbb
249
/* This seems to be a SCSI specific CD-ROM opcode 
250
 * to play data at track/index */
251
#define GPCMD_PLAYAUDIO_TI                    0x48
252
/*
253
 * From MS Media Status Notification Support Specification. For
254
 * older drives only.
255
 */
256
#define GPCMD_GET_MEDIA_STATUS                    0xda
257

    
258
/* Mode page codes for mode sense/set */
259
#define GPMODE_R_W_ERROR_PAGE                0x01
260
#define GPMODE_WRITE_PARMS_PAGE                0x05
261
#define GPMODE_AUDIO_CTL_PAGE                0x0e
262
#define GPMODE_POWER_PAGE                0x1a
263
#define GPMODE_FAULT_FAIL_PAGE                0x1c
264
#define GPMODE_TO_PROTECT_PAGE                0x1d
265
#define GPMODE_CAPABILITIES_PAGE        0x2a
266
#define GPMODE_ALL_PAGES                0x3f
267
/* Not in Mt. Fuji, but in ATAPI 2.6 -- depricated now in favor
268
 * of MODE_SENSE_POWER_PAGE */
269
#define GPMODE_CDROM_PAGE                0x0d
270

    
271
#define ATAPI_INT_REASON_CD             0x01 /* 0 = data transfer */
272
#define ATAPI_INT_REASON_IO             0x02 /* 1 = transfer to the host */
273
#define ATAPI_INT_REASON_REL            0x04
274
#define ATAPI_INT_REASON_TAG            0xf8
275

    
276
/* same constants as bochs */
277
#define ASC_ILLEGAL_OPCODE                   0x20
278
#define ASC_LOGICAL_BLOCK_OOR                0x21
279
#define ASC_INV_FIELD_IN_CMD_PACKET          0x24
280
#define ASC_MEDIUM_NOT_PRESENT               0x3a
281
#define ASC_SAVING_PARAMETERS_NOT_SUPPORTED  0x39
282

    
283
#define SENSE_NONE            0
284
#define SENSE_NOT_READY       2
285
#define SENSE_ILLEGAL_REQUEST 5
286
#define SENSE_UNIT_ATTENTION  6
287

    
288
struct IDEState;
289

    
290
typedef void EndTransferFunc(struct IDEState *);
291

    
292
/* NOTE: IDEState represents in fact one drive */
293
typedef struct IDEState {
294
    /* ide config */
295
    int is_cdrom;
296
    int cylinders, heads, sectors;
297
    int64_t nb_sectors;
298
    int mult_sectors;
299
    int irq;
300
    int drive_serial;
301
    /* ide regs */
302
    uint8_t feature;
303
    uint8_t error;
304
    uint16_t nsector; /* 0 is 256 to ease computations */
305
    uint8_t sector;
306
    uint8_t lcyl;
307
    uint8_t hcyl;
308
    uint8_t select;
309
    uint8_t status;
310
    /* 0x3f6 command, only meaningful for drive 0 */
311
    uint8_t cmd;
312
    /* depends on bit 4 in select, only meaningful for drive 0 */
313
    struct IDEState *cur_drive; 
314
    BlockDriverState *bs;
315
    /* ATAPI specific */
316
    uint8_t sense_key;
317
    uint8_t asc;
318
    int packet_transfer_size;
319
    int elementary_transfer_size;
320
    int io_buffer_index;
321
    int lba;
322
    /* transfer handling */
323
    int req_nb_sectors; /* number of sectors per interrupt */
324
    EndTransferFunc *end_transfer_func;
325
    uint8_t *data_ptr;
326
    uint8_t *data_end;
327
    uint8_t io_buffer[MAX_MULT_SECTORS*512 + 4];
328
} IDEState;
329

    
330
static void padstr(char *str, const char *src, int len)
331
{
332
    int i, v;
333
    for(i = 0; i < len; i++) {
334
        if (*src)
335
            v = *src++;
336
        else
337
            v = ' ';
338
        *(char *)((long)str ^ 1) = v;
339
        str++;
340
    }
341
}
342

    
343
static void padstr8(uint8_t *buf, int buf_size, const char *src)
344
{
345
    int i;
346
    for(i = 0; i < buf_size; i++) {
347
        if (*src)
348
            buf[i] = *src++;
349
        else
350
            buf[i] = ' ';
351
    }
352
}
353

    
354
static void put_le16(uint16_t *p, unsigned int v)
355
{
356
    *p = cpu_to_le16(v);
357
}
358

    
359
static void ide_identify(IDEState *s)
360
{
361
    uint16_t *p;
362
    unsigned int oldsize;
363
    char buf[20];
364

    
365
    memset(s->io_buffer, 0, 512);
366
    p = (uint16_t *)s->io_buffer;
367
    put_le16(p + 0, 0x0040);
368
    put_le16(p + 1, s->cylinders); 
369
    put_le16(p + 3, s->heads);
370
    put_le16(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */
371
    put_le16(p + 5, 512); /* XXX: retired, remove ? */
372
    put_le16(p + 6, s->sectors); 
373
    snprintf(buf, sizeof(buf), "QM%05d", s->drive_serial);
374
    padstr((uint8_t *)(p + 10), buf, 20); /* serial number */
375
    put_le16(p + 20, 3); /* XXX: retired, remove ? */
376
    put_le16(p + 21, 512); /* cache size in sectors */
377
    put_le16(p + 22, 4); /* ecc bytes */
378
    padstr((uint8_t *)(p + 23), QEMU_VERSION, 8); /* firmware version */
379
    padstr((uint8_t *)(p + 27), "QEMU HARDDISK", 40); /* model */
380
#if MAX_MULT_SECTORS > 1    
381
    put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
382
#endif
383
    put_le16(p + 48, 1); /* dword I/O */
384
    put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
385
    put_le16(p + 51, 0x200); /* PIO transfer cycle */
386
    put_le16(p + 52, 0x200); /* DMA transfer cycle */
387
    put_le16(p + 53, 1); /* words 54-58 are valid */
388
    put_le16(p + 54, s->cylinders);
389
    put_le16(p + 55, s->heads);
390
    put_le16(p + 56, s->sectors);
391
    oldsize = s->cylinders * s->heads * s->sectors;
392
    put_le16(p + 57, oldsize);
393
    put_le16(p + 58, oldsize >> 16);
394
    if (s->mult_sectors)
395
        put_le16(p + 59, 0x100 | s->mult_sectors);
396
    put_le16(p + 60, s->nb_sectors);
397
    put_le16(p + 61, s->nb_sectors >> 16);
398
    put_le16(p + 80, (1 << 1) | (1 << 2));
399
    put_le16(p + 82, (1 << 14));
400
    put_le16(p + 83, (1 << 14));
401
    put_le16(p + 84, (1 << 14));
402
    put_le16(p + 85, (1 << 14));
403
    put_le16(p + 86, 0);
404
    put_le16(p + 87, (1 << 14));
405
}
406

    
407
static void ide_atapi_identify(IDEState *s)
408
{
409
    uint16_t *p;
410
    char buf[20];
411

    
412
    memset(s->io_buffer, 0, 512);
413
    p = (uint16_t *)s->io_buffer;
414
    /* Removable CDROM, 50us response, 12 byte packets */
415
    put_le16(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
416
    snprintf(buf, sizeof(buf), "QM%05d", s->drive_serial);
417
    padstr((uint8_t *)(p + 10), buf, 20); /* serial number */
418
    put_le16(p + 20, 3); /* buffer type */
419
    put_le16(p + 21, 512); /* cache size in sectors */
420
    put_le16(p + 22, 4); /* ecc bytes */
421
    padstr((uint8_t *)(p + 23), QEMU_VERSION, 8); /* firmware version */
422
    padstr((uint8_t *)(p + 27), "QEMU CD-ROM", 40); /* model */
423
    put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
424
    put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
425
    put_le16(p + 53, 3); /* words 64-70, 54-58 valid */
426
    put_le16(p + 63, 0x103); /* DMA modes XXX: may be incorrect */
427
    put_le16(p + 64, 1); /* PIO modes */
428
    put_le16(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */
429
    put_le16(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */
430
    put_le16(p + 67, 0x12c); /* minimum PIO cycle time without flow control */
431
    put_le16(p + 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */
432
    
433
    put_le16(p + 71, 30); /* in ns */
434
    put_le16(p + 72, 30); /* in ns */
435

    
436
    put_le16(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */
437
}
438

    
439
static void ide_set_signature(IDEState *s)
440
{
441
    s->select &= 0xf0; /* clear head */
442
    /* put signature */
443
    s->nsector = 1;
444
    s->sector = 1;
445
    if (s->is_cdrom) {
446
        s->lcyl = 0x14;
447
        s->hcyl = 0xeb;
448
    } else if (s->bs) {
449
        s->lcyl = 0;
450
        s->hcyl = 0;
451
    } else {
452
        s->lcyl = 0xff;
453
        s->hcyl = 0xff;
454
    }
455
}
456

    
457
static inline void ide_abort_command(IDEState *s)
458
{
459
    s->status = READY_STAT | ERR_STAT;
460
    s->error = ABRT_ERR;
461
}
462

    
463
static inline void ide_set_irq(IDEState *s)
464
{
465
    if (!(s->cmd & IDE_CMD_DISABLE_IRQ)) {
466
        pic_set_irq(s->irq, 1);
467
    }
468
}
469

    
470
/* prepare data transfer and tell what to do after */
471
static void ide_transfer_start(IDEState *s, uint8_t *buf, int size, 
472
                               EndTransferFunc *end_transfer_func)
473
{
474
    s->end_transfer_func = end_transfer_func;
475
    s->data_ptr = buf;
476
    s->data_end = buf + size;
477
    s->status |= DRQ_STAT;
478
}
479

    
480
static void ide_transfer_stop(IDEState *s)
481
{
482
    s->end_transfer_func = ide_transfer_stop;
483
    s->data_ptr = s->io_buffer;
484
    s->data_end = s->io_buffer;
485
    s->status &= ~DRQ_STAT;
486
}
487

    
488
static int64_t ide_get_sector(IDEState *s)
489
{
490
    int64_t sector_num;
491
    if (s->select & 0x40) {
492
        /* lba */
493
        sector_num = ((s->select & 0x0f) << 24) | (s->hcyl << 16) | 
494
            (s->lcyl << 8) | s->sector;
495
    } else {
496
        sector_num = ((s->hcyl << 8) | s->lcyl) * s->heads * s->sectors +
497
            (s->select & 0x0f) * s->sectors + 
498
            (s->sector - 1);
499
    }
500
    return sector_num;
501
}
502

    
503
static void ide_set_sector(IDEState *s, int64_t sector_num)
504
{
505
    unsigned int cyl, r;
506
    if (s->select & 0x40) {
507
        s->select = (s->select & 0xf0) | (sector_num >> 24);
508
        s->hcyl = (sector_num >> 16);
509
        s->lcyl = (sector_num >> 8);
510
        s->sector = (sector_num);
511
    } else {
512
        cyl = sector_num / (s->heads * s->sectors);
513
        r = sector_num % (s->heads * s->sectors);
514
        s->hcyl = cyl >> 8;
515
        s->lcyl = cyl;
516
        s->select = (s->select & 0xf0) | ((r / s->sectors) & 0x0f);
517
        s->sector = (r % s->sectors) + 1;
518
    }
519
}
520

    
521
static void ide_sector_read(IDEState *s)
522
{
523
    int64_t sector_num;
524
    int ret, n;
525

    
526
    s->status = READY_STAT | SEEK_STAT;
527
    s->error = 0; /* not needed by IDE spec, but needed by Windows */
528
    sector_num = ide_get_sector(s);
529
    n = s->nsector;
530
    if (n == 0) {
531
        /* no more sector to read from disk */
532
        ide_transfer_stop(s);
533
    } else {
534
#if defined(DEBUG_IDE)
535
        printf("read sector=%Ld\n", sector_num);
536
#endif
537
        if (n > s->req_nb_sectors)
538
            n = s->req_nb_sectors;
539
        ret = bdrv_read(s->bs, sector_num, s->io_buffer, n);
540
        ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_read);
541
        ide_set_irq(s);
542
        ide_set_sector(s, sector_num + n);
543
        s->nsector -= n;
544
    }
545
}
546

    
547
static void ide_sector_write(IDEState *s)
548
{
549
    int64_t sector_num;
550
    int ret, n, n1;
551

    
552
    s->status = READY_STAT | SEEK_STAT;
553
    sector_num = ide_get_sector(s);
554
#if defined(DEBUG_IDE)
555
    printf("write sector=%Ld\n", sector_num);
556
#endif
557
    n = s->nsector;
558
    if (n > s->req_nb_sectors)
559
        n = s->req_nb_sectors;
560
    ret = bdrv_write(s->bs, sector_num, s->io_buffer, n);
561
    s->nsector -= n;
562
    if (s->nsector == 0) {
563
        /* no more sector to write */
564
        ide_transfer_stop(s);
565
    } else {
566
        n1 = s->nsector;
567
        if (n1 > s->req_nb_sectors)
568
            n1 = s->req_nb_sectors;
569
        ide_transfer_start(s, s->io_buffer, 512 * n1, ide_sector_write);
570
    }
571
    ide_set_sector(s, sector_num + n);
572
    ide_set_irq(s);
573
}
574

    
575
static void ide_atapi_cmd_ok(IDEState *s)
576
{
577
    s->error = 0;
578
    s->status = READY_STAT;
579
    s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
580
    ide_set_irq(s);
581
}
582

    
583
static void ide_atapi_cmd_error(IDEState *s, int sense_key, int asc)
584
{
585
#ifdef DEBUG_IDE_ATAPI
586
    printf("atapi_cmd_error: sense=0x%x asc=0x%x\n", sense_key, asc);
587
#endif
588
    s->error = sense_key << 4;
589
    s->status = READY_STAT | ERR_STAT;
590
    s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
591
    s->sense_key = sense_key;
592
    s->asc = asc;
593
    ide_set_irq(s);
594
}
595

    
596
static inline void cpu_to_ube16(uint8_t *buf, int val)
597
{
598
    buf[0] = val >> 8;
599
    buf[1] = val;
600
}
601

    
602
static inline void cpu_to_ube32(uint8_t *buf, unsigned int val)
603
{
604
    buf[0] = val >> 24;
605
    buf[1] = val >> 16;
606
    buf[2] = val >> 8;
607
    buf[3] = val;
608
}
609

    
610
static inline int ube16_to_cpu(const uint8_t *buf)
611
{
612
    return (buf[0] << 8) | buf[1];
613
}
614

    
615
static inline int ube32_to_cpu(const uint8_t *buf)
616
{
617
    return (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
618
}
619

    
620
/* The whole ATAPI transfer logic is handled in this function */
621
static void ide_atapi_cmd_reply_end(IDEState *s)
622
{
623
    int byte_count_limit, size;
624
#ifdef DEBUG_IDE_ATAPI
625
    printf("reply: tx_size=%d elem_tx_size=%d index=%d\n", 
626
           s->packet_transfer_size,
627
           s->elementary_transfer_size,
628
           s->io_buffer_index);
629
#endif
630
    if (s->packet_transfer_size <= 0) {
631
        /* end of transfer */
632
        ide_transfer_stop(s);
633
        s->status = READY_STAT;
634
        s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
635
        ide_set_irq(s);
636
#ifdef DEBUG_IDE_ATAPI
637
        printf("status=0x%x\n", s->status);
638
#endif
639
    } else {
640
        /* see if a new sector must be read */
641
        if (s->lba != -1 && s->io_buffer_index >= 2048) {
642
            bdrv_read(s->bs, (int64_t)s->lba << 2, s->io_buffer, 4);
643
            s->lba++;
644
            s->io_buffer_index = 0;
645
        }
646
        if (s->elementary_transfer_size > 0) {
647
            /* there are some data left to transmit in this elementary
648
               transfer */
649
            size = 2048 - s->io_buffer_index;
650
            if (size > s->elementary_transfer_size)
651
                size = s->elementary_transfer_size;
652
            ide_transfer_start(s, s->io_buffer + s->io_buffer_index, 
653
                               size, ide_atapi_cmd_reply_end);
654
            s->packet_transfer_size -= size;
655
            s->elementary_transfer_size -= size;
656
            s->io_buffer_index += size;
657
        } else {
658
            /* a new transfer is needed */
659
            s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO;
660
            byte_count_limit = s->lcyl | (s->hcyl << 8);
661
#ifdef DEBUG_IDE_ATAPI
662
            printf("byte_count_limit=%d\n", byte_count_limit);
663
#endif
664
            if (byte_count_limit == 0xffff)
665
                byte_count_limit--;
666
            size = s->packet_transfer_size;
667
            if (size > byte_count_limit) {
668
                /* byte count limit must be even if this case */
669
                if (byte_count_limit & 1)
670
                    byte_count_limit--;
671
                size = byte_count_limit;
672
            }
673
            s->lcyl = size;
674
            s->hcyl = size >> 8;
675
            s->elementary_transfer_size = size;
676
            /* we cannot transmit more than one sector at a time */
677
            if (s->lba != -1) {
678
                if (size > (2048 - s->io_buffer_index))
679
                    size = (2048 - s->io_buffer_index);
680
            }
681
            ide_transfer_start(s, s->io_buffer + s->io_buffer_index, 
682
                               size, ide_atapi_cmd_reply_end);
683
            s->packet_transfer_size -= size;
684
            s->elementary_transfer_size -= size;
685
            s->io_buffer_index += size;
686
            ide_set_irq(s);
687
#ifdef DEBUG_IDE_ATAPI
688
            printf("status=0x%x\n", s->status);
689
#endif
690
        }
691
    }
692
}
693

    
694
/* send a reply of 'size' bytes in s->io_buffer to an ATAPI command */
695
static void ide_atapi_cmd_reply(IDEState *s, int size, int max_size)
696
{
697
    if (size > max_size)
698
        size = max_size;
699
    s->lba = -1; /* no sector read */
700
    s->packet_transfer_size = size;
701
    s->elementary_transfer_size = 0;
702
    s->io_buffer_index = 0;
703

    
704
    s->status = READY_STAT;
705
    ide_atapi_cmd_reply_end(s);
706
}
707

    
708
/* start a CD-CDROM read command */
709
static void ide_atapi_cmd_read(IDEState *s, int lba, int nb_sectors)
710
{
711
#ifdef DEBUG_IDE_ATAPI
712
    printf("read: LBA=%d nb_sectors=%d\n", lba, nb_sectors);
713
#endif
714
    s->lba = lba;
715
    s->packet_transfer_size = nb_sectors * 2048;
716
    s->elementary_transfer_size = 0;
717
    s->io_buffer_index = 2048;
718

    
719
    s->status = READY_STAT;
720
    ide_atapi_cmd_reply_end(s);
721
}
722

    
723
/* same toc as bochs. Return -1 if error or the toc length */
724
static int cdrom_read_toc(IDEState *s, uint8_t *buf, int msf, int start_track)
725
{
726
    uint8_t *q;
727
    int nb_sectors, len;
728
    
729
    if (start_track > 1 && start_track != 0xaa)
730
        return -1;
731
    q = buf + 2;
732
    *q++ = 1;
733
    *q++ = 1;
734
    if (start_track <= 1) {
735
        *q++ = 0; /* reserved */
736
        *q++ = 0x14; /* ADR, control */
737
        *q++ = 1;    /* track number */
738
        *q++ = 0; /* reserved */
739
        if (msf) {
740
            *q++ = 0; /* reserved */
741
            *q++ = 0; /* minute */
742
            *q++ = 2; /* second */
743
            *q++ = 0; /* frame */
744
        } else {
745
            /* sector 0 */
746
            cpu_to_ube32(q, 0);
747
            q += 4;
748
        }
749
    }
750
    /* lead out track */
751
    *q++ = 0; /* reserved */
752
    *q++ = 0x16; /* ADR, control */
753
    *q++ = 0xaa; /* track number */
754
    *q++ = 0; /* reserved */
755
    nb_sectors = s->nb_sectors >> 2;
756
    if (msf) {
757
        *q++ = 0; /* reserved */
758
        *q++ = ((nb_sectors + 150) / 75) / 60;
759
        *q++ = ((nb_sectors + 150) / 75) % 60;
760
        *q++ = (nb_sectors + 150) % 75;
761
    } else {
762
        cpu_to_ube32(q, nb_sectors);
763
        q += 4;
764
    }
765
    len = q - buf;
766
    cpu_to_ube16(buf, len - 2);
767
    return len;
768
}
769

    
770
static void ide_atapi_cmd(IDEState *s)
771
{
772
    const uint8_t *packet;
773
    uint8_t *buf;
774
    int max_len;
775

    
776
    packet = s->io_buffer;
777
    buf = s->io_buffer;
778
#ifdef DEBUG_IDE_ATAPI
779
    {
780
        int i;
781
        printf("ATAPI limit=0x%x packet:", s->lcyl | (s->hcyl << 8));
782
        for(i = 0; i < ATAPI_PACKET_SIZE; i++) {
783
            printf(" %02x", packet[i]);
784
        }
785
        printf("\n");
786
    }
787
#endif
788
    switch(s->io_buffer[0]) {
789
    case GPCMD_TEST_UNIT_READY:
790
        if (bdrv_is_inserted(s->bs)) {
791
            ide_atapi_cmd_ok(s);
792
        } else {
793
            ide_atapi_cmd_error(s, SENSE_NOT_READY, 
794
                                ASC_MEDIUM_NOT_PRESENT);
795
        }
796
        break;
797
    case GPCMD_MODE_SENSE_10:
798
        {
799
            int action, code;
800
            max_len = ube16_to_cpu(packet + 7);
801
            action = packet[2] >> 6;
802
            code = packet[2] & 0x3f;
803
            switch(action) {
804
            case 0: /* current values */
805
                switch(code) {
806
                case 0x01: /* error recovery */
807
                    cpu_to_ube16(&buf[0], 16 + 6);
808
                    buf[2] = 0x70;
809
                    buf[3] = 0;
810
                    buf[4] = 0;
811
                    buf[5] = 0;
812
                    buf[6] = 0;
813
                    buf[7] = 0;
814

    
815
                    buf[8] = 0x01;
816
                    buf[9] = 0x06;
817
                    buf[10] = 0x00;
818
                    buf[11] = 0x05;
819
                    buf[12] = 0x00;
820
                    buf[13] = 0x00;
821
                    buf[14] = 0x00;
822
                    buf[15] = 0x00;
823
                    ide_atapi_cmd_reply(s, 16, max_len);
824
                    break;
825
                case 0x2a:
826
                    cpu_to_ube16(&buf[0], 28 + 6);
827
                    buf[2] = 0x70;
828
                    buf[3] = 0;
829
                    buf[4] = 0;
830
                    buf[5] = 0;
831
                    buf[6] = 0;
832
                    buf[7] = 0;
833

    
834
                    buf[8] = 0x2a;
835
                    buf[9] = 0x12;
836
                    buf[10] = 0x00;
837
                    buf[11] = 0x00;
838
                    
839
                    buf[12] = 0x70;
840
                    buf[13] = 3 << 5;
841
                    buf[14] = (1 << 0) | (1 << 3) | (1 << 5);
842
                    if (bdrv_is_locked(s->bs))
843
                        buf[6] |= 1 << 1;
844
                    buf[15] = 0x00;
845
                    cpu_to_ube16(&buf[16], 706);
846
                    buf[18] = 0;
847
                    buf[19] = 2;
848
                    cpu_to_ube16(&buf[20], 512);
849
                    cpu_to_ube16(&buf[22], 706);
850
                    buf[24] = 0;
851
                    buf[25] = 0;
852
                    buf[26] = 0;
853
                    buf[27] = 0;
854
                    ide_atapi_cmd_reply(s, 28, max_len);
855
                    break;
856
                default:
857
                    goto error_cmd;
858
                }
859
                break;
860
            case 1: /* changeable values */
861
                goto error_cmd;
862
            case 2: /* default values */
863
                goto error_cmd;
864
            default:
865
            case 3: /* saved values */
866
                ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, 
867
                                    ASC_SAVING_PARAMETERS_NOT_SUPPORTED);
868
                break;
869
            }
870
        }
871
        break;
872
    case GPCMD_REQUEST_SENSE:
873
        max_len = packet[4];
874
        memset(buf, 0, 18);
875
        buf[0] = 0x70 | (1 << 7);
876
        buf[2] = s->sense_key;
877
        buf[7] = 10;
878
        buf[12] = s->asc;
879
        ide_atapi_cmd_reply(s, 18, max_len);
880
        break;
881
    case GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL:
882
        if (bdrv_is_inserted(s->bs)) {
883
            bdrv_set_locked(s->bs, packet[4] & 1);
884
            ide_atapi_cmd_ok(s);
885
        } else {
886
            ide_atapi_cmd_error(s, SENSE_NOT_READY, 
887
                                ASC_MEDIUM_NOT_PRESENT);
888
        }
889
        break;
890
    case GPCMD_READ_10:
891
    case GPCMD_READ_12:
892
        {
893
            int nb_sectors, lba;
894

    
895
            if (!bdrv_is_inserted(s->bs)) {
896
                ide_atapi_cmd_error(s, SENSE_NOT_READY, 
897
                                    ASC_MEDIUM_NOT_PRESENT);
898
                break;
899
            }
900
            if (packet[0] == GPCMD_READ_10)
901
                nb_sectors = ube16_to_cpu(packet + 7);
902
            else
903
                nb_sectors = ube32_to_cpu(packet + 6);
904
            lba = ube32_to_cpu(packet + 2);
905
            if (nb_sectors == 0) {
906
                ide_atapi_cmd_ok(s);
907
                break;
908
            }
909
            if (((int64_t)(lba + nb_sectors) << 2) > s->nb_sectors) {
910
                ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, 
911
                                    ASC_LOGICAL_BLOCK_OOR);
912
                break;
913
            }
914
            ide_atapi_cmd_read(s, lba, nb_sectors);
915
        }
916
        break;
917
    case GPCMD_SEEK:
918
        {
919
            int lba;
920
            if (!bdrv_is_inserted(s->bs)) {
921
                ide_atapi_cmd_error(s, SENSE_NOT_READY, 
922
                                    ASC_MEDIUM_NOT_PRESENT);
923
                break;
924
            }
925
            lba = ube32_to_cpu(packet + 2);
926
            if (((int64_t)lba << 2) > s->nb_sectors) {
927
                ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, 
928
                                    ASC_LOGICAL_BLOCK_OOR);
929
                break;
930
            }
931
            ide_atapi_cmd_ok(s);
932
        }
933
        break;
934
    case GPCMD_START_STOP_UNIT:
935
        {
936
            int start, eject;
937
            start = packet[4] & 1;
938
            eject = (packet[4] >> 1) & 1;
939
            
940
            if (eject && !start) {
941
                /* eject the disk */
942
                bdrv_close(s->bs);
943
            }
944
            ide_atapi_cmd_ok(s);
945
        }
946
        break;
947
    case GPCMD_MECHANISM_STATUS:
948
        {
949
            max_len = ube16_to_cpu(packet + 8);
950
            cpu_to_ube16(buf, 0);
951
            /* no current LBA */
952
            buf[2] = 0;
953
            buf[3] = 0;
954
            buf[4] = 0;
955
            buf[5] = 1;
956
            cpu_to_ube16(buf + 6, 0);
957
            ide_atapi_cmd_reply(s, 8, max_len);
958
        }
959
        break;
960
    case GPCMD_READ_TOC_PMA_ATIP:
961
        {
962
            int format, msf, start_track, len;
963

    
964
            if (!bdrv_is_inserted(s->bs)) {
965
                ide_atapi_cmd_error(s, SENSE_NOT_READY, 
966
                                    ASC_MEDIUM_NOT_PRESENT);
967
                break;
968
            }
969
            max_len = ube16_to_cpu(packet + 7);
970
            format = packet[9] >> 6;
971
            msf = (packet[1] >> 1) & 1;
972
            start_track = packet[6];
973
            switch(format) {
974
            case 0:
975
                len = cdrom_read_toc(s, buf, msf, start_track);
976
                if (len < 0)
977
                    goto error_cmd;
978
                ide_atapi_cmd_reply(s, len, max_len);
979
                break;
980
            case 1:
981
                /* multi session : only a single session defined */
982
                memset(buf, 0, 12);
983
                buf[1] = 0x0a;
984
                buf[2] = 0x01;
985
                buf[3] = 0x01;
986
                ide_atapi_cmd_reply(s, 12, max_len);
987
                break;
988
            default:
989
            error_cmd:
990
                ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, 
991
                                    ASC_INV_FIELD_IN_CMD_PACKET);
992
                break;
993
            }
994
        }
995
        break;
996
    case GPCMD_READ_CDVD_CAPACITY:
997
        if (!bdrv_is_inserted(s->bs)) {
998
            ide_atapi_cmd_error(s, SENSE_NOT_READY, 
999
                                ASC_MEDIUM_NOT_PRESENT);
1000
            break;
1001
        }
1002
        /* NOTE: it is really the number of sectors minus 1 */
1003
        cpu_to_ube32(buf, (s->nb_sectors >> 2) - 1);
1004
        cpu_to_ube32(buf + 4, 2048);
1005
        ide_atapi_cmd_reply(s, 8, 8);
1006
        break;
1007
    case GPCMD_INQUIRY:
1008
        max_len = packet[4];
1009
        buf[0] = 0x05; /* CD-ROM */
1010
        buf[1] = 0x80; /* removable */
1011
        buf[2] = 0x00; /* ISO */
1012
        buf[3] = 0x21; /* ATAPI-2 (XXX: put ATAPI-4 ?) */
1013
        buf[4] = 31; /* additionnal length */
1014
        buf[5] = 0; /* reserved */
1015
        buf[6] = 0; /* reserved */
1016
        buf[7] = 0; /* reserved */
1017
        padstr8(buf + 8, 8, "QEMU");
1018
        padstr8(buf + 16, 16, "QEMU CD-ROM");
1019
        padstr8(buf + 32, 4, QEMU_VERSION);
1020
        ide_atapi_cmd_reply(s, 36, max_len);
1021
        break;
1022
    default:
1023
        ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, 
1024
                            ASC_ILLEGAL_OPCODE);
1025
        break;
1026
    }
1027
}
1028

    
1029
/* called when the inserted state of the media has changed */
1030
static void cdrom_change_cb(void *opaque)
1031
{
1032
    IDEState *s = opaque;
1033
    int64_t nb_sectors;
1034

    
1035
    /* XXX: send interrupt too */
1036
    bdrv_get_geometry(s->bs, &nb_sectors);
1037
    s->nb_sectors = nb_sectors;
1038
}
1039

    
1040
static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
1041
{
1042
    IDEState *ide_if = opaque;
1043
    IDEState *s;
1044
    int unit, n;
1045

    
1046
#ifdef DEBUG_IDE
1047
    printf("IDE: write addr=0x%x val=0x%02x\n", addr, val);
1048
#endif
1049
    addr &= 7;
1050
    switch(addr) {
1051
    case 0:
1052
        break;
1053
    case 1:
1054
        /* NOTE: data is written to the two drives */
1055
        ide_if[0].feature = val;
1056
        ide_if[1].feature = val;
1057
        break;
1058
    case 2:
1059
        if (val == 0)
1060
            val = 256;
1061
        ide_if[0].nsector = val;
1062
        ide_if[1].nsector = val;
1063
        break;
1064
    case 3:
1065
        ide_if[0].sector = val;
1066
        ide_if[1].sector = val;
1067
        break;
1068
    case 4:
1069
        ide_if[0].lcyl = val;
1070
        ide_if[1].lcyl = val;
1071
        break;
1072
    case 5:
1073
        ide_if[0].hcyl = val;
1074
        ide_if[1].hcyl = val;
1075
        break;
1076
    case 6:
1077
        ide_if[0].select = (val & ~0x10) | 0xa0;
1078
        ide_if[1].select = (val | 0x10) | 0xa0;
1079
        /* select drive */
1080
        unit = (val >> 4) & 1;
1081
        s = ide_if + unit;
1082
        ide_if->cur_drive = s;
1083
        break;
1084
    default:
1085
    case 7:
1086
        /* command */
1087
#if defined(DEBUG_IDE)
1088
        printf("ide: CMD=%02x\n", val);
1089
#endif
1090
        s = ide_if->cur_drive;
1091
        /* ignore commands to non existant slave */
1092
        if (s != ide_if && !s->bs) 
1093
            break;
1094
        switch(val) {
1095
        case WIN_IDENTIFY:
1096
            if (s->bs && !s->is_cdrom) {
1097
                ide_identify(s);
1098
                s->status = READY_STAT;
1099
                ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1100
            } else {
1101
                if (s->is_cdrom) {
1102
                    ide_set_signature(s);
1103
                }
1104
                ide_abort_command(s);
1105
            }
1106
            ide_set_irq(s);
1107
            break;
1108
        case WIN_SPECIFY:
1109
        case WIN_RECAL:
1110
            s->error = 0;
1111
            s->status = READY_STAT;
1112
            ide_set_irq(s);
1113
            break;
1114
        case WIN_SETMULT:
1115
            if (s->nsector > MAX_MULT_SECTORS || 
1116
                s->nsector == 0 ||
1117
                (s->nsector & (s->nsector - 1)) != 0) {
1118
                ide_abort_command(s);
1119
            } else {
1120
                s->mult_sectors = s->nsector;
1121
                s->status = READY_STAT;
1122
            }
1123
            ide_set_irq(s);
1124
            break;
1125
        case WIN_VERIFY:
1126
        case WIN_VERIFY_ONCE:
1127
            /* do sector number check ? */
1128
            s->status = READY_STAT;
1129
            ide_set_irq(s);
1130
            break;
1131
        case WIN_READ:
1132
        case WIN_READ_ONCE:
1133
            if (!s->bs) 
1134
                goto abort_cmd;
1135
            s->req_nb_sectors = 1;
1136
            ide_sector_read(s);
1137
            break;
1138
        case WIN_WRITE:
1139
        case WIN_WRITE_ONCE:
1140
            s->error = 0;
1141
            s->status = SEEK_STAT;
1142
            s->req_nb_sectors = 1;
1143
            ide_transfer_start(s, s->io_buffer, 512, ide_sector_write);
1144
            break;
1145
        case WIN_MULTREAD:
1146
            if (!s->mult_sectors)
1147
                goto abort_cmd;
1148
            s->req_nb_sectors = s->mult_sectors;
1149
            ide_sector_read(s);
1150
            break;
1151
        case WIN_MULTWRITE:
1152
            if (!s->mult_sectors)
1153
                goto abort_cmd;
1154
            s->error = 0;
1155
            s->status = SEEK_STAT;
1156
            s->req_nb_sectors = s->mult_sectors;
1157
            n = s->nsector;
1158
            if (n > s->req_nb_sectors)
1159
                n = s->req_nb_sectors;
1160
            ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_write);
1161
            break;
1162
        case WIN_READ_NATIVE_MAX:
1163
            ide_set_sector(s, s->nb_sectors - 1);
1164
            s->status = READY_STAT;
1165
            ide_set_irq(s);
1166
            break;
1167
        case WIN_CHECKPOWERMODE1:
1168
            s->nsector = 0xff; /* device active or idle */
1169
            s->status = READY_STAT;
1170
            ide_set_irq(s);
1171
            break;
1172

    
1173
            /* ATAPI commands */
1174
        case WIN_PIDENTIFY:
1175
            if (s->is_cdrom) {
1176
                ide_atapi_identify(s);
1177
                s->status = READY_STAT;
1178
                ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1179
            } else {
1180
                ide_abort_command(s);
1181
            }
1182
            ide_set_irq(s);
1183
            break;
1184
        case WIN_SRST:
1185
            if (!s->is_cdrom)
1186
                goto abort_cmd;
1187
            ide_set_signature(s);
1188
            s->status = 0x00; /* NOTE: READY is _not_ set */
1189
            s->error = 0x01;
1190
            break;
1191
        case WIN_PACKETCMD:
1192
            if (!s->is_cdrom)
1193
                goto abort_cmd;
1194
            /* DMA or overlapping commands not supported */
1195
            if ((s->feature & 0x03) != 0)
1196
                goto abort_cmd;
1197
            s->nsector = 1;
1198
            ide_transfer_start(s, s->io_buffer, ATAPI_PACKET_SIZE, 
1199
                               ide_atapi_cmd);
1200
            break;
1201
        default:
1202
        abort_cmd:
1203
            ide_abort_command(s);
1204
            ide_set_irq(s);
1205
            break;
1206
        }
1207
    }
1208
}
1209

    
1210
static uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
1211
{
1212
    IDEState *ide_if = opaque;
1213
    IDEState *s = ide_if->cur_drive;
1214
    uint32_t addr;
1215
    int ret;
1216

    
1217
    addr = addr1 & 7;
1218
    switch(addr) {
1219
    case 0:
1220
        ret = 0xff;
1221
        break;
1222
    case 1:
1223
        if (!ide_if[0].bs && !ide_if[1].bs)
1224
            ret = 0;
1225
        else
1226
            ret = s->error;
1227
        break;
1228
    case 2:
1229
        if (!ide_if[0].bs && !ide_if[1].bs)
1230
            ret = 0;
1231
        else
1232
            ret = s->nsector & 0xff;
1233
        break;
1234
    case 3:
1235
        if (!ide_if[0].bs && !ide_if[1].bs)
1236
            ret = 0;
1237
        else
1238
            ret = s->sector;
1239
        break;
1240
    case 4:
1241
        if (!ide_if[0].bs && !ide_if[1].bs)
1242
            ret = 0;
1243
        else
1244
            ret = s->lcyl;
1245
        break;
1246
    case 5:
1247
        if (!ide_if[0].bs && !ide_if[1].bs)
1248
            ret = 0;
1249
        else
1250
            ret = s->hcyl;
1251
        break;
1252
    case 6:
1253
        if (!ide_if[0].bs && !ide_if[1].bs)
1254
            ret = 0;
1255
        else
1256
            ret = s->select;
1257
        break;
1258
    default:
1259
    case 7:
1260
        if ((!ide_if[0].bs && !ide_if[1].bs) ||
1261
            (s != ide_if && !s->bs))
1262
            ret = 0;
1263
        else
1264
            ret = s->status;
1265
        pic_set_irq(s->irq, 0);
1266
        break;
1267
    }
1268
#ifdef DEBUG_IDE
1269
    printf("ide: read addr=0x%x val=%02x\n", addr1, ret);
1270
#endif
1271
    return ret;
1272
}
1273

    
1274
static uint32_t ide_status_read(void *opaque, uint32_t addr)
1275
{
1276
    IDEState *ide_if = opaque;
1277
    IDEState *s = ide_if->cur_drive;
1278
    int ret;
1279

    
1280
    if ((!ide_if[0].bs && !ide_if[1].bs) ||
1281
        (s != ide_if && !s->bs))
1282
        ret = 0;
1283
    else
1284
        ret = s->status;
1285
#ifdef DEBUG_IDE
1286
    printf("ide: read status addr=0x%x val=%02x\n", addr, ret);
1287
#endif
1288
    return ret;
1289
}
1290

    
1291
static void ide_cmd_write(void *opaque, uint32_t addr, uint32_t val)
1292
{
1293
    IDEState *ide_if = opaque;
1294
    IDEState *s;
1295
    int i;
1296

    
1297
#ifdef DEBUG_IDE
1298
    printf("ide: write control addr=0x%x val=%02x\n", addr, val);
1299
#endif
1300
    /* common for both drives */
1301
    if (!(ide_if[0].cmd & IDE_CMD_RESET) &&
1302
        (val & IDE_CMD_RESET)) {
1303
        /* reset low to high */
1304
        for(i = 0;i < 2; i++) {
1305
            s = &ide_if[i];
1306
            s->status = BUSY_STAT | SEEK_STAT;
1307
            s->error = 0x01;
1308
        }
1309
    } else if ((ide_if[0].cmd & IDE_CMD_RESET) &&
1310
               !(val & IDE_CMD_RESET)) {
1311
        /* high to low */
1312
        for(i = 0;i < 2; i++) {
1313
            s = &ide_if[i];
1314
            if (s->is_cdrom)
1315
                s->status = 0x00; /* NOTE: READY is _not_ set */
1316
            else
1317
                s->status = READY_STAT | SEEK_STAT;
1318
            ide_set_signature(s);
1319
        }
1320
    }
1321

    
1322
    ide_if[0].cmd = val;
1323
    ide_if[1].cmd = val;
1324
}
1325

    
1326
static void ide_data_writew(void *opaque, uint32_t addr, uint32_t val)
1327
{
1328
    IDEState *s = ((IDEState *)opaque)->cur_drive;
1329
    uint8_t *p;
1330

    
1331
    p = s->data_ptr;
1332
    *(uint16_t *)p = le16_to_cpu(val);
1333
    p += 2;
1334
    s->data_ptr = p;
1335
    if (p >= s->data_end)
1336
        s->end_transfer_func(s);
1337
}
1338

    
1339
static uint32_t ide_data_readw(void *opaque, uint32_t addr)
1340
{
1341
    IDEState *s = ((IDEState *)opaque)->cur_drive;
1342
    uint8_t *p;
1343
    int ret;
1344
    p = s->data_ptr;
1345
    ret = cpu_to_le16(*(uint16_t *)p);
1346
    p += 2;
1347
    s->data_ptr = p;
1348
    if (p >= s->data_end)
1349
        s->end_transfer_func(s);
1350
    return ret;
1351
}
1352

    
1353
static void ide_data_writel(void *opaque, uint32_t addr, uint32_t val)
1354
{
1355
    IDEState *s = ((IDEState *)opaque)->cur_drive;
1356
    uint8_t *p;
1357

    
1358
    p = s->data_ptr;
1359
    *(uint32_t *)p = le32_to_cpu(val);
1360
    p += 4;
1361
    s->data_ptr = p;
1362
    if (p >= s->data_end)
1363
        s->end_transfer_func(s);
1364
}
1365

    
1366
static uint32_t ide_data_readl(void *opaque, uint32_t addr)
1367
{
1368
    IDEState *s = ((IDEState *)opaque)->cur_drive;
1369
    uint8_t *p;
1370
    int ret;
1371
    
1372
    p = s->data_ptr;
1373
    ret = cpu_to_le32(*(uint32_t *)p);
1374
    p += 4;
1375
    s->data_ptr = p;
1376
    if (p >= s->data_end)
1377
        s->end_transfer_func(s);
1378
    return ret;
1379
}
1380

    
1381
static void ide_reset(IDEState *s)
1382
{
1383
    s->mult_sectors = MAX_MULT_SECTORS;
1384
    s->cur_drive = s;
1385
    s->select = 0xa0;
1386
    s->status = READY_STAT;
1387
    ide_set_signature(s);
1388
}
1389

    
1390
struct partition {
1391
        uint8_t boot_ind;                /* 0x80 - active */
1392
        uint8_t head;                /* starting head */
1393
        uint8_t sector;                /* starting sector */
1394
        uint8_t cyl;                /* starting cylinder */
1395
        uint8_t sys_ind;                /* What partition type */
1396
        uint8_t end_head;                /* end head */
1397
        uint8_t end_sector;        /* end sector */
1398
        uint8_t end_cyl;                /* end cylinder */
1399
        uint32_t start_sect;        /* starting sector counting from 0 */
1400
        uint32_t nr_sects;                /* nr of sectors in partition */
1401
} __attribute__((packed));
1402

    
1403
/* try to guess the IDE geometry from the MSDOS partition table */
1404
static void ide_guess_geometry(IDEState *s)
1405
{
1406
    uint8_t buf[512];
1407
    int ret, i;
1408
    struct partition *p;
1409
    uint32_t nr_sects;
1410

    
1411
    if (s->cylinders != 0)
1412
        return;
1413
    ret = bdrv_read(s->bs, 0, buf, 1);
1414
    if (ret < 0)
1415
        return;
1416
    /* test msdos magic */
1417
    if (buf[510] != 0x55 || buf[511] != 0xaa)
1418
        return;
1419
    for(i = 0; i < 4; i++) {
1420
        p = ((struct partition *)(buf + 0x1be)) + i;
1421
        nr_sects = le32_to_cpu(p->nr_sects);
1422
        if (nr_sects && p->end_head) {
1423
            /* We make the assumption that the partition terminates on
1424
               a cylinder boundary */
1425
            s->heads = p->end_head + 1;
1426
            s->sectors = p->end_sector & 63;
1427
            s->cylinders = s->nb_sectors / (s->heads * s->sectors);
1428
#if 0
1429
            printf("guessed partition: CHS=%d %d %d\n", 
1430
                   s->cylinders, s->heads, s->sectors);
1431
#endif
1432
        }
1433
    }
1434
}
1435

    
1436
static void ide_init2(IDEState *ide_state, int irq,
1437
                      BlockDriverState *hd0, BlockDriverState *hd1)
1438
{
1439
    IDEState *s;
1440
    static int drive_serial = 1;
1441
    int i, cylinders, heads, secs;
1442
    int64_t nb_sectors;
1443

    
1444
    for(i = 0; i < 2; i++) {
1445
        s = ide_state + i;
1446
        if (i == 0)
1447
            s->bs = hd0;
1448
        else
1449
            s->bs = hd1;
1450
        if (s->bs) {
1451
            bdrv_get_geometry(s->bs, &nb_sectors);
1452
            s->nb_sectors = nb_sectors;
1453
            /* if a geometry hint is available, use it */
1454
            bdrv_get_geometry_hint(s->bs, &cylinders, &heads, &secs);
1455
            if (cylinders != 0) {
1456
                s->cylinders = cylinders;
1457
                s->heads = heads;
1458
                s->sectors = secs;
1459
            } else {
1460
                ide_guess_geometry(s);
1461
                if (s->cylinders == 0) {
1462
                    /* if no geometry, use a LBA compatible one */
1463
                    cylinders = nb_sectors / (16 * 63);
1464
                    if (cylinders > 16383)
1465
                        cylinders = 16383;
1466
                    else if (cylinders < 2)
1467
                        cylinders = 2;
1468
                    s->cylinders = cylinders;
1469
                    s->heads = 16;
1470
                    s->sectors = 63;
1471
                }
1472
            }
1473
            if (bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM) {
1474
                s->is_cdrom = 1;
1475
                bdrv_set_change_cb(s->bs, cdrom_change_cb, s);
1476
            }
1477
        }
1478
        s->drive_serial = drive_serial++;
1479
        s->irq = irq;
1480
        ide_reset(s);
1481
    }
1482
}
1483

    
1484
/***********************************************************/
1485
/* ISA IDE definitions */
1486

    
1487
void isa_ide_init(int iobase, int iobase2, int irq,
1488
                  BlockDriverState *hd0, BlockDriverState *hd1)
1489
{
1490
    IDEState *ide_state;
1491

    
1492
    ide_state = qemu_mallocz(sizeof(IDEState) * 2);
1493
    if (!ide_state)
1494
        return;
1495
    
1496
    ide_init2(ide_state, irq, hd0, hd1);
1497

    
1498
    register_ioport_write(iobase, 8, 1, ide_ioport_write, ide_state);
1499
    register_ioport_read(iobase, 8, 1, ide_ioport_read, ide_state);
1500
    if (iobase2) {
1501
        register_ioport_read(iobase2, 1, 1, ide_status_read, ide_state);
1502
        register_ioport_write(iobase2, 1, 1, ide_cmd_write, ide_state);
1503
    }
1504
    
1505
    /* data ports */
1506
    register_ioport_write(iobase, 2, 2, ide_data_writew, ide_state);
1507
    register_ioport_read(iobase, 2, 2, ide_data_readw, ide_state);
1508
    register_ioport_write(iobase, 4, 4, ide_data_writel, ide_state);
1509
    register_ioport_read(iobase, 4, 4, ide_data_readl, ide_state);
1510
}
1511

    
1512
/***********************************************************/
1513
/* PCI IDE definitions */
1514

    
1515
typedef struct PCIIDEState {
1516
    PCIDevice dev;
1517
    IDEState ide_if[4];
1518
} PCIIDEState;
1519

    
1520
static uint32_t ide_read_config(PCIDevice *d, 
1521
                                 uint32_t address, int len)
1522
{
1523
    uint32_t val;
1524
    val = 0;
1525
    memcpy(&val, d->config + address, len);
1526
    return val;
1527
}
1528

    
1529
static void ide_write_config(PCIDevice *d, 
1530
                              uint32_t address, uint32_t val, int len)
1531
{
1532
    memcpy(d->config + address, &val, len);
1533
}
1534

    
1535
static void ide_map(PCIDevice *pci_dev, int region_num, 
1536
                    uint32_t addr, uint32_t size, int type)
1537
{
1538
    PCIIDEState *d = (PCIIDEState *)pci_dev;
1539
    IDEState *ide_state;
1540

    
1541
    if (region_num <= 3) {
1542
        ide_state = &d->ide_if[(region_num >> 1) * 2];
1543
        if (region_num & 1) {
1544
            register_ioport_read(addr + 2, 1, 1, ide_status_read, ide_state);
1545
            register_ioport_write(addr + 2, 1, 1, ide_cmd_write, ide_state);
1546
        } else {
1547
            register_ioport_write(addr, 8, 1, ide_ioport_write, ide_state);
1548
            register_ioport_read(addr, 8, 1, ide_ioport_read, ide_state);
1549

    
1550
            /* data ports */
1551
            register_ioport_write(addr, 2, 2, ide_data_writew, ide_state);
1552
            register_ioport_read(addr, 2, 2, ide_data_readw, ide_state);
1553
            register_ioport_write(addr, 4, 4, ide_data_writel, ide_state);
1554
            register_ioport_read(addr, 4, 4, ide_data_readl, ide_state);
1555
        }
1556
    }
1557
}
1558

    
1559
/* hd_table must contain 4 block drivers */
1560
void pci_ide_init(BlockDriverState **hd_table)
1561
{
1562
    PCIIDEState *d;
1563
    uint8_t *pci_conf;
1564
    
1565
    d = (PCIIDEState *)pci_register_device("IDE", sizeof(PCIIDEState),
1566
                                           0, -1, 
1567
                                           ide_read_config, 
1568
                                           ide_write_config);
1569
    pci_conf = d->dev.config;
1570
    pci_conf[0x00] = 0x86; // Intel
1571
    pci_conf[0x01] = 0x80;
1572
    pci_conf[0x02] = 0x00; // fake
1573
    pci_conf[0x03] = 0x01; // fake
1574
    pci_conf[0x0a] = 0x01; // class_sub = PCI_IDE
1575
    pci_conf[0x0b] = 0x01; // class_base = PCI_mass_storage
1576
    pci_conf[0x0e] = 0x80; // header_type = PCI_multifunction, generic
1577

    
1578
    pci_conf[0x2c] = 0x86; // subsys vendor
1579
    pci_conf[0x2d] = 0x80; // subsys vendor
1580
    pci_conf[0x2e] = 0x00; // fake
1581
    pci_conf[0x2f] = 0x01; // fake
1582

    
1583
    pci_register_io_region((PCIDevice *)d, 0, 0x8, 
1584
                           PCI_ADDRESS_SPACE_IO, ide_map);
1585
    pci_register_io_region((PCIDevice *)d, 1, 0x4, 
1586
                           PCI_ADDRESS_SPACE_IO, ide_map);
1587
    pci_register_io_region((PCIDevice *)d, 2, 0x8, 
1588
                           PCI_ADDRESS_SPACE_IO, ide_map);
1589
    pci_register_io_region((PCIDevice *)d, 3, 0x4, 
1590
                           PCI_ADDRESS_SPACE_IO, ide_map);
1591

    
1592
    ide_init2(&d->ide_if[0], 14, hd_table[0], hd_table[1]);
1593
    ide_init2(&d->ide_if[2], 15, hd_table[2], hd_table[3]);
1594
}