[PATCH] drm/radeon: Fix num_banks calculation for SI
Alex Deucher
alexdeucher at gmail.com
Tue Apr 22 05:51:06 PDT 2014
On Tue, Apr 22, 2014 at 3:53 AM, Michel Dänzer <michel at daenzer.net> wrote:
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> The way the tile mode array index was calculated only makes sense for
> the CIK specific macrotile mode array. For SI, we need to use one of the
> tile mode array indices reserved for displayable surfaces.
>
> This happened to result in correct display most if not all of the time
> because most of the SI tiling modes use the same number of banks.
>
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
Thanks for doing this.
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
Christian, can you cc stable when you pick this up?
Alex
> ---
> drivers/gpu/drm/radeon/atombios_crtc.c | 46 +++++++++++++++++++++++-----------
> 1 file changed, 31 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c
> index fb187c7..2b8039b 100644
> --- a/drivers/gpu/drm/radeon/atombios_crtc.c
> +++ b/drivers/gpu/drm/radeon/atombios_crtc.c
> @@ -1177,27 +1177,43 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
>
> /* Set NUM_BANKS. */
> if (rdev->family >= CHIP_TAHITI) {
> - unsigned tileb, index, num_banks, tile_split_bytes;
> + unsigned index, num_banks;
>
> - /* Calculate the macrotile mode index. */
> - tile_split_bytes = 64 << tile_split;
> - tileb = 8 * 8 * target_fb->bits_per_pixel / 8;
> - tileb = min(tile_split_bytes, tileb);
> + if (rdev->family >= CHIP_BONAIRE) {
> + unsigned tileb, tile_split_bytes;
>
> - for (index = 0; tileb > 64; index++) {
> - tileb >>= 1;
> - }
> + /* Calculate the macrotile mode index. */
> + tile_split_bytes = 64 << tile_split;
> + tileb = 8 * 8 * target_fb->bits_per_pixel / 8;
> + tileb = min(tile_split_bytes, tileb);
>
> - if (index >= 16) {
> - DRM_ERROR("Wrong screen bpp (%u) or tile split (%u)\n",
> - target_fb->bits_per_pixel, tile_split);
> - return -EINVAL;
> - }
> + for (index = 0; tileb > 64; index++)
> + tileb >>= 1;
> +
> + if (index >= 16) {
> + DRM_ERROR("Wrong screen bpp (%u) or tile split (%u)\n",
> + target_fb->bits_per_pixel, tile_split);
> + return -EINVAL;
> + }
>
> - if (rdev->family >= CHIP_BONAIRE)
> num_banks = (rdev->config.cik.macrotile_mode_array[index] >> 6) & 0x3;
> - else
> + } else {
> + switch (target_fb->bits_per_pixel) {
> + case 8:
> + index = 10;
> + break;
> + case 16:
> + index = SI_TILE_MODE_COLOR_2D_SCANOUT_16BPP;
> + break;
> + default:
> + case 32:
> + index = SI_TILE_MODE_COLOR_2D_SCANOUT_32BPP;
> + break;
> + }
> +
> num_banks = (rdev->config.si.tile_mode_array[index] >> 20) & 0x3;
> + }
> +
> fb_format |= EVERGREEN_GRPH_NUM_BANKS(num_banks);
> } else {
> /* NI and older. */
> --
> 1.9.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