summaryrefslogtreecommitdiff
path: root/src/soc
diff options
context:
space:
mode:
authorSudheer Kumar Amrabadi <samrabad@codeaurora.org>2023-01-16 08:48:15 +0530
committerShelley Chen <shchen@google.com>2023-02-01 18:47:54 +0000
commit0d30a86aaa707badebe84c19606bff721a480ebf (patch)
tree429072934a63c92894690e476bbc998c4d2b97fc /src/soc
parent67efe443b1665b2e93962e6bfb468e87190a73c5 (diff)
soc/qualcomm/common/qup: Avoid double decompress of gsi_fw blob
During boot, gpi_firmware_load gets called twice because there are 2 serial engines. Thus gsi_fw blob is also decompressed twice and is written to base addresses of SEs. This is redundant. Perform the decompression once on first call and save the header in static variable which can be reused in next call. BUG=b:262426214 TEST=Validated on qualcomm sc7280 development board Saving of 80ms observed while testing with 130 boot cycles. Change-Id: If98a3974f0791dffdf675c02cc28375d0485c485 Signed-off-by: Vijaya Nivarthi <vnivarth@codeaurora.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/71927 Reviewed-by: Shelley Chen <shchen@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/soc')
-rw-r--r--src/soc/qualcomm/common/qupv3_config.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/soc/qualcomm/common/qupv3_config.c b/src/soc/qualcomm/common/qupv3_config.c
index 919c11bf4e..636f9b2fab 100644
--- a/src/soc/qualcomm/common/qupv3_config.c
+++ b/src/soc/qualcomm/common/qupv3_config.c
@@ -9,6 +9,7 @@
#include <soc/addressmap.h>
static struct elf_se_hdr *fw_list[SE_PROTOCOL_MAX];
+static struct gsi_fw_hdr *gsi_hdr;
void qupv3_se_fw_load_and_init(unsigned int bus, unsigned int protocol,
unsigned int mode)
@@ -185,16 +186,17 @@ void gpi_firmware_load(int addr)
{
uint32_t i;
uint32_t regVal = 0;
- struct gsi_fw_hdr *gsi_hdr;
struct gsi_fw_iep *fwIep;
struct gsi_fw_iram *fwIRam;
struct gsi_regs *regs = (struct gsi_regs *)(uintptr_t)addr;
static const char * const filename = "fallback/gsi_fw";
/* Assign firmware header base */
- gsi_hdr = cbfs_map(filename, NULL);
- if (!gsi_hdr)
- die("*ERROR* * cbfs_map() failed ***\n");
+ if (!gsi_hdr) {
+ gsi_hdr = cbfs_map(filename, NULL);
+ if (!gsi_hdr)
+ die("*ERROR* * cbfs_map() failed ***\n");
+ }
assert(gsi_hdr->magic == GSI_FW_MAGIC_HEADER)