From: Steven A. Falco <sfalco@harris.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [RFC] setting pio modes for IDE devices
Date: Fri, 15 Aug 2008 11:23:24 -0400 [thread overview]
Message-ID: <48A59F6C.3080907@harris.com> (raw)
In-Reply-To: <20080814164225.GD23097@game.jcrosoft.org>
Jean-Christophe PLAGNIOL-VILLARD wrote:
>> ---
>> common/cmd_ide.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>> include/ata.h | 4 +++-
>> 2 files changed, 55 insertions(+), 1 deletions(-)
>>
>> diff --git a/common/cmd_ide.c b/common/cmd_ide.c
>> index b4d9719..0e435a7 100644
>> --- a/common/cmd_ide.c
>> +++ b/common/cmd_ide.c
>> @@ -167,6 +167,10 @@ 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);
>>
>> +#ifdef CONFIG_TUNE_PIO
>> +int inline ide_set_piomode(int pio_mode);
>> +#endif
>> +
>> #ifndef CFG_ATA_PORT_ADDR
>> #define CFG_ATA_PORT_ADDR(port) (port)
>> #endif
>> @@ -838,6 +842,16 @@ __ide_inb(int dev, int port)
>> unsigned char inline ide_inb(int dev, int port)
>> __attribute__((weak, alias("__ide_inb")));
>>
> why not do this?
>
> int inline ide_set_piomode(int pio_mode) __attribute__((weak));
>> #ifdef __PPC__
>> # ifdef CONFIG_AMIGAONEG3SE
>> static void
>> @@ -1054,6 +1068,10 @@ static void ide_ident (block_dev_desc_t *dev_desc)
>> int do_retry = 0;
>> #endif
>>
>> +#ifdef CONFIG_TUNE_PIO
>> + int pio_mode;
>> +#endif
>> +
>> #if 0
>> int mode, cycle_time;
>> #endif
>> @@ -1169,6 +1187,40 @@ static void ide_ident (block_dev_desc_t *dev_desc)
>> else
>> dev_desc->removable = 0;
>>
>> +#ifdef CONFIG_TUNE_PIO
>> + /* 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. */
>
> if(ide_set_piomode)
> ide_set_piomode(pio_mode);
>
> if no ide_set_piomode implementation is present gcc will drop it at
> compile time IIRC.
>
> Best Regards,
> J.
>
At least on the x86, this generates an explicit test, even with -O2. The generated code looks something like this:
80483cd: b8 00 00 00 00 mov $0x0,%eax
80483d2: 85 c0 test %eax,%eax
80483d4: 74 0c je 80483e2 <main+0x32>
80483d6: c7 04 24 0a 00 00 00 movl $0xa,(%esp)
80483dd: e8 1e 7c fb f7 call 0 <_init-0x8048250>
Is there some explicit optimization flag that causes gcc to drop it at compile time?
I basically was following the style of the existing code regarding weak linkage. See for example the ide_outb() implementation. Also, I don't think your approach eliminates any ifdefs, because we still would not want to perform the pio_mode calculation unless we intended to use the result.
Steve
next prev parent reply other threads:[~2008-08-15 15:23 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-08-13 21:42 [U-Boot] [RFC] setting pio modes for IDE devices Steven A. Falco
2008-08-13 23:20 ` 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 [this message]
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=48A59F6C.3080907@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.