|
|
|
@ -25,9 +25,8 @@ |
|
|
|
|
#include <common.h> |
|
|
|
|
#include <command.h> |
|
|
|
|
#include <watchdog.h> |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_FSL_PIXIS |
|
|
|
|
#include <asm/cache.h> |
|
|
|
|
|
|
|
|
|
#include "pixis.h" |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -184,7 +183,7 @@ int set_px_corepll(ulong corepll) |
|
|
|
|
|
|
|
|
|
void read_from_px_regs(int set) |
|
|
|
|
{ |
|
|
|
|
u8 mask = 0x1C; |
|
|
|
|
u8 mask = 0x1C; /* COREPLL, MPXPLL, SYSCLK controlled by PIXIS */ |
|
|
|
|
u8 tmp = in8(PIXIS_BASE + PIXIS_VCFGEN0); |
|
|
|
|
|
|
|
|
|
if (set) |
|
|
|
@ -197,7 +196,7 @@ void read_from_px_regs(int set) |
|
|
|
|
|
|
|
|
|
void read_from_px_regs_altbank(int set) |
|
|
|
|
{ |
|
|
|
|
u8 mask = 0x04; |
|
|
|
|
u8 mask = 0x04; /* FLASHBANK and FLASHMAP controlled by PIXIS */ |
|
|
|
|
u8 tmp = in8(PIXIS_BASE + PIXIS_VCFGEN1); |
|
|
|
|
|
|
|
|
|
if (set) |
|
|
|
@ -208,15 +207,26 @@ void read_from_px_regs_altbank(int set) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifndef CFG_PIXIS_VBOOT_MASK |
|
|
|
|
#define CFG_PIXIS_VBOOT_MASK 0x40 |
|
|
|
|
#define CFG_PIXIS_VBOOT_MASK (0x40) |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
void clear_altbank(void) |
|
|
|
|
{ |
|
|
|
|
u8 tmp; |
|
|
|
|
|
|
|
|
|
tmp = in8(PIXIS_BASE + PIXIS_VBOOT); |
|
|
|
|
tmp &= ~CFG_PIXIS_VBOOT_MASK; |
|
|
|
|
|
|
|
|
|
out8(PIXIS_BASE + PIXIS_VBOOT, tmp); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void set_altbank(void) |
|
|
|
|
{ |
|
|
|
|
u8 tmp; |
|
|
|
|
|
|
|
|
|
tmp = in8(PIXIS_BASE + PIXIS_VBOOT); |
|
|
|
|
tmp ^= CFG_PIXIS_VBOOT_MASK; |
|
|
|
|
tmp |= CFG_PIXIS_VBOOT_MASK; |
|
|
|
|
|
|
|
|
|
out8(PIXIS_BASE + PIXIS_VBOOT, tmp); |
|
|
|
|
} |
|
|
|
@ -227,11 +237,11 @@ void set_px_go(void) |
|
|
|
|
u8 tmp; |
|
|
|
|
|
|
|
|
|
tmp = in8(PIXIS_BASE + PIXIS_VCTL); |
|
|
|
|
tmp = tmp & 0x1E; |
|
|
|
|
tmp = tmp & 0x1E; /* clear GO bit */ |
|
|
|
|
out8(PIXIS_BASE + PIXIS_VCTL, tmp); |
|
|
|
|
|
|
|
|
|
tmp = in8(PIXIS_BASE + PIXIS_VCTL); |
|
|
|
|
tmp = tmp | 0x01; |
|
|
|
|
tmp = tmp | 0x01; /* set GO bit - start reset sequencer */ |
|
|
|
|
out8(PIXIS_BASE + PIXIS_VCTL, tmp); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -293,7 +303,7 @@ static ulong strfractoint(uchar *strptr) |
|
|
|
|
* simply create the intarr. |
|
|
|
|
*/ |
|
|
|
|
i = 0; |
|
|
|
|
while (strptr[i] != 46) { |
|
|
|
|
while (strptr[i] != '.') { |
|
|
|
|
if (strptr[i] == 0) { |
|
|
|
|
no_dec = 1; |
|
|
|
|
break; |
|
|
|
@ -313,7 +323,7 @@ static ulong strfractoint(uchar *strptr) |
|
|
|
|
} else { |
|
|
|
|
j = 0; |
|
|
|
|
i++; /* Skipping the decimal point */ |
|
|
|
|
while ((strptr[i] > 47) && (strptr[i] < 58)) { |
|
|
|
|
while ((strptr[i] >= '0') && (strptr[i] <= '9')) { |
|
|
|
|
decarr[j] = strptr[i]; |
|
|
|
|
i++; |
|
|
|
|
j++; |
|
|
|
@ -340,8 +350,14 @@ static ulong strfractoint(uchar *strptr) |
|
|
|
|
int |
|
|
|
|
pixis_reset_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) |
|
|
|
|
{ |
|
|
|
|
ulong val; |
|
|
|
|
ulong corepll; |
|
|
|
|
unsigned int i; |
|
|
|
|
char *p_cf = NULL; |
|
|
|
|
char *p_cf_sysclk = NULL; |
|
|
|
|
char *p_cf_corepll = NULL; |
|
|
|
|
char *p_cf_mpxpll = NULL; |
|
|
|
|
char *p_altbank = NULL; |
|
|
|
|
char *p_wd = NULL; |
|
|
|
|
unsigned int unknown_param = 0; |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* No args is a simple reset request. |
|
|
|
@ -351,116 +367,97 @@ pixis_reset_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) |
|
|
|
|
/* not reached */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (strcmp(argv[1], "cf") == 0) { |
|
|
|
|
for (i = 1; i < argc; i++) { |
|
|
|
|
if (strcmp(argv[i], "cf") == 0) { |
|
|
|
|
p_cf = argv[i]; |
|
|
|
|
if (i + 3 >= argc) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
p_cf_sysclk = argv[i+1]; |
|
|
|
|
p_cf_corepll = argv[i+2]; |
|
|
|
|
p_cf_mpxpll = argv[i+3]; |
|
|
|
|
i += 3; |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Reset with frequency changed: |
|
|
|
|
* cf <SYSCLK freq> <COREPLL ratio> <MPXPLL ratio> |
|
|
|
|
*/ |
|
|
|
|
if (argc < 5) { |
|
|
|
|
puts(cmdtp->usage); |
|
|
|
|
return 1; |
|
|
|
|
if (strcmp(argv[i], "altbank") == 0) { |
|
|
|
|
p_altbank = argv[i]; |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
read_from_px_regs(0); |
|
|
|
|
|
|
|
|
|
val = set_px_sysclk(simple_strtoul(argv[2], NULL, 10)); |
|
|
|
|
|
|
|
|
|
corepll = strfractoint((uchar *)argv[3]); |
|
|
|
|
val = val + set_px_corepll(corepll); |
|
|
|
|
val = val + set_px_mpxpll(simple_strtoul(argv[4], NULL, 10)); |
|
|
|
|
if (val == 3) { |
|
|
|
|
puts("Setting registers VCFGEN0 and VCTL\n"); |
|
|
|
|
read_from_px_regs(1); |
|
|
|
|
puts("Resetting board with values from "); |
|
|
|
|
puts("VSPEED0, VSPEED1, VCLKH, and VCLKL \n"); |
|
|
|
|
set_px_go(); |
|
|
|
|
} else { |
|
|
|
|
puts(cmdtp->usage); |
|
|
|
|
return 1; |
|
|
|
|
if (strcmp(argv[i], "wd") == 0) { |
|
|
|
|
p_wd = argv[i]; |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
while (1) ; /* Not reached */ |
|
|
|
|
|
|
|
|
|
} else if (strcmp(argv[1], "altbank") == 0) { |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Reset using alternate flash bank: |
|
|
|
|
*/ |
|
|
|
|
if (argv[2] == 0) { |
|
|
|
|
/*
|
|
|
|
|
* Reset from alternate bank without changing |
|
|
|
|
* frequency and without watchdog timer enabled. |
|
|
|
|
* altbank |
|
|
|
|
*/ |
|
|
|
|
read_from_px_regs(0); |
|
|
|
|
read_from_px_regs_altbank(0); |
|
|
|
|
if (argc > 2) { |
|
|
|
|
puts(cmdtp->usage); |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
puts("Setting registers VCFGNE1, VBOOT, and VCTL\n"); |
|
|
|
|
set_altbank(); |
|
|
|
|
read_from_px_regs_altbank(1); |
|
|
|
|
puts("Resetting board to boot from the other bank.\n"); |
|
|
|
|
set_px_go(); |
|
|
|
|
|
|
|
|
|
} else if (strcmp(argv[2], "cf") == 0) { |
|
|
|
|
/*
|
|
|
|
|
* Reset with frequency changed |
|
|
|
|
* altbank cf <SYSCLK freq> <COREPLL ratio> |
|
|
|
|
* <MPXPLL ratio> |
|
|
|
|
*/ |
|
|
|
|
read_from_px_regs(0); |
|
|
|
|
read_from_px_regs_altbank(0); |
|
|
|
|
val = set_px_sysclk(simple_strtoul(argv[3], NULL, 10)); |
|
|
|
|
corepll = strfractoint((uchar *)argv[4]); |
|
|
|
|
val = val + set_px_corepll(corepll); |
|
|
|
|
val = val + set_px_mpxpll(simple_strtoul(argv[5], |
|
|
|
|
NULL, 10)); |
|
|
|
|
if (val == 3) { |
|
|
|
|
puts("Setting registers VCFGEN0, VCFGEN1, VBOOT, and VCTL\n"); |
|
|
|
|
set_altbank(); |
|
|
|
|
read_from_px_regs(1); |
|
|
|
|
read_from_px_regs_altbank(1); |
|
|
|
|
puts("Enabling watchdog timer on the FPGA\n"); |
|
|
|
|
puts("Resetting board with values from "); |
|
|
|
|
puts("VSPEED0, VSPEED1, VCLKH and VCLKL "); |
|
|
|
|
puts("to boot from the other bank.\n"); |
|
|
|
|
set_px_go_with_watchdog(); |
|
|
|
|
} else { |
|
|
|
|
puts(cmdtp->usage); |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
unknown_param = 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
while (1) ; /* Not reached */ |
|
|
|
|
|
|
|
|
|
} else if (strcmp(argv[2], "wd") == 0) { |
|
|
|
|
/*
|
|
|
|
|
* Reset from alternate bank without changing |
|
|
|
|
* frequencies but with watchdog timer enabled: |
|
|
|
|
* altbank wd |
|
|
|
|
*/ |
|
|
|
|
read_from_px_regs(0); |
|
|
|
|
read_from_px_regs_altbank(0); |
|
|
|
|
puts("Setting registers VCFGEN1, VBOOT, and VCTL\n"); |
|
|
|
|
set_altbank(); |
|
|
|
|
read_from_px_regs_altbank(1); |
|
|
|
|
puts("Enabling watchdog timer on the FPGA\n"); |
|
|
|
|
puts("Resetting board to boot from the other bank.\n"); |
|
|
|
|
set_px_go_with_watchdog(); |
|
|
|
|
while (1) ; /* Not reached */ |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
puts(cmdtp->usage); |
|
|
|
|
/*
|
|
|
|
|
* Check that cf has all required parms |
|
|
|
|
*/ |
|
|
|
|
if ((p_cf && !(p_cf_sysclk && p_cf_corepll && p_cf_mpxpll)) |
|
|
|
|
|| unknown_param) { |
|
|
|
|
puts(cmdtp->help); |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* PIXIS seems to be sensitive to the ordering of |
|
|
|
|
* the registers that are touched. |
|
|
|
|
*/ |
|
|
|
|
read_from_px_regs(0); |
|
|
|
|
|
|
|
|
|
if (p_altbank) { |
|
|
|
|
read_from_px_regs_altbank(0); |
|
|
|
|
} |
|
|
|
|
clear_altbank(); |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Clock configuration specified. |
|
|
|
|
*/ |
|
|
|
|
if (p_cf) { |
|
|
|
|
unsigned long sysclk; |
|
|
|
|
unsigned long corepll; |
|
|
|
|
unsigned long mpxpll; |
|
|
|
|
|
|
|
|
|
sysclk = simple_strtoul(p_cf_sysclk, NULL, 10); |
|
|
|
|
corepll = strfractoint((uchar *) p_cf_corepll); |
|
|
|
|
mpxpll = simple_strtoul(p_cf_mpxpll, NULL, 10); |
|
|
|
|
|
|
|
|
|
if (!(set_px_sysclk(sysclk) |
|
|
|
|
&& set_px_corepll(corepll) |
|
|
|
|
&& set_px_mpxpll(mpxpll))) { |
|
|
|
|
puts(cmdtp->help); |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
read_from_px_regs(1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Altbank specified |
|
|
|
|
* |
|
|
|
|
* NOTE CHANGE IN BEHAVIOR: previous code would default |
|
|
|
|
* to enabling watchdog if altbank is specified. |
|
|
|
|
* Now the watchdog must be enabled explicitly using 'wd'. |
|
|
|
|
*/ |
|
|
|
|
if (p_altbank) { |
|
|
|
|
set_altbank(); |
|
|
|
|
read_from_px_regs_altbank(1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Reset with watchdog specified. |
|
|
|
|
*/ |
|
|
|
|
if (p_wd) { |
|
|
|
|
set_px_go_with_watchdog(); |
|
|
|
|
} else { |
|
|
|
|
puts(cmdtp->usage); |
|
|
|
|
return 1; |
|
|
|
|
set_px_go(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Shouldn't be reached. |
|
|
|
|
*/ |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -474,4 +471,3 @@ U_BOOT_CMD( |
|
|
|
|
" pixis_reset altbank cf <SYSCLK freq> <COREPLL ratio> <MPXPLL ratio>\n" |
|
|
|
|
" pixis_reset cf <SYSCLK freq> <COREPLL ratio> <MPXPLL ratio>\n" |
|
|
|
|
); |
|
|
|
|
#endif /* CONFIG_FSL_PIXIS */ |
|
|
|
|