Commit 835e1b86 authored by Hans de Goede's avatar Hans de Goede Committed by Greg Kroah-Hartman

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: default avatarAndy Shevchenko <andy.shevchenko@gmail.com>
Acked-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20200115163554.101315-10-hdegoede@redhat.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 85bfb4af
...@@ -21,6 +21,9 @@ EXPORT_SYMBOL_GPL(efi_embedded_fw_list); ...@@ -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
}; };
......
...@@ -1252,6 +1252,7 @@ config INTEL_TURBO_MAX_3 ...@@ -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
......
...@@ -11,12 +11,15 @@ ...@@ -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[] = { ...@@ -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[] = { ...@@ -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[] = { ...@@ -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[] = { ...@@ -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 = { ...@@ -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,
......
...@@ -36,6 +36,8 @@ struct efi_embedded_fw_desc { ...@@ -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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment