|
|
@@ -231,9 +231,55 @@ static const struct dmi_system_id efifb_dmi_system_table[] __initconst = {
|
|
|
{},
|
|
|
};
|
|
|
|
|
|
+/*
|
|
|
+ * Some devices have a portrait LCD but advertise a landscape resolution (and
|
|
|
+ * pitch). We simply swap width and height for these devices so that we can
|
|
|
+ * correctly deal with some of them coming with multiple resolutions.
|
|
|
+ */
|
|
|
+static const struct dmi_system_id efifb_dmi_swap_width_height[] __initconst = {
|
|
|
+ {
|
|
|
+ /*
|
|
|
+ * Lenovo MIIX310-10ICR, only some batches have the troublesome
|
|
|
+ * 800x1280 portrait screen. Luckily the portrait version has
|
|
|
+ * its own BIOS version, so we match on that.
|
|
|
+ */
|
|
|
+ .matches = {
|
|
|
+ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
|
|
+ DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "MIIX 310-10ICR"),
|
|
|
+ DMI_EXACT_MATCH(DMI_BIOS_VERSION, "1HCN44WW"),
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ /* Lenovo MIIX 320-10ICR with 800x1280 portrait screen */
|
|
|
+ .matches = {
|
|
|
+ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
|
|
+ DMI_EXACT_MATCH(DMI_PRODUCT_VERSION,
|
|
|
+ "Lenovo MIIX 320-10ICR"),
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ /* Lenovo D330 with 800x1280 or 1200x1920 portrait screen */
|
|
|
+ .matches = {
|
|
|
+ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
|
|
+ DMI_EXACT_MATCH(DMI_PRODUCT_VERSION,
|
|
|
+ "Lenovo ideapad D330-10IGM"),
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {},
|
|
|
+};
|
|
|
+
|
|
|
__init void sysfb_apply_efi_quirks(void)
|
|
|
{
|
|
|
if (screen_info.orig_video_isVGA != VIDEO_TYPE_EFI ||
|
|
|
!(screen_info.capabilities & VIDEO_CAPABILITY_SKIP_QUIRKS))
|
|
|
dmi_check_system(efifb_dmi_system_table);
|
|
|
+
|
|
|
+ if (screen_info.orig_video_isVGA == VIDEO_TYPE_EFI &&
|
|
|
+ dmi_check_system(efifb_dmi_swap_width_height)) {
|
|
|
+ u16 temp = screen_info.lfb_width;
|
|
|
+
|
|
|
+ screen_info.lfb_width = screen_info.lfb_height;
|
|
|
+ screen_info.lfb_height = temp;
|
|
|
+ screen_info.lfb_linelength = 4 * screen_info.lfb_width;
|
|
|
+ }
|
|
|
}
|