[U-Boot] [PATCH v2] TI: DaVinci DA850 EVM: support passing device speed grade information to kernel

Nori, Sekhar nsekhar at ti.com
Thu Aug 12 17:38:57 CEST 2010


Hi Detlev,

On Thu, Aug 12, 2010 at 18:23:42, Detlev Zundel wrote:
> Hi Sekhar,
>
> > The TI DA850/OMAP-L138/AM18x EVM can be populated with devices
> > of different speed grades.
> >
> > The maximum speed the chip can support can only be determined from
> > the label on the package (not software readable).
> >
> > Introduce a method to pass the speed grade information to kernel
> > using ATAG_REVISION. The kernel uses this information to determine
> > the maximum speed reachable using cpufreq.
>
> Do I understand you correctly that you _misuses_ an atag defined to
> carry the revision of a CPU to carry the maximum allowed clock
> frequency?

The EVM can be populated with devices of different speed grades and this
patch treats those as different revisions of the EVM. Why would this be
treated as a misuse of ATAG_REVISION?

>  Is this really a good idea?  I can easily imagine different
> CPU revisions with different maximum clock frequencies.  How will you
> handle that?

I don't think I understood you. This patch _is_ meant to handle
different revisions of DA850 EVMs populated with DA850 devices
of differing speed grades.

>
> Is the counterpart in the Linux kernel already implemented?

It is implemented, but its submission upstream depends on this patch.

>
> > Note that U-Boot itself does not set the CPU rate. The CPU
> > speed is setup by a primary bootloader ("UBL"). The rate setup
> > by UBL could be different from the maximum speed grade of the
> > device.
>
> I do not understand how the UBL gets to set the _U-Boot_ environment
> variable "maxspeed".  Can you please explain how this is done?

UBL does not (cannot) set the maxspeed variable. The user of U-Boot is
expected to set it based on what he sees on the packaging. Alternately
he can also change the U-Boot configuration file and re-build U-Boot.
UBL will setup the board to work at the common frequency of 300 MHz.

>
> > Signed-off-by: Sekhar Nori <nsekhar at ti.com>
> > ---
> > v2: removed unnecessary logical OR while constructing revision value
> >
> >  board/davinci/da8xxevm/da850evm.c |   38 +++++++++++++++++++++++++++++++++++++
> >  include/configs/da850evm.h        |    1 +
> >  2 files changed, 39 insertions(+), 0 deletions(-)
> >
> > diff --git a/board/davinci/da8xxevm/da850evm.c b/board/davinci/da8xxevm/da850evm.c
> > index eeb456c..0eb3608 100644
> > --- a/board/davinci/da8xxevm/da850evm.c
> > +++ b/board/davinci/da8xxevm/da850evm.c
> > @@ -70,6 +70,44 @@ static const struct lpsc_resource lpsc[] = {
> >     { DAVINCI_LPSC_GPIO },
> >  };
> >
> > +#ifndef CONFIG_DA850_EVM_MAX_SPEED
> > +#define CONFIG_DA850_EVM_MAX_SPEED 300000
> > +#endif
> > +
> > +/*
> > + * get_board_rev() - setup to pass kernel board revision information
> > + * Returns:
> > + * bit[0-3]        Maximum speed supported by the DA850/OMAP-L138/AM18x part
> > + *         0 - 300 MHz
> > + *         1 - 372 MHz
> > + *         2 - 408 MHz
> > + *         3 - 456 MHz
>
> The description says it returns "bit[0-3]" which may seem that those
> canstants are encoded by a single bit each, whereas the code uses
> integer values.  Change either the comment or the code.

[0-3] usually indicates the range the range 0 to 3. Do you have
suggestions on how else this might be documented?

>
> > + */
> > +u32 get_board_rev(void)
> > +{
> > +   char *s;
> > +   u32 maxspeed = CONFIG_DA850_EVM_MAX_SPEED;
> > +   u32 rev = 0;
> > +
> > +   s = getenv("maxspeed");
>
> You introduce a new "magic" environment variable, so it should be
> documented at least in a board specific readme file.

Sure. Will do.

>
> Moreover I do not like that you call the variable "maxpseed" but
> interpret the value in kHz.  Maybe the variable should be called
> "maxspeed_khz"?

I am hoping the documentation promised in the response above
will help clarify its usage. I wanted to keep the variable name
short.

>
> > +   if (s)
> > +           maxspeed = simple_strtoul(s, NULL, 10);
> > +
> > +   switch (maxspeed) {
> > +   case 456000:
> > +           rev = 3;
> > +           break;
> > +   case 408000:
> > +           rev = 2;
> > +           break;
> > +   case 372000:
> > +           rev = 1;
> > +           break;
> > +   }
>
> Although the speeds are maximum values you check for _exact_ matches.
> Does this make sense?  Why not use increasing "less than" compares?

Can do and will change.

Thanks for the feedback!

Thanks,
Sekhar



More information about the U-Boot mailing list