From: Greg Kroah-Hartman Date: Mon, 10 Jun 2013 07:19:21 +0000 (-0700) Subject: 3.4-stable patches X-Git-Tag: v3.0.82~11 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=658fcf067944b1aea5b5d8661d341f6efc78f779;p=thirdparty%2Fkernel%2Fstable-queue.git 3.4-stable patches added patches: drm-radeon-don-t-allow-audio-on-dce6.patch powerpc-eeh-don-t-check-rtas-token-to-get-pe-addr.patch radeon-fix-system-hang-issue-when-using-kms-with-older-cards.patch --- diff --git a/queue-3.4/drm-radeon-don-t-allow-audio-on-dce6.patch b/queue-3.4/drm-radeon-don-t-allow-audio-on-dce6.patch new file mode 100644 index 00000000000..2f30ac548bd --- /dev/null +++ b/queue-3.4/drm-radeon-don-t-allow-audio-on-dce6.patch @@ -0,0 +1,60 @@ +From 1cbcca302a318499f20a512847c5d6a510c08c35 Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Mon, 3 Jun 2013 10:32:40 -0400 +Subject: drm/radeon: don't allow audio on DCE6 + +From: Alex Deucher + +commit 1cbcca302a318499f20a512847c5d6a510c08c35 upstream. + +It's not supported yet. Fixes display issues when +users force it on. + +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/atombios_encoders.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +--- a/drivers/gpu/drm/radeon/atombios_encoders.c ++++ b/drivers/gpu/drm/radeon/atombios_encoders.c +@@ -396,6 +396,8 @@ atombios_digital_setup(struct drm_encode + int + atombios_get_encoder_mode(struct drm_encoder *encoder) + { ++ struct drm_device *dev = encoder->dev; ++ struct radeon_device *rdev = dev->dev_private; + struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); + struct drm_connector *connector; + struct radeon_connector *radeon_connector; +@@ -421,7 +423,8 @@ atombios_get_encoder_mode(struct drm_enc + case DRM_MODE_CONNECTOR_DVII: + case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */ + if (drm_detect_hdmi_monitor(radeon_connector->edid) && +- radeon_audio) ++ radeon_audio && ++ !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */ + return ATOM_ENCODER_MODE_HDMI; + else if (radeon_connector->use_digital) + return ATOM_ENCODER_MODE_DVI; +@@ -432,7 +435,8 @@ atombios_get_encoder_mode(struct drm_enc + case DRM_MODE_CONNECTOR_HDMIA: + default: + if (drm_detect_hdmi_monitor(radeon_connector->edid) && +- radeon_audio) ++ radeon_audio && ++ !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */ + return ATOM_ENCODER_MODE_HDMI; + else + return ATOM_ENCODER_MODE_DVI; +@@ -446,7 +450,8 @@ atombios_get_encoder_mode(struct drm_enc + (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) + return ATOM_ENCODER_MODE_DP; + else if (drm_detect_hdmi_monitor(radeon_connector->edid) && +- radeon_audio) ++ radeon_audio && ++ !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */ + return ATOM_ENCODER_MODE_HDMI; + else + return ATOM_ENCODER_MODE_DVI; diff --git a/queue-3.4/powerpc-eeh-don-t-check-rtas-token-to-get-pe-addr.patch b/queue-3.4/powerpc-eeh-don-t-check-rtas-token-to-get-pe-addr.patch new file mode 100644 index 00000000000..2af356e7263 --- /dev/null +++ b/queue-3.4/powerpc-eeh-don-t-check-rtas-token-to-get-pe-addr.patch @@ -0,0 +1,59 @@ +From b8b3de224f194005ad87ede6fd022fcc2bef3b1a Mon Sep 17 00:00:00 2001 +From: Gavin Shan +Date: Wed, 5 Jun 2013 14:25:50 +0000 +Subject: powerpc/eeh: Don't check RTAS token to get PE addr + +From: Gavin Shan + +commit b8b3de224f194005ad87ede6fd022fcc2bef3b1a upstream. + +RTAS token "ibm,get-config-addr-info" or ibm,get-config-addr-info2" +are used to retrieve the PE address according to PCI address, which +made up of domain/bus/slot/function. If we don't have those 2 tokens, +the domain/bus/slot/function would be used as the address for EEH +RTAS operations. Some older f/w might not have those 2 tokens and +that blocks the EEH functionality to be initialized. It was introduced +by commit e2af155c ("powerpc/eeh: pseries platform EEH initialization"). + +The patch skips the check on those 2 tokens so we can bring up EEH +functionality successfully. And domain/bus/slot/function will be +used as address for EEH RTAS operations. + +Reported-by: Robert Knight +Signed-off-by: Gavin Shan +Tested-by: Robert Knight +Signed-off-by: Benjamin Herrenschmidt +Signed-off-by: Greg Kroah-Hartman + +--- + arch/powerpc/platforms/pseries/eeh_pseries.c | 12 +++++------- + 1 file changed, 5 insertions(+), 7 deletions(-) + +--- a/arch/powerpc/platforms/pseries/eeh_pseries.c ++++ b/arch/powerpc/platforms/pseries/eeh_pseries.c +@@ -83,7 +83,11 @@ static int pseries_eeh_init(void) + ibm_configure_pe = rtas_token("ibm,configure-pe"); + ibm_configure_bridge = rtas_token ("ibm,configure-bridge"); + +- /* necessary sanity check */ ++ /* ++ * Necessary sanity check. We needn't check "get-config-addr-info" ++ * and its variant since the old firmware probably support address ++ * of domain/bus/slot/function for EEH RTAS operations. ++ */ + if (ibm_set_eeh_option == RTAS_UNKNOWN_SERVICE) { + pr_warning("%s: RTAS service invalid\n", + __func__); +@@ -102,12 +106,6 @@ static int pseries_eeh_init(void) + pr_warning("%s: RTAS service invalid\n", + __func__); + return -EINVAL; +- } else if (ibm_get_config_addr_info2 == RTAS_UNKNOWN_SERVICE && +- ibm_get_config_addr_info == RTAS_UNKNOWN_SERVICE) { +- pr_warning("%s: RTAS service and " +- " invalid\n", +- __func__); +- return -EINVAL; + } else if (ibm_configure_pe == RTAS_UNKNOWN_SERVICE && + ibm_configure_bridge == RTAS_UNKNOWN_SERVICE) { + pr_warning("%s: RTAS service and " diff --git a/queue-3.4/radeon-fix-system-hang-issue-when-using-kms-with-older-cards.patch b/queue-3.4/radeon-fix-system-hang-issue-when-using-kms-with-older-cards.patch new file mode 100644 index 00000000000..183a4661304 --- /dev/null +++ b/queue-3.4/radeon-fix-system-hang-issue-when-using-kms-with-older-cards.patch @@ -0,0 +1,395 @@ +From e49f3959a96dc279860af7e86e6dbcfda50580a5 Mon Sep 17 00:00:00 2001 +From: Adis Hamzić +Date: Sun, 2 Jun 2013 16:47:54 +0200 +Subject: radeon: Fix system hang issue when using KMS with older cards + +From: Adis Hamzić + +commit e49f3959a96dc279860af7e86e6dbcfda50580a5 upstream. + +The current radeon driver initialization routines, when using KMS, are written +so that the IRQ installation routine is called before initializing the WB buffer +and the CP rings. With some ASICs, though, the IRQ routine tries to access the +GFX_INDEX ring causing a call to RREG32 with the value of -1 in +radeon_fence_read. This, in turn causes the system to completely hang with some +cards, requiring a hard reset. + +A call stack that can cause such a hang looks like this (using rv515 ASIC for the +example here): + * rv515_init (rv515.c) + * radeon_irq_kms_init (radeon_irq_kms.c) + * drm_irq_install (drm_irq.c) + * radeon_driver_irq_preinstall_kms (radeon_irq_kms.c) + * rs600_irq_process (rs600.c) + * radeon_fence_process - due to SW interrupt (radeon_fence.c) + * radeon_fence_read (radeon_fence.c) + * hang due to RREG32(-1) + +The patch moves the IRQ installation to the card startup routine, after the ring +has been initialized, but before the IRQ has been set. This fixes the issue, but +requires a check to see if the IRQ is already installed, as is the case in the +system resume codepath. +I have tested the patch on three machines using the rv515, the rv770 and the +evergreen ASIC. They worked without issues. + +This seems to be a known issue and has been reported on several bug tracking +sites by various distributions (see links below). Most of reports recommend +booting the system with KMS disabled and then enabling KMS by reloading the +radeon module. For some reason, this was indeed a usable workaround, however, +UMS is now deprecated and disabled by default. + +Bug reports: +https://bugzilla.redhat.com/show_bug.cgi?id=845745 +https://bugs.launchpad.net/ubuntu/+source/linux/+bug/561789 +https://bbs.archlinux.org/viewtopic.php?id=156964 + +Signed-off-by: Adis Hamzić +Signed-off-by: Alex Deucher + +--- + drivers/gpu/drm/radeon/evergreen.c | 10 ++++++---- + drivers/gpu/drm/radeon/ni.c | 10 ++++++---- + drivers/gpu/drm/radeon/r100.c | 9 ++++++--- + drivers/gpu/drm/radeon/r300.c | 9 ++++++--- + drivers/gpu/drm/radeon/r420.c | 10 ++++++---- + drivers/gpu/drm/radeon/r520.c | 9 ++++++--- + drivers/gpu/drm/radeon/r600.c | 10 ++++++---- + drivers/gpu/drm/radeon/rs400.c | 9 ++++++--- + drivers/gpu/drm/radeon/rs600.c | 9 ++++++--- + drivers/gpu/drm/radeon/rs690.c | 9 ++++++--- + drivers/gpu/drm/radeon/rv515.c | 9 ++++++--- + drivers/gpu/drm/radeon/rv770.c | 10 ++++++---- + drivers/gpu/drm/radeon/si.c | 10 ++++++---- + 13 files changed, 78 insertions(+), 45 deletions(-) + +--- a/drivers/gpu/drm/radeon/evergreen.c ++++ b/drivers/gpu/drm/radeon/evergreen.c +@@ -3258,6 +3258,12 @@ static int evergreen_startup(struct rade + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + r = r600_irq_init(rdev); + if (r) { + DRM_ERROR("radeon: IH init failed (%d).\n", r); +@@ -3409,10 +3415,6 @@ int evergreen_init(struct radeon_device + if (r) + return r; + +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; +- + rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; + r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); + +--- a/drivers/gpu/drm/radeon/ni.c ++++ b/drivers/gpu/drm/radeon/ni.c +@@ -1614,6 +1614,12 @@ static int cayman_startup(struct radeon_ + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + r = r600_irq_init(rdev); + if (r) { + DRM_ERROR("radeon: IH init failed (%d).\n", r); +@@ -1744,10 +1750,6 @@ int cayman_init(struct radeon_device *rd + if (r) + return r; + +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; +- + ring->ring_obj = NULL; + r600_ring_init(rdev, ring, 1024 * 1024); + +--- a/drivers/gpu/drm/radeon/r100.c ++++ b/drivers/gpu/drm/radeon/r100.c +@@ -3952,6 +3952,12 @@ static int r100_startup(struct radeon_de + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + r100_irq_set(rdev); + rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); + /* 1M ring buffer */ +@@ -4113,9 +4119,6 @@ int r100_init(struct radeon_device *rdev + r = radeon_fence_driver_init(rdev); + if (r) + return r; +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; + /* Memory manager */ + r = radeon_bo_init(rdev); + if (r) +--- a/drivers/gpu/drm/radeon/r300.c ++++ b/drivers/gpu/drm/radeon/r300.c +@@ -1405,6 +1405,12 @@ static int r300_startup(struct radeon_de + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + r100_irq_set(rdev); + rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); + /* 1M ring buffer */ +@@ -1545,9 +1551,6 @@ int r300_init(struct radeon_device *rdev + r = radeon_fence_driver_init(rdev); + if (r) + return r; +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; + /* Memory manager */ + r = radeon_bo_init(rdev); + if (r) +--- a/drivers/gpu/drm/radeon/r420.c ++++ b/drivers/gpu/drm/radeon/r420.c +@@ -265,6 +265,12 @@ static int r420_startup(struct radeon_de + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + r100_irq_set(rdev); + rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); + /* 1M ring buffer */ +@@ -417,10 +423,6 @@ int r420_init(struct radeon_device *rdev + if (r) { + return r; + } +- r = radeon_irq_kms_init(rdev); +- if (r) { +- return r; +- } + /* Memory manager */ + r = radeon_bo_init(rdev); + if (r) { +--- a/drivers/gpu/drm/radeon/r520.c ++++ b/drivers/gpu/drm/radeon/r520.c +@@ -194,6 +194,12 @@ static int r520_startup(struct radeon_de + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + rs600_irq_set(rdev); + rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); + /* 1M ring buffer */ +@@ -301,9 +307,6 @@ int r520_init(struct radeon_device *rdev + r = radeon_fence_driver_init(rdev); + if (r) + return r; +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; + /* Memory manager */ + r = radeon_bo_init(rdev); + if (r) +--- a/drivers/gpu/drm/radeon/r600.c ++++ b/drivers/gpu/drm/radeon/r600.c +@@ -2470,6 +2470,12 @@ int r600_startup(struct radeon_device *r + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + r = r600_irq_init(rdev); + if (r) { + DRM_ERROR("radeon: IH init failed (%d).\n", r); +@@ -2624,10 +2630,6 @@ int r600_init(struct radeon_device *rdev + if (r) + return r; + +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; +- + rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; + r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); + +--- a/drivers/gpu/drm/radeon/rs400.c ++++ b/drivers/gpu/drm/radeon/rs400.c +@@ -417,6 +417,12 @@ static int rs400_startup(struct radeon_d + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + r100_irq_set(rdev); + rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); + /* 1M ring buffer */ +@@ -541,9 +547,6 @@ int rs400_init(struct radeon_device *rde + r = radeon_fence_driver_init(rdev); + if (r) + return r; +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; + /* Memory manager */ + r = radeon_bo_init(rdev); + if (r) +--- a/drivers/gpu/drm/radeon/rs600.c ++++ b/drivers/gpu/drm/radeon/rs600.c +@@ -864,6 +864,12 @@ static int rs600_startup(struct radeon_d + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + rs600_irq_set(rdev); + rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); + /* 1M ring buffer */ +@@ -994,9 +1000,6 @@ int rs600_init(struct radeon_device *rde + r = radeon_fence_driver_init(rdev); + if (r) + return r; +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; + /* Memory manager */ + r = radeon_bo_init(rdev); + if (r) +--- a/drivers/gpu/drm/radeon/rs690.c ++++ b/drivers/gpu/drm/radeon/rs690.c +@@ -628,6 +628,12 @@ static int rs690_startup(struct radeon_d + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + rs600_irq_set(rdev); + rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); + /* 1M ring buffer */ +@@ -759,9 +765,6 @@ int rs690_init(struct radeon_device *rde + r = radeon_fence_driver_init(rdev); + if (r) + return r; +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; + /* Memory manager */ + r = radeon_bo_init(rdev); + if (r) +--- a/drivers/gpu/drm/radeon/rv515.c ++++ b/drivers/gpu/drm/radeon/rv515.c +@@ -386,6 +386,12 @@ static int rv515_startup(struct radeon_d + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + rs600_irq_set(rdev); + rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); + /* 1M ring buffer */ +@@ -520,9 +526,6 @@ int rv515_init(struct radeon_device *rde + r = radeon_fence_driver_init(rdev); + if (r) + return r; +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; + /* Memory manager */ + r = radeon_bo_init(rdev); + if (r) +--- a/drivers/gpu/drm/radeon/rv770.c ++++ b/drivers/gpu/drm/radeon/rv770.c +@@ -1099,6 +1099,12 @@ static int rv770_startup(struct radeon_d + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + r = r600_irq_init(rdev); + if (r) { + DRM_ERROR("radeon: IH init failed (%d).\n", r); +@@ -1237,10 +1243,6 @@ int rv770_init(struct radeon_device *rde + if (r) + return r; + +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; +- + rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; + r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); + +--- a/drivers/gpu/drm/radeon/si.c ++++ b/drivers/gpu/drm/radeon/si.c +@@ -3876,6 +3876,12 @@ static int si_startup(struct radeon_devi + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + r = si_irq_init(rdev); + if (r) { + DRM_ERROR("radeon: IH init failed (%d).\n", r); +@@ -4044,10 +4050,6 @@ int si_init(struct radeon_device *rdev) + if (r) + return r; + +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; +- + ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; + ring->ring_obj = NULL; + r600_ring_init(rdev, ring, 1024 * 1024); diff --git a/queue-3.4/series b/queue-3.4/series index 13eda5c54d3..884ba461fa4 100644 --- a/queue-3.4/series +++ b/queue-3.4/series @@ -18,3 +18,6 @@ usb-mos7720-fix-message-timeouts.patch usb-mos7720-fix-hardware-flow-control.patch acpi-video-ignore-bios-initial-backlight-value-for-hp-m4.patch acpi-video-ignore-bios-initial-backlight-value-for-hp-pavilion-g6.patch +powerpc-eeh-don-t-check-rtas-token-to-get-pe-addr.patch +radeon-fix-system-hang-issue-when-using-kms-with-older-cards.patch +drm-radeon-don-t-allow-audio-on-dce6.patch