For OMAP3530/TIAM37XX and OMAP4430, read the PLL regisers and calculate the

real CPU clock rate.
This commit is contained in:
matt 2012-08-29 18:05:41 +00:00
parent bbab09f832
commit f7f3afd51f
2 changed files with 89 additions and 15 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: beagle.h,v 1.6 2012/08/23 01:27:25 matt Exp $ */
/* $NetBSD: beagle.h,v 1.7 2012/08/29 18:05:41 matt Exp $ */
/*
* Copyright (c) 2007 Microsoft
* All rights reserved.
@ -56,6 +56,8 @@
#define OMAP_L4_PERIPHERAL_SIZE OMAP4430_L4_PERIPHERAL_SIZE
#define OMAP_L4_WAKEUP_BASE OMAP4430_L4_WAKEUP_BASE
#define OMAP_L4_WAKEUP_SIZE OMAP4430_L4_WAKEUP_SIZE
#define OMAP_L4_ABE_BASE OMAP4430_L4_ABE_BASE
#define OMAP_L4_ABE_SIZE OMAP4430_L4_ABE_SIZE
#endif
#ifdef TI_AM335X
@ -80,12 +82,18 @@
* We devmap IO starting at KERNEL_VM_BASE + KERNEL_VM_SIZE
*/
#define OMAP_KERNEL_IO_VBASE (KERNEL_VM_BASE + KERNEL_VM_SIZE)
#if defined(OMAP_3530) || defined(OMAP_4430)
#if defined(OMAP_3530)
#define OMAP_L4_CORE_VBASE OMAP_KERNEL_IO_VBASE
#define OMAP_L4_PERIPHERAL_VBASE (OMAP_L4_CORE_VBASE + OMAP_L4_CORE_SIZE)
#define OMAP_L4_WAKEUP_VBASE (OMAP_L4_PERIPHERAL_VBASE + OMAP_L4_PERIPHERAL_SIZE)
#define OMAP_KERNEL_IO_VEND (OMAP_L4_WAKEUP_VBASE + OMAP_L4_WAKEUP_SIZE)
#define CONSADDR_VA ((CONSADDR - OMAP_L4_PERIPHERAL_BASE) + OMAP_L4_PERIPHERAL_VBASE)
#elif defined(OMAP_4430)
#define OMAP_L4_CORE_VBASE OMAP_KERNEL_IO_VBASE
#define OMAP_L4_PERIPHERAL_VBASE (OMAP_L4_CORE_VBASE + OMAP_L4_CORE_SIZE)
#define OMAP_L4_ABE_VBASE (OMAP_L4_PERIPHERAL_VBASE + OMAP_L4_PERIPHERAL_SIZE)
#define OMAP_KERNEL_IO_VEND (OMAP_L4_ABE_VBASE + OMAP_L4_ABE_SIZE)
#define CONSADDR_VA ((CONSADDR - OMAP_L4_PERIPHERAL_BASE) + OMAP_L4_PERIPHERAL_VBASE)
#elif defined(TI_AM335X)
#define OMAP_L4_CORE_VBASE OMAP_KERNEL_IO_VBASE
#define OMAP_L4_PERIPHERAL_VBASE (OMAP_L4_CORE_VBASE + OMAP_L4_CORE_SIZE)

View File

