Skip to content

Commit 67be30d

Browse files
Anatoliy Klymenkotomba
authored andcommitted
drm: xlnx: zynqmp_dpsub: Set layer mode during creation
Set layer mode of operation (live or dma-based) during layer creation. Each DPSUB layer mode of operation is defined by corresponding DT node port connection, so it is possible to assign it during layer object creation. Previously it was set in layer enable functions, although it is too late as setting layer format depends on layer mode, and should be done before given layer enabled. Signed-off-by: Anatoliy Klymenko <anatoliy.klymenko@amd.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Tomi Valkeinen <tomi.valkainen@ideasonboard.com> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> Link: https://patchwork.freedesktop.org/patch/msgid/20240416-dp-live-fmt-v4-1-c7f379b7168e@amd.com
1 parent 5b5eab7 commit 67be30d

4 files changed

Lines changed: 20 additions & 18 deletions

File tree

drivers/gpu/drm/xlnx/zynqmp_disp.c

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,16 @@
6464

6565
#define ZYNQMP_DISP_MAX_NUM_SUB_PLANES 3
6666

67+
/**
68+
* enum zynqmp_dpsub_layer_mode - Layer mode
69+
* @ZYNQMP_DPSUB_LAYER_NONLIVE: non-live (memory) mode
70+
* @ZYNQMP_DPSUB_LAYER_LIVE: live (stream) mode
71+
*/
72+
enum zynqmp_dpsub_layer_mode {
73+
ZYNQMP_DPSUB_LAYER_NONLIVE,
74+
ZYNQMP_DPSUB_LAYER_LIVE,
75+
};
76+
6777
/**
6878
* struct zynqmp_disp_format - Display subsystem format information
6979
* @drm_fmt: DRM format (4CC)
@@ -902,15 +912,12 @@ u32 *zynqmp_disp_layer_drm_formats(struct zynqmp_disp_layer *layer,
902912
/**
903913
* zynqmp_disp_layer_enable - Enable a layer
904914
* @layer: The layer
905-
* @mode: Operating mode of layer
906915
*
907916
* Enable the @layer in the audio/video buffer manager and the blender. DMA
908917
* channels are started separately by zynqmp_disp_layer_update().
909918
*/
910-
void zynqmp_disp_layer_enable(struct zynqmp_disp_layer *layer,
911-
enum zynqmp_dpsub_layer_mode mode)
919+
void zynqmp_disp_layer_enable(struct zynqmp_disp_layer *layer)
912920
{
913-
layer->mode = mode;
914921
zynqmp_disp_avbuf_enable_video(layer->disp, layer);
915922
zynqmp_disp_blend_layer_enable(layer->disp, layer);
916923
}
@@ -1134,6 +1141,12 @@ static int zynqmp_disp_create_layers(struct zynqmp_disp *disp)
11341141
layer->id = i;
11351142
layer->disp = disp;
11361143
layer->info = &layer_info[i];
1144+
/*
1145+
* For now assume dpsub works in either live or non-live mode for both layers.
1146+
* Hybrid mode is not supported yet.
1147+
*/
1148+
layer->mode = disp->dpsub->dma_enabled ? ZYNQMP_DPSUB_LAYER_NONLIVE
1149+
: ZYNQMP_DPSUB_LAYER_LIVE;
11371150

11381151
ret = zynqmp_disp_layer_request_dma(disp, layer);
11391152
if (ret)

drivers/gpu/drm/xlnx/zynqmp_disp.h

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,6 @@ enum zynqmp_dpsub_layer_id {
4242
ZYNQMP_DPSUB_LAYER_GFX,
4343
};
4444

45-
/**
46-
* enum zynqmp_dpsub_layer_mode - Layer mode
47-
* @ZYNQMP_DPSUB_LAYER_NONLIVE: non-live (memory) mode
48-
* @ZYNQMP_DPSUB_LAYER_LIVE: live (stream) mode
49-
*/
50-
enum zynqmp_dpsub_layer_mode {
51-
ZYNQMP_DPSUB_LAYER_NONLIVE,
52-
ZYNQMP_DPSUB_LAYER_LIVE,
53-
};
54-
5545
void zynqmp_disp_enable(struct zynqmp_disp *disp);
5646
void zynqmp_disp_disable(struct zynqmp_disp *disp);
5747
int zynqmp_disp_setup_clock(struct zynqmp_disp *disp,
@@ -62,8 +52,7 @@ void zynqmp_disp_blend_set_global_alpha(struct zynqmp_disp *disp,
6252

6353
u32 *zynqmp_disp_layer_drm_formats(struct zynqmp_disp_layer *layer,
6454
unsigned int *num_formats);
65-
void zynqmp_disp_layer_enable(struct zynqmp_disp_layer *layer,
66-
enum zynqmp_dpsub_layer_mode mode);
55+
void zynqmp_disp_layer_enable(struct zynqmp_disp_layer *layer);
6756
void zynqmp_disp_layer_disable(struct zynqmp_disp_layer *layer);
6857
void zynqmp_disp_layer_set_format(struct zynqmp_disp_layer *layer,
6958
const struct drm_format_info *info);

drivers/gpu/drm/xlnx/zynqmp_dp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1295,7 +1295,7 @@ static void zynqmp_dp_disp_enable(struct zynqmp_dp *dp,
12951295
/* TODO: Make the format configurable. */
12961296
info = drm_format_info(DRM_FORMAT_YUV422);
12971297
zynqmp_disp_layer_set_format(layer, info);
1298-
zynqmp_disp_layer_enable(layer, ZYNQMP_DPSUB_LAYER_LIVE);
1298+
zynqmp_disp_layer_enable(layer);
12991299

13001300
if (layer_id == ZYNQMP_DPSUB_LAYER_GFX)
13011301
zynqmp_disp_blend_set_global_alpha(dp->dpsub->disp, true, 255);

drivers/gpu/drm/xlnx/zynqmp_kms.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ static void zynqmp_dpsub_plane_atomic_update(struct drm_plane *plane,
122122

123123
/* Enable or re-enable the plane if the format has changed. */
124124
if (format_changed)
125-
zynqmp_disp_layer_enable(layer, ZYNQMP_DPSUB_LAYER_NONLIVE);
125+
zynqmp_disp_layer_enable(layer);
126126
}
127127

128128
static const struct drm_plane_helper_funcs zynqmp_dpsub_plane_helper_funcs = {

0 commit comments

Comments
 (0)