mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-04 04:06:26 +00:00
28eb75e178
core: - split DSC helpers from DP helpers - clang build fixes for drm/mm test - drop simple pipeline support for gem vram - document submission error signaling - move drm_rect to drm core module from kms helper - add default client setup to most drivers - move to video aperture helpers instead of drm ones tests: - new framebuffer tests ttm: - remove swapped and pinned BOs from TTM lru panic: - fix uninit spinlock - add ABGR2101010 support bridge: - add TI TDP158 support - use standard PM OPS dma-fence: - use read_trylock instead of read_lock to help lockdep scheduler: - add errno to sched start to report different errors - add locking to drm_sched_entity_modify_sched - improve documentation xe: - add drm_line_printer - lots of refactoring - Enable Xe2 + PES disaggregation - add new ARL PCI ID - SRIOV development work - fix exec unnecessary implicit fence - define and parse OA sync props - forcewake refactoring i915: - Enable BMG/LNL ultra joiner - Enable 10bpx + CCS scanout on ICL+, fp16/CCS on TGL+ - use DSB for plane/color mgmt - Arrow lake PCI IDs - lots of i915/xe display refactoring - enable PXP GuC autoteardown - Pantherlake (PTL) Xe3 LPD display enablement - Allow fastset HDR infoframe changes - write DP source OUI for non-eDP sinks - share PCI IDs between i915 and xe amdgpu: - SDMA queue reset support - SMU 13.0.6, JPEG 4.0.3 updates - Initial runtime repartitioning support - rework IP structs for multiple IP instances - Fetch EDID from _DDC if available - SMU13 zero rpm user control - lots of fixes/cleanups amdkfd: - Increase event FIFO size - add topology cap flag for per queue reset msm: - DPU: - SA8775P support - (disabled by default) MSM8917, MSM8937, MSM8953 and MSM8996 support - Enable large framebuffer support - Drop MSM8998 and SDM845 - DP: - SA8775P support - GPU: - a7xx preemption support - Adreno A663 support ast: - warn about unsupported TX chips ivpu: - add coredump - add pantherlake support rockchip: - 4K@60Hz display enablement - generate pll programming tables panthor: - add timestamp query API - add realtime group priority - add fdinfo support etnaviv: - improve handling of DMA address limits - improve GPU hangcheck exynos: - Decon Exynos7870 support mediatek: - add OF graph support omap: - locking fixes bochs: - convert to gem/shmem from simpledrm v3d: - support big/super pages - add gemfs vc4: - BCM2712 support refactoring - add YUV444 format support udmabuf: - folio related fixes nouveau: - add panic support on nv50+ -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEEKbZHaGwW9KfbeusDHTzWXnEhr4FAmc+efwACgkQDHTzWXnE hr6Dyg/9HVVI3lxuWAz9MEt3w+BON5KTJAxg5Zhvc5DwiUbDXghu8sfkUfanDWS5 /MqyPqLt5srXrtKTRDnzEI0Vf8YHeiDEcaydjpshEpCfteHZ7SADpvem8fp6/otV iYt8U6tMcGe9I+M2kwDkOTrKJIiyCKPi5hfBIAkxEAh6806ifPRtLkeMGbaSwBxH x6kZTE9ygGWAY7bAgbmVmm3JwrXG9mYDl9dW3cbi9gZ6PGAXHPZRUPvZoHhvfC2A UVgROH76Spm4rdWYGI3azj+gW3HsdGgUHcysb+lu37i261E+sT7kuV2UYtnOMzr5 igO1RlQ+rcfPYLG4n+oNXDMu5d1OQXELrlQzXptym4Konpd7b/GSeVctWV0wHWuv nG8g7DWAFFnLAdeWqLZpf1Brze33h5+572D3BioWB4LYSEATjwoTwcBKsdRuc4Wk RHxjumCidybTdo/8EB1ElGlH39m/mDQA0scMlVhS/BuiIssfgcBRfltI8S3HzHcW YQYq6xH7F9E3shs3/TYbWR4clm66ZTnZV6ClDfGJolzyF/hbV0rsbeSpDelpooE8 1Js7KuwVa+HvA4jtupY9vqxMTdXWwoGPfuUgKpOAreYibnd1T9Q1zVme/B1bUH05 518IjiMGCxDnBvFWaPT9DcX4zg7pS3yzjw3hGkdz3reUqat0Gy8= =8cUI -----END PGP SIGNATURE----- Merge tag 'drm-next-2024-11-21' of https://gitlab.freedesktop.org/drm/kernel Pull drm updates from Dave Airlie: "There's a lot of rework, the panic helper support is being added to more drivers, v3d gets support for HW superpages, scheduler documentation, drm client and video aperture reworks, some new MAINTAINERS added, amdgpu has the usual lots of IP refactors, Intel has some Pantherlake enablement and xe is getting some SRIOV bits, but just lots of stuff everywhere. core: - split DSC helpers from DP helpers - clang build fixes for drm/mm test - drop simple pipeline support for gem vram - document submission error signaling - move drm_rect to drm core module from kms helper - add default client setup to most drivers - move to video aperture helpers instead of drm ones tests: - new framebuffer tests ttm: - remove swapped and pinned BOs from TTM lru panic: - fix uninit spinlock - add ABGR2101010 support bridge: - add TI TDP158 support - use standard PM OPS dma-fence: - use read_trylock instead of read_lock to help lockdep scheduler: - add errno to sched start to report different errors - add locking to drm_sched_entity_modify_sched - improve documentation xe: - add drm_line_printer - lots of refactoring - Enable Xe2 + PES disaggregation - add new ARL PCI ID - SRIOV development work - fix exec unnecessary implicit fence - define and parse OA sync props - forcewake refactoring i915: - Enable BMG/LNL ultra joiner - Enable 10bpx + CCS scanout on ICL+, fp16/CCS on TGL+ - use DSB for plane/color mgmt - Arrow lake PCI IDs - lots of i915/xe display refactoring - enable PXP GuC autoteardown - Pantherlake (PTL) Xe3 LPD display enablement - Allow fastset HDR infoframe changes - write DP source OUI for non-eDP sinks - share PCI IDs between i915 and xe amdgpu: - SDMA queue reset support - SMU 13.0.6, JPEG 4.0.3 updates - Initial runtime repartitioning support - rework IP structs for multiple IP instances - Fetch EDID from _DDC if available - SMU13 zero rpm user control - lots of fixes/cleanups amdkfd: - Increase event FIFO size - add topology cap flag for per queue reset msm: - DPU: - SA8775P support - (disabled by default) MSM8917, MSM8937, MSM8953 and MSM8996 support - Enable large framebuffer support - Drop MSM8998 and SDM845 - DP: - SA8775P support - GPU: - a7xx preemption support - Adreno A663 support ast: - warn about unsupported TX chips ivpu: - add coredump - add pantherlake support rockchip: - 4K@60Hz display enablement - generate pll programming tables panthor: - add timestamp query API - add realtime group priority - add fdinfo support etnaviv: - improve handling of DMA address limits - improve GPU hangcheck exynos: - Decon Exynos7870 support mediatek: - add OF graph support omap: - locking fixes bochs: - convert to gem/shmem from simpledrm v3d: - support big/super pages - add gemfs vc4: - BCM2712 support refactoring - add YUV444 format support udmabuf: - folio related fixes nouveau: - add panic support on nv50+" * tag 'drm-next-2024-11-21' of https://gitlab.freedesktop.org/drm/kernel: (1583 commits) drm/xe/guc: Fix dereference before NULL check drm/amd: Fix initialization mistake for NBIO 7.7.0 Revert "drm/amd/display: parse umc_info or vram_info based on ASIC" drm/amd/display: Fix failure to read vram info due to static BP_RESULT drm/amdgpu: enable GTT fallback handling for dGPUs only drm/amd/amdgpu: limit single process inside MES drm/fourcc: add AMD_FMT_MOD_TILE_GFX9_4K_D_X drm/amdgpu/mes12: correct kiq unmap latency drm/amdgpu: Support vcn and jpeg error info parsing drm/amd : Update MES API header file for v11 & v12 drm/amd/amdkfd: add/remove kfd queues on start/stop KFD scheduling drm/amdkfd: change kfd process kref count at creation drm/amdgpu: Cleanup shift coding style drm/amd/amdgpu: Increase MES log buffer to dump mes scratch data drm/amdgpu: Implement virt req_ras_err_count drm/amdgpu: VF Query RAS Caps from Host if supported drm/amdgpu: Add msg handlers for SRIOV RAS Telemetry drm/amdgpu: Update SRIOV Exchange Headers for RAS Telemetry Support drm/amd/display: 3.2.309 drm/amd/display: Adjust VSDB parser for replay feature ...
554 lines
18 KiB
C
554 lines
18 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 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_onemix2s = {
|
|
.width = 1200,
|
|
.height = 1920,
|
|
.bios_dates = (const char * const []){ "05/21/2018", "10/26/2018",
|
|
"03/04/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_leftside_up = {
|
|
.width = 800,
|
|
.height = 1280,
|
|
.orientation = DRM_MODE_PANEL_ORIENTATION_LEFT_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 lcd1080x1920_leftside_up = {
|
|
.width = 1080,
|
|
.height = 1920,
|
|
.orientation = DRM_MODE_PANEL_ORIENTATION_LEFT_UP,
|
|
};
|
|
|
|
static const struct drm_dmi_panel_orientation_data lcd1080x1920_rightside_up = {
|
|
.width = 1080,
|
|
.height = 1920,
|
|
.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 drm_dmi_panel_orientation_data lcd1600x2560_leftside_up = {
|
|
.width = 1600,
|
|
.height = 2560,
|
|
.orientation = DRM_MODE_PANEL_ORIENTATION_LEFT_UP,
|
|
};
|
|
|
|
static const struct drm_dmi_panel_orientation_data lcd1600x2560_rightside_up = {
|
|
.width = 1600,
|
|
.height = 2560,
|
|
.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,
|
|
}, { /* Acer Switch V 10 (SW5-017) */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Acer"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "SW5-017"),
|
|
},
|
|
.driver_data = (void *)&lcd800x1280_rightside_up,
|
|
}, { /* Anbernic Win600 */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Anbernic"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Win600"),
|
|
},
|
|
.driver_data = (void *)&lcd720x1280_rightside_up,
|
|
}, { /* Asus T100HA */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T100HAN"),
|
|
},
|
|
.driver_data = (void *)&lcd800x1280_leftside_up,
|
|
}, { /* 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 AYANEO 2 */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AYANEO"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "AYANEO 2"),
|
|
},
|
|
.driver_data = (void *)&lcd1200x1920_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,
|
|
}, { /* AYA NEO AIR */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AYANEO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "AIR"),
|
|
},
|
|
.driver_data = (void *)&lcd1080x1920_leftside_up,
|
|
}, { /* AYA NEO Founder */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AYA NEO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "AYA NEO Founder"),
|
|
},
|
|
.driver_data = (void *)&lcd800x1280_rightside_up,
|
|
}, { /* AYA NEO GEEK */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AYANEO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "GEEK"),
|
|
},
|
|
.driver_data = (void *)&lcd800x1280_rightside_up,
|
|
}, { /* AYA NEO NEXT */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
|
|
DMI_MATCH(DMI_BOARD_NAME, "NEXT"),
|
|
},
|
|
.driver_data = (void *)&lcd800x1280_rightside_up,
|
|
}, { /* AYA NEO KUN */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
|
|
DMI_MATCH(DMI_BOARD_NAME, "KUN"),
|
|
},
|
|
.driver_data = (void *)&lcd1600x2560_rightside_up,
|
|
}, { /* AYN Loki Max */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ayn"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Loki Max"),
|
|
},
|
|
.driver_data = (void *)&lcd1080x1920_leftside_up,
|
|
}, { /* AYN Loki Zero */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ayn"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Loki Zero"),
|
|
},
|
|
.driver_data = (void *)&lcd1080x1920_leftside_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,
|
|
}, { /* Dynabook K50 */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Dynabook Inc."),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "dynabook K50/FR"),
|
|
},
|
|
.driver_data = (void *)&lcd800x1280_leftside_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 Win Max */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "GPD"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "G1619-01"),
|
|
},
|
|
.driver_data = (void *)&lcd800x1280_rightside_up,
|
|
}, { /*
|
|
* GPD Pocket, note that 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,
|
|
}, { /* GPD Win Mini */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "GPD"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "G1617-01")
|
|
},
|
|
.driver_data = (void *)&lcd1080x1920_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,
|
|
}, { /* Lenovo Ideapad D330-10IGL (HD) */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Lenovo ideapad D330-10IGL"),
|
|
},
|
|
.driver_data = (void *)&lcd800x1280_rightside_up,
|
|
}, { /* Lenovo IdeaPad Duet 3 10IGL5 */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "IdeaPad Duet 3 10IGL5"),
|
|
},
|
|
.driver_data = (void *)&lcd1200x1920_rightside_up,
|
|
}, { /* Lenovo Legion Go 8APU1 */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Legion Go 8APU1"),
|
|
},
|
|
.driver_data = (void *)&lcd1600x2560_leftside_up,
|
|
}, { /* Lenovo Yoga Book X90F / X90L */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Intel Corporation"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "CHERRYVIEW D1 PLATFORM"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "YETI-11"),
|
|
},
|
|
.driver_data = (void *)&lcd1200x1920_rightside_up,
|
|
}, { /* Lenovo Yoga Book X91F / X91L */
|
|
.matches = {
|
|
/* Non exact match to match F + L versions */
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "Lenovo YB1-X91"),
|
|
},
|
|
.driver_data = (void *)&lcd1200x1920_rightside_up,
|
|
}, { /* Lenovo Yoga Tablet 2 830F / 830L */
|
|
.matches = {
|
|
/*
|
|
* Note this also matches the Lenovo Yoga Tablet 2 1050F/L
|
|
* since that uses the same mainboard. The resolution match
|
|
* will limit this to only matching on the 830F/L. Neither has
|
|
* any external video outputs so those are not a concern.
|
|
*/
|
|
DMI_MATCH(DMI_SYS_VENDOR, "Intel Corp."),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "VALLEYVIEW C0 PLATFORM"),
|
|
DMI_MATCH(DMI_BOARD_NAME, "BYT-T FFD8"),
|
|
/* Partial match on beginning of BIOS version */
|
|
DMI_MATCH(DMI_BIOS_VERSION, "BLADE_21"),
|
|
},
|
|
.driver_data = (void *)&lcd1200x1920_rightside_up,
|
|
}, { /* Lenovo Yoga Tab 3 X90F */
|
|
.matches = {
|
|
DMI_MATCH(DMI_SYS_VENDOR, "Intel Corporation"),
|
|
DMI_MATCH(DMI_PRODUCT_VERSION, "Blade3-10A-001"),
|
|
},
|
|
.driver_data = (void *)&lcd1600x2560_rightside_up,
|
|
}, { /* Nanote UMPC-01 */
|
|
.matches = {
|
|
DMI_MATCH(DMI_SYS_VENDOR, "RWC CO.,LTD"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "UMPC-01"),
|
|
},
|
|
.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,
|
|
}, { /* OneXPlayer */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ONE-NETBOOK TECHNOLOGY CO., LTD."),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "ONE XPLAYER"),
|
|
},
|
|
.driver_data = (void *)&lcd1600x2560_leftside_up,
|
|
}, { /* OrangePi Neo */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "OrangePi"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "NEO-01"),
|
|
},
|
|
.driver_data = (void *)&lcd1200x1920_rightside_up,
|
|
}, { /* 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 (Jupiter) */
|
|
.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,
|
|
}, { /* Valve Steam Deck (Galileo) */
|
|
.matches = {
|
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Valve"),
|
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Galileo"),
|
|
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,
|
|
}, { /* One Mix 2S (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_onemix2s,
|
|
},
|
|
{}
|
|
};
|
|
|
|
/**
|
|
* 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_DESCRIPTION("Quirks for non-normal panel orientation");
|
|
MODULE_LICENSE("Dual MIT/GPL");
|