@ -1,4 +1,4 @@
/* $NetBSD: beagle_machdep.c,v 1.17 2012/08/22 22:18:22 matt Exp $ */
/* $NetBSD: beagle_machdep.c,v 1.18 2012/08/29 18:05:41 matt 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.17 2012/08/22 22:18:22 matt Exp $");
__KERNEL_RCSID(0, "$NetBSD: beagle_machdep.c,v 1.18 2012/08/29 18:05:41 matt Exp $");
#include "opt_machdep.h"
#include "opt_ddb.h"
@ -137,15 +137,17 @@ __KERNEL_RCSID(0, "$NetBSD: beagle_machdep.c,v 1.17 2012/08/22 22:18:22 matt Exp
#include "prcm.h"
#include <sys/param.h>
#include <sys/device.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/bus.h>
#include <sys/cpu.h>
#include <sys/device.h>
#include <sys/exec.h>
#include <sys/proc.h>
#include <sys/kernel.h>
#include <sys/ksyms.h>
#include <sys/msgbuf.h>
#include <sys/proc.h>
#include <sys/reboot.h>
#include <sys/termios.h>
#include <sys/ksyms.h>
#include <uvm/uvm_extern.h>
@ -161,9 +163,6 @@ __KERNEL_RCSID(0, "$NetBSD: beagle_machdep.c,v 1.17 2012/08/22 22:18:22 matt Exp
#endif
#include <machine/bootconfig.h>
#include <sys/bus.h>
#include <machine/cpu.h>
#include <machine/frame.h>
#include <arm/armreg.h>
#include <arm/undefined.h>
@ -232,6 +231,12 @@ static void kgdb_port_init(void);
static void setup_real_page_tables(void);
static void init_clocks(void);
#if defined(OMAP_3530) || defined(TI_DM37XX)
static void omap3_cpu_clk(void);
#endif
#if defined(OMAP_4430)
static void omap4_cpu_clk(void);
#endif
bs_protos(bs_notimpl);
@ -366,9 +371,7 @@ static const struct pmap_devmap devmap[] = {
.pd_prot = VM_PROT_READ|VM_PROT_WRITE,
.pd_cache = PTE_NOCACHE
},
#if defined(OMAP_L4_WAKEUP_BASE) \
&& (OMAP_L4_WAKEUP_BASE < OMAP_L4_CORE_BASE \
|| OMAP_L4_CORE_BASE + OMAP_L4_CORE_SIZE <= OMAP_L4_WAKEUP_BASE)
#if defined(OMAP_L4_WAKEUP_BASE) && defined(OMAP_L4_WAKEUP_VBASE)
{
/*
* Map all 256KB of the L4 Wakeup area
@ -393,6 +396,19 @@ static const struct pmap_devmap devmap[] = {
.pd_prot = VM_PROT_READ|VM_PROT_WRITE,
.pd_cache = PTE_NOCACHE
},
#endif
#ifdef OMAP_L4_ABE_BASE
{
/*
* Map all of the L4 Fast area
* this gets us GPIO1, WDT2, GPT1, 32K and power/reset regs
*/
.pd_va = _A(OMAP_L4_ABE_VBASE),
.pd_pa = _A(OMAP_L4_ABE_BASE),
.pd_size = _S(OMAP_L4_ABE_SIZE),
.pd_prot = VM_PROT_READ|VM_PROT_WRITE,
.pd_cache = PTE_NOCACHE
},
#endif
{0}
};
@ -458,7 +474,13 @@ initarm(void *arg)
* peripherals and SDRAM. The temporary first level translation table
* is at the end of SDRAM.
*/
#if defined(OMAP_3530) || defined(TI_DM37XX)
omap3_cpu_clk(); // find our CPU speed.
#endif
#if defined(OMAP_4430)
if (0)
omap4_cpu_clk(); // find our CPU speed.
#endif
/* Heads up ... Setup the CPU / MMU / TLB functions. */
if (set_cpufuncs())
panic("cpu not recognized!");
@ -977,3 +999,47 @@ printf("\t%#lx:%#lx\n", kernel_pt_table[pt_index].pv_va, kernel_pt_table[pt_inde
printf("OK.\n");
#endif
}
#if defined(OMAP_3530) || defined(TI_DM37XX)
void
omap3_cpu_clk(void)
{
const vaddr_t prm_base = OMAP2_PRM_BASE - OMAP_L4_CORE_BASE + OMAP_L4_CORE_VBASE;
const uint32_t prm_clksel = *(volatile uint32_t *)(prm_base + PLL_MOD + OMAP3_PRM_CLKSEL);
static const uint32_t prm_clksel_freqs[] = OMAP3_PRM_CLKSEL_FREQS;
const uint32_t sys_clk = prm_clksel_freqs[__SHIFTOUT(prm_clksel, OMAP3_PRM_CLKSEL_CLKIN)];
const vaddr_t cm_base = OMAP2_CM_BASE - OMAP_L4_CORE_BASE + OMAP_L4_CORE_VBASE;
const uint32_t dpll1 = *(volatile uint32_t *)(cm_base + OMAP3_CM_CLKSEL1_PLL_MPU);
const uint32_t dpll2 = *(volatile uint32_t *)(cm_base + OMAP3_CM_CLKSEL2_PLL_MPU);
const uint32_t m = __SHIFTOUT(dpll1, OMAP3_CM_CLKSEL1_PLL_MPU_DPLL_MULT);
const uint32_t n = __SHIFTOUT(dpll1, OMAP3_CM_CLKSEL1_PLL_MPU_DPLL_DIV);
const uint32_t m2 = __SHIFTOUT(dpll2, OMAP3_CM_CLKSEL2_PLL_MPU_DPLL_CLKOUT_DIV);
/*
* MPU_CLK supplies ARM_FCLK which is twice the CPU frequency.
*/
curcpu()->ci_data.cpu_cc_freq = ((sys_clk * m) / ((n + 1) * m2 * 2)) * OMAP3_PRM_CLKSEL_MULT;
}
#endif /* OMAP_3530 || TI_DM37XX */
#if defined(OMAP_4430)
void
omap4_cpu_clk(void)
{
const vaddr_t prm_base = OMAP2_PRM_BASE - OMAP_L4_CORE_BASE + OMAP_L4_CORE_VBASE;
const vaddr_t cm_base = OMAP2_CM_BASE - OMAP_L4_CORE_BASE + OMAP_L4_CORE_VBASE;
static const uint32_t cm_clksel_freqs[] = OMAP4_CM_CLKSEL_FREQS;
const uint32_t prm_clksel = *(volatile uint32_t *)(prm_base + OMAP4_CM_SYS_CLKSEL);
const uint32_t sys_clk = cm_clksel_freqs[__SHIFTOUT(prm_clksel, OMAP4_CM_SYS_CLKSEL_CLKIN)];
const uint32_t dpll1 = *(volatile uint32_t *)(cm_base + OMAP4_CM_CLKSEL_DPLL_MPU);
const uint32_t dpll2 = *(volatile uint32_t *)(cm_base + OMAP4_CM_DIV_M2_DPLL_MPU);
const uint32_t m = __SHIFTOUT(dpll1, OMAP4_CM_CLKSEL_DPLL_MPU_DPLL_MULT);
const uint32_t n = __SHIFTOUT(dpll1, OMAP4_CM_CLKSEL_DPLL_MPU_DPLL_DIV);
const uint32_t m2 = __SHIFTOUT(dpll2, OMAP4_CM_DIV_M2_DPLL_MPU_DPLL_CLKOUT_DIV);
/*
* MPU_CLK supplies ARM_FCLK which is twice the CPU frequency.
*/
curcpu()->ci_data.cpu_cc_freq = ((sys_clk * 2 * m) / ((n + 1) * m2)) * OMAP4_CM_CLKSEL_MULT;
}
#endif /* OMAP_4400 */