Home | History | Annotate | Line # | Download | only in display
      1  1.1  riastrad /*	$NetBSD: intel_quirks.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
      2  1.1  riastrad 
      3  1.1  riastrad // SPDX-License-Identifier: MIT
      4  1.1  riastrad /*
      5  1.1  riastrad  * Copyright  2018 Intel Corporation
      6  1.1  riastrad  */
      7  1.1  riastrad 
      8  1.1  riastrad #include <sys/cdefs.h>
      9  1.1  riastrad __KERNEL_RCSID(0, "$NetBSD: intel_quirks.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $");
     10  1.1  riastrad 
     11  1.1  riastrad #include <linux/dmi.h>
     12  1.1  riastrad 
     13  1.1  riastrad #include "intel_display_types.h"
     14  1.1  riastrad #include "intel_quirks.h"
     15  1.1  riastrad 
     16  1.1  riastrad /*
     17  1.1  riastrad  * Some machines (Lenovo U160) do not work with SSC on LVDS for some reason
     18  1.1  riastrad  */
     19  1.1  riastrad static void quirk_ssc_force_disable(struct drm_i915_private *i915)
     20  1.1  riastrad {
     21  1.1  riastrad 	i915->quirks |= QUIRK_LVDS_SSC_DISABLE;
     22  1.1  riastrad 	DRM_INFO("applying lvds SSC disable quirk\n");
     23  1.1  riastrad }
     24  1.1  riastrad 
     25  1.1  riastrad /*
     26  1.1  riastrad  * A machine (e.g. Acer Aspire 5734Z) may need to invert the panel backlight
     27  1.1  riastrad  * brightness value
     28  1.1  riastrad  */
     29  1.1  riastrad static void quirk_invert_brightness(struct drm_i915_private *i915)
     30  1.1  riastrad {
     31  1.1  riastrad 	i915->quirks |= QUIRK_INVERT_BRIGHTNESS;
     32  1.1  riastrad 	DRM_INFO("applying inverted panel brightness quirk\n");
     33  1.1  riastrad }
     34  1.1  riastrad 
     35  1.1  riastrad /* Some VBT's incorrectly indicate no backlight is present */
     36  1.1  riastrad static void quirk_backlight_present(struct drm_i915_private *i915)
     37  1.1  riastrad {
     38  1.1  riastrad 	i915->quirks |= QUIRK_BACKLIGHT_PRESENT;
     39  1.1  riastrad 	DRM_INFO("applying backlight present quirk\n");
     40  1.1  riastrad }
     41  1.1  riastrad 
     42  1.1  riastrad /* Toshiba Satellite P50-C-18C requires T12 delay to be min 800ms
     43  1.1  riastrad  * which is 300 ms greater than eDP spec T12 min.
     44  1.1  riastrad  */
     45  1.1  riastrad static void quirk_increase_t12_delay(struct drm_i915_private *i915)
     46  1.1  riastrad {
     47  1.1  riastrad 	i915->quirks |= QUIRK_INCREASE_T12_DELAY;
     48  1.1  riastrad 	DRM_INFO("Applying T12 delay quirk\n");
     49  1.1  riastrad }
     50  1.1  riastrad 
     51  1.1  riastrad /*
     52  1.1  riastrad  * GeminiLake NUC HDMI outputs require additional off time
     53  1.1  riastrad  * this allows the onboard retimer to correctly sync to signal
     54  1.1  riastrad  */
     55  1.1  riastrad static void quirk_increase_ddi_disabled_time(struct drm_i915_private *i915)
     56  1.1  riastrad {
     57  1.1  riastrad 	i915->quirks |= QUIRK_INCREASE_DDI_DISABLED_TIME;
     58  1.1  riastrad 	DRM_INFO("Applying Increase DDI Disabled quirk\n");
     59  1.1  riastrad }
     60  1.1  riastrad 
     61  1.1  riastrad struct intel_quirk {
     62  1.1  riastrad 	int device;
     63  1.1  riastrad 	int subsystem_vendor;
     64  1.1  riastrad 	int subsystem_device;
     65  1.1  riastrad 	void (*hook)(struct drm_i915_private *i915);
     66  1.1  riastrad };
     67  1.1  riastrad 
     68  1.1  riastrad /* For systems that don't have a meaningful PCI subdevice/subvendor ID */
     69  1.1  riastrad struct intel_dmi_quirk {
     70  1.1  riastrad 	void (*hook)(struct drm_i915_private *i915);
     71  1.1  riastrad 	const struct dmi_system_id (*dmi_id_list)[];
     72  1.1  riastrad };
     73  1.1  riastrad 
     74  1.1  riastrad static int intel_dmi_reverse_brightness(const struct dmi_system_id *id)
     75  1.1  riastrad {
     76  1.1  riastrad 	DRM_INFO("Backlight polarity reversed on %s\n", id->ident);
     77  1.1  riastrad 	return 1;
     78  1.1  riastrad }
     79  1.1  riastrad 
     80  1.1  riastrad static const struct intel_dmi_quirk intel_dmi_quirks[] = {
     81  1.1  riastrad 	{
     82  1.1  riastrad 		.dmi_id_list = &(const struct dmi_system_id[]) {
     83  1.1  riastrad 			{
     84  1.1  riastrad 				.callback = intel_dmi_reverse_brightness,
     85  1.1  riastrad 				.ident = "NCR Corporation",
     86  1.1  riastrad 				.matches = {DMI_MATCH(DMI_SYS_VENDOR, "NCR Corporation"),
     87  1.1  riastrad 					    DMI_MATCH(DMI_PRODUCT_NAME, ""),
     88  1.1  riastrad 				},
     89  1.1  riastrad 			},
     90  1.1  riastrad 			{ }  /* terminating entry */
     91  1.1  riastrad 		},
     92  1.1  riastrad 		.hook = quirk_invert_brightness,
     93  1.1  riastrad 	},
     94  1.1  riastrad };
     95  1.1  riastrad 
     96  1.1  riastrad static struct intel_quirk intel_quirks[] = {
     97  1.1  riastrad 	/* Lenovo U160 cannot use SSC on LVDS */
     98  1.1  riastrad 	{ 0x0046, 0x17aa, 0x3920, quirk_ssc_force_disable },
     99  1.1  riastrad 
    100  1.1  riastrad 	/* Sony Vaio Y cannot use SSC on LVDS */
    101  1.1  riastrad 	{ 0x0046, 0x104d, 0x9076, quirk_ssc_force_disable },
    102  1.1  riastrad 
    103  1.1  riastrad 	/* Acer Aspire 5734Z must invert backlight brightness */
    104  1.1  riastrad 	{ 0x2a42, 0x1025, 0x0459, quirk_invert_brightness },
    105  1.1  riastrad 
    106  1.1  riastrad 	/* Acer/eMachines G725 */
    107  1.1  riastrad 	{ 0x2a42, 0x1025, 0x0210, quirk_invert_brightness },
    108  1.1  riastrad 
    109  1.1  riastrad 	/* Acer/eMachines e725 */
    110  1.1  riastrad 	{ 0x2a42, 0x1025, 0x0212, quirk_invert_brightness },
    111  1.1  riastrad 
    112  1.1  riastrad 	/* Acer/Packard Bell NCL20 */
    113  1.1  riastrad 	{ 0x2a42, 0x1025, 0x034b, quirk_invert_brightness },
    114  1.1  riastrad 
    115  1.1  riastrad 	/* Acer Aspire 4736Z */
    116  1.1  riastrad 	{ 0x2a42, 0x1025, 0x0260, quirk_invert_brightness },
    117  1.1  riastrad 
    118  1.1  riastrad 	/* Acer Aspire 5336 */
    119  1.1  riastrad 	{ 0x2a42, 0x1025, 0x048a, quirk_invert_brightness },
    120  1.1  riastrad 
    121  1.1  riastrad 	/* Acer C720 and C720P Chromebooks (Celeron 2955U) have backlights */
    122  1.1  riastrad 	{ 0x0a06, 0x1025, 0x0a11, quirk_backlight_present },
    123  1.1  riastrad 
    124  1.1  riastrad 	/* Acer C720 Chromebook (Core i3 4005U) */
    125  1.1  riastrad 	{ 0x0a16, 0x1025, 0x0a11, quirk_backlight_present },
    126  1.1  riastrad 
    127  1.1  riastrad 	/* Apple Macbook 2,1 (Core 2 T7400) */
    128  1.1  riastrad 	{ 0x27a2, 0x8086, 0x7270, quirk_backlight_present },
    129  1.1  riastrad 
    130  1.1  riastrad 	/* Apple Macbook 4,1 */
    131  1.1  riastrad 	{ 0x2a02, 0x106b, 0x00a1, quirk_backlight_present },
    132  1.1  riastrad 
    133  1.1  riastrad 	/* Toshiba CB35 Chromebook (Celeron 2955U) */
    134  1.1  riastrad 	{ 0x0a06, 0x1179, 0x0a88, quirk_backlight_present },
    135  1.1  riastrad 
    136  1.1  riastrad 	/* HP Chromebook 14 (Celeron 2955U) */
    137  1.1  riastrad 	{ 0x0a06, 0x103c, 0x21ed, quirk_backlight_present },
    138  1.1  riastrad 
    139  1.1  riastrad 	/* Dell Chromebook 11 */
    140  1.1  riastrad 	{ 0x0a06, 0x1028, 0x0a35, quirk_backlight_present },
    141  1.1  riastrad 
    142  1.1  riastrad 	/* Dell Chromebook 11 (2015 version) */
    143  1.1  riastrad 	{ 0x0a16, 0x1028, 0x0a35, quirk_backlight_present },
    144  1.1  riastrad 
    145  1.1  riastrad 	/* Toshiba Satellite P50-C-18C */
    146  1.1  riastrad 	{ 0x191B, 0x1179, 0xF840, quirk_increase_t12_delay },
    147  1.1  riastrad 
    148  1.1  riastrad 	/* GeminiLake NUC */
    149  1.1  riastrad 	{ 0x3185, 0x8086, 0x2072, quirk_increase_ddi_disabled_time },
    150  1.1  riastrad 	{ 0x3184, 0x8086, 0x2072, quirk_increase_ddi_disabled_time },
    151  1.1  riastrad 	/* ASRock ITX*/
    152  1.1  riastrad 	{ 0x3185, 0x1849, 0x2212, quirk_increase_ddi_disabled_time },
    153  1.1  riastrad 	{ 0x3184, 0x1849, 0x2212, quirk_increase_ddi_disabled_time },
    154  1.1  riastrad };
    155  1.1  riastrad 
    156  1.1  riastrad void intel_init_quirks(struct drm_i915_private *i915)
    157  1.1  riastrad {
    158  1.1  riastrad 	struct pci_dev *d = i915->drm.pdev;
    159  1.1  riastrad 	int i;
    160  1.1  riastrad 
    161  1.1  riastrad 	for (i = 0; i < ARRAY_SIZE(intel_quirks); i++) {
    162  1.1  riastrad 		struct intel_quirk *q = &intel_quirks[i];
    163  1.1  riastrad 
    164  1.1  riastrad 		if (d->device == q->device &&
    165  1.1  riastrad 		    (d->subsystem_vendor == q->subsystem_vendor ||
    166  1.1  riastrad 		     q->subsystem_vendor == PCI_ANY_ID) &&
    167  1.1  riastrad 		    (d->subsystem_device == q->subsystem_device ||
    168  1.1  riastrad 		     q->subsystem_device == PCI_ANY_ID))
    169  1.1  riastrad 			q->hook(i915);
    170  1.1  riastrad 	}
    171  1.1  riastrad 	for (i = 0; i < ARRAY_SIZE(intel_dmi_quirks); i++) {
    172  1.1  riastrad 		if (dmi_check_system(*intel_dmi_quirks[i].dmi_id_list) != 0)
    173  1.1  riastrad 			intel_dmi_quirks[i].hook(i915);
    174  1.1  riastrad 	}
    175  1.1  riastrad }
    176