Merge branch 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6
* 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6: amd64-agp: fix crash at second module load drm/radeon: fix regression with AA resolve checking drm: drop commented out code and preceding comment drm/vblank: Enable precise vblank timestamps for interlaced and doublescan modes. drm/vblank: Use memory barriers optimized for atomic_t instead of generics. drm/vblank: Use abs64(diff_ns) for s64 diff_ns instead of abs(diff_ns) drm/radeon/kms: align height of fb allocation. Revert "drm/radeon/kms: switch back to min->max pll post divider iteration"
This commit is contained in:
commit
b5f7376eb3
@ -773,18 +773,23 @@ int __init agp_amd64_init(void)
|
|||||||
#else
|
#else
|
||||||
printk(KERN_INFO PFX "You can boot with agp=try_unsupported\n");
|
printk(KERN_INFO PFX "You can boot with agp=try_unsupported\n");
|
||||||
#endif
|
#endif
|
||||||
|
pci_unregister_driver(&agp_amd64_pci_driver);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* First check that we have at least one AMD64 NB */
|
/* First check that we have at least one AMD64 NB */
|
||||||
if (!pci_dev_present(amd_nb_misc_ids))
|
if (!pci_dev_present(amd_nb_misc_ids)) {
|
||||||
|
pci_unregister_driver(&agp_amd64_pci_driver);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
/* Look for any AGP bridge */
|
/* Look for any AGP bridge */
|
||||||
agp_amd64_pci_driver.id_table = agp_amd64_pci_promisc_table;
|
agp_amd64_pci_driver.id_table = agp_amd64_pci_promisc_table;
|
||||||
err = driver_attach(&agp_amd64_pci_driver.driver);
|
err = driver_attach(&agp_amd64_pci_driver.driver);
|
||||||
if (err == 0 && agp_bridges_found == 0)
|
if (err == 0 && agp_bridges_found == 0) {
|
||||||
|
pci_unregister_driver(&agp_amd64_pci_driver);
|
||||||
err = -ENODEV;
|
err = -ENODEV;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -164,8 +164,10 @@ static void vblank_disable_and_save(struct drm_device *dev, int crtc)
|
|||||||
* available. In that case we can't account for this and just
|
* available. In that case we can't account for this and just
|
||||||
* hope for the best.
|
* hope for the best.
|
||||||
*/
|
*/
|
||||||
if ((vblrc > 0) && (abs(diff_ns) > 1000000))
|
if ((vblrc > 0) && (abs64(diff_ns) > 1000000)) {
|
||||||
atomic_inc(&dev->_vblank_count[crtc]);
|
atomic_inc(&dev->_vblank_count[crtc]);
|
||||||
|
smp_mb__after_atomic_inc();
|
||||||
|
}
|
||||||
|
|
||||||
/* Invalidate all timestamps while vblank irq's are off. */
|
/* Invalidate all timestamps while vblank irq's are off. */
|
||||||
clear_vblank_timestamps(dev, crtc);
|
clear_vblank_timestamps(dev, crtc);
|
||||||
@ -491,6 +493,12 @@ void drm_calc_timestamping_constants(struct drm_crtc *crtc)
|
|||||||
/* Dot clock in Hz: */
|
/* Dot clock in Hz: */
|
||||||
dotclock = (u64) crtc->hwmode.clock * 1000;
|
dotclock = (u64) crtc->hwmode.clock * 1000;
|
||||||
|
|
||||||
|
/* Fields of interlaced scanout modes are only halve a frame duration.
|
||||||
|
* Double the dotclock to get halve the frame-/line-/pixelduration.
|
||||||
|
*/
|
||||||
|
if (crtc->hwmode.flags & DRM_MODE_FLAG_INTERLACE)
|
||||||
|
dotclock *= 2;
|
||||||
|
|
||||||
/* Valid dotclock? */
|
/* Valid dotclock? */
|
||||||
if (dotclock > 0) {
|
if (dotclock > 0) {
|
||||||
/* Convert scanline length in pixels and video dot clock to
|
/* 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,
|
|||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Don't know yet how to handle interlaced or
|
|
||||||
* double scan modes. Just no-op for now.
|
|
||||||
*/
|
|
||||||
if (mode->flags & (DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLSCAN)) {
|
|
||||||
DRM_DEBUG("crtc %d: Noop due to unsupported mode.\n", crtc);
|
|
||||||
return -ENOTSUPP;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get current scanout position with system timestamp.
|
/* Get current scanout position with system timestamp.
|
||||||
* Repeat query up to DRM_TIMESTAMP_MAXRETRIES times
|
* Repeat query up to DRM_TIMESTAMP_MAXRETRIES times
|
||||||
* if single query takes longer than max_error nanoseconds.
|
* 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)
|
|||||||
if (rc) {
|
if (rc) {
|
||||||
tslot = atomic_read(&dev->_vblank_count[crtc]) + diff;
|
tslot = atomic_read(&dev->_vblank_count[crtc]) + diff;
|
||||||
vblanktimestamp(dev, crtc, tslot) = t_vblank;
|
vblanktimestamp(dev, crtc, tslot) = t_vblank;
|
||||||
smp_wmb();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
smp_mb__before_atomic_inc();
|
||||||
atomic_add(diff, &dev->_vblank_count[crtc]);
|
atomic_add(diff, &dev->_vblank_count[crtc]);
|
||||||
|
smp_mb__after_atomic_inc();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1293,15 +1294,16 @@ bool drm_handle_vblank(struct drm_device *dev, int crtc)
|
|||||||
* e.g., due to spurious vblank interrupts. We need to
|
* e.g., due to spurious vblank interrupts. We need to
|
||||||
* ignore those for accounting.
|
* ignore those for accounting.
|
||||||
*/
|
*/
|
||||||
if (abs(diff_ns) > DRM_REDUNDANT_VBLIRQ_THRESH_NS) {
|
if (abs64(diff_ns) > DRM_REDUNDANT_VBLIRQ_THRESH_NS) {
|
||||||
/* Store new timestamp in ringbuffer. */
|
/* Store new timestamp in ringbuffer. */
|
||||||
vblanktimestamp(dev, crtc, vblcount + 1) = tvblank;
|
vblanktimestamp(dev, crtc, vblcount + 1) = tvblank;
|
||||||
smp_wmb();
|
|
||||||
|
|
||||||
/* Increment cooked vblank count. This also atomically commits
|
/* Increment cooked vblank count. This also atomically commits
|
||||||
* the timestamp computed above.
|
* the timestamp computed above.
|
||||||
*/
|
*/
|
||||||
|
smp_mb__before_atomic_inc();
|
||||||
atomic_inc(&dev->_vblank_count[crtc]);
|
atomic_inc(&dev->_vblank_count[crtc]);
|
||||||
|
smp_mb__after_atomic_inc();
|
||||||
} else {
|
} else {
|
||||||
DRM_DEBUG("crtc %d: Redundant vblirq ignored. diff_ns = %d\n",
|
DRM_DEBUG("crtc %d: Redundant vblirq ignored. diff_ns = %d\n",
|
||||||
crtc, (int) diff_ns);
|
crtc, (int) diff_ns);
|
||||||
|
@ -3490,7 +3490,7 @@ void r100_cs_track_clear(struct radeon_device *rdev, struct r100_cs_track *track
|
|||||||
track->num_texture = 16;
|
track->num_texture = 16;
|
||||||
track->maxy = 4096;
|
track->maxy = 4096;
|
||||||
track->separate_cube = 0;
|
track->separate_cube = 0;
|
||||||
track->aaresolve = true;
|
track->aaresolve = false;
|
||||||
track->aa.robj = NULL;
|
track->aa.robj = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3801,8 +3801,6 @@ static int r100_startup(struct radeon_device *rdev)
|
|||||||
r100_mc_program(rdev);
|
r100_mc_program(rdev);
|
||||||
/* Resume clock */
|
/* Resume clock */
|
||||||
r100_clock_startup(rdev);
|
r100_clock_startup(rdev);
|
||||||
/* Initialize GPU configuration (# pipes, ...) */
|
|
||||||
// r100_gpu_init(rdev);
|
|
||||||
/* Initialize GART (initialize after TTM so we can allocate
|
/* Initialize GART (initialize after TTM so we can allocate
|
||||||
* memory through TTM but finalize after TTM) */
|
* memory through TTM but finalize after TTM) */
|
||||||
r100_enable_bm(rdev);
|
r100_enable_bm(rdev);
|
||||||
|
@ -971,7 +971,7 @@ void radeon_compute_pll_legacy(struct radeon_pll *pll,
|
|||||||
max_fractional_feed_div = pll->max_frac_feedback_div;
|
max_fractional_feed_div = pll->max_frac_feedback_div;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (post_div = min_post_div; post_div <= max_post_div; ++post_div) {
|
for (post_div = max_post_div; post_div >= min_post_div; --post_div) {
|
||||||
uint32_t ref_div;
|
uint32_t ref_div;
|
||||||
|
|
||||||
if ((pll->flags & RADEON_PLL_NO_ODD_POST_DIV) && (post_div & 1))
|
if ((pll->flags & RADEON_PLL_NO_ODD_POST_DIV) && (post_div & 1))
|
||||||
|
@ -113,11 +113,14 @@ static int radeonfb_create_pinned_object(struct radeon_fbdev *rfbdev,
|
|||||||
u32 tiling_flags = 0;
|
u32 tiling_flags = 0;
|
||||||
int ret;
|
int ret;
|
||||||
int aligned_size, size;
|
int aligned_size, size;
|
||||||
|
int height = mode_cmd->height;
|
||||||
|
|
||||||
/* need to align pitch with crtc limits */
|
/* need to align pitch with crtc limits */
|
||||||
mode_cmd->pitch = radeon_align_pitch(rdev, mode_cmd->width, mode_cmd->bpp, fb_tiled) * ((mode_cmd->bpp + 1) / 8);
|
mode_cmd->pitch = radeon_align_pitch(rdev, mode_cmd->width, mode_cmd->bpp, fb_tiled) * ((mode_cmd->bpp + 1) / 8);
|
||||||
|
|
||||||
size = mode_cmd->pitch * mode_cmd->height;
|
if (rdev->family >= CHIP_R600)
|
||||||
|
height = ALIGN(mode_cmd->height, 8);
|
||||||
|
size = mode_cmd->pitch * height;
|
||||||
aligned_size = ALIGN(size, PAGE_SIZE);
|
aligned_size = ALIGN(size, PAGE_SIZE);
|
||||||
ret = radeon_gem_object_create(rdev, aligned_size, 0,
|
ret = radeon_gem_object_create(rdev, aligned_size, 0,
|
||||||
RADEON_GEM_DOMAIN_VRAM,
|
RADEON_GEM_DOMAIN_VRAM,
|
||||||
|
Loading…
Reference in New Issue
Block a user