xref: /rk3399_rockchip-uboot/arch/arm/mach-sunxi/cpu_info.c (revision 0ea5a04fbcd72ebb37eb4b3f744374fdf551d3b7)
1e6e505b9SAlexander Graf /*
2e6e505b9SAlexander Graf  * (C) Copyright 2007-2011
3e6e505b9SAlexander Graf  * Allwinner Technology Co., Ltd. <www.allwinnertech.com>
4e6e505b9SAlexander Graf  * Tom Cubie <tangliang@allwinnertech.com>
5e6e505b9SAlexander Graf  *
6e6e505b9SAlexander Graf  * SPDX-License-Identifier:	GPL-2.0+
7e6e505b9SAlexander Graf  */
8e6e505b9SAlexander Graf 
9e6e505b9SAlexander Graf #include <common.h>
10e6e505b9SAlexander Graf #include <asm/io.h>
11e6e505b9SAlexander Graf #include <asm/arch/cpu.h>
12e6e505b9SAlexander Graf #include <asm/arch/clock.h>
13e6e505b9SAlexander Graf #include <axp_pmic.h>
14e6e505b9SAlexander Graf #include <errno.h>
15e6e505b9SAlexander Graf 
16e6e505b9SAlexander Graf #ifdef CONFIG_MACH_SUN6I
17e6e505b9SAlexander Graf int sunxi_get_ss_bonding_id(void)
18e6e505b9SAlexander Graf {
19e6e505b9SAlexander Graf 	struct sunxi_ccm_reg * const ccm =
20e6e505b9SAlexander Graf 		(struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
21e6e505b9SAlexander Graf 	static int bonding_id = -1;
22e6e505b9SAlexander Graf 
23e6e505b9SAlexander Graf 	if (bonding_id != -1)
24e6e505b9SAlexander Graf 		return bonding_id;
25e6e505b9SAlexander Graf 
26e6e505b9SAlexander Graf 	/* Enable Security System */
27e6e505b9SAlexander Graf 	setbits_le32(&ccm->ahb_reset0_cfg, 1 << AHB_RESET_OFFSET_SS);
28e6e505b9SAlexander Graf 	setbits_le32(&ccm->ahb_gate0, 1 << AHB_GATE_OFFSET_SS);
29e6e505b9SAlexander Graf 
30e6e505b9SAlexander Graf 	bonding_id = readl(SUNXI_SS_BASE);
31e6e505b9SAlexander Graf 	bonding_id = (bonding_id >> 16) & 0x7;
32e6e505b9SAlexander Graf 
33e6e505b9SAlexander Graf 	/* Disable Security System again */
34e6e505b9SAlexander Graf 	clrbits_le32(&ccm->ahb_gate0, 1 << AHB_GATE_OFFSET_SS);
35e6e505b9SAlexander Graf 	clrbits_le32(&ccm->ahb_reset0_cfg, 1 << AHB_RESET_OFFSET_SS);
36e6e505b9SAlexander Graf 
37e6e505b9SAlexander Graf 	return bonding_id;
38e6e505b9SAlexander Graf }
39e6e505b9SAlexander Graf #endif
40e6e505b9SAlexander Graf 
41e6e505b9SAlexander Graf #ifdef CONFIG_MACH_SUN8I
42e6e505b9SAlexander Graf uint sunxi_get_sram_id(void)
43e6e505b9SAlexander Graf {
44e6e505b9SAlexander Graf 	uint id;
45e6e505b9SAlexander Graf 
46e6e505b9SAlexander Graf 	/* Unlock sram info reg, read it, relock */
47e6e505b9SAlexander Graf 	setbits_le32(SUNXI_SRAMC_BASE + 0x24, (1 << 15));
48e6e505b9SAlexander Graf 	id = readl(SUNXI_SRAMC_BASE + 0x24) >> 16;
49e6e505b9SAlexander Graf 	clrbits_le32(SUNXI_SRAMC_BASE + 0x24, (1 << 15));
50e6e505b9SAlexander Graf 
51e6e505b9SAlexander Graf 	return id;
52e6e505b9SAlexander Graf }
53e6e505b9SAlexander Graf #endif
54e6e505b9SAlexander Graf 
55e6e505b9SAlexander Graf #ifdef CONFIG_DISPLAY_CPUINFO
56e6e505b9SAlexander Graf int print_cpuinfo(void)
57e6e505b9SAlexander Graf {
58e6e505b9SAlexander Graf #ifdef CONFIG_MACH_SUN4I
59e6e505b9SAlexander Graf 	puts("CPU:   Allwinner A10 (SUN4I)\n");
60e6e505b9SAlexander Graf #elif defined CONFIG_MACH_SUN5I
61e6e505b9SAlexander Graf 	u32 val = readl(SUNXI_SID_BASE + 0x08);
62e6e505b9SAlexander Graf 	switch ((val >> 12) & 0xf) {
63e6e505b9SAlexander Graf 	case 0: puts("CPU:   Allwinner A12 (SUN5I)\n"); break;
64e6e505b9SAlexander Graf 	case 3: puts("CPU:   Allwinner A13 (SUN5I)\n"); break;
65e6e505b9SAlexander Graf 	case 7: puts("CPU:   Allwinner A10s (SUN5I)\n"); break;
66e6e505b9SAlexander Graf 	default: puts("CPU:   Allwinner A1X (SUN5I)\n");
67e6e505b9SAlexander Graf 	}
68e6e505b9SAlexander Graf #elif defined CONFIG_MACH_SUN6I
69e6e505b9SAlexander Graf 	switch (sunxi_get_ss_bonding_id()) {
70e6e505b9SAlexander Graf 	case SUNXI_SS_BOND_ID_A31:
71e6e505b9SAlexander Graf 		puts("CPU:   Allwinner A31 (SUN6I)\n");
72e6e505b9SAlexander Graf 		break;
73e6e505b9SAlexander Graf 	case SUNXI_SS_BOND_ID_A31S:
74e6e505b9SAlexander Graf 		puts("CPU:   Allwinner A31s (SUN6I)\n");
75e6e505b9SAlexander Graf 		break;
76e6e505b9SAlexander Graf 	default:
77e6e505b9SAlexander Graf 		printf("CPU:   Allwinner A31? (SUN6I, id: %d)\n",
78e6e505b9SAlexander Graf 		       sunxi_get_ss_bonding_id());
79e6e505b9SAlexander Graf 	}
80e6e505b9SAlexander Graf #elif defined CONFIG_MACH_SUN7I
81e6e505b9SAlexander Graf 	puts("CPU:   Allwinner A20 (SUN7I)\n");
82e6e505b9SAlexander Graf #elif defined CONFIG_MACH_SUN8I_A23
83e6e505b9SAlexander Graf 	printf("CPU:   Allwinner A23 (SUN8I %04x)\n", sunxi_get_sram_id());
84e6e505b9SAlexander Graf #elif defined CONFIG_MACH_SUN8I_A33
85e6e505b9SAlexander Graf 	printf("CPU:   Allwinner A33 (SUN8I %04x)\n", sunxi_get_sram_id());
86e6e505b9SAlexander Graf #elif defined CONFIG_MACH_SUN8I_A83T
87e6e505b9SAlexander Graf 	printf("CPU:   Allwinner A83T (SUN8I %04x)\n", sunxi_get_sram_id());
88e6e505b9SAlexander Graf #elif defined CONFIG_MACH_SUN8I_H3
89e6e505b9SAlexander Graf 	printf("CPU:   Allwinner H3 (SUN8I %04x)\n", sunxi_get_sram_id());
90e6e505b9SAlexander Graf #elif defined CONFIG_MACH_SUN9I
91e6e505b9SAlexander Graf 	puts("CPU:   Allwinner A80 (SUN9I)\n");
92e6e505b9SAlexander Graf #else
93e6e505b9SAlexander Graf #warning Please update cpu_info.c with correct CPU information
94e6e505b9SAlexander Graf 	puts("CPU:   SUNXI Family\n");
95e6e505b9SAlexander Graf #endif
96e6e505b9SAlexander Graf 	return 0;
97e6e505b9SAlexander Graf }
98e6e505b9SAlexander Graf #endif
99e6e505b9SAlexander Graf 
100e6e505b9SAlexander Graf int sunxi_get_sid(unsigned int *sid)
101e6e505b9SAlexander Graf {
102e6e505b9SAlexander Graf #ifdef CONFIG_AXP221_POWER
103e6e505b9SAlexander Graf 	return axp_get_sid(sid);
104e6e505b9SAlexander Graf #elif defined SUNXI_SID_BASE
105e6e505b9SAlexander Graf 	int i;
106e6e505b9SAlexander Graf 
107e6e505b9SAlexander Graf 	for (i = 0; i< 4; i++)
108*0ea5a04fSAlexander Graf 		sid[i] = readl((ulong)SUNXI_SID_BASE + 4 * i);
109e6e505b9SAlexander Graf 
110e6e505b9SAlexander Graf 	return 0;
111e6e505b9SAlexander Graf #else
112e6e505b9SAlexander Graf 	return -ENODEV;
113e6e505b9SAlexander Graf #endif
114e6e505b9SAlexander Graf }
115