History

drm/amdgpu: add INFO ioctl support for querying video caps (v4)

We currently hardcode these in mesa, but querying them from the kernel makes more sense since there may be board specific limitations that the kernel driver is better suited to determining. Userpace patches that use this interface: https://gitlab.freedesktop.org/leoliu/drm/-/commits/info_video_caps https://gitlab.freedesktop.org/leoliu/mesa/-/commits/info_video_caps v2: reorder the codecs to better align with mesa v3: add max_pixels_per_frame to handle the portrait case, squash in memory leak fix v4: drop extra break

Alex Deucher committed 5 years ago

Commit f35e9bd1 parent 3b246e82 files · +91 −0Browse files

Unified · Split

2 files
  1. drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +57 −0
  2. include/uapi/drm/amdgpu_drm.h +34 −0
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c+57−0
@@ -982,6 +982,63 @@ int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) · 981 unmodified lines
982 min_t(u64, size, sizeof(ras_mask))) ?982 min_t(u64, size, sizeof(ras_mask))) ?
983 -EFAULT : 0;983 -EFAULT : 0;
984 }984 }
985 case AMDGPU_INFO_VIDEO_CAPS: {
986 const struct amdgpu_video_codecs *codecs;
987 struct drm_amdgpu_info_video_caps *caps;
988 int r;
989
990 switch (info->video_cap.type) {
991 case AMDGPU_INFO_VIDEO_CAPS_DECODE:
992 r = amdgpu_asic_query_video_codecs(adev, false, &codecs);
993 if (r)
994 return -EINVAL;
995 break;
996 case AMDGPU_INFO_VIDEO_CAPS_ENCODE:
997 r = amdgpu_asic_query_video_codecs(adev, true, &codecs);
998 if (r)
999 return -EINVAL;
1000 break;
1001 default:
1002 DRM_DEBUG_KMS("Invalid request %d\n",
1003 info->video_cap.type);
1004 return -EINVAL;
1005 }
1006
1007 caps = kzalloc(sizeof(*caps), GFP_KERNEL);
1008 if (!caps)
1009 return -ENOMEM;
1010
1011 for (i = 0; i < codecs->codec_count; i++) {
1012 int idx = codecs->codec_array[i].codec_type;
1013
1014 switch (idx) {
1015 case AMDGPU_VIDEO_CODEC_TYPE_MPEG2:
1016 case AMDGPU_VIDEO_CODEC_TYPE_MPEG4:
1017 case AMDGPU_VIDEO_CODEC_TYPE_MPEG4_AVC:
1018 case AMDGPU_VIDEO_CODEC_TYPE_VC1:
1019 case AMDGPU_VIDEO_CODEC_TYPE_HEVC:
1020 case AMDGPU_VIDEO_CODEC_TYPE_JPEG:
1021 case AMDGPU_VIDEO_CODEC_TYPE_VP9:
1022 case AMDGPU_VIDEO_CODEC_TYPE_AV1:
1023 caps->codec_info[idx].valid = 1;
1024 caps->codec_info[idx].max_width =
1025 codecs->codec_array[i].max_width;
1026 caps->codec_info[idx].max_height =
1027 codecs->codec_array[i].max_height;
1028 caps->codec_info[idx].max_pixels_per_frame =
1029 codecs->codec_array[i].max_pixels_per_frame;
1030 caps->codec_info[idx].max_level =
1031 codecs->codec_array[i].max_level;
1032 break;
1033 default:
1034 break;
1035 }
1036 }
1037 r = copy_to_user(out, caps,
1038 min((size_t)size, sizeof(*caps))) ? -EFAULT : 0;
1039 kfree(caps);
1040 return r;
1041 }
985 default:1042 default:
986 DRM_DEBUG_KMS("Invalid request %d\n", info->query);1043 DRM_DEBUG_KMS("Invalid request %d\n", info->query);
987 return -EINVAL;1044 return -EINVAL;
include/uapi/drm/amdgpu_drm.h+34−0
@@ -782,6 +782,12 @@ struct drm_amdgpu_cs_chunk_data { · 781 unmodified lines
782#define AMDGPU_INFO_VRAM_LOST_COUNTER 0x1F782#define AMDGPU_INFO_VRAM_LOST_COUNTER 0x1F
783/* query ras mask of enabled features*/783/* query ras mask of enabled features*/
784#define AMDGPU_INFO_RAS_ENABLED_FEATURES 0x20784#define AMDGPU_INFO_RAS_ENABLED_FEATURES 0x20
785/* query video encode/decode caps */
786#define AMDGPU_INFO_VIDEO_CAPS 0x21
787 /* Subquery id: Decode */
788 #define AMDGPU_INFO_VIDEO_CAPS_DECODE 0
789 /* Subquery id: Encode */
790 #define AMDGPU_INFO_VIDEO_CAPS_ENCODE 1
785 791
786/* RAS MASK: UMC (VRAM) */792/* RAS MASK: UMC (VRAM) */
787#define AMDGPU_INFO_RAS_ENABLED_UMC (1 << 0)793#define AMDGPU_INFO_RAS_ENABLED_UMC (1 << 0)
@@ -878,6 +884,10 @@ struct drm_amdgpu_info { · 90 unmodified lines
878 struct {884 struct {
879 __u32 type;885 __u32 type;
880 } sensor_info;886 } sensor_info;
887
888 struct {
889 __u32 type;
890 } video_cap;
881 };891 };
882};892};
883 893
@@ -1074,6 +1084,30 @@ struct drm_amdgpu_info_vce_clock_table { · 190 unmodified lines
1074 __u32 pad;1084 __u32 pad;
1075};1085};
1076 1086
1087/* query video encode/decode caps */
1088#define AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2 0
1089#define AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4 1
1090#define AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1 2
1091#define AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC 3
1092#define AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC 4
1093#define AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG 5
1094#define AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9 6
1095#define AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_AV1 7
1096#define AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_COUNT 8
1097
1098struct drm_amdgpu_info_video_codec_info {
1099 __u32 valid;
1100 __u32 max_width;
1101 __u32 max_height;
1102 __u32 max_pixels_per_frame;
1103 __u32 max_level;
1104 __u32 pad;
1105};
1106
1107struct drm_amdgpu_info_video_caps {
1108 struct drm_amdgpu_info_video_codec_info codec_info[AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_COUNT];
1109};
1110
1077/*1111/*
1078 * Supported GPU families1112 * Supported GPU families
1079 */1113 */