]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 10 Jun 2013 07:19:21 +0000 (00:19 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 10 Jun 2013 07:19:21 +0000 (00:19 -0700)
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

queue-3.4/drm-radeon-don-t-allow-audio-on-dce6.patch [new file with mode: 0644]
queue-3.4/powerpc-eeh-don-t-check-rtas-token-to-get-pe-addr.patch [new file with mode: 0644]
queue-3.4/radeon-fix-system-hang-issue-when-using-kms-with-older-cards.patch [new file with mode: 0644]
queue-3.4/series

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 (file)
index 0000000..2f30ac5
--- /dev/null
@@ -0,0 +1,60 @@
+From 1cbcca302a318499f20a512847c5d6a510c08c35 Mon Sep 17 00:00:00 2001
+From: Alex Deucher <alexander.deucher@amd.com>
+Date: Mon, 3 Jun 2013 10:32:40 -0400
+Subject: drm/radeon: don't allow audio on DCE6
+
+From: Alex Deucher <alexander.deucher@amd.com>
+
+commit 1cbcca302a318499f20a512847c5d6a510c08c35 upstream.
+
+It's not supported yet.  Fixes display issues when
+users force it on.
+
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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 (file)
index 0000000..2af356e
--- /dev/null
@@ -0,0 +1,59 @@
+From b8b3de224f194005ad87ede6fd022fcc2bef3b1a Mon Sep 17 00:00:00 2001
+From: Gavin Shan <shangw@linux.vnet.ibm.com>
+Date: Wed, 5 Jun 2013 14:25:50 +0000
+Subject: powerpc/eeh: Don't check RTAS token to get PE addr
+
+From: Gavin Shan <shangw@linux.vnet.ibm.com>
+
+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 <knight@princeton.edu>
+Signed-off-by: Gavin Shan <shangw@linux.vnet.ibm.com>
+Tested-by: Robert Knight <knight@princeton.edu>
+Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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 <ibm,set-eeh-option> invalid\n",
+                       __func__);
+@@ -102,12 +106,6 @@ static int pseries_eeh_init(void)
+               pr_warning("%s: RTAS service <ibm,slot-error-detail> 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 <ibm,get-config-addr-info2> and "
+-                      "<ibm,get-config-addr-info> invalid\n",
+-                      __func__);
+-              return -EINVAL;
+       } else if (ibm_configure_pe == RTAS_UNKNOWN_SERVICE &&
+                  ibm_configure_bridge == RTAS_UNKNOWN_SERVICE) {
+               pr_warning("%s: RTAS service <ibm,configure-pe> 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 (file)
index 0000000..183a466
--- /dev/null
@@ -0,0 +1,395 @@
+From e49f3959a96dc279860af7e86e6dbcfda50580a5 Mon Sep 17 00:00:00 2001
+From: Adis Hamzić <adis@hamzadis.com>
+Date: Sun, 2 Jun 2013 16:47:54 +0200
+Subject: radeon: Fix system hang issue when using KMS with older cards
+
+From: Adis Hamzić <adis@hamzadis.com>
+
+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ć <adis@hamzadis.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+
+---
+ 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);
index 13eda5c54d380167c9a80c17598378e2e3274181..884ba461fa4dbdda2b66e4e0d94ad836e02bf547 100644 (file)
@@ -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