Commit 37c6a93b authored by Nicholas Kazlauskas's avatar Nicholas Kazlauskas Committed by Alex Deucher

drm/amd/display: Expose support for NV12 on suitable planes

[Why]
Hardware can support video surfaces and DC tells us which planes are
suitable via DC plane caps.

[How]
The supported formats array will now vary based on what DC tells us,
so create an array and fill it dynamically based on plane types and
caps.

Ideally we'd query support for every format via DC plane caps, but for
the framework is in place to do so later with this.
Signed-off-by: default avatarNicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Reviewed-by: default avatarSun peng Li <Sunpeng.Li@amd.com>
Acked-by: Bhawanpreet Lakha <Bhawanpreet Lakha@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 3be0a0b8
...@@ -4121,46 +4121,71 @@ static const u32 cursor_formats[] = { ...@@ -4121,46 +4121,71 @@ static const u32 cursor_formats[] = {
DRM_FORMAT_ARGB8888 DRM_FORMAT_ARGB8888
}; };
static int amdgpu_dm_plane_init(struct amdgpu_display_manager *dm, static int get_plane_formats(const struct drm_plane *plane,
struct drm_plane *plane, const struct dc_plane_cap *plane_cap,
unsigned long possible_crtcs, uint32_t *formats, int max_formats)
const struct dc_plane_cap *plane_cap)
{ {
int res = -EPERM; int i, num_formats = 0;
/*
* TODO: Query support for each group of formats directly from
* DC plane caps. This will require adding more formats to the
* caps list.
*/
switch (plane->type) { switch (plane->type) {
case DRM_PLANE_TYPE_PRIMARY: case DRM_PLANE_TYPE_PRIMARY:
res = drm_universal_plane_init( for (i = 0; i < ARRAY_SIZE(rgb_formats); ++i) {
dm->adev->ddev, if (num_formats >= max_formats)
plane, break;
possible_crtcs,
&dm_plane_funcs, formats[num_formats++] = rgb_formats[i];
rgb_formats, }
ARRAY_SIZE(rgb_formats),
NULL, plane->type, NULL); if (plane_cap && plane_cap->supports_nv12)
formats[num_formats++] = DRM_FORMAT_NV12;
break; break;
case DRM_PLANE_TYPE_OVERLAY: case DRM_PLANE_TYPE_OVERLAY:
res = drm_universal_plane_init( for (i = 0; i < ARRAY_SIZE(overlay_formats); ++i) {
dm->adev->ddev, if (num_formats >= max_formats)
plane,
possible_crtcs,
&dm_plane_funcs,
overlay_formats,
ARRAY_SIZE(overlay_formats),
NULL, plane->type, NULL);
break; break;
formats[num_formats++] = overlay_formats[i];
}
break;
case DRM_PLANE_TYPE_CURSOR: case DRM_PLANE_TYPE_CURSOR:
res = drm_universal_plane_init( for (i = 0; i < ARRAY_SIZE(cursor_formats); ++i) {
dm->adev->ddev, if (num_formats >= max_formats)
plane, break;
possible_crtcs,
&dm_plane_funcs, formats[num_formats++] = cursor_formats[i];
cursor_formats, }
ARRAY_SIZE(cursor_formats),
NULL, plane->type, NULL);
break; break;
} }
return num_formats;
}
static int amdgpu_dm_plane_init(struct amdgpu_display_manager *dm,
struct drm_plane *plane,
unsigned long possible_crtcs,
const struct dc_plane_cap *plane_cap)
{
uint32_t formats[32];
int num_formats;
int res = -EPERM;
num_formats = get_plane_formats(plane, plane_cap, formats,
ARRAY_SIZE(formats));
res = drm_universal_plane_init(dm->adev->ddev, plane, possible_crtcs,
&dm_plane_funcs, formats, num_formats,
NULL, plane->type, NULL);
if (res)
return res;
if (plane->type == DRM_PLANE_TYPE_OVERLAY && if (plane->type == DRM_PLANE_TYPE_OVERLAY &&
plane_cap && plane_cap->per_pixel_alpha) { plane_cap && plane_cap->per_pixel_alpha) {
unsigned int blend_caps = BIT(DRM_MODE_BLEND_PIXEL_NONE) | unsigned int blend_caps = BIT(DRM_MODE_BLEND_PIXEL_NONE) |
...@@ -4176,8 +4201,7 @@ static int amdgpu_dm_plane_init(struct amdgpu_display_manager *dm, ...@@ -4176,8 +4201,7 @@ static int amdgpu_dm_plane_init(struct amdgpu_display_manager *dm,
if (plane->funcs->reset) if (plane->funcs->reset)
plane->funcs->reset(plane); plane->funcs->reset(plane);
return 0;
return res;
} }
static int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm, static int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment