diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/nv.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/nv.c | 248 | 
1 files changed, 50 insertions, 198 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/nv.c b/drivers/gpu/drm/amd/amdgpu/nv.c index 94a2c0742ee5..94d029dbf30d 100644 --- a/drivers/gpu/drm/amd/amdgpu/nv.c +++ b/drivers/gpu/drm/amd/amdgpu/nv.c @@ -64,32 +64,13 @@  #include "smuio_v11_0.h"  #include "smuio_v11_0_6.h" -#define codec_info_build(type, width, height, level) \ -			 .codec_type = type,\ -			 .max_width = width,\ -			 .max_height = height,\ -			 .max_pixels_per_frame = height * width,\ -			 .max_level = level, -  static const struct amd_ip_funcs nv_common_ip_funcs;  /* Navi */  static const struct amdgpu_video_codec_info nv_video_codecs_encode_array[] =  { -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, -		.max_width = 4096, -		.max_height = 2304, -		.max_pixels_per_frame = 4096 * 2304, -		.max_level = 0, -	}, -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, -		.max_width = 4096, -		.max_height = 2304, -		.max_pixels_per_frame = 4096 * 2304, -		.max_level = 0, -	}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 2304, 0)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 4096, 2304, 0)},  };  static const struct amdgpu_video_codecs nv_video_codecs_encode = @@ -101,55 +82,13 @@ static const struct amdgpu_video_codecs nv_video_codecs_encode =  /* Navi1x */  static const struct amdgpu_video_codec_info nv_video_codecs_decode_array[] =  { -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, -		.max_width = 4096, -		.max_height = 4096, -		.max_pixels_per_frame = 4096 * 4096, -		.max_level = 3, -	}, -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, -		.max_width = 4096, -		.max_height = 4096, -		.max_pixels_per_frame = 4096 * 4096, -		.max_level = 5, -	}, -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, -		.max_width = 4096, -		.max_height = 4096, -		.max_pixels_per_frame = 4096 * 4096, -		.max_level = 52, -	}, -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, -		.max_width = 4096, -		.max_height = 4096, -		.max_pixels_per_frame = 4096 * 4096, -		.max_level = 4, -	}, -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, -		.max_width = 8192, -		.max_height = 4352, -		.max_pixels_per_frame = 8192 * 4352, -		.max_level = 186, -	}, -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, -		.max_width = 4096, -		.max_height = 4096, -		.max_pixels_per_frame = 4096 * 4096, -		.max_level = 0, -	}, -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, -		.max_width = 8192, -		.max_height = 4352, -		.max_pixels_per_frame = 8192 * 4352, -		.max_level = 0, -	}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 4096, 4906, 3)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, 4096, 4906, 5)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4906, 52)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, 4096, 4906, 4)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)},  };  static const struct amdgpu_video_codecs nv_video_codecs_decode = @@ -161,62 +100,14 @@ static const struct amdgpu_video_codecs nv_video_codecs_decode =  /* Sienna Cichlid */  static const struct amdgpu_video_codec_info sc_video_codecs_decode_array[] =  { -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, -		.max_width = 4096, -		.max_height = 4096, -		.max_pixels_per_frame = 4096 * 4096, -		.max_level = 3, -	}, -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, -		.max_width = 4096, -		.max_height = 4096, -		.max_pixels_per_frame = 4096 * 4096, -		.max_level = 5, -	}, -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, -		.max_width = 4096, -		.max_height = 4096, -		.max_pixels_per_frame = 4096 * 4096, -		.max_level = 52, -	}, -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, -		.max_width = 4096, -		.max_height = 4096, -		.max_pixels_per_frame = 4096 * 4096, -		.max_level = 4, -	}, -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, -		.max_width = 8192, -		.max_height = 4352, -		.max_pixels_per_frame = 8192 * 4352, -		.max_level = 186, -	}, -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, -		.max_width = 4096, -		.max_height = 4096, -		.max_pixels_per_frame = 4096 * 4096, -		.max_level = 0, -	}, -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, -		.max_width = 8192, -		.max_height = 4352, -		.max_pixels_per_frame = 8192 * 4352, -		.max_level = 0, -	}, -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_AV1, -		.max_width = 8192, -		.max_height = 4352, -		.max_pixels_per_frame = 8192 * 4352, -		.max_level = 0, -	}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 4096, 4906, 3)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, 4096, 4906, 5)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4906, 52)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, 4096, 4906, 4)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_AV1, 8192, 4352, 0)},  };  static const struct amdgpu_video_codecs sc_video_codecs_decode = @@ -228,80 +119,20 @@ static const struct amdgpu_video_codecs sc_video_codecs_decode =  /* SRIOV Sienna Cichlid, not const since data is controlled by host */  static struct amdgpu_video_codec_info sriov_sc_video_codecs_encode_array[] =  { -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, -		.max_width = 4096, -		.max_height = 2304, -		.max_pixels_per_frame = 4096 * 2304, -		.max_level = 0, -	}, -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, -		.max_width = 4096, -		.max_height = 2304, -		.max_pixels_per_frame = 4096 * 2304, -		.max_level = 0, -	}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 2304, 0)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 4096, 2304, 0)},  };  static struct amdgpu_video_codec_info sriov_sc_video_codecs_decode_array[] =  { -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, -		.max_width = 4096, -		.max_height = 4096, -		.max_pixels_per_frame = 4096 * 4096, -		.max_level = 3, -	}, -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, -		.max_width = 4096, -		.max_height = 4096, -		.max_pixels_per_frame = 4096 * 4096, -		.max_level = 5, -	}, -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, -		.max_width = 4096, -		.max_height = 4096, -		.max_pixels_per_frame = 4096 * 4096, -		.max_level = 52, -	}, -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, -		.max_width = 4096, -		.max_height = 4096, -		.max_pixels_per_frame = 4096 * 4096, -		.max_level = 4, -	}, -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, -		.max_width = 8192, -		.max_height = 4352, -		.max_pixels_per_frame = 8192 * 4352, -		.max_level = 186, -	}, -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, -		.max_width = 4096, -		.max_height = 4096, -		.max_pixels_per_frame = 4096 * 4096, -		.max_level = 0, -	}, -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, -		.max_width = 8192, -		.max_height = 4352, -		.max_pixels_per_frame = 8192 * 4352, -		.max_level = 0, -	}, -	{ -		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_AV1, -		.max_width = 8192, -		.max_height = 4352, -		.max_pixels_per_frame = 8192 * 4352, -		.max_level = 0, -	}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 4096, 4906, 3)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, 4096, 4906, 5)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4906, 52)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, 4096, 4906, 4)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_AV1, 8192, 4352, 0)},  };  static struct amdgpu_video_codecs sriov_sc_video_codecs_encode = @@ -333,6 +164,19 @@ static const struct amdgpu_video_codecs bg_video_codecs_encode = {  	.codec_array = NULL,  }; +/* Yellow Carp*/ +static const struct amdgpu_video_codec_info yc_video_codecs_decode_array[] = { +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4906, 52)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)}, +}; + +static const struct amdgpu_video_codecs yc_video_codecs_decode = { +	.codec_count = ARRAY_SIZE(yc_video_codecs_decode_array), +	.codec_array = yc_video_codecs_decode_array, +}; +  static int nv_query_video_codecs(struct amdgpu_device *adev, bool encode,  				 const struct amdgpu_video_codecs **codecs)  { @@ -353,12 +197,17 @@ static int nv_query_video_codecs(struct amdgpu_device *adev, bool encode,  	case CHIP_NAVY_FLOUNDER:  	case CHIP_DIMGREY_CAVEFISH:  	case CHIP_VANGOGH: -	case CHIP_YELLOW_CARP:  		if (encode)  			*codecs = &nv_video_codecs_encode;  		else  			*codecs = &sc_video_codecs_decode;  		return 0; +	case CHIP_YELLOW_CARP: +		if (encode) +			*codecs = &nv_video_codecs_encode; +		else +			*codecs = &yc_video_codecs_decode; +		return 0;  	case CHIP_BEIGE_GOBY:  		if (encode)  			*codecs = &bg_video_codecs_encode; @@ -1387,7 +1236,10 @@ static int nv_common_early_init(void *handle)  			AMD_PG_SUPPORT_VCN |  			AMD_PG_SUPPORT_VCN_DPG |  			AMD_PG_SUPPORT_JPEG; -		adev->external_rev_id = adev->rev_id + 0x01; +		if (adev->pdev->device == 0x1681) +			adev->external_rev_id = adev->rev_id + 0x19; +		else +			adev->external_rev_id = adev->rev_id + 0x01;  		break;  	default:  		/* FIXME: not supported yet */ | 
