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

Alex Deucher alexdeucher at gmail.com
Mon Dec 23 07:02:32 PST 2013


On Sat, Dec 21, 2013 at 8:18 PM, Marek Olšák <maraeo at gmail.com> wrote:
> From: Marek Olšák <marek.olsak at 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 at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel


More information about the dri-devel mailing list