]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 May 2013 20:22:00 +0000 (13:22 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 May 2013 20:22:00 +0000 (13:22 -0700)
added patches:
drm-radeon-add-new-richland-pci-ids.patch
drm-radeon-evergreen-don-t-enable-hpd-interrupts-on-edp-lvds.patch
drm-radeon-fix-endian-bugs-in-atom_allocate_fb_scratch.patch
drm-radeon-fix-handling-of-v6-power-tables.patch
drm-radeon-fix-possible-segfault-when-parsing-pm-tables.patch

queue-3.4/drm-radeon-add-new-richland-pci-ids.patch [new file with mode: 0644]
queue-3.4/drm-radeon-evergreen-don-t-enable-hpd-interrupts-on-edp-lvds.patch [new file with mode: 0644]
queue-3.4/drm-radeon-fix-endian-bugs-in-atom_allocate_fb_scratch.patch [new file with mode: 0644]
queue-3.4/drm-radeon-fix-handling-of-v6-power-tables.patch [new file with mode: 0644]
queue-3.4/drm-radeon-fix-possible-segfault-when-parsing-pm-tables.patch [new file with mode: 0644]
queue-3.4/series

diff --git a/queue-3.4/drm-radeon-add-new-richland-pci-ids.patch b/queue-3.4/drm-radeon-add-new-richland-pci-ids.patch
new file mode 100644 (file)
index 0000000..21ae54a
--- /dev/null
@@ -0,0 +1,50 @@
+From 62d1f92e06aef9665d71ca7e986b3047ecf0b3c7 Mon Sep 17 00:00:00 2001
+From: Alex Deucher <alexander.deucher@amd.com>
+Date: Thu, 25 Apr 2013 14:06:05 -0400
+Subject: drm/radeon: add new richland pci ids
+
+From: Alex Deucher <alexander.deucher@amd.com>
+
+commit 62d1f92e06aef9665d71ca7e986b3047ecf0b3c7 upstream.
+
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/gpu/drm/radeon/ni.c |    6 ++++--
+ include/drm/drm_pciids.h    |    2 ++
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+--- a/drivers/gpu/drm/radeon/ni.c
++++ b/drivers/gpu/drm/radeon/ni.c
+@@ -668,7 +668,8 @@ static void cayman_gpu_init(struct radeo
+                   (rdev->pdev->device == 0x990F) ||
+                   (rdev->pdev->device == 0x9910) ||
+                   (rdev->pdev->device == 0x9917) ||
+-                  (rdev->pdev->device == 0x9999)) {
++                  (rdev->pdev->device == 0x9999) ||
++                  (rdev->pdev->device == 0x999C)) {
+                       rdev->config.cayman.max_simds_per_se = 6;
+                       rdev->config.cayman.max_backends_per_se = 2;
+               } else if ((rdev->pdev->device == 0x9903) ||
+@@ -677,7 +678,8 @@ static void cayman_gpu_init(struct radeo
+                          (rdev->pdev->device == 0x990D) ||
+                          (rdev->pdev->device == 0x990E) ||
+                          (rdev->pdev->device == 0x9913) ||
+-                         (rdev->pdev->device == 0x9918)) {
++                         (rdev->pdev->device == 0x9918) ||
++                         (rdev->pdev->device == 0x999D)) {
+                       rdev->config.cayman.max_simds_per_se = 4;
+                       rdev->config.cayman.max_backends_per_se = 2;
+               } else if ((rdev->pdev->device == 0x9919) ||
+--- a/include/drm/drm_pciids.h
++++ b/include/drm/drm_pciids.h
+@@ -597,6 +597,8 @@
+       {0x1002, 0x9999, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
+       {0x1002, 0x999A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
+       {0x1002, 0x999B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
++      {0x1002, 0x999C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
++      {0x1002, 0x999D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
+       {0x1002, 0x99A0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
+       {0x1002, 0x99A2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
+       {0x1002, 0x99A4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
diff --git a/queue-3.4/drm-radeon-evergreen-don-t-enable-hpd-interrupts-on-edp-lvds.patch b/queue-3.4/drm-radeon-evergreen-don-t-enable-hpd-interrupts-on-edp-lvds.patch
new file mode 100644 (file)
index 0000000..c33216a
--- /dev/null
@@ -0,0 +1,40 @@
+From 2e97be73e5f74a317232740ae82eb8f95326a660 Mon Sep 17 00:00:00 2001
+From: Alex Deucher <alexander.deucher@amd.com>
+Date: Thu, 11 Apr 2013 12:45:34 -0400
+Subject: drm/radeon/evergreen+: don't enable HPD interrupts on eDP/LVDS
+
+From: Alex Deucher <alexander.deucher@amd.com>
+
+commit 2e97be73e5f74a317232740ae82eb8f95326a660 upstream.
+
+Avoids potential interrupt storms when the display is disabled.
+
+May fix:
+https://bugzilla.kernel.org/show_bug.cgi?id=56041
+
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/gpu/drm/radeon/evergreen.c |   10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+--- a/drivers/gpu/drm/radeon/evergreen.c
++++ b/drivers/gpu/drm/radeon/evergreen.c
+@@ -445,6 +445,16 @@ void evergreen_hpd_init(struct radeon_de
+       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+               struct radeon_connector *radeon_connector = to_radeon_connector(connector);
++
++              if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
++                  connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
++                      /* don't try to enable hpd on eDP or LVDS avoid breaking the
++                       * aux dp channel on imac and help (but not completely fix)
++                       * https://bugzilla.redhat.com/show_bug.cgi?id=726143
++                       * also avoid interrupt storms during dpms.
++                       */
++                      continue;
++              }
+               switch (radeon_connector->hpd.hpd) {
+               case RADEON_HPD_1:
+                       WREG32(DC_HPD1_CONTROL, tmp);
diff --git a/queue-3.4/drm-radeon-fix-endian-bugs-in-atom_allocate_fb_scratch.patch b/queue-3.4/drm-radeon-fix-endian-bugs-in-atom_allocate_fb_scratch.patch
new file mode 100644 (file)
index 0000000..c160748
--- /dev/null
@@ -0,0 +1,33 @@
+From beb71fc61c2cad64e347f164991b8ef476529e64 Mon Sep 17 00:00:00 2001
+From: Alex Deucher <alexander.deucher@amd.com>
+Date: Wed, 24 Apr 2013 14:39:31 -0400
+Subject: drm/radeon: fix endian bugs in atom_allocate_fb_scratch()
+
+From: Alex Deucher <alexander.deucher@amd.com>
+
+commit beb71fc61c2cad64e347f164991b8ef476529e64 upstream.
+
+Reviwed-by: Michel Dänzer <michel.daenzer@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/gpu/drm/radeon/atom.c |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- a/drivers/gpu/drm/radeon/atom.c
++++ b/drivers/gpu/drm/radeon/atom.c
+@@ -1389,10 +1389,10 @@ int atom_allocate_fb_scratch(struct atom
+               firmware_usage = (struct _ATOM_VRAM_USAGE_BY_FIRMWARE *)(ctx->bios + data_offset);
+               DRM_DEBUG("atom firmware requested %08x %dkb\n",
+-                        firmware_usage->asFirmwareVramReserveInfo[0].ulStartAddrUsedByFirmware,
+-                        firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb);
++                        le32_to_cpu(firmware_usage->asFirmwareVramReserveInfo[0].ulStartAddrUsedByFirmware),
++                        le16_to_cpu(firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb));
+-              usage_bytes = firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb * 1024;
++              usage_bytes = le16_to_cpu(firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb) * 1024;
+       }
+       ctx->scratch_size_bytes = 0;
+       if (usage_bytes == 0)
diff --git a/queue-3.4/drm-radeon-fix-handling-of-v6-power-tables.patch b/queue-3.4/drm-radeon-fix-handling-of-v6-power-tables.patch
new file mode 100644 (file)
index 0000000..4478624
--- /dev/null
@@ -0,0 +1,62 @@
+From 441e76ca83ac604eaf0f046def96d8e3a27eea28 Mon Sep 17 00:00:00 2001
+From: Alex Deucher <alexander.deucher@amd.com>
+Date: Wed, 1 May 2013 14:34:54 -0400
+Subject: drm/radeon: fix handling of v6 power tables
+
+From: Alex Deucher <alexander.deucher@amd.com>
+
+commit 441e76ca83ac604eaf0f046def96d8e3a27eea28 upstream.
+
+The code was mis-handling variable sized arrays.
+
+Reported-by: Sylvain BERTRAND <sylware@legeek.net>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/gpu/drm/radeon/radeon_atombios.c |   11 +++++------
+ 1 file changed, 5 insertions(+), 6 deletions(-)
+
+--- a/drivers/gpu/drm/radeon/radeon_atombios.c
++++ b/drivers/gpu/drm/radeon/radeon_atombios.c
+@@ -2482,6 +2482,7 @@ static int radeon_atombios_parse_power_t
+       int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
+         u16 data_offset;
+       u8 frev, crev;
++      u8 *power_state_offset;
+       if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
+                                  &frev, &crev, &data_offset))
+@@ -2504,11 +2505,11 @@ static int radeon_atombios_parse_power_t
+                                      state_array->ucNumEntries, GFP_KERNEL);
+       if (!rdev->pm.power_state)
+               return state_index;
++      power_state_offset = (u8 *)state_array->states;
+       for (i = 0; i < state_array->ucNumEntries; i++) {
+               mode_index = 0;
+-              power_state = (union pplib_power_state *)&state_array->states[i];
+-              /* XXX this might be an inagua bug... */
+-              non_clock_array_index = i; /* power_state->v2.nonClockInfoIndex */
++              power_state = (union pplib_power_state *)power_state_offset;
++              non_clock_array_index = power_state->v2.nonClockInfoIndex;
+               non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
+                       &non_clock_info_array->nonClockInfo[non_clock_array_index];
+               rdev->pm.power_state[i].clock_info = kzalloc(sizeof(struct radeon_pm_clock_info) *
+@@ -2520,9 +2521,6 @@ static int radeon_atombios_parse_power_t
+               if (power_state->v2.ucNumDPMLevels) {
+                       for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) {
+                               clock_array_index = power_state->v2.clockInfoIndex[j];
+-                              /* XXX this might be an inagua bug... */
+-                              if (clock_array_index >= clock_info_array->ucNumEntries)
+-                                      continue;
+                               clock_info = (union pplib_clock_info *)
+                                       &clock_info_array->clockInfo[clock_array_index * clock_info_array->ucEntrySize];
+                               valid = radeon_atombios_parse_pplib_clock_info(rdev,
+@@ -2544,6 +2542,7 @@ static int radeon_atombios_parse_power_t
+                                                                  non_clock_info);
+                       state_index++;
+               }
++              power_state_offset += 2 + power_state->v2.ucNumDPMLevels;
+       }
+       /* if multiple clock modes, mark the lowest as no display */
+       for (i = 0; i < state_index; i++) {
diff --git a/queue-3.4/drm-radeon-fix-possible-segfault-when-parsing-pm-tables.patch b/queue-3.4/drm-radeon-fix-possible-segfault-when-parsing-pm-tables.patch
new file mode 100644 (file)
index 0000000..3c69db7
--- /dev/null
@@ -0,0 +1,62 @@
+From f8e6bfc2ce162855fa4f9822a45659f4b542c960 Mon Sep 17 00:00:00 2001
+From: Alex Deucher <alexander.deucher@amd.com>
+Date: Thu, 25 Apr 2013 09:29:17 -0400
+Subject: drm/radeon: fix possible segfault when parsing pm tables
+
+From: Alex Deucher <alexander.deucher@amd.com>
+
+commit f8e6bfc2ce162855fa4f9822a45659f4b542c960 upstream.
+
+If we have a empty power table, bail early and allocate
+the default power state.
+
+Should fix:
+https://bugs.freedesktop.org/show_bug.cgi?id=63865
+
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/gpu/drm/radeon/radeon_atombios.c |   10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+--- a/drivers/gpu/drm/radeon/radeon_atombios.c
++++ b/drivers/gpu/drm/radeon/radeon_atombios.c
+@@ -1998,6 +1998,8 @@ static int radeon_atombios_parse_power_t
+       num_modes = power_info->info.ucNumOfPowerModeEntries;
+       if (num_modes > ATOM_MAX_NUMBEROF_POWER_BLOCK)
+               num_modes = ATOM_MAX_NUMBEROF_POWER_BLOCK;
++      if (num_modes == 0)
++              return state_index;
+       rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) * num_modes, GFP_KERNEL);
+       if (!rdev->pm.power_state)
+               return state_index;
+@@ -2396,6 +2398,8 @@ static int radeon_atombios_parse_power_t
+       power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
+       radeon_atombios_add_pplib_thermal_controller(rdev, &power_info->pplib.sThermalController);
++      if (power_info->pplib.ucNumStates == 0)
++              return state_index;
+       rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) *
+                                      power_info->pplib.ucNumStates, GFP_KERNEL);
+       if (!rdev->pm.power_state)
+@@ -2494,6 +2498,8 @@ static int radeon_atombios_parse_power_t
+       non_clock_info_array = (struct _NonClockInfoArray *)
+               (mode_info->atom_context->bios + data_offset +
+                le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset));
++      if (state_array->ucNumEntries == 0)
++              return state_index;
+       rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) *
+                                      state_array->ucNumEntries, GFP_KERNEL);
+       if (!rdev->pm.power_state)
+@@ -2584,7 +2590,9 @@ void radeon_atombios_get_power_modes(str
+               default:
+                       break;
+               }
+-      } else {
++      }
++
++      if (state_index == 0) {
+               rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state), GFP_KERNEL);
+               if (rdev->pm.power_state) {
+                       rdev->pm.power_state[0].clock_info =
index 3f2ff32a5fe52a76912f89510c0dd5436a2414d7..bcc0c4cee752fc5d6fbd6acfbad94d6f02046165 100644 (file)
@@ -16,3 +16,8 @@ drm-radeon-dce6-add-missing-display-reg-for-tiling-setup.patch
 drm-radeon-properly-lock-disp-in-mc_stop-resume-for-evergreen.patch
 drm-radeon-disable-the-crtcs-in-mc_stop-evergreen-v2.patch
 drm-radeon-add-some-new-si-pci-ids.patch
+drm-radeon-evergreen-don-t-enable-hpd-interrupts-on-edp-lvds.patch
+drm-radeon-fix-endian-bugs-in-atom_allocate_fb_scratch.patch
+drm-radeon-fix-possible-segfault-when-parsing-pm-tables.patch
+drm-radeon-add-new-richland-pci-ids.patch
+drm-radeon-fix-handling-of-v6-power-tables.patch