56d3375448
core: - improve dma_fence, lease and resv documentation - shmem-helpers: allocate WC pages on x86, use vmf_insert_pin - sched fixes/improvements - allow empty drm leases - add dma resv iterator - add more DP 2.0 headers - DP MST helper improvements for DP2.0 dma-buf: - avoid warnings, remove fence trace macros bridge: - new helper to get rid of panels - probe improvements for it66121 - enable DSI EOTP for anx7625 fbdev: - efifb: release runtime PM on destroy ttm: - kerneldoc switch - helper to clear all DMA mappings - pool shrinker optimizaton - remove ttm_tt_destroy_common - update ttm_move_memcpy for async use panel: - add new panel-edp driver amdgpu: - Initial DP 2.0 support - Initial USB4 DP tunnelling support - Aldebaran MCE support - Modifier support for DCC image stores for GFX 10.3 - Display rework for better FP code handling - Yellow Carp/Cyan Skillfish updates - Cyan Skillfish display support - convert vega/navi to IP discovery asic enumeration - validate IP discovery table - RAS improvements - Lots of fixes i915: - DG1 PCI IDs + LMEM discovery/placement - DG1 GuC submission by default - ADL-S PCI IDs updated + enabled by default - ADL-P (XE_LPD) fixed and updates - DG2 display fixes - PXP protected object support for Gen12 integrated - expose multi-LRC submission interface for GuC - export logical engine instance to user - Disable engine bonding on Gen12+ - PSR cleanup - PSR2 selective fetch by default - DP 2.0 prep work - VESA vendor block + MSO use of it - FBC refactor - try again to fix fast-narrow vs slow-wide eDP training - use THP when IOMMU enabled - LMEM backup/restore for suspend/resume - locking simplification - GuC major reworking - async flip VT-D workaround changes - DP link training improvements - misc display refactorings bochs: - new PCI ID rcar-du: - Non-contiguious buffer import support for rcar-du - r8a779a0 support prep omapdrm: - COMPILE_TEST fixes sti: - COMPILE_TEST fixes msm: - fence ordering improvements - eDP support in DP sub-driver - dpu irq handling cleanup - CRC support for making igt happy - NO_CONNECTOR bridge support - dsi: 14nm phy support for msm8953 - mdp5: msm8x53, sdm450, sdm632 support stm: - layer alpha + zpo support v3d: - fix Vulkan CTS failure - support multiple sync objects gud: - add R8/RGB332/RGB888 pixel formats vc4: - convert to new bridge helpers vgem: - use shmem helpers virtio: - support mapping exported vram zte: - remove obsolete driver rockchip: - use bridge attach no connector for LVDS/RGB -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEEKbZHaGwW9KfbeusDHTzWXnEhr4FAmGByPYACgkQDHTzWXnE hr6fxA//cXUvTHlEtF7UJDBRAYv+9lXH39NbGYU4aLJuBNlZztCuUi5JOSyDFDH1 N9VI5biVseev2PEnCzJUubWxTqbUO7FBQTw0TyvZ4Eqn+UZMuFeo0dvdKZRAkvjV VHSUc0fm0+WSYanKUK7XK0fwG8aE6JVyYngzgKPSjifhszTdiiRsbU21iTinFhkS rgh3HEVELp+LqfoG4qzAYqFUjYqUjvCjd/hX/UkzCII8ZXKr38/4127e95443WOk +jes0gWGJe9TvSDrqo9TMx4qukcOniINFUvnzoD2RhOS+Jzr/i5rBh51Xy92g3NO Q7hy6byZdk/ZO/MXCDQ2giUOkBiqn5fQjlRGQp4iAZYw9pb3HU+/xrTq0BWVWd8o /vmzZYEKKU/sCGpxVDMZxsHV3mXIuVBvuZq6bjmSGcybgOBCiDx5F/Rum4nY2yHp lr3cuc0HP3m3f4b/HVvACO4tGd1nDDpVcon7CuhBB7HB7t6Zl9u18qc/qFw0tCTh 3sgAhno6XFXtPFcSX2KAeeg0mhKDKKrsOnq5y3bDRr05Z0jLocJk95aXEKs6em4j gbyHwNaX3CHtiCnFn2/5169+n1K7zqHBtVSGmQlmFDv55rcdx7L3Spk7tCahQeSQ ur24r+sEggm8d5Wjl+MYq6wW3oP31s04JFaeV6oCkaSp1wS+alg= =jdhH -----END PGP SIGNATURE----- Merge tag 'drm-next-2021-11-03' of git://anongit.freedesktop.org/drm/drm Pull drm updates from Dave Airlie: "Summary below. i915 starts to add support for DG2 GPUs, enables DG1 and ADL-S support by default, lots of work to enable DisplayPort 2.0 across drivers. Lots of documentation updates and fixes across the board. core: - improve dma_fence, lease and resv documentation - shmem-helpers: allocate WC pages on x86, use vmf_insert_pin - sched fixes/improvements - allow empty drm leases - add dma resv iterator - add more DP 2.0 headers - DP MST helper improvements for DP2.0 dma-buf: - avoid warnings, remove fence trace macros bridge: - new helper to get rid of panels - probe improvements for it66121 - enable DSI EOTP for anx7625 fbdev: - efifb: release runtime PM on destroy ttm: - kerneldoc switch - helper to clear all DMA mappings - pool shrinker optimizaton - remove ttm_tt_destroy_common - update ttm_move_memcpy for async use panel: - add new panel-edp driver amdgpu: - Initial DP 2.0 support - Initial USB4 DP tunnelling support - Aldebaran MCE support - Modifier support for DCC image stores for GFX 10.3 - Display rework for better FP code handling - Yellow Carp/Cyan Skillfish updates - Cyan Skillfish display support - convert vega/navi to IP discovery asic enumeration - validate IP discovery table - RAS improvements - Lots of fixes i915: - DG1 PCI IDs + LMEM discovery/placement - DG1 GuC submission by default - ADL-S PCI IDs updated + enabled by default - ADL-P (XE_LPD) fixed and updates - DG2 display fixes - PXP protected object support for Gen12 integrated - expose multi-LRC submission interface for GuC - export logical engine instance to user - Disable engine bonding on Gen12+ - PSR cleanup - PSR2 selective fetch by default - DP 2.0 prep work - VESA vendor block + MSO use of it - FBC refactor - try again to fix fast-narrow vs slow-wide eDP training - use THP when IOMMU enabled - LMEM backup/restore for suspend/resume - locking simplification - GuC major reworking - async flip VT-D workaround changes - DP link training improvements - misc display refactorings bochs: - new PCI ID rcar-du: - Non-contiguious buffer import support for rcar-du - r8a779a0 support prep omapdrm: - COMPILE_TEST fixes sti: - COMPILE_TEST fixes msm: - fence ordering improvements - eDP support in DP sub-driver - dpu irq handling cleanup - CRC support for making igt happy - NO_CONNECTOR bridge support - dsi: 14nm phy support for msm8953 - mdp5: msm8x53, sdm450, sdm632 support stm: - layer alpha + zpo support v3d: - fix Vulkan CTS failure - support multiple sync objects gud: - add R8/RGB332/RGB888 pixel formats vc4: - convert to new bridge helpers vgem: - use shmem helpers virtio: - support mapping exported vram zte: - remove obsolete driver rockchip: - use bridge attach no connector for LVDS/RGB" * tag 'drm-next-2021-11-03' of git://anongit.freedesktop.org/drm/drm: (1259 commits) drm/amdgpu/gmc6: fix DMA mask from 44 to 40 bits drm/amd/display: MST support for DPIA drm/amdgpu: Fix even more out of bound writes from debugfs drm/amdgpu/discovery: add SDMA IP instance info for soc15 parts drm/amdgpu/discovery: add UVD/VCN IP instance info for soc15 parts drm/amdgpu/UAPI: rearrange header to better align related items drm/amd/display: Enable dpia in dmub only for DCN31 B0 drm/amd/display: Fix USB4 hot plug crash issue drm/amd/display: Fix deadlock when falling back to v2 from v3 drm/amd/display: Fallback to clocks which meet requested voltage on DCN31 drm/amd/display: move FPU associated DCN301 code to DML folder drm/amd/display: fix link training regression for 1 or 2 lane drm/amd/display: add two lane settings training options drm/amd/display: decouple hw_lane_settings from dpcd_lane_settings drm/amd/display: implement decide lane settings drm/amd/display: adopt DP2.0 LT SCR revision 8 drm/amd/display: FEC configuration for dpia links in MST mode drm/amd/display: FEC configuration for dpia links drm/amd/display: Add workaround flag for EDID read on certain docks drm/amd/display: Set phy_mux_sel bit in dmub scratch register ...
358 lines
12 KiB
C
358 lines
12 KiB
C
/* SPDX-License-Identifier: MIT */
|
|
/*
|
|
* drm_panel_orientation_quirks.c -- Quirks for non-normal panel orientation
|
|
*
|
|
* Copyright (C) 2017 Hans de Goede <hdegoede@redhat.com>
|
|
*
|
|
* Note the quirks in this file are shared with fbdev/efifb and as such
|
|
* must not depend on other drm code.
|
|
*/
|
|
|
|
#include <linux/dmi.h>
|
|
#include <linux/module.h>
|
|
#include <drm/drm_connector.h>
|
|
#include <drm/drm_utils.h>
|
|
|
|
#ifdef CONFIG_DMI
|
|
|
|
/*
|
|
* Some x86 clamshell design devices use portrait tablet screens and a display
|
|
* engine which cannot rotate in hardware, so we need to rotate the fbcon to
|
|
* compensate. Unfortunately these (cheap) devices also typically have quite
|
|
* generic DMI data, so we match on a combination of DMI data, screen resolution
|
|
* and a list of known BIOS dates to avoid false positives.
|
|
*/
|
|
|
|
struct drm_dmi_panel_orientation_data {
|
|
int width;
|
|
int height;
|
|
const char * const *bios_dates;
|
|
int orientation;
|
|
};
|
|
|
|
static const struct drm_dmi_panel_orientation_data asus_t100ha = {
|
|
.width = 800,
|
|
.height = 1280,
|
|
.orientation = DRM_MODE_PANEL_ORIENTATION_LEFT_UP,
|
|
};
|
|
|
|
static const struct drm_dmi_panel_orientation_data gpd_micropc = {
|
|
.width = 720,
|
|
.height = 1280,
|
|
.bios_dates = (const char * const []){ "04/26/2019",
|
|
NULL },
|
|
.orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP,
|
|
};
|
|
|
|
static const struct drm_dmi_panel_orientation_data gpd_pocket = {
|
|
.width = 1200,
|
|
.height = 1920,
|
|
.bios_dates = (const char * const []){ "05/26/2017", "06/28/2017",
|
|
"07/05/2017", "08/07/2017", NULL },
|
|
.orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP,
|
|
};
|
|
|
|
static const struct drm_dmi_panel_orientation_data gpd_pocket2 = {
|
|
.width = 1200,
|
|
.height = 1920,
|
|
.bios_dates = (const char * const []){ "06/28/2018", "08/28/2018",
|
|
"12/07/2018", NULL },
|
|
.orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP,
|
|
};
|
|
|
|
static const struct drm_dmi_panel_orientation_data gpd_win = {
|
|
.width = 720,
|
|
.height = 1280,
|
|
.bios_dates = (const char * const []){
|
|
"10/25/2016", "11/18/2016", "12/23/2016", "12/26/2016",
|
|
"02/21/2017", "03/20/2017", "05/25/2017", NULL },
|
|
.orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP,
|
|
};
|
|
|
|
static const struct drm_dmi_panel_orientation_data gpd_win2 = {
|
|
.width = 720,
|
|
.height = 1280,
|
|
.bios_dates = (const char * const []){
|
|
"12/07/2017", "05/24/2018", "06/29/2018", NULL },
|
|
.orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP,
|
|
};
|
|
|
|
static const struct drm_dmi_panel_orientation_data itworks_tw891 = {
|
|
.width = 800,
|
|
.height = 1280,
|
|
.bios_dates = (const char * const []){ "10/16/2015", NULL },
|
|
.orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP,
|
|
};
|
|
|
|
static const struct drm_dmi_panel_orientation_data onegx1_pro = {
|
|
.width = 1200,
|
|
.height = 1920,
|
|
.bios_dates = (const char * const []){ "12/17/2020", NULL },
|
|
.orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP,
|
|
};
|
|
|
|
static const struct drm_dmi_panel_orientation_data lcd720x1280_rightside_up = {
|
|
.width = 720,
|
|
.height = 1280,
|
|
.orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP,
|
|
};
|
|
|
|
static const struct drm_dmi_panel_orientation_data lcd800x1280_rightside_up = {
|
|
.width = 800,
|
|
.height = 1280,
|
|
.orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP,
|
|
};
|
|
|
|
static const struct drm_dmi_panel_orientation_data lcd1200x1920_rightside_up = {
|
|
.width = 1200,
|
|
.height = 1920,
|
|
.orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP,
|
|
};
|
|
|
|
static const struct drm_dmi_panel_orientation_data lcd1280x1920_rightside_up = {
|
|
.width = 1280,
|
|
.height = 1920,
|
|
.orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP,
|
|
};
|
|
|
|
static const struct dmi_system_id orientation_data[] = {
|
|
{ /* Acer One 10 (S1003) */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Acer"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "One S1003"),
|
|
},
|
|
.driver_data = (void *)&lcd800x1280_rightside_up,
|
|
}, { /* Asus T100HA */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T100HAN"),
|
|
},
|
|
.driver_data = (void *)&asus_t100ha,
|
|
}, { /* Asus T101HA */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T101HA"),
|
|
},
|
|
.driver_data = (void *)&lcd800x1280_rightside_up,
|
|
}, { /* Asus T103HAF */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T103HAF"),
|
|
},
|
|
.driver_data = (void *)&lcd800x1280_rightside_up,
|
|
}, { /* AYA NEO 2021 */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AYADEVICE"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "AYA NEO 2021"),
|
|
},
|
|
.driver_data = (void *)&lcd800x1280_rightside_up,
|
|
}, { /* Chuwi HiBook (CWI514) */
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "Hampoo"),
|
|
DMI_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"),
|
|
/* Above matches are too generic, add bios-date match */
|
|
DMI_MATCH(DMI_BIOS_DATE, "05/07/2016"),
|
|
},
|
|
.driver_data = (void *)&lcd1200x1920_rightside_up,
|
|
}, { /* Chuwi Hi10 Pro (CWI529) */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Hampoo"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Hi10 pro tablet"),
|
|
},
|
|
.driver_data = (void *)&lcd1200x1920_rightside_up,
|
|
}, { /* GPD MicroPC (generic strings, also match on bios date) */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Default string"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Default string"),
|
|
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Default string"),
|
|
DMI_EXACT_MATCH(DMI_BOARD_NAME, "Default string"),
|
|
},
|
|
.driver_data = (void *)&gpd_micropc,
|
|
}, { /* GPD MicroPC (later BIOS versions with proper DMI strings) */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "GPD"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "MicroPC"),
|
|
},
|
|
.driver_data = (void *)&lcd720x1280_rightside_up,
|
|
}, { /*
|
|
* GPD Pocket, note that the the DMI data is less generic then
|
|
* it seems, devices with a board-vendor of "AMI Corporation"
|
|
* are quite rare, as are devices which have both board- *and*
|
|
* product-id set to "Default String"
|
|
*/
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
|
|
DMI_EXACT_MATCH(DMI_BOARD_NAME, "Default string"),
|
|
DMI_EXACT_MATCH(DMI_BOARD_SERIAL, "Default string"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Default string"),
|
|
},
|
|
.driver_data = (void *)&gpd_pocket,
|
|
}, { /* GPD Pocket 2 (generic strings, also match on bios date) */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Default string"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Default string"),
|
|
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Default string"),
|
|
DMI_EXACT_MATCH(DMI_BOARD_NAME, "Default string"),
|
|
},
|
|
.driver_data = (void *)&gpd_pocket2,
|
|
}, { /* GPD Win (same note on DMI match as GPD Pocket) */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
|
|
DMI_EXACT_MATCH(DMI_BOARD_NAME, "Default string"),
|
|
DMI_EXACT_MATCH(DMI_BOARD_SERIAL, "Default string"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Default string"),
|
|
},
|
|
.driver_data = (void *)&gpd_win,
|
|
}, { /* GPD Win 2 (too generic strings, also match on bios date) */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Default string"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Default string"),
|
|
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Default string"),
|
|
DMI_EXACT_MATCH(DMI_BOARD_NAME, "Default string"),
|
|
},
|
|
.driver_data = (void *)&gpd_win2,
|
|
}, { /* GPD Win 3 */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "GPD"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "G1618-03")
|
|
},
|
|
.driver_data = (void *)&lcd720x1280_rightside_up,
|
|
}, { /* I.T.Works TW891 */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "To be filled by O.E.M."),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "TW891"),
|
|
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "To be filled by O.E.M."),
|
|
DMI_EXACT_MATCH(DMI_BOARD_NAME, "TW891"),
|
|
},
|
|
.driver_data = (void *)&itworks_tw891,
|
|
}, { /* KD Kurio Smart C15200 2-in-1 */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "KD Interactive"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Kurio Smart"),
|
|
DMI_EXACT_MATCH(DMI_BOARD_NAME, "KDM960BCP"),
|
|
},
|
|
.driver_data = (void *)&lcd800x1280_rightside_up,
|
|
}, { /*
|
|
* Lenovo Ideapad Miix 310 laptop, only some production batches
|
|
* have a portrait screen, the resolution checks makes the quirk
|
|
* apply only to those batches.
|
|
*/
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "80SG"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "MIIX 310-10ICR"),
|
|
},
|
|
.driver_data = (void *)&lcd800x1280_rightside_up,
|
|
}, { /* Lenovo Ideapad Miix 320 */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "80XF"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Lenovo MIIX 320-10ICR"),
|
|
},
|
|
.driver_data = (void *)&lcd800x1280_rightside_up,
|
|
}, { /* Lenovo Ideapad D330-10IGM (HD) */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Lenovo ideapad D330-10IGM"),
|
|
},
|
|
.driver_data = (void *)&lcd800x1280_rightside_up,
|
|
}, { /* Lenovo Ideapad D330-10IGM (FHD) */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Lenovo ideapad D330-10IGM"),
|
|
},
|
|
.driver_data = (void *)&lcd1200x1920_rightside_up,
|
|
}, { /* OneGX1 Pro */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "SYSTEM_MANUFACTURER"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "SYSTEM_PRODUCT_NAME"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Default string"),
|
|
},
|
|
.driver_data = (void *)&onegx1_pro,
|
|
}, { /* Samsung GalaxyBook 10.6 */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Galaxy Book 10.6"),
|
|
},
|
|
.driver_data = (void *)&lcd1280x1920_rightside_up,
|
|
}, { /* Valve Steam Deck */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Valve"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Jupiter"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "1"),
|
|
},
|
|
.driver_data = (void *)&lcd800x1280_rightside_up,
|
|
}, { /* VIOS LTH17 */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "VIOS"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "LTH17"),
|
|
},
|
|
.driver_data = (void *)&lcd800x1280_rightside_up,
|
|
},
|
|
{}
|
|
};
|
|
|
|
/**
|
|
* drm_get_panel_orientation_quirk - Check for panel orientation quirks
|
|
* @width: width in pixels of the panel
|
|
* @height: height in pixels of the panel
|
|
*
|
|
* This function checks for platform specific (e.g. DMI based) quirks
|
|
* providing info on panel_orientation for systems where this cannot be
|
|
* probed from the hard-/firm-ware. To avoid false-positive this function
|
|
* takes the panel resolution as argument and checks that against the
|
|
* resolution expected by the quirk-table entry.
|
|
*
|
|
* Note this function is also used outside of the drm-subsys, by for example
|
|
* the efifb code. Because of this this function gets compiled into its own
|
|
* kernel-module when built as a module.
|
|
*
|
|
* Returns:
|
|
* A DRM_MODE_PANEL_ORIENTATION_* value if there is a quirk for this system,
|
|
* or DRM_MODE_PANEL_ORIENTATION_UNKNOWN if there is no quirk.
|
|
*/
|
|
int drm_get_panel_orientation_quirk(int width, int height)
|
|
{
|
|
const struct dmi_system_id *match;
|
|
const struct drm_dmi_panel_orientation_data *data;
|
|
const char *bios_date;
|
|
int i;
|
|
|
|
for (match = dmi_first_match(orientation_data);
|
|
match;
|
|
match = dmi_first_match(match + 1)) {
|
|
data = match->driver_data;
|
|
|
|
if (data->width != width ||
|
|
data->height != height)
|
|
continue;
|
|
|
|
if (!data->bios_dates)
|
|
return data->orientation;
|
|
|
|
bios_date = dmi_get_system_info(DMI_BIOS_DATE);
|
|
if (!bios_date)
|
|
continue;
|
|
|
|
i = match_string(data->bios_dates, -1, bios_date);
|
|
if (i >= 0)
|
|
return data->orientation;
|
|
}
|
|
|
|
return DRM_MODE_PANEL_ORIENTATION_UNKNOWN;
|
|
}
|
|
EXPORT_SYMBOL(drm_get_panel_orientation_quirk);
|
|
|
|
#else
|
|
|
|
/* There are no quirks for non x86 devices yet */
|
|
int drm_get_panel_orientation_quirk(int width, int height)
|
|
{
|
|
return DRM_MODE_PANEL_ORIENTATION_UNKNOWN;
|
|
}
|
|
EXPORT_SYMBOL(drm_get_panel_orientation_quirk);
|
|
|
|
#endif
|
|
|
|
MODULE_LICENSE("Dual MIT/GPL");
|