[U-Boot] [PATCH 06/14] tegra: Add EMC support for optimal memory timings

Simon Glass sjg at chromium.org
Thu Jan 12 21:43:05 CET 2012


Hi Stephen,

On Mon, Jan 9, 2012 at 3:38 PM, Stephen Warren <swarren at nvidia.com> wrote:
> On 12/26/2011 12:32 PM, Simon Glass wrote:
>> From: Jimmy Zhang <jimmzhang at nvidia.com>
>>
>> Add support for setting up the memory controller parameters. Boards
>> can call tegra_set_emc() with a table containing the required
>> parameters.
> ...
>> diff --git a/arch/arm/cpu/armv7/tegra2/emc.c b/arch/arm/cpu/armv7/tegra2/emc.c
> ...
>> +static const struct tegra_emc_table *tegra_emc_table;
>> +static int tegra_emc_table_size;
>
> This isn't "table_size", but "number_of_tables" or "num_tables" or
> "table_count". This sounds nit-picky, but it made me think about this
> change more than I needed to given its simplicity.

OK changed to num_emc_tables.

>
>> +static const unsigned long emc_reg_addr[TEGRA_EMC_NUM_REGS] = {
>> +       0x2c,   /* RC */
>
> For reference, I validated that the order or registers here matches that
> in the DT binding that Olof published for the kernel, which is good.
>
> http://patchwork.ozlabs.org/patch/132928/

Yes I would hope so :-) Thanks for checking. I can't see it committed,
so will reply on that thread.

>
>> +/* The EMC registers have shadow registers.  When the EMC clock is updated
>> + * in the clock controller, the shadow registers are copied to the active
>> + * registers, allowing glitchless memory bus frequency changes.
>> + * This function updates the shadow registers for a new clock frequency,
>> + * and relies on the clock lock on the emc clock to avoid races between
>> + * multiple frequency changes */
>> +#define EMC_SDRAM_RATE_T20     (333000 * 2 * 1000)
>> +#define EMC_SDRAM_RATE_T25     (380000 * 2 * 1000)
> ...
>> +int tegra_set_emc(const struct tegra_emc_table *table, int table_size)
> ...
>> +       switch (tegra_get_chip_type()) {
>> +       case TEGRA_SOC_T20:
>> +               rate  = EMC_SDRAM_RATE_T20;
>> +               break;
>> +       case TEGRA_SOC_T25:
>> +               rate  = EMC_SDRAM_RATE_T25;
>> +               break;
>> +       default:
>> +               /* unknown chip type, no clk change*/
>> +               return -1;
>> +       }
>
> I'm not convinced that limiting this to those two specific clocks is
> correct. I've certainly seen BCTs that appear to run the EMC clock at
> other frequencies. Specifically, for Seaboard, we appear to have BCTs
> for 190, 333, 380, and 400MHz internally. I think a board should be able
> to at least override the default rate selected by that switch statement.

OK. It might be time to move this to the fdt, I will take a look.

>
> In tegra_emc_set_rate(), it's unclear to me why
> clock_ll_set_source_divisor() is used to trigger use of the new EMC
> register content, rather than say clock_set_rate(). I guess that's just
> how the HW work?

It should be possible to do something like:

	clock_adjust_periph_pll(PERIPH_ID_EMC, CLOCK_ID_MEMORY, 0,
				clock_get_rate(CLOCK_ID_MEMORY));

although it is a lot less efficient. I will try it.

Regards,
Simon

>
> --
> nvpublic


More information about the U-Boot mailing list