diff options
author | Jani Nikula <jani.nikula@intel.com> | 2018-02-05 12:31:38 -0500 |
---|---|---|
committer | Jani Nikula <jani.nikula@intel.com> | 2018-02-13 10:03:12 -0500 |
commit | 40ace64b1ece1b8a29f86e6e2bc6fb91f7f0e537 (patch) | |
tree | adddf2b449661449472af2d489c3c68a829b1742 | |
parent | 435ad2c009429157cb65ce8a6221038235cc0501 (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.c | 66 |
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 | ||
205 | static enum intel_pch intel_virt_detect_pch(struct drm_i915_private *dev_priv) | 205 | static unsigned short |
206 | intel_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 | ||
240 | static void intel_detect_pch(struct drm_i915_private *dev_priv) | 238 | static 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"); |