The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/mips/nlm/hal/nlm_hal.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
    3  *
    4  * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
    5  * reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions are
    9  * met:
   10  *
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice, this list of conditions and the following disclaimer.
   13  * 2. Redistributions in binary form must reproduce the above copyright
   14  *    notice, this list of conditions and the following disclaimer in
   15  *    the documentation and/or other materials provided with the
   16  *    distribution.
   17  *
   18  * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
   19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   21  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
   22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
   28  * THE POSSIBILITY OF SUCH DAMAGE.
   29  *
   30  * NETLOGIC_BSD */
   31 
   32 #include <sys/cdefs.h>
   33 __FBSDID("$FreeBSD$");
   34 #include <sys/param.h>
   35 #include <sys/types.h>
   36 #include <sys/systm.h>
   37 
   38 #include <mips/nlm/hal/mips-extns.h>
   39 #include <mips/nlm/hal/haldefs.h>
   40 #include <mips/nlm/hal/iomap.h>
   41 #include <mips/nlm/hal/sys.h>
   42 #include <mips/nlm/xlp.h>
   43 
   44 uint32_t
   45 xlp_get_cpu_frequency(int node, int core)
   46 {
   47         uint64_t sysbase = nlm_get_sys_regbase(node);
   48         unsigned int pll_divf, pll_divr, dfs_div, ext_div;
   49         unsigned int rstval, dfsval;
   50 
   51         rstval = nlm_read_sys_reg(sysbase, SYS_POWER_ON_RESET_CFG);
   52         dfsval = nlm_read_sys_reg(sysbase, SYS_CORE_DFS_DIV_VALUE);
   53         pll_divf = ((rstval >> 10) & 0x7f) + 1;
   54         pll_divr = ((rstval >> 8)  & 0x3) + 1;
   55         if (!nlm_is_xlp8xx_ax())
   56                 ext_div = ((rstval >> 30) & 0x3) + 1;
   57         else
   58                 ext_div = 1;
   59         dfs_div  = ((dfsval >> (core << 2)) & 0xf) + 1;
   60 
   61         return ((800000000ULL * pll_divf)/(3 * pll_divr * ext_div * dfs_div));
   62 }
   63 
   64 static u_int
   65 nlm_get_device_frequency(uint64_t sysbase, int devtype)
   66 {
   67         uint32_t pllctrl, dfsdiv, spf, spr, div_val;
   68         int extra_div;
   69 
   70         pllctrl = nlm_read_sys_reg(sysbase, SYS_PLL_CTRL);
   71         if (devtype <= 7)
   72                 div_val = nlm_read_sys_reg(sysbase, SYS_DFS_DIV_VALUE0);
   73         else {
   74                 devtype -= 8;
   75                 div_val = nlm_read_sys_reg(sysbase, SYS_DFS_DIV_VALUE1);
   76         }
   77         dfsdiv = ((div_val >> (devtype << 2)) & 0xf) + 1;
   78         spf = (pllctrl >> 3 & 0x7f) + 1;
   79         spr = (pllctrl >> 1 & 0x03) + 1;
   80         if (devtype == DFS_DEVICE_NAE && !nlm_is_xlp8xx_ax())
   81                 extra_div = 2;
   82         else
   83                 extra_div = 1;
   84 
   85         return ((400 * spf) / (3 * extra_div * spr * dfsdiv));
   86 }
   87 
   88 int
   89 nlm_set_device_frequency(int node, int devtype, int frequency)
   90 {
   91         uint64_t sysbase;
   92         u_int cur_freq;
   93         int dec_div;
   94 
   95         sysbase = nlm_get_sys_regbase(node);
   96         cur_freq = nlm_get_device_frequency(sysbase, devtype);
   97         if (cur_freq < (frequency - 5))
   98                 dec_div = 1;
   99         else
  100                 dec_div = 0;
  101 
  102         for(;;) {
  103                 if ((cur_freq >= (frequency - 5)) && (cur_freq <= frequency))
  104                         break;
  105                 if (dec_div)
  106                         nlm_write_sys_reg(sysbase, SYS_DFS_DIV_DEC_CTRL,
  107                             (1 << devtype));
  108                 else
  109                         nlm_write_sys_reg(sysbase, SYS_DFS_DIV_INC_CTRL,
  110                             (1 << devtype));
  111                 cur_freq = nlm_get_device_frequency(sysbase, devtype);
  112         }
  113         return (nlm_get_device_frequency(sysbase, devtype));
  114 }

Cache object: 5451e5a19471d0ba9c72c6e9f2e4c9e4


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.