mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/
synced 2026-04-18 06:33:43 -04:00
drm/amd: Add GFX11 modifiers support to AMDGPU (v3)
GFX11 IP introduces new tiling mode. Various combinations of DCC settings are possible and the most preferred settings must be exposed for optimal use of the hardware. add_gfx11_modifiers() is based on recommendation from Marek for the preferred tiling modifier that are most efficient for the hardware. v2: microtiling fix noticed by Marek v3: keep Z tiling check Signed-off-by: Aurabindo Pillai <aurabindo.pillai@amd.com> Acked-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Alex Deucher
parent
49401d3a5c
commit
543036a2de
@@ -89,10 +89,14 @@
|
||||
#include "dcn/dcn_1_0_offset.h"
|
||||
#include "dcn/dcn_1_0_sh_mask.h"
|
||||
#include "soc15_hw_ip.h"
|
||||
#include "soc15_common.h"
|
||||
#include "vega10_ip_offset.h"
|
||||
|
||||
#include "soc15_common.h"
|
||||
|
||||
#include "gc/gc_11_0_0_offset.h"
|
||||
#include "gc/gc_11_0_0_sh_mask.h"
|
||||
|
||||
#include "modules/inc/mod_freesync.h"
|
||||
#include "modules/power/power_helpers.h"
|
||||
#include "modules/inc/mod_info_packet.h"
|
||||
@@ -4888,7 +4892,9 @@ fill_gfx9_tiling_info_from_modifier(const struct amdgpu_device *adev,
|
||||
unsigned int mod_bank_xor_bits = AMD_FMT_MOD_GET(BANK_XOR_BITS, modifier);
|
||||
unsigned int mod_pipe_xor_bits = AMD_FMT_MOD_GET(PIPE_XOR_BITS, modifier);
|
||||
unsigned int pkrs_log2 = AMD_FMT_MOD_GET(PACKERS, modifier);
|
||||
unsigned int pipes_log2 = min(4u, mod_pipe_xor_bits);
|
||||
unsigned int pipes_log2;
|
||||
|
||||
pipes_log2 = min(5u, mod_pipe_xor_bits);
|
||||
|
||||
fill_gfx9_tiling_info_from_device(adev, tiling_info);
|
||||
|
||||
@@ -5224,8 +5230,69 @@ add_gfx10_3_modifiers(const struct amdgpu_device *adev,
|
||||
AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX9));
|
||||
}
|
||||
|
||||
static void
|
||||
add_gfx11_modifiers(struct amdgpu_device *adev,
|
||||
uint64_t **mods, uint64_t *size, uint64_t *capacity)
|
||||
{
|
||||
int num_pipes = 0;
|
||||
int pipe_xor_bits = 0;
|
||||
int num_pkrs = 0;
|
||||
int pkrs = 0;
|
||||
u32 gb_addr_config;
|
||||
unsigned swizzle_r_x;
|
||||
uint64_t modifier_r_x;
|
||||
uint64_t modifier_dcc_best;
|
||||
uint64_t modifier_dcc_4k;
|
||||
|
||||
/* TODO: GFX11 IP HW init hasnt finish and we get zero if we read from
|
||||
* adev->gfx.config.gb_addr_config_fields.num_{pkrs,pipes} */
|
||||
gb_addr_config = RREG32_SOC15(GC, 0, regGB_ADDR_CONFIG);
|
||||
ASSERT(gb_addr_config != 0);
|
||||
|
||||
num_pkrs = 1 << REG_GET_FIELD(gb_addr_config, GB_ADDR_CONFIG, NUM_PKRS);
|
||||
pkrs = ilog2(num_pkrs);
|
||||
num_pipes = 1 << REG_GET_FIELD(gb_addr_config, GB_ADDR_CONFIG, NUM_PIPES);
|
||||
pipe_xor_bits = ilog2(num_pipes);
|
||||
|
||||
/* R_X swizzle modes are the best for rendering and DCC requires them. */
|
||||
swizzle_r_x = num_pipes > 16 ? AMD_FMT_MOD_TILE_GFX11_256K_R_X :
|
||||
AMD_FMT_MOD_TILE_GFX9_64K_R_X;
|
||||
|
||||
modifier_r_x = AMD_FMT_MOD |
|
||||
AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX11) |
|
||||
AMD_FMT_MOD_SET(TILE, swizzle_r_x) |
|
||||
AMD_FMT_MOD_SET(PIPE_XOR_BITS, pipe_xor_bits) |
|
||||
AMD_FMT_MOD_SET(PACKERS, pkrs);
|
||||
|
||||
/* DCC_CONSTANT_ENCODE is not set because it can't vary with gfx11 (it's implied to be 1). */
|
||||
modifier_dcc_best = modifier_r_x |
|
||||
AMD_FMT_MOD_SET(DCC, 1) |
|
||||
AMD_FMT_MOD_SET(DCC_INDEPENDENT_64B, 0) |
|
||||
AMD_FMT_MOD_SET(DCC_INDEPENDENT_128B, 1) |
|
||||
AMD_FMT_MOD_SET(DCC_MAX_COMPRESSED_BLOCK, AMD_FMT_MOD_DCC_BLOCK_128B);
|
||||
|
||||
/* DCC settings for 4K and greater resolutions. (required by display hw) */
|
||||
modifier_dcc_4k = modifier_r_x |
|
||||
AMD_FMT_MOD_SET(DCC, 1) |
|
||||
AMD_FMT_MOD_SET(DCC_INDEPENDENT_64B, 1) |
|
||||
AMD_FMT_MOD_SET(DCC_INDEPENDENT_128B, 1) |
|
||||
AMD_FMT_MOD_SET(DCC_MAX_COMPRESSED_BLOCK, AMD_FMT_MOD_DCC_BLOCK_64B);
|
||||
|
||||
add_modifier(mods, size, capacity, modifier_dcc_best);
|
||||
add_modifier(mods, size, capacity, modifier_dcc_4k);
|
||||
|
||||
add_modifier(mods, size, capacity, modifier_dcc_best | AMD_FMT_MOD_SET(DCC_RETILE, 1));
|
||||
add_modifier(mods, size, capacity, modifier_dcc_4k | AMD_FMT_MOD_SET(DCC_RETILE, 1));
|
||||
|
||||
add_modifier(mods, size, capacity, modifier_r_x);
|
||||
|
||||
add_modifier(mods, size, capacity, AMD_FMT_MOD |
|
||||
AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX11) |
|
||||
AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX9_64K_D));
|
||||
}
|
||||
|
||||
static int
|
||||
get_plane_modifiers(const struct amdgpu_device *adev, unsigned int plane_type, uint64_t **mods)
|
||||
get_plane_modifiers(struct amdgpu_device *adev, unsigned int plane_type, uint64_t **mods)
|
||||
{
|
||||
uint64_t size = 0, capacity = 128;
|
||||
*mods = NULL;
|
||||
@@ -5257,6 +5324,9 @@ get_plane_modifiers(const struct amdgpu_device *adev, unsigned int plane_type, u
|
||||
else
|
||||
add_gfx10_1_modifiers(adev, mods, &size, &capacity);
|
||||
break;
|
||||
case AMDGPU_FAMILY_GC_11_0_0:
|
||||
add_gfx11_modifiers(adev, mods, &size, &capacity);
|
||||
break;
|
||||
}
|
||||
|
||||
add_modifier(mods, &size, &capacity, DRM_FORMAT_MOD_LINEAR);
|
||||
@@ -5295,7 +5365,7 @@ fill_gfx9_plane_attributes_from_modifiers(struct amdgpu_device *adev,
|
||||
dcc->enable = 1;
|
||||
dcc->meta_pitch = afb->base.pitches[1];
|
||||
dcc->independent_64b_blks = independent_64b_blks;
|
||||
if (AMD_FMT_MOD_GET(TILE_VERSION, modifier) == AMD_FMT_MOD_TILE_VER_GFX10_RBPLUS) {
|
||||
if (AMD_FMT_MOD_GET(TILE_VERSION, modifier) >= AMD_FMT_MOD_TILE_VER_GFX10_RBPLUS) {
|
||||
if (independent_64b_blks && independent_128b_blks)
|
||||
dcc->dcc_ind_blk = hubp_ind_block_64b_no_128bcl;
|
||||
else if (independent_128b_blks)
|
||||
|
||||
Reference in New Issue
Block a user