| From 8f6c25c59b0c895c68cae59d1b34e9a7b36971bc Mon Sep 17 00:00:00 2001 |
| From: Alex Deucher <alexander.deucher@amd.com> |
| Date: Tue, 25 Oct 2011 14:58:49 -0400 |
| Subject: drm/radeon/kms: split MSI check into a separate function |
| |
| From: Alex Deucher <alexander.deucher@amd.com> |
| |
| commit 8f6c25c59b0c895c68cae59d1b34e9a7b36971bc upstream. |
| |
| This makes it easier to add quirks for certain systems. |
| |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Signed-off-by: Dave Airlie <airlied@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/gpu/drm/radeon/radeon_irq_kms.c | 29 +++++++++++++++++++++++------ |
| 1 file changed, 23 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/gpu/drm/radeon/radeon_irq_kms.c |
| +++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c |
| @@ -108,6 +108,27 @@ void radeon_driver_irq_uninstall_kms(str |
| radeon_irq_set(rdev); |
| } |
| |
| +static bool radeon_msi_ok(struct radeon_device *rdev) |
| +{ |
| + /* RV370/RV380 was first asic with MSI support */ |
| + if (rdev->family < CHIP_RV380) |
| + return false; |
| + |
| + /* MSIs don't work on AGP */ |
| + if (rdev->flags & RADEON_IS_AGP) |
| + return false; |
| + |
| + if (rdev->flags & RADEON_IS_IGP) { |
| + /* APUs work fine with MSIs */ |
| + if (rdev->family >= CHIP_PALM) |
| + return true; |
| + /* lots of IGPs have problems with MSIs */ |
| + return false; |
| + } |
| + |
| + return true; |
| +} |
| + |
| int radeon_irq_kms_init(struct radeon_device *rdev) |
| { |
| int i; |
| @@ -124,12 +145,8 @@ int radeon_irq_kms_init(struct radeon_de |
| } |
| /* enable msi */ |
| rdev->msi_enabled = 0; |
| - /* MSIs don't seem to work reliably on all IGP |
| - * chips. Disable MSI on them for now. |
| - */ |
| - if ((rdev->family >= CHIP_RV380) && |
| - ((!(rdev->flags & RADEON_IS_IGP)) || (rdev->family >= CHIP_PALM)) && |
| - (!(rdev->flags & RADEON_IS_AGP))) { |
| + |
| + if (radeon_msi_ok(rdev)) { |
| int ret = pci_enable_msi(rdev->pdev); |
| if (!ret) { |
| rdev->msi_enabled = 1; |