Annotation of qemu/roms/openbios/drivers/ide.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *   OpenBIOS polled ide driver
                      3:  *
                      4:  *   Copyright (C) 2004 Jens Axboe <[email protected]>
                      5:  *   Copyright (C) 2005 Stefan Reinauer <[email protected]>
                      6:  *
                      7:  *   Credit goes to Hale Landis for his excellent ata demo software
                      8:  *   OF node handling and some fixes by Stefan Reinauer
                      9:  *
                     10:  *   This program is free software; you can redistribute it and/or
                     11:  *   modify it under the terms of the GNU General Public License
                     12:  *   version 2
                     13:  *
                     14:  */
                     15: 
                     16: #include "config.h"
                     17: #include "libopenbios/bindings.h"
                     18: #include "kernel/kernel.h"
                     19: #include "libc/byteorder.h"
                     20: #include "libc/vsprintf.h"
                     21: 
                     22: #include "drivers/drivers.h"
                     23: #include "ide.h"
                     24: #include "hdreg.h"
                     25: #include "timer.h"
                     26: 
                     27: #ifdef CONFIG_DEBUG_IDE
                     28: #define IDE_DPRINTF(fmt, args...) \
                     29: do { printk("IDE - %s: " fmt, __func__ , ##args); } while (0)
                     30: #else
                     31: #define IDE_DPRINTF(fmt, args...) do { } while (0)
                     32: #endif
                     33: 
                     34: /* DECLARE data structures for the nodes.  */
                     35: DECLARE_UNNAMED_NODE( ob_ide, INSTALL_OPEN, sizeof(struct ide_drive*) );
                     36: DECLARE_UNNAMED_NODE( ob_ide_ctrl, INSTALL_OPEN, sizeof(int));
                     37: 
                     38: /*
                     39:  * define to 2 for the standard 2 channels only
                     40:  */
                     41: #ifndef CONFIG_IDE_NUM_CHANNELS
                     42: #define IDE_NUM_CHANNELS 4
                     43: #else
                     44: #define IDE_NUM_CHANNELS CONFIG_IDE_NUM_CHANNELS
                     45: #endif
                     46: #define IDE_MAX_CHANNELS 4
                     47: 
                     48: #ifndef CONFIG_IDE_FIRST_UNIT
                     49: #define FIRST_UNIT 0
                     50: #else
                     51: #define FIRST_UNIT CONFIG_IDE_FIRST_UNIT
                     52: #endif
                     53: 
                     54: #ifndef CONFIG_IDE_DEV_TYPE
                     55: #define DEV_TYPE "ide"
                     56: #else
                     57: #define DEV_TYPE CONFIG_IDE_DEV_TYPE
                     58: #endif
                     59: 
                     60: #ifndef CONFIG_IDE_DEV_NAME
                     61: #define DEV_NAME "ide%d"
                     62: #else
                     63: #define DEV_NAME CONFIG_IDE_DEV_NAME
                     64: #endif
                     65: 
                     66: static int current_channel = FIRST_UNIT;
                     67: 
                     68: static struct ide_channel *channels = NULL;
                     69: 
                     70: static inline void ide_add_channel(struct ide_channel *chan)
                     71: {
                     72:        chan->next = channels;
                     73:        channels = chan;
                     74: }
                     75: 
                     76: static struct ide_channel *ide_seek_channel(const char *name)
                     77: {
                     78:        struct ide_channel *current;
                     79: 
                     80:        current = channels;
                     81:        while (current) {
                     82:                if (!strcmp(current->name, name))
                     83:                        return current;
                     84:                current = current->next;
                     85:        }
                     86:        return NULL;
                     87: }
                     88: 
                     89: /*
                     90:  * don't be pedantic
                     91:  */
                     92: #undef ATA_PEDANTIC
                     93: 
                     94: static void dump_drive(struct ide_drive *drive)
                     95: {
                     96: #ifdef CONFIG_DEBUG_IDE
                     97:        printk("IDE DRIVE @%lx:\n", (unsigned long)drive);
                     98:        printk("unit: %d\n",drive->unit);
                     99:        printk("present: %d\n",drive->present);
                    100:        printk("type: %d\n",drive->type);
                    101:        printk("media: %d\n",drive->media);
                    102:        printk("model: %s\n",drive->model);
                    103:        printk("nr: %d\n",drive->nr);
                    104:        printk("cyl: %d\n",drive->cyl);
                    105:        printk("head: %d\n",drive->head);
                    106:        printk("sect: %d\n",drive->sect);
                    107:        printk("bs: %d\n",drive->bs);
                    108: #endif
                    109: }
                    110: 
                    111: /*
                    112:  * old style io port operations
                    113:  */
                    114: static unsigned char
                    115: ob_ide_inb(struct ide_channel *chan, unsigned int port)
                    116: {
                    117:        return inb(chan->io_regs[port]);
                    118: }
                    119: 
                    120: static void
                    121: ob_ide_outb(struct ide_channel *chan, unsigned char data, unsigned int port)
                    122: {
                    123:        outb(data, chan->io_regs[port]);
                    124: }
                    125: 
                    126: static void
                    127: ob_ide_insw(struct ide_channel *chan,
                    128:            unsigned int port, unsigned char *addr, unsigned int count)
                    129: {
                    130:        insw(chan->io_regs[port], addr, count);
                    131: }
                    132: 
                    133: static void
                    134: ob_ide_outsw(struct ide_channel *chan,
                    135:             unsigned int port, unsigned char *addr, unsigned int count)
                    136: {
                    137:        outsw(chan->io_regs[port], addr, count);
                    138: }
                    139: 
                    140: static inline unsigned char
                    141: ob_ide_pio_readb(struct ide_drive *drive, unsigned int offset)
                    142: {
                    143:        struct ide_channel *chan = drive->channel;
                    144: 
                    145:        return chan->obide_inb(chan, offset);
                    146: }
                    147: 
                    148: static inline void
                    149: ob_ide_pio_writeb(struct ide_drive *drive, unsigned int offset,
                    150:                  unsigned char data)
                    151: {
                    152:        struct ide_channel *chan = drive->channel;
                    153: 
                    154:        chan->obide_outb(chan, data, offset);
                    155: }
                    156: 
                    157: static inline void
                    158: ob_ide_pio_insw(struct ide_drive *drive, unsigned int offset,
                    159:                unsigned char *addr, unsigned int len)
                    160: {
                    161:        struct ide_channel *chan = drive->channel;
                    162: 
                    163:        if (len & 1) {
                    164:                IDE_DPRINTF("%d: command not word aligned\n", drive->nr);
                    165:                return;
                    166:        }
                    167: 
                    168:        chan->obide_insw(chan, offset, addr, len / 2);
                    169: }
                    170: 
                    171: static inline void
                    172: ob_ide_pio_outsw(struct ide_drive *drive, unsigned int offset,
                    173:                unsigned char *addr, unsigned int len)
                    174: {
                    175:        struct ide_channel *chan = drive->channel;
                    176: 
                    177:        if (len & 1) {
                    178:                IDE_DPRINTF("%d: command not word aligned\n", drive->nr);
                    179:                return;
                    180:        }
                    181: 
                    182:        chan->obide_outsw(chan, offset, addr, len / 2);
                    183: }
                    184: 
                    185: static void
                    186: ob_ide_400ns_delay(struct ide_drive *drive)
                    187: {
                    188:        (void) ob_ide_pio_readb(drive, IDEREG_ASTATUS);
                    189:        (void) ob_ide_pio_readb(drive, IDEREG_ASTATUS);
                    190:        (void) ob_ide_pio_readb(drive, IDEREG_ASTATUS);
                    191:        (void) ob_ide_pio_readb(drive, IDEREG_ASTATUS);
                    192: 
                    193:        udelay(1);
                    194: }
                    195: 
                    196: static void
                    197: ob_ide_error(struct ide_drive *drive, unsigned char stat, const char *msg)
                    198: {
                    199: #ifdef CONFIG_DEBUG_IDE
                    200:        struct ide_channel *chan = drive->channel;
                    201:        unsigned char err;
                    202: #endif
                    203: 
                    204:        if (!stat)
                    205:                stat = ob_ide_pio_readb(drive, IDEREG_STATUS);
                    206: 
                    207:        IDE_DPRINTF("ob_ide_error drive<%d>: %s:\n", drive->nr, msg);
                    208:        IDE_DPRINTF("    cmd=%x, stat=%x", chan->ata_cmd.command, stat);
                    209: 
                    210:        if ((stat & (BUSY_STAT | ERR_STAT)) == ERR_STAT) {
                    211: #ifdef CONFIG_DEBUG_IDE
                    212:                 err =
                    213: #endif
                    214:                     ob_ide_pio_readb(drive, IDEREG_ERROR);
                    215:                IDE_DPRINTF(", err=%x", err);
                    216:        }
                    217:        IDE_DPRINTF("\n");
                    218: 
                    219: #ifdef CONFIG_DEBUG_IDE
                    220:        /*
                    221:         * see if sense is valid and dump that
                    222:         */
                    223:        if (chan->ata_cmd.command == WIN_PACKET) {
                    224:                struct atapi_command *cmd = &chan->atapi_cmd;
                    225:                unsigned char old_cdb = cmd->cdb[0];
                    226: 
                    227:                if (cmd->cdb[0] == ATAPI_REQ_SENSE) {
                    228:                        old_cdb = cmd->old_cdb;
                    229: 
                    230:                        IDE_DPRINTF("    atapi opcode=%02x", old_cdb);
                    231:                } else {
                    232:                        int i;
                    233: 
                    234:                        IDE_DPRINTF("    cdb: ");
                    235:                        for (i = 0; i < sizeof(cmd->cdb); i++)
                    236:                                IDE_DPRINTF("%02x ", cmd->cdb[i]);
                    237:                }
                    238:                if (cmd->sense_valid)
                    239:                        IDE_DPRINTF(", sense: %02x/%02x/%02x",
                    240:                                     cmd->sense.sense_key, cmd->sense.asc,
                    241:                                     cmd->sense.ascq);
                    242:                else
                    243:                        IDE_DPRINTF(", no sense");
                    244:                IDE_DPRINTF("\n");
                    245:        }
                    246: #endif
                    247: }
                    248: 
                    249: /*
                    250:  * wait for 'stat' to be set. returns 1 if failed, 0 if succesful
                    251:  */
                    252: static int
                    253: ob_ide_wait_stat(struct ide_drive *drive, unsigned char ok_stat,
                    254:                  unsigned char bad_stat, unsigned char *ret_stat)
                    255: {
                    256:        unsigned char stat;
                    257:        int i;
                    258: 
                    259:        ob_ide_400ns_delay(drive);
                    260: 
                    261:        for (i = 0; i < 5000; i++) {
                    262:                stat = ob_ide_pio_readb(drive, IDEREG_STATUS);
                    263:                if (!(stat & BUSY_STAT))
                    264:                        break;
                    265: 
                    266:                udelay(1000);
                    267:        }
                    268: 
                    269:        if (ret_stat)
                    270:                *ret_stat = stat;
                    271: 
                    272:        if (stat & bad_stat)
                    273:                return 1;
                    274: 
                    275:        if ((stat & ok_stat) || !ok_stat)
                    276:                return 0;
                    277: 
                    278:        return 1;
                    279: }
                    280: 
                    281: static int
                    282: ob_ide_select_drive(struct ide_drive *drive)
                    283: {
                    284:        struct ide_channel *chan = drive->channel;
                    285:        unsigned char control = IDEHEAD_DEV0;
                    286: 
                    287:        if (ob_ide_wait_stat(drive, 0, BUSY_STAT, NULL)) {
                    288:                IDE_DPRINTF("select_drive: timed out\n");
                    289:                return 1;
                    290:        }
                    291: 
                    292:        /*
                    293:         * don't select drive if already active. Note: we always
                    294:         * wait for BUSY clear
                    295:         */
                    296:        if (drive->unit == chan->selected)
                    297:                return 0;
                    298: 
                    299:        if (drive->unit)
                    300:                control = IDEHEAD_DEV1;
                    301: 
                    302:        ob_ide_pio_writeb(drive, IDEREG_CURRENT, control);
                    303:        ob_ide_400ns_delay(drive);
                    304: 
                    305:        if (ob_ide_wait_stat(drive, 0, BUSY_STAT, NULL)) {
                    306:                IDE_DPRINTF("select_drive: timed out\n");
                    307:                return 1;
                    308:        }
                    309: 
                    310:        chan->selected = drive->unit;
                    311:        return 0;
                    312: }
                    313: 
                    314: static void
                    315: ob_ide_write_tasklet(struct ide_drive *drive, struct ata_command *cmd)
                    316: {
                    317:        ob_ide_pio_writeb(drive, IDEREG_FEATURE, cmd->task[1]);
                    318:        ob_ide_pio_writeb(drive, IDEREG_NSECTOR, cmd->task[3]);
                    319:        ob_ide_pio_writeb(drive, IDEREG_SECTOR, cmd->task[7]);
                    320:        ob_ide_pio_writeb(drive, IDEREG_LCYL, cmd->task[8]);
                    321:        ob_ide_pio_writeb(drive, IDEREG_HCYL, cmd->task[9]);
                    322: 
                    323:        ob_ide_pio_writeb(drive, IDEREG_FEATURE, cmd->task[0]);
                    324:        ob_ide_pio_writeb(drive, IDEREG_NSECTOR, cmd->task[2]);
                    325:        ob_ide_pio_writeb(drive, IDEREG_SECTOR, cmd->task[4]);
                    326:        ob_ide_pio_writeb(drive, IDEREG_LCYL, cmd->task[5]);
                    327:        ob_ide_pio_writeb(drive, IDEREG_HCYL, cmd->task[6]);
                    328: 
                    329:        if (drive->unit)
                    330:                cmd->device_head |= IDEHEAD_DEV1;
                    331: 
                    332:        ob_ide_pio_writeb(drive, IDEREG_CURRENT, cmd->device_head);
                    333: 
                    334:        ob_ide_pio_writeb(drive, IDEREG_COMMAND, cmd->command);
                    335:        ob_ide_400ns_delay(drive);
                    336: }
                    337: 
                    338: static void
                    339: ob_ide_write_registers(struct ide_drive *drive, struct ata_command *cmd)
                    340: {
                    341:        /*
                    342:         * we are _always_ polled
                    343:         */
                    344:        ob_ide_pio_writeb(drive, IDEREG_CONTROL, cmd->control | IDECON_NIEN);
                    345: 
                    346:        ob_ide_pio_writeb(drive, IDEREG_FEATURE, cmd->feature);
                    347:        ob_ide_pio_writeb(drive, IDEREG_NSECTOR, cmd->nsector);
                    348:        ob_ide_pio_writeb(drive, IDEREG_SECTOR, cmd->sector);
                    349:        ob_ide_pio_writeb(drive, IDEREG_LCYL, cmd->lcyl);
                    350:        ob_ide_pio_writeb(drive, IDEREG_HCYL, cmd->hcyl);
                    351: 
                    352:        if (drive->unit)
                    353:                cmd->device_head |= IDEHEAD_DEV1;
                    354: 
                    355:        ob_ide_pio_writeb(drive, IDEREG_CURRENT, cmd->device_head);
                    356: 
                    357:        ob_ide_pio_writeb(drive, IDEREG_COMMAND, cmd->command);
                    358:        ob_ide_400ns_delay(drive);
                    359: }
                    360: 
                    361: /*
                    362:  * execute command with "pio non data" protocol
                    363:  */
                    364: #if 0
                    365: static int
                    366: ob_ide_pio_non_data(struct ide_drive *drive, struct ata_command *cmd)
                    367: {
                    368:        if (ob_ide_select_drive(drive))
                    369:                return 1;
                    370: 
                    371:        ob_ide_write_registers(drive, cmd);
                    372: 
                    373:        if (ob_ide_wait_stat(drive, 0, BUSY_STAT, NULL))
                    374:                return 1;
                    375: 
                    376:        return 0;
                    377: }
                    378: #endif
                    379: 
                    380: /*
                    381:  * execute given command with a pio data-in phase.
                    382:  */
                    383: static int
                    384: ob_ide_pio_data_in(struct ide_drive *drive, struct ata_command *cmd)
                    385: {
                    386:        unsigned char stat;
                    387:        unsigned int bytes, timeout;
                    388: 
                    389:        if (ob_ide_select_drive(drive))
                    390:                return 1;
                    391: 
                    392:        /*
                    393:         * ATA must set ready and seek stat, ATAPI need only clear busy
                    394:         */
                    395:        timeout = 0;
                    396:        do {
                    397:                stat = ob_ide_pio_readb(drive, IDEREG_STATUS);
                    398: 
                    399:                if (drive->type == ide_type_ata) {
                    400:                        /*
                    401:                         * this is BIOS code, don't be too pedantic
                    402:                         */
                    403: #ifdef ATA_PEDANTIC
                    404:                        if ((stat & (BUSY_STAT | READY_STAT | SEEK_STAT)) ==
                    405:                            (READY_STAT | SEEK_STAT))
                    406:                                break;
                    407: #else
                    408:                        if ((stat & (BUSY_STAT | READY_STAT)) == READY_STAT)
                    409:                                break;
                    410: #endif
                    411:                } else {
                    412:                        if (!(stat & BUSY_STAT))
                    413:                                break;
                    414:                }
                    415:                ob_ide_400ns_delay(drive);
                    416:        } while (timeout++ < 1000);
                    417: 
                    418:        if (timeout >= 1000) {
                    419:                ob_ide_error(drive, stat, "drive timed out");
                    420:                cmd->stat = stat;
                    421:                return 1;
                    422:        }
                    423: 
                    424:        ob_ide_write_registers(drive, cmd);
                    425: 
                    426:        /*
                    427:         * now read the data
                    428:         */
                    429:        bytes = cmd->buflen;
                    430:        do {
                    431:                unsigned count = cmd->buflen;
                    432: 
                    433:                if (count > drive->bs)
                    434:                        count = drive->bs;
                    435: 
                    436:                /* delay 100ms for ATAPI? */
                    437: 
                    438:                /*
                    439:                 * wait for BUSY clear
                    440:                 */
                    441:                if (ob_ide_wait_stat(drive, 0, BUSY_STAT | ERR_STAT, &stat)) {
                    442:                        ob_ide_error(drive, stat, "timed out waiting for BUSY clear");
                    443:                        cmd->stat = stat;
                    444:                        break;
                    445:                }
                    446: 
                    447:                /*
                    448:                 * transfer the data
                    449:                 */
                    450:                if ((stat & (BUSY_STAT | DRQ_STAT)) == DRQ_STAT) {
                    451:                        ob_ide_pio_insw(drive, IDEREG_DATA, cmd->buffer, count);
                    452:                        cmd->bytes -= count;
                    453:                        cmd->buffer += count;
                    454:                        bytes -= count;
                    455: 
                    456:                        ob_ide_400ns_delay(drive);
                    457:                }
                    458: 
                    459:                if (stat & (BUSY_STAT | WRERR_STAT | ERR_STAT)) {
                    460:                        cmd->stat = stat;
                    461:                        break;
                    462:                }
                    463: 
                    464:                if (!(stat & DRQ_STAT)) {
                    465:                        cmd->stat = stat;
                    466:                        break;
                    467:                }
                    468:        } while (bytes);
                    469: 
                    470:        if (bytes)
                    471:                IDE_DPRINTF("bytes=%d, stat=%x\n", bytes, stat);
                    472: 
                    473:        return bytes ? 1 : 0;
                    474: }
                    475: 
                    476: /*
                    477:  * execute ata command with pio packet protocol
                    478:  */
                    479: static int
                    480: ob_ide_pio_packet(struct ide_drive *drive, struct atapi_command *cmd)
                    481: {
                    482:        unsigned char stat, reason, lcyl, hcyl;
                    483:        struct ata_command *acmd = &drive->channel->ata_cmd;
                    484:        unsigned char *buffer;
                    485:        unsigned int bytes;
                    486: 
                    487:        if (ob_ide_select_drive(drive))
                    488:                return 1;
                    489: 
                    490:        if (cmd->buflen && cmd->data_direction == atapi_ddir_none)
                    491:                IDE_DPRINTF("non-zero buflen but no data direction\n");
                    492: 
                    493:        memset(acmd, 0, sizeof(*acmd));
                    494:        acmd->lcyl = cmd->buflen & 0xff;
                    495:        acmd->hcyl = (cmd->buflen >> 8) & 0xff;
                    496:        acmd->command = WIN_PACKET;
                    497:        ob_ide_write_registers(drive, acmd);
                    498: 
                    499:        /*
                    500:         * BUSY must be set, _or_ DRQ | ERR
                    501:         */
                    502:        stat = ob_ide_pio_readb(drive, IDEREG_ASTATUS);
                    503:        if ((stat & BUSY_STAT) == 0) {
                    504:                if (!(stat & (DRQ_STAT | ERR_STAT))) {
                    505:                        ob_ide_error(drive, stat, "bad stat in atapi cmd");
                    506:                        cmd->stat = stat;
                    507:                        return 1;
                    508:                }
                    509:        }
                    510: 
                    511:        if (ob_ide_wait_stat(drive, 0, BUSY_STAT | ERR_STAT, &stat)) {
                    512:                ob_ide_error(drive, stat, "timeout, ATAPI BUSY clear");
                    513:                cmd->stat = stat;
                    514:                return 1;
                    515:        }
                    516: 
                    517:        if ((stat & (BUSY_STAT | DRQ_STAT | ERR_STAT)) != DRQ_STAT) {
                    518:                /*
                    519:                 * if command isn't request sense, then we have a problem. if
                    520:                 * we are doing a sense, ERR_STAT == CHECK_CONDITION
                    521:                 */
                    522:                if (cmd->cdb[0] != ATAPI_REQ_SENSE) {
                    523:                        IDE_DPRINTF("odd, drive didn't want to transfer %x\n",
                    524:                                      stat);
                    525:                        return 1;
                    526:                }
                    527:        }
                    528: 
                    529:        /*
                    530:         * transfer cdb
                    531:         */
                    532:        ob_ide_pio_outsw(drive, IDEREG_DATA, cmd->cdb,sizeof(cmd->cdb));
                    533:        ob_ide_400ns_delay(drive);
                    534: 
                    535:        /*
                    536:         * ok, cdb was sent to drive, now do data transfer (if any)
                    537:         */
                    538:        bytes = cmd->buflen;
                    539:        buffer = cmd->buffer;
                    540:        do {
                    541:                unsigned int bc;
                    542: 
                    543:                if (ob_ide_wait_stat(drive, 0, BUSY_STAT | ERR_STAT, &stat)) {
                    544:                        ob_ide_error(drive, stat, "busy not clear after cdb");
                    545:                        cmd->stat = stat;
                    546:                        break;
                    547:                }
                    548: 
                    549:                /*
                    550:                 * transfer complete!
                    551:                 */
                    552:                if ((stat & (BUSY_STAT | DRQ_STAT)) == 0)
                    553:                        break;
                    554: 
                    555:                if ((stat & (BUSY_STAT | DRQ_STAT)) != DRQ_STAT)
                    556:                        break;
                    557: 
                    558:                reason = ob_ide_pio_readb(drive, IDEREG_NSECTOR);
                    559:                lcyl = ob_ide_pio_readb(drive, IDEREG_LCYL);
                    560:                hcyl = ob_ide_pio_readb(drive, IDEREG_HCYL);
                    561: 
                    562:                /*
                    563:                 * check if the drive wants to transfer data in the same
                    564:                 * direction as we do...
                    565:                 */
                    566:                if ((reason & IREASON_CD) && cmd->data_direction != atapi_ddir_read) {
                    567:                        ob_ide_error(drive, stat, "atapi, bad transfer ddir");
                    568:                        break;
                    569:                }
                    570: 
                    571:                bc = (hcyl << 8) | lcyl;
                    572:                if (!bc)
                    573:                        break;
                    574: 
                    575:                if (bc > bytes)
                    576:                        bc = bytes;
                    577: 
                    578:                if (cmd->data_direction == atapi_ddir_read)
                    579:                        ob_ide_pio_insw(drive, IDEREG_DATA, buffer, bc);
                    580:                else
                    581:                        ob_ide_pio_outsw(drive, IDEREG_DATA, buffer, bc);
                    582: 
                    583:                bytes -= bc;
                    584:                buffer += bc;
                    585: 
                    586:                ob_ide_400ns_delay(drive);
                    587:        } while (bytes);
                    588: 
                    589:        if (cmd->data_direction != atapi_ddir_none)
                    590:                (void) ob_ide_wait_stat(drive, 0, BUSY_STAT, &stat);
                    591: 
                    592:        if (bytes)
                    593:                IDE_DPRINTF("cdb failed, bytes=%d, stat=%x\n", bytes, stat);
                    594: 
                    595:        return (stat & ERR_STAT) || bytes;
                    596: }
                    597: 
                    598: /*
                    599:  * execute a packet command, with retries if appropriate
                    600:  */
                    601: static int
                    602: ob_ide_atapi_packet(struct ide_drive *drive, struct atapi_command *cmd)
                    603: {
                    604:        int retries = 5, ret;
                    605: 
                    606:        if (drive->type != ide_type_atapi)
                    607:                return 1;
                    608:        if (cmd->buflen > 0xffff)
                    609:                return 1;
                    610: 
                    611:        /*
                    612:         * retry loop
                    613:         */
                    614:        do {
                    615:                ret = ob_ide_pio_packet(drive, cmd);
                    616:                if (!ret)
                    617:                        break;
                    618: 
                    619:                /*
                    620:                 * request sense failed, bummer
                    621:                 */
                    622:                if (cmd->cdb[0] == ATAPI_REQ_SENSE)
                    623:                        break;
                    624: 
                    625:                if (ob_ide_atapi_request_sense(drive))
                    626:                        break;
                    627: 
                    628:                /*
                    629:                 * we know sense is valid. retry if the drive isn't ready,
                    630:                 * otherwise don't bother.
                    631:                 */
                    632:                if (cmd->sense.sense_key != ATAPI_SENSE_NOT_READY)
                    633:                        break;
                    634:                /*
                    635:                 * ... except 'medium not present'
                    636:                 */
                    637:                if (cmd->sense.asc == 0x3a)
                    638:                        break;
                    639: 
                    640:                udelay(1000000);
                    641:        } while (retries--);
                    642: 
                    643:        if (ret)
                    644:                ob_ide_error(drive, 0, "atapi command");
                    645: 
                    646:        return ret;
                    647: }
                    648: 
                    649: static int
                    650: ob_ide_atapi_request_sense(struct ide_drive *drive)
                    651: {
                    652:        struct atapi_command *cmd = &drive->channel->atapi_cmd;
                    653:        unsigned char old_cdb;
                    654: 
                    655:        /*
                    656:         * save old cdb for debug error
                    657:         */
                    658:        old_cdb = cmd->cdb[0];
                    659: 
                    660:        memset(cmd, 0, sizeof(*cmd));
                    661:        cmd->cdb[0] = ATAPI_REQ_SENSE;
                    662:        cmd->cdb[4] = 18;
                    663:        cmd->buffer = (unsigned char *) &cmd->sense;
                    664:        cmd->buflen = 18;
                    665:        cmd->data_direction = atapi_ddir_read;
                    666:        cmd->old_cdb = old_cdb;
                    667: 
                    668:        if (ob_ide_atapi_packet(drive, cmd))
                    669:                return 1;
                    670: 
                    671:        cmd->sense_valid = 1;
                    672:        return 0;
                    673: }
                    674: 
                    675: /*
                    676:  * make sure drive is ready and media loaded
                    677:  */
                    678: static int
                    679: ob_ide_atapi_drive_ready(struct ide_drive *drive)
                    680: {
                    681:        struct atapi_command *cmd = &drive->channel->atapi_cmd;
                    682:        struct atapi_capacity cap;
                    683: 
                    684:        IDE_DPRINTF("ob_ide_atapi_drive_ready\n");
                    685: 
                    686:        /*
                    687:         * Test Unit Ready is like a ping
                    688:         */
                    689:        memset(cmd, 0, sizeof(*cmd));
                    690:        cmd->cdb[0] = ATAPI_TUR;
                    691: 
                    692:        if (ob_ide_atapi_packet(drive, cmd)) {
                    693:                IDE_DPRINTF("%d: TUR failed\n", drive->nr);
                    694:                return 1;
                    695:        }
                    696: 
                    697:        /*
                    698:         * don't force load of tray (bit 2 in byte 4 of cdb), it's
                    699:         * annoying and we don't want to deal with errors from drives
                    700:         * that cannot do it
                    701:         */
                    702:        memset(cmd, 0, sizeof(*cmd));
                    703:        cmd->cdb[0] = ATAPI_START_STOP_UNIT;
                    704:        cmd->cdb[4] = 0x01;
                    705: 
                    706:        if (ob_ide_atapi_packet(drive, cmd)) {
                    707:                IDE_DPRINTF("%d: START_STOP unit failed\n", drive->nr);
                    708:                return 1;
                    709:        }
                    710: 
                    711:        /*
                    712:         * finally, get capacity and block size
                    713:         */
                    714:        memset(cmd, 0, sizeof(*cmd));
                    715:        memset(&cap, 0, sizeof(cap));
                    716: 
                    717:        cmd->cdb[0] = ATAPI_READ_CAPACITY;
                    718:        cmd->buffer = (unsigned char *) &cap;
                    719:        cmd->buflen = sizeof(cap);
                    720:        cmd->data_direction = atapi_ddir_read;
                    721: 
                    722:        if (ob_ide_atapi_packet(drive, cmd)) {
                    723:                drive->sectors = 0x1fffff;
                    724:                drive->bs = 2048;
                    725:                return 1;
                    726:        }
                    727: 
                    728:        drive->sectors = __be32_to_cpu(cap.lba) + 1;
                    729:        drive->bs = __be32_to_cpu(cap.block_size);
                    730:        return 0;
                    731: }
                    732: 
                    733: /*
                    734:  * read from an atapi device, using READ_10
                    735:  */
                    736: static int
                    737: ob_ide_read_atapi(struct ide_drive *drive, unsigned long long block,
                    738:                   unsigned char *buf, unsigned int sectors)
                    739: {
                    740:        struct atapi_command *cmd = &drive->channel->atapi_cmd;
                    741: 
                    742:        if (ob_ide_atapi_drive_ready(drive))
                    743:                return 1;
                    744: 
                    745:        memset(cmd, 0, sizeof(*cmd));
                    746: 
                    747:        /*
                    748:         * READ_10 should work on generally any atapi device
                    749:         */
                    750:        cmd->cdb[0] = ATAPI_READ_10;
                    751:        cmd->cdb[2] = (block >> 24) & 0xff;
                    752:        cmd->cdb[3] = (block >> 16) & 0xff;
                    753:        cmd->cdb[4] = (block >>  8) & 0xff;
                    754:        cmd->cdb[5] = block & 0xff;
                    755:        cmd->cdb[7] = (sectors >> 8) & 0xff;
                    756:        cmd->cdb[8] = sectors & 0xff;
                    757: 
                    758:        cmd->buffer = buf;
                    759:        cmd->buflen = sectors * 2048;
                    760:        cmd->data_direction = atapi_ddir_read;
                    761: 
                    762:        return ob_ide_atapi_packet(drive, cmd);
                    763: }
                    764: 
                    765: static int
                    766: ob_ide_read_ata_chs(struct ide_drive *drive, unsigned long long block,
                    767:                     unsigned char *buf, unsigned int sectors)
                    768: {
                    769:        struct ata_command *cmd = &drive->channel->ata_cmd;
                    770:        unsigned int track = (block / drive->sect);
                    771:        unsigned int sect = (block % drive->sect) + 1;
                    772:        unsigned int head = (track % drive->head);
                    773:        unsigned int cyl = (track / drive->head);
                    774: 
                    775:        /*
                    776:         * fill in chs command to read from disk at given location
                    777:         */
                    778:        cmd->buffer = buf;
                    779:        cmd->buflen = sectors * 512;
                    780: 
                    781:        cmd->nsector = sectors & 0xff;
                    782:        cmd->sector = sect;
                    783:        cmd->lcyl = cyl;
                    784:        cmd->hcyl = cyl >> 8;
                    785:        cmd->device_head = head;
                    786: 
                    787:        cmd->command = WIN_READ;
                    788: 
                    789:        return ob_ide_pio_data_in(drive, cmd);
                    790: }
                    791: 
                    792: static int
                    793: ob_ide_read_ata_lba28(struct ide_drive *drive, unsigned long long block,
                    794:                       unsigned char *buf, unsigned int sectors)
                    795: {
                    796:        struct ata_command *cmd = &drive->channel->ata_cmd;
                    797: 
                    798:        memset(cmd, 0, sizeof(*cmd));
                    799: 
                    800:        /*
                    801:         * fill in 28-bit lba command to read from disk at given location
                    802:         */
                    803:        cmd->buffer = buf;
                    804:        cmd->buflen = sectors * 512;
                    805: 
                    806:        cmd->nsector = sectors;
                    807:        cmd->sector = block;
                    808:        cmd->lcyl = block >>= 8;
                    809:        cmd->hcyl = block >>= 8;
                    810:        cmd->device_head = ((block >> 8) & 0x0f);
                    811:        cmd->device_head |= (1 << 6);
                    812: 
                    813:        cmd->command = WIN_READ;
                    814: 
                    815:        return ob_ide_pio_data_in(drive, cmd);
                    816: }
                    817: 
                    818: static int
                    819: ob_ide_read_ata_lba48(struct ide_drive *drive, unsigned long long block,
                    820:                       unsigned char *buf, unsigned int sectors)
                    821: {
                    822:        struct ata_command *cmd = &drive->channel->ata_cmd;
                    823: 
                    824:        memset(cmd, 0, sizeof(*cmd));
                    825: 
                    826:        cmd->buffer = buf;
                    827:        cmd->buflen = sectors * 512;
                    828: 
                    829:        /*
                    830:         * we are using tasklet addressing here
                    831:         */
                    832:        cmd->task[2] = sectors;
                    833:        cmd->task[3] = sectors >> 8;
                    834:        cmd->task[4] = block;
                    835:        cmd->task[5] = block >>  8;
                    836:        cmd->task[6] = block >> 16;
                    837:        cmd->task[7] = block >> 24;
                    838:        cmd->task[8] = (u64) block >> 32;
                    839:        cmd->task[9] = (u64) block >> 40;
                    840: 
                    841:        cmd->command = WIN_READ_EXT;
                    842: 
                    843:        ob_ide_write_tasklet(drive, cmd);
                    844: 
                    845:        return ob_ide_pio_data_in(drive, cmd);
                    846: }
                    847: /*
                    848:  * read 'sectors' sectors from ata device
                    849:  */
                    850: static int
                    851: ob_ide_read_ata(struct ide_drive *drive, unsigned long long block,
                    852:                 unsigned char *buf, unsigned int sectors)
                    853: {
                    854:        unsigned long long end_block = block + sectors;
                    855:        const int need_lba48 = (end_block > (1ULL << 28)) || (sectors > 255);
                    856: 
                    857:        if (end_block > drive->sectors)
                    858:                return 1;
                    859:        if (need_lba48 && drive->addressing != ide_lba48)
                    860:                return 1;
                    861: 
                    862:        /*
                    863:         * use lba48 if we have to, otherwise use the faster lba28
                    864:         */
                    865:        if (need_lba48)
                    866:                return ob_ide_read_ata_lba48(drive, block, buf, sectors);
                    867:        else if (drive->addressing != ide_chs)
                    868:                return ob_ide_read_ata_lba28(drive, block, buf, sectors);
                    869: 
                    870:        return ob_ide_read_ata_chs(drive, block, buf, sectors);
                    871: }
                    872: 
                    873: static int
                    874: ob_ide_read_sectors(struct ide_drive *drive, unsigned long long block,
                    875:                     unsigned char *buf, unsigned int sectors)
                    876: {
                    877:        if (!sectors)
                    878:                return 1;
                    879:        if (block + sectors > drive->sectors)
                    880:                return 1;
                    881: 
                    882:        IDE_DPRINTF("ob_ide_read_sectors: block=%lu sectors=%u\n",
                    883:                    (unsigned long) block, sectors);
                    884: 
                    885:        if (drive->type == ide_type_ata)
                    886:                return ob_ide_read_ata(drive, block, buf, sectors);
                    887:        else
                    888:                return ob_ide_read_atapi(drive, block, buf, sectors);
                    889: }
                    890: 
                    891: /*
                    892:  * byte swap the string if necessay, and strip leading/trailing blanks
                    893:  */
                    894: static void
                    895: ob_ide_fixup_string(unsigned char *s, unsigned int len)
                    896: {
                    897:        unsigned char *p = s, *end = &s[len & ~1];
                    898: 
                    899:        /*
                    900:         * if big endian arch, byte swap the string
                    901:         */
                    902: #ifdef CONFIG_BIG_ENDIAN
                    903:        for (p = end ; p != s;) {
                    904:                unsigned short *pp = (unsigned short *) (p -= 2);
                    905:                *pp = __le16_to_cpu(*pp);
                    906:        }
                    907: #endif
                    908: 
                    909:        while (s != end && *s == ' ')
                    910:                ++s;
                    911:        while (s != end && *s)
                    912:                if (*s++ != ' ' || (s != end && *s && *s != ' '))
                    913:                        *p++ = *(s-1);
                    914:        while (p != end)
                    915:                *p++ = '\0';
                    916: }
                    917: 
                    918: /*
                    919:  * it's big endian, we need to swap (if on little endian) the items we use
                    920:  */
                    921: static int
                    922: ob_ide_fixup_id(struct hd_driveid *id)
                    923: {
                    924:        ob_ide_fixup_string(id->model, 40);
                    925:        id->config = __le16_to_cpu(id->config);
                    926:        id->lba_capacity = __le32_to_cpu(id->lba_capacity);
                    927:        id->cyls = __le16_to_cpu(id->cyls);
                    928:        id->heads = __le16_to_cpu(id->heads);
                    929:        id->sectors = __le16_to_cpu(id->sectors);
                    930:        id->command_set_2 = __le16_to_cpu(id->command_set_2);
                    931:        id->cfs_enable_2 = __le16_to_cpu(id->cfs_enable_2);
                    932: 
                    933:        return 0;
                    934: }
                    935: 
                    936: static int
                    937: ob_ide_identify_drive(struct ide_drive *drive)
                    938: {
                    939:        struct ata_command *cmd = &drive->channel->ata_cmd;
                    940:        struct hd_driveid id;
                    941: 
                    942:        memset(cmd, 0, sizeof(*cmd));
                    943:        cmd->buffer = (unsigned char *) &id;
                    944:        cmd->buflen = 512;
                    945: 
                    946:        if (drive->type == ide_type_ata)
                    947:                cmd->command = WIN_IDENTIFY;
                    948:        else if (drive->type == ide_type_atapi)
                    949:                cmd->command = WIN_IDENTIFY_PACKET;
                    950:        else {
                    951:                IDE_DPRINTF("%s: called with bad device type %d\n",
                    952:                             __FUNCTION__, drive->type);
                    953:                return 1;
                    954:        }
                    955: 
                    956:        if (ob_ide_pio_data_in(drive, cmd))
                    957:                return 1;
                    958: 
                    959:        ob_ide_fixup_id(&id);
                    960: 
                    961:        if (drive->type == ide_type_atapi) {
                    962:                drive->media = (id.config >> 8) & 0x1f;
                    963:                drive->sectors = 0x7fffffff;
                    964:                drive->bs = 2048;
                    965:                drive->max_sectors = 31;
                    966:        } else {
                    967:                drive->media = ide_media_disk;
                    968:                drive->sectors = id.lba_capacity;
                    969:                drive->bs = 512;
                    970:                drive->max_sectors = 255;
                    971: 
                    972: #ifdef CONFIG_IDE_LBA48
                    973:                if ((id.command_set_2 & 0x0400) && (id.cfs_enable_2 & 0x0400)) {
                    974:                        drive->addressing = ide_lba48;
                    975:                        drive->max_sectors = 65535;
                    976:                } else
                    977: #endif
                    978:                if (id.capability & 2)
                    979:                        drive->addressing = ide_lba28;
                    980:                else {
                    981:                        drive->addressing = ide_chs;
                    982:                }
                    983: 
                    984:                /* only set these in chs mode? */
                    985:                drive->cyl = id.cyls;
                    986:                drive->head = id.heads;
                    987:                drive->sect = id.sectors;
                    988:        }
                    989: 
                    990:        strncpy(drive->model, (char*)id.model, sizeof(id.model));
                    991:        drive->model[40] = '\0';
                    992:        return 0;
                    993: }
                    994: 
                    995: /*
                    996:  * identify type of devices on channel. must have already been probed.
                    997:  */
                    998: static void
                    999: ob_ide_identify_drives(struct ide_channel *chan)
                   1000: {
                   1001:        struct ide_drive *drive;
                   1002:        int i;
                   1003: 
                   1004:        for (i = 0; i < 2; i++) {
                   1005:                drive = &chan->drives[i];
                   1006: 
                   1007:                if (!drive->present)
                   1008:                        continue;
                   1009: 
                   1010:                ob_ide_identify_drive(drive);
                   1011:        }
                   1012: }
                   1013: 
                   1014: /*
                   1015:  * software reset (ATA-4, section 8.3)
                   1016:  */
                   1017: static void
                   1018: ob_ide_software_reset(struct ide_drive *drive)
                   1019: {
                   1020:        struct ide_channel *chan = drive->channel;
                   1021: 
                   1022:        ob_ide_pio_writeb(drive, IDEREG_CONTROL, IDECON_NIEN | IDECON_SRST);
                   1023:        ob_ide_400ns_delay(drive);
                   1024:        ob_ide_pio_writeb(drive, IDEREG_CONTROL, IDECON_NIEN);
                   1025:        ob_ide_400ns_delay(drive);
                   1026: 
                   1027:        /*
                   1028:         * if master is present, wait for BUSY clear
                   1029:         */
                   1030:        if (chan->drives[0].present)
                   1031:                ob_ide_wait_stat(drive, 0, BUSY_STAT, NULL);
                   1032: 
                   1033:        /*
                   1034:         * if slave is present, wait until it allows register access
                   1035:         */
                   1036:        if (chan->drives[1].present) {
                   1037:                unsigned char sectorn, sectorc;
                   1038:                int timeout = 1000;
                   1039: 
                   1040:                do {
                   1041:                        /*
                   1042:                         * select it
                   1043:                         */
                   1044:                        ob_ide_pio_writeb(drive, IDEREG_CURRENT, IDEHEAD_DEV1);
                   1045:                        ob_ide_400ns_delay(drive);
                   1046: 
                   1047:                        sectorn = ob_ide_pio_readb(drive, IDEREG_SECTOR);
                   1048:                        sectorc = ob_ide_pio_readb(drive, IDEREG_NSECTOR);
                   1049: 
                   1050:                        if (sectorc == 0x01 && sectorn == 0x01)
                   1051:                                break;
                   1052: 
                   1053:                } while (--timeout);
                   1054:        }
                   1055: 
                   1056:        /*
                   1057:         * reset done, reselect original device
                   1058:         */
                   1059:        drive->channel->selected = -1;
                   1060:        ob_ide_select_drive(drive);
                   1061: }
                   1062: 
                   1063: /*
                   1064:  * this serves as both a device check, and also to verify that the drives
                   1065:  * we initially "found" are really there
                   1066:  */
                   1067: static void
                   1068: ob_ide_device_type_check(struct ide_drive *drive)
                   1069: {
                   1070:        unsigned char sc, sn, cl, ch, st;
                   1071: 
                   1072:        if (ob_ide_select_drive(drive))
                   1073:                return;
                   1074: 
                   1075:        sc = ob_ide_pio_readb(drive, IDEREG_NSECTOR);
                   1076:        sn = ob_ide_pio_readb(drive, IDEREG_SECTOR);
                   1077: 
                   1078:        if (sc == 0x01 && sn == 0x01) {
                   1079:                /*
                   1080:                 * read device signature
                   1081:                 */
                   1082:                cl = ob_ide_pio_readb(drive, IDEREG_LCYL);
                   1083:                ch = ob_ide_pio_readb(drive, IDEREG_HCYL);
                   1084:                st = ob_ide_pio_readb(drive, IDEREG_STATUS);
                   1085:                if (cl == 0x14 && ch == 0xeb)
                   1086:                        drive->type = ide_type_atapi;
                   1087:                else if (cl == 0x00 && ch == 0x00 && st != 0x00)
                   1088:                        drive->type = ide_type_ata;
                   1089:                else
                   1090:                        drive->present = 0;
                   1091:        } else
                   1092:                drive->present = 0;
                   1093: }
                   1094: 
                   1095: /*
                   1096:  * pure magic
                   1097:  */
                   1098: static void
                   1099: ob_ide_device_check(struct ide_drive *drive)
                   1100: {
                   1101:        unsigned char sc, sn;
                   1102: 
                   1103:        /*
                   1104:         * non-existing io port should return 0xff, don't probe this
                   1105:         * channel at all then
                   1106:         */
                   1107:        if (ob_ide_pio_readb(drive, IDEREG_STATUS) == 0xff) {
                   1108:                drive->channel->present = 0;
                   1109:                return;
                   1110:        }
                   1111: 
                   1112:        if (ob_ide_select_drive(drive))
                   1113:                return;
                   1114: 
                   1115:        ob_ide_pio_writeb(drive, IDEREG_NSECTOR, 0x55);
                   1116:        ob_ide_pio_writeb(drive, IDEREG_SECTOR, 0xaa);
                   1117:        ob_ide_pio_writeb(drive, IDEREG_NSECTOR, 0xaa);
                   1118:        ob_ide_pio_writeb(drive, IDEREG_SECTOR, 0x55);
                   1119:        ob_ide_pio_writeb(drive, IDEREG_NSECTOR, 0x55);
                   1120:        ob_ide_pio_writeb(drive, IDEREG_SECTOR, 0xaa);
                   1121: 
                   1122:        sc = ob_ide_pio_readb(drive, IDEREG_NSECTOR);
                   1123:        sn = ob_ide_pio_readb(drive, IDEREG_SECTOR);
                   1124: 
                   1125:        /*
                   1126:         * we _think_ the device is there, we will make sure later
                   1127:         */
                   1128:        if (sc == 0x55 && sn == 0xaa) {
                   1129:                drive->present = 1;
                   1130:                drive->type = ide_type_unknown;
                   1131:        }
                   1132: }
                   1133: 
                   1134: /*
                   1135:  * probe the legacy ide ports and find attached devices.
                   1136:  */
                   1137: static void
                   1138: ob_ide_probe(struct ide_channel *chan)
                   1139: {
                   1140:        struct ide_drive *drive;
                   1141:        int i;
                   1142: 
                   1143:        for (i = 0; i < 2; i++) {
                   1144:                drive = &chan->drives[i];
                   1145: 
                   1146:                ob_ide_device_check(drive);
                   1147: 
                   1148:                /*
                   1149:                 * no point in continuing
                   1150:                 */
                   1151:                if (!chan->present)
                   1152:                        break;
                   1153: 
                   1154:                if (!drive->present)
                   1155:                        continue;
                   1156: 
                   1157:                /*
                   1158:                 * select and reset device
                   1159:                 */
                   1160:                if (ob_ide_select_drive(drive))
                   1161:                        continue;
                   1162: 
                   1163:                ob_ide_software_reset(drive);
                   1164: 
                   1165:                ob_ide_device_type_check(drive);
                   1166:        }
                   1167: }
                   1168: 
                   1169: /*
                   1170:  * The following functions are interfacing with OpenBIOS. They
                   1171:  * are device node methods. Thus they have to do proper stack handling.
                   1172:  *
                   1173:  */
                   1174: 
                   1175: /*
                   1176:  * 255 sectors for ata lba28, 65535 for lba48, and 31 sectors for atapi
                   1177:  */
                   1178: static void
                   1179: ob_ide_max_transfer(int *idx)
                   1180: {
                   1181:        struct ide_drive *drive = *(struct ide_drive **)idx;
                   1182: 
                   1183:        IDE_DPRINTF("max_transfer %x\n", drive->max_sectors * drive->bs);
                   1184: 
                   1185:        PUSH(drive->max_sectors * drive->bs);
                   1186: }
                   1187: 
                   1188: static void
                   1189: ob_ide_read_blocks(int *idx)
                   1190: {
                   1191:        cell n = POP(), cnt=n;
                   1192:        ucell blk = POP();
                   1193:        unsigned char *dest = (unsigned char *)cell2pointer(POP());
                   1194:        struct ide_drive *drive = *(struct ide_drive **)idx;
                   1195: 
                   1196:         IDE_DPRINTF("ob_ide_read_blocks %lx block=%ld n=%ld\n",
                   1197:                     (unsigned long)dest, (unsigned long)blk, (long)n);
                   1198: 
                   1199:        while (n) {
                   1200:                int len = n;
                   1201:                if (len > drive->max_sectors)
                   1202:                        len = drive->max_sectors;
                   1203: 
                   1204:                if (ob_ide_read_sectors(drive, blk, dest, len)) {
                   1205:                        IDE_DPRINTF("ob_ide_read_blocks: error\n");
                   1206:                        RET(0);
                   1207:                }
                   1208: 
                   1209:                dest += len * drive->bs;
                   1210:                n -= len;
                   1211:                blk += len;
                   1212:        }
                   1213: 
                   1214:        PUSH(cnt);
                   1215: }
                   1216: 
                   1217: static void
                   1218: ob_ide_block_size(int *idx)
                   1219: {
                   1220:        struct ide_drive *drive = *(struct ide_drive **)idx;
                   1221: 
                   1222:        IDE_DPRINTF("ob_ide_block_size: block size %x\n", drive->bs);
                   1223: 
                   1224:        PUSH(drive->bs);
                   1225: }
                   1226: 
                   1227: static void
                   1228: ob_ide_initialize(int *idx)
                   1229: {
                   1230:        int props[3];
                   1231:        phandle_t ph=get_cur_dev();
                   1232: 
                   1233:        push_str("block");
                   1234:        fword("device-type");
                   1235: 
                   1236:        // Set dummy reg properties
                   1237: 
                   1238:        set_int_property(ph, "#address-cells", 1);
                   1239:        set_int_property(ph, "#size-cells", 0);
                   1240: 
                   1241:        props[0] = __cpu_to_be32(0); props[1] = __cpu_to_be32(0); props[2] = __cpu_to_be32(0);
                   1242:        set_property(ph, "reg", (char *)&props, 3*sizeof(int));
                   1243: 
                   1244:        fword("is-deblocker");
                   1245: }
                   1246: 
                   1247: static void
                   1248: ob_ide_open(int *idx)
                   1249: {
                   1250:        int ret=1, len;
                   1251:        phandle_t ph;
                   1252:        struct ide_drive *drive;
                   1253:        struct ide_channel *chan;
                   1254:        char *idename;
                   1255:        int unit;
                   1256: 
                   1257:        fword("my-unit");
                   1258:        unit = POP();
                   1259: 
                   1260:        fword("my-parent");
                   1261:        fword("ihandle>phandle");
                   1262:        ph=(phandle_t)POP();
                   1263:        idename=get_property(ph, "name", &len);
                   1264: 
                   1265:        chan = ide_seek_channel(idename);
                   1266:        drive = &chan->drives[unit];
                   1267:        *(struct ide_drive **)idx = drive;
                   1268: 
                   1269:        IDE_DPRINTF("opening channel %d unit %d\n", idx[1], idx[0]);
                   1270:        dump_drive(drive);
                   1271: 
                   1272:        if (drive->type != ide_type_ata)
                   1273:                ret= !ob_ide_atapi_drive_ready(drive);
                   1274: 
                   1275:        selfword("open-deblocker");
                   1276: 
                   1277:        /* interpose disk-label */
                   1278:        ph = find_dev("/packages/disk-label");
                   1279:        fword("my-args");
                   1280:        PUSH_ph( ph );
                   1281:        fword("interpose");
                   1282: 
                   1283:        RET ( -ret );
                   1284: }
                   1285: 
                   1286: static void
                   1287: ob_ide_close(struct ide_drive *drive)
                   1288: {
                   1289:        selfword("close-deblocker");
                   1290: }
                   1291: 
                   1292: NODE_METHODS(ob_ide) = {
                   1293:        { NULL,                 ob_ide_initialize       },
                   1294:        { "open",               ob_ide_open             },
                   1295:        { "close",              ob_ide_close            },
                   1296:        { "read-blocks",        ob_ide_read_blocks      },
                   1297:        { "block-size",         ob_ide_block_size       },
                   1298:        { "max-transfer",       ob_ide_max_transfer     },
                   1299: };
                   1300: 
                   1301: static void
                   1302: ob_ide_ctrl_initialize(int *idx)
                   1303: {
                   1304:        phandle_t ph=get_cur_dev();
                   1305: 
                   1306:        /* set device type */
                   1307:        push_str(DEV_TYPE);
                   1308:        fword("device-type");
                   1309: 
                   1310:        set_int_property(ph, "#address-cells", 1);
                   1311:        set_int_property(ph, "#size-cells", 0);
                   1312: }
                   1313: 
                   1314: static void
                   1315: ob_ide_ctrl_decodeunit(int *idx)
                   1316: {
                   1317:        fword("parse-hex");
                   1318: }
                   1319: 
                   1320: NODE_METHODS(ob_ide_ctrl) = {
                   1321:        { NULL,                 ob_ide_ctrl_initialize  },
                   1322:        { "decode-unit",        ob_ide_ctrl_decodeunit  },
                   1323: };
                   1324: 
                   1325: static void set_cd_alias(const char *path)
                   1326: {
                   1327:        phandle_t aliases;
                   1328: 
                   1329:        aliases = find_dev("/aliases");
                   1330: 
                   1331:        if (get_property(aliases, "cd", NULL))
                   1332:                return;
                   1333: 
                   1334:        set_property(aliases, "cd", path, strlen(path) + 1);
                   1335:        set_property(aliases, "cdrom", path, strlen(path) + 1);
                   1336: }
                   1337: 
                   1338: static void set_hd_alias(const char *path)
                   1339: {
                   1340:        phandle_t aliases;
                   1341: 
                   1342:        aliases = find_dev("/aliases");
                   1343: 
                   1344:        if (get_property(aliases, "hd", NULL))
                   1345:                return;
                   1346: 
                   1347:        set_property(aliases, "hd", path, strlen(path) + 1);
                   1348:        set_property(aliases, "disk", path, strlen(path) + 1);
                   1349: }
                   1350: 
                   1351: static void set_ide_alias(const char *path)
                   1352: {
                   1353:        phandle_t aliases;
                   1354:        static int ide_counter = 0;
                   1355:        char idestr[8];
                   1356: 
                   1357:        aliases = find_dev("/aliases");
                   1358: 
                   1359:        snprintf(idestr, sizeof(idestr), "ide%d", ide_counter++);
                   1360:        set_property(aliases, idestr, path, strlen(path) + 1);
                   1361: }
                   1362: 
                   1363: int ob_ide_init(const char *path, uint32_t io_port0, uint32_t ctl_port0,
                   1364:                uint32_t io_port1, uint32_t ctl_port1)
                   1365: {
                   1366:        int i, j;
                   1367:        char nodebuff[128];
                   1368:        phandle_t dnode;
                   1369:        struct ide_channel *chan;
                   1370:        int io_ports[IDE_MAX_CHANNELS];
                   1371:        int ctl_ports[IDE_MAX_CHANNELS];
                   1372:        u32 props[6];
                   1373: 
                   1374:        io_ports[0] = io_port0;
                   1375:        ctl_ports[0] = ctl_port0 + 2;
                   1376:        io_ports[1] = io_port1;
                   1377:        ctl_ports[1] = ctl_port1 + 2;
                   1378: 
                   1379:        for (i = 0; i < IDE_NUM_CHANNELS; i++, current_channel++) {
                   1380: 
                   1381:                chan = malloc(sizeof(struct ide_channel));
                   1382: 
                   1383:                snprintf(chan->name, sizeof(chan->name),
                   1384:                         DEV_NAME, current_channel);
                   1385: 
                   1386:                chan->mmio = 0;
                   1387: 
                   1388:                for (j = 0; j < 8; j++)
                   1389:                        chan->io_regs[j] = io_ports[i] + j;
                   1390: 
                   1391:                chan->io_regs[8] = ctl_ports[i];
                   1392:                chan->io_regs[9] = ctl_ports[i] + 1;
                   1393: 
                   1394:                chan->obide_inb = ob_ide_inb;
                   1395:                chan->obide_insw = ob_ide_insw;
                   1396:                chan->obide_outb = ob_ide_outb;
                   1397:                chan->obide_outsw = ob_ide_outsw;
                   1398: 
                   1399:                chan->selected = -1;
                   1400: 
                   1401:                /*
                   1402:                 * assume it's there, if not io port dead check will clear
                   1403:                 */
                   1404:                chan->present = 1;
                   1405: 
                   1406:                for (j = 0; j < 2; j++) {
                   1407:                        chan->drives[j].present = 0;
                   1408:                        chan->drives[j].unit = j;
                   1409:                        chan->drives[j].channel = chan;
                   1410:                        /* init with a decent value */
                   1411:                        chan->drives[j].bs = 512;
                   1412: 
                   1413:                        chan->drives[j].nr = i * 2 + j;
                   1414:                }
                   1415: 
                   1416:                ide_add_channel(chan);
                   1417: 
                   1418:                ob_ide_probe(chan);
                   1419: 
                   1420:                if (!chan->present)
                   1421:                        continue;
                   1422: 
                   1423:                ob_ide_identify_drives(chan);
                   1424: 
                   1425:                 snprintf(nodebuff, sizeof(nodebuff), "%s/" DEV_NAME, path,
                   1426:                          current_channel);
                   1427:                REGISTER_NAMED_NODE(ob_ide_ctrl, nodebuff);
                   1428: 
                   1429:                dnode = find_dev(nodebuff);
                   1430: 
                   1431: #if !defined(CONFIG_PPC) && !defined(CONFIG_SPARC64)
                   1432:                props[0]=14; props[1]=0;
                   1433:                set_property(dnode, "interrupts",
                   1434:                             (char *)&props, 2*sizeof(props[0]));
                   1435: #endif
                   1436: 
                   1437:                props[0] = __cpu_to_be32(chan->io_regs[0]);
                   1438:                props[1] = __cpu_to_be32(1); props[2] = __cpu_to_be32(8);
                   1439:                props[3] = __cpu_to_be32(chan->io_regs[8]);
                   1440:                props[4] = __cpu_to_be32(1); props[5] = __cpu_to_be32(2);
                   1441:                set_property(dnode, "reg", (char *)&props, 6*sizeof(props[0]));
                   1442: 
                   1443:                IDE_DPRINTF(DEV_NAME": [io ports 0x%x-0x%x,0x%x]\n",
                   1444:                            current_channel, chan->io_regs[0],
                   1445:                            chan->io_regs[0] + 7, chan->io_regs[8]);
                   1446: 
                   1447:                for (j = 0; j < 2; j++) {
                   1448:                        struct ide_drive *drive = &chan->drives[j];
                   1449:                         const char *media = "UNKNOWN";
                   1450: 
                   1451:                        if (!drive->present)
                   1452:                                continue;
                   1453: 
                   1454:                        IDE_DPRINTF("    drive%d [ATA%s ", j,
                   1455:                                    drive->type == ide_type_atapi ? "PI" : "");
                   1456:                        switch (drive->media) {
                   1457:                                case ide_media_floppy:
                   1458:                                        media = "floppy";
                   1459:                                        break;
                   1460:                                case ide_media_cdrom:
                   1461:                                        media = "cdrom";
                   1462:                                        break;
                   1463:                                case ide_media_optical:
                   1464:                                        media = "mo";
                   1465:                                        break;
                   1466:                                case ide_media_disk:
                   1467:                                        media = "disk";
                   1468:                                        break;
                   1469:                        }
                   1470:                        IDE_DPRINTF("%s]: %s\n", media, drive->model);
                   1471:                         snprintf(nodebuff, sizeof(nodebuff),
                   1472:                                  "%s/" DEV_NAME "/%s", path, current_channel,
                   1473:                                  media);
                   1474:                        REGISTER_NAMED_NODE(ob_ide, nodebuff);
                   1475:                        dnode=find_dev(nodebuff);
                   1476:                        set_int_property(dnode, "reg", j);
                   1477: 
                   1478:                        /* create aliases */
                   1479: 
                   1480:                        set_ide_alias(nodebuff);
                   1481:                        if (drive->media == ide_media_cdrom)
                   1482:                                set_cd_alias(nodebuff);
                   1483:                        if (drive->media == ide_media_disk)
                   1484:                                set_hd_alias(nodebuff);
                   1485:                }
                   1486:        }
                   1487: 
                   1488:        return 0;
                   1489: }
                   1490: 
                   1491: #if defined(CONFIG_DRIVER_MACIO)
                   1492: static unsigned char
                   1493: macio_ide_inb(struct ide_channel *chan, unsigned int port)
                   1494: {
                   1495:        return in_8((unsigned char*)(chan->mmio + (port << 4)));
                   1496: }
                   1497: 
                   1498: static void
                   1499: macio_ide_outb(struct ide_channel *chan, unsigned char data, unsigned int port)
                   1500: {
                   1501:        out_8((unsigned char*)(chan->mmio + (port << 4)), data);
                   1502: }
                   1503: 
                   1504: static void
                   1505: macio_ide_insw(struct ide_channel *chan,
                   1506:               unsigned int port, unsigned char *addr, unsigned int count)
                   1507: {
                   1508:        _insw((uint16_t*)(chan->mmio + (port << 4)), addr, count);
                   1509: }
                   1510: 
                   1511: static void
                   1512: macio_ide_outsw(struct ide_channel *chan,
                   1513:                unsigned int port, unsigned char *addr, unsigned int count)
                   1514: {
                   1515:        _outsw((uint16_t*)(chan->mmio + (port << 4)), addr, count);
                   1516: }
                   1517: 
                   1518: #define MACIO_IDE_OFFSET       0x00020000
                   1519: #define MACIO_IDE_SIZE         0x00001000
                   1520: 
                   1521: int macio_ide_init(const char *path, uint32_t addr, int nb_channels)
                   1522: {
                   1523:        int i, j;
                   1524:        char nodebuff[128];
                   1525:        phandle_t dnode;
                   1526:        u32 props[8];
                   1527:        struct ide_channel *chan;
                   1528: 
                   1529:        for (i = 0; i < nb_channels; i++, current_channel++) {
                   1530: 
                   1531:                chan = malloc(sizeof(struct ide_channel));
                   1532: 
                   1533:                snprintf(chan->name, sizeof(chan->name),
                   1534:                         DEV_NAME, current_channel);
                   1535: 
                   1536:                chan->mmio = addr + MACIO_IDE_OFFSET + i * MACIO_IDE_SIZE;
                   1537: 
                   1538:                chan->obide_inb = macio_ide_inb;
                   1539:                chan->obide_insw = macio_ide_insw;
                   1540:                chan->obide_outb = macio_ide_outb;
                   1541:                chan->obide_outsw = macio_ide_outsw;
                   1542: 
                   1543:                chan->selected = -1;
                   1544: 
                   1545:                /*
                   1546:                 * assume it's there, if not io port dead check will clear
                   1547:                 */
                   1548:                chan->present = 1;
                   1549: 
                   1550:                for (j = 0; j < 2; j++) {
                   1551:                        chan->drives[j].present = 0;
                   1552:                        chan->drives[j].unit = j;
                   1553:                        chan->drives[j].channel = chan;
                   1554:                        /* init with a decent value */
                   1555:                        chan->drives[j].bs = 512;
                   1556: 
                   1557:                        chan->drives[j].nr = i * 2 + j;
                   1558:                }
                   1559: 
                   1560:                ob_ide_probe(chan);
                   1561: 
                   1562:                if (!chan->present) {
                   1563:                        free(chan);
                   1564:                        continue;
                   1565:                }
                   1566: 
                   1567:                ide_add_channel(chan);
                   1568: 
                   1569:                ob_ide_identify_drives(chan);
                   1570: 
                   1571:                 snprintf(nodebuff, sizeof(nodebuff), "%s/" DEV_NAME, path,
                   1572:                          current_channel);
                   1573:                REGISTER_NAMED_NODE(ob_ide_ctrl, nodebuff);
                   1574: 
                   1575:                dnode = find_dev(nodebuff);
                   1576: 
                   1577:                set_property(dnode, "compatible", "heathrow-ata", 13);
                   1578: 
                   1579:                props[0] = 0x00000526;
                   1580:                props[1] = 0x00000085;
                   1581:                props[2] = 0x00000025;
                   1582:                props[3] = 0x00000025;
                   1583:                props[4] = 0x00000025;
                   1584:                props[5] = 0x00000000;
                   1585:                props[6] = 0x00000000;
                   1586:                props[7] = 0x00000000;
                   1587:                OLDWORLD(set_property(dnode, "AAPL,pio-timing",
                   1588:                                      (char *)&props, 8*sizeof(props[0])));
                   1589: 
                   1590:                /* The first interrupt entry is the ide interrupt, the second
                   1591:                   the dbdma interrupt */
                   1592:                switch (i) {
                   1593:                case 0:
                   1594:                        props[0] = 0x0000000d;
                   1595:                        props[2] = 0x00000002;
                   1596:                        break;
                   1597:                case 1:
                   1598:                        props[0] = 0x0000000e;
                   1599:                        props[2] = 0x00000003;
                   1600:                        break;
                   1601:                case 2:
                   1602:                        props[0] = 0x0000000f;
                   1603:                        props[2] = 0x00000004;
                   1604:                        break;
                   1605:                default:
                   1606:                        props[0] = 0x00000000;
                   1607:                        props[2] = 0x00000000;
                   1608:                        break;
                   1609:                }
                   1610:                props[1] = 0x00000000; /* XXX level triggered on real hw */
                   1611:                props[3] = 0x00000000;
                   1612:                set_property(dnode, "interrupts",
                   1613:                             (char *)&props, 4*sizeof(props[0]));
                   1614:                set_int_property(dnode, "#interrupt-cells", 2);
                   1615:                OLDWORLD(set_property(dnode, "AAPL,interrupts",
                   1616:                                      (char *)&props, 2*sizeof(props[0])));
                   1617: 
                   1618:                props[0] = MACIO_IDE_OFFSET + i * MACIO_IDE_SIZE;
                   1619:                props[1] = MACIO_IDE_SIZE;
                   1620:                props[2] = 0x00008b00 + i * 0x0200;
                   1621:                props[3] = 0x0200;
                   1622:                set_property(dnode, "reg", (char *)&props, 4*sizeof(props[0]));
                   1623: 
                   1624:                props[0] = addr + MACIO_IDE_OFFSET  + i * MACIO_IDE_SIZE;
                   1625:                props[1] = addr + 0x00008b00 + i * 0x0200;
                   1626:                OLDWORLD(set_property(dnode, "AAPL,address",
                   1627:                                      (char *)&props, 2*sizeof(props[0])));
                   1628: 
                   1629:                props[0] = 0;
                   1630:                OLDWORLD(set_property(dnode, "AAPL,bus-id", (char*)props,
                   1631:                         1 * sizeof(props[0])));
                   1632:                IDE_DPRINTF(DEV_NAME": [io ports 0x%lx]\n",
                   1633:                            current_channel, chan->mmio);
                   1634: 
                   1635:                for (j = 0; j < 2; j++) {
                   1636:                        struct ide_drive *drive = &chan->drives[j];
                   1637:                         const char *media = "UNKNOWN";
                   1638: 
                   1639:                        if (!drive->present)
                   1640:                                continue;
                   1641: 
                   1642:                        IDE_DPRINTF("    drive%d [ATA%s ", j,
                   1643:                                    drive->type == ide_type_atapi ? "PI" : "");
                   1644:                        switch (drive->media) {
                   1645:                                case ide_media_floppy:
                   1646:                                        media = "floppy";
                   1647:                                        break;
                   1648:                                case ide_media_cdrom:
                   1649:                                        media = "cdrom";
                   1650:                                        break;
                   1651:                                case ide_media_optical:
                   1652:                                        media = "mo";
                   1653:                                        break;
                   1654:                                case ide_media_disk:
                   1655:                                        media = "disk";
                   1656:                                        break;
                   1657:                        }
                   1658:                        IDE_DPRINTF("%s]: %s\n", media, drive->model);
                   1659:                         snprintf(nodebuff, sizeof(nodebuff),
                   1660:                                  "%s/" DEV_NAME "/%s", path, current_channel,
                   1661:                                  media);
                   1662:                        REGISTER_NAMED_NODE(ob_ide, nodebuff);
                   1663:                        dnode = find_dev(nodebuff);
                   1664:                        set_int_property(dnode, "reg", j);
                   1665: 
                   1666:                        /* create aliases */
                   1667: 
                   1668:                        set_ide_alias(nodebuff);
                   1669:                        if (drive->media == ide_media_cdrom)
                   1670:                                set_cd_alias(nodebuff);
                   1671:                        if (drive->media == ide_media_disk)
                   1672:                                set_hd_alias(nodebuff);
                   1673:                }
                   1674:        }
                   1675: 
                   1676:        return 0;
                   1677: }
                   1678: #endif /* CONFIG_DRIVER_MACIO */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.