]> git.sur5r.net Git - u-boot/blobdiff - common/cmd_ide.c
* Make sure HUSH is initialized for running auto-update scripts
[u-boot] / common / cmd_ide.c
index d082d5e9b3bd79c27813ddedcdce2554f88037c5..21a666644f928ef8984073cdb32ccca5080cd3e8 100644 (file)
 #endif
 #include <ide.h>
 #include <ata.h>
-#include <cmd_ide.h>
-#include <cmd_disk.h>
 #ifdef CONFIG_STATUS_LED
 # include <status_led.h>
 #endif
-#ifdef __I386__
+#ifndef __PPC__
 #include <asm/io.h>
+#ifdef __MIPS__
+/* Macros depend on this variable */
+static unsigned long mips_io_port_base = 0;
+#endif
 #endif
 
 #ifdef CONFIG_SHOW_BOOT_PROGRESS
@@ -67,6 +69,7 @@
 
 #if (CONFIG_COMMANDS & CFG_CMD_IDE)
 
+#ifdef CONFIG_IDE_8xx_DIRECT
 /* Timings for IDE Interface
  *
  * SETUP / LENGTH / HOLD - cycles valid for 50 MHz clk
@@ -103,6 +106,8 @@ static int pio_mode = CFG_PIO_MODE;
 
 #define PCMCIA_MK_CLKS( t, T ) (( (t) * (T) + 999U ) / 1000U )
 
+#endif /* CONFIG_IDE_8xx_DIRECT */
+
 /* ------------------------------------------------------------------------- */
 
 /* Current I/O Device  */
@@ -118,9 +123,8 @@ ulong ide_bus_offset[CFG_IDE_MAXBUS] = {
 #endif
 };
 
-#ifdef __PPC__
+
 #define        ATA_CURR_BASE(dev)      (CFG_ATA_BASE_ADDR+ide_bus_offset[IDE_BUS(dev)])
-#endif
 
 #ifndef CONFIG_AMIGAONEG3SE
 static int         ide_bus_ok[CFG_IDE_MAXBUS];
@@ -166,9 +170,6 @@ static uchar ide_wait  (int dev, ulong t);
 
 static void __inline__ ide_outb(int dev, int port, unsigned char val);
 static unsigned char __inline__ ide_inb(int dev, int port);
-#ifdef __PPC__
-static void input_swap_data(int dev, ulong *sect_buf, int words);
-#endif
 static void input_data(int dev, ulong *sect_buf, int words);
 static void output_data(int dev, ulong *sect_buf, int words);
 static void ident_cpy (unsigned char *dest, unsigned char *src, unsigned int len);
@@ -182,8 +183,6 @@ ulong atapi_read (int device, ulong blknr, ulong blkcnt, ulong *buffer);
 
 #ifdef CONFIG_IDE_8xx_DIRECT
 static void set_pcmcia_timing (int pmode);
-#else
-#define set_pcmcia_timing(a)   /* dummy */
 #endif
 
 /* ------------------------------------------------------------------------- */
@@ -404,7 +403,8 @@ int do_diskboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                SHOW_BOOT_PROGRESS (-1);
                return 1;
        }
