platform/x86: touchscreen_dmi: Add EFI embedded firmware info support

Sofar we have been unable to get permission from the vendors to put the
firmware for touchscreens listed in touchscreen_dmi in linux-firmware.

Some of the tablets with such a touchscreen have a touchscreen driver, and
thus a copy of the firmware, as part of their EFI code.

This commit adds the necessary info for the new EFI embedded-firmware code
to extract these firmwares, making the touchscreen work OOTB without the
user needing to manually add the firmware.

Acked-by: Andy Shevchenko <andy.shevchenko@gmail.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-10-hdegoede@redhat.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Hans de Goede 2020-01-15 17:35:53 +01:00 committed by Greg Kroah-Hartman
parent 85bfb4af14
commit 835e1b86ef
4 changed files with 46 additions and 1 deletions

View File

@ -21,6 +21,9 @@ EXPORT_SYMBOL_GPL(efi_embedded_fw_list);
static bool checked_for_fw; static bool checked_for_fw;
static const struct dmi_system_id * const embedded_fw_table[] = { static const struct dmi_system_id * const embedded_fw_table[] = {
#ifdef CONFIG_TOUCHSCREEN_DMI
touchscreen_dmi_table,
#endif
NULL NULL
}; };

View File

@ -1252,6 +1252,7 @@ config INTEL_TURBO_MAX_3
config TOUCHSCREEN_DMI config TOUCHSCREEN_DMI
bool "DMI based touchscreen configuration info" bool "DMI based touchscreen configuration info"
depends on ACPI && DMI && I2C=y && TOUCHSCREEN_SILEAD depends on ACPI && DMI && I2C=y && TOUCHSCREEN_SILEAD
select EFI_EMBEDDED_FIRMWARE if EFI
---help--- ---help---
Certain ACPI based tablets with e.g. Silead or Chipone touchscreens Certain ACPI based tablets with e.g. Silead or Chipone touchscreens
do not have enough data in ACPI tables for the touchscreen driver to do not have enough data in ACPI tables for the touchscreen driver to

View File

