3414 |
3414 |
}
|
3415 |
3415 |
|
3416 |
3416 |
/***********************************************************/
|
|
3417 |
/* MMIO based ide port
|
|
3418 |
* This emulates IDE device connected directly to the CPU bus without
|
|
3419 |
* dedicated ide controller, which is often seen on embedded boards.
|
|
3420 |
*/
|
|
3421 |
|
|
3422 |
typedef struct {
|
|
3423 |
void *dev;
|
|
3424 |
int shift;
|
|
3425 |
} MMIOState;
|
|
3426 |
|
|
3427 |
static uint32_t mmio_ide_read (void *opaque, target_phys_addr_t addr)
|
|
3428 |
{
|
|
3429 |
MMIOState *s = (MMIOState*)opaque;
|
|
3430 |
IDEState *ide = (IDEState*)s->dev;
|
|
3431 |
addr >>= s->shift;
|
|
3432 |
if (addr & 7)
|
|
3433 |
return ide_ioport_read(ide, addr);
|
|
3434 |
else
|
|
3435 |
return ide_data_readw(ide, 0);
|
|
3436 |
}
|
|
3437 |
|
|
3438 |
static void mmio_ide_write (void *opaque, target_phys_addr_t addr,
|
|
3439 |
uint32_t val)
|
|
3440 |
{
|
|
3441 |
MMIOState *s = (MMIOState*)opaque;
|
|
3442 |
IDEState *ide = (IDEState*)s->dev;
|
|
3443 |
addr >>= s->shift;
|
|
3444 |
if (addr & 7)
|
|
3445 |
ide_ioport_write(ide, addr, val);
|
|
3446 |
else
|
|
3447 |
ide_data_writew(ide, 0, val);
|
|
3448 |
}
|
|
3449 |
|
|
3450 |
static CPUReadMemoryFunc *mmio_ide_reads[] = {
|
|
3451 |
mmio_ide_read,
|
|
3452 |
mmio_ide_read,
|
|
3453 |
mmio_ide_read,
|
|
3454 |
};
|
|
3455 |
|
|
3456 |
static CPUWriteMemoryFunc *mmio_ide_writes[] = {
|
|
3457 |
mmio_ide_write,
|
|
3458 |
mmio_ide_write,
|
|
3459 |
mmio_ide_write,
|
|
3460 |
};
|
|
3461 |
|
|
3462 |
static uint32_t mmio_ide_status_read (void *opaque, target_phys_addr_t addr)
|
|
3463 |
{
|
|
3464 |
MMIOState *s= (MMIOState*)opaque;
|
|
3465 |
IDEState *ide = (IDEState*)s->dev;
|
|
3466 |
return ide_status_read(ide, 0);
|
|
3467 |
}
|
|
3468 |
|
|
3469 |
static void mmio_ide_cmd_write (void *opaque, target_phys_addr_t addr,
|
|
3470 |
uint32_t val)
|
|
3471 |
{
|
|
3472 |
MMIOState *s = (MMIOState*)opaque;
|
|
3473 |
IDEState *ide = (IDEState*)s->dev;
|
|
3474 |
ide_cmd_write(ide, 0, val);
|
|
3475 |
}
|
|
3476 |
|
|
3477 |
static CPUReadMemoryFunc *mmio_ide_status[] = {
|
|
3478 |
mmio_ide_status_read,
|
|
3479 |
mmio_ide_status_read,
|
|
3480 |
mmio_ide_status_read,
|
|
3481 |
};
|
|
3482 |
|
|
3483 |
static CPUWriteMemoryFunc *mmio_ide_cmd[] = {
|
|
3484 |
mmio_ide_cmd_write,
|
|
3485 |
mmio_ide_cmd_write,
|
|
3486 |
mmio_ide_cmd_write,
|
|
3487 |
};
|
|
3488 |
|
|
3489 |
void mmio_ide_init (target_phys_addr_t membase, target_phys_addr_t membase2,
|
|
3490 |
qemu_irq irq, int shift,
|
|
3491 |
BlockDriverState *hd0, BlockDriverState *hd1)
|
|
3492 |
{
|
|
3493 |
MMIOState *s = qemu_mallocz(sizeof(MMIOState));
|
|
3494 |
IDEState *ide = qemu_mallocz(sizeof(IDEState) * 2);
|
|
3495 |
int mem1, mem2;
|
|
3496 |
|
|
3497 |
ide_init2(ide, hd0, hd1, irq);
|
|
3498 |
|
|
3499 |
s->dev = ide;
|
|
3500 |
s->shift = shift;
|
|
3501 |
|
|
3502 |
mem1 = cpu_register_io_memory(0, mmio_ide_reads, mmio_ide_writes, s);
|
|
3503 |
mem2 = cpu_register_io_memory(0, mmio_ide_status, mmio_ide_cmd, s);
|
|
3504 |
cpu_register_physical_memory(membase, 16 << shift, mem1);
|
|
3505 |
cpu_register_physical_memory(membase2, 2 << shift, mem2);
|
|
3506 |
}
|
|
3507 |
|
|
3508 |
/***********************************************************/
|
3417 |
3509 |
/* CF-ATA Microdrive */
|
3418 |
3510 |
|
3419 |
3511 |
#define METADATA_SIZE 0x20
|