1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright 2020 Broadcom
4  */
5 
6 #include <command.h>
7 #include <env.h>
8 #include <vsprintf.h>
9 
10 #define FW_IMAGE_SIG	0xff123456
11 #define CFG_IMAGE_SIG	0xcf54321a
12 
13 /*
14  * structure for bin file
15  *  signature: fw itb file
16  *  size: fw itb file
17  *  signature: NS3 config file
18  *  size: NS3 config file
19  *  Data: fw itb file
20  *  ............................
21  *  ............................
22  *  Data: NS3 config file
23  *  ............................
24  *  ............................
25  */
26 
27 static struct img_header {
28 	u32 bin_sig;
29 	u32 bin_size;
30 	u32 cfg1_sig;
31 	u32 cfg1_size;
32 } *img_header;
33 
env_set_val(const char * varname,ulong val)34 static int env_set_val(const char *varname, ulong val)
35 {
36 	int ret;
37 
38 	ret = env_set_hex(varname, val);
39 	if (ret)
40 		pr_err("Failed to %s env var\n", varname);
41 
42 	return ret;
43 }
44 
do_spi_images_addr(struct cmd_tbl * cmdtp,int flag,int argc,char * const argv[])45 static int do_spi_images_addr(struct cmd_tbl *cmdtp, int flag, int argc,
46 			      char *const argv[])
47 {
48 	uintptr_t images_load_addr;
49 	uintptr_t spi_load_addr;
50 	u32 len;
51 	u32 spi_data_offset = sizeof(struct img_header);
52 
53 	if (argc != 3)
54 		return CMD_RET_USAGE;
55 
56 	/* convert command parameter to fastboot address (base 16), i.e. hex */
57 	images_load_addr = hextoul(argv[1], NULL);
58 	if (!images_load_addr) {
59 		pr_err("Invalid load address\n");
60 		return CMD_RET_USAGE;
61 	}
62 
63 	spi_load_addr = hextoul(argv[2], NULL);
64 	if (!spi_load_addr) {
65 		pr_err("Invalid spi load address\n");
66 		return CMD_RET_USAGE;
67 	}
68 
69 	img_header = (struct img_header *)images_load_addr;
70 
71 	if (img_header->bin_sig != FW_IMAGE_SIG) {
72 		pr_err("Invalid Nitro bin file\n");
73 		goto error;
74 	}
75 
76 	if (env_set_val("spi_nitro_fw_itb_start_addr", 0))
77 		goto error;
78 
79 	if (env_set_val("spi_nitro_fw_itb_len", 0))
80 		goto error;
81 
82 	if (env_set_val("spi_nitro_fw_ns3_cfg_start_addr", 0))
83 		goto error;
84 
85 	if (env_set_val("spi_nitro_fw_ns3_cfg_len", 0))
86 		goto error;
87 
88 	len = img_header->bin_size;
89 
90 	if (env_set_val("spi_nitro_fw_itb_start_addr",
91 			(spi_load_addr + spi_data_offset)))
92 		goto error;
93 
94 	if (env_set_val("spi_nitro_fw_itb_len", img_header->bin_size))
95 		goto error;
96 
97 	spi_data_offset += len;
98 
99 	if (img_header->cfg1_sig == CFG_IMAGE_SIG) {
100 		len = img_header->cfg1_size;
101 
102 		if (env_set_val("spi_nitro_fw_ns3_cfg_start_addr",
103 				(spi_load_addr + spi_data_offset)))
104 			goto error;
105 
106 		if (env_set_val("spi_nitro_fw_ns3_cfg_len", len))
107 			goto error;
108 
109 		spi_data_offset += len;
110 	}
111 
112 	/* disable secure boot */
113 	if (env_set_val("nitro_fastboot_secure", 0))
114 		goto error;
115 
116 	return CMD_RET_SUCCESS;
117 
118 error:
119 	return CMD_RET_FAILURE;
120 }
121 
122 U_BOOT_CMD
123 	(spi_nitro_images_addr, 3, 1, do_spi_images_addr,
124 	 "Load the bnxt bin header and sets envs ",
125 	 "spi_nitro_images_addr <load_addr> <spi_base_addr>\n"
126 );
127