@ -11,12 +11,15 @@
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/dmi.h> #include <linux/dmi.h>
#include <linux/efi_embedded_fw.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/notifier.h> #include <linux/notifier.h>
#include <linux/property.h> #include <linux/property.h>
#include <linux/string.h> #include <linux/string.h>
struct ts_dmi_data { struct ts_dmi_data {
/* The EFI embedded-fw code expects this to be the first member! */
struct efi_embedded_fw_desc embedded_fw;
const char *acpi_name; const char *acpi_name;
const struct property_entry *properties; const struct property_entry *properties;
}; };
@ -64,6 +67,15 @@ static const struct property_entry chuwi_hi8_pro_props[] = {
}; };
static const struct ts_dmi_data chuwi_hi8_pro_data = { static const struct ts_dmi_data chuwi_hi8_pro_data = {
.embedded_fw = {
.name = "silead/gsl3680-chuwi-hi8-pro.fw",
.prefix = { 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 },
.length = 39864,
.sha256 = { 0xc0, 0x88, 0xc5, 0xef, 0xd1, 0x70, 0x77, 0x59,
0x4e, 0xe9, 0xc4, 0xd8, 0x2e, 0xcd, 0xbf, 0x95,
0x32, 0xd9, 0x03, 0x28, 0x0d, 0x48, 0x9f, 0x92,
0x35, 0x37, 0xf6, 0x8b, 0x2a, 0xe4, 0x73, 0xff },
},
.acpi_name = "MSSL1680:00", .acpi_name = "MSSL1680:00",
.properties = chuwi_hi8_pro_props, .properties = chuwi_hi8_pro_props,
}; };
@ -181,6 +193,15 @@ static const struct property_entry cube_iwork8_air_props[] = {
}; };
static const struct ts_dmi_data cube_iwork8_air_data = { static const struct ts_dmi_data cube_iwork8_air_data = {
.embedded_fw = {
.name = "silead/gsl3670-cube-iwork8-air.fw",
.prefix = { 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 },
.length = 38808,
.sha256 = { 0xff, 0x62, 0x2d, 0xd1, 0x8a, 0x78, 0x04, 0x7b,
0x33, 0x06, 0xb0, 0x4f, 0x7f, 0x02, 0x08, 0x9c,
0x96, 0xd4, 0x9f, 0x04, 0xe1, 0x47, 0x25, 0x25,
0x60, 0x77, 0x41, 0x33, 0xeb, 0x12, 0x82, 0xfc },
},
.acpi_name = "MSSL1680:00", .acpi_name = "MSSL1680:00",
.properties = cube_iwork8_air_props, .properties = cube_iwork8_air_props,
}; };
@ -387,6 +408,15 @@ static const struct property_entry onda_v80_plus_v3_props[] = {
}; };
static const struct ts_dmi_data onda_v80_plus_v3_data = { static const struct ts_dmi_data onda_v80_plus_v3_data = {
.embedded_fw = {
.name = "silead/gsl3676-onda-v80-plus-v3.fw",
.prefix = { 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 },
.length = 37224,
.sha256 = { 0x8f, 0xbd, 0x8f, 0x0c, 0x6b, 0xba, 0x5b, 0xf5,
0xa3, 0xc7, 0xa3, 0xc0, 0x4f, 0xcd, 0xdf, 0x32,
0xcc, 0xe4, 0x70, 0xd6, 0x46, 0x9c, 0xd7, 0xa7,
0x4b, 0x82, 0x3f, 0xab, 0xc7, 0x90, 0xea, 0x23 },
},
.acpi_name = "MSSL1680:00", .acpi_name = "MSSL1680:00",
.properties = onda_v80_plus_v3_props, .properties = onda_v80_plus_v3_props,
}; };
@ -449,6 +479,15 @@ static const struct property_entry pipo_w2s_props[] = {
}; };
static const struct ts_dmi_data pipo_w2s_data = { static const struct ts_dmi_data pipo_w2s_data = {
.embedded_fw = {
.name = "silead/gsl1680-pipo-w2s.fw",
.prefix = { 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 },
.length = 39072,
.sha256 = { 0xd0, 0x58, 0xc4, 0x7d, 0x55, 0x2d, 0x62, 0x18,
0xd1, 0x6a, 0x71, 0x73, 0x0b, 0x3f, 0xbe, 0x60,
0xbb, 0x45, 0x8c, 0x52, 0x27, 0xb7, 0x18, 0xf4,
0x31, 0x00, 0x6a, 0x49, 0x76, 0xd8, 0x7c, 0xd3 },
},
.acpi_name = "MSSL1680:00", .acpi_name = "MSSL1680:00",
.properties = pipo_w2s_props, .properties = pipo_w2s_props,
}; };
@ -641,7 +680,7 @@ static const struct ts_dmi_data trekstor_surftab_wintron70_data = {
}; };
/* NOTE: Please keep this table sorted alphabetically */ /* NOTE: Please keep this table sorted alphabetically */
static const struct dmi_system_id touchscreen_dmi_table[] = { const struct dmi_system_id touchscreen_dmi_table[] = {
{ {
/* Chuwi Hi8 */ /* Chuwi Hi8 */
.driver_data = (void *)&chuwi_hi8_data, .driver_data = (void *)&chuwi_hi8_data,

View File

@ -36,6 +36,8 @@ struct efi_embedded_fw_desc {
u8 sha256[32]; u8 sha256[32];
}; };
extern const struct dmi_system_id touchscreen_dmi_table[];
int efi_get_embedded_fw(const char *name, const u8 **dat, size_t *sz); int efi_get_embedded_fw(const char *name, const u8 **dat, size_t *sz);
#endif #endif