Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'mediatek-drm-next-6.3' of https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux into drm-next

Mediatek DRM Next for Linux 6.3

1. Reduce the time of dsi from LP11 to sending cmd
2. Remove dependency on GEM DMA helper
3. Drop unbalanced obj unref
4. Fix the fallback for mediatek,mt8186-disp-ccorr
5. Fixup for error path.

Signed-off-by: Dave Airlie <airlied@redhat.com>

From: Chun-Kuang Hu <chunkuang.hu@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20230130125811.2567-1-chunkuang.hu@kernel.org

+71 -9
+1
Documentation/devicetree/bindings/display/mediatek/mediatek,aal.yaml
··· 31 31 - items: 32 32 - enum: 33 33 - mediatek,mt8186-disp-aal 34 + - mediatek,mt8188-disp-aal 34 35 - mediatek,mt8192-disp-aal 35 36 - mediatek,mt8195-disp-aal 36 37 - const: mediatek,mt8183-disp-aal
+2 -1
Documentation/devicetree/bindings/display/mediatek/mediatek,ccorr.yaml
··· 27 27 - const: mediatek,mt8192-disp-ccorr 28 28 - items: 29 29 - enum: 30 + - mediatek,mt8188-disp-ccorr 30 31 - mediatek,mt8195-disp-ccorr 31 32 - const: mediatek,mt8192-disp-ccorr 32 33 - items: 33 34 - enum: 34 35 - mediatek,mt8186-disp-ccorr 35 - - const: mediatek,mt8183-disp-ccorr 36 + - const: mediatek,mt8192-disp-ccorr 36 37 37 38 reg: 38 39 maxItems: 1
+1
Documentation/devicetree/bindings/display/mediatek/mediatek,color.yaml
··· 37 37 - enum: 38 38 - mediatek,mt8183-disp-color 39 39 - mediatek,mt8186-disp-color 40 + - mediatek,mt8188-disp-color 40 41 - mediatek,mt8192-disp-color 41 42 - mediatek,mt8195-disp-color 42 43 - const: mediatek,mt8173-disp-color
+1
Documentation/devicetree/bindings/display/mediatek/mediatek,dither.yaml
··· 27 27 - items: 28 28 - enum: 29 29 - mediatek,mt8186-disp-dither 30 + - mediatek,mt8188-disp-dither 30 31 - mediatek,mt8192-disp-dither 31 32 - mediatek,mt8195-disp-dither 32 33 - const: mediatek,mt8183-disp-dither
+1
Documentation/devicetree/bindings/display/mediatek/mediatek,gamma.yaml
··· 28 28 - items: 29 29 - enum: 30 30 - mediatek,mt8186-disp-gamma 31 + - mediatek,mt8188-disp-gamma 31 32 - mediatek,mt8192-disp-gamma 32 33 - mediatek,mt8195-disp-gamma 33 34 - const: mediatek,mt8183-disp-gamma
+1
Documentation/devicetree/bindings/display/mediatek/mediatek,ovl.yaml
··· 36 36 - const: mediatek,mt2701-disp-ovl 37 37 - items: 38 38 - enum: 39 + - mediatek,mt8188-disp-ovl 39 40 - mediatek,mt8195-disp-ovl 40 41 - const: mediatek,mt8183-disp-ovl 41 42 - items:
+1
Documentation/devicetree/bindings/display/mediatek/mediatek,postmask.yaml
··· 26 26 - items: 27 27 - enum: 28 28 - mediatek,mt8186-disp-postmask 29 + - mediatek,mt8188-disp-postmask 29 30 - const: mediatek,mt8192-disp-postmask 30 31 31 32 reg:
+4
Documentation/devicetree/bindings/display/mediatek/mediatek,rdma.yaml
··· 33 33 - const: mediatek,mt8195-disp-rdma 34 34 - items: 35 35 - enum: 36 + - mediatek,mt8188-disp-rdma 37 + - const: mediatek,mt8195-disp-rdma 38 + - items: 39 + - enum: 36 40 - mediatek,mt7623-disp-rdma 37 41 - mediatek,mt2712-disp-rdma 38 42 - const: mediatek,mt2701-disp-rdma
-1
drivers/gpu/drm/mediatek/Kconfig
··· 7 7 depends on HAVE_ARM_SMCCC 8 8 depends on OF 9 9 depends on MTK_MMSYS 10 - select DRM_GEM_DMA_HELPER 11 10 select DRM_KMS_HELPER 12 11 select DRM_MIPI_DSI 13 12 select DRM_PANEL
+2
drivers/gpu/drm/mediatek/mtk_cec.c
··· 12 12 #include <linux/platform_device.h> 13 13 14 14 #include "mtk_cec.h" 15 + #include "mtk_hdmi.h" 16 + #include "mtk_drm_drv.h" 15 17 16 18 #define TR_CONFIG 0x00 17 19 #define CLEAR_CEC_IRQ BIT(15)
+1
drivers/gpu/drm/mediatek/mtk_disp_aal.c
··· 14 14 #include "mtk_disp_drv.h" 15 15 #include "mtk_drm_crtc.h" 16 16 #include "mtk_drm_ddp_comp.h" 17 + #include "mtk_drm_drv.h" 17 18 18 19 #define DISP_AAL_EN 0x0000 19 20 #define AAL_EN BIT(0)
+1
drivers/gpu/drm/mediatek/mtk_disp_ccorr.c
··· 14 14 #include "mtk_disp_drv.h" 15 15 #include "mtk_drm_crtc.h" 16 16 #include "mtk_drm_ddp_comp.h" 17 + #include "mtk_drm_drv.h" 17 18 18 19 #define DISP_CCORR_EN 0x0000 19 20 #define CCORR_EN BIT(0)
+1
drivers/gpu/drm/mediatek/mtk_disp_color.c
··· 14 14 #include "mtk_disp_drv.h" 15 15 #include "mtk_drm_crtc.h" 16 16 #include "mtk_drm_ddp_comp.h" 17 + #include "mtk_drm_drv.h" 17 18 18 19 #define DISP_COLOR_CFG_MAIN 0x0400 19 20 #define DISP_COLOR_START_MT2701 0x0f00
+1
drivers/gpu/drm/mediatek/mtk_disp_gamma.c
··· 14 14 #include "mtk_disp_drv.h" 15 15 #include "mtk_drm_crtc.h" 16 16 #include "mtk_drm_ddp_comp.h" 17 + #include "mtk_drm_drv.h" 17 18 18 19 #define DISP_GAMMA_EN 0x0000 19 20 #define GAMMA_EN BIT(0)
+1
drivers/gpu/drm/mediatek/mtk_disp_ovl.c
··· 19 19 #include "mtk_disp_drv.h" 20 20 #include "mtk_drm_crtc.h" 21 21 #include "mtk_drm_ddp_comp.h" 22 + #include "mtk_drm_drv.h" 22 23 23 24 #define DISP_REG_OVL_INTEN 0x0004 24 25 #define OVL_FME_CPL_INT BIT(1)
+1
drivers/gpu/drm/mediatek/mtk_disp_rdma.c
··· 17 17 #include "mtk_disp_drv.h" 18 18 #include "mtk_drm_crtc.h" 19 19 #include "mtk_drm_ddp_comp.h" 20 + #include "mtk_drm_drv.h" 20 21 21 22 #define DISP_REG_RDMA_INT_ENABLE 0x0000 22 23 #define DISP_REG_RDMA_INT_STATUS 0x0004
+1 -1
drivers/gpu/drm/mediatek/mtk_dp.c
··· 1693 1693 break; 1694 1694 default: 1695 1695 return -EINVAL; 1696 - }; 1696 + } 1697 1697 continue; 1698 1698 } 1699 1699
+32
drivers/gpu/drm/mediatek/mtk_dpi.c
··· 14 14 #include <linux/of_graph.h> 15 15 #include <linux/pinctrl/consumer.h> 16 16 #include <linux/platform_device.h> 17 + #include <linux/soc/mediatek/mtk-mmsys.h> 17 18 #include <linux/types.h> 18 19 19 20 #include <video/videomode.h> ··· 30 29 #include "mtk_disp_drv.h" 31 30 #include "mtk_dpi_regs.h" 32 31 #include "mtk_drm_ddp_comp.h" 32 + #include "mtk_drm_drv.h" 33 33 34 34 enum mtk_dpi_out_bit_num { 35 35 MTK_DPI_OUT_BIT_NUM_8BITS, ··· 68 66 struct drm_connector *connector; 69 67 void __iomem *regs; 70 68 struct device *dev; 69 + struct device *mmsys_dev; 71 70 struct clk *engine_clk; 72 71 struct clk *pixel_clk; 73 72 struct clk *tvd_clk; ··· 137 134 * @yuv422_en_bit: Enable bit of yuv422. 138 135 * @csc_enable_bit: Enable bit of CSC. 139 136 * @pixels_per_iter: Quantity of transferred pixels per iteration. 137 + * @edge_cfg_in_mmsys: If the edge configuration for DPI's output needs to be set in MMSYS. 140 138 */ 141 139 struct mtk_dpi_conf { 142 140 unsigned int (*cal_factor)(int clock); ··· 156 152 u32 yuv422_en_bit; 157 153 u32 csc_enable_bit; 158 154 u32 pixels_per_iter; 155 + bool edge_cfg_in_mmsys; 159 156 }; 160 157 161 158 static void mtk_dpi_mask(struct mtk_dpi *dpi, u32 offset, u32 val, u32 mask) ··· 453 448 mtk_dpi_mask(dpi, DPI_OUTPUT_SETTING, 454 449 dpi->output_fmt == MEDIA_BUS_FMT_RGB888_2X12_LE ? 455 450 EDGE_SEL : 0, EDGE_SEL); 451 + if (dpi->conf->edge_cfg_in_mmsys) 452 + mtk_mmsys_ddp_dpi_fmt_config(dpi->mmsys_dev, MTK_DPI_RGB888_DDR_CON); 456 453 } else { 457 454 mtk_dpi_mask(dpi, DPI_DDR_SETTING, DDR_EN | DDR_4PHASE, 0); 455 + if (dpi->conf->edge_cfg_in_mmsys) 456 + mtk_mmsys_ddp_dpi_fmt_config(dpi->mmsys_dev, MTK_DPI_RGB888_SDR_CON); 458 457 } 459 458 } 460 459 ··· 786 777 { 787 778 struct mtk_dpi *dpi = dev_get_drvdata(dev); 788 779 struct drm_device *drm_dev = data; 780 + struct mtk_drm_private *priv = drm_dev->dev_private; 789 781 int ret; 790 782 783 + dpi->mmsys_dev = priv->mmsys_dev; 791 784 ret = drm_simple_encoder_init(drm_dev, &dpi->encoder, 792 785 DRM_MODE_ENCODER_TMDS); 793 786 if (ret) { ··· 929 918 .max_clock_khz = 100000, 930 919 .output_fmts = mt8183_output_fmts, 931 920 .num_output_fmts = ARRAY_SIZE(mt8183_output_fmts), 921 + .pixels_per_iter = 1, 922 + .is_ck_de_pol = true, 923 + .swap_input_support = true, 924 + .support_direct_pin = true, 925 + .dimension_mask = HPW_MASK, 926 + .hvsize_mask = HSIZE_MASK, 927 + .channel_swap_shift = CH_SWAP, 928 + .yuv422_en_bit = YUV422_EN, 929 + .csc_enable_bit = CSC_ENABLE, 930 + }; 931 + 932 + static const struct mtk_dpi_conf mt8186_conf = { 933 + .cal_factor = mt8183_calculate_factor, 934 + .reg_h_fre_con = 0xe0, 935 + .max_clock_khz = 150000, 936 + .output_fmts = mt8183_output_fmts, 937 + .num_output_fmts = ARRAY_SIZE(mt8183_output_fmts), 938 + .edge_cfg_in_mmsys = true, 932 939 .pixels_per_iter = 1, 933 940 .is_ck_de_pol = true, 934 941 .swap_input_support = true, ··· 1121 1092 }, 1122 1093 { .compatible = "mediatek,mt8183-dpi", 1123 1094 .data = &mt8183_conf, 1095 + }, 1096 + { .compatible = "mediatek,mt8186-dpi", 1097 + .data = &mt8186_conf, 1124 1098 }, 1125 1099 { .compatible = "mediatek,mt8188-dp-intf", 1126 1100 .data = &mt8188_dpintf_conf,
+2
drivers/gpu/drm/mediatek/mtk_drm_crtc.c
··· 945 945 946 946 mtk_crtc->planes = devm_kcalloc(dev, num_comp_planes, 947 947 sizeof(struct drm_plane), GFP_KERNEL); 948 + if (!mtk_crtc->planes) 949 + return -ENOMEM; 948 950 949 951 for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) { 950 952 ret = mtk_drm_crtc_init_comp_planes(drm_dev, mtk_crtc, i,
+4 -1
drivers/gpu/drm/mediatek/mtk_drm_drv.c
··· 20 20 #include <drm/drm_fbdev_generic.h> 21 21 #include <drm/drm_fourcc.h> 22 22 #include <drm/drm_gem.h> 23 - #include <drm/drm_gem_dma_helper.h> 24 23 #include <drm/drm_gem_framebuffer_helper.h> 24 + #include <drm/drm_ioctl.h> 25 25 #include <drm/drm_of.h> 26 26 #include <drm/drm_probe_helper.h> 27 27 #include <drm/drm_vblank.h> ··· 520 520 err_deinit: 521 521 mtk_drm_kms_deinit(drm); 522 522 err_free: 523 + private->drm = NULL; 523 524 drm_dev_put(drm); 524 525 return ret; 525 526 } ··· 637 636 { .compatible = "mediatek,mt8173-dpi", 638 637 .data = (void *)MTK_DPI }, 639 638 { .compatible = "mediatek,mt8183-dpi", 639 + .data = (void *)MTK_DPI }, 640 + { .compatible = "mediatek,mt8186-dpi", 640 641 .data = (void *)MTK_DPI }, 641 642 { .compatible = "mediatek,mt8188-dp-intf", 642 643 .data = (void *)MTK_DP_INTF },
+7 -4
drivers/gpu/drm/mediatek/mtk_drm_gem.c
··· 16 16 17 17 static int mtk_drm_gem_object_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma); 18 18 19 + static const struct vm_operations_struct vm_ops = { 20 + .open = drm_gem_vm_open, 21 + .close = drm_gem_vm_close, 22 + }; 23 + 19 24 static const struct drm_gem_object_funcs mtk_drm_gem_object_funcs = { 20 25 .free = mtk_drm_gem_free_object, 21 26 .get_sg_table = mtk_gem_prime_get_sg_table, 22 27 .vmap = mtk_drm_gem_prime_vmap, 23 28 .vunmap = mtk_drm_gem_prime_vunmap, 24 29 .mmap = mtk_drm_gem_object_mmap, 25 - .vm_ops = &drm_gem_dma_vm_ops, 30 + .vm_ops = &vm_ops, 26 31 }; 27 32 28 33 static struct mtk_drm_gem_obj *mtk_drm_gem_init(struct drm_device *dev, ··· 169 164 170 165 ret = dma_mmap_attrs(priv->dma_dev, vma, mtk_gem->cookie, 171 166 mtk_gem->dma_addr, obj->size, mtk_gem->dma_attrs); 172 - if (ret) 173 - drm_gem_vm_close(vma); 174 167 175 168 return ret; 176 169 } ··· 265 262 return; 266 263 267 264 vunmap(vaddr); 268 - mtk_gem->kvaddr = 0; 265 + mtk_gem->kvaddr = NULL; 269 266 kfree(mtk_gem->pages); 270 267 }
+2 -1
drivers/gpu/drm/mediatek/mtk_dsi.c
··· 28 28 29 29 #include "mtk_disp_drv.h" 30 30 #include "mtk_drm_ddp_comp.h" 31 + #include "mtk_drm_drv.h" 31 32 32 33 #define DSI_START 0x00 33 34 ··· 722 721 mtk_dsi_clk_ulp_mode_leave(dsi); 723 722 mtk_dsi_lane0_ulp_mode_leave(dsi); 724 723 mtk_dsi_clk_hs_mode(dsi, 0); 725 - msleep(20); 724 + usleep_range(1000, 3000); 726 725 /* The reaction time after pulling up the mipi signal for dsi_rx */ 727 726 } 728 727 }
+3
drivers/gpu/drm/mediatek/mtk_hdmi_ddc.c
··· 19 19 #include <linux/of_irq.h> 20 20 #include <linux/of_platform.h> 21 21 22 + #include "mtk_drm_drv.h" 23 + #include "mtk_hdmi.h" 24 + 22 25 #define SIF1_CLOK (288) 23 26 #define DDC_DDCMCTL0 (0x0) 24 27 #define DDCM_ODRAIN BIT(31)