aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJani Nikula <jani.nikula@intel.com>2018-02-05 12:31:38 -0500
committerJani Nikula <jani.nikula@intel.com>2018-02-13 10:03:12 -0500
commit40ace64b1ece1b8a29f86e6e2bc6fb91f7f0e537 (patch)
treeadddf2b449661449472af2d489c3c68a829b1742
parent435ad2c009429157cb65ce8a6221038235cc0501 (diff)
drm/i915: have virtual PCH detection return a PCH id
Simplify intel_virt_detect_pch() by making it return a PCH id rather than returning the PCH type and setting PCH id for some PCHs. Map the PCH id to PCH type using the shared routine. This gives us sanity check on the supported combinations also in the virtualized setting. Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Signed-off-by: Jani Nikula <jani.nikula@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/197cf635261a1c628371ffaaee90e8647493af4d.1517851783.git.jani.nikula@intel.com
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c66
1 files changed, 35 insertions, 31 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 786486a53dce..9380c9f69b0f 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -202,9 +202,10 @@ static bool intel_is_virt_pch(unsigned short id,
202 sdevice == PCI_SUBDEVICE_ID_QEMU)); 202 sdevice == PCI_SUBDEVICE_ID_QEMU));
203} 203}
204 204
205static enum intel_pch intel_virt_detect_pch(struct drm_i915_private *dev_priv) 205static unsigned short
206intel_virt_detect_pch(const struct drm_i915_private *dev_priv)
206{ 207{
207 enum intel_pch ret = PCH_NOP; 208 unsigned short id = 0;
208 209
209 /* 210 /*
210 * In a virtualized passthrough environment we can be in a 211 * In a virtualized passthrough environment we can be in a
@@ -213,28 +214,25 @@ static enum intel_pch intel_virt_detect_pch(struct drm_i915_private *dev_priv)
213 * make an educated guess as to which PCH is really there. 214 * make an educated guess as to which PCH is really there.
214 */ 215 */
215 216
216 if (IS_GEN5(dev_priv)) { 217 if (IS_GEN5(dev_priv))
217 ret = PCH_IBX; 218 id = INTEL_PCH_IBX_DEVICE_ID_TYPE;
218 DRM_DEBUG_KMS("Assuming Ibex Peak PCH\n"); 219 else if (IS_GEN6(dev_priv) || IS_IVYBRIDGE(dev_priv))
219 } else if (IS_GEN6(dev_priv) || IS_IVYBRIDGE(dev_priv)) { 220 id = INTEL_PCH_CPT_DEVICE_ID_TYPE;
220 ret = PCH_CPT; 221 else if (IS_HSW_ULT(dev_priv) || IS_BDW_ULT(dev_priv))
221 DRM_DEBUG_KMS("Assuming CougarPoint PCH\n"); 222 id = INTEL_PCH_LPT_LP_DEVICE_ID_TYPE;
222 } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) { 223 else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
223 ret = PCH_LPT; 224 id = INTEL_PCH_LPT_DEVICE_ID_TYPE;
224 if (IS_HSW_ULT(dev_priv) || IS_BDW_ULT(dev_priv)) 225 else if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv))
225 dev_priv->pch_id = INTEL_PCH_LPT_LP_DEVICE_ID_TYPE; 226 id = INTEL_PCH_SPT_DEVICE_ID_TYPE;
226 else 227 else if (IS_COFFEELAKE(dev_priv) || IS_CANNONLAKE(dev_priv))
227 dev_priv->pch_id = INTEL_PCH_LPT_DEVICE_ID_TYPE; 228 id = INTEL_PCH_CNP_DEVICE_ID_TYPE;
228 DRM_DEBUG_KMS("Assuming LynxPoint PCH\n"); 229
229 } else if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) { 230 if (id)
230 ret = PCH_SPT; 231 DRM_DEBUG_KMS("Assuming PCH ID %04x\n", id);
231 DRM_DEBUG_KMS("Assuming SunrisePoint PCH\n"); 232 else
232 } else if (IS_COFFEELAKE(dev_priv) || IS_CANNONLAKE(dev_priv)) { 233 DRM_DEBUG_KMS("Assuming no PCH\n");
233 ret = PCH_CNP;
234 DRM_DEBUG_KMS("Assuming CannonPoint PCH\n");
235 }
236 234
237 return ret; 235 return id;
238} 236}
239 237
240static void intel_detect_pch(struct drm_i915_private *dev_priv) 238static void intel_detect_pch(struct drm_i915_private *dev_priv)
@@ -269,19 +267,25 @@ static void intel_detect_pch(struct drm_i915_private *dev_priv)
269 267
270 id = pch->device & INTEL_PCH_DEVICE_ID_MASK; 268 id = pch->device & INTEL_PCH_DEVICE_ID_MASK;
271 269
272 dev_priv->pch_id = id;
273
274 pch_type = intel_pch_type(dev_priv, id); 270 pch_type = intel_pch_type(dev_priv, id);
275 if (pch_type != PCH_NONE) { 271 if (pch_type != PCH_NONE) {
276 dev_priv->pch_type = pch_type; 272 dev_priv->pch_type = pch_type;
273 dev_priv->pch_id = id;
274 break;
277 } else if (intel_is_virt_pch(id, pch->subsystem_vendor, 275 } else if (intel_is_virt_pch(id, pch->subsystem_vendor,
278 pch->subsystem_device)) { 276 pch->subsystem_device)) {
279 dev_priv->pch_type = intel_virt_detect_pch(dev_priv); 277 id = intel_virt_detect_pch(dev_priv);
280 } else { 278 if (id) {
281 continue; 279 pch_type = intel_pch_type(dev_priv, id);
280 if (WARN_ON(pch_type == PCH_NONE))
281 pch_type = PCH_NOP;
282 } else {
283 pch_type = PCH_NOP;
284 }
285 dev_priv->pch_type = pch_type;
286 dev_priv->pch_id = id;
287 break;
282 } 288 }
283
284 break;
285 } 289 }
286 if (!pch) 290 if (!pch)
287 DRM_DEBUG_KMS("No PCH found.\n"); 291 DRM_DEBUG_KMS("No PCH found.\n");