diff mbox

[1/2] drm/radeon: fix render backend setup for SI and CIK

Message ID 1387675081-3406-1-git-send-email-maraeo@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Marek Olšák Dec. 22, 2013, 1:18 a.m. UTC
From: Marek Olšák <marek.olsak@amd.com>

Only the render backends of the first shader engine were enabled. The others
were erroneously disabled. Enabling the other render backends improves
performance a lot.

Unigine Sanctuary on Bonaire:
  Before: 15 fps
  After:  90 fps

Judging from the fan noise, the GPU was also underclocked when the other
render backends were disabled, resulting in horrible performance. The fan is
a lot noisy under load now.

Signed-off-by: Marek Olšák <marek.olsak@amd.com>
---
 drivers/gpu/drm/radeon/cik.c | 10 +++++-----
 drivers/gpu/drm/radeon/si.c  | 10 +++++-----
 2 files changed, 10 insertions(+), 10 deletions(-)

Comments

Alex Deucher Dec. 23, 2013, 3:02 p.m. UTC | #1
On Sat, Dec 21, 2013 at 8:18 PM, Marek Olšák <maraeo@gmail.com> wrote:
> From: Marek Olšák <marek.olsak@amd.com>
>
> Only the render backends of the first shader engine were enabled. The others
> were erroneously disabled. Enabling the other render backends improves
> performance a lot.
>
> Unigine Sanctuary on Bonaire:
>   Before: 15 fps
>   After:  90 fps
>
> Judging from the fan noise, the GPU was also underclocked when the other
> render backends were disabled, resulting in horrible performance. The fan is
> a lot noisy under load now.
>
> Signed-off-by: Marek Olšák <marek.olsak@amd.com>

Applied the series to my -fixes tree.  Thanks!

Alex

