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