[PATCH v4 04/10] drm/vs: Add hardware funcs for vs.
Keith Zhao
keith.zhao at starfivetech.com
Sun Jun 23 00:16:47 PDT 2024
Hi Dmitry:
> -----Original Message-----
> From: Dmitry Baryshkov <dmitry.baryshkov at linaro.org>
> Sent: 2024年5月22日 4:51
> To: Keith Zhao <keith.zhao at starfivetech.com>
> Cc: andrzej.hajda at intel.com; neil.armstrong at linaro.org; rfoss at kernel.org;
> Laurent.pinchart at ideasonboard.com; jonas at kwiboo.se;
> jernej.skrabec at gmail.com; maarten.lankhorst at linux.intel.com;
> mripard at kernel.org; tzimmermann at suse.de; airlied at gmail.com;
> daniel at ffwll.ch; robh at kernel.org; krzk+dt at kernel.org; conor+dt at kernel.org;
> hjc at rock-chips.com; heiko at sntech.de; andy.yan at rock-chips.com; Xingyu Wu
> <xingyu.wu at starfivetech.com>; p.zabel at pengutronix.de; Jack Zhu
> <jack.zhu at starfivetech.com>; Shengyang Chen
> <shengyang.chen at starfivetech.com>; dri-devel at lists.freedesktop.org;
> devicetree at vger.kernel.org; linux-kernel at vger.kernel.org;
> linux-arm-kernel at lists.infradead.org
> Subject: Re: [PATCH v4 04/10] drm/vs: Add hardware funcs for vs.
>
> On Tue, May 21, 2024 at 06:58:11PM +0800, keith wrote:
> > add hardware base api for vs drm
>
>
> Commit message is nearly missing. Please describe your hardware.
Ok it will be modified next
>
> >
> > Signed-off-by: keith <keith.zhao at starfivetech.com>
>
> Full name please
>
Ok it will be modified next
> > ---
> > MAINTAINERS | 1 +
> > drivers/gpu/drm/Kconfig | 2 +
> > drivers/gpu/drm/Makefile | 1 +
> > drivers/gpu/drm/verisilicon/Kconfig | 13 +
> > drivers/gpu/drm/verisilicon/Makefile | 5 +
> > drivers/gpu/drm/verisilicon/vs_dc_hw.c | 1060
> ++++++++++++++++++++++++
> > drivers/gpu/drm/verisilicon/vs_dc_hw.h | 493 +++++++++++
> > drivers/gpu/drm/verisilicon/vs_type.h | 84 ++
> > 8 files changed, 1659 insertions(+)
> > create mode 100644 drivers/gpu/drm/verisilicon/Kconfig
> > create mode 100644 drivers/gpu/drm/verisilicon/Makefile
> > create mode 100644 drivers/gpu/drm/verisilicon/vs_dc_hw.c
> > create mode 100644 drivers/gpu/drm/verisilicon/vs_dc_hw.h
> > create mode 100644 drivers/gpu/drm/verisilicon/vs_type.h
> >
> > diff --git a/MAINTAINERS b/MAINTAINERS
> > index cf2d66f88a83..9cb376f76f74 100644
> > --- a/MAINTAINERS
> > +++ b/MAINTAINERS
> > @@ -7156,6 +7156,7 @@ T: git
> https://gitlab.freedesktop.org/drm/misc/kernel.git
> > F:
> Documentation/devicetree/bindings/display/bridge/innosilicon,inno-hdmi.y
> aml
> > F: Documentation/devicetree/bindings/display/starfive/
> > F: drivers/gpu/drm/bridge/innosilicon/
> > +F: drivers/gpu/drm/verisilicon
> > F: include/drm/bridge/inno_hdmi.h
> >
> > DRM DRIVER FOR SYNAPTICS R63353 PANELS
> > diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
> > index 026444eeb5c6..5413d87ef1d6 100644
> > --- a/drivers/gpu/drm/Kconfig
> > +++ b/drivers/gpu/drm/Kconfig
> > @@ -423,6 +423,8 @@ source "drivers/gpu/drm/sprd/Kconfig"
> >
> > source "drivers/gpu/drm/imagination/Kconfig"
> >
> > +source "drivers/gpu/drm/verisilicon/Kconfig"
> > +
> > config DRM_HYPERV
> > tristate "DRM Support for Hyper-V synthetic video device"
> > depends on DRM && PCI && MMU && HYPERV
> > diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
> > index f9ca4f8fa6c5..cb27092b1672 100644
> > --- a/drivers/gpu/drm/Makefile
> > +++ b/drivers/gpu/drm/Makefile
> > @@ -219,3 +219,4 @@ obj-y += solomon/
> > obj-$(CONFIG_DRM_SPRD) += sprd/
> > obj-$(CONFIG_DRM_LOONGSON) += loongson/
> > obj-$(CONFIG_DRM_POWERVR) += imagination/
> > +obj-$(CONFIG_DRM_VERISILICON_DC8200) += verisilicon/
> > diff --git a/drivers/gpu/drm/verisilicon/Kconfig
> b/drivers/gpu/drm/verisilicon/Kconfig
> > new file mode 100644
> > index 000000000000..2d733f93439e
> > --- /dev/null
> > +++ b/drivers/gpu/drm/verisilicon/Kconfig
> > @@ -0,0 +1,13 @@
> > +# SPDX-License-Identifier: GPL-2.0
> > +config DRM_VERISILICON_DC8200
> > + tristate "DRM Support for VeriSilicon DC8200"
> > + depends on DRM
> > + select DRM_KMS_HELPER
> > + select DRM_GEM_DMA_HELPER
> > + select CMA
> > + select DMA_CMA
> > + help
> > + Choose this option if you have a VeriSilicon DC8200 chipset.
> > + This driver provides VeriSilicon kernel mode
> > + setting and buffer management. It does not
> > + provide 2D or 3D acceleration.
> > diff --git a/drivers/gpu/drm/verisilicon/Makefile
> b/drivers/gpu/drm/verisilicon/Makefile
> > new file mode 100644
> > index 000000000000..7da54b259940
> > --- /dev/null
> > +++ b/drivers/gpu/drm/verisilicon/Makefile
> > @@ -0,0 +1,5 @@
> > +# SPDX-License-Identifier: GPL-2.0
> > +
> > +vs_drm-objs := vs_dc_hw.o
> > +
> > +obj-$(CONFIG_DRM_VERISILICON_DC8200) += vs_drm.o
> > diff --git a/drivers/gpu/drm/verisilicon/vs_dc_hw.c
> b/drivers/gpu/drm/verisilicon/vs_dc_hw.c
> > new file mode 100644
> > index 000000000000..69f020f8352f
> > --- /dev/null
> > +++ b/drivers/gpu/drm/verisilicon/vs_dc_hw.c
> > @@ -0,0 +1,1060 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +/*
> > + * Copyright (C) 2023 VeriSilicon Holdings Co., Ltd.
>
> No changes in 2024?
>
it will be updated to 2024 next
> > + */
> > +
> > +#include <linux/bits.h>
> > +#include <linux/io.h>
> > +#include <linux/media-bus-format.h>
> > +//#include <drm/drm_atomic_helper.h>
>
> Either uncomment or drop.
Ok it will be modified next
>
> > +#include <drm/drm_blend.h>
> > +#include <drm/drm_fourcc.h>
> > +#include <drm/drm_framebuffer.h>
> > +#include <drm/drm_fb_dma_helper.h>
> > +
> > +#include "vs_dc_hw.h"
> > +
> > +static const u32 horkernel[] = {
> > + 0x00000000, 0x20000000, 0x00002000, 0x00000000,
> > + 0x00000000, 0x00000000, 0x23fd1c03, 0x00000000,
> > + 0x00000000, 0x00000000, 0x181f0000, 0x000027e1,
> > + 0x00000000, 0x00000000, 0x00000000, 0x2b981468,
> > + 0x00000000, 0x00000000, 0x00000000, 0x10f00000,
> > + 0x00002f10, 0x00000000, 0x00000000, 0x00000000,
> > + 0x32390dc7, 0x00000000, 0x00000000, 0x00000000,
> > + 0x0af50000, 0x0000350b, 0x00000000, 0x00000000,
> > + 0x00000000, 0x3781087f, 0x00000000, 0x00000000,
> > + 0x00000000, 0x06660000, 0x0000399a, 0x00000000,
> > + 0x00000000, 0x00000000, 0x3b5904a7, 0x00000000,
> > + 0x00000000, 0x00000000, 0x033c0000, 0x00003cc4,
> > + 0x00000000, 0x00000000, 0x00000000, 0x3de1021f,
> > + 0x00000000, 0x00000000, 0x00000000, 0x01470000,
> > + 0x00003eb9, 0x00000000, 0x00000000, 0x00000000,
> > + 0x3f5300ad, 0x00000000, 0x00000000, 0x00000000,
> > + 0x00480000, 0x00003fb8, 0x00000000, 0x00000000,
> > + 0x00000000, 0x3fef0011, 0x00000000, 0x00000000,
> > + 0x00000000, 0x00000000, 0x00004000, 0x00000000,
> > + 0x00000000, 0x00000000, 0x20002000, 0x00000000,
> > + 0x00000000, 0x00000000, 0x1c030000, 0x000023fd,
> > + 0x00000000, 0x00000000, 0x00000000, 0x27e1181f,
> > + 0x00000000, 0x00000000, 0x00000000, 0x14680000,
> > + 0x00002b98, 0x00000000, 0x00000000, 0x00000000,
> > + 0x2f1010f0, 0x00000000, 0x00000000, 0x00000000,
> > + 0x0dc70000, 0x00003239, 0x00000000, 0x00000000,
> > + 0x00000000, 0x350b0af5, 0x00000000, 0x00000000,
> > + 0x00000000, 0x087f0000, 0x00003781, 0x00000000,
> > + 0x00000000, 0x00000000, 0x399a0666, 0x00000000,
> > + 0x00000000, 0x00000000, 0x04a70000, 0x00003b59,
> > + 0x00000000, 0x00000000, 0x00000000, 0x3cc4033c,
> > + 0x00000000, 0x00000000, 0x00000000, 0x021f0000,
> > +};
> > +
> > +#define H_COEF_SIZE ARRAY_SIZE(horkernel)
> > +
> > +static const u32 verkernel[] = {
> > + 0x00000000, 0x20000000, 0x00002000, 0x00000000,
> > + 0x00000000, 0x00000000, 0x23fd1c03, 0x00000000,
> > + 0x00000000, 0x00000000, 0x181f0000, 0x000027e1,
> > + 0x00000000, 0x00000000, 0x00000000, 0x2b981468,
> > + 0x00000000, 0x00000000, 0x00000000, 0x10f00000,
> > + 0x00002f10, 0x00000000, 0x00000000, 0x00000000,
> > + 0x32390dc7, 0x00000000, 0x00000000, 0x00000000,
> > + 0x0af50000, 0x0000350b, 0x00000000, 0x00000000,
> > + 0x00000000, 0x3781087f, 0x00000000, 0x00000000,
> > + 0x00000000, 0x06660000, 0x0000399a, 0x00000000,
> > + 0x00000000, 0x00000000, 0x3b5904a7, 0x00000000,
> > + 0x00000000, 0x00000000, 0x033c0000, 0x00003cc4,
> > + 0x00000000, 0x00000000, 0x00000000, 0x3de1021f,
> > + 0x00000000, 0x00000000, 0x00000000, 0x01470000,
> > + 0x00003eb9, 0x00000000, 0x00000000, 0x00000000,
> > + 0x3f5300ad, 0x00000000, 0x00000000, 0x00000000,
> > + 0x00480000, 0x00003fb8, 0x00000000, 0x00000000,
> > + 0x00000000, 0x3fef0011, 0x00000000, 0x00000000,
> > + 0x00000000, 0x00000000, 0x00004000, 0x00000000,
> > + 0xcdcd0000, 0xfdfdfdfd, 0xabababab, 0xabababab,
> > + 0x00000000, 0x00000000, 0x5ff5f456, 0x000f5f58,
> > + 0x02cc6c78, 0x02cc0c28, 0xfeeefeee, 0xfeeefeee,
> > + 0xfeeefeee, 0xfeeefeee, 0xfeeefeee, 0xfeeefeee,
> > + 0xfeeefeee, 0xfeeefeee, 0xfeeefeee, 0xfeeefeee,
> > + 0xfeeefeee, 0xfeeefeee, 0xfeeefeee, 0xfeeefeee,
> > + 0xfeeefeee, 0xfeeefeee, 0xfeeefeee, 0xfeeefeee,
> > + 0xfeeefeee, 0xfeeefeee, 0xfeeefeee, 0xfeeefeee,
> > + 0xfeeefeee, 0xfeeefeee, 0xfeeefeee, 0xfeeefeee,
> > + 0xfeeefeee, 0xfeeefeee, 0xfeeefeee, 0xfeeefeee,
> > + 0xfeeefeee, 0xfeeefeee, 0xfeeefeee, 0xfeeefeee,
> > + 0xfeeefeee, 0xfeeefeee, 0xfeeefeee, 0xfeeefeee,
> > + 0xfeeefeee, 0xfeeefeee, 0xfeeefeee, 0xfeeefeee,
> > +};
> > +
> > +#define V_COEF_SIZE ARRAY_SIZE(verkernel)
> > +
> > +/*
> > + * RGB 709->2020 conversion parameters
> > + */
> > +static const u16 RGB2RGB[RGB_TO_RGB_TABLE_SIZE] = {
> > + 10279, 5395, 709,
> > + 1132, 15065, 187,
> > + 269, 1442, 14674
> > +};
> > +
> > +/*
> > + * YUV601 to RGB conversion parameters
> > + * YUV2RGB[0] - [8] : C0 - C8;
> > + * YUV2RGB[9] - [11]: D0 - D2;
> > + * YUV2RGB[12] - [13]: Y clamp min & max calue;
> > + * YUV2RGB[14] - [15]: UV clamp min & max calue;
> > + */
> > +static const s32 YUV601_2RGB[YUV_TO_RGB_TABLE_SIZE] = {
> > + 1196, 0, 1640, 1196,
> > + -404, -836, 1196, 2076,
> > + 0, -916224, 558336, -1202944,
> > + 64, 940, 64, 960
> > +};
> > +
> > +/*
> > + * YUV709 to RGB conversion parameters
> > + * YUV2RGB[0] - [8] : C0 - C8;
> > + * YUV2RGB[9] - [11]: D0 - D2;
> > + * YUV2RGB[12] - [13]: Y clamp min & max calue;
> > + * YUV2RGB[14] - [15]: UV clamp min & max calue;
> > + */
> > +static s32 YUV709_2RGB[YUV_TO_RGB_TABLE_SIZE] = {
> > + 1196, 0, 1844, 1196,
> > + -220, -548, 1196, 2172,
> > + 0, -1020672, 316672, -1188608,
> > + 64, 940, 64, 960
> > +};
> > +
> > +/*
> > + * YUV2020 to RGB conversion parameters
> > + * YUV2RGB[0] - [8] : C0 - C8;
> > + * YUV2RGB[9] - [11]: D0 - D2;
> > + * YUV2RGB[12] - [13]: Y clamp min & max calue;
> > + * YUV2RGB[14] - [15]: UV clamp min & max calue;
> > + */
> > +static s32 YUV2020_2RGB[YUV_TO_RGB_TABLE_SIZE] = {
> > + 1196, 0, 1724, 1196,
> > + -192, -668, 1196, 2200,
> > + 0, -959232, 363776, -1202944,
> > + 64, 940, 64, 960
> > +};
> > +
> > +/*
> > + * RGB to YUV2020 conversion parameters
> > + * RGB2YUV[0] - [8] : C0 - C8;
> > + * RGB2YUV[9] - [11]: D0 - D2;
> > + */
> > +static s16 RGB2YUV[RGB_TO_YUV_TABLE_SIZE] = {
> > + 230, 594, 52,
> > + -125, -323, 448,
> > + 448, -412, -36,
> > + 64, 512, 512
>
> Please fix spaces vs tabs here.
Ok it will be modified next
>
> > +};
> > +
> > +/* one is for primary plane and the other is for all overlay planes */
> > +static const struct dc_hw_plane_reg dc_plane_reg[] = {
> > + {
> > + .y_address = DC_FRAMEBUFFER_ADDRESS,
> > + .u_address = DC_FRAMEBUFFER_U_ADDRESS,
> > + .v_address = DC_FRAMEBUFFER_V_ADDRESS,
> > + .y_stride = DC_FRAMEBUFFER_STRIDE,
> > + .u_stride = DC_FRAMEBUFFER_U_STRIDE,
> > + .v_stride = DC_FRAMEBUFFER_V_STRIDE,
> > + .size = DC_FRAMEBUFFER_SIZE,
> > + .top_left = DC_FRAMEBUFFER_TOP_LEFT,
> > + .bottom_right = DC_FRAMEBUFFER_BOTTOM_RIGHT,
> > + .scale_factor_x =
> DC_FRAMEBUFFER_SCALE_FACTOR_X,
> > + .scale_factor_y =
> DC_FRAMEBUFFER_SCALE_FACTOR_Y,
> > + .h_filter_coef_index =
> DC_FRAMEBUFFER_H_FILTER_COEF_INDEX,
> > + .h_filter_coef_data = DC_FRAMEBUFFER_H_FILTER_COEF_DATA,
> > + .v_filter_coef_index =
> DC_FRAMEBUFFER_V_FILTER_COEF_INDEX,
> > + .v_filter_coef_data = DC_FRAMEBUFFER_V_FILTER_COEF_DATA,
> > + .init_offset = DC_FRAMEBUFFER_INIT_OFFSET,
> > + .color_key = DC_FRAMEBUFFER_COLOR_KEY,
> > + .color_key_high =
> DC_FRAMEBUFFER_COLOR_KEY_HIGH,
> > + .clear_value = DC_FRAMEBUFFER_CLEAR_VALUE,
> > + .color_table_index = DC_FRAMEBUFFER_COLOR_TABLE_INDEX,
> > + .color_table_data = DC_FRAMEBUFFER_COLOR_TABLE_DATA,
> > + .scale_config = DC_FRAMEBUFFER_SCALE_CONFIG,
> > + .water_mark = DC_FRAMEBUFFER_WATER_MARK,
> > + .degamma_index =
> DC_FRAMEBUFFER_DEGAMMA_INDEX,
> > + .degamma_data =
> DC_FRAMEBUFFER_DEGAMMA_DATA,
> > + .degamma_ex_data =
> DC_FRAMEBUFFER_DEGAMMA_EX_DATA,
> > + .src_global_color = DC_FRAMEBUFFER_SRC_GLOBAL_COLOR,
> > + .dst_global_color = DC_FRAMEBUFFER_DST_GLOBAL_COLOR,
> > + .blend_config = DC_FRAMEBUFFER_BLEND_CONFIG,
> > + .roi_origin = DC_FRAMEBUFFER_ROI_ORIGIN,
> > + .roi_size = DC_FRAMEBUFFER_ROI_SIZE,
> > + .yuv_to_rgb_coef0 =
> DC_FRAMEBUFFER_YUVTORGB_COEF0,
> > + .yuv_to_rgb_coef1 =
> DC_FRAMEBUFFER_YUVTORGB_COEF1,
> > + .yuv_to_rgb_coef2 =
> DC_FRAMEBUFFER_YUVTORGB_COEF2,
> > + .yuv_to_rgb_coef3 =
> DC_FRAMEBUFFER_YUVTORGB_COEF3,
> > + .yuv_to_rgb_coef4 =
> DC_FRAMEBUFFER_YUVTORGB_COEF4,
> > + .yuv_to_rgb_coefd0 =
> DC_FRAMEBUFFER_YUVTORGB_COEFD0,
> > + .yuv_to_rgb_coefd1 =
> DC_FRAMEBUFFER_YUVTORGB_COEFD1,
> > + .yuv_to_rgb_coefd2 =
> DC_FRAMEBUFFER_YUVTORGB_COEFD2,
> > + .y_clamp_bound =
> DC_FRAMEBUFFER_Y_CLAMP_BOUND,
> > + .uv_clamp_bound =
> DC_FRAMEBUFFER_UV_CLAMP_BOUND,
> > + .rgb_to_rgb_coef0 =
> DC_FRAMEBUFFER_RGBTORGB_COEF0,
> > + .rgb_to_rgb_coef1 =
> DC_FRAMEBUFFER_RGBTORGB_COEF1,
> > + .rgb_to_rgb_coef2 =
> DC_FRAMEBUFFER_RGBTORGB_COEF2,
> > + .rgb_to_rgb_coef3 =
> DC_FRAMEBUFFER_RGBTORGB_COEF3,
> > + .rgb_to_rgb_coef4 =
> DC_FRAMEBUFFER_RGBTORGB_COEF4,
> > + },
> > + {
> > + .y_address = DC_OVERLAY_ADDRESS,
> > + .u_address = DC_OVERLAY_U_ADDRESS,
> > + .v_address = DC_OVERLAY_V_ADDRESS,
> > + .y_stride = DC_OVERLAY_STRIDE,
> > + .u_stride = DC_OVERLAY_U_STRIDE,
> > + .v_stride = DC_OVERLAY_V_STRIDE,
> > + .size = DC_OVERLAY_SIZE,
> > + .top_left = DC_OVERLAY_TOP_LEFT,
> > + .bottom_right = DC_OVERLAY_BOTTOM_RIGHT,
> > + .scale_factor_x = DC_OVERLAY_SCALE_FACTOR_X,
> > + .scale_factor_y = DC_OVERLAY_SCALE_FACTOR_Y,
> > + .h_filter_coef_index = DC_OVERLAY_H_FILTER_COEF_INDEX,
> > + .h_filter_coef_data = DC_OVERLAY_H_FILTER_COEF_DATA,
> > + .v_filter_coef_index = DC_OVERLAY_V_FILTER_COEF_INDEX,
> > + .v_filter_coef_data = DC_OVERLAY_V_FILTER_COEF_DATA,
> > + .init_offset = DC_OVERLAY_INIT_OFFSET,
> > + .color_key = DC_OVERLAY_COLOR_KEY,
> > + .color_key_high = DC_OVERLAY_COLOR_KEY_HIGH,
> > + .clear_value = DC_OVERLAY_CLEAR_VALUE,
> > + .color_table_index = DC_OVERLAY_COLOR_TABLE_INDEX,
> > + .color_table_data = DC_OVERLAY_COLOR_TABLE_DATA,
> > + .scale_config = DC_OVERLAY_SCALE_CONFIG,
> > + .water_mark = DC_OVERLAY_WATER_MARK,
> > + .degamma_index = DC_OVERLAY_DEGAMMA_INDEX,
> > + .degamma_data = DC_OVERLAY_DEGAMMA_DATA,
> > + .degamma_ex_data = DC_OVERLAY_DEGAMMA_EX_DATA,
> > + .src_global_color = DC_OVERLAY_SRC_GLOBAL_COLOR,
> > + .dst_global_color = DC_OVERLAY_DST_GLOBAL_COLOR,
> > + .blend_config = DC_OVERLAY_BLEND_CONFIG,
> > + .roi_origin = DC_OVERLAY_ROI_ORIGIN,
> > + .roi_size = DC_OVERLAY_ROI_SIZE,
> > + .yuv_to_rgb_coef0 = DC_OVERLAY_YUVTORGB_COEF0,
> > + .yuv_to_rgb_coef1 = DC_OVERLAY_YUVTORGB_COEF1,
> > + .yuv_to_rgb_coef2 = DC_OVERLAY_YUVTORGB_COEF2,
> > + .yuv_to_rgb_coef3 = DC_OVERLAY_YUVTORGB_COEF3,
> > + .yuv_to_rgb_coef4 = DC_OVERLAY_YUVTORGB_COEF4,
> > + .yuv_to_rgb_coefd0 =
> DC_OVERLAY_YUVTORGB_COEFD0,
> > + .yuv_to_rgb_coefd1 =
> DC_OVERLAY_YUVTORGB_COEFD1,
> > + .yuv_to_rgb_coefd2 =
> DC_OVERLAY_YUVTORGB_COEFD2,
> > + .y_clamp_bound = DC_OVERLAY_Y_CLAMP_BOUND,
> > + .uv_clamp_bound = DC_OVERLAY_UV_CLAMP_BOUND,
> > + .rgb_to_rgb_coef0 = DC_OVERLAY_RGBTORGB_COEF0,
> > + .rgb_to_rgb_coef1 = DC_OVERLAY_RGBTORGB_COEF1,
> > + .rgb_to_rgb_coef2 = DC_OVERLAY_RGBTORGB_COEF2,
> > + .rgb_to_rgb_coef3 = DC_OVERLAY_RGBTORGB_COEF3,
> > + .rgb_to_rgb_coef4 = DC_OVERLAY_RGBTORGB_COEF4,
> > + },
> > +};
> > +
> > +static inline u32 hi_read(struct dc_hw *hw, u32 reg)
> > +{
> > + return readl(hw->hi_base + reg);
> > +}
> > +
> > +static inline void hi_write(struct dc_hw *hw, u32 reg, u32 value)
> > +{
> > + writel(value, hw->hi_base + reg);
> > +}
> > +
> > +static inline void dc_write(struct dc_hw *hw, u32 reg, u32 value)
> > +{
> > + writel(value, hw->reg_base + reg - DC_REG_BASE);
> > +}
> > +
> > +static inline u32 dc_read(struct dc_hw *hw, u32 reg)
> > +{
> > + u32 value = readl(hw->reg_base + reg - DC_REG_BASE);
> > +
> > + return value;
>
> just return readl(...)
Ok it will be modified next , good idea!
>
> > +}
> > +
> > +static inline void dc_set_clear(struct dc_hw *hw, u32 reg, u32 set, u32 clear)
> > +{
> > + u32 value = dc_read(hw, reg);
> > +
> > + value &= ~clear;
> > + value |= set;
> > + dc_write(hw, reg, value);
>
> regmap_update_bits?
regmap_update_bits follows 4 steps:
1、ret = _regmap_read(map, reg, &orig);
.........
2、tmp = orig & ~mask;
3、tmp |= val & mask;
......
4、ret = _regmap_write(map, reg, tmp);
If the value out of mask range
It will just clear the mask bir
dc_set_clear will do clear and set without limit.
Maybe the name should be dc_clear_set
}
>
> > +}
> > +
> > +static void load_default_filter(struct dc_hw *hw,
> > + const struct dc_hw_plane_reg *reg, u32 offset)
> > +{
> > + u8 i;
> > +
> > + dc_write(hw, reg->scale_config + offset, 0x33);
> > + dc_write(hw, reg->init_offset + offset, 0x80008000);
> > + dc_write(hw, reg->h_filter_coef_index + offset, 0x00);
> > + for (i = 0; i < H_COEF_SIZE; i++)
> > + dc_write(hw, reg->h_filter_coef_data + offset, horkernel[i]);
> > +
> > + dc_write(hw, reg->v_filter_coef_index + offset, 0x00);
> > + for (i = 0; i < V_COEF_SIZE; i++)
> > + dc_write(hw, reg->v_filter_coef_data + offset, verkernel[i]);
> > +}
> > +
> > +static void load_rgb_to_rgb(struct dc_hw *hw, const struct
> dc_hw_plane_reg *reg,
> > + u32 offset, const u16 *table)
> > +{
> > + dc_write(hw, reg->rgb_to_rgb_coef0 + offset, table[0] | (table[1] << 16));
> > + dc_write(hw, reg->rgb_to_rgb_coef1 + offset, table[2] | (table[3] << 16));
> > + dc_write(hw, reg->rgb_to_rgb_coef2 + offset, table[4] | (table[5] << 16));
> > + dc_write(hw, reg->rgb_to_rgb_coef3 + offset, table[6] | (table[7] << 16));
> > + dc_write(hw, reg->rgb_to_rgb_coef4 + offset, table[8]);
> > +}
> > +
> > +static void load_yuv_to_rgb(struct dc_hw *hw, const struct
> dc_hw_plane_reg *reg,
> > + u32 offset, const s32 *table)
> > +{
> > + dc_write(hw, reg->yuv_to_rgb_coef0 + offset,
> > + (0xFFFF & table[0]) | (table[1] << 16));
> > + dc_write(hw, reg->yuv_to_rgb_coef1 + offset,
> > + (0xFFFF & table[2]) | (table[3] << 16));
> > + dc_write(hw, reg->yuv_to_rgb_coef2 + offset,
> > + (0xFFFF & table[4]) | (table[5] << 16));
> > + dc_write(hw, reg->yuv_to_rgb_coef3 + offset,
> > + (0xFFFF & table[6]) | (table[7] << 16));
> > + dc_write(hw, reg->yuv_to_rgb_coef4 + offset, table[8]);
> > + dc_write(hw, reg->yuv_to_rgb_coefd0 + offset, table[9]);
> > + dc_write(hw, reg->yuv_to_rgb_coefd1 + offset, table[10]);
> > + dc_write(hw, reg->yuv_to_rgb_coefd2 + offset, table[11]);
> > + dc_write(hw, reg->y_clamp_bound + offset, table[12] | (table[13] << 16));
> > + dc_write(hw, reg->uv_clamp_bound + offset, table[14] | (table[15] << 16));
> > +}
> > +
> > +static void load_rgb_to_yuv(struct dc_hw *hw, u32 offset, s16 *table)
>
> Is there any reason why load_rgb_to_yuv differs from two other
> functions?
>
load_rgb_to_yuv matches crtcs
load_yuv_to_rgb matches planes
load_rgb_to_rgb matches planes
the coefficient(table) is diff between load_rgb_to_yuv and load_yuv_to_rgb
> > +{
> > + dc_write(hw, DC_DISPLAY_RGBTOYUV_COEF0 + offset,
> > + table[0] | (table[1] << 16));
> > + dc_write(hw, DC_DISPLAY_RGBTOYUV_COEF1 + offset,
> > + table[2] | (table[3] << 16));
> > + dc_write(hw, DC_DISPLAY_RGBTOYUV_COEF2 + offset,
> > + table[4] | (table[5] << 16));
> > + dc_write(hw, DC_DISPLAY_RGBTOYUV_COEF3 + offset,
> > + table[6] | (table[7] << 16));
> > + dc_write(hw, DC_DISPLAY_RGBTOYUV_COEF4 + offset, table[8]);
> > + dc_write(hw, DC_DISPLAY_RGBTOYUV_COEFD0 + offset, table[9]);
> > + dc_write(hw, DC_DISPLAY_RGBTOYUV_COEFD1 + offset, table[10]);
> > + dc_write(hw, DC_DISPLAY_RGBTOYUV_COEFD2 + offset, table[11]);
> > +}
> > +
> > +static int update_vs_format(u32 drm_format)
> > +{
> > + u8 f = FORMAT_A8R8G8B8;
> > +
> > + switch (drm_format) {
> > + case DRM_FORMAT_XRGB4444:
> > + case DRM_FORMAT_RGBX4444:
> > + case DRM_FORMAT_XBGR4444:
> > + case DRM_FORMAT_BGRX4444:
> > + f = FORMAT_X4R4G4B4;
> > + break;
> > + case DRM_FORMAT_ARGB4444:
> > + case DRM_FORMAT_RGBA4444:
> > + case DRM_FORMAT_ABGR4444:
> > + case DRM_FORMAT_BGRA4444:
> > + f = FORMAT_A4R4G4B4;
> > + break;
> > + case DRM_FORMAT_XRGB1555:
> > + case DRM_FORMAT_RGBX5551:
> > + case DRM_FORMAT_XBGR1555:
> > + case DRM_FORMAT_BGRX5551:
> > + f = FORMAT_X1R5G5B5;
> > + break;
> > + case DRM_FORMAT_ARGB1555:
> > + case DRM_FORMAT_RGBA5551:
> > + case DRM_FORMAT_ABGR1555:
> > + case DRM_FORMAT_BGRA5551:
> > + f = FORMAT_A1R5G5B5;
> > + break;
> > + case DRM_FORMAT_RGB565:
> > + case DRM_FORMAT_BGR565:
> > + f = FORMAT_R5G6B5;
> > + break;
> > + case DRM_FORMAT_XRGB8888:
> > + case DRM_FORMAT_RGBX8888:
> > + case DRM_FORMAT_XBGR8888:
> > + case DRM_FORMAT_BGRX8888:
> > + f = FORMAT_X8R8G8B8;
> > + break;
> > + case DRM_FORMAT_ARGB8888:
> > + case DRM_FORMAT_RGBA8888:
> > + case DRM_FORMAT_ABGR8888:
> > + case DRM_FORMAT_BGRA8888:
> > + f = FORMAT_A8R8G8B8;
> > + break;
> > + case DRM_FORMAT_YUYV:
> > + case DRM_FORMAT_YVYU:
> > + f = FORMAT_YUY2;
> > + break;
> > + case DRM_FORMAT_UYVY:
> > + case DRM_FORMAT_VYUY:
> > + f = FORMAT_UYVY;
> > + break;
> > + case DRM_FORMAT_YUV420:
> > + case DRM_FORMAT_YVU420:
> > + f = FORMAT_YV12;
> > + break;
> > + case DRM_FORMAT_NV21:
> > + f = FORMAT_NV12;
> > + break;
> > + case DRM_FORMAT_NV16:
> > + case DRM_FORMAT_NV61:
> > + f = FORMAT_NV16;
> > + break;
> > + case DRM_FORMAT_P010:
> > + f = FORMAT_P010;
> > + break;
> > + case DRM_FORMAT_ARGB2101010:
> > + case DRM_FORMAT_RGBA1010102:
> > + case DRM_FORMAT_ABGR2101010:
> > + case DRM_FORMAT_BGRA1010102:
> > + f = FORMAT_A2R10G10B10;
> > + break;
> > + case DRM_FORMAT_NV12:
> > + f = FORMAT_NV12;
> > + break;
> > + case DRM_FORMAT_YUV444:
> > + f = FORMAT_YUV444;
>
> s/f = /return /g all over the place.
it will be modified next
>
> > + break;
> > + default:
>
> return -EINVAL;
>
> > + break;
> > + }
> > +
> > + return f;
> > +}
> > +
> > +int dc_hw_init(struct vs_dc *dc)
> > +{
> > + u8 i, id, panel_num, layer_num;
> > + struct dc_hw *hw = &dc->hw;
> > + u32 offset;
> > +
> > + layer_num = hw->info->layer_num;
> > + for (i = 0; i < layer_num; i++) {
> > + id = dc->planes[i].id;
> > + if (id == PRIMARY_PLANE_0 || id == PRIMARY_PLANE_1)
> > + hw->reg[i] = dc_plane_reg[0];
> > + else
> > + hw->reg[i] = dc_plane_reg[1];
> > +
> > + load_default_filter(hw, &hw->reg[i], dc->planes[i].offset);
> > + load_rgb_to_rgb(hw, &hw->reg[i], dc->planes[i].offset, RGB2RGB);
> > + }
> > +
> > + panel_num = hw->info->panel_num;
> > + for (i = 0; i < panel_num; i++) {
> > + offset = i << 2;
> > +
> > + load_rgb_to_yuv(hw, offset, RGB2YUV);
> > + dc_write(hw, DC_DISPLAY_PANEL_CONFIG + offset, 0x111);
> > +
> > + offset = i ? DC_CURSOR_OFFSET : 0;
> > + dc_write(hw, DC_CURSOR_BACKGROUND + offset, 0x00FFFFFF);
> > + dc_write(hw, DC_CURSOR_FOREGROUND + offset, 0x00AAAAAA);
> > + }
> > +
> > + return 0;
> > +}
> > +
> > +void dc_hw_disable_plane(struct vs_dc *dc, u8 id)
> > +{
> > + struct dc_hw *hw = &dc->hw;
> > +
> > + if (id == PRIMARY_PLANE_0 || id == PRIMARY_PLANE_1)
> > + dc_set_clear(hw, DC_FRAMEBUFFER_CONFIG_EX +
> dc->planes[id].offset,
> > + PRIMARY_EN(false), PRIMARY_EN_MASK);
> > + else
> > + dc_set_clear(hw, DC_OVERLAY_CONFIG + dc->planes[id].offset,
> > + OVERLAY_FB_EN(false), OVERLAY_FB_EN_MASK);
> > +}
> > +
> > +static int update_cursor_size(uint32_t crtc_w)
>
> get_cursor_size()
>
> > +{
> > + u8 size_type;
> > +
> > + switch (crtc_w) {
> > + case 32:
> > + size_type = CURSOR_SIZE_32X32;
> > + break;
> > + case 64:
> > + size_type = CURSOR_SIZE_64X64;
> > + break;
> > + default:
> > + size_type = CURSOR_SIZE_32X32;
> > + break;
> > + }
> > +
> > + return size_type;
>
> Same comment. Return directly without extra variable assignments.
it will be modified next
>
> > +}
> > +
> > +void dc_hw_update_cursor(struct dc_hw *hw, u8 id, dma_addr_t dma_addr,
> > + u32 crtc_w, u32 crtc_x, u32 crtc_y,
> > + s32 hotspot_x, s32 hotspot_y)
> > +{
> > + u32 offset, size;
> > +
> > + offset = id ? DC_CURSOR_OFFSET : 0;
> > + size = update_cursor_size(crtc_w);
> > +
> > + dc_write(hw, DC_CURSOR_ADDRESS + offset,
> > + dma_addr);
> > + dc_write(hw, DC_CURSOR_LOCATION + offset,
> > + X_LCOTION(crtc_x) |
> > + Y_LCOTION(crtc_y));
> > + dc_set_clear(hw, DC_CURSOR_CONFIG + offset,
> > + CURSOR_HOT_X(hotspot_x) |
> > + CURSOR_HOT_y(hotspot_y) |
> > + CURSOR_SIZE(size) |
> > + CURSOR_VALID(1) |
> > + CURSOR_TRIG_FETCH(1) |
> > + CURSOR_FORMAT(CURSOR_FORMAT_A8R8G8B8),
> > + CURSOR_HOT_X_MASK |
> > + CURSOR_HOT_y_MASK |
> > + CURSOR_SIZE_MASK |
> > + CURSOR_VALID_MASK |
> > + CURSOR_TRIG_FETCH_MASK |
> > + CURSOR_FORMAT_MASK);
> > +}
> > +
> > +void dc_hw_disable_cursor(struct dc_hw *hw, u8 id)
> > +{
> > + u32 offset = 0;
> > +
> > + offset = id ? DC_CURSOR_OFFSET : 0;
> > + dc_set_clear(hw, DC_CURSOR_CONFIG + offset, CURSOR_VALID(1),
> CURSOR_FORMAT_MASK);
> > +}
> > +
> > +void dc_hw_update_gamma(struct dc_hw *hw, u8 id, u16 index,
> > + u16 r, u16 g, u16 b)
> > +{
> > + if (index >= hw->info->gamma_size)
> > + return;
> > +
> > + hw->gamma[id].gamma[index][0] = r;
> > + hw->gamma[id].gamma[index][1] = g;
> > + hw->gamma[id].gamma[index][2] = b;
> > +}
> > +
> > +void dc_hw_enable_gamma(struct dc_hw *hw, u8 id, bool enable)
> > +{
> > + u32 value;
> > +
> > + if (enable) {
> > + dc_write(hw, DC_DISPLAY_GAMMA_EX_INDEX + (id << 2), 0x00);
> > + for (int i = 0; i < GAMMA_EX_SIZE; i++) {
> > + value = hw->gamma[id].gamma[i][2] |
> > + (hw->gamma[id].gamma[i][1] << 12);
> > + dc_write(hw, DC_DISPLAY_GAMMA_EX_DATA + (id << 2), value);
> > + dc_write(hw, DC_DISPLAY_GAMMA_EX_ONE_DATA + (id << 2),
> > + hw->gamma[id].gamma[i][0]);
> > + }
> > + dc_set_clear(hw, DC_DISPLAY_PANEL_CONFIG + (id << 2),
> PANEL_GAMMA_EN, 0);
> > + } else {
> > + dc_set_clear(hw, DC_DISPLAY_PANEL_CONFIG + (id << 2), 0,
> PANEL_GAMMA_EN);
> > + }
> > +}
> > +
> > +void dc_hw_enable(struct dc_hw *hw, int id, struct drm_display_mode
> *mode,
> > + u8 encoder_type, u32 output_fmt)
> > +{
> > + u32 dp_cfg, dpi_cfg, offset = id << 2;
> > + bool is_yuv = false;
> > +
> > + if (encoder_type != DRM_MODE_ENCODER_DSI) {
> > + switch (output_fmt) {
> > + case MEDIA_BUS_FMT_RGB565_1X16:
> > + dp_cfg = 0;
> > + break;
> > + case MEDIA_BUS_FMT_RGB666_1X18:
> > + dp_cfg = 1;
> > + break;
> > + case MEDIA_BUS_FMT_RGB888_1X24:
> > + dp_cfg = 2;
> > + break;
> > + case MEDIA_BUS_FMT_RGB101010_1X30:
> > + dp_cfg = 3;
> > + break;
> > + case MEDIA_BUS_FMT_UYVY8_1X16:
> > + dp_cfg = 2 << 4;
> > + is_yuv = true;
> > + break;
> > + case MEDIA_BUS_FMT_YUV8_1X24:
> > + dp_cfg = 4 << 4;
> > + is_yuv = true;
> > + break;
> > + case MEDIA_BUS_FMT_UYVY10_1X20:
> > + dp_cfg = 8 << 4;
> > + is_yuv = true;
> > + break;
> > + case MEDIA_BUS_FMT_YUV10_1X30:
> > + dp_cfg = 10 << 4;
> > + is_yuv = true;
> > + break;
> > + case MEDIA_BUS_FMT_UYYVYY8_0_5X24:
> > + dp_cfg = 12 << 4;
> > + is_yuv = true;
> > + break;
> > + case MEDIA_BUS_FMT_UYYVYY10_0_5X30:
> > + dp_cfg = 13 << 4;
> > + is_yuv = true;
> > + break;
> > + default:
> > + dp_cfg = 2;
> > + break;
> > + }
> > + if (is_yuv)
> > + dc_set_clear(hw, DC_DISPLAY_PANEL_CONFIG + offset,
> PANEL_RGB2YUV_EN, 0);
> > + else
> > + dc_set_clear(hw, DC_DISPLAY_PANEL_CONFIG + offset, 0,
> PANEL_RGB2YUV_EN);
> > + dc_write(hw, DC_DISPLAY_DP_CONFIG + offset, dp_cfg | DP_SELECT);
> > + }
> > +
> > + if (hw->out[id] == OUT_DPI)
> > + dc_set_clear(hw, DC_DISPLAY_DP_CONFIG + offset, 0, DP_SELECT);
> > +
> > + switch (output_fmt) {
> > + case MEDIA_BUS_FMT_RGB565_1X16:
> > + dpi_cfg = 0;
> > + break;
> > + case MEDIA_BUS_FMT_RGB666_1X18:
> > + dpi_cfg = 3;
> > + break;
> > + case MEDIA_BUS_FMT_RGB666_1X24_CPADHI:
> > + dpi_cfg = 4;
> > + break;
> > + case MEDIA_BUS_FMT_RGB888_1X24:
> > + dpi_cfg = 5;
> > + break;
> > + case MEDIA_BUS_FMT_RGB101010_1X30:
> > + dpi_cfg = 6;
> > + break;
> > + default:
> > + dpi_cfg = 5;
> > + break;
> > + }
> > + dc_write(hw, DC_DISPLAY_DPI_CONFIG + offset, dpi_cfg);
> > +
> > + if (id == 0)
> > + dc_set_clear(hw, DC_DISPLAY_PANEL_START, 0, PANEL0_EN |
> TWO_PANEL_EN);
> > + else
> > + dc_set_clear(hw, DC_DISPLAY_PANEL_START, 0, PANEL1_EN |
> TWO_PANEL_EN);
> > +
> > + dc_write(hw, DC_DISPLAY_H + offset,
> > + H_ACTIVE_LEN(mode->hdisplay) |
> > + H_TOTAL_LEN(mode->htotal));
> > +
> > + dc_write(hw, DC_DISPLAY_H_SYNC + offset,
> > + H_SYNC_START_LEN(mode->hsync_start) |
> > + H_SYNC_END_LEN(mode->hsync_end) |
> > + H_POLARITY_LEN(mode->flags & DRM_MODE_FLAG_PHSYNC ? 0 :
> 1) |
> > + H_PLUS_LEN(1));
> > +
> > + dc_write(hw, DC_DISPLAY_V + offset,
> > + V_ACTIVE_LEN(mode->vdisplay) |
> > + V_TOTAL_LEN(mode->vtotal));
> > +
> > + dc_write(hw, DC_DISPLAY_V_SYNC + offset,
> > + V_SYNC_START_LEN(mode->vsync_start) |
> > + V_SYNC_END_LEN(mode->vsync_end) |
> > + V_POLARITY_LEN(mode->flags & DRM_MODE_FLAG_PVSYNC ? 0 : 1)
> |
> > + V_PLUS_LEN(1));
> > +
> > + dc_set_clear(hw, DC_DISPLAY_PANEL_CONFIG + offset,
> PANEL_OUTPUT_EN, 0);
> > + dc_set_clear(hw, DC_DISPLAY_PANEL_START, BIT(id), SYNC_EN);
> > +}
> > +
> > +void dc_hw_disable(struct dc_hw *hw, int id)
> > +{
> > + u32 offset = id << 2;
> > +
> > + if (hw->out[id] == OUT_DPI)
> > + dc_set_clear(hw, DC_DISPLAY_DP_CONFIG + offset, 0, DP_SELECT);
> > + dc_set_clear(hw, DC_DISPLAY_PANEL_CONFIG + offset, 0,
> PANEL_OUTPUT_EN);
> > + dc_set_clear(hw, DC_DISPLAY_PANEL_START, 0, BIT(id) | TWO_PANEL_EN);
> > +}
> > +
> > +void dc_hw_enable_interrupt(struct dc_hw *hw)
> > +{
> > + hi_write(hw, AQ_INTR_ENBL, 0xFFFFFFFF);
> > +}
> > +
> > +void dc_hw_disable_interrupt(struct dc_hw *hw)
> > +{
> > + hi_write(hw, AQ_INTR_ENBL, 0);
> > +}
> > +
> > +u32 dc_hw_get_interrupt(struct dc_hw *hw)
> > +{
> > + return hi_read(hw, AQ_INTR_ACKNOWLEDGE);
> > +}
> > +
> > +void dc_hw_enable_shadow_register(struct vs_dc *dc, bool enable)
> > +{
> > + u32 i, offset;
> > + struct dc_hw *hw = &dc->hw;
> > + u8 id, layer_num = hw->info->layer_num;
> > + u8 panel_num = hw->info->panel_num;
> > +
> > + for (i = 0; i < layer_num; i++) {
> > + id = dc->planes[i].id;
> > + offset = dc->planes[i].offset;
> > + if (enable) {
> > + if (id == PRIMARY_PLANE_0 || id == PRIMARY_PLANE_1)
> > + dc_set_clear(hw, DC_FRAMEBUFFER_CONFIG_EX + offset,
> > + PRIMARY_SHADOW_EN, 0);
> > + else
> > + dc_set_clear(hw, DC_OVERLAY_CONFIG + offset,
> > + OVERLAY_SHADOW_EN, 0);
> > + } else {
> > + if (id == PRIMARY_PLANE_0 || id == PRIMARY_PLANE_1)
> > + dc_set_clear(hw, DC_FRAMEBUFFER_CONFIG_EX + offset,
> > + 0, PRIMARY_SHADOW_EN);
> > + else
> > + dc_set_clear(hw, DC_OVERLAY_CONFIG + offset,
> > + 0, OVERLAY_SHADOW_EN);
> > + }
> > + }
> > +
> > + for (i = 0; i < panel_num; i++) {
> > + offset = i << 2;
> > + if (enable)
> > + dc_set_clear(hw, DC_DISPLAY_PANEL_CONFIG_EX + offset, 0,
> PANEL_SHADOW_EN);
> > + else
> > + dc_set_clear(hw, DC_DISPLAY_PANEL_CONFIG_EX + offset,
> PANEL_SHADOW_EN, 0);
> > + }
> > +}
> > +
> > +void dc_hw_set_out(struct dc_hw *hw, enum dc_hw_out out, u8 id)
> > +{
> > + if (out <= OUT_DP)
>
> This doesn't scale if you add another output type. Please either add
> OUT_MAX or consider something which doesn't make OUT_DP special.
>
> > + hw->out[id] = out;
> > +}
> > +
> > +static inline u8 to_vs_yuv_color_space(u32 color_space)
> > +{
> > + u8 cs;
> > +
> > + switch (color_space) {
> > + case DRM_COLOR_YCBCR_BT601:
> > + cs = COLOR_SPACE_601;
> > + break;
> > + case DRM_COLOR_YCBCR_BT709:
> > + cs = COLOR_SPACE_709;
> > + break;
> > + case DRM_COLOR_YCBCR_BT2020:
> > + cs = COLOR_SPACE_2020;
> > + break;
> > + default:
> > + cs = COLOR_SPACE_601;
> > + break;
> > + }
> > +
> > + return cs;
> > +}
> > +
> > +static inline u8 update_uv_swizzle(u32 format)
> > +{
> > + u8 uv_swizzle = 0;
> > +
> > + switch (format) {
> > + case DRM_FORMAT_YVYU:
> > + case DRM_FORMAT_VYUY:
> > + case DRM_FORMAT_NV21:
> > + case DRM_FORMAT_NV61:
> > + uv_swizzle = 1;
> > + break;
> > + default:
> > + break;
> > + }
> > +
> > + return uv_swizzle;
> > +}
> > +
> > +static inline u8 update_swizzle(u32 format)
> > +{
> > + u8 swizzle = SWIZZLE_ARGB;
> > +
> > + switch (format) {
> > + case DRM_FORMAT_RGBX4444:
> > + case DRM_FORMAT_RGBA4444:
> > + case DRM_FORMAT_RGBX5551:
> > + case DRM_FORMAT_RGBA5551:
> > + case DRM_FORMAT_RGBX8888:
> > + case DRM_FORMAT_RGBA8888:
> > + case DRM_FORMAT_RGBA1010102:
> > + swizzle = SWIZZLE_RGBA;
> > + break;
> > + case DRM_FORMAT_XBGR4444:
> > + case DRM_FORMAT_ABGR4444:
> > + case DRM_FORMAT_XBGR1555:
> > + case DRM_FORMAT_ABGR1555:
> > + case DRM_FORMAT_BGR565:
> > + case DRM_FORMAT_XBGR8888:
> > + case DRM_FORMAT_ABGR8888:
> > + case DRM_FORMAT_ABGR2101010:
> > + swizzle = SWIZZLE_ABGR;
> > + break;
> > + case DRM_FORMAT_BGRX4444:
> > + case DRM_FORMAT_BGRA4444:
> > + case DRM_FORMAT_BGRX5551:
> > + case DRM_FORMAT_BGRA5551:
> > + case DRM_FORMAT_BGRX8888:
> > + case DRM_FORMAT_BGRA8888:
> > + case DRM_FORMAT_BGRA1010102:
> > + swizzle = SWIZZLE_BGRA;
> > + break;
> > + default:
> > + break;
> > + }
> > +
> > + return swizzle;
> > +}
> > +
> > +static inline u8 to_vs_rotation(unsigned int rotation)
> > +{
> > + u8 rot;
> > +
> > + switch (rotation & DRM_MODE_REFLECT_MASK) {
> > + case DRM_MODE_REFLECT_X:
> > + rot = FLIP_X;
> > + return rot;
> > + case DRM_MODE_REFLECT_Y:
> > + rot = FLIP_Y;
> > + return rot;
> > + case DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_Y:
> > + rot = FLIP_XY;
> > + return rot;
> > + default:
> > + break;
> > + }
> > +
> > + switch (rotation & DRM_MODE_ROTATE_MASK) {
> > + case DRM_MODE_ROTATE_0:
> > + rot = ROT_0;
> > + break;
> > + case DRM_MODE_ROTATE_90:
> > + rot = ROT_90;
> > + break;
> > + case DRM_MODE_ROTATE_180:
> > + rot = ROT_180;
> > + break;
> > + case DRM_MODE_ROTATE_270:
> > + rot = ROT_270;
> > + break;
> > + default:
> > + rot = ROT_0;
> > + break;
> > + }
> > +
> > + return rot;
> > +}
> > +
> > +void plane_hw_update_format_colorspace(struct vs_dc *dc, u32 format,
> > + enum drm_color_encoding encoding, u8 id, bool
> is_yuv)
> > +{
> > + u32 offset = dc->planes[id].offset;
> > + struct dc_hw *hw = &dc->hw;
> > +
> > + if (is_yuv) {
> > + if (id == PRIMARY_PLANE_0 || id == PRIMARY_PLANE_1)
> > + dc_set_clear(hw, DC_FRAMEBUFFER_CONFIG_EX + offset,
> > + PRIMARY_YUVCLAMP_EN, PRIMARY_RGB2RGB_EN);
> > + else
> > + dc_set_clear(hw, DC_OVERLAY_CONFIG + offset,
> > + OVERLAY_CLAMP_EN, OVERLAY_RGB2RGB_EN);
> > +
> > + switch (to_vs_yuv_color_space(encoding)) {
> > + case COLOR_SPACE_601:
> > + load_yuv_to_rgb(hw, &hw->reg[id], offset, YUV601_2RGB);
> > + break;
> > + case COLOR_SPACE_709:
> > + load_yuv_to_rgb(hw, &hw->reg[id], offset, YUV709_2RGB);
> > + break;
> > + case COLOR_SPACE_2020:
> > + load_yuv_to_rgb(hw, &hw->reg[id], offset, YUV2020_2RGB);
> > + break;
> > + default:
> > + break;
> > + }
> > + } else {
> > + if (id == PRIMARY_PLANE_0 || id == PRIMARY_PLANE_1)
> > + dc_set_clear(hw, DC_FRAMEBUFFER_CONFIG_EX + offset,
> > + PRIMARY_RGB2RGB_EN, PRIMARY_YUVCLAMP_EN);
> > + else
> > + dc_set_clear(hw, DC_OVERLAY_CONFIG + offset,
> > + OVERLAY_RGB2RGB_EN, OVERLAY_CLAMP_EN);
> > + }
> > +}
> > +
> > +void plane_hw_update_address(struct vs_dc *dc, u8 id, u32 format,
> dma_addr_t *dma_addr,
> > + struct drm_framebuffer *drm_fb, struct drm_rect *src)
> > +{
> > + u32 offset = dc->planes[id].offset;
> > + struct dc_hw *hw = &dc->hw;
> > +
> > + dc_write(hw, hw->reg[id].y_address + offset, dma_addr[0]);
> > + dc_write(hw, hw->reg[id].u_address + offset,
> > + format == DRM_FORMAT_YVU420 ?
> > + dma_addr[2] : dma_addr[1]);
> > + dc_write(hw, hw->reg[id].v_address + offset,
> > + format == DRM_FORMAT_YVU420 ?
> > + dma_addr[1] : dma_addr[2]);
> > + dc_write(hw, hw->reg[id].y_stride + offset, drm_fb->pitches[0]);
> > + dc_write(hw, hw->reg[id].u_stride + offset,
> > + format == DRM_FORMAT_YVU420 ?
> > + drm_fb->pitches[2] : drm_fb->pitches[1]);
> > + dc_write(hw, hw->reg[id].v_stride + offset,
> > + format == DRM_FORMAT_YVU420 ?
> > + drm_fb->pitches[1] : drm_fb->pitches[2]);
> > + dc_write(hw, hw->reg[id].size + offset,
> > + FB_SIZE(drm_rect_width(src) >> 16, drm_rect_height(src) >> 16));
> > +}
> > +
> > +void plane_hw_update_format(struct vs_dc *dc, u32 format, enum
> drm_color_encoding encoding,
> > + unsigned int rotation, bool visible, unsigned int zpos,
> > + u8 id, u8 display_id)
> > +{
> > + u32 offset = dc->planes[id].offset;
> > + struct dc_hw *hw = &dc->hw;
> > +
> > + if (id == PRIMARY_PLANE_0 || id == PRIMARY_PLANE_1) {
> > + dc_set_clear(hw, DC_FRAMEBUFFER_CONFIG + offset,
> > + PRIMARY_FORMAT(update_vs_format(format)) |
> > + PRIMARY_UV_SWIZ(update_uv_swizzle(format)) |
> > + PRIMARY_SWIZ(update_swizzle(format)) |
> > + PRIMARY_TILE(DRM_FORMAT_MOD_LINEAR) |
> > + PRIMARY_YUV_COLOR(to_vs_yuv_color_space(encoding))
> |
> > + PRIMARY_ROTATION(to_vs_rotation(rotation)),
> > + PRIMARY_FORMAT_MASK |
> > + PRIMARY_UV_SWIZ_MASK |
> > + PRIMARY_SWIZ_MASK |
> > + PRIMARY_TILE_MASK |
> > + PRIMARY_YUV_COLOR_MASK |
> > + PRIMARY_ROTATION_MASK |
> > + PRIMARY_CLEAR_EN_MASK);
> > + dc_set_clear(hw, DC_FRAMEBUFFER_CONFIG_EX + offset,
> > + PRIMARY_DECODER_EN(false) |
> > + PRIMARY_EN(visible) |
> > + PRIMARY_ZPOS(zpos) |
> > + PRIMARY_CHANNEL(display_id),
> > + PRIMARY_DECODER_EN_EN_MASK |
> > + PRIMARY_EN_MASK |
> > + PRIMARY_ZPOS_MASK |
> > + PRIMARY_CHANNEL_MASK);
> > + } else {
> > + dc_set_clear(hw, DC_OVERLAY_CONFIG + offset,
> > + OVERLAY_FB_EN(visible) |
> > + OVERLAY_FORMAT(update_vs_format(format)) |
> > + OVERLAY_UV_SWIZ(update_uv_swizzle(format)) |
> > + OVERLAY_SWIZ(update_swizzle(format)) |
> > + OVERLAY_TILE(DRM_FORMAT_MOD_LINEAR) |
> > + OVERLAY_YUV_COLOR(to_vs_yuv_color_space(encoding))
> |
> > + OVERLAY_ROTATION(to_vs_rotation(rotation)),
> > + OVERLAY_DEC_EN_MASK |
> > + OVERLAY_CLEAR_EN_MASK |
> > + OVERLAY_FB_EN_MASK |
> > + OVERLAY_FORMAT_MASK |
> > + OVERLAY_UV_SWIZ_MASK |
> > + OVERLAY_SWIZ_MASK |
> > + OVERLAY_TILE_MASK |
> > + OVERLAY_YUV_COLOR_MASK |
> > + OVERLAY_ROTATION_MASK);
> > +
> > + dc_set_clear(hw, DC_OVERLAY_CONFIG_EX + offset,
> > + OVERLAY_LAYER_SEL(zpos) |
> > + OVERLAY_PANEL_SEL(display_id),
> > + OVERLAY_LAYER_SEL_MASK |
> > + OVERLAY_PANEL_SEL_MASK);
> > + }
> > +}
> > +
> > +static u32 calc_factor(u32 src, u32 dest)
>
> A comment is appreciated.
>
> > +{
> > + u32 factor = 1 << 16;
> > +
> > + if (src > 1 && dest > 1)
> > + factor = ((src - 1) << 16) / (dest - 1);
> > +
> > + return factor;
> > +}
> > +
> > +void plane_hw_update_scale(struct vs_dc *dc, struct drm_rect *src, struct
> drm_rect *dst,
> > + u8 id, u8 display_id, unsigned int rotation)
> > +{
> > + u32 offset = dc->planes[id].offset;
> > + struct dc_hw *hw = &dc->hw;
> > +
> > + int dst_w = drm_rect_width(dst);
> > + int dst_h = drm_rect_height(dst);
> > + int src_w, src_h, temp;
> > + u32 scale_factor_x;
> > + u32 scale_factor_y;
> > + bool enable_scale = false;
> > +
> > + src_w = drm_rect_width(src) >> 16;
> > + src_h = drm_rect_height(src) >> 16;
> > +
> > + if (drm_rotation_90_or_270(rotation)) {
> > + temp = src_w;
> > + src_w = src_h;
> > + src_h = temp;
> > + }
> > +
> > + if (src_w != dst_w) {
> > + scale_factor_x = calc_factor(src_w, dst_w);
> > + enable_scale = true;
> > + } else {
> > + scale_factor_x = 1 << 16;
> > + }
> > + if (src_h != dst_h) {
> > + scale_factor_y = calc_factor(src_h, dst_h);
> > + enable_scale = true;
> > + } else {
> > + scale_factor_y = 1 << 16;
> > + }
> > + if (enable_scale) {
> > + dc_write(hw, hw->reg[id].scale_factor_x + offset, scale_factor_x);
> > + dc_write(hw, hw->reg[id].scale_factor_y + offset, scale_factor_y);
> > + if (id == PRIMARY_PLANE_0 || id == PRIMARY_PLANE_1)
> > + dc_set_clear(hw, DC_FRAMEBUFFER_CONFIG + offset,
> PRIMARY_SCALE_EN, 0);
> > + else
> > + dc_set_clear(hw, DC_OVERLAY_SCALE_CONFIG + offset,
> OVERLAY_SCALE_EN, 0);
> > + } else {
> > + if (id == PRIMARY_PLANE_0 || id == PRIMARY_PLANE_1)
> > + dc_set_clear(hw, DC_FRAMEBUFFER_CONFIG + offset, 0,
> PRIMARY_SCALE_EN);
> > + else
> > + dc_set_clear(hw, DC_OVERLAY_SCALE_CONFIG + offset, 0,
> OVERLAY_SCALE_EN);
> > + }
> > +
> > + dc_write(hw, hw->reg[id].top_left + offset, X_POS(dst->x1) |
> Y_POS(dst->y1));
> > + dc_write(hw, hw->reg[id].bottom_right + offset, X_POS(dst->x2) |
> Y_POS(dst->y2));
> > +}
> > +
> > +void plane_hw_update_blend(struct vs_dc *dc, u16 alpha,
> > + u16 pixel_blend_mode, u8 id, u8 display_id)
> > +{
> > + u32 offset = dc->planes[id].offset;
> > + struct dc_hw *hw = &dc->hw;
> > +
> > + dc_write(hw, hw->reg[id].src_global_color + offset,
> PRIMARY_ALPHA_LEN(alpha >> 8));
> > + dc_write(hw, hw->reg[id].dst_global_color + offset,
> PRIMARY_ALPHA_LEN(alpha >> 8));
> > + switch (pixel_blend_mode) {
> > + case DRM_MODE_BLEND_PREMULTI:
> > + dc_write(hw, hw->reg[id].blend_config + offset, BLEND_PREMULTI);
> > + break;
> > + case DRM_MODE_BLEND_COVERAGE:
> > + dc_write(hw, hw->reg[id].blend_config + offset, BLEND_COVERAGE);
> > + break;
> > + case DRM_MODE_BLEND_PIXEL_NONE:
> > + dc_write(hw, hw->reg[id].blend_config + offset,
> BLEND_PIXEL_NONE);
> > + break;
> > + default:
> > + break;
> > + }
> > +}
> > diff --git a/drivers/gpu/drm/verisilicon/vs_dc_hw.h
> b/drivers/gpu/drm/verisilicon/vs_dc_hw.h
> > new file mode 100644
> > index 000000000000..63d8d153f57f
> > --- /dev/null
> > +++ b/drivers/gpu/drm/verisilicon/vs_dc_hw.h
> > @@ -0,0 +1,493 @@
> > +/* SPDX-License-Identifier: GPL-2.0 */
> > +/*
> > + * Copyright (C) 2023 VeriSilicon Holdings Co., Ltd.
> > + */
> > +
> > +#ifndef __VS_DC_HW_H__
> > +#define __VS_DC_HW_H__
> > +
> > +#include <linux/bitfield.h>
> > +#include <linux/bits.h>
> > +#include <drm/drm_atomic.h>
> > +
> > +#include "vs_type.h"
> > +
> > +#define UPDATE(x, h, l) FIELD_PREP(GENMASK(h, l), x)
> > +
> > +#define AQ_INTR_ACKNOWLEDGE 0x0010
> > +#define AQ_INTR_ENBL 0x0014
> > +#define DC_HW_REVISION 0x0024
> > +#define DC_HW_CHIP_CID 0x0030
> > +
> > +#define DC_REG_BASE 0x0800
> > +#define DC_REG_RANGE 0x2000
> > +#define DC_SEC_REG_OFFSET 0x100000
> > +
> > +#define DC_FRAMEBUFFER_CONFIG 0x1518
> > +# define PRIMARY_FORMAT(x) ((x) << 26)
> > +# define PRIMARY_FORMAT_MASK GENMASK(31, 26)
> > +# define PRIMARY_UV_SWIZ(x) ((x) << 25)
> > +# define PRIMARY_UV_SWIZ_MASK GENMASK(25, 25)
> > +# define PRIMARY_SWIZ(x) ((x) << 23)
> > +# define PRIMARY_SWIZ_MASK GENMASK(24, 23)
> > +# define PRIMARY_SCALE_EN BIT(12)
> > +# define PRIMARY_TILE(x) ((x) << 17)
> > +# define PRIMARY_TILE_MASK GENMASK(21, 17)
> > +# define PRIMARY_YUV_COLOR(x) ((x) << 14)
> > +# define PRIMARY_YUV_COLOR_MASK GENMASK(16, 14)
> > +# define PRIMARY_ROTATION(x) ((x) << 11)
> > +# define PRIMARY_ROTATION_MASK GENMASK(13, 11)
> > +# define PRIMARY_CLEAR_EN(x) ((x) << 8)
> > +# define PRIMARY_CLEAR_EN_MASK GENMASK(8, 8)
> > +
> > +#define DC_FRAMEBUFFER_CONFIG_EX 0x1CC0
> > +# define PRIMARY_CHANNEL(x) ((x) << 19)
> > +# define PRIMARY_CHANNEL_MASK GENMASK(19, 19)
> > +# define PRIMARY_ZPOS(x) ((x) << 16)
> > +# define PRIMARY_ZPOS_MASK GENMASK(18, 16)
> > +# define PRIMARY_EN(x) ((x) << 13)
> > +# define PRIMARY_EN_MASK GENMASK(13, 13)
> > +# define PRIMARY_SHADOW_EN BIT(12)
> > +# define PRIMARY_YUVCLAMP_EN BIT(8)
> > +# define PRIMARY_RGB2RGB_EN BIT(6)
> > +# define PRIMARY_SYNC1_EN BIT(4)
> > +# define PRIMARY_SYNC0_EN BIT(3)
> > +# define PRIMARY_DECODER_EN(x) ((x) << 1)
> > +# define PRIMARY_DECODER_EN_EN_MASK GENMASK(1, 1)
> > +
> > +#define DC_FRAMEBUFFER_SCALE_CONFIG 0x1520
> > +#define DC_FRAMEBUFFER_TOP_LEFT 0x24D8
> > +#define X_POS(x) (x)
> > +#define Y_POS(x) ((x) << 15)
> > +
> > +#define DC_FRAMEBUFFER_BOTTOM_RIGHT 0x24E0
> > +#define DC_FRAMEBUFFER_ADDRESS 0x1400
> > +#define DC_FRAMEBUFFER_U_ADDRESS 0x1530
> > +#define DC_FRAMEBUFFER_V_ADDRESS 0x1538
> > +#define DC_FRAMEBUFFER_STRIDE 0x1408
> > +#define DC_FRAMEBUFFER_U_STRIDE 0x1800
> > +#define DC_FRAMEBUFFER_V_STRIDE 0x1808
> > +#define DC_FRAMEBUFFER_SIZE 0x1810
> > +#define FB_SIZE(w, h) ((w) | ((h) << 15))
> > +
> > +#define DC_FRAMEBUFFER_SCALE_FACTOR_X 0x1828
> > +#define DC_FRAMEBUFFER_SCALE_FACTOR_Y 0x1830
> > +#define DC_FRAMEBUFFER_H_FILTER_COEF_INDEX 0x1838
> > +#define DC_FRAMEBUFFER_H_FILTER_COEF_DATA 0x1A00
> > +#define DC_FRAMEBUFFER_V_FILTER_COEF_INDEX 0x1A08
> > +#define DC_FRAMEBUFFER_V_FILTER_COEF_DATA 0x1A10
> > +#define DC_FRAMEBUFFER_INIT_OFFSET 0x1A20
> > +#define DC_FRAMEBUFFER_COLOR_KEY 0x1508
> > +#define DC_FRAMEBUFFER_COLOR_KEY_HIGH 0x1510
> > +#define DC_FRAMEBUFFER_CLEAR_VALUE 0x1A18
> > +#define DC_FRAMEBUFFER_COLOR_TABLE_INDEX 0x1818
> > +#define DC_FRAMEBUFFER_COLOR_TABLE_DATA 0x1820
> > +#define DC_FRAMEBUFFER_BG_COLOR 0x1528
> > +#define DC_FRAMEBUFFER_ROI_ORIGIN 0x1CB0
> > +#define DC_FRAMEBUFFER_ROI_SIZE 0x1CB8
> > +#define DC_FRAMEBUFFER_WATER_MARK 0x1CE8
> > +#define DC_FRAMEBUFFER_DEGAMMA_INDEX 0x1D88
> > +#define DC_FRAMEBUFFER_DEGAMMA_DATA 0x1D90
> > +#define DC_FRAMEBUFFER_DEGAMMA_EX_DATA 0x1D98
> > +#define DC_FRAMEBUFFER_YUVTORGB_COEF0 0x1DA0
> > +#define DC_FRAMEBUFFER_YUVTORGB_COEF1 0x1DA8
> > +#define DC_FRAMEBUFFER_YUVTORGB_COEF2 0x1DB0
> > +#define DC_FRAMEBUFFER_YUVTORGB_COEF3 0x1DB8
> > +#define DC_FRAMEBUFFER_YUVTORGB_COEF4 0x1E00
> > +#define DC_FRAMEBUFFER_YUVTORGB_COEFD0 0x1E08
> > +#define DC_FRAMEBUFFER_YUVTORGB_COEFD1 0x1E10
> > +#define DC_FRAMEBUFFER_YUVTORGB_COEFD2 0x1E18
> > +#define DC_FRAMEBUFFER_Y_CLAMP_BOUND 0x1E88
> > +#define DC_FRAMEBUFFER_UV_CLAMP_BOUND 0x1E90
> > +#define DC_FRAMEBUFFER_RGBTORGB_COEF0 0x1E20
> > +#define DC_FRAMEBUFFER_RGBTORGB_COEF1 0x1E28
> > +#define DC_FRAMEBUFFER_RGBTORGB_COEF2 0x1E30
> > +#define DC_FRAMEBUFFER_RGBTORGB_COEF3 0x1E38
> > +#define DC_FRAMEBUFFER_RGBTORGB_COEF4 0x1E40
> > +#define DC_FRAMEBUFFER_BLEND_CONFIG 0x2510
> > +# define BLEND_PREMULTI 0x3450
> > +# define BLEND_COVERAGE 0x3950
> > +# define BLEND_PIXEL_NONE 0x3548
> > +
> > +#define DC_FRAMEBUFFER_SRC_GLOBAL_COLOR 0x2500
> > +# define PRIMARY_ALPHA_LEN(x) ((x) << 24)
> > +
> > +#define DC_FRAMEBUFFER_DST_GLOBAL_COLOR 0x2508
> > +
> > +#define DC_OVERLAY_CONFIG 0x1540
> > +# define OVERLAY_SHADOW_EN BIT(31)
> > +# define OVERLAY_CLAMP_EN BIT(30)
> > +# define OVERLAY_RGB2RGB_EN BIT(29)
> > +# define OVERLAY_DEC_EN(x) ((x) << 27)
> > +# define OVERLAY_DEC_EN_MASK GENMASK(27, 27)
> > +# define OVERLAY_CLEAR_EN(x) ((x) << 25)
> > +# define OVERLAY_CLEAR_EN_MASK GENMASK(25, 25)
> > +# define OVERLAY_FB_EN(x) ((x) << 24)
> > +# define OVERLAY_FB_EN_MASK GENMASK(24, 24)
> > +# define OVERLAY_FORMAT(x) ((x) << 16)
> > +# define OVERLAY_FORMAT_MASK GENMASK(21, 16)
> > +# define OVERLAY_UV_SWIZ(x) ((x) << 15)
> > +# define OVERLAY_UV_SWIZ_MASK GENMASK(15, 15)
> > +# define OVERLAY_SWIZ(x) ((x) << 13)
> > +# define OVERLAY_SWIZ_MASK GENMASK(14, 13)
> > +# define OVERLAY_TILE(x) ((x) << 8)
> > +# define OVERLAY_TILE_MASK GENMASK(12, 8)
> > +# define OVERLAY_YUV_COLOR(x) ((x) << 5)
> > +# define OVERLAY_YUV_COLOR_MASK GENMASK(7, 5)
> > +# define OVERLAY_ROTATION(x) ((x) << 2)
> > +# define OVERLAY_ROTATION_MASK GENMASK(4, 2)
> > +
> > +#define DC_OVERLAY_CONFIG_EX 0x2540
> > +# define OVERLAY_LAYER_SEL(x) ((x) << 0)
> > +# define OVERLAY_LAYER_SEL_MASK GENMASK(2, 0)
> > +# define OVERLAY_PANEL_SEL(x) ((x) << 3)
> > +# define OVERLAY_PANEL_SEL_MASK GENMASK(3, 3)
> > +
> > +#define DC_OVERLAY_SCALE_CONFIG 0x1C00
> > +# define OVERLAY_SCALE_EN BIT(8)
> > +
> > +#define DC_OVERLAY_BLEND_CONFIG 0x1580
> > +#define DC_OVERLAY_TOP_LEFT 0x1640
> > +#define DC_OVERLAY_BOTTOM_RIGHT 0x1680
> > +#define DC_OVERLAY_ADDRESS 0x15C0
> > +#define DC_OVERLAY_U_ADDRESS 0x1840
> > +#define DC_OVERLAY_V_ADDRESS 0x1880
> > +#define DC_OVERLAY_STRIDE 0x1600
> > +#define DC_OVERLAY_U_STRIDE 0x18C0
> > +#define DC_OVERLAY_V_STRIDE 0x1900
> > +#define DC_OVERLAY_SIZE 0x17C0
> > +#define DC_OVERLAY_SCALE_FACTOR_X 0x1A40
> > +#define DC_OVERLAY_SCALE_FACTOR_Y 0x1A80
> > +#define DC_OVERLAY_H_FILTER_COEF_INDEX 0x1AC0
> > +#define DC_OVERLAY_H_FILTER_COEF_DATA 0x1B00
> > +#define DC_OVERLAY_V_FILTER_COEF_INDEX 0x1B40
> > +#define DC_OVERLAY_V_FILTER_COEF_DATA 0x1B80
> > +#define DC_OVERLAY_INIT_OFFSET 0x1BC0
> > +#define DC_OVERLAY_COLOR_KEY 0x1740
> > +#define DC_OVERLAY_COLOR_KEY_HIGH 0x1780
> > +#define DC_OVERLAY_CLEAR_VALUE 0x1940
> > +#define DC_OVERLAY_COLOR_TABLE_INDEX 0x1980
> > +#define DC_OVERLAY_COLOR_TABLE_DATA 0x19C0
> > +#define DC_OVERLAY_SRC_GLOBAL_COLOR 0x16C0
> > +# define OVERLAY_ALPHA_LEN(x) ((x) << 24)
> > +
> > +#define DC_OVERLAY_DST_GLOBAL_COLOR 0x1700
> > +#define DC_OVERLAY_ROI_ORIGIN 0x1D00
> > +#define DC_OVERLAY_ROI_SIZE 0x1D40
> > +#define DC_OVERLAY_WATER_MARK 0x1DC0
> > +#define DC_OVERLAY_DEGAMMA_INDEX 0x2200
> > +#define DC_OVERLAY_DEGAMMA_DATA 0x2240
> > +#define DC_OVERLAY_DEGAMMA_EX_DATA 0x2280
> > +#define DC_OVERLAY_YUVTORGB_COEF0 0x1EC0
> > +#define DC_OVERLAY_YUVTORGB_COEF1 0x1F00
> > +#define DC_OVERLAY_YUVTORGB_COEF2 0x1F40
> > +#define DC_OVERLAY_YUVTORGB_COEF3 0x1F80
> > +#define DC_OVERLAY_YUVTORGB_COEF4 0x1FC0
> > +#define DC_OVERLAY_YUVTORGB_COEFD0 0x2000
> > +#define DC_OVERLAY_YUVTORGB_COEFD1 0x2040
> > +#define DC_OVERLAY_YUVTORGB_COEFD2 0x2080
> > +#define DC_OVERLAY_Y_CLAMP_BOUND 0x22C0
> > +#define DC_OVERLAY_UV_CLAMP_BOUND 0x2300
> > +#define DC_OVERLAY_RGBTORGB_COEF0 0x20C0
> > +#define DC_OVERLAY_RGBTORGB_COEF1 0x2100
> > +#define DC_OVERLAY_RGBTORGB_COEF2 0x2140
> > +#define DC_OVERLAY_RGBTORGB_COEF3 0x2180
> > +#define DC_OVERLAY_RGBTORGB_COEF4 0x21C0
> > +
> > +#define DC_CURSOR_CONFIG 0x1468
> > +# define CURSOR_HOT_X(x) ((x) << 16)
> > +# define CURSOR_HOT_X_MASK GENMASK(23, 16)
> > +# define CURSOR_HOT_y(x) ((x) << 8)
> > +# define CURSOR_HOT_y_MASK GENMASK(15, 8)
> > +# define CURSOR_SIZE(x) ((x) << 5)
> > +# define CURSOR_SIZE_MASK GENMASK(7, 5)
> > +# define CURSOR_VALID(x) ((x) << 3)
> > +# define CURSOR_VALID_MASK GENMASK(3, 3)
> > +# define CURSOR_TRIG_FETCH(x) ((x) << 2)
> > +# define CURSOR_TRIG_FETCH_MASK GENMASK(2, 2)
> > +# define CURSOR_FORMAT(x) ((x) << 0)
> > +# define CURSOR_FORMAT_MASK GENMASK(1, 0)
> > +# define CURSOR_FORMAT_DISABLE 0
> > +# define CURSOR_FORMAT_MARK 1
> > +# define CURSOR_FORMAT_A8R8G8B8 2
> > +
> > +#define DC_CURSOR_ADDRESS 0x146C
> > +#define DC_CURSOR_LOCATION 0x1470
> > +# define X_LCOTION(x) (x)
> > +# define Y_LCOTION(x) ((x) << 16)
> > +
> > +#define DC_CURSOR_BACKGROUND 0x1474
> > +#define DC_CURSOR_FOREGROUND 0x1478
> > +#define DC_CURSOR_CLK_GATING 0x1484
> > +#define DC_CURSOR_CONFIG_EX 0x24E8
> > +#define DC_CURSOR_OFFSET 0x1080
> > +
> > +#define DC_DISPLAY_DITHER_CONFIG 0x1410
> > +#define DC_DISPLAY_PANEL_CONFIG 0x1418
> > +# define PANEL_RGB2YUV_EN BIT(16)
> > +# define PANEL_GAMMA_EN BIT(13)
> > +# define PANEL_OUTPUT_EN BIT(12)
> > +
> > +#define DC_DISPLAY_PANEL_CONFIG_EX 0x2518
> > +# define PANEL_SHADOW_EN BIT(0)
> > +
> > +#define DC_DISPLAY_DITHER_TABLE_LOW 0x1420
> > +#define DC_DISPLAY_DITHER_TABLE_HIGH 0x1428
> > +#define DC_DISPLAY_H 0x1430
> > +# define H_ACTIVE_LEN(x) (x)
> > +# define H_TOTAL_LEN(x) ((x) << 16)
> > +
> > +#define DC_DISPLAY_H_SYNC 0x1438
> > +# define H_SYNC_START_LEN(x) (x)
> > +# define H_SYNC_END_LEN(x) ((x) << 15)
> > +# define H_PLUS_LEN(x) ((x) << 30)
> > +# define H_POLARITY_LEN(x) ((x) << 31)
> > +
> > +#define DC_DISPLAY_V 0x1440
> > +# define V_ACTIVE_LEN(x) (x)
> > +# define V_TOTAL_LEN(x) ((x) << 16)
> > +
> > +#define DC_DISPLAY_V_SYNC 0x1448
> > +# define V_SYNC_START_LEN(x) (x)
> > +# define V_SYNC_END_LEN(x) ((x) << 15)
> > +# define V_PLUS_LEN(x) ((x) << 30)
> > +# define V_POLARITY_LEN(x) ((x) << 31)
> > +
> > +#define DC_DISPLAY_CURRENT_LOCATION 0x1450
> > +#define DC_DISPLAY_GAMMA_INDEX 0x1458
> > +#define DC_DISPLAY_GAMMA_DATA 0x1460
> > +#define DC_DISPLAY_INT 0x147C
> > +#define DC_DISPLAY_INT_ENABLE 0x1480
> > +#define DC_DISPLAY_DBI_CONFIG 0x1488
> > +#define DC_DISPLAY_GENERAL_CONFIG 0x14B0
> > +#define DC_DISPLAY_DPI_CONFIG 0x14B8
> > +#define DC_DISPLAY_PANEL_START 0x1CCC
> > +# define PANEL0_EN BIT(0)
> > +# define PANEL1_EN BIT(1)
> > +# define TWO_PANEL_EN BIT(2)
> > +# define SYNC_EN BIT(3)
> > +
> > +#define DC_DISPLAY_DEBUG_COUNTER_SELECT 0x14D0
> > +#define DC_DISPLAY_DEBUG_COUNTER_VALUE 0x14D8
> > +#define DC_DISPLAY_DP_CONFIG 0x1CD0
> > +# define DP_SELECT BIT(3)
> > +
> > +#define DC_DISPLAY_GAMMA_EX_INDEX 0x1CF0
> > +#define DC_DISPLAY_GAMMA_EX_DATA 0x1CF8
> > +#define DC_DISPLAY_GAMMA_EX_ONE_DATA 0x1D80
> > +#define DC_DISPLAY_RGBTOYUV_COEF0 0x1E48
> > +#define DC_DISPLAY_RGBTOYUV_COEF1 0x1E50
> > +#define DC_DISPLAY_RGBTOYUV_COEF2 0x1E58
> > +#define DC_DISPLAY_RGBTOYUV_COEF3 0x1E60
> > +#define DC_DISPLAY_RGBTOYUV_COEF4 0x1E68
> > +#define DC_DISPLAY_RGBTOYUV_COEFD0 0x1E70
> > +#define DC_DISPLAY_RGBTOYUV_COEFD1 0x1E78
> > +#define DC_DISPLAY_RGBTOYUV_COEFD2 0x1E80
> > +
> > +#define DC_CLK_GATTING 0x1A28
> > +#define DC_QOS_CONFIG 0x1A38
> > +
> > +#define DC_TRANSPARENCY_OPAQUE 0x00
> > +#define DC_TRANSPARENCY_KEY 0x02
> > +#define DC_DISPLAY_DITHERTABLE_LOW 0x7B48F3C0
> > +#define DC_DISPLAY_DITHERTABLE_HIGH 0x596AD1E2
> > +
> > +#define DC_TILE_MODE4X4 0x15
> > +
> > +#define GAMMA_SIZE 256
> > +#define GAMMA_EX_SIZE 300
> > +#define DEGAMMA_SIZE 260
> > +
> > +#define RGB_TO_RGB_TABLE_SIZE 9
> > +#define YUV_TO_RGB_TABLE_SIZE 16
> > +#define RGB_TO_YUV_TABLE_SIZE 12
> > +
> > +#define DC_LAYER_NUM 6
> > +#define DC_DISPLAY_NUM 2
> > +#define DC_CURSOR_NUM 2
> > +
> > +enum dc_hw_plane_id {
> > + PRIMARY_PLANE_0,
> > + OVERLAY_PLANE_0,
> > + OVERLAY_PLANE_1,
> > + PRIMARY_PLANE_1,
> > + OVERLAY_PLANE_2,
> > + OVERLAY_PLANE_3,
> > + CURSOR_PLANE_0,
> > + CURSOR_PLANE_1,
> > + PLANE_NUM
> > +};
> > +
> > +enum dc_hw_color_format {
> > + FORMAT_X4R4G4B4,
> > + FORMAT_A4R4G4B4,
> > + FORMAT_X1R5G5B5,
> > + FORMAT_A1R5G5B5,
> > + FORMAT_R5G6B5,
> > + FORMAT_X8R8G8B8,
> > + FORMAT_A8R8G8B8,
> > + FORMAT_YUY2,
> > + FORMAT_UYVY,
> > + FORMAT_INDEX8,
> > + FORMAT_MONOCHROME,
> > + FORMAT_YV12 = 0xf,
> > + FORMAT_A8,
> > + FORMAT_NV12,
> > + FORMAT_NV16,
> > + FORMAT_RG16,
> > + FORMAT_R8,
> > + FORMAT_NV12_10BIT,
> > + FORMAT_A2R10G10B10,
> > + FORMAT_NV16_10BIT,
> > + FORMAT_INDEX1,
> > + FORMAT_INDEX2,
> > + FORMAT_INDEX4,
> > + FORMAT_P010,
> > + FORMAT_YUV444,
> > + FORMAT_YUV444_10BIT,
> > +};
> > +
> > +enum dc_hw_yuv_color_space {
> > + COLOR_SPACE_601 = 0,
> > + COLOR_SPACE_709 = 1,
> > + COLOR_SPACE_2020 = 3,
> > +};
> > +
> > +enum dc_hw_rotation {
> > + ROT_0 = 0,
> > + ROT_90 = 4,
> > + ROT_180 = 5,
> > + ROT_270 = 6,
> > + FLIP_X = 1,
> > + FLIP_Y = 2,
> > + FLIP_XY = 3,
> > +};
> > +
> > +enum dc_hw_swizzle {
> > + SWIZZLE_ARGB = 0,
> > + SWIZZLE_RGBA,
> > + SWIZZLE_ABGR,
> > + SWIZZLE_BGRA,
> > +};
> > +
> > +enum dc_hw_out {
> > + OUT_DPI,
> > + OUT_DP,
> > +};
> > +
> > +enum dc_hw_cursor_size {
> > + CURSOR_SIZE_32X32 = 0,
> > + CURSOR_SIZE_64X64,
> > +};
> > +
> > +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;
> > +};
> > +
> > +struct dc_hw_gamma {
> > + u16 gamma[GAMMA_EX_SIZE][3];
> > +};
> > +
> > +struct dc_hw_read {
>
> Not used, please drop.
Will delete it
>
> > + u32 reg;
> > + u32 value;
> > +};
> > +
> > +struct dc_hw {
> > + enum dc_hw_out out[DC_DISPLAY_NUM];
> > + void *hi_base;
> > + void *reg_base;
> > + struct dc_hw_plane_reg reg[DC_LAYER_NUM];
> > +
> > + struct dc_hw_gamma gamma[DC_DISPLAY_NUM];
> > + struct vs_dc_info *info;
> > +};
> > +
> > +struct vs_dc_plane {
> > + enum dc_hw_plane_id id;
> > + u32 offset;
> > +};
> > +
> > +struct vs_dc {
> > + struct vs_crtc *crtc[DC_DISPLAY_NUM];
>
> Not defined here. Please drop and add when it is actually defined.
>
> > + struct dc_hw hw;
> > +
> > + struct vs_dc_plane planes[PLANE_NUM];
> > +};
> > +
> > +int dc_hw_init(struct vs_dc *dc);
> > +void dc_hw_disable_plane(struct vs_dc *dc, u8 id);
> > +void dc_hw_update_cursor(struct dc_hw *hw, u8 id, dma_addr_t dma_addr,
> > + u32 crtc_w, u32 crtc_x, u32 crtc_y,
> > + s32 hotspot_x, int32_t hotspot_y);
> > +void dc_hw_disable_cursor(struct dc_hw *hw, u8 id);
> > +void dc_hw_update_gamma(struct dc_hw *hw, u8 id, u16 index,
> > + u16 r, u16 g, u16 b);
> > +void dc_hw_enable_gamma(struct dc_hw *hw, u8 id, bool enable);
> > +void dc_hw_enable(struct dc_hw *hw, int id, struct drm_display_mode
> *mode,
> > + u8 encoder_type, u32 output_fmt);
> > +void dc_hw_disable(struct dc_hw *hw, int id);
> > +void dc_hw_enable_interrupt(struct dc_hw *hw);
> > +void dc_hw_disable_interrupt(struct dc_hw *hw);
> > +u32 dc_hw_get_interrupt(struct dc_hw *hw);
> > +void dc_hw_enable_shadow_register(struct vs_dc *dc, bool enable);
> > +void dc_hw_set_out(struct dc_hw *hw, enum dc_hw_out out, u8 id);
> > +void dc_hw_commit(struct dc_hw *hw);
> > +void plane_hw_update_format_colorspace(struct vs_dc *dc, u32 format,
> > + enum drm_color_encoding encoding, u8 id, bool
> is_yuv);
> > +void plane_hw_update_address(struct vs_dc *dc, u8 id, u32 format,
> dma_addr_t *dma_addr,
> > + struct drm_framebuffer *drm_fb, struct drm_rect *src);
> > +void plane_hw_update_format(struct vs_dc *dc, u32 format, enum
> drm_color_encoding encoding,
> > + unsigned int rotation, bool visible, unsigned int zpos,
> > + u8 id, u8 display_id);
> > +void plane_hw_update_scale(struct vs_dc *dc, struct drm_rect *src, struct
> drm_rect *dst,
> > + u8 id, u8 display_id, unsigned int rotation);
> > +void plane_hw_update_blend(struct vs_dc *dc, u16 alpha, u16
> pixel_blend_mode,
> > + u8 id, u8 display_id);
>
> Could you please settle on a single prefix for all your function names?
> Ideally it should be close to the driver name. It's hard to understand
> that the function comes from the verisilicon driver if its name starts
> from dc_ or especially with plane_.
Yes starting with plane_ is not a good idea ,i will add vs_
_ , thanks
>
> I'd strongly suggest to stop defining anything outside of the selected
I don't quite understand what "the selected" means,
I hope you can fill in some specific details about it
Thanks
> vs_ namespace.
>
> > +
> > +#endif /* __VS_DC_HW_H__ */
> > diff --git a/drivers/gpu/drm/verisilicon/vs_type.h
> b/drivers/gpu/drm/verisilicon/vs_type.h
> > new file mode 100644
> > index 000000000000..30ccc2eda48b
> > --- /dev/null
> > +++ b/drivers/gpu/drm/verisilicon/vs_type.h
> > @@ -0,0 +1,84 @@
> > +/* SPDX-License-Identifier: GPL-2.0 */
> > +/*
> > + * Copyright (C) 2023 VeriSilicon Holdings Co., Ltd.
> > + */
> > +
> > +#ifndef __VS_TYPE_H__
> > +#define __VS_TYPE_H__
> > +
> > +#include <drm/drm_plane.h>
>
> These types are largely unused within this patch. Please drop all the
> unused parts and add them later, when required.
Yes some types could be added in later patches
Thank you for your correction.
>
> > +
> > +struct vs_plane_primary_info {
> > + u8 id;
> > + unsigned int num_formats;
> > + const u32 *formats;
> > + u8 num_modifiers;
> > + const u64 *modifiers;
> > + unsigned int min_width;
> > + unsigned int min_height;
> > + unsigned int max_width;
> > + unsigned int max_height;
> > + unsigned int rotation;
> > + unsigned int color_encoding;
> > +
> > + int min_scale; /* 16.16 fixed point */
> > + int max_scale; /* 16.16 fixed point */
> > +
> > + u8 zpos;
> > +
> > +};
> > +
> > +struct vs_plane_overlay_info {
> > + u8 id;
> > + unsigned int num_formats;
> > + const u32 *formats;
> > + u8 num_modifiers;
> > + const u64 *modifiers;
> > + unsigned int min_width;
> > + unsigned int min_height;
> > + unsigned int max_width;
> > + unsigned int max_height;
> > + unsigned int rotation;
> > + unsigned int color_encoding;
> > +
> > + int min_scale; /* 16.16 fixed point */
> > + int max_scale; /* 16.16 fixed point */
> > +
> > + u8 zpos;
> > +
> > +};
> > +
> > +struct vs_plane_cursor_info {
> > + u8 id;
> > + unsigned int num_formats;
> > + const u32 *formats;
> > + unsigned int min_width;
> > + unsigned int min_height;
> > + unsigned int max_width;
> > + unsigned int max_height;
> > + u8 zpos;
> > +
> > +};
> > +
> > +struct vs_dc_info {
> > + const char *name;
> > +
> > + u8 panel_num;
> > +
> > + /* planes */
> > + u8 layer_num;
> > + u8 primary_num;
> > + u8 overlay_num;
> > + u8 cursor_num;
> > + const struct vs_plane_primary_info *primary;
> > + const struct vs_plane_overlay_info *overlay;
> > + const struct vs_plane_cursor_info *cursor;
> > +
> > + /* 0 means no gamma LUT */
> > + u16 gamma_size;
> > + u8 gamma_bits;
> > +
> > + u16 pitch_alignment;
> > +};
> > +
> > +#endif /* __VS_TYPE_H__ */
> > --
> > 2.27.0
> >
>
> --
> With best wishes
> Dmitry
More information about the linux-arm-kernel
mailing list