Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

MIPS: Netlogic: Add support for XLP 3XX cores

Add new processor ID to asm/cpu.h and kernel/cpu-probe.c.
Update to new CPU frequency detection code which works on XLP 3XX
and 8XX.

Signed-off-by: Jayachandran C <jayachandranc@netlogicmicro.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/2971/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>

authored by

Jayachandran C and committed by
Ralf Baechle
2aa54b20 66d29985

+21 -12
+3 -1
arch/mips/include/asm/cpu.h
··· 170 170 #define PRID_IMP_NETLOGIC_XLS408B 0x4e00 171 171 #define PRID_IMP_NETLOGIC_XLS404B 0x4f00 172 172 173 - #define PRID_IMP_NETLOGIC_XLP832 0x1000 173 + #define PRID_IMP_NETLOGIC_XLP8XX 0x1000 174 + #define PRID_IMP_NETLOGIC_XLP3XX 0x1100 175 + 174 176 /* 175 177 * Definitions for 7:0 on legacy processors 176 178 */
+2 -1
arch/mips/kernel/cpu-probe.c
··· 1025 1025 MIPS_CPU_LLSC); 1026 1026 1027 1027 switch (c->processor_id & 0xff00) { 1028 - case PRID_IMP_NETLOGIC_XLP832: 1028 + case PRID_IMP_NETLOGIC_XLP8XX: 1029 + case PRID_IMP_NETLOGIC_XLP3XX: 1029 1030 c->cputype = CPU_XLP; 1030 1031 __cpu_name[cpu] = "Netlogic XLP"; 1031 1032 break;
+16 -10
arch/mips/netlogic/xlp/nlm_hal.c
··· 86 86 } 87 87 } 88 88 89 - unsigned int nlm_get_cpu_frequency(void) 89 + unsigned int nlm_get_core_frequency(int core) 90 90 { 91 - unsigned int pll_divf, pll_divr, dfs_div, denom; 92 - unsigned int val; 91 + unsigned int pll_divf, pll_divr, dfs_div, ext_div; 92 + unsigned int rstval, dfsval, denom; 93 93 uint64_t num; 94 94 95 - val = nlm_read_sys_reg(nlm_sys_base, SYS_POWER_ON_RESET_CFG); 96 - pll_divf = (val >> 10) & 0x7f; 97 - pll_divr = (val >> 8) & 0x3; 98 - dfs_div = (val >> 17) & 0x3; 95 + rstval = nlm_read_sys_reg(nlm_sys_base, SYS_POWER_ON_RESET_CFG); 96 + dfsval = nlm_read_sys_reg(nlm_sys_base, SYS_CORE_DFS_DIV_VALUE); 97 + pll_divf = ((rstval >> 10) & 0x7f) + 1; 98 + pll_divr = ((rstval >> 8) & 0x3) + 1; 99 + ext_div = ((rstval >> 30) & 0x3) + 1; 100 + dfs_div = ((dfsval >> (core * 4)) & 0xf) + 1; 99 101 100 - num = pll_divf + 1; 101 - denom = 3 * (pll_divr + 1) * (1 << (dfs_div + 1)); 102 - num = num * 800000000ULL; 102 + num = 800000000ULL * pll_divf; 103 + denom = 3 * pll_divr * ext_div * dfs_div; 103 104 do_div(num, denom); 104 105 return (unsigned int)num; 106 + } 107 + 108 + unsigned int nlm_get_cpu_frequency(void) 109 + { 110 + return nlm_get_core_frequency(0); 105 111 }