All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexander Holler <holler@ahsoftware.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] oamp3: bug in clock.c with gcc 4.5.1?
Date: Fri, 17 Dec 2010 15:01:03 +0100	[thread overview]
Message-ID: <4D0B6D1F.8010304@ahsoftware.de> (raw)

Hello,

I think I've nailed down, why an u-boot compiled with gcc 4.5.1 fails 
here. Compiling arch/arm/cpu/armv7/omap3/clock.c with

gcc  -g  -Os   -fno-common -ffixed-r8 -msoft-float   -D__KERNEL__ 
-DCONFIG_SYS_TEXT_BASE=0x80008000 -I/usr/src/u-boot/include -fno-builtin 
-ffreestanding -nostdinc -isystem 
/usr/lib/gcc/armv7a-unknown-linux-gnueabi/4.5.1/include -pipe 
-DCONFIG_ARM -D__ARM__ -marm  -mabi=aapcs-linux -mno-thumb-interwork 
-march=armv5 -Wall -Wstrict-prototypes -fno-stack-protector -gstabs+ 
-Wa,-ahldn -c clock.c >clock.s

the following code will be build for get_osc_clk_speed():

--------------
  37:clock.c       **** 
/****************************************************************************** 

   38:clock.c       ****  * get_sys_clk_speed() - determine reference 
oscillator speed 

   39:clock.c       ****  *                       based on known 32kHz 
clock and gptimer. 

   40:clock.c       **** 
*****************************************************************************/ 

   41:clock.c       **** u32 get_osc_clk_speed(void) 
 

   42:clock.c       **** {
  277                    .LM0:
  278                    .LFBB1:
  279
  280
  281
   43:clock.c       ****         u32 start, cstart, cend, cdiff, cdiv, val;
   44:clock.c       ****         struct prcm *prcm_base = (struct prcm 
*)PRCM_BASE;
   45:clock.c       ****         struct prm *prm_base = (struct prm 
*)PRM_BASE;
   46:clock.c       ****         struct gptimer *gpt1_base = (struct 
gptimer *)OMAP34XX_GPT1;
   47:clock.c       ****         struct s32ktimer *s32k_base = (struct 
s32ktimer *)SYNC_32KTIMER_BASE;
   48:clock.c       ****
   49:clock.c       ****         val = readl(&prm_base->clksrc_ctrl);
   50:clock.c       ****
   51:clock.c       ****         if (val & SYSCLKDIV_2)
   52:clock.c       ****                 cdiv = 2;
   53:clock.c       ****         else
   54:clock.c       ****                 cdiv = 1;
   55:clock.c       ****
   56:clock.c       ****         /* enable timer2 */
   57:clock.c       ****         val = readl(&prcm_base->clksel_wkup) | 
CLKSEL_GPT1;
  283                    .LM1:
  284 0000 70309FE5      ldr r3,.L7
  285 0004 002093E5      ldr r2,[r3,#0]
  286 0008 012082E3      orr r2,r2,#1
   58:clock.c       ****
   59:clock.c       ****         /* select sys_clk for GPT1 */
   60:clock.c       ****         writel(val, &prcm_base->clksel_wkup);
  288                    .LM2:
  289 000c 002083E5      str r2,[r3,#0]
   61:clock.c       ****
   62:clock.c       ****         /* Enable I and F Clocks for GPT1 */
   63:clock.c       ****         val = readl(&prcm_base->iclken_wkup) | 
EN_GPT1 | EN_32KSYNC;
  291                    .LM3:
  292 0010 303043E2      sub r3,r3,#48
  293 0014 002093E5      ldr r2,[r3,#0]
  294 0018 052082E3      orr r2,r2,#5
   64:clock.c       ****         writel(val, &prcm_base->iclken_wkup);
  296                    .LM4:
  297 001c 002083E5      str r2,[r3,#0]
   65:clock.c       ****
   66:clock.c       ****         val = readl(&prcm_base->fclken_wkup) | 
EN_GPT1;
  299                    .LM5:
  300 0020 103043E2      sub r3,r3,#16
  301 0024 002093E5      ldr r2,[r3,#0]
  302 0028 012082E3      orr r2,r2,#1
   67:clock.c       ****         writel(val, &prcm_base->fclken_wkup);
  304                    .LM6:
  305 002c 002083E5      str r2,[r3,#0]
   68:clock.c       ****
   69:clock.c       ****         writel(0, &gpt1_base->tldr); 
  /* start counting at 0 */
  307                    .LM7:
  308 0030 44309FE5      ldr r3,.L7+4
  309 0034 0020A0E3      mov r2,#0
  310 0038 002083E5      str r2,[r3,#0]
   70:clock.c       ****         writel(GPT_EN, &gpt1_base->tclr); 
  /* enable clock */
  312                    .LM8:
  313 003c 032082E2      add r2,r2,#3
  314 0040 083043E2      sub r3,r3,#8
  315 0044 002083E5      str r2,[r3,#0]
   71:clock.c       ****
   72:clock.c       ****         /* enable 32kHz source, determine 
sys_clk via gauging */
   73:clock.c       ****
   74:clock.c       ****         /* start time in 20 cycles */
   75:clock.c       ****         start = 20 + readl(&s32k_base->s32k_cr);
  317                    .LM9:
  318 0048 30309FE5      ldr r3,.L7+8
  319 004c 002093E5      ldr r2,[r3,#0]
  320 0050 142082E2      add r2,r2,#20
  321                    .L2:
   76:clock.c       ****
   77:clock.c       ****         /* dead loop till start time */
   78:clock.c       ****         while (readl(&s32k_base->s32k_cr) < start);
  323                    .LM10:
  324 0054 001093E5      ldr r1,[r3,#0]
  325 0058 020051E1      cmp r1,r2
  326 005c FCFFFF3A      bcc .L2
   79:clock.c       ****
   80:clock.c       ****         /* get start sys_clk count */
   81:clock.c       ****         cstart = readl(&gpt1_base->tcrr);
   82:clock.c       ****
   83:clock.c       ****         /* wait for 40 cycles */
   84:clock.c       ****         while (readl(&s32k_base->s32k_cr) < 
(start + 20)) ;
  328                    .LM11:
  329 0060 142082E2      add r2,r2,#20
  330                    .L4:
  331 0064 001093E5      ldr r1,[r3,#0]
  332 0068 020051E1      cmp r1,r2
  333 006c FCFFFF3A      bcc .L4
   85:clock.c       ****         cend = readl(&gpt1_base->tcrr); 
  /* get end sys_clk count */
   86:clock.c       ****         cdiff = cend - cstart; 
  /* get elapsed ticks */
   87:clock.c       ****         cdiff *= cdiv;
   88:clock.c       ****
   89:clock.c       ****         /* based on number of ticks assign speed */
   90:clock.c       ****         if (cdiff > 19000)
   91:clock.c       ****                 return S38_4M;
   92:clock.c       ****         else if (cdiff > 15200)
   93:clock.c       ****                 return S26M;
   94:clock.c       ****         else if (cdiff > 13000)
   95:clock.c       ****                 return S24M;
   96:clock.c       ****         else if (cdiff > 9000)
   97:clock.c       ****                 return S19_2M;
   98:clock.c       ****         else if (cdiff > 7600)
   99:clock.c       ****                 return S13M;
  100:clock.c       ****         else
  101:clock.c       ****                 return S12M;
  102:clock.c       **** }
  335                    .LM12:
  336 0070 0C009FE5      ldr r0,.L7+12
  337 0074 1EFF2FE1      bx lr
  338                    .L8:
  339                    .align 2
  340                    .L7:
  341 0078 404C0048      .word 1207979072
  342 007c 2C803148      .word 1211203628
  343 0080 10003248      .word 1211236368
  344 0084 001BB700      .word 12000000
  349                    .Lscope1:
  351                    .stabd 78,0,0
  352                    .align 2
  356                    .global get_sys_clkin_sel
  358                    get_sys_clkin_sel:
  359                    .stabd 46,0,0
  103:clock.c       ****
  104:clock.c       **** 
/******************************************************************************
  105:clock.c       ****  * get_sys_clkin_sel() - returns the 
sys_clkin_sel field value based on
  106:clock.c       ****  *                       input oscillator clock 
frequency.
  107:clock.c       **** 
*****************************************************************************/
  108:clock.c       **** void get_sys_clkin_sel(u32 osc_clk, u32 
*sys_clkin_sel)
  --------------

That means get_sys_clk_speed() will allways return S12M, at least that 
is what I'm reading here. And I don't see why gcc should be allowed to 
optimize that cdiff to a fixed value and therefor returning only S12M.

Any comments on that?

Regards,

Alexander

             reply	other threads:[~2010-12-17 14:01 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-12-17 14:01 Alexander Holler [this message]
2010-12-17 14:20 ` [U-Boot] oamp3: bug in clock.c with gcc 4.5.1? Wolfgang Denk
2010-12-17 20:33   ` Alexander Holler

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=4D0B6D1F.8010304@ahsoftware.de \
    --to=holler@ahsoftware.de \
    --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.