diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_opregion.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_opregion.c | 92 |
1 files changed, 81 insertions, 11 deletions
diff --git a/drivers/gpu/drm/i915/i915_opregion.c b/drivers/gpu/drm/i915/i915_opregion.c index 2d5193556d3f..7cc8410239cb 100644 --- a/drivers/gpu/drm/i915/i915_opregion.c +++ b/drivers/gpu/drm/i915/i915_opregion.c | |||
@@ -118,6 +118,10 @@ struct opregion_asle { | |||
118 | #define ASLE_BACKLIGHT_FAIL (2<<12) | 118 | #define ASLE_BACKLIGHT_FAIL (2<<12) |
119 | #define ASLE_PFIT_FAIL (2<<14) | 119 | #define ASLE_PFIT_FAIL (2<<14) |
120 | #define ASLE_PWM_FREQ_FAIL (2<<16) | 120 | #define ASLE_PWM_FREQ_FAIL (2<<16) |
121 | #define ASLE_ALS_ILLUM_FAILED (1<<10) | ||
122 | #define ASLE_BACKLIGHT_FAILED (1<<12) | ||
123 | #define ASLE_PFIT_FAILED (1<<14) | ||
124 | #define ASLE_PWM_FREQ_FAILED (1<<16) | ||
121 | 125 | ||
122 | /* ASLE backlight brightness to set */ | 126 | /* ASLE backlight brightness to set */ |
123 | #define ASLE_BCLP_VALID (1<<31) | 127 | #define ASLE_BCLP_VALID (1<<31) |
@@ -163,7 +167,7 @@ static u32 asle_set_backlight(struct drm_device *dev, u32 bclp) | |||
163 | if (IS_I965G(dev) && (blc_pwm_ctl2 & BLM_COMBINATION_MODE)) | 167 | if (IS_I965G(dev) && (blc_pwm_ctl2 & BLM_COMBINATION_MODE)) |
164 | pci_write_config_dword(dev->pdev, PCI_LBPC, bclp); | 168 | pci_write_config_dword(dev->pdev, PCI_LBPC, bclp); |
165 | else { | 169 | else { |
166 | if (IS_IGD(dev)) { | 170 | if (IS_PINEVIEW(dev)) { |
167 | blc_pwm_ctl &= ~(BACKLIGHT_DUTY_CYCLE_MASK - 1); | 171 | blc_pwm_ctl &= ~(BACKLIGHT_DUTY_CYCLE_MASK - 1); |
168 | max_backlight = (blc_pwm_ctl & BACKLIGHT_MODULATION_FREQ_MASK) >> | 172 | max_backlight = (blc_pwm_ctl & BACKLIGHT_MODULATION_FREQ_MASK) >> |
169 | BACKLIGHT_MODULATION_FREQ_SHIFT; | 173 | BACKLIGHT_MODULATION_FREQ_SHIFT; |
@@ -224,7 +228,7 @@ void opregion_asle_intr(struct drm_device *dev) | |||
224 | asle_req = asle->aslc & ASLE_REQ_MSK; | 228 | asle_req = asle->aslc & ASLE_REQ_MSK; |
225 | 229 | ||
226 | if (!asle_req) { | 230 | if (!asle_req) { |
227 | DRM_DEBUG("non asle set request??\n"); | 231 | DRM_DEBUG_DRIVER("non asle set request??\n"); |
228 | return; | 232 | return; |
229 | } | 233 | } |
230 | 234 | ||
@@ -243,6 +247,73 @@ void opregion_asle_intr(struct drm_device *dev) | |||
243 | asle->aslc = asle_stat; | 247 | asle->aslc = asle_stat; |
244 | } | 248 | } |
245 | 249 | ||
250 | static u32 asle_set_backlight_ironlake(struct drm_device *dev, u32 bclp) | ||
251 | { | ||
252 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
253 | struct opregion_asle *asle = dev_priv->opregion.asle; | ||
254 | u32 cpu_pwm_ctl, pch_pwm_ctl2; | ||
255 | u32 max_backlight, level; | ||
256 | |||
257 | if (!(bclp & ASLE_BCLP_VALID)) | ||
258 | return ASLE_BACKLIGHT_FAILED; | ||
259 | |||
260 | bclp &= ASLE_BCLP_MSK; | ||
261 | if (bclp < 0 || bclp > 255) | ||
262 | return ASLE_BACKLIGHT_FAILED; | ||
263 | |||
264 | cpu_pwm_ctl = I915_READ(BLC_PWM_CPU_CTL); | ||
265 | pch_pwm_ctl2 = I915_READ(BLC_PWM_PCH_CTL2); | ||
266 | /* get the max PWM frequency */ | ||
267 | max_backlight = (pch_pwm_ctl2 >> 16) & BACKLIGHT_DUTY_CYCLE_MASK; | ||
268 | /* calculate the expected PMW frequency */ | ||
269 | level = (bclp * max_backlight) / 255; | ||
270 | /* reserve the high 16 bits */ | ||
271 | cpu_pwm_ctl &= ~(BACKLIGHT_DUTY_CYCLE_MASK); | ||
272 | /* write the updated PWM frequency */ | ||
273 | I915_WRITE(BLC_PWM_CPU_CTL, cpu_pwm_ctl | level); | ||
274 | |||
275 | asle->cblv = (bclp*0x64)/0xff | ASLE_CBLV_VALID; | ||
276 | |||
277 | return 0; | ||
278 | } | ||
279 | |||
280 | void ironlake_opregion_gse_intr(struct drm_device *dev) | ||
281 | { | ||
282 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
283 | struct opregion_asle *asle = dev_priv->opregion.asle; | ||
284 | u32 asle_stat = 0; | ||
285 | u32 asle_req; | ||
286 | |||
287 | if (!asle) | ||
288 | return; | ||
289 | |||
290 | asle_req = asle->aslc & ASLE_REQ_MSK; | ||
291 | |||
292 | if (!asle_req) { | ||
293 | DRM_DEBUG_DRIVER("non asle set request??\n"); | ||
294 | return; | ||
295 | } | ||
296 | |||
297 | if (asle_req & ASLE_SET_ALS_ILLUM) { | ||
298 | DRM_DEBUG_DRIVER("Illum is not supported\n"); | ||
299 | asle_stat |= ASLE_ALS_ILLUM_FAILED; | ||
300 | } | ||
301 | |||
302 | if (asle_req & ASLE_SET_BACKLIGHT) | ||
303 | asle_stat |= asle_set_backlight_ironlake(dev, asle->bclp); | ||
304 | |||
305 | if (asle_req & ASLE_SET_PFIT) { | ||
306 | DRM_DEBUG_DRIVER("Pfit is not supported\n"); | ||
307 | asle_stat |= ASLE_PFIT_FAILED; | ||
308 | } | ||
309 | |||
310 | if (asle_req & ASLE_SET_PWM_FREQ) { | ||
311 | DRM_DEBUG_DRIVER("PWM freq is not supported\n"); | ||
312 | asle_stat |= ASLE_PWM_FREQ_FAILED; | ||
313 | } | ||
314 | |||
315 | asle->aslc = asle_stat; | ||
316 | } | ||
246 | #define ASLE_ALS_EN (1<<0) | 317 | #define ASLE_ALS_EN (1<<0) |
247 | #define ASLE_BLC_EN (1<<1) | 318 | #define ASLE_BLC_EN (1<<1) |
248 | #define ASLE_PFIT_EN (1<<2) | 319 | #define ASLE_PFIT_EN (1<<2) |
@@ -258,8 +329,7 @@ void opregion_enable_asle(struct drm_device *dev) | |||
258 | unsigned long irqflags; | 329 | unsigned long irqflags; |
259 | 330 | ||
260 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); | 331 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); |
261 | i915_enable_pipestat(dev_priv, 1, | 332 | intel_enable_asle(dev); |
262 | I915_LEGACY_BLC_EVENT_ENABLE); | ||
263 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, | 333 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, |
264 | irqflags); | 334 | irqflags); |
265 | } | 335 | } |
@@ -361,9 +431,9 @@ int intel_opregion_init(struct drm_device *dev, int resume) | |||
361 | int err = 0; | 431 | int err = 0; |
362 | 432 | ||
363 | pci_read_config_dword(dev->pdev, PCI_ASLS, &asls); | 433 | pci_read_config_dword(dev->pdev, PCI_ASLS, &asls); |
364 | DRM_DEBUG("graphic opregion physical addr: 0x%x\n", asls); | 434 | DRM_DEBUG_DRIVER("graphic opregion physical addr: 0x%x\n", asls); |
365 | if (asls == 0) { | 435 | if (asls == 0) { |
366 | DRM_DEBUG("ACPI OpRegion not supported!\n"); | 436 | DRM_DEBUG_DRIVER("ACPI OpRegion not supported!\n"); |
367 | return -ENOTSUPP; | 437 | return -ENOTSUPP; |
368 | } | 438 | } |
369 | 439 | ||
@@ -373,30 +443,30 @@ int intel_opregion_init(struct drm_device *dev, int resume) | |||
373 | 443 | ||
374 | opregion->header = base; | 444 | opregion->header = base; |
375 | if (memcmp(opregion->header->signature, OPREGION_SIGNATURE, 16)) { | 445 | if (memcmp(opregion->header->signature, OPREGION_SIGNATURE, 16)) { |
376 | DRM_DEBUG("opregion signature mismatch\n"); | 446 | DRM_DEBUG_DRIVER("opregion signature mismatch\n"); |
377 | err = -EINVAL; | 447 | err = -EINVAL; |
378 | goto err_out; | 448 | goto err_out; |
379 | } | 449 | } |
380 | 450 | ||
381 | mboxes = opregion->header->mboxes; | 451 | mboxes = opregion->header->mboxes; |
382 | if (mboxes & MBOX_ACPI) { | 452 | if (mboxes & MBOX_ACPI) { |
383 | DRM_DEBUG("Public ACPI methods supported\n"); | 453 | DRM_DEBUG_DRIVER("Public ACPI methods supported\n"); |
384 | opregion->acpi = base + OPREGION_ACPI_OFFSET; | 454 | opregion->acpi = base + OPREGION_ACPI_OFFSET; |
385 | if (drm_core_check_feature(dev, DRIVER_MODESET)) | 455 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
386 | intel_didl_outputs(dev); | 456 | intel_didl_outputs(dev); |
387 | } else { | 457 | } else { |
388 | DRM_DEBUG("Public ACPI methods not supported\n"); | 458 | DRM_DEBUG_DRIVER("Public ACPI methods not supported\n"); |
389 | err = -ENOTSUPP; | 459 | err = -ENOTSUPP; |
390 | goto err_out; | 460 | goto err_out; |
391 | } | 461 | } |
392 | opregion->enabled = 1; | 462 | opregion->enabled = 1; |
393 | 463 | ||
394 | if (mboxes & MBOX_SWSCI) { | 464 | if (mboxes & MBOX_SWSCI) { |
395 | DRM_DEBUG("SWSCI supported\n"); | 465 | DRM_DEBUG_DRIVER("SWSCI supported\n"); |
396 | opregion->swsci = base + OPREGION_SWSCI_OFFSET; | 466 | opregion->swsci = base + OPREGION_SWSCI_OFFSET; |
397 | } | 467 | } |
398 | if (mboxes & MBOX_ASLE) { | 468 | if (mboxes & MBOX_ASLE) { |
399 | DRM_DEBUG("ASLE supported\n"); | 469 | DRM_DEBUG_DRIVER("ASLE supported\n"); |
400 | opregion->asle = base + OPREGION_ASLE_OFFSET; | 470 | opregion->asle = base + OPREGION_ASLE_OFFSET; |
401 | opregion_enable_asle(dev); | 471 | opregion_enable_asle(dev); |
402 | } | 472 | } |