| /******************************************************************************* |
| Copyright (C) Marvell International Ltd. and its affiliates |
| |
| ******************************************************************************** |
| Marvell GPL License Option |
| |
| If you received this File from Marvell, you may opt to use, redistribute and/or |
| modify this File in accordance with the terms and conditions of the General |
| Public License Version 2, June 1991 (the "GPL License"), a copy of which is |
| available along with the File in the license.txt file or by writing to the Free |
| Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or |
| on the worldwide web at http://www.gnu.org/licenses/gpl.txt. |
| |
| THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED |
| WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY |
| DISCLAIMED. The GPL License provides additional details about this warranty |
| disclaimer. |
| |
| *******************************************************************************/ |
| #include <common.h> |
| #if defined(CONFIG_CMD_SAR) |
| #include "cpu/mvCpu.h" |
| #include "ctrlEnv/mvCtrlEnvRegs.h" |
| #include "ctrlEnv/mvCtrlEnvLib.h" |
| #include "boardEnv/mvBoardEnvLib.h" |
| |
| #if defined CONFIG_ALLEYCAT3 |
| extern MV_BOARD_INFO *marvellAC3BoardInfoTbl[]; |
| MV_BOARD_INFO **mvMsysBoardInfoTbl = marvellAC3BoardInfoTbl; |
| #else |
| extern MV_BOARD_INFO *marvellBC2BoardInfoTbl[]; |
| MV_BOARD_INFO **mvMsysBoardInfoTbl = marvellBC2BoardInfoTbl; |
| #endif |
| /* |
| bc2 sample and reset register |
| # 4f # 4e # 4d # 4c # |
| # # # # # |
| #--|--|--|--|--#--|--|--|--|--#--|--|--|--|--#--|--|--|--|--# |
| # | | | | # | | | | # | | | | # | | | | # |
| #--|--|--|--|--#--|--|--|--|--#--|--|--|--|--#--|--|--|--|--# |
| # | # | | # | # # |
| #-P|-R|bootsel-#-R|-TM-f---|-CPU-f--|-CORE-f-#-----devid----# |
| */ |
| |
| enum { /* Update defaultValue[] if any change to this enum has made!*/ |
| CMD_CORE_CLK_FREQ = 0, |
| CMD_CPU_DDR_REQ, |
| #ifdef CONFIG_BOBCAT2 |
| CMD_TM_FREQ, |
| CMD_JTAG_CPU, |
| CMD_PTP_PLL, |
| CMD_OOB0_CON, |
| CMD_OOB1_CON, |
| CMD_PEX_GEN1, |
| #elif defined(CONFIG_ALLEYCAT3) |
| CMD_PCIE_CLOCK, |
| CMD_PLL_CLOCK, |
| CMD_AVS_MODE, |
| CMD_SLAVE_ADDR, |
| CMD_DEVICE_NUM, |
| CMD_DDR_ECC_EN, |
| #endif |
| CMD_BOARD_ID, |
| CMD_PCIE_MODE, |
| CMD_BOOTSRC, |
| CMD_DEVICE_ID, |
| CMD_DUMP, |
| CMD_DEFAULT, |
| CMD_UNKNOWN |
| }; |
| |
| |
| #ifdef CONFIG_BOBCAT2 |
| int defaultValue[] = { 0, /* Core clock */ |
| 3, /* CPU/DDR clock */ |
| 3, /* TM frequency */ |
| 1, /* JTAG CPU 1 == MSYS */ |
| 0, /* PTP PLL */ |
| 0, /* OOB0 connection */ |
| 0, /* OOB1 connection */ |
| 0, /* Force AMC RC GEN1 PCIe */ |
| 0, /* Board ID */ |
| 0, /* PCIe mode */ |
| 3, /* Boot source */ |
| 0 }; /* Device ID */ |
| MV_U32 coreClockTbl[] = MV_CORE_CLK_TBL_BC2; |
| MV_CPUDDR_MODE cpuDdrClkTbl[] = MV_CPU_DDR_CLK_TBL_BC2; |
| #elif defined(CONFIG_ALLEYCAT3) |
| int defaultValue[] = { 4, /* Core clock */ |
| 3, /* CPU/DDR clock */ |
| 0, /* PCIe clock */ |
| 1, /* PLL clock */ |
| 1, /* AVS Mode */ |
| 1, /* I2C/SMI Slave address */ |
| 0, /* Device number */ |
| 0, /* DDR ECC enable */ |
| 0, /* Board ID */ |
| 0, /* PCIe mode */ |
| 3, /* Boot source */ |
| 0 }; /* Device ID */ |
| |
| MV_U32 coreClockTbl[] = MV_CORE_CLK_TBL_AC3; |
| MV_CPUDDR_MODE cpuDdrClkTbl[] = MV_CPU_DDR_CLK_TBL_AC3; |
| #else |
| #error "Unknown MSYS family!" |
| #endif |
| |
| MV_TM_MODE tmClkTbl[] = MV_TM_CLK_TBL; |
| |
| typedef struct { |
| char bootstr[80]; |
| MV_STATUS internalFreq; |
| } MV_BOOT_SRC; |
| |
| MV_BOOT_SRC bootSrcTbl[] = { |
| { "BootROM enabled, Boot from Device (NOR) flash", MV_FALSE }, |
| { "BootROM enabled, Boot from NAND flash (on DEV_CSn[0])", MV_FALSE }, |
| { "BootROM enabled, Boot from UART", MV_FALSE }, |
| { "BootROM enabled, Boot from SPI0 (CS0)", MV_FALSE }, |
| { "Reserved. BootROM enabled, Boot from PCIe", MV_TRUE }, |
| { "BootROM enabled,Standby slave. Must set PCI-E as endpoint", MV_FALSE }, |
| { "BootROM enabled, UART debug prompt mode", MV_FALSE }, |
| { "Reserved BootROM disabled, Boot from SPI 0(CS0)", MV_TRUE } |
| }; |
| |
| void SatR_usage(void); |
| |
| static int sar_cmd_get(const char *cmd) |
| { |
| #if defined CONFIG_ALLEYCAT3 |
| MV_U32 revId = mvCtrlRevGet(); |
| #endif |
| |
| if (strcmp(cmd, "coreclock") == 0) |
| return CMD_CORE_CLK_FREQ; |
| if (strcmp(cmd, "freq") == 0) |
| return CMD_CPU_DDR_REQ; |
| #ifdef CONFIG_BOBCAT2 |
| if (strcmp(cmd, "tmfreq") == 0) |
| return CMD_TM_FREQ; |
| if (strcmp(cmd, "jtagcpu") == 0) |
| return CMD_JTAG_CPU; |
| if (strcmp(cmd, "ptppll") == 0) |
| return CMD_PTP_PLL; |
| if (strcmp(cmd, "oob0con") == 0) |
| return CMD_OOB0_CON; |
| if (strcmp(cmd, "oob1con") == 0) |
| return CMD_OOB1_CON; |
| if (strcmp(cmd, "pciegen1") == 0) |
| return CMD_PEX_GEN1; |
| #elif defined CONFIG_ALLEYCAT3 |
| if (strcmp(cmd, "pciclock") == 0) |
| return CMD_PCIE_CLOCK; |
| if (revId == MV_ALLEYCAT3_A0_ID) { |
| if (strcmp(cmd, "pllclock") == 0) |
| return CMD_PLL_CLOCK; |
| } else { |
| if (strcmp(cmd, "avsmode") == 0) |
| return CMD_AVS_MODE; |
| } |
| if (strcmp(cmd, "slaveaddr") == 0) |
| return CMD_SLAVE_ADDR; |
| if (strcmp(cmd, "devicenum") == 0) |
| return CMD_DEVICE_NUM; |
| if (strcmp(cmd, "ddreccenable") == 0) |
| return CMD_DDR_ECC_EN; |
| #endif |
| if (strcmp(cmd, "boardid") == 0) |
| return CMD_BOARD_ID; |
| if (strcmp(cmd, "pcimode") == 0) |
| return CMD_PCIE_MODE; |
| if (strcmp(cmd, "bootsrc") == 0) |
| return CMD_BOOTSRC; |
| if (strcmp(cmd, "deviceid") == 0) |
| return CMD_DEVICE_ID; |
| if (strcmp(cmd, "dump") == 0) |
| return CMD_DUMP; |
| if (strcmp(cmd, "default") == 0) |
| return CMD_DEFAULT; |
| return CMD_UNKNOWN; |
| } |
| |
| static int do_sar_list(int mode) |
| { |
| int i; |
| #if defined CONFIG_ALLEYCAT3 |
| MV_U32 revId = mvCtrlRevGet(); |
| #endif |
| |
| switch (mode) { |
| case CMD_CORE_CLK_FREQ: |
| printf("Determines the core clock frequency:\n"); |
| printf("\t| ID | Core clock (MHz) |\n"); |
| printf("\t--------------------------\n"); |
| for (i = 0; i < 7; i++) |
| printf("\t| %2d | %4d |\n", i, coreClockTbl[i]); |
| printf("\t--------------------------\n"); |
| break; |
| case CMD_CPU_DDR_REQ: |
| printf("Determines the CPU and DDR frequency:\n"); |
| printf("\t| ID | CPU Freq (MHz) | DDR Freq (MHz) |\n"); |
| printf("\t-----------------------------------------\n"); |
| for (i = 0; i < 7; i++) { |
| if (cpuDdrClkTbl[i].internalFreq) |
| continue; |
| printf("\t| %2d | %4d | %4d |\n", |
| i, cpuDdrClkTbl[i].cpuFreq, cpuDdrClkTbl[i].ddrFreq); |
| } |
| printf("\t-----------------------------------------\n"); |
| break; |
| #ifdef CONFIG_BOBCAT2 |
| case CMD_TM_FREQ: |
| printf("Determines the TM frequency:\n"); |
| printf("\t| ID | TM Freq (MHz) | DDR Freq (MHz) |\n"); |
| printf("\t----------------------------------------\n"); |
| printf("\t| 0 | Disabled | |\n"); |
| for (i = 1; i < 7; i++) { |
| if (tmClkTbl[i].internalFreq) |
| continue; |
| printf("\t| %2d | %4d | %4d |\n", |
| i, tmClkTbl[i].tmFreq, tmClkTbl[i].ddr3Freq); |
| } |
| printf("\t----------------------------------------\n"); |
| break; |
| case CMD_JTAG_CPU: |
| printf("Determines the JTAG to CPU connection:\n"); |
| printf("\t| ID | JTAG connection |\n"); |
| printf("\t------------------------\n"); |
| printf("\t| 0 | Cortex-M3 |\n"); |
| printf("\t| 1 | MSYS (PJ4B) |\n"); |
| printf("\t------------------------\n"); |
| break; |
| case CMD_PTP_PLL: |
| printf("Determines the PTP PLL multiplier configurtation:\n"); |
| printf("\t| ID | PTP PLL Multiplier |\n"); |
| printf("\t----------------------------\n"); |
| printf("\t| 0 | 20 |\n"); |
| printf("\t| 1 | 21.875 |\n"); |
| printf("\t----------------------------\n"); |
| break; |
| case CMD_OOB0_CON: |
| case CMD_OOB1_CON: |
| printf("Determines the OOB port 0/1 to Physical port connection:\n"); |
| printf("\t| ID | OOB port | Physical port |\n"); |
| printf("\t-----------------------------------\n"); |
| printf("\t| 0 | 0 | 20 (back panel) |\n"); |
| printf("\t| 1 | 0 | 0 (front panel) |\n"); |
| printf("\t| 2 | 0 | Not connected |\n"); |
| printf("\t-----------------------------------\n"); |
| printf("\t| 0 | 1 | 21 (back panel) |\n"); |
| printf("\t| 1 | 1 | 1 (front panel) |\n"); |
| printf("\t| 2 | 1 | Not connected |\n"); |
| printf("\t-----------------------------------\n"); |
| break; |
| case CMD_PEX_GEN1: |
| printf("Determines the PCIe GEN1 enforcement mode om AMC RC:\n"); |
| printf("\t| ID | Force PCIe GEN1 |\n"); |
| printf("\t----------------------------\n"); |
| printf("\t| 0 | Do not force |\n"); |
| printf("\t| 1 | Force GEN1 |\n"); |
| printf("\t----------------------------\n"); |
| break; |
| #elif defined CONFIG_ALLEYCAT3 |
| case CMD_DDR_ECC_EN: |
| printf("Determines the DDR ECC status:\n"); |
| printf("\t| ID | ECC status |\n"); |
| printf("\t------------------------\n"); |
| printf("\t| 0 | ECC Disabled |\n"); |
| printf("\t| 1 | ECC Enabled |\n"); |
| printf("\t------------------------\n"); |
| break; |
| case CMD_PCIE_CLOCK: |
| printf("Determines the PCI-E clock source:\n"); |
| printf("\t| ID | Clock source |\n"); |
| printf("\t-------------------------------------------\n"); |
| printf("\t| 0 | Internally generated by PLL |\n"); |
| printf("\t| 1 | External 100 MHz from PEX_CLK_P |\n"); |
| printf("\t-------------------------------------------\n"); |
| break; |
| case CMD_PLL_CLOCK: |
| if (revId == MV_ALLEYCAT3_A0_ID) { |
| printf("Determines the PLL VCO clock frequency:\n"); |
| printf("\t| ID | Clock freq (GHz) |\n"); |
| printf("\t--------------------------\n"); |
| printf("\t| 0 | 1 |\n"); |
| printf("\t| 1 | 2.5 |\n"); |
| printf("\t--------------------------\n"); |
| } else |
| printf("The filed is not available on this SoC revision\n"); |
| break; |
| case CMD_AVS_MODE: |
| if (revId != MV_ALLEYCAT3_A0_ID) { |
| printf("Determines the AVS operation mode:\n"); |
| printf("\t| ID | Mode |\n"); |
| printf("\t----------------\n"); |
| printf("\t| 0 | Slave |\n"); |
| printf("\t| 1 | Master |\n"); |
| printf("\t----------------\n"); |
| } else |
| printf("The filed is not available on this SoC revision\n"); |
| break; |
| case CMD_SLAVE_ADDR: |
| printf("Determines the CPU I2C/SMI address:\n"); |
| printf("\t| ID | CPU_SMI_I2C_ADDR[2] |\n"); |
| printf("\t-----------------------------\n"); |
| printf("\t| 0 | 0 |\n"); |
| printf("\t| 1 | 1 |\n"); |
| printf("\t-----------------------------\n"); |
| break; |
| case CMD_DEVICE_NUM: |
| printf("Determines the device number (0-3)\n"); |
| break; |
| #endif |
| case CMD_BOARD_ID: |
| printf("Determines the board ID (0-7)\n"); |
| printf("\t| ID | Board |\n"); |
| printf("\t----------------------------------\n"); |
| for (i = 0; i < MV_MARVELL_BOARD_NUM ; i++) |
| printf("\t| %d | %-22s |\n", i, mvMsysBoardInfoTbl[i]->boardName ); |
| printf("\t----------------------------------\n"); |
| break; |
| case CMD_PCIE_MODE: |
| printf("Determines the PCI-E mode:\n"); |
| printf("\t| ID | Mode |\n"); |
| printf("\t------------------------\n"); |
| printf("\t| 0 | Endpoint |\n"); |
| printf("\t| 1 | Root Complex |\n"); |
| printf("\t------------------------\n"); |
| break; |
| case CMD_BOOTSRC: |
| printf("Determines the Boot source device:\n"); |
| printf("\t| ID | Boot Source description |\n"); |
| printf("\t-----------------------------------------------------------------\n"); |
| for (i = 0; i < 7; i++) { |
| if (bootSrcTbl[i].internalFreq) |
| continue; |
| printf("\t| %2d | %s\n", i, bootSrcTbl[i].bootstr); |
| } |
| printf("\t-----------------------------------------------------------------\n"); |
| break; |
| case CMD_DEVICE_ID: |
| printf("Determines the device ID (0-31)\n"); |
| break; |
| case CMD_UNKNOWN: |
| default: |
| printf("Usage: sar list [options] (see help) \n"); |
| return 1; |
| } |
| return 0; |
| } |
| |
| static int do_sar_read(int mode) |
| { |
| MV_U8 tmp, i; |
| #if defined CONFIG_ALLEYCAT3 |
| MV_U32 revId = mvCtrlRevGet(); |
| #endif |
| |
| switch (mode) { |
| case CMD_CORE_CLK_FREQ: |
| if (mvBoardCoreFreqGet(&tmp) == MV_OK) |
| printf("coreclock\t\t= %d ==> Core @ %dMHz\n", tmp, coreClockTbl[tmp]); |
| else |
| printf("coreclock Error: failed reading Core Clock Frequency (PLL_0)\n"); |
| break; |
| |
| case CMD_CPU_DDR_REQ: |
| if (mvBoardCpuFreqGet(&tmp) == MV_OK) |
| printf("freq\t\t\t= %d ==> CPU @ %dMHz DDR @ %dMHz \n", tmp, |
| cpuDdrClkTbl[tmp].cpuFreq, cpuDdrClkTbl[tmp].ddrFreq); |
| else |
| printf("freq Error: failed reading CPU/DDR Clocks Frequency (PLL_1)\n"); |
| break; |
| |
| #ifdef CONFIG_BOBCAT2 |
| |
| case CMD_TM_FREQ: |
| if (mvBoardTmFreqGet(&tmp) == MV_OK) |
| printf("tmfreq\t\t\t= %d ==> TM @ %dMHz DDR3 @ %dMHz \n", tmp, tmClkTbl[tmp].tmFreq, tmClkTbl[tmp].ddr3Freq); |
| else |
| printf("tmfreq Error: failed reading TM Clock Frequency (PLL_2)\n"); |
| break; |
| |
| case CMD_JTAG_CPU: |
| if (mvBoardJtagCpuGet(&tmp) == MV_OK) |
| printf("jtagcpu \t\t= %d ==> %s\n", tmp, ((tmp == 0) ? "Cortex-M3" : "MSYS (PJ4B)")); |
| else |
| printf("jtagcpu Error: failed reading JTAG connection type\n"); |
| break; |
| |
| case CMD_PTP_PLL: |
| if (mvBoardPtpPllGet(&tmp) == MV_OK) |
| printf("ptppll \t\t= %d ==> %s\n", tmp, ((tmp == 0) ? "20" : "21.875")); |
| else |
| printf("ptppll Error: failed reading PTP PLL multiplier\n"); |
| break; |
| |
| case CMD_OOB0_CON: |
| case CMD_OOB1_CON: |
| i = mode == CMD_OOB0_CON ? 0 : 1; |
| if (mvBoardOobPortConnectionGet(i, &tmp) == MV_OK) { |
| if (tmp == 2) |
| printf("oob%dcon \t\t= %d ==> OOB port is disconnected\n", i, tmp); |
| else |
| printf("oob%dcon \t\t= %d ==> Physical port %d\n", i, tmp, ((tmp == 1) ? i : (20 + i))); |
| } else |
| printf("oob%dcon Error: failed reading PTP PLL multiplier\n", i); |
| break; |
| |
| case CMD_PEX_GEN1: |
| if (mvBoardForcePexGen1Get(&tmp) == MV_OK) |
| printf("pciegen1 \t\t= %d ==> %s\n", tmp, ((tmp == 0) ? "Do not enforce GEN1" : "Force GEN1 connection")); |
| else |
| printf("pciegen1 Error: failed reading PCIe GEN1 enforcement mode\n"); |
| break; |
| |
| #elif defined CONFIG_ALLEYCAT3 |
| case CMD_DDR_ECC_EN: |
| if (mvBoardDdrEccEnableGet(&tmp) == MV_OK) |
| printf("ddreccenable \t\t= %d ==> %s\n", tmp, |
| ((tmp == 0) ? "ECC Disabled" : "ECC Enabled")); |
| else |
| printf("ddreccenable Error: failed reading DDR Bus Width\n"); |
| break; |
| |
| case CMD_PCIE_CLOCK: |
| if (mvBoardPcieClockGet(&tmp) == MV_OK) |
| printf("pciclock \t\t= %d ==> %s\n", tmp, |
| ((tmp == 0) ? "Internally generated by PLL" : "External 100MHz from PEX_CLK_P")); |
| else |
| printf("pciclock Error: failed reading PCI-E clock\n"); |
| break; |
| |
| case CMD_PLL_CLOCK: |
| if (revId == MV_ALLEYCAT3_A0_ID) { |
| if (mvBoardPllClockGet(&tmp) == MV_OK) |
| printf("pllclock (PLL2 VCO)\t= %d ==> %s\n", tmp, ((tmp == 0) ? "1GHz" : "2.5GHz")); |
| else |
| printf("pllclock (PLL2 VCO) Error: failed reading PLL VCO clock\n"); |
| } else |
| printf("pllclock (PLL2 VCO)\t ==> <<Not available in this SoC revision>>\n"); |
| break; |
| |
| case CMD_AVS_MODE: |
| if (revId != MV_ALLEYCAT3_A0_ID) { |
| if (mvBoardAvsModeGet(&tmp) == MV_OK) |
| printf("avsmode \t\t= %d ==> %s\n", tmp, ((tmp == 0) ? "Slave" : "Master")); |
| else |
| printf("avsmode Error: failed reading AVS mode\n"); |
| } else |
| printf("avsmode \t\t ==> <<Not available on this SoC revision>>\n"); |
| break; |
| |
| case CMD_SLAVE_ADDR: |
| if (mvBoardSmiI2c2AddrGet(&tmp) == MV_OK) |
| printf("slaveaddr \t\t= %d ==> CPU_SMI_I2C_ADDR[2]=%d\n", tmp, tmp); |
| else |
| printf("slaveaddr Error: failed reading CPU I2C/SMI Slave address\n"); |
| break; |
| |
| case CMD_DEVICE_NUM: |
| if (mvBoardDeviceNumGet(&tmp) == MV_OK) |
| printf("devicenum\t\t= %d \n", tmp); |
| else |
| printf("devicenum Error: failed reading devicenum\n"); |
| break; |
| |
| #endif |
| case CMD_BOARD_ID: |
| if (mvBoardSarBoardIdGet(&tmp) == MV_OK) |
| printf("boardid\t\t\t= %d ==> %s\n", tmp, mvMsysBoardInfoTbl[tmp]->boardName); |
| else |
| printf("boardid Error: failed reading boardid\n"); |
| break; |
| |
| case CMD_PCIE_MODE: |
| if (mvBoardPcieModeGet(&tmp) == MV_OK) |
| printf("pcimode \t\t= %d ==> %s\n", tmp, ((tmp == 0) ? "Endpoint" : "Root Complex")); |
| else |
| printf("pcimode Error: failed reading PCI-E mode\n"); |
| break; |
| |
| case CMD_BOOTSRC: |
| if (mvBoardBootDevGet(&tmp) == MV_OK) |
| printf("bootsrc\t\t\t= %d ==> %s\n", tmp, bootSrcTbl[tmp].bootstr); |
| else |
| printf("bootsrc Error: failed reading Boot Source\n"); |
| break; |
| case CMD_DEVICE_ID: |
| if (mvBoardDeviceIdGet(&tmp) == MV_OK) |
| printf("deviceid\t\t= %d \n", tmp); |
| else |
| printf("deviceid Error: failed reading deviceid\n"); |
| break; |
| |
| case CMD_DUMP: |
| case CMD_UNKNOWN: |
| for (i = 0 ; i < CMD_DUMP; i++) |
| do_sar_read(i); |
| break; |
| case CMD_DEFAULT: |
| return 0; |
| default: |
| printf("Usage: sar list [options] (see help)\n"); |
| return 1; |
| |
| } |
| return 0; |
| } |
| |
| static int do_sar_write(int mode, int value) |
| { |
| MV_U8 tmp, i; |
| MV_STATUS rc = MV_OK; |
| #if defined CONFIG_ALLEYCAT3 |
| MV_U32 revId = mvCtrlRevGet(); |
| #endif |
| |
| tmp = (MV_U8)value; |
| switch (mode) { |
| case CMD_CORE_CLK_FREQ: |
| rc = mvBoardCoreFreqSet(tmp); |
| break; |
| case CMD_CPU_DDR_REQ: |
| if (((value < 0) || (value >= ARRAY_SIZE(cpuDdrClkTbl))) || |
| (cpuDdrClkTbl[value].internalFreq != MV_FALSE)) { |
| mvOsPrintf("S@R incorrect value for Freq: %d\n", value); |
| rc = MV_ERROR; |
| break; |
| } |
| rc = mvBoardCpuFreqSet(tmp); |
| break; |
| #ifdef CONFIG_BOBCAT2 |
| case CMD_TM_FREQ: |
| if (((value < 0) || (value >= ARRAY_SIZE(tmClkTbl))) || |
| (tmClkTbl[value].internalFreq != MV_FALSE)) { |
| mvOsPrintf("S@R incorrect value for TM Freq: %d\n", value); |
| rc = MV_ERROR; |
| break; |
| } |
| rc = mvBoardTmFreqSet(tmp); |
| break; |
| case CMD_JTAG_CPU: |
| rc = mvBoardJtagCpuSet(tmp); |
| break; |
| case CMD_PTP_PLL: |
| rc = mvBoardPtpPllSet(tmp); |
| break; |
| case CMD_OOB0_CON: |
| case CMD_OOB1_CON: |
| rc = mvBoardOobPortConnectionSet((mode == CMD_OOB0_CON ? 0 : 1), tmp); |
| break; |
| case CMD_PEX_GEN1: |
| rc = mvBoardForcePexGen1Set(tmp); |
| break; |
| #elif defined CONFIG_ALLEYCAT3 |
| case CMD_DDR_ECC_EN: |
| rc = mvBoardDdrEccEnableSet(tmp); |
| break; |
| case CMD_PCIE_CLOCK: |
| rc = mvBoardPcieClockSet(tmp); |
| break; |
| case CMD_PLL_CLOCK: |
| if (revId == MV_ALLEYCAT3_A0_ID) |
| rc = mvBoardPllClockSet(tmp); |
| break; |
| case CMD_AVS_MODE: |
| if (revId != MV_ALLEYCAT3_A0_ID) |
| rc = mvBoardAvsModeSet(tmp); |
| break; |
| case CMD_SLAVE_ADDR: |
| rc = mvBoardSmiI2c2AddrSet(tmp); |
| break; |
| case CMD_DEVICE_NUM: |
| rc = mvBoardDeviceNumSet(tmp); |
| break; |
| #endif |
| case CMD_BOARD_ID: |
| rc = mvBoardSarBoardIdSet(tmp); |
| break; |
| case CMD_PCIE_MODE: |
| rc = mvBoardPcieModeSet(tmp); |
| break; |
| case CMD_BOOTSRC: |
| rc = mvBoardBootDevSet(tmp); |
| break; |
| case CMD_DEVICE_ID: |
| rc = mvBoardDeviceIdSet(tmp); |
| break; |
| case CMD_DEFAULT: |
| for (i = 0 ; i < CMD_DUMP; i++) { |
| if (i == CMD_BOARD_ID) { |
| MV_U32 brdId = mvBoardIdGet(); |
| if ((brdId < MARVELL_BOARD_ID_BASE) || (brdId >= MV_MAX_MARVELL_BOARD_ID)) |
| mvOsPrintf("Bad Board ID returned - %d! Assigning default value!\n", brdId); |
| else |
| defaultValue[i] = brdId - MARVELL_BOARD_ID_BASE; /* Update default value with real board ID*/ |
| } |
| if (1 == do_sar_write(i, defaultValue[i])) |
| rc = MV_FALSE; |
| do_sar_read(i); |
| } |
| if (rc == MV_OK) |
| mvOsPrintf("\nRestored all S@R default values\n"); |
| break; |
| case CMD_UNKNOWN: |
| default: |
| printf("Usage: sar list [options] (see help) \n"); |
| return 1; |
| } |
| if (rc != MV_OK) { |
| mvOsPrintf("Write S@R failed!\n"); |
| return 1; |
| } |
| return 0; |
| } |
| |
| int do_sar(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) |
| { |
| const char *cmd; |
| int mode, value; |
| |
| /* need at least two arguments */ |
| if (argc < 2) |
| goto usage; |
| |
| cmd = argv[1]; |
| mode = sar_cmd_get(argv[2]); |
| |
| if(mvBoardIdGet() != MV_DEFAULT_BOARD_ID && mode != CMD_BOARD_ID) { |
| mvOsPrintf("Error: Sample at reset supports modifying only 'boardid' field for current board\n\n"); |
| goto usage; |
| } |
| |
| if (strcmp(cmd, "list") == 0) |
| return do_sar_list(mode); |
| else if (strcmp(cmd, "write") == 0) { |
| value = simple_strtoul(argv[3], NULL, 10); |
| if (do_sar_write(mode, value) == 0) |
| do_sar_read(mode); |
| return 0; |
| |
| } else if (strcmp(cmd, "read") == 0) |
| return do_sar_read(mode); |
| |
| usage: |
| cmd_usage(cmdtp); |
| return 1; |
| } |
| |
| U_BOOT_CMD(SatR, 6, 1, do_sar, |
| "Sample At Reset sub-system", |
| "list <field> - list configuration options for <field>\n\n" |
| "SatR read dump - print all SatR configuration values\n" |
| "SatR read <field> - print the requested <field> value\n\n" |
| "SatR write default - restore all SatR fields to their default values\n" |
| "SatR write <field> <val> - write the requested <field> <value>\n\n" |
| |
| "\tHW SatR fields\n" |
| "\t--------------\n" |
| "coreclock - Core frequency\n" |
| "freq - CPU DDR frequency\n" |
| "pcimode - PCIe mode (EP/RC)\n" |
| #ifdef CONFIG_BOBCAT2 |
| "tmfreq - TM frequency\n" |
| "jtagcpu - JTAG CPU connection\n" |
| "ptppll - PTP PLL multiplier\n" |
| "oob0con - OOB-0 to physical port connection\n" |
| "oob1con - OOB-1 to physical port connection\n" |
| "pciegen1 - Force PCIe GEN1 on AMC RC connection\n" |
| #elif defined CONFIG_ALLEYCAT3 |
| "pciclock - PCIe reference clock source\n" |
| "avsmode - Adaptive Voltage Scaling mode. Not valid for rev.A0\n" |
| "slaveaddr - I2C/SMI Slave Address\n" |
| "devicenum - Devicenum\n" |
| #endif |
| "bootsrc - Boot source\n" |
| "deviceid - Device ID\n" |
| "\n\tSW SatR fields\n" |
| "\t--------------\n" |
| "boardid - Board ID\n" |
| #ifdef CONFIG_ALLEYCAT3 |
| "ddreccenable - DDR ECC modes\n" |
| "\t----Legacy fileds----\n" |
| "pllclock - PLL2 VCO clock frequency. Valid for rev.A0 only\n" |
| #endif |
| ); |
| #endif /*defined(CONFIG_CMD_SAR)*/ |