-       if (strncmp(info.type, BOOT_PART_TYPE, sizeof(info.type)) != 0) {
+       if ((strncmp(info.type, BOOT_PART_TYPE, sizeof(info.type)) != 0) &&
+           (strncmp(info.type, BOOT_PART_COMP, sizeof(info.type)) != 0)) {
                printf ("\n** Invalid partition type \"%.32s\""
                        " (expect \"" BOOT_PART_TYPE "\")\n",
                        info.type);
@@ -473,9 +473,9 @@ int do_diskboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 
 void ide_init (void)
 {
-       DECLARE_GLOBAL_DATA_PTR;
 
 #ifdef CONFIG_IDE_8xx_DIRECT
+       DECLARE_GLOBAL_DATA_PTR;
        volatile immap_t *immr = (immap_t *)CFG_IMMR;
        volatile pcmconf8xx_t *pcmp = &(immr->im_pcmcia);
 #endif
@@ -489,17 +489,21 @@ void ide_init (void)
 
 #ifdef CONFIG_IDE_8xx_PCCARD
        extern int pcmcia_on (void);
+       extern int ide_devices_found; /* Initialized in check_ide_device() */
 
        WATCHDOG_RESET();
 
+       ide_devices_found = 0;
        /* initialize the PCMCIA IDE adapter card */
-       if (pcmcia_on())
+       pcmcia_on();
+       if (!ide_devices_found)
                return;
        udelay (1000000);       /* 1 s */
 #endif /* CONFIG_IDE_8xx_PCCARD */
 
        WATCHDOG_RESET();
 
+#ifdef CONFIG_IDE_8xx_DIRECT
        /* Initialize PIO timing tables */
        for (i=0; i <= IDE_MAX_PIO_MODE; ++i) {
            pio_config_clk[i].t_setup  = PCMCIA_MK_CLKS(pio_config_ns[i].t_setup,
@@ -516,6 +520,7 @@ void ide_init (void)
                    pio_config_ns[i].t_length, pio_config_clk[i].t_length,
                    pio_config_ns[i].t_hold,   pio_config_clk[i].t_hold);
        }
+#endif /* CONFIG_IDE_8xx_DIRECT */
 
        /* Reset the IDE just to be sure.
         * Light LED's to show
@@ -526,11 +531,11 @@ void ide_init (void)
 #ifdef CONFIG_IDE_8xx_DIRECT
        /* PCMCIA / IDE initialization for common mem space */
        pcmp->pcmc_pgcrb = 0;
-#endif
 
        /* start in PIO mode 0 - most relaxed timings */
        pio_mode = 0;
        set_pcmcia_timing (pio_mode);
+#endif /* CONFIG_IDE_8xx_DIRECT */
 
        /*
         * Wait for IDE to get ready.
@@ -550,6 +555,13 @@ void ide_init (void)
                int dev = bus * (CFG_IDE_MAXDEVICE / max_bus_scan);
 #endif
 
+#ifdef CONFIG_IDE_8xx_PCCARD
+               /* Skip non-ide devices from probing */
+               if ((ide_devices_found & (1 << bus)) == 0) {
+                       ide_led ((LED_IDE1 | LED_IDE2), 0); /* LED's off */
+                       continue;
+               }
+#endif
                printf ("Bus %d: ", bus);
 
                ide_bus_ok[bus] = 0;
@@ -754,7 +766,7 @@ ide_outb(int dev, int port, unsigned char val)
 static void __inline__
 ide_outb(int dev, int port, unsigned char val)
 {
-       outb(val, port);
+       outb(val, ATA_CURR_BASE(dev)+port);
 }
 #endif /* __PPC__ */
 
@@ -776,26 +788,18 @@ ide_inb(int dev, int port)
 static unsigned char __inline__
 ide_inb(int dev, int port)
 {
-       return inb(port);
+  return inb(ATA_CURR_BASE(dev)+port);
 }
 #endif /* __PPC__ */
 
 #ifdef __PPC__
-__inline__ unsigned ld_le16(const volatile unsigned short *addr)
-{
-       unsigned val;
-
-       __asm__ __volatile__ ("lhbrx %0,0,%1" : "=r"(val) : "r"(addr), "m"(*addr));
-       return val;
-}
-
-#ifdef CONFIG_AMIGAONEG3SE
+# ifdef CONFIG_AMIGAONEG3SE
 static void
 output_data_short(int dev, ulong *sect_buf, int words)
 {
        ushort  *dbuf;
        volatile ushort *pbuf;
-       
+
        pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG);
        dbuf = (ushort *)sect_buf;
        while (words--) {
@@ -807,8 +811,14 @@ output_data_short(int dev, ulong *sect_buf, int words)
        if (words&1)
            *pbuf = 0;
 }
-#endif
+# endif        /* CONFIG_AMIGAONEG3SE */
+#endif /* __PPC_ */
 
+/* We only need to swap data if we are running on a big endian cpu. */
+/* But Au1x00 cpu:s already swaps data in big endian mode! */
+#if defined(__LITTLE_ENDIAN) || defined(CONFIG_AU1X00)
+#define input_swap_data(x,y,z) input_data(x,y,z)
+#else
 static void
 input_swap_data(int dev, ulong *sect_buf, int words)
 {
@@ -820,11 +830,7 @@ input_swap_data(int dev, ulong *sect_buf, int words)
                *dbuf++ = ld_le16(pbuf);
        }
 }
-#else  /* ! __PPC__ */
-#define input_swap_data(x,y,z) input_data(x,y,z)
-#endif /* __PPC__ */
-
-
+#endif /* __LITTLE_ENDIAN || CONFIG_AU1X00 */
 
 
 #ifdef __PPC__
@@ -847,7 +853,7 @@ output_data(int dev, ulong *sect_buf, int words)
 static void
 output_data(int dev, ulong *sect_buf, int words)
 {
-       outsw(ATA_DATA_REG, sect_buf, words<<1);
+       outsw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, words<<1);
 }
 #endif /* __PPC__ */
 
@@ -871,7 +877,7 @@ input_data(int dev, ulong *sect_buf, int words)
 static void
 input_data(int dev, ulong *sect_buf, int words)
 {
-       insw(ATA_DATA_REG, sect_buf, words << 1);
+       insw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, words << 1);
 }
 
 #endif /* __PPC__ */
@@ -1378,7 +1384,6 @@ static void ide_led (uchar led, uchar status)
  */
 
 
-
 #undef ATAPI_DEBUG
 
 #ifdef ATAPI_DEBUG
@@ -1422,14 +1427,14 @@ input_data_shorts(int dev, ushort *sect_buf, int shorts)
 static void
 output_data_shorts(int dev, ushort *sect_buf, int shorts)
 {
-       outsw(ATA_DATA_REG, sect_buf, shorts);
+       outsw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, shorts);
 }
 
 
 static void
 input_data_shorts(int dev, ushort *sect_buf, int shorts)
 {
-       insw(ATA_DATA_REG, sect_buf, shorts);
+       insw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, shorts);
 }
 
 #endif /* __PPC__ */
@@ -1678,7 +1683,6 @@ error:
 }
 
 
-
 static void    atapi_inquiry(block_dev_desc_t * dev_desc)
 {
        unsigned char ccb[12]; /* Command descriptor block */
@@ -1813,4 +1817,23 @@ ulong atapi_read (int device, ulong blknr, ulong blkcnt, ulong *buffer)
 
 #endif /* CONFIG_ATAPI */
 
+U_BOOT_CMD(
+       ide,  5,  1,  do_ide,
+       "ide     - IDE sub-system\n",
+       "reset - reset IDE controller\n"
+       "ide info  - show available IDE devices\n"
+       "ide device [dev] - show or set current device\n"
+       "ide part [dev] - print partition table of one or all IDE devices\n"
+       "ide read  addr blk# cnt\n"
+       "ide write addr blk# cnt - read/write `cnt'"
+       " blocks starting at block `blk#'\n"
+       "    to/from memory address `addr'\n"
+);
+
+U_BOOT_CMD(
+       diskboot,       3,      1,      do_diskboot,
+       "diskboot- boot from IDE device\n",
+       "loadAddr dev:part\n"
+);
+
 #endif /* CONFIG_COMMANDS & CFG_CMD_IDE */