xref: /openbmc/linux/arch/mips/sibyte/bcm1480/setup.c (revision dd089d48)
11a59d1b8SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
2f137e463SAndrew Isaacson /*
3f137e463SAndrew Isaacson  * Copyright (C) 2000,2001,2002,2003,2004 Broadcom Corporation
4f137e463SAndrew Isaacson  */
5da51f9e1SRalf Baechle #include <linux/init.h>
6f137e463SAndrew Isaacson #include <linux/kernel.h>
726dd3e4fSPaul Gortmaker #include <linux/export.h>
8f137e463SAndrew Isaacson #include <linux/reboot.h>
9f137e463SAndrew Isaacson #include <linux/string.h>
10f137e463SAndrew Isaacson 
11f137e463SAndrew Isaacson #include <asm/bootinfo.h>
128ff374b9SMaciej W. Rozycki #include <asm/cpu.h>
13f137e463SAndrew Isaacson #include <asm/mipsregs.h>
14f137e463SAndrew Isaacson #include <asm/io.h>
15f137e463SAndrew Isaacson #include <asm/sibyte/sb1250.h>
16f137e463SAndrew Isaacson 
17f137e463SAndrew Isaacson #include <asm/sibyte/bcm1480_regs.h>
18f137e463SAndrew Isaacson #include <asm/sibyte/bcm1480_scd.h>
19f137e463SAndrew Isaacson #include <asm/sibyte/sb1250_scd.h>
20f137e463SAndrew Isaacson 
21f137e463SAndrew Isaacson unsigned int sb1_pass;
22f137e463SAndrew Isaacson unsigned int soc_pass;
23f137e463SAndrew Isaacson unsigned int soc_type;
24b45d5279SMaciej W. Rozycki EXPORT_SYMBOL(soc_type);
25f137e463SAndrew Isaacson unsigned int periph_rev;
26c1d59008SRalf Baechle EXPORT_SYMBOL_GPL(periph_rev);
27f137e463SAndrew Isaacson unsigned int zbbus_mhz;
28339c3a6aSRalf Baechle EXPORT_SYMBOL(zbbus_mhz);
29f137e463SAndrew Isaacson 
30f137e463SAndrew Isaacson static unsigned int part_type;
31f137e463SAndrew Isaacson 
32f137e463SAndrew Isaacson static char *soc_str;
33f137e463SAndrew Isaacson static char *pass_str;
34f137e463SAndrew Isaacson 
setup_bcm1x80_bcm1x55(void)357c4b4773SRalf Baechle static int __init setup_bcm1x80_bcm1x55(void)
36f137e463SAndrew Isaacson {
37f137e463SAndrew Isaacson 	switch (soc_pass) {
38f137e463SAndrew Isaacson 	case K_SYS_REVISION_BCM1480_S0:
39f137e463SAndrew Isaacson 		periph_rev = 1;
40f137e463SAndrew Isaacson 		pass_str = "S0 (pass1)";
41f137e463SAndrew Isaacson 		break;
42f137e463SAndrew Isaacson 	case K_SYS_REVISION_BCM1480_A1:
43f137e463SAndrew Isaacson 		periph_rev = 1;
44f137e463SAndrew Isaacson 		pass_str = "A1 (pass1)";
45f137e463SAndrew Isaacson 		break;
46f137e463SAndrew Isaacson 	case K_SYS_REVISION_BCM1480_A2:
47f137e463SAndrew Isaacson 		periph_rev = 1;
48f137e463SAndrew Isaacson 		pass_str = "A2 (pass1)";
49f137e463SAndrew Isaacson 		break;
50f137e463SAndrew Isaacson 	case K_SYS_REVISION_BCM1480_A3:
51f137e463SAndrew Isaacson 		periph_rev = 1;
52f137e463SAndrew Isaacson 		pass_str = "A3 (pass1)";
53f137e463SAndrew Isaacson 		break;
54f137e463SAndrew Isaacson 	case K_SYS_REVISION_BCM1480_B0:
55f137e463SAndrew Isaacson 		periph_rev = 1;
56f137e463SAndrew Isaacson 		pass_str = "B0 (pass2)";
57f137e463SAndrew Isaacson 		break;
58f137e463SAndrew Isaacson 	default:
5936a88530SRalf Baechle 		printk("Unknown %s rev %x\n", soc_str, soc_pass);
60f137e463SAndrew Isaacson 		periph_rev = 1;
61f137e463SAndrew Isaacson 		pass_str = "Unknown Revision";
62f137e463SAndrew Isaacson 		break;
63f137e463SAndrew Isaacson 	}
647c4b4773SRalf Baechle 
65*dd089d48SGuo Zhengkui 	return 0;
66f137e463SAndrew Isaacson }
67f137e463SAndrew Isaacson 
687c4b4773SRalf Baechle /* Setup code likely to be common to all SiByte platforms */
697c4b4773SRalf Baechle 
sys_rev_decode(void)707c4b4773SRalf Baechle static int __init sys_rev_decode(void)
717c4b4773SRalf Baechle {
727c4b4773SRalf Baechle 	int ret = 0;
737c4b4773SRalf Baechle 
747c4b4773SRalf Baechle 	switch (soc_type) {
757c4b4773SRalf Baechle 	case K_SYS_SOC_TYPE_BCM1x80:
767c4b4773SRalf Baechle 		if (part_type == K_SYS_PART_BCM1480)
777c4b4773SRalf Baechle 		    soc_str = "BCM1480";
787c4b4773SRalf Baechle 		else if (part_type == K_SYS_PART_BCM1280)
797c4b4773SRalf Baechle 		    soc_str = "BCM1280";
807c4b4773SRalf Baechle 		else
817c4b4773SRalf Baechle 		    soc_str = "BCM1x80";
827c4b4773SRalf Baechle 		ret = setup_bcm1x80_bcm1x55();
837c4b4773SRalf Baechle 		break;
847c4b4773SRalf Baechle 
857c4b4773SRalf Baechle 	case K_SYS_SOC_TYPE_BCM1x55:
867c4b4773SRalf Baechle 		if (part_type == K_SYS_PART_BCM1455)
877c4b4773SRalf Baechle 		    soc_str = "BCM1455";
887c4b4773SRalf Baechle 		else if (part_type == K_SYS_PART_BCM1255)
897c4b4773SRalf Baechle 		    soc_str = "BCM1255";
907c4b4773SRalf Baechle 		else
917c4b4773SRalf Baechle 		    soc_str = "BCM1x55";
927c4b4773SRalf Baechle 		ret = setup_bcm1x80_bcm1x55();
937c4b4773SRalf Baechle 		break;
947c4b4773SRalf Baechle 
957c4b4773SRalf Baechle 	default:
967c4b4773SRalf Baechle 		printk("Unknown part type %x\n", part_type);
977c4b4773SRalf Baechle 		ret = 1;
987c4b4773SRalf Baechle 		break;
997c4b4773SRalf Baechle 	}
1007c4b4773SRalf Baechle 
1017c4b4773SRalf Baechle 	return ret;
1027c4b4773SRalf Baechle }
1037c4b4773SRalf Baechle 
bcm1480_setup(void)1047c4b4773SRalf Baechle void __init bcm1480_setup(void)
105f137e463SAndrew Isaacson {
106f137e463SAndrew Isaacson 	uint64_t sys_rev;
107f137e463SAndrew Isaacson 	int plldiv;
108f137e463SAndrew Isaacson 
1098ff374b9SMaciej W. Rozycki 	sb1_pass = read_c0_prid() & PRID_REV_MASK;
110f137e463SAndrew Isaacson 	sys_rev = __raw_readq(IOADDR(A_SCD_SYSTEM_REVISION));
111f137e463SAndrew Isaacson 	soc_type = SYS_SOC_TYPE(sys_rev);
112f137e463SAndrew Isaacson 	part_type = G_SYS_PART(sys_rev);
113f137e463SAndrew Isaacson 	soc_pass = G_SYS_REVISION(sys_rev);
114f137e463SAndrew Isaacson 
115f137e463SAndrew Isaacson 	if (sys_rev_decode()) {
11636a88530SRalf Baechle 		printk("Restart after failure to identify SiByte chip\n");
117f137e463SAndrew Isaacson 		machine_restart(NULL);
118f137e463SAndrew Isaacson 	}
119f137e463SAndrew Isaacson 
120f137e463SAndrew Isaacson 	plldiv = G_BCM1480_SYS_PLL_DIV(__raw_readq(IOADDR(A_SCD_SYSTEM_CFG)));
121f137e463SAndrew Isaacson 	zbbus_mhz = ((plldiv >> 1) * 50) + ((plldiv & 1) * 25);
122f137e463SAndrew Isaacson 
12336a88530SRalf Baechle 	printk("Broadcom SiByte %s %s @ %d MHz (SB-1A rev %d)\n",
124f137e463SAndrew Isaacson 		    soc_str, pass_str, zbbus_mhz * 2, sb1_pass);
12536a88530SRalf Baechle 	printk("Board type: %s\n", get_system_type());
126f137e463SAndrew Isaacson }
127