~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/mips/sibyte/sb1250/setup.c

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0-or-later
  2 /*
  3  * Copyright (C) 2000, 2001, 2002, 2003 Broadcom Corporation
  4  */
  5 #include <linux/export.h>
  6 #include <linux/init.h>
  7 #include <linux/kernel.h>
  8 #include <linux/reboot.h>
  9 #include <linux/string.h>
 10 
 11 #include <asm/bootinfo.h>
 12 #include <asm/cpu.h>
 13 #include <asm/mipsregs.h>
 14 #include <asm/io.h>
 15 #include <asm/sibyte/sb1250.h>
 16 #include <asm/sibyte/sb1250_regs.h>
 17 #include <asm/sibyte/sb1250_scd.h>
 18 
 19 unsigned int sb1_pass;
 20 unsigned int soc_pass;
 21 unsigned int soc_type;
 22 EXPORT_SYMBOL(soc_type);
 23 unsigned int periph_rev;
 24 EXPORT_SYMBOL_GPL(periph_rev);
 25 unsigned int zbbus_mhz;
 26 EXPORT_SYMBOL(zbbus_mhz);
 27 
 28 static char *soc_str;
 29 static char *pass_str;
 30 static unsigned int war_pass;   /* XXXKW don't overload PASS defines? */
 31 
 32 static int __init setup_bcm1250(void)
 33 {
 34         int ret = 0;
 35 
 36         switch (soc_pass) {
 37         case K_SYS_REVISION_BCM1250_PASS1:
 38                 periph_rev = 1;
 39                 pass_str = "Pass 1";
 40                 break;
 41         case K_SYS_REVISION_BCM1250_A10:
 42                 periph_rev = 2;
 43                 pass_str = "A8/A10";
 44                 /* XXXKW different war_pass? */
 45                 war_pass = K_SYS_REVISION_BCM1250_PASS2;
 46                 break;
 47         case K_SYS_REVISION_BCM1250_PASS2_2:
 48                 periph_rev = 2;
 49                 pass_str = "B1";
 50                 break;
 51         case K_SYS_REVISION_BCM1250_B2:
 52                 periph_rev = 2;
 53                 pass_str = "B2";
 54                 war_pass = K_SYS_REVISION_BCM1250_PASS2_2;
 55                 break;
 56         case K_SYS_REVISION_BCM1250_PASS3:
 57                 periph_rev = 3;
 58                 pass_str = "C0";
 59                 break;
 60         case K_SYS_REVISION_BCM1250_C1:
 61                 periph_rev = 3;
 62                 pass_str = "C1";
 63                 break;
 64         default:
 65                 if (soc_pass < K_SYS_REVISION_BCM1250_PASS2_2) {
 66                         periph_rev = 2;
 67                         pass_str = "A0-A6";
 68                         war_pass = K_SYS_REVISION_BCM1250_PASS2;
 69                 } else {
 70                         printk("Unknown BCM1250 rev %x\n", soc_pass);
 71                         ret = 1;
 72                 }
 73                 break;
 74         }
 75 
 76         return ret;
 77 }
 78 
 79 int sb1250_m3_workaround_needed(void)
 80 {
 81         switch (soc_type) {
 82         case K_SYS_SOC_TYPE_BCM1250:
 83         case K_SYS_SOC_TYPE_BCM1250_ALT:
 84         case K_SYS_SOC_TYPE_BCM1250_ALT2:
 85         case K_SYS_SOC_TYPE_BCM1125:
 86         case K_SYS_SOC_TYPE_BCM1125H:
 87                 return soc_pass < K_SYS_REVISION_BCM1250_C0;
 88 
 89         default:
 90                 return 0;
 91         }
 92 }
 93 
 94 static int __init setup_bcm112x(void)
 95 {
 96         int ret = 0;
 97 
 98         switch (soc_pass) {
 99         case 0:
100                 /* Early build didn't have revid set */
101                 periph_rev = 3;
102                 pass_str = "A1";
103                 war_pass = K_SYS_REVISION_BCM112x_A1;
104                 break;
105         case K_SYS_REVISION_BCM112x_A1:
106                 periph_rev = 3;
107                 pass_str = "A1";
108                 break;
109         case K_SYS_REVISION_BCM112x_A2:
110                 periph_rev = 3;
111                 pass_str = "A2";
112                 break;
113         case K_SYS_REVISION_BCM112x_A3:
114                 periph_rev = 3;
115                 pass_str = "A3";
116                 break;
117         case K_SYS_REVISION_BCM112x_A4:
118                 periph_rev = 3;
119                 pass_str = "A4";
120                 break;
121         case K_SYS_REVISION_BCM112x_B0:
122                 periph_rev = 3;
123                 pass_str = "B0";
124                 break;
125         default:
126                 printk("Unknown %s rev %x\n", soc_str, soc_pass);
127                 ret = 1;
128         }
129 
130         return ret;
131 }
132 
133 /* Setup code likely to be common to all SiByte platforms */
134 
135 static int __init sys_rev_decode(void)
136 {
137         int ret = 0;
138 
139         war_pass = soc_pass;
140         switch (soc_type) {
141         case K_SYS_SOC_TYPE_BCM1250:
142         case K_SYS_SOC_TYPE_BCM1250_ALT:
143         case K_SYS_SOC_TYPE_BCM1250_ALT2:
144                 soc_str = "BCM1250";
145                 ret = setup_bcm1250();
146                 break;
147         case K_SYS_SOC_TYPE_BCM1120:
148                 soc_str = "BCM1120";
149                 ret = setup_bcm112x();
150                 break;
151         case K_SYS_SOC_TYPE_BCM1125:
152                 soc_str = "BCM1125";
153                 ret = setup_bcm112x();
154                 break;
155         case K_SYS_SOC_TYPE_BCM1125H:
156                 soc_str = "BCM1125H";
157                 ret = setup_bcm112x();
158                 break;
159         default:
160                 printk("Unknown SOC type %x\n", soc_type);
161                 ret = 1;
162                 break;
163         }
164 
165         return ret;
166 }
167 
168 void __init sb1250_setup(void)
169 {
170         uint64_t sys_rev;
171         int plldiv;
172         int bad_config = 0;
173 
174         sb1_pass = read_c0_prid() & PRID_REV_MASK;
175         sys_rev = __raw_readq(IOADDR(A_SCD_SYSTEM_REVISION));
176         soc_type = SYS_SOC_TYPE(sys_rev);
177         soc_pass = G_SYS_REVISION(sys_rev);
178 
179         if (sys_rev_decode()) {
180                 printk("Restart after failure to identify SiByte chip\n");
181                 machine_restart(NULL);
182         }
183 
184         plldiv = G_SYS_PLL_DIV(__raw_readq(IOADDR(A_SCD_SYSTEM_CFG)));
185         zbbus_mhz = ((plldiv >> 1) * 50) + ((plldiv & 1) * 25);
186 
187         printk("Broadcom SiByte %s %s @ %d MHz (SB1 rev %d)\n",
188                     soc_str, pass_str, zbbus_mhz * 2, sb1_pass);
189         printk("Board type: %s\n", get_system_type());
190 
191         switch (war_pass) {
192         case K_SYS_REVISION_BCM1250_PASS1:
193                 printk("@@@@ This is a BCM1250 A0-A2 (Pass 1) board, "
194                             "and the kernel doesn't have the proper "
195                             "workarounds compiled in. @@@@\n");
196                 bad_config = 1;
197                 break;
198         case K_SYS_REVISION_BCM1250_PASS2:
199                 /* Pass 2 - easiest as default for now - so many numbers */
200 #if !defined(CONFIG_SB1_PASS_2_WORKAROUNDS) || \
201     !defined(CONFIG_SB1_PASS_2_1_WORKAROUNDS)
202                 printk("@@@@ This is a BCM1250 A3-A10 board, and the "
203                             "kernel doesn't have the proper workarounds "
204                             "compiled in. @@@@\n");
205                 bad_config = 1;
206 #endif
207 #ifdef CONFIG_CPU_HAS_PREFETCH
208                 printk("@@@@ Prefetches may be enabled in this kernel, "
209                             "but are buggy on this board.  @@@@\n");
210                 bad_config = 1;
211 #endif
212                 break;
213         case K_SYS_REVISION_BCM1250_PASS2_2:
214 #ifndef CONFIG_SB1_PASS_2_WORKAROUNDS
215                 printk("@@@@ This is a BCM1250 B1/B2. board, and the "
216                             "kernel doesn't have the proper workarounds "
217                             "compiled in. @@@@\n");
218                 bad_config = 1;
219 #endif
220 #if defined(CONFIG_SB1_PASS_2_1_WORKAROUNDS) || \
221     !defined(CONFIG_CPU_HAS_PREFETCH)
222                 printk("@@@@ This is a BCM1250 B1/B2, but the kernel is "
223                             "conservatively configured for an 'A' stepping. "
224                             "@@@@\n");
225 #endif
226                 break;
227         default:
228                 break;
229         }
230         if (bad_config) {
231                 printk("Invalid configuration for this chip.\n");
232                 machine_restart(NULL);
233         }
234 }
235 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php