From f2b217cc5361469936c4074a415949ce134cae5e Mon Sep 17 00:00:00 2001 From: fritsch Date: Tue, 5 Nov 2013 12:55:49 +0100 Subject: [PATCH 1/3] Workaround for some Radeon SI cards (Alex Deucher) --- .../linux-990.12-Radeon-SI-workaround.patch | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 packages/linux/patches/3.12/linux-990.12-Radeon-SI-workaround.patch diff --git a/packages/linux/patches/3.12/linux-990.12-Radeon-SI-workaround.patch b/packages/linux/patches/3.12/linux-990.12-Radeon-SI-workaround.patch new file mode 100644 index 0000000000..0f030d8337 --- /dev/null +++ b/packages/linux/patches/3.12/linux-990.12-Radeon-SI-workaround.patch @@ -0,0 +1,46 @@ +From 8c01e58073101756ce1aceadf0471fcb0db6a61c Mon Sep 17 00:00:00 2001 +From: fritsch +Date: Fri, 25 Oct 2013 19:22:44 +0200 +Subject: [PATCH 2/5] Radeon SI workaround + +--- + drivers/gpu/drm/radeon/ni.c | 23 ++++++++++++++++++++++- + 1 file changed, 22 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c +index cac2866..66441cf 100644 +--- a/drivers/gpu/drm/radeon/ni.c ++++ b/drivers/gpu/drm/radeon/ni.c +@@ -933,7 +933,28 @@ static void cayman_gpu_init(struct radeon_device *rdev) + rdev->config.cayman.sx_max_export_size = 256; + rdev->config.cayman.sx_max_export_pos_size = 64; + rdev->config.cayman.sx_max_export_smx_size = 192; +- rdev->config.cayman.max_hw_contexts = 8; ++ if ((rdev->pdev->device == 0x9900) || ++ (rdev->pdev->device == 0x9901) || ++ (rdev->pdev->device == 0x9903) || ++ (rdev->pdev->device == 0x9904) || ++ (rdev->pdev->device == 0x9905) || ++ (rdev->pdev->device == 0x9906) || ++ (rdev->pdev->device == 0x9907) || ++ (rdev->pdev->device == 0x9908) || ++ (rdev->pdev->device == 0x9909) || ++ (rdev->pdev->device == 0x990A) || ++ (rdev->pdev->device == 0x990B) || ++ (rdev->pdev->device == 0x990C) || ++ (rdev->pdev->device == 0x990D) || ++ (rdev->pdev->device == 0x990E) || ++ (rdev->pdev->device == 0x990F) || ++ (rdev->pdev->device == 0x9910) || ++ (rdev->pdev->device == 0x9913) || ++ (rdev->pdev->device == 0x9917) || ++ (rdev->pdev->device == 0x9918)) ++ rdev->config.cayman.max_hw_contexts = 8; ++ else ++ rdev->config.cayman.max_hw_contexts = 4; + rdev->config.cayman.sq_num_cf_insts = 2; + + rdev->config.cayman.sc_prim_fifo_size = 0x40; +-- +1.8.3.2 + From 42301f575c1abf9d517001db43ec66caf089bd5b Mon Sep 17 00:00:00 2001 From: fritsch Date: Tue, 5 Nov 2013 12:56:11 +0100 Subject: [PATCH 2/3] Fix 24p and 24.0 playback by calculating the modelines correctly (via https://bugs.freedesktop.org/show_bug.cgi?id=69675) --- ...-clock-calculations-by-Pierre-Ossman.patch | 124 ++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 packages/linux/patches/3.12/linux-990.13-Fix-clock-calculations-by-Pierre-Ossman.patch diff --git a/packages/linux/patches/3.12/linux-990.13-Fix-clock-calculations-by-Pierre-Ossman.patch b/packages/linux/patches/3.12/linux-990.13-Fix-clock-calculations-by-Pierre-Ossman.patch new file mode 100644 index 0000000000..01a8059002 --- /dev/null +++ b/packages/linux/patches/3.12/linux-990.13-Fix-clock-calculations-by-Pierre-Ossman.patch @@ -0,0 +1,124 @@ +From 7c6feef46f4fa9085ad63bd8c80604222bbd4be3 Mon Sep 17 00:00:00 2001 +From: fritsch +Date: Fri, 1 Nov 2013 15:28:53 +0100 +Subject: [PATCH 4/5] Fix clock calculations by Pierre Ossman + +--- + drivers/gpu/drm/radeon/r600_hdmi.c | 74 +++++++++++++++++++++++++------------- + 1 file changed, 49 insertions(+), 25 deletions(-) + +diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c +index 06022e3..7fa8a93 100644 +--- a/drivers/gpu/drm/radeon/r600_hdmi.c ++++ b/drivers/gpu/drm/radeon/r600_hdmi.c +@@ -24,6 +24,7 @@ + * Authors: Christian König + */ + #include ++#include + #include + #include + #include "radeon.h" +@@ -57,35 +58,56 @@ enum r600_hdmi_iec_status_bits { + static const struct radeon_hdmi_acr r600_hdmi_predefined_acr[] = { + /* 32kHz 44.1kHz 48kHz */ + /* Clock N CTS N CTS N CTS */ +- { 25175, 4576, 28125, 7007, 31250, 6864, 28125 }, /* 25,20/1.001 MHz */ ++ { 25175, 4096, 25175, 28224, 125875, 6144, 25175 }, /* 25,20/1.001 MHz */ + { 25200, 4096, 25200, 6272, 28000, 6144, 25200 }, /* 25.20 MHz */ + { 27000, 4096, 27000, 6272, 30000, 6144, 27000 }, /* 27.00 MHz */ + { 27027, 4096, 27027, 6272, 30030, 6144, 27027 }, /* 27.00*1.001 MHz */ + { 54000, 4096, 54000, 6272, 60000, 6144, 54000 }, /* 54.00 MHz */ + { 54054, 4096, 54054, 6272, 60060, 6144, 54054 }, /* 54.00*1.001 MHz */ +- { 74176, 11648, 210937, 17836, 234375, 11648, 140625 }, /* 74.25/1.001 MHz */ ++ { 74176, 4096, 74176, 5733, 75335, 6144, 74176 }, /* 74.25/1.001 MHz */ + { 74250, 4096, 74250, 6272, 82500, 6144, 74250 }, /* 74.25 MHz */ +- { 148352, 11648, 421875, 8918, 234375, 5824, 140625 }, /* 148.50/1.001 MHz */ ++ { 148352, 4096, 148352, 5733, 150670, 6144, 148352 }, /* 148.50/1.001 MHz */ + { 148500, 4096, 148500, 6272, 165000, 6144, 148500 }, /* 148.50 MHz */ +- { 0, 4096, 0, 6272, 0, 6144, 0 } /* Other */ + }; + + /* +- * calculate CTS value if it's not found in the table ++ * calculate CTS and N values if they are not found in the table + */ +-static void r600_hdmi_calc_cts(uint32_t clock, int *CTS, int N, int freq) ++static void r600_hdmi_calc_cts(uint32_t clock, int *CTS, int *N, int freq) + { +- u64 n; +- u32 d; +- +- if (*CTS == 0) { +- n = (u64)clock * (u64)N * 1000ULL; +- d = 128 * freq; +- do_div(n, d); +- *CTS = n; +- } +- DRM_DEBUG("Using ACR timing N=%d CTS=%d for frequency %d\n", +- N, *CTS, freq); ++ int n, cts; ++ unsigned long div, mul; ++ ++ /* Safe, but overly large values */ ++ n = 128 * freq; ++ cts = clock * 1000; ++ ++ /* Smallest valid fraction */ ++ div = gcd(n, cts); ++ ++ n /= div; ++ cts /= div; ++ ++ /* ++ * The optimal N is 128*freq/1000. Calculate the closest larger ++ * value that doesn't truncate any bits. ++ */ ++ mul = ((128*freq/1000) + (n-1))/n; ++ ++ n *= mul; ++ cts *= mul; ++ ++ /* Check that we are in spec (not always possible) */ ++ if (n < (128*freq/1500)) ++ printk(KERN_WARNING "Calculated ACR N value is too small. You may experience audio problems.\n"); ++ if (n > (128*freq/300)) ++ printk(KERN_WARNING "Calculated ACR N value is too large. You may experience audio problems.\n"); ++ ++ *N = n; ++ *CTS = cts; ++ ++ DRM_DEBUG("Calculated ACR timing N=%d CTS=%d for frequency %d\n", ++ *N, *CTS, freq); + } + + struct radeon_hdmi_acr r600_hdmi_acr(uint32_t clock) +@@ -93,15 +115,17 @@ struct radeon_hdmi_acr r600_hdmi_acr(uint32_t clock) + struct radeon_hdmi_acr res; + u8 i; + +- for (i = 0; r600_hdmi_predefined_acr[i].clock != clock && +- r600_hdmi_predefined_acr[i].clock != 0; i++) +- ; +- res = r600_hdmi_predefined_acr[i]; ++ /* Precalculated values for common clocks */ ++ for (i = 0; i < ARRAY_SIZE(r600_hdmi_predefined_acr); i++) { ++ if (r600_hdmi_predefined_acr[i].clock == clock) { ++ return r600_hdmi_predefined_acr[i]; ++ } ++ } + +- /* In case some CTS are missing */ +- r600_hdmi_calc_cts(clock, &res.cts_32khz, res.n_32khz, 32000); +- r600_hdmi_calc_cts(clock, &res.cts_44_1khz, res.n_44_1khz, 44100); +- r600_hdmi_calc_cts(clock, &res.cts_48khz, res.n_48khz, 48000); ++ /* And odd clocks get manually calculated */ ++ r600_hdmi_calc_cts(clock, &res.cts_32khz, &res.n_32khz, 32000); ++ r600_hdmi_calc_cts(clock, &res.cts_44_1khz, &res.n_44_1khz, 44100); ++ r600_hdmi_calc_cts(clock, &res.cts_48khz, &res.n_48khz, 48000); + + return res; + } +-- +1.8.3.2 + From 3684dc53b36f98ada87c27131fb11c01e0c6eeba Mon Sep 17 00:00:00 2001 From: fritsch Date: Tue, 5 Nov 2013 12:56:55 +0100 Subject: [PATCH 3/3] Calulate Modelines more accurately (via: https://bugs.freedesktop.org/show_bug.cgi?id=69675) --- ...e-values-for-fractional-divs-concern.patch | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 packages/linux/patches/3.12/linux-990.14-Use-more-accurate-values-for-fractional-divs-concern.patch diff --git a/packages/linux/patches/3.12/linux-990.14-Use-more-accurate-values-for-fractional-divs-concern.patch b/packages/linux/patches/3.12/linux-990.14-Use-more-accurate-values-for-fractional-divs-concern.patch new file mode 100644 index 0000000000..aac4c14a17 --- /dev/null +++ b/packages/linux/patches/3.12/linux-990.14-Use-more-accurate-values-for-fractional-divs-concern.patch @@ -0,0 +1,28 @@ +From adb04eb48248fb96493e80b69ff0db6c5e69b81b Mon Sep 17 00:00:00 2001 +From: fritsch +Date: Fri, 1 Nov 2013 08:10:17 +0100 +Subject: [PATCH 5/5] Use more accurate values for fractional divs concerning + audio + +--- + drivers/gpu/drm/radeon/atombios_crtc.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c +index bf87f6d..40c61a2 100644 +--- a/drivers/gpu/drm/radeon/atombios_crtc.c ++++ b/drivers/gpu/drm/radeon/atombios_crtc.c +@@ -554,8 +554,8 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, + + if (rdev->family < CHIP_RV770) + radeon_crtc->pll_flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP; +- /* use frac fb div on APUs */ +- if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE61(rdev) || ASIC_IS_DCE8(rdev)) ++ /* use frac fb div on DCE4+ */ ++ if (ASIC_IS_DCE4(rdev)) + radeon_crtc->pll_flags |= RADEON_PLL_USE_FRAC_FB_DIV; + /* use frac fb div on RS780/RS880 */ + if ((rdev->family == CHIP_RS780) || (rdev->family == CHIP_RS880)) +-- +1.8.3.2 +