summaryrefslogtreecommitdiff
path: root/gxp-firmware.c
diff options
context:
space:
mode:
authorPixelBot AutoMerger <android-nexus-securitybot@system.gserviceaccount.com>2022-06-19 18:40:30 -0700
committerRobin Peng <robinpeng@google.com>2022-06-21 08:56:39 +0000
commit9931f3a1a4c9019850edc316c6d54e14f3ff961e (patch)
tree701de08e23d0f3104a3c216a4912140d652f05c6 /gxp-firmware.c
parent78604a94057626ed2d19da08ef15765beb8d4686 (diff)
parent399265ce726dfc7e5b02352fbf17683a4ee15950 (diff)
downloadgs201-9931f3a1a4c9019850edc316c6d54e14f3ff961e.tar.gz
Merge android13-gs-pixel-5.10-tm-d1 into android13-gs-pixel-5.10-tm-qpr1
Bug: 233569354 SBMerger: 442815275 Change-Id: Idc338927398120f5b9a12fd4c988d52120aa2ec8 Signed-off-by: SecurityBot <android-nexus-securitybot@system.gserviceaccount.com>
Diffstat (limited to 'gxp-firmware.c')
-rw-r--r--gxp-firmware.c27
1 files changed, 13 insertions, 14 deletions
diff --git a/gxp-firmware.c b/gxp-firmware.c
index 15497cf..4e207b9 100644
--- a/gxp-firmware.c
+++ b/gxp-firmware.c
@@ -12,6 +12,7 @@
#include <linux/gsa/gsa_image_auth.h>
#include <linux/io.h>
#include <linux/kernel.h>
+#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/types.h>
@@ -34,6 +35,9 @@
#define FW_HEADER_SIZE (0x1000)
#define FW_IMAGE_TYPE_OFFSET (0x400)
+static int gxp_dsp_fw_auth_disable;
+module_param_named(dsp_fw_auth_disable, gxp_dsp_fw_auth_disable, int, 0660);
+
static int
request_dsp_firmware(struct gxp_dev *gxp, char *name_prefix,
const struct firmware *out_firmwares[GXP_NUM_CORES])
@@ -115,7 +119,7 @@ static int elf_load_segments(struct gxp_dev *gxp, const u8 *elf_data,
if (!((da >= (u32)buffer->daddr) &&
((da + memsz) <= ((u32)buffer->daddr +
- (u32)buffer->size - 1)))) {
+ (u32)buffer->size)))) {
/*
* Some BSS data may be referenced from TCM, and can be
* skipped while loading
@@ -165,15 +169,6 @@ static int elf_load_segments(struct gxp_dev *gxp, const u8 *elf_data,
return ret;
}
-/* TODO (b/220246540): remove after unsigned firmware support is phased out */
-static bool gxp_firmware_image_is_signed(const u8 *data)
-{
- return data[FW_IMAGE_TYPE_OFFSET + 0] == 'D' &&
- data[FW_IMAGE_TYPE_OFFSET + 1] == 'S' &&
- data[FW_IMAGE_TYPE_OFFSET + 2] == 'P' &&
- data[FW_IMAGE_TYPE_OFFSET + 3] == 'F';
-}
-
static int
gxp_firmware_load_authenticated(struct gxp_dev *gxp, const struct firmware *fw,
const struct gxp_mapped_resource *buffer)
@@ -184,10 +179,11 @@ gxp_firmware_load_authenticated(struct gxp_dev *gxp, const struct firmware *fw,
dma_addr_t header_dma_addr;
int ret;
- /* TODO (b/220246540): remove after unsigned firmware support is phased out */
- if (!gxp_firmware_image_is_signed(data)) {
- dev_info(gxp->dev, "Loading unsigned firmware\n");
- return elf_load_segments(gxp, data, size, buffer);
+ if (gxp_dsp_fw_auth_disable) {
+ dev_warn(gxp->dev,
+ "DSP FW authentication disabled, skipping\n");
+ return elf_load_segments(gxp, data + FW_HEADER_SIZE,
+ size - FW_HEADER_SIZE, buffer);
}
if (!gxp->gsa_dev) {
@@ -272,6 +268,9 @@ static int gxp_firmware_load(struct gxp_dev *gxp, uint core)
void __iomem *core_scratchpad_base;
int ret;
+ if (!gxp->firmwares[core])
+ return -ENODEV;
+
/* Authenticate and load firmware to System RAM */
ret = gxp_firmware_load_authenticated(gxp, gxp->firmwares[core],
&gxp->fwbufs[core]);