1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2020 Western Digital Corporation or its affiliates.
5 #include <linux/init.h>
6 #include <linux/libfdt.h>
7 #include <linux/pgtable.h>
11 * This is called extremly early, before parse_dtb(), to allow initializing
12 * SoC hardware before memory or any device driver initialization.
14 void __init
soc_early_init(void)
16 void (*early_fn
)(const void *fdt
);
17 const struct of_device_id
*s
;
18 const void *fdt
= dtb_early_va
;
20 for (s
= (void *)&__soc_early_init_table_start
;
21 (void *)s
< (void *)&__soc_early_init_table_end
; s
++) {
22 if (!fdt_node_check_compatible(fdt
, 0, s
->compatible
)) {
30 static bool soc_builtin_dtb_match(unsigned long vendor_id
,
31 unsigned long arch_id
, unsigned long imp_id
,
32 const struct soc_builtin_dtb
*entry
)
34 return entry
->vendor_id
== vendor_id
&&
35 entry
->arch_id
== arch_id
&&
36 entry
->imp_id
== imp_id
;
39 void * __init
soc_lookup_builtin_dtb(void)
41 unsigned long vendor_id
, arch_id
, imp_id
;
42 const struct soc_builtin_dtb
*s
;
44 __asm__ ("csrr %0, mvendorid" : "=r"(vendor_id
));
45 __asm__ ("csrr %0, marchid" : "=r"(arch_id
));
46 __asm__ ("csrr %0, mimpid" : "=r"(imp_id
));
48 for (s
= (void *)&__soc_builtin_dtb_table_start
;
49 (void *)s
< (void *)&__soc_builtin_dtb_table_end
; s
++) {
50 if (soc_builtin_dtb_match(vendor_id
, arch_id
, imp_id
, s
))