1215976Sjmallett/***********************license start*************** 2232812Sjmallett * Copyright (c) 2003-2010 Cavium Inc. (support@cavium.com). All rights 3215976Sjmallett * reserved. 4215976Sjmallett * 5215976Sjmallett * 6215976Sjmallett * Redistribution and use in source and binary forms, with or without 7215976Sjmallett * modification, are permitted provided that the following conditions are 8215976Sjmallett * met: 9215976Sjmallett * 10215976Sjmallett * * Redistributions of source code must retain the above copyright 11215976Sjmallett * notice, this list of conditions and the following disclaimer. 12215976Sjmallett * 13215976Sjmallett * * Redistributions in binary form must reproduce the above 14215976Sjmallett * copyright notice, this list of conditions and the following 15215976Sjmallett * disclaimer in the documentation and/or other materials provided 16215976Sjmallett * with the distribution. 17215976Sjmallett 18232812Sjmallett * * Neither the name of Cavium Inc. nor the names of 19215976Sjmallett * its contributors may be used to endorse or promote products 20215976Sjmallett * derived from this software without specific prior written 21215976Sjmallett * permission. 22215976Sjmallett 23215976Sjmallett * This Software, including technical data, may be subject to U.S. export control 24215976Sjmallett * laws, including the U.S. Export Administration Act and its associated 25215976Sjmallett * regulations, and may be subject to export or import regulations in other 26215976Sjmallett * countries. 27215976Sjmallett 28215976Sjmallett * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" 29232812Sjmallett * AND WITH ALL FAULTS AND CAVIUM INC. MAKES NO PROMISES, REPRESENTATIONS OR 30215976Sjmallett * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO 31215976Sjmallett * THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR 32215976Sjmallett * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM 33215976Sjmallett * SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE, 34215976Sjmallett * MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF 35215976Sjmallett * VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR 36215976Sjmallett * CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT OF USE OR 37215976Sjmallett * PERFORMANCE OF THE SOFTWARE LIES WITH YOU. 38215976Sjmallett ***********************license end**************************************/ 39215976Sjmallett 40215976Sjmallett 41215976Sjmallett 42215976Sjmallett 43215976Sjmallett 44215976Sjmallett 45215976Sjmallett 46215976Sjmallett/** 47215976Sjmallett * @file 48215976Sjmallett * 49215976Sjmallett * Interface to Core, IO and DDR Clock. 50215976Sjmallett * 51215976Sjmallett * <hr>$Revision: 45089 $<hr> 52215976Sjmallett*/ 53215976Sjmallett 54215976Sjmallett#ifndef __CVMX_CLOCK_H__ 55215976Sjmallett#define __CVMX_CLOCK_H__ 56215976Sjmallett 57215976Sjmallett#ifdef CVMX_BUILD_FOR_LINUX_KERNEL 58215976Sjmallett#include <asm/octeon/octeon.h> 59215976Sjmallett#include <asm/octeon/cvmx-lmcx-defs.h> 60215976Sjmallett#else 61215976Sjmallett#include "cvmx.h" 62215976Sjmallett#endif 63215976Sjmallett 64215976Sjmallett#ifdef __cplusplus 65215976Sjmallettextern "C" { 66215976Sjmallett#endif 67215976Sjmallett 68215976Sjmallett/** 69215976Sjmallett * Enumeration of different Clocks in Octeon. 70215976Sjmallett */ 71215976Sjmalletttypedef enum{ 72215976Sjmallett CVMX_CLOCK_RCLK, /**< Clock used by cores, coherent bus and L2 cache. */ 73215976Sjmallett CVMX_CLOCK_SCLK, /**< Clock used by IO blocks. */ 74215976Sjmallett CVMX_CLOCK_DDR, /**< Clock used by DRAM */ 75215976Sjmallett CVMX_CLOCK_CORE, /**< Alias for CVMX_CLOCK_RCLK */ 76215976Sjmallett CVMX_CLOCK_TIM, /**< Alias for CVMX_CLOCK_SCLK */ 77215976Sjmallett CVMX_CLOCK_IPD, /**< Alias for CVMX_CLOCK_SCLK */ 78215976Sjmallett} cvmx_clock_t; 79215976Sjmallett 80215976Sjmallett/** 81215976Sjmallett * Get cycle count based on the clock type. 82215976Sjmallett * 83215976Sjmallett * @param clock - Enumeration of the clock type. 84215976Sjmallett * @return - Get the number of cycles executed so far. 85215976Sjmallett */ 86215976Sjmallettstatic inline uint64_t cvmx_clock_get_count(cvmx_clock_t clock) 87215976Sjmallett{ 88215976Sjmallett switch(clock) 89215976Sjmallett { 90215976Sjmallett case CVMX_CLOCK_RCLK: 91215976Sjmallett case CVMX_CLOCK_CORE: 92215976Sjmallett { 93215976Sjmallett#ifndef __mips__ 94215976Sjmallett return cvmx_read_csr(CVMX_IPD_CLK_COUNT); 95215976Sjmallett#elif defined(CVMX_ABI_O32) 96215976Sjmallett uint32_t tmp_low, tmp_hi; 97215976Sjmallett 98215976Sjmallett asm volatile ( 99215976Sjmallett " .set push \n" 100215976Sjmallett " .set mips64r2 \n" 101215976Sjmallett " .set noreorder \n" 102215976Sjmallett " rdhwr %[tmpl], $31 \n" 103215976Sjmallett " dsrl %[tmph], %[tmpl], 32 \n" 104215976Sjmallett " sll %[tmpl], 0 \n" 105215976Sjmallett " sll %[tmph], 0 \n" 106215976Sjmallett " .set pop \n" 107215976Sjmallett : [tmpl] "=&r" (tmp_low), [tmph] "=&r" (tmp_hi) : ); 108215976Sjmallett 109215976Sjmallett return(((uint64_t)tmp_hi << 32) + tmp_low); 110215976Sjmallett#else 111215976Sjmallett uint64_t cycle; 112215976Sjmallett CVMX_RDHWR(cycle, 31); 113215976Sjmallett return(cycle); 114215976Sjmallett#endif 115215976Sjmallett } 116215976Sjmallett 117215976Sjmallett case CVMX_CLOCK_SCLK: 118215976Sjmallett case CVMX_CLOCK_TIM: 119215976Sjmallett case CVMX_CLOCK_IPD: 120215976Sjmallett return cvmx_read_csr(CVMX_IPD_CLK_COUNT); 121215976Sjmallett 122215976Sjmallett case CVMX_CLOCK_DDR: 123232812Sjmallett if (OCTEON_IS_MODEL(OCTEON_CN6XXX) || OCTEON_IS_MODEL(OCTEON_CNF7XXX)) 124215976Sjmallett return cvmx_read_csr(CVMX_LMCX_DCLK_CNT(0)); 125215976Sjmallett else 126215976Sjmallett return ((cvmx_read_csr(CVMX_LMCX_DCLK_CNT_HI(0)) << 32) | cvmx_read_csr(CVMX_LMCX_DCLK_CNT_LO(0))); 127215976Sjmallett } 128215976Sjmallett 129215976Sjmallett cvmx_dprintf("cvmx_clock_get_count: Unknown clock type\n"); 130215976Sjmallett return 0; 131215976Sjmallett} 132215976Sjmallett 133215976Sjmallettextern uint64_t cvmx_clock_get_rate(cvmx_clock_t clock); 134215976Sjmallett 135215976Sjmallett#ifdef __cplusplus 136215976Sjmallett} 137215976Sjmallett#endif 138215976Sjmallett 139215976Sjmallett#endif /* __CVMX_CLOCK_H__ */ 140