Commit 751c9f68 authored by David Daney's avatar David Daney Committed by Ralf Baechle

MIPS: Oceton: Update model detection code for new chips.

Several newer chips were not covered, update the code to detect them.
This necessitates updating cvmx-mio-defs.h as well, because it has new
and required definitions.
Signed-off-by: default avatarDavid Daney <david.daney@cavium.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/2939/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 506d24be
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* Contact: support@caviumnetworks.com * Contact: support@caviumnetworks.com
* This file is part of the OCTEON SDK * This file is part of the OCTEON SDK
* *
* Copyright (c) 2003-2008 Cavium Networks * Copyright (c) 2003-2010 Cavium Networks
* *
* This file is free software; you can redistribute it and/or modify * This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, Version 2, as * it under the terms of the GNU General Public License, Version 2, as
...@@ -25,10 +25,6 @@ ...@@ -25,10 +25,6 @@
* Contact Cavium Networks for more information * Contact Cavium Networks for more information
***********************license end**************************************/ ***********************license end**************************************/
/*
* File defining functions for working with different Octeon
* models.
*/
#include <asm/octeon/octeon.h> #include <asm/octeon/octeon.h>
/** /**
...@@ -69,11 +65,12 @@ const char *octeon_model_get_string_buffer(uint32_t chip_id, char *buffer) ...@@ -69,11 +65,12 @@ const char *octeon_model_get_string_buffer(uint32_t chip_id, char *buffer)
char fuse_model[10]; char fuse_model[10];
uint32_t fuse_data = 0; uint32_t fuse_data = 0;
fus3.u64 = cvmx_read_csr(CVMX_L2D_FUS3); fus3.u64 = 0;
if (!OCTEON_IS_MODEL(OCTEON_CN6XXX))
fus3.u64 = cvmx_read_csr(CVMX_L2D_FUS3);
fus_dat2.u64 = cvmx_read_csr(CVMX_MIO_FUS_DAT2); fus_dat2.u64 = cvmx_read_csr(CVMX_MIO_FUS_DAT2);
fus_dat3.u64 = cvmx_read_csr(CVMX_MIO_FUS_DAT3); fus_dat3.u64 = cvmx_read_csr(CVMX_MIO_FUS_DAT3);
num_cores = cvmx_pop(cvmx_read_csr(CVMX_CIU_FUSE));
num_cores = cvmx_octeon_num_cores();
/* Make sure the non existent devices look disabled */ /* Make sure the non existent devices look disabled */
switch ((chip_id >> 8) & 0xff) { switch ((chip_id >> 8) & 0xff) {
...@@ -108,7 +105,7 @@ const char *octeon_model_get_string_buffer(uint32_t chip_id, char *buffer) ...@@ -108,7 +105,7 @@ const char *octeon_model_get_string_buffer(uint32_t chip_id, char *buffer)
* Assume pass number is encoded using <5:3><2:0>. Exceptions * Assume pass number is encoded using <5:3><2:0>. Exceptions
* will be fixed later. * will be fixed later.
*/ */
sprintf(pass, "%u.%u", ((chip_id >> 3) & 7) + 1, chip_id & 7); sprintf(pass, "%d.%d", (int)((chip_id >> 3) & 7) + 1, (int)chip_id & 7);
/* /*
* Use the number of cores to determine the last 2 digits of * Use the number of cores to determine the last 2 digits of
...@@ -116,6 +113,12 @@ const char *octeon_model_get_string_buffer(uint32_t chip_id, char *buffer) ...@@ -116,6 +113,12 @@ const char *octeon_model_get_string_buffer(uint32_t chip_id, char *buffer)
* later. * later.
*/ */
switch (num_cores) { switch (num_cores) {
case 32:
core_model = "80";
break;
case 24:
core_model = "70";
break;
case 16: case 16:
core_model = "60"; core_model = "60";
break; break;
...@@ -246,8 +249,8 @@ const char *octeon_model_get_string_buffer(uint32_t chip_id, char *buffer) ...@@ -246,8 +249,8 @@ const char *octeon_model_get_string_buffer(uint32_t chip_id, char *buffer)
break; break;
case 3: /* CN58XX */ case 3: /* CN58XX */
family = "58"; family = "58";
/* Special case. 4 core, no crypto */ /* Special case. 4 core, half cache (CP with half cache) */
if ((num_cores == 4) && fus_dat2.cn38xx.nocrypto) if ((num_cores == 4) && fus3.cn58xx.crip_1024k && !strncmp(suffix, "CP", 2))
core_model = "29"; core_model = "29";
/* Pass 1 uses different encodings for pass numbers */ /* Pass 1 uses different encodings for pass numbers */
...@@ -285,6 +288,9 @@ const char *octeon_model_get_string_buffer(uint32_t chip_id, char *buffer) ...@@ -285,6 +288,9 @@ const char *octeon_model_get_string_buffer(uint32_t chip_id, char *buffer)
suffix = "NSP"; suffix = "NSP";
if (fus_dat3.s.nozip) if (fus_dat3.s.nozip)
suffix = "SCP"; suffix = "SCP";
if (fus_dat3.s.bar2_en)
suffix = "NSPB2";
} }
if (fus3.cn56xx.crip_1024k) if (fus3.cn56xx.crip_1024k)
family = "54"; family = "54";
...@@ -301,6 +307,60 @@ const char *octeon_model_get_string_buffer(uint32_t chip_id, char *buffer) ...@@ -301,6 +307,60 @@ const char *octeon_model_get_string_buffer(uint32_t chip_id, char *buffer)
else else
family = "52"; family = "52";
break; break;
case 0x93: /* CN61XX */
family = "61";
if (fus_dat2.cn61xx.nocrypto && fus_dat2.cn61xx.dorm_crypto)
suffix = "AP";
if (fus_dat2.cn61xx.nocrypto)
suffix = "CP";
else if (fus_dat2.cn61xx.dorm_crypto)
suffix = "DAP";
else if (fus_dat3.cn61xx.nozip)
suffix = "SCP";
break;
case 0x90: /* CN63XX */
family = "63";
if (fus_dat3.s.l2c_crip == 2)
family = "62";
if (num_cores == 6) /* Other core counts match generic */
core_model = "35";
if (fus_dat2.cn63xx.nocrypto)
suffix = "CP";
else if (fus_dat2.cn63xx.dorm_crypto)
suffix = "DAP";
else if (fus_dat3.cn63xx.nozip)
suffix = "SCP";
else
suffix = "AAP";
break;
case 0x92: /* CN66XX */
family = "66";
if (num_cores == 6) /* Other core counts match generic */
core_model = "35";
if (fus_dat2.cn66xx.nocrypto && fus_dat2.cn66xx.dorm_crypto)
suffix = "AP";
if (fus_dat2.cn66xx.nocrypto)
suffix = "CP";
else if (fus_dat2.cn66xx.dorm_crypto)
suffix = "DAP";
else if (fus_dat3.cn66xx.nozip)
suffix = "SCP";
else
suffix = "AAP";
break;
case 0x91: /* CN68XX */
family = "68";
if (fus_dat2.cn68xx.nocrypto && fus_dat3.cn68xx.nozip)
suffix = "CP";
else if (fus_dat2.cn68xx.dorm_crypto)
suffix = "DAP";
else if (fus_dat3.cn68xx.nozip)
suffix = "SCP";
else if (fus_dat2.cn68xx.nocrypto)
suffix = "SP";
else
suffix = "AAP";
break;
default: default:
family = "XX"; family = "XX";
core_model = "XX"; core_model = "XX";
...@@ -310,49 +370,40 @@ const char *octeon_model_get_string_buffer(uint32_t chip_id, char *buffer) ...@@ -310,49 +370,40 @@ const char *octeon_model_get_string_buffer(uint32_t chip_id, char *buffer)
} }
clock_mhz = octeon_get_clock_rate() / 1000000; clock_mhz = octeon_get_clock_rate() / 1000000;
if (family[0] != '3') { if (family[0] != '3') {
int fuse_base = 384 / 8;
if (family[0] == '6')
fuse_base = 832 / 8;
/* Check for model in fuses, overrides normal decode */ /* Check for model in fuses, overrides normal decode */
/* This is _not_ valid for Octeon CN3XXX models */ /* This is _not_ valid for Octeon CN3XXX models */
fuse_data |= cvmx_fuse_read_byte(51); fuse_data |= cvmx_fuse_read_byte(fuse_base + 3);
fuse_data = fuse_data << 8; fuse_data = fuse_data << 8;
fuse_data |= cvmx_fuse_read_byte(50); fuse_data |= cvmx_fuse_read_byte(fuse_base + 2);
fuse_data = fuse_data << 8; fuse_data = fuse_data << 8;
fuse_data |= cvmx_fuse_read_byte(49); fuse_data |= cvmx_fuse_read_byte(fuse_base + 1);
fuse_data = fuse_data << 8; fuse_data = fuse_data << 8;
fuse_data |= cvmx_fuse_read_byte(48); fuse_data |= cvmx_fuse_read_byte(fuse_base);
if (fuse_data & 0x7ffff) { if (fuse_data & 0x7ffff) {
int model = fuse_data & 0x3fff; int model = fuse_data & 0x3fff;
int suffix = (fuse_data >> 14) & 0x1f; int suffix = (fuse_data >> 14) & 0x1f;
if (suffix && model) { if (suffix && model) {
/* /* Have both number and suffix in fuses, so both */
* Have both number and suffix in sprintf(fuse_model, "%d%c", model, 'A' + suffix - 1);
* fuses, so both
*/
sprintf(fuse_model, "%d%c",
model, 'A' + suffix - 1);
core_model = ""; core_model = "";
family = fuse_model; family = fuse_model;
} else if (suffix && !model) { } else if (suffix && !model) {
/* /* Only have suffix, so add suffix to 'normal' model number */
* Only have suffix, so add suffix to sprintf(fuse_model, "%s%c", core_model, 'A' + suffix - 1);
* 'normal' model number.
*/
sprintf(fuse_model, "%s%c", core_model,
'A' + suffix - 1);
core_model = fuse_model; core_model = fuse_model;
} else { } else {
/* /* Don't have suffix, so just use model from fuses */
* Don't have suffix, so just use
* model from fuses.
*/
sprintf(fuse_model, "%d", model); sprintf(fuse_model, "%d", model);
core_model = ""; core_model = "";
family = fuse_model; family = fuse_model;
} }
} }
} }
sprintf(buffer, "CN%s%sp%s-%d-%s", sprintf(buffer, "CN%s%sp%s-%d-%s", family, core_model, pass, clock_mhz, suffix);
family, core_model, pass, clock_mhz, suffix);
return buffer; return buffer;
} }
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment