diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/char/agp/amd64-agp.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_irq.c | 26 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_display.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_fb.c | 5 |
5 files changed, 27 insertions, 19 deletions
diff --git a/drivers/char/agp/amd64-agp.c b/drivers/char/agp/amd64-agp.c index 9252e85706ef..780498d76581 100644 --- a/drivers/char/agp/amd64-agp.c +++ b/drivers/char/agp/amd64-agp.c | |||
| @@ -773,18 +773,23 @@ int __init agp_amd64_init(void) | |||
| 773 | #else | 773 | #else |
| 774 | printk(KERN_INFO PFX "You can boot with agp=try_unsupported\n"); | 774 | printk(KERN_INFO PFX "You can boot with agp=try_unsupported\n"); |
| 775 | #endif | 775 | #endif |
| 776 | pci_unregister_driver(&agp_amd64_pci_driver); | ||
| 776 | return -ENODEV; | 777 | return -ENODEV; |
| 777 | } | 778 | } |
| 778 | 779 | ||
| 779 | /* First check that we have at least one AMD64 NB */ | 780 | /* First check that we have at least one AMD64 NB */ |
| 780 | if (!pci_dev_present(amd_nb_misc_ids)) | 781 | if (!pci_dev_present(amd_nb_misc_ids)) { |
| 782 | pci_unregister_driver(&agp_amd64_pci_driver); | ||
| 781 | return -ENODEV; | 783 | return -ENODEV; |
| 784 | } | ||
| 782 | 785 | ||
| 783 | /* Look for any AGP bridge */ | 786 | /* Look for any AGP bridge */ |
| 784 | agp_amd64_pci_driver.id_table = agp_amd64_pci_promisc_table; | 787 | agp_amd64_pci_driver.id_table = agp_amd64_pci_promisc_table; |
| 785 | err = driver_attach(&agp_amd64_pci_driver.driver); | 788 | err = driver_attach(&agp_amd64_pci_driver.driver); |
| 786 | if (err == 0 && agp_bridges_found == 0) | 789 | if (err == 0 && agp_bridges_found == 0) { |
| 790 | pci_unregister_driver(&agp_amd64_pci_driver); | ||
| 787 | err = -ENODEV; | 791 | err = -ENODEV; |
| 792 | } | ||
| 788 | } | 793 | } |
| 789 | return err; | 794 | return err; |
| 790 | } | 795 | } |
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index 3dadfa2a8528..53120a72a48c 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
| @@ -164,8 +164,10 @@ static void vblank_disable_and_save(struct drm_device *dev, int crtc) | |||
| 164 | * available. In that case we can't account for this and just | 164 | * available. In that case we can't account for this and just |
| 165 | * hope for the best. | 165 | * hope for the best. |
| 166 | */ | 166 | */ |
| 167 | if ((vblrc > 0) && (abs(diff_ns) > 1000000)) | 167 | if ((vblrc > 0) && (abs64(diff_ns) > 1000000)) { |
| 168 | atomic_inc(&dev->_vblank_count[crtc]); | 168 | atomic_inc(&dev->_vblank_count[crtc]); |
| 169 | smp_mb__after_atomic_inc(); | ||
| 170 | } | ||
| 169 | 171 | ||
| 170 | /* Invalidate all timestamps while vblank irq's are off. */ | 172 | /* Invalidate all timestamps while vblank irq's are off. */ |
| 171 | clear_vblank_timestamps(dev, crtc); | 173 | clear_vblank_timestamps(dev, crtc); |
| @@ -491,6 +493,12 @@ void drm_calc_timestamping_constants(struct drm_crtc *crtc) | |||
| 491 | /* Dot clock in Hz: */ | 493 | /* Dot clock in Hz: */ |
| 492 | dotclock = (u64) crtc->hwmode.clock * 1000; | 494 | dotclock = (u64) crtc->hwmode.clock * 1000; |
| 493 | 495 | ||
| 496 | /* Fields of interlaced scanout modes are only halve a frame duration. | ||
| 497 | * Double the dotclock to get halve the frame-/line-/pixelduration. | ||
| 498 | */ | ||
| 499 | if (crtc->hwmode.flags & DRM_MODE_FLAG_INTERLACE) | ||
| 500 | dotclock *= 2; | ||
| 501 | |||
| 494 | /* Valid dotclock? */ | 502 | /* Valid dotclock? */ |
| 495 | if (dotclock > 0) { | 503 | if (dotclock > 0) { |
| 496 | /* Convert scanline length in pixels and video dot clock to | 504 | /* Convert scanline length in pixels and video dot clock to |
| @@ -603,14 +611,6 @@ int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, int crtc, | |||
| 603 | return -EAGAIN; | 611 | return -EAGAIN; |
| 604 | } | 612 | } |
| 605 | 613 | ||
| 606 | /* Don't know yet how to handle interlaced or | ||
| 607 | * double scan modes. Just no-op for now. | ||
| 608 | */ | ||
| 609 | if (mode->flags & (DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLSCAN)) { | ||
| 610 | DRM_DEBUG("crtc %d: Noop due to unsupported mode.\n", crtc); | ||
| 611 | return -ENOTSUPP; | ||
| 612 | } | ||
| 613 | |||
| 614 | /* Get current scanout position with system timestamp. | 614 | /* Get current scanout position with system timestamp. |
| 615 | * Repeat query up to DRM_TIMESTAMP_MAXRETRIES times | 615 | * Repeat query up to DRM_TIMESTAMP_MAXRETRIES times |
| 616 | * if single query takes longer than max_error nanoseconds. | 616 | * if single query takes longer than max_error nanoseconds. |
| @@ -858,10 +858,11 @@ static void drm_update_vblank_count(struct drm_device *dev, int crtc) | |||
| 858 | if (rc) { | 858 | if (rc) { |
| 859 | tslot = atomic_read(&dev->_vblank_count[crtc]) + diff; | 859 | tslot = atomic_read(&dev->_vblank_count[crtc]) + diff; |
| 860 | vblanktimestamp(dev, crtc, tslot) = t_vblank; | 860 | vblanktimestamp(dev, crtc, tslot) = t_vblank; |
| 861 | smp_wmb(); | ||
| 862 | } | 861 | } |
| 863 | 862 | ||
| 863 | smp_mb__before_atomic_inc(); | ||
| 864 | atomic_add(diff, &dev->_vblank_count[crtc]); | 864 | atomic_add(diff, &dev->_vblank_count[crtc]); |
| 865 | smp_mb__after_atomic_inc(); | ||
| 865 | } | 866 | } |
| 866 | 867 | ||
| 867 | /** | 868 | /** |
| @@ -1293,15 +1294,16 @@ bool drm_handle_vblank(struct drm_device *dev, int crtc) | |||
| 1293 | * e.g., due to spurious vblank interrupts. We need to | 1294 | * e.g., due to spurious vblank interrupts. We need to |
| 1294 | * ignore those for accounting. | 1295 | * ignore those for accounting. |
| 1295 | */ | 1296 | */ |
| 1296 | if (abs(diff_ns) > DRM_REDUNDANT_VBLIRQ_THRESH_NS) { | 1297 | if (abs64(diff_ns) > DRM_REDUNDANT_VBLIRQ_THRESH_NS) { |
| 1297 | /* Store new timestamp in ringbuffer. */ | 1298 | /* Store new timestamp in ringbuffer. */ |
| 1298 | vblanktimestamp(dev, crtc, vblcount + 1) = tvblank; | 1299 | vblanktimestamp(dev, crtc, vblcount + 1) = tvblank; |
| 1299 | smp_wmb(); | ||
| 1300 | 1300 | ||
| 1301 | /* Increment cooked vblank count. This also atomically commits | 1301 | /* Increment cooked vblank count. This also atomically commits |
| 1302 | * the timestamp computed above. | 1302 | * the timestamp computed above. |
| 1303 | */ | 1303 | */ |
| 1304 | smp_mb__before_atomic_inc(); | ||
| 1304 | atomic_inc(&dev->_vblank_count[crtc]); | 1305 | atomic_inc(&dev->_vblank_count[crtc]); |
| 1306 | smp_mb__after_atomic_inc(); | ||
| 1305 | } else { | 1307 | } else { |
| 1306 | DRM_DEBUG("crtc %d: Redundant vblirq ignored. diff_ns = %d\n", | 1308 | DRM_DEBUG("crtc %d: Redundant vblirq ignored. diff_ns = %d\n", |
| 1307 | crtc, (int) diff_ns); | 1309 | crtc, (int) diff_ns); |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 56deae5bf02e..93fa735c8c1a 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -3490,7 +3490,7 @@ void r100_cs_track_clear(struct radeon_device *rdev, struct r100_cs_track *track | |||
| 3490 | track->num_texture = 16; | 3490 | track->num_texture = 16; |
| 3491 | track->maxy = 4096; | 3491 | track->maxy = 4096; |
| 3492 | track->separate_cube = 0; | 3492 | track->separate_cube = 0; |
| 3493 | track->aaresolve = true; | 3493 | track->aaresolve = false; |
| 3494 | track->aa.robj = NULL; | 3494 | track->aa.robj = NULL; |
| 3495 | } | 3495 | } |
| 3496 | 3496 | ||
| @@ -3801,8 +3801,6 @@ static int r100_startup(struct radeon_device *rdev) | |||
| 3801 | r100_mc_program(rdev); | 3801 | r100_mc_program(rdev); |
| 3802 | /* Resume clock */ | 3802 | /* Resume clock */ |
| 3803 | r100_clock_startup(rdev); | 3803 | r100_clock_startup(rdev); |
| 3804 | /* Initialize GPU configuration (# pipes, ...) */ | ||
| 3805 | // r100_gpu_init(rdev); | ||
| 3806 | /* Initialize GART (initialize after TTM so we can allocate | 3804 | /* Initialize GART (initialize after TTM so we can allocate |
| 3807 | * memory through TTM but finalize after TTM) */ | 3805 | * memory through TTM but finalize after TTM) */ |
| 3808 | r100_enable_bm(rdev); | 3806 | r100_enable_bm(rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 0e657095de7c..3e7e7f9eb781 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
| @@ -971,7 +971,7 @@ void radeon_compute_pll_legacy(struct radeon_pll *pll, | |||
| 971 | max_fractional_feed_div = pll->max_frac_feedback_div; | 971 | max_fractional_feed_div = pll->max_frac_feedback_div; |
| 972 | } | 972 | } |
| 973 | 973 | ||
| 974 | for (post_div = min_post_div; post_div <= max_post_div; ++post_div) { | 974 | for (post_div = max_post_div; post_div >= min_post_div; --post_div) { |
| 975 | uint32_t ref_div; | 975 | uint32_t ref_div; |
| 976 | 976 | ||
| 977 | if ((pll->flags & RADEON_PLL_NO_ODD_POST_DIV) && (post_div & 1)) | 977 | if ((pll->flags & RADEON_PLL_NO_ODD_POST_DIV) && (post_div & 1)) |
diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c index 66324b5bb5ba..cc44bdfec80f 100644 --- a/drivers/gpu/drm/radeon/radeon_fb.c +++ b/drivers/gpu/drm/radeon/radeon_fb.c | |||
| @@ -113,11 +113,14 @@ static int radeonfb_create_pinned_object(struct radeon_fbdev *rfbdev, | |||
| 113 | u32 tiling_flags = 0; | 113 | u32 tiling_flags = 0; |
| 114 | int ret; | 114 | int ret; |
| 115 | int aligned_size, size; | 115 | int aligned_size, size; |
| 116 | int height = mode_cmd->height; | ||
| 116 | 117 | ||
| 117 | /* need to align pitch with crtc limits */ | 118 | /* need to align pitch with crtc limits */ |
| 118 | mode_cmd->pitch = radeon_align_pitch(rdev, mode_cmd->width, mode_cmd->bpp, fb_tiled) * ((mode_cmd->bpp + 1) / 8); | 119 | mode_cmd->pitch = radeon_align_pitch(rdev, mode_cmd->width, mode_cmd->bpp, fb_tiled) * ((mode_cmd->bpp + 1) / 8); |
| 119 | 120 | ||
| 120 | size = mode_cmd->pitch * mode_cmd->height; | 121 | if (rdev->family >= CHIP_R600) |
| 122 | height = ALIGN(mode_cmd->height, 8); | ||
| 123 | size = mode_cmd->pitch * height; | ||
| 121 | aligned_size = ALIGN(size, PAGE_SIZE); | 124 | aligned_size = ALIGN(size, PAGE_SIZE); |
| 122 | ret = radeon_gem_object_create(rdev, aligned_size, 0, | 125 | ret = radeon_gem_object_create(rdev, aligned_size, 0, |
| 123 | RADEON_GEM_DOMAIN_VRAM, | 126 | RADEON_GEM_DOMAIN_VRAM, |
