1  // SPDX-License-Identifier: GPL-2.0-only
2  /*
3   * Copyright (C) 2024 Allied Telesis
4   */
5  
6  #include <linux/errno.h>
7  #include <linux/libfdt.h>
8  #include <linux/printk.h>
9  #include <linux/types.h>
10  
11  #include <asm/fw/fw.h>
12  #include <asm/machine.h>
13  
realtek_add_initrd(void * fdt)14  static __init int realtek_add_initrd(void *fdt)
15  {
16  	int node, err;
17  	u32 start, size;
18  
19  	node = fdt_path_offset(fdt, "/chosen");
20  	if (node < 0) {
21  		pr_err("/chosen node not found\n");
22  		return -ENOENT;
23  	}
24  
25  	start = fw_getenvl("initrd_start");
26  	size = fw_getenvl("initrd_size");
27  
28  	if (start == 0 && size == 0)
29  		return 0;
30  
31  	pr_info("Adding initrd info from environment\n");
32  
33  	err = fdt_setprop_u32(fdt, node, "linux,initrd-start", start);
34  	if (err) {
35  		pr_err("unable to set initrd-start: %d\n", err);
36  		return err;
37  	}
38  
39  	err = fdt_setprop_u32(fdt, node, "linux,initrd-end", start + size);
40  	if (err) {
41  		pr_err("unable to set initrd-end: %d\n", err);
42  		return err;
43  	}
44  
45  	return 0;
46  }
47  
48  static const struct mips_fdt_fixup realtek_fdt_fixups[] __initconst = {
49  	{ realtek_add_initrd, "add initrd" },
50  	{},
51  };
52  
realtek_fixup_fdt(const void * fdt,const void * match_data)53  static __init const void *realtek_fixup_fdt(const void *fdt, const void *match_data)
54  {
55  	static unsigned char fdt_buf[16 << 10] __initdata;
56  	int err;
57  
58  	if (fdt_check_header(fdt))
59  		panic("Corrupt DT");
60  
61  	fw_init_cmdline();
62  
63  	err = apply_mips_fdt_fixups(fdt_buf, sizeof(fdt_buf), fdt, realtek_fdt_fixups);
64  	if (err)
65  		panic("Unable to fixup FDT: %d", err);
66  
67  	return fdt_buf;
68  
69  }
70  
71  static const struct of_device_id realtek_of_match[] __initconst = {
72  	{ .compatible = "realtek,rtl9302-soc" },
73  	{}
74  };
75  
76  MIPS_MACHINE(realtek) = {
77  	.matches = realtek_of_match,
78  	.fixup_fdt = realtek_fixup_fdt,
79  };
80