xref: /optee_os/core/drivers/bnxt/bnxt_images.c (revision 0d77037f5943c86560dd7c8f473fbc6a55d60a34)
1 // SPDX-License-Identifier: BSD-2-Clause
2 /*
3  * Copyright 2019 Broadcom.
4  */
5 
6 #include <drivers/bcm/bnxt.h>
7 #include <stdint.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <util.h>
11 
12 #define BNXT_FW_NS3_IMAGE_SIG		0xFF12345A
13 #define BNXT_FW_NS3Z_IMAGE_SIG		0xFF12345B
14 #define BNXT_NS3_CFG_IMAGE_SIG		0xCF54321A
15 #define BNXT_NS3Z_CFG_IMAGE_SIG		0xCF54321B
16 
17 #define BNXT_BSPD_CFG_LEN	512
18 
19 #define QSPI_BASE		QSPI_MEM_BASE
20 #define QSPI_BNXT_IMG		(QSPI_BASE + 0x400000)
21 #define QSPI_BSPD_ADDR		(QSPI_BASE + 0x700000)
22 
23 #define BCM_NS3		1
24 #define BCM_NS3Z	2
25 
26 static struct bnxt_img_header {
27 	uint32_t bnxt_fw_ns3_sig;
28 	uint32_t bnxt_fw_ns3_size;
29 	uint32_t bnxt_fw_ns3z_sig;
30 	uint32_t bnxt_fw_ns3z_size;
31 	uint32_t bnxt_ns3_cfg_sig;
32 	uint32_t bnxt_ns3_cfg_size;
33 	uint32_t bnxt_ns3z_cfg_sig;
34 	uint32_t bnxt_ns3z_cfg_size;
35 } *img_header;
36 
37 int get_bnxt_images_info(struct bnxt_images_info *bnxt_info, int chip_type)
38 {
39 	uint32_t len = 0;
40 	uint32_t fw_image_offset = sizeof(struct bnxt_img_header);
41 	vaddr_t flash_dev_vaddr =
42 			(uintptr_t)((vaddr_t)phys_to_virt(QSPI_BNXT_IMG,
43 							  MEM_AREA_IO_NSEC));
44 
45 	bnxt_info->bnxt_bspd_cfg_vaddr =
46 			(uintptr_t)((vaddr_t)phys_to_virt(QSPI_BSPD_ADDR,
47 							  MEM_AREA_IO_NSEC));
48 
49 	bnxt_info->bnxt_bspd_cfg_len = BNXT_BSPD_CFG_LEN;
50 
51 	img_header = (struct bnxt_img_header *)flash_dev_vaddr;
52 
53 	if (img_header->bnxt_fw_ns3_sig != BNXT_FW_NS3_IMAGE_SIG) {
54 		EMSG("Invalid Nitro bin");
55 		return BNXT_FAILURE;
56 	}
57 
58 	len = img_header->bnxt_fw_ns3_size;
59 
60 	if (chip_type == BCM_NS3) {
61 		bnxt_info->bnxt_fw_vaddr = flash_dev_vaddr + fw_image_offset;
62 		bnxt_info->bnxt_fw_len = len;
63 	}
64 
65 	fw_image_offset += len;
66 
67 	if (img_header->bnxt_fw_ns3z_sig != BNXT_FW_NS3Z_IMAGE_SIG) {
68 		EMSG("Invalid Nitro bin");
69 		return BNXT_FAILURE;
70 	}
71 
72 	len = img_header->bnxt_fw_ns3z_size;
73 
74 	if (chip_type == BCM_NS3Z) {
75 		bnxt_info->bnxt_fw_vaddr = flash_dev_vaddr + fw_image_offset;
76 		bnxt_info->bnxt_fw_len = len;
77 	}
78 
79 	fw_image_offset += len;
80 
81 	if (img_header->bnxt_ns3_cfg_sig != BNXT_NS3_CFG_IMAGE_SIG) {
82 		EMSG("Invalid Nitro config");
83 		return BNXT_FAILURE;
84 	}
85 
86 	len = img_header->bnxt_ns3_cfg_size;
87 
88 	if (chip_type == BCM_NS3) {
89 		bnxt_info->bnxt_cfg_vaddr = flash_dev_vaddr + fw_image_offset;
90 		bnxt_info->bnxt_cfg_len = len;
91 	}
92 
93 	fw_image_offset += len;
94 
95 	if (img_header->bnxt_ns3z_cfg_sig != BNXT_NS3Z_CFG_IMAGE_SIG) {
96 		EMSG("Invalid Nitro config");
97 		return BNXT_FAILURE;
98 	}
99 
100 	len = img_header->bnxt_ns3z_cfg_size;
101 
102 	if (chip_type == BCM_NS3Z) {
103 		bnxt_info->bnxt_cfg_vaddr = flash_dev_vaddr + fw_image_offset;
104 		bnxt_info->bnxt_cfg_len = len;
105 	}
106 
107 	return BNXT_SUCCESS;
108 }
109