diff options
author | Chris Johns <chrisj@rtems.org> | 2009-05-30 04:49:26 +0000 |
---|---|---|
committer | Chris Johns <chrisj@rtems.org> | 2009-05-30 04:49:26 +0000 |
commit | 57be444e596c11981ee4cefb2d3922e46d6d0c85 (patch) | |
tree | 55f4f8551912b9de3aec0ec0ca588785963e0b38 /c | |
parent | 2009-05-30 Chris Johns <chrisj@rtems.org> (diff) | |
download | rtems-57be444e596c11981ee4cefb2d3922e46d6d0c85.tar.bz2 |
2009-05-30 Chris Johns <chrisj@rtems.org>
* ide/ide.c: Add initialisation code to reset the IDE devices and
to probe them and display their model numbers. Also add code to
display the probing to aid bring up new hardware.
* ide/idecfg.c: Add the --ide-show command to show probing type
accessing when finding devices on the configured IDE buses.
Diffstat (limited to 'c')
-rw-r--r-- | c/src/lib/libbsp/i386/pc386/ChangeLog | 9 | ||||
-rw-r--r-- | c/src/lib/libbsp/i386/pc386/ide/ide.c | 141 | ||||
-rw-r--r-- | c/src/lib/libbsp/i386/pc386/ide/idecfg.c | 20 |
3 files changed, 163 insertions, 7 deletions
diff --git a/c/src/lib/libbsp/i386/pc386/ChangeLog b/c/src/lib/libbsp/i386/pc386/ChangeLog index 854e099b31..728a11091e 100644 --- a/c/src/lib/libbsp/i386/pc386/ChangeLog +++ b/c/src/lib/libbsp/i386/pc386/ChangeLog @@ -1,3 +1,12 @@ +2009-05-30 Chris Johns <chrisj@rtems.org> + + * ide/ide.c: Add initialisation code to reset the IDE devices and + to probe them and display their model numbers. Also add code to + display the probing to aid bring up new hardware. + + * ide/idecfg.c: Add the --ide-show command to show probing type + accessing when finding devices on the configured IDE buses. + 2009-05-29 Roxana Leontie <roxana.leontie@gmail.com> * Makefile.am, preinstall.am: Install tty_drv.h diff --git a/c/src/lib/libbsp/i386/pc386/ide/ide.c b/c/src/lib/libbsp/i386/pc386/ide/ide.c index ee7880da64..3e8224d25f 100644 --- a/c/src/lib/libbsp/i386/pc386/ide/ide.c +++ b/c/src/lib/libbsp/i386/pc386/ide/ide.c @@ -29,10 +29,10 @@ #include <libchip/ide_ctrl_cfg.h> #include <libchip/ide_ctrl_io.h> +bool pc386_ide_show; + /* #define DEBUG_OUT */ -/* Not using this currently */ -#if 0 static bool pc386_ide_status_busy (uint32_t port, uint32_t timeout, uint8_t* status_val) @@ -53,7 +53,6 @@ static bool pc386_ide_status_busy (uint32_t port, return false; } -#endif static bool pc386_ide_status_data_ready (uint32_t port, uint32_t timeout, @@ -104,6 +103,12 @@ bool pc386_ide_probe return ide_card_plugged; } +static void wait(volatile uint32_t loops) +{ + while (loops) + loops--; +} + /*=========================================================================*\ | Function: | \*-------------------------------------------------------------------------*/ @@ -122,6 +127,136 @@ void pc386_ide_initialize | <none> | \*=========================================================================*/ { + uint32_t port = IDE_Controller_Table[minor].port1; + uint8_t dev = 0; + + if (pc386_ide_show) + printk("IDE%d: port base: %04x\n", minor, port); + + outport_byte(port+IDE_REGISTER_DEVICE_HEAD, + (dev << IDE_REGISTER_DEVICE_HEAD_DEV_POS) | 0xE0); + wait(10000); + outport_byte(port+IDE_REGISTER_DEVICE_CONTROL, + IDE_REGISTER_DEVICE_CONTROL_SRST | IDE_REGISTER_DEVICE_CONTROL_nIEN); + wait(10000); + outport_byte(port+IDE_REGISTER_DEVICE_CONTROL, + IDE_REGISTER_DEVICE_CONTROL_nIEN); + wait(10000); + + for (dev = 0; dev < 2; dev++) + { + uint32_t byte; + uint8_t status; + uint8_t error; + uint8_t cyllsb; + uint8_t cylmsb; + const char* label = dev ? " slave" : "master"; + char model_number[41]; + char* p = &model_number[0]; + + memset(model_number, 0, sizeof(model_number)); + + outport_byte(port+IDE_REGISTER_DEVICE_HEAD, + (dev << IDE_REGISTER_DEVICE_HEAD_DEV_POS) | 0xE0); + /* + outport_byte(port+IDE_REGISTER_SECTOR_NUMBER, + (dev << IDE_REGISTER_DEVICE_HEAD_DEV_POS) | IDE_REGISTER_LBA3_L); + */ + + outport_byte(port+IDE_REGISTER_COMMAND, 0x00); + + if (!pc386_ide_status_busy (port, 6000, &status)) + continue; + + inport_byte(port+IDE_REGISTER_STATUS, status); + inport_byte(port+IDE_REGISTER_ERROR, error); + inport_byte(port+IDE_REGISTER_CYLINDER_LOW, cyllsb); + inport_byte(port+IDE_REGISTER_CYLINDER_HIGH, cylmsb); + + if (pc386_ide_show) + { + printk("IDE%d:%s: status=%02x\n", minor, label, status); + printk("IDE%d:%s: error=%02x\n", minor, label, error); + printk("IDE%d:%s: cylinder-low=%02x\n", minor, label, cyllsb); + printk("IDE%d:%s: cylinder-high=%02x\n", minor, label, cylmsb); + } + +#if 0 + /* + * Filter based on the cylinder values and the status. + * Taken from grub's ata.c. + */ + if (cyllsb != 0x14 || cylmsb != 0xeb) + if (status == 0 || (cyllsb != 0 && cylmsb != 0 && + cyllsb != 0xc3 && cylmsb != 0x3c)) + { + if (pc386_ide_show) + printk("IDE%d:%s: bad device\n", minor, label); + } +#endif + + outport_byte(port+IDE_REGISTER_COMMAND, 0xec); + + if (!pc386_ide_status_busy (port, 6000, &status)) + { + if (pc386_ide_show) + printk("IDE%d:%s: device busy: %02x\n", minor, label, status); + continue; + } + + byte = 0; + while (byte < 512) + { + uint16_t word; + bool data_ready; + + if (pc386_ide_show && ((byte % 16) == 0)) + printk("\n %04x : ", byte); + + data_ready = pc386_ide_status_data_ready (port, 100, &status); + + if (status & IDE_REGISTER_STATUS_ERR) + { + inport_byte(port+IDE_REGISTER_ERROR, error); + if (error != 4) + { + if (pc386_ide_show) + printk("IDE%d:%s: error=%04x\n", minor, label, error); + break; + } + /* + * The device is an ATAPI device. + */ + outport_byte(port+IDE_REGISTER_COMMAND, 0xa1); + continue; + } + + if (!data_ready) + break; + + inport_word(port+IDE_REGISTER_DATA, word); + + if (pc386_ide_show) + printk ("%04x ", word); + + if (byte >= 54 && byte < (54 + 40)) + { + *p = word >> 8; + p++; + *p = word; + p++; + } + + byte += 2; + } + + if (pc386_ide_show) + printk("\nbytes read = %d\n", byte); + + if (p != &model_number[0]) + printk("IDE%d:%s: %s\n", minor, label, model_number); + } + /* * FIXME: enable interrupts, if needed */ diff --git a/c/src/lib/libbsp/i386/pc386/ide/idecfg.c b/c/src/lib/libbsp/i386/pc386/ide/idecfg.c index 8569d40eff..35797d9ee4 100644 --- a/c/src/lib/libbsp/i386/pc386/ide/idecfg.c +++ b/c/src/lib/libbsp/i386/pc386/ide/idecfg.c @@ -23,6 +23,8 @@ #include <libchip/ide_ctrl_cfg.h> #include <libchip/ide_ctrl_io.h> +extern bool pc386_ide_show; + /* * The following table configures the functions used for IDE drivers * in this BSP. @@ -78,7 +80,7 @@ void bsp_ide_cmdline_init(void) /* * Can have: - * --ide=1,2 + * --ide=0,1 */ ide = bsp_cmdline_arg ("--ide="); @@ -96,12 +98,13 @@ void bsp_ide_cmdline_init(void) { switch (ide[i]) { - case '1': + case '0': ide1 = true; break; - case '2': + case '1': ide2 = true; break; + case '2': case '3': case '4': case '5': @@ -112,7 +115,7 @@ void bsp_ide_cmdline_init(void) case ',': break; default: - break; + break; } } } @@ -124,4 +127,13 @@ void bsp_ide_cmdline_init(void) IDE_Controller_Count++; if (ide2) IDE_Controller_Count++; + + /* + * Allow the user to get the initialise to print probing + * type information. + */ + ide = bsp_cmdline_arg ("--ide-show"); + + if (ide) + pc386_ide_show = true; } |