1 // SPDX-License-Identifier: GPL-2.0-only
4 * Early intialization code for the Realtek RTL838X SoC
6 * based on the original BSP by
7 * Copyright (C) 2006-2012 Tony Wu (tonywu@realtek.com)
8 * Copyright (C) 2020 B. Koblitz
12 #include <linux/init.h>
13 #include <linux/kernel.h>
14 #include <linux/string.h>
15 #include <linux/of_fdt.h>
16 #include <linux/libfdt.h>
17 #include <asm/bootinfo.h>
18 #include <asm/addrspace.h>
22 #include <mach-rtl83xx.h>
24 extern char arcs_cmdline
[];
25 extern const char __appended_dtb
;
27 struct rtl83xx_soc_info soc_info
;
30 const char *get_system_type(void)
35 void __init
prom_free_prom_memory(void)
40 void __init
device_tree_init(void)
42 if (!fdt_check_header(&__appended_dtb
)) {
43 fdt
= &__appended_dtb
;
44 pr_info("Using appended Device Tree.\n");
46 initial_boot_params
= (void *)fdt
;
47 unflatten_and_copy_device_tree();
50 static void __init
prom_init_cmdline(void)
53 char **argv
= (char **) KSEG1ADDR(fw_arg1
);
56 arcs_cmdline
[0] = '\0';
58 for (i
= 0; i
< argc
; i
++) {
59 char *p
= (char *) KSEG1ADDR(argv
[i
]);
61 if (CPHYSADDR(p
) && *p
) {
62 strlcat(arcs_cmdline
, p
, sizeof(arcs_cmdline
));
63 strlcat(arcs_cmdline
, " ", sizeof(arcs_cmdline
));
66 pr_info("Kernel command line: %s\n", arcs_cmdline
);
69 void __init
identify_rtl9302(void)
71 switch (sw_r32(RTL93XX_MODEL_NAME_INFO
) & 0xfffffff0) {
73 soc_info
.name
= "RTL9302A 12x2.5G";
76 soc_info
.name
= "RTL9302B 8x2.5G";
79 soc_info
.name
= "RTL9302C 16x2.5G";
82 soc_info
.name
= "RTL9302D 24x2.5G";
85 soc_info
.name
= "RTL9302A";
88 soc_info
.name
= "RTL9302B";
91 soc_info
.name
= "RTL9302C";
94 soc_info
.name
= "RTL9302D";
97 soc_info
.name
= "RTL9302F";
100 soc_info
.name
= "RTL9302";
104 void __init
prom_init(void)
109 setup_8250_early_printk_port(0xb8002000, 2, 0);
111 model
= sw_r32(RTL838X_MODEL_NAME_INFO
);
112 pr_info("RTL838X model is %x\n", model
);
113 model
= model
>> 16 & 0xFFFF;
115 if ((model
!= 0x8328) && (model
!= 0x8330) && (model
!= 0x8332)
116 && (model
!= 0x8380) && (model
!= 0x8382)) {
117 model
= sw_r32(RTL839X_MODEL_NAME_INFO
);
118 pr_info("RTL839X model is %x\n", model
);
119 model
= model
>> 16 & 0xFFFF;
122 if ((model
& 0x8390) != 0x8380 && (model
& 0x8390) != 0x8390) {
123 model
= sw_r32(RTL93XX_MODEL_NAME_INFO
);
124 pr_info("RTL93XX model is %x\n", model
);
125 model
= model
>> 16 & 0xFFFF;
132 soc_info
.name
= "RTL8328";
133 soc_info
.family
= RTL8328_FAMILY_ID
;
136 soc_info
.name
= "RTL8332";
137 soc_info
.family
= RTL8380_FAMILY_ID
;
140 soc_info
.name
= "RTL8380";
141 soc_info
.family
= RTL8380_FAMILY_ID
;
144 soc_info
.name
= "RTL8382";
145 soc_info
.family
= RTL8380_FAMILY_ID
;
148 soc_info
.name
= "RTL8390";
149 soc_info
.family
= RTL8390_FAMILY_ID
;
152 soc_info
.name
= "RTL8391";
153 soc_info
.family
= RTL8390_FAMILY_ID
;
156 soc_info
.name
= "RTL8392";
157 soc_info
.family
= RTL8390_FAMILY_ID
;
160 soc_info
.name
= "RTL8393";
161 soc_info
.family
= RTL8390_FAMILY_ID
;
164 soc_info
.name
= "RTL9301";
165 soc_info
.family
= RTL9300_FAMILY_ID
;
169 soc_info
.family
= RTL9300_FAMILY_ID
;
172 soc_info
.name
= "RTL9313";
173 soc_info
.family
= RTL9310_FAMILY_ID
;
176 soc_info
.name
= "DEFAULT";
180 pr_info("SoC Type: %s\n", get_system_type());