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