diff options
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_acpi.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_fence.c | 59 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_perf.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_state.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nv50_display.c | 17 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 23 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 18 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_atombios.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_encoders.c | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/rv770.c | 3 |
10 files changed, 84 insertions, 61 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_acpi.c b/drivers/gpu/drm/nouveau/nouveau_acpi.c index f0d459bb46e4..525744d593c1 100644 --- a/drivers/gpu/drm/nouveau/nouveau_acpi.c +++ b/drivers/gpu/drm/nouveau/nouveau_acpi.c | |||
| @@ -262,7 +262,6 @@ static bool nouveau_dsm_detect(void) | |||
| 262 | vga_count++; | 262 | vga_count++; |
| 263 | 263 | ||
| 264 | retval = nouveau_dsm_pci_probe(pdev); | 264 | retval = nouveau_dsm_pci_probe(pdev); |
| 265 | printk("ret val is %d\n", retval); | ||
| 266 | if (retval & NOUVEAU_DSM_HAS_MUX) | 265 | if (retval & NOUVEAU_DSM_HAS_MUX) |
| 267 | has_dsm |= 1; | 266 | has_dsm |= 1; |
| 268 | if (retval & NOUVEAU_DSM_HAS_OPT) | 267 | if (retval & NOUVEAU_DSM_HAS_OPT) |
diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c b/drivers/gpu/drm/nouveau/nouveau_fence.c index 4b9f4493c9f9..7347075ca5b8 100644 --- a/drivers/gpu/drm/nouveau/nouveau_fence.c +++ b/drivers/gpu/drm/nouveau/nouveau_fence.c | |||
| @@ -339,11 +339,12 @@ semaphore_acquire(struct nouveau_channel *chan, struct nouveau_semaphore *sema) | |||
| 339 | int ret; | 339 | int ret; |
| 340 | 340 | ||
| 341 | if (dev_priv->chipset < 0x84) { | 341 | if (dev_priv->chipset < 0x84) { |
| 342 | ret = RING_SPACE(chan, 3); | 342 | ret = RING_SPACE(chan, 4); |
| 343 | if (ret) | 343 | if (ret) |
| 344 | return ret; | 344 | return ret; |
| 345 | 345 | ||
| 346 | BEGIN_RING(chan, NvSubSw, NV_SW_SEMAPHORE_OFFSET, 2); | 346 | BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 3); |
| 347 | OUT_RING (chan, NvSema); | ||
| 347 | OUT_RING (chan, sema->mem->start); | 348 | OUT_RING (chan, sema->mem->start); |
| 348 | OUT_RING (chan, 1); | 349 | OUT_RING (chan, 1); |
| 349 | } else | 350 | } else |
| @@ -351,10 +352,12 @@ semaphore_acquire(struct nouveau_channel *chan, struct nouveau_semaphore *sema) | |||
| 351 | struct nouveau_vma *vma = &dev_priv->fence.bo->vma; | 352 | struct nouveau_vma *vma = &dev_priv->fence.bo->vma; |
| 352 | u64 offset = vma->offset + sema->mem->start; | 353 | u64 offset = vma->offset + sema->mem->start; |
| 353 | 354 | ||
| 354 | ret = RING_SPACE(chan, 5); | 355 | ret = RING_SPACE(chan, 7); |
| 355 | if (ret) | 356 | if (ret) |
| 356 | return ret; | 357 | return ret; |
| 357 | 358 | ||
| 359 | BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 1); | ||
| 360 | OUT_RING (chan, chan->vram_handle); | ||
| 358 | BEGIN_RING(chan, NvSubSw, 0x0010, 4); | 361 | BEGIN_RING(chan, NvSubSw, 0x0010, 4); |
| 359 | OUT_RING (chan, upper_32_bits(offset)); | 362 | OUT_RING (chan, upper_32_bits(offset)); |
| 360 | OUT_RING (chan, lower_32_bits(offset)); | 363 | OUT_RING (chan, lower_32_bits(offset)); |
| @@ -394,11 +397,12 @@ semaphore_release(struct nouveau_channel *chan, struct nouveau_semaphore *sema) | |||
| 394 | int ret; | 397 | int ret; |
| 395 | 398 | ||
| 396 | if (dev_priv->chipset < 0x84) { | 399 | if (dev_priv->chipset < 0x84) { |
| 397 | ret = RING_SPACE(chan, 4); | 400 | ret = RING_SPACE(chan, 5); |
| 398 | if (ret) | 401 | if (ret) |
| 399 | return ret; | 402 | return ret; |
| 400 | 403 | ||
| 401 | BEGIN_RING(chan, NvSubSw, NV_SW_SEMAPHORE_OFFSET, 1); | 404 | BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 2); |
| 405 | OUT_RING (chan, NvSema); | ||
| 402 | OUT_RING (chan, sema->mem->start); | 406 | OUT_RING (chan, sema->mem->start); |
| 403 | BEGIN_RING(chan, NvSubSw, NV_SW_SEMAPHORE_RELEASE, 1); | 407 | BEGIN_RING(chan, NvSubSw, NV_SW_SEMAPHORE_RELEASE, 1); |
| 404 | OUT_RING (chan, 1); | 408 | OUT_RING (chan, 1); |
| @@ -407,10 +411,12 @@ semaphore_release(struct nouveau_channel *chan, struct nouveau_semaphore *sema) | |||
| 407 | struct nouveau_vma *vma = &dev_priv->fence.bo->vma; | 411 | struct nouveau_vma *vma = &dev_priv->fence.bo->vma; |
| 408 | u64 offset = vma->offset + sema->mem->start; | 412 | u64 offset = vma->offset + sema->mem->start; |
| 409 | 413 | ||
| 410 | ret = RING_SPACE(chan, 5); | 414 | ret = RING_SPACE(chan, 7); |
| 411 | if (ret) | 415 | if (ret) |
| 412 | return ret; | 416 | return ret; |
| 413 | 417 | ||
| 418 | BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 1); | ||
| 419 | OUT_RING (chan, chan->vram_handle); | ||
| 414 | BEGIN_RING(chan, NvSubSw, 0x0010, 4); | 420 | BEGIN_RING(chan, NvSubSw, 0x0010, 4); |
| 415 | OUT_RING (chan, upper_32_bits(offset)); | 421 | OUT_RING (chan, upper_32_bits(offset)); |
| 416 | OUT_RING (chan, lower_32_bits(offset)); | 422 | OUT_RING (chan, lower_32_bits(offset)); |
| @@ -504,22 +510,22 @@ nouveau_fence_channel_init(struct nouveau_channel *chan) | |||
| 504 | struct nouveau_gpuobj *obj = NULL; | 510 | struct nouveau_gpuobj *obj = NULL; |
| 505 | int ret; | 511 | int ret; |
| 506 | 512 | ||
| 507 | if (dev_priv->card_type >= NV_C0) | 513 | if (dev_priv->card_type < NV_C0) { |
| 508 | goto out_initialised; | 514 | /* Create an NV_SW object for various sync purposes */ |
| 515 | ret = nouveau_gpuobj_gr_new(chan, NvSw, NV_SW); | ||
| 516 | if (ret) | ||
| 517 | return ret; | ||
| 509 | 518 | ||
| 510 | /* Create an NV_SW object for various sync purposes */ | 519 | ret = RING_SPACE(chan, 2); |
| 511 | ret = nouveau_gpuobj_gr_new(chan, NvSw, NV_SW); | 520 | if (ret) |
| 512 | if (ret) | 521 | return ret; |
| 513 | return ret; | ||
| 514 | 522 | ||
| 515 | /* we leave subchannel empty for nvc0 */ | 523 | BEGIN_RING(chan, NvSubSw, 0, 1); |
| 516 | ret = RING_SPACE(chan, 2); | 524 | OUT_RING (chan, NvSw); |
| 517 | if (ret) | 525 | FIRE_RING (chan); |
| 518 | return ret; | 526 | } |
| 519 | BEGIN_RING(chan, NvSubSw, 0, 1); | ||
| 520 | OUT_RING(chan, NvSw); | ||
| 521 | 527 | ||
| 522 | /* Create a DMA object for the shared cross-channel sync area. */ | 528 | /* Setup area of memory shared between all channels for x-chan sync */ |
| 523 | if (USE_SEMA(dev) && dev_priv->chipset < 0x84) { | 529 | if (USE_SEMA(dev) && dev_priv->chipset < 0x84) { |
| 524 | struct ttm_mem_reg *mem = &dev_priv->fence.bo->bo.mem; | 530 | struct ttm_mem_reg *mem = &dev_priv->fence.bo->bo.mem; |
| 525 | 531 | ||
| @@ -534,23 +540,8 @@ nouveau_fence_channel_init(struct nouveau_channel *chan) | |||
| 534 | nouveau_gpuobj_ref(NULL, &obj); | 540 | nouveau_gpuobj_ref(NULL, &obj); |
| 535 | if (ret) | 541 | if (ret) |
| 536 | return ret; | 542 | return ret; |
| 537 | |||
| 538 | ret = RING_SPACE(chan, 2); | ||
| 539 | if (ret) | ||
| 540 | return ret; | ||
| 541 | BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 1); | ||
| 542 | OUT_RING(chan, NvSema); | ||
| 543 | } else { | ||
| 544 | ret = RING_SPACE(chan, 2); | ||
| 545 | if (ret) | ||
| 546 | return ret; | ||
| 547 | BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 1); | ||
| 548 | OUT_RING (chan, chan->vram_handle); /* whole VM */ | ||
| 549 | } | 543 | } |
| 550 | 544 | ||
| 551 | FIRE_RING(chan); | ||
| 552 | |||
| 553 | out_initialised: | ||
| 554 | INIT_LIST_HEAD(&chan->fence.pending); | 545 | INIT_LIST_HEAD(&chan->fence.pending); |
| 555 | spin_lock_init(&chan->fence.lock); | 546 | spin_lock_init(&chan->fence.lock); |
| 556 | atomic_set(&chan->fence.last_sequence_irq, 0); | 547 | atomic_set(&chan->fence.last_sequence_irq, 0); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_perf.c b/drivers/gpu/drm/nouveau/nouveau_perf.c index 922fb6b664ed..ef9dec0e6f8b 100644 --- a/drivers/gpu/drm/nouveau/nouveau_perf.c +++ b/drivers/gpu/drm/nouveau/nouveau_perf.c | |||
| @@ -182,6 +182,11 @@ nouveau_perf_init(struct drm_device *dev) | |||
| 182 | entries = perf[2]; | 182 | entries = perf[2]; |
| 183 | } | 183 | } |
| 184 | 184 | ||
| 185 | if (entries > NOUVEAU_PM_MAX_LEVEL) { | ||
| 186 | NV_DEBUG(dev, "perf table has too many entries - buggy vbios?\n"); | ||
| 187 | entries = NOUVEAU_PM_MAX_LEVEL; | ||
| 188 | } | ||
| 189 | |||
| 185 | entry = perf + headerlen; | 190 | entry = perf + headerlen; |
| 186 | for (i = 0; i < entries; i++) { | 191 | for (i = 0; i < entries; i++) { |
| 187 | struct nouveau_pm_level *perflvl = &pm->perflvl[pm->nr_perflvl]; | 192 | struct nouveau_pm_level *perflvl = &pm->perflvl[pm->nr_perflvl]; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c index 80218887e0a0..144f79a350ae 100644 --- a/drivers/gpu/drm/nouveau/nouveau_state.c +++ b/drivers/gpu/drm/nouveau/nouveau_state.c | |||
| @@ -881,8 +881,8 @@ int nouveau_load(struct drm_device *dev, unsigned long flags) | |||
| 881 | 881 | ||
| 882 | #ifdef __BIG_ENDIAN | 882 | #ifdef __BIG_ENDIAN |
| 883 | /* Put the card in BE mode if it's not */ | 883 | /* Put the card in BE mode if it's not */ |
| 884 | if (nv_rd32(dev, NV03_PMC_BOOT_1)) | 884 | if (nv_rd32(dev, NV03_PMC_BOOT_1) != 0x01000001) |
| 885 | nv_wr32(dev, NV03_PMC_BOOT_1, 0x00000001); | 885 | nv_wr32(dev, NV03_PMC_BOOT_1, 0x01000001); |
| 886 | 886 | ||
| 887 | DRM_MEMORYBARRIER(); | 887 | DRM_MEMORYBARRIER(); |
| 888 | #endif | 888 | #endif |
diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c index 74a3f6872701..08da478ba544 100644 --- a/drivers/gpu/drm/nouveau/nv50_display.c +++ b/drivers/gpu/drm/nouveau/nv50_display.c | |||
| @@ -409,7 +409,7 @@ nv50_display_flip_next(struct drm_crtc *crtc, struct drm_framebuffer *fb, | |||
| 409 | struct nouveau_channel *evo = dispc->sync; | 409 | struct nouveau_channel *evo = dispc->sync; |
| 410 | int ret; | 410 | int ret; |
| 411 | 411 | ||
| 412 | ret = RING_SPACE(evo, 24); | 412 | ret = RING_SPACE(evo, chan ? 25 : 27); |
| 413 | if (unlikely(ret)) | 413 | if (unlikely(ret)) |
| 414 | return ret; | 414 | return ret; |
| 415 | 415 | ||
| @@ -458,8 +458,19 @@ nv50_display_flip_next(struct drm_crtc *crtc, struct drm_framebuffer *fb, | |||
| 458 | /* queue the flip on the crtc's "display sync" channel */ | 458 | /* queue the flip on the crtc's "display sync" channel */ |
| 459 | BEGIN_RING(evo, 0, 0x0100, 1); | 459 | BEGIN_RING(evo, 0, 0x0100, 1); |
| 460 | OUT_RING (evo, 0xfffe0000); | 460 | OUT_RING (evo, 0xfffe0000); |
| 461 | BEGIN_RING(evo, 0, 0x0084, 5); | 461 | if (chan) { |
| 462 | OUT_RING (evo, chan ? 0x00000100 : 0x00000010); | 462 | BEGIN_RING(evo, 0, 0x0084, 1); |
| 463 | OUT_RING (evo, 0x00000100); | ||
| 464 | } else { | ||
| 465 | BEGIN_RING(evo, 0, 0x0084, 1); | ||
| 466 | OUT_RING (evo, 0x00000010); | ||
| 467 | /* allows gamma somehow, PDISP will bitch at you if | ||
| 468 | * you don't wait for vblank before changing this.. | ||
| 469 | */ | ||
| 470 | BEGIN_RING(evo, 0, 0x00e0, 1); | ||
| 471 | OUT_RING (evo, 0x40000000); | ||
| 472 | } | ||
| 473 | BEGIN_RING(evo, 0, 0x0088, 4); | ||
| 463 | OUT_RING (evo, dispc->sem.offset); | 474 | OUT_RING (evo, dispc->sem.offset); |
| 464 | OUT_RING (evo, 0xf00d0000 | dispc->sem.value); | 475 | OUT_RING (evo, 0xf00d0000 | dispc->sem.value); |
| 465 | OUT_RING (evo, 0x74b1e000); | 476 | OUT_RING (evo, 0x74b1e000); |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 7e3d96e7ac04..445af7981637 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
| @@ -140,11 +140,17 @@ void evergreen_pm_misc(struct radeon_device *rdev) | |||
| 140 | struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage; | 140 | struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage; |
| 141 | 141 | ||
| 142 | if (voltage->type == VOLTAGE_SW) { | 142 | if (voltage->type == VOLTAGE_SW) { |
| 143 | /* 0xff01 is a flag rather then an actual voltage */ | ||
| 144 | if (voltage->voltage == 0xff01) | ||
| 145 | return; | ||
| 143 | if (voltage->voltage && (voltage->voltage != rdev->pm.current_vddc)) { | 146 | if (voltage->voltage && (voltage->voltage != rdev->pm.current_vddc)) { |
| 144 | radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC); | 147 | radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC); |
| 145 | rdev->pm.current_vddc = voltage->voltage; | 148 | rdev->pm.current_vddc = voltage->voltage; |
| 146 | DRM_DEBUG("Setting: vddc: %d\n", voltage->voltage); | 149 | DRM_DEBUG("Setting: vddc: %d\n", voltage->voltage); |
| 147 | } | 150 | } |
| 151 | /* 0xff01 is a flag rather then an actual voltage */ | ||
| 152 | if (voltage->vddci == 0xff01) | ||
| 153 | return; | ||
| 148 | if (voltage->vddci && (voltage->vddci != rdev->pm.current_vddci)) { | 154 | if (voltage->vddci && (voltage->vddci != rdev->pm.current_vddci)) { |
| 149 | radeon_atom_set_voltage(rdev, voltage->vddci, SET_VOLTAGE_TYPE_ASIC_VDDCI); | 155 | radeon_atom_set_voltage(rdev, voltage->vddci, SET_VOLTAGE_TYPE_ASIC_VDDCI); |
| 150 | rdev->pm.current_vddci = voltage->vddci; | 156 | rdev->pm.current_vddci = voltage->vddci; |
| @@ -2695,28 +2701,25 @@ static inline u32 evergreen_get_ih_wptr(struct radeon_device *rdev) | |||
| 2695 | 2701 | ||
| 2696 | int evergreen_irq_process(struct radeon_device *rdev) | 2702 | int evergreen_irq_process(struct radeon_device *rdev) |
| 2697 | { | 2703 | { |
| 2698 | u32 wptr = evergreen_get_ih_wptr(rdev); | 2704 | u32 wptr; |
| 2699 | u32 rptr = rdev->ih.rptr; | 2705 | u32 rptr; |
| 2700 | u32 src_id, src_data; | 2706 | u32 src_id, src_data; |
| 2701 | u32 ring_index; | 2707 | u32 ring_index; |
| 2702 | unsigned long flags; | 2708 | unsigned long flags; |
| 2703 | bool queue_hotplug = false; | 2709 | bool queue_hotplug = false; |
| 2704 | 2710 | ||
| 2705 | DRM_DEBUG("r600_irq_process start: rptr %d, wptr %d\n", rptr, wptr); | 2711 | if (!rdev->ih.enabled || rdev->shutdown) |
| 2706 | if (!rdev->ih.enabled) | ||
| 2707 | return IRQ_NONE; | 2712 | return IRQ_NONE; |
| 2708 | 2713 | ||
| 2709 | spin_lock_irqsave(&rdev->ih.lock, flags); | 2714 | wptr = evergreen_get_ih_wptr(rdev); |
| 2715 | rptr = rdev->ih.rptr; | ||
| 2716 | DRM_DEBUG("r600_irq_process start: rptr %d, wptr %d\n", rptr, wptr); | ||
| 2710 | 2717 | ||
| 2718 | spin_lock_irqsave(&rdev->ih.lock, flags); | ||
| 2711 | if (rptr == wptr) { | 2719 | if (rptr == wptr) { |
| 2712 | spin_unlock_irqrestore(&rdev->ih.lock, flags); | 2720 | spin_unlock_irqrestore(&rdev->ih.lock, flags); |
| 2713 | return IRQ_NONE; | 2721 | return IRQ_NONE; |
| 2714 | } | 2722 | } |
| 2715 | if (rdev->shutdown) { | ||
| 2716 | spin_unlock_irqrestore(&rdev->ih.lock, flags); | ||
| 2717 | return IRQ_NONE; | ||
| 2718 | } | ||
| 2719 | |||
| 2720 | restart_ih: | 2723 | restart_ih: |
| 2721 | /* display interrupts */ | 2724 | /* display interrupts */ |
| 2722 | evergreen_irq_ack(rdev); | 2725 | evergreen_irq_ack(rdev); |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 7dd45ca64e29..f79d2ccb6755 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -590,6 +590,9 @@ void r600_pm_misc(struct radeon_device *rdev) | |||
| 590 | struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage; | 590 | struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage; |
| 591 | 591 | ||
| 592 | if ((voltage->type == VOLTAGE_SW) && voltage->voltage) { | 592 | if ((voltage->type == VOLTAGE_SW) && voltage->voltage) { |
| 593 | /* 0xff01 is a flag rather then an actual voltage */ | ||
| 594 | if (voltage->voltage == 0xff01) | ||
| 595 | return; | ||
| 593 | if (voltage->voltage != rdev->pm.current_vddc) { | 596 | if (voltage->voltage != rdev->pm.current_vddc) { |
| 594 | radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC); | 597 | radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC); |
| 595 | rdev->pm.current_vddc = voltage->voltage; | 598 | rdev->pm.current_vddc = voltage->voltage; |
| @@ -3294,27 +3297,26 @@ static inline u32 r600_get_ih_wptr(struct radeon_device *rdev) | |||
| 3294 | 3297 | ||
| 3295 | int r600_irq_process(struct radeon_device *rdev) | 3298 | int r600_irq_process(struct radeon_device *rdev) |
| 3296 | { | 3299 | { |
| 3297 | u32 wptr = r600_get_ih_wptr(rdev); | 3300 | u32 wptr; |
| 3298 | u32 rptr = rdev->ih.rptr; | 3301 | u32 rptr; |
| 3299 | u32 src_id, src_data; | 3302 | u32 src_id, src_data; |
| 3300 | u32 ring_index; | 3303 | u32 ring_index; |
| 3301 | unsigned long flags; | 3304 | unsigned long flags; |
| 3302 | bool queue_hotplug = false; | 3305 | bool queue_hotplug = false; |
| 3303 | 3306 | ||
| 3304 | DRM_DEBUG("r600_irq_process start: rptr %d, wptr %d\n", rptr, wptr); | 3307 | if (!rdev->ih.enabled || rdev->shutdown) |
| 3305 | if (!rdev->ih.enabled) | ||
| 3306 | return IRQ_NONE; | 3308 | return IRQ_NONE; |
| 3307 | 3309 | ||
| 3310 | wptr = r600_get_ih_wptr(rdev); | ||
| 3311 | rptr = rdev->ih.rptr; | ||
| 3312 | DRM_DEBUG("r600_irq_process start: rptr %d, wptr %d\n", rptr, wptr); | ||
| 3313 | |||
| 3308 | spin_lock_irqsave(&rdev->ih.lock, flags); | 3314 | spin_lock_irqsave(&rdev->ih.lock, flags); |
| 3309 | 3315 | ||
| 3310 | if (rptr == wptr) { | 3316 | if (rptr == wptr) { |
| 3311 | spin_unlock_irqrestore(&rdev->ih.lock, flags); | 3317 | spin_unlock_irqrestore(&rdev->ih.lock, flags); |
| 3312 | return IRQ_NONE; | 3318 | return IRQ_NONE; |
| 3313 | } | 3319 | } |
| 3314 | if (rdev->shutdown) { | ||
| 3315 | spin_unlock_irqrestore(&rdev->ih.lock, flags); | ||
| 3316 | return IRQ_NONE; | ||
| 3317 | } | ||
| 3318 | 3320 | ||
| 3319 | restart_ih: | 3321 | restart_ih: |
| 3320 | /* display interrupts */ | 3322 | /* display interrupts */ |
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index fa62a503ae70..1e725d9f767f 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
| @@ -2607,6 +2607,10 @@ void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 v | |||
| 2607 | if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) | 2607 | if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) |
| 2608 | return; | 2608 | return; |
| 2609 | 2609 | ||
| 2610 | /* 0xff01 is a flag rather then an actual voltage */ | ||
| 2611 | if (voltage_level == 0xff01) | ||
| 2612 | return; | ||
| 2613 | |||
| 2610 | switch (crev) { | 2614 | switch (crev) { |
| 2611 | case 1: | 2615 | case 1: |
| 2612 | args.v1.ucVoltageType = voltage_type; | 2616 | args.v1.ucVoltageType = voltage_type; |
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index f55b64cb59d1..b293487e5aa3 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c | |||
| @@ -1090,9 +1090,10 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t | |||
| 1090 | break; | 1090 | break; |
| 1091 | } | 1091 | } |
| 1092 | 1092 | ||
| 1093 | if (is_dp) | 1093 | if (is_dp) { |
| 1094 | args.v2.acConfig.fCoherentMode = 1; | 1094 | args.v2.acConfig.fCoherentMode = 1; |
| 1095 | else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { | 1095 | args.v2.acConfig.fDPConnector = 1; |
| 1096 | } else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { | ||
| 1096 | if (dig->coherent_mode) | 1097 | if (dig->coherent_mode) |
| 1097 | args.v2.acConfig.fCoherentMode = 1; | 1098 | args.v2.acConfig.fCoherentMode = 1; |
| 1098 | if (radeon_encoder->pixel_clock > 165000) | 1099 | if (radeon_encoder->pixel_clock > 165000) |
| @@ -1431,7 +1432,11 @@ radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode) | |||
| 1431 | if (is_dig) { | 1432 | if (is_dig) { |
| 1432 | switch (mode) { | 1433 | switch (mode) { |
| 1433 | case DRM_MODE_DPMS_ON: | 1434 | case DRM_MODE_DPMS_ON: |
| 1434 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); | 1435 | /* some early dce3.2 boards have a bug in their transmitter control table */ |
| 1436 | if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730)) | ||
| 1437 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); | ||
| 1438 | else | ||
| 1439 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); | ||
| 1435 | if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP) { | 1440 | if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP) { |
| 1436 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); | 1441 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
| 1437 | 1442 | ||
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index ef8a5babe9f7..6f508ffd1035 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
| @@ -105,6 +105,9 @@ void rv770_pm_misc(struct radeon_device *rdev) | |||
| 105 | struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage; | 105 | struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage; |
| 106 | 106 | ||
| 107 | if ((voltage->type == VOLTAGE_SW) && voltage->voltage) { | 107 | if ((voltage->type == VOLTAGE_SW) && voltage->voltage) { |
| 108 | /* 0xff01 is a flag rather then an actual voltage */ | ||
| 109 | if (voltage->voltage == 0xff01) | ||
| 110 | return; | ||
| 108 | if (voltage->voltage != rdev->pm.current_vddc) { | 111 | if (voltage->voltage != rdev->pm.current_vddc) { |
| 109 | radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC); | 112 | radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC); |
| 110 | rdev->pm.current_vddc = voltage->voltage; | 113 | rdev->pm.current_vddc = voltage->voltage; |
