1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * DMI based code to deal with broken DSDTs on X86 tablets which ship with 4 * Android as (part of) the factory image. The factory kernels shipped on these 5 * devices typically have a bunch of things hardcoded, rather than specified 6 * in their DSDT. 7 * 8 * Copyright (C) 2021-2023 Hans de Goede <hansg@kernel.org> 9 */ 10 11 #include <linux/dmi.h> 12 #include <linux/init.h> 13 #include <linux/mod_devicetable.h> 14 #include <linux/module.h> 15 16 #include "x86-android-tablets.h" 17 18 const struct dmi_system_id x86_android_tablet_ids[] __initconst = { 19 { 20 /* Acer Iconia One 8 A1-840 (non FHD version) */ 21 .matches = { 22 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 23 DMI_MATCH(DMI_PRODUCT_NAME, "BayTrail"), 24 /* Above strings are too generic also match BIOS date */ 25 DMI_MATCH(DMI_BIOS_DATE, "04/01/2014"), 26 }, 27 .driver_data = (void *)&acer_a1_840_info, 28 }, 29 { 30 /* Acer Iconia One 7 B1-750 */ 31 .matches = { 32 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 33 DMI_MATCH(DMI_PRODUCT_NAME, "VESPA2"), 34 }, 35 .driver_data = (void *)&acer_b1_750_info, 36 }, 37 { 38 /* Advantech MICA-071 */ 39 .matches = { 40 DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Advantech"), 41 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "MICA-071"), 42 }, 43 .driver_data = (void *)&advantech_mica_071_info, 44 }, 45 { 46 /* Asus MeMO Pad 7 ME176C */ 47 .matches = { 48 DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 49 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "ME176C"), 50 }, 51 .driver_data = (void *)&asus_me176c_info, 52 }, 53 { 54 /* Asus TF103C */ 55 .matches = { 56 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 57 DMI_MATCH(DMI_PRODUCT_NAME, "TF103C"), 58 }, 59 .driver_data = (void *)&asus_tf103c_info, 60 }, 61 { 62 /* Chuwi Hi8 (CWI509) */ 63 .matches = { 64 DMI_MATCH(DMI_BOARD_VENDOR, "Hampoo"), 65 DMI_MATCH(DMI_BOARD_NAME, "BYT-PA03C"), 66 DMI_MATCH(DMI_SYS_VENDOR, "ilife"), 67 DMI_MATCH(DMI_PRODUCT_NAME, "S806"), 68 }, 69 .driver_data = (void *)&chuwi_hi8_info, 70 }, 71 { 72 /* Cyberbook T116 Android version */ 73 .matches = { 74 DMI_MATCH(DMI_BOARD_VENDOR, "Default string"), 75 DMI_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"), 76 /* Above strings are much too generic, also match on SKU + BIOS date */ 77 DMI_MATCH(DMI_PRODUCT_SKU, "20170531"), 78 DMI_MATCH(DMI_BIOS_DATE, "07/12/2017"), 79 }, 80 .driver_data = (void *)&cyberbook_t116_info, 81 }, 82 { 83 /* CZC P10T */ 84 .ident = "CZC ODEON TPC-10 (\"P10T\")", 85 .matches = { 86 DMI_MATCH(DMI_SYS_VENDOR, "CZC"), 87 DMI_MATCH(DMI_PRODUCT_NAME, "ODEON*TPC-10"), 88 }, 89 .driver_data = (void *)&czc_p10t, 90 }, 91 { 92 /* CZC P10T variant */ 93 .ident = "ViewSonic ViewPad 10", 94 .matches = { 95 DMI_MATCH(DMI_SYS_VENDOR, "ViewSonic"), 96 DMI_MATCH(DMI_PRODUCT_NAME, "VPAD10"), 97 }, 98 .driver_data = (void *)&czc_p10t, 99 }, 100 { 101 /* Lenovo Yoga Book X90F / X90L */ 102 .matches = { 103 DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Intel Corporation"), 104 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "CHERRYVIEW D1 PLATFORM"), 105 DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "YETI-11"), 106 }, 107 .driver_data = (void *)&lenovo_yogabook_x90_info, 108 }, 109 { 110 /* Lenovo Yoga Book X91F / X91L */ 111 .matches = { 112 /* Inexact match to match F + L versions */ 113 DMI_MATCH(DMI_PRODUCT_NAME, "Lenovo YB1-X91"), 114 }, 115 .driver_data = (void *)&lenovo_yogabook_x91_info, 116 }, 117 { 118 /* 119 * Lenovo Yoga Tablet 2 Pro 1380F/L (13") 120 * This has more or less the same BIOS as the 830F/L or 1050F/L 121 * (8" and 10") below, but unlike the 8"/10" models which share 122 * the same mainboard this model has a different mainboard. 123 * This match for the 13" model MUST come before the 8" + 10" 124 * match since that one will also match the 13" model! 125 */ 126 .matches = { 127 DMI_MATCH(DMI_SYS_VENDOR, "Intel Corp."), 128 DMI_MATCH(DMI_PRODUCT_NAME, "VALLEYVIEW C0 PLATFORM"), 129 DMI_MATCH(DMI_BOARD_NAME, "BYT-T FFD8"), 130 /* Full match so as to NOT match the 830/1050 BIOS */ 131 DMI_MATCH(DMI_BIOS_VERSION, "BLADE_21.X64.0005.R00.1504101516"), 132 }, 133 .driver_data = (void *)&lenovo_yoga_tab2_1380_info, 134 }, 135 { 136 /* 137 * Lenovo Yoga Tablet 2 830F/L or 1050F/L 138 * The 8" and 10" Lenovo Yoga Tablet 2 use the same mainboard. 139 */ 140 .matches = { 141 DMI_MATCH(DMI_SYS_VENDOR, "Intel Corp."), 142 DMI_MATCH(DMI_PRODUCT_NAME, "VALLEYVIEW C0 PLATFORM"), 143 DMI_MATCH(DMI_BOARD_NAME, "BYT-T FFD8"), 144 /* Partial match on beginning of BIOS version */ 145 DMI_MATCH(DMI_BIOS_VERSION, "BLADE_21"), 146 }, 147 .driver_data = (void *)&lenovo_yoga_tab2_830_1050_info, 148 }, 149 { 150 /* Lenovo Yoga Tab 3 Pro YT3-X90F */ 151 .matches = { 152 DMI_MATCH(DMI_SYS_VENDOR, "Intel Corporation"), 153 DMI_MATCH(DMI_PRODUCT_VERSION, "Blade3-10A-001"), 154 }, 155 .driver_data = (void *)&lenovo_yt3_info, 156 }, 157 { 158 /* Medion Lifetab S10346 */ 159 .matches = { 160 DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"), 161 DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"), 162 /* Above strings are much too generic, also match on BIOS date */ 163 DMI_MATCH(DMI_BIOS_DATE, "10/22/2015"), 164 }, 165 .driver_data = (void *)&medion_lifetab_s10346_info, 166 }, 167 { 168 /* Nextbook Ares 8 (BYT version) */ 169 .matches = { 170 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 171 DMI_MATCH(DMI_PRODUCT_NAME, "M890BAP"), 172 }, 173 .driver_data = (void *)&nextbook_ares8_info, 174 }, 175 { 176 /* Nextbook Ares 8A (CHT version) */ 177 .matches = { 178 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 179 DMI_MATCH(DMI_PRODUCT_NAME, "CherryTrail"), 180 DMI_MATCH(DMI_BIOS_VERSION, "M882"), 181 }, 182 .driver_data = (void *)&nextbook_ares8a_info, 183 }, 184 { 185 /* Peaq C1010 */ 186 .matches = { 187 DMI_MATCH(DMI_SYS_VENDOR, "PEAQ"), 188 DMI_MATCH(DMI_PRODUCT_NAME, "PEAQ PMM C1010 MD99187"), 189 }, 190 .driver_data = (void *)&peaq_c1010_info, 191 }, 192 { 193 /* Vexia Edu Atla 10 tablet 5V version */ 194 .matches = { 195 /* Having all 3 of these not set is somewhat unique */ 196 DMI_MATCH(DMI_SYS_VENDOR, "To be filled by O.E.M."), 197 DMI_MATCH(DMI_PRODUCT_NAME, "To be filled by O.E.M."), 198 DMI_MATCH(DMI_BOARD_NAME, "To be filled by O.E.M."), 199 /* Above strings are too generic, also match on BIOS date */ 200 DMI_MATCH(DMI_BIOS_DATE, "05/14/2015"), 201 }, 202 .driver_data = (void *)&vexia_edu_atla10_5v_info, 203 }, 204 { 205 /* Vexia Edu Atla 10 tablet 9V version */ 206 .matches = { 207 DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"), 208 DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"), 209 /* Above strings are too generic, also match on BIOS date */ 210 DMI_MATCH(DMI_BIOS_DATE, "08/25/2014"), 211 }, 212 .driver_data = (void *)&vexia_edu_atla10_9v_info, 213 }, 214 { 215 /* Whitelabel (sold as various brands) TM800A550L */ 216 .matches = { 217 DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"), 218 DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"), 219 /* Above strings are too generic, also match on BIOS version */ 220 DMI_MATCH(DMI_BIOS_VERSION, "ZY-8-BI-PX4S70VTR400-X423B-005-D"), 221 }, 222 .driver_data = (void *)&whitelabel_tm800a550l_info, 223 }, 224 { 225 /* Xiaomi Mi Pad 2 */ 226 .matches = { 227 DMI_MATCH(DMI_SYS_VENDOR, "Xiaomi Inc"), 228 DMI_MATCH(DMI_PRODUCT_NAME, "Mipad2"), 229 }, 230 .driver_data = (void *)&xiaomi_mipad2_info, 231 }, 232 { } 233 }; 234 MODULE_DEVICE_TABLE(dmi, x86_android_tablet_ids); 235