From: Steven A. Falco <sfalco@harris.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [RFC] setting pio modes for IDE devices
Date: Wed, 13 Aug 2008 17:42:11 -0400 [thread overview]
Message-ID: <48A35533.1010901@harris.com> (raw)
The following patch adds the ability to call-out from the ide_ident
routine to a board-specific routine to set the PIO mode of an attached
device.
This feature is controlled by the preprocessor variable CONFIG_TUNE_CFA.
cmd_ide.c is modified to use the "drive identify information" read from the
device to compute a pio mode in the range 0 to 6. This is then passed
to a board-specific routine, ide_set_piomode, to set the mode in
hardware.
Two other files are touched: file ata.h, to include word 163, which is the
"advanced CF parameters", and file ide.h, to add a prototype for the
board-specific routine (again controlled by the CONFIG_TUNE_CFA
variable).
Please let me know if this or some variation on the idea would be
acceptible.
Steve
diff --git a/common/cmd_ide.c b/common/cmd_ide.c
index b4d9719..00b85db 100644
--- a/common/cmd_ide.c
+++ b/common/cmd_ide.c
@@ -1054,6 +1054,10 @@ static void ide_ident (block_dev_desc_t *dev_desc)
int do_retry = 0;
#endif
+#ifdef CONFIG_TUNE_CFA
+ int pio_mode;
+#endif
+
#if 0
int mode, cycle_time;
#endif
@@ -1169,6 +1173,40 @@ static void ide_ident (block_dev_desc_t *dev_desc)
else
dev_desc->removable = 0;
+#ifdef CONFIG_TUNE_CFA
+ /* Mode 0 - 2 only, are directly determined by word 51. */
+ pio_mode = iop->tPIO;
+ if(pio_mode > 2) {
+ printf("WARNING: Invalid PIO (word 51 = %d).\n", pio_mode);
+ pio_mode = 0; /* Force it to dead slow, and hope for the best... */
+ }
+
+ /* Any CompactFlash Storage Card that supports PIO mode 3 or above
+ * shall set bit 1 of word 53 to one and support the fields contained
+ * in words 64 through 70.
+ */
+ if(iop->field_valid & 0x02) {
+ /* Mode 3 and above are possible. Check in order from slow
+ * to fast, so we wind up with the highest mode allowed.
+ */
+ if(iop->eide_pio_modes & 0x01) {
+ pio_mode = 3;
+ }
+ if(iop->eide_pio_modes & 0x02) {
+ pio_mode = 4;
+ }
+ if((iop->cf_advanced_caps & 0x07) == 0x01) {
+ pio_mode = 5;
+ }
+ if((iop->cf_advanced_caps & 0x07) == 0x02) {
+ pio_mode = 6;
+ }
+ }
+
+ /* System-specific, depends on bus speeds, etc. */
+ ide_set_piomode(pio_mode);
+#endif /* CONFIG_TUNE_CFA */
+
#if 0
/*
* Drive PIO mode autoselection
diff --git a/include/ata.h b/include/ata.h
index aa6e90d..3269636 100644
--- a/include/ata.h
+++ b/include/ata.h
@@ -294,7 +294,9 @@ typedef struct hd_driveid {
unsigned short words130_155[26];/* reserved vendor words 130-155 */
unsigned short word156;
unsigned short words157_159[3];/* reserved vendor words 157-159 */
- unsigned short words160_255[95];/* reserved words 160-255 */
+ unsigned short words160_162[3];/* reserved words 160-162 */
+ unsigned short cf_advanced_caps;
+ unsigned short words164_255[92];/* reserved words 164-255 */
} hd_driveid_t;
diff --git a/include/ide.h b/include/ide.h
index 222f4f8..ae4624b 100644
--- a/include/ide.h
+++ b/include/ide.h
@@ -54,4 +54,9 @@ void ide_init(void);
ulong ide_read(int device, lbaint_t blknr, ulong blkcnt, void *buffer);
ulong ide_write(int device, lbaint_t blknr, ulong blkcnt, void *buffer);
+#ifdef CONFIG_TUNE_CFA
+/* Returns 0 on success, else returns 1. pio_mode can be 0 through 6. */
+extern int ide_set_piomode(int pio_mode);
+#endif
+
#endif /* _IDE_H */
next reply other threads:[~2008-08-13 21:42 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-08-13 21:42 Steven A. Falco [this message]
2008-08-13 23:20 ` [U-Boot] [RFC] setting pio modes for IDE devices Wolfgang Denk
2008-08-14 14:33 ` Steven A. Falco
2008-08-14 16:42 ` Jean-Christophe PLAGNIOL-VILLARD
2008-08-15 15:23 ` Steven A. Falco
2008-08-15 17:53 ` Steven A. Falco
2008-08-15 18:12 ` Wolfgang Denk
2008-08-15 19:29 ` [U-Boot] [Patch 1/3] " Steven A. Falco
2008-08-20 23:21 ` Wolfgang Denk
2008-08-15 19:34 ` [U-Boot] [PATCH 2/3] " Steven A. Falco
2008-08-20 23:31 ` Wolfgang Denk
2008-08-15 19:37 ` [U-Boot] [PATCH 3/3] " Steven A. Falco
2008-08-20 23:33 ` Wolfgang Denk
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=48A35533.1010901@harris.com \
--to=sfalco@harris.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.