From 8e5193125d1baa96df90f3163680b9ad624031cb Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 9 May 2013 13:22:00 -0700 Subject: [PATCH] 3.4-stable patches 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 --- .../drm-radeon-add-new-richland-pci-ids.patch | 50 +++++++++++++++ ...-t-enable-hpd-interrupts-on-edp-lvds.patch | 40 ++++++++++++ ...ian-bugs-in-atom_allocate_fb_scratch.patch | 33 ++++++++++ ...deon-fix-handling-of-v6-power-tables.patch | 62 +++++++++++++++++++ ...ible-segfault-when-parsing-pm-tables.patch | 62 +++++++++++++++++++ queue-3.4/series | 5 ++ 6 files changed, 252 insertions(+) create mode 100644 queue-3.4/drm-radeon-add-new-richland-pci-ids.patch create mode 100644 queue-3.4/drm-radeon-evergreen-don-t-enable-hpd-interrupts-on-edp-lvds.patch create mode 100644 queue-3.4/drm-radeon-fix-endian-bugs-in-atom_allocate_fb_scratch.patch create mode 100644 queue-3.4/drm-radeon-fix-handling-of-v6-power-tables.patch create mode 100644 queue-3.4/drm-radeon-fix-possible-segfault-when-parsing-pm-tables.patch 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 index 00000000000..21ae54a1505 --- /dev/null +++ b/queue-3.4/drm-radeon-add-new-richland-pci-ids.patch @@ -0,0 +1,50 @@ +From 62d1f92e06aef9665d71ca7e986b3047ecf0b3c7 Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Thu, 25 Apr 2013 14:06:05 -0400 +Subject: drm/radeon: add new richland pci ids + +From: Alex Deucher + +commit 62d1f92e06aef9665d71ca7e986b3047ecf0b3c7 upstream. + +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..c33216a1a81 --- /dev/null +++ b/queue-3.4/drm-radeon-evergreen-don-t-enable-hpd-interrupts-on-edp-lvds.patch @@ -0,0 +1,40 @@ +From 2e97be73e5f74a317232740ae82eb8f95326a660 Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Thu, 11 Apr 2013 12:45:34 -0400 +Subject: drm/radeon/evergreen+: don't enable HPD interrupts on eDP/LVDS + +From: Alex Deucher + +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 +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..c1607487d9a --- /dev/null +++ b/queue-3.4/drm-radeon-fix-endian-bugs-in-atom_allocate_fb_scratch.patch @@ -0,0 +1,33 @@ +From beb71fc61c2cad64e347f164991b8ef476529e64 Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Wed, 24 Apr 2013 14:39:31 -0400 +Subject: drm/radeon: fix endian bugs in atom_allocate_fb_scratch() + +From: Alex Deucher + +commit beb71fc61c2cad64e347f164991b8ef476529e64 upstream. + +Reviwed-by: Michel Dänzer +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..4478624d022 --- /dev/null +++ b/queue-3.4/drm-radeon-fix-handling-of-v6-power-tables.patch @@ -0,0 +1,62 @@ +From 441e76ca83ac604eaf0f046def96d8e3a27eea28 Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Wed, 1 May 2013 14:34:54 -0400 +Subject: drm/radeon: fix handling of v6 power tables + +From: Alex Deucher + +commit 441e76ca83ac604eaf0f046def96d8e3a27eea28 upstream. + +The code was mis-handling variable sized arrays. + +Reported-by: Sylvain BERTRAND +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..3c69db77004 --- /dev/null +++ b/queue-3.4/drm-radeon-fix-possible-segfault-when-parsing-pm-tables.patch @@ -0,0 +1,62 @@ +From f8e6bfc2ce162855fa4f9822a45659f4b542c960 Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Thu, 25 Apr 2013 09:29:17 -0400 +Subject: drm/radeon: fix possible segfault when parsing pm tables + +From: Alex Deucher + +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 +Signed-off-by: Greg Kroah-Hartman + +--- + 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 = diff --git a/queue-3.4/series b/queue-3.4/series index 3f2ff32a5fe..bcc0c4cee75 100644 --- a/queue-3.4/series +++ b/queue-3.4/series @@ -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 -- 2.47.3