Module Name: src Committed By: riastradh Date: Tue Dec 11 19:24:39 UTC 2012
Modified Files: src/sys/arch/arm/omap: omap2_reg.h src/sys/arch/evbarm/beagle: beagle_machdep.c Log Message: Detect the AM335x CPU frequency on the beaglebone. To generate a diff of this commit: cvs rdiff -u -r1.12 -r1.13 src/sys/arch/arm/omap/omap2_reg.h cvs rdiff -u -r1.23 -r1.24 src/sys/arch/evbarm/beagle/beagle_machdep.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/omap/omap2_reg.h diff -u src/sys/arch/arm/omap/omap2_reg.h:1.12 src/sys/arch/arm/omap/omap2_reg.h:1.13 --- src/sys/arch/arm/omap/omap2_reg.h:1.12 Tue Dec 11 01:54:42 2012 +++ src/sys/arch/arm/omap/omap2_reg.h Tue Dec 11 19:24:38 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: omap2_reg.h,v 1.12 2012/12/11 01:54:42 khorben Exp $ */ +/* $NetBSD: omap2_reg.h,v 1.13 2012/12/11 19:24:38 riastradh Exp $ */ /* * Copyright (c) 2007 Microsoft @@ -129,7 +129,7 @@ #define OMAP2_CM_BASE (OMAP4430_L4_CORE_BASE + 0x04000) #endif #ifdef TI_AM335X -#define OMAP2_CM_BASE TI_AM335X_L4_WAKEUP_BASE +#define OMAP2_CM_BASE (TI_AM335X_L4_WAKEUP_BASE + 0x200000) #endif #ifdef TI_DM37XX #define OMAP2_CM_BASE 0x48004000 @@ -316,6 +316,18 @@ #define OMAP4_CM_CLKSEL_DPLL_MPU_DPLL_DIV __BITS(6,0) #define OMAP4_CM_DIV_M2_DPLL_MPU_DPLL_CLKOUT_DIV __BITS(4,0) + +#define TI_AM335X_CM_CLKSEL_DPLL_MPU 0x2c +#define TI_AM335X_CM_CLKSEL_DPLL_MPU_DPLL_BYP_CLKSEL __BIT(23) +#define TI_AM335X_CM_CLKSEL_DPLL_MPU_DPLL_MULT __BITS(18,8) +#define TI_AM335X_CM_CLKSEL_DPLL_MPU_DPLL_DIV __BITS(6,0) + +#define TI_AM335X_CM_DIV_M2_DPLL_MPU 0xa8 +#define TI_AM335X_CM_DIV_M2_DPLL_MPU_ST_DPLL_CLKOUT __BIT(9) +#define TI_AM335X_CM_DIV_M2_DPLL_MPU_DPLL_CLKOUT_GATE_CTRL __BIT(8) +#define TI_AM335X_CM_DIV_M2_DPLL_MPU_DPLL_CLKOUT_DIVCHACK __BIT(5) +#define TI_AM335X_CM_DIV_M2_DPLL_MPU_DPLL_CLKOUT_DIV __BITS(4,0) + /* * Power Management registers base, offsets, and size */ Index: src/sys/arch/evbarm/beagle/beagle_machdep.c diff -u src/sys/arch/evbarm/beagle/beagle_machdep.c:1.23 src/sys/arch/evbarm/beagle/beagle_machdep.c:1.24 --- src/sys/arch/evbarm/beagle/beagle_machdep.c:1.23 Tue Dec 11 01:54:43 2012 +++ src/sys/arch/evbarm/beagle/beagle_machdep.c Tue Dec 11 19:24:38 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: beagle_machdep.c,v 1.23 2012/12/11 01:54:43 khorben Exp $ */ +/* $NetBSD: beagle_machdep.c,v 1.24 2012/12/11 19:24:38 riastradh Exp $ */ /* * Machine dependent functions for kernel setup for TI OSK5912 board. @@ -125,7 +125,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: beagle_machdep.c,v 1.23 2012/12/11 01:54:43 khorben Exp $"); +__KERNEL_RCSID(0, "$NetBSD: beagle_machdep.c,v 1.24 2012/12/11 19:24:38 riastradh Exp $"); #include "opt_machdep.h" #include "opt_ddb.h" @@ -173,6 +173,9 @@ __KERNEL_RCSID(0, "$NetBSD: beagle_machd #include <arm/omap/omap_var.h> #include <arm/omap/omap_wdtvar.h> #include <arm/omap/omap2_prcm.h> +#ifdef TI_AM335X +# include <arm/omap/am335x_prcm.h> +#endif #include <evbarm/include/autoconf.h> #include <evbarm/beagle/beagle.h> @@ -213,6 +216,9 @@ static void omap3_cpu_clk(void); #if defined(OMAP_4430) static void omap4_cpu_clk(void); #endif +#if defined(TI_AM335X) +static void am335x_cpu_clk(void); +#endif bs_protos(bs_notimpl); @@ -375,6 +381,9 @@ initarm(void *arg) #if defined(OMAP_4430) omap4_cpu_clk(); // find our CPU speed. #endif +#if defined(TI_AM335X) + am335x_cpu_clk(); +#endif /* Heads up ... Setup the CPU / MMU / TLB functions. */ if (set_cpufuncs()) panic("cpu not recognized!"); @@ -589,6 +598,26 @@ omap4_cpu_clk(void) } #endif /* OMAP_4400 */ +#if defined(TI_AM335X) +void +am335x_cpu_clk(void) +{ + const vaddr_t cm_base = OMAP2_CM_BASE - OMAP_L4_CORE_BASE + OMAP_L4_CORE_VBASE; + const vaddr_t cm_wkup_base = cm_base + AM335X_PRCM_CM_WKUP; + const uint32_t sys_clk = 24000000; + const uint32_t clksel_dpll_mpu = *(volatile uint32_t *)(cm_wkup_base + TI_AM335X_CM_CLKSEL_DPLL_MPU); + const uint32_t div_m2_dpll_mpu = *(volatile uint32_t *)(cm_wkup_base + TI_AM335X_CM_DIV_M2_DPLL_MPU); + const uint32_t m = __SHIFTOUT(clksel_dpll_mpu, TI_AM335X_CM_CLKSEL_DPLL_MPU_DPLL_MULT); + const uint32_t n = __SHIFTOUT(clksel_dpll_mpu, TI_AM335X_CM_CLKSEL_DPLL_MPU_DPLL_DIV); + const uint32_t m2 = __SHIFTOUT(div_m2_dpll_mpu, TI_AM335X_CM_DIV_M2_DPLL_MPU_DPLL_CLKOUT_DIV); + /* XXX This ignores CM_CLKSEL_DPLL_MPU[DPLL_REGM4XEN]. */ + curcpu()->ci_data.cpu_cc_freq = ((m * (sys_clk / (n + 1))) / m2); + printf("%s: %"PRIu64": sys_clk=%u m=%u n=%u (%u) m2=%u\n", + __func__, curcpu()->ci_data.cpu_cc_freq, + sys_clk, m, n, n+1, m2); +} +#endif + void beagle_device_register(device_t self, void *aux) {