Skip to content
Snippets Groups Projects
Commit 0aadf4aa authored by York Sun's avatar York Sun Committed by Andy Fleming
Browse files

powerpc/t4240qds: Add VDD override


Allow VDD voltage overriding with a command. This is an add-on feasture of
VID. To override VDD, use command vdd_override with the value of voltage
in mV, for example

vdd_override <voltage in mV, eg. 1050>

The above example will set the VDD to 1.050 volt. Any wrong value out of
range of 0.8188 to 1.2125 volt or invalid string is ignored.

In addition to the command, if overriding VDD is needed earlier in booting
process, save an variable and reboot:

setenv t4240qds_vdd_mv <voltage in mV>
saveenv

Signed-off-by: default avatarYork Sun <yorksun@freescale.com>
Signed-off-by: default avatarAndy Fleming <afleming@freescale.com>
parent 0c9ab437
No related branches found
No related tags found
No related merge requests found
...@@ -234,7 +234,7 @@ static inline int set_voltage(u8 vid) ...@@ -234,7 +234,7 @@ static inline int set_voltage(u8 vid)
} }
static int adjust_vdd(void) static int adjust_vdd(ulong vdd_override)
{ {
int re_enable = disable_interrupts(); int re_enable = disable_interrupts();
ccsr_gur_t __iomem *gur = ccsr_gur_t __iomem *gur =
...@@ -243,6 +243,8 @@ static int adjust_vdd(void) ...@@ -243,6 +243,8 @@ static int adjust_vdd(void)
u8 vid, vid_current; u8 vid, vid_current;
int vdd_target, vdd_current, vdd_last; int vdd_target, vdd_current, vdd_last;
int ret; int ret;
unsigned long vdd_string_override;
char *vdd_string;
static const uint16_t vdd[32] = { static const uint16_t vdd[32] = {
0, /* unused */ 0, /* unused */
9875, /* 0.9875V */ 9875, /* 0.9875V */
...@@ -292,6 +294,19 @@ static int adjust_vdd(void) ...@@ -292,6 +294,19 @@ static int adjust_vdd(void)
FSL_CORENET_DCFG_FUSESR_ALTVID_MASK; FSL_CORENET_DCFG_FUSESR_ALTVID_MASK;
} }
vdd_target = vdd[vid]; vdd_target = vdd[vid];
/* check override variable for overriding VDD */
vdd_string = getenv("t4240qds_vdd_mv");
if (vdd_override == 0 && vdd_string &&
!strict_strtoul(vdd_string, 10, &vdd_string_override))
vdd_override = vdd_string_override;
if (vdd_override >= 819 && vdd_override <= 1212) {
vdd_target = vdd_override * 10; /* convert to 1/10 mV */
debug("VDD override is %lu\n", vdd_override);
} else if (vdd_override != 0) {
printf("Invalid value.\n");
}
if (vdd_target == 0) { if (vdd_target == 0) {
debug("VID: VID not used\n"); debug("VID: VID not used\n");
ret = 0; ret = 0;
...@@ -511,7 +526,7 @@ int board_early_init_r(void) ...@@ -511,7 +526,7 @@ int board_early_init_r(void)
* Adjust core voltage according to voltage ID * Adjust core voltage according to voltage ID
* This function changes I2C mux to channel 2. * This function changes I2C mux to channel 2.
*/ */
if (adjust_vdd()) if (adjust_vdd(0))
printf("Warning: Adjusting core voltage failed.\n"); printf("Warning: Adjusting core voltage failed.\n");
/* Configure board SERDES ports crossbar */ /* Configure board SERDES ports crossbar */
...@@ -801,3 +816,23 @@ void qixis_dump_switch(void) ...@@ -801,3 +816,23 @@ void qixis_dump_switch(void)
i + 1, byte_to_binary_mask(sw[i], mask[i], buf), sw[i]); i + 1, byte_to_binary_mask(sw[i], mask[i], buf), sw[i]);
} }
} }
static int do_vdd_adjust(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
ulong override;
if (argc < 2)
return CMD_RET_USAGE;
if (!strict_strtoul(argv[1], 10, &override))
adjust_vdd(override); /* the value is checked by callee */
else
return CMD_RET_USAGE;
return 0;
}
U_BOOT_CMD(
vdd_override, 2, 0, do_vdd_adjust,
"Override VDD",
"- override with the voltage specified in mV, eg. 1050"
);
...@@ -96,3 +96,27 @@ The addresses in brackets are physical addresses. ...@@ -96,3 +96,27 @@ The addresses in brackets are physical addresses.
0x0_ffff_f000 (0x0_7fff_fff0) - 0x0_ffff_ffff 4KB Boot page translation for secondary cores 0x0_ffff_f000 (0x0_7fff_fff0) - 0x0_ffff_ffff 4KB Boot page translation for secondary cores
The physical address of the last (boot page translation) varies with the actual DDR size. The physical address of the last (boot page translation) varies with the actual DDR size.
Voltage ID and VDD override
--------------------
T4240 has a VID feature. U-boot reads the VID efuses and adjust the voltage
accordingly. The voltage can also be override by command vdd_override. The
syntax is
vdd_override <voltage in mV>, eg. 1050 is for 1.050v.
Upon success, the actual voltage will be read back. The value is checked
for safety and any invalid value will not adjust the voltage.
Another way to override VDD is to use environmental variable, in case of using
command is too late for some debugging. The syntax is
setenv t4240qds_vdd_mv <voltage in mV>
saveenv
reset
The override voltage takes effect when booting.
Note: voltage adjustment needs to be done step by step. Changing voltage too
rapidly may cause current surge. The voltage stepping is done by software.
Users can set the final voltage directly.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment