diff options
43 files changed, 318 insertions, 181 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index b8bea100a160..b34390347c16 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -2868,6 +2868,21 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) | |||
| 2868 | }, | 2868 | }, |
| 2869 | .driver_data = "F.23", /* cutoff BIOS version */ | 2869 | .driver_data = "F.23", /* cutoff BIOS version */ |
| 2870 | }, | 2870 | }, |
| 2871 | /* | ||
| 2872 | * Acer eMachines G725 has the same problem. BIOS | ||
| 2873 | * V1.03 is known to be broken. V3.04 is known to | ||
| 2874 | * work. Inbetween, there are V1.06, V2.06 and V3.03 | ||
| 2875 | * that we don't have much idea about. For now, | ||
| 2876 | * blacklist anything older than V3.04. | ||
| 2877 | */ | ||
| 2878 | { | ||
| 2879 | .ident = "G725", | ||
| 2880 | .matches = { | ||
| 2881 | DMI_MATCH(DMI_SYS_VENDOR, "eMachines"), | ||
| 2882 | DMI_MATCH(DMI_PRODUCT_NAME, "eMachines G725"), | ||
| 2883 | }, | ||
| 2884 | .driver_data = "V3.04", /* cutoff BIOS version */ | ||
| 2885 | }, | ||
| 2871 | { } /* terminate list */ | 2886 | { } /* terminate list */ |
| 2872 | }; | 2887 | }; |
| 2873 | const struct dmi_system_id *dmi = dmi_first_match(sysids); | 2888 | const struct dmi_system_id *dmi = dmi_first_match(sysids); |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index f4ea5a8c325b..d096fbcbc771 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
| @@ -2875,7 +2875,7 @@ static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc) | |||
| 2875 | * write indication (used for PIO/DMA setup), result TF is | 2875 | * write indication (used for PIO/DMA setup), result TF is |
| 2876 | * copied back and we don't whine too much about its failure. | 2876 | * copied back and we don't whine too much about its failure. |
| 2877 | */ | 2877 | */ |
| 2878 | tf->flags = ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; | 2878 | tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; |
| 2879 | if (scmd->sc_data_direction == DMA_TO_DEVICE) | 2879 | if (scmd->sc_data_direction == DMA_TO_DEVICE) |
| 2880 | tf->flags |= ATA_TFLAG_WRITE; | 2880 | tf->flags |= ATA_TFLAG_WRITE; |
| 2881 | 2881 | ||
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index 741065c9da67..730ef3c384ca 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c | |||
| @@ -893,6 +893,9 @@ static void ata_pio_sector(struct ata_queued_cmd *qc) | |||
| 893 | do_write); | 893 | do_write); |
| 894 | } | 894 | } |
| 895 | 895 | ||
| 896 | if (!do_write) | ||
| 897 | flush_dcache_page(page); | ||
| 898 | |||
| 896 | qc->curbytes += qc->sect_size; | 899 | qc->curbytes += qc->sect_size; |
| 897 | qc->cursg_ofs += qc->sect_size; | 900 | qc->cursg_ofs += qc->sect_size; |
| 898 | 901 | ||
diff --git a/drivers/gpu/drm/ati_pcigart.c b/drivers/gpu/drm/ati_pcigart.c index a1fce68e3bbe..17be051b7aa3 100644 --- a/drivers/gpu/drm/ati_pcigart.c +++ b/drivers/gpu/drm/ati_pcigart.c | |||
| @@ -113,7 +113,7 @@ int drm_ati_pcigart_init(struct drm_device *dev, struct drm_ati_pcigart_info *ga | |||
| 113 | 113 | ||
| 114 | if (pci_set_dma_mask(dev->pdev, gart_info->table_mask)) { | 114 | if (pci_set_dma_mask(dev->pdev, gart_info->table_mask)) { |
| 115 | DRM_ERROR("fail to set dma mask to 0x%Lx\n", | 115 | DRM_ERROR("fail to set dma mask to 0x%Lx\n", |
| 116 | gart_info->table_mask); | 116 | (unsigned long long)gart_info->table_mask); |
| 117 | ret = 1; | 117 | ret = 1; |
| 118 | goto done; | 118 | goto done; |
| 119 | } | 119 | } |
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 46d88965852a..ecac882e1d54 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
| @@ -120,7 +120,7 @@ const static struct intel_device_info intel_gm45_info = { | |||
| 120 | 120 | ||
| 121 | const static struct intel_device_info intel_pineview_info = { | 121 | const static struct intel_device_info intel_pineview_info = { |
| 122 | .is_g33 = 1, .is_pineview = 1, .is_mobile = 1, .is_i9xx = 1, | 122 | .is_g33 = 1, .is_pineview = 1, .is_mobile = 1, .is_i9xx = 1, |
| 123 | .has_pipe_cxsr = 1, | 123 | .need_gfx_hws = 1, |
| 124 | .has_hotplug = 1, | 124 | .has_hotplug = 1, |
| 125 | }; | 125 | }; |
| 126 | 126 | ||
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index dda787aafcc6..b4c8c0230689 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -3564,6 +3564,9 @@ i915_gem_put_relocs_to_user(struct drm_i915_gem_exec_object2 *exec_list, | |||
| 3564 | uint32_t reloc_count = 0, i; | 3564 | uint32_t reloc_count = 0, i; |
| 3565 | int ret = 0; | 3565 | int ret = 0; |
| 3566 | 3566 | ||
| 3567 | if (relocs == NULL) | ||
| 3568 | return 0; | ||
| 3569 | |||
| 3567 | for (i = 0; i < buffer_count; i++) { | 3570 | for (i = 0; i < buffer_count; i++) { |
| 3568 | struct drm_i915_gem_relocation_entry __user *user_relocs; | 3571 | struct drm_i915_gem_relocation_entry __user *user_relocs; |
| 3569 | int unwritten; | 3572 | int unwritten; |
| @@ -3653,7 +3656,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, | |||
| 3653 | struct drm_gem_object *batch_obj; | 3656 | struct drm_gem_object *batch_obj; |
| 3654 | struct drm_i915_gem_object *obj_priv; | 3657 | struct drm_i915_gem_object *obj_priv; |
| 3655 | struct drm_clip_rect *cliprects = NULL; | 3658 | struct drm_clip_rect *cliprects = NULL; |
| 3656 | struct drm_i915_gem_relocation_entry *relocs; | 3659 | struct drm_i915_gem_relocation_entry *relocs = NULL; |
| 3657 | int ret = 0, ret2, i, pinned = 0; | 3660 | int ret = 0, ret2, i, pinned = 0; |
| 3658 | uint64_t exec_offset; | 3661 | uint64_t exec_offset; |
| 3659 | uint32_t seqno, flush_domains, reloc_index; | 3662 | uint32_t seqno, flush_domains, reloc_index; |
| @@ -3722,6 +3725,8 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, | |||
| 3722 | if (object_list[i] == NULL) { | 3725 | if (object_list[i] == NULL) { |
| 3723 | DRM_ERROR("Invalid object handle %d at index %d\n", | 3726 | DRM_ERROR("Invalid object handle %d at index %d\n", |
| 3724 | exec_list[i].handle, i); | 3727 | exec_list[i].handle, i); |
| 3728 | /* prevent error path from reading uninitialized data */ | ||
| 3729 | args->buffer_count = i + 1; | ||
| 3725 | ret = -EBADF; | 3730 | ret = -EBADF; |
| 3726 | goto err; | 3731 | goto err; |
| 3727 | } | 3732 | } |
| @@ -3730,6 +3735,8 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, | |||
| 3730 | if (obj_priv->in_execbuffer) { | 3735 | if (obj_priv->in_execbuffer) { |
| 3731 | DRM_ERROR("Object %p appears more than once in object list\n", | 3736 | DRM_ERROR("Object %p appears more than once in object list\n", |
| 3732 | object_list[i]); | 3737 | object_list[i]); |
| 3738 | /* prevent error path from reading uninitialized data */ | ||
| 3739 | args->buffer_count = i + 1; | ||
| 3733 | ret = -EBADF; | 3740 | ret = -EBADF; |
| 3734 | goto err; | 3741 | goto err; |
| 3735 | } | 3742 | } |
| @@ -3926,6 +3933,7 @@ err: | |||
| 3926 | 3933 | ||
| 3927 | mutex_unlock(&dev->struct_mutex); | 3934 | mutex_unlock(&dev->struct_mutex); |
| 3928 | 3935 | ||
| 3936 | pre_mutex_err: | ||
| 3929 | /* Copy the updated relocations out regardless of current error | 3937 | /* Copy the updated relocations out regardless of current error |
| 3930 | * state. Failure to update the relocs would mean that the next | 3938 | * state. Failure to update the relocs would mean that the next |
| 3931 | * time userland calls execbuf, it would do so with presumed offset | 3939 | * time userland calls execbuf, it would do so with presumed offset |
| @@ -3940,7 +3948,6 @@ err: | |||
| 3940 | ret = ret2; | 3948 | ret = ret2; |
| 3941 | } | 3949 | } |
| 3942 | 3950 | ||
| 3943 | pre_mutex_err: | ||
| 3944 | drm_free_large(object_list); | 3951 | drm_free_large(object_list); |
| 3945 | kfree(cliprects); | 3952 | kfree(cliprects); |
| 3946 | 3953 | ||
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 89a071a3e6fb..50ddf4a95c5e 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -309,6 +309,22 @@ irqreturn_t ironlake_irq_handler(struct drm_device *dev) | |||
| 309 | if (de_iir & DE_GSE) | 309 | if (de_iir & DE_GSE) |
| 310 | ironlake_opregion_gse_intr(dev); | 310 | ironlake_opregion_gse_intr(dev); |
| 311 | 311 | ||
| 312 | if (de_iir & DE_PLANEA_FLIP_DONE) | ||
| 313 | intel_prepare_page_flip(dev, 0); | ||
| 314 | |||
| 315 | if (de_iir & DE_PLANEB_FLIP_DONE) | ||
| 316 | intel_prepare_page_flip(dev, 1); | ||
| 317 | |||
| 318 | if (de_iir & DE_PIPEA_VBLANK) { | ||
| 319 | drm_handle_vblank(dev, 0); | ||
| 320 | intel_finish_page_flip(dev, 0); | ||
| 321 | } | ||
| 322 | |||
| 323 | if (de_iir & DE_PIPEB_VBLANK) { | ||
| 324 | drm_handle_vblank(dev, 1); | ||
| 325 | intel_finish_page_flip(dev, 1); | ||
| 326 | } | ||
| 327 | |||
| 312 | /* check event from PCH */ | 328 | /* check event from PCH */ |
| 313 | if ((de_iir & DE_PCH_EVENT) && | 329 | if ((de_iir & DE_PCH_EVENT) && |
| 314 | (pch_iir & SDE_HOTPLUG_MASK)) { | 330 | (pch_iir & SDE_HOTPLUG_MASK)) { |
| @@ -844,11 +860,11 @@ int i915_enable_vblank(struct drm_device *dev, int pipe) | |||
| 844 | if (!(pipeconf & PIPEACONF_ENABLE)) | 860 | if (!(pipeconf & PIPEACONF_ENABLE)) |
| 845 | return -EINVAL; | 861 | return -EINVAL; |
| 846 | 862 | ||
| 847 | if (IS_IRONLAKE(dev)) | ||
| 848 | return 0; | ||
| 849 | |||
| 850 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); | 863 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); |
| 851 | if (IS_I965G(dev)) | 864 | if (IS_IRONLAKE(dev)) |
| 865 | ironlake_enable_display_irq(dev_priv, (pipe == 0) ? | ||
| 866 | DE_PIPEA_VBLANK: DE_PIPEB_VBLANK); | ||
| 867 | else if (IS_I965G(dev)) | ||
| 852 | i915_enable_pipestat(dev_priv, pipe, | 868 | i915_enable_pipestat(dev_priv, pipe, |
| 853 | PIPE_START_VBLANK_INTERRUPT_ENABLE); | 869 | PIPE_START_VBLANK_INTERRUPT_ENABLE); |
| 854 | else | 870 | else |
| @@ -866,13 +882,14 @@ void i915_disable_vblank(struct drm_device *dev, int pipe) | |||
| 866 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 882 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 867 | unsigned long irqflags; | 883 | unsigned long irqflags; |
| 868 | 884 | ||
| 869 | if (IS_IRONLAKE(dev)) | ||
| 870 | return; | ||
| 871 | |||
| 872 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); | 885 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); |
| 873 | i915_disable_pipestat(dev_priv, pipe, | 886 | if (IS_IRONLAKE(dev)) |
| 874 | PIPE_VBLANK_INTERRUPT_ENABLE | | 887 | ironlake_disable_display_irq(dev_priv, (pipe == 0) ? |
| 875 | PIPE_START_VBLANK_INTERRUPT_ENABLE); | 888 | DE_PIPEA_VBLANK: DE_PIPEB_VBLANK); |
| 889 | else | ||
| 890 | i915_disable_pipestat(dev_priv, pipe, | ||
| 891 | PIPE_VBLANK_INTERRUPT_ENABLE | | ||
| 892 | PIPE_START_VBLANK_INTERRUPT_ENABLE); | ||
| 876 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); | 893 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); |
| 877 | } | 894 | } |
| 878 | 895 | ||
| @@ -1015,13 +1032,14 @@ static int ironlake_irq_postinstall(struct drm_device *dev) | |||
| 1015 | { | 1032 | { |
| 1016 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 1033 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 1017 | /* enable kind of interrupts always enabled */ | 1034 | /* enable kind of interrupts always enabled */ |
| 1018 | u32 display_mask = DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT; | 1035 | u32 display_mask = DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT | |
| 1036 | DE_PLANEA_FLIP_DONE | DE_PLANEB_FLIP_DONE; | ||
| 1019 | u32 render_mask = GT_USER_INTERRUPT; | 1037 | u32 render_mask = GT_USER_INTERRUPT; |
| 1020 | u32 hotplug_mask = SDE_CRT_HOTPLUG | SDE_PORTB_HOTPLUG | | 1038 | u32 hotplug_mask = SDE_CRT_HOTPLUG | SDE_PORTB_HOTPLUG | |
| 1021 | SDE_PORTC_HOTPLUG | SDE_PORTD_HOTPLUG; | 1039 | SDE_PORTC_HOTPLUG | SDE_PORTD_HOTPLUG; |
| 1022 | 1040 | ||
| 1023 | dev_priv->irq_mask_reg = ~display_mask; | 1041 | dev_priv->irq_mask_reg = ~display_mask; |
| 1024 | dev_priv->de_irq_enable_reg = display_mask; | 1042 | dev_priv->de_irq_enable_reg = display_mask | DE_PIPEA_VBLANK | DE_PIPEB_VBLANK; |
| 1025 | 1043 | ||
| 1026 | /* should always can generate irq */ | 1044 | /* should always can generate irq */ |
| 1027 | I915_WRITE(DEIIR, I915_READ(DEIIR)); | 1045 | I915_WRITE(DEIIR, I915_READ(DEIIR)); |
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index ddefc871edfe..79dd4026586f 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c | |||
| @@ -157,6 +157,9 @@ static bool intel_ironlake_crt_detect_hotplug(struct drm_connector *connector) | |||
| 157 | adpa = I915_READ(PCH_ADPA); | 157 | adpa = I915_READ(PCH_ADPA); |
| 158 | 158 | ||
| 159 | adpa &= ~ADPA_CRT_HOTPLUG_MASK; | 159 | adpa &= ~ADPA_CRT_HOTPLUG_MASK; |
| 160 | /* disable HPD first */ | ||
| 161 | I915_WRITE(PCH_ADPA, adpa); | ||
| 162 | (void)I915_READ(PCH_ADPA); | ||
| 160 | 163 | ||
| 161 | adpa |= (ADPA_CRT_HOTPLUG_PERIOD_128 | | 164 | adpa |= (ADPA_CRT_HOTPLUG_PERIOD_128 | |
| 162 | ADPA_CRT_HOTPLUG_WARMUP_10MS | | 165 | ADPA_CRT_HOTPLUG_WARMUP_10MS | |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 45da78ef4a92..12775df1bbfd 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -1638,6 +1638,7 @@ static void ironlake_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 1638 | case DRM_MODE_DPMS_OFF: | 1638 | case DRM_MODE_DPMS_OFF: |
| 1639 | DRM_DEBUG_KMS("crtc %d dpms off\n", pipe); | 1639 | DRM_DEBUG_KMS("crtc %d dpms off\n", pipe); |
| 1640 | 1640 | ||
| 1641 | drm_vblank_off(dev, pipe); | ||
| 1641 | /* Disable display plane */ | 1642 | /* Disable display plane */ |
| 1642 | temp = I915_READ(dspcntr_reg); | 1643 | temp = I915_READ(dspcntr_reg); |
| 1643 | if ((temp & DISPLAY_PLANE_ENABLE) != 0) { | 1644 | if ((temp & DISPLAY_PLANE_ENABLE) != 0) { |
| @@ -2519,6 +2520,10 @@ static void g4x_update_wm(struct drm_device *dev, int planea_clock, | |||
| 2519 | sr_entries = roundup(sr_entries / cacheline_size, 1); | 2520 | sr_entries = roundup(sr_entries / cacheline_size, 1); |
| 2520 | DRM_DEBUG("self-refresh entries: %d\n", sr_entries); | 2521 | DRM_DEBUG("self-refresh entries: %d\n", sr_entries); |
| 2521 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN); | 2522 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN); |
| 2523 | } else { | ||
| 2524 | /* Turn off self refresh if both pipes are enabled */ | ||
| 2525 | I915_WRITE(FW_BLC_SELF, I915_READ(FW_BLC_SELF) | ||
| 2526 | & ~FW_BLC_SELF_EN); | ||
| 2522 | } | 2527 | } |
| 2523 | 2528 | ||
| 2524 | DRM_DEBUG("Setting FIFO watermarks - A: %d, B: %d, SR %d\n", | 2529 | DRM_DEBUG("Setting FIFO watermarks - A: %d, B: %d, SR %d\n", |
| @@ -2562,6 +2567,10 @@ static void i965_update_wm(struct drm_device *dev, int planea_clock, | |||
| 2562 | srwm = 1; | 2567 | srwm = 1; |
| 2563 | srwm &= 0x3f; | 2568 | srwm &= 0x3f; |
| 2564 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN); | 2569 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN); |
| 2570 | } else { | ||
| 2571 | /* Turn off self refresh if both pipes are enabled */ | ||
| 2572 | I915_WRITE(FW_BLC_SELF, I915_READ(FW_BLC_SELF) | ||
| 2573 | & ~FW_BLC_SELF_EN); | ||
| 2565 | } | 2574 | } |
| 2566 | 2575 | ||
| 2567 | DRM_DEBUG_KMS("Setting FIFO watermarks - A: 8, B: 8, C: 8, SR %d\n", | 2576 | DRM_DEBUG_KMS("Setting FIFO watermarks - A: 8, B: 8, C: 8, SR %d\n", |
| @@ -2630,6 +2639,10 @@ static void i9xx_update_wm(struct drm_device *dev, int planea_clock, | |||
| 2630 | if (srwm < 0) | 2639 | if (srwm < 0) |
| 2631 | srwm = 1; | 2640 | srwm = 1; |
| 2632 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN | (srwm & 0x3f)); | 2641 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN | (srwm & 0x3f)); |
| 2642 | } else { | ||
| 2643 | /* Turn off self refresh if both pipes are enabled */ | ||
| 2644 | I915_WRITE(FW_BLC_SELF, I915_READ(FW_BLC_SELF) | ||
| 2645 | & ~FW_BLC_SELF_EN); | ||
| 2633 | } | 2646 | } |
| 2634 | 2647 | ||
| 2635 | DRM_DEBUG_KMS("Setting FIFO watermarks - A: %d, B: %d, C: %d, SR %d\n", | 2648 | DRM_DEBUG_KMS("Setting FIFO watermarks - A: %d, B: %d, C: %d, SR %d\n", |
| @@ -3984,6 +3997,12 @@ void intel_finish_page_flip(struct drm_device *dev, int pipe) | |||
| 3984 | spin_lock_irqsave(&dev->event_lock, flags); | 3997 | spin_lock_irqsave(&dev->event_lock, flags); |
| 3985 | work = intel_crtc->unpin_work; | 3998 | work = intel_crtc->unpin_work; |
| 3986 | if (work == NULL || !work->pending) { | 3999 | if (work == NULL || !work->pending) { |
| 4000 | if (work && !work->pending) { | ||
| 4001 | obj_priv = work->obj->driver_private; | ||
| 4002 | DRM_DEBUG_DRIVER("flip finish: %p (%d) not pending?\n", | ||
| 4003 | obj_priv, | ||
| 4004 | atomic_read(&obj_priv->pending_flip)); | ||
| 4005 | } | ||
| 3987 | spin_unlock_irqrestore(&dev->event_lock, flags); | 4006 | spin_unlock_irqrestore(&dev->event_lock, flags); |
| 3988 | return; | 4007 | return; |
| 3989 | } | 4008 | } |
| @@ -4005,7 +4024,10 @@ void intel_finish_page_flip(struct drm_device *dev, int pipe) | |||
| 4005 | spin_unlock_irqrestore(&dev->event_lock, flags); | 4024 | spin_unlock_irqrestore(&dev->event_lock, flags); |
| 4006 | 4025 | ||
| 4007 | obj_priv = work->obj->driver_private; | 4026 | obj_priv = work->obj->driver_private; |
| 4008 | if (atomic_dec_and_test(&obj_priv->pending_flip)) | 4027 | |
| 4028 | /* Initial scanout buffer will have a 0 pending flip count */ | ||
| 4029 | if ((atomic_read(&obj_priv->pending_flip) == 0) || | ||
| 4030 | atomic_dec_and_test(&obj_priv->pending_flip)) | ||
| 4009 | DRM_WAKEUP(&dev_priv->pending_flip_queue); | 4031 | DRM_WAKEUP(&dev_priv->pending_flip_queue); |
| 4010 | schedule_work(&work->work); | 4032 | schedule_work(&work->work); |
| 4011 | } | 4033 | } |
| @@ -4018,8 +4040,11 @@ void intel_prepare_page_flip(struct drm_device *dev, int plane) | |||
| 4018 | unsigned long flags; | 4040 | unsigned long flags; |
| 4019 | 4041 | ||
| 4020 | spin_lock_irqsave(&dev->event_lock, flags); | 4042 | spin_lock_irqsave(&dev->event_lock, flags); |
| 4021 | if (intel_crtc->unpin_work) | 4043 | if (intel_crtc->unpin_work) { |
| 4022 | intel_crtc->unpin_work->pending = 1; | 4044 | intel_crtc->unpin_work->pending = 1; |
| 4045 | } else { | ||
| 4046 | DRM_DEBUG_DRIVER("preparing flip with no unpin work?\n"); | ||
| 4047 | } | ||
| 4023 | spin_unlock_irqrestore(&dev->event_lock, flags); | 4048 | spin_unlock_irqrestore(&dev->event_lock, flags); |
| 4024 | } | 4049 | } |
| 4025 | 4050 | ||
| @@ -4053,6 +4078,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | |||
| 4053 | /* We borrow the event spin lock for protecting unpin_work */ | 4078 | /* We borrow the event spin lock for protecting unpin_work */ |
| 4054 | spin_lock_irqsave(&dev->event_lock, flags); | 4079 | spin_lock_irqsave(&dev->event_lock, flags); |
| 4055 | if (intel_crtc->unpin_work) { | 4080 | if (intel_crtc->unpin_work) { |
| 4081 | DRM_DEBUG_DRIVER("flip queue: crtc already busy\n"); | ||
| 4056 | spin_unlock_irqrestore(&dev->event_lock, flags); | 4082 | spin_unlock_irqrestore(&dev->event_lock, flags); |
| 4057 | kfree(work); | 4083 | kfree(work); |
| 4058 | mutex_unlock(&dev->struct_mutex); | 4084 | mutex_unlock(&dev->struct_mutex); |
| @@ -4066,7 +4092,10 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | |||
| 4066 | 4092 | ||
| 4067 | ret = intel_pin_and_fence_fb_obj(dev, obj); | 4093 | ret = intel_pin_and_fence_fb_obj(dev, obj); |
| 4068 | if (ret != 0) { | 4094 | if (ret != 0) { |
| 4095 | DRM_DEBUG_DRIVER("flip queue: %p pin & fence failed\n", | ||
| 4096 | obj->driver_private); | ||
| 4069 | kfree(work); | 4097 | kfree(work); |
| 4098 | intel_crtc->unpin_work = NULL; | ||
| 4070 | mutex_unlock(&dev->struct_mutex); | 4099 | mutex_unlock(&dev->struct_mutex); |
| 4071 | return ret; | 4100 | return ret; |
| 4072 | } | 4101 | } |
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index aa74e59bec61..b1d0acbae4e4 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
| @@ -611,7 +611,7 @@ static const struct dmi_system_id bad_lid_status[] = { | |||
| 611 | { | 611 | { |
| 612 | .ident = "Samsung SX20S", | 612 | .ident = "Samsung SX20S", |
| 613 | .matches = { | 613 | .matches = { |
| 614 | DMI_MATCH(DMI_SYS_VENDOR, "Phoenix Technologies LTD"), | 614 | DMI_MATCH(DMI_SYS_VENDOR, "Samsung Electronics"), |
| 615 | DMI_MATCH(DMI_BOARD_NAME, "SX20S"), | 615 | DMI_MATCH(DMI_BOARD_NAME, "SX20S"), |
| 616 | }, | 616 | }, |
| 617 | }, | 617 | }, |
| @@ -623,6 +623,13 @@ static const struct dmi_system_id bad_lid_status[] = { | |||
| 623 | }, | 623 | }, |
| 624 | }, | 624 | }, |
| 625 | { | 625 | { |
| 626 | .ident = "Aspire 1810T", | ||
| 627 | .matches = { | ||
| 628 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
| 629 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1810T"), | ||
| 630 | }, | ||
| 631 | }, | ||
| 632 | { | ||
| 626 | .ident = "PC-81005", | 633 | .ident = "PC-81005", |
| 627 | .matches = { | 634 | .matches = { |
| 628 | DMI_MATCH(DMI_SYS_VENDOR, "MALATA"), | 635 | DMI_MATCH(DMI_SYS_VENDOR, "MALATA"), |
| @@ -643,7 +650,7 @@ static enum drm_connector_status intel_lvds_detect(struct drm_connector *connect | |||
| 643 | { | 650 | { |
| 644 | enum drm_connector_status status = connector_status_connected; | 651 | enum drm_connector_status status = connector_status_connected; |
| 645 | 652 | ||
| 646 | if (!acpi_lid_open() && !dmi_check_system(bad_lid_status)) | 653 | if (!dmi_check_system(bad_lid_status) && !acpi_lid_open()) |
| 647 | status = connector_status_disconnected; | 654 | status = connector_status_disconnected; |
| 648 | 655 | ||
| 649 | return status; | 656 | return status; |
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index eaacfd0920df..82678d30ab06 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
| @@ -2345,6 +2345,14 @@ intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags) | |||
| 2345 | connector->connector_type = DRM_MODE_CONNECTOR_VGA; | 2345 | connector->connector_type = DRM_MODE_CONNECTOR_VGA; |
| 2346 | intel_output->clone_mask = (1 << INTEL_SDVO_NON_TV_CLONE_BIT) | | 2346 | intel_output->clone_mask = (1 << INTEL_SDVO_NON_TV_CLONE_BIT) | |
| 2347 | (1 << INTEL_ANALOG_CLONE_BIT); | 2347 | (1 << INTEL_ANALOG_CLONE_BIT); |
| 2348 | } else if (flags & SDVO_OUTPUT_CVBS0) { | ||
| 2349 | |||
| 2350 | sdvo_priv->controlled_output = SDVO_OUTPUT_CVBS0; | ||
| 2351 | encoder->encoder_type = DRM_MODE_ENCODER_TVDAC; | ||
| 2352 | connector->connector_type = DRM_MODE_CONNECTOR_SVIDEO; | ||
| 2353 | sdvo_priv->is_tv = true; | ||
| 2354 | intel_output->needs_tv_clock = true; | ||
| 2355 | intel_output->clone_mask = 1 << INTEL_SDVO_TV_CLONE_BIT; | ||
| 2348 | } else if (flags & SDVO_OUTPUT_LVDS0) { | 2356 | } else if (flags & SDVO_OUTPUT_LVDS0) { |
| 2349 | 2357 | ||
| 2350 | sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS0; | 2358 | sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS0; |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 11c9a3fe6810..c0d4650cdb79 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -354,11 +354,17 @@ u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc) | |||
| 354 | return RREG32(RADEON_CRTC2_CRNT_FRAME); | 354 | return RREG32(RADEON_CRTC2_CRNT_FRAME); |
| 355 | } | 355 | } |
| 356 | 356 | ||
| 357 | /* Who ever call radeon_fence_emit should call ring_lock and ask | ||
| 358 | * for enough space (today caller are ib schedule and buffer move) */ | ||
| 357 | void r100_fence_ring_emit(struct radeon_device *rdev, | 359 | void r100_fence_ring_emit(struct radeon_device *rdev, |
| 358 | struct radeon_fence *fence) | 360 | struct radeon_fence *fence) |
| 359 | { | 361 | { |
| 360 | /* Who ever call radeon_fence_emit should call ring_lock and ask | 362 | /* We have to make sure that caches are flushed before |
| 361 | * for enough space (today caller are ib schedule and buffer move) */ | 363 | * CPU might read something from VRAM. */ |
| 364 | radeon_ring_write(rdev, PACKET0(RADEON_RB3D_DSTCACHE_CTLSTAT, 0)); | ||
| 365 | radeon_ring_write(rdev, RADEON_RB3D_DC_FLUSH_ALL); | ||
| 366 | radeon_ring_write(rdev, PACKET0(RADEON_RB3D_ZCACHE_CTLSTAT, 0)); | ||
| 367 | radeon_ring_write(rdev, RADEON_RB3D_ZC_FLUSH_ALL); | ||
| 362 | /* Wait until IDLE & CLEAN */ | 368 | /* Wait until IDLE & CLEAN */ |
| 363 | radeon_ring_write(rdev, PACKET0(0x1720, 0)); | 369 | radeon_ring_write(rdev, PACKET0(0x1720, 0)); |
| 364 | radeon_ring_write(rdev, (1 << 16) | (1 << 17)); | 370 | radeon_ring_write(rdev, (1 << 16) | (1 << 17)); |
| @@ -3369,7 +3375,6 @@ int r100_suspend(struct radeon_device *rdev) | |||
| 3369 | 3375 | ||
| 3370 | void r100_fini(struct radeon_device *rdev) | 3376 | void r100_fini(struct radeon_device *rdev) |
| 3371 | { | 3377 | { |
| 3372 | r100_suspend(rdev); | ||
| 3373 | r100_cp_fini(rdev); | 3378 | r100_cp_fini(rdev); |
| 3374 | r100_wb_fini(rdev); | 3379 | r100_wb_fini(rdev); |
| 3375 | r100_ib_fini(rdev); | 3380 | r100_ib_fini(rdev); |
| @@ -3481,13 +3486,12 @@ int r100_init(struct radeon_device *rdev) | |||
| 3481 | if (r) { | 3486 | if (r) { |
| 3482 | /* Somethings want wront with the accel init stop accel */ | 3487 | /* Somethings want wront with the accel init stop accel */ |
| 3483 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 3488 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 3484 | r100_suspend(rdev); | ||
| 3485 | r100_cp_fini(rdev); | 3489 | r100_cp_fini(rdev); |
| 3486 | r100_wb_fini(rdev); | 3490 | r100_wb_fini(rdev); |
| 3487 | r100_ib_fini(rdev); | 3491 | r100_ib_fini(rdev); |
| 3492 | radeon_irq_kms_fini(rdev); | ||
| 3488 | if (rdev->flags & RADEON_IS_PCI) | 3493 | if (rdev->flags & RADEON_IS_PCI) |
| 3489 | r100_pci_gart_fini(rdev); | 3494 | r100_pci_gart_fini(rdev); |
| 3490 | radeon_irq_kms_fini(rdev); | ||
| 3491 | rdev->accel_working = false; | 3495 | rdev->accel_working = false; |
| 3492 | } | 3496 | } |
| 3493 | return 0; | 3497 | return 0; |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index 0051d11b907c..43b55a030b4d 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
| @@ -506,11 +506,14 @@ void r300_vram_info(struct radeon_device *rdev) | |||
| 506 | 506 | ||
| 507 | /* DDR for all card after R300 & IGP */ | 507 | /* DDR for all card after R300 & IGP */ |
| 508 | rdev->mc.vram_is_ddr = true; | 508 | rdev->mc.vram_is_ddr = true; |
| 509 | |||
| 509 | tmp = RREG32(RADEON_MEM_CNTL); | 510 | tmp = RREG32(RADEON_MEM_CNTL); |
| 510 | if (tmp & R300_MEM_NUM_CHANNELS_MASK) { | 511 | tmp &= R300_MEM_NUM_CHANNELS_MASK; |
| 511 | rdev->mc.vram_width = 128; | 512 | switch (tmp) { |
| 512 | } else { | 513 | case 0: rdev->mc.vram_width = 64; break; |
| 513 | rdev->mc.vram_width = 64; | 514 | case 1: rdev->mc.vram_width = 128; break; |
| 515 | case 2: rdev->mc.vram_width = 256; break; | ||
| 516 | default: rdev->mc.vram_width = 128; break; | ||
| 514 | } | 517 | } |
| 515 | 518 | ||
| 516 | r100_vram_init_sizes(rdev); | 519 | r100_vram_init_sizes(rdev); |
| @@ -1327,7 +1330,6 @@ int r300_suspend(struct radeon_device *rdev) | |||
| 1327 | 1330 | ||
| 1328 | void r300_fini(struct radeon_device *rdev) | 1331 | void r300_fini(struct radeon_device *rdev) |
| 1329 | { | 1332 | { |
| 1330 | r300_suspend(rdev); | ||
| 1331 | r100_cp_fini(rdev); | 1333 | r100_cp_fini(rdev); |
| 1332 | r100_wb_fini(rdev); | 1334 | r100_wb_fini(rdev); |
| 1333 | r100_ib_fini(rdev); | 1335 | r100_ib_fini(rdev); |
| @@ -1418,15 +1420,15 @@ int r300_init(struct radeon_device *rdev) | |||
| 1418 | if (r) { | 1420 | if (r) { |
| 1419 | /* Somethings want wront with the accel init stop accel */ | 1421 | /* Somethings want wront with the accel init stop accel */ |
| 1420 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 1422 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 1421 | r300_suspend(rdev); | ||
| 1422 | r100_cp_fini(rdev); | 1423 | r100_cp_fini(rdev); |
| 1423 | r100_wb_fini(rdev); | 1424 | r100_wb_fini(rdev); |
| 1424 | r100_ib_fini(rdev); | 1425 | r100_ib_fini(rdev); |
| 1426 | radeon_irq_kms_fini(rdev); | ||
| 1425 | if (rdev->flags & RADEON_IS_PCIE) | 1427 | if (rdev->flags & RADEON_IS_PCIE) |
| 1426 | rv370_pcie_gart_fini(rdev); | 1428 | rv370_pcie_gart_fini(rdev); |
| 1427 | if (rdev->flags & RADEON_IS_PCI) | 1429 | if (rdev->flags & RADEON_IS_PCI) |
| 1428 | r100_pci_gart_fini(rdev); | 1430 | r100_pci_gart_fini(rdev); |
| 1429 | radeon_irq_kms_fini(rdev); | 1431 | radeon_agp_fini(rdev); |
| 1430 | rdev->accel_working = false; | 1432 | rdev->accel_working = false; |
| 1431 | } | 1433 | } |
| 1432 | return 0; | 1434 | return 0; |
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c index 4526faaacca8..d9373246c97f 100644 --- a/drivers/gpu/drm/radeon/r420.c +++ b/drivers/gpu/drm/radeon/r420.c | |||
| @@ -389,16 +389,15 @@ int r420_init(struct radeon_device *rdev) | |||
| 389 | if (r) { | 389 | if (r) { |
| 390 | /* Somethings want wront with the accel init stop accel */ | 390 | /* Somethings want wront with the accel init stop accel */ |
| 391 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 391 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 392 | r420_suspend(rdev); | ||
| 393 | r100_cp_fini(rdev); | 392 | r100_cp_fini(rdev); |
| 394 | r100_wb_fini(rdev); | 393 | r100_wb_fini(rdev); |
| 395 | r100_ib_fini(rdev); | 394 | r100_ib_fini(rdev); |
| 395 | radeon_irq_kms_fini(rdev); | ||
| 396 | if (rdev->flags & RADEON_IS_PCIE) | 396 | if (rdev->flags & RADEON_IS_PCIE) |
| 397 | rv370_pcie_gart_fini(rdev); | 397 | rv370_pcie_gart_fini(rdev); |
| 398 | if (rdev->flags & RADEON_IS_PCI) | 398 | if (rdev->flags & RADEON_IS_PCI) |
| 399 | r100_pci_gart_fini(rdev); | 399 | r100_pci_gart_fini(rdev); |
| 400 | radeon_agp_fini(rdev); | 400 | radeon_agp_fini(rdev); |
| 401 | radeon_irq_kms_fini(rdev); | ||
| 402 | rdev->accel_working = false; | 401 | rdev->accel_working = false; |
| 403 | } | 402 | } |
| 404 | return 0; | 403 | return 0; |
diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c index 9a189072f2b9..ddf5731eba0d 100644 --- a/drivers/gpu/drm/radeon/r520.c +++ b/drivers/gpu/drm/radeon/r520.c | |||
| @@ -294,13 +294,12 @@ int r520_init(struct radeon_device *rdev) | |||
| 294 | if (r) { | 294 | if (r) { |
| 295 | /* Somethings want wront with the accel init stop accel */ | 295 | /* Somethings want wront with the accel init stop accel */ |
| 296 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 296 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 297 | rv515_suspend(rdev); | ||
| 298 | r100_cp_fini(rdev); | 297 | r100_cp_fini(rdev); |
| 299 | r100_wb_fini(rdev); | 298 | r100_wb_fini(rdev); |
| 300 | r100_ib_fini(rdev); | 299 | r100_ib_fini(rdev); |
| 300 | radeon_irq_kms_fini(rdev); | ||
| 301 | rv370_pcie_gart_fini(rdev); | 301 | rv370_pcie_gart_fini(rdev); |
| 302 | radeon_agp_fini(rdev); | 302 | radeon_agp_fini(rdev); |
| 303 | radeon_irq_kms_fini(rdev); | ||
| 304 | rdev->accel_working = false; | 303 | rdev->accel_working = false; |
| 305 | } | 304 | } |
| 306 | return 0; | 305 | return 0; |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 1b6d0001b20e..a1198d99cdf9 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -1654,6 +1654,12 @@ void r600_ring_init(struct radeon_device *rdev, unsigned ring_size) | |||
| 1654 | rdev->cp.align_mask = 16 - 1; | 1654 | rdev->cp.align_mask = 16 - 1; |
| 1655 | } | 1655 | } |
| 1656 | 1656 | ||
| 1657 | void r600_cp_fini(struct radeon_device *rdev) | ||
| 1658 | { | ||
| 1659 | r600_cp_stop(rdev); | ||
| 1660 | radeon_ring_fini(rdev); | ||
| 1661 | } | ||
| 1662 | |||
| 1657 | 1663 | ||
| 1658 | /* | 1664 | /* |
| 1659 | * GPU scratch registers helpers function. | 1665 | * GPU scratch registers helpers function. |
| @@ -1861,6 +1867,12 @@ int r600_startup(struct radeon_device *rdev) | |||
| 1861 | return r; | 1867 | return r; |
| 1862 | } | 1868 | } |
| 1863 | r600_gpu_init(rdev); | 1869 | r600_gpu_init(rdev); |
| 1870 | r = r600_blit_init(rdev); | ||
| 1871 | if (r) { | ||
| 1872 | r600_blit_fini(rdev); | ||
| 1873 | rdev->asic->copy = NULL; | ||
| 1874 | dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); | ||
| 1875 | } | ||
| 1864 | /* pin copy shader into vram */ | 1876 | /* pin copy shader into vram */ |
| 1865 | if (rdev->r600_blit.shader_obj) { | 1877 | if (rdev->r600_blit.shader_obj) { |
| 1866 | r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); | 1878 | r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); |
| @@ -2045,19 +2057,15 @@ int r600_init(struct radeon_device *rdev) | |||
| 2045 | r = r600_pcie_gart_init(rdev); | 2057 | r = r600_pcie_gart_init(rdev); |
| 2046 | if (r) | 2058 | if (r) |
| 2047 | return r; | 2059 | return r; |
| 2048 | r = r600_blit_init(rdev); | ||
| 2049 | if (r) { | ||
| 2050 | r600_blit_fini(rdev); | ||
| 2051 | rdev->asic->copy = NULL; | ||
| 2052 | dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); | ||
| 2053 | } | ||
| 2054 | 2060 | ||
| 2055 | rdev->accel_working = true; | 2061 | rdev->accel_working = true; |
| 2056 | r = r600_startup(rdev); | 2062 | r = r600_startup(rdev); |
| 2057 | if (r) { | 2063 | if (r) { |
| 2058 | r600_suspend(rdev); | 2064 | dev_err(rdev->dev, "disabling GPU acceleration\n"); |
| 2065 | r600_cp_fini(rdev); | ||
| 2059 | r600_wb_fini(rdev); | 2066 | r600_wb_fini(rdev); |
| 2060 | radeon_ring_fini(rdev); | 2067 | r600_irq_fini(rdev); |
| 2068 | radeon_irq_kms_fini(rdev); | ||
| 2061 | r600_pcie_gart_fini(rdev); | 2069 | r600_pcie_gart_fini(rdev); |
| 2062 | rdev->accel_working = false; | 2070 | rdev->accel_working = false; |
| 2063 | } | 2071 | } |
| @@ -2083,20 +2091,17 @@ int r600_init(struct radeon_device *rdev) | |||
| 2083 | 2091 | ||
| 2084 | void r600_fini(struct radeon_device *rdev) | 2092 | void r600_fini(struct radeon_device *rdev) |
| 2085 | { | 2093 | { |
| 2086 | /* Suspend operations */ | ||
| 2087 | r600_suspend(rdev); | ||
| 2088 | |||
| 2089 | r600_audio_fini(rdev); | 2094 | r600_audio_fini(rdev); |
| 2090 | r600_blit_fini(rdev); | 2095 | r600_blit_fini(rdev); |
| 2096 | r600_cp_fini(rdev); | ||
| 2097 | r600_wb_fini(rdev); | ||
| 2091 | r600_irq_fini(rdev); | 2098 | r600_irq_fini(rdev); |
| 2092 | radeon_irq_kms_fini(rdev); | 2099 | radeon_irq_kms_fini(rdev); |
| 2093 | radeon_ring_fini(rdev); | ||
| 2094 | r600_wb_fini(rdev); | ||
| 2095 | r600_pcie_gart_fini(rdev); | 2100 | r600_pcie_gart_fini(rdev); |
| 2101 | radeon_agp_fini(rdev); | ||
| 2096 | radeon_gem_fini(rdev); | 2102 | radeon_gem_fini(rdev); |
| 2097 | radeon_fence_driver_fini(rdev); | 2103 | radeon_fence_driver_fini(rdev); |
| 2098 | radeon_clocks_fini(rdev); | 2104 | radeon_clocks_fini(rdev); |
| 2099 | radeon_agp_fini(rdev); | ||
| 2100 | radeon_bo_fini(rdev); | 2105 | radeon_bo_fini(rdev); |
| 2101 | radeon_atombios_fini(rdev); | 2106 | radeon_atombios_fini(rdev); |
| 2102 | kfree(rdev->bios); | 2107 | kfree(rdev->bios); |
| @@ -2900,3 +2905,18 @@ int r600_debugfs_mc_info_init(struct radeon_device *rdev) | |||
| 2900 | return 0; | 2905 | return 0; |
| 2901 | #endif | 2906 | #endif |
| 2902 | } | 2907 | } |
| 2908 | |||
| 2909 | /** | ||
| 2910 | * r600_ioctl_wait_idle - flush host path cache on wait idle ioctl | ||
| 2911 | * rdev: radeon device structure | ||
| 2912 | * bo: buffer object struct which userspace is waiting for idle | ||
| 2913 | * | ||
| 2914 | * Some R6XX/R7XX doesn't seems to take into account HDP flush performed | ||
| 2915 | * through ring buffer, this leads to corruption in rendering, see | ||
| 2916 | * http://bugzilla.kernel.org/show_bug.cgi?id=15186 to avoid this we | ||
| 2917 | * directly perform HDP flush by writing register through MMIO. | ||
| 2918 | */ | ||
| 2919 | void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo) | ||
| 2920 | { | ||
| 2921 | WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); | ||
| 2922 | } | ||
diff --git a/drivers/gpu/drm/radeon/r600_audio.c b/drivers/gpu/drm/radeon/r600_audio.c index 99e2c3891a7d..b1c1d3433454 100644 --- a/drivers/gpu/drm/radeon/r600_audio.c +++ b/drivers/gpu/drm/radeon/r600_audio.c | |||
| @@ -35,7 +35,7 @@ | |||
| 35 | */ | 35 | */ |
| 36 | static int r600_audio_chipset_supported(struct radeon_device *rdev) | 36 | static int r600_audio_chipset_supported(struct radeon_device *rdev) |
| 37 | { | 37 | { |
| 38 | return rdev->family >= CHIP_R600 | 38 | return (rdev->family >= CHIP_R600 && rdev->family < CHIP_RV710) |
| 39 | || rdev->family == CHIP_RS600 | 39 | || rdev->family == CHIP_RS600 |
| 40 | || rdev->family == CHIP_RS690 | 40 | || rdev->family == CHIP_RS690 |
| 41 | || rdev->family == CHIP_RS740; | 41 | || rdev->family == CHIP_RS740; |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 2d5f2bfa7201..f57480ba1355 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -661,6 +661,13 @@ struct radeon_asic { | |||
| 661 | void (*hpd_fini)(struct radeon_device *rdev); | 661 | void (*hpd_fini)(struct radeon_device *rdev); |
| 662 | bool (*hpd_sense)(struct radeon_device *rdev, enum radeon_hpd_id hpd); | 662 | bool (*hpd_sense)(struct radeon_device *rdev, enum radeon_hpd_id hpd); |
| 663 | void (*hpd_set_polarity)(struct radeon_device *rdev, enum radeon_hpd_id hpd); | 663 | void (*hpd_set_polarity)(struct radeon_device *rdev, enum radeon_hpd_id hpd); |
| 664 | /* ioctl hw specific callback. Some hw might want to perform special | ||
| 665 | * operation on specific ioctl. For instance on wait idle some hw | ||
| 666 | * might want to perform and HDP flush through MMIO as it seems that | ||
| 667 | * some R6XX/R7XX hw doesn't take HDP flush into account if programmed | ||
| 668 | * through ring. | ||
| 669 | */ | ||
| 670 | void (*ioctl_wait_idle)(struct radeon_device *rdev, struct radeon_bo *bo); | ||
| 664 | }; | 671 | }; |
| 665 | 672 | ||
| 666 | /* | 673 | /* |
| @@ -1143,6 +1150,7 @@ extern bool r600_card_posted(struct radeon_device *rdev); | |||
| 1143 | extern void r600_cp_stop(struct radeon_device *rdev); | 1150 | extern void r600_cp_stop(struct radeon_device *rdev); |
| 1144 | extern void r600_ring_init(struct radeon_device *rdev, unsigned ring_size); | 1151 | extern void r600_ring_init(struct radeon_device *rdev, unsigned ring_size); |
| 1145 | extern int r600_cp_resume(struct radeon_device *rdev); | 1152 | extern int r600_cp_resume(struct radeon_device *rdev); |
| 1153 | extern void r600_cp_fini(struct radeon_device *rdev); | ||
| 1146 | extern int r600_count_pipe_bits(uint32_t val); | 1154 | extern int r600_count_pipe_bits(uint32_t val); |
| 1147 | extern int r600_gart_clear_page(struct radeon_device *rdev, int i); | 1155 | extern int r600_gart_clear_page(struct radeon_device *rdev, int i); |
| 1148 | extern int r600_mc_wait_for_idle(struct radeon_device *rdev); | 1156 | extern int r600_mc_wait_for_idle(struct radeon_device *rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index f2fbd2e4e9df..05ee1aeac3fd 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
| @@ -117,6 +117,7 @@ static struct radeon_asic r100_asic = { | |||
| 117 | .hpd_fini = &r100_hpd_fini, | 117 | .hpd_fini = &r100_hpd_fini, |
| 118 | .hpd_sense = &r100_hpd_sense, | 118 | .hpd_sense = &r100_hpd_sense, |
| 119 | .hpd_set_polarity = &r100_hpd_set_polarity, | 119 | .hpd_set_polarity = &r100_hpd_set_polarity, |
| 120 | .ioctl_wait_idle = NULL, | ||
| 120 | }; | 121 | }; |
| 121 | 122 | ||
| 122 | 123 | ||
| @@ -176,6 +177,7 @@ static struct radeon_asic r300_asic = { | |||
| 176 | .hpd_fini = &r100_hpd_fini, | 177 | .hpd_fini = &r100_hpd_fini, |
| 177 | .hpd_sense = &r100_hpd_sense, | 178 | .hpd_sense = &r100_hpd_sense, |
| 178 | .hpd_set_polarity = &r100_hpd_set_polarity, | 179 | .hpd_set_polarity = &r100_hpd_set_polarity, |
| 180 | .ioctl_wait_idle = NULL, | ||
| 179 | }; | 181 | }; |
| 180 | 182 | ||
| 181 | /* | 183 | /* |
| @@ -219,6 +221,7 @@ static struct radeon_asic r420_asic = { | |||
| 219 | .hpd_fini = &r100_hpd_fini, | 221 | .hpd_fini = &r100_hpd_fini, |
| 220 | .hpd_sense = &r100_hpd_sense, | 222 | .hpd_sense = &r100_hpd_sense, |
| 221 | .hpd_set_polarity = &r100_hpd_set_polarity, | 223 | .hpd_set_polarity = &r100_hpd_set_polarity, |
| 224 | .ioctl_wait_idle = NULL, | ||
| 222 | }; | 225 | }; |
| 223 | 226 | ||
| 224 | 227 | ||
| @@ -267,6 +270,7 @@ static struct radeon_asic rs400_asic = { | |||
| 267 | .hpd_fini = &r100_hpd_fini, | 270 | .hpd_fini = &r100_hpd_fini, |
| 268 | .hpd_sense = &r100_hpd_sense, | 271 | .hpd_sense = &r100_hpd_sense, |
| 269 | .hpd_set_polarity = &r100_hpd_set_polarity, | 272 | .hpd_set_polarity = &r100_hpd_set_polarity, |
| 273 | .ioctl_wait_idle = NULL, | ||
| 270 | }; | 274 | }; |
| 271 | 275 | ||
| 272 | 276 | ||
| @@ -323,6 +327,7 @@ static struct radeon_asic rs600_asic = { | |||
| 323 | .hpd_fini = &rs600_hpd_fini, | 327 | .hpd_fini = &rs600_hpd_fini, |
| 324 | .hpd_sense = &rs600_hpd_sense, | 328 | .hpd_sense = &rs600_hpd_sense, |
| 325 | .hpd_set_polarity = &rs600_hpd_set_polarity, | 329 | .hpd_set_polarity = &rs600_hpd_set_polarity, |
| 330 | .ioctl_wait_idle = NULL, | ||
| 326 | }; | 331 | }; |
| 327 | 332 | ||
| 328 | 333 | ||
| @@ -370,6 +375,7 @@ static struct radeon_asic rs690_asic = { | |||
| 370 | .hpd_fini = &rs600_hpd_fini, | 375 | .hpd_fini = &rs600_hpd_fini, |
| 371 | .hpd_sense = &rs600_hpd_sense, | 376 | .hpd_sense = &rs600_hpd_sense, |
| 372 | .hpd_set_polarity = &rs600_hpd_set_polarity, | 377 | .hpd_set_polarity = &rs600_hpd_set_polarity, |
| 378 | .ioctl_wait_idle = NULL, | ||
| 373 | }; | 379 | }; |
| 374 | 380 | ||
| 375 | 381 | ||
| @@ -421,6 +427,7 @@ static struct radeon_asic rv515_asic = { | |||
| 421 | .hpd_fini = &rs600_hpd_fini, | 427 | .hpd_fini = &rs600_hpd_fini, |
| 422 | .hpd_sense = &rs600_hpd_sense, | 428 | .hpd_sense = &rs600_hpd_sense, |
| 423 | .hpd_set_polarity = &rs600_hpd_set_polarity, | 429 | .hpd_set_polarity = &rs600_hpd_set_polarity, |
| 430 | .ioctl_wait_idle = NULL, | ||
| 424 | }; | 431 | }; |
| 425 | 432 | ||
| 426 | 433 | ||
| @@ -463,6 +470,7 @@ static struct radeon_asic r520_asic = { | |||
| 463 | .hpd_fini = &rs600_hpd_fini, | 470 | .hpd_fini = &rs600_hpd_fini, |
| 464 | .hpd_sense = &rs600_hpd_sense, | 471 | .hpd_sense = &rs600_hpd_sense, |
| 465 | .hpd_set_polarity = &rs600_hpd_set_polarity, | 472 | .hpd_set_polarity = &rs600_hpd_set_polarity, |
| 473 | .ioctl_wait_idle = NULL, | ||
| 466 | }; | 474 | }; |
| 467 | 475 | ||
| 468 | /* | 476 | /* |
| @@ -504,6 +512,7 @@ void r600_hpd_fini(struct radeon_device *rdev); | |||
| 504 | bool r600_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd); | 512 | bool r600_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd); |
| 505 | void r600_hpd_set_polarity(struct radeon_device *rdev, | 513 | void r600_hpd_set_polarity(struct radeon_device *rdev, |
| 506 | enum radeon_hpd_id hpd); | 514 | enum radeon_hpd_id hpd); |
| 515 | extern void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo); | ||
| 507 | 516 | ||
| 508 | static struct radeon_asic r600_asic = { | 517 | static struct radeon_asic r600_asic = { |
| 509 | .init = &r600_init, | 518 | .init = &r600_init, |
| @@ -538,6 +547,7 @@ static struct radeon_asic r600_asic = { | |||
| 538 | .hpd_fini = &r600_hpd_fini, | 547 | .hpd_fini = &r600_hpd_fini, |
| 539 | .hpd_sense = &r600_hpd_sense, | 548 | .hpd_sense = &r600_hpd_sense, |
| 540 | .hpd_set_polarity = &r600_hpd_set_polarity, | 549 | .hpd_set_polarity = &r600_hpd_set_polarity, |
| 550 | .ioctl_wait_idle = r600_ioctl_wait_idle, | ||
| 541 | }; | 551 | }; |
| 542 | 552 | ||
| 543 | /* | 553 | /* |
| @@ -582,6 +592,7 @@ static struct radeon_asic rv770_asic = { | |||
| 582 | .hpd_fini = &r600_hpd_fini, | 592 | .hpd_fini = &r600_hpd_fini, |
| 583 | .hpd_sense = &r600_hpd_sense, | 593 | .hpd_sense = &r600_hpd_sense, |
| 584 | .hpd_set_polarity = &r600_hpd_set_polarity, | 594 | .hpd_set_polarity = &r600_hpd_set_polarity, |
| 595 | .ioctl_wait_idle = r600_ioctl_wait_idle, | ||
| 585 | }; | 596 | }; |
| 586 | 597 | ||
| 587 | #endif | 598 | #endif |
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index 579c8920e081..e7b19440102e 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
| @@ -971,8 +971,7 @@ struct radeon_encoder_lvds *radeon_combios_get_lvds_info(struct radeon_encoder | |||
| 971 | lvds->native_mode.vdisplay); | 971 | lvds->native_mode.vdisplay); |
| 972 | 972 | ||
| 973 | lvds->panel_vcc_delay = RBIOS16(lcd_info + 0x2c); | 973 | lvds->panel_vcc_delay = RBIOS16(lcd_info + 0x2c); |
| 974 | if (lvds->panel_vcc_delay > 2000 || lvds->panel_vcc_delay < 0) | 974 | lvds->panel_vcc_delay = min_t(u16, lvds->panel_vcc_delay, 2000); |
| 975 | lvds->panel_vcc_delay = 2000; | ||
| 976 | 975 | ||
| 977 | lvds->panel_pwr_delay = RBIOS8(lcd_info + 0x24); | 976 | lvds->panel_pwr_delay = RBIOS8(lcd_info + 0x24); |
| 978 | lvds->panel_digon_delay = RBIOS16(lcd_info + 0x38) & 0xf; | 977 | lvds->panel_digon_delay = RBIOS16(lcd_info + 0x38) & 0xf; |
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 55266416fa47..2d8e5a70f284 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
| @@ -1343,7 +1343,7 @@ radeon_add_legacy_connector(struct drm_device *dev, | |||
| 1343 | radeon_connector->dac_load_detect = false; | 1343 | radeon_connector->dac_load_detect = false; |
| 1344 | drm_connector_attach_property(&radeon_connector->base, | 1344 | drm_connector_attach_property(&radeon_connector->base, |
| 1345 | rdev->mode_info.load_detect_property, | 1345 | rdev->mode_info.load_detect_property, |
| 1346 | 1); | 1346 | radeon_connector->dac_load_detect); |
| 1347 | drm_connector_attach_property(&radeon_connector->base, | 1347 | drm_connector_attach_property(&radeon_connector->base, |
| 1348 | rdev->mode_info.tv_std_property, | 1348 | rdev->mode_info.tv_std_property, |
| 1349 | radeon_combios_get_tv_info(rdev)); | 1349 | radeon_combios_get_tv_info(rdev)); |
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index 0e1325e18534..db8e9a355a01 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c | |||
| @@ -308,6 +308,9 @@ int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data, | |||
| 308 | } | 308 | } |
| 309 | robj = gobj->driver_private; | 309 | robj = gobj->driver_private; |
| 310 | r = radeon_bo_wait(robj, NULL, false); | 310 | r = radeon_bo_wait(robj, NULL, false); |
| 311 | /* callback hw specific functions if any */ | ||
| 312 | if (robj->rdev->asic->ioctl_wait_idle) | ||
| 313 | robj->rdev->asic->ioctl_wait_idle(robj->rdev, robj); | ||
| 311 | mutex_lock(&dev->struct_mutex); | 314 | mutex_lock(&dev->struct_mutex); |
| 312 | drm_gem_object_unreference(gobj); | 315 | drm_gem_object_unreference(gobj); |
| 313 | mutex_unlock(&dev->struct_mutex); | 316 | mutex_unlock(&dev->struct_mutex); |
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c index 9f5418983e2a..287fcebfb4e6 100644 --- a/drivers/gpu/drm/radeon/rs400.c +++ b/drivers/gpu/drm/radeon/rs400.c | |||
| @@ -223,15 +223,31 @@ int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) | |||
| 223 | return 0; | 223 | return 0; |
| 224 | } | 224 | } |
| 225 | 225 | ||
| 226 | int rs400_mc_wait_for_idle(struct radeon_device *rdev) | ||
| 227 | { | ||
| 228 | unsigned i; | ||
| 229 | uint32_t tmp; | ||
| 230 | |||
| 231 | for (i = 0; i < rdev->usec_timeout; i++) { | ||
| 232 | /* read MC_STATUS */ | ||
| 233 | tmp = RREG32(0x0150); | ||
| 234 | if (tmp & (1 << 2)) { | ||
| 235 | return 0; | ||
| 236 | } | ||
| 237 | DRM_UDELAY(1); | ||
| 238 | } | ||
| 239 | return -1; | ||
| 240 | } | ||
| 241 | |||
| 226 | void rs400_gpu_init(struct radeon_device *rdev) | 242 | void rs400_gpu_init(struct radeon_device *rdev) |
| 227 | { | 243 | { |
| 228 | /* FIXME: HDP same place on rs400 ? */ | 244 | /* FIXME: HDP same place on rs400 ? */ |
| 229 | r100_hdp_reset(rdev); | 245 | r100_hdp_reset(rdev); |
| 230 | /* FIXME: is this correct ? */ | 246 | /* FIXME: is this correct ? */ |
| 231 | r420_pipes_init(rdev); | 247 | r420_pipes_init(rdev); |
| 232 | if (r300_mc_wait_for_idle(rdev)) { | 248 | if (rs400_mc_wait_for_idle(rdev)) { |
| 233 | printk(KERN_WARNING "Failed to wait MC idle while " | 249 | printk(KERN_WARNING "rs400: Failed to wait MC idle while " |
| 234 | "programming pipes. Bad things might happen.\n"); | 250 | "programming pipes. Bad things might happen. %08x\n", RREG32(0x150)); |
| 235 | } | 251 | } |
| 236 | } | 252 | } |
| 237 | 253 | ||
| @@ -370,8 +386,8 @@ void rs400_mc_program(struct radeon_device *rdev) | |||
| 370 | r100_mc_stop(rdev, &save); | 386 | r100_mc_stop(rdev, &save); |
| 371 | 387 | ||
| 372 | /* Wait for mc idle */ | 388 | /* Wait for mc idle */ |
| 373 | if (r300_mc_wait_for_idle(rdev)) | 389 | if (rs400_mc_wait_for_idle(rdev)) |
| 374 | dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n"); | 390 | dev_warn(rdev->dev, "rs400: Wait MC idle timeout before updating MC.\n"); |
| 375 | WREG32(R_000148_MC_FB_LOCATION, | 391 | WREG32(R_000148_MC_FB_LOCATION, |
| 376 | S_000148_MC_FB_START(rdev->mc.vram_start >> 16) | | 392 | S_000148_MC_FB_START(rdev->mc.vram_start >> 16) | |
| 377 | S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); | 393 | S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); |
| @@ -448,7 +464,6 @@ int rs400_suspend(struct radeon_device *rdev) | |||
| 448 | 464 | ||
| 449 | void rs400_fini(struct radeon_device *rdev) | 465 | void rs400_fini(struct radeon_device *rdev) |
| 450 | { | 466 | { |
| 451 | rs400_suspend(rdev); | ||
| 452 | r100_cp_fini(rdev); | 467 | r100_cp_fini(rdev); |
| 453 | r100_wb_fini(rdev); | 468 | r100_wb_fini(rdev); |
| 454 | r100_ib_fini(rdev); | 469 | r100_ib_fini(rdev); |
| @@ -527,7 +542,6 @@ int rs400_init(struct radeon_device *rdev) | |||
| 527 | if (r) { | 542 | if (r) { |
| 528 | /* Somethings want wront with the accel init stop accel */ | 543 | /* Somethings want wront with the accel init stop accel */ |
| 529 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 544 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 530 | rs400_suspend(rdev); | ||
| 531 | r100_cp_fini(rdev); | 545 | r100_cp_fini(rdev); |
| 532 | r100_wb_fini(rdev); | 546 | r100_wb_fini(rdev); |
| 533 | r100_ib_fini(rdev); | 547 | r100_ib_fini(rdev); |
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index d5255751e7b3..c3818562a13e 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
| @@ -610,7 +610,6 @@ int rs600_suspend(struct radeon_device *rdev) | |||
| 610 | 610 | ||
| 611 | void rs600_fini(struct radeon_device *rdev) | 611 | void rs600_fini(struct radeon_device *rdev) |
| 612 | { | 612 | { |
| 613 | rs600_suspend(rdev); | ||
| 614 | r100_cp_fini(rdev); | 613 | r100_cp_fini(rdev); |
| 615 | r100_wb_fini(rdev); | 614 | r100_wb_fini(rdev); |
| 616 | r100_ib_fini(rdev); | 615 | r100_ib_fini(rdev); |
| @@ -689,7 +688,6 @@ int rs600_init(struct radeon_device *rdev) | |||
| 689 | if (r) { | 688 | if (r) { |
| 690 | /* Somethings want wront with the accel init stop accel */ | 689 | /* Somethings want wront with the accel init stop accel */ |
| 691 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 690 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 692 | rs600_suspend(rdev); | ||
| 693 | r100_cp_fini(rdev); | 691 | r100_cp_fini(rdev); |
| 694 | r100_wb_fini(rdev); | 692 | r100_wb_fini(rdev); |
| 695 | r100_ib_fini(rdev); | 693 | r100_ib_fini(rdev); |
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index cd31da913771..06e2771aee5a 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c | |||
| @@ -676,7 +676,6 @@ int rs690_suspend(struct radeon_device *rdev) | |||
| 676 | 676 | ||
| 677 | void rs690_fini(struct radeon_device *rdev) | 677 | void rs690_fini(struct radeon_device *rdev) |
| 678 | { | 678 | { |
| 679 | rs690_suspend(rdev); | ||
| 680 | r100_cp_fini(rdev); | 679 | r100_cp_fini(rdev); |
| 681 | r100_wb_fini(rdev); | 680 | r100_wb_fini(rdev); |
| 682 | r100_ib_fini(rdev); | 681 | r100_ib_fini(rdev); |
| @@ -756,7 +755,6 @@ int rs690_init(struct radeon_device *rdev) | |||
| 756 | if (r) { | 755 | if (r) { |
| 757 | /* Somethings want wront with the accel init stop accel */ | 756 | /* Somethings want wront with the accel init stop accel */ |
| 758 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 757 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 759 | rs690_suspend(rdev); | ||
| 760 | r100_cp_fini(rdev); | 758 | r100_cp_fini(rdev); |
| 761 | r100_wb_fini(rdev); | 759 | r100_wb_fini(rdev); |
| 762 | r100_ib_fini(rdev); | 760 | r100_ib_fini(rdev); |
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index 62756717b044..0e1e6b8632b8 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c | |||
| @@ -537,7 +537,6 @@ void rv515_set_safe_registers(struct radeon_device *rdev) | |||
| 537 | 537 | ||
| 538 | void rv515_fini(struct radeon_device *rdev) | 538 | void rv515_fini(struct radeon_device *rdev) |
| 539 | { | 539 | { |
| 540 | rv515_suspend(rdev); | ||
| 541 | r100_cp_fini(rdev); | 540 | r100_cp_fini(rdev); |
| 542 | r100_wb_fini(rdev); | 541 | r100_wb_fini(rdev); |
| 543 | r100_ib_fini(rdev); | 542 | r100_ib_fini(rdev); |
| @@ -615,13 +614,12 @@ int rv515_init(struct radeon_device *rdev) | |||
| 615 | if (r) { | 614 | if (r) { |
| 616 | /* Somethings want wront with the accel init stop accel */ | 615 | /* Somethings want wront with the accel init stop accel */ |
| 617 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 616 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 618 | rv515_suspend(rdev); | ||
| 619 | r100_cp_fini(rdev); | 617 | r100_cp_fini(rdev); |
| 620 | r100_wb_fini(rdev); | 618 | r100_wb_fini(rdev); |
| 621 | r100_ib_fini(rdev); | 619 | r100_ib_fini(rdev); |
| 620 | radeon_irq_kms_fini(rdev); | ||
| 622 | rv370_pcie_gart_fini(rdev); | 621 | rv370_pcie_gart_fini(rdev); |
| 623 | radeon_agp_fini(rdev); | 622 | radeon_agp_fini(rdev); |
| 624 | radeon_irq_kms_fini(rdev); | ||
| 625 | rdev->accel_working = false; | 623 | rdev->accel_working = false; |
| 626 | } | 624 | } |
| 627 | return 0; | 625 | return 0; |
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index afd9e8213c29..5943d561fd1e 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
| @@ -887,6 +887,12 @@ static int rv770_startup(struct radeon_device *rdev) | |||
| 887 | return r; | 887 | return r; |
| 888 | } | 888 | } |
| 889 | rv770_gpu_init(rdev); | 889 | rv770_gpu_init(rdev); |
| 890 | r = r600_blit_init(rdev); | ||
| 891 | if (r) { | ||
| 892 | r600_blit_fini(rdev); | ||
| 893 | rdev->asic->copy = NULL; | ||
| 894 | dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); | ||
| 895 | } | ||
| 890 | /* pin copy shader into vram */ | 896 | /* pin copy shader into vram */ |
| 891 | if (rdev->r600_blit.shader_obj) { | 897 | if (rdev->r600_blit.shader_obj) { |
| 892 | r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); | 898 | r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); |
| @@ -1055,19 +1061,15 @@ int rv770_init(struct radeon_device *rdev) | |||
| 1055 | r = r600_pcie_gart_init(rdev); | 1061 | r = r600_pcie_gart_init(rdev); |
| 1056 | if (r) | 1062 | if (r) |
| 1057 | return r; | 1063 | return r; |
| 1058 | r = r600_blit_init(rdev); | ||
| 1059 | if (r) { | ||
| 1060 | r600_blit_fini(rdev); | ||
| 1061 | rdev->asic->copy = NULL; | ||
| 1062 | dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); | ||
| 1063 | } | ||
| 1064 | 1064 | ||
| 1065 | rdev->accel_working = true; | 1065 | rdev->accel_working = true; |
| 1066 | r = rv770_startup(rdev); | 1066 | r = rv770_startup(rdev); |
| 1067 | if (r) { | 1067 | if (r) { |
| 1068 | rv770_suspend(rdev); | 1068 | dev_err(rdev->dev, "disabling GPU acceleration\n"); |
| 1069 | r600_cp_fini(rdev); | ||
| 1069 | r600_wb_fini(rdev); | 1070 | r600_wb_fini(rdev); |
| 1070 | radeon_ring_fini(rdev); | 1071 | r600_irq_fini(rdev); |
| 1072 | radeon_irq_kms_fini(rdev); | ||
| 1071 | rv770_pcie_gart_fini(rdev); | 1073 | rv770_pcie_gart_fini(rdev); |
| 1072 | rdev->accel_working = false; | 1074 | rdev->accel_working = false; |
| 1073 | } | 1075 | } |
| @@ -1089,13 +1091,11 @@ int rv770_init(struct radeon_device *rdev) | |||
| 1089 | 1091 | ||
| 1090 | void rv770_fini(struct radeon_device *rdev) | 1092 | void rv770_fini(struct radeon_device *rdev) |
| 1091 | { | 1093 | { |
| 1092 | rv770_suspend(rdev); | ||
| 1093 | |||
| 1094 | r600_blit_fini(rdev); | 1094 | r600_blit_fini(rdev); |
| 1095 | r600_cp_fini(rdev); | ||
| 1096 | r600_wb_fini(rdev); | ||
| 1095 | r600_irq_fini(rdev); | 1097 | r600_irq_fini(rdev); |
| 1096 | radeon_irq_kms_fini(rdev); | 1098 | radeon_irq_kms_fini(rdev); |
| 1097 | radeon_ring_fini(rdev); | ||
| 1098 | r600_wb_fini(rdev); | ||
| 1099 | rv770_pcie_gart_fini(rdev); | 1099 | rv770_pcie_gart_fini(rdev); |
| 1100 | radeon_gem_fini(rdev); | 1100 | radeon_gem_fini(rdev); |
| 1101 | radeon_fence_driver_fini(rdev); | 1101 | radeon_fence_driver_fini(rdev); |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index c74694345b6e..d58b94030ef3 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
| @@ -338,6 +338,23 @@ static void __devinit quirk_s3_64M(struct pci_dev *dev) | |||
| 338 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_868, quirk_s3_64M); | 338 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_868, quirk_s3_64M); |
| 339 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_968, quirk_s3_64M); | 339 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_968, quirk_s3_64M); |
| 340 | 340 | ||
| 341 | /* | ||
| 342 | * Some CS5536 BIOSes (for example, the Soekris NET5501 board w/ comBIOS | ||
| 343 | * ver. 1.33 20070103) don't set the correct ISA PCI region header info. | ||
| 344 | * BAR0 should be 8 bytes; instead, it may be set to something like 8k | ||
| 345 | * (which conflicts w/ BAR1's memory range). | ||
| 346 | */ | ||
| 347 | static void __devinit quirk_cs5536_vsa(struct pci_dev *dev) | ||
| 348 | { | ||
| 349 | if (pci_resource_len(dev, 0) != 8) { | ||
| 350 | struct resource *res = &dev->resource[0]; | ||
| 351 | res->end = res->start + 8 - 1; | ||
| 352 | dev_info(&dev->dev, "CS5536 ISA bridge bug detected " | ||
| 353 | "(incorrect header); workaround applied.\n"); | ||
| 354 | } | ||
| 355 | } | ||
| 356 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA, quirk_cs5536_vsa); | ||
| 357 | |||
| 341 | static void __devinit quirk_io_region(struct pci_dev *dev, unsigned region, | 358 | static void __devinit quirk_io_region(struct pci_dev *dev, unsigned region, |
| 342 | unsigned size, int nr, const char *name) | 359 | unsigned size, int nr, const char *name) |
| 343 | { | 360 | { |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 87b25543d7d1..2b59201b955c 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
| @@ -1982,7 +1982,12 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
| 1982 | 1982 | ||
| 1983 | if (!(sb->s_flags & MS_RDONLY)) { | 1983 | if (!(sb->s_flags & MS_RDONLY)) { |
| 1984 | ret = btrfs_recover_relocation(tree_root); | 1984 | ret = btrfs_recover_relocation(tree_root); |
| 1985 | BUG_ON(ret); | 1985 | if (ret < 0) { |
| 1986 | printk(KERN_WARNING | ||
| 1987 | "btrfs: failed to recover relocation\n"); | ||
| 1988 | err = -EINVAL; | ||
| 1989 | goto fail_trans_kthread; | ||
| 1990 | } | ||
| 1986 | } | 1991 | } |
| 1987 | 1992 | ||
| 1988 | location.objectid = BTRFS_FS_TREE_OBJECTID; | 1993 | location.objectid = BTRFS_FS_TREE_OBJECTID; |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 432a2da4641e..559f72489b3b 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -5402,10 +5402,6 @@ static noinline int walk_down_tree(struct btrfs_trans_handle *trans, | |||
| 5402 | int ret; | 5402 | int ret; |
| 5403 | 5403 | ||
| 5404 | while (level >= 0) { | 5404 | while (level >= 0) { |
| 5405 | if (path->slots[level] >= | ||
| 5406 | btrfs_header_nritems(path->nodes[level])) | ||
| 5407 | break; | ||
| 5408 | |||
| 5409 | ret = walk_down_proc(trans, root, path, wc, lookup_info); | 5405 | ret = walk_down_proc(trans, root, path, wc, lookup_info); |
| 5410 | if (ret > 0) | 5406 | if (ret > 0) |
| 5411 | break; | 5407 | break; |
| @@ -5413,6 +5409,10 @@ static noinline int walk_down_tree(struct btrfs_trans_handle *trans, | |||
| 5413 | if (level == 0) | 5409 | if (level == 0) |
| 5414 | break; | 5410 | break; |
| 5415 | 5411 | ||
| 5412 | if (path->slots[level] >= | ||
| 5413 | btrfs_header_nritems(path->nodes[level])) | ||
| 5414 | break; | ||
| 5415 | |||
| 5416 | ret = do_walk_down(trans, root, path, wc, &lookup_info); | 5416 | ret = do_walk_down(trans, root, path, wc, &lookup_info); |
| 5417 | if (ret > 0) { | 5417 | if (ret > 0) { |
| 5418 | path->slots[level]++; | 5418 | path->slots[level]++; |
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 96577e8bf9fd..b177ed319612 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
| @@ -3165,10 +3165,9 @@ struct extent_buffer *alloc_extent_buffer(struct extent_io_tree *tree, | |||
| 3165 | spin_unlock(&tree->buffer_lock); | 3165 | spin_unlock(&tree->buffer_lock); |
| 3166 | goto free_eb; | 3166 | goto free_eb; |
| 3167 | } | 3167 | } |
| 3168 | spin_unlock(&tree->buffer_lock); | ||
| 3169 | |||
| 3170 | /* add one reference for the tree */ | 3168 | /* add one reference for the tree */ |
| 3171 | atomic_inc(&eb->refs); | 3169 | atomic_inc(&eb->refs); |
| 3170 | spin_unlock(&tree->buffer_lock); | ||
| 3172 | return eb; | 3171 | return eb; |
| 3173 | 3172 | ||
| 3174 | free_eb: | 3173 | free_eb: |
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index c02033596f02..9d0809629967 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
| @@ -1133,7 +1133,7 @@ int btrfs_sync_file(struct file *file, struct dentry *dentry, int datasync) | |||
| 1133 | } | 1133 | } |
| 1134 | mutex_lock(&dentry->d_inode->i_mutex); | 1134 | mutex_lock(&dentry->d_inode->i_mutex); |
| 1135 | out: | 1135 | out: |
| 1136 | return ret > 0 ? EIO : ret; | 1136 | return ret > 0 ? -EIO : ret; |
| 1137 | } | 1137 | } |
| 1138 | 1138 | ||
| 1139 | static const struct vm_operations_struct btrfs_file_vm_ops = { | 1139 | static const struct vm_operations_struct btrfs_file_vm_ops = { |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 8cd109972fa6..4deb280f8969 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -1681,24 +1681,6 @@ static int insert_reserved_file_extent(struct btrfs_trans_handle *trans, | |||
| 1681 | * before we start the transaction. It limits the amount of btree | 1681 | * before we start the transaction. It limits the amount of btree |
| 1682 | * reads required while inside the transaction. | 1682 | * reads required while inside the transaction. |
| 1683 | */ | 1683 | */ |
| 1684 | static noinline void reada_csum(struct btrfs_root *root, | ||
| 1685 | struct btrfs_path *path, | ||
| 1686 | struct btrfs_ordered_extent *ordered_extent) | ||
| 1687 | { | ||
| 1688 | struct btrfs_ordered_sum *sum; | ||
| 1689 | u64 bytenr; | ||
| 1690 | |||
| 1691 | sum = list_entry(ordered_extent->list.next, struct btrfs_ordered_sum, | ||
| 1692 | list); | ||
| 1693 | bytenr = sum->sums[0].bytenr; | ||
| 1694 | |||
| 1695 | /* | ||
| 1696 | * we don't care about the results, the point of this search is | ||
| 1697 | * just to get the btree leaves into ram | ||
| 1698 | */ | ||
| 1699 | btrfs_lookup_csum(NULL, root->fs_info->csum_root, path, bytenr, 0); | ||
| 1700 | } | ||
| 1701 | |||
| 1702 | /* as ordered data IO finishes, this gets called so we can finish | 1684 | /* as ordered data IO finishes, this gets called so we can finish |
| 1703 | * an ordered extent if the range of bytes in the file it covers are | 1685 | * an ordered extent if the range of bytes in the file it covers are |
| 1704 | * fully written. | 1686 | * fully written. |
| @@ -1709,7 +1691,6 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
| 1709 | struct btrfs_trans_handle *trans; | 1691 | struct btrfs_trans_handle *trans; |
| 1710 | struct btrfs_ordered_extent *ordered_extent = NULL; | 1692 | struct btrfs_ordered_extent *ordered_extent = NULL; |
| 1711 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; | 1693 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; |
| 1712 | struct btrfs_path *path; | ||
| 1713 | int compressed = 0; | 1694 | int compressed = 0; |
| 1714 | int ret; | 1695 | int ret; |
| 1715 | 1696 | ||
| @@ -1717,32 +1698,9 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
| 1717 | if (!ret) | 1698 | if (!ret) |
| 1718 | return 0; | 1699 | return 0; |
| 1719 | 1700 | ||
| 1720 | /* | 1701 | ordered_extent = btrfs_lookup_ordered_extent(inode, start); |
| 1721 | * before we join the transaction, try to do some of our IO. | ||
| 1722 | * This will limit the amount of IO that we have to do with | ||
| 1723 | * the transaction running. We're unlikely to need to do any | ||
| 1724 | * IO if the file extents are new, the disk_i_size checks | ||
| 1725 | * covers the most common case. | ||
| 1726 | */ | ||
| 1727 | if (start < BTRFS_I(inode)->disk_i_size) { | ||
| 1728 | path = btrfs_alloc_path(); | ||
| 1729 | if (path) { | ||
| 1730 | ret = btrfs_lookup_file_extent(NULL, root, path, | ||
| 1731 | inode->i_ino, | ||
| 1732 | start, 0); | ||
| 1733 | ordered_extent = btrfs_lookup_ordered_extent(inode, | ||
| 1734 | start); | ||
| 1735 | if (!list_empty(&ordered_extent->list)) { | ||
| 1736 | btrfs_release_path(root, path); | ||
| 1737 | reada_csum(root, path, ordered_extent); | ||
| 1738 | } | ||
| 1739 | btrfs_free_path(path); | ||
| 1740 | } | ||
| 1741 | } | ||
| 1742 | |||
| 1743 | if (!ordered_extent) | ||
| 1744 | ordered_extent = btrfs_lookup_ordered_extent(inode, start); | ||
| 1745 | BUG_ON(!ordered_extent); | 1702 | BUG_ON(!ordered_extent); |
| 1703 | |||
| 1746 | if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) { | 1704 | if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) { |
| 1747 | BUG_ON(!list_empty(&ordered_extent->list)); | 1705 | BUG_ON(!list_empty(&ordered_extent->list)); |
| 1748 | ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); | 1706 | ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); |
| @@ -5841,7 +5799,9 @@ static int prealloc_file_range(struct inode *inode, u64 start, u64 end, | |||
| 5841 | inode->i_ctime = CURRENT_TIME; | 5799 | inode->i_ctime = CURRENT_TIME; |
| 5842 | BTRFS_I(inode)->flags |= BTRFS_INODE_PREALLOC; | 5800 | BTRFS_I(inode)->flags |= BTRFS_INODE_PREALLOC; |
| 5843 | if (!(mode & FALLOC_FL_KEEP_SIZE) && | 5801 | if (!(mode & FALLOC_FL_KEEP_SIZE) && |
| 5844 | cur_offset > inode->i_size) { | 5802 | (actual_len > inode->i_size) && |
| 5803 | (cur_offset > inode->i_size)) { | ||
| 5804 | |||
| 5845 | if (cur_offset > actual_len) | 5805 | if (cur_offset > actual_len) |
| 5846 | i_size = actual_len; | 5806 | i_size = actual_len; |
| 5847 | else | 5807 | else |
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index ed3e4a2ec2c8..ab7ab5318745 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c | |||
| @@ -3764,7 +3764,8 @@ out: | |||
| 3764 | BTRFS_DATA_RELOC_TREE_OBJECTID); | 3764 | BTRFS_DATA_RELOC_TREE_OBJECTID); |
| 3765 | if (IS_ERR(fs_root)) | 3765 | if (IS_ERR(fs_root)) |
| 3766 | err = PTR_ERR(fs_root); | 3766 | err = PTR_ERR(fs_root); |
| 3767 | btrfs_orphan_cleanup(fs_root); | 3767 | else |
| 3768 | btrfs_orphan_cleanup(fs_root); | ||
| 3768 | } | 3769 | } |
| 3769 | return err; | 3770 | return err; |
| 3770 | } | 3771 | } |
diff --git a/include/linux/ata.h b/include/linux/ata.h index 38a6948ce0c2..20f31567ccee 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
| @@ -647,9 +647,9 @@ static inline int ata_id_has_large_logical_sectors(const u16 *id) | |||
| 647 | return id[ATA_ID_SECTOR_SIZE] & (1 << 13); | 647 | return id[ATA_ID_SECTOR_SIZE] & (1 << 13); |
| 648 | } | 648 | } |
| 649 | 649 | ||
| 650 | static inline u8 ata_id_logical_per_physical_sectors(const u16 *id) | 650 | static inline u16 ata_id_logical_per_physical_sectors(const u16 *id) |
| 651 | { | 651 | { |
| 652 | return id[ATA_ID_SECTOR_SIZE] & 0xf; | 652 | return 1 << (id[ATA_ID_SECTOR_SIZE] & 0xf); |
| 653 | } | 653 | } |
| 654 | 654 | ||
| 655 | static inline int ata_id_has_lba48(const u16 *id) | 655 | static inline int ata_id_has_lba48(const u16 *id) |
diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 5be3dab4a695..188fcae10a99 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | # define __acquire(x) __context__(x,1) | 15 | # define __acquire(x) __context__(x,1) |
| 16 | # define __release(x) __context__(x,-1) | 16 | # define __release(x) __context__(x,-1) |
| 17 | # define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0) | 17 | # define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0) |
| 18 | # define __percpu __attribute__((noderef, address_space(3))) | ||
| 18 | extern void __chk_user_ptr(const volatile void __user *); | 19 | extern void __chk_user_ptr(const volatile void __user *); |
| 19 | extern void __chk_io_ptr(const volatile void __iomem *); | 20 | extern void __chk_io_ptr(const volatile void __iomem *); |
| 20 | #else | 21 | #else |
| @@ -32,6 +33,7 @@ extern void __chk_io_ptr(const volatile void __iomem *); | |||
| 32 | # define __acquire(x) (void)0 | 33 | # define __acquire(x) (void)0 |
| 33 | # define __release(x) (void)0 | 34 | # define __release(x) (void)0 |
| 34 | # define __cond_lock(x,c) (c) | 35 | # define __cond_lock(x,c) (c) |
| 36 | # define __percpu | ||
| 35 | #endif | 37 | #endif |
| 36 | 38 | ||
| 37 | #ifdef __KERNEL__ | 39 | #ifdef __KERNEL__ |
diff --git a/mm/migrate.c b/mm/migrate.c index efddbf0926b2..9a0db5bbabe4 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
| @@ -912,6 +912,9 @@ static int do_pages_move(struct mm_struct *mm, struct task_struct *task, | |||
| 912 | goto out_pm; | 912 | goto out_pm; |
| 913 | 913 | ||
| 914 | err = -ENODEV; | 914 | err = -ENODEV; |
| 915 | if (node < 0 || node >= MAX_NUMNODES) | ||
| 916 | goto out_pm; | ||
| 917 | |||
| 915 | if (!node_state(node, N_HIGH_MEMORY)) | 918 | if (!node_state(node, N_HIGH_MEMORY)) |
| 916 | goto out_pm; | 919 | goto out_pm; |
| 917 | 920 | ||
diff --git a/sound/pci/ctxfi/ctatc.c b/sound/pci/ctxfi/ctatc.c index cb65bd0dd35b..459c1f62783b 100644 --- a/sound/pci/ctxfi/ctatc.c +++ b/sound/pci/ctxfi/ctatc.c | |||
| @@ -166,18 +166,7 @@ static void ct_unmap_audio_buffer(struct ct_atc *atc, struct ct_atc_pcm *apcm) | |||
| 166 | 166 | ||
| 167 | static unsigned long atc_get_ptp_phys(struct ct_atc *atc, int index) | 167 | static unsigned long atc_get_ptp_phys(struct ct_atc *atc, int index) |
| 168 | { | 168 | { |
| 169 | struct ct_vm *vm; | 169 | return atc->vm->get_ptp_phys(atc->vm, index); |
| 170 | void *kvirt_addr; | ||
| 171 | unsigned long phys_addr; | ||
| 172 | |||
| 173 | vm = atc->vm; | ||
| 174 | kvirt_addr = vm->get_ptp_virt(vm, index); | ||
| 175 | if (kvirt_addr == NULL) | ||
| 176 | phys_addr = (~0UL); | ||
| 177 | else | ||
| 178 | phys_addr = virt_to_phys(kvirt_addr); | ||
| 179 | |||
| 180 | return phys_addr; | ||
| 181 | } | 170 | } |
| 182 | 171 | ||
| 183 | static unsigned int convert_format(snd_pcm_format_t snd_format) | 172 | static unsigned int convert_format(snd_pcm_format_t snd_format) |
| @@ -1669,7 +1658,7 @@ int __devinit ct_atc_create(struct snd_card *card, struct pci_dev *pci, | |||
| 1669 | } | 1658 | } |
| 1670 | 1659 | ||
| 1671 | /* Set up device virtual memory management object */ | 1660 | /* Set up device virtual memory management object */ |
| 1672 | err = ct_vm_create(&atc->vm); | 1661 | err = ct_vm_create(&atc->vm, pci); |
| 1673 | if (err < 0) | 1662 | if (err < 0) |
| 1674 | goto error1; | 1663 | goto error1; |
| 1675 | 1664 | ||
diff --git a/sound/pci/ctxfi/ctvmem.c b/sound/pci/ctxfi/ctvmem.c index 6b78752e9503..65da6e466f80 100644 --- a/sound/pci/ctxfi/ctvmem.c +++ b/sound/pci/ctxfi/ctvmem.c | |||
| @@ -138,7 +138,7 @@ ct_vm_map(struct ct_vm *vm, struct snd_pcm_substream *substream, int size) | |||
| 138 | return NULL; | 138 | return NULL; |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | ptp = vm->ptp[0]; | 141 | ptp = (unsigned long *)vm->ptp[0].area; |
| 142 | pte_start = (block->addr >> CT_PAGE_SHIFT); | 142 | pte_start = (block->addr >> CT_PAGE_SHIFT); |
| 143 | pages = block->size >> CT_PAGE_SHIFT; | 143 | pages = block->size >> CT_PAGE_SHIFT; |
| 144 | for (i = 0; i < pages; i++) { | 144 | for (i = 0; i < pages; i++) { |
| @@ -158,25 +158,25 @@ static void ct_vm_unmap(struct ct_vm *vm, struct ct_vm_block *block) | |||
| 158 | } | 158 | } |
| 159 | 159 | ||
| 160 | /* * | 160 | /* * |
| 161 | * return the host (kmalloced) addr of the @index-th device | 161 | * return the host physical addr of the @index-th device |
| 162 | * page talbe page on success, or NULL on failure. | 162 | * page table page on success, or ~0UL on failure. |
| 163 | * The first returned NULL indicates the termination. | 163 | * The first returned ~0UL indicates the termination. |
| 164 | * */ | 164 | * */ |
| 165 | static void * | 165 | static dma_addr_t |
| 166 | ct_get_ptp_virt(struct ct_vm *vm, int index) | 166 | ct_get_ptp_phys(struct ct_vm *vm, int index) |
| 167 | { | 167 | { |
| 168 | void *addr; | 168 | dma_addr_t addr; |
| 169 | 169 | ||
| 170 | addr = (index >= CT_PTP_NUM) ? NULL : vm->ptp[index]; | 170 | addr = (index >= CT_PTP_NUM) ? ~0UL : vm->ptp[index].addr; |
| 171 | 171 | ||
| 172 | return addr; | 172 | return addr; |
| 173 | } | 173 | } |
| 174 | 174 | ||
| 175 | int ct_vm_create(struct ct_vm **rvm) | 175 | int ct_vm_create(struct ct_vm **rvm, struct pci_dev *pci) |
| 176 | { | 176 | { |
| 177 | struct ct_vm *vm; | 177 | struct ct_vm *vm; |
| 178 | struct ct_vm_block *block; | 178 | struct ct_vm_block *block; |
| 179 | int i; | 179 | int i, err = 0; |
| 180 | 180 | ||
| 181 | *rvm = NULL; | 181 | *rvm = NULL; |
| 182 | 182 | ||
| @@ -188,23 +188,21 @@ int ct_vm_create(struct ct_vm **rvm) | |||
| 188 | 188 | ||
| 189 | /* Allocate page table pages */ | 189 | /* Allocate page table pages */ |
| 190 | for (i = 0; i < CT_PTP_NUM; i++) { | 190 | for (i = 0; i < CT_PTP_NUM; i++) { |
| 191 | vm->ptp[i] = kmalloc(PAGE_SIZE, GFP_KERNEL); | 191 | err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, |
| 192 | if (!vm->ptp[i]) | 192 | snd_dma_pci_data(pci), |
| 193 | PAGE_SIZE, &vm->ptp[i]); | ||
| 194 | if (err < 0) | ||
| 193 | break; | 195 | break; |
| 194 | } | 196 | } |
| 195 | if (!i) { | 197 | if (err < 0) { |
| 196 | /* no page table pages are allocated */ | 198 | /* no page table pages are allocated */ |
| 197 | kfree(vm); | 199 | ct_vm_destroy(vm); |
| 198 | return -ENOMEM; | 200 | return -ENOMEM; |
| 199 | } | 201 | } |
| 200 | vm->size = CT_ADDRS_PER_PAGE * i; | 202 | vm->size = CT_ADDRS_PER_PAGE * i; |
| 201 | /* Initialise remaining ptps */ | ||
| 202 | for (; i < CT_PTP_NUM; i++) | ||
| 203 | vm->ptp[i] = NULL; | ||
| 204 | |||
| 205 | vm->map = ct_vm_map; | 203 | vm->map = ct_vm_map; |
| 206 | vm->unmap = ct_vm_unmap; | 204 | vm->unmap = ct_vm_unmap; |
| 207 | vm->get_ptp_virt = ct_get_ptp_virt; | 205 | vm->get_ptp_phys = ct_get_ptp_phys; |
| 208 | INIT_LIST_HEAD(&vm->unused); | 206 | INIT_LIST_HEAD(&vm->unused); |
| 209 | INIT_LIST_HEAD(&vm->used); | 207 | INIT_LIST_HEAD(&vm->used); |
| 210 | block = kzalloc(sizeof(*block), GFP_KERNEL); | 208 | block = kzalloc(sizeof(*block), GFP_KERNEL); |
| @@ -242,7 +240,7 @@ void ct_vm_destroy(struct ct_vm *vm) | |||
| 242 | 240 | ||
| 243 | /* free allocated page table pages */ | 241 | /* free allocated page table pages */ |
| 244 | for (i = 0; i < CT_PTP_NUM; i++) | 242 | for (i = 0; i < CT_PTP_NUM; i++) |
| 245 | kfree(vm->ptp[i]); | 243 | snd_dma_free_pages(&vm->ptp[i]); |
| 246 | 244 | ||
| 247 | vm->size = 0; | 245 | vm->size = 0; |
| 248 | 246 | ||
diff --git a/sound/pci/ctxfi/ctvmem.h b/sound/pci/ctxfi/ctvmem.h index 01e4fd0386a3..b23adfca4de6 100644 --- a/sound/pci/ctxfi/ctvmem.h +++ b/sound/pci/ctxfi/ctvmem.h | |||
| @@ -22,6 +22,8 @@ | |||
| 22 | 22 | ||
| 23 | #include <linux/mutex.h> | 23 | #include <linux/mutex.h> |
| 24 | #include <linux/list.h> | 24 | #include <linux/list.h> |
| 25 | #include <linux/pci.h> | ||
| 26 | #include <sound/memalloc.h> | ||
| 25 | 27 | ||
| 26 | /* The chip can handle the page table of 4k pages | 28 | /* The chip can handle the page table of 4k pages |
| 27 | * (emu20k1 can handle even 8k pages, but we don't use it right now) | 29 | * (emu20k1 can handle even 8k pages, but we don't use it right now) |
| @@ -41,7 +43,7 @@ struct snd_pcm_substream; | |||
| 41 | 43 | ||
| 42 | /* Virtual memory management object for card device */ | 44 | /* Virtual memory management object for card device */ |
| 43 | struct ct_vm { | 45 | struct ct_vm { |
| 44 | void *ptp[CT_PTP_NUM]; /* Device page table pages */ | 46 | struct snd_dma_buffer ptp[CT_PTP_NUM]; /* Device page table pages */ |
| 45 | unsigned int size; /* Available addr space in bytes */ | 47 | unsigned int size; /* Available addr space in bytes */ |
| 46 | struct list_head unused; /* List of unused blocks */ | 48 | struct list_head unused; /* List of unused blocks */ |
| 47 | struct list_head used; /* List of used blocks */ | 49 | struct list_head used; /* List of used blocks */ |
| @@ -52,10 +54,10 @@ struct ct_vm { | |||
| 52 | int size); | 54 | int size); |
| 53 | /* Unmap device logical addr area. */ | 55 | /* Unmap device logical addr area. */ |
| 54 | void (*unmap)(struct ct_vm *, struct ct_vm_block *block); | 56 | void (*unmap)(struct ct_vm *, struct ct_vm_block *block); |
| 55 | void *(*get_ptp_virt)(struct ct_vm *vm, int index); | 57 | dma_addr_t (*get_ptp_phys)(struct ct_vm *vm, int index); |
| 56 | }; | 58 | }; |
| 57 | 59 | ||
| 58 | int ct_vm_create(struct ct_vm **rvm); | 60 | int ct_vm_create(struct ct_vm **rvm, struct pci_dev *pci); |
| 59 | void ct_vm_destroy(struct ct_vm *vm); | 61 | void ct_vm_destroy(struct ct_vm *vm); |
| 60 | 62 | ||
| 61 | #endif /* CTVMEM_H */ | 63 | #endif /* CTVMEM_H */ |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 565de38a3fc7..b8faa6dc5abe 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
| @@ -426,6 +426,7 @@ struct azx { | |||
| 426 | 426 | ||
| 427 | /* flags */ | 427 | /* flags */ |
| 428 | int position_fix; | 428 | int position_fix; |
| 429 | int poll_count; | ||
| 429 | unsigned int running :1; | 430 | unsigned int running :1; |
| 430 | unsigned int initialized :1; | 431 | unsigned int initialized :1; |
| 431 | unsigned int single_cmd :1; | 432 | unsigned int single_cmd :1; |
| @@ -506,7 +507,7 @@ static char *driver_short_names[] __devinitdata = { | |||
| 506 | #define get_azx_dev(substream) (substream->runtime->private_data) | 507 | #define get_azx_dev(substream) (substream->runtime->private_data) |
| 507 | 508 | ||
| 508 | static int azx_acquire_irq(struct azx *chip, int do_disconnect); | 509 | static int azx_acquire_irq(struct azx *chip, int do_disconnect); |
| 509 | 510 | static int azx_send_cmd(struct hda_bus *bus, unsigned int val); | |
| 510 | /* | 511 | /* |
| 511 | * Interface for HD codec | 512 | * Interface for HD codec |
| 512 | */ | 513 | */ |
| @@ -664,11 +665,12 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus, | |||
| 664 | { | 665 | { |
| 665 | struct azx *chip = bus->private_data; | 666 | struct azx *chip = bus->private_data; |
| 666 | unsigned long timeout; | 667 | unsigned long timeout; |
| 668 | int do_poll = 0; | ||
| 667 | 669 | ||
| 668 | again: | 670 | again: |
| 669 | timeout = jiffies + msecs_to_jiffies(1000); | 671 | timeout = jiffies + msecs_to_jiffies(1000); |
| 670 | for (;;) { | 672 | for (;;) { |
| 671 | if (chip->polling_mode) { | 673 | if (chip->polling_mode || do_poll) { |
| 672 | spin_lock_irq(&chip->reg_lock); | 674 | spin_lock_irq(&chip->reg_lock); |
| 673 | azx_update_rirb(chip); | 675 | azx_update_rirb(chip); |
| 674 | spin_unlock_irq(&chip->reg_lock); | 676 | spin_unlock_irq(&chip->reg_lock); |
| @@ -676,6 +678,9 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus, | |||
| 676 | if (!chip->rirb.cmds[addr]) { | 678 | if (!chip->rirb.cmds[addr]) { |
| 677 | smp_rmb(); | 679 | smp_rmb(); |
| 678 | bus->rirb_error = 0; | 680 | bus->rirb_error = 0; |
| 681 | |||
| 682 | if (!do_poll) | ||
| 683 | chip->poll_count = 0; | ||
| 679 | return chip->rirb.res[addr]; /* the last value */ | 684 | return chip->rirb.res[addr]; /* the last value */ |
| 680 | } | 685 | } |
| 681 | if (time_after(jiffies, timeout)) | 686 | if (time_after(jiffies, timeout)) |
| @@ -688,6 +693,16 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus, | |||
| 688 | } | 693 | } |
| 689 | } | 694 | } |
| 690 | 695 | ||
| 696 | if (!chip->polling_mode && chip->poll_count < 2) { | ||
| 697 | snd_printdd(SFX "azx_get_response timeout, " | ||
| 698 | "polling the codec once: last cmd=0x%08x\n", | ||
| 699 | chip->last_cmd[addr]); | ||
| 700 | do_poll = 1; | ||
| 701 | chip->poll_count++; | ||
| 702 | goto again; | ||
| 703 | } | ||
| 704 | |||
| 705 | |||
| 691 | if (!chip->polling_mode) { | 706 | if (!chip->polling_mode) { |
| 692 | snd_printk(KERN_WARNING SFX "azx_get_response timeout, " | 707 | snd_printk(KERN_WARNING SFX "azx_get_response timeout, " |
| 693 | "switching to polling mode: last cmd=0x%08x\n", | 708 | "switching to polling mode: last cmd=0x%08x\n", |
| @@ -2043,7 +2058,7 @@ static int azx_acquire_irq(struct azx *chip, int do_disconnect) | |||
| 2043 | { | 2058 | { |
| 2044 | if (request_irq(chip->pci->irq, azx_interrupt, | 2059 | if (request_irq(chip->pci->irq, azx_interrupt, |
| 2045 | chip->msi ? 0 : IRQF_SHARED, | 2060 | chip->msi ? 0 : IRQF_SHARED, |
| 2046 | "HDA Intel", chip)) { | 2061 | "hda_intel", chip)) { |
| 2047 | printk(KERN_ERR "hda-intel: unable to grab IRQ %d, " | 2062 | printk(KERN_ERR "hda-intel: unable to grab IRQ %d, " |
| 2048 | "disabling device\n", chip->pci->irq); | 2063 | "disabling device\n", chip->pci->irq); |
| 2049 | if (do_disconnect) | 2064 | if (do_disconnect) |
diff --git a/sound/pci/ice1712/aureon.c b/sound/pci/ice1712/aureon.c index 765d7bd4c3d4..9e66f6d306f8 100644 --- a/sound/pci/ice1712/aureon.c +++ b/sound/pci/ice1712/aureon.c | |||
| @@ -703,11 +703,13 @@ static void wm_set_vol(struct snd_ice1712 *ice, unsigned int index, unsigned sho | |||
| 703 | { | 703 | { |
| 704 | unsigned char nvol; | 704 | unsigned char nvol; |
| 705 | 705 | ||
| 706 | if ((master & WM_VOL_MUTE) || (vol & WM_VOL_MUTE)) | 706 | if ((master & WM_VOL_MUTE) || (vol & WM_VOL_MUTE)) { |
| 707 | nvol = 0; | 707 | nvol = 0; |
| 708 | else | 708 | } else { |
| 709 | nvol = ((vol % WM_VOL_CNT) * (master % WM_VOL_CNT)) / | 709 | nvol = ((vol % WM_VOL_CNT) * (master % WM_VOL_CNT)) / |
| 710 | WM_VOL_MAX; | 710 | WM_VOL_MAX; |
| 711 | nvol += 0x1b; | ||
| 712 | } | ||
| 711 | 713 | ||
| 712 | wm_put(ice, index, nvol); | 714 | wm_put(ice, index, nvol); |
| 713 | wm_put_nocache(ice, index, 0x180 | nvol); | 715 | wm_put_nocache(ice, index, 0x180 | nvol); |
| @@ -778,7 +780,7 @@ static int wm_master_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_ | |||
| 778 | for (ch = 0; ch < 2; ch++) { | 780 | for (ch = 0; ch < 2; ch++) { |
| 779 | unsigned int vol = ucontrol->value.integer.value[ch]; | 781 | unsigned int vol = ucontrol->value.integer.value[ch]; |
| 780 | if (vol > WM_VOL_MAX) | 782 | if (vol > WM_VOL_MAX) |
| 781 | continue; | 783 | vol = WM_VOL_MAX; |
| 782 | vol |= spec->master[ch] & WM_VOL_MUTE; | 784 | vol |= spec->master[ch] & WM_VOL_MUTE; |
| 783 | if (vol != spec->master[ch]) { | 785 | if (vol != spec->master[ch]) { |
| 784 | int dac; | 786 | int dac; |
| @@ -834,8 +836,8 @@ static int wm_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value * | |||
| 834 | for (i = 0; i < voices; i++) { | 836 | for (i = 0; i < voices; i++) { |
| 835 | unsigned int vol = ucontrol->value.integer.value[i]; | 837 | unsigned int vol = ucontrol->value.integer.value[i]; |
| 836 | if (vol > WM_VOL_MAX) | 838 | if (vol > WM_VOL_MAX) |
| 837 | continue; | 839 | vol = WM_VOL_MAX; |
| 838 | vol |= spec->vol[ofs+i]; | 840 | vol |= spec->vol[ofs+i] & WM_VOL_MUTE; |
| 839 | if (vol != spec->vol[ofs+i]) { | 841 | if (vol != spec->vol[ofs+i]) { |
| 840 | spec->vol[ofs+i] = vol; | 842 | spec->vol[ofs+i] = vol; |
| 841 | idx = WM_DAC_ATTEN + ofs + i; | 843 | idx = WM_DAC_ATTEN + ofs + i; |
diff --git a/sound/soc/omap/omap3pandora.c b/sound/soc/omap/omap3pandora.c index 71b2c161158d..68980c19a3bc 100644 --- a/sound/soc/omap/omap3pandora.c +++ b/sound/soc/omap/omap3pandora.c | |||
| @@ -145,6 +145,7 @@ static const struct snd_soc_dapm_widget omap3pandora_in_dapm_widgets[] = { | |||
| 145 | }; | 145 | }; |
| 146 | 146 | ||
| 147 | static const struct snd_soc_dapm_route omap3pandora_out_map[] = { | 147 | static const struct snd_soc_dapm_route omap3pandora_out_map[] = { |
| 148 | {"PCM DAC", NULL, "APLL Enable"}, | ||
| 148 | {"Headphone Amplifier", NULL, "PCM DAC"}, | 149 | {"Headphone Amplifier", NULL, "PCM DAC"}, |
| 149 | {"Line Out", NULL, "PCM DAC"}, | 150 | {"Line Out", NULL, "PCM DAC"}, |
| 150 | {"Headphone Jack", NULL, "Headphone Amplifier"}, | 151 | {"Headphone Jack", NULL, "Headphone Amplifier"}, |
