uboot/common/cmd_ide.c
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2000-2005
   3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   4 *
   5 * See file CREDITS for list of people who contributed to this
   6 * project.
   7 *
   8 * This program is free software; you can redistribute it and/or
   9 * modify it under the terms of the GNU General Public License as
  10 * published by the Free Software Foundation; either version 2 of
  11 * the License, or (at your option) any later version.
  12 *
  13 * This program is distributed in the hope that it will be useful,
  14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 * GNU General Public License for more details.
  17 *
  18 * You should have received a copy of the GNU General Public License
  19 * along with this program; if not, write to the Free Software
  20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  21 * MA 02111-1307 USA
  22 *
  23 */
  24
  25/*
  26 * IDE support
  27 */
  28#include <common.h>
  29#include <config.h>
  30#include <watchdog.h>
  31#include <command.h>
  32#include <image.h>
  33#include <asm/byteorder.h>
  34#include <asm/io.h>
  35
  36#if defined(CONFIG_IDE_8xx_DIRECT) || defined(CONFIG_IDE_PCMCIA)
  37# include <pcmcia.h>
  38#endif
  39
  40#ifdef CONFIG_8xx
  41# include <mpc8xx.h>
  42#endif
  43
  44#ifdef CONFIG_MPC5xxx
  45#include <mpc5xxx.h>
  46#endif
  47
  48#include <ide.h>
  49#include <ata.h>
  50
  51#ifdef CONFIG_STATUS_LED
  52# include <status_led.h>
  53#endif
  54
  55#ifdef CONFIG_IDE_8xx_DIRECT
  56DECLARE_GLOBAL_DATA_PTR;
  57#endif
  58
  59#ifdef __PPC__
  60# define EIEIO          __asm__ volatile ("eieio")
  61# define SYNC           __asm__ volatile ("sync")
  62#else
  63# define EIEIO          /* nothing */
  64# define SYNC           /* nothing */
  65#endif
  66
  67#ifdef CONFIG_IDE_8xx_DIRECT
  68/* Timings for IDE Interface
  69 *
  70 * SETUP / LENGTH / HOLD - cycles valid for 50 MHz clk
  71 * 70      165      30     PIO-Mode 0, [ns]
  72 *  4        9       2                 [Cycles]
  73 * 50      125      20     PIO-Mode 1, [ns]
  74 *  3        7       2                 [Cycles]
  75 * 30      100      15     PIO-Mode 2, [ns]
  76 *  2        6       1                 [Cycles]
  77 * 30       80      10     PIO-Mode 3, [ns]
  78 *  2        5       1                 [Cycles]
  79 * 25       70      10     PIO-Mode 4, [ns]
  80 *  2        4       1                 [Cycles]
  81 */
  82
  83const static pio_config_t pio_config_ns [IDE_MAX_PIO_MODE+1] =
  84{
  85    /*  Setup  Length  Hold  */
  86        { 70,   165,    30 },           /* PIO-Mode 0, [ns]     */
  87        { 50,   125,    20 },           /* PIO-Mode 1, [ns]     */
  88        { 30,   101,    15 },           /* PIO-Mode 2, [ns]     */
  89        { 30,    80,    10 },           /* PIO-Mode 3, [ns]     */
  90        { 25,    70,    10 },           /* PIO-Mode 4, [ns]     */
  91};
  92
  93static pio_config_t pio_config_clk [IDE_MAX_PIO_MODE+1];
  94
  95#ifndef CONFIG_SYS_PIO_MODE
  96#define CONFIG_SYS_PIO_MODE     0               /* use a relaxed default */
  97#endif
  98static int pio_mode = CONFIG_SYS_PIO_MODE;
  99
 100/* Make clock cycles and always round up */
 101
 102#define PCMCIA_MK_CLKS( t, T ) (( (t) * (T) + 999U ) / 1000U )
 103
 104#endif /* CONFIG_IDE_8xx_DIRECT */
 105
 106/* ------------------------------------------------------------------------- */
 107
 108/* Current I/O Device   */
 109static int curr_device = -1;
 110
 111/* Current offset for IDE0 / IDE1 bus access    */
 112ulong ide_bus_offset[CONFIG_SYS_IDE_MAXBUS] = {
 113#if defined(CONFIG_SYS_ATA_IDE0_OFFSET)
 114        CONFIG_SYS_ATA_IDE0_OFFSET,
 115#endif
 116#if defined(CONFIG_SYS_ATA_IDE1_OFFSET) && (CONFIG_SYS_IDE_MAXBUS > 1)
 117        CONFIG_SYS_ATA_IDE1_OFFSET,
 118#endif
 119};
 120
 121
 122#ifndef CONFIG_AMIGAONEG3SE
 123static int ide_bus_ok[CONFIG_SYS_IDE_MAXBUS];
 124#else
 125static int ide_bus_ok[CONFIG_SYS_IDE_MAXBUS] = {0,};
 126#endif
 127
 128block_dev_desc_t ide_dev_desc[CONFIG_SYS_IDE_MAXDEVICE];
 129/* ------------------------------------------------------------------------- */
 130
 131#ifdef CONFIG_IDE_LED
 132#if !defined(CONFIG_KUP4K) &&  !defined(CONFIG_KUP4X) &&!defined(CONFIG_BMS2003) &&!defined(CONFIG_CPC45)
 133static void  ide_led   (uchar led, uchar status);
 134#else
 135extern void  ide_led   (uchar led, uchar status);
 136#endif
 137#else
 138#ifndef CONFIG_AMIGAONEG3SE
 139#define ide_led(a,b)    /* dummy */
 140#else
 141extern void ide_led(uchar led, uchar status);
 142#define LED_IDE1  1
 143#define LED_IDE2  2
 144#define CONFIG_IDE_LED 1
 145#define DEVICE_LED(x) 1
 146#endif
 147#endif
 148
 149#ifdef CONFIG_IDE_RESET
 150static void  ide_reset (void);
 151#else
 152#define ide_reset()     /* dummy */
 153#endif
 154
 155static void  ide_ident (block_dev_desc_t *dev_desc);
 156static uchar ide_wait  (int dev, ulong t);
 157
 158#define IDE_TIME_OUT    2000    /* 2 sec timeout */
 159
 160#define ATAPI_TIME_OUT  7000    /* 7 sec timeout (5 sec seems to work...) */
 161
 162#define IDE_SPIN_UP_TIME_OUT 5000 /* 5 sec spin-up timeout */
 163
 164static void input_data(int dev, ulong *sect_buf, int words);
 165static void output_data(int dev, ulong *sect_buf, int words);
 166static void ident_cpy (unsigned char *dest, unsigned char *src, unsigned int len);
 167
 168#ifndef CONFIG_SYS_ATA_PORT_ADDR
 169#define CONFIG_SYS_ATA_PORT_ADDR(port) (port)
 170#endif
 171
 172#ifdef CONFIG_ATAPI
 173static void     atapi_inquiry(block_dev_desc_t *dev_desc);
 174ulong atapi_read (int device, lbaint_t blknr, ulong blkcnt, void *buffer);
 175#endif
 176
 177
 178#ifdef CONFIG_IDE_8xx_DIRECT
 179static void set_pcmcia_timing (int pmode);
 180#endif
 181
 182/* ------------------------------------------------------------------------- */
 183
 184int do_ide (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 185{
 186    int rcode = 0;
 187
 188    switch (argc) {
 189    case 0:
 190    case 1:
 191        cmd_usage(cmdtp);
 192        return 1;
 193    case 2:
 194        if (strncmp(argv[1],"res",3) == 0) {
 195                puts ("\nReset IDE"
 196#ifdef CONFIG_IDE_8xx_DIRECT
 197                        " on PCMCIA " PCMCIA_SLOT_MSG
 198#endif
 199                        ": ");
 200
 201                ide_init ();
 202                return 0;
 203        } else if (strncmp(argv[1],"inf",3) == 0) {
 204                int i;
 205
 206                putc ('\n');
 207
 208                for (i=0; i<CONFIG_SYS_IDE_MAXDEVICE; ++i) {
 209                        if (ide_dev_desc[i].type==DEV_TYPE_UNKNOWN)
 210                                continue; /* list only known devices */
 211                        printf ("IDE device %d: ", i);
 212                        dev_print(&ide_dev_desc[i]);
 213                }
 214                return 0;
 215
 216        } else if (strncmp(argv[1],"dev",3) == 0) {
 217                if ((curr_device < 0) || (curr_device >= CONFIG_SYS_IDE_MAXDEVICE)) {
 218                        puts ("\nno IDE devices available\n");
 219                        return 1;
 220                }
 221                printf ("\nIDE device %d: ", curr_device);
 222                dev_print(&ide_dev_desc[curr_device]);
 223                return 0;
 224        } else if (strncmp(argv[1],"part",4) == 0) {
 225                int dev, ok;
 226
 227                for (ok=0, dev=0; dev<CONFIG_SYS_IDE_MAXDEVICE; ++dev) {
 228                        if (ide_dev_desc[dev].part_type!=PART_TYPE_UNKNOWN) {
 229                                ++ok;
 230                                if (dev)
 231                                        putc ('\n');
 232                                print_part(&ide_dev_desc[dev]);
 233                        }
 234                }
 235                if (!ok) {
 236                        puts ("\nno IDE devices available\n");
 237                        rcode ++;
 238                }
 239                return rcode;
 240        }
 241        cmd_usage(cmdtp);
 242        return 1;
 243    case 3:
 244        if (strncmp(argv[1],"dev",3) == 0) {
 245                int dev = (int)simple_strtoul(argv[2], NULL, 10);
 246
 247                printf ("\nIDE device %d: ", dev);
 248                if (dev >= CONFIG_SYS_IDE_MAXDEVICE) {
 249                        puts ("unknown device\n");
 250                        return 1;
 251                }
 252                dev_print(&ide_dev_desc[dev]);
 253                /*ide_print (dev);*/
 254
 255                if (ide_dev_desc[dev].type == DEV_TYPE_UNKNOWN) {
 256                        return 1;
 257                }
 258
 259                curr_device = dev;
 260
 261                puts ("... is now current device\n");
 262
 263                return 0;
 264        } else if (strncmp(argv[1],"part",4) == 0) {
 265                int dev = (int)simple_strtoul(argv[2], NULL, 10);
 266
 267                if (ide_dev_desc[dev].part_type!=PART_TYPE_UNKNOWN) {
 268                                print_part(&ide_dev_desc[dev]);
 269                } else {
 270                        printf ("\nIDE device %d not available\n", dev);
 271                        rcode = 1;
 272                }
 273                return rcode;
 274#if 0
 275        } else if (strncmp(argv[1],"pio",4) == 0) {
 276                int mode = (int)simple_strtoul(argv[2], NULL, 10);
 277
 278                if ((mode >= 0) && (mode <= IDE_MAX_PIO_MODE)) {
 279                        puts ("\nSetting ");
 280                        pio_mode = mode;
 281                        ide_init ();
 282                } else {
 283                        printf ("\nInvalid PIO mode %d (0 ... %d only)\n",
 284                                mode, IDE_MAX_PIO_MODE);
 285                }
 286                return;
 287#endif
 288        }
 289
 290        cmd_usage(cmdtp);
 291        return 1;
 292    default:
 293        /* at least 4 args */
 294
 295        if (strcmp(argv[1],"read") == 0) {
 296                ulong addr = simple_strtoul(argv[2], NULL, 16);
 297                ulong cnt  = simple_strtoul(argv[4], NULL, 16);
 298                ulong n;
 299#ifdef CONFIG_SYS_64BIT_LBA
 300                lbaint_t blk  = simple_strtoull(argv[3], NULL, 16);
 301
 302                printf ("\nIDE read: device %d block # %Ld, count %ld ... ",
 303                        curr_device, blk, cnt);
 304#else
 305                lbaint_t blk  = simple_strtoul(argv[3], NULL, 16);
 306
 307                printf ("\nIDE read: device %d block # %ld, count %ld ... ",
 308                        curr_device, blk, cnt);
 309#endif
 310
 311                n = ide_dev_desc[curr_device].block_read (curr_device,
 312                                                          blk, cnt,
 313                                                          (ulong *)addr);
 314                /* flush cache after read */
 315                flush_cache (addr, cnt*ide_dev_desc[curr_device].blksz);
 316
 317                printf ("%ld blocks read: %s\n",
 318                        n, (n==cnt) ? "OK" : "ERROR");
 319                if (n==cnt) {
 320                        return 0;
 321                } else {
 322                        return 1;
 323                }
 324        } else if (strcmp(argv[1],"write") == 0) {
 325                ulong addr = simple_strtoul(argv[2], NULL, 16);
 326                ulong cnt  = simple_strtoul(argv[4], NULL, 16);
 327                ulong n;
 328#ifdef CONFIG_SYS_64BIT_LBA
 329                lbaint_t blk  = simple_strtoull(argv[3], NULL, 16);
 330
 331                printf ("\nIDE write: device %d block # %Ld, count %ld ... ",
 332                        curr_device, blk, cnt);
 333#else
 334                lbaint_t blk  = simple_strtoul(argv[3], NULL, 16);
 335
 336                printf ("\nIDE write: device %d block # %ld, count %ld ... ",
 337                        curr_device, blk, cnt);
 338#endif
 339
 340                n = ide_write (curr_device, blk, cnt, (ulong *)addr);
 341
 342                printf ("%ld blocks written: %s\n",
 343                        n, (n==cnt) ? "OK" : "ERROR");
 344                if (n==cnt) {
 345                        return 0;
 346                } else {
 347                        return 1;
 348                }
 349        } else {
 350                cmd_usage(cmdtp);
 351                rcode = 1;
 352        }
 353
 354        return rcode;
 355    }
 356}
 357
 358int do_diskboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 359{
 360        char *boot_device = NULL;
 361        char *ep;
 362        int dev, part = 0;
 363        ulong addr, cnt;
 364        disk_partition_t info;
 365        image_header_t *hdr;
 366        int rcode = 0;
 367#if defined(CONFIG_FIT)
 368        const void *fit_hdr = NULL;
 369#endif
 370
 371        show_boot_progress (41);
 372        switch (argc) {
 373        case 1:
 374                addr = CONFIG_SYS_LOAD_ADDR;
 375                boot_device = getenv ("bootdevice");
 376                break;
 377        case 2:
 378                addr = simple_strtoul(argv[1], NULL, 16);
 379                boot_device = getenv ("bootdevice");
 380                break;
 381        case 3:
 382                addr = simple_strtoul(argv[1], NULL, 16);
 383                boot_device = argv[2];
 384                break;
 385        default:
 386                cmd_usage(cmdtp);
 387                show_boot_progress (-42);
 388                return 1;
 389        }
 390        show_boot_progress (42);
 391
 392        if (!boot_device) {
 393                puts ("\n** No boot device **\n");
 394                show_boot_progress (-43);
 395                return 1;
 396        }
 397        show_boot_progress (43);
 398
 399        dev = simple_strtoul(boot_device, &ep, 16);
 400
 401        if (ide_dev_desc[dev].type==DEV_TYPE_UNKNOWN) {
 402                printf ("\n** Device %d not available\n", dev);
 403                show_boot_progress (-44);
 404                return 1;
 405        }
 406        show_boot_progress (44);
 407
 408        if (*ep) {
 409                if (*ep != ':') {
 410                        puts ("\n** Invalid boot device, use `dev[:part]' **\n");
 411                        show_boot_progress (-45);
 412                        return 1;
 413                }
 414                part = simple_strtoul(++ep, NULL, 16);
 415        }
 416        show_boot_progress (45);
 417        if (get_partition_info (&ide_dev_desc[dev], part, &info)) {
 418                show_boot_progress (-46);
 419                return 1;
 420        }
 421        show_boot_progress (46);
 422        if ((strncmp((char *)info.type, BOOT_PART_TYPE, sizeof(info.type)) != 0) &&
 423            (strncmp((char *)info.type, BOOT_PART_COMP, sizeof(info.type)) != 0)) {
 424                printf ("\n** Invalid partition type \"%.32s\""
 425                        " (expect \"" BOOT_PART_TYPE "\")\n",
 426                        info.type);
 427                show_boot_progress (-47);
 428                return 1;
 429        }
 430        show_boot_progress (47);
 431
 432        printf ("\nLoading from IDE device %d, partition %d: "
 433                "Name: %.32s  Type: %.32s\n",
 434                dev, part, info.name, info.type);
 435
 436        debug ("First Block: %ld,  # of blocks: %ld, Block Size: %ld\n",
 437                info.start, info.size, info.blksz);
 438
 439        if (ide_dev_desc[dev].block_read (dev, info.start, 1, (ulong *)addr) != 1) {
 440                printf ("** Read error on %d:%d\n", dev, part);
 441                show_boot_progress (-48);
 442                return 1;
 443        }
 444        show_boot_progress (48);
 445
 446        switch (genimg_get_format ((void *)addr)) {
 447        case IMAGE_FORMAT_LEGACY:
 448                hdr = (image_header_t *)addr;
 449
 450                show_boot_progress (49);
 451
 452                if (!image_check_hcrc (hdr)) {
 453                        puts ("\n** Bad Header Checksum **\n");
 454                        show_boot_progress (-50);
 455                        return 1;
 456                }
 457                show_boot_progress (50);
 458
 459                image_print_contents (hdr);
 460
 461                cnt = image_get_image_size (hdr);
 462                break;
 463#if defined(CONFIG_FIT)
 464        case IMAGE_FORMAT_FIT:
 465                fit_hdr = (const void *)addr;
 466                puts ("Fit image detected...\n");
 467
 468                cnt = fit_get_size (fit_hdr);
 469                break;
 470#endif
 471        default:
 472                show_boot_progress (-49);
 473                puts ("** Unknown image type\n");
 474                return 1;
 475        }
 476
 477        cnt += info.blksz - 1;
 478        cnt /= info.blksz;
 479        cnt -= 1;
 480
 481        if (ide_dev_desc[dev].block_read (dev, info.start+1, cnt,
 482                      (ulong *)(addr+info.blksz)) != cnt) {
 483                printf ("** Read error on %d:%d\n", dev, part);
 484                show_boot_progress (-51);
 485                return 1;
 486        }
 487        show_boot_progress (51);
 488
 489#if defined(CONFIG_FIT)
 490        /* This cannot be done earlier, we need complete FIT image in RAM first */
 491        if (genimg_get_format ((void *)addr) == IMAGE_FORMAT_FIT) {
 492                if (!fit_check_format (fit_hdr)) {
 493                        show_boot_progress (-140);
 494                        puts ("** Bad FIT image format\n");
 495                        return 1;
 496                }
 497                show_boot_progress (141);
 498                fit_print_contents (fit_hdr);
 499        }
 500#endif
 501
 502        /* Loading ok, update default load address */
 503
 504        load_addr = addr;
 505
 506        /* Check if we should attempt an auto-start */
 507        if (((ep = getenv("autostart")) != NULL) && (strcmp(ep,"yes") == 0)) {
 508                char *local_args[2];
 509                extern int do_bootm (cmd_tbl_t *, int, int, char *[]);
 510
 511                local_args[0] = argv[0];
 512                local_args[1] = NULL;
 513
 514                printf ("Automatic boot of image at addr 0x%08lX ...\n", addr);
 515
 516                do_bootm (cmdtp, 0, 1, local_args);
 517                rcode = 1;
 518        }
 519        return rcode;
 520}
 521
 522/* ------------------------------------------------------------------------- */
 523
 524void inline
 525__ide_outb(int dev, int port, unsigned char val)
 526{
 527        debug ("ide_outb (dev= %d, port= 0x%x, val= 0x%02x) : @ 0x%08lx\n",
 528                dev, port, val, (ATA_CURR_BASE(dev)+CONFIG_SYS_ATA_PORT_ADDR(port)));
 529        outb(val, (ATA_CURR_BASE(dev)+CONFIG_SYS_ATA_PORT_ADDR(port)));
 530}
 531void ide_outb (int dev, int port, unsigned char val)
 532                __attribute__((weak, alias("__ide_outb")));
 533
 534unsigned char inline
 535__ide_inb(int dev, int port)
 536{
 537        uchar val;
 538        val = inb((ATA_CURR_BASE(dev)+CONFIG_SYS_ATA_PORT_ADDR(port)));
 539        debug ("ide_inb (dev= %d, port= 0x%x) : @ 0x%08lx -> 0x%02x\n",
 540                dev, port, (ATA_CURR_BASE(dev)+CONFIG_SYS_ATA_PORT_ADDR(port)), val);
 541        return val;
 542}
 543unsigned char ide_inb(int dev, int port)
 544                        __attribute__((weak, alias("__ide_inb")));
 545
 546#ifdef CONFIG_TUNE_PIO
 547int inline
 548__ide_set_piomode(int pio_mode)
 549{
 550        return 0;
 551}
 552int inline ide_set_piomode(int pio_mode)
 553                        __attribute__((weak, alias("__ide_set_piomode")));
 554#endif
 555
 556void ide_init (void)
 557{
 558
 559#ifdef CONFIG_IDE_8xx_DIRECT
 560        volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
 561        volatile pcmconf8xx_t *pcmp = &(immr->im_pcmcia);
 562#endif
 563        unsigned char c;
 564        int i, bus;
 565#if defined(CONFIG_AMIGAONEG3SE) || defined(CONFIG_SC3)
 566        unsigned int ata_reset_time = ATA_RESET_TIME;
 567        char *s;
 568#endif
 569#ifdef CONFIG_AMIGAONEG3SE
 570        unsigned int max_bus_scan;
 571#endif
 572#ifdef CONFIG_IDE_8xx_PCCARD
 573        extern int pcmcia_on (void);
 574        extern int ide_devices_found; /* Initialized in check_ide_device() */
 575#endif  /* CONFIG_IDE_8xx_PCCARD */
 576
 577#ifdef CONFIG_IDE_PREINIT
 578        extern int ide_preinit (void);
 579        WATCHDOG_RESET();
 580
 581        if (ide_preinit ()) {
 582                puts ("ide_preinit failed\n");
 583                return;
 584        }
 585#endif  /* CONFIG_IDE_PREINIT */
 586
 587#ifdef CONFIG_IDE_8xx_PCCARD
 588        extern int pcmcia_on (void);
 589        extern int ide_devices_found; /* Initialized in check_ide_device() */
 590
 591        WATCHDOG_RESET();
 592
 593        ide_devices_found = 0;
 594        /* initialize the PCMCIA IDE adapter card */
 595        pcmcia_on();
 596        if (!ide_devices_found)
 597                return;
 598        udelay (1000000);       /* 1 s */
 599#endif  /* CONFIG_IDE_8xx_PCCARD */
 600
 601        WATCHDOG_RESET();
 602
 603#ifdef CONFIG_IDE_8xx_DIRECT
 604        /* Initialize PIO timing tables */
 605        for (i=0; i <= IDE_MAX_PIO_MODE; ++i) {
 606                pio_config_clk[i].t_setup  = PCMCIA_MK_CLKS(pio_config_ns[i].t_setup,
 607                                                                gd->bus_clk);
 608                pio_config_clk[i].t_length = PCMCIA_MK_CLKS(pio_config_ns[i].t_length,
 609                                                                gd->bus_clk);
 610                pio_config_clk[i].t_hold   = PCMCIA_MK_CLKS(pio_config_ns[i].t_hold,
 611                                                                gd->bus_clk);
 612                debug ( "PIO Mode %d: setup=%2d ns/%d clk"
 613                        "  len=%3d ns/%d clk"
 614                        "  hold=%2d ns/%d clk\n",
 615                        i,
 616                        pio_config_ns[i].t_setup,  pio_config_clk[i].t_setup,
 617                        pio_config_ns[i].t_length, pio_config_clk[i].t_length,
 618                        pio_config_ns[i].t_hold,   pio_config_clk[i].t_hold);
 619        }
 620#endif /* CONFIG_IDE_8xx_DIRECT */
 621
 622        /* Reset the IDE just to be sure.
 623         * Light LED's to show
 624         */
 625        ide_led ((LED_IDE1 | LED_IDE2), 1);             /* LED's on     */
 626        ide_reset (); /* ATAPI Drives seems to need a proper IDE Reset */
 627
 628#ifdef CONFIG_IDE_8xx_DIRECT
 629        /* PCMCIA / IDE initialization for common mem space */
 630        pcmp->pcmc_pgcrb = 0;
 631
 632        /* start in PIO mode 0 - most relaxed timings */
 633        pio_mode = 0;
 634        set_pcmcia_timing (pio_mode);
 635#endif /* CONFIG_IDE_8xx_DIRECT */
 636
 637        /*
 638         * Wait for IDE to get ready.
 639         * According to spec, this can take up to 31 seconds!
 640         */
 641#ifndef CONFIG_AMIGAONEG3SE
 642        for (bus=0; bus<CONFIG_SYS_IDE_MAXBUS; ++bus) {
 643                int dev = bus * (CONFIG_SYS_IDE_MAXDEVICE / CONFIG_SYS_IDE_MAXBUS);
 644#else
 645        s = getenv("ide_maxbus");
 646        if (s)
 647                max_bus_scan = simple_strtol(s, NULL, 10);
 648        else
 649                max_bus_scan = CONFIG_SYS_IDE_MAXBUS;
 650
 651        for (bus=0; bus<max_bus_scan; ++bus) {
 652                int dev = bus * (CONFIG_SYS_IDE_MAXDEVICE / max_bus_scan);
 653#endif
 654
 655#ifdef CONFIG_IDE_8xx_PCCARD
 656                /* Skip non-ide devices from probing */
 657                if ((ide_devices_found & (1 << bus)) == 0) {
 658                        ide_led ((LED_IDE1 | LED_IDE2), 0); /* LED's off */
 659                        continue;
 660                }
 661#endif
 662                printf ("Bus %d: ", bus);
 663
 664                ide_bus_ok[bus] = 0;
 665
 666                /* Select device
 667                 */
 668                udelay (100000);                /* 100 ms */
 669                ide_outb (dev, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(dev));
 670                udelay (100000);                /* 100 ms */
 671#if defined(CONFIG_AMIGAONEG3SE) || defined(CONFIG_SC3)
 672                if ((s = getenv("ide_reset_timeout")) != NULL)
 673                        ata_reset_time = simple_strtol(s, NULL, 10);
 674#endif
 675                i = 0;
 676                do {
 677                        udelay (10000);         /* 10 ms */
 678
 679                        c = ide_inb (dev, ATA_STATUS);
 680                        i++;
 681#if defined(CONFIG_AMIGAONEG3SE) || defined(CONFIG_SC3)
 682                        if (i > (ata_reset_time * 100)) {
 683#else
 684                        if (i > (ATA_RESET_TIME * 100)) {
 685#endif
 686                                puts ("** Timeout **\n");
 687                                ide_led ((LED_IDE1 | LED_IDE2), 0); /* LED's off */
 688#ifdef CONFIG_AMIGAONEG3SE
 689                                /* If this is the second bus, the first one was OK */
 690                                if (bus != 0) {
 691                                        ide_bus_ok[bus] = 0;
 692                                        goto skip_bus;
 693                                }
 694#endif
 695                                return;
 696                        }
 697                        if ((i >= 100) && ((i%100)==0)) {
 698                                putc ('.');
 699                        }
 700                } while (c & ATA_STAT_BUSY);
 701
 702                if (c & (ATA_STAT_BUSY | ATA_STAT_FAULT)) {
 703                        puts ("not available  ");
 704                        debug ("Status = 0x%02X ", c);
 705#ifndef CONFIG_ATAPI /* ATAPI Devices do not set DRDY */
 706                } else  if ((c & ATA_STAT_READY) == 0) {
 707                        puts ("not available  ");
 708                        debug ("Status = 0x%02X ", c);
 709#endif
 710                } else {
 711                        puts ("OK ");
 712                        ide_bus_ok[bus] = 1;
 713                }
 714                WATCHDOG_RESET();
 715        }
 716
 717#ifdef CONFIG_AMIGAONEG3SE
 718      skip_bus:
 719#endif
 720        putc ('\n');
 721
 722        ide_led ((LED_IDE1 | LED_IDE2), 0);     /* LED's off    */
 723
 724        curr_device = -1;
 725        for (i=0; i<CONFIG_SYS_IDE_MAXDEVICE; ++i) {
 726#ifdef CONFIG_IDE_LED
 727                int led = (IDE_BUS(i) == 0) ? LED_IDE1 : LED_IDE2;
 728#endif
 729                ide_dev_desc[i].type=DEV_TYPE_UNKNOWN;
 730                ide_dev_desc[i].if_type=IF_TYPE_IDE;
 731                ide_dev_desc[i].dev=i;
 732                ide_dev_desc[i].part_type=PART_TYPE_UNKNOWN;
 733                ide_dev_desc[i].blksz=0;
 734                ide_dev_desc[i].lba=0;
 735                ide_dev_desc[i].block_read=ide_read;
 736                if (!ide_bus_ok[IDE_BUS(i)])
 737                        continue;
 738                ide_led (led, 1);               /* LED on       */
 739                ide_ident(&ide_dev_desc[i]);
 740                ide_led (led, 0);               /* LED off      */
 741                dev_print(&ide_dev_desc[i]);
 742/*              ide_print (i); */
 743                if ((ide_dev_desc[i].lba > 0) && (ide_dev_desc[i].blksz > 0)) {
 744                        init_part (&ide_dev_desc[i]);                   /* initialize partition type */
 745                        if (curr_device < 0)
 746                                curr_device = i;
 747                }
 748        }
 749        WATCHDOG_RESET();
 750}
 751
 752/* ------------------------------------------------------------------------- */
 753
 754block_dev_desc_t * ide_get_dev(int dev)
 755{
 756        return (dev < CONFIG_SYS_IDE_MAXDEVICE) ? &ide_dev_desc[dev] : NULL;
 757}
 758
 759
 760#ifdef CONFIG_IDE_8xx_DIRECT
 761
 762static void
 763set_pcmcia_timing (int pmode)
 764{
 765        volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
 766        volatile pcmconf8xx_t *pcmp = &(immr->im_pcmcia);
 767        ulong timings;
 768
 769        debug ("Set timing for PIO Mode %d\n", pmode);
 770
 771        timings = PCMCIA_SHT(pio_config_clk[pmode].t_hold)
 772                | PCMCIA_SST(pio_config_clk[pmode].t_setup)
 773                | PCMCIA_SL (pio_config_clk[pmode].t_length)
 774                ;
 775
 776        /* IDE 0
 777         */
 778        pcmp->pcmc_pbr0 = CONFIG_SYS_PCMCIA_PBR0;
 779        pcmp->pcmc_por0 = CONFIG_SYS_PCMCIA_POR0
 780#if (CONFIG_SYS_PCMCIA_POR0 != 0)
 781                        | timings
 782#endif
 783                        ;
 784        debug ("PBR0: %08x  POR0: %08x\n", pcmp->pcmc_pbr0, pcmp->pcmc_por0);
 785
 786        pcmp->pcmc_pbr1 = CONFIG_SYS_PCMCIA_PBR1;
 787        pcmp->pcmc_por1 = CONFIG_SYS_PCMCIA_POR1
 788#if (CONFIG_SYS_PCMCIA_POR1 != 0)
 789                        | timings
 790#endif
 791                        ;
 792        debug ("PBR1: %08x  POR1: %08x\n", pcmp->pcmc_pbr1, pcmp->pcmc_por1);
 793
 794        pcmp->pcmc_pbr2 = CONFIG_SYS_PCMCIA_PBR2;
 795        pcmp->pcmc_por2 = CONFIG_SYS_PCMCIA_POR2
 796#if (CONFIG_SYS_PCMCIA_POR2 != 0)
 797                        | timings
 798#endif
 799                        ;
 800        debug ("PBR2: %08x  POR2: %08x\n", pcmp->pcmc_pbr2, pcmp->pcmc_por2);
 801
 802        pcmp->pcmc_pbr3 = CONFIG_SYS_PCMCIA_PBR3;
 803        pcmp->pcmc_por3 = CONFIG_SYS_PCMCIA_POR3
 804#if (CONFIG_SYS_PCMCIA_POR3 != 0)
 805                        | timings
 806#endif
 807                        ;
 808        debug ("PBR3: %08x  POR3: %08x\n", pcmp->pcmc_pbr3, pcmp->pcmc_por3);
 809
 810        /* IDE 1
 811         */
 812        pcmp->pcmc_pbr4 = CONFIG_SYS_PCMCIA_PBR4;
 813        pcmp->pcmc_por4 = CONFIG_SYS_PCMCIA_POR4
 814#if (CONFIG_SYS_PCMCIA_POR4 != 0)
 815                        | timings
 816#endif
 817                        ;
 818        debug ("PBR4: %08x  POR4: %08x\n", pcmp->pcmc_pbr4, pcmp->pcmc_por4);
 819
 820        pcmp->pcmc_pbr5 = CONFIG_SYS_PCMCIA_PBR5;
 821        pcmp->pcmc_por5 = CONFIG_SYS_PCMCIA_POR5
 822#if (CONFIG_SYS_PCMCIA_POR5 != 0)
 823                        | timings
 824#endif
 825                        ;
 826        debug ("PBR5: %08x  POR5: %08x\n", pcmp->pcmc_pbr5, pcmp->pcmc_por5);
 827
 828        pcmp->pcmc_pbr6 = CONFIG_SYS_PCMCIA_PBR6;
 829        pcmp->pcmc_por6 = CONFIG_SYS_PCMCIA_POR6
 830#if (CONFIG_SYS_PCMCIA_POR6 != 0)
 831                        | timings
 832#endif
 833                        ;
 834        debug ("PBR6: %08x  POR6: %08x\n", pcmp->pcmc_pbr6, pcmp->pcmc_por6);
 835
 836        pcmp->pcmc_pbr7 = CONFIG_SYS_PCMCIA_PBR7;
 837        pcmp->pcmc_por7 = CONFIG_SYS_PCMCIA_POR7
 838#if (CONFIG_SYS_PCMCIA_POR7 != 0)
 839                        | timings
 840#endif
 841                        ;
 842        debug ("PBR7: %08x  POR7: %08x\n", pcmp->pcmc_pbr7, pcmp->pcmc_por7);
 843
 844}
 845
 846#endif  /* CONFIG_IDE_8xx_DIRECT */
 847
 848/* ------------------------------------------------------------------------- */
 849
 850/* We only need to swap data if we are running on a big endian cpu. */
 851/* But Au1x00 cpu:s already swaps data in big endian mode! */
 852#if defined(__LITTLE_ENDIAN) || ( defined(CONFIG_AU1X00) && !defined(CONFIG_GTH2) )
 853#define input_swap_data(x,y,z) input_data(x,y,z)
 854#else
 855static void
 856input_swap_data(int dev, ulong *sect_buf, int words)
 857{
 858#if defined(CONFIG_HMI10) || defined(CONFIG_CPC45)
 859        uchar i;
 860        volatile uchar *pbuf_even = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_EVEN);
 861        volatile uchar *pbuf_odd  = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_ODD);
 862        ushort  *dbuf = (ushort *)sect_buf;
 863
 864        while (words--) {
 865                for (i=0; i<2; i++) {
 866                        *(((uchar *)(dbuf)) + 1) = *pbuf_even;
 867                        *(uchar *)dbuf = *pbuf_odd;
 868                        dbuf+=1;
 869                }
 870        }
 871#else
 872        volatile ushort *pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG);
 873        ushort  *dbuf = (ushort *)sect_buf;
 874
 875        debug("in input swap data base for read is %lx\n", (unsigned long) pbuf);
 876
 877        while (words--) {
 878#ifdef __MIPS__
 879                *dbuf++ = swab16p((u16*)pbuf);
 880                *dbuf++ = swab16p((u16*)pbuf);
 881#elif defined(CONFIG_PCS440EP)
 882                *dbuf++ = *pbuf;
 883                *dbuf++ = *pbuf;
 884#else
 885                *dbuf++ = ld_le16(pbuf);
 886                *dbuf++ = ld_le16(pbuf);
 887#endif /* !MIPS */
 888        }
 889#endif
 890}
 891#endif  /* __LITTLE_ENDIAN || CONFIG_AU1X00 */
 892
 893
 894#if defined(__PPC__) || defined(CONFIG_PXA_PCMCIA) || defined(CONFIG_SH)
 895static void
 896output_data(int dev, ulong *sect_buf, int words)
 897{
 898#if defined(CONFIG_HMI10) || defined(CONFIG_CPC45)
 899        uchar   *dbuf;
 900        volatile uchar  *pbuf_even;
 901        volatile uchar  *pbuf_odd;
 902
 903        pbuf_even = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_EVEN);
 904        pbuf_odd  = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_ODD);
 905        dbuf = (uchar *)sect_buf;
 906        while (words--) {
 907                EIEIO;
 908                *pbuf_even = *dbuf++;
 909                EIEIO;
 910                *pbuf_odd = *dbuf++;
 911                EIEIO;
 912                *pbuf_even = *dbuf++;
 913                EIEIO;
 914                *pbuf_odd = *dbuf++;
 915        }
 916#else
 917        ushort  *dbuf;
 918        volatile ushort *pbuf;
 919
 920        pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG);
 921        dbuf = (ushort *)sect_buf;
 922        while (words--) {
 923#if defined(CONFIG_PCS440EP)
 924                /* not tested, because CF was write protected */
 925                EIEIO;
 926                *pbuf = ld_le16(dbuf++);
 927                EIEIO;
 928                *pbuf = ld_le16(dbuf++);
 929#else
 930                EIEIO;
 931                *pbuf = *dbuf++;
 932                EIEIO;
 933                *pbuf = *dbuf++;
 934#endif
 935        }
 936#endif
 937}
 938#else   /* ! __PPC__ */
 939static void
 940output_data(int dev, ulong *sect_buf, int words)
 941{
 942        outsw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, words<<1);
 943}
 944#endif  /* __PPC__ */
 945
 946#if defined(__PPC__) || defined(CONFIG_PXA_PCMCIA) || defined(CONFIG_SH)
 947static void
 948input_data(int dev, ulong *sect_buf, int words)
 949{
 950#if defined(CONFIG_HMI10) || defined(CONFIG_CPC45)
 951        uchar   *dbuf;
 952        volatile uchar  *pbuf_even;
 953        volatile uchar  *pbuf_odd;
 954
 955        pbuf_even = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_EVEN);
 956        pbuf_odd  = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_ODD);
 957        dbuf = (uchar *)sect_buf;
 958        while (words--) {
 959                *dbuf++ = *pbuf_even;
 960                EIEIO;
 961                SYNC;
 962                *dbuf++ = *pbuf_odd;
 963                EIEIO;
 964                SYNC;
 965                *dbuf++ = *pbuf_even;
 966                EIEIO;
 967                SYNC;
 968                *dbuf++ = *pbuf_odd;
 969                EIEIO;
 970                SYNC;
 971        }
 972#else
 973        ushort  *dbuf;
 974        volatile ushort *pbuf;
 975
 976        pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG);
 977        dbuf = (ushort *)sect_buf;
 978
 979        debug("in input data base for read is %lx\n", (unsigned long) pbuf);
 980
 981        while (words--) {
 982#if defined(CONFIG_PCS440EP)
 983                EIEIO;
 984                *dbuf++ = ld_le16(pbuf);
 985                EIEIO;
 986                *dbuf++ = ld_le16(pbuf);
 987#else
 988                EIEIO;
 989                *dbuf++ = *pbuf;
 990                EIEIO;
 991                *dbuf++ = *pbuf;
 992#endif
 993        }
 994#endif
 995}
 996#else   /* ! __PPC__ */
 997static void
 998input_data(int dev, ulong *sect_buf, int words)
 999{
1000        insw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, words << 1);
1001}
1002
1003#endif  /* __PPC__ */
1004
1005/* -------------------------------------------------------------------------
1006 */
1007static void ide_ident (block_dev_desc_t *dev_desc)
1008{
1009        ulong iobuf[ATA_SECTORWORDS];
1010        unsigned char c;
1011        hd_driveid_t *iop = (hd_driveid_t *)iobuf;
1012
1013#ifdef CONFIG_AMIGAONEG3SE
1014        int max_bus_scan;
1015        char *s;
1016#endif
1017#ifdef CONFIG_ATAPI
1018        int retries = 0;
1019        int do_retry = 0;
1020#endif
1021
1022#ifdef CONFIG_TUNE_PIO
1023        int pio_mode;
1024#endif
1025
1026#if 0
1027        int mode, cycle_time;
1028#endif
1029        int device;
1030        device=dev_desc->dev;
1031        printf ("  Device %d: ", device);
1032
1033#ifdef CONFIG_AMIGAONEG3SE
1034        s = getenv("ide_maxbus");
1035        if (s) {
1036                max_bus_scan = simple_strtol(s, NULL, 10);
1037        } else {
1038                max_bus_scan = CONFIG_SYS_IDE_MAXBUS;
1039        }
1040        if (device >= max_bus_scan*2) {
1041                dev_desc->type=DEV_TYPE_UNKNOWN;
1042                return;
1043        }
1044#endif
1045
1046        ide_led (DEVICE_LED(device), 1);        /* LED on       */
1047        /* Select device
1048         */
1049        ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
1050        dev_desc->if_type=IF_TYPE_IDE;
1051#ifdef CONFIG_ATAPI
1052
1053    do_retry = 0;
1054    retries = 0;
1055
1056    /* Warning: This will be tricky to read */
1057    while (retries <= 1) {
1058        /* check signature */
1059        if ((ide_inb(device,ATA_SECT_CNT) == 0x01) &&
1060                 (ide_inb(device,ATA_SECT_NUM) == 0x01) &&
1061                 (ide_inb(device,ATA_CYL_LOW)  == 0x14) &&
1062                 (ide_inb(device,ATA_CYL_HIGH) == 0xEB)) {
1063                /* ATAPI Signature found */
1064                dev_desc->if_type=IF_TYPE_ATAPI;
1065                /* Start Ident Command
1066                 */
1067                ide_outb (device, ATA_COMMAND, ATAPI_CMD_IDENT);
1068                /*
1069                 * Wait for completion - ATAPI devices need more time
1070                 * to become ready
1071                 */
1072                c = ide_wait (device, ATAPI_TIME_OUT);
1073        } else
1074#endif
1075        {
1076                /* Start Ident Command
1077                 */
1078                ide_outb (device, ATA_COMMAND, ATA_CMD_IDENT);
1079
1080                /* Wait for completion
1081                 */
1082                c = ide_wait (device, IDE_TIME_OUT);
1083        }
1084        ide_led (DEVICE_LED(device), 0);        /* LED off      */
1085
1086        if (((c & ATA_STAT_DRQ) == 0) ||
1087            ((c & (ATA_STAT_FAULT|ATA_STAT_ERR)) != 0) ) {
1088#ifdef CONFIG_ATAPI
1089#ifdef CONFIG_AMIGAONEG3SE
1090                s = getenv("ide_doreset");
1091                if (s && strcmp(s, "on") == 0)
1092#endif
1093                {
1094                        /* Need to soft reset the device in case it's an ATAPI...  */
1095                        debug ("Retrying...\n");
1096                        ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
1097                        udelay(100000);
1098                        ide_outb (device, ATA_COMMAND, 0x08);
1099                        udelay (500000);        /* 500 ms */
1100                }
1101                /* Select device
1102                 */
1103                ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
1104                retries++;
1105#else
1106                return;
1107#endif
1108        }
1109#ifdef CONFIG_ATAPI
1110        else
1111                break;
1112    }   /* see above - ugly to read */
1113
1114        if (retries == 2) /* Not found */
1115                return;
1116#endif
1117
1118        input_swap_data (device, iobuf, ATA_SECTORWORDS);
1119
1120        ident_cpy ((unsigned char*)dev_desc->revision, iop->fw_rev, sizeof(dev_desc->revision));
1121        ident_cpy ((unsigned char*)dev_desc->vendor, iop->model, sizeof(dev_desc->vendor));
1122        ident_cpy ((unsigned char*)dev_desc->product, iop->serial_no, sizeof(dev_desc->product));
1123#ifdef __LITTLE_ENDIAN
1124        /*
1125         * firmware revision, model, and serial number have Big Endian Byte
1126         * order in Word. Convert all three to little endian.
1127         *
1128         * See CF+ and CompactFlash Specification Revision 2.0:
1129         * 6.2.1.6: Identify Drive, Table 39 for more details
1130         */
1131
1132        strswab (dev_desc->revision);
1133        strswab (dev_desc->vendor);
1134        strswab (dev_desc->product);
1135#endif /* __LITTLE_ENDIAN */
1136
1137        if ((iop->config & 0x0080)==0x0080)
1138                dev_desc->removable = 1;
1139        else
1140                dev_desc->removable = 0;
1141
1142#ifdef CONFIG_TUNE_PIO
1143        /* Mode 0 - 2 only, are directly determined by word 51. */
1144        pio_mode = iop->tPIO;
1145        if (pio_mode > 2) {
1146                printf("WARNING: Invalid PIO (word 51 = %d).\n", pio_mode);
1147                pio_mode = 0; /* Force it to dead slow, and hope for the best... */
1148        }
1149
1150        /* Any CompactFlash Storage Card that supports PIO mode 3 or above
1151         * shall set bit 1 of word 53 to one and support the fields contained
1152         * in words 64 through 70.
1153         */
1154        if (iop->field_valid & 0x02) {
1155                /* Mode 3 and above are possible.  Check in order from slow
1156                 * to fast, so we wind up with the highest mode allowed.
1157                 */
1158                if (iop->eide_pio_modes & 0x01)
1159                        pio_mode = 3;
1160                if (iop->eide_pio_modes & 0x02)
1161                        pio_mode = 4;
1162                if (ata_id_is_cfa((u16 *)iop)) {
1163                        if ((iop->cf_advanced_caps & 0x07) == 0x01)
1164                                pio_mode = 5;
1165                        if ((iop->cf_advanced_caps & 0x07) == 0x02)
1166                                pio_mode = 6;
1167                }
1168        }
1169
1170        /* System-specific, depends on bus speeds, etc. */
1171        ide_set_piomode(pio_mode);
1172#endif /* CONFIG_TUNE_PIO */
1173
1174#if 0
1175        /*
1176         * Drive PIO mode autoselection
1177         */
1178        mode = iop->tPIO;
1179
1180        printf ("tPIO = 0x%02x = %d\n",mode, mode);
1181        if (mode > 2) {         /* 2 is maximum allowed tPIO value */
1182                mode = 2;
1183                debug ("Override tPIO -> 2\n");
1184        }
1185        if (iop->field_valid & 2) {     /* drive implements ATA2? */
1186                debug ("Drive implements ATA2\n");
1187                if (iop->capability & 8) {      /* drive supports use_iordy? */
1188                        cycle_time = iop->eide_pio_iordy;
1189                } else {
1190                        cycle_time = iop->eide_pio;
1191                }
1192                debug ("cycle time = %d\n", cycle_time);
1193                mode = 4;
1194                if (cycle_time > 120) mode = 3; /* 120 ns for PIO mode 4 */
1195                if (cycle_time > 180) mode = 2; /* 180 ns for PIO mode 3 */
1196                if (cycle_time > 240) mode = 1; /* 240 ns for PIO mode 4 */
1197                if (cycle_time > 383) mode = 0; /* 383 ns for PIO mode 4 */
1198        }
1199        printf ("PIO mode to use: PIO %d\n", mode);
1200#endif /* 0 */
1201
1202#ifdef CONFIG_ATAPI
1203        if (dev_desc->if_type==IF_TYPE_ATAPI) {
1204                atapi_inquiry(dev_desc);
1205                return;
1206        }
1207#endif /* CONFIG_ATAPI */
1208
1209#ifdef __BIG_ENDIAN
1210        /* swap shorts */
1211        dev_desc->lba = (iop->lba_capacity << 16) | (iop->lba_capacity >> 16);
1212#else   /* ! __BIG_ENDIAN */
1213        /*
1214         * do not swap shorts on little endian
1215         *
1216         * See CF+ and CompactFlash Specification Revision 2.0:
1217         * 6.2.1.6: Identfy Drive, Table 39, Word Address 57-58 for details.
1218         */
1219        dev_desc->lba = iop->lba_capacity;
1220#endif  /* __BIG_ENDIAN */
1221
1222#ifdef CONFIG_LBA48
1223        if (iop->command_set_2 & 0x0400) { /* LBA 48 support */
1224                dev_desc->lba48 = 1;
1225                dev_desc->lba = (unsigned long long)iop->lba48_capacity[0] |
1226                                                  ((unsigned long long)iop->lba48_capacity[1] << 16) |
1227                                                  ((unsigned long long)iop->lba48_capacity[2] << 32) |
1228                                                  ((unsigned long long)iop->lba48_capacity[3] << 48);
1229        } else {
1230                dev_desc->lba48 = 0;
1231        }
1232#endif /* CONFIG_LBA48 */
1233        /* assuming HD */
1234        dev_desc->type=DEV_TYPE_HARDDISK;
1235        dev_desc->blksz=ATA_BLOCKSIZE;
1236        dev_desc->lun=0; /* just to fill something in... */
1237
1238#if 0   /* only used to test the powersaving mode,
1239         * if enabled, the drive goes after 5 sec
1240         * in standby mode */
1241        ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
1242        c = ide_wait (device, IDE_TIME_OUT);
1243        ide_outb (device, ATA_SECT_CNT, 1);
1244        ide_outb (device, ATA_LBA_LOW,  0);
1245        ide_outb (device, ATA_LBA_MID,  0);
1246        ide_outb (device, ATA_LBA_HIGH, 0);
1247        ide_outb (device, ATA_DEV_HD,   ATA_LBA | ATA_DEVICE(device));
1248        ide_outb (device, ATA_COMMAND,  0xe3);
1249        udelay (50);
1250        c = ide_wait (device, IDE_TIME_OUT);    /* can't take over 500 ms */
1251#endif
1252}
1253
1254
1255/* ------------------------------------------------------------------------- */
1256
1257ulong ide_read (int device, lbaint_t blknr, ulong blkcnt, void *buffer)
1258{
1259        ulong n = 0;
1260        unsigned char c;
1261        unsigned char pwrsave=0; /* power save */
1262#ifdef CONFIG_LBA48
1263        unsigned char lba48 = 0;
1264
1265        if (blknr & 0x0000fffff0000000ULL) {
1266                /* more than 28 bits used, use 48bit mode */
1267                lba48 = 1;
1268        }
1269#endif
1270        debug ("ide_read dev %d start %LX, blocks %lX buffer at %lX\n",
1271                device, blknr, blkcnt, (ulong)buffer);
1272
1273        ide_led (DEVICE_LED(device), 1);        /* LED on       */
1274
1275        /* Select device
1276         */
1277        ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
1278        c = ide_wait (device, IDE_TIME_OUT);
1279
1280        if (c & ATA_STAT_BUSY) {
1281                printf ("IDE read: device %d not ready\n", device);
1282                goto IDE_READ_E;
1283        }
1284
1285        /* first check if the drive is in Powersaving mode, if yes,
1286         * increase the timeout value */
1287        ide_outb (device, ATA_COMMAND,  ATA_CMD_CHK_PWR);
1288        udelay (50);
1289
1290        c = ide_wait (device, IDE_TIME_OUT);    /* can't take over 500 ms */
1291
1292        if (c & ATA_STAT_BUSY) {
1293                printf ("IDE read: device %d not ready\n", device);
1294                goto IDE_READ_E;
1295        }
1296        if ((c & ATA_STAT_ERR) == ATA_STAT_ERR) {
1297                printf ("No Powersaving mode %X\n", c);
1298        } else {
1299                c = ide_inb(device,ATA_SECT_CNT);
1300                debug ("Powersaving %02X\n",c);
1301                if(c==0)
1302                        pwrsave=1;
1303        }
1304
1305
1306        while (blkcnt-- > 0) {
1307
1308                c = ide_wait (device, IDE_TIME_OUT);
1309
1310                if (c & ATA_STAT_BUSY) {
1311                        printf ("IDE read: device %d not ready\n", device);
1312                        break;
1313                }
1314#ifdef CONFIG_LBA48
1315                if (lba48) {
1316                        /* write high bits */
1317                        ide_outb (device, ATA_SECT_CNT, 0);
1318                        ide_outb (device, ATA_LBA_LOW,  (blknr >> 24) & 0xFF);
1319#ifdef CONFIG_SYS_64BIT_LBA
1320                        ide_outb (device, ATA_LBA_MID,  (blknr >> 32) & 0xFF);
1321                        ide_outb (device, ATA_LBA_HIGH, (blknr >> 40) & 0xFF);
1322#else
1323                        ide_outb (device, ATA_LBA_MID,  0);
1324                        ide_outb (device, ATA_LBA_HIGH, 0);
1325#endif
1326                }
1327#endif
1328                ide_outb (device, ATA_SECT_CNT, 1);
1329                ide_outb (device, ATA_LBA_LOW,  (blknr >>  0) & 0xFF);
1330                ide_outb (device, ATA_LBA_MID,  (blknr >>  8) & 0xFF);
1331                ide_outb (device, ATA_LBA_HIGH, (blknr >> 16) & 0xFF);
1332
1333#ifdef CONFIG_LBA48
1334                if (lba48) {
1335                        ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device) );
1336                        ide_outb (device, ATA_COMMAND, ATA_CMD_READ_EXT);
1337
1338                } else
1339#endif
1340                {
1341                        ide_outb (device, ATA_DEV_HD,   ATA_LBA         |
1342                                                    ATA_DEVICE(device)  |
1343                                                    ((blknr >> 24) & 0xF) );
1344                        ide_outb (device, ATA_COMMAND,  ATA_CMD_READ);
1345                }
1346
1347                udelay (50);
1348
1349                if(pwrsave) {
1350                        c = ide_wait (device, IDE_SPIN_UP_TIME_OUT);    /* may take up to 4 sec */
1351                        pwrsave=0;
1352                } else {
1353                        c = ide_wait (device, IDE_TIME_OUT);    /* can't take over 500 ms */
1354                }
1355
1356                if ((c&(ATA_STAT_DRQ|ATA_STAT_BUSY|ATA_STAT_ERR)) != ATA_STAT_DRQ) {
1357#if defined(CONFIG_SYS_64BIT_LBA) && defined(CONFIG_SYS_64BIT_VSPRINTF)
1358                        printf ("Error (no IRQ) dev %d blk %Ld: status 0x%02x\n",
1359                                device, blknr, c);
1360#else
1361                        printf ("Error (no IRQ) dev %d blk %ld: status 0x%02x\n",
1362                                device, (ulong)blknr, c);
1363#endif
1364                        break;
1365                }
1366
1367                input_data (device, buffer, ATA_SECTORWORDS);
1368                (void) ide_inb (device, ATA_STATUS);    /* clear IRQ */
1369
1370                ++n;
1371                ++blknr;
1372                buffer += ATA_BLOCKSIZE;
1373        }
1374IDE_READ_E:
1375        ide_led (DEVICE_LED(device), 0);        /* LED off      */
1376        return (n);
1377}
1378
1379/* ------------------------------------------------------------------------- */
1380
1381
1382ulong ide_write (int device, lbaint_t blknr, ulong blkcnt, void *buffer)
1383{
1384        ulong n = 0;
1385        unsigned char c;
1386#ifdef CONFIG_LBA48
1387        unsigned char lba48 = 0;
1388
1389        if (blknr & 0x0000fffff0000000ULL) {
1390                /* more than 28 bits used, use 48bit mode */
1391                lba48 = 1;
1392        }
1393#endif
1394
1395        ide_led (DEVICE_LED(device), 1);        /* LED on       */
1396
1397        /* Select device
1398         */
1399        ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
1400
1401        while (blkcnt-- > 0) {
1402
1403                c = ide_wait (device, IDE_TIME_OUT);
1404
1405                if (c & ATA_STAT_BUSY) {
1406                        printf ("IDE read: device %d not ready\n", device);
1407                        goto WR_OUT;
1408                }
1409#ifdef CONFIG_LBA48
1410                if (lba48) {
1411                        /* write high bits */
1412                        ide_outb (device, ATA_SECT_CNT, 0);
1413                        ide_outb (device, ATA_LBA_LOW,  (blknr >> 24) & 0xFF);
1414#ifdef CONFIG_SYS_64BIT_LBA
1415                        ide_outb (device, ATA_LBA_MID,  (blknr >> 32) & 0xFF);
1416                        ide_outb (device, ATA_LBA_HIGH, (blknr >> 40) & 0xFF);
1417#else
1418                        ide_outb (device, ATA_LBA_MID,  0);
1419                        ide_outb (device, ATA_LBA_HIGH, 0);
1420#endif
1421                }
1422#endif
1423                ide_outb (device, ATA_SECT_CNT, 1);
1424                ide_outb (device, ATA_LBA_LOW,  (blknr >>  0) & 0xFF);
1425                ide_outb (device, ATA_LBA_MID,  (blknr >>  8) & 0xFF);
1426                ide_outb (device, ATA_LBA_HIGH, (blknr >> 16) & 0xFF);
1427
1428#ifdef CONFIG_LBA48
1429                if (lba48) {
1430                        ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device) );
1431                        ide_outb (device, ATA_COMMAND,  ATA_CMD_WRITE_EXT);
1432
1433                } else
1434#endif
1435                {
1436                        ide_outb (device, ATA_DEV_HD,   ATA_LBA         |
1437                                                    ATA_DEVICE(device)  |
1438                                                    ((blknr >> 24) & 0xF) );
1439                        ide_outb (device, ATA_COMMAND,  ATA_CMD_WRITE);
1440                }
1441
1442                udelay (50);
1443
1444                c = ide_wait (device, IDE_TIME_OUT);    /* can't take over 500 ms */
1445
1446                if ((c&(ATA_STAT_DRQ|ATA_STAT_BUSY|ATA_STAT_ERR)) != ATA_STAT_DRQ) {
1447#if defined(CONFIG_SYS_64BIT_LBA) && defined(CONFIG_SYS_64BIT_VSPRINTF)
1448                        printf ("Error (no IRQ) dev %d blk %Ld: status 0x%02x\n",
1449                                device, blknr, c);
1450#else
1451                        printf ("Error (no IRQ) dev %d blk %ld: status 0x%02x\n",
1452                                device, (ulong)blknr, c);
1453#endif
1454                        goto WR_OUT;
1455                }
1456
1457                output_data (device, buffer, ATA_SECTORWORDS);
1458                c = ide_inb (device, ATA_STATUS);       /* clear IRQ */
1459                ++n;
1460                ++blknr;
1461                buffer += ATA_BLOCKSIZE;
1462        }
1463WR_OUT:
1464        ide_led (DEVICE_LED(device), 0);        /* LED off      */
1465        return (n);
1466}
1467
1468/* ------------------------------------------------------------------------- */
1469
1470/*
1471 * copy src to dest, skipping leading and trailing blanks and null
1472 * terminate the string
1473 * "len" is the size of available memory including the terminating '\0'
1474 */
1475static void ident_cpy (unsigned char *dst, unsigned char *src, unsigned int len)
1476{
1477        unsigned char *end, *last;
1478
1479        last = dst;
1480        end  = src + len - 1;
1481
1482        /* reserve space for '\0' */
1483        if (len < 2)
1484                goto OUT;
1485
1486        /* skip leading white space */
1487        while ((*src) && (src<end) && (*src==' '))
1488                ++src;
1489
1490        /* copy string, omitting trailing white space */
1491        while ((*src) && (src<end)) {
1492                *dst++ = *src;
1493                if (*src++ != ' ')
1494                        last = dst;
1495        }
1496OUT:
1497        *last = '\0';
1498}
1499
1500/* ------------------------------------------------------------------------- */
1501
1502/*
1503 * Wait until Busy bit is off, or timeout (in ms)
1504 * Return last status
1505 */
1506static uchar ide_wait (int dev, ulong t)
1507{
1508        ulong delay = 10 * t;           /* poll every 100 us */
1509        uchar c;
1510
1511        while ((c = ide_inb(dev, ATA_STATUS)) & ATA_STAT_BUSY) {
1512                udelay (100);
1513                if (delay-- == 0) {
1514                        break;
1515                }
1516        }
1517        return (c);
1518}
1519
1520/* ------------------------------------------------------------------------- */
1521
1522#ifdef CONFIG_IDE_RESET
1523extern void ide_set_reset(int idereset);
1524
1525static void ide_reset (void)
1526{
1527#if defined(CONFIG_SYS_PB_12V_ENABLE) || defined(CONFIG_SYS_PB_IDE_MOTOR)
1528        volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
1529#endif
1530        int i;
1531
1532        curr_device = -1;
1533        for (i=0; i<CONFIG_SYS_IDE_MAXBUS; ++i)
1534                ide_bus_ok[i] = 0;
1535        for (i=0; i<CONFIG_SYS_IDE_MAXDEVICE; ++i)
1536                ide_dev_desc[i].type = DEV_TYPE_UNKNOWN;
1537
1538        ide_set_reset (1); /* assert reset */
1539
1540        /* the reset signal shall be asserted for et least 25 us */
1541        udelay(25);
1542
1543        WATCHDOG_RESET();
1544
1545#ifdef CONFIG_SYS_PB_12V_ENABLE
1546        immr->im_cpm.cp_pbdat &= ~(CONFIG_SYS_PB_12V_ENABLE);   /* 12V Enable output OFF */
1547        immr->im_cpm.cp_pbpar &= ~(CONFIG_SYS_PB_12V_ENABLE);
1548        immr->im_cpm.cp_pbodr &= ~(CONFIG_SYS_PB_12V_ENABLE);
1549        immr->im_cpm.cp_pbdir |=   CONFIG_SYS_PB_12V_ENABLE;
1550
1551        /* wait 500 ms for the voltage to stabilize
1552         */
1553        for (i=0; i<500; ++i) {
1554                udelay (1000);
1555        }
1556
1557        immr->im_cpm.cp_pbdat |=   CONFIG_SYS_PB_12V_ENABLE;    /* 12V Enable output ON */
1558#endif  /* CONFIG_SYS_PB_12V_ENABLE */
1559
1560#ifdef CONFIG_SYS_PB_IDE_MOTOR
1561        /* configure IDE Motor voltage monitor pin as input */
1562        immr->im_cpm.cp_pbpar &= ~(CONFIG_SYS_PB_IDE_MOTOR);
1563        immr->im_cpm.cp_pbodr &= ~(CONFIG_SYS_PB_IDE_MOTOR);
1564        immr->im_cpm.cp_pbdir &= ~(CONFIG_SYS_PB_IDE_MOTOR);
1565
1566        /* wait up to 1 s for the motor voltage to stabilize
1567         */
1568        for (i=0; i<1000; ++i) {
1569                if ((immr->im_cpm.cp_pbdat & CONFIG_SYS_PB_IDE_MOTOR) != 0) {
1570                        break;
1571                }
1572                udelay (1000);
1573        }
1574
1575        if (i == 1000) {        /* Timeout */
1576                printf ("\nWarning: 5V for IDE Motor missing\n");
1577# ifdef CONFIG_STATUS_LED
1578#  ifdef STATUS_LED_YELLOW
1579                status_led_set  (STATUS_LED_YELLOW, STATUS_LED_ON );
1580#  endif
1581#  ifdef STATUS_LED_GREEN
1582                status_led_set  (STATUS_LED_GREEN,  STATUS_LED_OFF);
1583#  endif
1584# endif /* CONFIG_STATUS_LED */
1585        }
1586#endif  /* CONFIG_SYS_PB_IDE_MOTOR */
1587
1588        WATCHDOG_RESET();
1589
1590        /* de-assert RESET signal */
1591        ide_set_reset(0);
1592
1593        /* wait 250 ms */
1594        for (i=0; i<250; ++i) {
1595                udelay (1000);
1596        }
1597}
1598
1599#endif  /* CONFIG_IDE_RESET */
1600
1601/* ------------------------------------------------------------------------- */
1602
1603#if defined(CONFIG_IDE_LED)     && \
1604   !defined(CONFIG_AMIGAONEG3SE)&& \
1605   !defined(CONFIG_CPC45)       && \
1606   !defined(CONFIG_HMI10)       && \
1607   !defined(CONFIG_KUP4K)       && \
1608   !defined(CONFIG_KUP4X)
1609
1610static  uchar   led_buffer = 0;         /* Buffer for current LED status        */
1611
1612static void ide_led (uchar led, uchar status)
1613{
1614        uchar *led_port = LED_PORT;
1615
1616        if (status)     {               /* switch LED on        */
1617                led_buffer |=  led;
1618        } else {                        /* switch LED off       */
1619                led_buffer &= ~led;
1620        }
1621
1622        *led_port = led_buffer;
1623}
1624
1625#endif  /* CONFIG_IDE_LED */
1626
1627#if defined(CONFIG_OF_IDE_FIXUP)
1628int ide_device_present(int dev)
1629{
1630        if (dev >= CONFIG_SYS_IDE_MAXBUS)
1631                return 0;
1632        return (ide_dev_desc[dev].type == DEV_TYPE_UNKNOWN ? 0 : 1);
1633}
1634#endif
1635/* ------------------------------------------------------------------------- */
1636
1637#ifdef CONFIG_ATAPI
1638/****************************************************************************
1639 * ATAPI Support
1640 */
1641
1642#if defined(__PPC__) || defined(CONFIG_PXA_PCMCIA)
1643/* since ATAPI may use commands with not 4 bytes alligned length
1644 * we have our own transfer functions, 2 bytes alligned */
1645static void
1646output_data_shorts(int dev, ushort *sect_buf, int shorts)
1647{
1648#if defined(CONFIG_HMI10) || defined(CONFIG_CPC45)
1649        uchar   *dbuf;
1650        volatile uchar  *pbuf_even;
1651        volatile uchar  *pbuf_odd;
1652
1653        pbuf_even = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_EVEN);
1654        pbuf_odd  = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_ODD);
1655        while (shorts--) {
1656                EIEIO;
1657                *pbuf_even = *dbuf++;
1658                EIEIO;
1659                *pbuf_odd = *dbuf++;
1660        }
1661#else
1662        ushort  *dbuf;
1663        volatile ushort *pbuf;
1664
1665        pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG);
1666        dbuf = (ushort *)sect_buf;
1667
1668        debug ("in output data shorts base for read is %lx\n", (unsigned long) pbuf);
1669
1670        while (shorts--) {
1671                EIEIO;
1672                *pbuf = *dbuf++;
1673        }
1674#endif
1675}
1676
1677static void
1678input_data_shorts(int dev, ushort *sect_buf, int shorts)
1679{
1680#if defined(CONFIG_HMI10) || defined(CONFIG_CPC45)
1681        uchar   *dbuf;
1682        volatile uchar  *pbuf_even;
1683        volatile uchar  *pbuf_odd;
1684
1685        pbuf_even = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_EVEN);
1686        pbuf_odd  = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_ODD);
1687        while (shorts--) {
1688                EIEIO;
1689                *dbuf++ = *pbuf_even;
1690                EIEIO;
1691                *dbuf++ = *pbuf_odd;
1692        }
1693#else
1694        ushort  *dbuf;
1695        volatile ushort *pbuf;
1696
1697        pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG);
1698        dbuf = (ushort *)sect_buf;
1699
1700        debug("in input data shorts base for read is %lx\n", (unsigned long) pbuf);
1701
1702        while (shorts--) {
1703                EIEIO;
1704                *dbuf++ = *pbuf;
1705        }
1706#endif
1707}
1708
1709#else   /* ! __PPC__ */
1710static void
1711output_data_shorts(int dev, ushort *sect_buf, int shorts)
1712{
1713        outsw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, shorts);
1714}
1715
1716static void
1717input_data_shorts(int dev, ushort *sect_buf, int shorts)
1718{
1719        insw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, shorts);
1720}
1721
1722#endif  /* __PPC__ */
1723
1724/*
1725 * Wait until (Status & mask) == res, or timeout (in ms)
1726 * Return last status
1727 * This is used since some ATAPI CD ROMs clears their Busy Bit first
1728 * and then they set their DRQ Bit
1729 */
1730static uchar atapi_wait_mask (int dev, ulong t,uchar mask, uchar res)
1731{
1732        ulong delay = 10 * t;           /* poll every 100 us */
1733        uchar c;
1734
1735        c = ide_inb(dev,ATA_DEV_CTL); /* prevents to read the status before valid */
1736        while (((c = ide_inb(dev, ATA_STATUS)) & mask) != res) {
1737                /* break if error occurs (doesn't make sense to wait more) */
1738                if((c & ATA_STAT_ERR)==ATA_STAT_ERR)
1739                        break;
1740                udelay (100);
1741                if (delay-- == 0) {
1742                        break;
1743                }
1744        }
1745        return (c);
1746}
1747
1748/*
1749 * issue an atapi command
1750 */
1751unsigned char atapi_issue(int device,unsigned char* ccb,int ccblen, unsigned char * buffer,int buflen)
1752{
1753        unsigned char c,err,mask,res;
1754        int n;
1755        ide_led (DEVICE_LED(device), 1);        /* LED on       */
1756
1757        /* Select device
1758         */
1759        mask = ATA_STAT_BUSY|ATA_STAT_DRQ;
1760        res = 0;
1761#ifdef  CONFIG_AMIGAONEG3SE
1762# warning THF: Removed LBA mode ???
1763#endif
1764        ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
1765        c = atapi_wait_mask(device,ATAPI_TIME_OUT,mask,res);
1766        if ((c & mask) != res) {
1767                printf ("ATAPI_ISSUE: device %d not ready status %X\n", device,c);
1768                err=0xFF;
1769                goto AI_OUT;
1770        }
1771        /* write taskfile */
1772        ide_outb (device, ATA_ERROR_REG, 0); /* no DMA, no overlaped */
1773        ide_outb (device, ATA_SECT_CNT, 0);
1774        ide_outb (device, ATA_SECT_NUM, 0);
1775        ide_outb (device, ATA_CYL_LOW,  (unsigned char)(buflen & 0xFF));
1776        ide_outb (device, ATA_CYL_HIGH, (unsigned char)((buflen>>8) & 0xFF));
1777#ifdef  CONFIG_AMIGAONEG3SE
1778# warning THF: Removed LBA mode ???
1779#endif
1780        ide_outb (device, ATA_DEV_HD,   ATA_LBA | ATA_DEVICE(device));
1781
1782        ide_outb (device, ATA_COMMAND,  ATAPI_CMD_PACKET);
1783        udelay (50);
1784
1785        mask = ATA_STAT_DRQ|ATA_STAT_BUSY|ATA_STAT_ERR;
1786        res = ATA_STAT_DRQ;
1787        c = atapi_wait_mask(device,ATAPI_TIME_OUT,mask,res);
1788
1789        if ((c & mask) != res) { /* DRQ must be 1, BSY 0 */
1790                printf ("ATAPI_ISSUE: Error (no IRQ) before sending ccb dev %d status 0x%02x\n",device,c);
1791                err=0xFF;
1792                goto AI_OUT;
1793        }
1794
1795        output_data_shorts (device, (unsigned short *)ccb,ccblen/2); /* write command block */
1796        /* ATAPI Command written wait for completition */
1797        udelay (5000); /* device must set bsy */
1798
1799        mask = ATA_STAT_DRQ|ATA_STAT_BUSY|ATA_STAT_ERR;
1800        /* if no data wait for DRQ = 0 BSY = 0
1801         * if data wait for DRQ = 1 BSY = 0 */
1802        res=0;
1803        if(buflen)
1804                res = ATA_STAT_DRQ;
1805        c = atapi_wait_mask(device,ATAPI_TIME_OUT,mask,res);
1806        if ((c & mask) != res ) {
1807                if (c & ATA_STAT_ERR) {
1808                        err=(ide_inb(device,ATA_ERROR_REG))>>4;
1809                        debug ("atapi_issue 1 returned sense key %X status %02X\n",err,c);
1810                } else {
1811                        printf ("ATAPI_ISSUE: (no DRQ) after sending ccb (%x)  status 0x%02x\n", ccb[0],c);
1812                        err=0xFF;
1813                }
1814                goto AI_OUT;
1815        }
1816        n=ide_inb(device, ATA_CYL_HIGH);
1817        n<<=8;
1818        n+=ide_inb(device, ATA_CYL_LOW);
1819        if(n>buflen) {
1820                printf("ERROR, transfer bytes %d requested only %d\n",n,buflen);
1821                err=0xff;
1822                goto AI_OUT;
1823        }
1824        if((n==0)&&(buflen<0)) {
1825                printf("ERROR, transfer bytes %d requested %d\n",n,buflen);
1826                err=0xff;
1827                goto AI_OUT;
1828        }
1829        if(n!=buflen) {
1830                debug ("WARNING, transfer bytes %d not equal with requested %d\n",n,buflen);
1831        }
1832        if(n!=0) { /* data transfer */
1833                debug ("ATAPI_ISSUE: %d Bytes to transfer\n",n);
1834                 /* we transfer shorts */
1835                n>>=1;
1836                /* ok now decide if it is an in or output */
1837                if ((ide_inb(device, ATA_SECT_CNT)&0x02)==0) {
1838                        debug ("Write to device\n");
1839                        output_data_shorts(device,(unsigned short *)buffer,n);
1840                } else {
1841                        debug ("Read from device @ %p shorts %d\n",buffer,n);
1842                        input_data_shorts(device,(unsigned short *)buffer,n);
1843                }
1844        }
1845        udelay(5000); /* seems that some CD ROMs need this... */
1846        mask = ATA_STAT_BUSY|ATA_STAT_ERR;
1847        res=0;
1848        c = atapi_wait_mask(device,ATAPI_TIME_OUT,mask,res);
1849        if ((c & ATA_STAT_ERR) == ATA_STAT_ERR) {
1850                err=(ide_inb(device,ATA_ERROR_REG) >> 4);
1851                debug ("atapi_issue 2 returned sense key %X status %X\n",err,c);
1852        } else {
1853                err = 0;
1854        }
1855AI_OUT:
1856        ide_led (DEVICE_LED(device), 0);        /* LED off      */
1857        return (err);
1858}
1859
1860/*
1861 * sending the command to atapi_issue. If an status other than good
1862 * returns, an request_sense will be issued
1863 */
1864
1865#define ATAPI_DRIVE_NOT_READY   100
1866#define ATAPI_UNIT_ATTN         10
1867
1868unsigned char atapi_issue_autoreq (int device,
1869                                   unsigned char* ccb,
1870                                   int ccblen,
1871                                   unsigned char *buffer,
1872                                   int buflen)
1873{
1874        unsigned char sense_data[18],sense_ccb[12];
1875        unsigned char res,key,asc,ascq;
1876        int notready,unitattn;
1877
1878#ifdef CONFIG_AMIGAONEG3SE
1879        char *s;
1880        unsigned int timeout, retrycnt;
1881
1882        s = getenv("ide_cd_timeout");
1883        timeout = s ? (simple_strtol(s, NULL, 10)*1000000)/5 : 0;
1884
1885        retrycnt = 0;
1886#endif
1887
1888        unitattn=ATAPI_UNIT_ATTN;
1889        notready=ATAPI_DRIVE_NOT_READY;
1890
1891retry:
1892        res= atapi_issue(device,ccb,ccblen,buffer,buflen);
1893        if (res==0)
1894                return (0); /* Ok */
1895
1896        if (res==0xFF)
1897                return (0xFF); /* error */
1898
1899        debug ("(auto_req)atapi_issue returned sense key %X\n",res);
1900
1901        memset(sense_ccb,0,sizeof(sense_ccb));
1902        memset(sense_data,0,sizeof(sense_data));
1903        sense_ccb[0]=ATAPI_CMD_REQ_SENSE;
1904        sense_ccb[4]=18; /* allocation Length */
1905
1906        res=atapi_issue(device,sense_ccb,12,sense_data,18);
1907        key=(sense_data[2]&0xF);
1908        asc=(sense_data[12]);
1909        ascq=(sense_data[13]);
1910
1911        debug ("ATAPI_CMD_REQ_SENSE returned %x\n",res);
1912        debug (" Sense page: %02X key %02X ASC %02X ASCQ %02X\n",
1913                sense_data[0],
1914                key,
1915                asc,
1916                ascq);
1917
1918        if((key==0))
1919                return 0; /* ok device ready */
1920
1921        if((key==6)|| (asc==0x29) || (asc==0x28)) { /* Unit Attention */
1922                if(unitattn-->0) {
1923                        udelay(200*1000);
1924                        goto retry;
1925                }
1926                printf("Unit Attention, tried %d\n",ATAPI_UNIT_ATTN);
1927                goto error;
1928        }
1929        if((asc==0x4) && (ascq==0x1)) { /* not ready, but will be ready soon */
1930                if (notready-->0) {
1931                        udelay(200*1000);
1932                        goto retry;
1933                }
1934                printf("Drive not ready, tried %d times\n",ATAPI_DRIVE_NOT_READY);
1935                goto error;
1936        }
1937        if(asc==0x3a) {
1938                debug ("Media not present\n");
1939                goto error;
1940        }
1941
1942#ifdef CONFIG_AMIGAONEG3SE
1943        if ((sense_data[2]&0xF)==0x0B) {
1944                debug ("ABORTED COMMAND...retry\n");
1945                if (retrycnt++ < 4)
1946                        goto retry;
1947                return (0xFF);
1948        }
1949
1950        if ((sense_data[2]&0xf) == 0x02 &&
1951            sense_data[12] == 0x04      &&
1952            sense_data[13] == 0x01      ) {
1953                debug ("Waiting for unit to become active\n");
1954                udelay(timeout);
1955                if (retrycnt++ < 4)
1956                        goto retry;
1957                return 0xFF;
1958        }
1959#endif  /* CONFIG_AMIGAONEG3SE */
1960
1961        printf ("ERROR: Unknown Sense key %02X ASC %02X ASCQ %02X\n",key,asc,ascq);
1962error:
1963        debug  ("ERROR Sense key %02X ASC %02X ASCQ %02X\n",key,asc,ascq);
1964        return (0xFF);
1965}
1966
1967
1968static void     atapi_inquiry(block_dev_desc_t * dev_desc)
1969{
1970        unsigned char ccb[12]; /* Command descriptor block */
1971        unsigned char iobuf[64]; /* temp buf */
1972        unsigned char c;
1973        int device;
1974
1975        device=dev_desc->dev;
1976        dev_desc->type=DEV_TYPE_UNKNOWN; /* not yet valid */
1977        dev_desc->block_read=atapi_read;
1978
1979        memset(ccb,0,sizeof(ccb));
1980        memset(iobuf,0,sizeof(iobuf));
1981
1982        ccb[0]=ATAPI_CMD_INQUIRY;
1983        ccb[4]=40; /* allocation Legnth */
1984        c=atapi_issue_autoreq(device,ccb,12,(unsigned char *)iobuf,40);
1985
1986        debug ("ATAPI_CMD_INQUIRY returned %x\n",c);
1987        if (c!=0)
1988                return;
1989
1990        /* copy device ident strings */
1991        ident_cpy((unsigned char*)dev_desc->vendor,&iobuf[8],8);
1992        ident_cpy((unsigned char*)dev_desc->product,&iobuf[16],16);
1993        ident_cpy((unsigned char*)dev_desc->revision,&iobuf[32],5);
1994
1995        dev_desc->lun=0;
1996        dev_desc->lba=0;
1997        dev_desc->blksz=0;
1998        dev_desc->type=iobuf[0] & 0x1f;
1999
2000        if ((iobuf[1]&0x80)==0x80)
2001                dev_desc->removable = 1;
2002        else
2003                dev_desc->removable = 0;
2004
2005        memset(ccb,0,sizeof(ccb));
2006        memset(iobuf,0,sizeof(iobuf));
2007        ccb[0]=ATAPI_CMD_START_STOP;
2008        ccb[4]=0x03; /* start */
2009
2010        c=atapi_issue_autoreq(device,ccb,12,(unsigned char *)iobuf,0);
2011
2012        debug ("ATAPI_CMD_START_STOP returned %x\n",c);
2013        if (c!=0)
2014                return;
2015
2016        memset(ccb,0,sizeof(ccb));
2017        memset(iobuf,0,sizeof(iobuf));
2018        c=atapi_issue_autoreq(device,ccb,12,(unsigned char *)iobuf,0);
2019
2020        debug ("ATAPI_CMD_UNIT_TEST_READY returned %x\n",c);
2021        if (c!=0)
2022                return;
2023
2024        memset(ccb,0,sizeof(ccb));
2025        memset(iobuf,0,sizeof(iobuf));
2026        ccb[0]=ATAPI_CMD_READ_CAP;
2027        c=atapi_issue_autoreq(device,ccb,12,(unsigned char *)iobuf,8);
2028        debug ("ATAPI_CMD_READ_CAP returned %x\n",c);
2029        if (c!=0)
2030                return;
2031
2032        debug ("Read Cap: LBA %02X%02X%02X%02X blksize %02X%02X%02X%02X\n",
2033                iobuf[0],iobuf[1],iobuf[2],iobuf[3],
2034                iobuf[4],iobuf[5],iobuf[6],iobuf[7]);
2035
2036        dev_desc->lba  =((unsigned long)iobuf[0]<<24) +
2037                        ((unsigned long)iobuf[1]<<16) +
2038                        ((unsigned long)iobuf[2]<< 8) +
2039                        ((unsigned long)iobuf[3]);
2040        dev_desc->blksz=((unsigned long)iobuf[4]<<24) +
2041                        ((unsigned long)iobuf[5]<<16) +
2042                        ((unsigned long)iobuf[6]<< 8) +
2043                        ((unsigned long)iobuf[7]);
2044#ifdef CONFIG_LBA48
2045        dev_desc->lba48 = 0; /* ATAPI devices cannot use 48bit addressing (ATA/ATAPI v7) */
2046#endif
2047        return;
2048}
2049
2050
2051/*
2052 * atapi_read:
2053 * we transfer only one block per command, since the multiple DRQ per
2054 * command is not yet implemented
2055 */
2056#define ATAPI_READ_MAX_BYTES    2048    /* we read max 2kbytes */
2057#define ATAPI_READ_BLOCK_SIZE   2048    /* assuming CD part */
2058#define ATAPI_READ_MAX_BLOCK ATAPI_READ_MAX_BYTES/ATAPI_READ_BLOCK_SIZE /* max blocks */
2059
2060ulong atapi_read (int device, lbaint_t blknr, ulong blkcnt, void *buffer)
2061{
2062        ulong n = 0;
2063        unsigned char ccb[12]; /* Command descriptor block */
2064        ulong cnt;
2065
2066        debug  ("atapi_read dev %d start %lX, blocks %lX buffer at %lX\n",
2067                device, blknr, blkcnt, (ulong)buffer);
2068
2069        do {
2070                if (blkcnt>ATAPI_READ_MAX_BLOCK) {
2071                        cnt=ATAPI_READ_MAX_BLOCK;
2072                } else {
2073                        cnt=blkcnt;
2074                }
2075                ccb[0]=ATAPI_CMD_READ_12;
2076                ccb[1]=0; /* reserved */
2077                ccb[2]=(unsigned char) (blknr>>24) & 0xFF; /* MSB Block */
2078                ccb[3]=(unsigned char) (blknr>>16) & 0xFF; /*  */
2079                ccb[4]=(unsigned char) (blknr>> 8) & 0xFF;
2080                ccb[5]=(unsigned char)  blknr      & 0xFF; /* LSB Block */
2081                ccb[6]=(unsigned char) (cnt  >>24) & 0xFF; /* MSB Block count */
2082                ccb[7]=(unsigned char) (cnt  >>16) & 0xFF;
2083                ccb[8]=(unsigned char) (cnt  >> 8) & 0xFF;
2084                ccb[9]=(unsigned char)  cnt        & 0xFF; /* LSB Block */
2085                ccb[10]=0; /* reserved */
2086                ccb[11]=0; /* reserved */
2087
2088                if (atapi_issue_autoreq(device,ccb,12,
2089                                        (unsigned char *)buffer,
2090                                        cnt*ATAPI_READ_BLOCK_SIZE) == 0xFF) {
2091                        return (n);
2092                }
2093                n+=cnt;
2094                blkcnt-=cnt;
2095                blknr+=cnt;
2096                buffer+=(cnt*ATAPI_READ_BLOCK_SIZE);
2097        } while (blkcnt > 0);
2098        return (n);
2099}
2100
2101/* ------------------------------------------------------------------------- */
2102
2103#endif /* CONFIG_ATAPI */
2104
2105U_BOOT_CMD(
2106        ide,  5,  1,  do_ide,
2107        "IDE sub-system",
2108        "reset - reset IDE controller\n"
2109        "ide info  - show available IDE devices\n"
2110        "ide device [dev] - show or set current device\n"
2111        "ide part [dev] - print partition table of one or all IDE devices\n"
2112        "ide read  addr blk# cnt\n"
2113        "ide write addr blk# cnt - read/write `cnt'"
2114        " blocks starting at block `blk#'\n"
2115        "    to/from memory address `addr'"
2116);
2117
2118U_BOOT_CMD(
2119        diskboot,       3,      1,      do_diskboot,
2120        "boot from IDE device",
2121        "loadAddr dev:part"
2122);
2123