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