Module Name: src Committed By: jmcneill Date: Fri Feb 27 19:57:10 UTC 2015
Modified Files: src/sys/arch/arm/amlogic: amlogic_board.c amlogic_reg.h src/sys/arch/evbarm/amlogic: amlogic_machdep.c Added Files: src/sys/arch/arm/amlogic: amlogic_crureg.h Log Message: derive cpu freq from cbus regs To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/amlogic/amlogic_board.c \ src/sys/arch/arm/amlogic/amlogic_reg.h cvs rdiff -u -r0 -r1.1 src/sys/arch/arm/amlogic/amlogic_crureg.h cvs rdiff -u -r1.3 -r1.4 src/sys/arch/evbarm/amlogic/amlogic_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/amlogic/amlogic_board.c diff -u src/sys/arch/arm/amlogic/amlogic_board.c:1.1 src/sys/arch/arm/amlogic/amlogic_board.c:1.2 --- src/sys/arch/arm/amlogic/amlogic_board.c:1.1 Sat Feb 7 17:20:17 2015 +++ src/sys/arch/arm/amlogic/amlogic_board.c Fri Feb 27 19:57:10 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: amlogic_board.c,v 1.1 2015/02/07 17:20:17 jmcneill Exp $ */ +/* $NetBSD: amlogic_board.c,v 1.2 2015/02/27 19:57:10 jmcneill Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -29,7 +29,7 @@ #include "opt_amlogic.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: amlogic_board.c,v 1.1 2015/02/07 17:20:17 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: amlogic_board.c,v 1.2 2015/02/27 19:57:10 jmcneill Exp $"); #define _ARM32_BUS_DMA_PRIVATE #include <sys/param.h> @@ -43,6 +43,7 @@ __KERNEL_RCSID(0, "$NetBSD: amlogic_boar #include <arm/cpufunc.h> #include <arm/amlogic/amlogic_reg.h> +#include <arm/amlogic/amlogic_crureg.h> #include <arm/amlogic/amlogic_var.h> bus_space_handle_t amlogic_core_bsh; @@ -53,6 +54,14 @@ struct arm32_bus_dma_tag amlogic_dma_tag _BUS_DMATAG_FUNCS, }; +#define CBUS_READ(x) \ + bus_space_read_4(&amlogic_bs_tag, amlogic_core_bsh, (x)) + +static uint32_t amlogic_get_rate_xtal(void); +static uint32_t amlogic_get_rate_sys(void); +static uint32_t amlogic_get_rate_a9(void); + + void amlogic_bootstrap(void) { @@ -62,4 +71,79 @@ amlogic_bootstrap(void) AMLOGIC_CORE_SIZE, 0, &amlogic_core_bsh); if (error) panic("%s: failed to map CORE registers: %d", __func__, error); + + curcpu()->ci_data.cpu_cc_freq = amlogic_get_rate_a9(); +} + +static uint32_t +amlogic_get_rate_xtal(void) +{ + uint32_t ctlreg0; + + ctlreg0 = CBUS_READ(PREG_CTLREG0_ADDR_REG); + + return __SHIFTOUT(ctlreg0, PREG_CTLREG0_ADDR_CLKRATE) * 1000000; +} + +static uint32_t +amlogic_get_rate_sys(void) +{ + uint32_t cntl; + uint64_t clk; + u_int mul, div, od; + + clk = amlogic_get_rate_xtal(); + cntl = CBUS_READ(HHI_SYS_PLL_CNTL_REG); + mul = __SHIFTOUT(cntl, HHI_SYS_PLL_CNTL_MUL); + div = __SHIFTOUT(cntl, HHI_SYS_PLL_CNTL_DIV); + od = __SHIFTOUT(cntl, HHI_SYS_PLL_CNTL_OD); + + clk *= mul; + clk /= div; + clk >>= od; + + return (uint32_t)clk; +} + +static uint32_t +amlogic_get_rate_a9(void) +{ + uint32_t cntl0, cntl1; + uint32_t rate = 0; + + cntl0 = CBUS_READ(HHI_SYS_CPU_CLK_CNTL0_REG); + if (cntl0 & HHI_SYS_CPU_CLK_CNTL0_CLKSEL) { + switch (__SHIFTOUT(cntl0, HHI_SYS_CPU_CLK_CNTL0_PLLSEL)) { + case 0: + rate = amlogic_get_rate_xtal(); + break; + case 1: + rate = amlogic_get_rate_sys(); + break; + case 2: + rate = 1250000000; + break; + } + } else { + rate = amlogic_get_rate_xtal(); + } + + KASSERTMSG(rate != 0, "couldn't determine A9 rate"); + + switch (__SHIFTOUT(cntl0, HHI_SYS_CPU_CLK_CNTL0_SOUTSEL)) { + case 0: + break; + case 1: + rate /= 2; + break; + case 2: + rate /= 3; + break; + case 3: + cntl1 = CBUS_READ(HHI_SYS_CPU_CLK_CNTL1_REG); + rate /= (__SHIFTOUT(cntl1, HHI_SYS_CPU_CLK_CNTL1_SDIV) + 1); + break; + } + + return rate; } Index: src/sys/arch/arm/amlogic/amlogic_reg.h diff -u src/sys/arch/arm/amlogic/amlogic_reg.h:1.1 src/sys/arch/arm/amlogic/amlogic_reg.h:1.2 --- src/sys/arch/arm/amlogic/amlogic_reg.h:1.1 Sat Feb 7 17:20:17 2015 +++ src/sys/arch/arm/amlogic/amlogic_reg.h Fri Feb 27 19:57:10 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: amlogic_reg.h,v 1.1 2015/02/07 17:20:17 jmcneill Exp $ */ +/* $NetBSD: amlogic_reg.h,v 1.2 2015/02/27 19:57:10 jmcneill Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -35,6 +35,7 @@ #define AMLOGIC_CORE_SIZE 0x10200000 #define AMLOGIC_CORE_VBASE 0xe0000000 +#define AMLOGIC_CBUS_OFFSET 0x01100000 #define AMLOGIC_UART0_OFFSET 0x01102130 #define AMLOGIC_UART1_OFFSET 0x01102137 #define AMLOGIC_UART2_OFFSET 0x011021c0 Index: src/sys/arch/evbarm/amlogic/amlogic_machdep.c diff -u src/sys/arch/evbarm/amlogic/amlogic_machdep.c:1.3 src/sys/arch/evbarm/amlogic/amlogic_machdep.c:1.4 --- src/sys/arch/evbarm/amlogic/amlogic_machdep.c:1.3 Fri Feb 27 18:00:29 2015 +++ src/sys/arch/evbarm/amlogic/amlogic_machdep.c Fri Feb 27 19:57:10 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: amlogic_machdep.c,v 1.3 2015/02/27 18:00:29 jmcneill Exp $ */ +/* $NetBSD: amlogic_machdep.c,v 1.4 2015/02/27 19:57:10 jmcneill Exp $ */ /* * Machine dependent functions for kernel setup for TI OSK5912 board. @@ -125,7 +125,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: amlogic_machdep.c,v 1.3 2015/02/27 18:00:29 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: amlogic_machdep.c,v 1.4 2015/02/27 19:57:10 jmcneill Exp $"); #include "opt_machdep.h" #include "opt_ddb.h" @@ -435,12 +435,6 @@ initarm(void *arg) db_trap_callback = amlogic_db_trap; -#if notyet - curcpu()->ci_data.cpu_cc_freq = amlogic_cpu_get_rate(); -#else - curcpu()->ci_data.cpu_cc_freq = 1000000; -#endif - return initarm_common(KERNEL_VM_BASE, KERNEL_VM_SIZE, NULL, 0); } Added files: Index: src/sys/arch/arm/amlogic/amlogic_crureg.h diff -u /dev/null src/sys/arch/arm/amlogic/amlogic_crureg.h:1.1 --- /dev/null Fri Feb 27 19:57:10 2015 +++ src/sys/arch/arm/amlogic/amlogic_crureg.h Fri Feb 27 19:57:10 2015 @@ -0,0 +1,50 @@ +/* $NetBSD: amlogic_crureg.h,v 1.1 2015/02/27 19:57:10 jmcneill Exp $ */ + +/*- + * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _ARM_AMLOGIC_CRUREG_H +#define _ARM_AMLOGIC_CRUREG_H + +#define CBUS_REG(n) ((n) << 2) + +#define HHI_SYS_CPU_CLK_CNTL1_REG CBUS_REG(0x1057) +#define HHI_SYS_CPU_CLK_CNTL1_SDIV __BITS(29,20) + +#define HHI_SYS_CPU_CLK_CNTL0_REG CBUS_REG(0x1067) +#define HHI_SYS_CPU_CLK_CNTL0_CLKSEL __BIT(7) +#define HHI_SYS_CPU_CLK_CNTL0_SOUTSEL __BITS(3,2) +#define HHI_SYS_CPU_CLK_CNTL0_PLLSEL __BITS(1,0) + +#define HHI_SYS_PLL_CNTL_REG CBUS_REG(0x10c0) +#define HHI_SYS_PLL_CNTL_MUL __BITS(8,0) +#define HHI_SYS_PLL_CNTL_DIV __BITS(14,9) +#define HHI_SYS_PLL_CNTL_OD __BITS(17,16) + +#define PREG_CTLREG0_ADDR_REG CBUS_REG(0x2000) +#define PREG_CTLREG0_ADDR_CLKRATE __BITS(9,4) + +#endif /* _ARM_AMLOGIC_CRUREG_H */