linux/drivers/firmware
Hans de Goede f0df68d5ba efi: Add embedded peripheral firmware support
Just like with PCI options ROMs, which we save in the setup_efi_pci*
functions from arch/x86/boot/compressed/eboot.c, the EFI code / ROM itself
sometimes may contain data which is useful/necessary for peripheral drivers
to have access to.

Specifically the EFI code may contain an embedded copy of firmware which
needs to be (re)loaded into the peripheral. Normally such firmware would be
part of linux-firmware, but in some cases this is not feasible, for 2
reasons:

1) The firmware is customized for a specific use-case of the chipset / use
with a specific hardware model, so we cannot have a single firmware file
for the chipset. E.g. touchscreen controller firmwares are compiled
specifically for the hardware model they are used with, as they are
calibrated for a specific model digitizer.

2) Despite repeated attempts we have failed to get permission to
redistribute the firmware. This is especially a problem with customized
firmwares, these get created by the chip vendor for a specific ODM and the
copyright may partially belong with the ODM, so the chip vendor cannot
give a blanket permission to distribute these.

This commit adds support for finding peripheral firmware embedded in the
EFI code and makes the found firmware available through the new
efi_get_embedded_fw() function.

Support for loading these firmwares through the standard firmware loading
mechanism is added in a follow-up commit in this patch-series.

Note we check the EFI_BOOT_SERVICES_CODE for embedded firmware near the end
of start_kernel(), just before calling rest_init(), this is on purpose
because the typical EFI_BOOT_SERVICES_CODE memory-segment is too large for
early_memremap(), so the check must be done after mm_init(). This relies
on EFI_BOOT_SERVICES_CODE not being free-ed until efi_free_boot_services()
is called, which means that this will only work on x86 for now.

Reported-by: Dave Olsthoorn <dave@bewaar.me>
Suggested-by: Peter Jones <pjones@redhat.com>
Acked-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20200115163554.101315-3-hdegoede@redhat.com
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
2020-03-03 10:28:00 +01:00
..
arm_scmi drivers: firmware: scmi: Extend SCMI transport layer by trace events 2019-12-30 12:34:37 +00:00
broadcom ioremap changes for 5.6 2020-01-27 13:03:00 -08:00
efi efi: Add embedded peripheral firmware support 2020-03-03 10:28:00 +01:00
google firmware: google: Probe for a GSMI handler in firmware 2020-01-14 21:46:48 +01:00
imx firmware: imx: Allow IMX DSP to be selected as module 2020-01-09 17:21:33 +08:00
meson firmware: meson_sm: use %*ph to print small buffer 2019-10-03 08:43:33 -07:00
psci firmware: psci: Export functions to manage the OSI mode 2020-01-02 16:49:59 +01:00
tegra firmware: tegra: Move BPMP resume to noirq phase 2019-10-01 16:38:45 +02:00
xilinx ARM: SoC-related driver updates 2020-02-08 14:04:19 -08:00
arm_scpi.c firmware: arm_scpi: convert platform driver to use dev_groups 2019-08-02 13:18:42 +02:00
arm_sdei.c firmware: arm_sdei: use common SMCCC_CONDUIT_* 2019-10-14 10:55:14 +01:00
dmi_scan.c firmware: dmi: Add dmi_memdev_handle 2019-12-03 11:20:37 +01:00
dmi-id.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 191 2019-05-30 11:29:21 -07:00
dmi-sysfs.c treewide: Add SPDX license identifier for more missed files 2019-05-21 10:50:45 +02:00
edd.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 287 2019-06-05 17:36:37 +02:00
iscsi_ibft_find.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 287 2019-06-05 17:36:37 +02:00
iscsi_ibft.c iscsi_ibft: Don't limits Targets and NICs to two 2020-01-12 13:16:04 -05:00
Kconfig firmware: qcom_scm: Dynamically support SMCCC and legacy conventions 2020-01-07 22:14:43 -08:00
Makefile firmware: qcom_scm: Dynamically support SMCCC and legacy conventions 2020-01-07 22:14:43 -08:00
memmap.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 287 2019-06-05 17:36:37 +02:00
pcdp.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
pcdp.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
qcom_scm-legacy.c firmware: qcom_scm: Dynamically support SMCCC and legacy conventions 2020-01-07 22:14:43 -08:00
qcom_scm-smc.c firmware: qcom_scm: Dynamically support SMCCC and legacy conventions 2020-01-07 22:14:43 -08:00
qcom_scm.c firmware: qcom_scm: Dynamically support SMCCC and legacy conventions 2020-01-07 22:14:43 -08:00
qcom_scm.h firmware: qcom_scm: Dynamically support SMCCC and legacy conventions 2020-01-07 22:14:43 -08:00
qemu_fw_cfg.c media: headers: fix linux/mod_devicetable.h inclusions 2018-08-02 18:30:54 -04:00
raspberrypi.c firmware: raspberrypi: register clk device 2019-06-25 16:04:26 -07:00
scpi_pm_domain.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 201 2019-05-30 11:29:52 -07:00
stratix10-rsu.c firmware: Fix incompatible function behavior for RSU driver 2019-11-14 13:11:32 +08:00
stratix10-svc.c firmware: stratix10-svc: Remove unneeded semicolon 2020-01-14 21:46:48 +01:00
ti_sci.c firmware: ti_sci: Allow for device shared and exclusive requests 2019-09-04 20:44:33 +02:00
ti_sci.h ARM: SoC-related driver updates 2019-07-19 17:13:56 -07:00
trusted_foundations.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157 2019-05-30 11:26:37 -07:00
turris-mox-rwtm.c firmware: turris-mox-rwtm: small white space cleanup 2020-01-08 10:35:23 +01:00