mirror of
https://github.com/torvalds/linux.git
synced 2024-10-30 00:32:38 +00:00
drm/radeon/kms: Fallback to non AGP when acceleration fails to initialize (v2)
When GPU acceleration is not working with AGP try to fallback to non AGP GART (either PCI or PCIE GART). This should make KMS failure on AGP less painfull. We still need to find out what is wrong when AGP fails but at least user have a lot of more chances to get a working configuration with acceleration. This patch also cleanup R600/RV770 fallback path so they use same code as others asics. Version 2 factorize agp disabling logic to avoid code duplication and bugs. Signed-off-by: Jerome Glisse <jglisse@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
01ceae8edd
commit
b574f251f7
@ -1560,15 +1560,8 @@ int r600_init(struct radeon_device *rdev)
|
||||
if (r)
|
||||
return r;
|
||||
r = r600_mc_init(rdev);
|
||||
if (r) {
|
||||
if (rdev->flags & RADEON_IS_AGP) {
|
||||
/* Retry with disabling AGP */
|
||||
r600_fini(rdev);
|
||||
rdev->flags &= ~RADEON_IS_AGP;
|
||||
return r600_init(rdev);
|
||||
}
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
/* Memory manager */
|
||||
r = radeon_object_init(rdev);
|
||||
if (r)
|
||||
@ -1597,15 +1590,8 @@ int r600_init(struct radeon_device *rdev)
|
||||
|
||||
r = r600_startup(rdev);
|
||||
if (r) {
|
||||
if (rdev->flags & RADEON_IS_AGP) {
|
||||
/* Retry with disabling AGP */
|
||||
r600_fini(rdev);
|
||||
rdev->flags &= ~RADEON_IS_AGP;
|
||||
return r600_init(rdev);
|
||||
}
|
||||
r600_suspend(rdev);
|
||||
r600_wb_fini(rdev);
|
||||
radeon_ib_pool_fini(rdev);
|
||||
radeon_ring_fini(rdev);
|
||||
r600_pcie_gart_fini(rdev);
|
||||
rdev->accel_working = false;
|
||||
@ -1637,10 +1623,8 @@ void r600_fini(struct radeon_device *rdev)
|
||||
radeon_gem_fini(rdev);
|
||||
radeon_fence_driver_fini(rdev);
|
||||
radeon_clocks_fini(rdev);
|
||||
#if __OS_HAS_AGP
|
||||
if (rdev->flags & RADEON_IS_AGP)
|
||||
radeon_agp_fini(rdev);
|
||||
#endif
|
||||
radeon_object_fini(rdev);
|
||||
radeon_atombios_fini(rdev);
|
||||
kfree(rdev->bios);
|
||||
|
@ -476,6 +476,27 @@ void radeon_combios_fini(struct radeon_device *rdev)
|
||||
{
|
||||
}
|
||||
|
||||
void radeon_agp_disable(struct radeon_device *rdev)
|
||||
{
|
||||
rdev->flags &= ~RADEON_IS_AGP;
|
||||
if (rdev->family >= CHIP_R600) {
|
||||
DRM_INFO("Forcing AGP to PCIE mode\n");
|
||||
rdev->flags |= RADEON_IS_PCIE;
|
||||
} else if (rdev->family >= CHIP_RV515 ||
|
||||
rdev->family == CHIP_RV380 ||
|
||||
rdev->family == CHIP_RV410 ||
|
||||
rdev->family == CHIP_R423) {
|
||||
DRM_INFO("Forcing AGP to PCIE mode\n");
|
||||
rdev->flags |= RADEON_IS_PCIE;
|
||||
rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush;
|
||||
rdev->asic->gart_set_page = &rv370_pcie_gart_set_page;
|
||||
} else {
|
||||
DRM_INFO("Forcing AGP to PCI mode\n");
|
||||
rdev->flags |= RADEON_IS_PCI;
|
||||
rdev->asic->gart_tlb_flush = &r100_pci_gart_tlb_flush;
|
||||
rdev->asic->gart_set_page = &r100_pci_gart_set_page;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Radeon device.
|
||||
@ -515,24 +536,7 @@ int radeon_device_init(struct radeon_device *rdev,
|
||||
}
|
||||
|
||||
if (radeon_agpmode == -1) {
|
||||
rdev->flags &= ~RADEON_IS_AGP;
|
||||
if (rdev->family >= CHIP_R600) {
|
||||
DRM_INFO("Forcing AGP to PCIE mode\n");
|
||||
rdev->flags |= RADEON_IS_PCIE;
|
||||
} else if (rdev->family >= CHIP_RV515 ||
|
||||
rdev->family == CHIP_RV380 ||
|
||||
rdev->family == CHIP_RV410 ||
|
||||
rdev->family == CHIP_R423) {
|
||||
DRM_INFO("Forcing AGP to PCIE mode\n");
|
||||
rdev->flags |= RADEON_IS_PCIE;
|
||||
rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush;
|
||||
rdev->asic->gart_set_page = &rv370_pcie_gart_set_page;
|
||||
} else {
|
||||
DRM_INFO("Forcing AGP to PCI mode\n");
|
||||
rdev->flags |= RADEON_IS_PCI;
|
||||
rdev->asic->gart_tlb_flush = &r100_pci_gart_tlb_flush;
|
||||
rdev->asic->gart_set_page = &r100_pci_gart_set_page;
|
||||
}
|
||||
radeon_agp_disable(rdev);
|
||||
}
|
||||
|
||||
/* set DMA mask + need_dma32 flags.
|
||||
@ -565,8 +569,17 @@ int radeon_device_init(struct radeon_device *rdev,
|
||||
DRM_INFO("register mmio size: %u\n", (unsigned)rdev->rmmio_size);
|
||||
|
||||
r = radeon_init(rdev);
|
||||
if (r) {
|
||||
if (r)
|
||||
return r;
|
||||
if (rdev->flags & RADEON_IS_AGP && !rdev->accel_working) {
|
||||
/* Acceleration not working on AGP card try again
|
||||
* with fallback to PCI or PCIE GART
|
||||
*/
|
||||
radeon_fini(rdev);
|
||||
radeon_agp_disable(rdev);
|
||||
r = radeon_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
if (radeon_testing) {
|
||||
radeon_test_moves(rdev);
|
||||
|
@ -923,15 +923,8 @@ int rv770_init(struct radeon_device *rdev)
|
||||
if (r)
|
||||
return r;
|
||||
r = rv770_mc_init(rdev);
|
||||
if (r) {
|
||||
if (rdev->flags & RADEON_IS_AGP) {
|
||||
/* Retry with disabling AGP */
|
||||
rv770_fini(rdev);
|
||||
rdev->flags &= ~RADEON_IS_AGP;
|
||||
return rv770_init(rdev);
|
||||
}
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
/* Memory manager */
|
||||
r = radeon_object_init(rdev);
|
||||
if (r)
|
||||
@ -960,15 +953,8 @@ int rv770_init(struct radeon_device *rdev)
|
||||
|
||||
r = rv770_startup(rdev);
|
||||
if (r) {
|
||||
if (rdev->flags & RADEON_IS_AGP) {
|
||||
/* Retry with disabling AGP */
|
||||
rv770_fini(rdev);
|
||||
rdev->flags &= ~RADEON_IS_AGP;
|
||||
return rv770_init(rdev);
|
||||
}
|
||||
rv770_suspend(rdev);
|
||||
r600_wb_fini(rdev);
|
||||
radeon_ib_pool_fini(rdev);
|
||||
radeon_ring_fini(rdev);
|
||||
rv770_pcie_gart_fini(rdev);
|
||||
rdev->accel_working = false;
|
||||
@ -999,10 +985,8 @@ void rv770_fini(struct radeon_device *rdev)
|
||||
radeon_gem_fini(rdev);
|
||||
radeon_fence_driver_fini(rdev);
|
||||
radeon_clocks_fini(rdev);
|
||||
#if __OS_HAS_AGP
|
||||
if (rdev->flags & RADEON_IS_AGP)
|
||||
radeon_agp_fini(rdev);
|
||||
#endif
|
||||
radeon_object_fini(rdev);
|
||||
radeon_atombios_fini(rdev);
|
||||
kfree(rdev->bios);
|
||||
|
Loading…
Reference in New Issue
Block a user