speed.c
来自「最新版的u-boot,2008-10-18发布」· C语言 代码 · 共 1,231 行 · 第 1/3 页
C
1,231 行
*/ sysInfo->pllPciDiv = (pllmr0 & PLLMR0_PCI_TO_PLB_MASK) + 1; /* * Determine EXTBUS_DIV. */ sysInfo->pllExtBusDiv = ((pllmr0 & PLLMR0_EXB_TO_PLB_MASK) >> 8) + 2; /* * Determine OPB_DIV. */ sysInfo->pllOpbDiv = ((pllmr0 & PLLMR0_OPB_TO_PLB_MASK) >> 12) + 1; /* * Determine the M factor */ m = sysInfo->pllFbkDiv * sysInfo->pllFwdDivB; /* * Determine VCO clock frequency */ sysInfo->freqVCOHz = (1000000000000LL * (unsigned long long)m) / (unsigned long long)sysClkPeriodPs; /* * Determine CPU clock frequency */ pllmr0_ccdv = ((pllmr0 & PLLMR0_CPU_DIV_MASK) >> 20) + 1; if (pllmr1 & PLLMR1_SSCS_MASK) { /* * This is true if FWDVA == FWDVB: * sysInfo->freqProcessor = (CONFIG_SYS_CLK_FREQ * sysInfo->pllFbkDiv) * / pllmr0_ccdv; */ sysInfo->freqProcessor = (CONFIG_SYS_CLK_FREQ * sysInfo->pllFbkDiv * sysInfo->pllFwdDivB) / sysInfo->pllFwdDiv / pllmr0_ccdv; } else { sysInfo->freqProcessor = CONFIG_SYS_CLK_FREQ / pllmr0_ccdv; } /* * Determine PLB clock frequency */ sysInfo->freqPLB = sysInfo->freqProcessor / sysInfo->pllPlbDiv; sysInfo->freqEBC = sysInfo->freqPLB / sysInfo->pllExtBusDiv; sysInfo->freqUART = sysInfo->freqProcessor * pllmr0_ccdv;}/******************************************** * get_OPB_freq * return OPB bus freq in Hz *********************************************/ulong get_OPB_freq (void){ ulong val = 0; PPC4xx_SYS_INFO sys_info; get_sys_info (&sys_info); val = sys_info.freqPLB / sys_info.pllOpbDiv; return val;}/******************************************** * get_PCI_freq * return PCI bus freq in Hz *********************************************/ulong get_PCI_freq (void){ ulong val; PPC4xx_SYS_INFO sys_info; get_sys_info (&sys_info); val = sys_info.freqPLB / sys_info.pllPciDiv; return val;}#elif defined(CONFIG_405EZ)void get_sys_info (PPC4xx_SYS_INFO * sysInfo){ unsigned long cpr_plld; unsigned long cpr_pllc; unsigned long cpr_primad; unsigned long sysClkPeriodPs = ONE_BILLION / (CONFIG_SYS_CLK_FREQ/1000); unsigned long primad_cpudv; unsigned long m; /* * Read PLL Mode registers */ mfcpr(cprplld, cpr_plld); mfcpr(cprpllc, cpr_pllc); /* * Determine forward divider A */ sysInfo->pllFwdDiv = ((cpr_plld & PLLD_FWDVA_MASK) >> 16); /* * Determine forward divider B */ sysInfo->pllFwdDivB = ((cpr_plld & PLLD_FWDVB_MASK) >> 8); if (sysInfo->pllFwdDivB == 0) sysInfo->pllFwdDivB = 8; /* * Determine FBK_DIV. */ sysInfo->pllFbkDiv = ((cpr_plld & PLLD_FBDV_MASK) >> 24); if (sysInfo->pllFbkDiv == 0) sysInfo->pllFbkDiv = 256; /* * Read CPR_PRIMAD register */ mfcpr(cprprimad, cpr_primad); /* * Determine PLB_DIV. */ sysInfo->pllPlbDiv = ((cpr_primad & PRIMAD_PLBDV_MASK) >> 16); if (sysInfo->pllPlbDiv == 0) sysInfo->pllPlbDiv = 16; /* * Determine EXTBUS_DIV. */ sysInfo->pllExtBusDiv = (cpr_primad & PRIMAD_EBCDV_MASK); if (sysInfo->pllExtBusDiv == 0) sysInfo->pllExtBusDiv = 16; /* * Determine OPB_DIV. */ sysInfo->pllOpbDiv = ((cpr_primad & PRIMAD_OPBDV_MASK) >> 8); if (sysInfo->pllOpbDiv == 0) sysInfo->pllOpbDiv = 16; /* * Determine the M factor */ if (cpr_pllc & PLLC_SRC_MASK) m = sysInfo->pllFbkDiv * sysInfo->pllFwdDivB; else m = sysInfo->pllFbkDiv * sysInfo->pllFwdDiv; /* * Determine VCO clock frequency */ sysInfo->freqVCOHz = (1000000000000LL * (unsigned long long)m) / (unsigned long long)sysClkPeriodPs; /* * Determine CPU clock frequency */ primad_cpudv = ((cpr_primad & PRIMAD_CPUDV_MASK) >> 24); if (primad_cpudv == 0) primad_cpudv = 16; sysInfo->freqProcessor = (CONFIG_SYS_CLK_FREQ * m) / sysInfo->pllFwdDiv / primad_cpudv; /* * Determine PLB clock frequency */ sysInfo->freqPLB = (CONFIG_SYS_CLK_FREQ * m) / sysInfo->pllFwdDiv / sysInfo->pllPlbDiv; sysInfo->freqEBC = (CONFIG_SYS_CLK_FREQ * sysInfo->pllFbkDiv) / sysInfo->pllExtBusDiv; sysInfo->freqUART = sysInfo->freqVCOHz;}/******************************************** * get_OPB_freq * return OPB bus freq in Hz *********************************************/ulong get_OPB_freq (void){ ulong val = 0; PPC4xx_SYS_INFO sys_info; get_sys_info (&sys_info); val = (CONFIG_SYS_CLK_FREQ * sys_info.pllFbkDiv) / sys_info.pllOpbDiv; return val;}#elif defined(CONFIG_405EX)/* * TODO: We need to get the CPR registers and calculate these values correctly!!!! * We need the specs!!!! */static unsigned char get_fbdv(unsigned char index){ unsigned char ret = 0; /* This is table should be 256 bytes. * Only take first 52 values. */ unsigned char fbdv_tb[] = { 0x00, 0xff, 0x7f, 0xfd, 0x7a, 0xf5, 0x6a, 0xd5, 0x2a, 0xd4, 0x29, 0xd3, 0x26, 0xcc, 0x19, 0xb3, 0x67, 0xce, 0x1d, 0xbb, 0x77, 0xee, 0x5d, 0xba, 0x74, 0xe9, 0x52, 0xa5, 0x4b, 0x96, 0x2c, 0xd8, 0x31, 0xe3, 0x46, 0x8d, 0x1b, 0xb7, 0x6f, 0xde, 0x3d, 0xfb, 0x76, 0xed, 0x5a, 0xb5, 0x6b, 0xd6, 0x2d, 0xdb, 0x36, 0xec, }; if ((index & 0x7f) == 0) return 1; while (ret < sizeof (fbdv_tb)) { if (fbdv_tb[ret] == index) break; ret++; } ret++; return ret;}#define PLL_FBK_PLL_LOCAL 0#define PLL_FBK_CPU 1#define PLL_FBK_PERCLK 5void get_sys_info (sys_info_t * sysInfo){ unsigned long sysClkPeriodPs = ONE_BILLION / (CONFIG_SYS_CLK_FREQ / 1000); unsigned long m = 1; unsigned int tmp; unsigned char fwdva[16] = { 1, 2, 14, 9, 4, 11, 16, 13, 12, 5, 6, 15, 10, 7, 8, 3, }; unsigned char sel, cpudv0, plb2xDiv; mfcpr(cpr0_plld, tmp); /* * Determine forward divider A */ sysInfo->pllFwdDiv = fwdva[((tmp >> 16) & 0x0f)]; /* FWDVA */ /* * Determine FBK_DIV. */ sysInfo->pllFbkDiv = get_fbdv(((tmp >> 24) & 0x0ff)); /* FBDV */ /* * Determine PLBDV0 */ sysInfo->pllPlbDiv = 2; /* * Determine PERDV0 */ mfcpr(cpr0_perd, tmp); tmp = (tmp >> 24) & 0x03; sysInfo->pllExtBusDiv = (tmp == 0) ? 4 : tmp; /* * Determine OPBDV0 */ mfcpr(cpr0_opbd, tmp); tmp = (tmp >> 24) & 0x03; sysInfo->pllOpbDiv = (tmp == 0) ? 4 : tmp; /* Determine PLB2XDV0 */ mfcpr(cpr0_plbd, tmp); tmp = (tmp >> 16) & 0x07; plb2xDiv = (tmp == 0) ? 8 : tmp; /* Determine CPUDV0 */ mfcpr(cpr0_cpud, tmp); tmp = (tmp >> 24) & 0x07; cpudv0 = (tmp == 0) ? 8 : tmp; /* Determine SEL(5:7) in CPR0_PLLC */ mfcpr(cpr0_pllc, tmp); sel = (tmp >> 24) & 0x07; /* * Determine the M factor * PLL local: M = FBDV * CPU clock: M = FBDV * FWDVA * CPUDV0 * PerClk : M = FBDV * FWDVA * PLB2XDV0 * PLBDV0(2) * OPBDV0 * PERDV0 * */ switch (sel) { case PLL_FBK_CPU: m = sysInfo->pllFwdDiv * cpudv0; break; case PLL_FBK_PERCLK: m = sysInfo->pllFwdDiv * plb2xDiv * 2 * sysInfo->pllOpbDiv * sysInfo->pllExtBusDiv; break; case PLL_FBK_PLL_LOCAL: break; default: printf("%s unknown m\n", __FUNCTION__); return; } m *= sysInfo->pllFbkDiv; /* * Determine VCO clock frequency */ sysInfo->freqVCOHz = (1000000000000LL * (unsigned long long)m) / (unsigned long long)sysClkPeriodPs; /* * Determine CPU clock frequency */ sysInfo->freqProcessor = sysInfo->freqVCOHz / (sysInfo->pllFwdDiv * cpudv0); /* * Determine PLB clock frequency, ddr1x should be the same */ sysInfo->freqPLB = sysInfo->freqVCOHz / (sysInfo->pllFwdDiv * plb2xDiv * 2); sysInfo->freqOPB = sysInfo->freqPLB/sysInfo->pllOpbDiv; sysInfo->freqDDR = sysInfo->freqPLB; sysInfo->freqEBC = sysInfo->freqOPB / sysInfo->pllExtBusDiv; sysInfo->freqUART = sysInfo->freqPLB;}/******************************************** * get_OPB_freq * return OPB bus freq in Hz *********************************************/ulong get_OPB_freq (void){ ulong val = 0; PPC4xx_SYS_INFO sys_info; get_sys_info (&sys_info); val = sys_info.freqPLB / sys_info.pllOpbDiv; return val;}#endifint get_clocks (void){#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \ defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \ defined(CONFIG_405EX) || defined(CONFIG_405) || \ defined(CONFIG_440) sys_info_t sys_info; get_sys_info (&sys_info); gd->cpu_clk = sys_info.freqProcessor; gd->bus_clk = sys_info.freqPLB;#endif /* defined(CONFIG_405GP) || defined(CONFIG_405CR) */#ifdef CONFIG_IOP480 gd->cpu_clk = 66000000; gd->bus_clk = 66000000;#endif return (0);}/******************************************** * get_bus_freq * return PLB bus freq in Hz *********************************************/ulong get_bus_freq (ulong dummy){ ulong val;#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \ defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \ defined(CONFIG_405EX) || defined(CONFIG_405) || \ defined(CONFIG_440) sys_info_t sys_info; get_sys_info (&sys_info); val = sys_info.freqPLB;#elif defined(CONFIG_IOP480) val = 66;#else# error get_bus_freq() not implemented#endif return val;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?