[v3 4/6] drm/vs: Add KMS crtc&plane
From: Keith Zhao
Date: Wed Jan 31 2024 - 04:47:44 EST
> -----邮件原件-----
> 发件人: Maxime Ripard <mripard@xxxxxxxxxx>
> 发送时间: 2023年12月6日 16:56
> 收件人: Keith Zhao <keith.zhao@xxxxxxxxxxxxxxxx>
> 抄送: devicetree@xxxxxxxxxxxxxxx; dri-devel@xxxxxxxxxxxxxxxxxxxxx;
> linux-kernel@xxxxxxxxxxxxxxx; linux-riscv@xxxxxxxxxxxxxxxxxxx;
> tzimmermann@xxxxxxx; airlied@xxxxxxxxx; krzysztof.kozlowski+dt@xxxxxxxxxx;
> William Qiu <william.qiu@xxxxxxxxxxxxxxxx>; Xingyu Wu
> <xingyu.wu@xxxxxxxxxxxxxxxx>; paul.walmsley@xxxxxxxxxx;
> aou@xxxxxxxxxxxxxxxxx; palmer@xxxxxxxxxxx; p.zabel@xxxxxxxxxxxxxx;
> Shengyang Chen <shengyang.chen@xxxxxxxxxxxxxxxx>; Jack Zhu
> <jack.zhu@xxxxxxxxxxxxxxxx>; Changhuang Liang
> <changhuang.liang@xxxxxxxxxxxxxxxx>; maarten.lankhorst@xxxxxxxxxxxxxxx;
> suijingfeng@xxxxxxxxxxx
> 主题: Re: [v3 4/6] drm/vs: Add KMS crtc&plane
>
> On Mon, Dec 04, 2023 at 08:33:13PM +0800, Keith Zhao wrote:
> > +static const struct vs_plane_info dc_hw_planes_rev0[PLANE_NUM] = {
> > + {
> > + .name = "Primary",
> > + .id = PRIMARY_PLANE_0,
> > + .type = DRM_PLANE_TYPE_PRIMARY,
> > + .num_formats = ARRAY_SIZE(primary_overlay_format0),
> > + .formats = primary_overlay_format0,
> > + .num_modifiers = ARRAY_SIZE(format_modifier0),
> > + .modifiers = format_modifier0,
> > + .min_width = 0,
> > + .min_height = 0,
> > + .max_width = 4096,
> > + .max_height = 4096,
> > + .rotation = DRM_MODE_ROTATE_0 |
> > + DRM_MODE_ROTATE_90 |
> > + DRM_MODE_ROTATE_180 |
> > + DRM_MODE_ROTATE_270 |
> > + DRM_MODE_REFLECT_X |
> > + DRM_MODE_REFLECT_Y,
> > + .blend_mode = BIT(DRM_MODE_BLEND_PIXEL_NONE) |
> > + BIT(DRM_MODE_BLEND_PREMULTI) |
> > + BIT(DRM_MODE_BLEND_COVERAGE),
> > + .color_encoding = BIT(DRM_COLOR_YCBCR_BT709) |
> > + BIT(DRM_COLOR_YCBCR_BT2020),
> > + .degamma_size = DEGAMMA_SIZE,
> > + .min_scale = FRAC_16_16(1, 3),
> > + .max_scale = FRAC_16_16(10, 1),
> > + .zpos = 0,
> > + .watermark = true,
> > + .color_mgmt = true,
> > + .roi = true,
> > + },
> > + {
> > + .name = "Overlay",
> > + .id = OVERLAY_PLANE_0,
> > + .type = DRM_PLANE_TYPE_OVERLAY,
> > + .num_formats = ARRAY_SIZE(primary_overlay_format0),
> > + .formats = primary_overlay_format0,
> > + .num_modifiers = ARRAY_SIZE(format_modifier0),
> > + .modifiers = format_modifier0,
> > + .min_width = 0,
> > + .min_height = 0,
> > + .max_width = 4096,
> > + .max_height = 4096,
> > + .rotation = DRM_MODE_ROTATE_0 |
> > + DRM_MODE_ROTATE_90 |
> > + DRM_MODE_ROTATE_180 |
> > + DRM_MODE_ROTATE_270 |
> > + DRM_MODE_REFLECT_X |
> > + DRM_MODE_REFLECT_Y,
> > + .blend_mode = BIT(DRM_MODE_BLEND_PIXEL_NONE) |
> > + BIT(DRM_MODE_BLEND_PREMULTI) |
> > + BIT(DRM_MODE_BLEND_COVERAGE),
> > + .color_encoding = BIT(DRM_COLOR_YCBCR_BT709) |
> > + BIT(DRM_COLOR_YCBCR_BT2020),
> > + .degamma_size = DEGAMMA_SIZE,
> > + .min_scale = FRAC_16_16(1, 3),
> > + .max_scale = FRAC_16_16(10, 1),
> > + .zpos = 1,
> > + .watermark = true,
> > + .color_mgmt = true,
> > + .roi = true,
> > + },
> > + {
> > + .name = "Overlay_1",
> > + .id = OVERLAY_PLANE_1,
> > + .type = DRM_PLANE_TYPE_OVERLAY,
> > + .num_formats = ARRAY_SIZE(primary_overlay_format0),
> > + .formats = primary_overlay_format0,
> > + .num_modifiers = ARRAY_SIZE(secondary_format_modifiers),
> > + .modifiers = secondary_format_modifiers,
> > + .min_width = 0,
> > + .min_height = 0,
> > + .max_width = 4096,
> > + .max_height = 4096,
> > + .rotation = 0,
> > + .blend_mode = BIT(DRM_MODE_BLEND_PIXEL_NONE) |
> > + BIT(DRM_MODE_BLEND_PREMULTI) |
> > + BIT(DRM_MODE_BLEND_COVERAGE),
> > + .color_encoding = BIT(DRM_COLOR_YCBCR_BT709) |
> > + BIT(DRM_COLOR_YCBCR_BT2020),
> > + .degamma_size = DEGAMMA_SIZE,
> > + .min_scale = DRM_PLANE_NO_SCALING,
> > + .max_scale = DRM_PLANE_NO_SCALING,
> > + .zpos = 2,
> > + .watermark = true,
> > + .color_mgmt = true,
> > + .roi = true,
> > + },
> > + {
> > + .name = "Primary_1",
> > + .id = PRIMARY_PLANE_1,
> > + .type = DRM_PLANE_TYPE_PRIMARY,
> > + .num_formats = ARRAY_SIZE(primary_overlay_format0),
> > + .formats = primary_overlay_format0,
> > + .num_modifiers = ARRAY_SIZE(format_modifier0),
> > + .modifiers = format_modifier0,
> > + .min_width = 0,
> > + .min_height = 0,
> > + .max_width = 4096,
> > + .max_height = 4096,
> > + .rotation = DRM_MODE_ROTATE_0 |
> > + DRM_MODE_ROTATE_90 |
> > + DRM_MODE_ROTATE_180 |
> > + DRM_MODE_ROTATE_270 |
> > + DRM_MODE_REFLECT_X |
> > + DRM_MODE_REFLECT_Y,
> > + .blend_mode = BIT(DRM_MODE_BLEND_PIXEL_NONE) |
> > + BIT(DRM_MODE_BLEND_PREMULTI) |
> > + BIT(DRM_MODE_BLEND_COVERAGE),
> > + .color_encoding = BIT(DRM_COLOR_YCBCR_BT709) |
> > + BIT(DRM_COLOR_YCBCR_BT2020),
> > + .degamma_size = DEGAMMA_SIZE,
> > + .min_scale = FRAC_16_16(1, 3),
> > + .max_scale = FRAC_16_16(10, 1),
> > + .zpos = 3,
> > + .watermark = true,
> > + .color_mgmt = true,
> > + .roi = true,
> > + },
> > + {
> > + .name = "Overlay_2",
> > + .id = OVERLAY_PLANE_2,
> > + .type = DRM_PLANE_TYPE_OVERLAY,
> > + .num_formats = ARRAY_SIZE(primary_overlay_format0),
> > + .formats = primary_overlay_format0,
> > + .num_modifiers = ARRAY_SIZE(format_modifier0),
> > + .modifiers = format_modifier0,
> > + .min_width = 0,
> > + .min_height = 0,
> > + .max_width = 4096,
> > + .max_height = 4096,
> > + .rotation = DRM_MODE_ROTATE_0 |
> > + DRM_MODE_ROTATE_90 |
> > + DRM_MODE_ROTATE_180 |
> > + DRM_MODE_ROTATE_270 |
> > + DRM_MODE_REFLECT_X |
> > + DRM_MODE_REFLECT_Y,
> > + .blend_mode = BIT(DRM_MODE_BLEND_PIXEL_NONE) |
> > + BIT(DRM_MODE_BLEND_PREMULTI) |
> > + BIT(DRM_MODE_BLEND_COVERAGE),
> > + .color_encoding = BIT(DRM_COLOR_YCBCR_BT709) |
> > + BIT(DRM_COLOR_YCBCR_BT2020),
> > + .degamma_size = DEGAMMA_SIZE,
> > + .min_scale = FRAC_16_16(1, 3),
> > + .max_scale = FRAC_16_16(10, 1),
> > + .zpos = 4,
> > + .watermark = true,
> > + .color_mgmt = true,
> > + .roi = true,
> > + },
> > + {
> > + .name = "Overlay_3",
> > + .id = OVERLAY_PLANE_3,
> > + .type = DRM_PLANE_TYPE_OVERLAY,
> > + .num_formats = ARRAY_SIZE(primary_overlay_format0),
> > + .formats = primary_overlay_format0,
> > + .num_modifiers = ARRAY_SIZE(secondary_format_modifiers),
> > + .modifiers = secondary_format_modifiers,
> > + .min_width = 0,
> > + .min_height = 0,
> > + .max_width = 4096,
> > + .max_height = 4096,
> > + .rotation = 0,
> > + .blend_mode = BIT(DRM_MODE_BLEND_PIXEL_NONE) |
> > + BIT(DRM_MODE_BLEND_PREMULTI) |
> > + BIT(DRM_MODE_BLEND_COVERAGE),
> > + .color_encoding = BIT(DRM_COLOR_YCBCR_BT709) |
> > + BIT(DRM_COLOR_YCBCR_BT2020),
> > + .degamma_size = DEGAMMA_SIZE,
> > + .min_scale = DRM_PLANE_NO_SCALING,
> > + .max_scale = DRM_PLANE_NO_SCALING,
> > + .zpos = 5,
> > + .watermark = true,
> > + .color_mgmt = true,
> > + .roi = true,
> > + },
> > + {
> > + .name = "Cursor",
> > + .id = CURSOR_PLANE_0,
> > + .type = DRM_PLANE_TYPE_CURSOR,
> > + .num_formats = ARRAY_SIZE(cursor_formats),
> > + .formats = cursor_formats,
> > + .num_modifiers = 0,
> > + .modifiers = NULL,
> > + .min_width = 32,
> > + .min_height = 32,
> > + .max_width = 64,
> > + .max_height = 64,
> > + .rotation = 0,
> > + .degamma_size = 0,
> > + .min_scale = DRM_PLANE_NO_SCALING,
> > + .max_scale = DRM_PLANE_NO_SCALING,
> > + .zpos = 255,
> > + .watermark = false,
> > + .color_mgmt = false,
> > + .roi = false,
> > + },
> > + {
> > + .name = "Cursor_1",
> > + .id = CURSOR_PLANE_1,
> > + .type = DRM_PLANE_TYPE_CURSOR,
> > + .num_formats = ARRAY_SIZE(cursor_formats),
> > + .formats = cursor_formats,
> > + .num_modifiers = 0,
> > + .modifiers = NULL,
> > + .min_width = 32,
> > + .min_height = 32,
> > + .max_width = 64,
> > + .max_height = 64,
> > + .rotation = 0,
> > + .degamma_size = 0,
> > + .min_scale = DRM_PLANE_NO_SCALING,
> > + .max_scale = DRM_PLANE_NO_SCALING,
> > + .zpos = 255,
> > + .watermark = false,
> > + .color_mgmt = false,
> > + .roi = false,
> > + },
> > +};
> > +
> > +static const struct vs_dc_info dc8200_info = {
> > + .name = "DC8200",
> > + .panel_num = 2,
> > + .plane_num = 8,
> > + .planes = dc_hw_planes_rev0,
> > + .layer_num = 6,
> > + .max_bpc = 10,
> > + .color_formats = DRM_COLOR_FORMAT_RGB444 |
> > + DRM_COLOR_FORMAT_YCBCR444 |
> > + DRM_COLOR_FORMAT_YCBCR422 |
> > + DRM_COLOR_FORMAT_YCBCR420,
> > + .gamma_size = GAMMA_EX_SIZE,
> > + .gamma_bits = 12,
> > + .pitch_alignment = 128,
> > + .pipe_sync = false,
> > + .background = true,
> > + .panel_sync = true,
> > + .cap_dec = true,
> > +};
>
> I really think that entire thing is to workaround a suboptimal device tree binding.
> You should have two CRTCs in the device tree, you'll probe twice, and you won't
> get to do that whole dance.
>
Hi Maxime:
I tried to modify it according to this idea Found it too difficult In terms of hardware, the two crtc designs are too close to separate, and they are even designed into the same reg with different bits representing crtc0 and crtc1.
It seems not easy to described the 2 ctrc hardware by 2 device nodes
The idea is to avoid a whole dance
I don't know if I understand correctly about whole dance.
Is it means I create 2 ctrc and 8 plane in the dc_bind?
Thanks
Keith
>
> > +struct dc_hw_plane_reg {
> > + u32 y_address;
> > + u32 u_address;
> > + u32 v_address;
> > + u32 y_stride;
> > + u32 u_stride;
> > + u32 v_stride;
> > + u32 size;
> > + u32 top_left;
> > + u32 bottom_right;
> > + u32 scale_factor_x;
> > + u32 scale_factor_y;
> > + u32 h_filter_coef_index;
> > + u32 h_filter_coef_data;
> > + u32 v_filter_coef_index;
> > + u32 v_filter_coef_data;
> > + u32 init_offset;
> > + u32 color_key;
> > + u32 color_key_high;
> > + u32 clear_value;
> > + u32 color_table_index;
> > + u32 color_table_data;
> > + u32 scale_config;
> > + u32 water_mark;
> > + u32 degamma_index;
> > + u32 degamma_data;
> > + u32 degamma_ex_data;
> > + u32 src_global_color;
> > + u32 dst_global_color;
> > + u32 blend_config;
> > + u32 roi_origin;
> > + u32 roi_size;
> > + u32 yuv_to_rgb_coef0;
> > + u32 yuv_to_rgb_coef1;
> > + u32 yuv_to_rgb_coef2;
> > + u32 yuv_to_rgb_coef3;
> > + u32 yuv_to_rgb_coef4;
> > + u32 yuv_to_rgb_coefd0;
> > + u32 yuv_to_rgb_coefd1;
> > + u32 yuv_to_rgb_coefd2;
> > + u32 y_clamp_bound;
> > + u32 uv_clamp_bound;
> > + u32 rgb_to_rgb_coef0;
> > + u32 rgb_to_rgb_coef1;
> > + u32 rgb_to_rgb_coef2;
> > + u32 rgb_to_rgb_coef3;
> > + u32 rgb_to_rgb_coef4;
> > +};
>
> That's your plane state.
>
> > +struct dc_hw_fb {
> > + u32 y_address;
> > + u32 u_address;
> > + u32 v_address;
> > + u32 clear_value;
> > + u32 water_mark;
> > + u16 y_stride;
> > + u16 u_stride;
> > + u16 v_stride;
> > + u16 width;
> > + u16 height;
> > + u8 format;
> > + u8 tile_mode;
> > + u8 rotation;
> > + u8 yuv_color_space;
> > + u8 swizzle;
> > + u8 uv_swizzle;
> > + u8 zpos;
> > + u8 display_id;
> > + bool clear_enable;
> > + bool dec_enable;
> > + bool enable;
> > + bool dirty;
> > +};
>
> Your framebuffer
>
> > +struct dc_hw_scale {
> > + u32 scale_factor_x;
> > + u32 scale_factor_y;
> > + bool enable;
> > + bool dirty;
> > +};
> > +
> > +struct dc_hw_position {
> > + u16 start_x;
> > + u16 start_y;
> > + u16 end_x;
> > + u16 end_y;
> > + bool dirty;
> > +};
> > +
> > +struct dc_hw_blend {
> > + u8 alpha;
> > + u8 blend_mode;
> > + bool dirty;
> > +};
> > +
> > +struct dc_hw_colorkey {
> > + u32 colorkey;
> > + u32 colorkey_high;
> > + u8 transparency;
> > + bool dirty;
> > +};
>
> Your CRTC state.
>
> > +struct dc_hw_roi {
> > + u16 x;
> > + u16 y;
> > + u16 width;
> > + u16 height;
> > + bool enable;
> > + bool dirty;
> > +};
> > +
> > +struct dc_hw_cursor {
> > + u32 address;
> > + u16 x;
> > + u16 y;
> > + u16 hot_x;
> > + u16 hot_y;
> > + u8 size;
> > + u8 display_id;
> > + bool enable;
> > + bool dirty;
> > +};
> > +
> > +struct dc_hw_display {
> > + u32 bus_format;
> > + u16 h_active;
> > + u16 h_total;
> > + u16 h_sync_start;
> > + u16 h_sync_end;
> > + u16 v_active;
> > + u16 v_total;
> > + u16 v_sync_start;
> > + u16 v_sync_end;
> > + u8 id;
> > + bool h_sync_polarity;
> > + bool v_sync_polarity;
> > + bool enable;
> > +};
>
> Your display mode.
>
> Really, you have the huge majority of those informations already available,
> there's no need to duplicate it. And chances are you'll create bugs in the
> process.
> Maxime