> ---
>  drivers/gpu/drm/radeon/cik.c | 10 +++++-----
>  drivers/gpu/drm/radeon/si.c  | 10 +++++-----
>  2 files changed, 10 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
> index b43a3a3..138a776 100644
> --- a/drivers/gpu/drm/radeon/cik.c
> +++ b/drivers/gpu/drm/radeon/cik.c
> @@ -3057,7 +3057,7 @@ static u32 cik_create_bitmask(u32 bit_width)
>   * Returns the disabled RB bitmask.
>   */
>  static u32 cik_get_rb_disabled(struct radeon_device *rdev,
> -                             u32 max_rb_num, u32 se_num,
> +                             u32 max_rb_num_per_se,
>                               u32 sh_per_se)
>  {
>         u32 data, mask;
> @@ -3071,7 +3071,7 @@ static u32 cik_get_rb_disabled(struct radeon_device *rdev,
>
>         data >>= BACKEND_DISABLE_SHIFT;
>
> -       mask = cik_create_bitmask(max_rb_num / se_num / sh_per_se);
> +       mask = cik_create_bitmask(max_rb_num_per_se / sh_per_se);
>
>         return data & mask;
>  }
> @@ -3088,7 +3088,7 @@ static u32 cik_get_rb_disabled(struct radeon_device *rdev,
>   */
>  static void cik_setup_rb(struct radeon_device *rdev,
>                          u32 se_num, u32 sh_per_se,
> -                        u32 max_rb_num)
> +                        u32 max_rb_num_per_se)
>  {
>         int i, j;
>         u32 data, mask;
> @@ -3098,7 +3098,7 @@ static void cik_setup_rb(struct radeon_device *rdev,
>         for (i = 0; i < se_num; i++) {
>                 for (j = 0; j < sh_per_se; j++) {
>                         cik_select_se_sh(rdev, i, j);
> -                       data = cik_get_rb_disabled(rdev, max_rb_num, se_num, sh_per_se);
> +                       data = cik_get_rb_disabled(rdev, max_rb_num_per_se, sh_per_se);
>                         if (rdev->family == CHIP_HAWAII)
>                                 disabled_rbs |= data << ((i * sh_per_se + j) * HAWAII_RB_BITMAP_WIDTH_PER_SH);
>                         else
> @@ -3108,7 +3108,7 @@ static void cik_setup_rb(struct radeon_device *rdev,
>         cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
>
>         mask = 1;
> -       for (i = 0; i < max_rb_num; i++) {
> +       for (i = 0; i < max_rb_num_per_se * se_num; i++) {
>                 if (!(disabled_rbs & mask))
>                         enabled_rbs |= mask;
>                 mask <<= 1;
> diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
> index a36736d..3eed9a1 100644
> --- a/drivers/gpu/drm/radeon/si.c
> +++ b/drivers/gpu/drm/radeon/si.c
> @@ -2811,7 +2811,7 @@ static void si_setup_spi(struct radeon_device *rdev,
>  }
>
>  static u32 si_get_rb_disabled(struct radeon_device *rdev,
> -                             u32 max_rb_num, u32 se_num,
> +                             u32 max_rb_num_per_se,
>                               u32 sh_per_se)
>  {
>         u32 data, mask;
> @@ -2825,14 +2825,14 @@ static u32 si_get_rb_disabled(struct radeon_device *rdev,
>
>         data >>= BACKEND_DISABLE_SHIFT;
>
> -       mask = si_create_bitmask(max_rb_num / se_num / sh_per_se);
> +       mask = si_create_bitmask(max_rb_num_per_se / sh_per_se);
>
>         return data & mask;
>  }
>
>  static void si_setup_rb(struct radeon_device *rdev,
>                         u32 se_num, u32 sh_per_se,
> -                       u32 max_rb_num)
> +                       u32 max_rb_num_per_se)
>  {
>         int i, j;
>         u32 data, mask;
> @@ -2842,14 +2842,14 @@ static void si_setup_rb(struct radeon_device *rdev,
>         for (i = 0; i < se_num; i++) {
>                 for (j = 0; j < sh_per_se; j++) {
>                         si_select_se_sh(rdev, i, j);
> -                       data = si_get_rb_disabled(rdev, max_rb_num, se_num, sh_per_se);
> +                       data = si_get_rb_disabled(rdev, max_rb_num_per_se, sh_per_se);
>                         disabled_rbs |= data << ((i * sh_per_se + j) * TAHITI_RB_BITMAP_WIDTH_PER_SH);
>                 }
>         }
>         si_select_se_sh(rdev, 0xffffffff, 0xffffffff);
>
>         mask = 1;
> -       for (i = 0; i < max_rb_num; i++) {
> +       for (i = 0; i < max_rb_num_per_se * se_num; i++) {
>                 if (!(disabled_rbs & mask))
>                         enabled_rbs |= mask;
>                 mask <<= 1;
> --
> 1.8.3.2
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
diff mbox

Patch

diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index b43a3a3..138a776 100644
--- a/drivers/gpu/drm/radeon/cik.c
+++ b/drivers/gpu/drm/radeon/cik.c
@@ -3057,7 +3057,7 @@  static u32 cik_create_bitmask(u32 bit_width)
  * Returns the disabled RB bitmask.
  */
 static u32 cik_get_rb_disabled(struct radeon_device *rdev,
-			      u32 max_rb_num, u32 se_num,
+			      u32 max_rb_num_per_se,
 			      u32 sh_per_se)
 {
 	u32 data, mask;
@@ -3071,7 +3071,7 @@  static u32 cik_get_rb_disabled(struct radeon_device *rdev,
 
 	data >>= BACKEND_DISABLE_SHIFT;
 
-	mask = cik_create_bitmask(max_rb_num / se_num / sh_per_se);
+	mask = cik_create_bitmask(max_rb_num_per_se / sh_per_se);
 
 	return data & mask;
 }
@@ -3088,7 +3088,7 @@  static u32 cik_get_rb_disabled(struct radeon_device *rdev,
  */
 static void cik_setup_rb(struct radeon_device *rdev,
 			 u32 se_num, u32 sh_per_se,
-			 u32 max_rb_num)
+			 u32 max_rb_num_per_se)
 {
 	int i, j;
 	u32 data, mask;
@@ -3098,7 +3098,7 @@  static void cik_setup_rb(struct radeon_device *rdev,
 	for (i = 0; i < se_num; i++) {
 		for (j = 0; j < sh_per_se; j++) {
 			cik_select_se_sh(rdev, i, j);
-			data = cik_get_rb_disabled(rdev, max_rb_num, se_num, sh_per_se);
+			data = cik_get_rb_disabled(rdev, max_rb_num_per_se, sh_per_se);
 			if (rdev->family == CHIP_HAWAII)
 				disabled_rbs |= data << ((i * sh_per_se + j) * HAWAII_RB_BITMAP_WIDTH_PER_SH);
 			else
@@ -3108,7 +3108,7 @@  static void cik_setup_rb(struct radeon_device *rdev,
 	cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
 
 	mask = 1;
-	for (i = 0; i < max_rb_num; i++) {
+	for (i = 0; i < max_rb_num_per_se * se_num; i++) {
 		if (!(disabled_rbs & mask))
 			enabled_rbs |= mask;
 		mask <<= 1;
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
index a36736d..3eed9a1 100644
--- a/drivers/gpu/drm/radeon/si.c
+++ b/drivers/gpu/drm/radeon/si.c
@@ -2811,7 +2811,7 @@  static void si_setup_spi(struct radeon_device *rdev,
 }
 
 static u32 si_get_rb_disabled(struct radeon_device *rdev,
-			      u32 max_rb_num, u32 se_num,
+			      u32 max_rb_num_per_se,
 			      u32 sh_per_se)
 {
 	u32 data, mask;
@@ -2825,14 +2825,14 @@  static u32 si_get_rb_disabled(struct radeon_device *rdev,
 
 	data >>= BACKEND_DISABLE_SHIFT;
 
-	mask = si_create_bitmask(max_rb_num / se_num / sh_per_se);
+	mask = si_create_bitmask(max_rb_num_per_se / sh_per_se);
 
 	return data & mask;
 }
 
 static void si_setup_rb(struct radeon_device *rdev,
 			u32 se_num, u32 sh_per_se,
-			u32 max_rb_num)
+			u32 max_rb_num_per_se)
 {
 	int i, j;
 	u32 data, mask;
@@ -2842,14 +2842,14 @@  static void si_setup_rb(struct radeon_device *rdev,
 	for (i = 0; i < se_num; i++) {
 		for (j = 0; j < sh_per_se; j++) {
 			si_select_se_sh(rdev, i, j);
-			data = si_get_rb_disabled(rdev, max_rb_num, se_num, sh_per_se);
+			data = si_get_rb_disabled(rdev, max_rb_num_per_se, sh_per_se);
 			disabled_rbs |= data << ((i * sh_per_se + j) * TAHITI_RB_BITMAP_WIDTH_PER_SH);
 		}
 	}
 	si_select_se_sh(rdev, 0xffffffff, 0xffffffff);
 
 	mask = 1;
-	for (i = 0; i < max_rb_num; i++) {
+	for (i = 0; i < max_rb_num_per_se * se_num; i++) {
 		if (!(disabled_rbs & mask))
 			enabled_rbs |= mask;
 		mask <<= 1;