Merge v5.3-rc1 into drm-misc-next
authorMaxime Ripard <maxime.ripard@bootlin.com>
Mon, 22 Jul 2019 19:24:10 +0000 (21:24 +0200)
committerMaxime Ripard <maxime.ripard@bootlin.com>
Mon, 22 Jul 2019 19:24:10 +0000 (21:24 +0200)
Noralf needs some SPI patches in 5.3 to merge some work on tinydrm.

Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com>
416 files changed:
Documentation/devicetree/bindings/display/panel/ampire,am-480272h3tmqw-t01h.txt [deleted file]
Documentation/devicetree/bindings/display/panel/ampire,am-480272h3tmqw-t01h.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/arm,versatile-tft-panel.txt
Documentation/devicetree/bindings/display/panel/armadeus,st0700-adapt.txt [deleted file]
Documentation/devicetree/bindings/display/panel/armadeus,st0700-adapt.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/bananapi,s070wv20-ct16.txt [deleted file]
Documentation/devicetree/bindings/display/panel/bananapi,s070wv20-ct16.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/boe,himax8279d.txt [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/dlc,dlc0700yzg-1.txt [deleted file]
Documentation/devicetree/bindings/display/panel/dlc,dlc0700yzg-1.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/edt,et-series.txt
Documentation/devicetree/bindings/display/panel/giantplus,gpm940b0.txt [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/innolux,ee101ia-01d.txt [deleted file]
Documentation/devicetree/bindings/display/panel/innolux,ee101ia-01d.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/kingdisplay,kd035g6-54nt.txt [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/lvds.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/mitsubishi,aa104xd12.txt [deleted file]
Documentation/devicetree/bindings/display/panel/mitsubishi,aa104xd12.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/mitsubishi,aa121td01.txt [deleted file]
Documentation/devicetree/bindings/display/panel/mitsubishi,aa121td01.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/ortustech,com37h3m05dtc.txt [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/ortustech,com37h3m99dtc.txt [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/panel-common.txt [deleted file]
Documentation/devicetree/bindings/display/panel/panel-common.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/panel-lvds.txt [deleted file]
Documentation/devicetree/bindings/display/panel/panel.txt [deleted file]
Documentation/devicetree/bindings/display/panel/pda,91-00156-a0.txt [deleted file]
Documentation/devicetree/bindings/display/panel/pda,91-00156-a0.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/raspberrypi,7inch-touchscreen.txt [deleted file]
Documentation/devicetree/bindings/display/panel/raspberrypi,7inch-touchscreen.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/raydium,rm67191.txt [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.txt
Documentation/devicetree/bindings/display/panel/sgd,gktw70sdae4se.txt [deleted file]
Documentation/devicetree/bindings/display/panel/sgd,gktw70sdae4se.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/sharp,lq070y3dg3b.txt [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/sharp,ls020b1dd01d.txt [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/simple-panel.txt
Documentation/devicetree/bindings/display/panel/tfc,s9700rtwv43tr-01b.txt [deleted file]
Documentation/devicetree/bindings/display/panel/tfc,s9700rtwv43tr-01b.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/tpo,tpg110.txt [deleted file]
Documentation/devicetree/bindings/display/panel/tpo,tpg110.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/display/rockchip/rockchip-lvds.txt
Documentation/gpu/drm-mm.rst
Documentation/gpu/introduction.rst
Documentation/gpu/todo.rst
Documentation/media/uapi/v4l/subdev-formats.rst
MAINTAINERS
drivers/dma-buf/reservation.c
drivers/gpu/drm/Kconfig
drivers/gpu/drm/Makefile
drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.h
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
drivers/gpu/drm/arc/arcpgu_drv.c
drivers/gpu/drm/arm/display/komeda/komeda_kms.c
drivers/gpu/drm/arm/hdlcd_drv.c
drivers/gpu/drm/arm/malidp_drv.c
drivers/gpu/drm/armada/armada_drv.c
drivers/gpu/drm/armada/armada_gem.c
drivers/gpu/drm/armada/armada_gem.h
drivers/gpu/drm/aspeed/aspeed_gfx_drv.c
drivers/gpu/drm/ast/Makefile
drivers/gpu/drm/ast/ast_dp501.c
drivers/gpu/drm/ast/ast_drv.c
drivers/gpu/drm/ast/ast_drv.h
drivers/gpu/drm/ast/ast_fb.c [deleted file]
drivers/gpu/drm/ast/ast_main.c
drivers/gpu/drm/ast/ast_mode.c
drivers/gpu/drm/ast/ast_post.c
drivers/gpu/drm/ast/ast_ttm.c
drivers/gpu/drm/ati_pcigart.c
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
drivers/gpu/drm/bochs/bochs.h
drivers/gpu/drm/bochs/bochs_drv.c
drivers/gpu/drm/bochs/bochs_hw.c
drivers/gpu/drm/bochs/bochs_kms.c
drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
drivers/gpu/drm/bridge/sii902x.c
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
drivers/gpu/drm/bridge/tc358767.c
drivers/gpu/drm/bridge/ti-sn65dsi86.c
drivers/gpu/drm/cirrus/cirrus.c
drivers/gpu/drm/drm_agpsupport.c
drivers/gpu/drm/drm_client.c
drivers/gpu/drm/drm_connector.c
drivers/gpu/drm/drm_dma.c
drivers/gpu/drm/drm_dp_helper.c
drivers/gpu/drm/drm_drv.c
drivers/gpu/drm/drm_fb_helper.c
drivers/gpu/drm/drm_file.c
drivers/gpu/drm/drm_gem.c
drivers/gpu/drm/drm_gem_framebuffer_helper.c
drivers/gpu/drm/drm_gem_shmem_helper.c
drivers/gpu/drm/drm_gem_vram_helper.c
drivers/gpu/drm/drm_ioc32.c
drivers/gpu/drm/drm_ioctl.c
drivers/gpu/drm/drm_legacy_misc.c
drivers/gpu/drm/drm_lock.c
drivers/gpu/drm/drm_memory.c
drivers/gpu/drm/drm_mm.c
drivers/gpu/drm/drm_mode_object.c
drivers/gpu/drm/drm_modes.c
drivers/gpu/drm/drm_prime.c
drivers/gpu/drm/drm_scatter.c
drivers/gpu/drm/drm_syncobj.c
drivers/gpu/drm/drm_vm.c
drivers/gpu/drm/etnaviv/etnaviv_drv.c
drivers/gpu/drm/etnaviv/etnaviv_gem.c
drivers/gpu/drm/etnaviv/etnaviv_gem.h
drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
drivers/gpu/drm/exynos/exynos_drm_drv.c
drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c
drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_kms.c
drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_plane.c
drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c
drivers/gpu/drm/gm12u320/Kconfig [new file with mode: 0644]
drivers/gpu/drm/gm12u320/Makefile [new file with mode: 0644]
drivers/gpu/drm/gm12u320/gm12u320.c [new file with mode: 0644]
drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c
drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c
drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c
drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
drivers/gpu/drm/i2c/ch7006_priv.h
drivers/gpu/drm/i2c/sil164_drv.c
drivers/gpu/drm/i810/i810_dma.c
drivers/gpu/drm/i810/i810_drv.c
drivers/gpu/drm/i810/i810_drv.h
drivers/gpu/drm/i915/gvt/dmabuf.c
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem_dmabuf.c [new file with mode: 0644]
drivers/gpu/drm/i915/selftests/i915_gem_dmabuf.c [new file with mode: 0644]
drivers/gpu/drm/imx/dw_hdmi-imx.c
drivers/gpu/drm/imx/imx-drm-core.c
drivers/gpu/drm/imx/imx-ldb.c
drivers/gpu/drm/imx/imx-tve.c
drivers/gpu/drm/imx/ipuv3-crtc.c
drivers/gpu/drm/imx/ipuv3-plane.c
drivers/gpu/drm/imx/parallel-display.c
drivers/gpu/drm/ingenic/ingenic-drm.c
drivers/gpu/drm/lima/lima_device.c
drivers/gpu/drm/lima/lima_drv.c
drivers/gpu/drm/lima/lima_gem.c
drivers/gpu/drm/lima/lima_gem_prime.c
drivers/gpu/drm/lima/lima_object.c
drivers/gpu/drm/lima/lima_object.h
drivers/gpu/drm/lima/lima_vm.h
drivers/gpu/drm/mcde/mcde_drv.c
drivers/gpu/drm/mediatek/mtk_disp_color.c
drivers/gpu/drm/mediatek/mtk_disp_ovl.c
drivers/gpu/drm/mediatek/mtk_disp_rdma.c
drivers/gpu/drm/mediatek/mtk_dpi.c
drivers/gpu/drm/mediatek/mtk_drm_crtc.c
drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
drivers/gpu/drm/mediatek/mtk_drm_drv.c
drivers/gpu/drm/mediatek/mtk_drm_fb.c
drivers/gpu/drm/mediatek/mtk_drm_fb.h
drivers/gpu/drm/mediatek/mtk_drm_gem.c
drivers/gpu/drm/mediatek/mtk_drm_plane.c
drivers/gpu/drm/mediatek/mtk_dsi.c
drivers/gpu/drm/mediatek/mtk_hdmi.c
drivers/gpu/drm/meson/meson_crtc.c
drivers/gpu/drm/meson/meson_drv.c
drivers/gpu/drm/meson/meson_drv.h
drivers/gpu/drm/meson/meson_dw_hdmi.c
drivers/gpu/drm/meson/meson_overlay.c
drivers/gpu/drm/meson/meson_plane.c
drivers/gpu/drm/meson/meson_registers.h
drivers/gpu/drm/meson/meson_vclk.c
drivers/gpu/drm/meson/meson_vclk.h
drivers/gpu/drm/meson/meson_venc.c
drivers/gpu/drm/meson/meson_venc.h
drivers/gpu/drm/meson/meson_venc_cvbs.c
drivers/gpu/drm/meson/meson_viu.c
drivers/gpu/drm/meson/meson_vpp.c
drivers/gpu/drm/meson/meson_vpp.h
drivers/gpu/drm/mga/mga_dma.c
drivers/gpu/drm/mga/mga_drv.c
drivers/gpu/drm/mga/mga_drv.h
drivers/gpu/drm/mga/mga_ioc32.c
drivers/gpu/drm/mga/mga_irq.c
drivers/gpu/drm/mga/mga_state.c
drivers/gpu/drm/mga/mga_warp.c
drivers/gpu/drm/mgag200/Makefile
drivers/gpu/drm/mgag200/mgag200_cursor.c
drivers/gpu/drm/mgag200/mgag200_drv.c
drivers/gpu/drm/mgag200/mgag200_drv.h
drivers/gpu/drm/mgag200/mgag200_fb.c [deleted file]
drivers/gpu/drm/mgag200/mgag200_i2c.c
drivers/gpu/drm/mgag200/mgag200_main.c
drivers/gpu/drm/mgag200/mgag200_mode.c
drivers/gpu/drm/mgag200/mgag200_ttm.c
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
drivers/gpu/drm/msm/msm_atomic.c
drivers/gpu/drm/msm/msm_drv.c
drivers/gpu/drm/msm/msm_gem.c
drivers/gpu/drm/mxsfb/mxsfb_crtc.c
drivers/gpu/drm/mxsfb/mxsfb_drv.c
drivers/gpu/drm/mxsfb/mxsfb_out.c
drivers/gpu/drm/nouveau/nouveau_abi16.c
drivers/gpu/drm/nouveau/nouveau_abi16.h
drivers/gpu/drm/nouveau/nouveau_drm.c
drivers/gpu/drm/omapdrm/omap_crtc.c
drivers/gpu/drm/omapdrm/omap_debugfs.c
drivers/gpu/drm/omapdrm/omap_drv.c
drivers/gpu/drm/omapdrm/omap_drv.h
drivers/gpu/drm/omapdrm/omap_fb.c
drivers/gpu/drm/omapdrm/omap_fbdev.c
drivers/gpu/drm/omapdrm/omap_gem.c
drivers/gpu/drm/omapdrm/omap_gem.h
drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c
drivers/gpu/drm/omapdrm/omap_irq.c
drivers/gpu/drm/panel/Kconfig
drivers/gpu/drm/panel/Makefile
drivers/gpu/drm/panel/panel-novatek-nt39016.c [new file with mode: 0644]
drivers/gpu/drm/panel/panel-raydium-rm67191.c [new file with mode: 0644]
drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
drivers/gpu/drm/panel/panel-simple.c
drivers/gpu/drm/panfrost/panfrost_drv.c
drivers/gpu/drm/panfrost/panfrost_gem.c
drivers/gpu/drm/pl111/pl111_debugfs.c
drivers/gpu/drm/pl111/pl111_display.c
drivers/gpu/drm/pl111/pl111_drm.h
drivers/gpu/drm/pl111/pl111_drv.c
drivers/gpu/drm/pl111/pl111_nomadik.h
drivers/gpu/drm/pl111/pl111_versatile.c
drivers/gpu/drm/pl111/pl111_versatile.h
drivers/gpu/drm/pl111/pl111_vexpress.c
drivers/gpu/drm/qxl/qxl_cmd.c
drivers/gpu/drm/qxl/qxl_debugfs.c
drivers/gpu/drm/qxl/qxl_display.c
drivers/gpu/drm/qxl/qxl_draw.c
drivers/gpu/drm/qxl/qxl_drv.c
drivers/gpu/drm/qxl/qxl_drv.h
drivers/gpu/drm/qxl/qxl_gem.c
drivers/gpu/drm/qxl/qxl_ioctl.c
drivers/gpu/drm/qxl/qxl_irq.c
drivers/gpu/drm/qxl/qxl_kms.c
drivers/gpu/drm/qxl/qxl_release.c
drivers/gpu/drm/qxl/qxl_ttm.c
drivers/gpu/drm/r128/r128_ioc32.c
drivers/gpu/drm/r128/r128_irq.c
drivers/gpu/drm/radeon/radeon_drv.c
drivers/gpu/drm/radeon/radeon_prime.c
drivers/gpu/drm/rcar-du/rcar_du_drv.c
drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
drivers/gpu/drm/rockchip/cdn-dp-core.c
drivers/gpu/drm/rockchip/cdn-dp-core.h
drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
drivers/gpu/drm/rockchip/inno_hdmi.c
drivers/gpu/drm/rockchip/rockchip_drm_drv.c
drivers/gpu/drm/rockchip/rockchip_drm_fb.c
drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c
drivers/gpu/drm/rockchip/rockchip_drm_gem.c
drivers/gpu/drm/rockchip/rockchip_drm_psr.c
drivers/gpu/drm/rockchip/rockchip_drm_vop.c
drivers/gpu/drm/rockchip/rockchip_lvds.c
drivers/gpu/drm/rockchip/rockchip_rgb.c
drivers/gpu/drm/rockchip/rockchip_vop_reg.c
drivers/gpu/drm/scheduler/gpu_scheduler_trace.h
drivers/gpu/drm/scheduler/sched_entity.c
drivers/gpu/drm/scheduler/sched_fence.c
drivers/gpu/drm/scheduler/sched_main.c
drivers/gpu/drm/selftests/test-drm_framebuffer.c
drivers/gpu/drm/shmobile/shmob_drm_crtc.c
drivers/gpu/drm/shmobile/shmob_drm_crtc.h
drivers/gpu/drm/shmobile/shmob_drm_drv.c
drivers/gpu/drm/shmobile/shmob_drm_kms.c
drivers/gpu/drm/shmobile/shmob_drm_plane.c
drivers/gpu/drm/shmobile/shmob_drm_plane.h
drivers/gpu/drm/shmobile/shmob_drm_regs.h
drivers/gpu/drm/sti/sti_drv.c
drivers/gpu/drm/sti/sti_tvout.c
drivers/gpu/drm/stm/drv.c
drivers/gpu/drm/stm/dw_mipi_dsi-stm.c
drivers/gpu/drm/sun4i/sun4i_backend.c
drivers/gpu/drm/sun4i/sun4i_crtc.c
drivers/gpu/drm/sun4i/sun4i_drv.c
drivers/gpu/drm/sun4i/sun4i_framebuffer.c
drivers/gpu/drm/sun4i/sun4i_frontend.c
drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c
drivers/gpu/drm/sun4i/sun4i_layer.c
drivers/gpu/drm/sun4i/sun4i_lvds.c
drivers/gpu/drm/sun4i/sun4i_rgb.c
drivers/gpu/drm/sun4i/sun4i_tcon.c
drivers/gpu/drm/sun4i/sun4i_tv.c
drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c
drivers/gpu/drm/sun4i/sun8i_csc.c
drivers/gpu/drm/sun4i/sun8i_csc.h
drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c
drivers/gpu/drm/sun4i/sun8i_mixer.c
drivers/gpu/drm/sun4i/sun8i_tcon_top.c
drivers/gpu/drm/sun4i/sun8i_ui_layer.c
drivers/gpu/drm/sun4i/sun8i_vi_layer.c
drivers/gpu/drm/tdfx/tdfx_drv.c
drivers/gpu/drm/tegra/drm.c
drivers/gpu/drm/tegra/gem.c
drivers/gpu/drm/tegra/gem.h
drivers/gpu/drm/tilcdc/tilcdc_crtc.c
drivers/gpu/drm/tilcdc/tilcdc_drv.c
drivers/gpu/drm/tilcdc/tilcdc_drv.h
drivers/gpu/drm/tilcdc/tilcdc_external.c
drivers/gpu/drm/tilcdc/tilcdc_panel.c
drivers/gpu/drm/tilcdc/tilcdc_plane.c
drivers/gpu/drm/tilcdc/tilcdc_tfp410.c
drivers/gpu/drm/tinydrm/hx8357d.c
drivers/gpu/drm/tinydrm/ili9225.c
drivers/gpu/drm/tinydrm/ili9341.c
drivers/gpu/drm/tinydrm/mi0283qt.c
drivers/gpu/drm/tinydrm/repaper.c
drivers/gpu/drm/tinydrm/st7586.c
drivers/gpu/drm/tinydrm/st7735r.c
drivers/gpu/drm/tve200/tve200_display.c
drivers/gpu/drm/tve200/tve200_drm.h
drivers/gpu/drm/tve200/tve200_drv.c
drivers/gpu/drm/udl/udl_connector.c
drivers/gpu/drm/udl/udl_connector.h
drivers/gpu/drm/udl/udl_dmabuf.c
drivers/gpu/drm/udl/udl_drv.c
drivers/gpu/drm/udl/udl_drv.h
drivers/gpu/drm/udl/udl_encoder.c
drivers/gpu/drm/udl/udl_fb.c
drivers/gpu/drm/udl/udl_gem.c
drivers/gpu/drm/udl/udl_main.c
drivers/gpu/drm/udl/udl_modeset.c
drivers/gpu/drm/udl/udl_transfer.c
drivers/gpu/drm/v3d/v3d_debugfs.c
drivers/gpu/drm/v3d/v3d_drv.c
drivers/gpu/drm/v3d/v3d_drv.h
drivers/gpu/drm/v3d/v3d_gem.c
drivers/gpu/drm/v3d/v3d_irq.c
drivers/gpu/drm/vboxvideo/Makefile
drivers/gpu/drm/vboxvideo/vbox_drv.c
drivers/gpu/drm/vboxvideo/vbox_drv.h
drivers/gpu/drm/vboxvideo/vbox_prime.c [deleted file]
drivers/gpu/drm/vc4/vc4_bo.c
drivers/gpu/drm/vc4/vc4_crtc.c
drivers/gpu/drm/vc4/vc4_debugfs.c
drivers/gpu/drm/vc4/vc4_drv.c
drivers/gpu/drm/vc4/vc4_drv.h
drivers/gpu/drm/vc4/vc4_dsi.c
drivers/gpu/drm/vc4/vc4_gem.c
drivers/gpu/drm/vc4/vc4_hvs.c
drivers/gpu/drm/vc4/vc4_kms.c
drivers/gpu/drm/vc4/vc4_plane.c
drivers/gpu/drm/vc4/vc4_txp.c
drivers/gpu/drm/vc4/vc4_v3d.c
drivers/gpu/drm/vgem/vgem_drv.c
drivers/gpu/drm/vgem/vgem_drv.h
drivers/gpu/drm/vgem/vgem_fence.c
drivers/gpu/drm/virtio/virtgpu_debugfs.c
drivers/gpu/drm/virtio/virtgpu_display.c
drivers/gpu/drm/virtio/virtgpu_drv.c
drivers/gpu/drm/virtio/virtgpu_drv.h
drivers/gpu/drm/virtio/virtgpu_fence.c
drivers/gpu/drm/virtio/virtgpu_gem.c
drivers/gpu/drm/virtio/virtgpu_ioctl.c
drivers/gpu/drm/virtio/virtgpu_kms.c
drivers/gpu/drm/virtio/virtgpu_plane.c
drivers/gpu/drm/virtio/virtgpu_prime.c
drivers/gpu/drm/virtio/virtgpu_ttm.c
drivers/gpu/drm/virtio/virtgpu_vq.c
drivers/gpu/drm/vkms/Makefile
drivers/gpu/drm/vkms/vkms_composer.c [moved from drivers/gpu/drm/vkms/vkms_crc.c with 52% similarity]
drivers/gpu/drm/vkms/vkms_crtc.c
drivers/gpu/drm/vkms/vkms_drv.c
drivers/gpu/drm/vkms/vkms_drv.h
drivers/gpu/drm/vkms/vkms_gem.c
drivers/gpu/drm/vkms/vkms_output.c
drivers/gpu/drm/vkms/vkms_plane.c
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
drivers/gpu/drm/xen/xen_drm_front.c
drivers/gpu/drm/xen/xen_drm_front.h
drivers/gpu/drm/xen/xen_drm_front_cfg.c
drivers/gpu/drm/xen/xen_drm_front_conn.c
drivers/gpu/drm/xen/xen_drm_front_conn.h
drivers/gpu/drm/xen/xen_drm_front_evtchnl.c
drivers/gpu/drm/xen/xen_drm_front_gem.c
drivers/gpu/drm/xen/xen_drm_front_gem.h
drivers/gpu/drm/xen/xen_drm_front_kms.c
drivers/gpu/drm/zte/zx_drm_drv.c
drivers/gpu/drm/zte/zx_hdmi.c
drivers/gpu/drm/zte/zx_plane.c
drivers/gpu/drm/zte/zx_tvenc.c
drivers/gpu/drm/zte/zx_vga.c
drivers/gpu/drm/zte/zx_vou.c
include/drm/drm_agpsupport.h
include/drm/drm_client.h
include/drm/drm_connector.h
include/drm/drm_drv.h
include/drm/drm_gem.h
include/drm/drm_gem_framebuffer_helper.h
include/drm/drm_gem_vram_helper.h
include/drm/drm_ioctl.h
include/drm/drm_mode_config.h
include/drm/drm_panel.h
include/drm/drm_prime.h
include/drm/drm_vblank.h
include/drm/drm_vram_mm_helper.h
include/linux/reservation.h
include/linux/soc/amlogic/meson-canvas.h
include/uapi/linux/media-bus-format.h

diff --git a/Documentation/devicetree/bindings/display/panel/ampire,am-480272h3tmqw-t01h.txt b/Documentation/devicetree/bindings/display/panel/ampire,am-480272h3tmqw-t01h.txt
deleted file mode 100644 (file)
index 6812280..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-Ampire AM-480272H3TMQW-T01H 4.3" WQVGA TFT LCD panel
-
-This binding is compatible with the simple-panel binding, which is specified
-in simple-panel.txt in this directory.
-
-Required properties:
-- compatible: should be "ampire,am-480272h3tmqw-t01h"
-
-Optional properties:
-- power-supply: regulator to provide the supply voltage
-- enable-gpios: GPIO pin to enable or disable the panel
-- backlight: phandle of the backlight device attached to the panel
-
-Optional nodes:
-- Video port for RGB input.
-
-Example:
-       panel_rgb: panel-rgb {
-               compatible = "ampire,am-480272h3tmqw-t01h";
-               enable-gpios = <&gpioa 8 1>;
-               port {
-                       panel_in_rgb: endpoint {
-                               remote-endpoint = <&controller_out_rgb>;
-                       };
-               };
-       };
diff --git a/Documentation/devicetree/bindings/display/panel/ampire,am-480272h3tmqw-t01h.yaml b/Documentation/devicetree/bindings/display/panel/ampire,am-480272h3tmqw-t01h.yaml
new file mode 100644 (file)
index 0000000..c6e33e7
--- /dev/null
@@ -0,0 +1,42 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/panel/ampire,am-480272h3tmqw-t01h.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Ampire AM-480272H3TMQW-T01H 4.3" WQVGA TFT LCD panel
+
+maintainers:
+  - Yannick Fertre <yannick.fertre@st.com>
+  - Thierry Reding <treding@nvidia.com>
+
+allOf:
+  - $ref: panel-common.yaml#
+
+properties:
+  compatible:
+    const: ampire,am-480272h3tmqw-t01h
+
+  power-supply: true
+  enable-gpios: true
+  backlight: true
+  port: true
+
+required:
+  - compatible
+
+additionalProperties: false
+
+examples:
+  - |
+    panel_rgb: panel {
+      compatible = "ampire,am-480272h3tmqw-t01h";
+      enable-gpios = <&gpioa 8 1>;
+      port {
+        panel_in_rgb: endpoint {
+          remote-endpoint = <&controller_out_rgb>;
+        };
+      };
+    };
+
+...
index 248141c3c7e3ddc1fc74143bce4b9b8ae6377750..0601a9e347036308021a2cbd4d22eeaed002f85b 100644 (file)
@@ -10,7 +10,7 @@ Required properties:
 - compatible: should be "arm,versatile-tft-panel"
 
 Required subnodes:
-- port: see display/panel/panel-common.txt, graph.txt
+- port: see display/panel/panel-common.yaml, graph.txt
 
 
 Example:
diff --git a/Documentation/devicetree/bindings/display/panel/armadeus,st0700-adapt.txt b/Documentation/devicetree/bindings/display/panel/armadeus,st0700-adapt.txt
deleted file mode 100644 (file)
index a30d63d..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-Armadeus ST0700 Adapt. A Santek ST0700I5Y-RBSLW 7.0" WVGA (800x480) TFT with
-an adapter board.
-
-Required properties:
-- compatible: "armadeus,st0700-adapt"
-- power-supply: see panel-common.txt
-
-Optional properties:
-- backlight: see panel-common.txt
diff --git a/Documentation/devicetree/bindings/display/panel/armadeus,st0700-adapt.yaml b/Documentation/devicetree/bindings/display/panel/armadeus,st0700-adapt.yaml
new file mode 100644 (file)
index 0000000..a6ade47
--- /dev/null
@@ -0,0 +1,33 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/panel/armadeus,st0700-adapt.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Armadeus ST0700 Adapter
+
+description:
+  A Santek ST0700I5Y-RBSLW 7.0" WVGA (800x480) TFT with an adapter board.
+
+maintainers:
+  - '"Sébastien Szymanski" <sebastien.szymanski@armadeus.com>'
+  - Thierry Reding <thierry.reding@gmail.com>
+
+allOf:
+  - $ref: panel-common.yaml#
+
+properties:
+  compatible:
+    const: armadeus,st0700-adapt
+
+  power-supply: true
+  backlight: true
+  port: true
+
+additionalProperties: false
+
+required:
+  - compatible
+  - power-supply
+
+...
diff --git a/Documentation/devicetree/bindings/display/panel/bananapi,s070wv20-ct16.txt b/Documentation/devicetree/bindings/display/panel/bananapi,s070wv20-ct16.txt
deleted file mode 100644 (file)
index 35bc0c8..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-Banana Pi 7" (S070WV20-CT16) TFT LCD Panel
-
-Required properties:
-- compatible: should be "bananapi,s070wv20-ct16"
-- power-supply: see ./panel-common.txt
-
-Optional properties:
-- enable-gpios: see ./simple-panel.txt
-- backlight: see ./simple-panel.txt
-
-This binding is compatible with the simple-panel binding, which is specified
-in ./simple-panel.txt.
diff --git a/Documentation/devicetree/bindings/display/panel/bananapi,s070wv20-ct16.yaml b/Documentation/devicetree/bindings/display/panel/bananapi,s070wv20-ct16.yaml
new file mode 100644 (file)
index 0000000..bbf127f
--- /dev/null
@@ -0,0 +1,31 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/panel/bananapi,s070wv20-ct16.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Banana Pi 7" (S070WV20-CT16) TFT LCD Panel
+
+maintainers:
+  - Chen-Yu Tsai <wens@csie.org>
+  - Thierry Reding <thierry.reding@gmail.com>
+
+allOf:
+  - $ref: panel-common.yaml#
+
+properties:
+  compatible:
+    const: bananapi,s070wv20-ct16
+
+  power-supply: true
+  backlight: true
+  enable-gpios: true
+  port: true
+
+additionalProperties: false
+
+required:
+  - compatible
+  - power-supply
+
+...
diff --git a/Documentation/devicetree/bindings/display/panel/boe,himax8279d.txt b/Documentation/devicetree/bindings/display/panel/boe,himax8279d.txt
new file mode 100644 (file)
index 0000000..3caea21
--- /dev/null
@@ -0,0 +1,24 @@
+Boe Himax8279d 1200x1920 TFT LCD panel
+
+Required properties:
+- compatible: should be "boe,himax8279d8p" and one of: "boe,himax8279d10p"
+- reg: DSI virtual channel of the peripheral
+- enable-gpios: panel enable gpio
+- pp33-gpios: a GPIO phandle for the 3.3v pin that provides the supply voltage
+- pp18-gpios: a GPIO phandle for the 1.8v pin that provides the supply voltage
+
+Optional properties:
+- backlight: phandle of the backlight device attached to the panel
+
+Example:
+
+       &mipi_dsi {
+               panel {
+                       compatible = "boe,himax8279d8p", "boe,himax8279d10p";
+                       reg = <0>;
+                       backlight = <&backlight>;
+                       enable-gpios = <&gpio 45 GPIO_ACTIVE_HIGH>;
+                       pp33-gpios = <&gpio 35 GPIO_ACTIVE_HIGH>;
+                       pp18-gpios = <&gpio 36 GPIO_ACTIVE_HIGH>;
+               };
+       };
diff --git a/Documentation/devicetree/bindings/display/panel/dlc,dlc0700yzg-1.txt b/Documentation/devicetree/bindings/display/panel/dlc,dlc0700yzg-1.txt
deleted file mode 100644 (file)
index bf06bb0..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-DLC Display Co. DLC0700YZG-1 7.0" WSVGA TFT LCD panel
-
-Required properties:
-- compatible: should be "dlc,dlc0700yzg-1"
-- power-supply: See simple-panel.txt
-
-Optional properties:
-- reset-gpios: See panel-common.txt
-- enable-gpios: See simple-panel.txt
-- backlight: See simple-panel.txt
-
-This binding is compatible with the simple-panel binding, which is specified
-in simple-panel.txt in this directory.
diff --git a/Documentation/devicetree/bindings/display/panel/dlc,dlc0700yzg-1.yaml b/Documentation/devicetree/bindings/display/panel/dlc,dlc0700yzg-1.yaml
new file mode 100644 (file)
index 0000000..287e2fe
--- /dev/null
@@ -0,0 +1,31 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/panel/dlc,dlc0700yzg-1.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: DLC Display Co. DLC0700YZG-1 7.0" WSVGA TFT LCD panel
+
+maintainers:
+  - Philipp Zabel <p.zabel@pengutronix.de>
+  - Thierry Reding <thierry.reding@gmail.com>
+
+allOf:
+  - $ref: panel-common.yaml#
+
+properties:
+  compatible:
+    const: dlc,dlc0700yzg-1
+
+  reset-gpios: true
+  enable-gpios: true
+  backlight: true
+  port: true
+
+additionalProperties: false
+
+required:
+  - compatible
+  - power-supply
+
+...
index be8684327ee4d2f5fe5c6f472ce0266e2b3dd5d6..b7ac1c725f97c01bacdb7541da0c4f2ef8cadb71 100644 (file)
@@ -40,7 +40,7 @@ simple-panel.txt
 | Identifier      | compatbile          | description                         |
 +=================+=====================+=====================================+
 | ETM0700G0DH6    | edt,etm070080dh6    | WVGA TFT Display with capacitive    |
-|                 |                     | Touchscreen                         |
+|                 | edt,etm0700g0dh6    | Touchscreen                         |
 +-----------------+---------------------+-------------------------------------+
 | ETM0700G0BDH6   | edt,etm070080bdh6   | Same as ETM0700G0DH6 but with       |
 |                 |                     | inverted pixel clock.               |
diff --git a/Documentation/devicetree/bindings/display/panel/giantplus,gpm940b0.txt b/Documentation/devicetree/bindings/display/panel/giantplus,gpm940b0.txt
new file mode 100644 (file)
index 0000000..3dab52f
--- /dev/null
@@ -0,0 +1,12 @@
+GiantPlus 3.0" (320x240 pixels) 24-bit TFT LCD panel
+
+Required properties:
+- compatible: should be "giantplus,gpm940b0"
+- power-supply: as specified in the base binding
+
+Optional properties:
+- backlight: as specified in the base binding
+- enable-gpios: as specified in the base binding
+
+This binding is compatible with the simple-panel binding, which is specified
+in simple-panel.txt in this directory.
diff --git a/Documentation/devicetree/bindings/display/panel/innolux,ee101ia-01d.txt b/Documentation/devicetree/bindings/display/panel/innolux,ee101ia-01d.txt
deleted file mode 100644 (file)
index e5ca4cc..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-Innolux Corporation 10.1" EE101IA-01D WXGA (1280x800) LVDS panel
-
-Required properties:
-- compatible: should be "innolux,ee101ia-01d"
-
-This binding is compatible with the lvds-panel binding, which is specified
-in panel-lvds.txt in this directory.
diff --git a/Documentation/devicetree/bindings/display/panel/innolux,ee101ia-01d.yaml b/Documentation/devicetree/bindings/display/panel/innolux,ee101ia-01d.yaml
new file mode 100644 (file)
index 0000000..a69681e
--- /dev/null
@@ -0,0 +1,31 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/panel/innolux,ee101ia-01d.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Innolux Corporation 10.1" EE101IA-01D WXGA (1280x800) LVDS panel
+
+maintainers:
+  - Heiko Stuebner <heiko.stuebner@bq.com>
+  - Thierry Reding <thierry.reding@gmail.com>
+
+allOf:
+  - $ref: lvds.yaml#
+
+properties:
+  compatible:
+    items:
+      - const: innolux,ee101ia-01d
+      - {} # panel-lvds, but not listed here to avoid false select
+
+  backlight: true
+  enable-gpios: true
+  power-supply: true
+  width-mm: true
+  height-mm: true
+  panel-timing: true
+  port: true
+
+additionalProperties: false
+...
diff --git a/Documentation/devicetree/bindings/display/panel/kingdisplay,kd035g6-54nt.txt b/Documentation/devicetree/bindings/display/panel/kingdisplay,kd035g6-54nt.txt
new file mode 100644 (file)
index 0000000..fa95960
--- /dev/null
@@ -0,0 +1,42 @@
+King Display KD035G6-54NT 3.5" (320x240 pixels) 24-bit TFT LCD panel
+
+Required properties:
+- compatible: should be "kingdisplay,kd035g6-54nt"
+- power-supply: See panel-common.txt
+- reset-gpios: See panel-common.txt
+
+Optional properties:
+- backlight: see panel-common.txt
+
+The generic bindings for the SPI slaves documented in [1] also apply.
+
+The device node can contain one 'port' child node with one child
+'endpoint' node, according to the bindings defined in [2]. This
+node should describe panel's video bus.
+
+[1]: Documentation/devicetree/bindings/spi/spi-bus.txt
+[2]: Documentation/devicetree/bindings/graph.txt
+
+Example:
+
+&spi {
+       panel@0 {
+               compatible = "kingdisplay,kd035g6-54nt";
+               reg = <0>;
+
+               spi-max-frequency = <3125000>;
+               spi-3wire;
+               spi-cs-high;
+
+               reset-gpios = <&gpe 2 GPIO_ACTIVE_LOW>;
+
+               backlight = <&backlight>;
+               power-supply = <&ldo6>;
+
+               port {
+                       panel_input: endpoint {
+                               remote-endpoint = <&panel_output>;
+                       };
+               };
+       };
+};
diff --git a/Documentation/devicetree/bindings/display/panel/lvds.yaml b/Documentation/devicetree/bindings/display/panel/lvds.yaml
new file mode 100644 (file)
index 0000000..d008330
--- /dev/null
@@ -0,0 +1,107 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/panel/lvds.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: LVDS Display Panel
+
+maintainers:
+  - Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+  - Thierry Reding <thierry.reding@gmail.com>
+
+description: |+
+  LVDS is a physical layer specification defined in ANSI/TIA/EIA-644-A. Multiple
+  incompatible data link layers have been used over time to transmit image data
+  to LVDS panels. This bindings supports display panels compatible with the
+  following specifications.
+
+  [JEIDA] "Digital Interface Standards for Monitor", JEIDA-59-1999, February
+  1999 (Version 1.0), Japan Electronic Industry Development Association (JEIDA)
+  [LDI] "Open LVDS Display Interface", May 1999 (Version 0.95), National
+  Semiconductor
+  [VESA] "VESA Notebook Panel Standard", October 2007 (Version 1.0), Video
+  Electronics Standards Association (VESA)
+
+  Device compatible with those specifications have been marketed under the
+  FPD-Link and FlatLink brands.
+
+allOf:
+  - $ref: panel-common.yaml#
+
+properties:
+  compatible:
+    contains:
+      const: panel-lvds
+    description:
+      Shall contain "panel-lvds" in addition to a mandatory panel-specific
+      compatible string defined in individual panel bindings. The "panel-lvds"
+      value shall never be used on its own.
+
+  data-mapping:
+    enum:
+      - jeida-18
+      - jeida-24
+      - vesa-24
+    description: |
+      The color signals mapping order.
+
+      LVDS data mappings are defined as follows.
+
+      - "jeida-18" - 18-bit data mapping compatible with the [JEIDA], [LDI] and
+        [VESA] specifications. Data are transferred as follows on 3 LVDS lanes.
+
+      Slot         0       1       2       3       4       5       6
+            ________________                         _________________
+      Clock                    \_______________________/
+              ______  ______  ______  ______  ______  ______  ______
+      DATA0    ><__G0__><__R5__><__R4__><__R3__><__R2__><__R1__><__R0__><
+      DATA1    ><__B1__><__B0__><__G5__><__G4__><__G3__><__G2__><__G1__><
+      DATA2    ><_CTL2_><_CTL1_><_CTL0_><__B5__><__B4__><__B3__><__B2__><
+
+      - "jeida-24" - 24-bit data mapping compatible with the [DSIM] and [LDI]
+        specifications. Data are transferred as follows on 4 LVDS lanes.
+
+      Slot         0       1       2       3       4       5       6
+            ________________                         _________________
+      Clock                    \_______________________/
+              ______  ______  ______  ______  ______  ______  ______
+      DATA0    ><__G2__><__R7__><__R6__><__R5__><__R4__><__R3__><__R2__><
+      DATA1    ><__B3__><__B2__><__G7__><__G6__><__G5__><__G4__><__G3__><
+      DATA2    ><_CTL2_><_CTL1_><_CTL0_><__B7__><__B6__><__B5__><__B4__><
+      DATA3    ><_CTL3_><__B1__><__B0__><__G1__><__G0__><__R1__><__R0__><
+
+      - "vesa-24" - 24-bit data mapping compatible with the [VESA] specification.
+        Data are transferred as follows on 4 LVDS lanes.
+
+      Slot         0       1       2       3       4       5       6
+            ________________                         _________________
+      Clock                    \_______________________/
+              ______  ______  ______  ______  ______  ______  ______
+      DATA0    ><__G0__><__R5__><__R4__><__R3__><__R2__><__R1__><__R0__><
+      DATA1    ><__B1__><__B0__><__G5__><__G4__><__G3__><__G2__><__G1__><
+      DATA2    ><_CTL2_><_CTL1_><_CTL0_><__B5__><__B4__><__B3__><__B2__><
+      DATA3    ><_CTL3_><__B7__><__B6__><__G7__><__G6__><__R7__><__R6__><
+
+      Control signals are mapped as follows.
+
+      CTL0: HSync
+      CTL1: VSync
+      CTL2: Data Enable
+      CTL3: 0
+
+  data-mirror:
+    type: boolean
+    description:
+      If set, reverse the bit order described in the data mappings below on all
+      data lanes, transmitting bits for slots 6 to 0 instead of 0 to 6.
+
+required:
+  - compatible
+  - data-mapping
+  - width-mm
+  - height-mm
+  - panel-timing
+  - port
+
+...
diff --git a/Documentation/devicetree/bindings/display/panel/mitsubishi,aa104xd12.txt b/Documentation/devicetree/bindings/display/panel/mitsubishi,aa104xd12.txt
deleted file mode 100644 (file)
index ced0121..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-Mitsubishi AA204XD12 LVDS Display Panel
-=======================================
-
-The AA104XD12 is a 10.4" XGA TFT-LCD display panel.
-
-These DT bindings follow the LVDS panel bindings defined in panel-lvds.txt
-with the following device-specific properties.
-
-
-Required properties:
-
-- compatible: Shall contain "mitsubishi,aa121td01" and "panel-lvds", in that
-  order.
-- vcc-supply: Reference to the regulator powering the panel VCC pins.
-
-
-Example
--------
-
-panel {
-       compatible = "mitsubishi,aa104xd12", "panel-lvds";
-       vcc-supply = <&vcc_3v3>;
-
-       width-mm = <210>;
-       height-mm = <158>;
-
-       data-mapping = "jeida-24";
-
-       panel-timing {
-               /* 1024x768 @65Hz */
-               clock-frequency = <65000000>;
-               hactive = <1024>;
-               vactive = <768>;
-               hsync-len = <136>;
-               hfront-porch = <20>;
-               hback-porch = <160>;
-               vfront-porch = <3>;
-               vback-porch = <29>;
-               vsync-len = <6>;
-       };
-
-       port {
-               panel_in: endpoint {
-                       remote-endpoint = <&lvds_encoder>;
-               };
-       };
-};
diff --git a/Documentation/devicetree/bindings/display/panel/mitsubishi,aa104xd12.yaml b/Documentation/devicetree/bindings/display/panel/mitsubishi,aa104xd12.yaml
new file mode 100644 (file)
index 0000000..b5e7ee2
--- /dev/null
@@ -0,0 +1,75 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/panel/mitsubishi,aa104xd12.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Mitsubishi AA104XD12 10.4" XGA LVDS Display Panel
+
+maintainers:
+  - Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+  - Thierry Reding <thierry.reding@gmail.com>
+
+allOf:
+  - $ref: lvds.yaml#
+
+properties:
+  compatible:
+    items:
+      - const: mitsubishi,aa104xd12
+      - {} # panel-lvds, but not listed here to avoid false select
+
+  vcc-supply:
+    description: Reference to the regulator powering the panel VCC pins.
+
+  data-mapping:
+    const: jeida-24
+
+  width-mm:
+    const: 210
+
+  height-mm:
+    const: 158
+
+  panel-timing: true
+  port: true
+
+additionalProperties: false
+
+required:
+  - compatible
+  - vcc-supply
+
+examples:
+  - |+
+
+    panel {
+      compatible = "mitsubishi,aa104xd12", "panel-lvds";
+      vcc-supply = <&vcc_3v3>;
+
+      width-mm = <210>;
+      height-mm = <158>;
+
+      data-mapping = "jeida-24";
+
+      panel-timing {
+        /* 1024x768 @65Hz */
+        clock-frequency = <65000000>;
+        hactive = <1024>;
+        vactive = <768>;
+        hsync-len = <136>;
+        hfront-porch = <20>;
+        hback-porch = <160>;
+        vfront-porch = <3>;
+        vback-porch = <29>;
+        vsync-len = <6>;
+      };
+
+      port {
+        panel_in: endpoint {
+          remote-endpoint = <&lvds_encoder>;
+        };
+      };
+    };
+
+...
diff --git a/Documentation/devicetree/bindings/display/panel/mitsubishi,aa121td01.txt b/Documentation/devicetree/bindings/display/panel/mitsubishi,aa121td01.txt
deleted file mode 100644 (file)
index d6e1097..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-Mitsubishi AA121TD01 LVDS Display Panel
-=======================================
-
-The AA121TD01 is a 12.1" WXGA TFT-LCD display panel.
-
-These DT bindings follow the LVDS panel bindings defined in panel-lvds.txt
-with the following device-specific properties.
-
-
-Required properties:
-
-- compatible: Shall contain "mitsubishi,aa121td01" and "panel-lvds", in that
-  order.
-- vcc-supply: Reference to the regulator powering the panel VCC pins.
-
-
-Example
--------
-
-panel {
-       compatible = "mitsubishi,aa121td01", "panel-lvds";
-       vcc-supply = <&vcc_3v3>;
-
-       width-mm = <261>;
-       height-mm = <163>;
-
-       data-mapping = "jeida-24";
-
-       panel-timing {
-               /* 1280x800 @60Hz */
-               clock-frequency = <71000000>;
-               hactive = <1280>;
-               vactive = <800>;
-               hsync-len = <70>;
-               hfront-porch = <20>;
-               hback-porch = <70>;
-               vsync-len = <5>;
-               vfront-porch = <3>;
-               vback-porch = <15>;
-       };
-
-       port {
-               panel_in: endpoint {
-                       remote-endpoint = <&lvds_encoder>;
-               };
-       };
-};
diff --git a/Documentation/devicetree/bindings/display/panel/mitsubishi,aa121td01.yaml b/Documentation/devicetree/bindings/display/panel/mitsubishi,aa121td01.yaml
new file mode 100644 (file)
index 0000000..977c50a
--- /dev/null
@@ -0,0 +1,74 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/panel/mitsubishi,aa121td01.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Mitsubishi AA121TD01 12.1" WXGA LVDS Display Panel
+
+maintainers:
+  - Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+  - Thierry Reding <thierry.reding@gmail.com>
+
+allOf:
+  - $ref: lvds.yaml#
+
+properties:
+  compatible:
+    items:
+      - const: mitsubishi,aa121td01
+      - {} # panel-lvds, but not listed here to avoid false select
+
+  vcc-supply:
+    description: Reference to the regulator powering the panel VCC pins.
+
+  data-mapping:
+    const: jeida-24
+
+  width-mm:
+    const: 261
+
+  height-mm:
+    const: 163
+
+  panel-timing: true
+  port: true
+
+additionalProperties: false
+
+required:
+  - compatible
+  - vcc-supply
+
+examples:
+  - |+
+    panel {
+      compatible = "mitsubishi,aa121td01", "panel-lvds";
+      vcc-supply = <&vcc_3v3>;
+
+      width-mm = <261>;
+      height-mm = <163>;
+
+      data-mapping = "jeida-24";
+
+      panel-timing {
+        /* 1280x800 @60Hz */
+        clock-frequency = <71000000>;
+        hactive = <1280>;
+        vactive = <800>;
+        hsync-len = <70>;
+        hfront-porch = <20>;
+        hback-porch = <70>;
+        vsync-len = <5>;
+        vfront-porch = <3>;
+        vback-porch = <15>;
+      };
+
+      port {
+        panel_in: endpoint {
+          remote-endpoint = <&lvds_encoder>;
+        };
+      };
+    };
+
+...
diff --git a/Documentation/devicetree/bindings/display/panel/ortustech,com37h3m05dtc.txt b/Documentation/devicetree/bindings/display/panel/ortustech,com37h3m05dtc.txt
new file mode 100644 (file)
index 0000000..c16907c
--- /dev/null
@@ -0,0 +1,12 @@
+OrtusTech COM37H3M05DTC Blanview 3.7" VGA portrait TFT-LCD panel
+
+Required properties:
+- compatible: should be "ortustech,com37h3m05dtc"
+
+Optional properties:
+- enable-gpios: GPIO pin to enable or disable the panel
+- backlight: phandle of the backlight device attached to the panel
+- power-supply: phandle of the regulator that provides the supply voltage
+
+This binding is compatible with the simple-panel binding, which is specified
+in simple-panel.txt in this directory.
diff --git a/Documentation/devicetree/bindings/display/panel/ortustech,com37h3m99dtc.txt b/Documentation/devicetree/bindings/display/panel/ortustech,com37h3m99dtc.txt
new file mode 100644 (file)
index 0000000..06a73c3
--- /dev/null
@@ -0,0 +1,12 @@
+OrtusTech COM37H3M99DTC Blanview 3.7" VGA portrait TFT-LCD panel
+
+Required properties:
+- compatible: should be "ortustech,com37h3m99dtc"
+
+Optional properties:
+- enable-gpios: GPIO pin to enable or disable the panel
+- backlight: phandle of the backlight device attached to the panel
+- power-supply: phandle of the regulator that provides the supply voltage
+
+This binding is compatible with the simple-panel binding, which is specified
+in simple-panel.txt in this directory.
diff --git a/Documentation/devicetree/bindings/display/panel/panel-common.txt b/Documentation/devicetree/bindings/display/panel/panel-common.txt
deleted file mode 100644 (file)
index 5d2519a..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-Common Properties for Display Panel
-===================================
-
-This document defines device tree properties common to several classes of
-display panels. It doesn't constitue a device tree binding specification by
-itself but is meant to be referenced by device tree bindings.
-
-When referenced from panel device tree bindings the properties defined in this
-document are defined as follows. The panel device tree bindings are
-responsible for defining whether each property is required or optional.
-
-
-Descriptive Properties
-----------------------
-
-- width-mm,
-- height-mm: The width-mm and height-mm specify the width and height of the
-  physical area where images are displayed. These properties are expressed in
-  millimeters and rounded to the closest unit.
-
-- label: The label property specifies a symbolic name for the panel as a
-  string suitable for use by humans. It typically contains a name inscribed on
-  the system (e.g. as an affixed label) or specified in the system's
-  documentation (e.g. in the user's manual).
-
-  If no such name exists, and unless the property is mandatory according to
-  device tree bindings, it shall rather be omitted than constructed of
-  non-descriptive information. For instance an LCD panel in a system that
-  contains a single panel shall not be labelled "LCD" if that name is not
-  inscribed on the system or used in a descriptive fashion in system
-  documentation.
-
-
-Display Timings
----------------
-
-- panel-timing: Most display panels are restricted to a single resolution and
-  require specific display timings. The panel-timing subnode expresses those
-  timings as specified in the timing subnode section of the display timing
-  bindings defined in
-  Documentation/devicetree/bindings/display/panel/display-timing.txt.
-
-
-Connectivity
-------------
-
-- ports: Panels receive video data through one or multiple connections. While
-  the nature of those connections is specific to the panel type, the
-  connectivity is expressed in a standard fashion using ports as specified in
-  the device graph bindings defined in
-  Documentation/devicetree/bindings/graph.txt.
-
-- ddc-i2c-bus: Some panels expose EDID information through an I2C-compatible
-  bus such as DDC2 or E-DDC. For such panels the ddc-i2c-bus contains a
-  phandle to the system I2C controller connected to that bus.
-
-
-Control I/Os
-------------
-
-Many display panels can be controlled through pins driven by GPIOs. The nature
-and timing of those control signals are device-specific and left for panel
-device tree bindings to specify. The following GPIO specifiers can however be
-used for panels that implement compatible control signals.
-
-- enable-gpios: Specifier for a GPIO connected to the panel enable control
-  signal. The enable signal is active high and enables operation of the panel.
-  This property can also be used for panels implementing an active low power
-  down signal, which is a negated version of the enable signal. Active low
-  enable signals (or active high power down signals) can be supported by
-  inverting the GPIO specifier polarity flag.
-
-  Note that the enable signal control panel operation only and must not be
-  confused with a backlight enable signal.
-
-- reset-gpios: Specifier for a GPIO coonnected to the panel reset control
-  signal. The reset signal is active low and resets the panel internal logic
-  while active. Active high reset signals can be supported by inverting the
-  GPIO specifier polarity flag.
-
-Power
------
-
-- power-supply: display panels require power to be supplied. While several
-  panels need more than one power supply with panel-specific constraints
-  governing the order and timings of the power supplies, in many cases a single
-  power supply is sufficient, either because the panel has a single power rail,
-  or because all its power rails can be driven by the same supply. In that case
-  the power-supply property specifies the supply powering the panel as a phandle
-  to a regulator.
-
-Backlight
----------
-
-Most display panels include a backlight. Some of them also include a backlight
-controller exposed through a control bus such as I2C or DSI. Others expose
-backlight control through GPIO, PWM or other signals connected to an external
-backlight controller.
-
-- backlight: For panels whose backlight is controlled by an external backlight
-  controller, this property contains a phandle that references the controller.
diff --git a/Documentation/devicetree/bindings/display/panel/panel-common.yaml b/Documentation/devicetree/bindings/display/panel/panel-common.yaml
new file mode 100644 (file)
index 0000000..ef8d8cd
--- /dev/null
@@ -0,0 +1,149 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/panel/panel-common.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Common Properties for Display Panels
+
+maintainers:
+  - Thierry Reding <thierry.reding@gmail.com>
+  - Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+
+description: |
+  This document defines device tree properties common to several classes of
+  display panels. It doesn't constitue a device tree binding specification by
+  itself but is meant to be referenced by device tree bindings.
+
+  When referenced from panel device tree bindings the properties defined in this
+  document are defined as follows. The panel device tree bindings are
+  responsible for defining whether each property is required or optional.
+
+properties:
+  # Descriptive Properties
+  width-mm:
+    description:
+      Specifies the width of the physical area where images are displayed. This
+      property is expressed in millimeters and rounded to the closest unit.
+
+  height-mm:
+    description:
+      Specifies the height of the physical area where images are displayed. This
+      property is expressed in millimeters and rounded to the closest unit.
+
+  label:
+    description: |
+      The label property specifies a symbolic name for the panel as a
+      string suitable for use by humans. It typically contains a name inscribed
+      on the system (e.g. as an affixed label) or specified in the system's
+      documentation (e.g. in the user's manual).
+
+      If no such name exists, and unless the property is mandatory according to
+      device tree bindings, it shall rather be omitted than constructed of
+      non-descriptive information. For instance an LCD panel in a system that
+      contains a single panel shall not be labelled "LCD" if that name is not
+      inscribed on the system or used in a descriptive fashion in system
+      documentation.
+
+  rotation:
+    description:
+      Display rotation in degrees counter clockwise (0,90,180,270)
+    allOf:
+      - $ref: /schemas/types.yaml#/definitions/uint32
+      - enum: [ 0, 90, 180, 270 ]
+
+  # Display Timings
+  panel-timing:
+    type: object
+    description:
+      Most display panels are restricted to a single resolution and
+      require specific display timings. The panel-timing subnode expresses those
+      timings as specified in the timing subnode section of the display timing
+      bindings defined in
+      Documentation/devicetree/bindings/display/panel/display-timing.txt.
+
+  # Connectivity
+  port:
+    type: object
+
+  ports:
+    type: object
+    description:
+      Panels receive video data through one or multiple connections. While
+      the nature of those connections is specific to the panel type, the
+      connectivity is expressed in a standard fashion using ports as specified
+      in the device graph bindings defined in
+      Documentation/devicetree/bindings/graph.txt.
+
+  ddc-i2c-bus:
+    $ref: /schemas/types.yaml#/definitions/phandle
+    description:
+      Some panels expose EDID information through an I2C-compatible
+      bus such as DDC2 or E-DDC. For such panels the ddc-i2c-bus contains a
+      phandle to the system I2C controller connected to that bus.
+
+  no-hpd:
+    type: boolean
+    description:
+      This panel is supposed to communicate that it's ready via HPD
+      (hot plug detect) signal, but the signal isn't hooked up so we should
+      hardcode the max delay from the panel spec when powering up the panel.
+
+  # Control I/Os
+
+  # Many display panels can be controlled through pins driven by GPIOs. The nature
+  # and timing of those control signals are device-specific and left for panel
+  # device tree bindings to specify. The following GPIO specifiers can however be
+  # used for panels that implement compatible control signals.
+
+  enable-gpios:
+    maxItems: 1
+    description: |
+      Specifier for a GPIO connected to the panel enable control signal. The
+      enable signal is active high and enables operation of the panel. This
+      property can also be used for panels implementing an active low power down
+      signal, which is a negated version of the enable signal. Active low enable
+      signals (or active high power down signals) can be supported by inverting
+      the GPIO specifier polarity flag.
+
+      Note that the enable signal control panel operation only and must not be
+      confused with a backlight enable signal.
+
+  reset-gpios:
+    maxItems: 1
+    description:
+      Specifier for a GPIO connected to the panel reset control signal.
+      The reset signal is active low and resets the panel internal logic
+      while active. Active high reset signals can be supported by inverting the
+      GPIO specifier polarity flag.
+
+  # Power
+  power-supply:
+    description:
+      Display panels require power to be supplied. While several panels need
+      more than one power supply with panel-specific constraints governing the
+      order and timings of the power supplies, in many cases a single power
+      supply is sufficient, either because the panel has a single power rail, or
+      because all its power rails can be driven by the same supply. In that case
+      the power-supply property specifies the supply powering the panel as a
+      phandle to a regulator.
+
+  # Backlight
+
+  # Most display panels include a backlight. Some of them also include a backlight
+  # controller exposed through a control bus such as I2C or DSI. Others expose
+  # backlight control through GPIO, PWM or other signals connected to an external
+  # backlight controller.
+
+  backlight:
+    $ref: /schemas/types.yaml#/definitions/phandle
+    description:
+      For panels whose backlight is controlled by an external backlight
+      controller, this property contains a phandle that references the
+      controller.
+
+dependencies:
+  width-mm: [ height-mm ]
+  height-mm: [ width-mm ]
+
+...
diff --git a/Documentation/devicetree/bindings/display/panel/panel-lvds.txt b/Documentation/devicetree/bindings/display/panel/panel-lvds.txt
deleted file mode 100644 (file)
index 250850a..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-LVDS Display Panel
-==================
-
-LVDS is a physical layer specification defined in ANSI/TIA/EIA-644-A. Multiple
-incompatible data link layers have been used over time to transmit image data
-to LVDS panels. This bindings supports display panels compatible with the
-following specifications.
-
-[JEIDA] "Digital Interface Standards for Monitor", JEIDA-59-1999, February
-1999 (Version 1.0), Japan Electronic Industry Development Association (JEIDA)
-[LDI] "Open LVDS Display Interface", May 1999 (Version 0.95), National
-Semiconductor
-[VESA] "VESA Notebook Panel Standard", October 2007 (Version 1.0), Video
-Electronics Standards Association (VESA)
-
-Device compatible with those specifications have been marketed under the
-FPD-Link and FlatLink brands.
-
-
-Required properties:
-
-- compatible: Shall contain "panel-lvds" in addition to a mandatory
-  panel-specific compatible string defined in individual panel bindings. The
-  "panel-lvds" value shall never be used on its own.
-- width-mm: See panel-common.txt.
-- height-mm: See panel-common.txt.
-- data-mapping: The color signals mapping order, "jeida-18", "jeida-24"
-  or "vesa-24".
-
-Optional properties:
-
-- label: See panel-common.txt.
-- gpios: See panel-common.txt.
-- backlight: See panel-common.txt.
-- power-supply: See panel-common.txt.
-- data-mirror: If set, reverse the bit order described in the data mappings
-  below on all data lanes, transmitting bits for slots 6 to 0 instead of
-  0 to 6.
-
-Required nodes:
-
-- panel-timing: See panel-common.txt.
-- ports: See panel-common.txt. These bindings require a single port subnode
-  corresponding to the panel LVDS input.
-
-
-LVDS data mappings are defined as follows.
-
-- "jeida-18" - 18-bit data mapping compatible with the [JEIDA], [LDI] and
-  [VESA] specifications. Data are transferred as follows on 3 LVDS lanes.
-
-Slot       0       1       2       3       4       5       6
-       ________________                         _________________
-Clock                  \_______________________/
-         ______  ______  ______  ______  ______  ______  ______
-DATA0  ><__G0__><__R5__><__R4__><__R3__><__R2__><__R1__><__R0__><
-DATA1  ><__B1__><__B0__><__G5__><__G4__><__G3__><__G2__><__G1__><
-DATA2  ><_CTL2_><_CTL1_><_CTL0_><__B5__><__B4__><__B3__><__B2__><
-
-- "jeida-24" - 24-bit data mapping compatible with the [DSIM] and [LDI]
-  specifications. Data are transferred as follows on 4 LVDS lanes.
-
-Slot       0       1       2       3       4       5       6
-       ________________                         _________________
-Clock                  \_______________________/
-         ______  ______  ______  ______  ______  ______  ______
-DATA0  ><__G2__><__R7__><__R6__><__R5__><__R4__><__R3__><__R2__><
-DATA1  ><__B3__><__B2__><__G7__><__G6__><__G5__><__G4__><__G3__><
-DATA2  ><_CTL2_><_CTL1_><_CTL0_><__B7__><__B6__><__B5__><__B4__><
-DATA3  ><_CTL3_><__B1__><__B0__><__G1__><__G0__><__R1__><__R0__><
-
-- "vesa-24" - 24-bit data mapping compatible with the [VESA] specification.
-  Data are transferred as follows on 4 LVDS lanes.
-
-Slot       0       1       2       3       4       5       6
-       ________________                         _________________
-Clock                  \_______________________/
-         ______  ______  ______  ______  ______  ______  ______
-DATA0  ><__G0__><__R5__><__R4__><__R3__><__R2__><__R1__><__R0__><
-DATA1  ><__B1__><__B0__><__G5__><__G4__><__G3__><__G2__><__G1__><
-DATA2  ><_CTL2_><_CTL1_><_CTL0_><__B5__><__B4__><__B3__><__B2__><
-DATA3  ><_CTL3_><__B7__><__B6__><__G7__><__G6__><__R7__><__R6__><
-
-Control signals are mapped as follows.
-
-CTL0: HSync
-CTL1: VSync
-CTL2: Data Enable
-CTL3: 0
-
-
-Example
--------
-
-panel {
-       compatible = "mitsubishi,aa121td01", "panel-lvds";
-
-       width-mm = <261>;
-       height-mm = <163>;
-
-       data-mapping = "jeida-24";
-
-       panel-timing {
-               /* 1280x800 @60Hz */
-               clock-frequency = <71000000>;
-               hactive = <1280>;
-               vactive = <800>;
-               hsync-len = <70>;
-               hfront-porch = <20>;
-               hback-porch = <70>;
-               vsync-len = <5>;
-               vfront-porch = <3>;
-               vback-porch = <15>;
-       };
-
-       port {
-               panel_in: endpoint {
-                       remote-endpoint = <&lvds_encoder>;
-               };
-       };
-};
diff --git a/Documentation/devicetree/bindings/display/panel/panel.txt b/Documentation/devicetree/bindings/display/panel/panel.txt
deleted file mode 100644 (file)
index e2e6867..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-Common display properties
--------------------------
-
-- rotation:    Display rotation in degrees counter clockwise (0,90,180,270)
diff --git a/Documentation/devicetree/bindings/display/panel/pda,91-00156-a0.txt b/Documentation/devicetree/bindings/display/panel/pda,91-00156-a0.txt
deleted file mode 100644 (file)
index 1639fb1..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-PDA 91-00156-A0 5.0" WVGA TFT LCD panel
-
-Required properties:
-- compatible: should be "pda,91-00156-a0"
-- power-supply: this panel requires a single power supply. A phandle to a
-regulator needs to be specified here. Compatible with panel-common binding which
-is specified in the panel-common.txt in this directory.
-- backlight: this panel's backlight is controlled by an external backlight
-controller. A phandle to this controller needs to be specified here.
-Compatible with panel-common binding which is specified in the panel-common.txt
-in this directory.
-
-This binding is compatible with the simple-panel binding, which is specified
-in simple-panel.txt in this directory.
diff --git a/Documentation/devicetree/bindings/display/panel/pda,91-00156-a0.yaml b/Documentation/devicetree/bindings/display/panel/pda,91-00156-a0.yaml
new file mode 100644 (file)
index 0000000..ccd3623
--- /dev/null
@@ -0,0 +1,31 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/panel/pda,91-00156-a0.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: PDA 91-00156-A0 5.0" WVGA TFT LCD panel
+
+maintainers:
+  - Cristian Birsan <cristian.birsan@microchip.com>
+  - Thierry Reding <thierry.reding@gmail.com>
+
+allOf:
+  - $ref: panel-common.yaml#
+
+properties:
+  compatible:
+    const: pda,91-00156-a0
+
+  power-supply: true
+  backlight: true
+  port: true
+
+additionalProperties: false
+
+required:
+  - compatible
+  - power-supply
+  - backlight
+
+...
diff --git a/Documentation/devicetree/bindings/display/panel/raspberrypi,7inch-touchscreen.txt b/Documentation/devicetree/bindings/display/panel/raspberrypi,7inch-touchscreen.txt
deleted file mode 100644 (file)
index e9e19c0..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-This binding covers the official 7" (800x480) Raspberry Pi touchscreen
-panel.
-
-This DSI panel contains:
-
-- TC358762 DSI->DPI bridge
-- Atmel microcontroller on I2C for power sequencing the DSI bridge and
-  controlling backlight
-- Touchscreen controller on I2C for touch input
-
-and this binding covers the DSI display parts but not its touch input.
-
-Required properties:
-- compatible:  Must be "raspberrypi,7inch-touchscreen-panel"
-- reg:         Must be "45"
-- port:                See panel-common.txt
-
-Example:
-
-dsi1: dsi@7e700000 {
-       #address-cells = <1>;
-       #size-cells = <0>;
-       <...>
-
-       port {
-               dsi_out_port: endpoint {
-                       remote-endpoint = <&panel_dsi_port>;
-               };
-       };
-};
-
-i2c_dsi: i2c {
-       compatible = "i2c-gpio";
-       #address-cells = <1>;
-       #size-cells = <0>;
-       gpios = <&gpio 28 0
-                &gpio 29 0>;
-
-       lcd@45 {
-               compatible = "raspberrypi,7inch-touchscreen-panel";
-               reg = <0x45>;
-
-               port {
-                       panel_dsi_port: endpoint {
-                               remote-endpoint = <&dsi_out_port>;
-                       };
-               };
-       };
-};
diff --git a/Documentation/devicetree/bindings/display/panel/raspberrypi,7inch-touchscreen.yaml b/Documentation/devicetree/bindings/display/panel/raspberrypi,7inch-touchscreen.yaml
new file mode 100644 (file)
index 0000000..22a083f
--- /dev/null
@@ -0,0 +1,71 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/panel/raspberrypi,7inch-touchscreen.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: The official 7" (800x480) Raspberry Pi touchscreen
+
+maintainers:
+  - Eric Anholt <eric@anholt.net>
+  - Thierry Reding <thierry.reding@gmail.com>
+
+description: |+
+  This DSI panel contains:
+
+  - TC358762 DSI->DPI bridge
+  - Atmel microcontroller on I2C for power sequencing the DSI bridge and
+    controlling backlight
+  - Touchscreen controller on I2C for touch input
+
+  and this binding covers the DSI display parts but not its touch input.
+
+properties:
+  compatible:
+    const: raspberrypi,7inch-touchscreen-panel
+
+  reg:
+    const: 0x45
+
+  port: true
+
+required:
+  - compatible
+  - reg
+  - port
+
+additionalProperties: false
+
+examples:
+  - |+
+    dsi1: dsi {
+      #address-cells = <1>;
+      #size-cells = <0>;
+
+      port {
+        dsi_out_port: endpoint {
+          remote-endpoint = <&panel_dsi_port>;
+        };
+      };
+    };
+
+    i2c_dsi: i2c {
+      compatible = "i2c-gpio";
+      #address-cells = <1>;
+      #size-cells = <0>;
+      scl-gpios = <&gpio 28 0>;
+      sda-gpios = <&gpio 29 0>;
+
+      lcd@45 {
+        compatible = "raspberrypi,7inch-touchscreen-panel";
+        reg = <0x45>;
+
+        port {
+          panel_dsi_port: endpoint {
+            remote-endpoint = <&dsi_out_port>;
+          };
+        };
+      };
+    };
+
+...
diff --git a/Documentation/devicetree/bindings/display/panel/raydium,rm67191.txt b/Documentation/devicetree/bindings/display/panel/raydium,rm67191.txt
new file mode 100644 (file)
index 0000000..1042469
--- /dev/null
@@ -0,0 +1,41 @@
+Raydium RM67171 OLED LCD panel with MIPI-DSI protocol
+
+Required properties:
+- compatible:          "raydium,rm67191"
+- reg:                 virtual channel for MIPI-DSI protocol
+                       must be <0>
+- dsi-lanes:           number of DSI lanes to be used
+                       must be <3> or <4>
+- port:                input port node with endpoint definition as
+                       defined in Documentation/devicetree/bindings/graph.txt;
+                       the input port should be connected to a MIPI-DSI device
+                       driver
+
+Optional properties:
+- reset-gpios:         a GPIO spec for the RST_B GPIO pin
+- v3p3-supply:         phandle to 3.3V regulator that powers the VDD_3V3 pin
+- v1p8-supply:         phandle to 1.8V regulator that powers the VDD_1V8 pin
+- width-mm:            see panel-common.txt
+- height-mm:           see panel-common.txt
+- video-mode:          0 - burst-mode
+                       1 - non-burst with sync event
+                       2 - non-burst with sync pulse
+
+Example:
+
+       panel@0 {
+               compatible = "raydium,rm67191";
+               reg = <0>;
+               pinctrl-0 = <&pinctrl_mipi_dsi_0_1_en>;
+               pinctrl-names = "default";
+               reset-gpios = <&gpio1 7 GPIO_ACTIVE_LOW>;
+               dsi-lanes = <4>;
+               width-mm = <68>;
+               height-mm = <121>;
+
+               port {
+                       panel_in: endpoint {
+                               remote-endpoint = <&mipi_out>;
+                       };
+               };
+       };
index 1b5763200cf6b22a2c1e0da914a92e822ab118b5..a372c5d8469565d1ed80793e9a32a63f6efe4b05 100644 (file)
@@ -5,6 +5,9 @@ Required properties:
 - reg: DSI virtual channel of the peripheral
 - reset-gpios: panel reset gpio
 - backlight: phandle of the backlight device attached to the panel
+- vcc-supply: phandle of the regulator that provides the vcc supply voltage.
+- iovcc-supply: phandle of the regulator that provides the iovcc supply
+  voltage.
 
 Example:
 
@@ -14,5 +17,7 @@ Example:
                        reg = <0>;
                        backlight = <&backlight>;
                        reset-gpios = <&gpio3 13 GPIO_ACTIVE_LOW>;
+                       vcc-supply = <&reg_2v8_p>;
+                       iovcc-supply = <&reg_1v8_p>;
                };
        };
diff --git a/Documentation/devicetree/bindings/display/panel/sgd,gktw70sdae4se.txt b/Documentation/devicetree/bindings/display/panel/sgd,gktw70sdae4se.txt
deleted file mode 100644 (file)
index d06644b..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-Solomon Goldentek Display GKTW70SDAE4SE LVDS Display Panel
-==========================================================
-
-The GKTW70SDAE4SE is a 7" WVGA TFT-LCD display panel.
-
-These DT bindings follow the LVDS panel bindings defined in panel-lvds.txt
-with the following device-specific properties.
-
-Required properties:
-
-- compatible: Shall contain "sgd,gktw70sdae4se" and "panel-lvds", in that order.
-
-Example
--------
-
-panel {
-       compatible = "sgd,gktw70sdae4se", "panel-lvds";
-
-       width-mm = <153>;
-       height-mm = <86>;
-
-       data-mapping = "jeida-18";
-
-       panel-timing {
-               clock-frequency = <32000000>;
-               hactive = <800>;
-               vactive = <480>;
-               hback-porch = <39>;
-               hfront-porch = <39>;
-               vback-porch = <29>;
-               vfront-porch = <13>;
-               hsync-len = <47>;
-               vsync-len = <2>;
-       };
-
-       port {
-               panel_in: endpoint {
-                       remote-endpoint = <&lvds_encoder>;
-               };
-       };
-};
diff --git a/Documentation/devicetree/bindings/display/panel/sgd,gktw70sdae4se.yaml b/Documentation/devicetree/bindings/display/panel/sgd,gktw70sdae4se.yaml
new file mode 100644 (file)
index 0000000..e63a570
--- /dev/null
@@ -0,0 +1,68 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/panel/sgd,gktw70sdae4se.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Solomon Goldentek Display GKTW70SDAE4SE 7" WVGA LVDS Display Panel
+
+maintainers:
+  - Neil Armstrong <narmstrong@baylibre.com>
+  - Thierry Reding <thierry.reding@gmail.com>
+
+allOf:
+  - $ref: lvds.yaml#
+
+properties:
+  compatible:
+    items:
+      - const: sgd,gktw70sdae4se
+      - {} # panel-lvds, but not listed here to avoid false select
+
+  data-mapping:
+    const: jeida-18
+
+  width-mm:
+    const: 153
+
+  height-mm:
+    const: 86
+
+  panel-timing: true
+  port: true
+
+additionalProperties: false
+
+required:
+  - compatible
+
+examples:
+  - |+
+    panel {
+      compatible = "sgd,gktw70sdae4se", "panel-lvds";
+
+      width-mm = <153>;
+      height-mm = <86>;
+
+      data-mapping = "jeida-18";
+
+      panel-timing {
+        clock-frequency = <32000000>;
+        hactive = <800>;
+        vactive = <480>;
+        hback-porch = <39>;
+        hfront-porch = <39>;
+        vback-porch = <29>;
+        vfront-porch = <13>;
+        hsync-len = <47>;
+        vsync-len = <2>;
+      };
+
+      port {
+        panel_in: endpoint {
+          remote-endpoint = <&lvds_encoder>;
+        };
+      };
+    };
+
+...
diff --git a/Documentation/devicetree/bindings/display/panel/sharp,lq070y3dg3b.txt b/Documentation/devicetree/bindings/display/panel/sharp,lq070y3dg3b.txt
new file mode 100644 (file)
index 0000000..95534b5
--- /dev/null
@@ -0,0 +1,12 @@
+Sharp LQ070Y3DG3B 7.0" WVGA landscape TFT LCD panel
+
+Required properties:
+- compatible: should be "sharp,lq070y3dg3b"
+
+Optional properties:
+- enable-gpios: GPIO pin to enable or disable the panel
+- backlight: phandle of the backlight device attached to the panel
+- power-supply: phandle of the regulator that provides the supply voltage
+
+This binding is compatible with the simple-panel binding, which is specified
+in simple-panel.txt in this directory.
diff --git a/Documentation/devicetree/bindings/display/panel/sharp,ls020b1dd01d.txt b/Documentation/devicetree/bindings/display/panel/sharp,ls020b1dd01d.txt
new file mode 100644 (file)
index 0000000..e45edbc
--- /dev/null
@@ -0,0 +1,12 @@
+Sharp 2.0" (240x160 pixels) 16-bit TFT LCD panel
+
+Required properties:
+- compatible: should be "sharp,ls020b1dd01d"
+- power-supply: as specified in the base binding
+
+Optional properties:
+- backlight: as specified in the base binding
+- enable-gpios: as specified in the base binding
+
+This binding is compatible with the simple-panel binding, which is specified
+in simple-panel.txt in this directory.
index b2b872c710f24d69996eb3cb4922ba8dd3915a14..e11208fb7da8d0ccb4d38a41c411a20f98fe4137 100644 (file)
@@ -1,28 +1 @@
-Simple display panel
-====================
-
-panel node
-----------
-
-Required properties:
-- power-supply: See panel-common.txt
-
-Optional properties:
-- ddc-i2c-bus: phandle of an I2C controller used for DDC EDID probing
-- enable-gpios: GPIO pin to enable or disable the panel
-- backlight: phandle of the backlight device attached to the panel
-- no-hpd: This panel is supposed to communicate that it's ready via HPD
-  (hot plug detect) signal, but the signal isn't hooked up so we should
-  hardcode the max delay from the panel spec when powering up the panel.
-
-Example:
-
-       panel: panel {
-               compatible = "cptt,claa101wb01";
-               ddc-i2c-bus = <&panelddc>;
-
-               power-supply = <&vdd_pnl_reg>;
-               enable-gpios = <&gpio 90 0>;
-
-               backlight = <&backlight>;
-       };
+See panel-common.yaml in this directory.
diff --git a/Documentation/devicetree/bindings/display/panel/tfc,s9700rtwv43tr-01b.txt b/Documentation/devicetree/bindings/display/panel/tfc,s9700rtwv43tr-01b.txt
deleted file mode 100644 (file)
index dfb572f..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-TFC S9700RTWV43TR-01B 7" Three Five Corp 800x480 LCD panel with
-resistive touch
-
-The panel is found on TI AM335x-evm.
-
-Required properties:
-- compatible: should be "tfc,s9700rtwv43tr-01b"
-- power-supply: See panel-common.txt
-
-Optional properties:
-- enable-gpios: GPIO pin to enable or disable the panel, if there is one
-- backlight: phandle of the backlight device attached to the panel
-
-This binding is compatible with the simple-panel binding, which is specified
-in simple-panel.txt in this directory.
diff --git a/Documentation/devicetree/bindings/display/panel/tfc,s9700rtwv43tr-01b.yaml b/Documentation/devicetree/bindings/display/panel/tfc,s9700rtwv43tr-01b.yaml
new file mode 100644 (file)
index 0000000..9e59944
--- /dev/null
@@ -0,0 +1,33 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/panel/tfc,s9700rtwv43tr-01b.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: TFC S9700RTWV43TR-01B 7" Three Five Corp 800x480 LCD panel with resistive touch
+
+maintainers:
+  - Jyri Sarha <jsarha@ti.com>
+  - Thierry Reding <thierry.reding@gmail.com>
+
+description: |+
+  The panel is found on TI AM335x-evm.
+
+allOf:
+  - $ref: panel-common.yaml#
+
+properties:
+  compatible:
+    const: tfc,s9700rtwv43tr-01b
+
+  enable-gpios: true
+  backlight: true
+  port: true
+
+additionalProperties: false
+
+required:
+  - compatible
+  - power-supply
+
+...
diff --git a/Documentation/devicetree/bindings/display/panel/tpo,tpg110.txt b/Documentation/devicetree/bindings/display/panel/tpo,tpg110.txt
deleted file mode 100644 (file)
index 40f3d7c..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-TPO TPG110 Panel
-================
-
-This panel driver is a component that acts as an intermediary
-between an RGB output and a variety of panels. The panel
-driver is strapped up in electronics to the desired resolution
-and other properties, and has a control interface over 3WIRE
-SPI. By talking to the TPG110 over SPI, the strapped properties
-can be discovered and the hardware is therefore mostly
-self-describing.
-
-       +--------+
-SPI -> |  TPO   | -> physical display
-RGB -> | TPG110 |
-       +--------+
-
-If some electrical strap or alternate resolution is desired,
-this can be set up by taking software control of the display
-over the SPI interface. The interface can also adjust
-for properties of the display such as gamma correction and
-certain electrical driving levels.
-
-The TPG110 does not know the physical dimensions of the panel
-connected, so this needs to be specified in the device tree.
-
-It requires a GPIO line for control of its reset line.
-
-The serial protocol has line names that resemble I2C but the
-protocol is not I2C but 3WIRE SPI.
-
-Required properties:
-- compatible : one of:
-  "ste,nomadik-nhk15-display", "tpo,tpg110"
-  "tpo,tpg110"
-- grestb-gpios : panel reset GPIO
-- width-mm : see display/panel/panel-common.txt
-- height-mm : see display/panel/panel-common.txt
-
-The device needs to be a child of an SPI bus, see
-spi/spi-bus.txt. The SPI child must set the following
-properties:
-- spi-3wire
-- spi-max-frequency = <3000000>;
-as these are characteristics of this device.
-
-The device node can contain one 'port' child node with one child
-'endpoint' node, according to the bindings defined in
-media/video-interfaces.txt. This node should describe panel's video bus.
-
-Example
--------
-
-panel: display@0 {
-       compatible = "tpo,tpg110";
-       reg = <0>;
-       spi-3wire;
-       /* 320 ns min period ~= 3 MHz */
-       spi-max-frequency = <3000000>;
-       /* Width and height from data sheet */
-       width-mm = <116>;
-       height-mm = <87>;
-       grestb-gpios = <&foo_gpio 5 GPIO_ACTIVE_LOW>;
-       backlight = <&bl>;
-
-       port {
-               nomadik_clcd_panel: endpoint {
-                       remote-endpoint = <&foo>;
-               };
-       };
-};
diff --git a/Documentation/devicetree/bindings/display/panel/tpo,tpg110.yaml b/Documentation/devicetree/bindings/display/panel/tpo,tpg110.yaml
new file mode 100644 (file)
index 0000000..a51660b
--- /dev/null
@@ -0,0 +1,101 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/panel/tpo,tpg110.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: TPO TPG110 Panel
+
+maintainers:
+  - Linus Walleij <linus.walleij@linaro.org>
+  - Thierry Reding <thierry.reding@gmail.com>
+
+description: |+
+  This panel driver is a component that acts as an intermediary
+  between an RGB output and a variety of panels. The panel
+  driver is strapped up in electronics to the desired resolution
+  and other properties, and has a control interface over 3WIRE
+  SPI. By talking to the TPG110 over SPI, the strapped properties
+  can be discovered and the hardware is therefore mostly
+  self-describing.
+
+         +--------+
+  SPI -> |  TPO   | -> physical display
+  RGB -> | TPG110 |
+         +--------+
+
+  If some electrical strap or alternate resolution is desired,
+  this can be set up by taking software control of the display
+  over the SPI interface. The interface can also adjust
+  for properties of the display such as gamma correction and
+  certain electrical driving levels.
+
+  The TPG110 does not know the physical dimensions of the panel
+  connected, so this needs to be specified in the device tree.
+
+  It requires a GPIO line for control of its reset line.
+
+  The serial protocol has line names that resemble I2C but the
+  protocol is not I2C but 3WIRE SPI.
+
+
+allOf:
+  - $ref: panel-common.yaml#
+
+properties:
+  compatible:
+    oneOf:
+      - items:
+          - enum:
+              - ste,nomadik-nhk15-display
+          - const: tpo,tpg110
+      - const: tpo,tpg110
+
+  reg: true
+
+  grestb-gpios:
+    maxItems: 1
+    description: panel reset GPIO
+
+  spi-3wire: true
+
+  spi-max-frequency:
+    const: 3000000
+
+required:
+  - compatible
+  - reg
+  - grestb-gpios
+  - width-mm
+  - height-mm
+  - spi-3wire
+  - spi-max-frequency
+  - port
+
+examples:
+  - |+
+    spi {
+      #address-cells = <1>;
+      #size-cells = <0>;
+
+      panel: display@0 {
+        compatible = "tpo,tpg110";
+        reg = <0>;
+        spi-3wire;
+        /* 320 ns min period ~= 3 MHz */
+        spi-max-frequency = <3000000>;
+        /* Width and height from data sheet */
+        width-mm = <116>;
+        height-mm = <87>;
+        grestb-gpios = <&foo_gpio 5 1>;
+        backlight = <&bl>;
+
+        port {
+          nomadik_clcd_panel: endpoint {
+            remote-endpoint = <&foo>;
+          };
+        };
+      };
+    };
+
+...
index da6939efdb43a47039e63be0634894228b17fc94..7849ff039229636a9df5dd3d8bf8cd57aba7bd08 100644 (file)
@@ -32,17 +32,6 @@ Their connections are modeled using the OF graph bindings specified in
 - video port 0 for the VOP input, the remote endpoint maybe vopb or vopl
 - video port 1 for either a panel or subsequent encoder
 
-the lvds panel described by
-       Documentation/devicetree/bindings/display/panel/simple-panel.txt
-
-Panel required properties:
-- ports for remote LVDS output
-
-Panel optional properties:
-- data-mapping: should be "vesa-24","jeida-24" or "jeida-18".
-This describes decribed by:
-       Documentation/devicetree/bindings/display/panel/panel-lvds.txt
-
 Example:
 
 lvds_panel: lvds-panel {
index c8ebd4f66a6a6369ecffd937762adb158f42af8b..b664f054c259aa48810d27a8fc74482847e4c050 100644 (file)
@@ -433,43 +433,11 @@ PRIME is the cross device buffer sharing framework in drm, originally
 created for the OPTIMUS range of multi-gpu platforms. To userspace PRIME
 buffers are dma-buf based file descriptors.
 
-Overview and Driver Interface
------------------------------
+Overview and Lifetime Rules
+---------------------------
 
-Similar to GEM global names, PRIME file descriptors are also used to
-share buffer objects across processes. They offer additional security:
-as file descriptors must be explicitly sent over UNIX domain sockets to
-be shared between applications, they can't be guessed like the globally
-unique GEM names.
-
-Drivers that support the PRIME API must set the DRIVER_PRIME bit in the
-struct :c:type:`struct drm_driver <drm_driver>`
-driver_features field, and implement the prime_handle_to_fd and
-prime_fd_to_handle operations.
-
-int (\*prime_handle_to_fd)(struct drm_device \*dev, struct drm_file
-\*file_priv, uint32_t handle, uint32_t flags, int \*prime_fd); int
-(\*prime_fd_to_handle)(struct drm_device \*dev, struct drm_file
-\*file_priv, int prime_fd, uint32_t \*handle); Those two operations
-convert a handle to a PRIME file descriptor and vice versa. Drivers must
-use the kernel dma-buf buffer sharing framework to manage the PRIME file
-descriptors. Similar to the mode setting API PRIME is agnostic to the
-underlying buffer object manager, as long as handles are 32bit unsigned
-integers.
-
-While non-GEM drivers must implement the operations themselves, GEM
-drivers must use the :c:func:`drm_gem_prime_handle_to_fd()` and
-:c:func:`drm_gem_prime_fd_to_handle()` helper functions. Those
-helpers rely on the driver gem_prime_export and gem_prime_import
-operations to create a dma-buf instance from a GEM object (dma-buf
-exporter role) and to create a GEM object from a dma-buf instance
-(dma-buf importer role).
-
-struct dma_buf \* (\*gem_prime_export)(struct drm_device \*dev,
-struct drm_gem_object \*obj, int flags); struct drm_gem_object \*
-(\*gem_prime_import)(struct drm_device \*dev, struct dma_buf
-\*dma_buf); These two operations are mandatory for GEM drivers that
-support PRIME.
+.. kernel-doc:: drivers/gpu/drm/drm_prime.c
+   :doc: overview and lifetime rules
 
 PRIME Helper Functions
 ----------------------
index fccbe375244d8c10767f83b4d6da4ac09366022f..25a56e9c0cfdc1cebea3421034125b573fad1a23 100644 (file)
@@ -51,6 +51,22 @@ and "FIXME" where the interface could be cleaned up.
 
 Also read the :ref:`guidelines for the kernel documentation at large <doc_guide>`.
 
+Documentation Requirements for kAPI
+-----------------------------------
+
+All kernel APIs exported to other modules must be documented, including their
+datastructures and at least a short introductory section explaining the overall
+concepts. Documentation should be put into the code itself as kerneldoc comments
+as much as reasonable.
+
+Do not blindly document everything, but document only what's relevant for driver
+authors: Internal functions of drm.ko and definitely static functions should not
+have formal kerneldoc comments. Use normal C comments if you feel like a comment
+is warranted. You may use kerneldoc syntax in the comment, but it shall not
+start with a /** kerneldoc marker. Similar for data structures, annotate
+anything entirely private with ``/* private: */`` comments as per the
+documentation guide.
+
 Getting Started
 ===============
 
index 0a49c5a1d9ce991616eee7bd314ec5a1ec1b27f8..a38639e96e8b6cda1a9945abcdaed1c2a9772592 100644 (file)
@@ -162,7 +162,7 @@ Clean up mmap forwarding
 
 A lot of drivers forward gem mmap calls to dma-buf mmap for imported buffers.
 And also a lot of them forward dma-buf mmap to the gem mmap implementations.
-Would be great to refactor this all into a set of small common helpers.
+There's drm_gem_prime_mmap() for this now, but still needs to be rolled out.
 
 Contact: Daniel Vetter
 
@@ -215,22 +215,13 @@ efficient.
 
 Contact: Daniel Vetter
 
-Defaults for .gem_prime_import and export
------------------------------------------
-
-Most drivers don't need to set drm_driver->gem_prime_import and
-->gem_prime_export now that drm_gem_prime_import() and drm_gem_prime_export()
-are the default.
-
 struct drm_gem_object_funcs
 ---------------------------
 
 GEM objects can now have a function table instead of having the callbacks on the
 DRM driver struct. This is now the preferred way and drivers can be moved over.
 
-DRM_GEM_CMA_VMAP_DRIVER_OPS, DRM_GEM_SHMEM_DRIVER_OPS already support this, but
-DRM_GEM_VRAM_DRIVER_PRIME does not yet and needs to be aligned with the previous
-two. We also need a 2nd version of the CMA define that doesn't require the
+We also need a 2nd version of the CMA define that doesn't require the
 vmapping to be present (different hook for prime importing). Plus this needs to
 be rolled out to all drivers using their own implementations, too.
 
@@ -317,19 +308,6 @@ In the end no .c file should need to include ``drmP.h`` anymore.
 
 Contact: Daniel Vetter
 
-Add missing kerneldoc for exported functions
---------------------------------------------
-
-The DRM reference documentation is still lacking kerneldoc in a few areas. The
-task would be to clean up interfaces like moving functions around between
-files to better group them and improving the interfaces like dropping return
-values for functions that never fail. Then write kerneldoc for all exported
-functions and an overview section and integrate it all into the drm book.
-
-See https://dri.freedesktop.org/docs/drm/ for what's there already.
-
-Contact: Daniel Vetter
-
 Make panic handling work
 ------------------------
 
@@ -393,6 +371,9 @@ There's a bunch of issues with it:
   this (together with the drm_minor->drm_device move) would allow us to remove
   debugfs_init.
 
+- Drop the return code and error checking from all debugfs functions. Greg KH is
+  working on this already.
+
 Contact: Daniel Vetter
 
 KMS cleanups
@@ -440,6 +421,19 @@ fit the available time.
 
 Contact: Daniel Vetter
 
+Backlight Refactoring
+---------------------
+
+Backlight drivers have a triple enable/disable state, which is a bit overkill.
+Plan to fix this:
+
+1. Roll out backlight_enable() and backlight_disable() helpers everywhere. This
+   has started already.
+2. In all, only look at one of the three status bits set by the above helpers.
+3. Remove the other two status bits.
+
+Contact: Daniel Vetter
+
 Driver Specific
 ===============
 
@@ -449,20 +443,6 @@ tinydrm
 Tinydrm is the helper driver for really simple fb drivers. The goal is to make
 those drivers as simple as possible, so lots of room for refactoring:
 
-- backlight helpers, probably best to put them into a new drm_backlight.c.
-  This is because drivers/video is de-facto unmaintained. We could also
-  move drivers/video/backlight to drivers/gpu/backlight and take it all
-  over within drm-misc, but that's more work. Backlight helpers require a fair
-  bit of reworking and refactoring. A simple example is the enabling of a backlight.
-  Tinydrm has helpers for this. It would be good if other drivers can also use the
-  helper. However, there are various cases we need to consider i.e different
-  drivers seem to have different ways of enabling/disabling a backlight.
-  We also need to consider the backlight drivers (like gpio_backlight). The situation
-  is further complicated by the fact that the backlight is tied to fbdev
-  via fb_notifier_callback() which has complicated logic. For further details, refer
-  to the following discussion thread:
-  https://groups.google.com/forum/#!topic/outreachy-kernel/8rBe30lwtdA
-
 - spi helpers, probably best put into spi core/helper code. Thierry said
   the spi maintainer is fast&reactive, so shouldn't be a big issue.
 
index ab1a48a5ae80bdabb841532280b2ec0f4903e064..f4f8de31ac6306f07db2194e43aecdca5472a659 100644 (file)
@@ -1305,6 +1305,113 @@ The following tables list existing packed RGB formats.
       - g\ :sub:`6`
       - g\ :sub:`5`
       - g\ :sub:`4`
+    * .. _MEDIA-BUS-FMT-RGB888-3X8:
+
+      - MEDIA_BUS_FMT_RGB888_3X8
+      - 0x101c
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      - r\ :sub:`7`
+      - r\ :sub:`6`
+      - r\ :sub:`5`
+      - r\ :sub:`4`
+      - r\ :sub:`3`
+      - r\ :sub:`2`
+      - r\ :sub:`1`
+      - r\ :sub:`0`
+    * -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      - g\ :sub:`7`
+      - g\ :sub:`6`
+      - g\ :sub:`5`
+      - g\ :sub:`4`
+      - g\ :sub:`3`
+      - g\ :sub:`2`
+      - g\ :sub:`1`
+      - g\ :sub:`0`
+    * -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      - b\ :sub:`7`
+      - b\ :sub:`6`
+      - b\ :sub:`5`
+      - b\ :sub:`4`
+      - b\ :sub:`3`
+      - b\ :sub:`2`
+      - b\ :sub:`1`
+      - b\ :sub:`0`
     * .. _MEDIA-BUS-FMT-ARGB888-1X32:
 
       - MEDIA_BUS_FMT_ARGB888_1X32
index 783569e3c4b48752c3555e9bee6fbc87adad5117..7aae5926a388d435a450219cd1e43855005c6a37 100644 (file)
@@ -5095,6 +5095,12 @@ S:       Maintained
 F:     drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
 F:     Documentation/devicetree/bindings/display/panel/feiyang,fy07024di26a30d.txt
 
+DRM DRIVER FOR GRAIN MEDIA GM12U320 PROJECTORS
+M:     Hans de Goede <hdegoede@redhat.com>
+T:     git git://anongit.freedesktop.org/drm/drm-misc
+S:     Maintained
+F:     drivers/gpu/drm/gm12u320/
+
 DRM DRIVER FOR ILITEK ILI9225 PANELS
 M:     David Lechner <david@lechnology.com>
 S:     Maintained
@@ -5181,6 +5187,12 @@ S:       Maintained
 F:     drivers/gpu/drm/qxl/
 F:     include/uapi/drm/qxl_drm.h
 
+DRM DRIVER FOR RAYDIUM RM67191 PANELS
+M:     Robert Chiras <robert.chiras@nxp.com>
+S:     Maintained
+F:     drivers/gpu/drm/panel/panel-raydium-rm67191.c
+F:     Documentation/devicetree/bindings/display/panel/raydium,rm67191.txt
+
 DRM DRIVER FOR RAGE 128 VIDEO CARDS
 S:     Orphan / Obsolete
 F:     drivers/gpu/drm/r128/
@@ -5188,6 +5200,7 @@ F:        include/uapi/drm/r128_drm.h
 
 DRM DRIVER FOR ROCKTECH JH057N00900 PANELS
 M:     Guido Günther <agx@sigxcpu.org>
+R:     Purism Kernel Team <kernel@puri.sm>
 S:     Maintained
 F:     drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
 F:     Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.txt
@@ -5236,7 +5249,7 @@ M:        Linus Walleij <linus.walleij@linaro.org>
 T:     git git://anongit.freedesktop.org/drm/drm-misc
 S:     Maintained
 F:     drivers/gpu/drm/panel/panel-tpo-tpg110.c
-F:     Documentation/devicetree/bindings/display/panel/tpo,tpg110.txt
+F:     Documentation/devicetree/bindings/display/panel/tpo,tpg110.yaml
 
 DRM DRIVER FOR USB DISPLAYLINK VIDEO ADAPTERS
 M:     Dave Airlie <airlied@redhat.com>
@@ -5324,6 +5337,7 @@ F:        Documentation/gpu/meson.rst
 T:     git git://anongit.freedesktop.org/drm/drm-misc
 
 DRM DRIVERS FOR ATMEL HLCDC
+M:     Sam Ravnborg <sam@ravnborg.org>
 M:     Boris Brezillon <bbrezillon@kernel.org>
 L:     dri-devel@lists.freedesktop.org
 S:     Supported
@@ -5333,7 +5347,10 @@ T:       git git://anongit.freedesktop.org/drm/drm-misc
 
 DRM DRIVERS FOR BRIDGE CHIPS
 M:     Andrzej Hajda <a.hajda@samsung.com>
+M:     Neil Armstrong <narmstrong@baylibre.com>
 R:     Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
+R:     Jonas Karlman <jonas@kwiboo.se>
+R:     Jernej Skrabec <jernej.skrabec@siol.net>
 S:     Maintained
 T:     git git://anongit.freedesktop.org/drm/drm-misc
 F:     drivers/gpu/drm/bridge/
index 4447e13d1e891881f8ff6046ae442333b2293e30..c71b85c8c159292845ee0c1fb33441c00cb46144 100644 (file)
@@ -55,6 +55,51 @@ EXPORT_SYMBOL(reservation_seqcount_class);
 const char reservation_seqcount_string[] = "reservation_seqcount";
 EXPORT_SYMBOL(reservation_seqcount_string);
 
+/**
+ * reservation_object_init - initialize a reservation object
+ * @obj: the reservation object
+ */
+void reservation_object_init(struct reservation_object *obj)
+{
+       ww_mutex_init(&obj->lock, &reservation_ww_class);
+
+       __seqcount_init(&obj->seq, reservation_seqcount_string,
+                       &reservation_seqcount_class);
+       RCU_INIT_POINTER(obj->fence, NULL);
+       RCU_INIT_POINTER(obj->fence_excl, NULL);
+}
+EXPORT_SYMBOL(reservation_object_init);
+
+/**
+ * reservation_object_fini - destroys a reservation object
+ * @obj: the reservation object
+ */
+void reservation_object_fini(struct reservation_object *obj)
+{
+       int i;
+       struct reservation_object_list *fobj;
+       struct dma_fence *excl;
+
+       /*
+        * This object should be dead and all references must have
+        * been released to it, so no need to be protected with rcu.
+        */
+       excl = rcu_dereference_protected(obj->fence_excl, 1);
+       if (excl)
+               dma_fence_put(excl);
+
+       fobj = rcu_dereference_protected(obj->fence, 1);
+       if (fobj) {
+               for (i = 0; i < fobj->shared_count; ++i)
+                       dma_fence_put(rcu_dereference_protected(fobj->shared[i], 1));
+
+               kfree(fobj);
+       }
+
+       ww_mutex_destroy(&obj->lock);
+}
+EXPORT_SYMBOL(reservation_object_fini);
+
 /**
  * reservation_object_reserve_shared - Reserve space to add shared fences to
  * a reservation_object.
@@ -108,23 +153,25 @@ int reservation_object_reserve_shared(struct reservation_object *obj,
                        RCU_INIT_POINTER(new->shared[j++], fence);
        }
        new->shared_count = j;
-       new->shared_max = max;
+       new->shared_max =
+               (ksize(new) - offsetof(typeof(*new), shared)) /
+               sizeof(*new->shared);
 
-       preempt_disable();
-       write_seqcount_begin(&obj->seq);
        /*
-        * RCU_INIT_POINTER can be used here,
-        * seqcount provides the necessary barriers
+        * We are not changing the effective set of fences here so can
+        * merely update the pointer to the new array; both existing
+        * readers and new readers will see exactly the same set of
+        * active (unsignaled) shared fences. Individual fences and the
+        * old array are protected by RCU and so will not vanish under
+        * the gaze of the rcu_read_lock() readers.
         */
-       RCU_INIT_POINTER(obj->fence, new);
-       write_seqcount_end(&obj->seq);
-       preempt_enable();
+       rcu_assign_pointer(obj->fence, new);
 
        if (!old)
                return 0;
 
        /* Drop the references to the signaled fences */
-       for (i = k; i < new->shared_max; ++i) {
+       for (i = k; i < max; ++i) {
                struct dma_fence *fence;
 
                fence = rcu_dereference_protected(new->shared[i],
index 1d80222587ad2a8553c24ddeed23db1abadac907..f96b09333fadc2de72c8bb69c7f22d176e63a0ea 100644 (file)
@@ -354,6 +354,8 @@ source "drivers/gpu/drm/aspeed/Kconfig"
 
 source "drivers/gpu/drm/mcde/Kconfig"
 
+source "drivers/gpu/drm/gm12u320/Kconfig"
+
 # Keep legacy drivers last
 
 menuconfig DRM_LEGACY
index 9f0d2ee35794070ce01cba6037a152525278a965..9728900fb3a2b3fe44039f561259a6ada4c8cb5d 100644 (file)
@@ -120,3 +120,4 @@ obj-$(CONFIG_DRM_LIMA)  += lima/
 obj-$(CONFIG_DRM_PANFROST) += panfrost/
 obj-$(CONFIG_DRM_ASPEED_GFX) += aspeed/
 obj-$(CONFIG_DRM_MCDE) += mcde/
+obj-$(CONFIG_DRM_GM12U320) += gm12u320/
index 489041df1f45636da40966578799e5cecf39bcb5..4809d4a5d72a7a349b70da8b5d125a9e702725e4 100644 (file)
@@ -345,8 +345,7 @@ const struct dma_buf_ops amdgpu_dmabuf_ops = {
  * Returns:
  * Shared DMA buffer representing the GEM BO from the given device.
  */
-struct dma_buf *amdgpu_gem_prime_export(struct drm_device *dev,
-                                       struct drm_gem_object *gobj,
+struct dma_buf *amdgpu_gem_prime_export(struct drm_gem_object *gobj,
                                        int flags)
 {
        struct amdgpu_bo *bo = gem_to_amdgpu_bo(gobj);
@@ -356,9 +355,9 @@ struct dma_buf *amdgpu_gem_prime_export(struct drm_device *dev,
            bo->flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID)
                return ERR_PTR(-EPERM);
 
-       buf = drm_gem_prime_export(dev, gobj, flags);
+       buf = drm_gem_prime_export(gobj, flags);
        if (!IS_ERR(buf)) {
-               buf->file->f_mapping = dev->anon_inode->i_mapping;
+               buf->file->f_mapping = gobj->dev->anon_inode->i_mapping;
                buf->ops = &amdgpu_dmabuf_ops;
        }
 
index c7056cbe8685a779b08deef4362e06af0ea71a02..7f73a4f94204d782cee44be54df0c418d32db43e 100644 (file)
@@ -30,8 +30,7 @@ struct drm_gem_object *
 amdgpu_gem_prime_import_sg_table(struct drm_device *dev,
                                 struct dma_buf_attachment *attach,
                                 struct sg_table *sg);
-struct dma_buf *amdgpu_gem_prime_export(struct drm_device *dev,
-                                       struct drm_gem_object *gobj,
+struct dma_buf *amdgpu_gem_prime_export(struct drm_gem_object *gobj,
                                        int flags);
 struct drm_gem_object *amdgpu_gem_prime_import(struct drm_device *dev,
                                            struct dma_buf *dma_buf);
index f2e8b4238efd49d6efac87b9e2d06801a94aca06..f67b5baed441ebb23367144a379219b04a0ce269 100644 (file)
@@ -1373,7 +1373,7 @@ static struct drm_driver kms_driver = {
        .driver_features =
            DRIVER_USE_AGP | DRIVER_ATOMIC |
            DRIVER_GEM |
-           DRIVER_PRIME | DRIVER_RENDER | DRIVER_MODESET | DRIVER_SYNCOBJ,
+           DRIVER_RENDER | DRIVER_MODESET | DRIVER_SYNCOBJ,
        .load = amdgpu_driver_load_kms,
        .open = amdgpu_driver_open_kms,
        .postclose = amdgpu_driver_postclose_kms,
index af60c6d7a5f4a40aae09d6808031e45167aa31d9..6b7f791685ecf065268d664b73d99f5affb86af5 100644 (file)
@@ -135,8 +135,7 @@ static int arcpgu_debugfs_init(struct drm_minor *minor)
 #endif
 
 static struct drm_driver arcpgu_drm_driver = {
-       .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME |
-                          DRIVER_ATOMIC,
+       .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
        .name = "arcpgu",
        .desc = "ARC PGU Controller",
        .date = "20160219",
@@ -150,8 +149,6 @@ static struct drm_driver arcpgu_drm_driver = {
        .gem_free_object_unlocked = drm_gem_cma_free_object,
        .gem_print_info = drm_gem_cma_print_info,
        .gem_vm_ops = &drm_gem_cma_vm_ops,
-       .gem_prime_export = drm_gem_prime_export,
-       .gem_prime_import = drm_gem_prime_import,
        .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
        .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
        .gem_prime_vmap = drm_gem_cma_prime_vmap,
index 419a8b0e5de8f2fe96be3d9e022e73405eb406f2..89191a555c84dc0e870562586550654b83b0e7fc 100644 (file)
@@ -55,16 +55,13 @@ static irqreturn_t komeda_kms_irq_handler(int irq, void *data)
 }
 
 static struct drm_driver komeda_kms_driver = {
-       .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC |
-                          DRIVER_PRIME | DRIVER_HAVE_IRQ,
+       .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
        .lastclose                      = drm_fb_helper_lastclose,
        .gem_free_object_unlocked       = drm_gem_cma_free_object,
        .gem_vm_ops                     = &drm_gem_cma_vm_ops,
        .dumb_create                    = komeda_gem_cma_dumb_create,
        .prime_handle_to_fd             = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle             = drm_gem_prime_fd_to_handle,
-       .gem_prime_export               = drm_gem_prime_export,
-       .gem_prime_import               = drm_gem_prime_import,
        .gem_prime_get_sg_table         = drm_gem_cma_prime_get_sg_table,
        .gem_prime_import_sg_table      = drm_gem_cma_prime_import_sg_table,
        .gem_prime_vmap                 = drm_gem_cma_prime_vmap,
index 8fc0b884c42885bb7141709828a34424264df417..27c46a2838c53d1c50df2eae718de1a96f3353a3 100644 (file)
@@ -229,9 +229,7 @@ static int hdlcd_debugfs_init(struct drm_minor *minor)
 DEFINE_DRM_GEM_CMA_FOPS(fops);
 
 static struct drm_driver hdlcd_driver = {
-       .driver_features = DRIVER_GEM |
-                          DRIVER_MODESET | DRIVER_PRIME |
-                          DRIVER_ATOMIC,
+       .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
        .irq_handler = hdlcd_irq,
        .irq_preinstall = hdlcd_irq_preinstall,
        .irq_postinstall = hdlcd_irq_postinstall,
@@ -242,8 +240,6 @@ static struct drm_driver hdlcd_driver = {
        .dumb_create = drm_gem_cma_dumb_create,
        .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
-       .gem_prime_export = drm_gem_prime_export,
-       .gem_prime_import = drm_gem_prime_import,
        .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
        .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
        .gem_prime_vmap = drm_gem_cma_prime_vmap,
index f25ec43822772aa3446b7b725002e44486e96a24..c27ff456eddcc2a3feef075edf1b468c495156ea 100644 (file)
@@ -561,15 +561,12 @@ static int malidp_debugfs_init(struct drm_minor *minor)
 #endif //CONFIG_DEBUG_FS
 
 static struct drm_driver malidp_driver = {
-       .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC |
-                          DRIVER_PRIME,
+       .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
        .gem_free_object_unlocked = drm_gem_cma_free_object,
        .gem_vm_ops = &drm_gem_cma_vm_ops,
        .dumb_create = malidp_dumb_create,
        .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
-       .gem_prime_export = drm_gem_prime_export,
-       .gem_prime_import = drm_gem_prime_import,
        .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
        .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
        .gem_prime_vmap = drm_gem_cma_prime_vmap,
index 521464f08ccd6a36a3e89f735ed0ff05bbb145ab..055c92bc88bf53d1f912d91f7723c53ef775da63 100644 (file)
@@ -40,8 +40,7 @@ static struct drm_driver armada_drm_driver = {
        .name                   = "armada-drm",
        .desc                   = "Armada SoC DRM",
        .date                   = "20120730",
-       .driver_features        = DRIVER_GEM | DRIVER_MODESET |
-                                 DRIVER_PRIME | DRIVER_ATOMIC,
+       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
        .ioctls                 = armada_ioctls,
        .fops                   = &armada_drm_fops,
 };
index 874b2968a866d72966d4280a909b41f102a168d0..60c509784fa3bd3cc7b2edc9e7c64bf3e873eff1 100644 (file)
@@ -482,8 +482,7 @@ static const struct dma_buf_ops armada_gem_prime_dmabuf_ops = {
 };
 
 struct dma_buf *
-armada_gem_prime_export(struct drm_device *dev, struct drm_gem_object *obj,
-       int flags)
+armada_gem_prime_export(struct drm_gem_object *obj, int flags)
 {
        DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
 
@@ -492,7 +491,7 @@ armada_gem_prime_export(struct drm_device *dev, struct drm_gem_object *obj,
        exp_info.flags = O_RDWR;
        exp_info.priv = obj;
 
-       return drm_gem_dmabuf_export(dev, &exp_info);
+       return drm_gem_dmabuf_export(obj->dev, &exp_info);
 }
 
 struct drm_gem_object *
index 1dd80540b8cec1613e4640497a7b3204815942f2..de04cc2c8f0e79fbdda95afc8e95c8acac1db46f 100644 (file)
@@ -32,8 +32,7 @@ struct armada_gem_object *armada_gem_alloc_private_object(struct drm_device *,
        size_t);
 int armada_gem_dumb_create(struct drm_file *, struct drm_device *,
        struct drm_mode_create_dumb *);
-struct dma_buf *armada_gem_prime_export(struct drm_device *dev,
-       struct drm_gem_object *obj, int flags);
+struct dma_buf *armada_gem_prime_export(struct drm_gem_object *obj, int flags);
 struct drm_gem_object *armada_gem_prime_import(struct drm_device *,
        struct dma_buf *);
 int armada_gem_map_import(struct armada_gem_object *);
index eeb22eccd1fcb2b0c33d07d7d98dec0a0a439694..ada2f6aca906c9a72ab9b68d8770935933068933 100644 (file)
@@ -194,8 +194,7 @@ static void aspeed_gfx_unload(struct drm_device *drm)
 DEFINE_DRM_GEM_CMA_FOPS(fops);
 
 static struct drm_driver aspeed_gfx_driver = {
-       .driver_features        = DRIVER_GEM | DRIVER_MODESET |
-                               DRIVER_PRIME | DRIVER_ATOMIC,
+       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
        .gem_create_object      = drm_cma_gem_create_object_default_funcs,
        .dumb_create            = drm_gem_cma_dumb_create,
        .prime_handle_to_fd     = drm_gem_prime_handle_to_fd,
index b086dae170131c1610656fb7b0d6258473ec944a..561f7c4199e4a354ec6de7d9c3841561bf1241af 100644 (file)
@@ -3,6 +3,6 @@
 # Makefile for the drm device driver.  This driver provides support for the
 # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
 
-ast-y := ast_drv.o ast_main.o ast_mode.o ast_fb.o ast_ttm.o ast_post.o ast_dp501.o
+ast-y := ast_drv.o ast_main.o ast_mode.o ast_ttm.o ast_post.o ast_dp501.o
 
 obj-$(CONFIG_DRM_AST) := ast.o
index 4c7375b45281124bd3af8bb35c3e752bb5516fe3..98cd69269263f48c1a49e609ef27366d5e885b37 100644 (file)
@@ -1,8 +1,11 @@
 // SPDX-License-Identifier: GPL-2.0
 
+#include <linux/delay.h>
 #include <linux/firmware.h>
-#include <drm/drmP.h>
+#include <linux/module.h>
+
 #include "ast_drv.h"
+
 MODULE_FIRMWARE("ast_dp501_fw.bin");
 
 static int ast_load_dp501_microcode(struct drm_device *dev)
index 3811997e78c451ff8e1507fd57d7eea9676e337c..6ed6ff49efc0707fbaa607468c1038f86159ac56 100644 (file)
 /*
  * Authors: Dave Airlie <airlied@redhat.com>
  */
-#include <linux/module.h>
+
 #include <linux/console.h>
+#include <linux/module.h>
+#include <linux/pci.h>
 
-#include <drm/drmP.h>
 #include <drm/drm_crtc_helper.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_gem_vram_helper.h>
+#include <drm/drm_pci.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_vram_mm_helper.h>
 
 #include "ast_drv.h"
 
@@ -100,28 +105,21 @@ ast_pci_remove(struct pci_dev *pdev)
 static int ast_drm_freeze(struct drm_device *dev)
 {
        drm_kms_helper_poll_disable(dev);
-
        pci_save_state(dev->pdev);
+       drm_fb_helper_set_suspend_unlocked(dev->fb_helper, true);
 
-       console_lock();
-       ast_fbdev_set_suspend(dev, 1);
-       console_unlock();
        return 0;
 }
 
 static int ast_drm_thaw(struct drm_device *dev)
 {
-       int error = 0;
-
        ast_post_gpu(dev);
 
        drm_mode_config_reset(dev);
        drm_helper_resume_force_mode(dev);
+       drm_fb_helper_set_suspend_unlocked(dev->fb_helper, false);
 
-       console_lock();
-       ast_fbdev_set_suspend(dev, 0);
-       console_unlock();
-       return error;
+       return 0;
 }
 
 static int ast_drm_resume(struct drm_device *dev)
index 684e15e64a6200ed9dc76e97807a9dae1a3f0218..244cc7c382afbbd257edcdf3fcf87852ed558094 100644 (file)
 #ifndef __AST_DRV_H__
 #define __AST_DRV_H__
 
-#include <drm/drm_encoder.h>
-#include <drm/drm_fb_helper.h>
-
-#include <drm/drm_gem.h>
-#include <drm/drm_gem_vram_helper.h>
-
-#include <drm/drm_vram_mm_helper.h>
-
+#include <linux/types.h>
+#include <linux/io.h>
 #include <linux/i2c.h>
 #include <linux/i2c-algo-bit.h>
 
+#include <drm/drm_connector.h>
+#include <drm/drm_crtc.h>
+#include <drm/drm_encoder.h>
+#include <drm/drm_mode.h>
+#include <drm/drm_framebuffer.h>
+#include <drm/drm_fb_helper.h>
+
 #define DRIVER_AUTHOR          "Dave Airlie"
 
 #define DRIVER_NAME            "ast"
@@ -81,8 +82,6 @@ enum ast_tx_chip {
 #define AST_DRAM_4Gx16   7
 #define AST_DRAM_8Gx16   8
 
-struct ast_fbdev;
-
 struct ast_private {
        struct drm_device *dev;
 
@@ -96,8 +95,6 @@ struct ast_private {
        uint32_t mclk;
        uint32_t vram_size;
 
-       struct ast_fbdev *fbdev;
-
        int fb_mtrr;
 
        struct drm_gem_object *cursor_cache;
@@ -239,24 +236,9 @@ struct ast_encoder {
        struct drm_encoder base;
 };
 
-struct ast_framebuffer {
-       struct drm_framebuffer base;
-       struct drm_gem_object *obj;
-};
-
-struct ast_fbdev {
-       struct drm_fb_helper helper; /* must be first */
-       struct ast_framebuffer afb;
-       void *sysram;
-       int size;
-       int x1, y1, x2, y2; /* dirty rect */
-       spinlock_t dirty_lock;
-};
-
 #define to_ast_crtc(x) container_of(x, struct ast_crtc, base)
 #define to_ast_connector(x) container_of(x, struct ast_connector, base)
 #define to_ast_encoder(x) container_of(x, struct ast_encoder, base)
-#define to_ast_framebuffer(x) container_of(x, struct ast_framebuffer, base)
 
 struct ast_vbios_stdtable {
        u8 misc;
@@ -296,16 +278,6 @@ struct ast_vbios_mode_info {
 extern int ast_mode_init(struct drm_device *dev);
 extern void ast_mode_fini(struct drm_device *dev);
 
-int ast_framebuffer_init(struct drm_device *dev,
-                        struct ast_framebuffer *ast_fb,
-                        const struct drm_mode_fb_cmd2 *mode_cmd,
-                        struct drm_gem_object *obj);
-
-int ast_fbdev_init(struct drm_device *dev);
-void ast_fbdev_fini(struct drm_device *dev);
-void ast_fbdev_set_suspend(struct drm_device *dev, int state);
-void ast_fbdev_set_base(struct ast_private *ast, unsigned long gpu_addr);
-
 #define AST_MM_ALIGN_SHIFT 4
 #define AST_MM_ALIGN_MASK ((1 << AST_MM_ALIGN_SHIFT) - 1)
 
diff --git a/drivers/gpu/drm/ast/ast_fb.c b/drivers/gpu/drm/ast/ast_fb.c
deleted file mode 100644 (file)
index 8200b25..0000000
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
- * Copyright 2012 Red Hat Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- * USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- */
-/*
- * Authors: Dave Airlie <airlied@redhat.com>
- */
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/tty.h>
-#include <linux/sysrq.h>
-#include <linux/delay.h>
-#include <linux/init.h>
-
-
-#include <drm/drmP.h>
-#include <drm/drm_crtc.h>
-#include <drm/drm_fb_helper.h>
-#include <drm/drm_util.h>
-#include <drm/drm_crtc_helper.h>
-
-#include "ast_drv.h"
-
-static void ast_dirty_update(struct ast_fbdev *afbdev,
-                            int x, int y, int width, int height)
-{
-       int i;
-       struct drm_gem_vram_object *gbo;
-       int src_offset, dst_offset;
-       int bpp = afbdev->afb.base.format->cpp[0];
-       int ret;
-       u8 *dst;
-       bool unmap = false;
-       bool store_for_later = false;
-       int x2, y2;
-       unsigned long flags;
-
-       gbo = drm_gem_vram_of_gem(afbdev->afb.obj);
-
-       if (drm_can_sleep()) {
-               /* We pin the BO so it won't be moved during the
-                * update. The actual location, video RAM or system
-                * memory, is not important.
-                */
-               ret = drm_gem_vram_pin(gbo, 0);
-               if (ret) {
-                       if (ret != -EBUSY)
-                               return;
-                       store_for_later = true;
-               }
-       } else {
-               store_for_later = true;
-       }
-
-       x2 = x + width - 1;
-       y2 = y + height - 1;
-       spin_lock_irqsave(&afbdev->dirty_lock, flags);
-
-       if (afbdev->y1 < y)
-               y = afbdev->y1;
-       if (afbdev->y2 > y2)
-               y2 = afbdev->y2;
-       if (afbdev->x1 < x)
-               x = afbdev->x1;
-       if (afbdev->x2 > x2)
-               x2 = afbdev->x2;
-
-       if (store_for_later) {
-               afbdev->x1 = x;
-               afbdev->x2 = x2;
-               afbdev->y1 = y;
-               afbdev->y2 = y2;
-               spin_unlock_irqrestore(&afbdev->dirty_lock, flags);
-               return;
-       }
-
-       afbdev->x1 = afbdev->y1 = INT_MAX;
-       afbdev->x2 = afbdev->y2 = 0;
-       spin_unlock_irqrestore(&afbdev->dirty_lock, flags);
-
-       dst = drm_gem_vram_kmap(gbo, false, NULL);
-       if (IS_ERR(dst)) {
-               DRM_ERROR("failed to kmap fb updates\n");
-               goto out;
-       } else if (!dst) {
-               dst = drm_gem_vram_kmap(gbo, true, NULL);
-               if (IS_ERR(dst)) {
-                       DRM_ERROR("failed to kmap fb updates\n");
-                       goto out;
-               }
-               unmap = true;
-       }
-
-       for (i = y; i <= y2; i++) {
-               /* assume equal stride for now */
-               src_offset = dst_offset =
-                       i * afbdev->afb.base.pitches[0] + (x * bpp);
-               memcpy_toio(dst + dst_offset, afbdev->sysram + src_offset,
-                           (x2 - x + 1) * bpp);
-       }
-
-       if (unmap)
-               drm_gem_vram_kunmap(gbo);
-
-out:
-       drm_gem_vram_unpin(gbo);
-}
-
-static void ast_fillrect(struct fb_info *info,
-                        const struct fb_fillrect *rect)
-{
-       struct ast_fbdev *afbdev = info->par;
-       drm_fb_helper_sys_fillrect(info, rect);
-       ast_dirty_update(afbdev, rect->dx, rect->dy, rect->width,
-                        rect->height);
-}
-
-static void ast_copyarea(struct fb_info *info,
-                        const struct fb_copyarea *area)
-{
-       struct ast_fbdev *afbdev = info->par;
-       drm_fb_helper_sys_copyarea(info, area);
-       ast_dirty_update(afbdev, area->dx, area->dy, area->width,
-                        area->height);
-}
-
-static void ast_imageblit(struct fb_info *info,
-                         const struct fb_image *image)
-{
-       struct ast_fbdev *afbdev = info->par;
-       drm_fb_helper_sys_imageblit(info, image);
-       ast_dirty_update(afbdev, image->dx, image->dy, image->width,
-                        image->height);
-}
-
-static struct fb_ops astfb_ops = {
-       .owner = THIS_MODULE,
-       .fb_check_var = drm_fb_helper_check_var,
-       .fb_set_par = drm_fb_helper_set_par,
-       .fb_fillrect = ast_fillrect,
-       .fb_copyarea = ast_copyarea,
-       .fb_imageblit = ast_imageblit,
-       .fb_pan_display = drm_fb_helper_pan_display,
-       .fb_blank = drm_fb_helper_blank,
-       .fb_setcmap = drm_fb_helper_setcmap,
-};
-
-static int astfb_create_object(struct ast_fbdev *afbdev,
-                              const struct drm_mode_fb_cmd2 *mode_cmd,
-                              struct drm_gem_object **gobj_p)
-{
-       struct drm_device *dev = afbdev->helper.dev;
-       u32 size;
-       struct drm_gem_object *gobj;
-       int ret = 0;
-
-       size = mode_cmd->pitches[0] * mode_cmd->height;
-       ret = ast_gem_create(dev, size, true, &gobj);
-       if (ret)
-               return ret;
-
-       *gobj_p = gobj;
-       return ret;
-}
-
-static int astfb_create(struct drm_fb_helper *helper,
-                       struct drm_fb_helper_surface_size *sizes)
-{
-       struct ast_fbdev *afbdev =
-               container_of(helper, struct ast_fbdev, helper);
-       struct drm_device *dev = afbdev->helper.dev;
-       struct drm_mode_fb_cmd2 mode_cmd;
-       struct drm_framebuffer *fb;
-       struct fb_info *info;
-       int size, ret;
-       void *sysram;
-       struct drm_gem_object *gobj = NULL;
-       mode_cmd.width = sizes->surface_width;
-       mode_cmd.height = sizes->surface_height;
-       mode_cmd.pitches[0] = mode_cmd.width * ((sizes->surface_bpp + 7)/8);
-
-       mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp,
-                                                         sizes->surface_depth);
-
-       size = mode_cmd.pitches[0] * mode_cmd.height;
-
-       ret = astfb_create_object(afbdev, &mode_cmd, &gobj);
-       if (ret) {
-               DRM_ERROR("failed to create fbcon backing object %d\n", ret);
-               return ret;
-       }
-
-       sysram = vmalloc(size);
-       if (!sysram)
-               return -ENOMEM;
-
-       info = drm_fb_helper_alloc_fbi(helper);
-       if (IS_ERR(info)) {
-               ret = PTR_ERR(info);
-               goto out;
-       }
-       ret = ast_framebuffer_init(dev, &afbdev->afb, &mode_cmd, gobj);
-       if (ret)
-               goto out;
-
-       afbdev->sysram = sysram;
-       afbdev->size = size;
-
-       fb = &afbdev->afb.base;
-       afbdev->helper.fb = fb;
-
-       info->fbops = &astfb_ops;
-
-       info->apertures->ranges[0].base = pci_resource_start(dev->pdev, 0);
-       info->apertures->ranges[0].size = pci_resource_len(dev->pdev, 0);
-
-       drm_fb_helper_fill_info(info, &afbdev->helper, sizes);
-
-       info->screen_base = sysram;
-       info->screen_size = size;
-
-       info->pixmap.flags = FB_PIXMAP_SYSTEM;
-
-       DRM_DEBUG_KMS("allocated %dx%d\n",
-                     fb->width, fb->height);
-
-       return 0;
-
-out:
-       vfree(sysram);
-       return ret;
-}
-
-static const struct drm_fb_helper_funcs ast_fb_helper_funcs = {
-       .fb_probe = astfb_create,
-};
-
-static void ast_fbdev_destroy(struct drm_device *dev,
-                             struct ast_fbdev *afbdev)
-{
-       struct ast_framebuffer *afb = &afbdev->afb;
-
-       drm_helper_force_disable_all(dev);
-       drm_fb_helper_unregister_fbi(&afbdev->helper);
-
-       if (afb->obj) {
-               drm_gem_object_put_unlocked(afb->obj);
-               afb->obj = NULL;
-       }
-       drm_fb_helper_fini(&afbdev->helper);
-
-       vfree(afbdev->sysram);
-       drm_framebuffer_unregister_private(&afb->base);
-       drm_framebuffer_cleanup(&afb->base);
-}
-
-int ast_fbdev_init(struct drm_device *dev)
-{
-       struct ast_private *ast = dev->dev_private;
-       struct ast_fbdev *afbdev;
-       int ret;
-
-       afbdev = kzalloc(sizeof(struct ast_fbdev), GFP_KERNEL);
-       if (!afbdev)
-               return -ENOMEM;
-
-       ast->fbdev = afbdev;
-       spin_lock_init(&afbdev->dirty_lock);
-
-       drm_fb_helper_prepare(dev, &afbdev->helper, &ast_fb_helper_funcs);
-
-       ret = drm_fb_helper_init(dev, &afbdev->helper, 1);
-       if (ret)
-               goto free;
-
-       ret = drm_fb_helper_single_add_all_connectors(&afbdev->helper);
-       if (ret)
-               goto fini;
-
-       /* disable all the possible outputs/crtcs before entering KMS mode */
-       drm_helper_disable_unused_functions(dev);
-
-       ret = drm_fb_helper_initial_config(&afbdev->helper, 32);
-       if (ret)
-               goto fini;
-
-       return 0;
-
-fini:
-       drm_fb_helper_fini(&afbdev->helper);
-free:
-       kfree(afbdev);
-       return ret;
-}
-
-void ast_fbdev_fini(struct drm_device *dev)
-{
-       struct ast_private *ast = dev->dev_private;
-
-       if (!ast->fbdev)
-               return;
-
-       ast_fbdev_destroy(dev, ast->fbdev);
-       kfree(ast->fbdev);
-       ast->fbdev = NULL;
-}
-
-void ast_fbdev_set_suspend(struct drm_device *dev, int state)
-{
-       struct ast_private *ast = dev->dev_private;
-
-       if (!ast->fbdev)
-               return;
-
-       drm_fb_helper_set_suspend(&ast->fbdev->helper, state);
-}
-
-void ast_fbdev_set_base(struct ast_private *ast, unsigned long gpu_addr)
-{
-       ast->fbdev->helper.fbdev->fix.smem_start =
-               ast->fbdev->helper.fbdev->apertures->ranges[0].base + gpu_addr;
-       ast->fbdev->helper.fbdev->fix.smem_len = ast->vram_size - gpu_addr;
-}
index 4c7e31cb45ffaf14073ab3ccf286dee27823f9d6..0a1bb9c05195d2d80ea3702fae0ab44a5deaedf6 100644 (file)
 /*
  * Authors: Dave Airlie <airlied@redhat.com>
  */
-#include <drm/drmP.h>
-#include "ast_drv.h"
 
+#include <linux/pci.h>
 
-#include <drm/drm_fb_helper.h>
 #include <drm/drm_crtc_helper.h>
+#include <drm/drm_fb_helper.h>
+#include <drm/drm_gem.h>
+#include <drm/drm_gem_framebuffer_helper.h>
+#include <drm/drm_gem_vram_helper.h>
+#include <drm/drm_vram_mm_helper.h>
+
+#include "ast_drv.h"
 
 void ast_set_index_reg_mask(struct ast_private *ast,
                            uint32_t base, uint8_t index,
@@ -383,67 +388,8 @@ static int ast_get_dram_info(struct drm_device *dev)
        return 0;
 }
 
-static void ast_user_framebuffer_destroy(struct drm_framebuffer *fb)
-{
-       struct ast_framebuffer *ast_fb = to_ast_framebuffer(fb);
-
-       drm_gem_object_put_unlocked(ast_fb->obj);
-       drm_framebuffer_cleanup(fb);
-       kfree(ast_fb);
-}
-
-static const struct drm_framebuffer_funcs ast_fb_funcs = {
-       .destroy = ast_user_framebuffer_destroy,
-};
-
-
-int ast_framebuffer_init(struct drm_device *dev,
-                        struct ast_framebuffer *ast_fb,
-                        const struct drm_mode_fb_cmd2 *mode_cmd,
-                        struct drm_gem_object *obj)
-{
-       int ret;
-
-       drm_helper_mode_fill_fb_struct(dev, &ast_fb->base, mode_cmd);
-       ast_fb->obj = obj;
-       ret = drm_framebuffer_init(dev, &ast_fb->base, &ast_fb_funcs);
-       if (ret) {
-               DRM_ERROR("framebuffer init failed %d\n", ret);
-               return ret;
-       }
-       return 0;
-}
-
-static struct drm_framebuffer *
-ast_user_framebuffer_create(struct drm_device *dev,
-              struct drm_file *filp,
-              const struct drm_mode_fb_cmd2 *mode_cmd)
-{
-       struct drm_gem_object *obj;
-       struct ast_framebuffer *ast_fb;
-       int ret;
-
-       obj = drm_gem_object_lookup(filp, mode_cmd->handles[0]);
-       if (obj == NULL)
-               return ERR_PTR(-ENOENT);
-
-       ast_fb = kzalloc(sizeof(*ast_fb), GFP_KERNEL);
-       if (!ast_fb) {
-               drm_gem_object_put_unlocked(obj);
-               return ERR_PTR(-ENOMEM);
-       }
-
-       ret = ast_framebuffer_init(dev, ast_fb, mode_cmd, obj);
-       if (ret) {
-               drm_gem_object_put_unlocked(obj);
-               kfree(ast_fb);
-               return ERR_PTR(ret);
-       }
-       return &ast_fb->base;
-}
-
 static const struct drm_mode_config_funcs ast_mode_funcs = {
-       .fb_create = ast_user_framebuffer_create,
+       .fb_create = drm_gem_fb_create
 };
 
 static u32 ast_get_vram_info(struct drm_device *dev)
@@ -561,7 +507,7 @@ int ast_driver_load(struct drm_device *dev, unsigned long flags)
        if (ret)
                goto out_free;
 
-       ret = ast_fbdev_init(dev);
+       ret = drm_fbdev_generic_setup(dev, 32);
        if (ret)
                goto out_free;
 
@@ -579,7 +525,6 @@ void ast_driver_unload(struct drm_device *dev)
        ast_release_firmware(dev);
        kfree(ast->dp501_fw_addr);
        ast_mode_fini(dev);
-       ast_fbdev_fini(dev);
        drm_mode_config_cleanup(dev);
 
        ast_mm_fini(ast);
index ffccbef962a41d44d331e1b8da970a0246483b2b..c792362024a5a0ca17116ce431c4bd9e5d97bdf7 100644 (file)
 /*
  * Authors: Dave Airlie <airlied@redhat.com>
  */
+
 #include <linux/export.h>
-#include <drm/drmP.h>
+#include <linux/pci.h>
+
 #include <drm/drm_crtc.h>
 #include <drm/drm_crtc_helper.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_gem_vram_helper.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_probe_helper.h>
-#include "ast_drv.h"
 
+#include "ast_drv.h"
 #include "ast_tables.h"
 
 static struct ast_i2c_chan *ast_i2c_create(struct drm_device *dev);
@@ -525,28 +529,16 @@ static int ast_crtc_do_set_base(struct drm_crtc *crtc,
                                struct drm_framebuffer *fb,
                                int x, int y, int atomic)
 {
-       struct ast_private *ast = crtc->dev->dev_private;
-       struct drm_gem_object *obj;
-       struct ast_framebuffer *ast_fb;
        struct drm_gem_vram_object *gbo;
        int ret;
        s64 gpu_addr;
-       void *base;
 
        if (!atomic && fb) {
-               ast_fb = to_ast_framebuffer(fb);
-               obj = ast_fb->obj;
-               gbo = drm_gem_vram_of_gem(obj);
-
-               /* unmap if console */
-               if (&ast->fbdev->afb == ast_fb)
-                       drm_gem_vram_kunmap(gbo);
+               gbo = drm_gem_vram_of_gem(fb->obj[0]);
                drm_gem_vram_unpin(gbo);
        }
 
-       ast_fb = to_ast_framebuffer(crtc->primary->fb);
-       obj = ast_fb->obj;
-       gbo = drm_gem_vram_of_gem(obj);
+       gbo = drm_gem_vram_of_gem(crtc->primary->fb->obj[0]);
 
        ret = drm_gem_vram_pin(gbo, DRM_GEM_VRAM_PL_FLAG_VRAM);
        if (ret)
@@ -557,17 +549,6 @@ static int ast_crtc_do_set_base(struct drm_crtc *crtc,
                goto err_drm_gem_vram_unpin;
        }
 
-       if (&ast->fbdev->afb == ast_fb) {
-               /* if pushing console in kmap it */
-               base = drm_gem_vram_kmap(gbo, true, NULL);
-               if (IS_ERR(base)) {
-                       ret = PTR_ERR(base);
-                       DRM_ERROR("failed to kmap fbcon\n");
-               } else {
-                       ast_fbdev_set_base(ast, gpu_addr);
-               }
-       }
-
        ast_set_offset_reg(crtc);
        ast_set_start_address_crt1(crtc, (u32)gpu_addr);
 
@@ -624,14 +605,10 @@ static void ast_crtc_disable(struct drm_crtc *crtc)
        DRM_DEBUG_KMS("\n");
        ast_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
        if (crtc->primary->fb) {
-               struct ast_private *ast = crtc->dev->dev_private;
-               struct ast_framebuffer *ast_fb = to_ast_framebuffer(crtc->primary->fb);
-               struct drm_gem_object *obj = ast_fb->obj;
-               struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(obj);
-
-               /* unmap if console */
-               if (&ast->fbdev->afb == ast_fb)
-                       drm_gem_vram_kunmap(gbo);
+               struct drm_framebuffer *fb = crtc->primary->fb;
+               struct drm_gem_vram_object *gbo =
+                       drm_gem_vram_of_gem(fb->obj[0]);
+
                drm_gem_vram_unpin(gbo);
        }
        crtc->primary->fb = NULL;
index f7d421359d564756ff86d78c64293e37eea74c7e..e1d9cdf6ec1dcc44987cbcf4a66352f004dc5bb6 100644 (file)
  * Authors: Dave Airlie <airlied@redhat.com>
  */
 
-#include <drm/drmP.h>
-#include "ast_drv.h"
+#include <linux/delay.h>
+#include <linux/pci.h>
+
+#include <drm/drm_print.h>
 
 #include "ast_dram_tables.h"
+#include "ast_drv.h"
 
 static void ast_post_chip_2300(struct drm_device *dev);
 static void ast_post_chip_2500(struct drm_device *dev);
index 779c53efee8e8180ab567eff1c9e13c764cb02d0..c52d9229417158d5b2d4c1846b41b94754f4f237 100644 (file)
 /*
  * Authors: Dave Airlie <airlied@redhat.com>
  */
-#include <drm/drmP.h>
+
+#include <linux/pci.h>
+
+#include <drm/drm_print.h>
+#include <drm/drm_gem_vram_helper.h>
+#include <drm/drm_vram_mm_helper.h>
 
 #include "ast_drv.h"
 
index 2a413e291a609ff7db80ab072c99435a896ae5d4..580aa2676358e56ab410a15b9b0c6c0b09c10522 100644 (file)
@@ -35,7 +35,6 @@
 
 #include <drm/ati_pcigart.h>
 #include <drm/drm_device.h>
-#include <drm/drm_os_linux.h>
 #include <drm/drm_pci.h>
 #include <drm/drm_print.h>
 
@@ -169,6 +168,7 @@ int drm_ati_pcigart_init(struct drm_device *dev, struct drm_ati_pcigart_info *ga
                page_base = (u32) entry->busaddr[i];
 
                for (j = 0; j < (PAGE_SIZE / ATI_PCIGART_PAGE_SIZE); j++) {
+                       u32 offset;
                        u32 val;
 
                        switch(gart_info->gart_reg_if) {
@@ -184,10 +184,12 @@ int drm_ati_pcigart_init(struct drm_device *dev, struct drm_ati_pcigart_info *ga
                                break;
                        }
                        if (gart_info->gart_table_location ==
-                           DRM_ATI_GART_MAIN)
+                           DRM_ATI_GART_MAIN) {
                                pci_gart[gart_idx] = cpu_to_le32(val);
-                       else
-                               DRM_WRITE32(map, gart_idx * sizeof(u32), val);
+                       } else {
+                               offset = gart_idx * sizeof(u32);
+                               writel(val, (void __iomem *)map->handle + offset);
+                       }
                        gart_idx++;
                        page_base += ATI_PCIGART_PAGE_SIZE;
                }
index 6c6c7cf3c3e8f02c31d669c1aeda097fede5483c..f2e73e6d46b8515bea140d8a9c74461b51aea2ea 100644 (file)
@@ -8,15 +8,19 @@
  */
 
 #include <linux/clk.h>
+#include <linux/mfd/atmel-hlcdc.h>
+#include <linux/pinctrl/consumer.h>
 #include <linux/pm.h>
 #include <linux/pm_runtime.h>
-#include <linux/pinctrl/consumer.h>
 
+#include <video/videomode.h>
+
+#include <drm/drm_atomic.h>
+#include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_probe_helper.h>
-#include <drm/drmP.h>
-
-#include <video/videomode.h>
+#include <drm/drm_vblank.h>
 
 #include "atmel_hlcdc_dc.h"
 
index 9bab6e5ba76bcffa9f1e5490f39d6eab18b0ed53..92640298ad41e14f912f15774e4ee6737eea6c0c 100644 (file)
 #include <linux/clk.h>
 #include <linux/irq.h>
 #include <linux/irqchip.h>
+#include <linux/mfd/atmel-hlcdc.h>
 #include <linux/module.h>
 #include <linux/pm_runtime.h>
+#include <linux/platform_device.h>
+
+#include <drm/drm_atomic.h>
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_fb_helper.h>
+#include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_gem_framebuffer_helper.h>
+#include <drm/drm_irq.h>
+#include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
 
 #include "atmel_hlcdc_dc.h"
 
@@ -823,9 +835,7 @@ static void atmel_hlcdc_dc_irq_uninstall(struct drm_device *dev)
 DEFINE_DRM_GEM_CMA_FOPS(fops);
 
 static struct drm_driver atmel_hlcdc_dc_driver = {
-       .driver_features = DRIVER_GEM |
-                          DRIVER_MODESET | DRIVER_PRIME |
-                          DRIVER_ATOMIC,
+       .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
        .irq_handler = atmel_hlcdc_dc_irq_handler,
        .irq_preinstall = atmel_hlcdc_dc_irq_uninstall,
        .irq_postinstall = atmel_hlcdc_dc_irq_postinstall,
@@ -834,8 +844,6 @@ static struct drm_driver atmel_hlcdc_dc_driver = {
        .gem_vm_ops = &drm_gem_cma_vm_ops,
        .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
-       .gem_prime_import = drm_gem_prime_import,
-       .gem_prime_export = drm_gem_prime_export,
        .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
        .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
        .gem_prime_vmap = drm_gem_cma_prime_vmap,
index 7300e3fd273e7ac63376ef5868a057b4dff8e754..469d4507e57646eb72ec05eba3b7af5808bedcbe 100644 (file)
 #ifndef DRM_ATMEL_HLCDC_H
 #define DRM_ATMEL_HLCDC_H
 
-#include <linux/clk.h>
-#include <linux/dmapool.h>
-#include <linux/irqdomain.h>
-#include <linux/mfd/atmel-hlcdc.h>
-#include <linux/pwm.h>
-
-#include <drm/drm_atomic.h>
-#include <drm/drm_atomic_helper.h>
-#include <drm/drm_crtc.h>
-#include <drm/drm_probe_helper.h>
-#include <drm/drm_fb_helper.h>
-#include <drm/drm_fb_cma_helper.h>
-#include <drm/drm_gem_cma_helper.h>
-#include <drm/drm_gem_framebuffer_helper.h>
-#include <drm/drm_panel.h>
-#include <drm/drm_plane_helper.h>
-#include <drm/drmP.h>
+#include <linux/regmap.h>
+
+#include <drm/drm_plane.h>
 
 #define ATMEL_HLCDC_LAYER_CHER                 0x0
 #define ATMEL_HLCDC_LAYER_CHDR                 0x4
index 7e08318b262ec74e4c67cff7f83a9342af2ac388..375fa84c548b7c8fffbde5b30da2929b9cde3aab 100644 (file)
@@ -8,9 +8,10 @@
  * Author: Boris BREZILLON <boris.brezillon@free-electrons.com>
  */
 
+#include <linux/media-bus-format.h>
 #include <linux/of_graph.h>
 
-#include <drm/drmP.h>
+#include <drm/drm_encoder.h>
 #include <drm/drm_of.h>
 #include <drm/drm_bridge.h>
 
index 4127aca212bb047c48908da593e107d3791061de..89f5a756fa37fdfd9e9ba895734eec4665bdf20d 100644 (file)
@@ -6,6 +6,16 @@
  * Author: Boris BREZILLON <boris.brezillon@free-electrons.com>
  */
 
+#include <linux/dmapool.h>
+#include <linux/mfd/atmel-hlcdc.h>
+
+#include <drm/drm_atomic.h>
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_plane_helper.h>
+
 #include "atmel_hlcdc_dc.h"
 
 /**
@@ -361,7 +371,7 @@ atmel_hlcdc_plane_update_general_settings(struct atmel_hlcdc_plane *plane,
        atmel_hlcdc_layer_write_cfg(&plane->layer, ATMEL_HLCDC_LAYER_DMA_CFG,
                                    cfg);
 
-       cfg = ATMEL_HLCDC_LAYER_DMA;
+       cfg = ATMEL_HLCDC_LAYER_DMA | ATMEL_HLCDC_LAYER_REP;
 
        if (plane->base.type != DRM_PLANE_TYPE_PRIMARY) {
                cfg |= ATMEL_HLCDC_LAYER_OVR | ATMEL_HLCDC_LAYER_ITER2BL |
index 2a65434500eea60de3707ba57ea2fea40f617ea0..68483a2fc12c660907a01c3fbce1868e066e8b4a 100644 (file)
@@ -1,17 +1,15 @@
 /* SPDX-License-Identifier: GPL-2.0 */
+
 #include <linux/io.h>
 #include <linux/console.h>
 
-#include <drm/drmP.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_encoder.h>
 #include <drm/drm_fb_helper.h>
-#include <drm/drm_simple_kms_helper.h>
-
 #include <drm/drm_gem.h>
 #include <drm/drm_gem_vram_helper.h>
-
+#include <drm/drm_simple_kms_helper.h>
 #include <drm/drm_vram_mm_helper.h>
 
 /* ---------------------------------------------------------------------- */
index 8f3a5bda9d034ab85a48289669ea5ddce2623dfb..46d8312ec00d3650cf1df8c3c29811aebde7f0ee 100644 (file)
@@ -2,11 +2,10 @@
 /*
  */
 
-#include <linux/mm.h>
 #include <linux/module.h>
-#include <linux/slab.h>
-#include <drm/drm_fb_helper.h>
-#include <drm/drm_probe_helper.h>
+#include <linux/pci.h>
+
+#include <drm/drm_drv.h>
 #include <drm/drm_atomic_helper.h>
 
 #include "bochs.h"
@@ -65,8 +64,7 @@ static const struct file_operations bochs_fops = {
 };
 
 static struct drm_driver bochs_driver = {
-       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC |
-                                 DRIVER_PRIME,
+       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
        .fops                   = &bochs_fops,
        .name                   = "bochs-drm",
        .desc                   = "bochs dispi vga interface (qemu stdvga)",
@@ -74,7 +72,6 @@ static struct drm_driver bochs_driver = {
        .major                  = 1,
        .minor                  = 0,
        DRM_GEM_VRAM_DRIVER,
-       DRM_GEM_VRAM_DRIVER_PRIME,
 };
 
 /* ---------------------------------------------------------------------- */
index ebfea8744fe6f2b4d48bdfd4ff38dcc560d096e0..e567bdfa2ab8e52d2daa1881e788efa9b5ad1b37 100644 (file)
@@ -2,6 +2,10 @@
 /*
  */
 
+#include <linux/pci.h>
+
+#include <drm/drm_fourcc.h>
+
 #include "bochs.h"
 
 /* ---------------------------------------------------------------------- */
index bc19dbd531efc237b1407bcee204e28c52474d72..02a9c1ed165bba9871d3af1b6759fe8647da46e6 100644 (file)
@@ -2,12 +2,14 @@
 /*
  */
 
-#include "bochs.h"
+#include <linux/moduleparam.h>
+
 #include <drm/drm_atomic_helper.h>
-#include <drm/drm_plane_helper.h>
-#include <drm/drm_atomic_uapi.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
+
+#include "bochs.h"
 
 static int defx = 1024;
 static int defy = 768;
@@ -191,6 +193,7 @@ int bochs_kms_init(struct bochs_device *bochs)
        bochs->dev->mode_config.fb_base = bochs->fb_base;
        bochs->dev->mode_config.preferred_depth = 24;
        bochs->dev->mode_config.prefer_shadow = 0;
+       bochs->dev->mode_config.prefer_shadow_fbdev = 1;
        bochs->dev->mode_config.quirk_addfb_prefer_host_byte_order = true;
 
        bochs->dev->mode_config.funcs = &bochs_mode_funcs;
index f6d2681f69273584c753a8625fc9638f7766fb93..98bccace8c1c0a3cd0d3e43ca813e1411b7bdf4e 100644 (file)
@@ -874,9 +874,6 @@ static int adv7511_bridge_attach(struct drm_bridge *bridge)
                                 &adv7511_connector_helper_funcs);
        drm_connector_attach_encoder(&adv->connector, bridge->encoder);
 
-       if (adv->type == ADV7533)
-               ret = adv7533_attach_dsi(adv);
-
        if (adv->i2c_main->irq)
                regmap_write(adv->regmap, ADV7511_REG_INT_ENABLE(0),
                             ADV7511_INT0_HPD);
@@ -1222,8 +1219,17 @@ static int adv7511_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
        drm_bridge_add(&adv7511->bridge);
 
        adv7511_audio_init(dev, adv7511);
+
+       if (adv7511->type == ADV7533) {
+               ret = adv7533_attach_dsi(adv7511);
+               if (ret)
+                       goto err_remove_bridge;
+       }
+
        return 0;
 
+err_remove_bridge:
+       drm_bridge_remove(&adv7511->bridge);
 err_unregister_cec:
        i2c_unregister_device(adv7511->i2c_cec);
        if (adv7511->cec_clk)
index dd7aa466b2805abec74f8dd509e87c9a122d3529..c2f97e5997a1143f4acd1eab9e5bcfdc57dcd308 100644 (file)
@@ -662,7 +662,8 @@ static void sii902x_audio_shutdown(struct device *dev, void *data)
        clk_disable_unprepare(sii902x->audio.mclk);
 }
 
-int sii902x_audio_digital_mute(struct device *dev, void *data, bool enable)
+static int sii902x_audio_digital_mute(struct device *dev,
+                                     void *data, bool enable)
 {
        struct sii902x *sii902x = dev_get_drvdata(dev);
 
index c6490949d9db33ba88c027987fecdd0b774163a6..218a7b2308f71f1e06048f3361fe2eff83b9de51 100644 (file)
@@ -508,8 +508,14 @@ static void hdmi_set_cts_n(struct dw_hdmi *hdmi, unsigned int cts,
        /* nshift factor = 0 */
        hdmi_modb(hdmi, 0, HDMI_AUD_CTS3_N_SHIFT_MASK, HDMI_AUD_CTS3);
 
-       hdmi_writeb(hdmi, ((cts >> 16) & HDMI_AUD_CTS3_AUDCTS19_16_MASK) |
-                   HDMI_AUD_CTS3_CTS_MANUAL, HDMI_AUD_CTS3);
+       /* Use automatic CTS generation mode when CTS is not set */
+       if (cts)
+               hdmi_writeb(hdmi, ((cts >> 16) &
+                                  HDMI_AUD_CTS3_AUDCTS19_16_MASK) |
+                                 HDMI_AUD_CTS3_CTS_MANUAL,
+                           HDMI_AUD_CTS3);
+       else
+               hdmi_writeb(hdmi, 0, HDMI_AUD_CTS3);
        hdmi_writeb(hdmi, (cts >> 8) & 0xff, HDMI_AUD_CTS2);
        hdmi_writeb(hdmi, cts & 0xff, HDMI_AUD_CTS1);
 
@@ -579,24 +585,33 @@ static void hdmi_set_clk_regenerator(struct dw_hdmi *hdmi,
 {
        unsigned long ftdms = pixel_clk;
        unsigned int n, cts;
+       u8 config3;
        u64 tmp;
 
        n = hdmi_compute_n(sample_rate, pixel_clk);
 
-       /*
-        * Compute the CTS value from the N value.  Note that CTS and N
-        * can be up to 20 bits in total, so we need 64-bit math.  Also
-        * note that our TDMS clock is not fully accurate; it is accurate
-        * to kHz.  This can introduce an unnecessary remainder in the
-        * calculation below, so we don't try to warn about that.
-        */
-       tmp = (u64)ftdms * n;
-       do_div(tmp, 128 * sample_rate);
-       cts = tmp;
+       config3 = hdmi_readb(hdmi, HDMI_CONFIG3_ID);
 
-       dev_dbg(hdmi->dev, "%s: fs=%uHz ftdms=%lu.%03luMHz N=%d cts=%d\n",
-               __func__, sample_rate, ftdms / 1000000, (ftdms / 1000) % 1000,
-               n, cts);
+       /* Only compute CTS when using internal AHB audio */
+       if (config3 & HDMI_CONFIG3_AHBAUDDMA) {
+               /*
+                * Compute the CTS value from the N value.  Note that CTS and N
+                * can be up to 20 bits in total, so we need 64-bit math.  Also
+                * note that our TDMS clock is not fully accurate; it is
+                * accurate to kHz.  This can introduce an unnecessary remainder
+                * in the calculation below, so we don't try to warn about that.
+                */
+               tmp = (u64)ftdms * n;
+               do_div(tmp, 128 * sample_rate);
+               cts = tmp;
+
+               dev_dbg(hdmi->dev, "%s: fs=%uHz ftdms=%lu.%03luMHz N=%d cts=%d\n",
+                       __func__, sample_rate,
+                       ftdms / 1000000, (ftdms / 1000) % 1000,
+                       n, cts);
+       } else {
+               cts = 0;
+       }
 
        spin_lock_irq(&hdmi->audio_lock);
        hdmi->audio_n = n;
index 281c58bab1a1b718beb4c9f23f971730eea950bb..675442bfc1bd77070cea0f7ed1305647fc3178f6 100644 (file)
@@ -10,6 +10,7 @@
 
 #include <linux/clk.h>
 #include <linux/component.h>
+#include <linux/debugfs.h>
 #include <linux/iopoll.h>
 #include <linux/module.h>
 #include <linux/of_device.h>
@@ -89,6 +90,8 @@
 #define VID_MODE_TYPE_NON_BURST_SYNC_EVENTS    0x1
 #define VID_MODE_TYPE_BURST                    0x2
 #define VID_MODE_TYPE_MASK                     0x3
+#define VID_MODE_VPG_ENABLE            BIT(16)
+#define VID_MODE_VPG_HORIZONTAL                BIT(24)
 
 #define DSI_VID_PKT_SIZE               0x3c
 #define VID_PKT_SIZE(p)                        ((p) & 0x3fff)
@@ -233,6 +236,13 @@ struct dw_mipi_dsi {
        u32 format;
        unsigned long mode_flags;
 
+#ifdef CONFIG_DEBUG_FS
+       struct dentry *debugfs;
+
+       bool vpg;
+       bool vpg_horizontal;
+#endif /* CONFIG_DEBUG_FS */
+
        struct dw_mipi_dsi *master; /* dual-dsi master ptr */
        struct dw_mipi_dsi *slave; /* dual-dsi slave ptr */
 
@@ -518,6 +528,13 @@ static void dw_mipi_dsi_video_mode_config(struct dw_mipi_dsi *dsi)
        else
                val |= VID_MODE_TYPE_NON_BURST_SYNC_EVENTS;
 
+#ifdef CONFIG_DEBUG_FS
+       if (dsi->vpg) {
+               val |= VID_MODE_VPG_ENABLE;
+               val |= dsi->vpg_horizontal ? VID_MODE_VPG_HORIZONTAL : 0;
+       }
+#endif /* CONFIG_DEBUG_FS */
+
        dsi_write(dsi, DSI_VID_MODE_CFG, val);
 }
 
@@ -930,6 +947,33 @@ static const struct drm_bridge_funcs dw_mipi_dsi_bridge_funcs = {
        .attach       = dw_mipi_dsi_bridge_attach,
 };
 
+#ifdef CONFIG_DEBUG_FS
+
+static void dw_mipi_dsi_debugfs_init(struct dw_mipi_dsi *dsi)
+{
+       dsi->debugfs = debugfs_create_dir(dev_name(dsi->dev), NULL);
+       if (IS_ERR(dsi->debugfs)) {
+               dev_err(dsi->dev, "failed to create debugfs root\n");
+               return;
+       }
+
+       debugfs_create_bool("vpg", 0660, dsi->debugfs, &dsi->vpg);
+       debugfs_create_bool("vpg_horizontal", 0660, dsi->debugfs,
+                           &dsi->vpg_horizontal);
+}
+
+static void dw_mipi_dsi_debugfs_remove(struct dw_mipi_dsi *dsi)
+{
+       debugfs_remove_recursive(dsi->debugfs);
+}
+
+#else
+
+static void dw_mipi_dsi_debugfs_init(struct dw_mipi_dsi *dsi) { }
+static void dw_mipi_dsi_debugfs_remove(struct dw_mipi_dsi *dsi) { }
+
+#endif /* CONFIG_DEBUG_FS */
+
 static struct dw_mipi_dsi *
 __dw_mipi_dsi_probe(struct platform_device *pdev,
                    const struct dw_mipi_dsi_plat_data *plat_data)
@@ -1000,6 +1044,7 @@ __dw_mipi_dsi_probe(struct platform_device *pdev,
                clk_disable_unprepare(dsi->pclk);
        }
 
+       dw_mipi_dsi_debugfs_init(dsi);
        pm_runtime_enable(dev);
 
        dsi->dsi_host.ops = &dw_mipi_dsi_host_ops;
@@ -1007,6 +1052,7 @@ __dw_mipi_dsi_probe(struct platform_device *pdev,
        ret = mipi_dsi_host_register(&dsi->dsi_host);
        if (ret) {
                dev_err(dev, "Failed to register MIPI host: %d\n", ret);
+               dw_mipi_dsi_debugfs_remove(dsi);
                return ERR_PTR(ret);
        }
 
@@ -1024,6 +1070,7 @@ static void __dw_mipi_dsi_remove(struct dw_mipi_dsi *dsi)
        mipi_dsi_host_unregister(&dsi->dsi_host);
 
        pm_runtime_disable(dsi->dev);
+       dw_mipi_dsi_debugfs_remove(dsi);
 }
 
 void dw_mipi_dsi_set_slave(struct dw_mipi_dsi *dsi, struct dw_mipi_dsi *slave)
index 13ade28a36a8a3bcf2a93ff8b4e0e449b74559a5..42f03a985ac049b70ecbcaedd3ab7ba8349f7889 100644 (file)
@@ -15,6 +15,7 @@
  * Author: Rob Clark <robdclark@gmail.com>
  */
 
+#include <linux/bitfield.h>
 #include <linux/clk.h>
 #include <linux/device.h>
 #include <linux/gpio/consumer.h>
@@ -47,6 +48,7 @@
 
 /* Video Path */
 #define VPCTRL0                        0x0450
+#define VSDELAY                        GENMASK(31, 20)
 #define OPXLFMT_RGB666                 (0 << 8)
 #define OPXLFMT_RGB888                 (1 << 8)
 #define FRMSYNC_DISABLED               (0 << 4) /* Video Timing Gen Disabled */
 #define MSF_DISABLED                   (0 << 0) /* Magic Square FRC disabled */
 #define MSF_ENABLED                    (1 << 0) /* Magic Square FRC enabled */
 #define HTIM01                 0x0454
+#define HPW                    GENMASK(8, 0)
+#define HBPR                   GENMASK(24, 16)
 #define HTIM02                 0x0458
+#define HDISPR                 GENMASK(10, 0)
+#define HFPR                   GENMASK(24, 16)
 #define VTIM01                 0x045c
+#define VSPR                   GENMASK(7, 0)
+#define VBPR                   GENMASK(23, 16)
 #define VTIM02                 0x0460
+#define VFPR                   GENMASK(23, 16)
+#define VDISPR                 GENMASK(10, 0)
 #define VFUEN0                 0x0464
 #define VFUEN                          BIT(0)   /* Video Frame Timing Upload */
 
 #define DP0_VIDSRC_DSI_RX              (1 << 0)
 #define DP0_VIDSRC_DPI_RX              (2 << 0)
 #define DP0_VIDSRC_COLOR_BAR           (3 << 0)
+#define SYSRSTENB              0x050c
+#define ENBI2C                         (1 << 0)
+#define ENBLCD0                                (1 << 2)
+#define ENBBM                          (1 << 3)
+#define ENBDSIRX                       (1 << 4)
+#define ENBREG                         (1 << 5)
+#define ENBHDCP                                (1 << 8)
 #define GPIOM                  0x0540
 #define GPIOC                  0x0544
 #define GPIOO                  0x0548
 /* Main Channel */
 #define DP0_SECSAMPLE          0x0640
 #define DP0_VIDSYNCDELAY       0x0644
+#define VID_SYNC_DLY           GENMASK(15, 0)
+#define THRESH_DLY             GENMASK(31, 16)
+
 #define DP0_TOTALVAL           0x0648
+#define H_TOTAL                        GENMASK(15, 0)
+#define V_TOTAL                        GENMASK(31, 16)
 #define DP0_STARTVAL           0x064c
+#define H_START                        GENMASK(15, 0)
+#define V_START                        GENMASK(31, 16)
 #define DP0_ACTIVEVAL          0x0650
+#define H_ACT                  GENMASK(15, 0)
+#define V_ACT                  GENMASK(31, 16)
+
 #define DP0_SYNCVAL            0x0654
+#define VS_WIDTH               GENMASK(30, 16)
+#define HS_WIDTH               GENMASK(14, 0)
 #define SYNCVAL_HS_POL_ACTIVE_LOW      (1 << 15)
 #define SYNCVAL_VS_POL_ACTIVE_LOW      (1 << 31)
 #define DP0_MISC               0x0658
 #define TU_SIZE_RECOMMENDED            (63) /* LSCLK cycles per TU */
+#define MAX_TU_SYMBOL          GENMASK(28, 23)
+#define TU_SIZE                        GENMASK(21, 16)
 #define BPC_6                          (0 << 5)
 #define BPC_8                          (1 << 5)
 
 /* AUX channel */
 #define DP0_AUXCFG0            0x0660
+#define DP0_AUXCFG0_BSIZE      GENMASK(11, 8)
+#define DP0_AUXCFG0_ADDR_ONLY  BIT(4)
 #define DP0_AUXCFG1            0x0664
 #define AUX_RX_FILTER_EN               BIT(16)
 
 #define DP0_AUXWDATA(i)                (0x066c + (i) * 4)
 #define DP0_AUXRDATA(i)                (0x067c + (i) * 4)
 #define DP0_AUXSTATUS          0x068c
-#define AUX_STATUS_MASK                        0xf0
-#define AUX_STATUS_SHIFT               4
-#define AUX_TIMEOUT                    BIT(1)
-#define AUX_BUSY                       BIT(0)
+#define AUX_BYTES              GENMASK(15, 8)
+#define AUX_STATUS             GENMASK(7, 4)
+#define AUX_TIMEOUT            BIT(1)
+#define AUX_BUSY               BIT(0)
 #define DP0_AUXI2CADR          0x0698
 
 /* Link Training */
 
 /* Test & Debug */
 #define TSTCTL                 0x0a00
+#define COLOR_R                        GENMASK(31, 24)
+#define COLOR_G                        GENMASK(23, 16)
+#define COLOR_B                        GENMASK(15, 8)
+#define ENI2CFILTER            BIT(4)
+#define COLOR_BAR_MODE         GENMASK(1, 0)
+#define COLOR_BAR_MODE_BARS    2
 #define PLL_DBG                        0x0a04
 
 static bool tc_test_pattern;
@@ -241,137 +280,131 @@ static inline struct tc_data *connector_to_tc(struct drm_connector *c)
        return container_of(c, struct tc_data, connector);
 }
 
-/* Simple macros to avoid repeated error checks */
-#define tc_write(reg, var)                                     \
-       do {                                                    \
-               ret = regmap_write(tc->regmap, reg, var);       \
-               if (ret)                                        \
-                       goto err;                               \
-       } while (0)
-#define tc_read(reg, var)                                      \
-       do {                                                    \
-               ret = regmap_read(tc->regmap, reg, var);        \
-               if (ret)                                        \
-                       goto err;                               \
-       } while (0)
-
-static inline int tc_poll_timeout(struct regmap *map, unsigned int addr,
+static inline int tc_poll_timeout(struct tc_data *tc, unsigned int addr,
                                  unsigned int cond_mask,
                                  unsigned int cond_value,
                                  unsigned long sleep_us, u64 timeout_us)
 {
-       ktime_t timeout = ktime_add_us(ktime_get(), timeout_us);
        unsigned int val;
-       int ret;
 
-       for (;;) {
-               ret = regmap_read(map, addr, &val);
-               if (ret)
-                       break;
-               if ((val & cond_mask) == cond_value)
-                       break;
-               if (timeout_us && ktime_compare(ktime_get(), timeout) > 0) {
-                       ret = regmap_read(map, addr, &val);
-                       break;
-               }
-               if (sleep_us)
-                       usleep_range((sleep_us >> 2) + 1, sleep_us);
-       }
-       return ret ?: (((val & cond_mask) == cond_value) ? 0 : -ETIMEDOUT);
+       return regmap_read_poll_timeout(tc->regmap, addr, val,
+                                       (val & cond_mask) == cond_value,
+                                       sleep_us, timeout_us);
 }
 
-static int tc_aux_wait_busy(struct tc_data *tc, unsigned int timeout_ms)
+static int tc_aux_wait_busy(struct tc_data *tc)
 {
-       return tc_poll_timeout(tc->regmap, DP0_AUXSTATUS, AUX_BUSY, 0,
-                              1000, 1000 * timeout_ms);
+       return tc_poll_timeout(tc, DP0_AUXSTATUS, AUX_BUSY, 0, 1000, 100000);
 }
 
-static int tc_aux_get_status(struct tc_data *tc, u8 *reply)
+static int tc_aux_write_data(struct tc_data *tc, const void *data,
+                            size_t size)
 {
-       int ret;
-       u32 value;
+       u32 auxwdata[DP_AUX_MAX_PAYLOAD_BYTES / sizeof(u32)] = { 0 };
+       int ret, count = ALIGN(size, sizeof(u32));
 
-       ret = regmap_read(tc->regmap, DP0_AUXSTATUS, &value);
-       if (ret < 0)
+       memcpy(auxwdata, data, size);
+
+       ret = regmap_raw_write(tc->regmap, DP0_AUXWDATA(0), auxwdata, count);
+       if (ret)
                return ret;
 
-       if (value & AUX_BUSY) {
-               dev_err(tc->dev, "aux busy!\n");
-               return -EBUSY;
-       }
+       return size;
+}
 
-       if (value & AUX_TIMEOUT) {
-               dev_err(tc->dev, "aux access timeout!\n");
-               return -ETIMEDOUT;
-       }
+static int tc_aux_read_data(struct tc_data *tc, void *data, size_t size)
+{
+       u32 auxrdata[DP_AUX_MAX_PAYLOAD_BYTES / sizeof(u32)];
+       int ret, count = ALIGN(size, sizeof(u32));
 
-       *reply = (value & AUX_STATUS_MASK) >> AUX_STATUS_SHIFT;
-       return 0;
+       ret = regmap_raw_read(tc->regmap, DP0_AUXRDATA(0), auxrdata, count);
+       if (ret)
+               return ret;
+
+       memcpy(data, auxrdata, size);
+
+       return size;
+}
+
+static u32 tc_auxcfg0(struct drm_dp_aux_msg *msg, size_t size)
+{
+       u32 auxcfg0 = msg->request;
+
+       if (size)
+               auxcfg0 |= FIELD_PREP(DP0_AUXCFG0_BSIZE, size - 1);
+       else
+               auxcfg0 |= DP0_AUXCFG0_ADDR_ONLY;
+
+       return auxcfg0;
 }
 
 static ssize_t tc_aux_transfer(struct drm_dp_aux *aux,
                               struct drm_dp_aux_msg *msg)
 {
        struct tc_data *tc = aux_to_tc(aux);
-       size_t size = min_t(size_t, 8, msg->size);
+       size_t size = min_t(size_t, DP_AUX_MAX_PAYLOAD_BYTES - 1, msg->size);
        u8 request = msg->request & ~DP_AUX_I2C_MOT;
-       u8 *buf = msg->buffer;
-       u32 tmp = 0;
-       int i = 0;
+       u32 auxstatus;
        int ret;
 
-       if (size == 0)
-               return 0;
-
-       ret = tc_aux_wait_busy(tc, 100);
+       ret = tc_aux_wait_busy(tc);
        if (ret)
-               goto err;
+               return ret;
 
-       if (request == DP_AUX_I2C_WRITE || request == DP_AUX_NATIVE_WRITE) {
-               /* Store data */
-               while (i < size) {
-                       if (request == DP_AUX_NATIVE_WRITE)
-                               tmp = tmp | (buf[i] << (8 * (i & 0x3)));
-                       else
-                               tmp = (tmp << 8) | buf[i];
-                       i++;
-                       if (((i % 4) == 0) || (i == size)) {
-                               tc_write(DP0_AUXWDATA((i - 1) >> 2), tmp);
-                               tmp = 0;
-                       }
+       switch (request) {
+       case DP_AUX_NATIVE_READ:
+       case DP_AUX_I2C_READ:
+               break;
+       case DP_AUX_NATIVE_WRITE:
+       case DP_AUX_I2C_WRITE:
+               if (size) {
+                       ret = tc_aux_write_data(tc, msg->buffer, size);
+                       if (ret < 0)
+                               return ret;
                }
-       } else if (request != DP_AUX_I2C_READ &&
-                  request != DP_AUX_NATIVE_READ) {
+               break;
+       default:
                return -EINVAL;
        }
 
        /* Store address */
-       tc_write(DP0_AUXADDR, msg->address);
+       ret = regmap_write(tc->regmap, DP0_AUXADDR, msg->address);
+       if (ret)
+               return ret;
        /* Start transfer */
-       tc_write(DP0_AUXCFG0, ((size - 1) << 8) | request);
+       ret = regmap_write(tc->regmap, DP0_AUXCFG0, tc_auxcfg0(msg, size));
+       if (ret)
+               return ret;
 
-       ret = tc_aux_wait_busy(tc, 100);
+       ret = tc_aux_wait_busy(tc);
        if (ret)
-               goto err;
+               return ret;
 
-       ret = tc_aux_get_status(tc, &msg->reply);
+       ret = regmap_read(tc->regmap, DP0_AUXSTATUS, &auxstatus);
        if (ret)
-               goto err;
+               return ret;
 
-       if (request == DP_AUX_I2C_READ || request == DP_AUX_NATIVE_READ) {
-               /* Read data */
-               while (i < size) {
-                       if ((i % 4) == 0)
-                               tc_read(DP0_AUXRDATA(i >> 2), &tmp);
-                       buf[i] = tmp & 0xff;
-                       tmp = tmp >> 8;
-                       i++;
-               }
+       if (auxstatus & AUX_TIMEOUT)
+               return -ETIMEDOUT;
+       /*
+        * For some reason address-only DP_AUX_I2C_WRITE (MOT), still
+        * reports 1 byte transferred in its status. To deal we that
+        * we ignore aux_bytes field if we know that this was an
+        * address-only transfer
+        */
+       if (size)
+               size = FIELD_GET(AUX_BYTES, auxstatus);
+       msg->reply = FIELD_GET(AUX_STATUS, auxstatus);
+
+       switch (request) {
+       case DP_AUX_NATIVE_READ:
+       case DP_AUX_I2C_READ:
+               if (size)
+                       return tc_aux_read_data(tc, msg->buffer, size);
+               break;
        }
 
        return size;
-err:
-       return ret;
 }
 
 static const char * const training_pattern1_errors[] = {
@@ -411,10 +444,18 @@ static u32 tc_srcctrl(struct tc_data *tc)
        return reg;
 }
 
-static void tc_wait_pll_lock(struct tc_data *tc)
+static int tc_pllupdate(struct tc_data *tc, unsigned int pllctrl)
 {
+       int ret;
+
+       ret = regmap_write(tc->regmap, pllctrl, PLLUPDATE | PLLEN);
+       if (ret)
+               return ret;
+
        /* Wait for PLL to lock: up to 2.09 ms, depending on refclk */
        usleep_range(3000, 6000);
+
+       return 0;
 }
 
 static int tc_pxl_pll_en(struct tc_data *tc, u32 refclk, u32 pixelclock)
@@ -428,6 +469,7 @@ static int tc_pxl_pll_en(struct tc_data *tc, u32 refclk, u32 pixelclock)
        int ext_div[] = {1, 2, 3, 5, 7};
        int best_pixelclock = 0;
        int vco_hi = 0;
+       u32 pxl_pllparam;
 
        dev_dbg(tc->dev, "PLL: requested %d pixelclock, ref %d\n", pixelclock,
                refclk);
@@ -497,24 +539,23 @@ static int tc_pxl_pll_en(struct tc_data *tc, u32 refclk, u32 pixelclock)
                best_mul = 0;
 
        /* Power up PLL and switch to bypass */
-       tc_write(PXL_PLLCTRL, PLLBYP | PLLEN);
-
-       tc_write(PXL_PLLPARAM,
-                (vco_hi << 24) |               /* For PLL VCO >= 300 MHz = 1 */
-                (ext_div[best_pre] << 20) |    /* External Pre-divider */
-                (ext_div[best_post] << 16) |   /* External Post-divider */
-                IN_SEL_REFCLK |                /* Use RefClk as PLL input */
-                (best_div << 8) |              /* Divider for PLL RefClk */
-                (best_mul << 0));              /* Multiplier for PLL */
+       ret = regmap_write(tc->regmap, PXL_PLLCTRL, PLLBYP | PLLEN);
+       if (ret)
+               return ret;
 
-       /* Force PLL parameter update and disable bypass */
-       tc_write(PXL_PLLCTRL, PLLUPDATE | PLLEN);
+       pxl_pllparam  = vco_hi << 24; /* For PLL VCO >= 300 MHz = 1 */
+       pxl_pllparam |= ext_div[best_pre] << 20; /* External Pre-divider */
+       pxl_pllparam |= ext_div[best_post] << 16; /* External Post-divider */
+       pxl_pllparam |= IN_SEL_REFCLK; /* Use RefClk as PLL input */
+       pxl_pllparam |= best_div << 8; /* Divider for PLL RefClk */
+       pxl_pllparam |= best_mul; /* Multiplier for PLL */
 
-       tc_wait_pll_lock(tc);
+       ret = regmap_write(tc->regmap, PXL_PLLPARAM, pxl_pllparam);
+       if (ret)
+               return ret;
 
-       return 0;
-err:
-       return ret;
+       /* Force PLL parameter update and disable bypass */
+       return tc_pllupdate(tc, PXL_PLLCTRL);
 }
 
 static int tc_pxl_pll_dis(struct tc_data *tc)
@@ -525,7 +566,6 @@ static int tc_pxl_pll_dis(struct tc_data *tc)
 
 static int tc_stream_clock_calc(struct tc_data *tc)
 {
-       int ret;
        /*
         * If the Stream clock and Link Symbol clock are
         * asynchronous with each other, the value of M changes over
@@ -541,56 +581,63 @@ static int tc_stream_clock_calc(struct tc_data *tc)
         * M/N = f_STRMCLK / f_LSCLK
         *
         */
-       tc_write(DP0_VIDMNGEN1, 32768);
-
-       return 0;
-err:
-       return ret;
+       return regmap_write(tc->regmap, DP0_VIDMNGEN1, 32768);
 }
 
-static int tc_aux_link_setup(struct tc_data *tc)
+static int tc_set_syspllparam(struct tc_data *tc)
 {
        unsigned long rate;
-       u32 value;
-       int ret;
+       u32 pllparam = SYSCLK_SEL_LSCLK | LSCLK_DIV_2;
 
        rate = clk_get_rate(tc->refclk);
        switch (rate) {
        case 38400000:
-               value = REF_FREQ_38M4;
+               pllparam |= REF_FREQ_38M4;
                break;
        case 26000000:
-               value = REF_FREQ_26M;
+               pllparam |= REF_FREQ_26M;
                break;
        case 19200000:
-               value = REF_FREQ_19M2;
+               pllparam |= REF_FREQ_19M2;
                break;
        case 13000000:
-               value = REF_FREQ_13M;
+               pllparam |= REF_FREQ_13M;
                break;
        default:
                dev_err(tc->dev, "Invalid refclk rate: %lu Hz\n", rate);
                return -EINVAL;
        }
 
-       /* Setup DP-PHY / PLL */
-       value |= SYSCLK_SEL_LSCLK | LSCLK_DIV_2;
-       tc_write(SYS_PLLPARAM, value);
+       return regmap_write(tc->regmap, SYS_PLLPARAM, pllparam);
+}
+
+static int tc_aux_link_setup(struct tc_data *tc)
+{
+       int ret;
+       u32 dp0_auxcfg1;
 
-       tc_write(DP_PHY_CTRL, BGREN | PWR_SW_EN | PHY_A0_EN);
+       /* Setup DP-PHY / PLL */
+       ret = tc_set_syspllparam(tc);
+       if (ret)
+               goto err;
 
+       ret = regmap_write(tc->regmap, DP_PHY_CTRL,
+                          BGREN | PWR_SW_EN | PHY_A0_EN);
+       if (ret)
+               goto err;
        /*
         * Initially PLLs are in bypass. Force PLL parameter update,
         * disable PLL bypass, enable PLL
         */
-       tc_write(DP0_PLLCTRL, PLLUPDATE | PLLEN);
-       tc_wait_pll_lock(tc);
+       ret = tc_pllupdate(tc, DP0_PLLCTRL);
+       if (ret)
+               goto err;
 
-       tc_write(DP1_PLLCTRL, PLLUPDATE | PLLEN);
-       tc_wait_pll_lock(tc);
+       ret = tc_pllupdate(tc, DP1_PLLCTRL);
+       if (ret)
+               goto err;
 
-       ret = tc_poll_timeout(tc->regmap, DP_PHY_CTRL, PHY_RDY, PHY_RDY, 1,
-                             1000);
+       ret = tc_poll_timeout(tc, DP_PHY_CTRL, PHY_RDY, PHY_RDY, 1, 1000);
        if (ret == -ETIMEDOUT) {
                dev_err(tc->dev, "Timeout waiting for PHY to become ready");
                return ret;
@@ -599,9 +646,13 @@ static int tc_aux_link_setup(struct tc_data *tc)
        }
 
        /* Setup AUX link */
-       tc_write(DP0_AUXCFG1, AUX_RX_FILTER_EN |
-                (0x06 << 8) |  /* Aux Bit Period Calculator Threshold */
-                (0x3f << 0));  /* Aux Response Timeout Timer */
+       dp0_auxcfg1  = AUX_RX_FILTER_EN;
+       dp0_auxcfg1 |= 0x06 << 8; /* Aux Bit Period Calculator Threshold */
+       dp0_auxcfg1 |= 0x3f << 0; /* Aux Response Timeout Timer */
+
+       ret = regmap_write(tc->regmap, DP0_AUXCFG1, dp0_auxcfg1);
+       if (ret)
+               goto err;
 
        return 0;
 err:
@@ -612,8 +663,7 @@ err:
 static int tc_get_display_props(struct tc_data *tc)
 {
        int ret;
-       /* temp buffer */
-       u8 tmp[8];
+       u8 reg;
 
        /* Read DP Rx Link Capability */
        ret = drm_dp_link_probe(&tc->aux, &tc->link.base);
@@ -629,21 +679,21 @@ static int tc_get_display_props(struct tc_data *tc)
                tc->link.base.num_lanes = 2;
        }
 
-       ret = drm_dp_dpcd_readb(&tc->aux, DP_MAX_DOWNSPREAD, tmp);
+       ret = drm_dp_dpcd_readb(&tc->aux, DP_MAX_DOWNSPREAD, &reg);
        if (ret < 0)
                goto err_dpcd_read;
-       tc->link.spread = tmp[0] & DP_MAX_DOWNSPREAD_0_5;
+       tc->link.spread = reg & DP_MAX_DOWNSPREAD_0_5;
 
-       ret = drm_dp_dpcd_readb(&tc->aux, DP_MAIN_LINK_CHANNEL_CODING, tmp);
+       ret = drm_dp_dpcd_readb(&tc->aux, DP_MAIN_LINK_CHANNEL_CODING, &reg);
        if (ret < 0)
                goto err_dpcd_read;
 
        tc->link.scrambler_dis = false;
        /* read assr */
-       ret = drm_dp_dpcd_readb(&tc->aux, DP_EDP_CONFIGURATION_SET, tmp);
+       ret = drm_dp_dpcd_readb(&tc->aux, DP_EDP_CONFIGURATION_SET, &reg);
        if (ret < 0)
                goto err_dpcd_read;
-       tc->link.assr = tmp[0] & DP_ALTERNATE_SCRAMBLER_RESET_ENABLE;
+       tc->link.assr = reg & DP_ALTERNATE_SCRAMBLER_RESET_ENABLE;
 
        dev_dbg(tc->dev, "DPCD rev: %d.%d, rate: %s, lanes: %d, framing: %s\n",
                tc->link.base.revision >> 4, tc->link.base.revision & 0x0f,
@@ -677,6 +727,7 @@ static int tc_set_video_mode(struct tc_data *tc,
        int upper_margin = mode->vtotal - mode->vsync_end;
        int lower_margin = mode->vsync_start - mode->vdisplay;
        int vsync_len = mode->vsync_end - mode->vsync_start;
+       u32 dp0_syncval;
 
        /*
         * Recommended maximum number of symbols transferred in a transfer unit:
@@ -701,156 +752,193 @@ static int tc_set_video_mode(struct tc_data *tc,
         * assume we do not need any delay when DPI is a source of
         * sync signals
         */
-       tc_write(VPCTRL0, (0 << 20) /* VSDELAY */ |
-                OPXLFMT_RGB888 | FRMSYNC_DISABLED | MSF_DISABLED);
-       tc_write(HTIM01, (ALIGN(left_margin, 2) << 16) | /* H back porch */
-                        (ALIGN(hsync_len, 2) << 0));    /* Hsync */
-       tc_write(HTIM02, (ALIGN(right_margin, 2) << 16) |  /* H front porch */
-                        (ALIGN(mode->hdisplay, 2) << 0)); /* width */
-       tc_write(VTIM01, (upper_margin << 16) |         /* V back porch */
-                        (vsync_len << 0));             /* Vsync */
-       tc_write(VTIM02, (lower_margin << 16) |         /* V front porch */
-                        (mode->vdisplay << 0));        /* height */
-       tc_write(VFUEN0, VFUEN);                /* update settings */
+       ret = regmap_write(tc->regmap, VPCTRL0,
+                          FIELD_PREP(VSDELAY, 0) |
+                          OPXLFMT_RGB888 | FRMSYNC_DISABLED | MSF_DISABLED);
+       if (ret)
+               return ret;
+
+       ret = regmap_write(tc->regmap, HTIM01,
+                          FIELD_PREP(HBPR, ALIGN(left_margin, 2)) |
+                          FIELD_PREP(HPW, ALIGN(hsync_len, 2)));
+       if (ret)
+               return ret;
+
+       ret = regmap_write(tc->regmap, HTIM02,
+                          FIELD_PREP(HDISPR, ALIGN(mode->hdisplay, 2)) |
+                          FIELD_PREP(HFPR, ALIGN(right_margin, 2)));
+       if (ret)
+               return ret;
+
+       ret = regmap_write(tc->regmap, VTIM01,
+                          FIELD_PREP(VBPR, upper_margin) |
+                          FIELD_PREP(VSPR, vsync_len));
+       if (ret)
+               return ret;
+
+       ret = regmap_write(tc->regmap, VTIM02,
+                          FIELD_PREP(VFPR, lower_margin) |
+                          FIELD_PREP(VDISPR, mode->vdisplay));
+       if (ret)
+               return ret;
+
+       ret = regmap_write(tc->regmap, VFUEN0, VFUEN); /* update settings */
+       if (ret)
+               return ret;
 
        /* Test pattern settings */
-       tc_write(TSTCTL,
-                (120 << 24) |  /* Red Color component value */
-                (20 << 16) |   /* Green Color component value */
-                (99 << 8) |    /* Blue Color component value */
-                (1 << 4) |     /* Enable I2C Filter */
-                (2 << 0) |     /* Color bar Mode */
-                0);
+       ret = regmap_write(tc->regmap, TSTCTL,
+                          FIELD_PREP(COLOR_R, 120) |
+                          FIELD_PREP(COLOR_G, 20) |
+                          FIELD_PREP(COLOR_B, 99) |
+                          ENI2CFILTER |
+                          FIELD_PREP(COLOR_BAR_MODE, COLOR_BAR_MODE_BARS));
+       if (ret)
+               return ret;
 
        /* DP Main Stream Attributes */
        vid_sync_dly = hsync_len + left_margin + mode->hdisplay;
-       tc_write(DP0_VIDSYNCDELAY,
-                (max_tu_symbol << 16) |        /* thresh_dly */
-                (vid_sync_dly << 0));
+       ret = regmap_write(tc->regmap, DP0_VIDSYNCDELAY,
+                FIELD_PREP(THRESH_DLY, max_tu_symbol) |
+                FIELD_PREP(VID_SYNC_DLY, vid_sync_dly));
+
+       ret = regmap_write(tc->regmap, DP0_TOTALVAL,
+                          FIELD_PREP(H_TOTAL, mode->htotal) |
+                          FIELD_PREP(V_TOTAL, mode->vtotal));
+       if (ret)
+               return ret;
+
+       ret = regmap_write(tc->regmap, DP0_STARTVAL,
+                          FIELD_PREP(H_START, left_margin + hsync_len) |
+                          FIELD_PREP(V_START, upper_margin + vsync_len));
+       if (ret)
+               return ret;
 
-       tc_write(DP0_TOTALVAL, (mode->vtotal << 16) | (mode->htotal));
+       ret = regmap_write(tc->regmap, DP0_ACTIVEVAL,
+                          FIELD_PREP(V_ACT, mode->vdisplay) |
+                          FIELD_PREP(H_ACT, mode->hdisplay));
+       if (ret)
+               return ret;
 
-       tc_write(DP0_STARTVAL,
-                ((upper_margin + vsync_len) << 16) |
-                ((left_margin + hsync_len) << 0));
+       dp0_syncval = FIELD_PREP(VS_WIDTH, vsync_len) |
+                     FIELD_PREP(HS_WIDTH, hsync_len);
 
-       tc_write(DP0_ACTIVEVAL, (mode->vdisplay << 16) | (mode->hdisplay));
+       if (mode->flags & DRM_MODE_FLAG_NVSYNC)
+               dp0_syncval |= SYNCVAL_VS_POL_ACTIVE_LOW;
 
-       tc_write(DP0_SYNCVAL, (vsync_len << 16) | (hsync_len << 0) |
-                ((mode->flags & DRM_MODE_FLAG_NHSYNC) ? SYNCVAL_HS_POL_ACTIVE_LOW : 0) |
-                ((mode->flags & DRM_MODE_FLAG_NVSYNC) ? SYNCVAL_VS_POL_ACTIVE_LOW : 0));
+       if (mode->flags & DRM_MODE_FLAG_NHSYNC)
+               dp0_syncval |= SYNCVAL_HS_POL_ACTIVE_LOW;
 
-       tc_write(DPIPXLFMT, VS_POL_ACTIVE_LOW | HS_POL_ACTIVE_LOW |
-                DE_POL_ACTIVE_HIGH | SUB_CFG_TYPE_CONFIG1 | DPI_BPP_RGB888);
+       ret = regmap_write(tc->regmap, DP0_SYNCVAL, dp0_syncval);
+       if (ret)
+               return ret;
 
-       tc_write(DP0_MISC, (max_tu_symbol << 23) | (TU_SIZE_RECOMMENDED << 16) |
+       ret = regmap_write(tc->regmap, DPIPXLFMT,
+                          VS_POL_ACTIVE_LOW | HS_POL_ACTIVE_LOW |
+                          DE_POL_ACTIVE_HIGH | SUB_CFG_TYPE_CONFIG1 |
+                          DPI_BPP_RGB888);
+       if (ret)
+               return ret;
+
+       ret = regmap_write(tc->regmap, DP0_MISC,
+                          FIELD_PREP(MAX_TU_SYMBOL, max_tu_symbol) |
+                          FIELD_PREP(TU_SIZE, TU_SIZE_RECOMMENDED) |
                           BPC_8);
+       if (ret)
+               return ret;
 
        return 0;
-err:
-       return ret;
 }
 
 static int tc_wait_link_training(struct tc_data *tc)
 {
-       u32 timeout = 1000;
        u32 value;
        int ret;
 
-       do {
-               udelay(1);
-               tc_read(DP0_LTSTAT, &value);
-       } while ((!(value & LT_LOOPDONE)) && (--timeout));
-
-       if (timeout == 0) {
+       ret = tc_poll_timeout(tc, DP0_LTSTAT, LT_LOOPDONE,
+                             LT_LOOPDONE, 1, 1000);
+       if (ret) {
                dev_err(tc->dev, "Link training timeout waiting for LT_LOOPDONE!\n");
-               return -ETIMEDOUT;
+               return ret;
        }
 
-       return (value >> 8) & 0x7;
+       ret = regmap_read(tc->regmap, DP0_LTSTAT, &value);
+       if (ret)
+               return ret;
 
-err:
-       return ret;
+       return (value >> 8) & 0x7;
 }
 
 static int tc_main_link_enable(struct tc_data *tc)
 {
        struct drm_dp_aux *aux = &tc->aux;
        struct device *dev = tc->dev;
-       unsigned int rate;
        u32 dp_phy_ctrl;
-       int timeout;
        u32 value;
        int ret;
-       u8 tmp[8];
+       u8 tmp[DP_LINK_STATUS_SIZE];
 
        dev_dbg(tc->dev, "link enable\n");
 
-       tc_read(DP0CTL, &value);
-       if (WARN_ON(value & DP_EN))
-               tc_write(DP0CTL, 0);
+       ret = regmap_read(tc->regmap, DP0CTL, &value);
+       if (ret)
+               return ret;
+
+       if (WARN_ON(value & DP_EN)) {
+               ret = regmap_write(tc->regmap, DP0CTL, 0);
+               if (ret)
+                       return ret;
+       }
 
-       tc_write(DP0_SRCCTRL, tc_srcctrl(tc));
+       ret = regmap_write(tc->regmap, DP0_SRCCTRL, tc_srcctrl(tc));
+       if (ret)
+               return ret;
        /* SSCG and BW27 on DP1 must be set to the same as on DP0 */
-       tc_write(DP1_SRCCTRL,
+       ret = regmap_write(tc->regmap, DP1_SRCCTRL,
                 (tc->link.spread ? DP0_SRCCTRL_SSCG : 0) |
                 ((tc->link.base.rate != 162000) ? DP0_SRCCTRL_BW27 : 0));
+       if (ret)
+               return ret;
 
-       rate = clk_get_rate(tc->refclk);
-       switch (rate) {
-       case 38400000:
-               value = REF_FREQ_38M4;
-               break;
-       case 26000000:
-               value = REF_FREQ_26M;
-               break;
-       case 19200000:
-               value = REF_FREQ_19M2;
-               break;
-       case 13000000:
-               value = REF_FREQ_13M;
-               break;
-       default:
-               return -EINVAL;
-       }
-       value |= SYSCLK_SEL_LSCLK | LSCLK_DIV_2;
-       tc_write(SYS_PLLPARAM, value);
+       ret = tc_set_syspllparam(tc);
+       if (ret)
+               return ret;
 
        /* Setup Main Link */
        dp_phy_ctrl = BGREN | PWR_SW_EN | PHY_A0_EN | PHY_M0_EN;
        if (tc->link.base.num_lanes == 2)
                dp_phy_ctrl |= PHY_2LANE;
-       tc_write(DP_PHY_CTRL, dp_phy_ctrl);
+
+       ret = regmap_write(tc->regmap, DP_PHY_CTRL, dp_phy_ctrl);
+       if (ret)
+               return ret;
 
        /* PLL setup */
-       tc_write(DP0_PLLCTRL, PLLUPDATE | PLLEN);
-       tc_wait_pll_lock(tc);
+       ret = tc_pllupdate(tc, DP0_PLLCTRL);
+       if (ret)
+               return ret;
 
-       tc_write(DP1_PLLCTRL, PLLUPDATE | PLLEN);
-       tc_wait_pll_lock(tc);
+       ret = tc_pllupdate(tc, DP1_PLLCTRL);
+       if (ret)
+               return ret;
 
        /* Reset/Enable Main Links */
        dp_phy_ctrl |= DP_PHY_RST | PHY_M1_RST | PHY_M0_RST;
-       tc_write(DP_PHY_CTRL, dp_phy_ctrl);
+       ret = regmap_write(tc->regmap, DP_PHY_CTRL, dp_phy_ctrl);
        usleep_range(100, 200);
        dp_phy_ctrl &= ~(DP_PHY_RST | PHY_M1_RST | PHY_M0_RST);
-       tc_write(DP_PHY_CTRL, dp_phy_ctrl);
-
-       timeout = 1000;
-       do {
-               tc_read(DP_PHY_CTRL, &value);
-               udelay(1);
-       } while ((!(value & PHY_RDY)) && (--timeout));
+       ret = regmap_write(tc->regmap, DP_PHY_CTRL, dp_phy_ctrl);
 
-       if (timeout == 0) {
+       ret = tc_poll_timeout(tc, DP_PHY_CTRL, PHY_RDY, PHY_RDY, 1, 1000);
+       if (ret) {
                dev_err(dev, "timeout waiting for phy become ready");
-               return -ETIMEDOUT;
+               return ret;
        }
 
        /* Set misc: 8 bits per color */
        ret = regmap_update_bits(tc->regmap, DP0_MISC, BPC_8, BPC_8);
        if (ret)
-               goto err;
+               return ret;
 
        /*
         * ASSR mode
@@ -903,53 +991,71 @@ static int tc_main_link_enable(struct tc_data *tc)
        /* Clock-Recovery */
 
        /* Set DPCD 0x102 for Training Pattern 1 */
-       tc_write(DP0_SNKLTCTRL, DP_LINK_SCRAMBLING_DISABLE |
-                DP_TRAINING_PATTERN_1);
+       ret = regmap_write(tc->regmap, DP0_SNKLTCTRL,
+                          DP_LINK_SCRAMBLING_DISABLE |
+                          DP_TRAINING_PATTERN_1);
+       if (ret)
+               return ret;
 
-       tc_write(DP0_LTLOOPCTRL,
-                (15 << 28) |   /* Defer Iteration Count */
-                (15 << 24) |   /* Loop Iteration Count */
-                (0xd << 0));   /* Loop Timer Delay */
+       ret = regmap_write(tc->regmap, DP0_LTLOOPCTRL,
+                          (15 << 28) | /* Defer Iteration Count */
+                          (15 << 24) | /* Loop Iteration Count */
+                          (0xd << 0)); /* Loop Timer Delay */
+       if (ret)
+               return ret;
 
-       tc_write(DP0_SRCCTRL, tc_srcctrl(tc) | DP0_SRCCTRL_SCRMBLDIS |
-                DP0_SRCCTRL_AUTOCORRECT | DP0_SRCCTRL_TP1);
+       ret = regmap_write(tc->regmap, DP0_SRCCTRL,
+                          tc_srcctrl(tc) | DP0_SRCCTRL_SCRMBLDIS |
+                          DP0_SRCCTRL_AUTOCORRECT |
+                          DP0_SRCCTRL_TP1);
+       if (ret)
+               return ret;
 
        /* Enable DP0 to start Link Training */
-       tc_write(DP0CTL,
-                ((tc->link.base.capabilities & DP_LINK_CAP_ENHANCED_FRAMING) ? EF_EN : 0) |
-                DP_EN);
+       ret = regmap_write(tc->regmap, DP0CTL,
+                          ((tc->link.base.capabilities &
+                            DP_LINK_CAP_ENHANCED_FRAMING) ? EF_EN : 0) |
+                          DP_EN);
+       if (ret)
+               return ret;
 
        /* wait */
+
        ret = tc_wait_link_training(tc);
        if (ret < 0)
-               goto err;
+               return ret;
 
        if (ret) {
                dev_err(tc->dev, "Link training phase 1 failed: %s\n",
                        training_pattern1_errors[ret]);
-               ret = -ENODEV;
-               goto err;
+               return -ENODEV;
        }
 
        /* Channel Equalization */
 
        /* Set DPCD 0x102 for Training Pattern 2 */
-       tc_write(DP0_SNKLTCTRL, DP_LINK_SCRAMBLING_DISABLE |
-                DP_TRAINING_PATTERN_2);
+       ret = regmap_write(tc->regmap, DP0_SNKLTCTRL,
+                          DP_LINK_SCRAMBLING_DISABLE |
+                          DP_TRAINING_PATTERN_2);
+       if (ret)
+               return ret;
 
-       tc_write(DP0_SRCCTRL, tc_srcctrl(tc) | DP0_SRCCTRL_SCRMBLDIS |
-                DP0_SRCCTRL_AUTOCORRECT | DP0_SRCCTRL_TP2);
+       ret = regmap_write(tc->regmap, DP0_SRCCTRL,
+                          tc_srcctrl(tc) | DP0_SRCCTRL_SCRMBLDIS |
+                          DP0_SRCCTRL_AUTOCORRECT |
+                          DP0_SRCCTRL_TP2);
+       if (ret)
+               return ret;
 
        /* wait */
        ret = tc_wait_link_training(tc);
        if (ret < 0)
-               goto err;
+               return ret;
 
        if (ret) {
                dev_err(tc->dev, "Link training phase 2 failed: %s\n",
                        training_pattern2_errors[ret]);
-               ret = -ENODEV;
-               goto err;
+               return -ENODEV;
        }
 
        /*
@@ -962,7 +1068,10 @@ static int tc_main_link_enable(struct tc_data *tc)
         */
 
        /* Clear Training Pattern, set AutoCorrect Mode = 1 */
-       tc_write(DP0_SRCCTRL, tc_srcctrl(tc) | DP0_SRCCTRL_AUTOCORRECT);
+       ret = regmap_write(tc->regmap, DP0_SRCCTRL, tc_srcctrl(tc) |
+                          DP0_SRCCTRL_AUTOCORRECT);
+       if (ret)
+               return ret;
 
        /* Clear DPCD 0x102 */
        /* Note: Can Not use DP0_SNKLTCTRL (0x06E4) short cut */
@@ -1006,7 +1115,7 @@ static int tc_main_link_enable(struct tc_data *tc)
                dev_err(dev, "0x0205 SINK_STATUS:               0x%02x\n", tmp[3]);
                dev_err(dev, "0x0206 ADJUST_REQUEST_LANE0_1:    0x%02x\n", tmp[4]);
                dev_err(dev, "0x0207 ADJUST_REQUEST_LANE2_3:    0x%02x\n", tmp[5]);
-               goto err;
+               return ret;
        }
 
        return 0;
@@ -1015,7 +1124,6 @@ err_dpcd_read:
        return ret;
 err_dpcd_write:
        dev_err(tc->dev, "Failed to write DPCD: %d\n", ret);
-err:
        return ret;
 }
 
@@ -1025,12 +1133,11 @@ static int tc_main_link_disable(struct tc_data *tc)
 
        dev_dbg(tc->dev, "link disable\n");
 
-       tc_write(DP0_SRCCTRL, 0);
-       tc_write(DP0CTL, 0);
+       ret = regmap_write(tc->regmap, DP0_SRCCTRL, 0);
+       if (ret)
+               return ret;
 
-       return 0;
-err:
-       return ret;
+       return regmap_write(tc->regmap, DP0CTL, 0);
 }
 
 static int tc_stream_enable(struct tc_data *tc)
@@ -1045,7 +1152,7 @@ static int tc_stream_enable(struct tc_data *tc)
                ret = tc_pxl_pll_en(tc, clk_get_rate(tc->refclk),
                                    1000 * tc->mode.clock);
                if (ret)
-                       goto err;
+                       return ret;
        }
 
        ret = tc_set_video_mode(tc, &tc->mode);
@@ -1060,7 +1167,9 @@ static int tc_stream_enable(struct tc_data *tc)
        value = VID_MN_GEN | DP_EN;
        if (tc->link.base.capabilities & DP_LINK_CAP_ENHANCED_FRAMING)
                value |= EF_EN;
-       tc_write(DP0CTL, value);
+       ret = regmap_write(tc->regmap, DP0CTL, value);
+       if (ret)
+               return ret;
        /*
         * VID_EN assertion should be delayed by at least N * LSCLK
         * cycles from the time VID_MN_GEN is enabled in order to
@@ -1070,36 +1179,35 @@ static int tc_stream_enable(struct tc_data *tc)
         */
        usleep_range(500, 1000);
        value |= VID_EN;
-       tc_write(DP0CTL, value);
+       ret = regmap_write(tc->regmap, DP0CTL, value);
+       if (ret)
+               return ret;
        /* Set input interface */
        value = DP0_AUDSRC_NO_INPUT;
        if (tc_test_pattern)
                value |= DP0_VIDSRC_COLOR_BAR;
        else
                value |= DP0_VIDSRC_DPI_RX;
-       tc_write(SYSCTRL, value);
+       ret = regmap_write(tc->regmap, SYSCTRL, value);
+       if (ret)
+               return ret;
 
        return 0;
-err:
-       return ret;
 }
 
 static int tc_stream_disable(struct tc_data *tc)
 {
        int ret;
-       u32 val;
 
        dev_dbg(tc->dev, "disable video stream\n");
 
-       tc_read(DP0CTL, &val);
-       val &= ~VID_EN;
-       tc_write(DP0CTL, val);
+       ret = regmap_update_bits(tc->regmap, DP0CTL, VID_EN, 0);
+       if (ret)
+               return ret;
 
        tc_pxl_pll_dis(tc);
 
        return 0;
-err:
-       return ret;
 }
 
 static void tc_bridge_pre_enable(struct drm_bridge *bridge)
@@ -1251,7 +1359,9 @@ static enum drm_connector_status tc_connector_detect(struct drm_connector *conne
                        return connector_status_unknown;
        }
 
-       tc_read(GPIOI, &val);
+       ret = regmap_read(tc->regmap, GPIOI, &val);
+       if (ret)
+               return connector_status_unknown;
 
        conn = val & BIT(tc->hpd_pin);
 
@@ -1259,9 +1369,6 @@ static enum drm_connector_status tc_connector_detect(struct drm_connector *conne
                return connector_status_connected;
        else
                return connector_status_disconnected;
-
-err:
-       return connector_status_unknown;
 }
 
 static const struct drm_connector_funcs tc_connector_funcs = {
@@ -1497,6 +1604,22 @@ static int tc_probe(struct i2c_client *client, const struct i2c_device_id *id)
 
        tc->assr = (tc->rev == 0x6601); /* Enable ASSR for eDP panels */
 
+       if (!tc->reset_gpio) {
+               /*
+                * If the reset pin isn't present, do a software reset. It isn't
+                * as thorough as the hardware reset, as we can't reset the I2C
+                * communication block for obvious reasons, but it's getting the
+                * chip into a defined state.
+                */
+               regmap_update_bits(tc->regmap, SYSRSTENB,
+                               ENBLCD0 | ENBBM | ENBDSIRX | ENBREG | ENBHDCP,
+                               0);
+               regmap_update_bits(tc->regmap, SYSRSTENB,
+                               ENBLCD0 | ENBBM | ENBDSIRX | ENBREG | ENBHDCP,
+                               ENBLCD0 | ENBBM | ENBDSIRX | ENBREG | ENBHDCP);
+               usleep_range(5000, 10000);
+       }
+
        if (tc->hpd_pin >= 0) {
                u32 lcnt_reg = tc->hpd_pin == 0 ? INT_GP0_LCNT : INT_GP1_LCNT;
                u32 h_lc = INT_GPIO_H(tc->hpd_pin) | INT_GPIO_LC(tc->hpd_pin);
index b77a52d05061b490affb131f4b9c2c61981792a8..0a580957c8cf12e9ba7a2dfc3e1ad0abb3113e73 100644 (file)
@@ -1,9 +1,11 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
  * Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ * datasheet: http://www.ti.com/lit/ds/symlink/sn65dsi86.pdf
  */
 
 #include <linux/clk.h>
+#include <linux/debugfs.h>
 #include <linux/gpio/consumer.h>
 #include <linux/i2c.h>
 #include <linux/iopoll.h>
@@ -90,6 +92,7 @@ struct ti_sn_bridge {
        struct drm_dp_aux               aux;
        struct drm_bridge               bridge;
        struct drm_connector            connector;
+       struct dentry                   *debugfs;
        struct device_node              *host_node;
        struct mipi_dsi_device          *dsi;
        struct clk                      *refclk;
@@ -155,6 +158,42 @@ static const struct dev_pm_ops ti_sn_bridge_pm_ops = {
        SET_RUNTIME_PM_OPS(ti_sn_bridge_suspend, ti_sn_bridge_resume, NULL)
 };
 
+static int status_show(struct seq_file *s, void *data)
+{
+       struct ti_sn_bridge *pdata = s->private;
+       unsigned int reg, val;
+
+       seq_puts(s, "STATUS REGISTERS:\n");
+
+       pm_runtime_get_sync(pdata->dev);
+
+       /* IRQ Status Registers, see Table 31 in datasheet */
+       for (reg = 0xf0; reg <= 0xf8; reg++) {
+               regmap_read(pdata->regmap, reg, &val);
+               seq_printf(s, "[0x%02x] = 0x%08x\n", reg, val);
+       }
+
+       pm_runtime_put(pdata->dev);
+
+       return 0;
+}
+
+DEFINE_SHOW_ATTRIBUTE(status);
+
+static void ti_sn_debugfs_init(struct ti_sn_bridge *pdata)
+{
+       pdata->debugfs = debugfs_create_dir(dev_name(pdata->dev), NULL);
+
+       debugfs_create_file("status", 0600, pdata->debugfs, pdata,
+                       &status_fops);
+}
+
+static void ti_sn_debugfs_remove(struct ti_sn_bridge *pdata)
+{
+       debugfs_remove_recursive(pdata->debugfs);
+       pdata->debugfs = NULL;
+}
+
 /* Connector funcs */
 static struct ti_sn_bridge *
 connector_to_ti_sn_bridge(struct drm_connector *connector)
@@ -275,8 +314,7 @@ static int ti_sn_bridge_attach(struct drm_bridge *bridge)
        /* TODO: setting to 4 lanes always for now */
        dsi->lanes = 4;
        dsi->format = MIPI_DSI_FMT_RGB888;
-       dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
-                         MIPI_DSI_MODE_EOT_PACKET | MIPI_DSI_MODE_VIDEO_HSE;
+       dsi->mode_flags = MIPI_DSI_MODE_VIDEO;
 
        /* check if continuous dsi clock is required or not */
        pm_runtime_get_sync(pdata->dev);
@@ -731,6 +769,8 @@ static int ti_sn_bridge_probe(struct i2c_client *client,
 
        drm_bridge_add(&pdata->bridge);
 
+       ti_sn_debugfs_init(pdata);
+
        return 0;
 }
 
@@ -741,6 +781,8 @@ static int ti_sn_bridge_remove(struct i2c_client *client)
        if (!pdata)
                return -EINVAL;
 
+       ti_sn_debugfs_remove(pdata);
+
        of_node_put(pdata->host_node);
 
        pm_runtime_disable(pdata->dev);
index be4ea370ba31ad98a5bb22abd5c299adb890d6cd..36a69aec8a4ba5fe94f38ce1c79d711336f0e1f4 100644 (file)
@@ -513,7 +513,7 @@ static void cirrus_mode_config_init(struct cirrus_device *cirrus)
 DEFINE_DRM_GEM_SHMEM_FOPS(cirrus_fops);
 
 static struct drm_driver cirrus_driver = {
-       .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC | DRIVER_PRIME,
+       .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
 
        .name            = DRIVER_NAME,
        .desc            = DRIVER_DESC,
index 117b8ee98243d2bfdc590dfdeeac1dd7d67d9a4e..6e09f27fd9d63cea5c832740dc36104f473644c9 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*
  * \file drm_agpsupport.c
  * DRM support for AGP/GART backend
  *
@@ -465,46 +465,3 @@ void drm_legacy_agp_clear(struct drm_device *dev)
        dev->agp->acquired = 0;
        dev->agp->enabled = 0;
 }
-
-/**
- * Binds a collection of pages into AGP memory at the given offset, returning
- * the AGP memory structure containing them.
- *
- * No reference is held on the pages during this time -- it is up to the
- * caller to handle that.
- */
-struct agp_memory *
-drm_agp_bind_pages(struct drm_device *dev,
-                  struct page **pages,
-                  unsigned long num_pages,
-                  uint32_t gtt_offset,
-                  u32 type)
-{
-       struct agp_memory *mem;
-       int ret, i;
-
-       DRM_DEBUG("\n");
-
-       mem = agp_allocate_memory(dev->agp->bridge, num_pages,
-                                     type);
-       if (mem == NULL) {
-               DRM_ERROR("Failed to allocate memory for %ld pages\n",
-                         num_pages);
-               return NULL;
-       }
-
-       for (i = 0; i < num_pages; i++)
-               mem->pages[i] = pages[i];
-       mem->page_count = num_pages;
-
-       mem->is_flushed = true;
-       ret = agp_bind_memory(mem, gtt_offset / PAGE_SIZE);
-       if (ret != 0) {
-               DRM_ERROR("Failed to bind AGP memory: %d\n", ret);
-               agp_free_memory(mem);
-               return NULL;
-       }
-
-       return mem;
-}
-EXPORT_SYMBOL(drm_agp_bind_pages);
index 410572f142577e91116159246c56b26c67a4d572..d9a2e3695525c0cceb624b625e595357c489c81b 100644 (file)
@@ -59,7 +59,6 @@ static void drm_client_close(struct drm_client_dev *client)
 
        drm_file_free(client->file);
 }
-EXPORT_SYMBOL(drm_client_close);
 
 /**
  * drm_client_init - Initialise a DRM client
@@ -254,7 +253,6 @@ drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height, u
        struct drm_device *dev = client->dev;
        struct drm_client_buffer *buffer;
        struct drm_gem_object *obj;
-       void *vaddr;
        int ret;
 
        buffer = kzalloc(sizeof(*buffer), GFP_KERNEL);
@@ -281,6 +279,36 @@ drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height, u
 
        buffer->gem = obj;
 
+       return buffer;
+
+err_delete:
+       drm_client_buffer_delete(buffer);
+
+       return ERR_PTR(ret);
+}
+
+/**
+ * drm_client_buffer_vmap - Map DRM client buffer into address space
+ * @buffer: DRM client buffer
+ *
+ * This function maps a client buffer into kernel address space. If the
+ * buffer is already mapped, it returns the mapping's address.
+ *
+ * Client buffer mappings are not ref'counted. Each call to
+ * drm_client_buffer_vmap() should be followed by a call to
+ * drm_client_buffer_vunmap(); or the client buffer should be mapped
+ * throughout its lifetime.
+ *
+ * Returns:
+ *     The mapped memory's address
+ */
+void *drm_client_buffer_vmap(struct drm_client_buffer *buffer)
+{
+       void *vaddr;
+
+       if (buffer->vaddr)
+               return buffer->vaddr;
+
        /*
         * FIXME: The dependency on GEM here isn't required, we could
         * convert the driver handle to a dma-buf instead and use the
@@ -289,21 +317,30 @@ drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height, u
         * fd_install step out of the driver backend hooks, to make that
         * final step optional for internal users.
         */
-       vaddr = drm_gem_vmap(obj);
-       if (IS_ERR(vaddr)) {
-               ret = PTR_ERR(vaddr);
-               goto err_delete;
-       }
+       vaddr = drm_gem_vmap(buffer->gem);
+       if (IS_ERR(vaddr))
+               return vaddr;
 
        buffer->vaddr = vaddr;
 
-       return buffer;
-
-err_delete:
-       drm_client_buffer_delete(buffer);
+       return vaddr;
+}
+EXPORT_SYMBOL(drm_client_buffer_vmap);
 
-       return ERR_PTR(ret);
+/**
+ * drm_client_buffer_vunmap - Unmap DRM client buffer
+ * @buffer: DRM client buffer
+ *
+ * This function removes a client buffer's memory mapping. Calling this
+ * function is only required by clients that manage their buffer mappings
+ * by themselves.
+ */
+void drm_client_buffer_vunmap(struct drm_client_buffer *buffer)
+{
+       drm_gem_vunmap(buffer->gem, buffer->vaddr);
+       buffer->vaddr = NULL;
 }
+EXPORT_SYMBOL(drm_client_buffer_vunmap);
 
 static void drm_client_buffer_rmfb(struct drm_client_buffer *buffer)
 {
index b3f2cf7eae9c3388ef8b544346dbc5b649174bc7..068d4b05f1be9a797a679f15ebb0a2a5d2369511 100644 (file)
@@ -140,8 +140,7 @@ static void drm_connector_get_cmdline_mode(struct drm_connector *connector)
        }
 
        DRM_DEBUG_KMS("cmdline mode for connector %s %s %dx%d@%dHz%s%s%s\n",
-                     connector->name,
-                     mode->name,
+                     connector->name, mode->name,
                      mode->xres, mode->yres,
                      mode->refresh_specified ? mode->refresh : 60,
                      mode->rb ? " reduced blanking" : "",
index 5ef0227eaa0e3a0fafb837e812c0e65f5c8237f9..e45b07890c5a90dbb0707752afbd9c340354b1e9 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*
  * \file drm_dma.c
  * DMA IOCTL and function support
  *
index 0b994d083a8903580999f381ebf740e516db4162..ffc68d305afe434c01cdaad5cad87969ac49b07c 100644 (file)
@@ -152,38 +152,15 @@ EXPORT_SYMBOL(drm_dp_link_train_channel_eq_delay);
 
 u8 drm_dp_link_rate_to_bw_code(int link_rate)
 {
-       switch (link_rate) {
-       default:
-               WARN(1, "unknown DP link rate %d, using %x\n", link_rate,
-                    DP_LINK_BW_1_62);
-               /* fall through */
-       case 162000:
-               return DP_LINK_BW_1_62;
-       case 270000:
-               return DP_LINK_BW_2_7;
-       case 540000:
-               return DP_LINK_BW_5_4;
-       case 810000:
-               return DP_LINK_BW_8_1;
-       }
+       /* Spec says link_bw = link_rate / 0.27Gbps */
+       return link_rate / 27000;
 }
 EXPORT_SYMBOL(drm_dp_link_rate_to_bw_code);
 
 int drm_dp_bw_code_to_link_rate(u8 link_bw)
 {
-       switch (link_bw) {
-       default:
-               WARN(1, "unknown DP link BW code %x, using 162000\n", link_bw);
-               /* fall through */
-       case DP_LINK_BW_1_62:
-               return 162000;
-       case DP_LINK_BW_2_7:
-               return 270000;
-       case DP_LINK_BW_5_4:
-               return 540000;
-       case DP_LINK_BW_8_1:
-               return 810000;
-       }
+       /* Spec says link_rate = link_bw * 0.27Gbps */
+       return link_bw * 27000;
 }
 EXPORT_SYMBOL(drm_dp_bw_code_to_link_rate);
 
index 9d00947ca447fc9555d2abc4194bf95dad799207..e652305d8f98acd71376aed8bbdc5ca3d9014458 100644 (file)
@@ -978,14 +978,14 @@ int drm_dev_register(struct drm_device *dev, unsigned long flags)
        if (ret)
                goto err_minors;
 
-       dev->registered = true;
-
        if (dev->driver->load) {
                ret = dev->driver->load(dev, flags);
                if (ret)
                        goto err_minors;
        }
 
+       dev->registered = true;
+
        if (drm_core_check_feature(dev, DRIVER_MODESET))
                drm_modeset_register_all(dev);
 
index 1984e5c54d580504fb3417d50afca9e1dd6aa105..a7ba5b4902d664fb72917b9f999b683c3fcaec58 100644 (file)
@@ -403,6 +403,7 @@ static void drm_fb_helper_dirty_work(struct work_struct *work)
        struct drm_clip_rect *clip = &helper->dirty_clip;
        struct drm_clip_rect clip_copy;
        unsigned long flags;
+       void *vaddr;
 
        spin_lock_irqsave(&helper->dirty_lock, flags);
        clip_copy = *clip;
@@ -412,10 +413,20 @@ static void drm_fb_helper_dirty_work(struct work_struct *work)
 
        /* call dirty callback only when it has been really touched */
        if (clip_copy.x1 < clip_copy.x2 && clip_copy.y1 < clip_copy.y2) {
+
                /* Generic fbdev uses a shadow buffer */
-               if (helper->buffer)
+               if (helper->buffer) {
+                       vaddr = drm_client_buffer_vmap(helper->buffer);
+                       if (IS_ERR(vaddr))
+                               return;
                        drm_fb_helper_dirty_blit_real(helper, &clip_copy);
-               helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, &clip_copy, 1);
+               }
+               if (helper->fb->funcs->dirty)
+                       helper->fb->funcs->dirty(helper->fb, NULL, 0, 0,
+                                                &clip_copy, 1);
+
+               if (helper->buffer)
+                       drm_client_buffer_vunmap(helper->buffer);
        }
 }
 
@@ -604,6 +615,16 @@ void drm_fb_helper_unlink_fbi(struct drm_fb_helper *fb_helper)
 }
 EXPORT_SYMBOL(drm_fb_helper_unlink_fbi);
 
+static bool drm_fbdev_use_shadow_fb(struct drm_fb_helper *fb_helper)
+{
+       struct drm_device *dev = fb_helper->dev;
+       struct drm_framebuffer *fb = fb_helper->fb;
+
+       return dev->mode_config.prefer_shadow_fbdev ||
+              dev->mode_config.prefer_shadow ||
+              fb->funcs->dirty;
+}
+
 static void drm_fb_helper_dirty(struct fb_info *info, u32 x, u32 y,
                                u32 width, u32 height)
 {
@@ -611,7 +632,7 @@ static void drm_fb_helper_dirty(struct fb_info *info, u32 x, u32 y,
        struct drm_clip_rect *clip = &helper->dirty_clip;
        unsigned long flags;
 
-       if (!helper->fb->funcs->dirty)
+       if (!drm_fbdev_use_shadow_fb(helper))
                return;
 
        spin_lock_irqsave(&helper->dirty_lock, flags);
@@ -2178,6 +2199,7 @@ int drm_fb_helper_generic_probe(struct drm_fb_helper *fb_helper,
        struct drm_framebuffer *fb;
        struct fb_info *fbi;
        u32 format;
+       void *vaddr;
 
        DRM_DEBUG_KMS("surface width(%d), height(%d) and bpp(%d)\n",
                      sizes->surface_width, sizes->surface_height,
@@ -2200,16 +2222,10 @@ int drm_fb_helper_generic_probe(struct drm_fb_helper *fb_helper,
        fbi->fbops = &drm_fbdev_fb_ops;
        fbi->screen_size = fb->height * fb->pitches[0];
        fbi->fix.smem_len = fbi->screen_size;
-       fbi->screen_buffer = buffer->vaddr;
-       /* Shamelessly leak the physical address to user-space */
-#if IS_ENABLED(CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM)
-       if (drm_leak_fbdev_smem && fbi->fix.smem_start == 0)
-               fbi->fix.smem_start =
-                       page_to_phys(virt_to_page(fbi->screen_buffer));
-#endif
+
        drm_fb_helper_fill_info(fbi, fb_helper, sizes);
 
-       if (fb->funcs->dirty) {
+       if (drm_fbdev_use_shadow_fb(fb_helper)) {
                struct fb_ops *fbops;
                void *shadow;
 
@@ -2231,6 +2247,19 @@ int drm_fb_helper_generic_probe(struct drm_fb_helper *fb_helper,
                fbi->fbdefio = &drm_fbdev_defio;
 
                fb_deferred_io_init(fbi);
+       } else {
+               /* buffer is mapped for HW framebuffer */
+               vaddr = drm_client_buffer_vmap(fb_helper->buffer);
+               if (IS_ERR(vaddr))
+                       return PTR_ERR(vaddr);
+
+               fbi->screen_buffer = vaddr;
+               /* Shamelessly leak the physical address to user-space */
+#if IS_ENABLED(CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM)
+               if (drm_leak_fbdev_smem && fbi->fix.smem_start == 0)
+                       fbi->fix.smem_start =
+                               page_to_phys(virt_to_page(fbi->screen_buffer));
+#endif
        }
 
        return 0;
index 754af25fe25589fcf2fdf5f0ff5e8215b28fda33..ea34bc991858cf1270e997405e5f647a9e99c2dd 100644 (file)
@@ -147,8 +147,7 @@ struct drm_file *drm_file_alloc(struct drm_minor *minor)
        if (drm_core_check_feature(dev, DRIVER_SYNCOBJ))
                drm_syncobj_open(file);
 
-       if (drm_core_check_feature(dev, DRIVER_PRIME))
-               drm_prime_init_file_private(&file->prime);
+       drm_prime_init_file_private(&file->prime);
 
        if (dev->driver->open) {
                ret = dev->driver->open(dev, file);
@@ -159,8 +158,7 @@ struct drm_file *drm_file_alloc(struct drm_minor *minor)
        return file;
 
 out_prime_destroy:
-       if (drm_core_check_feature(dev, DRIVER_PRIME))
-               drm_prime_destroy_file_private(&file->prime);
+       drm_prime_destroy_file_private(&file->prime);
        if (drm_core_check_feature(dev, DRIVER_SYNCOBJ))
                drm_syncobj_release(file);
        if (drm_core_check_feature(dev, DRIVER_GEM))
@@ -253,8 +251,7 @@ void drm_file_free(struct drm_file *file)
        if (dev->driver->postclose)
                dev->driver->postclose(dev, file);
 
-       if (drm_core_check_feature(dev, DRIVER_PRIME))
-               drm_prime_destroy_file_private(&file->prime);
+       drm_prime_destroy_file_private(&file->prime);
 
        WARN_ON(!list_empty(&file->event_list));
 
index a8c4468f03d9166bd257f2bde65cbfbc7fe05ee5..243f43d70f42c7ab00e0d161172df18b7b8749b1 100644 (file)
@@ -39,6 +39,7 @@
 #include <linux/mem_encrypt.h>
 #include <linux/pagevec.h>
 
+#include <drm/drm.h>
 #include <drm/drm_device.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_file.h>
@@ -254,8 +255,7 @@ drm_gem_object_release_handle(int id, void *ptr, void *data)
        else if (dev->driver->gem_close_object)
                dev->driver->gem_close_object(obj, file_priv);
 
-       if (drm_core_check_feature(dev, DRIVER_PRIME))
-               drm_gem_remove_prime_handles(obj, file_priv);
+       drm_gem_remove_prime_handles(obj, file_priv);
        drm_vma_node_revoke(&obj->vma_node, file_priv);
 
        drm_gem_object_handle_put_unlocked(obj);
index 8fcbabf02dfd5fbec5fbab94317873076de2c94c..f6130405478691cac4839efa2bcd95263c312cd2 100644 (file)
@@ -271,11 +271,11 @@ EXPORT_SYMBOL_GPL(drm_gem_fb_create_with_dirty);
  * @plane: Plane
  * @state: Plane state the fence will be attached to
  *
- * This function prepares a GEM backed framebuffer for scanout by checking if
- * the plane framebuffer has a DMA-BUF attached. If it does, it extracts the
- * exclusive fence and attaches it to the plane state for the atomic helper to
- * wait on. This function can be used as the &drm_plane_helper_funcs.prepare_fb
- * callback.
+ * This function extracts the exclusive fence from &drm_gem_object.resv and
+ * attaches it to plane state for the atomic helper to wait on. This is
+ * necessary to correctly implement implicit synchronization for any buffers
+ * shared as a struct &dma_buf. This function can be used as the
+ * &drm_plane_helper_funcs.prepare_fb callback.
  *
  * There is no need for &drm_plane_helper_funcs.cleanup_fb hook for simple
  * gem based framebuffer drivers which have their buffers always pinned in
@@ -287,17 +287,15 @@ EXPORT_SYMBOL_GPL(drm_gem_fb_create_with_dirty);
 int drm_gem_fb_prepare_fb(struct drm_plane *plane,
                          struct drm_plane_state *state)
 {
-       struct dma_buf *dma_buf;
+       struct drm_gem_object *obj;
        struct dma_fence *fence;
 
        if (!state->fb)
                return 0;
 
-       dma_buf = drm_gem_fb_get_obj(state->fb, 0)->dma_buf;
-       if (dma_buf) {
-               fence = reservation_object_get_excl_rcu(dma_buf->resv);
-               drm_atomic_set_fence_for_plane(state, fence);
-       }
+       obj = drm_gem_fb_get_obj(state->fb, 0);
+       fence = reservation_object_get_excl_rcu(obj->resv);
+       drm_atomic_set_fence_for_plane(state, fence);
 
        return 0;
 }
@@ -309,10 +307,11 @@ EXPORT_SYMBOL_GPL(drm_gem_fb_prepare_fb);
  * @pipe: Simple display pipe
  * @plane_state: Plane state
  *
- * This function uses drm_gem_fb_prepare_fb() to check if the plane FB has a
- * &dma_buf attached, extracts the exclusive fence and attaches it to plane
- * state for the atomic helper to wait on. Drivers can use this as their
- * &drm_simple_display_pipe_funcs.prepare_fb callback.
+ * This function uses drm_gem_fb_prepare_fb() to extract the exclusive fence
+ * from &drm_gem_object.resv and attaches it to plane state for the atomic
+ * helper to wait on. This is necessary to correctly implement implicit
+ * synchronization for any buffers shared as a struct &dma_buf. Drivers can use
+ * this as their &drm_simple_display_pipe_funcs.prepare_fb callback.
  *
  * See drm_atomic_set_fence_for_plane() for a discussion of implicit and
  * explicit fencing in atomic modeset updates.
@@ -323,46 +322,3 @@ int drm_gem_fb_simple_display_pipe_prepare_fb(struct drm_simple_display_pipe *pi
        return drm_gem_fb_prepare_fb(&pipe->plane, plane_state);
 }
 EXPORT_SYMBOL(drm_gem_fb_simple_display_pipe_prepare_fb);
-
-/**
- * drm_gem_fbdev_fb_create - Create a GEM backed &drm_framebuffer for fbdev
- *                           emulation
- * @dev: DRM device
- * @sizes: fbdev size description
- * @pitch_align: Optional pitch alignment
- * @obj: GEM object backing the framebuffer
- * @funcs: Optional vtable to be used for the new framebuffer object when the
- *         dirty callback is needed.
- *
- * This function creates a framebuffer from a &drm_fb_helper_surface_size
- * description for use in the &drm_fb_helper_funcs.fb_probe callback.
- *
- * Returns:
- * Pointer to a &drm_framebuffer on success or an error pointer on failure.
- */
-struct drm_framebuffer *
-drm_gem_fbdev_fb_create(struct drm_device *dev,
-                       struct drm_fb_helper_surface_size *sizes,
-                       unsigned int pitch_align, struct drm_gem_object *obj,
-                       const struct drm_framebuffer_funcs *funcs)
-{
-       struct drm_mode_fb_cmd2 mode_cmd = { 0 };
-
-       mode_cmd.width = sizes->surface_width;
-       mode_cmd.height = sizes->surface_height;
-       mode_cmd.pitches[0] = sizes->surface_width *
-                             DIV_ROUND_UP(sizes->surface_bpp, 8);
-       if (pitch_align)
-               mode_cmd.pitches[0] = roundup(mode_cmd.pitches[0],
-                                             pitch_align);
-       mode_cmd.pixel_format = drm_driver_legacy_fb_format(dev, sizes->surface_bpp,
-                                                           sizes->surface_depth);
-       if (obj->size < mode_cmd.pitches[0] * mode_cmd.height)
-               return ERR_PTR(-EINVAL);
-
-       if (!funcs)
-               funcs = &drm_gem_fb_funcs;
-
-       return drm_gem_fb_alloc(dev, &mode_cmd, &obj, 1, funcs);
-}
-EXPORT_SYMBOL(drm_gem_fbdev_fb_create);
index 472ea5d81f825b25de7c5bf3702a8333921b4771..2f64667ac8055a7dec6f92fe5fa0ab0cd4b31290 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/slab.h>
 #include <linux/vmalloc.h>
 
+#include <drm/drm.h>
 #include <drm/drm_device.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_gem_shmem_helper.h>
index 4de782ca26b208727f63b4dbf0bd78a781514056..e0fbfb6570cfc99e024047d6cec6fc745db5a3ca 100644 (file)
@@ -7,6 +7,8 @@
 #include <drm/drm_vram_mm_helper.h>
 #include <drm/ttm/ttm_page_alloc.h>
 
+static const struct drm_gem_object_funcs drm_gem_vram_object_funcs;
+
 /**
  * DOC: overview
  *
@@ -80,6 +82,9 @@ static int drm_gem_vram_init(struct drm_device *dev,
        int ret;
        size_t acc_size;
 
+       if (!gbo->gem.funcs)
+               gbo->gem.funcs = &drm_gem_vram_object_funcs;
+
        ret = drm_gem_object_init(dev, &gbo->gem, size);
        if (ret)
                return ret;
@@ -460,21 +465,24 @@ const struct drm_vram_mm_funcs drm_gem_vram_mm_funcs = {
 EXPORT_SYMBOL(drm_gem_vram_mm_funcs);
 
 /*
- * Helpers for struct drm_driver
+ * Helpers for struct drm_gem_object_funcs
  */
 
 /**
- * drm_gem_vram_driver_gem_free_object_unlocked() - \
-       Implements &struct drm_driver.gem_free_object_unlocked
- * @gem:       GEM object. Refers to &struct drm_gem_vram_object.gem
+ * drm_gem_vram_object_free() - \
+       Implements &struct drm_gem_object_funcs.free
+ * @gem:       GEM object. Refers to &struct drm_gem_vram_object.gem
  */
-void drm_gem_vram_driver_gem_free_object_unlocked(struct drm_gem_object *gem)
+static void drm_gem_vram_object_free(struct drm_gem_object *gem)
 {
        struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(gem);
 
        drm_gem_vram_put(gbo);
 }
-EXPORT_SYMBOL(drm_gem_vram_driver_gem_free_object_unlocked);
+
+/*
+ * Helpers for dump buffers
+ */
 
 /**
  * drm_gem_vram_driver_create_dumb() - \
@@ -536,19 +544,19 @@ int drm_gem_vram_driver_dumb_mmap_offset(struct drm_file *file,
 EXPORT_SYMBOL(drm_gem_vram_driver_dumb_mmap_offset);
 
 /*
- * PRIME helpers for struct drm_driver
+ * PRIME helpers
  */
 
 /**
- * drm_gem_vram_driver_gem_prime_pin() - \
-       Implements &struct drm_driver.gem_prime_pin
+ * drm_gem_vram_object_pin() - \
+       Implements &struct drm_gem_object_funcs.pin
  * @gem:       The GEM object to pin
  *
  * Returns:
  * 0 on success, or
  * a negative errno code otherwise.
  */
-int drm_gem_vram_driver_gem_prime_pin(struct drm_gem_object *gem)
+static int drm_gem_vram_object_pin(struct drm_gem_object *gem)
 {
        struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(gem);
 
@@ -562,31 +570,29 @@ int drm_gem_vram_driver_gem_prime_pin(struct drm_gem_object *gem)
         */
        return drm_gem_vram_pin(gbo, 0);
 }
-EXPORT_SYMBOL(drm_gem_vram_driver_gem_prime_pin);
 
 /**
- * drm_gem_vram_driver_gem_prime_unpin() - \
-       Implements &struct drm_driver.gem_prime_unpin
+ * drm_gem_vram_object_unpin() - \
+       Implements &struct drm_gem_object_funcs.unpin
  * @gem:       The GEM object to unpin
  */
-void drm_gem_vram_driver_gem_prime_unpin(struct drm_gem_object *gem)
+static void drm_gem_vram_object_unpin(struct drm_gem_object *gem)
 {
        struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(gem);
 
        drm_gem_vram_unpin(gbo);
 }
-EXPORT_SYMBOL(drm_gem_vram_driver_gem_prime_unpin);
 
 /**
- * drm_gem_vram_driver_gem_prime_vmap() - \
-       Implements &struct drm_driver.gem_prime_vmap
+ * drm_gem_vram_object_vmap() - \
+       Implements &struct drm_gem_object_funcs.vmap
  * @gem:       The GEM object to map
  *
  * Returns:
  * The buffers virtual address on success, or
  * NULL otherwise.
  */
-void *drm_gem_vram_driver_gem_prime_vmap(struct drm_gem_object *gem)
+static void *drm_gem_vram_object_vmap(struct drm_gem_object *gem)
 {
        struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(gem);
        int ret;
@@ -602,40 +608,30 @@ void *drm_gem_vram_driver_gem_prime_vmap(struct drm_gem_object *gem)
        }
        return base;
 }
-EXPORT_SYMBOL(drm_gem_vram_driver_gem_prime_vmap);
 
 /**
- * drm_gem_vram_driver_gem_prime_vunmap() - \
-       Implements &struct drm_driver.gem_prime_vunmap
+ * drm_gem_vram_object_vunmap() - \
+       Implements &struct drm_gem_object_funcs.vunmap
  * @gem:       The GEM object to unmap
  * @vaddr:     The mapping's base address
  */
-void drm_gem_vram_driver_gem_prime_vunmap(struct drm_gem_object *gem,
-                                         void *vaddr)
+static void drm_gem_vram_object_vunmap(struct drm_gem_object *gem,
+                                      void *vaddr)
 {
        struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(gem);
 
        drm_gem_vram_kunmap(gbo);
        drm_gem_vram_unpin(gbo);
 }
-EXPORT_SYMBOL(drm_gem_vram_driver_gem_prime_vunmap);
 
-/**
- * drm_gem_vram_driver_gem_prime_mmap() - \
-       Implements &struct drm_driver.gem_prime_mmap
- * @gem:       The GEM object to map
- * @vma:       The VMA describing the mapping
- *
- * Returns:
- * 0 on success, or
- * a negative errno code otherwise.
+/*
+ * GEM object funcs
  */
-int drm_gem_vram_driver_gem_prime_mmap(struct drm_gem_object *gem,
-                                      struct vm_area_struct *vma)
-{
-       struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(gem);
 
-       gbo->gem.vma_node.vm_node.start = gbo->bo.vma_node.vm_node.start;
-       return drm_gem_prime_mmap(gem, vma);
-}
-EXPORT_SYMBOL(drm_gem_vram_driver_gem_prime_mmap);
+static const struct drm_gem_object_funcs drm_gem_vram_object_funcs = {
+       .free   = drm_gem_vram_object_free,
+       .pin    = drm_gem_vram_object_pin,
+       .unpin  = drm_gem_vram_object_unpin,
+       .vmap   = drm_gem_vram_object_vmap,
+       .vunmap = drm_gem_vram_object_vunmap
+};
index a16b6dc2fa4749529a3d4dc94cfc8a43aa3cacbe..22c7fd7196c82b1c0ea6e3c288471323fe9396d1 100644 (file)
@@ -108,7 +108,7 @@ static int compat_drm_version(struct file *file, unsigned int cmd,
                .desc = compat_ptr(v32.desc),
        };
        err = drm_ioctl_kernel(file, drm_version, &v,
-                              DRM_UNLOCKED|DRM_RENDER_ALLOW);
+                              DRM_RENDER_ALLOW);
        if (err)
                return err;
 
@@ -142,7 +142,7 @@ static int compat_drm_getunique(struct file *file, unsigned int cmd,
                .unique = compat_ptr(uq32.unique),
        };
 
-       err = drm_ioctl_kernel(file, drm_getunique, &uq, DRM_UNLOCKED);
+       err = drm_ioctl_kernel(file, drm_getunique, &uq, 0);
        if (err)
                return err;
 
@@ -181,7 +181,7 @@ static int compat_drm_getmap(struct file *file, unsigned int cmd,
                return -EFAULT;
 
        map.offset = m32.offset;
-       err = drm_ioctl_kernel(file, drm_legacy_getmap_ioctl, &map, DRM_UNLOCKED);
+       err = drm_ioctl_kernel(file, drm_legacy_getmap_ioctl, &map, 0);
        if (err)
                return err;
 
@@ -267,7 +267,7 @@ static int compat_drm_getclient(struct file *file, unsigned int cmd,
 
        client.idx = c32.idx;
 
-       err = drm_ioctl_kernel(file, drm_getclient, &client, DRM_UNLOCKED);
+       err = drm_ioctl_kernel(file, drm_getclient, &client, 0);
        if (err)
                return err;
 
@@ -297,7 +297,7 @@ static int compat_drm_getstats(struct file *file, unsigned int cmd,
        drm_stats32_t __user *argp = (void __user *)arg;
        int err;
 
-       err = drm_ioctl_kernel(file, drm_noop, NULL, DRM_UNLOCKED);
+       err = drm_ioctl_kernel(file, drm_noop, NULL, 0);
        if (err)
                return err;
 
@@ -895,8 +895,7 @@ static int compat_drm_mode_addfb2(struct file *file, unsigned int cmd,
                           sizeof(req64.modifier)))
                return -EFAULT;
 
-       err = drm_ioctl_kernel(file, drm_mode_addfb2, &req64,
-                              DRM_UNLOCKED);
+       err = drm_ioctl_kernel(file, drm_mode_addfb2, &req64, 0);
        if (err)
                return err;
 
index bd810454d2391dfb6e51a4345d4e2500fb3403f4..f675a3bb2c884b5ff03e74b5e9f43aa5b83faef1 100644 (file)
@@ -570,24 +570,23 @@ EXPORT_SYMBOL(drm_ioctl_permit);
 
 /* Ioctl table */
 static const struct drm_ioctl_desc drm_ioctls[] = {
-       DRM_IOCTL_DEF(DRM_IOCTL_VERSION, drm_version,
-                     DRM_UNLOCKED|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF(DRM_IOCTL_GET_UNIQUE, drm_getunique, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_GET_MAGIC, drm_getmagic, DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_VERSION, drm_version, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF(DRM_IOCTL_GET_UNIQUE, drm_getunique, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_GET_MAGIC, drm_getmagic, 0),
        DRM_IOCTL_DEF(DRM_IOCTL_IRQ_BUSID, drm_irq_by_busid, DRM_MASTER|DRM_ROOT_ONLY),
 
-       DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_GET_MAP, drm_legacy_getmap_ioctl, DRM_UNLOCKED),
+       DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_GET_MAP, drm_legacy_getmap_ioctl, 0),
 
-       DRM_IOCTL_DEF(DRM_IOCTL_GET_CLIENT, drm_getclient, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_GET_STATS, drm_getstats, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_GET_CAP, drm_getcap, DRM_UNLOCKED|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF(DRM_IOCTL_SET_CLIENT_CAP, drm_setclientcap, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_SET_VERSION, drm_setversion, DRM_UNLOCKED | DRM_MASTER),
+       DRM_IOCTL_DEF(DRM_IOCTL_GET_CLIENT, drm_getclient, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_GET_STATS, drm_getstats, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_GET_CAP, drm_getcap, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF(DRM_IOCTL_SET_CLIENT_CAP, drm_setclientcap, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_SET_VERSION, drm_setversion, DRM_MASTER),
 
        DRM_IOCTL_DEF(DRM_IOCTL_SET_UNIQUE, drm_invalid_op, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
        DRM_IOCTL_DEF(DRM_IOCTL_BLOCK, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
        DRM_IOCTL_DEF(DRM_IOCTL_UNBLOCK, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_AUTH_MAGIC, drm_authmagic, DRM_UNLOCKED|DRM_MASTER),
+       DRM_IOCTL_DEF(DRM_IOCTL_AUTH_MAGIC, drm_authmagic, DRM_MASTER),
 
        DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_ADD_MAP, drm_legacy_addmap_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
        DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_RM_MAP, drm_legacy_rmmap_ioctl, DRM_AUTH),
@@ -595,8 +594,8 @@ static const struct drm_ioctl_desc drm_ioctls[] = {
        DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_SET_SAREA_CTX, drm_legacy_setsareactx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
        DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_GET_SAREA_CTX, drm_legacy_getsareactx, DRM_AUTH),
 
-       DRM_IOCTL_DEF(DRM_IOCTL_SET_MASTER, drm_setmaster_ioctl, DRM_UNLOCKED|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_DROP_MASTER, drm_dropmaster_ioctl, DRM_UNLOCKED|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_SET_MASTER, drm_setmaster_ioctl, DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_DROP_MASTER, drm_dropmaster_ioctl, DRM_ROOT_ONLY),
 
        DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_ADD_CTX, drm_legacy_addctx, DRM_AUTH|DRM_ROOT_ONLY),
        DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_RM_CTX, drm_legacy_rmctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
@@ -642,74 +641,74 @@ static const struct drm_ioctl_desc drm_ioctls[] = {
 
        DRM_IOCTL_DEF(DRM_IOCTL_UPDATE_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
 
-       DRM_IOCTL_DEF(DRM_IOCTL_GEM_CLOSE, drm_gem_close_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF(DRM_IOCTL_GEM_FLINK, drm_gem_flink_ioctl, DRM_AUTH|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_GEM_OPEN, drm_gem_open_ioctl, DRM_AUTH|DRM_UNLOCKED),
-
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETRESOURCES, drm_mode_getresources, DRM_UNLOCKED),
-
-       DRM_IOCTL_DEF(DRM_IOCTL_PRIME_HANDLE_TO_FD, drm_prime_handle_to_fd_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF(DRM_IOCTL_PRIME_FD_TO_HANDLE, drm_prime_fd_to_handle_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
-
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPLANERESOURCES, drm_mode_getplane_res, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCRTC, drm_mode_getcrtc, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETCRTC, drm_mode_setcrtc, DRM_MASTER|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPLANE, drm_mode_getplane, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPLANE, drm_mode_setplane, DRM_MASTER|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR, drm_mode_cursor_ioctl, DRM_MASTER|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETGAMMA, drm_mode_gamma_get_ioctl, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETGAMMA, drm_mode_gamma_set_ioctl, DRM_MASTER|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETENCODER, drm_mode_getencoder, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCONNECTOR, drm_mode_getconnector, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATTACHMODE, drm_noop, DRM_MASTER|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_DETACHMODE, drm_noop, DRM_MASTER|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPERTY, drm_mode_getproperty_ioctl, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPROPERTY, drm_connector_property_set_ioctl, DRM_MASTER|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPBLOB, drm_mode_getblob_ioctl, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETFB, drm_mode_getfb, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb_ioctl, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB2, drm_mode_addfb2_ioctl, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb_ioctl, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_DUMB, drm_mode_create_dumb_ioctl, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_MAP_DUMB, drm_mode_mmap_dumb_ioctl, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROY_DUMB, drm_mode_destroy_dumb_ioctl, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_GETPROPERTIES, drm_mode_obj_get_properties_ioctl, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_SETPROPERTY, drm_mode_obj_set_property_ioctl, DRM_MASTER|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR2, drm_mode_cursor2_ioctl, DRM_MASTER|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATOMIC, drm_mode_atomic_ioctl, DRM_MASTER|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATEPROPBLOB, drm_mode_createblob_ioctl, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROYPROPBLOB, drm_mode_destroyblob_ioctl, DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_GEM_CLOSE, drm_gem_close_ioctl, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF(DRM_IOCTL_GEM_FLINK, drm_gem_flink_ioctl, DRM_AUTH),
+       DRM_IOCTL_DEF(DRM_IOCTL_GEM_OPEN, drm_gem_open_ioctl, DRM_AUTH),
+
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETRESOURCES, drm_mode_getresources, 0),
+
+       DRM_IOCTL_DEF(DRM_IOCTL_PRIME_HANDLE_TO_FD, drm_prime_handle_to_fd_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF(DRM_IOCTL_PRIME_FD_TO_HANDLE, drm_prime_fd_to_handle_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
+
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPLANERESOURCES, drm_mode_getplane_res, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCRTC, drm_mode_getcrtc, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETCRTC, drm_mode_setcrtc, DRM_MASTER),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPLANE, drm_mode_getplane, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPLANE, drm_mode_setplane, DRM_MASTER),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR, drm_mode_cursor_ioctl, DRM_MASTER),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETGAMMA, drm_mode_gamma_get_ioctl, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETGAMMA, drm_mode_gamma_set_ioctl, DRM_MASTER),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETENCODER, drm_mode_getencoder, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCONNECTOR, drm_mode_getconnector, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATTACHMODE, drm_noop, DRM_MASTER),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_DETACHMODE, drm_noop, DRM_MASTER),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPERTY, drm_mode_getproperty_ioctl, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPROPERTY, drm_connector_property_set_ioctl, DRM_MASTER),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPBLOB, drm_mode_getblob_ioctl, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETFB, drm_mode_getfb, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb_ioctl, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB2, drm_mode_addfb2_ioctl, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb_ioctl, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_DUMB, drm_mode_create_dumb_ioctl, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_MAP_DUMB, drm_mode_mmap_dumb_ioctl, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROY_DUMB, drm_mode_destroy_dumb_ioctl, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_GETPROPERTIES, drm_mode_obj_get_properties_ioctl, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_SETPROPERTY, drm_mode_obj_set_property_ioctl, DRM_MASTER),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR2, drm_mode_cursor2_ioctl, DRM_MASTER),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATOMIC, drm_mode_atomic_ioctl, DRM_MASTER),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATEPROPBLOB, drm_mode_createblob_ioctl, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROYPROPBLOB, drm_mode_destroyblob_ioctl, 0),
 
        DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_CREATE, drm_syncobj_create_ioctl,
-                     DRM_UNLOCKED|DRM_RENDER_ALLOW),
+                     DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_DESTROY, drm_syncobj_destroy_ioctl,
-                     DRM_UNLOCKED|DRM_RENDER_ALLOW),
+                     DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD, drm_syncobj_handle_to_fd_ioctl,
-                     DRM_UNLOCKED|DRM_RENDER_ALLOW),
+                     DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, drm_syncobj_fd_to_handle_ioctl,
-                     DRM_UNLOCKED|DRM_RENDER_ALLOW),
+                     DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_TRANSFER, drm_syncobj_transfer_ioctl,
-                     DRM_UNLOCKED|DRM_RENDER_ALLOW),
+                     DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_WAIT, drm_syncobj_wait_ioctl,
-                     DRM_UNLOCKED|DRM_RENDER_ALLOW),
+                     DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT, drm_syncobj_timeline_wait_ioctl,
-                     DRM_UNLOCKED|DRM_RENDER_ALLOW),
+                     DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_RESET, drm_syncobj_reset_ioctl,
-                     DRM_UNLOCKED|DRM_RENDER_ALLOW),
+                     DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_SIGNAL, drm_syncobj_signal_ioctl,
-                     DRM_UNLOCKED|DRM_RENDER_ALLOW),
+                     DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL, drm_syncobj_timeline_signal_ioctl,
-                     DRM_UNLOCKED|DRM_RENDER_ALLOW),
+                     DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_QUERY, drm_syncobj_query_ioctl,
-                     DRM_UNLOCKED|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF(DRM_IOCTL_CRTC_GET_SEQUENCE, drm_crtc_get_sequence_ioctl, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_CRTC_QUEUE_SEQUENCE, drm_crtc_queue_sequence_ioctl, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_LEASE, drm_mode_create_lease_ioctl, DRM_MASTER|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_LIST_LESSEES, drm_mode_list_lessees_ioctl, DRM_MASTER|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GET_LEASE, drm_mode_get_lease_ioctl, DRM_MASTER|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_REVOKE_LEASE, drm_mode_revoke_lease_ioctl, DRM_MASTER|DRM_UNLOCKED),
+                     DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF(DRM_IOCTL_CRTC_GET_SEQUENCE, drm_crtc_get_sequence_ioctl, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_CRTC_QUEUE_SEQUENCE, drm_crtc_queue_sequence_ioctl, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_LEASE, drm_mode_create_lease_ioctl, DRM_MASTER),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_LIST_LESSEES, drm_mode_list_lessees_ioctl, DRM_MASTER),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GET_LEASE, drm_mode_get_lease_ioctl, DRM_MASTER),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_REVOKE_LEASE, drm_mode_revoke_lease_ioctl, DRM_MASTER),
 };
 
 #define DRM_CORE_IOCTL_COUNT   ARRAY_SIZE( drm_ioctls )
@@ -777,7 +776,7 @@ long drm_ioctl_kernel(struct file *file, drm_ioctl_t *func, void *kdata,
                return retcode;
 
        /* Enforce sane locking for modern driver ioctls. */
-       if (!drm_core_check_feature(dev, DRIVER_LEGACY) ||
+       if (likely(!drm_core_check_feature(dev, DRIVER_LEGACY)) ||
            (flags & DRM_UNLOCKED))
                retcode = func(dev, kdata, file_priv);
        else {
index 4d3a11cfd97917243bed1eecbbe5dc10d75c13bf..8f54e6a78b6f32b349c6a10acd67f8caeb630717 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*
  * \file drm_legacy_misc.c
  * Misc legacy support functions.
  *
index 68b18b0e290ca04e76aecccf1480f15ee1466a95..2e8ce99d0baaedbf9926aff1145736a8144c474e 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*
  * \file drm_lock.c
  * IOCTLs for locking
  *
index b634e1670190baa3ae7799913d51e11f574ae336..0bec6dbb01421e0856271a2400f2b962411ce76f 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*
  * \file drm_memory.c
  * Memory management wrappers for DRM
  *
index 9a59865ce574f6f2608d963e0b40dc5bd260d64c..4581c538737228c39df71829b2fe7cea86008aa0 100644 (file)
@@ -472,7 +472,7 @@ int drm_mm_insert_node_in_range(struct drm_mm * const mm,
        u64 remainder_mask;
        bool once;
 
-       DRM_MM_BUG_ON(range_start >= range_end);
+       DRM_MM_BUG_ON(range_start > range_end);
 
        if (unlikely(size == 0 || range_end - range_start < size))
                return -ENOSPC;
index 1c6e5113596243780f24d78b40af4263b6f74a69..c355ba8e6d5ddfb2a754bd721a599a49e520346b 100644 (file)
@@ -42,6 +42,8 @@ int __drm_mode_object_add(struct drm_device *dev, struct drm_mode_object *obj,
 {
        int ret;
 
+       WARN_ON(dev->registered && !obj_free_cb);
+
        mutex_lock(&dev->mode_config.idr_mutex);
        ret = idr_alloc(&dev->mode_config.object_idr, register_obj ? obj : NULL,
                        1, 0, GFP_KERNEL);
@@ -102,6 +104,8 @@ void drm_mode_object_register(struct drm_device *dev,
 void drm_mode_object_unregister(struct drm_device *dev,
                                struct drm_mode_object *object)
 {
+       WARN_ON(dev->registered && !object->free_cb);
+
        mutex_lock(&dev->mode_config.idr_mutex);
        if (object->id) {
                idr_remove(&dev->mode_config.object_idr, object->id);
index 74a5739df506aaed0994f842e024f55fec4ea4aa..246743d181308fc16510b74ed12d83a54d102504 100644 (file)
@@ -1912,8 +1912,11 @@ void drm_mode_convert_to_umode(struct drm_mode_modeinfo *out,
        case HDMI_PICTURE_ASPECT_256_135:
                out->flags |= DRM_MODE_FLAG_PIC_AR_256_135;
                break;
-       case HDMI_PICTURE_ASPECT_RESERVED:
        default:
+               WARN(1, "Invalid aspect ratio (0%x) on mode\n",
+                    in->picture_aspect_ratio);
+               /* fall through */
+       case HDMI_PICTURE_ASPECT_NONE:
                out->flags |= DRM_MODE_FLAG_PIC_AR_NONE;
                break;
        }
@@ -1972,20 +1975,22 @@ int drm_mode_convert_umode(struct drm_device *dev,
 
        switch (in->flags & DRM_MODE_FLAG_PIC_AR_MASK) {
        case DRM_MODE_FLAG_PIC_AR_4_3:
-               out->picture_aspect_ratio |= HDMI_PICTURE_ASPECT_4_3;
+               out->picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3;
                break;
        case DRM_MODE_FLAG_PIC_AR_16_9:
-               out->picture_aspect_ratio |= HDMI_PICTURE_ASPECT_16_9;
+               out->picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9;
                break;
        case DRM_MODE_FLAG_PIC_AR_64_27:
-               out->picture_aspect_ratio |= HDMI_PICTURE_ASPECT_64_27;
+               out->picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27;
                break;
        case DRM_MODE_FLAG_PIC_AR_256_135:
-               out->picture_aspect_ratio |= HDMI_PICTURE_ASPECT_256_135;
+               out->picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135;
                break;
-       default:
+       case DRM_MODE_FLAG_PIC_AR_NONE:
                out->picture_aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
                break;
+       default:
+               return -EINVAL;
        }
 
        out->status = drm_mode_validate_driver(dev, out);
index d0c01318076b70d9505ac0aa220819a107dc311f..eca484106cc2deb2df9faebd6f2de47c54261ab3 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/dma-buf.h>
 #include <linux/rbtree.h>
 
+#include <drm/drm.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_file.h>
 #include <drm/drm_framebuffer.h>
 
 #include "drm_internal.h"
 
-/*
- * DMA-BUF/GEM Object references and lifetime overview:
- *
- * On the export the dma_buf holds a reference to the exporting GEM
- * object. It takes this reference in handle_to_fd_ioctl, when it
- * first calls .prime_export and stores the exporting GEM object in
- * the dma_buf priv. This reference needs to be released when the
- * final reference to the &dma_buf itself is dropped and its
- * &dma_buf_ops.release function is called. For GEM-based drivers,
- * the dma_buf should be exported using drm_gem_dmabuf_export() and
- * then released by drm_gem_dmabuf_release().
- *
- * On the import the importing GEM object holds a reference to the
- * dma_buf (which in turn holds a ref to the exporting GEM object).
- * It takes that reference in the fd_to_handle ioctl.
- * It calls dma_buf_get, creates an attachment to it and stores the
- * attachment in the GEM object. When this attachment is destroyed
- * when the imported object is destroyed, we remove the attachment
- * and drop the reference to the dma_buf.
- *
- * When all the references to the &dma_buf are dropped, i.e. when
- * userspace has closed both handles to the imported GEM object (through the
- * FD_TO_HANDLE IOCTL) and closed the file descriptor of the exported
- * (through the HANDLE_TO_FD IOCTL) dma_buf, and all kernel-internal references
- * are also gone, then the dma_buf gets destroyed.  This can also happen as a
- * part of the clean up procedure in the drm_release() function if userspace
- * fails to properly clean up.  Note that both the kernel and userspace (by
- * keeeping the PRIME file descriptors open) can hold references onto a
- * &dma_buf.
- *
- * Thus the chain of references always flows in one direction
- * (avoiding loops): importing_gem -> dmabuf -> exporting_gem
- *
- * Self-importing: if userspace is using PRIME as a replacement for flink
- * then it will get a fd->handle request for a GEM object that it created.
- * Drivers should detect this situation and return back the gem object
- * from the dma-buf private.  Prime will do this automatically for drivers that
- * use the drm_gem_prime_{import,export} helpers.
- *
- * GEM struct &dma_buf_ops symbols are now exported. They can be resued by
- * drivers which implement GEM interface.
+/**
+ * DOC: overview and lifetime rules
+ *
+ * Similar to GEM global names, PRIME file descriptors are also used to share
+ * buffer objects across processes. They offer additional security: as file
+ * descriptors must be explicitly sent over UNIX domain sockets to be shared
+ * between applications, they can't be guessed like the globally unique GEM
+ * names.
+ *
+ * Drivers that support the PRIME API implement the
+ * &drm_driver.prime_handle_to_fd and &drm_driver.prime_fd_to_handle operations.
+ * GEM based drivers must use drm_gem_prime_handle_to_fd() and
+ * drm_gem_prime_fd_to_handle() to implement these. For GEM based drivers the
+ * actual driver interfaces is provided through the &drm_gem_object_funcs.export
+ * and &drm_driver.gem_prime_import hooks.
+ *
+ * &dma_buf_ops implementations for GEM drivers are all individually exported
+ * for drivers which need to overwrite or reimplement some of them.
+ *
+ * Reference Counting for GEM Drivers
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ * On the export the &dma_buf holds a reference to the exported buffer object,
+ * usually a &drm_gem_object. It takes this reference in the PRIME_HANDLE_TO_FD
+ * IOCTL, when it first calls &drm_gem_object_funcs.export
+ * and stores the exporting GEM object in the &dma_buf.priv field. This
+ * reference needs to be released when the final reference to the &dma_buf
+ * itself is dropped and its &dma_buf_ops.release function is called.  For
+ * GEM-based drivers, the &dma_buf should be exported using
+ * drm_gem_dmabuf_export() and then released by drm_gem_dmabuf_release().
+ *
+ * Thus the chain of references always flows in one direction, avoiding loops:
+ * importing GEM object -> dma-buf -> exported GEM bo. A further complication
+ * are the lookup caches for import and export. These are required to guarantee
+ * that any given object will always have only one uniqe userspace handle. This
+ * is required to allow userspace to detect duplicated imports, since some GEM
+ * drivers do fail command submissions if a given buffer object is listed more
+ * than once. These import and export caches in &drm_prime_file_private only
+ * retain a weak reference, which is cleaned up when the corresponding object is
+ * released.
+ *
+ * Self-importing: If userspace is using PRIME as a replacement for flink then
+ * it will get a fd->handle request for a GEM object that it created.  Drivers
+ * should detect this situation and return back the underlying object from the
+ * dma-buf private. For GEM based drivers this is handled in
+ * drm_gem_prime_import() already.
  */
 
 struct drm_prime_member {
@@ -181,42 +187,6 @@ static int drm_prime_lookup_buf_handle(struct drm_prime_file_private *prime_fpri
        return -ENOENT;
 }
 
-/**
- * drm_gem_map_attach - dma_buf attach implementation for GEM
- * @dma_buf: buffer to attach device to
- * @attach: buffer attachment data
- *
- * Calls &drm_driver.gem_prime_pin for device specific handling. This can be
- * used as the &dma_buf_ops.attach callback.
- *
- * Returns 0 on success, negative error code on failure.
- */
-int drm_gem_map_attach(struct dma_buf *dma_buf,
-                      struct dma_buf_attachment *attach)
-{
-       struct drm_gem_object *obj = dma_buf->priv;
-
-       return drm_gem_pin(obj);
-}
-EXPORT_SYMBOL(drm_gem_map_attach);
-
-/**
- * drm_gem_map_detach - dma_buf detach implementation for GEM
- * @dma_buf: buffer to detach from
- * @attach: attachment to be detached
- *
- * Cleans up &dma_buf_attachment. This can be used as the &dma_buf_ops.detach
- * callback.
- */
-void drm_gem_map_detach(struct dma_buf *dma_buf,
-                       struct dma_buf_attachment *attach)
-{
-       struct drm_gem_object *obj = dma_buf->priv;
-
-       drm_gem_unpin(obj);
-}
-EXPORT_SYMBOL(drm_gem_map_detach);
-
 void drm_prime_remove_buf_handle_locked(struct drm_prime_file_private *prime_fpriv,
                                        struct dma_buf *dma_buf)
 {
@@ -242,67 +212,21 @@ void drm_prime_remove_buf_handle_locked(struct drm_prime_file_private *prime_fpr
        }
 }
 
-/**
- * drm_gem_map_dma_buf - map_dma_buf implementation for GEM
- * @attach: attachment whose scatterlist is to be returned
- * @dir: direction of DMA transfer
- *
- * Calls &drm_driver.gem_prime_get_sg_table and then maps the scatterlist. This
- * can be used as the &dma_buf_ops.map_dma_buf callback.
- *
- * Returns sg_table containing the scatterlist to be returned; returns ERR_PTR
- * on error. May return -EINTR if it is interrupted by a signal.
- */
-
-struct sg_table *drm_gem_map_dma_buf(struct dma_buf_attachment *attach,
-                                    enum dma_data_direction dir)
+void drm_prime_init_file_private(struct drm_prime_file_private *prime_fpriv)
 {
-       struct drm_gem_object *obj = attach->dmabuf->priv;
-       struct sg_table *sgt;
-
-       if (WARN_ON(dir == DMA_NONE))
-               return ERR_PTR(-EINVAL);
-
-       if (obj->funcs)
-               sgt = obj->funcs->get_sg_table(obj);
-       else
-               sgt = obj->dev->driver->gem_prime_get_sg_table(obj);
-
-       if (!dma_map_sg_attrs(attach->dev, sgt->sgl, sgt->nents, dir,
-                             DMA_ATTR_SKIP_CPU_SYNC)) {
-               sg_free_table(sgt);
-               kfree(sgt);
-               sgt = ERR_PTR(-ENOMEM);
-       }
-
-       return sgt;
+       mutex_init(&prime_fpriv->lock);
+       prime_fpriv->dmabufs = RB_ROOT;
+       prime_fpriv->handles = RB_ROOT;
 }
-EXPORT_SYMBOL(drm_gem_map_dma_buf);
 
-/**
- * drm_gem_unmap_dma_buf - unmap_dma_buf implementation for GEM
- * @attach: attachment to unmap buffer from
- * @sgt: scatterlist info of the buffer to unmap
- * @dir: direction of DMA transfer
- *
- * This can be used as the &dma_buf_ops.unmap_dma_buf callback.
- */
-void drm_gem_unmap_dma_buf(struct dma_buf_attachment *attach,
-                          struct sg_table *sgt,
-                          enum dma_data_direction dir)
+void drm_prime_destroy_file_private(struct drm_prime_file_private *prime_fpriv)
 {
-       if (!sgt)
-               return;
-
-       dma_unmap_sg_attrs(attach->dev, sgt->sgl, sgt->nents, dir,
-                          DMA_ATTR_SKIP_CPU_SYNC);
-       sg_free_table(sgt);
-       kfree(sgt);
+       /* by now drm_gem_release should've made sure the list is empty */
+       WARN_ON(!RB_EMPTY_ROOT(&prime_fpriv->dmabufs));
 }
-EXPORT_SYMBOL(drm_gem_unmap_dma_buf);
 
 /**
- * drm_gem_dmabuf_export - dma_buf export implementation for GEM
+ * drm_gem_dmabuf_export - &dma_buf export implementation for GEM
  * @dev: parent device for the exported dmabuf
  * @exp_info: the export information used by dma_buf_export()
  *
@@ -330,11 +254,11 @@ struct dma_buf *drm_gem_dmabuf_export(struct drm_device *dev,
 EXPORT_SYMBOL(drm_gem_dmabuf_export);
 
 /**
- * drm_gem_dmabuf_release - dma_buf release implementation for GEM
+ * drm_gem_dmabuf_release - &dma_buf release implementation for GEM
  * @dma_buf: buffer to be released
  *
  * Generic release function for dma_bufs exported as PRIME buffers. GEM drivers
- * must use this in their dma_buf ops structure as the release callback.
+ * must use this in their &dma_buf_ops structure as the release callback.
  * drm_gem_dmabuf_release() should be used in conjunction with
  * drm_gem_dmabuf_export().
  */
@@ -351,128 +275,100 @@ void drm_gem_dmabuf_release(struct dma_buf *dma_buf)
 EXPORT_SYMBOL(drm_gem_dmabuf_release);
 
 /**
- * drm_gem_dmabuf_vmap - dma_buf vmap implementation for GEM
- * @dma_buf: buffer to be mapped
+ * drm_gem_prime_fd_to_handle - PRIME import function for GEM drivers
+ * @dev: dev to export the buffer from
+ * @file_priv: drm file-private structure
+ * @prime_fd: fd id of the dma-buf which should be imported
+ * @handle: pointer to storage for the handle of the imported buffer object
  *
- * Sets up a kernel virtual mapping. This can be used as the &dma_buf_ops.vmap
- * callback.
+ * This is the PRIME import function which must be used mandatorily by GEM
+ * drivers to ensure correct lifetime management of the underlying GEM object.
+ * The actual importing of GEM object from the dma-buf is done through the
+ * &drm_driver.gem_prime_import driver callback.
  *
- * Returns the kernel virtual address.
+ * Returns 0 on success or a negative error code on failure.
  */
-void *drm_gem_dmabuf_vmap(struct dma_buf *dma_buf)
+int drm_gem_prime_fd_to_handle(struct drm_device *dev,
+                              struct drm_file *file_priv, int prime_fd,
+                              uint32_t *handle)
 {
-       struct drm_gem_object *obj = dma_buf->priv;
-       void *vaddr;
+       struct dma_buf *dma_buf;
+       struct drm_gem_object *obj;
+       int ret;
 
-       vaddr = drm_gem_vmap(obj);
-       if (IS_ERR(vaddr))
-               vaddr = NULL;
+       dma_buf = dma_buf_get(prime_fd);
+       if (IS_ERR(dma_buf))
+               return PTR_ERR(dma_buf);
 
-       return vaddr;
-}
-EXPORT_SYMBOL(drm_gem_dmabuf_vmap);
+       mutex_lock(&file_priv->prime.lock);
 
-/**
- * drm_gem_dmabuf_vunmap - dma_buf vunmap implementation for GEM
- * @dma_buf: buffer to be unmapped
- * @vaddr: the virtual address of the buffer
- *
- * Releases a kernel virtual mapping. This can be used as the
- * &dma_buf_ops.vunmap callback.
- */
-void drm_gem_dmabuf_vunmap(struct dma_buf *dma_buf, void *vaddr)
-{
-       struct drm_gem_object *obj = dma_buf->priv;
+       ret = drm_prime_lookup_buf_handle(&file_priv->prime,
+                       dma_buf, handle);
+       if (ret == 0)
+               goto out_put;
 
-       drm_gem_vunmap(obj, vaddr);
-}
-EXPORT_SYMBOL(drm_gem_dmabuf_vunmap);
+       /* never seen this one, need to import */
+       mutex_lock(&dev->object_name_lock);
+       if (dev->driver->gem_prime_import)
+               obj = dev->driver->gem_prime_import(dev, dma_buf);
+       else
+               obj = drm_gem_prime_import(dev, dma_buf);
+       if (IS_ERR(obj)) {
+               ret = PTR_ERR(obj);
+               goto out_unlock;
+       }
 
-/**
- * drm_gem_dmabuf_mmap - dma_buf mmap implementation for GEM
- * @dma_buf: buffer to be mapped
- * @vma: virtual address range
- *
- * Provides memory mapping for the buffer. This can be used as the
- * &dma_buf_ops.mmap callback.
- *
- * Returns 0 on success or a negative error code on failure.
- */
-int drm_gem_dmabuf_mmap(struct dma_buf *dma_buf, struct vm_area_struct *vma)
-{
-       struct drm_gem_object *obj = dma_buf->priv;
-       struct drm_device *dev = obj->dev;
+       if (obj->dma_buf) {
+               WARN_ON(obj->dma_buf != dma_buf);
+       } else {
+               obj->dma_buf = dma_buf;
+               get_dma_buf(dma_buf);
+       }
 
-       if (!dev->driver->gem_prime_mmap)
-               return -ENOSYS;
+       /* _handle_create_tail unconditionally unlocks dev->object_name_lock. */
+       ret = drm_gem_handle_create_tail(file_priv, obj, handle);
+       drm_gem_object_put_unlocked(obj);
+       if (ret)
+               goto out_put;
 
-       return dev->driver->gem_prime_mmap(obj, vma);
-}
-EXPORT_SYMBOL(drm_gem_dmabuf_mmap);
+       ret = drm_prime_add_buf_handle(&file_priv->prime,
+                       dma_buf, *handle);
+       mutex_unlock(&file_priv->prime.lock);
+       if (ret)
+               goto fail;
 
-static const struct dma_buf_ops drm_gem_prime_dmabuf_ops =  {
-       .cache_sgt_mapping = true,
-       .attach = drm_gem_map_attach,
-       .detach = drm_gem_map_detach,
-       .map_dma_buf = drm_gem_map_dma_buf,
-       .unmap_dma_buf = drm_gem_unmap_dma_buf,
-       .release = drm_gem_dmabuf_release,
-       .mmap = drm_gem_dmabuf_mmap,
-       .vmap = drm_gem_dmabuf_vmap,
-       .vunmap = drm_gem_dmabuf_vunmap,
-};
+       dma_buf_put(dma_buf);
 
-/**
- * DOC: PRIME Helpers
- *
- * Drivers can implement @gem_prime_export and @gem_prime_import in terms of
- * simpler APIs by using the helper functions @drm_gem_prime_export and
- * @drm_gem_prime_import.  These functions implement dma-buf support in terms of
- * six lower-level driver callbacks:
- *
- * Export callbacks:
- *
- *  * @gem_prime_pin (optional): prepare a GEM object for exporting
- *  * @gem_prime_get_sg_table: provide a scatter/gather table of pinned pages
- *  * @gem_prime_vmap: vmap a buffer exported by your driver
- *  * @gem_prime_vunmap: vunmap a buffer exported by your driver
- *  * @gem_prime_mmap (optional): mmap a buffer exported by your driver
- *
- * Import callback:
- *
- *  * @gem_prime_import_sg_table (import): produce a GEM object from another
- *    driver's scatter/gather table
- */
+       return 0;
 
-/**
- * drm_gem_prime_export - helper library implementation of the export callback
- * @dev: drm_device to export from
- * @obj: GEM object to export
- * @flags: flags like DRM_CLOEXEC and DRM_RDWR
- *
- * This is the implementation of the gem_prime_export functions for GEM drivers
- * using the PRIME helpers.
- */
-struct dma_buf *drm_gem_prime_export(struct drm_device *dev,
-                                    struct drm_gem_object *obj,
-                                    int flags)
+fail:
+       /* hmm, if driver attached, we are relying on the free-object path
+        * to detach.. which seems ok..
+        */
+       drm_gem_handle_delete(file_priv, *handle);
+       dma_buf_put(dma_buf);
+       return ret;
+
+out_unlock:
+       mutex_unlock(&dev->object_name_lock);
+out_put:
+       mutex_unlock(&file_priv->prime.lock);
+       dma_buf_put(dma_buf);
+       return ret;
+}
+EXPORT_SYMBOL(drm_gem_prime_fd_to_handle);
+
+int drm_prime_fd_to_handle_ioctl(struct drm_device *dev, void *data,
+                                struct drm_file *file_priv)
 {
-       struct dma_buf_export_info exp_info = {
-               .exp_name = KBUILD_MODNAME, /* white lie for debug */
-               .owner = dev->driver->fops->owner,
-               .ops = &drm_gem_prime_dmabuf_ops,
-               .size = obj->size,
-               .flags = flags,
-               .priv = obj,
-               .resv = obj->resv,
-       };
+       struct drm_prime_handle *args = data;
 
-       if (dev->driver->gem_prime_res_obj)
-               exp_info.resv = dev->driver->gem_prime_res_obj(obj);
+       if (!dev->driver->prime_fd_to_handle)
+               return -ENOSYS;
 
-       return drm_gem_dmabuf_export(dev, &exp_info);
+       return dev->driver->prime_fd_to_handle(dev, file_priv,
+                       args->fd, &args->handle);
 }
-EXPORT_SYMBOL(drm_gem_prime_export);
 
 static struct dma_buf *export_and_register_object(struct drm_device *dev,
                                                  struct drm_gem_object *obj,
@@ -489,9 +385,9 @@ static struct dma_buf *export_and_register_object(struct drm_device *dev,
        if (obj->funcs && obj->funcs->export)
                dmabuf = obj->funcs->export(obj, flags);
        else if (dev->driver->gem_prime_export)
-               dmabuf = dev->driver->gem_prime_export(dev, obj, flags);
+               dmabuf = dev->driver->gem_prime_export(obj, flags);
        else
-               dmabuf = drm_gem_prime_export(dev, obj, flags);
+               dmabuf = drm_gem_prime_export(obj, flags);
        if (IS_ERR(dmabuf)) {
                /* normally the created dma-buf takes ownership of the ref,
                 * but if that fails then drop the ref
@@ -521,7 +417,7 @@ static struct dma_buf *export_and_register_object(struct drm_device *dev,
  * This is the PRIME export function which must be used mandatorily by GEM
  * drivers to ensure correct lifetime management of the underlying GEM object.
  * The actual exporting from GEM object to a dma-buf is done through the
- * gem_prime_export driver callback.
+ * &drm_driver.gem_prime_export driver callback.
  */
 int drm_gem_prime_handle_to_fd(struct drm_device *dev,
                               struct drm_file *file_priv, uint32_t handle,
@@ -610,14 +506,203 @@ out_unlock:
 }
 EXPORT_SYMBOL(drm_gem_prime_handle_to_fd);
 
-/**
- * drm_gem_prime_mmap - PRIME mmap function for GEM drivers
- * @obj: GEM object
- * @vma: Virtual address range
- *
- * This function sets up a userspace mapping for PRIME exported buffers using
- * the same codepath that is used for regular GEM buffer mapping on the DRM fd.
- * The fake GEM offset is added to vma->vm_pgoff and &drm_driver->fops->mmap is
+int drm_prime_handle_to_fd_ioctl(struct drm_device *dev, void *data,
+                                struct drm_file *file_priv)
+{
+       struct drm_prime_handle *args = data;
+
+       if (!dev->driver->prime_handle_to_fd)
+               return -ENOSYS;
+
+       /* check flags are valid */
+       if (args->flags & ~(DRM_CLOEXEC | DRM_RDWR))
+               return -EINVAL;
+
+       return dev->driver->prime_handle_to_fd(dev, file_priv,
+                       args->handle, args->flags, &args->fd);
+}
+
+/**
+ * DOC: PRIME Helpers
+ *
+ * Drivers can implement &drm_gem_object_funcs.export and
+ * &drm_driver.gem_prime_import in terms of simpler APIs by using the helper
+ * functions drm_gem_prime_export() and drm_gem_prime_import(). These functions
+ * implement dma-buf support in terms of some lower-level helpers, which are
+ * again exported for drivers to use individually:
+ *
+ * Exporting buffers
+ * ~~~~~~~~~~~~~~~~~
+ *
+ * Optional pinning of buffers is handled at dma-buf attach and detach time in
+ * drm_gem_map_attach() and drm_gem_map_detach(). Backing storage itself is
+ * handled by drm_gem_map_dma_buf() and drm_gem_unmap_dma_buf(), which relies on
+ * &drm_gem_object_funcs.get_sg_table.
+ *
+ * For kernel-internal access there's drm_gem_dmabuf_vmap() and
+ * drm_gem_dmabuf_vunmap(). Userspace mmap support is provided by
+ * drm_gem_dmabuf_mmap().
+ *
+ * Note that these export helpers can only be used if the underlying backing
+ * storage is fully coherent and either permanently pinned, or it is safe to pin
+ * it indefinitely.
+ *
+ * FIXME: The underlying helper functions are named rather inconsistently.
+ *
+ * Exporting buffers
+ * ~~~~~~~~~~~~~~~~~
+ *
+ * Importing dma-bufs using drm_gem_prime_import() relies on
+ * &drm_driver.gem_prime_import_sg_table.
+ *
+ * Note that similarly to the export helpers this permanently pins the
+ * underlying backing storage. Which is ok for scanout, but is not the best
+ * option for sharing lots of buffers for rendering.
+ */
+
+/**
+ * drm_gem_map_attach - dma_buf attach implementation for GEM
+ * @dma_buf: buffer to attach device to
+ * @attach: buffer attachment data
+ *
+ * Calls &drm_gem_object_funcs.pin for device specific handling. This can be
+ * used as the &dma_buf_ops.attach callback. Must be used together with
+ * drm_gem_map_detach().
+ *
+ * Returns 0 on success, negative error code on failure.
+ */
+int drm_gem_map_attach(struct dma_buf *dma_buf,
+                      struct dma_buf_attachment *attach)
+{
+       struct drm_gem_object *obj = dma_buf->priv;
+
+       return drm_gem_pin(obj);
+}
+EXPORT_SYMBOL(drm_gem_map_attach);
+
+/**
+ * drm_gem_map_detach - dma_buf detach implementation for GEM
+ * @dma_buf: buffer to detach from
+ * @attach: attachment to be detached
+ *
+ * Calls &drm_gem_object_funcs.pin for device specific handling.  Cleans up
+ * &dma_buf_attachment from drm_gem_map_attach(). This can be used as the
+ * &dma_buf_ops.detach callback.
+ */
+void drm_gem_map_detach(struct dma_buf *dma_buf,
+                       struct dma_buf_attachment *attach)
+{
+       struct drm_gem_object *obj = dma_buf->priv;
+
+       drm_gem_unpin(obj);
+}
+EXPORT_SYMBOL(drm_gem_map_detach);
+
+/**
+ * drm_gem_map_dma_buf - map_dma_buf implementation for GEM
+ * @attach: attachment whose scatterlist is to be returned
+ * @dir: direction of DMA transfer
+ *
+ * Calls &drm_gem_object_funcs.get_sg_table and then maps the scatterlist. This
+ * can be used as the &dma_buf_ops.map_dma_buf callback. Should be used together
+ * with drm_gem_unmap_dma_buf().
+ *
+ * Returns:sg_table containing the scatterlist to be returned; returns ERR_PTR
+ * on error. May return -EINTR if it is interrupted by a signal.
+ */
+struct sg_table *drm_gem_map_dma_buf(struct dma_buf_attachment *attach,
+                                    enum dma_data_direction dir)
+{
+       struct drm_gem_object *obj = attach->dmabuf->priv;
+       struct sg_table *sgt;
+
+       if (WARN_ON(dir == DMA_NONE))
+               return ERR_PTR(-EINVAL);
+
+       if (obj->funcs)
+               sgt = obj->funcs->get_sg_table(obj);
+       else
+               sgt = obj->dev->driver->gem_prime_get_sg_table(obj);
+
+       if (!dma_map_sg_attrs(attach->dev, sgt->sgl, sgt->nents, dir,
+                             DMA_ATTR_SKIP_CPU_SYNC)) {
+               sg_free_table(sgt);
+               kfree(sgt);
+               sgt = ERR_PTR(-ENOMEM);
+       }
+
+       return sgt;
+}
+EXPORT_SYMBOL(drm_gem_map_dma_buf);
+
+/**
+ * drm_gem_unmap_dma_buf - unmap_dma_buf implementation for GEM
+ * @attach: attachment to unmap buffer from
+ * @sgt: scatterlist info of the buffer to unmap
+ * @dir: direction of DMA transfer
+ *
+ * This can be used as the &dma_buf_ops.unmap_dma_buf callback.
+ */
+void drm_gem_unmap_dma_buf(struct dma_buf_attachment *attach,
+                          struct sg_table *sgt,
+                          enum dma_data_direction dir)
+{
+       if (!sgt)
+               return;
+
+       dma_unmap_sg_attrs(attach->dev, sgt->sgl, sgt->nents, dir,
+                          DMA_ATTR_SKIP_CPU_SYNC);
+       sg_free_table(sgt);
+       kfree(sgt);
+}
+EXPORT_SYMBOL(drm_gem_unmap_dma_buf);
+
+/**
+ * drm_gem_dmabuf_vmap - dma_buf vmap implementation for GEM
+ * @dma_buf: buffer to be mapped
+ *
+ * Sets up a kernel virtual mapping. This can be used as the &dma_buf_ops.vmap
+ * callback. Calls into &drm_gem_object_funcs.vmap for device specific handling.
+ *
+ * Returns the kernel virtual address or NULL on failure.
+ */
+void *drm_gem_dmabuf_vmap(struct dma_buf *dma_buf)
+{
+       struct drm_gem_object *obj = dma_buf->priv;
+       void *vaddr;
+
+       vaddr = drm_gem_vmap(obj);
+       if (IS_ERR(vaddr))
+               vaddr = NULL;
+
+       return vaddr;
+}
+EXPORT_SYMBOL(drm_gem_dmabuf_vmap);
+
+/**
+ * drm_gem_dmabuf_vunmap - dma_buf vunmap implementation for GEM
+ * @dma_buf: buffer to be unmapped
+ * @vaddr: the virtual address of the buffer
+ *
+ * Releases a kernel virtual mapping. This can be used as the
+ * &dma_buf_ops.vunmap callback. Calls into &drm_gem_object_funcs.vunmap for device specific handling.
+ */
+void drm_gem_dmabuf_vunmap(struct dma_buf *dma_buf, void *vaddr)
+{
+       struct drm_gem_object *obj = dma_buf->priv;
+
+       drm_gem_vunmap(obj, vaddr);
+}
+EXPORT_SYMBOL(drm_gem_dmabuf_vunmap);
+
+/**
+ * drm_gem_prime_mmap - PRIME mmap function for GEM drivers
+ * @obj: GEM object
+ * @vma: Virtual address range
+ *
+ * This function sets up a userspace mapping for PRIME exported buffers using
+ * the same codepath that is used for regular GEM buffer mapping on the DRM fd.
+ * The fake GEM offset is added to vma->vm_pgoff and &drm_driver->fops->mmap is
  * called to set up the mapping.
  *
  * Drivers can use this as their &drm_driver.gem_prime_mmap callback.
@@ -656,15 +741,121 @@ out:
 }
 EXPORT_SYMBOL(drm_gem_prime_mmap);
 
+/**
+ * drm_gem_dmabuf_mmap - dma_buf mmap implementation for GEM
+ * @dma_buf: buffer to be mapped
+ * @vma: virtual address range
+ *
+ * Provides memory mapping for the buffer. This can be used as the
+ * &dma_buf_ops.mmap callback. It just forwards to &drm_driver.gem_prime_mmap,
+ * which should be set to drm_gem_prime_mmap().
+ *
+ * FIXME: There's really no point to this wrapper, drivers which need anything
+ * else but drm_gem_prime_mmap can roll their own &dma_buf_ops.mmap callback.
+ *
+ * Returns 0 on success or a negative error code on failure.
+ */
+int drm_gem_dmabuf_mmap(struct dma_buf *dma_buf, struct vm_area_struct *vma)
+{
+       struct drm_gem_object *obj = dma_buf->priv;
+       struct drm_device *dev = obj->dev;
+
+       if (!dev->driver->gem_prime_mmap)
+               return -ENOSYS;
+
+       return dev->driver->gem_prime_mmap(obj, vma);
+}
+EXPORT_SYMBOL(drm_gem_dmabuf_mmap);
+
+static const struct dma_buf_ops drm_gem_prime_dmabuf_ops =  {
+       .cache_sgt_mapping = true,
+       .attach = drm_gem_map_attach,
+       .detach = drm_gem_map_detach,
+       .map_dma_buf = drm_gem_map_dma_buf,
+       .unmap_dma_buf = drm_gem_unmap_dma_buf,
+       .release = drm_gem_dmabuf_release,
+       .mmap = drm_gem_dmabuf_mmap,
+       .vmap = drm_gem_dmabuf_vmap,
+       .vunmap = drm_gem_dmabuf_vunmap,
+};
+
+/**
+ * drm_prime_pages_to_sg - converts a page array into an sg list
+ * @pages: pointer to the array of page pointers to convert
+ * @nr_pages: length of the page vector
+ *
+ * This helper creates an sg table object from a set of pages
+ * the driver is responsible for mapping the pages into the
+ * importers address space for use with dma_buf itself.
+ *
+ * This is useful for implementing &drm_gem_object_funcs.get_sg_table.
+ */
+struct sg_table *drm_prime_pages_to_sg(struct page **pages, unsigned int nr_pages)
+{
+       struct sg_table *sg = NULL;
+       int ret;
+
+       sg = kmalloc(sizeof(struct sg_table), GFP_KERNEL);
+       if (!sg) {
+               ret = -ENOMEM;
+               goto out;
+       }
+
+       ret = sg_alloc_table_from_pages(sg, pages, nr_pages, 0,
+                               nr_pages << PAGE_SHIFT, GFP_KERNEL);
+       if (ret)
+               goto out;
+
+       return sg;
+out:
+       kfree(sg);
+       return ERR_PTR(ret);
+}
+EXPORT_SYMBOL(drm_prime_pages_to_sg);
+
+/**
+ * drm_gem_prime_export - helper library implementation of the export callback
+ * @obj: GEM object to export
+ * @flags: flags like DRM_CLOEXEC and DRM_RDWR
+ *
+ * This is the implementation of the &drm_gem_object_funcs.export functions for GEM drivers
+ * using the PRIME helpers. It is used as the default in
+ * drm_gem_prime_handle_to_fd().
+ */
+struct dma_buf *drm_gem_prime_export(struct drm_gem_object *obj,
+                                    int flags)
+{
+       struct drm_device *dev = obj->dev;
+       struct dma_buf_export_info exp_info = {
+               .exp_name = KBUILD_MODNAME, /* white lie for debug */
+               .owner = dev->driver->fops->owner,
+               .ops = &drm_gem_prime_dmabuf_ops,
+               .size = obj->size,
+               .flags = flags,
+               .priv = obj,
+               .resv = obj->resv,
+       };
+
+       if (dev->driver->gem_prime_res_obj)
+               exp_info.resv = dev->driver->gem_prime_res_obj(obj);
+
+       return drm_gem_dmabuf_export(dev, &exp_info);
+}
+EXPORT_SYMBOL(drm_gem_prime_export);
+
 /**
  * drm_gem_prime_import_dev - core implementation of the import callback
  * @dev: drm_device to import into
  * @dma_buf: dma-buf object to import
  * @attach_dev: struct device to dma_buf attach
  *
- * This is the core of drm_gem_prime_import. It's designed to be called by
- * drivers who want to use a different device structure than dev->dev for
- * attaching via dma_buf.
+ * This is the core of drm_gem_prime_import(). It's designed to be called by
+ * drivers who want to use a different device structure than &drm_device.dev for
+ * attaching via dma_buf. This function calls
+ * &drm_driver.gem_prime_import_sg_table internally.
+ *
+ * Drivers must arrange to call drm_prime_gem_destroy() from their
+ * &drm_gem_object_funcs.free hook when using this function.
  */
 struct drm_gem_object *drm_gem_prime_import_dev(struct drm_device *dev,
                                            struct dma_buf *dma_buf,
@@ -709,6 +900,7 @@ struct drm_gem_object *drm_gem_prime_import_dev(struct drm_device *dev,
        }
 
        obj->import_attach = attach;
+       obj->resv = dma_buf->resv;
 
        return obj;
 
@@ -728,7 +920,12 @@ EXPORT_SYMBOL(drm_gem_prime_import_dev);
  * @dma_buf: dma-buf object to import
  *
  * This is the implementation of the gem_prime_import functions for GEM drivers
- * using the PRIME helpers.
+ * using the PRIME helpers. Drivers can use this as their
+ * &drm_driver.gem_prime_import implementation. It is used as the default
+ * implementation in drm_gem_prime_fd_to_handle().
+ *
+ * Drivers must arrange to call drm_prime_gem_destroy() from their
+ * &drm_gem_object_funcs.free hook when using this function.
  */
 struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
                                            struct dma_buf *dma_buf)
@@ -737,154 +934,6 @@ struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
 }
 EXPORT_SYMBOL(drm_gem_prime_import);
 
-/**
- * drm_gem_prime_fd_to_handle - PRIME import function for GEM drivers
- * @dev: dev to export the buffer from
- * @file_priv: drm file-private structure
- * @prime_fd: fd id of the dma-buf which should be imported
- * @handle: pointer to storage for the handle of the imported buffer object
- *
- * This is the PRIME import function which must be used mandatorily by GEM
- * drivers to ensure correct lifetime management of the underlying GEM object.
- * The actual importing of GEM object from the dma-buf is done through the
- * gem_import_export driver callback.
- */
-int drm_gem_prime_fd_to_handle(struct drm_device *dev,
-                              struct drm_file *file_priv, int prime_fd,
-                              uint32_t *handle)
-{
-       struct dma_buf *dma_buf;
-       struct drm_gem_object *obj;
-       int ret;
-
-       dma_buf = dma_buf_get(prime_fd);
-       if (IS_ERR(dma_buf))
-               return PTR_ERR(dma_buf);
-
-       mutex_lock(&file_priv->prime.lock);
-
-       ret = drm_prime_lookup_buf_handle(&file_priv->prime,
-                       dma_buf, handle);
-       if (ret == 0)
-               goto out_put;
-
-       /* never seen this one, need to import */
-       mutex_lock(&dev->object_name_lock);
-       if (dev->driver->gem_prime_import)
-               obj = dev->driver->gem_prime_import(dev, dma_buf);
-       else
-               obj = drm_gem_prime_import(dev, dma_buf);
-       if (IS_ERR(obj)) {
-               ret = PTR_ERR(obj);
-               goto out_unlock;
-       }
-
-       if (obj->dma_buf) {
-               WARN_ON(obj->dma_buf != dma_buf);
-       } else {
-               obj->dma_buf = dma_buf;
-               get_dma_buf(dma_buf);
-       }
-
-       /* _handle_create_tail unconditionally unlocks dev->object_name_lock. */
-       ret = drm_gem_handle_create_tail(file_priv, obj, handle);
-       drm_gem_object_put_unlocked(obj);
-       if (ret)
-               goto out_put;
-
-       ret = drm_prime_add_buf_handle(&file_priv->prime,
-                       dma_buf, *handle);
-       mutex_unlock(&file_priv->prime.lock);
-       if (ret)
-               goto fail;
-
-       dma_buf_put(dma_buf);
-
-       return 0;
-
-fail:
-       /* hmm, if driver attached, we are relying on the free-object path
-        * to detach.. which seems ok..
-        */
-       drm_gem_handle_delete(file_priv, *handle);
-       dma_buf_put(dma_buf);
-       return ret;
-
-out_unlock:
-       mutex_unlock(&dev->object_name_lock);
-out_put:
-       mutex_unlock(&file_priv->prime.lock);
-       dma_buf_put(dma_buf);
-       return ret;
-}
-EXPORT_SYMBOL(drm_gem_prime_fd_to_handle);
-
-int drm_prime_handle_to_fd_ioctl(struct drm_device *dev, void *data,
-                                struct drm_file *file_priv)
-{
-       struct drm_prime_handle *args = data;
-
-       if (!drm_core_check_feature(dev, DRIVER_PRIME))
-               return -EOPNOTSUPP;
-
-       if (!dev->driver->prime_handle_to_fd)
-               return -ENOSYS;
-
-       /* check flags are valid */
-       if (args->flags & ~(DRM_CLOEXEC | DRM_RDWR))
-               return -EINVAL;
-
-       return dev->driver->prime_handle_to_fd(dev, file_priv,
-                       args->handle, args->flags, &args->fd);
-}
-
-int drm_prime_fd_to_handle_ioctl(struct drm_device *dev, void *data,
-                                struct drm_file *file_priv)
-{
-       struct drm_prime_handle *args = data;
-
-       if (!drm_core_check_feature(dev, DRIVER_PRIME))
-               return -EOPNOTSUPP;
-
-       if (!dev->driver->prime_fd_to_handle)
-               return -ENOSYS;
-
-       return dev->driver->prime_fd_to_handle(dev, file_priv,
-                       args->fd, &args->handle);
-}
-
-/**
- * drm_prime_pages_to_sg - converts a page array into an sg list
- * @pages: pointer to the array of page pointers to convert
- * @nr_pages: length of the page vector
- *
- * This helper creates an sg table object from a set of pages
- * the driver is responsible for mapping the pages into the
- * importers address space for use with dma_buf itself.
- */
-struct sg_table *drm_prime_pages_to_sg(struct page **pages, unsigned int nr_pages)
-{
-       struct sg_table *sg = NULL;
-       int ret;
-
-       sg = kmalloc(sizeof(struct sg_table), GFP_KERNEL);
-       if (!sg) {
-               ret = -ENOMEM;
-               goto out;
-       }
-
-       ret = sg_alloc_table_from_pages(sg, pages, nr_pages, 0,
-                               nr_pages << PAGE_SHIFT, GFP_KERNEL);
-       if (ret)
-               goto out;
-
-       return sg;
-out:
-       kfree(sg);
-       return ERR_PTR(ret);
-}
-EXPORT_SYMBOL(drm_prime_pages_to_sg);
-
 /**
  * drm_prime_sg_to_page_addr_arrays - convert an sg table into a page array
  * @sgt: scatter-gather table to convert
@@ -894,6 +943,9 @@ EXPORT_SYMBOL(drm_prime_pages_to_sg);
  *
  * Exports an sg table into an array of pages and addresses. This is currently
  * required by the TTM driver in order to do correct fault handling.
+ *
+ * Drivers can use this in their &drm_driver.gem_prime_import_sg_table
+ * implementation.
  */
 int drm_prime_sg_to_page_addr_arrays(struct sg_table *sgt, struct page **pages,
                                     dma_addr_t *addrs, int max_entries)
@@ -934,7 +986,7 @@ EXPORT_SYMBOL(drm_prime_sg_to_page_addr_arrays);
  * @sg: the sg-table which was pinned at import time
  *
  * This is the cleanup functions which GEM drivers need to call when they use
- * @drm_gem_prime_import to import dma-bufs.
+ * drm_gem_prime_import() or drm_gem_prime_import_dev() to import dma-bufs.
  */
 void drm_prime_gem_destroy(struct drm_gem_object *obj, struct sg_table *sg)
 {
@@ -949,16 +1001,3 @@ void drm_prime_gem_destroy(struct drm_gem_object *obj, struct sg_table *sg)
        dma_buf_put(dma_buf);
 }
 EXPORT_SYMBOL(drm_prime_gem_destroy);
-
-void drm_prime_init_file_private(struct drm_prime_file_private *prime_fpriv)
-{
-       mutex_init(&prime_fpriv->lock);
-       prime_fpriv->dmabufs = RB_ROOT;
-       prime_fpriv->handles = RB_ROOT;
-}
-
-void drm_prime_destroy_file_private(struct drm_prime_file_private *prime_fpriv)
-{
-       /* by now drm_gem_release should've made sure the list is empty */
-       WARN_ON(!RB_EMPTY_ROOT(&prime_fpriv->dmabufs));
-}
index 2d7790f14b0c09df01dacae4a03d0377ca520c9a..d5c386154246e3da2ee3911862b1de4d5ee95195 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*
  * \file drm_scatter.c
  * IOCTLs to manage scatter/gather memory
  *
index a199c8d56b95056e9282a5c678e2a53aeedb7a34..75cb4bb7619e93dfd826a4007d335c19e8d4d643 100644 (file)
@@ -53,6 +53,7 @@
 #include <linux/sync_file.h>
 #include <linux/uaccess.h>
 
+#include <drm/drm.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_file.h>
 #include <drm/drm_gem.h>
index 05f7c5833946dc551f655dde0eff142e50e6a05b..52e87e4869a598d8e77ab37544daaae1e2e7c2a4 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*
  * \file drm_vm.c
  * Memory mapping for DRM
  *
index 7eb7cf9c3fa8555ab2f7126abcf5c10de09280e0..08e033c1758db71e1857dfe9e42402cebf71c013 100644 (file)
@@ -430,17 +430,17 @@ static int etnaviv_ioctl_pm_query_sig(struct drm_device *dev, void *data,
 static const struct drm_ioctl_desc etnaviv_ioctls[] = {
 #define ETNA_IOCTL(n, func, flags) \
        DRM_IOCTL_DEF_DRV(ETNAVIV_##n, etnaviv_ioctl_##func, flags)
-       ETNA_IOCTL(GET_PARAM,    get_param,    DRM_AUTH|DRM_RENDER_ALLOW),
-       ETNA_IOCTL(GEM_NEW,      gem_new,      DRM_AUTH|DRM_RENDER_ALLOW),
-       ETNA_IOCTL(GEM_INFO,     gem_info,     DRM_AUTH|DRM_RENDER_ALLOW),
-       ETNA_IOCTL(GEM_CPU_PREP, gem_cpu_prep, DRM_AUTH|DRM_RENDER_ALLOW),
-       ETNA_IOCTL(GEM_CPU_FINI, gem_cpu_fini, DRM_AUTH|DRM_RENDER_ALLOW),
-       ETNA_IOCTL(GEM_SUBMIT,   gem_submit,   DRM_AUTH|DRM_RENDER_ALLOW),
-       ETNA_IOCTL(WAIT_FENCE,   wait_fence,   DRM_AUTH|DRM_RENDER_ALLOW),
-       ETNA_IOCTL(GEM_USERPTR,  gem_userptr,  DRM_AUTH|DRM_RENDER_ALLOW),
-       ETNA_IOCTL(GEM_WAIT,     gem_wait,     DRM_AUTH|DRM_RENDER_ALLOW),
-       ETNA_IOCTL(PM_QUERY_DOM, pm_query_dom, DRM_AUTH|DRM_RENDER_ALLOW),
-       ETNA_IOCTL(PM_QUERY_SIG, pm_query_sig, DRM_AUTH|DRM_RENDER_ALLOW),
+       ETNA_IOCTL(GET_PARAM,    get_param,    DRM_RENDER_ALLOW),
+       ETNA_IOCTL(GEM_NEW,      gem_new,      DRM_RENDER_ALLOW),
+       ETNA_IOCTL(GEM_INFO,     gem_info,     DRM_RENDER_ALLOW),
+       ETNA_IOCTL(GEM_CPU_PREP, gem_cpu_prep, DRM_RENDER_ALLOW),
+       ETNA_IOCTL(GEM_CPU_FINI, gem_cpu_fini, DRM_RENDER_ALLOW),
+       ETNA_IOCTL(GEM_SUBMIT,   gem_submit,   DRM_RENDER_ALLOW),
+       ETNA_IOCTL(WAIT_FENCE,   wait_fence,   DRM_RENDER_ALLOW),
+       ETNA_IOCTL(GEM_USERPTR,  gem_userptr,  DRM_RENDER_ALLOW),
+       ETNA_IOCTL(GEM_WAIT,     gem_wait,     DRM_RENDER_ALLOW),
+       ETNA_IOCTL(PM_QUERY_DOM, pm_query_dom, DRM_RENDER_ALLOW),
+       ETNA_IOCTL(PM_QUERY_SIG, pm_query_sig, DRM_RENDER_ALLOW),
 };
 
 static const struct vm_operations_struct vm_ops = {
@@ -462,17 +462,13 @@ static const struct file_operations fops = {
 };
 
 static struct drm_driver etnaviv_drm_driver = {
-       .driver_features    = DRIVER_GEM |
-                               DRIVER_PRIME |
-                               DRIVER_RENDER,
+       .driver_features    = DRIVER_GEM | DRIVER_RENDER,
        .open               = etnaviv_open,
        .postclose           = etnaviv_postclose,
        .gem_free_object_unlocked = etnaviv_gem_free_object,
        .gem_vm_ops         = &vm_ops,
        .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
-       .gem_prime_export   = drm_gem_prime_export,
-       .gem_prime_import   = drm_gem_prime_import,
        .gem_prime_pin      = etnaviv_gem_prime_pin,
        .gem_prime_unpin    = etnaviv_gem_prime_unpin,
        .gem_prime_get_sg_table = etnaviv_gem_prime_get_sg_table,
index e8778ebb72e6108031efb74399686c3ea052bb8d..17ca602db60a8bf2ddf0a752c4126ef31b3def34 100644 (file)
@@ -565,8 +565,7 @@ void etnaviv_gem_obj_add(struct drm_device *dev, struct drm_gem_object *obj)
 }
 
 static int etnaviv_gem_new_impl(struct drm_device *dev, u32 size, u32 flags,
-       struct reservation_object *robj, const struct etnaviv_gem_ops *ops,
-       struct drm_gem_object **obj)
+       const struct etnaviv_gem_ops *ops, struct drm_gem_object **obj)
 {
        struct etnaviv_gem_object *etnaviv_obj;
        unsigned sz = sizeof(*etnaviv_obj);
@@ -594,8 +593,6 @@ static int etnaviv_gem_new_impl(struct drm_device *dev, u32 size, u32 flags,
 
        etnaviv_obj->flags = flags;
        etnaviv_obj->ops = ops;
-       if (robj)
-               etnaviv_obj->base.resv = robj;
 
        mutex_init(&etnaviv_obj->lock);
        INIT_LIST_HEAD(&etnaviv_obj->vram_list);
@@ -614,7 +611,7 @@ int etnaviv_gem_new_handle(struct drm_device *dev, struct drm_file *file,
 
        size = PAGE_ALIGN(size);
 
-       ret = etnaviv_gem_new_impl(dev, size, flags, NULL,
+       ret = etnaviv_gem_new_impl(dev, size, flags,
                                   &etnaviv_gem_shmem_ops, &obj);
        if (ret)
                goto fail;
@@ -646,13 +643,12 @@ fail:
 }
 
 int etnaviv_gem_new_private(struct drm_device *dev, size_t size, u32 flags,
-       struct reservation_object *robj, const struct etnaviv_gem_ops *ops,
-       struct etnaviv_gem_object **res)
+       const struct etnaviv_gem_ops *ops, struct etnaviv_gem_object **res)
 {
        struct drm_gem_object *obj;
        int ret;
 
-       ret = etnaviv_gem_new_impl(dev, size, flags, robj, ops, &obj);
+       ret = etnaviv_gem_new_impl(dev, size, flags, ops, &obj);
        if (ret)
                return ret;
 
@@ -734,7 +730,7 @@ int etnaviv_gem_new_userptr(struct drm_device *dev, struct drm_file *file,
        struct etnaviv_gem_object *etnaviv_obj;
        int ret;
 
-       ret = etnaviv_gem_new_private(dev, size, ETNA_BO_CACHED, NULL,
+       ret = etnaviv_gem_new_private(dev, size, ETNA_BO_CACHED,
                                      &etnaviv_gem_userptr_ops, &etnaviv_obj);
        if (ret)
                return ret;
index 753c458497d0e119cd82a9959b41484be0c13582..fcd5d71b502fba094e7816ba3cc25beb4ea2c472 100644 (file)
@@ -112,8 +112,7 @@ void etnaviv_submit_put(struct etnaviv_gem_submit * submit);
 int etnaviv_gem_wait_bo(struct etnaviv_gpu *gpu, struct drm_gem_object *obj,
        struct timespec *timeout);
 int etnaviv_gem_new_private(struct drm_device *dev, size_t size, u32 flags,
-       struct reservation_object *robj, const struct etnaviv_gem_ops *ops,
-       struct etnaviv_gem_object **res);
+       const struct etnaviv_gem_ops *ops, struct etnaviv_gem_object **res);
 void etnaviv_gem_obj_add(struct drm_device *dev, struct drm_gem_object *obj);
 struct page **etnaviv_gem_get_pages(struct etnaviv_gem_object *obj);
 void etnaviv_gem_put_pages(struct etnaviv_gem_object *obj);
index 00e8b6a817e3e1394af06a45a309920be627f9f3..a05292e8ed6fdb55c71c391f6c46ebebaebc3a3c 100644 (file)
@@ -109,7 +109,6 @@ struct drm_gem_object *etnaviv_gem_prime_import_sg_table(struct drm_device *dev,
        int ret, npages;
 
        ret = etnaviv_gem_new_private(dev, size, ETNA_BO_WC,
-                                     attach->dmabuf->resv,
                                      &etnaviv_gem_prime_ops, &etnaviv_obj);
        if (ret < 0)
                return ERR_PTR(ret);
index 58baf49d992625ef75628392195f3769f32ded02..cc53dcad25e4c86f944633b40859d46a145bcbd8 100644 (file)
@@ -75,29 +75,29 @@ static const struct vm_operations_struct exynos_drm_gem_vm_ops = {
 
 static const struct drm_ioctl_desc exynos_ioctls[] = {
        DRM_IOCTL_DEF_DRV(EXYNOS_GEM_CREATE, exynos_drm_gem_create_ioctl,
-                       DRM_AUTH | DRM_RENDER_ALLOW),
+                       DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(EXYNOS_GEM_MAP, exynos_drm_gem_map_ioctl,
-                       DRM_AUTH | DRM_RENDER_ALLOW),
+                       DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(EXYNOS_GEM_GET, exynos_drm_gem_get_ioctl,
                        DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(EXYNOS_VIDI_CONNECTION, vidi_connection_ioctl,
                        DRM_AUTH),
        DRM_IOCTL_DEF_DRV(EXYNOS_G2D_GET_VER, exynos_g2d_get_ver_ioctl,
-                       DRM_AUTH | DRM_RENDER_ALLOW),
+                       DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(EXYNOS_G2D_SET_CMDLIST, exynos_g2d_set_cmdlist_ioctl,
-                       DRM_AUTH | DRM_RENDER_ALLOW),
+                       DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(EXYNOS_G2D_EXEC, exynos_g2d_exec_ioctl,
-                       DRM_AUTH | DRM_RENDER_ALLOW),
+                       DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(EXYNOS_IPP_GET_RESOURCES,
                        exynos_drm_ipp_get_res_ioctl,
-                       DRM_AUTH | DRM_RENDER_ALLOW),
+                       DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(EXYNOS_IPP_GET_CAPS, exynos_drm_ipp_get_caps_ioctl,
-                       DRM_AUTH | DRM_RENDER_ALLOW),
+                       DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(EXYNOS_IPP_GET_LIMITS,
                        exynos_drm_ipp_get_limits_ioctl,
-                       DRM_AUTH | DRM_RENDER_ALLOW),
+                       DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(EXYNOS_IPP_COMMIT, exynos_drm_ipp_commit_ioctl,
-                       DRM_AUTH | DRM_RENDER_ALLOW),
+                       DRM_RENDER_ALLOW),
 };
 
 static const struct file_operations exynos_drm_driver_fops = {
@@ -112,7 +112,7 @@ static const struct file_operations exynos_drm_driver_fops = {
 };
 
 static struct drm_driver exynos_drm_driver = {
-       .driver_features        = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME
+       .driver_features        = DRIVER_MODESET | DRIVER_GEM
                                  | DRIVER_ATOMIC | DRIVER_RENDER,
        .open                   = exynos_drm_open,
        .lastclose              = drm_fb_helper_lastclose,
@@ -122,7 +122,6 @@ static struct drm_driver exynos_drm_driver = {
        .dumb_create            = exynos_drm_gem_dumb_create,
        .prime_handle_to_fd     = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle     = drm_gem_prime_fd_to_handle,
-       .gem_prime_export       = drm_gem_prime_export,
        .gem_prime_import       = exynos_drm_gem_prime_import,
        .gem_prime_get_sg_table = exynos_drm_gem_prime_get_sg_table,
        .gem_prime_import_sg_table      = exynos_drm_gem_prime_import_sg_table,
index f4635bea026517171077d3575b11973e339d0f95..b9ca81a6f80fb324eda22eb0e858728a279245bb 100644 (file)
@@ -8,12 +8,13 @@
 #include <linux/clk.h>
 #include <linux/regmap.h>
 
-#include <drm/drmP.h>
+#include <video/videomode.h>
+
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_probe_helper.h>
-#include <video/videomode.h>
+#include <drm/drm_vblank.h>
 
 #include "fsl_dcu_drm_crtc.h"
 #include "fsl_dcu_drm_drv.h"
index e81daaaa5965268d6f3de319e7c63f926d67a154..f15d2e7967a3ea368386fbdb6b7ea5482c3c4b33 100644 (file)
 #include <linux/pm_runtime.h>
 #include <linux/regmap.h>
 
-#include <drm/drmP.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_irq.h>
 #include <drm/drm_modeset_helper.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
 
 #include "fsl_dcu_drm_crtc.h"
 #include "fsl_dcu_drm_drv.h"
@@ -133,8 +135,7 @@ static irqreturn_t fsl_dcu_drm_irq(int irq, void *arg)
 DEFINE_DRM_GEM_CMA_FOPS(fsl_dcu_drm_fops);
 
 static struct drm_driver fsl_dcu_drm_driver = {
-       .driver_features        = DRIVER_GEM | DRIVER_MODESET
-                               | DRIVER_PRIME | DRIVER_ATOMIC,
+       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
        .load                   = fsl_dcu_load,
        .unload                 = fsl_dcu_unload,
        .irq_handler            = fsl_dcu_drm_irq,
@@ -144,8 +145,6 @@ static struct drm_driver fsl_dcu_drm_driver = {
        .gem_vm_ops             = &drm_gem_cma_vm_ops,
        .prime_handle_to_fd     = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle     = drm_gem_prime_fd_to_handle,
-       .gem_prime_import       = drm_gem_prime_import,
-       .gem_prime_export       = drm_gem_prime_export,
        .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
        .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
        .gem_prime_vmap         = drm_gem_cma_prime_vmap,
index 2467c8934405bdbe5c35a4fb18155be8360c9512..d763f53f480c5782d3cb33d9a718b6fd3bacb678 100644 (file)
@@ -5,7 +5,6 @@
  * Freescale DCU drm device driver
  */
 
-#include <drm/drmP.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
index 6f2f65030dd16fe606616ac6bf0194c724108ac1..86fac677fe69b6594507c212e2485fd128e22740 100644 (file)
@@ -7,10 +7,10 @@
 
 #include <linux/regmap.h>
 
-#include <drm/drmP.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_probe_helper.h>
index c49e9e3740f8a070baa38d8182642b0d9a6e52d4..279d83eaffc01975944f1908fe6aee7261faa5fe 100644 (file)
@@ -8,7 +8,6 @@
 #include <linux/backlight.h>
 #include <linux/of_graph.h>
 
-#include <drm/drmP.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_of.h>
 #include <drm/drm_panel.h>
diff --git a/drivers/gpu/drm/gm12u320/Kconfig b/drivers/gpu/drm/gm12u320/Kconfig
new file mode 100644 (file)
index 0000000..0882a61
--- /dev/null
@@ -0,0 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0+
+config DRM_GM12U320
+       tristate "GM12U320 driver for USB projectors"
+       depends on DRM && USB
+       select DRM_KMS_HELPER
+       select DRM_GEM_SHMEM_HELPER
+       help
+        This is a KMS driver for projectors which use the GM12U320 chipset
+        for video transfer over USB2/3, such as the Acer C120 mini projector.
diff --git a/drivers/gpu/drm/gm12u320/Makefile b/drivers/gpu/drm/gm12u320/Makefile
new file mode 100644 (file)
index 0000000..ea51438
--- /dev/null
@@ -0,0 +1,2 @@
+# SPDX-License-Identifier: GPL-2.0+
+obj-$(CONFIG_DRM_GM12U320) += gm12u320.o
diff --git a/drivers/gpu/drm/gm12u320/gm12u320.c b/drivers/gpu/drm/gm12u320/gm12u320.c
new file mode 100644 (file)
index 0000000..b6f47b8
--- /dev/null
@@ -0,0 +1,814 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2019 Hans de Goede <hdegoede@redhat.com>
+ */
+
+#include <linux/dma-buf.h>
+#include <linux/module.h>
+#include <linux/usb.h>
+
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_atomic_state_helper.h>
+#include <drm/drm_connector.h>
+#include <drm/drm_damage_helper.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_fb_helper.h>
+#include <drm/drm_file.h>
+#include <drm/drm_format_helper.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_gem_shmem_helper.h>
+#include <drm/drm_gem_framebuffer_helper.h>
+#include <drm/drm_ioctl.h>
+#include <drm/drm_modeset_helper_vtables.h>
+#include <drm/drm_probe_helper.h>
+#include <drm/drm_simple_kms_helper.h>
+#include <drm/drm_vblank.h>
+
+static bool eco_mode;
+module_param(eco_mode, bool, 0644);
+MODULE_PARM_DESC(eco_mode, "Turn on Eco mode (less bright, more silent)");
+
+#define DRIVER_NAME            "gm12u320"
+#define DRIVER_DESC            "Grain Media GM12U320 USB projector display"
+#define DRIVER_DATE            "2019"
+#define DRIVER_MAJOR           1
+#define DRIVER_MINOR           0
+#define DRIVER_PATCHLEVEL      1
+
+/*
+ * The DLP has an actual width of 854 pixels, but that is not a multiple
+ * of 8, breaking things left and right, so we export a width of 848.
+ */
+#define GM12U320_USER_WIDTH            848
+#define GM12U320_REAL_WIDTH            854
+#define GM12U320_HEIGHT                        480
+
+#define GM12U320_BLOCK_COUNT           20
+
+#define MISC_RCV_EPT                   1
+#define DATA_RCV_EPT                   2
+#define DATA_SND_EPT                   3
+#define MISC_SND_EPT                   4
+
+#define DATA_BLOCK_HEADER_SIZE         84
+#define DATA_BLOCK_CONTENT_SIZE                64512
+#define DATA_BLOCK_FOOTER_SIZE         20
+#define DATA_BLOCK_SIZE                        (DATA_BLOCK_HEADER_SIZE + \
+                                        DATA_BLOCK_CONTENT_SIZE + \
+                                        DATA_BLOCK_FOOTER_SIZE)
+#define DATA_LAST_BLOCK_CONTENT_SIZE   4032
+#define DATA_LAST_BLOCK_SIZE           (DATA_BLOCK_HEADER_SIZE + \
+                                        DATA_LAST_BLOCK_CONTENT_SIZE + \
+                                        DATA_BLOCK_FOOTER_SIZE)
+
+#define CMD_SIZE                       31
+#define READ_STATUS_SIZE               13
+#define MISC_VALUE_SIZE                        4
+
+#define CMD_TIMEOUT                    msecs_to_jiffies(200)
+#define DATA_TIMEOUT                   msecs_to_jiffies(1000)
+#define IDLE_TIMEOUT                   msecs_to_jiffies(2000)
+#define FIRST_FRAME_TIMEOUT            msecs_to_jiffies(2000)
+
+#define MISC_REQ_GET_SET_ECO_A         0xff
+#define MISC_REQ_GET_SET_ECO_B         0x35
+/* Windows driver does once every second, with arg d = 1, other args 0 */
+#define MISC_REQ_UNKNOWN1_A            0xff
+#define MISC_REQ_UNKNOWN1_B            0x38
+/* Windows driver does this on init, with arg a, b = 0, c = 0xa0, d = 4 */
+#define MISC_REQ_UNKNOWN2_A            0xa5
+#define MISC_REQ_UNKNOWN2_B            0x00
+
+struct gm12u320_device {
+       struct drm_device                dev;
+       struct drm_simple_display_pipe   pipe;
+       struct drm_connector             conn;
+       struct usb_device               *udev;
+       unsigned char                   *cmd_buf;
+       unsigned char                   *data_buf[GM12U320_BLOCK_COUNT];
+       bool                             pipe_enabled;
+       struct {
+               bool                     run;
+               struct workqueue_struct *workq;
+               struct work_struct       work;
+               wait_queue_head_t        waitq;
+               struct mutex             lock;
+               struct drm_framebuffer  *fb;
+               struct drm_rect          rect;
+       } fb_update;
+};
+
+static const char cmd_data[CMD_SIZE] = {
+       0x55, 0x53, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00,
+       0x68, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x10, 0xff,
+       0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x80, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const char cmd_draw[CMD_SIZE] = {
+       0x55, 0x53, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xfe,
+       0x00, 0x00, 0x00, 0xc0, 0xd1, 0x05, 0x00, 0x40,
+       0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const char cmd_misc[CMD_SIZE] = {
+       0x55, 0x53, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00,
+       0x04, 0x00, 0x00, 0x00, 0x80, 0x01, 0x10, 0xfd,
+       0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const char data_block_header[DATA_BLOCK_HEADER_SIZE] = {
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0xfb, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x04, 0x15, 0x00, 0x00, 0xfc, 0x00, 0x00,
+       0x01, 0x00, 0x00, 0xdb
+};
+
+static const char data_last_block_header[DATA_BLOCK_HEADER_SIZE] = {
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0xfb, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x2a, 0x00, 0x20, 0x00, 0xc0, 0x0f, 0x00, 0x00,
+       0x01, 0x00, 0x00, 0xd7
+};
+
+static const char data_block_footer[DATA_BLOCK_FOOTER_SIZE] = {
+       0xfb, 0x14, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x80, 0x00, 0x00, 0x4f
+};
+
+static int gm12u320_usb_alloc(struct gm12u320_device *gm12u320)
+{
+       int i, block_size;
+       const char *hdr;
+
+       gm12u320->cmd_buf = kmalloc(CMD_SIZE, GFP_KERNEL);
+       if (!gm12u320->cmd_buf)
+               return -ENOMEM;
+
+       for (i = 0; i < GM12U320_BLOCK_COUNT; i++) {
+               if (i == GM12U320_BLOCK_COUNT - 1) {
+                       block_size = DATA_LAST_BLOCK_SIZE;
+                       hdr = data_last_block_header;
+               } else {
+                       block_size = DATA_BLOCK_SIZE;
+                       hdr = data_block_header;
+               }
+
+               gm12u320->data_buf[i] = kzalloc(block_size, GFP_KERNEL);
+               if (!gm12u320->data_buf[i])
+                       return -ENOMEM;
+
+               memcpy(gm12u320->data_buf[i], hdr, DATA_BLOCK_HEADER_SIZE);
+               memcpy(gm12u320->data_buf[i] +
+                               (block_size - DATA_BLOCK_FOOTER_SIZE),
+                      data_block_footer, DATA_BLOCK_FOOTER_SIZE);
+       }
+
+       gm12u320->fb_update.workq = create_singlethread_workqueue(DRIVER_NAME);
+       if (!gm12u320->fb_update.workq)
+               return -ENOMEM;
+
+       return 0;
+}
+
+static void gm12u320_usb_free(struct gm12u320_device *gm12u320)
+{
+       int i;
+
+       if (gm12u320->fb_update.workq)
+               destroy_workqueue(gm12u320->fb_update.workq);
+
+       for (i = 0; i < GM12U320_BLOCK_COUNT; i++)
+               kfree(gm12u320->data_buf[i]);
+
+       kfree(gm12u320->cmd_buf);
+}
+
+static int gm12u320_misc_request(struct gm12u320_device *gm12u320,
+                                u8 req_a, u8 req_b,
+                                u8 arg_a, u8 arg_b, u8 arg_c, u8 arg_d)
+{
+       int ret, len;
+
+       memcpy(gm12u320->cmd_buf, &cmd_misc, CMD_SIZE);
+       gm12u320->cmd_buf[20] = req_a;
+       gm12u320->cmd_buf[21] = req_b;
+       gm12u320->cmd_buf[22] = arg_a;
+       gm12u320->cmd_buf[23] = arg_b;
+       gm12u320->cmd_buf[24] = arg_c;
+       gm12u320->cmd_buf[25] = arg_d;
+
+       /* Send request */
+       ret = usb_bulk_msg(gm12u320->udev,
+                          usb_sndbulkpipe(gm12u320->udev, MISC_SND_EPT),
+                          gm12u320->cmd_buf, CMD_SIZE, &len, CMD_TIMEOUT);
+       if (ret || len != CMD_SIZE) {
+               dev_err(&gm12u320->udev->dev, "Misc. req. error %d\n", ret);
+               return -EIO;
+       }
+
+       /* Read value */
+       ret = usb_bulk_msg(gm12u320->udev,
+                          usb_rcvbulkpipe(gm12u320->udev, MISC_RCV_EPT),
+                          gm12u320->cmd_buf, MISC_VALUE_SIZE, &len,
+                          DATA_TIMEOUT);
+       if (ret || len != MISC_VALUE_SIZE) {
+               dev_err(&gm12u320->udev->dev, "Misc. value error %d\n", ret);
+               return -EIO;
+       }
+       /* cmd_buf[0] now contains the read value, which we don't use */
+
+       /* Read status */
+       ret = usb_bulk_msg(gm12u320->udev,
+                          usb_rcvbulkpipe(gm12u320->udev, MISC_RCV_EPT),
+                          gm12u320->cmd_buf, READ_STATUS_SIZE, &len,
+                          CMD_TIMEOUT);
+       if (ret || len != READ_STATUS_SIZE) {
+               dev_err(&gm12u320->udev->dev, "Misc. status error %d\n", ret);
+               return -EIO;
+       }
+
+       return 0;
+}
+
+static void gm12u320_32bpp_to_24bpp_packed(u8 *dst, u8 *src, int len)
+{
+       while (len--) {
+               *dst++ = *src++;
+               *dst++ = *src++;
+               *dst++ = *src++;
+               src++;
+       }
+}
+
+static void gm12u320_copy_fb_to_blocks(struct gm12u320_device *gm12u320)
+{
+       int block, dst_offset, len, remain, ret, x1, x2, y1, y2;
+       struct drm_framebuffer *fb;
+       void *vaddr;
+       u8 *src;
+
+       mutex_lock(&gm12u320->fb_update.lock);
+
+       if (!gm12u320->fb_update.fb)
+               goto unlock;
+
+       fb = gm12u320->fb_update.fb;
+       x1 = gm12u320->fb_update.rect.x1;
+       x2 = gm12u320->fb_update.rect.x2;
+       y1 = gm12u320->fb_update.rect.y1;
+       y2 = gm12u320->fb_update.rect.y2;
+
+       vaddr = drm_gem_shmem_vmap(fb->obj[0]);
+       if (IS_ERR(vaddr)) {
+               DRM_ERROR("failed to vmap fb: %ld\n", PTR_ERR(vaddr));
+               goto put_fb;
+       }
+
+       if (fb->obj[0]->import_attach) {
+               ret = dma_buf_begin_cpu_access(
+                       fb->obj[0]->import_attach->dmabuf, DMA_FROM_DEVICE);
+               if (ret) {
+                       DRM_ERROR("dma_buf_begin_cpu_access err: %d\n", ret);
+                       goto vunmap;
+               }
+       }
+
+       src = vaddr + y1 * fb->pitches[0] + x1 * 4;
+
+       x1 += (GM12U320_REAL_WIDTH - GM12U320_USER_WIDTH) / 2;
+       x2 += (GM12U320_REAL_WIDTH - GM12U320_USER_WIDTH) / 2;
+
+       for (; y1 < y2; y1++) {
+               remain = 0;
+               len = (x2 - x1) * 3;
+               dst_offset = (y1 * GM12U320_REAL_WIDTH + x1) * 3;
+               block = dst_offset / DATA_BLOCK_CONTENT_SIZE;
+               dst_offset %= DATA_BLOCK_CONTENT_SIZE;
+
+               if ((dst_offset + len) > DATA_BLOCK_CONTENT_SIZE) {
+                       remain = dst_offset + len - DATA_BLOCK_CONTENT_SIZE;
+                       len = DATA_BLOCK_CONTENT_SIZE - dst_offset;
+               }
+
+               dst_offset += DATA_BLOCK_HEADER_SIZE;
+               len /= 3;
+
+               gm12u320_32bpp_to_24bpp_packed(
+                       gm12u320->data_buf[block] + dst_offset,
+                       src, len);
+
+               if (remain) {
+                       block++;
+                       dst_offset = DATA_BLOCK_HEADER_SIZE;
+                       gm12u320_32bpp_to_24bpp_packed(
+                               gm12u320->data_buf[block] + dst_offset,
+                               src + len * 4, remain / 3);
+               }
+               src += fb->pitches[0];
+       }
+
+       if (fb->obj[0]->import_attach) {
+               ret = dma_buf_end_cpu_access(fb->obj[0]->import_attach->dmabuf,
+                                            DMA_FROM_DEVICE);
+               if (ret)
+                       DRM_ERROR("dma_buf_end_cpu_access err: %d\n", ret);
+       }
+vunmap:
+       drm_gem_shmem_vunmap(fb->obj[0], vaddr);
+put_fb:
+       drm_framebuffer_put(fb);
+       gm12u320->fb_update.fb = NULL;
+unlock:
+       mutex_unlock(&gm12u320->fb_update.lock);
+}
+
+static int gm12u320_fb_update_ready(struct gm12u320_device *gm12u320)
+{
+       int ret;
+
+       mutex_lock(&gm12u320->fb_update.lock);
+       ret = !gm12u320->fb_update.run || gm12u320->fb_update.fb != NULL;
+       mutex_unlock(&gm12u320->fb_update.lock);
+
+       return ret;
+}
+
+static void gm12u320_fb_update_work(struct work_struct *work)
+{
+       struct gm12u320_device *gm12u320 =
+               container_of(work, struct gm12u320_device, fb_update.work);
+       int draw_status_timeout = FIRST_FRAME_TIMEOUT;
+       int block, block_size, len;
+       int frame = 0;
+       int ret = 0;
+
+       while (gm12u320->fb_update.run) {
+               gm12u320_copy_fb_to_blocks(gm12u320);
+
+               for (block = 0; block < GM12U320_BLOCK_COUNT; block++) {
+                       if (block == GM12U320_BLOCK_COUNT - 1)
+                               block_size = DATA_LAST_BLOCK_SIZE;
+                       else
+                               block_size = DATA_BLOCK_SIZE;
+
+                       /* Send data command to device */
+                       memcpy(gm12u320->cmd_buf, cmd_data, CMD_SIZE);
+                       gm12u320->cmd_buf[8] = block_size & 0xff;
+                       gm12u320->cmd_buf[9] = block_size >> 8;
+                       gm12u320->cmd_buf[20] = 0xfc - block * 4;
+                       gm12u320->cmd_buf[21] = block | (frame << 7);
+
+                       ret = usb_bulk_msg(gm12u320->udev,
+                               usb_sndbulkpipe(gm12u320->udev, DATA_SND_EPT),
+                               gm12u320->cmd_buf, CMD_SIZE, &len,
+                               CMD_TIMEOUT);
+                       if (ret || len != CMD_SIZE)
+                               goto err;
+
+                       /* Send data block to device */
+                       ret = usb_bulk_msg(gm12u320->udev,
+                               usb_sndbulkpipe(gm12u320->udev, DATA_SND_EPT),
+                               gm12u320->data_buf[block], block_size,
+                               &len, DATA_TIMEOUT);
+                       if (ret || len != block_size)
+                               goto err;
+
+                       /* Read status */
+                       ret = usb_bulk_msg(gm12u320->udev,
+                               usb_rcvbulkpipe(gm12u320->udev, DATA_RCV_EPT),
+                               gm12u320->cmd_buf, READ_STATUS_SIZE, &len,
+                               CMD_TIMEOUT);
+                       if (ret || len != READ_STATUS_SIZE)
+                               goto err;
+               }
+
+               /* Send draw command to device */
+               memcpy(gm12u320->cmd_buf, cmd_draw, CMD_SIZE);
+               ret = usb_bulk_msg(gm12u320->udev,
+                       usb_sndbulkpipe(gm12u320->udev, DATA_SND_EPT),
+                       gm12u320->cmd_buf, CMD_SIZE, &len, CMD_TIMEOUT);
+               if (ret || len != CMD_SIZE)
+                       goto err;
+
+               /* Read status */
+               ret = usb_bulk_msg(gm12u320->udev,
+                       usb_rcvbulkpipe(gm12u320->udev, DATA_RCV_EPT),
+                       gm12u320->cmd_buf, READ_STATUS_SIZE, &len,
+                       draw_status_timeout);
+               if (ret || len != READ_STATUS_SIZE)
+                       goto err;
+
+               draw_status_timeout = CMD_TIMEOUT;
+               frame = !frame;
+
+               /*
+                * We must draw a frame every 2s otherwise the projector
+                * switches back to showing its logo.
+                */
+               wait_event_timeout(gm12u320->fb_update.waitq,
+                                  gm12u320_fb_update_ready(gm12u320),
+                                  IDLE_TIMEOUT);
+       }
+       return;
+err:
+       /* Do not log errors caused by module unload or device unplug */
+       if (ret != -ECONNRESET && ret != -ESHUTDOWN)
+               dev_err(&gm12u320->udev->dev, "Frame update error: %d\n", ret);
+}
+
+static void gm12u320_fb_mark_dirty(struct drm_framebuffer *fb,
+                                  struct drm_rect *dirty)
+{
+       struct gm12u320_device *gm12u320 = fb->dev->dev_private;
+       struct drm_framebuffer *old_fb = NULL;
+       bool wakeup = false;
+
+       mutex_lock(&gm12u320->fb_update.lock);
+
+       if (gm12u320->fb_update.fb != fb) {
+               old_fb = gm12u320->fb_update.fb;
+               drm_framebuffer_get(fb);
+               gm12u320->fb_update.fb = fb;
+               gm12u320->fb_update.rect = *dirty;
+               wakeup = true;
+       } else {
+               struct drm_rect *rect = &gm12u320->fb_update.rect;
+
+               rect->x1 = min(rect->x1, dirty->x1);
+               rect->y1 = min(rect->y1, dirty->y1);
+               rect->x2 = max(rect->x2, dirty->x2);
+               rect->y2 = max(rect->y2, dirty->y2);
+       }
+
+       mutex_unlock(&gm12u320->fb_update.lock);
+
+       if (wakeup)
+               wake_up(&gm12u320->fb_update.waitq);
+
+       if (old_fb)
+               drm_framebuffer_put(old_fb);
+}
+
+static void gm12u320_start_fb_update(struct gm12u320_device *gm12u320)
+{
+       mutex_lock(&gm12u320->fb_update.lock);
+       gm12u320->fb_update.run = true;
+       mutex_unlock(&gm12u320->fb_update.lock);
+
+       queue_work(gm12u320->fb_update.workq, &gm12u320->fb_update.work);
+}
+
+static void gm12u320_stop_fb_update(struct gm12u320_device *gm12u320)
+{
+       mutex_lock(&gm12u320->fb_update.lock);
+       gm12u320->fb_update.run = false;
+       mutex_unlock(&gm12u320->fb_update.lock);
+
+       wake_up(&gm12u320->fb_update.waitq);
+       cancel_work_sync(&gm12u320->fb_update.work);
+
+       mutex_lock(&gm12u320->fb_update.lock);
+       if (gm12u320->fb_update.fb) {
+               drm_framebuffer_put(gm12u320->fb_update.fb);
+               gm12u320->fb_update.fb = NULL;
+       }
+       mutex_unlock(&gm12u320->fb_update.lock);
+}
+
+static int gm12u320_set_ecomode(struct gm12u320_device *gm12u320)
+{
+       return gm12u320_misc_request(gm12u320, MISC_REQ_GET_SET_ECO_A,
+                                    MISC_REQ_GET_SET_ECO_B, 0x01 /* set */,
+                                    eco_mode ? 0x01 : 0x00, 0x00, 0x01);
+}
+
+/* ------------------------------------------------------------------ */
+/* gm12u320 connector                                                */
+
+/*
+ * We use fake EDID info so that userspace know that it is dealing with
+ * an Acer projector, rather then listing this as an "unknown" monitor.
+ * Note this assumes this driver is only ever used with the Acer C120, if we
+ * add support for other devices the vendor and model should be parameterized.
+ */
+static struct edid gm12u320_edid = {
+       .header         = { 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 },
+       .mfg_id         = { 0x04, 0x72 },       /* "ACR" */
+       .prod_code      = { 0x20, 0xc1 },       /* C120h */
+       .serial         = 0xaa55aa55,
+       .mfg_week       = 1,
+       .mfg_year       = 16,
+       .version        = 1,                    /* EDID 1.3 */
+       .revision       = 3,                    /* EDID 1.3 */
+       .input          = 0x08,                 /* Analog input */
+       .features       = 0x0a,                 /* Pref timing in DTD 1 */
+       .standard_timings = { { 1, 1 }, { 1, 1 }, { 1, 1 }, { 1, 1 },
+                             { 1, 1 }, { 1, 1 }, { 1, 1 }, { 1, 1 } },
+       .detailed_timings = { {
+               .pixel_clock = 3383,
+               /* hactive = 848, hblank = 256 */
+               .data.pixel_data.hactive_lo = 0x50,
+               .data.pixel_data.hblank_lo = 0x00,
+               .data.pixel_data.hactive_hblank_hi = 0x31,
+               /* vactive = 480, vblank = 28 */
+               .data.pixel_data.vactive_lo = 0xe0,
+               .data.pixel_data.vblank_lo = 0x1c,
+               .data.pixel_data.vactive_vblank_hi = 0x10,
+               /* hsync offset 40 pw 128, vsync offset 1 pw 4 */
+               .data.pixel_data.hsync_offset_lo = 0x28,
+               .data.pixel_data.hsync_pulse_width_lo = 0x80,
+               .data.pixel_data.vsync_offset_pulse_width_lo = 0x14,
+               .data.pixel_data.hsync_vsync_offset_pulse_width_hi = 0x00,
+               /* Digital separate syncs, hsync+, vsync+ */
+               .data.pixel_data.misc = 0x1e,
+       }, {
+               .pixel_clock = 0,
+               .data.other_data.type = 0xfd, /* Monitor ranges */
+               .data.other_data.data.range.min_vfreq = 59,
+               .data.other_data.data.range.max_vfreq = 61,
+               .data.other_data.data.range.min_hfreq_khz = 29,
+               .data.other_data.data.range.max_hfreq_khz = 32,
+               .data.other_data.data.range.pixel_clock_mhz = 4, /* 40 MHz */
+               .data.other_data.data.range.flags = 0,
+               .data.other_data.data.range.formula.cvt = {
+                       0xa0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 },
+       }, {
+               .pixel_clock = 0,
+               .data.other_data.type = 0xfc, /* Model string */
+               .data.other_data.data.str.str = {
+                       'P', 'r', 'o', 'j', 'e', 'c', 't', 'o', 'r', '\n',
+                       ' ', ' ',  ' ' },
+       }, {
+               .pixel_clock = 0,
+               .data.other_data.type = 0xfe, /* Unspecified text / padding */
+               .data.other_data.data.str.str = {
+                       '\n', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
+                       ' ', ' ',  ' ' },
+       } },
+       .checksum = 0x13,
+};
+
+static int gm12u320_conn_get_modes(struct drm_connector *connector)
+{
+       drm_connector_update_edid_property(connector, &gm12u320_edid);
+       return drm_add_edid_modes(connector, &gm12u320_edid);
+}
+
+static const struct drm_connector_helper_funcs gm12u320_conn_helper_funcs = {
+       .get_modes = gm12u320_conn_get_modes,
+};
+
+static const struct drm_connector_funcs gm12u320_conn_funcs = {
+       .fill_modes = drm_helper_probe_single_connector_modes,
+       .destroy = drm_connector_cleanup,
+       .reset = drm_atomic_helper_connector_reset,
+       .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
+       .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
+};
+
+static int gm12u320_conn_init(struct gm12u320_device *gm12u320)
+{
+       drm_connector_helper_add(&gm12u320->conn, &gm12u320_conn_helper_funcs);
+       return drm_connector_init(&gm12u320->dev, &gm12u320->conn,
+                                 &gm12u320_conn_funcs, DRM_MODE_CONNECTOR_VGA);
+}
+
+/* ------------------------------------------------------------------ */
+/* gm12u320 (simple) display pipe                                    */
+
+static void gm12u320_pipe_enable(struct drm_simple_display_pipe *pipe,
+                                struct drm_crtc_state *crtc_state,
+                                struct drm_plane_state *plane_state)
+{
+       struct gm12u320_device *gm12u320 = pipe->crtc.dev->dev_private;
+       struct drm_rect rect = { 0, 0, GM12U320_USER_WIDTH, GM12U320_HEIGHT };
+
+       gm12u320_fb_mark_dirty(plane_state->fb, &rect);
+       gm12u320_start_fb_update(gm12u320);
+       gm12u320->pipe_enabled = true;
+}
+
+static void gm12u320_pipe_disable(struct drm_simple_display_pipe *pipe)
+{
+       struct gm12u320_device *gm12u320 = pipe->crtc.dev->dev_private;
+
+       gm12u320_stop_fb_update(gm12u320);
+       gm12u320->pipe_enabled = false;
+}
+
+static void gm12u320_pipe_update(struct drm_simple_display_pipe *pipe,
+                                struct drm_plane_state *old_state)
+{
+       struct drm_plane_state *state = pipe->plane.state;
+       struct drm_crtc *crtc = &pipe->crtc;
+       struct drm_rect rect;
+
+       if (drm_atomic_helper_damage_merged(old_state, state, &rect))
+               gm12u320_fb_mark_dirty(pipe->plane.state->fb, &rect);
+
+       if (crtc->state->event) {
+               spin_lock_irq(&crtc->dev->event_lock);
+               drm_crtc_send_vblank_event(crtc, crtc->state->event);
+               crtc->state->event = NULL;
+               spin_unlock_irq(&crtc->dev->event_lock);
+       }
+}
+
+static const struct drm_simple_display_pipe_funcs gm12u320_pipe_funcs = {
+       .enable     = gm12u320_pipe_enable,
+       .disable    = gm12u320_pipe_disable,
+       .update     = gm12u320_pipe_update,
+};
+
+static const uint32_t gm12u320_pipe_formats[] = {
+       DRM_FORMAT_XRGB8888,
+};
+
+static const uint64_t gm12u320_pipe_modifiers[] = {
+       DRM_FORMAT_MOD_LINEAR,
+       DRM_FORMAT_MOD_INVALID
+};
+
+static void gm12u320_driver_release(struct drm_device *dev)
+{
+       struct gm12u320_device *gm12u320 = dev->dev_private;
+
+       gm12u320_usb_free(gm12u320);
+       drm_mode_config_cleanup(dev);
+       drm_dev_fini(dev);
+       kfree(gm12u320);
+}
+
+DEFINE_DRM_GEM_SHMEM_FOPS(gm12u320_fops);
+
+static struct drm_driver gm12u320_drm_driver = {
+       .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
+
+       .name            = DRIVER_NAME,
+       .desc            = DRIVER_DESC,
+       .date            = DRIVER_DATE,
+       .major           = DRIVER_MAJOR,
+       .minor           = DRIVER_MINOR,
+
+       .release         = gm12u320_driver_release,
+       .fops            = &gm12u320_fops,
+       DRM_GEM_SHMEM_DRIVER_OPS,
+};
+
+static const struct drm_mode_config_funcs gm12u320_mode_config_funcs = {
+       .fb_create = drm_gem_fb_create_with_dirty,
+       .atomic_check = drm_atomic_helper_check,
+       .atomic_commit = drm_atomic_helper_commit,
+};
+
+static int gm12u320_usb_probe(struct usb_interface *interface,
+                             const struct usb_device_id *id)
+{
+       struct gm12u320_device *gm12u320;
+       struct drm_device *dev;
+       int ret;
+
+       /*
+        * The gm12u320 presents itself to the system as 2 usb mass-storage
+        * interfaces, we only care about / need the first one.
+        */
+       if (interface->cur_altsetting->desc.bInterfaceNumber != 0)
+               return -ENODEV;
+
+       gm12u320 = kzalloc(sizeof(*gm12u320), GFP_KERNEL);
+       if (gm12u320 == NULL)
+               return -ENOMEM;
+
+       gm12u320->udev = interface_to_usbdev(interface);
+       INIT_WORK(&gm12u320->fb_update.work, gm12u320_fb_update_work);
+       mutex_init(&gm12u320->fb_update.lock);
+       init_waitqueue_head(&gm12u320->fb_update.waitq);
+
+       dev = &gm12u320->dev;
+       ret = drm_dev_init(dev, &gm12u320_drm_driver, &interface->dev);
+       if (ret) {
+               kfree(gm12u320);
+               return ret;
+       }
+       dev->dev_private = gm12u320;
+
+       drm_mode_config_init(dev);
+       dev->mode_config.min_width = GM12U320_USER_WIDTH;
+       dev->mode_config.max_width = GM12U320_USER_WIDTH;
+       dev->mode_config.min_height = GM12U320_HEIGHT;
+       dev->mode_config.max_height = GM12U320_HEIGHT;
+       dev->mode_config.funcs = &gm12u320_mode_config_funcs;
+
+       ret = gm12u320_usb_alloc(gm12u320);
+       if (ret)
+               goto err_put;
+
+       ret = gm12u320_set_ecomode(gm12u320);
+       if (ret)
+               goto err_put;
+
+       ret = gm12u320_conn_init(gm12u320);
+       if (ret)
+               goto err_put;
+
+       ret = drm_simple_display_pipe_init(&gm12u320->dev,
+                                          &gm12u320->pipe,
+                                          &gm12u320_pipe_funcs,
+                                          gm12u320_pipe_formats,
+                                          ARRAY_SIZE(gm12u320_pipe_formats),
+                                          gm12u320_pipe_modifiers,
+                                          &gm12u320->conn);
+       if (ret)
+               goto err_put;
+
+       drm_mode_config_reset(dev);
+
+       usb_set_intfdata(interface, dev);
+       ret = drm_dev_register(dev, 0);
+       if (ret)
+               goto err_put;
+
+       drm_fbdev_generic_setup(dev, dev->mode_config.preferred_depth);
+
+       return 0;
+
+err_put:
+       drm_dev_put(dev);
+       return ret;
+}
+
+static void gm12u320_usb_disconnect(struct usb_interface *interface)
+{
+       struct drm_device *dev = usb_get_intfdata(interface);
+       struct gm12u320_device *gm12u320 = dev->dev_private;
+
+       gm12u320_stop_fb_update(gm12u320);
+       drm_dev_unplug(dev);
+       drm_dev_put(dev);
+}
+
+#ifdef CONFIG_PM
+static int gm12u320_suspend(struct usb_interface *interface,
+                           pm_message_t message)
+{
+       struct drm_device *dev = usb_get_intfdata(interface);
+       struct gm12u320_device *gm12u320 = dev->dev_private;
+
+       if (gm12u320->pipe_enabled)
+               gm12u320_stop_fb_update(gm12u320);
+
+       return 0;
+}
+
+static int gm12u320_resume(struct usb_interface *interface)
+{
+       struct drm_device *dev = usb_get_intfdata(interface);
+       struct gm12u320_device *gm12u320 = dev->dev_private;
+
+       gm12u320_set_ecomode(gm12u320);
+       if (gm12u320->pipe_enabled)
+               gm12u320_start_fb_update(gm12u320);
+
+       return 0;
+}
+#endif
+
+static const struct usb_device_id id_table[] = {
+       { USB_DEVICE(0x1de1, 0xc102) },
+       {},
+};
+MODULE_DEVICE_TABLE(usb, id_table);
+
+static struct usb_driver gm12u320_usb_driver = {
+       .name = "gm12u320",
+       .probe = gm12u320_usb_probe,
+       .disconnect = gm12u320_usb_disconnect,
+       .id_table = id_table,
+#ifdef CONFIG_PM
+       .suspend = gm12u320_suspend,
+       .resume = gm12u320_resume,
+       .reset_resume = gm12u320_resume,
+#endif
+};
+
+module_usb_driver(gm12u320_usb_driver);
+MODULE_AUTHOR("Hans de Goede <hdegoede@redhat.com>");
+MODULE_LICENSE("GPL");
index 08657a3627f3bdf8b0b59992302ded7341638ef8..cc4c41748cfb570649197e2e689f30ae3a4e230e 100644 (file)
  *     Jianhua Li <lijianhua@huawei.com>
  */
 
+#include <linux/delay.h>
+
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_gem_vram_helper.h>
 #include <drm/drm_plane_helper.h>
+#include <drm/drm_print.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
 
 #include "hibmc_drm_drv.h"
 #include "hibmc_drm_regs.h"
index ce89e56937b0e8384ad064898b58a6daf25cfa72..2ae5388357814faf11fcc9d0696dea595b4034c3 100644 (file)
 
 #include <linux/console.h>
 #include <linux/module.h>
+#include <linux/pci.h>
 
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_gem_vram_helper.h>
+#include <drm/drm_irq.h>
+#include <drm/drm_print.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
+#include <drm/drm_vram_mm_helper.h>
 
 #include "hibmc_drm_drv.h"
 #include "hibmc_drm_regs.h"
@@ -51,10 +58,9 @@ static struct drm_driver hibmc_driver = {
        .desc                   = "hibmc drm driver",
        .major                  = 1,
        .minor                  = 0,
-       .gem_free_object_unlocked =
-               drm_gem_vram_driver_gem_free_object_unlocked,
        .dumb_create            = hibmc_dumb_create,
        .dumb_map_offset        = drm_gem_vram_driver_dumb_mmap_offset,
+       .gem_prime_mmap         = drm_gem_prime_mmap,
        .irq_handler            = hibmc_drm_interrupt,
 };
 
index 69348bf54a84b4eaa776dc938e543d22d5a17c2e..e58ecd7edcf82da2df4abcb72fb46696aa46da00 100644 (file)
 #ifndef HIBMC_DRM_DRV_H
 #define HIBMC_DRM_DRV_H
 
-#include <drm/drmP.h>
-#include <drm/drm_atomic.h>
 #include <drm/drm_fb_helper.h>
-#include <drm/drm_gem.h>
-#include <drm/drm_gem_vram_helper.h>
-#include <drm/drm_vram_mm_helper.h>
+#include <drm/drm_framebuffer.h>
+
+struct drm_device;
+struct drm_gem_object;
 
 struct hibmc_framebuffer {
        struct drm_framebuffer fb;
index af1ea4cceffa1d9a2d46883432ea2d4459369747..b4c1cea051e8fd848d02e03a4dcbdf4ce409cf05 100644 (file)
@@ -13,6 +13,8 @@
 
 #include <drm/drm_crtc.h>
 #include <drm/drm_fb_helper.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_gem_vram_helper.h>
 #include <drm/drm_probe_helper.h>
 
 #include "hibmc_drm_drv.h"
index 634a3bf018b2b67bcafc1026a7d2d1b38085f140..6d98fdc06f6cce314eb27fc0c42fb43d0b6daba7 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_print.h>
 
 #include "hibmc_drm_drv.h"
 #include "hibmc_drm_regs.h"
index 5d4a03cd7d5062dcba495da3bf8ab2ad67e6d451..cfc2faabda145fe537b46e7706636876af78dc3a 100644 (file)
  *     Jianhua Li <lijianhua@huawei.com>
  */
 
+#include <linux/pci.h>
+
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_gem.h>
+#include <drm/drm_gem_vram_helper.h>
+#include <drm/drm_print.h>
+#include <drm/drm_vram_mm_helper.h>
 
 #include "hibmc_drm_drv.h"
 
index ad7042ae224161badfbd03a79677b0b602879b7c..0df1afdf319dedf2f290126b122be48ff9400699 100644 (file)
 
 #include <linux/bitops.h>
 #include <linux/clk.h>
-#include <video/display_timing.h>
 #include <linux/mfd/syscon.h>
+#include <linux/platform_device.h>
 #include <linux/regmap.h>
 #include <linux/reset.h>
 
-#include <drm/drmP.h>
+#include <video/display_timing.h>
+
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
 
 #include "kirin_drm_drv.h"
 #include "kirin_ade_reg.h"
index 4a7fe10a37cbf14c420e29489539002e5be04ba0..204c94c01e3d588acf641fbcacb00ed4af9eca09 100644 (file)
 
 #include <linux/of_platform.h>
 #include <linux/component.h>
+#include <linux/module.h>
 #include <linux/of_graph.h>
+#include <linux/platform_device.h>
 
-#include <drm/drmP.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_of.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
 
 #include "kirin_drm_drv.h"
 
@@ -113,8 +116,7 @@ static int kirin_gem_cma_dumb_create(struct drm_file *file,
 }
 
 static struct drm_driver kirin_drm_driver = {
-       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME |
-                                 DRIVER_ATOMIC,
+       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
        .fops                   = &kirin_drm_fops,
 
        .gem_free_object_unlocked = drm_gem_cma_free_object,
@@ -123,8 +125,6 @@ static struct drm_driver kirin_drm_driver = {
 
        .prime_handle_to_fd     = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle     = drm_gem_prime_fd_to_handle,
-       .gem_prime_export       = drm_gem_prime_export,
-       .gem_prime_import       = drm_gem_prime_import,
        .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
        .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
        .gem_prime_vmap         = drm_gem_cma_prime_vmap,
index b6e091935977698c5961cb6bf264e9fb66a6c989..986b04599906549e92145adf91e2d89f79abb8da 100644 (file)
@@ -27,7 +27,6 @@
 #ifndef __DRM_I2C_CH7006_PRIV_H__
 #define __DRM_I2C_CH7006_PRIV_H__
 
-#include <drm/drmP.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_encoder_slave.h>
 #include <drm/drm_probe_helper.h>
index 878ba8d06ce2c485d977ea0ef85b46acb132770a..8bcf0d1991451a797e9fe14bb075b228648bc1a2 100644 (file)
@@ -26,8 +26,9 @@
 
 #include <linux/module.h>
 
-#include <drm/drmP.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_encoder_slave.h>
+#include <drm/drm_print.h>
 #include <drm/drm_probe_helper.h>
 #include <drm/i2c/sil164.h>
 
index 3b378936f57559fbfe80a30a6b14ee00aa9f7136..2a77823b8e9a210973f2516b40c584537ad1c520 100644 (file)
  *
  */
 
-#include <drm/drmP.h>
+#include <linux/delay.h>
+#include <linux/mman.h>
+
+#include <drm/drm_agpsupport.h>
+#include <drm/drm_device.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_file.h>
+#include <drm/drm_ioctl.h>
+#include <drm/drm_irq.h>
+#include <drm/drm_pci.h>
+#include <drm/drm_print.h>
 #include <drm/i810_drm.h>
+
 #include "i810_drv.h"
-#include <linux/interrupt.h>   /* For task queue support */
-#include <linux/delay.h>
-#include <linux/slab.h>
-#include <linux/pagemap.h>
 
 #define I810_BUF_FREE          2
 #define I810_BUF_CLIENT                1
index c69d5c487f513400fdea5bdeff2455c39b85ee76..5dd26a06ee0ed2e164b5df1f040c178688fc1a3d 100644 (file)
  *    Gareth Hughes <gareth@valinux.com>
  */
 
+#include "i810_drv.h"
 #include <linux/module.h>
 
-#include <drm/drmP.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_file.h>
+#include <drm/drm_pci.h>
+#include <drm/drm_pciids.h>
 #include <drm/i810_drm.h>
-#include "i810_drv.h"
 
-#include <drm/drm_pciids.h>
 
 static struct pci_device_id pciidlist[] = {
        i810_PCI_IDS
index c73d2f2da57b1f171f456427ca28d8d984f9fe57..9df3981ffc66e65900d26379cc3df438a80e3321 100644 (file)
@@ -32,7 +32,9 @@
 #ifndef _I810_DRV_H_
 #define _I810_DRV_H_
 
+#include <drm/drm_ioctl.h>
 #include <drm/drm_legacy.h>
+#include <drm/i810_drm.h>
 
 /* General customization:
  */
index 41c8ebc60c63b301680e8f1881fc452567111e33..13044c027f272ba02d5c4a370d204287bd317d73 100644 (file)
@@ -491,7 +491,7 @@ int intel_vgpu_get_dmabuf(struct intel_vgpu *vgpu, unsigned int dmabuf_id)
 
        obj->gvt_info = dmabuf_obj->info;
 
-       dmabuf = i915_gem_prime_export(dev, &obj->base, DRM_CLOEXEC | DRM_RDWR);
+       dmabuf = i915_gem_prime_export(&obj->base, DRM_CLOEXEC | DRM_RDWR);
        if (IS_ERR(dmabuf)) {
                gvt_vgpu_err("export dma-buf failed\n");
                ret = PTR_ERR(dmabuf);
index f62e3397d9363e81185ace4663f14243b3e24855..b99d73c1c4db347d52d5c31e5016f3b868ed6346 100644 (file)
@@ -3188,9 +3188,9 @@ static const struct drm_ioctl_desc i915_ioctls[] = {
        DRM_IOCTL_DEF_DRV(I915_GEM_CONTEXT_GETPARAM, i915_gem_context_getparam_ioctl, DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(I915_GEM_CONTEXT_SETPARAM, i915_gem_context_setparam_ioctl, DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(I915_PERF_OPEN, i915_perf_open_ioctl, DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(I915_PERF_ADD_CONFIG, i915_perf_add_config_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(I915_PERF_REMOVE_CONFIG, i915_perf_remove_config_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(I915_QUERY, i915_query_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(I915_PERF_ADD_CONFIG, i915_perf_add_config_ioctl, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(I915_PERF_REMOVE_CONFIG, i915_perf_remove_config_ioctl, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(I915_QUERY, i915_query_ioctl, DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(I915_GEM_VM_CREATE, i915_gem_vm_create_ioctl, DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(I915_GEM_VM_DESTROY, i915_gem_vm_destroy_ioctl, DRM_RENDER_ALLOW),
 };
@@ -3200,7 +3200,7 @@ static struct drm_driver driver = {
         * deal with them for Intel hardware.
         */
        .driver_features =
-           DRIVER_GEM | DRIVER_PRIME |
+           DRIVER_GEM |
            DRIVER_RENDER | DRIVER_MODESET | DRIVER_ATOMIC | DRIVER_SYNCOBJ,
        .release = i915_driver_release,
        .open = i915_driver_open,
index bc909ec5d9c3bb6a5f543d71bae292091acba5ea..bdd596604e930f911643c80eab3a634a42bfef63 100644 (file)
@@ -2591,8 +2591,7 @@ int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
 struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev,
                                struct dma_buf *dma_buf);
 
-struct dma_buf *i915_gem_prime_export(struct drm_device *dev,
-                               struct drm_gem_object *gem_obj, int flags);
+struct dma_buf *i915_gem_prime_export(struct drm_gem_object *gem_obj, int flags);
 
 static inline struct i915_gem_context *
 __i915_gem_context_lookup_rcu(struct drm_i915_file_private *file_priv, u32 id)
diff --git a/drivers/gpu/drm/i915/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/i915_gem_dmabuf.c
new file mode 100644 (file)
index 0000000..54ecab9
--- /dev/null
@@ -0,0 +1,336 @@
+/*
+ * Copyright 2012 Red Hat Inc
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *     Dave Airlie <airlied@redhat.com>
+ */
+
+#include <linux/dma-buf.h>
+#include <linux/reservation.h>
+
+
+#include "i915_drv.h"
+
+static struct drm_i915_gem_object *dma_buf_to_obj(struct dma_buf *buf)
+{
+       return to_intel_bo(buf->priv);
+}
+
+static struct sg_table *i915_gem_map_dma_buf(struct dma_buf_attachment *attachment,
+                                            enum dma_data_direction dir)
+{
+       struct drm_i915_gem_object *obj = dma_buf_to_obj(attachment->dmabuf);
+       struct sg_table *st;
+       struct scatterlist *src, *dst;
+       int ret, i;
+
+       ret = i915_gem_object_pin_pages(obj);
+       if (ret)
+               goto err;
+
+       /* Copy sg so that we make an independent mapping */
+       st = kmalloc(sizeof(struct sg_table), GFP_KERNEL);
+       if (st == NULL) {
+               ret = -ENOMEM;
+               goto err_unpin_pages;
+       }
+
+       ret = sg_alloc_table(st, obj->mm.pages->nents, GFP_KERNEL);
+       if (ret)
+               goto err_free;
+
+       src = obj->mm.pages->sgl;
+       dst = st->sgl;
+       for (i = 0; i < obj->mm.pages->nents; i++) {
+               sg_set_page(dst, sg_page(src), src->length, 0);
+               dst = sg_next(dst);
+               src = sg_next(src);
+       }
+
+       if (!dma_map_sg(attachment->dev, st->sgl, st->nents, dir)) {
+               ret = -ENOMEM;
+               goto err_free_sg;
+       }
+
+       return st;
+
+err_free_sg:
+       sg_free_table(st);
+err_free:
+       kfree(st);
+err_unpin_pages:
+       i915_gem_object_unpin_pages(obj);
+err:
+       return ERR_PTR(ret);
+}
+
+static void i915_gem_unmap_dma_buf(struct dma_buf_attachment *attachment,
+                                  struct sg_table *sg,
+                                  enum dma_data_direction dir)
+{
+       struct drm_i915_gem_object *obj = dma_buf_to_obj(attachment->dmabuf);
+
+       dma_unmap_sg(attachment->dev, sg->sgl, sg->nents, dir);
+       sg_free_table(sg);
+       kfree(sg);
+
+       i915_gem_object_unpin_pages(obj);
+}
+
+static void *i915_gem_dmabuf_vmap(struct dma_buf *dma_buf)
+{
+       struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
+
+       return i915_gem_object_pin_map(obj, I915_MAP_WB);
+}
+
+static void i915_gem_dmabuf_vunmap(struct dma_buf *dma_buf, void *vaddr)
+{
+       struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
+
+       i915_gem_object_flush_map(obj);
+       i915_gem_object_unpin_map(obj);
+}
+
+static void *i915_gem_dmabuf_kmap(struct dma_buf *dma_buf, unsigned long page_num)
+{
+       struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
+       struct page *page;
+
+       if (page_num >= obj->base.size >> PAGE_SHIFT)
+               return NULL;
+
+       if (!i915_gem_object_has_struct_page(obj))
+               return NULL;
+
+       if (i915_gem_object_pin_pages(obj))
+               return NULL;
+
+       /* Synchronisation is left to the caller (via .begin_cpu_access()) */
+       page = i915_gem_object_get_page(obj, page_num);
+       if (IS_ERR(page))
+               goto err_unpin;
+
+       return kmap(page);
+
+err_unpin:
+       i915_gem_object_unpin_pages(obj);
+       return NULL;
+}
+
+static void i915_gem_dmabuf_kunmap(struct dma_buf *dma_buf, unsigned long page_num, void *addr)
+{
+       struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
+
+       kunmap(virt_to_page(addr));
+       i915_gem_object_unpin_pages(obj);
+}
+
+static int i915_gem_dmabuf_mmap(struct dma_buf *dma_buf, struct vm_area_struct *vma)
+{
+       struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
+       int ret;
+
+       if (obj->base.size < vma->vm_end - vma->vm_start)
+               return -EINVAL;
+
+       if (!obj->base.filp)
+               return -ENODEV;
+
+       ret = call_mmap(obj->base.filp, vma);
+       if (ret)
+               return ret;
+
+       fput(vma->vm_file);
+       vma->vm_file = get_file(obj->base.filp);
+
+       return 0;
+}
+
+static int i915_gem_begin_cpu_access(struct dma_buf *dma_buf, enum dma_data_direction direction)
+{
+       struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
+       struct drm_device *dev = obj->base.dev;
+       bool write = (direction == DMA_BIDIRECTIONAL || direction == DMA_TO_DEVICE);
+       int err;
+
+       err = i915_gem_object_pin_pages(obj);
+       if (err)
+               return err;
+
+       err = i915_mutex_lock_interruptible(dev);
+       if (err)
+               goto out;
+
+       err = i915_gem_object_set_to_cpu_domain(obj, write);
+       mutex_unlock(&dev->struct_mutex);
+
+out:
+       i915_gem_object_unpin_pages(obj);
+       return err;
+}
+
+static int i915_gem_end_cpu_access(struct dma_buf *dma_buf, enum dma_data_direction direction)
+{
+       struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
+       struct drm_device *dev = obj->base.dev;
+       int err;
+
+       err = i915_gem_object_pin_pages(obj);
+       if (err)
+               return err;
+
+       err = i915_mutex_lock_interruptible(dev);
+       if (err)
+               goto out;
+
+       err = i915_gem_object_set_to_gtt_domain(obj, false);
+       mutex_unlock(&dev->struct_mutex);
+
+out:
+       i915_gem_object_unpin_pages(obj);
+       return err;
+}
+
+static const struct dma_buf_ops i915_dmabuf_ops =  {
+       .map_dma_buf = i915_gem_map_dma_buf,
+       .unmap_dma_buf = i915_gem_unmap_dma_buf,
+       .release = drm_gem_dmabuf_release,
+       .map = i915_gem_dmabuf_kmap,
+       .unmap = i915_gem_dmabuf_kunmap,
+       .mmap = i915_gem_dmabuf_mmap,
+       .vmap = i915_gem_dmabuf_vmap,
+       .vunmap = i915_gem_dmabuf_vunmap,
+       .begin_cpu_access = i915_gem_begin_cpu_access,
+       .end_cpu_access = i915_gem_end_cpu_access,
+};
+
+struct dma_buf *i915_gem_prime_export(struct drm_gem_object *gem_obj, int flags)
+{
+       struct drm_i915_gem_object *obj = to_intel_bo(gem_obj);
+       DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
+
+       exp_info.ops = &i915_dmabuf_ops;
+       exp_info.size = gem_obj->size;
+       exp_info.flags = flags;
+       exp_info.priv = gem_obj;
+       exp_info.resv = obj->resv;
+
+       if (obj->ops->dmabuf_export) {
+               int ret = obj->ops->dmabuf_export(obj);
+               if (ret)
+                       return ERR_PTR(ret);
+       }
+
+       return drm_gem_dmabuf_export(gem_obj->dev, &exp_info);
+}
+
+static int i915_gem_object_get_pages_dmabuf(struct drm_i915_gem_object *obj)
+{
+       struct sg_table *pages;
+       unsigned int sg_page_sizes;
+
+       pages = dma_buf_map_attachment(obj->base.import_attach,
+                                      DMA_BIDIRECTIONAL);
+       if (IS_ERR(pages))
+               return PTR_ERR(pages);
+
+       sg_page_sizes = i915_sg_page_sizes(pages->sgl);
+
+       __i915_gem_object_set_pages(obj, pages, sg_page_sizes);
+
+       return 0;
+}
+
+static void i915_gem_object_put_pages_dmabuf(struct drm_i915_gem_object *obj,
+                                            struct sg_table *pages)
+{
+       dma_buf_unmap_attachment(obj->base.import_attach, pages,
+                                DMA_BIDIRECTIONAL);
+}
+
+static const struct drm_i915_gem_object_ops i915_gem_object_dmabuf_ops = {
+       .get_pages = i915_gem_object_get_pages_dmabuf,
+       .put_pages = i915_gem_object_put_pages_dmabuf,
+};
+
+struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev,
+                                            struct dma_buf *dma_buf)
+{
+       struct dma_buf_attachment *attach;
+       struct drm_i915_gem_object *obj;
+       int ret;
+
+       /* is this one of own objects? */
+       if (dma_buf->ops == &i915_dmabuf_ops) {
+               obj = dma_buf_to_obj(dma_buf);
+               /* is it from our device? */
+               if (obj->base.dev == dev) {
+                       /*
+                        * Importing dmabuf exported from out own gem increases
+                        * refcount on gem itself instead of f_count of dmabuf.
+                        */
+                       return &i915_gem_object_get(obj)->base;
+               }
+       }
+
+       /* need to attach */
+       attach = dma_buf_attach(dma_buf, dev->dev);
+       if (IS_ERR(attach))
+               return ERR_CAST(attach);
+
+       get_dma_buf(dma_buf);
+
+       obj = i915_gem_object_alloc();
+       if (obj == NULL) {
+               ret = -ENOMEM;
+               goto fail_detach;
+       }
+
+       drm_gem_private_object_init(dev, &obj->base, dma_buf->size);
+       i915_gem_object_init(obj, &i915_gem_object_dmabuf_ops);
+       obj->base.import_attach = attach;
+       obj->resv = dma_buf->resv;
+
+       /* We use GTT as shorthand for a coherent domain, one that is
+        * neither in the GPU cache nor in the CPU cache, where all
+        * writes are immediately visible in memory. (That's not strictly
+        * true, but it's close! There are internal buffers such as the
+        * write-combined buffer or a delay through the chipset for GTT
+        * writes that do require us to treat GTT as a separate cache domain.)
+        */
+       obj->read_domains = I915_GEM_DOMAIN_GTT;
+       obj->write_domain = 0;
+
+       return &obj->base;
+
+fail_detach:
+       dma_buf_detach(dma_buf, attach);
+       dma_buf_put(dma_buf);
+
+       return ERR_PTR(ret);
+}
+
+#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
+#include "selftests/mock_dmabuf.c"
+#include "selftests/i915_gem_dmabuf.c"
+#endif
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/selftests/i915_gem_dmabuf.c
new file mode 100644 (file)
index 0000000..84eb978
--- /dev/null
@@ -0,0 +1,404 @@
+/*
+ * Copyright Â© 2016 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ */
+
+#include "../i915_selftest.h"
+
+#include "mock_gem_device.h"
+#include "mock_dmabuf.h"
+
+static int igt_dmabuf_export(void *arg)
+{
+       struct drm_i915_private *i915 = arg;
+       struct drm_i915_gem_object *obj;
+       struct dma_buf *dmabuf;
+
+       obj = i915_gem_object_create(i915, PAGE_SIZE);
+       if (IS_ERR(obj))
+               return PTR_ERR(obj);
+
+       dmabuf = i915_gem_prime_export(&obj->base, 0);
+       i915_gem_object_put(obj);
+       if (IS_ERR(dmabuf)) {
+               pr_err("i915_gem_prime_export failed with err=%d\n",
+                      (int)PTR_ERR(dmabuf));
+               return PTR_ERR(dmabuf);
+       }
+
+       dma_buf_put(dmabuf);
+       return 0;
+}
+
+static int igt_dmabuf_import_self(void *arg)
+{
+       struct drm_i915_private *i915 = arg;
+       struct drm_i915_gem_object *obj;
+       struct drm_gem_object *import;
+       struct dma_buf *dmabuf;
+       int err;
+
+       obj = i915_gem_object_create(i915, PAGE_SIZE);
+       if (IS_ERR(obj))
+               return PTR_ERR(obj);
+
+       dmabuf = i915_gem_prime_export(&obj->base, 0);
+       if (IS_ERR(dmabuf)) {
+               pr_err("i915_gem_prime_export failed with err=%d\n",
+                      (int)PTR_ERR(dmabuf));
+               err = PTR_ERR(dmabuf);
+               goto out;
+       }
+
+       import = i915_gem_prime_import(&i915->drm, dmabuf);
+       if (IS_ERR(import)) {
+               pr_err("i915_gem_prime_import failed with err=%d\n",
+                      (int)PTR_ERR(import));
+               err = PTR_ERR(import);
+               goto out_dmabuf;
+       }
+
+       if (import != &obj->base) {
+               pr_err("i915_gem_prime_import created a new object!\n");
+               err = -EINVAL;
+               goto out_import;
+       }
+
+       err = 0;
+out_import:
+       i915_gem_object_put(to_intel_bo(import));
+out_dmabuf:
+       dma_buf_put(dmabuf);
+out:
+       i915_gem_object_put(obj);
+       return err;
+}
+
+static int igt_dmabuf_import(void *arg)
+{
+       struct drm_i915_private *i915 = arg;
+       struct drm_i915_gem_object *obj;
+       struct dma_buf *dmabuf;
+       void *obj_map, *dma_map;
+       u32 pattern[] = { 0, 0xaa, 0xcc, 0x55, 0xff };
+       int err, i;
+
+       dmabuf = mock_dmabuf(1);
+       if (IS_ERR(dmabuf))
+               return PTR_ERR(dmabuf);
+
+       obj = to_intel_bo(i915_gem_prime_import(&i915->drm, dmabuf));
+       if (IS_ERR(obj)) {
+               pr_err("i915_gem_prime_import failed with err=%d\n",
+                      (int)PTR_ERR(obj));
+               err = PTR_ERR(obj);
+               goto out_dmabuf;
+       }
+
+       if (obj->base.dev != &i915->drm) {
+               pr_err("i915_gem_prime_import created a non-i915 object!\n");
+               err = -EINVAL;
+               goto out_obj;
+       }
+
+       if (obj->base.size != PAGE_SIZE) {
+               pr_err("i915_gem_prime_import is wrong size found %lld, expected %ld\n",
+                      (long long)obj->base.size, PAGE_SIZE);
+               err = -EINVAL;
+               goto out_obj;
+       }
+
+       dma_map = dma_buf_vmap(dmabuf);
+       if (!dma_map) {
+               pr_err("dma_buf_vmap failed\n");
+               err = -ENOMEM;
+               goto out_obj;
+       }
+
+       if (0) { /* Can not yet map dmabuf */
+               obj_map = i915_gem_object_pin_map(obj, I915_MAP_WB);
+               if (IS_ERR(obj_map)) {
+                       err = PTR_ERR(obj_map);
+                       pr_err("i915_gem_object_pin_map failed with err=%d\n", err);
+                       goto out_dma_map;
+               }
+
+               for (i = 0; i < ARRAY_SIZE(pattern); i++) {
+                       memset(dma_map, pattern[i], PAGE_SIZE);
+                       if (memchr_inv(obj_map, pattern[i], PAGE_SIZE)) {
+                               err = -EINVAL;
+                               pr_err("imported vmap not all set to %x!\n", pattern[i]);
+                               i915_gem_object_unpin_map(obj);
+                               goto out_dma_map;
+                       }
+               }
+
+               for (i = 0; i < ARRAY_SIZE(pattern); i++) {
+                       memset(obj_map, pattern[i], PAGE_SIZE);
+                       if (memchr_inv(dma_map, pattern[i], PAGE_SIZE)) {
+                               err = -EINVAL;
+                               pr_err("exported vmap not all set to %x!\n", pattern[i]);
+                               i915_gem_object_unpin_map(obj);
+                               goto out_dma_map;
+                       }
+               }
+
+               i915_gem_object_unpin_map(obj);
+       }
+
+       err = 0;
+out_dma_map:
+       dma_buf_vunmap(dmabuf, dma_map);
+out_obj:
+       i915_gem_object_put(obj);
+out_dmabuf:
+       dma_buf_put(dmabuf);
+       return err;
+}
+
+static int igt_dmabuf_import_ownership(void *arg)
+{
+       struct drm_i915_private *i915 = arg;
+       struct drm_i915_gem_object *obj;
+       struct dma_buf *dmabuf;
+       void *ptr;
+       int err;
+
+       dmabuf = mock_dmabuf(1);
+       if (IS_ERR(dmabuf))
+               return PTR_ERR(dmabuf);
+
+       ptr = dma_buf_vmap(dmabuf);
+       if (!ptr) {
+               pr_err("dma_buf_vmap failed\n");
+               err = -ENOMEM;
+               goto err_dmabuf;
+       }
+
+       memset(ptr, 0xc5, PAGE_SIZE);
+       dma_buf_vunmap(dmabuf, ptr);
+
+       obj = to_intel_bo(i915_gem_prime_import(&i915->drm, dmabuf));
+       if (IS_ERR(obj)) {
+               pr_err("i915_gem_prime_import failed with err=%d\n",
+                      (int)PTR_ERR(obj));
+               err = PTR_ERR(obj);
+               goto err_dmabuf;
+       }
+
+       dma_buf_put(dmabuf);
+
+       err = i915_gem_object_pin_pages(obj);
+       if (err) {
+               pr_err("i915_gem_object_pin_pages failed with err=%d\n", err);
+               goto out_obj;
+       }
+
+       err = 0;
+       i915_gem_object_unpin_pages(obj);
+out_obj:
+       i915_gem_object_put(obj);
+       return err;
+
+err_dmabuf:
+       dma_buf_put(dmabuf);
+       return err;
+}
+
+static int igt_dmabuf_export_vmap(void *arg)
+{
+       struct drm_i915_private *i915 = arg;
+       struct drm_i915_gem_object *obj;
+       struct dma_buf *dmabuf;
+       void *ptr;
+       int err;
+
+       obj = i915_gem_object_create(i915, PAGE_SIZE);
+       if (IS_ERR(obj))
+               return PTR_ERR(obj);
+
+       dmabuf = i915_gem_prime_export(&obj->base, 0);
+       if (IS_ERR(dmabuf)) {
+               pr_err("i915_gem_prime_export failed with err=%d\n",
+                      (int)PTR_ERR(dmabuf));
+               err = PTR_ERR(dmabuf);
+               goto err_obj;
+       }
+       i915_gem_object_put(obj);
+
+       ptr = dma_buf_vmap(dmabuf);
+       if (!ptr) {
+               pr_err("dma_buf_vmap failed\n");
+               err = -ENOMEM;
+               goto out;
+       }
+
+       if (memchr_inv(ptr, 0, dmabuf->size)) {
+               pr_err("Exported object not initialiased to zero!\n");
+               err = -EINVAL;
+               goto out;
+       }
+
+       memset(ptr, 0xc5, dmabuf->size);
+
+       err = 0;
+       dma_buf_vunmap(dmabuf, ptr);
+out:
+       dma_buf_put(dmabuf);
+       return err;
+
+err_obj:
+       i915_gem_object_put(obj);
+       return err;
+}
+
+static int igt_dmabuf_export_kmap(void *arg)
+{
+       struct drm_i915_private *i915 = arg;
+       struct drm_i915_gem_object *obj;
+       struct dma_buf *dmabuf;
+       void *ptr;
+       int err;
+
+       obj = i915_gem_object_create(i915, 2*PAGE_SIZE);
+       if (IS_ERR(obj))
+               return PTR_ERR(obj);
+
+       dmabuf = i915_gem_prime_export(&obj->base, 0);
+       i915_gem_object_put(obj);
+       if (IS_ERR(dmabuf)) {
+               err = PTR_ERR(dmabuf);
+               pr_err("i915_gem_prime_export failed with err=%d\n", err);
+               return err;
+       }
+
+       ptr = dma_buf_kmap(dmabuf, 0);
+       if (!ptr) {
+               pr_err("dma_buf_kmap failed\n");
+               err = -ENOMEM;
+               goto err;
+       }
+
+       if (memchr_inv(ptr, 0, PAGE_SIZE)) {
+               dma_buf_kunmap(dmabuf, 0, ptr);
+               pr_err("Exported page[0] not initialiased to zero!\n");
+               err = -EINVAL;
+               goto err;
+       }
+
+       memset(ptr, 0xc5, PAGE_SIZE);
+       dma_buf_kunmap(dmabuf, 0, ptr);
+
+       ptr = i915_gem_object_pin_map(obj, I915_MAP_WB);
+       if (IS_ERR(ptr)) {
+               err = PTR_ERR(ptr);
+               pr_err("i915_gem_object_pin_map failed with err=%d\n", err);
+               goto err;
+       }
+       memset(ptr + PAGE_SIZE, 0xaa, PAGE_SIZE);
+       i915_gem_object_flush_map(obj);
+       i915_gem_object_unpin_map(obj);
+
+       ptr = dma_buf_kmap(dmabuf, 1);
+       if (!ptr) {
+               pr_err("dma_buf_kmap failed\n");
+               err = -ENOMEM;
+               goto err;
+       }
+
+       if (memchr_inv(ptr, 0xaa, PAGE_SIZE)) {
+               dma_buf_kunmap(dmabuf, 1, ptr);
+               pr_err("Exported page[1] not set to 0xaa!\n");
+               err = -EINVAL;
+               goto err;
+       }
+
+       memset(ptr, 0xc5, PAGE_SIZE);
+       dma_buf_kunmap(dmabuf, 1, ptr);
+
+       ptr = dma_buf_kmap(dmabuf, 0);
+       if (!ptr) {
+               pr_err("dma_buf_kmap failed\n");
+               err = -ENOMEM;
+               goto err;
+       }
+       if (memchr_inv(ptr, 0xc5, PAGE_SIZE)) {
+               dma_buf_kunmap(dmabuf, 0, ptr);
+               pr_err("Exported page[0] did not retain 0xc5!\n");
+               err = -EINVAL;
+               goto err;
+       }
+       dma_buf_kunmap(dmabuf, 0, ptr);
+
+       ptr = dma_buf_kmap(dmabuf, 2);
+       if (ptr) {
+               pr_err("Erroneously kmapped beyond the end of the object!\n");
+               dma_buf_kunmap(dmabuf, 2, ptr);
+               err = -EINVAL;
+               goto err;
+       }
+
+       ptr = dma_buf_kmap(dmabuf, -1);
+       if (ptr) {
+               pr_err("Erroneously kmapped before the start of the object!\n");
+               dma_buf_kunmap(dmabuf, -1, ptr);
+               err = -EINVAL;
+               goto err;
+       }
+
+       err = 0;
+err:
+       dma_buf_put(dmabuf);
+       return err;
+}
+
+int i915_gem_dmabuf_mock_selftests(void)
+{
+       static const struct i915_subtest tests[] = {
+               SUBTEST(igt_dmabuf_export),
+               SUBTEST(igt_dmabuf_import_self),
+               SUBTEST(igt_dmabuf_import),
+               SUBTEST(igt_dmabuf_import_ownership),
+               SUBTEST(igt_dmabuf_export_vmap),
+               SUBTEST(igt_dmabuf_export_kmap),
+       };
+       struct drm_i915_private *i915;
+       int err;
+
+       i915 = mock_gem_device();
+       if (!i915)
+               return -ENOMEM;
+
+       err = i915_subtests(tests, i915);
+
+       drm_dev_put(&i915->drm);
+       return err;
+}
+
+int i915_gem_dmabuf_live_selftests(struct drm_i915_private *i915)
+{
+       static const struct i915_subtest tests[] = {
+               SUBTEST(igt_dmabuf_export),
+       };
+
+       return i915_subtests(tests, i915);
+}
index 06393cd1067db69ee448d8c08d30ae1691139498..5a3ad6fc8ea7d84964c7f459af82f60a2e80dbef 100644 (file)
@@ -3,19 +3,21 @@
  *
  * derived from imx-hdmi.c(renamed to bridge/dw_hdmi.c now)
  */
-#include <linux/module.h>
-#include <linux/platform_device.h>
+
 #include <linux/component.h>
 #include <linux/mfd/syscon.h>
 #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
-#include <drm/bridge/dw_hdmi.h>
-#include <video/imx-ipu-v3.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
 #include <linux/regmap.h>
-#include <drm/drm_of.h>
-#include <drm/drmP.h>
+
+#include <video/imx-ipu-v3.h>
+
+#include <drm/bridge/dw_hdmi.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_edid.h>
 #include <drm/drm_encoder_slave.h>
+#include <drm/drm_of.h>
 
 #include "imx-drm.h"
 
index 3e8bece620df08f070ad021bb1e49c2c5a79247c..da87c70e413b4d6d821b991621563c3edf618fc0 100644 (file)
@@ -4,14 +4,18 @@
  *
  * Copyright (C) 2011 Sascha Hauer, Pengutronix
  */
+
 #include <linux/component.h>
 #include <linux/device.h>
 #include <linux/dma-buf.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
-#include <drm/drmP.h>
+
+#include <video/imx-ipu-v3.h>
+
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_gem_cma_helper.h>
@@ -19,7 +23,7 @@
 #include <drm/drm_of.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_probe_helper.h>
-#include <video/imx-ipu-v3.h>
+#include <drm/drm_vblank.h>
 
 #include "imx-drm.h"
 #include "ipuv3-plane.h"
@@ -147,16 +151,13 @@ static const struct drm_ioctl_desc imx_drm_ioctls[] = {
 };
 
 static struct drm_driver imx_drm_driver = {
-       .driver_features        = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME |
-                                 DRIVER_ATOMIC,
+       .driver_features        = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
        .gem_free_object_unlocked = drm_gem_cma_free_object,
        .gem_vm_ops             = &drm_gem_cma_vm_ops,
        .dumb_create            = drm_gem_cma_dumb_create,
 
        .prime_handle_to_fd     = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle     = drm_gem_prime_fd_to_handle,
-       .gem_prime_import       = drm_gem_prime_import,
-       .gem_prime_export       = drm_gem_prime_export,
        .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
        .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
        .gem_prime_vmap         = drm_gem_cma_prime_vmap,
index 38373330228048bc3cff00f08925de4a7e0bbddd..de62a4cd4827f5ba53ebe649fecc304172eeb139 100644 (file)
@@ -5,25 +5,27 @@
  * Copyright (C) 2012 Sascha Hauer, Pengutronix
  */
 
-#include <linux/module.h>
 #include <linux/clk.h>
 #include <linux/component.h>
-#include <drm/drmP.h>
-#include <drm/drm_atomic.h>
-#include <drm/drm_atomic_helper.h>
-#include <drm/drm_fb_helper.h>
-#include <drm/drm_of.h>
-#include <drm/drm_panel.h>
-#include <drm/drm_probe_helper.h>
 #include <linux/mfd/syscon.h>
 #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
+#include <linux/module.h>
 #include <linux/of_device.h>
 #include <linux/of_graph.h>
-#include <video/of_display_timing.h>
-#include <video/of_videomode.h>
 #include <linux/regmap.h>
 #include <linux/videodev2.h>
 
+#include <video/of_display_timing.h>
+#include <video/of_videomode.h>
+
+#include <drm/drm_atomic.h>
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_fb_helper.h>
+#include <drm/drm_of.h>
+#include <drm/drm_panel.h>
+#include <drm/drm_print.h>
+#include <drm/drm_probe_helper.h>
+
 #include "imx-drm.h"
 
 #define DRIVER_NAME "imx-ldb"
index e725af8a0025a110ad1b1d607eea083054e3f151..649515868f863d3c3c096340395c49a6ad8e7010 100644 (file)
@@ -5,20 +5,22 @@
  * Copyright (C) 2013 Philipp Zabel, Pengutronix
  */
 
-#include <linux/clk.h>
 #include <linux/clk-provider.h>
+#include <linux/clk.h>
 #include <linux/component.h>
-#include <linux/module.h>
 #include <linux/i2c.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
 #include <linux/regmap.h>
 #include <linux/regulator/consumer.h>
 #include <linux/spinlock.h>
 #include <linux/videodev2.h>
-#include <drm/drmP.h>
+
+#include <video/imx-ipu-v3.h>
+
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_probe_helper.h>
-#include <video/imx-ipu-v3.h>
 
 #include "imx-drm.h"
 
index c436a28d50e44f86ad8d33a59ce8ce7a52aa11d6..63c0284f8b3c07f01d74c552fdb3829ad81fad7e 100644 (file)
@@ -4,21 +4,25 @@
  *
  * Copyright (C) 2011 Sascha Hauer, Pengutronix
  */
+
 #include <linux/clk.h>
 #include <linux/component.h>
 #include <linux/device.h>
+#include <linux/dma-mapping.h>
 #include <linux/errno.h>
 #include <linux/export.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
-#include <drm/drmP.h>
+
+#include <video/imx-ipu-v3.h>
+
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
 
-#include <video/imx-ipu-v3.h>
 #include "imx-drm.h"
 #include "ipuv3-plane.h"
 
index 2a1e071d39eecbe0ecf19fcf26c98e66ce41ac47..28826c0aa24a6a550f0133ed82f23a3ddfbc4902 100644 (file)
@@ -5,15 +5,16 @@
  * Copyright (C) 2013 Philipp Zabel, Pengutronix
  */
 
-#include <drm/drmP.h>
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_plane_helper.h>
 
-#include "video/imx-ipu-v3.h"
+#include <video/imx-ipu-v3.h>
+
 #include "imx-drm.h"
 #include "ipuv3-plane.h"
 
index 1a76de1e8e7bb500c08e7e8335a009580a136783..2e51b2fade7515252d04729c91a482c6c07a8a77 100644 (file)
@@ -7,14 +7,16 @@
 
 #include <linux/component.h>
 #include <linux/module.h>
-#include <drm/drmP.h>
+#include <linux/platform_device.h>
+#include <linux/videodev2.h>
+
+#include <video/of_display_timing.h>
+
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_of.h>
 #include <drm/drm_panel.h>
 #include <drm/drm_probe_helper.h>
-#include <linux/videodev2.h>
-#include <video/of_display_timing.h>
 
 #include "imx-drm.h"
 
index e9f9e9fb9b1773a1a40d6b1e9a8a063a10e8f530..ce1fae3a78a9c2d9a456207b8b7d525336f65f30 100644 (file)
@@ -166,6 +166,8 @@ struct ingenic_drm {
 
        struct ingenic_dma_hwdesc *dma_hwdesc;
        dma_addr_t dma_hwdesc_phys;
+
+       bool panel_is_sharp;
 };
 
 static const u32 ingenic_drm_primary_formats[] = {
@@ -283,6 +285,13 @@ static void ingenic_drm_crtc_update_timings(struct ingenic_drm *priv,
        regmap_write(priv->map, JZ_REG_LCD_DAV,
                     vds << JZ_LCD_DAV_VDS_OFFSET |
                     vde << JZ_LCD_DAV_VDE_OFFSET);
+
+       if (priv->panel_is_sharp) {
+               regmap_write(priv->map, JZ_REG_LCD_PS, hde << 16 | (hde + 1));
+               regmap_write(priv->map, JZ_REG_LCD_CLS, hde << 16 | (hde + 1));
+               regmap_write(priv->map, JZ_REG_LCD_SPL, hpe << 16 | (hpe + 1));
+               regmap_write(priv->map, JZ_REG_LCD_REV, mode->htotal << 16);
+       }
 }
 
 static void ingenic_drm_crtc_update_ctrl(struct ingenic_drm *priv,
@@ -378,11 +387,18 @@ static void ingenic_drm_encoder_atomic_mode_set(struct drm_encoder *encoder,
 {
        struct ingenic_drm *priv = drm_encoder_get_priv(encoder);
        struct drm_display_mode *mode = &crtc_state->adjusted_mode;
-       struct drm_display_info *info = &conn_state->connector->display_info;
-       unsigned int cfg = JZ_LCD_CFG_PS_DISABLE
-                        | JZ_LCD_CFG_CLS_DISABLE
-                        | JZ_LCD_CFG_SPL_DISABLE
-                        | JZ_LCD_CFG_REV_DISABLE;
+       struct drm_connector *conn = conn_state->connector;
+       struct drm_display_info *info = &conn->display_info;
+       unsigned int cfg;
+
+       priv->panel_is_sharp = info->bus_flags & DRM_BUS_FLAG_SHARP_SIGNALS;
+
+       if (priv->panel_is_sharp) {
+               cfg = JZ_LCD_CFG_MODE_SPECIAL_TFT_1 | JZ_LCD_CFG_REV_POLARITY;
+       } else {
+               cfg = JZ_LCD_CFG_PS_DISABLE | JZ_LCD_CFG_CLS_DISABLE
+                   | JZ_LCD_CFG_SPL_DISABLE | JZ_LCD_CFG_REV_DISABLE;
+       }
 
        if (mode->flags & DRM_MODE_FLAG_NHSYNC)
                cfg |= JZ_LCD_CFG_HSYNC_ACTIVE_LOW;
@@ -393,24 +409,29 @@ static void ingenic_drm_encoder_atomic_mode_set(struct drm_encoder *encoder,
        if (info->bus_flags & DRM_BUS_FLAG_PIXDATA_NEGEDGE)
                cfg |= JZ_LCD_CFG_PCLK_FALLING_EDGE;
 
-       if (conn_state->connector->connector_type == DRM_MODE_CONNECTOR_TV) {
-               if (mode->flags & DRM_MODE_FLAG_INTERLACE)
-                       cfg |= JZ_LCD_CFG_MODE_TV_OUT_I;
-               else
-                       cfg |= JZ_LCD_CFG_MODE_TV_OUT_P;
-       } else {
-               switch (*info->bus_formats) {
-               case MEDIA_BUS_FMT_RGB565_1X16:
-                       cfg |= JZ_LCD_CFG_MODE_GENERIC_16BIT;
-                       break;
-               case MEDIA_BUS_FMT_RGB666_1X18:
-                       cfg |= JZ_LCD_CFG_MODE_GENERIC_18BIT;
-                       break;
-               case MEDIA_BUS_FMT_RGB888_1X24:
-                       cfg |= JZ_LCD_CFG_MODE_GENERIC_24BIT;
-                       break;
-               default:
-                       break;
+       if (!priv->panel_is_sharp) {
+               if (conn->connector_type == DRM_MODE_CONNECTOR_TV) {
+                       if (mode->flags & DRM_MODE_FLAG_INTERLACE)
+                               cfg |= JZ_LCD_CFG_MODE_TV_OUT_I;
+                       else
+                               cfg |= JZ_LCD_CFG_MODE_TV_OUT_P;
+               } else {
+                       switch (*info->bus_formats) {
+                       case MEDIA_BUS_FMT_RGB565_1X16:
+                               cfg |= JZ_LCD_CFG_MODE_GENERIC_16BIT;
+                               break;
+                       case MEDIA_BUS_FMT_RGB666_1X18:
+                               cfg |= JZ_LCD_CFG_MODE_GENERIC_18BIT;
+                               break;
+                       case MEDIA_BUS_FMT_RGB888_1X24:
+                               cfg |= JZ_LCD_CFG_MODE_GENERIC_24BIT;
+                               break;
+                       case MEDIA_BUS_FMT_RGB888_3X8:
+                               cfg |= JZ_LCD_CFG_MODE_8BIT_SERIAL;
+                               break;
+                       default:
+                               break;
+                       }
                }
        }
 
@@ -433,6 +454,7 @@ static int ingenic_drm_encoder_atomic_check(struct drm_encoder *encoder,
        case MEDIA_BUS_FMT_RGB565_1X16:
        case MEDIA_BUS_FMT_RGB666_1X18:
        case MEDIA_BUS_FMT_RGB888_1X24:
+       case MEDIA_BUS_FMT_RGB888_3X8:
                return 0;
        default:
                return -EINVAL;
@@ -484,8 +506,7 @@ static void ingenic_drm_disable_vblank(struct drm_crtc *crtc)
 DEFINE_DRM_GEM_CMA_FOPS(ingenic_drm_fops);
 
 static struct drm_driver ingenic_drm_driver_data = {
-       .driver_features        = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME
-                               | DRIVER_ATOMIC,
+       .driver_features        = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
        .name                   = "ingenic-drm",
        .desc                   = "DRM module for Ingenic SoCs",
        .date                   = "20190422",
@@ -581,7 +602,6 @@ static int ingenic_drm_probe(struct platform_device *pdev)
        struct drm_bridge *bridge;
        struct drm_panel *panel;
        struct drm_device *drm;
-       struct resource *mem;
        void __iomem *base;
        long parent_rate;
        int ret, irq;
@@ -615,8 +635,7 @@ static int ingenic_drm_probe(struct platform_device *pdev)
        drm->mode_config.max_height = 600;
        drm->mode_config.funcs = &ingenic_drm_mode_config_funcs;
 
-       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       base = devm_ioremap_resource(dev, mem);
+       base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(base)) {
                dev_err(dev, "Failed to get memory resource");
                return PTR_ERR(base);
index 570d0e93f9a998c110adc391b52554ca64a87267..d86b8d81a483a7de826d58b0ea9be84dcb14620e 100644 (file)
@@ -80,26 +80,23 @@ const char *lima_ip_name(struct lima_ip *ip)
 static int lima_clk_init(struct lima_device *dev)
 {
        int err;
-       unsigned long bus_rate, gpu_rate;
 
        dev->clk_bus = devm_clk_get(dev->dev, "bus");
        if (IS_ERR(dev->clk_bus)) {
-               dev_err(dev->dev, "get bus clk failed %ld\n", PTR_ERR(dev->clk_bus));
-               return PTR_ERR(dev->clk_bus);
+               err = PTR_ERR(dev->clk_bus);
+               if (err != -EPROBE_DEFER)
+                       dev_err(dev->dev, "get bus clk failed %d\n", err);
+               return err;
        }
 
        dev->clk_gpu = devm_clk_get(dev->dev, "core");
        if (IS_ERR(dev->clk_gpu)) {
-               dev_err(dev->dev, "get core clk failed %ld\n", PTR_ERR(dev->clk_gpu));
-               return PTR_ERR(dev->clk_gpu);
+               err = PTR_ERR(dev->clk_gpu);
+               if (err != -EPROBE_DEFER)
+                       dev_err(dev->dev, "get core clk failed %d\n", err);
+               return err;
        }
 
-       bus_rate = clk_get_rate(dev->clk_bus);
-       dev_info(dev->dev, "bus rate = %lu\n", bus_rate);
-
-       gpu_rate = clk_get_rate(dev->clk_gpu);
-       dev_info(dev->dev, "mod rate = %lu", gpu_rate);
-
        err = clk_prepare_enable(dev->clk_bus);
        if (err)
                return err;
@@ -111,11 +108,17 @@ static int lima_clk_init(struct lima_device *dev)
        dev->reset = devm_reset_control_get_optional(dev->dev, NULL);
        if (IS_ERR(dev->reset)) {
                err = PTR_ERR(dev->reset);
+               if (err != -EPROBE_DEFER)
+                       dev_err(dev->dev, "get reset controller failed %d\n",
+                               err);
                goto error_out1;
        } else if (dev->reset != NULL) {
                err = reset_control_deassert(dev->reset);
-               if (err)
+               if (err) {
+                       dev_err(dev->dev,
+                               "reset controller deassert failed %d\n", err);
                        goto error_out1;
+               }
        }
 
        return 0;
@@ -145,7 +148,8 @@ static int lima_regulator_init(struct lima_device *dev)
                dev->regulator = NULL;
                if (ret == -ENODEV)
                        return 0;
-               dev_err(dev->dev, "failed to get regulator: %d\n", ret);
+               if (ret != -EPROBE_DEFER)
+                       dev_err(dev->dev, "failed to get regulator: %d\n", ret);
                return ret;
        }
 
@@ -291,16 +295,12 @@ int lima_device_init(struct lima_device *ldev)
        dma_set_coherent_mask(ldev->dev, DMA_BIT_MASK(32));
 
        err = lima_clk_init(ldev);
-       if (err) {
-               dev_err(ldev->dev, "clk init fail %d\n", err);
+       if (err)
                return err;
-       }
 
        err = lima_regulator_init(ldev);
-       if (err) {
-               dev_err(ldev->dev, "regulator init fail %d\n", err);
+       if (err)
                goto err_out0;
-       }
 
        ldev->empty_vm = lima_vm_create(ldev);
        if (!ldev->empty_vm) {
@@ -343,6 +343,9 @@ int lima_device_init(struct lima_device *ldev)
        if (err)
                goto err_out5;
 
+       dev_info(ldev->dev, "bus rate = %lu\n", clk_get_rate(ldev->clk_bus));
+       dev_info(ldev->dev, "mod rate = %lu", clk_get_rate(ldev->clk_gpu));
+
        return 0;
 
 err_out5:
index b29c26cd13b2996368e7b61d26ebae56761dfce9..75ec703d22e03a64295e3b78688601127ce6005f 100644 (file)
@@ -231,13 +231,13 @@ static void lima_drm_driver_postclose(struct drm_device *dev, struct drm_file *f
 }
 
 static const struct drm_ioctl_desc lima_drm_driver_ioctls[] = {
-       DRM_IOCTL_DEF_DRV(LIMA_GET_PARAM, lima_ioctl_get_param, DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(LIMA_GEM_CREATE, lima_ioctl_gem_create, DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(LIMA_GEM_INFO, lima_ioctl_gem_info, DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(LIMA_GEM_SUBMIT, lima_ioctl_gem_submit, DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(LIMA_GEM_WAIT, lima_ioctl_gem_wait, DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(LIMA_CTX_CREATE, lima_ioctl_ctx_create, DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(LIMA_CTX_FREE, lima_ioctl_ctx_free, DRM_AUTH|DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(LIMA_GET_PARAM, lima_ioctl_get_param, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(LIMA_GEM_CREATE, lima_ioctl_gem_create, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(LIMA_GEM_INFO, lima_ioctl_gem_info, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(LIMA_GEM_SUBMIT, lima_ioctl_gem_submit, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(LIMA_GEM_WAIT, lima_ioctl_gem_wait, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(LIMA_CTX_CREATE, lima_ioctl_ctx_create, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(LIMA_CTX_FREE, lima_ioctl_ctx_free, DRM_RENDER_ALLOW),
 };
 
 static const struct file_operations lima_drm_driver_fops = {
@@ -252,7 +252,7 @@ static const struct file_operations lima_drm_driver_fops = {
 };
 
 static struct drm_driver lima_drm_driver = {
-       .driver_features    = DRIVER_RENDER | DRIVER_GEM | DRIVER_PRIME | DRIVER_SYNCOBJ,
+       .driver_features    = DRIVER_RENDER | DRIVER_GEM | DRIVER_SYNCOBJ,
        .open               = lima_drm_driver_open,
        .postclose          = lima_drm_driver_postclose,
        .ioctls             = lima_drm_driver_ioctls,
@@ -307,10 +307,8 @@ static int lima_pdev_probe(struct platform_device *pdev)
        ldev->ddev = ddev;
 
        err = lima_device_init(ldev);
-       if (err) {
-               dev_err(&pdev->dev, "Fatal error during GPU init\n");
+       if (err)
                goto err_out1;
-       }
 
        /*
         * Register the DRM device with the core and the connectors with
index 477c0f766663de92dfd4bf263e7e374896eef73a..fd1a024703d2ea96a3fddd3a8b9ab191b568939b 100644 (file)
@@ -24,7 +24,7 @@ int lima_gem_create_handle(struct drm_device *dev, struct drm_file *file,
        struct lima_bo *bo;
        struct lima_device *ldev = to_lima_dev(dev);
 
-       bo = lima_bo_create(ldev, size, flags, NULL, NULL);
+       bo = lima_bo_create(ldev, size, flags, NULL);
        if (IS_ERR(bo))
                return PTR_ERR(bo);
 
index 9c6d9f1dba55727afb03cdffd91d154241b21523..e3eb251e0a127731c5bfa1d7ccdd87d50fc2c825 100644 (file)
@@ -18,8 +18,7 @@ struct drm_gem_object *lima_gem_prime_import_sg_table(
        struct lima_device *ldev = to_lima_dev(dev);
        struct lima_bo *bo;
 
-       bo = lima_bo_create(ldev, attach->dmabuf->size, 0, sgt,
-                           attach->dmabuf->resv);
+       bo = lima_bo_create(ldev, attach->dmabuf->size, 0, sgt);
        if (IS_ERR(bo))
                return ERR_CAST(bo);
 
index 5c41f859a72fa21a2398895e1a876aec2dd5c90a..87123b1d083c260a9f79a48e5439ce44cd24be22 100644 (file)
@@ -33,8 +33,7 @@ void lima_bo_destroy(struct lima_bo *bo)
        kfree(bo);
 }
 
-static struct lima_bo *lima_bo_create_struct(struct lima_device *dev, u32 size, u32 flags,
-                                            struct reservation_object *resv)
+static struct lima_bo *lima_bo_create_struct(struct lima_device *dev, u32 size, u32 flags)
 {
        struct lima_bo *bo;
        int err;
@@ -47,7 +46,6 @@ static struct lima_bo *lima_bo_create_struct(struct lima_device *dev, u32 size,
 
        mutex_init(&bo->lock);
        INIT_LIST_HEAD(&bo->va);
-       bo->gem.resv = resv;
 
        err = drm_gem_object_init(dev->ddev, &bo->gem, size);
        if (err) {
@@ -59,14 +57,13 @@ static struct lima_bo *lima_bo_create_struct(struct lima_device *dev, u32 size,
 }
 
 struct lima_bo *lima_bo_create(struct lima_device *dev, u32 size,
-                              u32 flags, struct sg_table *sgt,
-                              struct reservation_object *resv)
+                              u32 flags, struct sg_table *sgt)
 {
        int i, err;
        size_t npages;
        struct lima_bo *bo, *ret;
 
-       bo = lima_bo_create_struct(dev, size, flags, resv);
+       bo = lima_bo_create_struct(dev, size, flags);
        if (IS_ERR(bo))
                return bo;
 
index 6738724afb7b06b0b82c71735f1f9ae6a58df5d2..31ca2d8dc0a19b5cc91003e6fe828d4aaf39e983 100644 (file)
@@ -27,8 +27,7 @@ to_lima_bo(struct drm_gem_object *obj)
 }
 
 struct lima_bo *lima_bo_create(struct lima_device *dev, u32 size,
-                              u32 flags, struct sg_table *sgt,
-                              struct reservation_object *resv);
+                              u32 flags, struct sg_table *sgt);
 void lima_bo_destroy(struct lima_bo *bo);
 void *lima_bo_vmap(struct lima_bo *bo);
 void lima_bo_vunmap(struct lima_bo *bo);
index caee2f8a29b401d43f445660781a9dd892f87721..e0bdedcf14dd50dd36c7167ea685a34e6bce162b 100644 (file)
@@ -15,9 +15,9 @@
 #define LIMA_VM_NUM_PT_PER_BT (1 << LIMA_VM_NUM_PT_PER_BT_SHIFT)
 #define LIMA_VM_NUM_BT (LIMA_PAGE_ENT_NUM >> LIMA_VM_NUM_PT_PER_BT_SHIFT)
 
-#define LIMA_VA_RESERVE_START  0xFFF00000
+#define LIMA_VA_RESERVE_START  0x0FFF00000ULL
 #define LIMA_VA_RESERVE_DLBU   LIMA_VA_RESERVE_START
-#define LIMA_VA_RESERVE_END    0x100000000
+#define LIMA_VA_RESERVE_END    0x100000000ULL
 
 struct lima_device;
 
index baf63fb6850a418c5c4b245fc09bf93fff0ef894..982fe8485a617ad4bb4cd66c39c34f61ed07c83e 100644 (file)
@@ -237,7 +237,7 @@ DEFINE_DRM_GEM_CMA_FOPS(drm_fops);
 
 static struct drm_driver mcde_drm_driver = {
        .driver_features =
-               DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME | DRIVER_ATOMIC,
+               DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
        .release = mcde_release,
        .lastclose = drm_fb_helper_lastclose,
        .ioctls = NULL,
@@ -254,8 +254,6 @@ static struct drm_driver mcde_drm_driver = {
 
        .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
-       .gem_prime_import = drm_gem_prime_import,
-       .gem_prime_export = drm_gem_prime_export,
        .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
        .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
        .gem_prime_vmap = drm_gem_cma_prime_vmap,
@@ -319,7 +317,7 @@ static int mcde_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct drm_device *drm;
        struct mcde *mcde;
-       struct component_match *match;
+       struct component_match *match = NULL;
        struct resource *res;
        u32 pid;
        u32 val;
@@ -485,6 +483,10 @@ static int mcde_probe(struct platform_device *pdev)
                }
                put_device(p);
        }
+       if (!match) {
+               dev_err(dev, "no matching components\n");
+               return -ENODEV;
+       }
        if (IS_ERR(match)) {
                dev_err(dev, "could not create component match\n");
                ret = PTR_ERR(match);
index f33d98b356d6dd5183492d69d243c9e285b3b835..59de2a46aa49a38b6c51f4b5ce3beb68a64ac713 100644 (file)
@@ -3,9 +3,9 @@
  * Copyright (c) 2017 MediaTek Inc.
  */
 
-#include <drm/drmP.h>
 #include <linux/clk.h>
 #include <linux/component.h>
+#include <linux/module.h>
 #include <linux/of_device.h>
 #include <linux/of_irq.h>
 #include <linux/platform_device.h>
index c4f07c28c74f91a6c65503d3c64d3db0f9571f60..21851756c5798c4261c1eef25ef4ce0259b0e76c 100644 (file)
@@ -3,9 +3,9 @@
  * Copyright (c) 2015 MediaTek Inc.
  */
 
-#include <drm/drmP.h>
 #include <linux/clk.h>
 #include <linux/component.h>
+#include <linux/module.h>
 #include <linux/of_device.h>
 #include <linux/of_irq.h>
 #include <linux/platform_device.h>
index 9a6f0a29e43c1118ef4118969860445af63b9dc6..405afef31407eebfb1b6e81e91ee827104b14e08 100644 (file)
@@ -3,9 +3,9 @@
  * Copyright (c) 2015 MediaTek Inc.
  */
 
-#include <drm/drmP.h>
 #include <linux/clk.h>
 #include <linux/component.h>
+#include <linux/module.h>
 #include <linux/of_device.h>
 #include <linux/of_irq.h>
 #include <linux/platform_device.h>
index bacd989cc9aa01ed20626c9659dbce161ef7513f..be6d95c5ff253388fc89e5b673574febe03e1f31 100644 (file)
@@ -3,21 +3,23 @@
  * Copyright (c) 2014 MediaTek Inc.
  * Author: Jie Qiu <jie.qiu@mediatek.com>
  */
-#include <drm/drmP.h>
-#include <drm/drm_crtc.h>
-#include <drm/drm_atomic_helper.h>
-#include <drm/drm_of.h>
-#include <linux/kernel.h>
+
+#include <linux/clk.h>
 #include <linux/component.h>
-#include <linux/platform_device.h>
+#include <linux/interrupt.h>
+#include <linux/kernel.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/of_graph.h>
-#include <linux/interrupt.h>
+#include <linux/platform_device.h>
 #include <linux/types.h>
-#include <linux/clk.h>
+
 #include <video/videomode.h>
 
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_crtc.h>
+#include <drm/drm_of.h>
+
 #include "mtk_dpi_regs.h"
 #include "mtk_drm_ddp_comp.h"
 
index a9007210dda1e7d02ff87bd5d26398c2efb9ff5a..34a731755791236a787771a7a9f81f655cf817ba 100644 (file)
@@ -3,14 +3,16 @@
  * Copyright (c) 2015 MediaTek Inc.
  */
 
+#include <linux/clk.h>
+#include <linux/pm_runtime.h>
+
 #include <asm/barrier.h>
-#include <drm/drmP.h>
+#include <soc/mediatek/smi.h>
+
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_probe_helper.h>
-#include <linux/clk.h>
-#include <linux/pm_runtime.h>
-#include <soc/mediatek/smi.h>
+#include <drm/drm_vblank.h>
 
 #include "mtk_drm_drv.h"
 #include "mtk_drm_crtc.h"
index b38963f1f2ece1dc5c281cf9c1bac86f5650623f..efa85973e46b07b9e62d5d59917821f2ac03f086 100644 (file)
@@ -12,7 +12,7 @@
 #include <linux/of_irq.h>
 #include <linux/of_platform.h>
 #include <linux/platform_device.h>
-#include <drm/drmP.h>
+
 #include "mtk_drm_drv.h"
 #include "mtk_drm_plane.h"
 #include "mtk_drm_ddp_comp.h"
index 95fdbd0fbcace01f26e3c1c393210ba09e60a952..2ee809a6f3dc12f0fa984b2e4030e59b87fefaaa 100644 (file)
@@ -4,22 +4,26 @@
  * Author: YT SHEN <yt.shen@mediatek.com>
  */
 
-#include <drm/drmP.h>
+#include <linux/component.h>
+#include <linux/iommu.h>
+#include <linux/module.h>
+#include <linux/of_address.h>
+#include <linux/of_platform.h>
+#include <linux/pm_runtime.h>
+
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_gem.h>
 #include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_of.h>
 #include <drm/drm_probe_helper.h>
-#include <linux/component.h>
-#include <linux/iommu.h>
-#include <linux/of_address.h>
-#include <linux/of_platform.h>
-#include <linux/pm_runtime.h>
+#include <drm/drm_vblank.h>
 
 #include "mtk_drm_crtc.h"
 #include "mtk_drm_ddp.h"
+#include "mtk_drm_ddp.h"
 #include "mtk_drm_ddp_comp.h"
 #include "mtk_drm_drv.h"
 #include "mtk_drm_fb.h"
@@ -38,22 +42,12 @@ static void mtk_atomic_schedule(struct mtk_drm_private *private,
        schedule_work(&private->commit.work);
 }
 
-static void mtk_atomic_wait_for_fences(struct drm_atomic_state *state)
-{
-       struct drm_plane *plane;
-       struct drm_plane_state *new_plane_state;
-       int i;
-
-       for_each_new_plane_in_state(state, plane, new_plane_state, i)
-               mtk_fb_wait(new_plane_state->fb);
-}
-
 static void mtk_atomic_complete(struct mtk_drm_private *private,
                                struct drm_atomic_state *state)
 {
        struct drm_device *drm = private->drm;
 
-       mtk_atomic_wait_for_fences(state);
+       drm_atomic_helper_wait_for_fences(drm, state, false);
 
        /*
         * Mediatek drm supports runtime PM, so plane registers cannot be
@@ -321,8 +315,7 @@ static const struct file_operations mtk_drm_fops = {
 };
 
 static struct drm_driver mtk_drm_driver = {
-       .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME |
-                          DRIVER_ATOMIC,
+       .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
 
        .gem_free_object_unlocked = mtk_drm_gem_free_object,
        .gem_vm_ops = &drm_gem_cma_vm_ops,
@@ -330,8 +323,6 @@ static struct drm_driver mtk_drm_driver = {
 
        .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
-       .gem_prime_export = drm_gem_prime_export,
-       .gem_prime_import = drm_gem_prime_import,
        .gem_prime_get_sg_table = mtk_gem_prime_get_sg_table,
        .gem_prime_import_sg_table = mtk_gem_prime_import_sg_table,
        .gem_prime_mmap = mtk_drm_gem_mmap_buf,
index 4c3ad7de2d3b45e0dd263d917ec962fc4bc78a00..ae40b080ae4781e8d5069d8ac208970d2c296c1d 100644 (file)
@@ -3,13 +3,14 @@
  * Copyright (c) 2015 MediaTek Inc.
  */
 
-#include <drm/drmP.h>
+#include <linux/dma-buf.h>
+#include <linux/reservation.h>
+
 #include <drm/drm_modeset_helper.h>
 #include <drm/drm_fb_helper.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_gem.h>
 #include <drm/drm_gem_framebuffer_helper.h>
-#include <linux/dma-buf.h>
-#include <linux/reservation.h>
 
 #include "mtk_drm_drv.h"
 #include "mtk_drm_fb.h"
@@ -49,34 +50,6 @@ static struct drm_framebuffer *mtk_drm_framebuffer_init(struct drm_device *dev,
        return fb;
 }
 
-/*
- * Wait for any exclusive fence in fb's gem object's reservation object.
- *
- * Returns -ERESTARTSYS if interrupted, else 0.
- */
-int mtk_fb_wait(struct drm_framebuffer *fb)
-{
-       struct drm_gem_object *gem;
-       struct reservation_object *resv;
-       long ret;
-
-       if (!fb)
-               return 0;
-
-       gem = fb->obj[0];
-       if (!gem || !gem->dma_buf || !gem->dma_buf->resv)
-               return 0;
-
-       resv = gem->dma_buf->resv;
-       ret = reservation_object_wait_timeout_rcu(resv, false, true,
-                                                 MAX_SCHEDULE_TIMEOUT);
-       /* MAX_SCHEDULE_TIMEOUT on success, -ERESTARTSYS if interrupted */
-       if (WARN_ON(ret < 0))
-               return ret;
-
-       return 0;
-}
-
 struct drm_framebuffer *mtk_drm_mode_fb_create(struct drm_device *dev,
                                               struct drm_file *file,
                                               const struct drm_mode_fb_cmd2 *cmd)
index 6b80c28e33cf715ad54a79fa07b4d890519a313f..eb64d26001c66d73f54105952213263f70dba16f 100644 (file)
@@ -6,7 +6,6 @@
 #ifndef MTK_DRM_FB_H
 #define MTK_DRM_FB_H
 
-int mtk_fb_wait(struct drm_framebuffer *fb);
 struct drm_framebuffer *mtk_drm_mode_fb_create(struct drm_device *dev,
                                               struct drm_file *file,
                                               const struct drm_mode_fb_cmd2 *cmd);
index 0d69698f817322ccf5b2c68e53bced28db98af6e..ca672f1d140de9792c049de6a6b28d7122c93de3 100644 (file)
@@ -3,10 +3,13 @@
  * Copyright (c) 2015 MediaTek Inc.
  */
 
-#include <drm/drmP.h>
-#include <drm/drm_gem.h>
 #include <linux/dma-buf.h>
 
+#include <drm/drm.h>
+#include <drm/drm_device.h>
+#include <drm/drm_gem.h>
+#include <drm/drm_prime.h>
+
 #include "mtk_drm_drv.h"
 #include "mtk_drm_gem.h"
 
index f2ef83aed6f91e7a8fcfdfaf441c570aa726d822..584a9ecadce624f1ef0775e7b3ac7dc63f5b1842 100644 (file)
@@ -4,10 +4,11 @@
  * Author: CK Hu <ck.hu@mediatek.com>
  */
 
-#include <drm/drmP.h>
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_plane_helper.h>
+#include <drm/drm_gem_framebuffer_helper.h>
 
 #include "mtk_drm_crtc.h"
 #include "mtk_drm_ddp_comp.h"
@@ -146,6 +147,7 @@ static void mtk_plane_atomic_disable(struct drm_plane *plane,
 }
 
 static const struct drm_plane_helper_funcs mtk_plane_helper_funcs = {
+       .prepare_fb = drm_gem_fb_prepare_fb,
        .atomic_check = mtk_plane_atomic_check,
        .atomic_update = mtk_plane_atomic_update,
        .atomic_disable = mtk_plane_atomic_disable,
index b91c4616644a9a793ed6ff566960bb1b777d132c..224afb666881c496e11343c8c9264917d3291154 100644 (file)
@@ -3,12 +3,6 @@
  * Copyright (c) 2015 MediaTek Inc.
  */
 
-#include <drm/drmP.h>
-#include <drm/drm_atomic_helper.h>
-#include <drm/drm_mipi_dsi.h>
-#include <drm/drm_panel.h>
-#include <drm/drm_of.h>
-#include <drm/drm_probe_helper.h>
 #include <linux/clk.h>
 #include <linux/component.h>
 #include <linux/iopoll.h>
 #include <linux/of_platform.h>
 #include <linux/phy/phy.h>
 #include <linux/platform_device.h>
+
 #include <video/mipi_display.h>
 #include <video/videomode.h>
 
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_mipi_dsi.h>
+#include <drm/drm_of.h>
+#include <drm/drm_panel.h>
+#include <drm/drm_print.h>
+#include <drm/drm_probe_helper.h>
+
 #include "mtk_drm_ddp_comp.h"
 
 #define DSI_START              0x00
index 5d6a9f094df54df9e82ecaf578bc6d3e610ef428..ce91b61364eb6a86b70f2646721681d78c7391f5 100644 (file)
@@ -3,11 +3,7 @@
  * Copyright (c) 2014 MediaTek Inc.
  * Author: Jie Qiu <jie.qiu@mediatek.com>
  */
-#include <drm/drmP.h>
-#include <drm/drm_atomic_helper.h>
-#include <drm/drm_crtc.h>
-#include <drm/drm_probe_helper.h>
-#include <drm/drm_edid.h>
+
 #include <linux/arm-smccc.h>
 #include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/phy/phy.h>
 #include <linux/platform_device.h>
 #include <linux/regmap.h>
+
 #include <sound/hdmi-codec.h>
+
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_crtc.h>
+#include <drm/drm_edid.h>
+#include <drm/drm_print.h>
+#include <drm/drm_probe_helper.h>
+
 #include "mtk_cec.h"
 #include "mtk_hdmi.h"
 #include "mtk_hdmi_regs.h"
index aa8ea107524e65d9346777017280afd22d28e0f7..3320a74e67fa437497d2e6fa7bc010ae3b99e421 100644 (file)
@@ -9,23 +9,21 @@
  *     Jasper St. Pierre <jstpierre@mecheye.net>
  */
 
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/mutex.h>
-#include <linux/platform_device.h>
 #include <linux/bitfield.h>
-#include <drm/drmP.h>
-#include <drm/drm_atomic.h>
+#include <linux/soc/amlogic/meson-canvas.h>
+
 #include <drm/drm_atomic_helper.h>
-#include <drm/drm_flip_work.h>
+#include <drm/drm_device.h>
+#include <drm/drm_print.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
 
 #include "meson_crtc.h"
 #include "meson_plane.h"
+#include "meson_registers.h"
 #include "meson_venc.h"
-#include "meson_vpp.h"
 #include "meson_viu.h"
-#include "meson_registers.h"
+#include "meson_vpp.h"
 
 #define MESON_G12A_VIU_OFFSET  0x5ec0
 
index 2310c96fff46a37d574cf44540df88521b39c0bb..42af49afdd755c82c9ecfe3a39ca87284322675d 100644 (file)
@@ -8,35 +8,30 @@
  *     Jasper St. Pierre <jstpierre@mecheye.net>
  */
 
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/mutex.h>
-#include <linux/platform_device.h>
 #include <linux/component.h>
+#include <linux/module.h>
 #include <linux/of_graph.h>
+#include <linux/platform_device.h>
+#include <linux/soc/amlogic/meson-canvas.h>
 
-#include <drm/drmP.h>
-#include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
-#include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_fb_helper.h>
-#include <drm/drm_flip_work.h>
 #include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
-#include <drm/drm_plane_helper.h>
+#include <drm/drm_irq.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_probe_helper.h>
-#include <drm/drm_rect.h>
+#include <drm/drm_vblank.h>
 
+#include "meson_crtc.h"
 #include "meson_drv.h"
-#include "meson_plane.h"
 #include "meson_overlay.h"
-#include "meson_crtc.h"
+#include "meson_plane.h"
+#include "meson_registers.h"
 #include "meson_venc_cvbs.h"
-
-#include "meson_vpp.h"
 #include "meson_viu.h"
-#include "meson_venc.h"
-#include "meson_registers.h"
+#include "meson_vpp.h"
 
 #define DRIVER_NAME "meson"
 #define DRIVER_DESC "Amlogic Meson DRM driver"
@@ -93,9 +88,7 @@ static int meson_dumb_create(struct drm_file *file, struct drm_device *dev,
 DEFINE_DRM_GEM_CMA_FOPS(fops);
 
 static struct drm_driver meson_driver = {
-       .driver_features        = DRIVER_GEM |
-                                 DRIVER_MODESET | DRIVER_PRIME |
-                                 DRIVER_ATOMIC,
+       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 
        /* IRQ */
        .irq_handler            = meson_irq,
@@ -103,8 +96,6 @@ static struct drm_driver meson_driver = {
        /* PRIME Ops */
        .prime_handle_to_fd     = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle     = drm_gem_prime_fd_to_handle,
-       .gem_prime_import       = drm_gem_prime_import,
-       .gem_prime_export       = drm_gem_prime_export,
        .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
        .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
        .gem_prime_vmap         = drm_gem_cma_prime_vmap,
index 7b6593f33dfe4ba0798f7d95dca3657a5a94e540..c9aaec1a846e7bc0aa59db33954ac52ed429ee21 100644 (file)
@@ -7,11 +7,14 @@
 #ifndef __MESON_DRV_H
 #define __MESON_DRV_H
 
-#include <linux/platform_device.h>
-#include <linux/regmap.h>
+#include <linux/device.h>
 #include <linux/of.h>
-#include <linux/soc/amlogic/meson-canvas.h>
-#include <drm/drmP.h>
+#include <linux/regmap.h>
+
+struct drm_crtc;
+struct drm_device;
+struct drm_plane;
+struct meson_drm;
 
 struct meson_drm {
        struct device *dev;
index df3f9ddd223495dc2a540a3c426df05d2c63d5fe..9f0b08eaf00323b224dd0b70c0748e173c009ae8 100644 (file)
@@ -5,29 +5,30 @@
  * Copyright (C) 2015 Amlogic, Inc. All rights reserved.
  */
 
+#include <linux/clk.h>
+#include <linux/component.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
-#include <linux/component.h>
 #include <linux/of_device.h>
 #include <linux/of_graph.h>
-#include <linux/reset.h>
-#include <linux/clk.h>
 #include <linux/regulator/consumer.h>
+#include <linux/reset.h>
 
-#include <drm/drmP.h>
+#include <drm/bridge/dw_hdmi.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_device.h>
 #include <drm/drm_edid.h>
 #include <drm/drm_probe_helper.h>
-#include <drm/bridge/dw_hdmi.h>
+#include <drm/drm_print.h>
 
-#include <uapi/linux/media-bus-format.h>
-#include <uapi/linux/videodev2.h>
+#include <linux/media-bus-format.h>
+#include <linux/videodev2.h>
 
 #include "meson_drv.h"
-#include "meson_venc.h"
-#include "meson_vclk.h"
 #include "meson_dw_hdmi.h"
 #include "meson_registers.h"
+#include "meson_vclk.h"
+#include "meson_venc.h"
 
 #define DRIVER_NAME "meson-dw-hdmi"
 #define DRIVER_DESC "Amlogic Meson HDMI-TX DRM driver"
index cc7c6ae3013d736ea67b519324264d59e2de41c9..5aa9dcb4b35ef83423c6c20da9f7b247c75ee41c 100644 (file)
@@ -5,24 +5,21 @@
  * Copyright (C) 2015 Amlogic, Inc. All rights reserved.
  */
 
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/mutex.h>
 #include <linux/bitfield.h>
-#include <linux/platform_device.h>
-#include <drm/drmP.h>
+
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_device.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
-#include <drm/drm_rect.h>
 
 #include "meson_overlay.h"
-#include "meson_vpp.h"
-#include "meson_viu.h"
 #include "meson_registers.h"
+#include "meson_viu.h"
+#include "meson_vpp.h"
 
 /* VD1_IF0_GEN_REG */
 #define VD_URGENT_CHROMA               BIT(28)
index 7a7e88dadd0bc10412cb84aac95f6e1b9a47e417..80b8d70c4d75f336ef0ea9af8d83aff83b01e17d 100644 (file)
@@ -9,24 +9,20 @@
  *     Jasper St. Pierre <jstpierre@mecheye.net>
  */
 
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/mutex.h>
 #include <linux/bitfield.h>
-#include <linux/platform_device.h>
-#include <drm/drmP.h>
+
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
-#include <drm/drm_plane_helper.h>
-#include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_device.h>
 #include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
-#include <drm/drm_rect.h>
+#include <drm/drm_plane_helper.h>
 
 #include "meson_plane.h"
-#include "meson_vpp.h"
-#include "meson_viu.h"
 #include "meson_registers.h"
+#include "meson_viu.h"
 
 /* OSD_SCI_WH_M1 */
 #define SCI_WH_M1_W(w)                 FIELD_PREP(GENMASK(28, 16), w)
index 410e324d6f939878dfdb8a092e77b7d69caf6cf0..057453ce027c622b2e54bee6f064b8785041f113 100644 (file)
@@ -6,6 +6,8 @@
 #ifndef __MESON_REGISTERS_H
 #define __MESON_REGISTERS_H
 
+#include <linux/io.h>
+
 /* Shift all registers by 2 */
 #define _REG(reg)      ((reg) << 2)
 
index 26732f038d19f7838ee24dabd21b00d9dec7068e..8abff51f937d8a40195396baf4915ee56b53ae3b 100644 (file)
@@ -5,9 +5,10 @@
  * Copyright (C) 2015 Amlogic, Inc. All rights reserved.
  */
 
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <drm/drmP.h>
+#include <linux/export.h>
+
+#include <drm/drm_print.h>
+
 #include "meson_drv.h"
 #include "meson_vclk.h"
 
index ed993d20abda6ce0c31abbbf42254edccd9fedd4..b62125540aeffa300c0ce338c2075db6fe12d836 100644 (file)
@@ -9,6 +9,10 @@
 #ifndef __MESON_VCLK_H
 #define __MESON_VCLK_H
 
+#include <drm/drm_modes.h>
+
+struct meson_drm;
+
 enum {
        MESON_VCLK_TARGET_CVBS = 0,
        MESON_VCLK_TARGET_HDMI = 1,
index 7b7a0d8d737c5e8c0e62e29e7048f15590ee9e62..3d4791798ae0915ebf8e0ba2f3985a5f68193997 100644 (file)
@@ -5,14 +5,14 @@
  * Copyright (C) 2015 Amlogic, Inc. All rights reserved.
  */
 
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <drm/drmP.h>
+#include <linux/export.h>
+
+#include <drm/drm_modes.h>
+
 #include "meson_drv.h"
+#include "meson_registers.h"
 #include "meson_venc.h"
 #include "meson_vpp.h"
-#include "meson_vclk.h"
-#include "meson_registers.h"
 
 /**
  * DOC: Video Encoder
index 985642a1678e5d0ef1c767fa75817647ad32568d..576768bdd08d4ee8f28c465bb3ee08c0de3e24ae 100644 (file)
@@ -14,6 +14,8 @@
 #ifndef __MESON_VENC_H
 #define __MESON_VENC_H
 
+struct drm_display_mode;
+
 enum {
        MESON_VENC_MODE_NONE = 0,
        MESON_VENC_MODE_CVBS_PAL,
index 6313a519f257ac8dd41d9eab0c4798ee761138ec..45a467f10b9b24b37c9de91d046bcefe342aae99 100644 (file)
@@ -9,19 +9,18 @@
  *     Jasper St. Pierre <jstpierre@mecheye.net>
  */
 
-#include <linux/kernel.h>
-#include <linux/module.h>
+#include <linux/export.h>
 #include <linux/of_graph.h>
 
-#include <drm/drmP.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_device.h>
 #include <drm/drm_edid.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_print.h>
 
-#include "meson_venc_cvbs.h"
-#include "meson_venc.h"
-#include "meson_vclk.h"
 #include "meson_registers.h"
+#include "meson_vclk.h"
+#include "meson_venc_cvbs.h"
 
 /* HHI VDAC Registers */
 #define HHI_VDAC_CNTL0         0x2F4 /* 0xbd offset in data sheet */
index 4b2b3024d37146e2e39f88051a57624a556ea098..9f8a450d50d5d0f896a99c0119b0e79160aa885c 100644 (file)
@@ -6,13 +6,10 @@
  * Copyright (C) 2014 Endless Mobile
  */
 
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <drm/drmP.h>
+#include <linux/export.h>
+
 #include "meson_drv.h"
 #include "meson_viu.h"
-#include "meson_vpp.h"
-#include "meson_venc.h"
 #include "meson_registers.h"
 
 /**
index bfee30fa6e341d4ae2ff5e975653f9264d0a0469..cbe6cf46e541d8777c8be80153c829eccfcffe3f 100644 (file)
@@ -6,12 +6,11 @@
  * Copyright (C) 2014 Endless Mobile
  */
 
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <drm/drmP.h>
+#include <linux/export.h>
+
 #include "meson_drv.h"
-#include "meson_vpp.h"
 #include "meson_registers.h"
+#include "meson_vpp.h"
 
 /**
  * DOC: Video Post Processing
index 9fc82db8a12d656d29b36219ab020195f513f3c1..afc9553ed8d38f38d92ebadd11ad7d89555aa8b4 100644 (file)
@@ -9,6 +9,9 @@
 #ifndef __MESON_VPP_H
 #define __MESON_VPP_H
 
+struct drm_rect;
+struct meson_drm;
+
 /* Mux VIU/VPP to ENCI */
 #define MESON_VIU_VPP_MUX_ENCI 0x5
 /* Mux VIU/VPP to ENCP */
index 1ffdafea27e4c3a1fbb796c334caea17e59ae89d..85c74364ce24c0edb21dc88ad66fa518c45bbc11 100644 (file)
@@ -35,8 +35,8 @@
  * \author Gareth Hughes <gareth@valinux.com>
  */
 
-#include <drm/drmP.h>
-#include <drm/mga_drm.h>
+#include <linux/delay.h>
+
 #include "mga_drv.h"
 
 #define MGA_DEFAULT_USEC_TIMEOUT       10000
@@ -62,7 +62,7 @@ int mga_do_wait_for_idle(drm_mga_private_t *dev_priv)
                        MGA_WRITE8(MGA_CRTC_INDEX, 0);
                        return 0;
                }
-               DRM_UDELAY(1);
+               udelay(1);
        }
 
 #if MGA_DMA_DEBUG
@@ -114,7 +114,7 @@ void mga_do_dma_flush(drm_mga_private_t *dev_priv)
                status = MGA_READ(MGA_STATUS) & MGA_ENGINE_IDLE_MASK;
                if (status == MGA_ENDPRDMASTS)
                        break;
-               DRM_UDELAY(1);
+               udelay(1);
        }
 
        if (primary->tail == primary->last_flush) {
@@ -1120,7 +1120,7 @@ int mga_dma_buffers(struct drm_device *dev, void *data,
         */
        if (d->send_count != 0) {
                DRM_ERROR("Process %d trying to send %d buffers via drmDMA\n",
-                         DRM_CURRENTPID, d->send_count);
+                         task_pid_nr(current), d->send_count);
                return -EINVAL;
        }
 
@@ -1128,7 +1128,8 @@ int mga_dma_buffers(struct drm_device *dev, void *data,
         */
        if (d->request_count < 0 || d->request_count > dma->buf_count) {
                DRM_ERROR("Process %d trying to get %d buffers (of %d max)\n",
-                         DRM_CURRENTPID, d->request_count, dma->buf_count);
+                         task_pid_nr(current), d->request_count,
+                         dma->buf_count);
                return -EINVAL;
        }
 
index 6e1d1054ad0637bdbcd94f0c7e2d08ed63d4790f..71128e6f6ae9425569a15ad6a604de86507af91f 100644 (file)
 
 #include <linux/module.h>
 
-#include <drm/drmP.h>
-#include <drm/mga_drm.h>
-#include "mga_drv.h"
-
+#include <drm/drm_drv.h>
 #include <drm/drm_pciids.h>
 
+#include "mga_drv.h"
+
 static struct pci_device_id pciidlist[] = {
        mga_PCI_IDS
 };
index a45bb22275a7bfaf2a3f9641a7316ed1b5748aba..d5deecb93975304ea5c160c07d460344a08156cd 100644 (file)
 #ifndef __MGA_DRV_H__
 #define __MGA_DRV_H__
 
+#include <linux/irqreturn.h>
+#include <linux/slab.h>
+
+#include <drm/drm_agpsupport.h>
+#include <drm/drm_device.h>
+#include <drm/drm_file.h>
+#include <drm/drm_ioctl.h>
+#include <drm/drm_irq.h>
 #include <drm/drm_legacy.h>
+#include <drm/drm_pci.h>
+#include <drm/drm_print.h>
+#include <drm/drm_sarea.h>
+#include <drm/drm_vblank.h>
+#include <drm/mga_drm.h>
 
 /* General customization:
  */
@@ -188,7 +201,7 @@ extern int mga_warp_init(drm_mga_private_t *dev_priv);
 extern int mga_enable_vblank(struct drm_device *dev, unsigned int pipe);
 extern void mga_disable_vblank(struct drm_device *dev, unsigned int pipe);
 extern u32 mga_get_vblank_counter(struct drm_device *dev, unsigned int pipe);
-extern int mga_driver_fence_wait(struct drm_device *dev, unsigned int *sequence);
+extern void mga_driver_fence_wait(struct drm_device *dev, unsigned int *sequence);
 extern int mga_driver_vblank_wait(struct drm_device *dev, unsigned int *sequence);
 extern irqreturn_t mga_driver_irq_handler(int irq, void *arg);
 extern void mga_driver_irq_preinstall(struct drm_device *dev);
@@ -199,10 +212,14 @@ extern long mga_compat_ioctl(struct file *filp, unsigned int cmd,
 
 #define mga_flush_write_combine()      wmb()
 
-#define MGA_READ8(reg)         DRM_READ8(dev_priv->mmio, (reg))
-#define MGA_READ(reg)          DRM_READ32(dev_priv->mmio, (reg))
-#define MGA_WRITE8(reg, val)   DRM_WRITE8(dev_priv->mmio, (reg), (val))
-#define MGA_WRITE(reg, val)    DRM_WRITE32(dev_priv->mmio, (reg), (val))
+#define MGA_READ8(reg) \
+       readb(((void __iomem *)dev_priv->mmio->handle) + (reg))
+#define MGA_READ(reg) \
+       readl(((void __iomem *)dev_priv->mmio->handle) + (reg))
+#define MGA_WRITE8(reg, val) \
+       writeb(val, ((void __iomem *)dev_priv->mmio->handle) + (reg))
+#define MGA_WRITE(reg, val) \
+       writel(val, ((void __iomem *)dev_priv->mmio->handle) + (reg))
 
 #define DWGREG0                0x1c00
 #define DWGREG0_END    0x1dff
index 245fb2e359cfd29e52a26b4ddd96da486ecaacca..6ccd270789c6b9ebde599a812116cf4be6bddef1 100644 (file)
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
+
 #include <linux/compat.h>
 
-#include <drm/drmP.h>
-#include <drm/mga_drm.h>
 #include "mga_drv.h"
 
 typedef struct drm32_mga_init {
index 693ba708cfed8c8389d4149a8717377b97216b7f..a7e6ffc80a788db7850ea484701233b8dae64952 100644 (file)
@@ -31,8 +31,6 @@
  *    Eric Anholt <anholt@FreeBSD.org>
  */
 
-#include <drm/drmP.h>
-#include <drm/mga_drm.h>
 #include "mga_drv.h"
 
 u32 mga_get_vblank_counter(struct drm_device *dev, unsigned int pipe)
@@ -118,23 +116,21 @@ void mga_disable_vblank(struct drm_device *dev, unsigned int pipe)
        /* MGA_WRITE(MGA_IEN, MGA_VLINEIEN | MGA_SOFTRAPEN); */
 }
 
-int mga_driver_fence_wait(struct drm_device *dev, unsigned int *sequence)
+void mga_driver_fence_wait(struct drm_device *dev, unsigned int *sequence)
 {
        drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private;
        unsigned int cur_fence;
-       int ret = 0;
 
        /* Assume that the user has missed the current sequence number
         * by about a day rather than she wants to wait for years
         * using fences.
         */
-       DRM_WAIT_ON(ret, dev_priv->fence_queue, 3 * HZ,
+       wait_event_timeout(dev_priv->fence_queue,
                    (((cur_fence = atomic_read(&dev_priv->last_fence_retired))
-                     - *sequence) <= (1 << 23)));
+                     - *sequence) <= (1 << 23)),
+                   msecs_to_jiffies(3000));
 
        *sequence = cur_fence;
-
-       return ret;
 }
 
 void mga_driver_irq_preinstall(struct drm_device *dev)
index e5f6b735f575c702d7fdbe0cedebe96a490301e9..77a0b006f06691bded0101052865410821b98d8e 100644 (file)
@@ -32,8 +32,6 @@
  *    Gareth Hughes <gareth@valinux.com>
  */
 
-#include <drm/drmP.h>
-#include <drm/mga_drm.h>
 #include "mga_drv.h"
 
 /* ================================================================
@@ -1016,7 +1014,7 @@ int mga_getparam(struct drm_device *dev, void *data, struct drm_file *file_priv)
                return -EINVAL;
        }
 
-       DRM_DEBUG("pid=%d\n", DRM_CURRENTPID);
+       DRM_DEBUG("pid=%d\n", task_pid_nr(current));
 
        switch (param->param) {
        case MGA_PARAM_IRQ_NR:
@@ -1048,7 +1046,7 @@ static int mga_set_fence(struct drm_device *dev, void *data, struct drm_file *fi
                return -EINVAL;
        }
 
-       DRM_DEBUG("pid=%d\n", DRM_CURRENTPID);
+       DRM_DEBUG("pid=%d\n", task_pid_nr(current));
 
        /* I would normal do this assignment in the declaration of fence,
         * but dev_priv may be NULL.
@@ -1077,7 +1075,7 @@ file_priv)
                return -EINVAL;
        }
 
-       DRM_DEBUG("pid=%d\n", DRM_CURRENTPID);
+       DRM_DEBUG("pid=%d\n", task_pid_nr(current));
 
        mga_driver_fence_wait(dev, fence);
        return 0;
index 0b76352260a9fbef3c7a4115299ca130a86b22e1..b5ef1d2c8b1c1044df0f2893330f84125b049787 100644 (file)
 
 #include <linux/firmware.h>
 #include <linux/ihex.h>
-#include <linux/platform_device.h>
 #include <linux/module.h>
+#include <linux/platform_device.h>
 
-#include <drm/drmP.h>
-#include <drm/mga_drm.h>
 #include "mga_drv.h"
 
 #define FIRMWARE_G200 "matrox/g200_warp.fw"
index 98d204408bd0b4b0ff30139811348a5d00826922..04b281bcf655807c5a75e0734e0813d2b14ee8b4 100644 (file)
@@ -1,5 +1,5 @@
 # SPDX-License-Identifier: GPL-2.0-only
 mgag200-y   := mgag200_main.o mgag200_mode.o mgag200_cursor.o \
-       mgag200_drv.o mgag200_fb.o mgag200_i2c.o mgag200_ttm.o
+       mgag200_drv.o mgag200_i2c.o mgag200_ttm.o
 
 obj-$(CONFIG_DRM_MGAG200) += mgag200.o
index f0c61a92351c6277df1ab702e3bd6a84a0719b72..13f32df7e357694ff9dbbb08341dc7ec9927a159 100644 (file)
@@ -5,7 +5,8 @@
  * Author: Christopher Harvey <charvey@matrox.com>
  */
 
-#include <drm/drmP.h>
+#include <drm/drm_pci.h>
+
 #include "mgag200_drv.h"
 
 static bool warn_transparent = true;
@@ -99,10 +100,11 @@ int mga_crtc_cursor_set(struct drm_crtc *crtc,
 
        /* Pin and map up-coming buffer to write colour indices */
        ret = drm_gem_vram_pin(pixels_next, 0);
-       if (ret)
+       if (ret) {
                dev_err(&dev->pdev->dev,
                        "failed to pin cursor buffer: %d\n", ret);
                goto err_drm_gem_vram_kunmap_src;
+       }
        dst = drm_gem_vram_kmap(pixels_next, true, NULL);
        if (IS_ERR(dst)) {
                ret = PTR_ERR(dst);
index aafa1cb31f5061e80586d414ca4156f3f730e7c6..afd9119b6cf1bed4a8b143387f160ddfa0078215 100644 (file)
@@ -5,14 +5,18 @@
  * Authors: Matthew Garrett
  *          Dave Airlie
  */
+
 #include <linux/module.h>
 #include <linux/console.h>
-#include <drm/drmP.h>
-
-#include "mgag200_drv.h"
 
+#include <drm/drm_drv.h>
+#include <drm/drm_file.h>
+#include <drm/drm_ioctl.h>
+#include <drm/drm_pci.h>
 #include <drm/drm_pciids.h>
 
+#include "mgag200_drv.h"
+
 /*
  * This is the generic driver code. This binds the driver to the drm core,
  * which then performs further device association and calls our graphics init
index c47671ce6c485c45075522f34845ae4c139a177a..1c93f8dc08c7720512cdfe5b137d9d185a764463 100644 (file)
 #ifndef __MGAG200_DRV_H__
 #define __MGAG200_DRV_H__
 
+#include <linux/i2c-algo-bit.h>
+#include <linux/i2c.h>
+
 #include <video/vga.h>
 
 #include <drm/drm_encoder.h>
 #include <drm/drm_fb_helper.h>
-
 #include <drm/drm_gem.h>
 #include <drm/drm_gem_vram_helper.h>
-
 #include <drm/drm_vram_mm_helper.h>
 
-#include <linux/i2c.h>
-#include <linux/i2c-algo-bit.h>
-
 #include "mgag200_reg.h"
 
 #define DRIVER_AUTHOR          "Matthew Garrett"
 #define to_mga_crtc(x) container_of(x, struct mga_crtc, base)
 #define to_mga_encoder(x) container_of(x, struct mga_encoder, base)
 #define to_mga_connector(x) container_of(x, struct mga_connector, base)
-#define to_mga_framebuffer(x) container_of(x, struct mga_framebuffer, base)
-
-struct mga_framebuffer {
-       struct drm_framebuffer base;
-       struct drm_gem_object *obj;
-};
-
-struct mga_fbdev {
-       struct drm_fb_helper helper; /* must be first */
-       struct mga_framebuffer mfb;
-       void *sysram;
-       int size;
-       int x1, y1, x2, y2; /* dirty rect */
-       spinlock_t dirty_lock;
-};
 
 struct mga_crtc {
        struct drm_crtc base;
@@ -189,7 +172,6 @@ struct mga_device {
        struct mga_mc                   mc;
        struct mga_mode_info            mode_info;
 
-       struct mga_fbdev *mfbdev;
        struct mga_cursor cursor;
 
        bool                            suspended;
@@ -210,25 +192,9 @@ struct mga_device {
 int mgag200_modeset_init(struct mga_device *mdev);
 void mgag200_modeset_fini(struct mga_device *mdev);
 
-                               /* mgag200_fb.c */
-int mgag200_fbdev_init(struct mga_device *mdev);
-void mgag200_fbdev_fini(struct mga_device *mdev);
-
                                /* mgag200_main.c */
-int mgag200_framebuffer_init(struct drm_device *dev,
-                            struct mga_framebuffer *mfb,
-                            const struct drm_mode_fb_cmd2 *mode_cmd,
-                            struct drm_gem_object *obj);
-
-
 int mgag200_driver_load(struct drm_device *dev, unsigned long flags);
 void mgag200_driver_unload(struct drm_device *dev);
-int mgag200_gem_create(struct drm_device *dev,
-                  u32 size, bool iskernel,
-                      struct drm_gem_object **obj);
-int mgag200_dumb_create(struct drm_file *file,
-                       struct drm_device *dev,
-                       struct drm_mode_create_dumb *args);
 
                                /* mgag200_i2c.c */
 struct mga_i2c_chan *mgag200_i2c_create(struct drm_device *dev);
diff --git a/drivers/gpu/drm/mgag200/mgag200_fb.c b/drivers/gpu/drm/mgag200/mgag200_fb.c
deleted file mode 100644 (file)
index 8adb332..0000000
+++ /dev/null
@@ -1,315 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Copyright 2010 Matt Turner.
- * Copyright 2012 Red Hat
- *
- * Authors: Matthew Garrett
- *          Matt Turner
- *          Dave Airlie
- */
-#include <linux/module.h>
-#include <drm/drmP.h>
-#include <drm/drm_util.h>
-#include <drm/drm_fb_helper.h>
-#include <drm/drm_crtc_helper.h>
-
-#include "mgag200_drv.h"
-
-static void mga_dirty_update(struct mga_fbdev *mfbdev,
-                            int x, int y, int width, int height)
-{
-       int i;
-       struct drm_gem_object *obj;
-       struct drm_gem_vram_object *gbo;
-       int src_offset, dst_offset;
-       int bpp = mfbdev->mfb.base.format->cpp[0];
-       int ret;
-       u8 *dst;
-       bool unmap = false;
-       bool store_for_later = false;
-       int x2, y2;
-       unsigned long flags;
-
-       obj = mfbdev->mfb.obj;
-       gbo = drm_gem_vram_of_gem(obj);
-
-       if (drm_can_sleep()) {
-               /* We pin the BO so it won't be moved during the
-                * update. The actual location, video RAM or system
-                * memory, is not important.
-                */
-               ret = drm_gem_vram_pin(gbo, 0);
-               if (ret) {
-                       if (ret != -EBUSY)
-                               return;
-                       store_for_later = true;
-               }
-       } else {
-               store_for_later = true;
-       }
-
-       x2 = x + width - 1;
-       y2 = y + height - 1;
-       spin_lock_irqsave(&mfbdev->dirty_lock, flags);
-
-       if (mfbdev->y1 < y)
-               y = mfbdev->y1;
-       if (mfbdev->y2 > y2)
-               y2 = mfbdev->y2;
-       if (mfbdev->x1 < x)
-               x = mfbdev->x1;
-       if (mfbdev->x2 > x2)
-               x2 = mfbdev->x2;
-
-       if (store_for_later) {
-               mfbdev->x1 = x;
-               mfbdev->x2 = x2;
-               mfbdev->y1 = y;
-               mfbdev->y2 = y2;
-               spin_unlock_irqrestore(&mfbdev->dirty_lock, flags);
-               return;
-       }
-
-       mfbdev->x1 = mfbdev->y1 = INT_MAX;
-       mfbdev->x2 = mfbdev->y2 = 0;
-       spin_unlock_irqrestore(&mfbdev->dirty_lock, flags);
-
-       dst = drm_gem_vram_kmap(gbo, false, NULL);
-       if (IS_ERR(dst)) {
-               DRM_ERROR("failed to kmap fb updates\n");
-               goto out;
-       } else if (!dst) {
-               dst = drm_gem_vram_kmap(gbo, true, NULL);
-               if (IS_ERR(dst)) {
-                       DRM_ERROR("failed to kmap fb updates\n");
-                       goto out;
-               }
-               unmap = true;
-       }
-
-       for (i = y; i <= y2; i++) {
-               /* assume equal stride for now */
-               src_offset = dst_offset =
-                       i * mfbdev->mfb.base.pitches[0] + (x * bpp);
-               memcpy_toio(dst + dst_offset, mfbdev->sysram + src_offset,
-                           (x2 - x + 1) * bpp);
-       }
-
-       if (unmap)
-               drm_gem_vram_kunmap(gbo);
-
-out:
-       drm_gem_vram_unpin(gbo);
-}
-
-static void mga_fillrect(struct fb_info *info,
-                        const struct fb_fillrect *rect)
-{
-       struct mga_fbdev *mfbdev = info->par;
-       drm_fb_helper_sys_fillrect(info, rect);
-       mga_dirty_update(mfbdev, rect->dx, rect->dy, rect->width,
-                        rect->height);
-}
-
-static void mga_copyarea(struct fb_info *info,
-                        const struct fb_copyarea *area)
-{
-       struct mga_fbdev *mfbdev = info->par;
-       drm_fb_helper_sys_copyarea(info, area);
-       mga_dirty_update(mfbdev, area->dx, area->dy, area->width,
-                        area->height);
-}
-
-static void mga_imageblit(struct fb_info *info,
-                         const struct fb_image *image)
-{
-       struct mga_fbdev *mfbdev = info->par;
-       drm_fb_helper_sys_imageblit(info, image);
-       mga_dirty_update(mfbdev, image->dx, image->dy, image->width,
-                        image->height);
-}
-
-
-static struct fb_ops mgag200fb_ops = {
-       .owner = THIS_MODULE,
-       .fb_check_var = drm_fb_helper_check_var,
-       .fb_set_par = drm_fb_helper_set_par,
-       .fb_fillrect = mga_fillrect,
-       .fb_copyarea = mga_copyarea,
-       .fb_imageblit = mga_imageblit,
-       .fb_pan_display = drm_fb_helper_pan_display,
-       .fb_blank = drm_fb_helper_blank,
-       .fb_setcmap = drm_fb_helper_setcmap,
-};
-
-static int mgag200fb_create_object(struct mga_fbdev *afbdev,
-                                  const struct drm_mode_fb_cmd2 *mode_cmd,
-                                  struct drm_gem_object **gobj_p)
-{
-       struct drm_device *dev = afbdev->helper.dev;
-       u32 size;
-       struct drm_gem_object *gobj;
-       int ret = 0;
-
-       size = mode_cmd->pitches[0] * mode_cmd->height;
-       ret = mgag200_gem_create(dev, size, true, &gobj);
-       if (ret)
-               return ret;
-
-       *gobj_p = gobj;
-       return ret;
-}
-
-static int mgag200fb_create(struct drm_fb_helper *helper,
-                          struct drm_fb_helper_surface_size *sizes)
-{
-       struct mga_fbdev *mfbdev =
-               container_of(helper, struct mga_fbdev, helper);
-       struct drm_device *dev = mfbdev->helper.dev;
-       struct drm_mode_fb_cmd2 mode_cmd;
-       struct mga_device *mdev = dev->dev_private;
-       struct fb_info *info;
-       struct drm_framebuffer *fb;
-       struct drm_gem_object *gobj = NULL;
-       int ret;
-       void *sysram;
-       int size;
-
-       mode_cmd.width = sizes->surface_width;
-       mode_cmd.height = sizes->surface_height;
-       mode_cmd.pitches[0] = mode_cmd.width * ((sizes->surface_bpp + 7) / 8);
-
-       mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp,
-                                                         sizes->surface_depth);
-       size = mode_cmd.pitches[0] * mode_cmd.height;
-
-       ret = mgag200fb_create_object(mfbdev, &mode_cmd, &gobj);
-       if (ret) {
-               DRM_ERROR("failed to create fbcon backing object %d\n", ret);
-               return ret;
-       }
-
-       sysram = vmalloc(size);
-       if (!sysram) {
-               ret = -ENOMEM;
-               goto err_sysram;
-       }
-
-       info = drm_fb_helper_alloc_fbi(helper);
-       if (IS_ERR(info)) {
-               ret = PTR_ERR(info);
-               goto err_alloc_fbi;
-       }
-
-       ret = mgag200_framebuffer_init(dev, &mfbdev->mfb, &mode_cmd, gobj);
-       if (ret)
-               goto err_alloc_fbi;
-
-       mfbdev->sysram = sysram;
-       mfbdev->size = size;
-
-       fb = &mfbdev->mfb.base;
-
-       /* setup helper */
-       mfbdev->helper.fb = fb;
-
-       info->fbops = &mgag200fb_ops;
-
-       /* setup aperture base/size for vesafb takeover */
-       info->apertures->ranges[0].base = mdev->dev->mode_config.fb_base;
-       info->apertures->ranges[0].size = mdev->mc.vram_size;
-
-       drm_fb_helper_fill_info(info, &mfbdev->helper, sizes);
-
-       info->screen_base = sysram;
-       info->screen_size = size;
-       info->pixmap.flags = FB_PIXMAP_SYSTEM;
-
-       DRM_DEBUG_KMS("allocated %dx%d\n",
-                     fb->width, fb->height);
-
-       return 0;
-
-err_alloc_fbi:
-       vfree(sysram);
-err_sysram:
-       drm_gem_object_put_unlocked(gobj);
-
-       return ret;
-}
-
-static int mga_fbdev_destroy(struct drm_device *dev,
-                               struct mga_fbdev *mfbdev)
-{
-       struct mga_framebuffer *mfb = &mfbdev->mfb;
-
-       drm_fb_helper_unregister_fbi(&mfbdev->helper);
-
-       if (mfb->obj) {
-               drm_gem_object_put_unlocked(mfb->obj);
-               mfb->obj = NULL;
-       }
-       drm_fb_helper_fini(&mfbdev->helper);
-       vfree(mfbdev->sysram);
-       drm_framebuffer_unregister_private(&mfb->base);
-       drm_framebuffer_cleanup(&mfb->base);
-
-       return 0;
-}
-
-static const struct drm_fb_helper_funcs mga_fb_helper_funcs = {
-       .fb_probe = mgag200fb_create,
-};
-
-int mgag200_fbdev_init(struct mga_device *mdev)
-{
-       struct mga_fbdev *mfbdev;
-       int ret;
-       int bpp_sel = 32;
-
-       /* prefer 16bpp on low end gpus with limited VRAM */
-       if (IS_G200_SE(mdev) && mdev->mc.vram_size < (2048*1024))
-               bpp_sel = 16;
-
-       mfbdev = devm_kzalloc(mdev->dev->dev, sizeof(struct mga_fbdev), GFP_KERNEL);
-       if (!mfbdev)
-               return -ENOMEM;
-
-       mdev->mfbdev = mfbdev;
-       spin_lock_init(&mfbdev->dirty_lock);
-
-       drm_fb_helper_prepare(mdev->dev, &mfbdev->helper, &mga_fb_helper_funcs);
-
-       ret = drm_fb_helper_init(mdev->dev, &mfbdev->helper,
-                                MGAG200FB_CONN_LIMIT);
-       if (ret)
-               goto err_fb_helper;
-
-       ret = drm_fb_helper_single_add_all_connectors(&mfbdev->helper);
-       if (ret)
-               goto err_fb_setup;
-
-       /* disable all the possible outputs/crtcs before entering KMS mode */
-       drm_helper_disable_unused_functions(mdev->dev);
-
-       ret = drm_fb_helper_initial_config(&mfbdev->helper, bpp_sel);
-       if (ret)
-               goto err_fb_setup;
-
-       return 0;
-
-err_fb_setup:
-       drm_fb_helper_fini(&mfbdev->helper);
-err_fb_helper:
-       mdev->mfbdev = NULL;
-
-       return ret;
-}
-
-void mgag200_fbdev_fini(struct mga_device *mdev)
-{
-       if (!mdev->mfbdev)
-               return;
-
-       mga_fbdev_destroy(mdev->dev, mdev->mfbdev);
-}
index 77d1c4771786fc0ec18c02bd9351c9a89f4b17d8..51d4037f00d4a4b236fed2110ad6b1b2ee6a0ec7 100644 (file)
 /*
  * Authors: Dave Airlie <airlied@redhat.com>
  */
+
 #include <linux/export.h>
-#include <linux/i2c.h>
 #include <linux/i2c-algo-bit.h>
-#include <drm/drmP.h>
+#include <linux/i2c.h>
+
+#include <drm/drm_pci.h>
 
 #include "mgag200_drv.h"
 
index dd61ccc5af5c8edc17987521426ed18a5e19b479..a9773334dedf5497598257cf71d45d126ffde616 100644 (file)
@@ -7,70 +7,15 @@
  *          Matt Turner
  *          Dave Airlie
  */
-#include <drm/drmP.h>
-#include <drm/drm_crtc_helper.h>
-#include "mgag200_drv.h"
 
-static void mga_user_framebuffer_destroy(struct drm_framebuffer *fb)
-{
-       struct mga_framebuffer *mga_fb = to_mga_framebuffer(fb);
-
-       drm_gem_object_put_unlocked(mga_fb->obj);
-       drm_framebuffer_cleanup(fb);
-       kfree(fb);
-}
-
-static const struct drm_framebuffer_funcs mga_fb_funcs = {
-       .destroy = mga_user_framebuffer_destroy,
-};
-
-int mgag200_framebuffer_init(struct drm_device *dev,
-                            struct mga_framebuffer *gfb,
-                            const struct drm_mode_fb_cmd2 *mode_cmd,
-                            struct drm_gem_object *obj)
-{
-       int ret;
-
-       drm_helper_mode_fill_fb_struct(dev, &gfb->base, mode_cmd);
-       gfb->obj = obj;
-       ret = drm_framebuffer_init(dev, &gfb->base, &mga_fb_funcs);
-       if (ret) {
-               DRM_ERROR("drm_framebuffer_init failed: %d\n", ret);
-               return ret;
-       }
-       return 0;
-}
-
-static struct drm_framebuffer *
-mgag200_user_framebuffer_create(struct drm_device *dev,
-                               struct drm_file *filp,
-                               const struct drm_mode_fb_cmd2 *mode_cmd)
-{
-       struct drm_gem_object *obj;
-       struct mga_framebuffer *mga_fb;
-       int ret;
-
-       obj = drm_gem_object_lookup(filp, mode_cmd->handles[0]);
-       if (obj == NULL)
-               return ERR_PTR(-ENOENT);
-
-       mga_fb = kzalloc(sizeof(*mga_fb), GFP_KERNEL);
-       if (!mga_fb) {
-               drm_gem_object_put_unlocked(obj);
-               return ERR_PTR(-ENOMEM);
-       }
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_gem_framebuffer_helper.h>
+#include <drm/drm_pci.h>
 
-       ret = mgag200_framebuffer_init(dev, mga_fb, mode_cmd, obj);
-       if (ret) {
-               drm_gem_object_put_unlocked(obj);
-               kfree(mga_fb);
-               return ERR_PTR(ret);
-       }
-       return &mga_fb->base;
-}
+#include "mgag200_drv.h"
 
 static const struct drm_mode_config_funcs mga_mode_funcs = {
-       .fb_create = mgag200_user_framebuffer_create,
+       .fb_create = drm_gem_fb_create
 };
 
 static int mga_probe_vram(struct mga_device *mdev, void __iomem *mem)
@@ -217,7 +162,7 @@ int mgag200_driver_load(struct drm_device *dev, unsigned long flags)
        if (IS_G200_SE(mdev) && mdev->mc.vram_size < (2048*1024))
                dev->mode_config.preferred_depth = 16;
        else
-               dev->mode_config.preferred_depth = 24;
+               dev->mode_config.preferred_depth = 32;
        dev->mode_config.prefer_shadow = 1;
 
        r = mgag200_modeset_init(mdev);
@@ -241,6 +186,10 @@ int mgag200_driver_load(struct drm_device *dev, unsigned long flags)
        }
        mdev->cursor.pixels_current = NULL;
 
+       r = drm_fbdev_generic_setup(mdev->dev, 0);
+       if (r)
+               goto err_modeset;
+
        return 0;
 
 err_modeset:
@@ -259,32 +208,7 @@ void mgag200_driver_unload(struct drm_device *dev)
        if (mdev == NULL)
                return;
        mgag200_modeset_fini(mdev);
-       mgag200_fbdev_fini(mdev);
        drm_mode_config_cleanup(dev);
        mgag200_mm_fini(mdev);
        dev->dev_private = NULL;
 }
-
-int mgag200_gem_create(struct drm_device *dev,
-                  u32 size, bool iskernel,
-                  struct drm_gem_object **obj)
-{
-       struct drm_gem_vram_object *gbo;
-       int ret;
-
-       *obj = NULL;
-
-       size = roundup(size, PAGE_SIZE);
-       if (size == 0)
-               return -EINVAL;
-
-       gbo = drm_gem_vram_create(dev, &dev->vram_mm->bdev, size, 0, false);
-       if (IS_ERR(gbo)) {
-               ret = PTR_ERR(gbo);
-               if (ret != -ERESTARTSYS)
-                       DRM_ERROR("failed to allocate GEM object\n");
-               return ret;
-       }
-       *obj = &gbo->gem;
-       return 0;
-}
index a25054015e8c48acea12384c305c820f5d83d43c..822f2a13748fb350405c9d6b2651f3b6dee8d7db 100644 (file)
@@ -10,8 +10,9 @@
 
 #include <linux/delay.h>
 
-#include <drm/drmP.h>
 #include <drm/drm_crtc_helper.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_pci.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_probe_helper.h>
 
@@ -859,28 +860,16 @@ static int mga_crtc_do_set_base(struct drm_crtc *crtc,
                                struct drm_framebuffer *fb,
                                int x, int y, int atomic)
 {
-       struct mga_device *mdev = crtc->dev->dev_private;
-       struct drm_gem_object *obj;
-       struct mga_framebuffer *mga_fb;
        struct drm_gem_vram_object *gbo;
        int ret;
        s64 gpu_addr;
-       void *base;
 
        if (!atomic && fb) {
-               mga_fb = to_mga_framebuffer(fb);
-               obj = mga_fb->obj;
-               gbo = drm_gem_vram_of_gem(obj);
-
-               /* unmap if console */
-               if (&mdev->mfbdev->mfb == mga_fb)
-                       drm_gem_vram_kunmap(gbo);
+               gbo = drm_gem_vram_of_gem(fb->obj[0]);
                drm_gem_vram_unpin(gbo);
        }
 
-       mga_fb = to_mga_framebuffer(crtc->primary->fb);
-       obj = mga_fb->obj;
-       gbo = drm_gem_vram_of_gem(obj);
+       gbo = drm_gem_vram_of_gem(crtc->primary->fb->obj[0]);
 
        ret = drm_gem_vram_pin(gbo, DRM_GEM_VRAM_PL_FLAG_VRAM);
        if (ret)
@@ -891,15 +880,6 @@ static int mga_crtc_do_set_base(struct drm_crtc *crtc,
                goto err_drm_gem_vram_unpin;
        }
 
-       if (&mdev->mfbdev->mfb == mga_fb) {
-               /* if pushing console in kmap it */
-               base = drm_gem_vram_kmap(gbo, true, NULL);
-               if (IS_ERR(base)) {
-                       ret = PTR_ERR(base);
-                       DRM_ERROR("failed to kmap fbcon\n");
-               }
-       }
-
        mga_set_start_address(crtc, (u32)gpu_addr);
 
        return 0;
@@ -1423,14 +1403,9 @@ static void mga_crtc_disable(struct drm_crtc *crtc)
        DRM_DEBUG_KMS("\n");
        mga_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
        if (crtc->primary->fb) {
-               struct mga_device *mdev = crtc->dev->dev_private;
-               struct mga_framebuffer *mga_fb = to_mga_framebuffer(crtc->primary->fb);
-               struct drm_gem_object *obj = mga_fb->obj;
-               struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(obj);
-
-               /* unmap if console */
-               if (&mdev->mfbdev->mfb == mga_fb)
-                       drm_gem_vram_kunmap(gbo);
+               struct drm_framebuffer *fb = crtc->primary->fb;
+               struct drm_gem_vram_object *gbo =
+                       drm_gem_vram_of_gem(fb->obj[0]);
                drm_gem_vram_unpin(gbo);
        }
        crtc->primary->fb = NULL;
@@ -1723,7 +1698,6 @@ int mgag200_modeset_init(struct mga_device *mdev)
 {
        struct drm_encoder *encoder;
        struct drm_connector *connector;
-       int ret;
 
        mdev->mode_info.mode_config_initialized = true;
 
@@ -1748,12 +1722,6 @@ int mgag200_modeset_init(struct mga_device *mdev)
 
        drm_connector_attach_encoder(connector, encoder);
 
-       ret = mgag200_fbdev_init(mdev);
-       if (ret) {
-               DRM_ERROR("mga_fbdev_init failed\n");
-               return ret;
-       }
-
        return 0;
 }
 
index 59294c0fd24aef4c82a0f89fcd4844018f02fc1b..73a6b848601cd405c77aa6f5a2f1610de08c73df 100644 (file)
@@ -25,7 +25,8 @@
 /*
  * Authors: Dave Airlie <airlied@redhat.com>
  */
-#include <drm/drmP.h>
+
+#include <drm/drm_pci.h>
 
 #include "mgag200_drv.h"
 
index 45bfac9e3af7bc90b93fc88635effcb3efc7a03b..8cf0b8a4ed0345509c72e02a3161893405089191 100644 (file)
@@ -12,6 +12,7 @@
 
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_atomic_uapi.h>
+#include <drm/drm_gem_framebuffer_helper.h>
 
 #include "msm_drv.h"
 #include "dpu_kms.h"
@@ -764,8 +765,6 @@ static int dpu_plane_prepare_fb(struct drm_plane *plane,
        struct dpu_plane *pdpu = to_dpu_plane(plane);
        struct dpu_plane_state *pstate = to_dpu_plane_state(new_state);
        struct dpu_hw_fmt_layout layout;
-       struct drm_gem_object *obj;
-       struct dma_fence *fence;
        struct dpu_kms *kms = _dpu_plane_get_kms(&pdpu->base);
        int ret;
 
@@ -782,10 +781,7 @@ static int dpu_plane_prepare_fb(struct drm_plane *plane,
         *       we can use msm_atomic_prepare_fb() instead of doing the
         *       implicit fence and fb prepare by hand here.
         */
-       obj = msm_framebuffer_bo(new_state->fb, 0);
-       fence = reservation_object_get_excl_rcu(obj->resv);
-       if (fence)
-               drm_atomic_set_fence_for_plane(new_state, fence);
+       drm_gem_fb_prepare_fb(plane, new_state);
 
        if (pstate->aspace) {
                ret = msm_framebuffer_prepare(new_state->fb,
index dd16babdd8c0b237e1c188c960e737a8010cd719..169d5f915e68377633386cdd25d32ff54eed4277 100644 (file)
@@ -5,6 +5,7 @@
  */
 
 #include <drm/drm_atomic_uapi.h>
+#include <drm/drm_gem_framebuffer_helper.h>
 
 #include "msm_drv.h"
 #include "msm_gem.h"
@@ -37,16 +38,11 @@ int msm_atomic_prepare_fb(struct drm_plane *plane,
 {
        struct msm_drm_private *priv = plane->dev->dev_private;
        struct msm_kms *kms = priv->kms;
-       struct drm_gem_object *obj;
-       struct dma_fence *fence;
 
        if (!new_state->fb)
                return 0;
 
-       obj = msm_framebuffer_bo(new_state->fb, 0);
-       fence = reservation_object_get_excl_rcu(obj->resv);
-
-       drm_atomic_set_fence_for_plane(new_state, fence);
+       drm_gem_fb_prepare_fb(plane, new_state);
 
        return msm_framebuffer_prepare(new_state->fb, kms->aspace);
 }
index ab64ab470de742764b36cc338c07c52bd7e39f10..ea335ca25eca0e9a16e566ab036d8b0807a4d913 100644 (file)
@@ -984,17 +984,17 @@ static int msm_ioctl_submitqueue_close(struct drm_device *dev, void *data,
 }
 
 static const struct drm_ioctl_desc msm_ioctls[] = {
-       DRM_IOCTL_DEF_DRV(MSM_GET_PARAM,    msm_ioctl_get_param,    DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(MSM_GEM_NEW,      msm_ioctl_gem_new,      DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(MSM_GEM_INFO,     msm_ioctl_gem_info,     DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(MSM_GEM_CPU_PREP, msm_ioctl_gem_cpu_prep, DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(MSM_GEM_CPU_FINI, msm_ioctl_gem_cpu_fini, DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(MSM_GEM_SUBMIT,   msm_ioctl_gem_submit,   DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(MSM_WAIT_FENCE,   msm_ioctl_wait_fence,   DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(MSM_GEM_MADVISE,  msm_ioctl_gem_madvise,  DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_NEW,   msm_ioctl_submitqueue_new,   DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_CLOSE, msm_ioctl_submitqueue_close, DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_QUERY, msm_ioctl_submitqueue_query, DRM_AUTH|DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(MSM_GET_PARAM,    msm_ioctl_get_param,    DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(MSM_GEM_NEW,      msm_ioctl_gem_new,      DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(MSM_GEM_INFO,     msm_ioctl_gem_info,     DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(MSM_GEM_CPU_PREP, msm_ioctl_gem_cpu_prep, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(MSM_GEM_CPU_FINI, msm_ioctl_gem_cpu_fini, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(MSM_GEM_SUBMIT,   msm_ioctl_gem_submit,   DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(MSM_WAIT_FENCE,   msm_ioctl_wait_fence,   DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(MSM_GEM_MADVISE,  msm_ioctl_gem_madvise,  DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_NEW,   msm_ioctl_submitqueue_new,   DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_CLOSE, msm_ioctl_submitqueue_close, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_QUERY, msm_ioctl_submitqueue_query, DRM_RENDER_ALLOW),
 };
 
 static const struct vm_operations_struct vm_ops = {
@@ -1017,7 +1017,6 @@ static const struct file_operations fops = {
 
 static struct drm_driver msm_driver = {
        .driver_features    = DRIVER_GEM |
-                               DRIVER_PRIME |
                                DRIVER_RENDER |
                                DRIVER_ATOMIC |
                                DRIVER_MODESET,
@@ -1036,8 +1035,6 @@ static struct drm_driver msm_driver = {
        .dumb_map_offset    = msm_gem_dumb_map_offset,
        .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
-       .gem_prime_export   = drm_gem_prime_export,
-       .gem_prime_import   = drm_gem_prime_import,
        .gem_prime_pin      = msm_gem_prime_pin,
        .gem_prime_unpin    = msm_gem_prime_unpin,
        .gem_prime_get_sg_table = msm_gem_prime_get_sg_table,
index 8b78554cfde3ed9392297eacb07295273ee9b37d..18da8d6ffc5128d72049814b236cb6ac5bbf93e4 100644 (file)
@@ -938,7 +938,6 @@ int msm_gem_new_handle(struct drm_device *dev, struct drm_file *file,
 
 static int msm_gem_new_impl(struct drm_device *dev,
                uint32_t size, uint32_t flags,
-               struct reservation_object *resv,
                struct drm_gem_object **obj,
                bool struct_mutex_locked)
 {
@@ -965,9 +964,6 @@ static int msm_gem_new_impl(struct drm_device *dev,
        msm_obj->flags = flags;
        msm_obj->madv = MSM_MADV_WILLNEED;
 
-       if (resv)
-               msm_obj->base.resv = resv;
-
        INIT_LIST_HEAD(&msm_obj->submit_entry);
        INIT_LIST_HEAD(&msm_obj->vmas);
 
@@ -1009,7 +1005,7 @@ static struct drm_gem_object *_msm_gem_new(struct drm_device *dev,
        if (size == 0)
                return ERR_PTR(-EINVAL);
 
-       ret = msm_gem_new_impl(dev, size, flags, NULL, &obj, struct_mutex_locked);
+       ret = msm_gem_new_impl(dev, size, flags, &obj, struct_mutex_locked);
        if (ret)
                goto fail;
 
@@ -1086,7 +1082,7 @@ struct drm_gem_object *msm_gem_import(struct drm_device *dev,
 
        size = PAGE_ALIGN(dmabuf->size);
 
-       ret = msm_gem_new_impl(dev, size, MSM_BO_WC, dmabuf->resv, &obj, false);
+       ret = msm_gem_new_impl(dev, size, MSM_BO_WC, &obj, false);
        if (ret)
                goto fail;
 
index 93f413345e0d2572ad6790cfcffed5acb3d235e0..12421567af89938ee1c6a9187c87a1d53777e004 100644 (file)
@@ -8,21 +8,23 @@
  * Copyright (C) 2008 Embedded Alley Solutions, Inc All Rights Reserved.
  */
 
-#include <drm/drmP.h>
+#include <linux/clk.h>
+#include <linux/iopoll.h>
+#include <linux/of_graph.h>
+#include <linux/platform_data/simplefb.h>
+
+#include <video/videomode.h>
+
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc.h>
-#include <drm/drm_fb_helper.h>
 #include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_fb_helper.h>
 #include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_of.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_probe_helper.h>
 #include <drm/drm_simple_kms_helper.h>
-#include <linux/clk.h>
-#include <linux/iopoll.h>
-#include <linux/of_graph.h>
-#include <linux/platform_data/simplefb.h>
-#include <video/videomode.h>
+#include <drm/drm_vblank.h>
 
 #include "mxsfb_drv.h"
 #include "mxsfb_regs.h"
index 6fafc90da4ec6f071d3164e0492346d511e397bb..878ef68228126ae53dc2341658fffc792563a9f3 100644 (file)
@@ -8,29 +8,32 @@
  * Copyright (C) 2008 Embedded Alley Solutions, Inc All Rights Reserved.
  */
 
-#include <linux/module.h>
-#include <linux/spinlock.h>
 #include <linux/clk.h>
 #include <linux/component.h>
+#include <linux/dma-mapping.h>
 #include <linux/list.h>
+#include <linux/module.h>
 #include <linux/of_device.h>
 #include <linux/of_graph.h>
 #include <linux/of_reserved_mem.h>
 #include <linux/pm_runtime.h>
 #include <linux/reservation.h>
+#include <linux/spinlock.h>
 
-#include <drm/drmP.h>
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_fb_helper.h>
 #include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
+#include <drm/drm_irq.h>
 #include <drm/drm_of.h>
 #include <drm/drm_panel.h>
 #include <drm/drm_probe_helper.h>
 #include <drm/drm_simple_kms_helper.h>
+#include <drm/drm_vblank.h>
 
 #include "mxsfb_drv.h"
 #include "mxsfb_regs.h"
@@ -313,8 +316,7 @@ static irqreturn_t mxsfb_irq_handler(int irq, void *data)
 DEFINE_DRM_GEM_CMA_FOPS(fops);
 
 static struct drm_driver mxsfb_driver = {
-       .driver_features        = DRIVER_GEM | DRIVER_MODESET |
-                                 DRIVER_PRIME | DRIVER_ATOMIC,
+       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
        .irq_handler            = mxsfb_irq_handler,
        .irq_preinstall         = mxsfb_irq_preinstall,
        .irq_uninstall          = mxsfb_irq_preinstall,
@@ -323,8 +325,6 @@ static struct drm_driver mxsfb_driver = {
        .dumb_create            = drm_gem_cma_dumb_create,
        .prime_handle_to_fd     = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle     = drm_gem_prime_fd_to_handle,
-       .gem_prime_export       = drm_gem_prime_export,
-       .gem_prime_import       = drm_gem_prime_import,
        .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
        .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
        .gem_prime_vmap         = drm_gem_cma_prime_vmap,
index 91e76f9cead67155f3e104a0067258c0155df925..231d016c6f479b1f5ad014db043adb4a763a7570 100644 (file)
@@ -15,7 +15,6 @@
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_probe_helper.h>
 #include <drm/drm_simple_kms_helper.h>
-#include <drm/drmP.h>
 
 #include "mxsfb_drv.h"
 
index c3fd5dd39ed92b9099725cc22ea447fc5ddc07ab..0c585dc5f5c39e15dbb6243b7fbdbf6cb95b65a9 100644 (file)
@@ -244,12 +244,6 @@ nouveau_abi16_ioctl_getparam(ABI16_IOCTL_ARGS)
        return 0;
 }
 
-int
-nouveau_abi16_ioctl_setparam(ABI16_IOCTL_ARGS)
-{
-       return -EINVAL;
-}
-
 int
 nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS)
 {
index 195546719bfe0b4432cc6d1c637c689715051436..70f6aa5c9dd162ffe1e4df6eff241c2793770ac7 100644 (file)
@@ -6,7 +6,6 @@
        struct drm_device *dev, void *data, struct drm_file *file_priv
 
 int nouveau_abi16_ioctl_getparam(ABI16_IOCTL_ARGS);
-int nouveau_abi16_ioctl_setparam(ABI16_IOCTL_ARGS);
 int nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS);
 int nouveau_abi16_ioctl_channel_free(ABI16_IOCTL_ARGS);
 int nouveau_abi16_ioctl_grobj_alloc(ABI16_IOCTL_ARGS);
index 7c2fcaba42d6c38932733fc3f9f39f979230f417..068ff3ad6ed085944863c94a1a05a6adb76a1106 100644 (file)
@@ -1046,20 +1046,20 @@ nouveau_drm_postclose(struct drm_device *dev, struct drm_file *fpriv)
 
 static const struct drm_ioctl_desc
 nouveau_ioctls[] = {
-       DRM_IOCTL_DEF_DRV(NOUVEAU_GETPARAM, nouveau_abi16_ioctl_getparam, DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(NOUVEAU_SETPARAM, nouveau_abi16_ioctl_setparam, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF_DRV(NOUVEAU_CHANNEL_ALLOC, nouveau_abi16_ioctl_channel_alloc, DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(NOUVEAU_CHANNEL_FREE, nouveau_abi16_ioctl_channel_free, DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(NOUVEAU_GROBJ_ALLOC, nouveau_abi16_ioctl_grobj_alloc, DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(NOUVEAU_NOTIFIEROBJ_ALLOC, nouveau_abi16_ioctl_notifierobj_alloc, DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(NOUVEAU_GPUOBJ_FREE, nouveau_abi16_ioctl_gpuobj_free, DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(NOUVEAU_SVM_INIT, nouveau_svmm_init, DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(NOUVEAU_SVM_BIND, nouveau_svmm_bind, DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_NEW, nouveau_gem_ioctl_new, DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_PUSHBUF, nouveau_gem_ioctl_pushbuf, DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_CPU_PREP, nouveau_gem_ioctl_cpu_prep, DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_CPU_FINI, nouveau_gem_ioctl_cpu_fini, DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_INFO, nouveau_gem_ioctl_info, DRM_AUTH|DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(NOUVEAU_GETPARAM, nouveau_abi16_ioctl_getparam, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(NOUVEAU_SETPARAM, drm_invalid_op, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF_DRV(NOUVEAU_CHANNEL_ALLOC, nouveau_abi16_ioctl_channel_alloc, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(NOUVEAU_CHANNEL_FREE, nouveau_abi16_ioctl_channel_free, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(NOUVEAU_GROBJ_ALLOC, nouveau_abi16_ioctl_grobj_alloc, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(NOUVEAU_NOTIFIEROBJ_ALLOC, nouveau_abi16_ioctl_notifierobj_alloc, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(NOUVEAU_GPUOBJ_FREE, nouveau_abi16_ioctl_gpuobj_free, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(NOUVEAU_SVM_INIT, nouveau_svmm_init, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(NOUVEAU_SVM_BIND, nouveau_svmm_bind, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_NEW, nouveau_gem_ioctl_new, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_PUSHBUF, nouveau_gem_ioctl_pushbuf, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_CPU_PREP, nouveau_gem_ioctl_cpu_prep, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_CPU_FINI, nouveau_gem_ioctl_cpu_fini, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_INFO, nouveau_gem_ioctl_info, DRM_RENDER_ALLOW),
 };
 
 long
@@ -1105,7 +1105,7 @@ nouveau_driver_fops = {
 static struct drm_driver
 driver_stub = {
        .driver_features =
-               DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_RENDER
+               DRIVER_GEM | DRIVER_MODESET | DRIVER_RENDER
 #if defined(CONFIG_NOUVEAU_LEGACY_CTX_SUPPORT)
                | DRIVER_KMS_LEGACY_CONTEXT
 #endif
@@ -1130,8 +1130,6 @@ driver_stub = {
 
        .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
-       .gem_prime_export = drm_gem_prime_export,
-       .gem_prime_import = drm_gem_prime_import,
        .gem_prime_pin = nouveau_gem_prime_pin,
        .gem_prime_res_obj = nouveau_gem_prime_res_obj,
        .gem_prime_unpin = nouveau_gem_prime_unpin,
index f9ac9afc56410a6a222cd9c3822cf587c4a3f5c1..3c5ddbf30e97491e6f2dbf662d03e7f9d4a24449 100644 (file)
@@ -4,12 +4,14 @@
  * Author: Rob Clark <rob@ti.com>
  */
 
+#include <linux/math64.h>
+
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_mode.h>
 #include <drm/drm_plane_helper.h>
-#include <linux/math64.h>
+#include <drm/drm_vblank.h>
 
 #include "omap_drv.h"
 
index 2b283f68fab79e29291b66659cdd5eec2056d18f..34dfb33145b49f047a38adf9e9626d2ad6c52be4 100644 (file)
@@ -7,6 +7,8 @@
 #include <linux/seq_file.h>
 
 #include <drm/drm_crtc.h>
+#include <drm/drm_debugfs.h>
+#include <drm/drm_file.h>
 #include <drm/drm_fb_helper.h>
 
 #include "omap_drv.h"
index 288c59dae56ad9326d3e50699deb8ec0445d071d..9f652d2e7af1d0637a481a0bb9e6bbedc5689957 100644 (file)
@@ -4,15 +4,21 @@
  * Author: Rob Clark <rob@ti.com>
  */
 
-#include <linux/of.h>
+#include <linux/dma-mapping.h>
+#include <linux/platform_device.h>
 #include <linux/sort.h>
 #include <linux/sys_soc.h>
 
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_fb_helper.h>
-#include <drm/drm_probe_helper.h>
+#include <drm/drm_file.h>
+#include <drm/drm_ioctl.h>
 #include <drm/drm_panel.h>
+#include <drm/drm_prime.h>
+#include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
 
 #include "omap_dmm_tiler.h"
 #include "omap_drv.h"
@@ -466,19 +472,19 @@ static int ioctl_gem_info(struct drm_device *dev, void *data,
 
 static const struct drm_ioctl_desc ioctls[DRM_COMMAND_END - DRM_COMMAND_BASE] = {
        DRM_IOCTL_DEF_DRV(OMAP_GET_PARAM, ioctl_get_param,
-                         DRM_AUTH | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(OMAP_SET_PARAM, drm_invalid_op,
                          DRM_AUTH | DRM_MASTER | DRM_ROOT_ONLY),
        DRM_IOCTL_DEF_DRV(OMAP_GEM_NEW, ioctl_gem_new,
-                         DRM_AUTH | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
        /* Deprecated, to be removed. */
        DRM_IOCTL_DEF_DRV(OMAP_GEM_CPU_PREP, drm_noop,
-                         DRM_AUTH | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
        /* Deprecated, to be removed. */
        DRM_IOCTL_DEF_DRV(OMAP_GEM_CPU_FINI, drm_noop,
-                         DRM_AUTH | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(OMAP_GEM_INFO, ioctl_gem_info,
-                         DRM_AUTH | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
 };
 
 /*
@@ -513,7 +519,7 @@ static const struct file_operations omapdriver_fops = {
 };
 
 static struct drm_driver omap_drm_driver = {
-       .driver_features = DRIVER_MODESET | DRIVER_GEM  | DRIVER_PRIME |
+       .driver_features = DRIVER_MODESET | DRIVER_GEM  |
                DRIVER_ATOMIC | DRIVER_RENDER,
        .open = dev_open,
        .lastclose = drm_fb_helper_lastclose,
index 025bd57081d5c8a2309ab9380f4b3010e8c33beb..7c4b66efcaa707ab3b1d2ae5d8e3d026cb1db7ca 100644 (file)
 #include <linux/types.h>
 #include <linux/workqueue.h>
 
-#include <drm/drmP.h>
+#include "dss/omapdss.h"
+
 #include <drm/drm_gem.h>
 #include <drm/omap_drm.h>
 
-#include "dss/omapdss.h"
-
 #include "omap_connector.h"
 #include "omap_crtc.h"
 #include "omap_encoder.h"
index 7e89e5cb40684fc275b4428a2690ed4f98fab846..1b8b5108caf8f2e62a5894edc1ac12d7fe5cb9eb 100644 (file)
@@ -4,10 +4,10 @@
  * Author: Rob Clark <rob@ti.com>
  */
 
-#include <linux/seq_file.h>
+#include <linux/dma-mapping.h>
 
-#include <drm/drm_crtc.h>
 #include <drm/drm_modeset_helper.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 
 #include "omap_dmm_tiler.h"
index 561c4812545ba3de5ad36ac27a89986bf3e37e3d..58f53946ee4d42e5334e826ee08d40b293dbaeb9 100644 (file)
@@ -7,6 +7,8 @@
 #include <drm/drm_crtc.h>
 #include <drm/drm_util.h>
 #include <drm/drm_fb_helper.h>
+#include <drm/drm_file.h>
+#include <drm/drm_fourcc.h>
 
 #include "omap_drv.h"
 
@@ -76,8 +78,6 @@ static struct fb_ops omap_fb_ops = {
        .fb_setcmap     = drm_fb_helper_setcmap,
        .fb_blank       = drm_fb_helper_blank,
        .fb_pan_display = omap_fbdev_pan_display,
-       .fb_debug_enter = drm_fb_helper_debug_enter,
-       .fb_debug_leave = drm_fb_helper_debug_leave,
        .fb_ioctl       = drm_fb_helper_ioctl,
 
        .fb_read = drm_fb_helper_sys_read,
index 37378dbc50d0dcaf1962743a1e1746ab5e54a186..08f539efddfb1edb608a430c1ee84c949d01ebe2 100644 (file)
@@ -4,11 +4,13 @@
  * Author: Rob Clark <rob.clark@linaro.org>
  */
 
+#include <linux/dma-mapping.h>
 #include <linux/seq_file.h>
 #include <linux/shmem_fs.h>
 #include <linux/spinlock.h>
 #include <linux/pfn_t.h>
 
+#include <drm/drm_prime.h>
 #include <drm/drm_vma_manager.h>
 
 #include "omap_drv.h"
index 31cf345bf8aef3ceb32bd975883ceb50e425a4d5..729b7812a8155b5db3f7c4153566f500e2a2fa30 100644 (file)
@@ -65,8 +65,7 @@ u64 omap_gem_mmap_offset(struct drm_gem_object *obj);
 size_t omap_gem_mmap_size(struct drm_gem_object *obj);
 
 /* PRIME Interface */
-struct dma_buf *omap_gem_prime_export(struct drm_device *dev,
-               struct drm_gem_object *obj, int flags);
+struct dma_buf *omap_gem_prime_export(struct drm_gem_object *obj, int flags);
 struct drm_gem_object *omap_gem_prime_import(struct drm_device *dev,
                struct dma_buf *buffer);
 
index 07c0b1b486f7fa8ad8611d751f05c4e2e94b4869..e8c3ae7ac77e8e1a91a602176a264130be54deb2 100644 (file)
@@ -5,6 +5,9 @@
  */
 
 #include <linux/dma-buf.h>
+#include <linux/highmem.h>
+
+#include <drm/drm_prime.h>
 
 #include "omap_drv.h"
 
@@ -125,8 +128,7 @@ static const struct dma_buf_ops omap_dmabuf_ops = {
        .mmap = omap_gem_dmabuf_mmap,
 };
 
-struct dma_buf *omap_gem_prime_export(struct drm_device *dev,
-               struct drm_gem_object *obj, int flags)
+struct dma_buf *omap_gem_prime_export(struct drm_gem_object *obj, int flags)
 {
        DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
 
@@ -135,7 +137,7 @@ struct dma_buf *omap_gem_prime_export(struct drm_device *dev,
        exp_info.flags = flags;
        exp_info.priv = obj;
 
-       return drm_gem_dmabuf_export(dev, &exp_info);
+       return drm_gem_dmabuf_export(obj->dev, &exp_info);
 }
 
 /* -----------------------------------------------------------------------------
index 726a013e7988c967ef010e2f8f32264853d87a0b..382bcdc72ac06be66f8577895a5dfef4496b95fe 100644 (file)
@@ -4,6 +4,8 @@
  * Author: Rob Clark <rob.clark@linaro.org>
  */
 
+#include <drm/drm_vblank.h>
+
 #include "omap_drv.h"
 
 struct omap_irq_wait {
index d9d931aa6e26760fa0f84b2184473fb280b7de5e..eaecd40cc32e7ffc5c45ef6a581f3e53c0efd753 100644 (file)
@@ -111,6 +111,15 @@ config DRM_PANEL_LG_LG4573
          Say Y here if you want to enable support for LG4573 RGB panel.
          To compile this driver as a module, choose M here.
 
+config DRM_PANEL_NOVATEK_NT39016
+       tristate "Novatek NT39016 RGB/SPI panel"
+       depends on OF && SPI
+       depends on BACKLIGHT_CLASS_DEVICE
+       select REGMAP_SPI
+       help
+         Say Y here if you want to enable support for the panels built
+         around the Novatek NT39016 display controller.
+
 config DRM_PANEL_OLIMEX_LCD_OLINUXINO
        tristate "Olimex LCD-OLinuXino panel"
        depends on OF
@@ -159,6 +168,15 @@ config DRM_PANEL_RASPBERRYPI_TOUCHSCREEN
          Pi 7" Touchscreen.  To compile this driver as a module,
          choose M here.
 
+config DRM_PANEL_RAYDIUM_RM67191
+       tristate "Raydium RM67191 FHD 1080x1920 DSI video mode panel"
+       depends on OF
+       depends on DRM_MIPI_DSI
+       depends on BACKLIGHT_CLASS_DEVICE
+       help
+         Say Y here if you want to enable support for Raydium RM67191 FHD
+         (1080x1920) DSI panel.
+
 config DRM_PANEL_RAYDIUM_RM68200
        tristate "Raydium RM68200 720x1280 DSI video mode panel"
        depends on OF
index fb0cb3aaa9e6167550a549ca80f681ba02a57257..62dae45f8f740fd8fbf94dbfa95b7634cf3eb542 100644 (file)
@@ -9,11 +9,13 @@ obj-$(CONFIG_DRM_PANEL_INNOLUX_P079ZCA) += panel-innolux-p079zca.o
 obj-$(CONFIG_DRM_PANEL_JDI_LT070ME05000) += panel-jdi-lt070me05000.o
 obj-$(CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04) += panel-kingdisplay-kd097d04.o
 obj-$(CONFIG_DRM_PANEL_LG_LG4573) += panel-lg-lg4573.o
+obj-$(CONFIG_DRM_PANEL_NOVATEK_NT39016) += panel-novatek-nt39016.o
 obj-$(CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO) += panel-olimex-lcd-olinuxino.o
 obj-$(CONFIG_DRM_PANEL_ORISETECH_OTM8009A) += panel-orisetech-otm8009a.o
 obj-$(CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS) += panel-osd-osd101t2587-53ts.o
 obj-$(CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00) += panel-panasonic-vvx10f034n00.o
 obj-$(CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN) += panel-raspberrypi-touchscreen.o
+obj-$(CONFIG_DRM_PANEL_RAYDIUM_RM67191) += panel-raydium-rm67191.o
 obj-$(CONFIG_DRM_PANEL_RAYDIUM_RM68200) += panel-raydium-rm68200.o
 obj-$(CONFIG_DRM_PANEL_ROCKTECH_JH057N00900) += panel-rocktech-jh057n00900.o
 obj-$(CONFIG_DRM_PANEL_RONBO_RB070D30) += panel-ronbo-rb070d30.o
diff --git a/drivers/gpu/drm/panel/panel-novatek-nt39016.c b/drivers/gpu/drm/panel/panel-novatek-nt39016.c
new file mode 100644 (file)
index 0000000..2ad1063
--- /dev/null
@@ -0,0 +1,359 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Novatek NT39016 TFT LCD panel driver
+ *
+ * Copyright (C) 2017, Maarten ter Huurne <maarten@treewalker.org>
+ * Copyright (C) 2019, Paul Cercueil <paul@crapouillou.net>
+ */
+
+#include <linux/backlight.h>
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/gpio/consumer.h>
+#include <linux/media-bus-format.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/regmap.h>
+#include <linux/regulator/consumer.h>
+#include <linux/spi/spi.h>
+
+#include <drm/drm_modes.h>
+#include <drm/drm_panel.h>
+
+enum nt39016_regs {
+       NT39016_REG_SYSTEM,
+       NT39016_REG_TIMING,
+       NT39016_REG_OP,
+       NT39016_REG_DATA_IN,
+       NT39016_REG_SRC_TIMING_DELAY,
+       NT39016_REG_GATE_TIMING_DELAY,
+       NT39016_REG_RESERVED,
+       NT39016_REG_INITIAL_FUNC,
+       NT39016_REG_CONTRAST,
+       NT39016_REG_BRIGHTNESS,
+       NT39016_REG_HUE_SATURATION,
+       NT39016_REG_RB_SUBCONTRAST,
+       NT39016_REG_R_SUBBRIGHTNESS,
+       NT39016_REG_B_SUBBRIGHTNESS,
+       NT39016_REG_VCOMDC,
+       NT39016_REG_VCOMAC,
+       NT39016_REG_VGAM2,
+       NT39016_REG_VGAM34,
+       NT39016_REG_VGAM56,
+       NT39016_REG_VCOMDC_TRIM = 0x1e,
+       NT39016_REG_DISPLAY_MODE = 0x20,
+};
+
+#define NT39016_SYSTEM_RESET_N BIT(0)
+#define NT39016_SYSTEM_STANDBY BIT(1)
+
+struct nt39016_panel_info {
+       struct drm_display_mode display_mode;
+       u16 width_mm, height_mm;
+       u32 bus_format, bus_flags;
+};
+
+struct nt39016 {
+       struct drm_panel drm_panel;
+       struct device *dev;
+       struct regmap *map;
+       struct regulator *supply;
+       const struct nt39016_panel_info *panel_info;
+
+       struct gpio_desc *reset_gpio;
+
+       struct backlight_device *backlight;
+};
+
+static inline struct nt39016 *to_nt39016(struct drm_panel *panel)
+{
+       return container_of(panel, struct nt39016, drm_panel);
+}
+
+#define RV(REG, VAL) { .reg = (REG), .def = (VAL), .delay_us = 2 }
+static const struct reg_sequence nt39016_panel_regs[] = {
+       RV(NT39016_REG_SYSTEM, 0x00),
+       RV(NT39016_REG_TIMING, 0x00),
+       RV(NT39016_REG_OP, 0x03),
+       RV(NT39016_REG_DATA_IN, 0xCC),
+       RV(NT39016_REG_SRC_TIMING_DELAY, 0x46),
+       RV(NT39016_REG_GATE_TIMING_DELAY, 0x05),
+       RV(NT39016_REG_RESERVED, 0x00),
+       RV(NT39016_REG_INITIAL_FUNC, 0x00),
+       RV(NT39016_REG_CONTRAST, 0x08),
+       RV(NT39016_REG_BRIGHTNESS, 0x40),
+       RV(NT39016_REG_HUE_SATURATION, 0x88),
+       RV(NT39016_REG_RB_SUBCONTRAST, 0x88),
+       RV(NT39016_REG_R_SUBBRIGHTNESS, 0x20),
+       RV(NT39016_REG_B_SUBBRIGHTNESS, 0x20),
+       RV(NT39016_REG_VCOMDC, 0x67),
+       RV(NT39016_REG_VCOMAC, 0xA4),
+       RV(NT39016_REG_VGAM2, 0x04),
+       RV(NT39016_REG_VGAM34, 0x24),
+       RV(NT39016_REG_VGAM56, 0x24),
+       RV(NT39016_REG_DISPLAY_MODE, 0x00),
+};
+
+#undef RV
+
+static const struct regmap_range nt39016_regmap_no_ranges[] = {
+       regmap_reg_range(0x13, 0x1D),
+       regmap_reg_range(0x1F, 0x1F),
+};
+
+static const struct regmap_access_table nt39016_regmap_access_table = {
+       .no_ranges = nt39016_regmap_no_ranges,
+       .n_no_ranges = ARRAY_SIZE(nt39016_regmap_no_ranges),
+};
+
+static const struct regmap_config nt39016_regmap_config = {
+       .reg_bits = 6,
+       .pad_bits = 2,
+       .val_bits = 8,
+
+       .max_register = NT39016_REG_DISPLAY_MODE,
+       .wr_table = &nt39016_regmap_access_table,
+       .write_flag_mask = 0x02,
+
+       .cache_type = REGCACHE_FLAT,
+};
+
+static int nt39016_prepare(struct drm_panel *drm_panel)
+{
+       struct nt39016 *panel = to_nt39016(drm_panel);
+       int err;
+
+       err = regulator_enable(panel->supply);
+       if (err) {
+               dev_err(panel->dev, "Failed to enable power supply: %d", err);
+               return err;
+       }
+
+       /*
+        * Reset the NT39016.
+        * The documentation says the reset pulse should be at least 40 us to
+        * pass the glitch filter, but when testing I see some resets fail and
+        * some succeed when using a 70 us delay, so we use 100 us instead.
+        */
+       gpiod_set_value_cansleep(panel->reset_gpio, 1);
+       usleep_range(100, 1000);
+       gpiod_set_value_cansleep(panel->reset_gpio, 0);
+       udelay(2);
+
+       /* Init all registers. */
+       err = regmap_multi_reg_write(panel->map, nt39016_panel_regs,
+                                    ARRAY_SIZE(nt39016_panel_regs));
+       if (err) {
+               dev_err(panel->dev, "Failed to init registers: %d", err);
+               goto err_disable_regulator;
+       }
+
+       return 0;
+
+err_disable_regulator:
+       regulator_disable(panel->supply);
+       return err;
+}
+
+static int nt39016_unprepare(struct drm_panel *drm_panel)
+{
+       struct nt39016 *panel = to_nt39016(drm_panel);
+
+       gpiod_set_value_cansleep(panel->reset_gpio, 1);
+
+       regulator_disable(panel->supply);
+
+       return 0;
+}
+
+static int nt39016_enable(struct drm_panel *drm_panel)
+{
+       struct nt39016 *panel = to_nt39016(drm_panel);
+       int ret;
+
+       ret = regmap_write(panel->map, NT39016_REG_SYSTEM,
+                          NT39016_SYSTEM_RESET_N | NT39016_SYSTEM_STANDBY);
+       if (ret) {
+               dev_err(panel->dev, "Unable to enable panel: %d", ret);
+               return ret;
+       }
+
+       if (panel->backlight) {
+               /* Wait for the picture to be ready before enabling backlight */
+               msleep(150);
+
+               ret = backlight_enable(panel->backlight);
+       }
+
+       return ret;
+}
+
+static int nt39016_disable(struct drm_panel *drm_panel)
+{
+       struct nt39016 *panel = to_nt39016(drm_panel);
+       int err;
+
+       backlight_disable(panel->backlight);
+
+       err = regmap_write(panel->map, NT39016_REG_SYSTEM,
+                          NT39016_SYSTEM_RESET_N);
+       if (err) {
+               dev_err(panel->dev, "Unable to disable panel: %d", err);
+               return err;
+       }
+
+       return 0;
+}
+
+static int nt39016_get_modes(struct drm_panel *drm_panel)
+{
+       struct nt39016 *panel = to_nt39016(drm_panel);
+       const struct nt39016_panel_info *panel_info = panel->panel_info;
+       struct drm_connector *connector = drm_panel->connector;
+       struct drm_display_mode *mode;
+
+       mode = drm_mode_duplicate(drm_panel->drm, &panel_info->display_mode);
+       if (!mode)
+               return -ENOMEM;
+
+       drm_mode_set_name(mode);
+
+       mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
+       drm_mode_probed_add(connector, mode);
+
+       connector->display_info.bpc = 8;
+       connector->display_info.width_mm = panel_info->width_mm;
+       connector->display_info.height_mm = panel_info->height_mm;
+
+       drm_display_info_set_bus_formats(&connector->display_info,
+                                        &panel_info->bus_format, 1);
+       connector->display_info.bus_flags = panel_info->bus_flags;
+
+       return 1;
+}
+
+static const struct drm_panel_funcs nt39016_funcs = {
+       .prepare        = nt39016_prepare,
+       .unprepare      = nt39016_unprepare,
+       .enable         = nt39016_enable,
+       .disable        = nt39016_disable,
+       .get_modes      = nt39016_get_modes,
+};
+
+static int nt39016_probe(struct spi_device *spi)
+{
+       struct device *dev = &spi->dev;
+       struct nt39016 *panel;
+       int err;
+
+       panel = devm_kzalloc(dev, sizeof(*panel), GFP_KERNEL);
+       if (!panel)
+               return -ENOMEM;
+
+       panel->dev = dev;
+       spi_set_drvdata(spi, panel);
+
+       panel->panel_info = of_device_get_match_data(dev);
+       if (!panel->panel_info)
+               return -EINVAL;
+
+       panel->supply = devm_regulator_get(dev, "power");
+       if (IS_ERR(panel->supply)) {
+               dev_err(dev, "Failed to get power supply");
+               return PTR_ERR(panel->supply);
+       }
+
+       panel->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
+       if (IS_ERR(panel->reset_gpio)) {
+               dev_err(dev, "Failed to get reset GPIO");
+               return PTR_ERR(panel->reset_gpio);
+       }
+
+       spi->bits_per_word = 8;
+       spi->mode = SPI_MODE_3 | SPI_3WIRE;
+       err = spi_setup(spi);
+       if (err) {
+               dev_err(dev, "Failed to setup SPI");
+               return err;
+       }
+
+       panel->map = devm_regmap_init_spi(spi, &nt39016_regmap_config);
+       if (IS_ERR(panel->map)) {
+               dev_err(dev, "Failed to init regmap");
+               return PTR_ERR(panel->map);
+       }
+
+       panel->backlight = devm_of_find_backlight(dev);
+       if (IS_ERR(panel->backlight)) {
+               err = PTR_ERR(panel->backlight);
+               if (err != -EPROBE_DEFER)
+                       dev_err(dev, "Failed to get backlight handle");
+               return err;
+       }
+
+       drm_panel_init(&panel->drm_panel);
+       panel->drm_panel.dev = dev;
+       panel->drm_panel.funcs = &nt39016_funcs;
+
+       err = drm_panel_add(&panel->drm_panel);
+       if (err < 0) {
+               dev_err(dev, "Failed to register panel");
+               return err;
+       }
+
+       return 0;
+}
+
+static int nt39016_remove(struct spi_device *spi)
+{
+       struct nt39016 *panel = spi_get_drvdata(spi);
+
+       drm_panel_remove(&panel->drm_panel);
+
+       nt39016_disable(&panel->drm_panel);
+       nt39016_unprepare(&panel->drm_panel);
+
+       return 0;
+}
+
+static const struct nt39016_panel_info kd035g6_info = {
+       .display_mode = {
+               .clock = 6000,
+               .hdisplay = 320,
+               .hsync_start = 320 + 10,
+               .hsync_end = 320 + 10 + 50,
+               .htotal = 320 + 10 + 50 + 20,
+               .vdisplay = 240,
+               .vsync_start = 240 + 5,
+               .vsync_end = 240 + 5 + 1,
+               .vtotal = 240 + 5 + 1 + 4,
+               .vrefresh = 60,
+               .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
+       },
+       .width_mm = 71,
+       .height_mm = 53,
+       .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
+       .bus_flags = DRM_BUS_FLAG_PIXDATA_NEGEDGE,
+};
+
+static const struct of_device_id nt39016_of_match[] = {
+       { .compatible = "kingdisplay,kd035g6-54nt", .data = &kd035g6_info },
+       { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, nt39016_of_match);
+
+static struct spi_driver nt39016_driver = {
+       .driver = {
+               .name = "nt39016",
+               .of_match_table = nt39016_of_match,
+       },
+       .probe = nt39016_probe,
+       .remove = nt39016_remove,
+};
+
+module_spi_driver(nt39016_driver);
+
+MODULE_AUTHOR("Maarten ter Huurne <maarten@treewalker.org>");
+MODULE_AUTHOR("Paul Cercueil <paul@crapouillou.net>");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/gpu/drm/panel/panel-raydium-rm67191.c b/drivers/gpu/drm/panel/panel-raydium-rm67191.c
new file mode 100644 (file)
index 0000000..6a5d370
--- /dev/null
@@ -0,0 +1,668 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Raydium RM67191 MIPI-DSI panel driver
+ *
+ * Copyright 2019 NXP
+ */
+
+#include <linux/backlight.h>
+#include <linux/delay.h>
+#include <linux/gpio/consumer.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/regulator/consumer.h>
+
+#include <video/mipi_display.h>
+#include <video/of_videomode.h>
+#include <video/videomode.h>
+
+#include <drm/drm_crtc.h>
+#include <drm/drm_mipi_dsi.h>
+#include <drm/drm_panel.h>
+#include <drm/drm_print.h>
+
+/* Panel specific color-format bits */
+#define COL_FMT_16BPP 0x55
+#define COL_FMT_18BPP 0x66
+#define COL_FMT_24BPP 0x77
+
+/* Write Manufacture Command Set Control */
+#define WRMAUCCTR 0xFE
+
+/* Manufacturer Command Set pages (CMD2) */
+struct cmd_set_entry {
+       u8 cmd;
+       u8 param;
+};
+
+/*
+ * There is no description in the Reference Manual about these commands.
+ * We received them from vendor, so just use them as is.
+ */
+static const struct cmd_set_entry manufacturer_cmd_set[] = {
+       {0xFE, 0x0B},
+       {0x28, 0x40},
+       {0x29, 0x4F},
+       {0xFE, 0x0E},
+       {0x4B, 0x00},
+       {0x4C, 0x0F},
+       {0x4D, 0x20},
+       {0x4E, 0x40},
+       {0x4F, 0x60},
+       {0x50, 0xA0},
+       {0x51, 0xC0},
+       {0x52, 0xE0},
+       {0x53, 0xFF},
+       {0xFE, 0x0D},
+       {0x18, 0x08},
+       {0x42, 0x00},
+       {0x08, 0x41},
+       {0x46, 0x02},
+       {0x72, 0x09},
+       {0xFE, 0x0A},
+       {0x24, 0x17},
+       {0x04, 0x07},
+       {0x1A, 0x0C},
+       {0x0F, 0x44},
+       {0xFE, 0x04},
+       {0x00, 0x0C},
+       {0x05, 0x08},
+       {0x06, 0x08},
+       {0x08, 0x08},
+       {0x09, 0x08},
+       {0x0A, 0xE6},
+       {0x0B, 0x8C},
+       {0x1A, 0x12},
+       {0x1E, 0xE0},
+       {0x29, 0x93},
+       {0x2A, 0x93},
+       {0x2F, 0x02},
+       {0x31, 0x02},
+       {0x33, 0x05},
+       {0x37, 0x2D},
+       {0x38, 0x2D},
+       {0x3A, 0x1E},
+       {0x3B, 0x1E},
+       {0x3D, 0x27},
+       {0x3F, 0x80},
+       {0x40, 0x40},
+       {0x41, 0xE0},
+       {0x4F, 0x2F},
+       {0x50, 0x1E},
+       {0xFE, 0x06},
+       {0x00, 0xCC},
+       {0x05, 0x05},
+       {0x07, 0xA2},
+       {0x08, 0xCC},
+       {0x0D, 0x03},
+       {0x0F, 0xA2},
+       {0x32, 0xCC},
+       {0x37, 0x05},
+       {0x39, 0x83},
+       {0x3A, 0xCC},
+       {0x41, 0x04},
+       {0x43, 0x83},
+       {0x44, 0xCC},
+       {0x49, 0x05},
+       {0x4B, 0xA2},
+       {0x4C, 0xCC},
+       {0x51, 0x03},
+       {0x53, 0xA2},
+       {0x75, 0xCC},
+       {0x7A, 0x03},
+       {0x7C, 0x83},
+       {0x7D, 0xCC},
+       {0x82, 0x02},
+       {0x84, 0x83},
+       {0x85, 0xEC},
+       {0x86, 0x0F},
+       {0x87, 0xFF},
+       {0x88, 0x00},
+       {0x8A, 0x02},
+       {0x8C, 0xA2},
+       {0x8D, 0xEA},
+       {0x8E, 0x01},
+       {0x8F, 0xE8},
+       {0xFE, 0x06},
+       {0x90, 0x0A},
+       {0x92, 0x06},
+       {0x93, 0xA0},
+       {0x94, 0xA8},
+       {0x95, 0xEC},
+       {0x96, 0x0F},
+       {0x97, 0xFF},
+       {0x98, 0x00},
+       {0x9A, 0x02},
+       {0x9C, 0xA2},
+       {0xAC, 0x04},
+       {0xFE, 0x06},
+       {0xB1, 0x12},
+       {0xB2, 0x17},
+       {0xB3, 0x17},
+       {0xB4, 0x17},
+       {0xB5, 0x17},
+       {0xB6, 0x11},
+       {0xB7, 0x08},
+       {0xB8, 0x09},
+       {0xB9, 0x06},
+       {0xBA, 0x07},
+       {0xBB, 0x17},
+       {0xBC, 0x17},
+       {0xBD, 0x17},
+       {0xBE, 0x17},
+       {0xBF, 0x17},
+       {0xC0, 0x17},
+       {0xC1, 0x17},
+       {0xC2, 0x17},
+       {0xC3, 0x17},
+       {0xC4, 0x0F},
+       {0xC5, 0x0E},
+       {0xC6, 0x00},
+       {0xC7, 0x01},
+       {0xC8, 0x10},
+       {0xFE, 0x06},
+       {0x95, 0xEC},
+       {0x8D, 0xEE},
+       {0x44, 0xEC},
+       {0x4C, 0xEC},
+       {0x32, 0xEC},
+       {0x3A, 0xEC},
+       {0x7D, 0xEC},
+       {0x75, 0xEC},
+       {0x00, 0xEC},
+       {0x08, 0xEC},
+       {0x85, 0xEC},
+       {0xA6, 0x21},
+       {0xA7, 0x05},
+       {0xA9, 0x06},
+       {0x82, 0x06},
+       {0x41, 0x06},
+       {0x7A, 0x07},
+       {0x37, 0x07},
+       {0x05, 0x06},
+       {0x49, 0x06},
+       {0x0D, 0x04},
+       {0x51, 0x04},
+};
+
+static const u32 rad_bus_formats[] = {
+       MEDIA_BUS_FMT_RGB888_1X24,
+       MEDIA_BUS_FMT_RGB666_1X18,
+       MEDIA_BUS_FMT_RGB565_1X16,
+};
+
+static const u32 rad_bus_flags = DRM_BUS_FLAG_DE_LOW |
+                                DRM_BUS_FLAG_PIXDATA_NEGEDGE;
+
+struct rad_panel {
+       struct drm_panel panel;
+       struct mipi_dsi_device *dsi;
+
+       struct gpio_desc *reset;
+       struct backlight_device *backlight;
+
+       struct regulator_bulk_data *supplies;
+       unsigned int num_supplies;
+
+       bool prepared;
+       bool enabled;
+};
+
+static const struct drm_display_mode default_mode = {
+       .clock = 132000,
+       .hdisplay = 1080,
+       .hsync_start = 1080 + 20,
+       .hsync_end = 1080 + 20 + 2,
+       .htotal = 1080 + 20 + 2 + 34,
+       .vdisplay = 1920,
+       .vsync_start = 1920 + 10,
+       .vsync_end = 1920 + 10 + 2,
+       .vtotal = 1920 + 10 + 2 + 4,
+       .vrefresh = 60,
+       .width_mm = 68,
+       .height_mm = 121,
+       .flags = DRM_MODE_FLAG_NHSYNC |
+                DRM_MODE_FLAG_NVSYNC,
+};
+
+static inline struct rad_panel *to_rad_panel(struct drm_panel *panel)
+{
+       return container_of(panel, struct rad_panel, panel);
+}
+
+static int rad_panel_push_cmd_list(struct mipi_dsi_device *dsi)
+{
+       size_t i;
+       size_t count = ARRAY_SIZE(manufacturer_cmd_set);
+       int ret = 0;
+
+       for (i = 0; i < count; i++) {
+               const struct cmd_set_entry *entry = &manufacturer_cmd_set[i];
+               u8 buffer[2] = { entry->cmd, entry->param };
+
+               ret = mipi_dsi_generic_write(dsi, &buffer, sizeof(buffer));
+               if (ret < 0)
+                       return ret;
+       }
+
+       return ret;
+};
+
+static int color_format_from_dsi_format(enum mipi_dsi_pixel_format format)
+{
+       switch (format) {
+       case MIPI_DSI_FMT_RGB565:
+               return COL_FMT_16BPP;
+       case MIPI_DSI_FMT_RGB666:
+       case MIPI_DSI_FMT_RGB666_PACKED:
+               return COL_FMT_18BPP;
+       case MIPI_DSI_FMT_RGB888:
+               return COL_FMT_24BPP;
+       default:
+               return COL_FMT_24BPP; /* for backward compatibility */
+       }
+};
+
+static int rad_panel_prepare(struct drm_panel *panel)
+{
+       struct rad_panel *rad = to_rad_panel(panel);
+       int ret;
+
+       if (rad->prepared)
+               return 0;
+
+       ret = regulator_bulk_enable(rad->num_supplies, rad->supplies);
+       if (ret)
+               return ret;
+
+       if (rad->reset) {
+               gpiod_set_value_cansleep(rad->reset, 1);
+               usleep_range(3000, 5000);
+               gpiod_set_value_cansleep(rad->reset, 0);
+               usleep_range(18000, 20000);
+       }
+
+       rad->prepared = true;
+
+       return 0;
+}
+
+static int rad_panel_unprepare(struct drm_panel *panel)
+{
+       struct rad_panel *rad = to_rad_panel(panel);
+       int ret;
+
+       if (!rad->prepared)
+               return 0;
+
+       /*
+        * Right after asserting the reset, we need to release it, so that the
+        * touch driver can have an active connection with the touch controller
+        * even after the display is turned off.
+        */
+       if (rad->reset) {
+               gpiod_set_value_cansleep(rad->reset, 1);
+               usleep_range(15000, 17000);
+               gpiod_set_value_cansleep(rad->reset, 0);
+       }
+
+       ret = regulator_bulk_disable(rad->num_supplies, rad->supplies);
+       if (ret)
+               return ret;
+
+       rad->prepared = false;
+
+       return 0;
+}
+
+static int rad_panel_enable(struct drm_panel *panel)
+{
+       struct rad_panel *rad = to_rad_panel(panel);
+       struct mipi_dsi_device *dsi = rad->dsi;
+       struct device *dev = &dsi->dev;
+       int color_format = color_format_from_dsi_format(dsi->format);
+       int ret;
+
+       if (rad->enabled)
+               return 0;
+
+       dsi->mode_flags |= MIPI_DSI_MODE_LPM;
+
+       ret = rad_panel_push_cmd_list(dsi);
+       if (ret < 0) {
+               DRM_DEV_ERROR(dev, "Failed to send MCS (%d)\n", ret);
+               goto fail;
+       }
+
+       /* Select User Command Set table (CMD1) */
+       ret = mipi_dsi_generic_write(dsi, (u8[]){ WRMAUCCTR, 0x00 }, 2);
+       if (ret < 0)
+               goto fail;
+
+       /* Software reset */
+       ret = mipi_dsi_dcs_soft_reset(dsi);
+       if (ret < 0) {
+               DRM_DEV_ERROR(dev, "Failed to do Software Reset (%d)\n", ret);
+               goto fail;
+       }
+
+       usleep_range(15000, 17000);
+
+       /* Set DSI mode */
+       ret = mipi_dsi_generic_write(dsi, (u8[]){ 0xC2, 0x0B }, 2);
+       if (ret < 0) {
+               DRM_DEV_ERROR(dev, "Failed to set DSI mode (%d)\n", ret);
+               goto fail;
+       }
+       /* Set tear ON */
+       ret = mipi_dsi_dcs_set_tear_on(dsi, MIPI_DSI_DCS_TEAR_MODE_VBLANK);
+       if (ret < 0) {
+               DRM_DEV_ERROR(dev, "Failed to set tear ON (%d)\n", ret);
+               goto fail;
+       }
+       /* Set tear scanline */
+       ret = mipi_dsi_dcs_set_tear_scanline(dsi, 0x380);
+       if (ret < 0) {
+               DRM_DEV_ERROR(dev, "Failed to set tear scanline (%d)\n", ret);
+               goto fail;
+       }
+       /* Set pixel format */
+       ret = mipi_dsi_dcs_set_pixel_format(dsi, color_format);
+       DRM_DEV_DEBUG_DRIVER(dev, "Interface color format set to 0x%x\n",
+                            color_format);
+       if (ret < 0) {
+               DRM_DEV_ERROR(dev, "Failed to set pixel format (%d)\n", ret);
+               goto fail;
+       }
+       /* Exit sleep mode */
+       ret = mipi_dsi_dcs_exit_sleep_mode(dsi);
+       if (ret < 0) {
+               DRM_DEV_ERROR(dev, "Failed to exit sleep mode (%d)\n", ret);
+               goto fail;
+       }
+
+       usleep_range(5000, 7000);
+
+       ret = mipi_dsi_dcs_set_display_on(dsi);
+       if (ret < 0) {
+               DRM_DEV_ERROR(dev, "Failed to set display ON (%d)\n", ret);
+               goto fail;
+       }
+
+       backlight_enable(rad->backlight);
+
+       rad->enabled = true;
+
+       return 0;
+
+fail:
+       gpiod_set_value_cansleep(rad->reset, 1);
+
+       return ret;
+}
+
+static int rad_panel_disable(struct drm_panel *panel)
+{
+       struct rad_panel *rad = to_rad_panel(panel);
+       struct mipi_dsi_device *dsi = rad->dsi;
+       struct device *dev = &dsi->dev;
+       int ret;
+
+       if (!rad->enabled)
+               return 0;
+
+       dsi->mode_flags |= MIPI_DSI_MODE_LPM;
+
+       backlight_disable(rad->backlight);
+
+       usleep_range(10000, 12000);
+
+       ret = mipi_dsi_dcs_set_display_off(dsi);
+       if (ret < 0) {
+               DRM_DEV_ERROR(dev, "Failed to set display OFF (%d)\n", ret);
+               return ret;
+       }
+
+       usleep_range(5000, 10000);
+
+       ret = mipi_dsi_dcs_enter_sleep_mode(dsi);
+       if (ret < 0) {
+               DRM_DEV_ERROR(dev, "Failed to enter sleep mode (%d)\n", ret);
+               return ret;
+       }
+
+       rad->enabled = false;
+
+       return 0;
+}
+
+static int rad_panel_get_modes(struct drm_panel *panel)
+{
+       struct drm_connector *connector = panel->connector;
+       struct drm_display_mode *mode;
+
+       mode = drm_mode_duplicate(panel->drm, &default_mode);
+       if (!mode) {
+               DRM_DEV_ERROR(panel->dev, "failed to add mode %ux%ux@%u\n",
+                             default_mode.hdisplay, default_mode.vdisplay,
+                             default_mode.vrefresh);
+               return -ENOMEM;
+       }
+
+       drm_mode_set_name(mode);
+       mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
+       drm_mode_probed_add(panel->connector, mode);
+
+       connector->display_info.width_mm = mode->width_mm;
+       connector->display_info.height_mm = mode->height_mm;
+       connector->display_info.bus_flags = rad_bus_flags;
+
+       drm_display_info_set_bus_formats(&connector->display_info,
+                                        rad_bus_formats,
+                                        ARRAY_SIZE(rad_bus_formats));
+       return 1;
+}
+
+static int rad_bl_get_brightness(struct backlight_device *bl)
+{
+       struct mipi_dsi_device *dsi = bl_get_data(bl);
+       struct rad_panel *rad = mipi_dsi_get_drvdata(dsi);
+       u16 brightness;
+       int ret;
+
+       if (!rad->prepared)
+               return 0;
+
+       dsi->mode_flags &= ~MIPI_DSI_MODE_LPM;
+
+       ret = mipi_dsi_dcs_get_display_brightness(dsi, &brightness);
+       if (ret < 0)
+               return ret;
+
+       bl->props.brightness = brightness;
+
+       return brightness & 0xff;
+}
+
+static int rad_bl_update_status(struct backlight_device *bl)
+{
+       struct mipi_dsi_device *dsi = bl_get_data(bl);
+       struct rad_panel *rad = mipi_dsi_get_drvdata(dsi);
+       int ret = 0;
+
+       if (!rad->prepared)
+               return 0;
+
+       dsi->mode_flags &= ~MIPI_DSI_MODE_LPM;
+
+       ret = mipi_dsi_dcs_set_display_brightness(dsi, bl->props.brightness);
+       if (ret < 0)
+               return ret;
+
+       return 0;
+}
+
+static const struct backlight_ops rad_bl_ops = {
+       .update_status = rad_bl_update_status,
+       .get_brightness = rad_bl_get_brightness,
+};
+
+static const struct drm_panel_funcs rad_panel_funcs = {
+       .prepare = rad_panel_prepare,
+       .unprepare = rad_panel_unprepare,
+       .enable = rad_panel_enable,
+       .disable = rad_panel_disable,
+       .get_modes = rad_panel_get_modes,
+};
+
+static const char * const rad_supply_names[] = {
+       "v3p3",
+       "v1p8",
+};
+
+static int rad_init_regulators(struct rad_panel *rad)
+{
+       struct device *dev = &rad->dsi->dev;
+       int i;
+
+       rad->num_supplies = ARRAY_SIZE(rad_supply_names);
+       rad->supplies = devm_kcalloc(dev, rad->num_supplies,
+                                    sizeof(*rad->supplies), GFP_KERNEL);
+       if (!rad->supplies)
+               return -ENOMEM;
+
+       for (i = 0; i < rad->num_supplies; i++)
+               rad->supplies[i].supply = rad_supply_names[i];
+
+       return devm_regulator_bulk_get(dev, rad->num_supplies, rad->supplies);
+};
+
+static int rad_panel_probe(struct mipi_dsi_device *dsi)
+{
+       struct device *dev = &dsi->dev;
+       struct device_node *np = dev->of_node;
+       struct rad_panel *panel;
+       struct backlight_properties bl_props;
+       int ret;
+       u32 video_mode;
+
+       panel = devm_kzalloc(&dsi->dev, sizeof(*panel), GFP_KERNEL);
+       if (!panel)
+               return -ENOMEM;
+
+       mipi_dsi_set_drvdata(dsi, panel);
+
+       panel->dsi = dsi;
+
+       dsi->format = MIPI_DSI_FMT_RGB888;
+       dsi->mode_flags =  MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO |
+                          MIPI_DSI_CLOCK_NON_CONTINUOUS;
+
+       ret = of_property_read_u32(np, "video-mode", &video_mode);
+       if (!ret) {
+               switch (video_mode) {
+               case 0:
+                       /* burst mode */
+                       dsi->mode_flags |= MIPI_DSI_MODE_VIDEO_BURST;
+                       break;
+               case 1:
+                       /* non-burst mode with sync event */
+                       break;
+               case 2:
+                       /* non-burst mode with sync pulse */
+                       dsi->mode_flags |= MIPI_DSI_MODE_VIDEO_SYNC_PULSE;
+                       break;
+               default:
+                       dev_warn(dev, "invalid video mode %d\n", video_mode);
+                       break;
+               }
+       }
+
+       ret = of_property_read_u32(np, "dsi-lanes", &dsi->lanes);
+       if (ret) {
+               dev_err(dev, "Failed to get dsi-lanes property (%d)\n", ret);
+               return ret;
+       }
+
+       panel->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
+       if (IS_ERR(panel->reset))
+               return PTR_ERR(panel->reset);
+
+       memset(&bl_props, 0, sizeof(bl_props));
+       bl_props.type = BACKLIGHT_RAW;
+       bl_props.brightness = 255;
+       bl_props.max_brightness = 255;
+
+       panel->backlight = devm_backlight_device_register(dev, dev_name(dev),
+                                                         dev, dsi, &rad_bl_ops,
+                                                         &bl_props);
+       if (IS_ERR(panel->backlight)) {
+               ret = PTR_ERR(panel->backlight);
+               dev_err(dev, "Failed to register backlight (%d)\n", ret);
+               return ret;
+       }
+
+       ret = rad_init_regulators(panel);
+       if (ret)
+               return ret;
+
+       drm_panel_init(&panel->panel);
+       panel->panel.funcs = &rad_panel_funcs;
+       panel->panel.dev = dev;
+       dev_set_drvdata(dev, panel);
+
+       ret = drm_panel_add(&panel->panel);
+       if (ret)
+               return ret;
+
+       ret = mipi_dsi_attach(dsi);
+       if (ret)
+               drm_panel_remove(&panel->panel);
+
+       return ret;
+}
+
+static int rad_panel_remove(struct mipi_dsi_device *dsi)
+{
+       struct rad_panel *rad = mipi_dsi_get_drvdata(dsi);
+       struct device *dev = &dsi->dev;
+       int ret;
+
+       ret = mipi_dsi_detach(dsi);
+       if (ret)
+               DRM_DEV_ERROR(dev, "Failed to detach from host (%d)\n",
+                             ret);
+
+       drm_panel_remove(&rad->panel);
+
+       return 0;
+}
+
+static void rad_panel_shutdown(struct mipi_dsi_device *dsi)
+{
+       struct rad_panel *rad = mipi_dsi_get_drvdata(dsi);
+
+       rad_panel_disable(&rad->panel);
+       rad_panel_unprepare(&rad->panel);
+}
+
+static const struct of_device_id rad_of_match[] = {
+       { .compatible = "raydium,rm67191", },
+       { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, rad_of_match);
+
+static struct mipi_dsi_driver rad_panel_driver = {
+       .driver = {
+               .name = "panel-raydium-rm67191",
+               .of_match_table = rad_of_match,
+       },
+       .probe = rad_panel_probe,
+       .remove = rad_panel_remove,
+       .shutdown = rad_panel_shutdown,
+};
+module_mipi_dsi_driver(rad_panel_driver);
+
+MODULE_AUTHOR("Robert Chiras <robert.chiras@nxp.com>");
+MODULE_DESCRIPTION("DRM Driver for Raydium RM67191 MIPI DSI panel");
+MODULE_LICENSE("GPL v2");
index 6dcb692c47017b8c4c729419d50c3471d56f7d03..1274b54f26724350759758c639c81970d34964e8 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/gpio/consumer.h>
 #include <linux/media-bus-format.h>
 #include <linux/module.h>
+#include <linux/regulator/consumer.h>
 #include <video/display_timing.h>
 #include <video/mipi_display.h>
 
@@ -33,6 +34,7 @@
 #define ST7703_CMD_SETEXTC      0xB9
 #define ST7703_CMD_SETMIPI      0xBA
 #define ST7703_CMD_SETVDC       0xBC
+#define ST7703_CMD_UNKNOWN0     0xBF
 #define ST7703_CMD_SETSCR       0xC0
 #define ST7703_CMD_SETPOWER     0xC1
 #define ST7703_CMD_SETPANEL     0xCC
@@ -46,6 +48,8 @@ struct jh057n {
        struct drm_panel panel;
        struct gpio_desc *reset_gpio;
        struct backlight_device *backlight;
+       struct regulator *vcc;
+       struct regulator *iovcc;
        bool prepared;
 
        struct dentry *debugfs;
@@ -94,7 +98,7 @@ static int jh057n_init_sequence(struct jh057n *ctx)
        msleep(20);
 
        dsi_generic_write_seq(dsi, ST7703_CMD_SETVCOM, 0x3F, 0x3F);
-       dsi_generic_write_seq(dsi, 0xBF, 0x02, 0x11, 0x00);
+       dsi_generic_write_seq(dsi, ST7703_CMD_UNKNOWN0, 0x02, 0x11, 0x00);
        dsi_generic_write_seq(dsi, ST7703_CMD_SETGIP1,
                              0x82, 0x10, 0x06, 0x05, 0x9E, 0x0A, 0xA5, 0x12,
                              0x31, 0x23, 0x37, 0x83, 0x04, 0xBC, 0x27, 0x38,
@@ -159,6 +163,8 @@ static int jh057n_unprepare(struct drm_panel *panel)
                return 0;
 
        mipi_dsi_dcs_set_display_off(dsi);
+       regulator_disable(ctx->iovcc);
+       regulator_disable(ctx->vcc);
        ctx->prepared = false;
 
        return 0;
@@ -173,6 +179,19 @@ static int jh057n_prepare(struct drm_panel *panel)
                return 0;
 
        DRM_DEV_DEBUG_DRIVER(ctx->dev, "Resetting the panel\n");
+       ret = regulator_enable(ctx->vcc);
+       if (ret < 0) {
+               DRM_DEV_ERROR(ctx->dev,
+                             "Failed to enable vcc supply: %d\n", ret);
+               return ret;
+       }
+       ret = regulator_enable(ctx->iovcc);
+       if (ret < 0) {
+               DRM_DEV_ERROR(ctx->dev,
+                             "Failed to enable iovcc supply: %d\n", ret);
+               goto disable_vcc;
+       }
+
        gpiod_set_value_cansleep(ctx->reset_gpio, 1);
        usleep_range(20, 40);
        gpiod_set_value_cansleep(ctx->reset_gpio, 0);
@@ -188,6 +207,10 @@ static int jh057n_prepare(struct drm_panel *panel)
        ctx->prepared = true;
 
        return 0;
+
+disable_vcc:
+       regulator_disable(ctx->vcc);
+       return ret;
 }
 
 static const struct drm_display_mode default_mode = {
@@ -300,6 +323,25 @@ static int jh057n_probe(struct mipi_dsi_device *dsi)
        if (IS_ERR(ctx->backlight))
                return PTR_ERR(ctx->backlight);
 
+       ctx->vcc = devm_regulator_get(dev, "vcc");
+       if (IS_ERR(ctx->vcc)) {
+               ret = PTR_ERR(ctx->vcc);
+               if (ret != -EPROBE_DEFER)
+                       DRM_DEV_ERROR(dev,
+                                     "Failed to request vcc regulator: %d\n",
+                                     ret);
+               return ret;
+       }
+       ctx->iovcc = devm_regulator_get(dev, "iovcc");
+       if (IS_ERR(ctx->iovcc)) {
+               ret = PTR_ERR(ctx->iovcc);
+               if (ret != -EPROBE_DEFER)
+                       DRM_DEV_ERROR(dev,
+                                     "Failed to request iovcc regulator: %d\n",
+                                     ret);
+               return ret;
+       }
+
        drm_panel_init(&ctx->panel);
        ctx->panel.dev = dev;
        ctx->panel.funcs = &jh057n_drm_funcs;
index 5a93c4edf1e43f837fa93829882fc805f97c0bfe..f3c0e203f40fb75badff1d2e5576a36463ccac26 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/regulator/consumer.h>
 
 #include <video/display_timing.h>
+#include <video/of_display_timing.h>
 #include <video/videomode.h>
 
 #include <drm/drm_crtc.h>
 #include <drm/drm_mipi_dsi.h>
 #include <drm/drm_panel.h>
 
+/**
+ * @modes: Pointer to array of fixed modes appropriate for this panel.  If
+ *         only one mode then this can just be the address of this the mode.
+ *         NOTE: cannot be used with "timings" and also if this is specified
+ *         then you cannot override the mode in the device tree.
+ * @num_modes: Number of elements in modes array.
+ * @timings: Pointer to array of display timings.  NOTE: cannot be used with
+ *           "modes" and also these will be used to validate a device tree
+ *           override if one is present.
+ * @num_timings: Number of elements in timings array.
+ * @bpc: Bits per color.
+ * @size: Structure containing the physical size of this panel.
+ * @delay: Structure containing various delay values for this panel.
+ * @bus_format: See MEDIA_BUS_FMT_... defines.
+ * @bus_flags: See DRM_BUS_FLAG_... defines.
+ */
 struct panel_desc {
        const struct drm_display_mode *modes;
        unsigned int num_modes;
@@ -92,6 +109,8 @@ struct panel_simple {
        struct i2c_adapter *ddc;
 
        struct gpio_desc *enable_gpio;
+
+       struct drm_display_mode override_mode;
 };
 
 static inline struct panel_simple *to_panel_simple(struct drm_panel *panel)
@@ -99,16 +118,13 @@ static inline struct panel_simple *to_panel_simple(struct drm_panel *panel)
        return container_of(panel, struct panel_simple, base);
 }
 
-static int panel_simple_get_fixed_modes(struct panel_simple *panel)
+static unsigned int panel_simple_get_timings_modes(struct panel_simple *panel)
 {
        struct drm_connector *connector = panel->base.connector;
        struct drm_device *drm = panel->base.drm;
        struct drm_display_mode *mode;
        unsigned int i, num = 0;
 
-       if (!panel->desc)
-               return 0;
-
        for (i = 0; i < panel->desc->num_timings; i++) {
                const struct display_timing *dt = &panel->desc->timings[i];
                struct videomode vm;
@@ -132,6 +148,16 @@ static int panel_simple_get_fixed_modes(struct panel_simple *panel)
                num++;
        }
 
+       return num;
+}
+
+static unsigned int panel_simple_get_display_modes(struct panel_simple *panel)
+{
+       struct drm_connector *connector = panel->base.connector;
+       struct drm_device *drm = panel->base.drm;
+       struct drm_display_mode *mode;
+       unsigned int i, num = 0;
+
        for (i = 0; i < panel->desc->num_modes; i++) {
                const struct drm_display_mode *m = &panel->desc->modes[i];
 
@@ -153,6 +179,44 @@ static int panel_simple_get_fixed_modes(struct panel_simple *panel)
                num++;
        }
 
+       return num;
+}
+
+static int panel_simple_get_non_edid_modes(struct panel_simple *panel)
+{
+       struct drm_connector *connector = panel->base.connector;
+       struct drm_device *drm = panel->base.drm;
+       struct drm_display_mode *mode;
+       bool has_override = panel->override_mode.type;
+       unsigned int num = 0;
+
+       if (!panel->desc)
+               return 0;
+
+       if (has_override) {
+               mode = drm_mode_duplicate(drm, &panel->override_mode);
+               if (mode) {
+                       drm_mode_probed_add(connector, mode);
+                       num = 1;
+               } else {
+                       dev_err(drm->dev, "failed to add override mode\n");
+               }
+       }
+
+       /* Only add timings if override was not there or failed to validate */
+       if (num == 0 && panel->desc->num_timings)
+               num = panel_simple_get_timings_modes(panel);
+
+       /*
+        * Only add fixed modes if timings/override added no mode.
+        *
+        * We should only ever have either the display timings specified
+        * or a fixed mode. Anything else is rather bogus.
+        */
+       WARN_ON(panel->desc->num_timings && panel->desc->num_modes);
+       if (num == 0)
+               num = panel_simple_get_display_modes(panel);
+
        connector->display_info.bpc = panel->desc->bpc;
        connector->display_info.width_mm = panel->desc->size.width;
        connector->display_info.height_mm = panel->desc->size.height;
@@ -269,7 +333,7 @@ static int panel_simple_get_modes(struct drm_panel *panel)
        }
 
        /* add hard-coded panel modes */
-       num += panel_simple_get_fixed_modes(p);
+       num += panel_simple_get_non_edid_modes(p);
 
        return num;
 }
@@ -300,10 +364,58 @@ static const struct drm_panel_funcs panel_simple_funcs = {
        .get_timings = panel_simple_get_timings,
 };
 
+#define PANEL_SIMPLE_BOUNDS_CHECK(to_check, bounds, field) \
+       (to_check->field.typ >= bounds->field.min && \
+        to_check->field.typ <= bounds->field.max)
+static void panel_simple_parse_panel_timing_node(struct device *dev,
+                                                struct panel_simple *panel,
+                                                const struct display_timing *ot)
+{
+       const struct panel_desc *desc = panel->desc;
+       struct videomode vm;
+       unsigned int i;
+
+       if (WARN_ON(desc->num_modes)) {
+               dev_err(dev, "Reject override mode: panel has a fixed mode\n");
+               return;
+       }
+       if (WARN_ON(!desc->num_timings)) {
+               dev_err(dev, "Reject override mode: no timings specified\n");
+               return;
+       }
+
+       for (i = 0; i < panel->desc->num_timings; i++) {
+               const struct display_timing *dt = &panel->desc->timings[i];
+
+               if (!PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, hactive) ||
+                   !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, hfront_porch) ||
+                   !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, hback_porch) ||
+                   !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, hsync_len) ||
+                   !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, vactive) ||
+                   !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, vfront_porch) ||
+                   !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, vback_porch) ||
+                   !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, vsync_len))
+                       continue;
+
+               if (ot->flags != dt->flags)
+                       continue;
+
+               videomode_from_timing(ot, &vm);
+               drm_display_mode_from_videomode(&vm, &panel->override_mode);
+               panel->override_mode.type |= DRM_MODE_TYPE_DRIVER |
+                                            DRM_MODE_TYPE_PREFERRED;
+               break;
+       }
+
+       if (WARN_ON(!panel->override_mode.type))
+               dev_err(dev, "Reject override mode: No display_timing found\n");
+}
+
 static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
 {
        struct device_node *backlight, *ddc;
        struct panel_simple *panel;
+       struct display_timing dt;
        int err;
 
        panel = devm_kzalloc(dev, sizeof(*panel), GFP_KERNEL);
@@ -349,6 +461,9 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
                }
        }
 
+       if (!of_get_display_timing(dev->of_node, "panel-timing", &dt))
+               panel_simple_parse_panel_timing_node(dev, panel, &dt);
+
        drm_panel_init(&panel->base);
        panel->base.dev = dev;
        panel->base.funcs = &panel_simple_funcs;
@@ -496,22 +611,21 @@ static const struct panel_desc auo_b101aw03 = {
        },
 };
 
-static const struct drm_display_mode auo_b101ean01_mode = {
-       .clock = 72500,
-       .hdisplay = 1280,
-       .hsync_start = 1280 + 119,
-       .hsync_end = 1280 + 119 + 32,
-       .htotal = 1280 + 119 + 32 + 21,
-       .vdisplay = 800,
-       .vsync_start = 800 + 4,
-       .vsync_end = 800 + 4 + 20,
-       .vtotal = 800 + 4 + 20 + 8,
-       .vrefresh = 60,
+static const struct display_timing auo_b101ean01_timing = {
+       .pixelclock = { 65300000, 72500000, 75000000 },
+       .hactive = { 1280, 1280, 1280 },
+       .hfront_porch = { 18, 119, 119 },
+       .hback_porch = { 21, 21, 21 },
+       .hsync_len = { 32, 32, 32 },
+       .vactive = { 800, 800, 800 },
+       .vfront_porch = { 4, 4, 4 },
+       .vback_porch = { 8, 8, 8 },
+       .vsync_len = { 18, 20, 20 },
 };
 
 static const struct panel_desc auo_b101ean01 = {
-       .modes = &auo_b101ean01_mode,
-       .num_modes = 1,
+       .timings = &auo_b101ean01_timing,
+       .num_timings = 1,
        .bpc = 6,
        .size = {
                .width = 217,
@@ -724,9 +838,9 @@ static const struct panel_desc auo_g133han01 = {
 static const struct display_timing auo_g185han01_timings = {
        .pixelclock = { 120000000, 144000000, 175000000 },
        .hactive = { 1920, 1920, 1920 },
-       .hfront_porch = { 18, 60, 74 },
-       .hback_porch = { 12, 44, 54 },
-       .hsync_len = { 10, 24, 32 },
+       .hfront_porch = { 36, 120, 148 },
+       .hback_porch = { 24, 88, 108 },
+       .hsync_len = { 20, 48, 64 },
        .vactive = { 1080, 1080, 1080 },
        .vfront_porch = { 6, 10, 40 },
        .vback_porch = { 2, 5, 20 },
@@ -1335,6 +1449,31 @@ static const struct panel_desc giantplus_gpg482739qs5 = {
        .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
 };
 
+static const struct display_timing giantplus_gpm940b0_timing = {
+       .pixelclock = { 13500000, 27000000, 27500000 },
+       .hactive = { 320, 320, 320 },
+       .hfront_porch = { 14, 686, 718 },
+       .hback_porch = { 50, 70, 255 },
+       .hsync_len = { 1, 1, 1 },
+       .vactive = { 240, 240, 240 },
+       .vfront_porch = { 1, 1, 179 },
+       .vback_porch = { 1, 21, 31 },
+       .vsync_len = { 1, 1, 6 },
+       .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW,
+};
+
+static const struct panel_desc giantplus_gpm940b0 = {
+       .timings = &giantplus_gpm940b0_timing,
+       .num_timings = 1,
+       .bpc = 8,
+       .size = {
+               .width = 60,
+               .height = 45,
+       },
+       .bus_format = MEDIA_BUS_FMT_RGB888_3X8,
+       .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_NEGEDGE,
+};
+
 static const struct display_timing hannstar_hsd070pww1_timing = {
        .pixelclock = { 64300000, 71100000, 82000000 },
        .hactive = { 1280, 1280, 1280 },
@@ -1578,23 +1717,32 @@ static const struct panel_desc innolux_g121x1_l03 = {
        },
 };
 
-static const struct drm_display_mode innolux_n116bge_mode = {
-       .clock = 76420,
-       .hdisplay = 1366,
-       .hsync_start = 1366 + 136,
-       .hsync_end = 1366 + 136 + 30,
-       .htotal = 1366 + 136 + 30 + 60,
-       .vdisplay = 768,
-       .vsync_start = 768 + 8,
-       .vsync_end = 768 + 8 + 12,
-       .vtotal = 768 + 8 + 12 + 12,
-       .vrefresh = 60,
-       .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
+/*
+ * Datasheet specifies that at 60 Hz refresh rate:
+ * - total horizontal time: { 1506, 1592, 1716 }
+ * - total vertical time: { 788, 800, 868 }
+ *
+ * ...but doesn't go into exactly how that should be split into a front
+ * porch, back porch, or sync length.  For now we'll leave a single setting
+ * here which allows a bit of tweaking of the pixel clock at the expense of
+ * refresh rate.
+ */
+static const struct display_timing innolux_n116bge_timing = {
+       .pixelclock = { 72600000, 76420000, 80240000 },
+       .hactive = { 1366, 1366, 1366 },
+       .hfront_porch = { 136, 136, 136 },
+       .hback_porch = { 60, 60, 60 },
+       .hsync_len = { 30, 30, 30 },
+       .vactive = { 768, 768, 768 },
+       .vfront_porch = { 8, 8, 8 },
+       .vback_porch = { 12, 12, 12 },
+       .vsync_len = { 12, 12, 12 },
+       .flags = DISPLAY_FLAGS_VSYNC_LOW | DISPLAY_FLAGS_HSYNC_LOW,
 };
 
 static const struct panel_desc innolux_n116bge = {
-       .modes = &innolux_n116bge_mode,
-       .num_modes = 1,
+       .timings = &innolux_n116bge_timing,
+       .num_timings = 1,
        .bpc = 6,
        .size = {
                .width = 256,
@@ -2157,6 +2305,33 @@ static const struct panel_desc ontat_yx700wv03 = {
        .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
 };
 
+static const struct drm_display_mode ortustech_com37h3m_mode  = {
+       .clock = 22153,
+       .hdisplay = 480,
+       .hsync_start = 480 + 8,
+       .hsync_end = 480 + 8 + 10,
+       .htotal = 480 + 8 + 10 + 10,
+       .vdisplay = 640,
+       .vsync_start = 640 + 4,
+       .vsync_end = 640 + 4 + 3,
+       .vtotal = 640 + 4 + 3 + 4,
+       .vrefresh = 60,
+       .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
+};
+
+static const struct panel_desc ortustech_com37h3m = {
+       .modes = &ortustech_com37h3m_mode,
+       .num_modes = 1,
+       .bpc = 8,
+       .size = {
+               .width = 56,    /* 56.16mm */
+               .height = 75,   /* 74.88mm */
+       },
+       .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
+       .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_POSEDGE |
+                    DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE,
+};
+
 static const struct drm_display_mode ortustech_com43h4m85ulc_mode  = {
        .clock = 25000,
        .hdisplay = 480,
@@ -2354,6 +2529,33 @@ static const struct panel_desc samsung_ltn140at29_301 = {
        },
 };
 
+static const struct drm_display_mode sharp_lq070y3dg3b_mode = {
+       .clock = 33260,
+       .hdisplay = 800,
+       .hsync_start = 800 + 64,
+       .hsync_end = 800 + 64 + 128,
+       .htotal = 800 + 64 + 128 + 64,
+       .vdisplay = 480,
+       .vsync_start = 480 + 8,
+       .vsync_end = 480 + 8 + 2,
+       .vtotal = 480 + 8 + 2 + 35,
+       .vrefresh = 60,
+       .flags = DISPLAY_FLAGS_PIXDATA_POSEDGE,
+};
+
+static const struct panel_desc sharp_lq070y3dg3b = {
+       .modes = &sharp_lq070y3dg3b_mode,
+       .num_modes = 1,
+       .bpc = 8,
+       .size = {
+               .width = 152,   /* 152.4mm */
+               .height = 91,   /* 91.4mm */
+       },
+       .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
+       .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_POSEDGE |
+                    DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE,
+};
+
 static const struct drm_display_mode sharp_lq035q7db03_mode = {
        .clock = 5500,
        .hdisplay = 240,
@@ -2454,6 +2656,33 @@ static const struct panel_desc sharp_lq150x1lg11 = {
        .bus_format = MEDIA_BUS_FMT_RGB565_1X16,
 };
 
+static const struct display_timing sharp_ls020b1dd01d_timing = {
+       .pixelclock = { 2000000, 4200000, 5000000 },
+       .hactive = { 240, 240, 240 },
+       .hfront_porch = { 66, 66, 66 },
+       .hback_porch = { 1, 1, 1 },
+       .hsync_len = { 1, 1, 1 },
+       .vactive = { 160, 160, 160 },
+       .vfront_porch = { 52, 52, 52 },
+       .vback_porch = { 6, 6, 6 },
+       .vsync_len = { 10, 10, 10 },
+       .flags = DISPLAY_FLAGS_HSYNC_HIGH | DISPLAY_FLAGS_VSYNC_LOW,
+};
+
+static const struct panel_desc sharp_ls020b1dd01d = {
+       .timings = &sharp_ls020b1dd01d_timing,
+       .num_timings = 1,
+       .bpc = 6,
+       .size = {
+               .width = 42,
+               .height = 28,
+       },
+       .bus_format = MEDIA_BUS_FMT_RGB565_1X16,
+       .bus_flags = DRM_BUS_FLAG_DE_HIGH
+                  | DRM_BUS_FLAG_PIXDATA_NEGEDGE
+                  | DRM_BUS_FLAG_SHARP_SIGNALS,
+};
+
 static const struct drm_display_mode shelly_sca07010_bfn_lnn_mode = {
        .clock = 33300,
        .hdisplay = 800,
@@ -2882,6 +3111,9 @@ static const struct of_device_id platform_of_match[] = {
        }, {
                .compatible = "giantplus,gpg482739qs5",
                .data = &giantplus_gpg482739qs5
+       }, {
+               .compatible = "giantplus,gpm940b0",
+               .data = &giantplus_gpm940b0,
        }, {
                .compatible = "hannstar,hsd070pww1",
                .data = &hannstar_hsd070pww1,
@@ -2978,6 +3210,12 @@ static const struct of_device_id platform_of_match[] = {
        }, {
                .compatible = "ontat,yx700wv03",
                .data = &ontat_yx700wv03,
+       }, {
+               .compatible = "ortustech,com37h3m05dtc",
+               .data = &ortustech_com37h3m,
+       }, {
+               .compatible = "ortustech,com37h3m99dtc",
+               .data = &ortustech_com37h3m,
        }, {
                .compatible = "ortustech,com43h4m85ulc",
                .data = &ortustech_com43h4m85ulc,
@@ -3005,6 +3243,9 @@ static const struct of_device_id platform_of_match[] = {
        }, {
                .compatible = "sharp,lq035q7db03",
                .data = &sharp_lq035q7db03,
+       }, {
+               .compatible = "sharp,lq070y3dg3b",
+               .data = &sharp_lq070y3dg3b,
        }, {
                .compatible = "sharp,lq101k1ly04",
                .data = &sharp_lq101k1ly04,
@@ -3014,6 +3255,9 @@ static const struct of_device_id platform_of_match[] = {
        }, {
                .compatible = "sharp,lq150x1lg11",
                .data = &sharp_lq150x1lg11,
+       }, {
+               .compatible = "sharp,ls020b1dd01d",
+               .data = &sharp_ls020b1dd01d,
        }, {
                .compatible = "shelly,sca07010-bfn-lnn",
                .data = &shelly_sca07010_bfn_lnn,
index 85b4b51b6a0d2cc5fe55dd31d61f7b597e840cb1..cb43ff4ebf4a2f778f4850744d52af6b3e8ce0d0 100644 (file)
@@ -357,8 +357,7 @@ static const struct drm_ioctl_desc panfrost_drm_driver_ioctls[] = {
 DEFINE_DRM_GEM_SHMEM_FOPS(panfrost_drm_driver_fops);
 
 static struct drm_driver panfrost_drm_driver = {
-       .driver_features        = DRIVER_RENDER | DRIVER_GEM | DRIVER_PRIME |
-                                 DRIVER_SYNCOBJ,
+       .driver_features        = DRIVER_RENDER | DRIVER_GEM | DRIVER_SYNCOBJ,
        .open                   = panfrost_open,
        .postclose              = panfrost_postclose,
        .ioctls                 = panfrost_drm_driver_ioctls,
index b46416be5a546cb02458382224f0383c533a46b6..543ab1b81bd5cfdc474c22ed618531adeb492cff 100644 (file)
@@ -92,8 +92,6 @@ panfrost_gem_prime_import_sg_table(struct drm_device *dev,
 
        pobj = to_panfrost_bo(obj);
 
-       obj->resv = attach->dmabuf->resv;
-
        panfrost_mmu_map(pobj);
 
        return obj;
index 8d6a40469f0b9fdc8a42791f8d8b2457bfe5c17f..3c8e820168543755698bbbbdae7cbee634177dd1 100644 (file)
@@ -5,8 +5,10 @@
 
 #include <linux/amba/clcd-regs.h>
 #include <linux/seq_file.h>
+
 #include <drm/drm_debugfs.h>
-#include <drm/drmP.h>
+#include <drm/drm_file.h>
+
 #include "pl111_drm.h"
 
 #define REGDEF(reg) { reg, #reg }
index 15d2755fdba472752eb4ace7e271a8e26fdb1182..a246195dc606f2d784140c422167a1313a659c4b 100644 (file)
 
 #include <linux/amba/clcd-regs.h>
 #include <linux/clk.h>
+#include <linux/delay.h>
 #include <linux/version.h>
 #include <linux/dma-buf.h>
 #include <linux/of_graph.h>
 
-#include <drm/drmP.h>
+#include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
-#include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_vblank.h>
 
 #include "pl111_drm.h"
 
index b2c5e9f34051f7a8bf1b4e58e94dc45def536bcd..77d2da9a8a7ca829e1672aa386f08e9fb0a4ef18 100644 (file)
 #ifndef _PL111_DRM_H_
 #define _PL111_DRM_H_
 
-#include <drm/drm_gem.h>
-#include <drm/drm_simple_kms_helper.h>
+#include <linux/clk-provider.h>
+#include <linux/interrupt.h>
+
+#include <drm/drm_bridge.h>
 #include <drm/drm_connector.h>
 #include <drm/drm_encoder.h>
+#include <drm/drm_gem.h>
 #include <drm/drm_panel.h>
-#include <drm/drm_bridge.h>
-#include <linux/clk-provider.h>
-#include <linux/interrupt.h>
+#include <drm/drm_simple_kms_helper.h>
 
 #define CLCD_IRQ_NEXTBASE_UPDATE BIT(2)
 
index 01f8462aa2db47794de599e4399b08f36bcb0bc8..276b53473a84eb8c6f2e3c33fae00a5deb307196 100644 (file)
 
 #include <linux/amba/bus.h>
 #include <linux/amba/clcd-regs.h>
-#include <linux/version.h>
-#include <linux/shmem_fs.h>
 #include <linux/dma-buf.h>
 #include <linux/module.h>
-#include <linux/slab.h>
 #include <linux/of.h>
 #include <linux/of_graph.h>
 #include <linux/of_reserved_mem.h>
+#include <linux/shmem_fs.h>
+#include <linux/slab.h>
+#include <linux/version.h>
 
-#include <drm/drmP.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_gem_cma_helper.h>
@@ -67,6 +67,7 @@
 #include <drm/drm_of.h>
 #include <drm/drm_panel.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
 
 #include "pl111_drm.h"
 #include "pl111_versatile.h"
@@ -224,7 +225,7 @@ DEFINE_DRM_GEM_CMA_FOPS(drm_fops);
 
 static struct drm_driver pl111_drm_driver = {
        .driver_features =
-               DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME | DRIVER_ATOMIC,
+               DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
        .ioctls = NULL,
        .fops = &drm_fops,
        .name = "pl111",
@@ -238,9 +239,7 @@ static struct drm_driver pl111_drm_driver = {
        .gem_vm_ops = &drm_gem_cma_vm_ops,
        .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
-       .gem_prime_import = drm_gem_prime_import,
        .gem_prime_import_sg_table = pl111_gem_import_sg_table,
-       .gem_prime_export = drm_gem_prime_export,
        .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
        .gem_prime_mmap = drm_gem_cma_prime_mmap,
        .gem_prime_vmap = drm_gem_cma_prime_vmap,
index 19d663d4635331378e25e921ac3297cfe654d3e3..47ccf5c839fc2239c46cc07b96f905115f25d5b6 100644 (file)
@@ -1,10 +1,11 @@
 // SPDX-License-Identifier: GPL-2.0+
-#include <linux/device.h>
 
 #ifndef PL111_NOMADIK_H
 #define PL111_NOMADIK_H
 #endif
 
+struct device;
+
 #ifdef CONFIG_ARCH_NOMADIK
 
 void pl111_nomadik_init(struct device *dev);
index 38f4ee05285e92d37d185d02bccc984b11faee1c..09aeaffb76609d2c950b18a13f40043fb56f5eb8 100644 (file)
@@ -1,13 +1,14 @@
 // SPDX-License-Identifier: GPL-2.0-only
+
 #include <linux/amba/clcd-regs.h>
+#include <linux/bitops.h>
 #include <linux/device.h>
+#include <linux/mfd/syscon.h>
+#include <linux/module.h>
 #include <linux/of.h>
 #include <linux/of_platform.h>
 #include <linux/regmap.h>
-#include <linux/mfd/syscon.h>
-#include <linux/bitops.h>
-#include <linux/module.h>
-#include <drm/drmP.h>
+
 #include "pl111_versatile.h"
 #include "pl111_vexpress.h"
 #include "pl111_drm.h"
index 41aa6d969dc6baf6d1403b1c5a87e267f67cd0cf..143877010042ed77aa348ec310e36a5d19e02b2e 100644 (file)
@@ -4,6 +4,9 @@
 #ifndef PL111_VERSATILE_H
 #define PL111_VERSATILE_H
 
+struct device;
+struct pl111_drm_dev_private;
+
 int pl111_versatile_init(struct device *dev, struct pl111_drm_dev_private *priv);
 
 #endif
index 38c938c9addaf72f86853feb307d2cd62938dd1d..350570fe06b5f39664d8fd38c9f37e1fac051b3e 100644 (file)
@@ -51,6 +51,7 @@ int pl111_vexpress_clcd_init(struct device *dev,
                }
                if (of_device_is_compatible(child, "arm,hdlcd")) {
                        has_coretile_hdlcd = true;
+                       of_node_put(child);
                        break;
                }
        }
index 0a2e51af123089c50504cf1692cd588e0ba41b89..ac1081f55b518fe1757f245ecb519ffc6fdd8ca8 100644 (file)
@@ -25,6 +25,8 @@
 
 /* QXL cmd/ring handling */
 
+#include <linux/delay.h>
+
 #include <drm/drm_util.h>
 
 #include "qxl_drv.h"
index 1184225498284daf2add397c54398a95860c9807..a85ec100b0cc25bc3cda30de00f9c46595bfbd91 100644 (file)
@@ -28,9 +28,9 @@
  *  Alon Levy <alevy@redhat.com>
  */
 
-#include <linux/debugfs.h>
+#include <drm/drm_debugfs.h>
+#include <drm/drm_file.h>
 
-#include <drm/drmP.h>
 #include "qxl_drv.h"
 #include "qxl_object.h"
 
index 8b319ebbb0fb6f69d989e8696b2765a7e7b83363..023fb5a69af1def62068b6451d28b6b22620f088 100644 (file)
  */
 
 #include <linux/crc32.h>
+#include <linux/delay.h>
+
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
 
 #include "qxl_drv.h"
 #include "qxl_object.h"
index 97c3f1a95a320bc5529000ad0bbfa8a0b6a69635..5bebf1ea1c5d0c5b59b1cb3579dc62f93dba0cef 100644 (file)
@@ -20,6 +20,8 @@
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
+#include <drm/drm_fourcc.h>
+
 #include "qxl_drv.h"
 #include "qxl_object.h"
 
index f33e349c4ec5b4f48db8edd7b69d11f0e4a3c83a..b57a37543613ad7bdcaeed87aba795bf1399aabe 100644 (file)
  *    Alon Levy <alevy@redhat.com>
  */
 
-#include <linux/module.h>
+#include "qxl_drv.h"
 #include <linux/console.h>
+#include <linux/module.h>
+#include <linux/pci.h>
 
-#include <drm/drmP.h>
 #include <drm/drm.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_file.h>
 #include <drm/drm_modeset_helper.h>
+#include <drm/drm_prime.h>
 #include <drm/drm_probe_helper.h>
-#include "qxl_drv.h"
+
 #include "qxl_object.h"
 
 static const struct pci_device_id pciidlist[] = {
@@ -247,8 +251,7 @@ static struct pci_driver qxl_pci_driver = {
 };
 
 static struct drm_driver qxl_driver = {
-       .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME |
-                          DRIVER_ATOMIC,
+       .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 
        .dumb_create = qxl_mode_dumb_create,
        .dumb_map_offset = qxl_mode_dumb_mmap,
@@ -257,8 +260,6 @@ static struct drm_driver qxl_driver = {
 #endif
        .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
-       .gem_prime_export = drm_gem_prime_export,
-       .gem_prime_import = drm_gem_prime_import,
        .gem_prime_pin = qxl_gem_prime_pin,
        .gem_prime_unpin = qxl_gem_prime_unpin,
        .gem_prime_get_sg_table = qxl_gem_prime_get_sg_table,
index 2896bb6fdbf4c929be54143bb5cc5d4cd9a1cb3c..ae82e5fab09c4633b674212483dfbaa67c3fc190 100644 (file)
  */
 
 #include <linux/dma-fence.h>
-#include <linux/workqueue.h>
 #include <linux/firmware.h>
 #include <linux/platform_device.h>
+#include <linux/workqueue.h>
 
 #include <drm/drm_crtc.h>
 #include <drm/drm_encoder.h>
 #include <drm/drm_fb_helper.h>
+#include <drm/drm_ioctl.h>
 #include <drm/drm_gem.h>
-#include <drm/drmP.h>
+#include <drm/qxl_drm.h>
 #include <drm/ttm/ttm_bo_api.h>
 #include <drm/ttm/ttm_bo_driver.h>
-/* just for ttm_validate_buffer */
 #include <drm/ttm/ttm_execbuf_util.h>
 #include <drm/ttm/ttm_module.h>
 #include <drm/ttm/ttm_placement.h>
-#include <drm/qxl_drm.h>
 
 #include "qxl_dev.h"
 
index 89606c819d82095bff00fc4804c01924831e93c8..89e4f9a7249cb20fb8f549fbe7f030d29fac2a96 100644 (file)
@@ -23,7 +23,6 @@
  *          Alon Levy
  */
 
-#include <drm/drmP.h>
 #include <drm/drm.h>
 
 #include "qxl_drv.h"
index d410e29251629d494efe0e14a525be6e26573da6..8117a45b36102192b3acd09e269faedfb06dc146 100644 (file)
@@ -23,6 +23,9 @@
  *          Alon Levy
  */
 
+#include <linux/pci.h>
+#include <linux/uaccess.h>
+
 #include "qxl_drv.h"
 #include "qxl_object.h"
 
index 3bb31add63504a33a25a254d3449406412d4af2a..8435af108632c8a7a4ba04c472072f4a5ac486ca 100644 (file)
  *          Alon Levy
  */
 
+#include <linux/pci.h>
+
+#include <drm/drm_irq.h>
+
 #include "qxl_drv.h"
 
 irqreturn_t qxl_irq_handler(int irq, void *arg)
index bee61fa2c9bcb33f2d6166d1f5bf6aea22b38830..611cbe7aee6906958716de2d014dfb5ab8bc1b90 100644 (file)
  *          Alon Levy
  */
 
-#include "qxl_drv.h"
-#include "qxl_object.h"
+#include <linux/io-mapping.h>
+#include <linux/pci.h>
 
+#include <drm/drm_drv.h>
 #include <drm/drm_probe_helper.h>
-#include <linux/io-mapping.h>
+
+#include "qxl_drv.h"
+#include "qxl_object.h"
 
 int qxl_log_level;
 
index 49f9a9385393a3c51de9c07f4e881427196da844..b805bfa87b68c0ce204915d3f1edb1cb86f38572 100644 (file)
  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
+
+#include <linux/delay.h>
+
+#include <trace/events/dma_fence.h>
+
 #include "qxl_drv.h"
 #include "qxl_object.h"
-#include <trace/events/dma_fence.h>
 
 /*
  * drawable cmd cache - allocate a bunch of VRAM pages, suballocate
index 0234f8556adafa92dc5aa7f5294d918bdb9a714a..663e59fd1e8c3474bbff57819cc32e44fc14e766 100644 (file)
  *          Alon Levy
  */
 
+#include <linux/delay.h>
+
+#include <drm/drm.h>
+#include <drm/drm_file.h>
+#include <drm/drm_debugfs.h>
+#include <drm/qxl_drm.h>
 #include <drm/ttm/ttm_bo_api.h>
 #include <drm/ttm/ttm_bo_driver.h>
-#include <drm/ttm/ttm_placement.h>
-#include <drm/ttm/ttm_page_alloc.h>
 #include <drm/ttm/ttm_module.h>
-#include <drm/drmP.h>
-#include <drm/drm.h>
-#include <drm/qxl_drm.h>
+#include <drm/ttm/ttm_page_alloc.h>
+#include <drm/ttm/ttm_placement.h>
+
 #include "qxl_drv.h"
 #include "qxl_object.h"
 
-#include <linux/delay.h>
-
 static struct qxl_device *qxl_get_qdev(struct ttm_bo_device *bdev)
 {
        struct qxl_mman *mman;
index 6589f9e0310e9846202663fb446c0b7190c514b4..6ac71755c22ddf7d467dbdacfcc05c274e2afeb2 100644 (file)
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
+
 #include <linux/compat.h>
 
-#include <drm/drmP.h>
 #include <drm/r128_drm.h>
+
 #include "r128_drv.h"
 
 typedef struct drm_r128_init32 {
index 9730f4918944db8b3147bf2c85144bb310b0b5c6..d84e9c96e20abb3e36a8f3fd23e2aefb10cb4400 100644 (file)
  *    Eric Anholt <anholt@FreeBSD.org>
  */
 
-#include <drm/drmP.h>
+#include <drm/drm_device.h>
+#include <drm/drm_print.h>
+#include <drm/drm_vblank.h>
 #include <drm/r128_drm.h>
+
 #include "r128_drv.h"
 
 u32 r128_get_vblank_counter(struct drm_device *dev, unsigned int pipe)
index a6cbe11f79c6119507dc1de307b6280ef637cc7d..4403e76e1ae0c506eb6e186c1636e7c432c6db7d 100644 (file)
@@ -130,8 +130,7 @@ int radeon_gem_object_open(struct drm_gem_object *obj,
                                struct drm_file *file_priv);
 void radeon_gem_object_close(struct drm_gem_object *obj,
                                struct drm_file *file_priv);
-struct dma_buf *radeon_gem_prime_export(struct drm_device *dev,
-                                       struct drm_gem_object *gobj,
+struct dma_buf *radeon_gem_prime_export(struct drm_gem_object *gobj,
                                        int flags);
 extern int radeon_get_crtc_scanoutpos(struct drm_device *dev, unsigned int crtc,
                                      unsigned int flags, int *vpos, int *hpos,
@@ -539,7 +538,7 @@ radeon_get_crtc_scanout_position(struct drm_device *dev, unsigned int pipe,
 
 static struct drm_driver kms_driver = {
        .driver_features =
-           DRIVER_USE_AGP | DRIVER_GEM | DRIVER_PRIME | DRIVER_RENDER,
+           DRIVER_USE_AGP | DRIVER_GEM | DRIVER_RENDER,
        .load = radeon_driver_load_kms,
        .open = radeon_driver_open_kms,
        .postclose = radeon_driver_postclose_kms,
@@ -565,7 +564,6 @@ static struct drm_driver kms_driver = {
        .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
        .gem_prime_export = radeon_gem_prime_export,
-       .gem_prime_import = drm_gem_prime_import,
        .gem_prime_pin = radeon_gem_prime_pin,
        .gem_prime_unpin = radeon_gem_prime_unpin,
        .gem_prime_res_obj = radeon_gem_prime_res_obj,
index d3a5bea9a2c5ebfd1a132d62c2d8a2c5a1d45ee5..deaffce50a2eff5a2b23f45d4e2ec1643bea10a5 100644 (file)
@@ -124,12 +124,11 @@ struct reservation_object *radeon_gem_prime_res_obj(struct drm_gem_object *obj)
        return bo->tbo.resv;
 }
 
-struct dma_buf *radeon_gem_prime_export(struct drm_device *dev,
-                                       struct drm_gem_object *gobj,
+struct dma_buf *radeon_gem_prime_export(struct drm_gem_object *gobj,
                                        int flags)
 {
        struct radeon_bo *bo = gem_to_radeon_bo(gobj);
        if (radeon_ttm_tt_has_userptr(bo->tbo.ttm))
                return ERR_PTR(-EPERM);
-       return drm_gem_prime_export(dev, gobj, flags);
+       return drm_gem_prime_export(gobj, flags);
 }
index 6df37c2a96787de1b2205fdd53aabb1e17139b60..9c93eb4fad8b4f0278f6aa383801af91cb1dd374 100644 (file)
@@ -441,14 +441,11 @@ MODULE_DEVICE_TABLE(of, rcar_du_of_table);
 DEFINE_DRM_GEM_CMA_FOPS(rcar_du_fops);
 
 static struct drm_driver rcar_du_driver = {
-       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME
-                               | DRIVER_ATOMIC,
+       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
        .gem_free_object_unlocked = drm_gem_cma_free_object,
        .gem_vm_ops             = &drm_gem_cma_vm_ops,
        .prime_handle_to_fd     = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle     = drm_gem_prime_fd_to_handle,
-       .gem_prime_import       = drm_gem_prime_import,
-       .gem_prime_export       = drm_gem_prime_export,
        .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
        .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
        .gem_prime_vmap         = drm_gem_cma_prime_vmap,
index 95e5c517a15f766132981eebc148f488e13a4074..bd99bc948ea52c268961d70209f412bfbf4fc6ad 100644 (file)
 #include <linux/reset.h>
 #include <linux/clk.h>
 
-#include <drm/drmP.h>
-#include <drm/drm_dp_helper.h>
-#include <drm/drm_of.h>
-#include <drm/drm_panel.h>
-#include <drm/drm_probe_helper.h>
-
 #include <video/of_videomode.h>
 #include <video/videomode.h>
 
 #include <drm/bridge/analogix_dp.h>
+#include <drm/drm_dp_helper.h>
+#include <drm/drm_of.h>
+#include <drm/drm_panel.h>
+#include <drm/drm_probe_helper.h>
 
 #include "rockchip_drm_drv.h"
 #include "rockchip_drm_psr.h"
index 8c32c32be85c122a00da2a3cf2865d663393c6b0..d505ea7d5384f12574a3f283a0e78480bc080b67 100644 (file)
@@ -4,24 +4,23 @@
  * Author: Chris Zhong <zyw@rock-chips.com>
  */
 
-#include <drm/drmP.h>
-#include <drm/drm_atomic_helper.h>
-#include <drm/drm_dp_helper.h>
-#include <drm/drm_edid.h>
-#include <drm/drm_of.h>
-#include <drm/drm_probe_helper.h>
-
 #include <linux/clk.h>
 #include <linux/component.h>
 #include <linux/extcon.h>
 #include <linux/firmware.h>
-#include <linux/regmap.h>
-#include <linux/reset.h>
 #include <linux/mfd/syscon.h>
 #include <linux/phy/phy.h>
+#include <linux/regmap.h>
+#include <linux/reset.h>
 
 #include <sound/hdmi-codec.h>
 
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_dp_helper.h>
+#include <drm/drm_edid.h>
+#include <drm/drm_of.h>
+#include <drm/drm_probe_helper.h>
+
 #include "cdn-dp-core.h"
 #include "cdn-dp-reg.h"
 #include "rockchip_drm_vop.h"
index f18a01e6cbc2082d865211e482f731fbf10a8646..b85ea89eb60bbb0644de048e76443d4fa36dd643 100644 (file)
@@ -7,10 +7,10 @@
 #ifndef _CDN_DP_CORE_H
 #define _CDN_DP_CORE_H
 
-#include <drm/drmP.h>
 #include <drm/drm_dp_helper.h>
 #include <drm/drm_panel.h>
 #include <drm/drm_probe_helper.h>
+
 #include "rockchip_drm_drv.h"
 
 #define MAX_PHY                2
index ef8486e5e2cd121681a0710e4b5b41e06f24bd50..bc073ec5c183996e89a5021f4ad0ea10c270d94e 100644 (file)
@@ -6,10 +6,6 @@
  *      Nickey Yang <nickey.yang@rock-chips.com>
  */
 
-#include <drm/drmP.h>
-#include <drm/drm_mipi_dsi.h>
-#include <drm/bridge/dw_mipi_dsi.h>
-#include <drm/drm_of.h>
 #include <linux/clk.h>
 #include <linux/iopoll.h>
 #include <linux/math64.h>
 #include <linux/of_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/regmap.h>
+
 #include <video/mipi_display.h>
 
+#include <drm/bridge/dw_mipi_dsi.h>
+#include <drm/drm_mipi_dsi.h>
+#include <drm/drm_of.h>
+
 #include "rockchip_drm_drv.h"
 #include "rockchip_drm_vop.h"
 
index cdc304d4cd02b1edcfd310e19da12b5b150f0b2f..906891b03a38df70b33fdb8c4c026d63964febe7 100644 (file)
 #include <linux/phy/phy.h>
 #include <linux/regmap.h>
 
-#include <drm/drm_of.h>
-#include <drm/drmP.h>
+#include <drm/bridge/dw_hdmi.h>
 #include <drm/drm_edid.h>
+#include <drm/drm_of.h>
 #include <drm/drm_probe_helper.h>
-#include <drm/bridge/dw_hdmi.h>
 
 #include "rockchip_drm_drv.h"
 #include "rockchip_drm_vop.h"
index f8ca98d294d0e1e4b97f7f2efcef084b76f96cae..ed344a795b4d9aafce59d82f57cd8b12d39488e7 100644 (file)
 #include <linux/mutex.h>
 #include <linux/of_device.h>
 
-#include <drm/drm_of.h>
-#include <drm/drmP.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_edid.h>
+#include <drm/drm_of.h>
 #include <drm/drm_probe_helper.h>
 
 #include "rockchip_drm_drv.h"
index 53d2c5bd61dcd1545d87153d1f1e9f92429ddf1d..30c177eb3022a57b55f139811325d9738c4f43a1 100644 (file)
@@ -6,11 +6,6 @@
  * based on exynos_drm_drv.c
  */
 
-#include <drm/drmP.h>
-#include <drm/drm_fb_helper.h>
-#include <drm/drm_gem_cma_helper.h>
-#include <drm/drm_of.h>
-#include <drm/drm_probe_helper.h>
 #include <linux/dma-mapping.h>
 #include <linux/dma-iommu.h>
 #include <linux/pm_runtime.h>
 #include <linux/console.h>
 #include <linux/iommu.h>
 
+#include <drm/drm_drv.h>
+#include <drm/drm_fb_helper.h>
+#include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_of.h>
+#include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
+
 #include "rockchip_drm_drv.h"
 #include "rockchip_drm_fb.h"
 #include "rockchip_drm_fbdev.h"
@@ -212,16 +214,13 @@ static const struct file_operations rockchip_drm_driver_fops = {
 };
 
 static struct drm_driver rockchip_drm_driver = {
-       .driver_features        = DRIVER_MODESET | DRIVER_GEM |
-                                 DRIVER_PRIME | DRIVER_ATOMIC,
+       .driver_features        = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
        .lastclose              = drm_fb_helper_lastclose,
        .gem_vm_ops             = &drm_gem_cma_vm_ops,
        .gem_free_object_unlocked = rockchip_gem_free_object,
        .dumb_create            = rockchip_gem_dumb_create,
        .prime_handle_to_fd     = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle     = drm_gem_prime_fd_to_handle,
-       .gem_prime_import       = drm_gem_prime_import,
-       .gem_prime_export       = drm_gem_prime_export,
        .gem_prime_get_sg_table = rockchip_gem_prime_get_sg_table,
        .gem_prime_import_sg_table      = rockchip_gem_prime_import_sg_table,
        .gem_prime_vmap         = rockchip_gem_prime_vmap,
index 64ca87cf6d50a0193fbeb3b6bd5d53ec6e89c7f3..1907e894649c1e00b71ebb7692b34bbce17cd161 100644 (file)
@@ -5,11 +5,12 @@
  */
 
 #include <linux/kernel.h>
+
 #include <drm/drm.h>
-#include <drm/drmP.h>
 #include <drm/drm_atomic.h>
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_fb_helper.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_probe_helper.h>
 
index bb8ac18298f697bcfbe82826d1d8f164a4d52fd2..02be6c5ff8573301a6fc87676a6d2ddb5dd68f26 100644 (file)
@@ -5,8 +5,8 @@
  */
 
 #include <drm/drm.h>
-#include <drm/drmP.h>
 #include <drm/drm_fb_helper.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_probe_helper.h>
 
 #include "rockchip_drm_drv.h"
index ba9e77acbe162d9072d5ac561f4b4e318ebd91f9..291e89b4045f341a7c0626f041ce20bf677da31d 100644 (file)
@@ -4,14 +4,14 @@
  * Author:Mark Yao <mark.yao@rock-chips.com>
  */
 
+#include <linux/dma-buf.h>
+#include <linux/iommu.h>
+
 #include <drm/drm.h>
-#include <drm/drmP.h>
 #include <drm/drm_gem.h>
+#include <drm/drm_prime.h>
 #include <drm/drm_vma_manager.h>
 
-#include <linux/dma-buf.h>
-#include <linux/iommu.h>
-
 #include "rockchip_drm_drv.h"
 #include "rockchip_drm_gem.h"
 
index b604747fe4538eec3f6710f7e11e8b02bb66adab..80636edbab233bcc0ab29b51590667b5ec9f5d84 100644 (file)
@@ -4,7 +4,6 @@
  * Author: Yakir Yang <ykk@rock-chips.com>
  */
 
-#include <drm/drmP.h>
 #include <drm/drm_atomic.h>
 #include <drm/drm_probe_helper.h>
 
index 09a790c2f3a1ead32cd7360b645eca62a1d2f1a0..b0179849de96fa012c9bf2c14219e9e4b165901c 100644 (file)
@@ -4,33 +4,34 @@
  * Author:Mark Yao <mark.yao@rock-chips.com>
  */
 
+#include <linux/clk.h>
+#include <linux/component.h>
+#include <linux/delay.h>
+#include <linux/iopoll.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/overflow.h>
+#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
+#include <linux/reset.h>
+
 #include <drm/drm.h>
-#include <drm/drmP.h>
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_uapi.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_flip_work.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
+
 #ifdef CONFIG_DRM_ANALOGIX_DP
 #include <drm/bridge/analogix_dp.h>
 #endif
 
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/clk.h>
-#include <linux/iopoll.h>
-#include <linux/of.h>
-#include <linux/of_device.h>
-#include <linux/pm_runtime.h>
-#include <linux/component.h>
-#include <linux/overflow.h>
-
-#include <linux/reset.h>
-#include <linux/delay.h>
-
 #include "rockchip_drm_drv.h"
 #include "rockchip_drm_gem.h"
 #include "rockchip_drm_fb.h"
index 830858a809e5c91e9df2b4e2b76322bff647dc21..64aefa856896376a10ce8ad51023e78bc79df4a0 100644 (file)
@@ -6,21 +6,21 @@
  *      Sandy Huang <hjc@rock-chips.com>
  */
 
-#include <drm/drmP.h>
-#include <drm/drm_atomic_helper.h>
-#include <drm/drm_dp_helper.h>
-#include <drm/drm_panel.h>
-#include <drm/drm_of.h>
-#include <drm/drm_probe_helper.h>
-
-#include <linux/component.h>
 #include <linux/clk.h>
+#include <linux/component.h>
 #include <linux/mfd/syscon.h>
 #include <linux/of_graph.h>
 #include <linux/pinctrl/devinfo.h>
+#include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/regmap.h>
 #include <linux/reset.h>
+#include <drm/drm_atomic_helper.h>
+
+#include <drm/drm_dp_helper.h>
+#include <drm/drm_of.h>
+#include <drm/drm_panel.h>
+#include <drm/drm_probe_helper.h>
 
 #include "rockchip_drm_drv.h"
 #include "rockchip_drm_vop.h"
index ce4d82d293e472ee6e0869f53424f0bb0fdeb819..89e0bb0fe0ab942ceb78db41ad3659f07615d1f8 100644 (file)
@@ -5,16 +5,15 @@
  *      Sandy Huang <hjc@rock-chips.com>
  */
 
-#include <drm/drmP.h>
+#include <linux/component.h>
+#include <linux/of_graph.h>
+
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_dp_helper.h>
-#include <drm/drm_panel.h>
 #include <drm/drm_of.h>
+#include <drm/drm_panel.h>
 #include <drm/drm_probe_helper.h>
 
-#include <linux/component.h>
-#include <linux/of_graph.h>
-
 #include "rockchip_drm_drv.h"
 #include "rockchip_drm_vop.h"
 
index 7b9c74750f6d98167ce8416473f7fb1a7460d1fd..d1494be144719687f16a279dbd9e87292991f9c1 100644 (file)
@@ -4,10 +4,15 @@
  * Author:Mark Yao <mark.yao@rock-chips.com>
  */
 
-#include <drm/drmP.h>
-
-#include <linux/kernel.h>
 #include <linux/component.h>
+#include <linux/mod_devicetable.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+
+#include <drm/drm_fourcc.h>
+#include <drm/drm_plane.h>
+#include <drm/drm_print.h>
 
 #include "rockchip_drm_vop.h"
 #include "rockchip_vop_reg.h"
index 1626f396713029eb213c9d83d434b08ce1509aa8..d79086498affe406e29a9303c97ccd8c021fffb4 100644 (file)
@@ -28,8 +28,6 @@
 #include <linux/types.h>
 #include <linux/tracepoint.h>
 
-#include <drm/drmP.h>
-
 #undef TRACE_SYSTEM
 #define TRACE_SYSTEM gpu_scheduler
 #define TRACE_INCLUDE_FILE gpu_scheduler_trace
index 35ddbec1375ae880bba180a4d7f46173b38e2ec2..d5a6a946f486bd86415904350e4bb5a757ff9874 100644 (file)
@@ -22,6 +22,9 @@
  */
 
 #include <linux/kthread.h>
+#include <linux/slab.h>
+
+#include <drm/drm_print.h>
 #include <drm/gpu_scheduler.h>
 
 #include "gpu_scheduler_trace.h"
index d8d2dff9ea2f79d17479426db774a5b8049d90e7..54977408f574fd3c85ff26ba6c2936211aaf69b6 100644 (file)
  */
 
 #include <linux/kthread.h>
-#include <linux/wait.h>
+#include <linux/module.h>
 #include <linux/sched.h>
-#include <drm/drmP.h>
+#include <linux/slab.h>
+#include <linux/wait.h>
+
 #include <drm/gpu_scheduler.h>
 
 static struct kmem_cache *sched_fence_slab;
index c1058eece16b4a1c72699448d653b0ac872b7924..9a0ee74d82dc2b6c39859781c44e4e4be615cd1e 100644 (file)
@@ -48,7 +48,8 @@
 #include <linux/wait.h>
 #include <linux/sched.h>
 #include <uapi/linux/sched/types.h>
-#include <drm/drmP.h>
+
+#include <drm/drm_print.h>
 #include <drm/gpu_scheduler.h>
 #include <drm/spsc_queue.h>
 
index a04d02dacce2a75be87c9e2bff553c09d8ef2945..74d5561a862be433f869d192a48857ddb61e9e86 100644 (file)
@@ -3,7 +3,12 @@
  * Test cases for the drm_framebuffer functions
  */
 
-#include <drm/drmP.h>
+#include <linux/kernel.h>
+
+#include <drm/drm_device.h>
+#include <drm/drm_mode.h>
+#include <drm/drm_fourcc.h>
+
 #include "../drm_crtc_internal.h"
 
 #include "test-drm_modeset_common.h"
index b6988a6d698ef265f0602045d2d0d1c30aad95c7..75a752d59ef1768e890a1b8306a8e45f0a44a254 100644 (file)
 #include <linux/backlight.h>
 #include <linux/clk.h>
 
-#include <drm/drmP.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
 
 #include "shmob_drm_backlight.h"
 #include "shmob_drm_crtc.h"
index 9ca6920641d89da3cd35513c538b58f449593c52..21718843f46d3d19deb61a48778026026724e042 100644 (file)
 #ifndef __SHMOB_DRM_CRTC_H__
 #define __SHMOB_DRM_CRTC_H__
 
-#include <drm/drmP.h>
 #include <drm/drm_crtc.h>
+#include <drm/drm_connector.h>
 #include <drm/drm_encoder.h>
 
 struct backlight_device;
+struct drm_pending_vblank_event;
 struct shmob_drm_device;
+struct shmob_drm_format_info;
 
 struct shmob_drm_crtc {
        struct drm_crtc crtc;
index cb821adfc3211e57604e4239aaf44c7ecdfef08a..b8c0930959c7e84bb0ec9b7d1a96a10bcd338c65 100644 (file)
 #include <linux/pm.h>
 #include <linux/slab.h>
 
-#include <drm/drmP.h>
 #include <drm/drm_crtc_helper.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_irq.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
 
 #include "shmob_drm_drv.h"
 #include "shmob_drm_kms.h"
@@ -127,15 +129,12 @@ static irqreturn_t shmob_drm_irq(int irq, void *arg)
 DEFINE_DRM_GEM_CMA_FOPS(shmob_drm_fops);
 
 static struct drm_driver shmob_drm_driver = {
-       .driver_features        = DRIVER_GEM | DRIVER_MODESET
-                               | DRIVER_PRIME,
+       .driver_features        = DRIVER_GEM | DRIVER_MODESET,
        .irq_handler            = shmob_drm_irq,
        .gem_free_object_unlocked = drm_gem_cma_free_object,
        .gem_vm_ops             = &drm_gem_cma_vm_ops,
        .prime_handle_to_fd     = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle     = drm_gem_prime_fd_to_handle,
-       .gem_prime_import       = drm_gem_prime_import,
-       .gem_prime_export       = drm_gem_prime_export,
        .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
        .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
        .gem_prime_vmap         = drm_gem_cma_prime_vmap,
index 2e08bc203bf9437cf618a719aa88de92c3d8dd86..c51197b6fd8547420c1ba14c151dfc82e5510296 100644 (file)
@@ -7,7 +7,6 @@
  * Laurent Pinchart (laurent.pinchart@ideasonboard.com)
  */
 
-#include <drm/drmP.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_fb_cma_helper.h>
index 1d1ee5e513519703264ecdf7ccaadb5005f6fa36..cbc464f006b41926ae270b6369f653100f5ac8e8 100644 (file)
@@ -7,10 +7,10 @@
  * Laurent Pinchart (laurent.pinchart@ideasonboard.com)
  */
 
-#include <drm/drmP.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_gem_cma_helper.h>
 
 #include "shmob_drm_drv.h"
index bae67cc8c62850ec27517808c8c79fcb8e76dabf..e72b21a4288fc23f8da1a19eff6a0edf3d36a4c3 100644 (file)
@@ -10,6 +10,7 @@
 #ifndef __SHMOB_DRM_PLANE_H__
 #define __SHMOB_DRM_PLANE_H__
 
+struct drm_plane;
 struct shmob_drm_device;
 
 int shmob_drm_plane_create(struct shmob_drm_device *sdev, unsigned int index);
index 9eb0b3d01df8079b355408018022b0638093fafe..058533685c4cd0a28a1e171c53ff5d2b7514715a 100644 (file)
@@ -11,6 +11,9 @@
 #define __SHMOB_DRM_REGS_H__
 
 #include <linux/io.h>
+#include <linux/jiffies.h>
+
+#include "shmob_drm_drv.h"
 
 /* Register definitions */
 #define LDDCKPAT1R             0x400
index bb6ae6dd66c93b6b4b8b31d2140f87bcc7944c89..a39fc36f815b2d01ffa30ffdc80a08a838d9b3ce 100644 (file)
@@ -23,7 +23,6 @@
 
 #include "sti_crtc.h"
 #include "sti_drv.h"
-#include "sti_drv.h"
 #include "sti_plane.h"
 
 #define DRIVER_NAME    "sti"
@@ -141,8 +140,7 @@ static void sti_mode_config_init(struct drm_device *dev)
 DEFINE_DRM_GEM_CMA_FOPS(sti_driver_fops);
 
 static struct drm_driver sti_driver = {
-       .driver_features = DRIVER_MODESET |
-           DRIVER_GEM | DRIVER_PRIME | DRIVER_ATOMIC,
+       .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
        .gem_free_object_unlocked = drm_gem_cma_free_object,
        .gem_vm_ops = &drm_gem_cma_vm_ops,
        .dumb_create = drm_gem_cma_dumb_create,
@@ -153,8 +151,6 @@ static struct drm_driver sti_driver = {
 
        .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
-       .gem_prime_export = drm_gem_prime_export,
-       .gem_prime_import = drm_gem_prime_import,
        .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
        .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
        .gem_prime_vmap = drm_gem_cma_prime_vmap,
index e1b3c8cb7287801202a927f7669c8f2eb5dcffb0..aba79c17251222f77d386a68f5d24a0393cbc15a 100644 (file)
@@ -669,10 +669,9 @@ sti_tvout_create_dvo_encoder(struct drm_device *dev,
 
        encoder->tvout = tvout;
 
-       drm_encoder = (struct drm_encoder *)encoder;
+       drm_encoder = &encoder->encoder;
 
        drm_encoder->possible_crtcs = ENCODER_CRTC_MASK;
-       drm_encoder->possible_clones = 1 << 0;
 
        drm_encoder_init(dev, drm_encoder,
                         &sti_tvout_encoder_funcs, DRM_MODE_ENCODER_LVDS,
@@ -722,10 +721,9 @@ static struct drm_encoder *sti_tvout_create_hda_encoder(struct drm_device *dev,
 
        encoder->tvout = tvout;
 
-       drm_encoder = (struct drm_encoder *) encoder;
+       drm_encoder = &encoder->encoder;
 
        drm_encoder->possible_crtcs = ENCODER_CRTC_MASK;
-       drm_encoder->possible_clones = 1 << 0;
 
        drm_encoder_init(dev, drm_encoder,
                        &sti_tvout_encoder_funcs, DRM_MODE_ENCODER_DAC, NULL);
@@ -771,10 +769,9 @@ static struct drm_encoder *sti_tvout_create_hdmi_encoder(struct drm_device *dev,
 
        encoder->tvout = tvout;
 
-       drm_encoder = (struct drm_encoder *) encoder;
+       drm_encoder = &encoder->encoder;
 
        drm_encoder->possible_crtcs = ENCODER_CRTC_MASK;
-       drm_encoder->possible_clones = 1 << 1;
 
        drm_encoder_init(dev, drm_encoder,
                        &sti_tvout_encoder_funcs, DRM_MODE_ENCODER_TMDS, NULL);
@@ -790,6 +787,13 @@ static void sti_tvout_create_encoders(struct drm_device *dev,
        tvout->hdmi = sti_tvout_create_hdmi_encoder(dev, tvout);
        tvout->hda = sti_tvout_create_hda_encoder(dev, tvout);
        tvout->dvo = sti_tvout_create_dvo_encoder(dev, tvout);
+
+       tvout->hdmi->possible_clones = drm_encoder_mask(tvout->hdmi) |
+               drm_encoder_mask(tvout->hda) | drm_encoder_mask(tvout->dvo);
+       tvout->hda->possible_clones = drm_encoder_mask(tvout->hdmi) |
+               drm_encoder_mask(tvout->hda) | drm_encoder_mask(tvout->dvo);
+       tvout->dvo->possible_clones = drm_encoder_mask(tvout->hdmi) |
+               drm_encoder_mask(tvout->hda) | drm_encoder_mask(tvout->dvo);
 }
 
 static void sti_tvout_destroy_encoders(struct sti_tvout *tvout)
index 9dee4e430de514217999d15a2a3d02a9b9ca58b4..5a9f9aca8bc2451450c44e195767f84799367b2d 100644 (file)
@@ -54,8 +54,7 @@ static int stm_gem_cma_dumb_create(struct drm_file *file,
 DEFINE_DRM_GEM_CMA_FOPS(drv_driver_fops);
 
 static struct drm_driver drv_driver = {
-       .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME |
-                          DRIVER_ATOMIC,
+       .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
        .name = "stm",
        .desc = "STMicroelectronics SoC DRM",
        .date = "20170330",
@@ -68,8 +67,6 @@ static struct drm_driver drv_driver = {
        .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
        .gem_free_object_unlocked = drm_gem_cma_free_object,
        .gem_vm_ops = &drm_gem_cma_vm_ops,
-       .gem_prime_export = drm_gem_prime_export,
-       .gem_prime_import = drm_gem_prime_import,
        .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
        .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
        .gem_prime_vmap = drm_gem_cma_prime_vmap,
index 0ab32fee6c1ba0f9a225b5c64deccf41721597b0..a03a642c147cc58cb1c0d4454113c9157aebc247 100644 (file)
@@ -8,13 +8,17 @@
 
 #include <linux/clk.h>
 #include <linux/iopoll.h>
+#include <linux/mod_devicetable.h>
 #include <linux/module.h>
+#include <linux/platform_device.h>
 #include <linux/regulator/consumer.h>
-#include <drm/drmP.h>
-#include <drm/drm_mipi_dsi.h>
-#include <drm/bridge/dw_mipi_dsi.h>
+
 #include <video/mipi_display.h>
 
+#include <drm/bridge/dw_mipi_dsi.h>
+#include <drm/drm_mipi_dsi.h>
+#include <drm/drm_print.h>
+
 #define HWVER_130                      0x31333000      /* IP version 1.30 */
 #define HWVER_131                      0x31333100      /* IP version 1.31 */
 
index 78d8c3afe82533652385b542409f990d1af519e7..4e29f4fe4a05e0edb32f9f4fae51d41e27ca0c90 100644 (file)
@@ -6,21 +6,23 @@
  * Maxime Ripard <maxime.ripard@free-electrons.com>
  */
 
-#include <drm/drmP.h>
+#include <linux/component.h>
+#include <linux/list.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/of_graph.h>
+#include <linux/platform_device.h>
+#include <linux/reset.h>
+
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_probe_helper.h>
 
-#include <linux/component.h>
-#include <linux/list.h>
-#include <linux/of_device.h>
-#include <linux/of_graph.h>
-#include <linux/reset.h>
-
 #include "sun4i_backend.h"
 #include "sun4i_drv.h"
 #include "sun4i_frontend.h"
index 9d8504f813a4dd7755ad1216cc63522c9bcefc8a..3a153648b36980862f5712635109c54ce4ce332a 100644 (file)
@@ -6,12 +6,6 @@
  * Maxime Ripard <maxime.ripard@free-electrons.com>
  */
 
-#include <drm/drmP.h>
-#include <drm/drm_atomic_helper.h>
-#include <drm/drm_crtc.h>
-#include <drm/drm_modes.h>
-#include <drm/drm_probe_helper.h>
-
 #include <linux/clk-provider.h>
 #include <linux/ioport.h>
 #include <linux/of_address.h>
 
 #include <video/videomode.h>
 
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_crtc.h>
+#include <drm/drm_modes.h>
+#include <drm/drm_print.h>
+#include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
+
 #include "sun4i_backend.h"
 #include "sun4i_crtc.h"
 #include "sun4i_drv.h"
index 1a1b52e6f73effe8ce7f8f5bacdf24c9e1454793..a5757b11b730254943cf98c2f68da512552c0443 100644 (file)
@@ -8,16 +8,19 @@
 
 #include <linux/component.h>
 #include <linux/kfifo.h>
+#include <linux/module.h>
 #include <linux/of_graph.h>
 #include <linux/of_reserved_mem.h>
+#include <linux/platform_device.h>
 
-#include <drm/drmP.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_of.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
 
 #include "sun4i_drv.h"
 #include "sun4i_frontend.h"
@@ -38,7 +41,7 @@ static int drm_sun4i_gem_dumb_create(struct drm_file *file_priv,
 DEFINE_DRM_GEM_CMA_FOPS(sun4i_drv_fops);
 
 static struct drm_driver sun4i_drv_driver = {
-       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_ATOMIC,
+       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 
        /* Generic Operations */
        .fops                   = &sun4i_drv_fops,
index 35c040716680cf2544244fe768e823ff8e3421e7..1568f68f9a9efc8f70886c695d1afd322dc280f1 100644 (file)
@@ -9,7 +9,6 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
-#include <drm/drmP.h>
 
 #include "sun4i_drv.h"
 #include "sun4i_framebuffer.h"
index 346c8071bd383c86388cac8991a04189e80af2af..ec2a032e07b975be989928fe699c7ef7c0a61952 100644 (file)
@@ -3,9 +3,6 @@
  * Copyright (C) 2017 Free Electrons
  * Maxime Ripard <maxime.ripard@free-electrons.com>
  */
-#include <drm/drmP.h>
-#include <drm/drm_gem_cma_helper.h>
-#include <drm/drm_fb_cma_helper.h>
 
 #include <linux/clk.h>
 #include <linux/component.h>
 #include <linux/regmap.h>
 #include <linux/reset.h>
 
+#include <drm/drm_device.h>
+#include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_framebuffer.h>
+#include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_plane.h>
+
 #include "sun4i_drv.h"
 #include "sun4i_frontend.h"
 
index 9c3f99339b82f4756a368e26d724b4ceb49e4a21..b2df76addc75ad26ca9390d65d8bf8bbff166cb0 100644 (file)
@@ -5,23 +5,24 @@
  * Maxime Ripard <maxime.ripard@free-electrons.com>
  */
 
-#include <drm/drmP.h>
-#include <drm/drm_atomic_helper.h>
-#include <drm/drm_probe_helper.h>
-#include <drm/drm_edid.h>
-#include <drm/drm_encoder.h>
-#include <drm/drm_of.h>
-#include <drm/drm_panel.h>
-
 #include <linux/clk.h>
 #include <linux/component.h>
 #include <linux/iopoll.h>
+#include <linux/module.h>
 #include <linux/of_device.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/regmap.h>
 #include <linux/reset.h>
 
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_edid.h>
+#include <drm/drm_encoder.h>
+#include <drm/drm_of.h>
+#include <drm/drm_panel.h>
+#include <drm/drm_print.h>
+#include <drm/drm_probe_helper.h>
+
 #include "sun4i_backend.h"
 #include "sun4i_crtc.h"
 #include "sun4i_drv.h"
index e72dd4de90cebc904679367d85f19ed25cd579b4..c04f4ba0d69d099f2af96c4efb83f2c970167d6a 100644 (file)
@@ -7,9 +7,8 @@
  */
 
 #include <drm/drm_atomic_helper.h>
-#include <drm/drm_plane_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
-#include <drm/drmP.h>
+#include <drm/drm_plane_helper.h>
 
 #include "sun4i_backend.h"
 #include "sun4i_frontend.h"
index 3a3ba99fed22cfc459cf54ce81d7f2170c53c1ee..7fbf425acb55004424231d4d2dd2b69c500e9fba 100644 (file)
@@ -6,10 +6,10 @@
 
 #include <linux/clk.h>
 
-#include <drm/drmP.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_of.h>
 #include <drm/drm_panel.h>
+#include <drm/drm_print.h>
 #include <drm/drm_probe_helper.h>
 
 #include "sun4i_crtc.h"
index a901ec689b620a015c080209d5c520f7adf9e00c..aac56983f2081ee450f08ccf86e58abbecbb09e4 100644 (file)
@@ -8,10 +8,10 @@
 
 #include <linux/clk.h>
 
-#include <drm/drmP.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_of.h>
 #include <drm/drm_panel.h>
+#include <drm/drm_print.h>
 #include <drm/drm_probe_helper.h>
 
 #include "sun4i_crtc.h"
index 64c43ee6bd92ffe01938afa69e9683e897e7fca6..690aeb8227041b79295abbfe61ef635e158c70cf 100644 (file)
@@ -6,7 +6,15 @@
  * Maxime Ripard <maxime.ripard@free-electrons.com>
  */
 
-#include <drm/drmP.h>
+#include <linux/component.h>
+#include <linux/ioport.h>
+#include <linux/module.h>
+#include <linux/of_address.h>
+#include <linux/of_device.h>
+#include <linux/of_irq.h>
+#include <linux/regmap.h>
+#include <linux/reset.h>
+
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_connector.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_modes.h>
 #include <drm/drm_of.h>
 #include <drm/drm_panel.h>
+#include <drm/drm_print.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
 
 #include <uapi/drm/drm_mode.h>
 
-#include <linux/component.h>
-#include <linux/ioport.h>
-#include <linux/of_address.h>
-#include <linux/of_device.h>
-#include <linux/of_irq.h>
-#include <linux/regmap.h>
-#include <linux/reset.h>
-
 #include "sun4i_crtc.h"
 #include "sun4i_dotclock.h"
 #include "sun4i_drv.h"
@@ -478,7 +480,7 @@ static void sun4i_tcon0_mode_set_rgb(struct sun4i_tcon *tcon,
                                     const struct drm_display_mode *mode)
 {
        struct drm_connector *connector = sun4i_tcon_get_connector(encoder);
-       struct drm_display_info display_info = connector->display_info;
+       const struct drm_display_info *info = &connector->display_info;
        unsigned int bp, hsync, vsync;
        u8 clk_delay;
        u32 val = 0;
@@ -539,7 +541,7 @@ static void sun4i_tcon0_mode_set_rgb(struct sun4i_tcon *tcon,
        if (mode->flags & DRM_MODE_FLAG_PVSYNC)
                val |= SUN4I_TCON0_IO_POL_VSYNC_POSITIVE;
 
-       if (display_info.bus_flags & DRM_BUS_FLAG_DE_LOW)
+       if (info->bus_flags & DRM_BUS_FLAG_DE_LOW)
                val |= SUN4I_TCON0_IO_POL_DE_NEGATIVE;
 
        /*
@@ -557,10 +559,10 @@ static void sun4i_tcon0_mode_set_rgb(struct sun4i_tcon *tcon,
         * Following code is a way to avoid quirks all around TCON
         * and DOTCLOCK drivers.
         */
-       if (display_info.bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE)
+       if (info->bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE)
                clk_set_phase(tcon->dclk, 240);
 
-       if (display_info.bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE)
+       if (info->bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE)
                clk_set_phase(tcon->dclk, 0);
 
        regmap_update_bits(tcon->regs, SUN4I_TCON0_IO_POL_REG,
index f998153c141f349fe49f2d6942089a1c5df7dc2a..39c15282e4489ef4df03ae406a7bcf1cc8472849 100644 (file)
@@ -8,14 +8,16 @@
 
 #include <linux/clk.h>
 #include <linux/component.h>
+#include <linux/module.h>
 #include <linux/of_address.h>
+#include <linux/platform_device.h>
 #include <linux/regmap.h>
 #include <linux/reset.h>
 
-#include <drm/drmP.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_of.h>
 #include <drm/drm_panel.h>
+#include <drm/drm_print.h>
 #include <drm/drm_probe_helper.h>
 
 #include "sun4i_crtc.h"
index a1fc8b520985506a5f050af1d9d3eb2729f120ea..472f73985deb8c0543805a711414cfd2eed71459 100644 (file)
@@ -9,19 +9,20 @@
 #include <linux/clk.h>
 #include <linux/component.h>
 #include <linux/crc-ccitt.h>
+#include <linux/module.h>
 #include <linux/of_address.h>
+#include <linux/phy/phy-mipi-dphy.h>
+#include <linux/phy/phy.h>
+#include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/regmap.h>
 #include <linux/reset.h>
 #include <linux/slab.h>
 
-#include <linux/phy/phy.h>
-#include <linux/phy/phy-mipi-dphy.h>
-
-#include <drm/drmP.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_mipi_dsi.h>
 #include <drm/drm_panel.h>
+#include <drm/drm_print.h>
 #include <drm/drm_probe_helper.h>
 
 #include "sun4i_crtc.h"
index b8c059f1a11812afb9f4502ffc467e43b7c7467a..781955dd4995d4add13845c4c40a2158ab151121 100644 (file)
@@ -3,7 +3,7 @@
  * Copyright (C) Jernej Skrabec <jernej.skrabec@siol.net>
  */
 
-#include <drm/drmP.h>
+#include <drm/drm_print.h>
 
 #include "sun8i_csc.h"
 #include "sun8i_mixer.h"
@@ -18,16 +18,59 @@ static const u32 ccsc_base[2][2] = {
  * First tree values in each line are multiplication factor and last
  * value is constant, which is added at the end.
  */
-static const u32 yuv2rgb[] = {
-       0x000004A8, 0x00000000, 0x00000662, 0xFFFC845A,
-       0x000004A8, 0xFFFFFE6F, 0xFFFFFCBF, 0x00021DF4,
-       0x000004A8, 0x00000813, 0x00000000, 0xFFFBAC4A,
+
+static const u32 yuv2rgb[2][2][12] = {
+       [DRM_COLOR_YCBCR_LIMITED_RANGE] = {
+               [DRM_COLOR_YCBCR_BT601] = {
+                       0x000004A8, 0x00000000, 0x00000662, 0xFFFC8451,
+                       0x000004A8, 0xFFFFFE6F, 0xFFFFFCC0, 0x00021E4D,
+                       0x000004A8, 0x00000811, 0x00000000, 0xFFFBACA9,
+               },
+               [DRM_COLOR_YCBCR_BT709] = {
+                       0x000004A8, 0x00000000, 0x0000072B, 0xFFFC1F99,
+                       0x000004A8, 0xFFFFFF26, 0xFFFFFDDF, 0x00013383,
+                       0x000004A8, 0x00000873, 0x00000000, 0xFFFB7BEF,
+               }
+       },
+       [DRM_COLOR_YCBCR_FULL_RANGE] = {
+               [DRM_COLOR_YCBCR_BT601] = {
+                       0x00000400, 0x00000000, 0x0000059B, 0xFFFD322E,
+                       0x00000400, 0xFFFFFEA0, 0xFFFFFD25, 0x00021DD5,
+                       0x00000400, 0x00000716, 0x00000000, 0xFFFC74BD,
+               },
+               [DRM_COLOR_YCBCR_BT709] = {
+                       0x00000400, 0x00000000, 0x0000064C, 0xFFFCD9B4,
+                       0x00000400, 0xFFFFFF41, 0xFFFFFE21, 0x00014F96,
+                       0x00000400, 0x0000076C, 0x00000000, 0xFFFC49EF,
+               }
+       },
 };
 
-static const u32 yvu2rgb[] = {
-       0x000004A8, 0x00000662, 0x00000000, 0xFFFC845A,
-       0x000004A8, 0xFFFFFCBF, 0xFFFFFE6F, 0x00021DF4,
-       0x000004A8, 0x00000000, 0x00000813, 0xFFFBAC4A,
+static const u32 yvu2rgb[2][2][12] = {
+       [DRM_COLOR_YCBCR_LIMITED_RANGE] = {
+               [DRM_COLOR_YCBCR_BT601] = {
+                       0x000004A8, 0x00000662, 0x00000000, 0xFFFC8451,
+                       0x000004A8, 0xFFFFFCC0, 0xFFFFFE6F, 0x00021E4D,
+                       0x000004A8, 0x00000000, 0x00000811, 0xFFFBACA9,
+               },
+               [DRM_COLOR_YCBCR_BT709] = {
+                       0x000004A8, 0x0000072B, 0x00000000, 0xFFFC1F99,
+                       0x000004A8, 0xFFFFFDDF, 0xFFFFFF26, 0x00013383,
+                       0x000004A8, 0x00000000, 0x00000873, 0xFFFB7BEF,
+               }
+       },
+       [DRM_COLOR_YCBCR_FULL_RANGE] = {
+               [DRM_COLOR_YCBCR_BT601] = {
+                       0x00000400, 0x0000059B, 0x00000000, 0xFFFD322E,
+                       0x00000400, 0xFFFFFD25, 0xFFFFFEA0, 0x00021DD5,
+                       0x00000400, 0x00000000, 0x00000716, 0xFFFC74BD,
+               },
+               [DRM_COLOR_YCBCR_BT709] = {
+                       0x00000400, 0x0000064C, 0x00000000, 0xFFFCD9B4,
+                       0x00000400, 0xFFFFFE21, 0xFFFFFF41, 0x00014F96,
+                       0x00000400, 0x00000000, 0x0000076C, 0xFFFC49EF,
+               }
+       },
 };
 
 /*
@@ -53,57 +96,98 @@ static const u32 yvu2rgb[] = {
  * c20 c21 c22 [d2 const2]
  */
 
-static const u32 yuv2rgb_de3[] = {
-       0x0002542a, 0x00000000, 0x0003312a, 0xffc00000,
-       0x0002542a, 0xffff376b, 0xfffe5fc3, 0xfe000000,
-       0x0002542a, 0x000408d3, 0x00000000, 0xfe000000,
+static const u32 yuv2rgb_de3[2][2][12] = {
+       [DRM_COLOR_YCBCR_LIMITED_RANGE] = {
+               [DRM_COLOR_YCBCR_BT601] = {
+                       0x0002542A, 0x00000000, 0x0003312A, 0xFFC00000,
+                       0x0002542A, 0xFFFF376B, 0xFFFE5FC3, 0xFE000000,
+                       0x0002542A, 0x000408D2, 0x00000000, 0xFE000000,
+               },
+               [DRM_COLOR_YCBCR_BT709] = {
+                       0x0002542A, 0x00000000, 0x000395E2, 0xFFC00000,
+                       0x0002542A, 0xFFFF92D2, 0xFFFEEF27, 0xFE000000,
+                       0x0002542A, 0x0004398C, 0x00000000, 0xFE000000,
+               }
+       },
+       [DRM_COLOR_YCBCR_FULL_RANGE] = {
+               [DRM_COLOR_YCBCR_BT601] = {
+                       0x00020000, 0x00000000, 0x0002CDD2, 0x00000000,
+                       0x00020000, 0xFFFF4FCE, 0xFFFE925D, 0xFE000000,
+                       0x00020000, 0x00038B43, 0x00000000, 0xFE000000,
+               },
+               [DRM_COLOR_YCBCR_BT709] = {
+                       0x00020000, 0x00000000, 0x0003264C, 0x00000000,
+                       0x00020000, 0xFFFFA018, 0xFFFF1053, 0xFE000000,
+                       0x00020000, 0x0003B611, 0x00000000, 0xFE000000,
+               }
+       },
 };
 
-static const u32 yvu2rgb_de3[] = {
-       0x0002542a, 0x0003312a, 0x00000000, 0xffc00000,
-       0x0002542a, 0xfffe5fc3, 0xffff376b, 0xfe000000,
-       0x0002542a, 0x00000000, 0x000408d3, 0xfe000000,
+static const u32 yvu2rgb_de3[2][2][12] = {
+       [DRM_COLOR_YCBCR_LIMITED_RANGE] = {
+               [DRM_COLOR_YCBCR_BT601] = {
+                       0x0002542A, 0x0003312A, 0x00000000, 0xFFC00000,
+                       0x0002542A, 0xFFFE5FC3, 0xFFFF376B, 0xFE000000,
+                       0x0002542A, 0x00000000, 0x000408D2, 0xFE000000,
+               },
+               [DRM_COLOR_YCBCR_BT709] = {
+                       0x0002542A, 0x000395E2, 0x00000000, 0xFFC00000,
+                       0x0002542A, 0xFFFEEF27, 0xFFFF92D2, 0xFE000000,
+                       0x0002542A, 0x00000000, 0x0004398C, 0xFE000000,
+               }
+       },
+       [DRM_COLOR_YCBCR_FULL_RANGE] = {
+               [DRM_COLOR_YCBCR_BT601] = {
+                       0x00020000, 0x0002CDD2, 0x00000000, 0x00000000,
+                       0x00020000, 0xFFFE925D, 0xFFFF4FCE, 0xFE000000,
+                       0x00020000, 0x00000000, 0x00038B43, 0xFE000000,
+               },
+               [DRM_COLOR_YCBCR_BT709] = {
+                       0x00020000, 0x0003264C, 0x00000000, 0x00000000,
+                       0x00020000, 0xFFFF1053, 0xFFFFA018, 0xFE000000,
+                       0x00020000, 0x00000000, 0x0003B611, 0xFE000000,
+               }
+       },
 };
 
 static void sun8i_csc_set_coefficients(struct regmap *map, u32 base,
-                                      enum sun8i_csc_mode mode)
+                                      enum sun8i_csc_mode mode,
+                                      enum drm_color_encoding encoding,
+                                      enum drm_color_range range)
 {
        const u32 *table;
-       int i, data;
+       u32 base_reg;
 
        switch (mode) {
        case SUN8I_CSC_MODE_YUV2RGB:
-               table = yuv2rgb;
+               table = yuv2rgb[range][encoding];
                break;
        case SUN8I_CSC_MODE_YVU2RGB:
-               table = yvu2rgb;
+               table = yvu2rgb[range][encoding];
                break;
        default:
                DRM_WARN("Wrong CSC mode specified.\n");
                return;
        }
 
-       for (i = 0; i < 12; i++) {
-               data = table[i];
-               /* For some reason, 0x200 must be added to constant parts */
-               if (((i + 1) & 3) == 0)
-                       data += 0x200;
-               regmap_write(map, SUN8I_CSC_COEFF(base, i), data);
-       }
+       base_reg = SUN8I_CSC_COEFF(base, 0);
+       regmap_bulk_write(map, base_reg, table, 12);
 }
 
 static void sun8i_de3_ccsc_set_coefficients(struct regmap *map, int layer,
-                                           enum sun8i_csc_mode mode)
+                                           enum sun8i_csc_mode mode,
+                                           enum drm_color_encoding encoding,
+                                           enum drm_color_range range)
 {
        const u32 *table;
        u32 base_reg;
 
        switch (mode) {
        case SUN8I_CSC_MODE_YUV2RGB:
-               table = yuv2rgb_de3;
+               table = yuv2rgb_de3[range][encoding];
                break;
        case SUN8I_CSC_MODE_YVU2RGB:
-               table = yvu2rgb_de3;
+               table = yvu2rgb_de3[range][encoding];
                break;
        default:
                DRM_WARN("Wrong CSC mode specified.\n");
@@ -142,19 +226,22 @@ static void sun8i_de3_ccsc_enable(struct regmap *map, int layer, bool enable)
 }
 
 void sun8i_csc_set_ccsc_coefficients(struct sun8i_mixer *mixer, int layer,
-                                    enum sun8i_csc_mode mode)
+                                    enum sun8i_csc_mode mode,
+                                    enum drm_color_encoding encoding,
+                                    enum drm_color_range range)
 {
        u32 base;
 
        if (mixer->cfg->is_de3) {
-               sun8i_de3_ccsc_set_coefficients(mixer->engine.regs,
-                                               layer, mode);
+               sun8i_de3_ccsc_set_coefficients(mixer->engine.regs, layer,
+                                               mode, encoding, range);
                return;
        }
 
        base = ccsc_base[mixer->cfg->ccsc][layer];
 
-       sun8i_csc_set_coefficients(mixer->engine.regs, base, mode);
+       sun8i_csc_set_coefficients(mixer->engine.regs, base,
+                                  mode, encoding, range);
 }
 
 void sun8i_csc_enable_ccsc(struct sun8i_mixer *mixer, int layer, bool enable)
index dce4c444bcd625fe61abf5132484a7eaefdc5424..f42441b1b14ddfcc4bd8e82423365514b373d982 100644 (file)
@@ -6,6 +6,8 @@
 #ifndef _SUN8I_CSC_H_
 #define _SUN8I_CSC_H_
 
+#include <drm/drm_color_mgmt.h>
+
 struct sun8i_mixer;
 
 /* VI channel CSC units offsets */
@@ -26,7 +28,9 @@ enum sun8i_csc_mode {
 };
 
 void sun8i_csc_set_ccsc_coefficients(struct sun8i_mixer *mixer, int layer,
-                                    enum sun8i_csc_mode mode);
+                                    enum sun8i_csc_mode mode,
+                                    enum drm_color_encoding encoding,
+                                    enum drm_color_range range);
 void sun8i_csc_enable_ccsc(struct sun8i_mixer *mixer, int layer, bool enable);
 
 #endif
index 39d8509d96a0d3162f8bd7c310f4aa0a18898f6b..8ca5af0c912f920592b64f245e8418445334a0f8 100644 (file)
@@ -8,9 +8,8 @@
 #include <linux/of_device.h>
 #include <linux/platform_device.h>
 
-#include <drm/drm_of.h>
-#include <drm/drmP.h>
 #include <drm/drm_crtc_helper.h>
+#include <drm/drm_of.h>
 
 #include "sun8i_dw_hdmi.h"
 #include "sun8i_tcon_top.h"
index c2eedf58bf4be0b216df1c3ccf83cea576f1fa70..8b803eb903b8f0156f88a7ddc41d96ae1e4da419 100644 (file)
@@ -7,7 +7,13 @@
  *   Copyright (C) 2015 NextThing Co
  */
 
-#include <drm/drmP.h>
+#include <linux/component.h>
+#include <linux/dma-mapping.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/of_graph.h>
+#include <linux/reset.h>
+
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_probe_helper.h>
 
-#include <linux/component.h>
-#include <linux/dma-mapping.h>
-#include <linux/of_device.h>
-#include <linux/of_graph.h>
-#include <linux/reset.h>
-
 #include "sun4i_drv.h"
 #include "sun8i_mixer.h"
 #include "sun8i_ui_layer.h"
index 3267d0f9b9b249109177b324601222dcdab66de4..75d8e60c149d963b5e683a8006e8d7e98df684ad 100644 (file)
@@ -1,18 +1,18 @@
 // SPDX-License-Identifier: GPL-2.0+
 /* Copyright (c) 2018 Jernej Skrabec <jernej.skrabec@siol.net> */
 
-#include <drm/drmP.h>
-
-#include <dt-bindings/clock/sun8i-tcon-top.h>
 
 #include <linux/bitfield.h>
 #include <linux/component.h>
 #include <linux/device.h>
+#include <linux/io.h>
 #include <linux/module.h>
 #include <linux/of_device.h>
 #include <linux/of_graph.h>
 #include <linux/platform_device.h>
 
+#include <dt-bindings/clock/sun8i-tcon-top.h>
+
 #include "sun8i_tcon_top.h"
 
 struct sun8i_tcon_top_quirks {
index dd2a1c8519393756e2c04344cf0c7f213853fb68..c87fd842918e58c10e74ecf2142e18781a34fb8f 100644 (file)
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_probe_helper.h>
-#include <drm/drmP.h>
 
 #include "sun8i_ui_layer.h"
 #include "sun8i_mixer.h"
index bd0e6a52d1d8af4f7872d49982950e6ec8532dbd..42d445d2377353cc0a7e1e3613cdd7edef3d3f49 100644 (file)
@@ -11,7 +11,6 @@
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_probe_helper.h>
-#include <drm/drmP.h>
 
 #include "sun8i_vi_layer.h"
 #include "sun8i_mixer.h"
@@ -232,7 +231,9 @@ static int sun8i_vi_layer_update_formats(struct sun8i_mixer *mixer, int channel,
                           SUN8I_MIXER_CHAN_VI_LAYER_ATTR_FBFMT_MASK, val);
 
        if (fmt_info->csc != SUN8I_CSC_MODE_OFF) {
-               sun8i_csc_set_ccsc_coefficients(mixer, channel, fmt_info->csc);
+               sun8i_csc_set_ccsc_coefficients(mixer, channel, fmt_info->csc,
+                                               state->color_encoding,
+                                               state->color_range);
                sun8i_csc_enable_ccsc(mixer, channel, true);
        } else {
                sun8i_csc_enable_ccsc(mixer, channel, false);
@@ -441,6 +442,7 @@ struct sun8i_vi_layer *sun8i_vi_layer_init_one(struct drm_device *drm,
                                               struct sun8i_mixer *mixer,
                                               int index)
 {
+       u32 supported_encodings, supported_ranges;
        struct sun8i_vi_layer *layer;
        unsigned int plane_cnt;
        int ret;
@@ -469,6 +471,22 @@ struct sun8i_vi_layer *sun8i_vi_layer_init_one(struct drm_device *drm,
                return ERR_PTR(ret);
        }
 
+       supported_encodings = BIT(DRM_COLOR_YCBCR_BT601) |
+                             BIT(DRM_COLOR_YCBCR_BT709);
+
+       supported_ranges = BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) |
+                          BIT(DRM_COLOR_YCBCR_FULL_RANGE);
+
+       ret = drm_plane_create_color_properties(&layer->plane,
+                                               supported_encodings,
+                                               supported_ranges,
+                                               DRM_COLOR_YCBCR_BT709,
+                                               DRM_COLOR_YCBCR_LIMITED_RANGE);
+       if (ret) {
+               dev_err(drm->dev, "Couldn't add encoding and range properties!\n");
+               return ERR_PTR(ret);
+       }
+
        drm_plane_helper_add(&layer->plane, &sun8i_vi_layer_helper_funcs);
        layer->mixer = mixer;
        layer->channel = index;
index 3a1476818c6530bb95e3854cc87beef2e425fe92..c243af156ee752007856902a4aeff87d689ee849 100644 (file)
 
 #include <linux/module.h>
 
-#include <drm/drmP.h>
-#include "tdfx_drv.h"
-
-#include <drm/drm_pciids.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_file.h>
+#include <drm/drm_ioctl.h>
 #include <drm/drm_legacy.h>
+#include <drm/drm_pci.h>
+#include <drm/drm_pciids.h>
+
+#include "tdfx_drv.h"
 
 static struct pci_device_id pciidlist[] = {
        tdfx_PCI_IDS
index ddb802bce0a3252e0ed447f927187cdf0feacd09..870904bfad787433d2b133dd8be90242b9d8ef80 100644 (file)
@@ -888,33 +888,33 @@ static int tegra_gem_get_flags(struct drm_device *drm, void *data,
 static const struct drm_ioctl_desc tegra_drm_ioctls[] = {
 #ifdef CONFIG_DRM_TEGRA_STAGING
        DRM_IOCTL_DEF_DRV(TEGRA_GEM_CREATE, tegra_gem_create,
-                         DRM_UNLOCKED | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(TEGRA_GEM_MMAP, tegra_gem_mmap,
-                         DRM_UNLOCKED | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(TEGRA_SYNCPT_READ, tegra_syncpt_read,
-                         DRM_UNLOCKED | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(TEGRA_SYNCPT_INCR, tegra_syncpt_incr,
-                         DRM_UNLOCKED | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(TEGRA_SYNCPT_WAIT, tegra_syncpt_wait,
-                         DRM_UNLOCKED | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(TEGRA_OPEN_CHANNEL, tegra_open_channel,
-                         DRM_UNLOCKED | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(TEGRA_CLOSE_CHANNEL, tegra_close_channel,
-                         DRM_UNLOCKED | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(TEGRA_GET_SYNCPT, tegra_get_syncpt,
-                         DRM_UNLOCKED | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(TEGRA_SUBMIT, tegra_submit,
-                         DRM_UNLOCKED | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(TEGRA_GET_SYNCPT_BASE, tegra_get_syncpt_base,
-                         DRM_UNLOCKED | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(TEGRA_GEM_SET_TILING, tegra_gem_set_tiling,
-                         DRM_UNLOCKED | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(TEGRA_GEM_GET_TILING, tegra_gem_get_tiling,
-                         DRM_UNLOCKED | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(TEGRA_GEM_SET_FLAGS, tegra_gem_set_flags,
-                         DRM_UNLOCKED | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(TEGRA_GEM_GET_FLAGS, tegra_gem_get_flags,
-                         DRM_UNLOCKED | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
 #endif
 };
 
@@ -1004,7 +1004,7 @@ static int tegra_debugfs_init(struct drm_minor *minor)
 #endif
 
 static struct drm_driver tegra_drm_driver = {
-       .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME |
+       .driver_features = DRIVER_MODESET | DRIVER_GEM |
                           DRIVER_ATOMIC | DRIVER_RENDER,
        .load = tegra_drm_load,
        .unload = tegra_drm_unload,
index df53a46285a3fe3430c90eb5496f945f4d7a304e..0a3d925d52840bb7bf59bc9bc4a5e826136d6976 100644 (file)
@@ -626,20 +626,19 @@ static const struct dma_buf_ops tegra_gem_prime_dmabuf_ops = {
        .vunmap = tegra_gem_prime_vunmap,
 };
 
-struct dma_buf *tegra_gem_prime_export(struct drm_device *drm,
-                                      struct drm_gem_object *gem,
+struct dma_buf *tegra_gem_prime_export(struct drm_gem_object *gem,
                                       int flags)
 {
        DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
 
        exp_info.exp_name = KBUILD_MODNAME;
-       exp_info.owner = drm->driver->fops->owner;
+       exp_info.owner = gem->dev->driver->fops->owner;
        exp_info.ops = &tegra_gem_prime_dmabuf_ops;
        exp_info.size = gem->size;
        exp_info.flags = flags;
        exp_info.priv = gem;
 
-       return drm_gem_dmabuf_export(drm, &exp_info);
+       return drm_gem_dmabuf_export(gem->dev, &exp_info);
 }
 
 struct drm_gem_object *tegra_gem_prime_import(struct drm_device *drm,
index 413eae83ad81e2006c65f01de49ab612b06b58fa..f1f758b2588668ca7562614886f64f3c77507a5b 100644 (file)
@@ -70,8 +70,7 @@ extern const struct vm_operations_struct tegra_bo_vm_ops;
 int __tegra_gem_mmap(struct drm_gem_object *gem, struct vm_area_struct *vma);
 int tegra_drm_mmap(struct file *file, struct vm_area_struct *vma);
 
-struct dma_buf *tegra_gem_prime_export(struct drm_device *drm,
-                                      struct drm_gem_object *gem,
+struct dma_buf *tegra_gem_prime_export(struct drm_gem_object *gem,
                                       int flags);
 struct drm_gem_object *tegra_gem_prime_import(struct drm_device *drm,
                                              struct dma_buf *buf);
index 650d162e374bbd1633782b50055847814014186f..8fa9b3e5e23086b446a05227c27786a0ef556ec4 100644 (file)
@@ -4,16 +4,20 @@
  * Author: Rob Clark <robdclark@gmail.com>
  */
 
+#include <linux/delay.h>
+#include <linux/dma-mapping.h>
+#include <linux/of_graph.h>
+#include <linux/pm_runtime.h>
+
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc.h>
-#include <drm/drm_flip_work.h>
-#include <drm/drm_plane_helper.h>
-#include <linux/workqueue.h>
-#include <linux/completion.h>
-#include <linux/dma-mapping.h>
-#include <linux/of_graph.h>
-#include <linux/math64.h>
+#include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_modeset_helper_vtables.h>
+#include <drm/drm_print.h>
+#include <drm/drm_vblank.h>
 
 #include "tilcdc_drv.h"
 #include "tilcdc_regs.h"
index 7339bab3a0a1f82e224c8dc33c82792f1c5442e1..3046a4a4232dd0650868fd18fa294cf2e119c620 100644 (file)
@@ -7,19 +7,30 @@
 /* LCDC DRM driver, based on da8xx-fb */
 
 #include <linux/component.h>
+#include <linux/mod_devicetable.h>
+#include <linux/module.h>
 #include <linux/pinctrl/consumer.h>
-#include <linux/suspend.h>
-#include <drm/drm_atomic.h>
+#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
+
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_debugfs.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_fb_helper.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
+#include <drm/drm_irq.h>
+#include <drm/drm_mm.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
+
 
 #include "tilcdc_drv.h"
+#include "tilcdc_external.h"
+#include "tilcdc_panel.h"
 #include "tilcdc_regs.h"
 #include "tilcdc_tfp410.h"
-#include "tilcdc_panel.h"
-#include "tilcdc_external.h"
 
 static LIST_HEAD(module_list);
 
@@ -501,8 +512,7 @@ static int tilcdc_debugfs_init(struct drm_minor *minor)
 DEFINE_DRM_GEM_CMA_FOPS(fops);
 
 static struct drm_driver tilcdc_driver = {
-       .driver_features    = (DRIVER_GEM | DRIVER_MODESET |
-                              DRIVER_PRIME | DRIVER_ATOMIC),
+       .driver_features    = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
        .irq_handler        = tilcdc_irq,
        .gem_free_object_unlocked = drm_gem_cma_free_object,
        .gem_print_info     = drm_gem_cma_print_info,
@@ -511,8 +521,6 @@ static struct drm_driver tilcdc_driver = {
 
        .prime_handle_to_fd     = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle     = drm_gem_prime_fd_to_handle,
-       .gem_prime_import       = drm_gem_prime_import,
-       .gem_prime_export       = drm_gem_prime_export,
        .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
        .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
        .gem_prime_vmap         = drm_gem_cma_prime_vmap,
index 99432296c0ff14316bf43f413e65a4afb9468f05..e93f801a4ce776efefbe6b36b7b75d0011abf3f7 100644 (file)
@@ -7,21 +7,24 @@
 #ifndef __TILCDC_DRV_H__
 #define __TILCDC_DRV_H__
 
-#include <linux/clk.h>
 #include <linux/cpufreq.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/pm.h>
-#include <linux/pm_runtime.h>
-#include <linux/slab.h>
-#include <linux/of.h>
-#include <linux/of_device.h>
-#include <linux/list.h>
-
-#include <drm/drmP.h>
-#include <drm/drm_bridge.h>
-#include <drm/drm_fb_cma_helper.h>
-#include <drm/drm_gem_cma_helper.h>
+#include <linux/irqreturn.h>
+
+#include <drm/drm_print.h>
+
+struct clk;
+struct workqueue_struct;
+
+struct drm_connector;
+struct drm_connector_helper_funcs;
+struct drm_crtc;
+struct drm_device;
+struct drm_display_mode;
+struct drm_encoder;
+struct drm_framebuffer;
+struct drm_minor;
+struct drm_pending_vblank_event;
+struct drm_plane;
 
 /* Defaulting to pixel clock defined on AM335x */
 #define TILCDC_DEFAULT_MAX_PIXELCLOCK  126000
index 7050eb4cf15239fef0f36d7d041f275b0ab969d5..39f4c0a0234951edbdc1d591dfc2bd8d0f8530c8 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <linux/component.h>
 #include <linux/of_graph.h>
+
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_of.h>
 
index 22b100d2e17431c898c6555bbf267ffc2d12635c..11eb9fd38c4e23e0a735eb774cf12c2dc2d8589a 100644 (file)
@@ -4,14 +4,17 @@
  * Author: Rob Clark <robdclark@gmail.com>
  */
 
-#include <linux/pinctrl/pinmux.h>
-#include <linux/pinctrl/consumer.h>
-#include <linux/backlight.h>
 #include <linux/gpio/consumer.h>
+#include <linux/pinctrl/consumer.h>
+#include <linux/platform_device.h>
+
 #include <video/display_timing.h>
 #include <video/of_display_timing.h>
 #include <video/videomode.h>
-#include <drm/drm_atomic_helper.h>
+
+#include <drm/drm_atomic_state_helper.h>
+#include <drm/drm_connector.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_probe_helper.h>
 
 #include "tilcdc_drv.h"
index 8c2776acdf9964039e3b3fb04a69956d54e9230c..3abb9641f2123fdc1fa95fb0a38d8683a68b6cea 100644 (file)
@@ -4,12 +4,10 @@
  * Author: Jyri Sarha <jsarha@ti.com>
  */
 
-#include <drm/drmP.h>
-
 #include <drm/drm_atomic.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_atomic_helper.h>
-#include <uapi/drm/drm_fourcc.h>
+#include <drm/drm_fourcc.h>
 
 #include "tilcdc_drv.h"
 
index 62d014c20988553cd31d0626e7911b6ce60127dc..c6e4e52f32bcd6856a476434b9ac75a44abbff65 100644 (file)
@@ -4,12 +4,14 @@
  * Author: Rob Clark <robdclark@gmail.com>
  */
 
-#include <linux/i2c.h>
 #include <linux/gpio.h>
+#include <linux/mod_devicetable.h>
 #include <linux/of_gpio.h>
-#include <linux/pinctrl/pinmux.h>
-#include <linux/pinctrl/consumer.h>
+#include <linux/platform_device.h>
+
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_encoder.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_probe_helper.h>
 
 #include "tilcdc_drv.h"
index 5773d0fb6ca1cdb1a34553bfe9b1ca8552d18022..be197c5c32119bab62ddb664b2f1bcbdb42a808e 100644 (file)
@@ -193,7 +193,7 @@ static const struct drm_display_mode yx350hv15_mode = {
 DEFINE_DRM_GEM_CMA_FOPS(hx8357d_fops);
 
 static struct drm_driver hx8357d_driver = {
-       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_ATOMIC,
+       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
        .fops                   = &hx8357d_fops,
        .release                = mipi_dbi_release,
        DRM_GEM_CMA_VMAP_DRIVER_OPS,
index ea69019f2f337de080184bd976807c43a2fe0a2d..7a8e1b4a37ee2dcf19e377c155ec28e8b4da1390 100644 (file)
@@ -350,8 +350,7 @@ static const struct drm_display_mode ili9225_mode = {
 DEFINE_DRM_GEM_CMA_FOPS(ili9225_fops);
 
 static struct drm_driver ili9225_driver = {
-       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME |
-                                 DRIVER_ATOMIC,
+       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
        .fops                   = &ili9225_fops,
        .release                = mipi_dbi_release,
        DRM_GEM_CMA_VMAP_DRIVER_OPS,
index 4ade9e4b924fd15d8118445225e9ddb40d55ebd6..00f28b8e4345be68da4397e283568bf7e4524b90 100644 (file)
@@ -149,7 +149,7 @@ static const struct drm_display_mode yx240qv29_mode = {
 DEFINE_DRM_GEM_CMA_FOPS(ili9341_fops);
 
 static struct drm_driver ili9341_driver = {
-       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_ATOMIC,
+       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
        .fops                   = &ili9341_fops,
        .release                = mipi_dbi_release,
        DRM_GEM_CMA_VMAP_DRIVER_OPS,
index fdefa53455d4b8306e30a86831163b485d029c33..7a14d6b355f27e9b8f4b830d897d9699785720a2 100644 (file)
@@ -153,8 +153,7 @@ static const struct drm_display_mode mi0283qt_mode = {
 DEFINE_DRM_GEM_CMA_FOPS(mi0283qt_fops);
 
 static struct drm_driver mi0283qt_driver = {
-       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME |
-                                 DRIVER_ATOMIC,
+       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
        .fops                   = &mi0283qt_fops,
        .release                = mipi_dbi_release,
        DRM_GEM_CMA_VMAP_DRIVER_OPS,
index 97a874b40394e2e801c721ee63ab72fa3626164e..85acfccefcdb7703ec8c4e5a6d26c02b68a52bab 100644 (file)
@@ -925,8 +925,7 @@ static const u8 repaper_e2271cs021_cs[] = { 0x00, 0x00, 0x00, 0x7f,
 DEFINE_DRM_GEM_CMA_FOPS(repaper_fops);
 
 static struct drm_driver repaper_driver = {
-       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME |
-                                 DRIVER_ATOMIC,
+       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
        .fops                   = &repaper_fops,
        .release                = repaper_release,
        DRM_GEM_CMA_VMAP_DRIVER_OPS,
index 9ac6262651525f6f93f874ca249e5334b6245801..204face7b3113ff9565985761a0b08f311fc846f 100644 (file)
@@ -296,8 +296,7 @@ static const struct drm_display_mode st7586_mode = {
 DEFINE_DRM_GEM_CMA_FOPS(st7586_fops);
 
 static struct drm_driver st7586_driver = {
-       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME |
-                                 DRIVER_ATOMIC,
+       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
        .fops                   = &st7586_fops,
        .release                = mipi_dbi_release,
        DRM_GEM_CMA_VMAP_DRIVER_OPS,
index ce9109e613e0d250bf63053231e596e75ecb10d6..b23899788f5bdd19bf10b73bae843ab9b74d7e81 100644 (file)
@@ -123,8 +123,7 @@ static const struct drm_display_mode jd_t18003_t01_mode = {
 DEFINE_DRM_GEM_CMA_FOPS(st7735r_fops);
 
 static struct drm_driver st7735r_driver = {
-       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME |
-                                 DRIVER_ATOMIC,
+       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
        .fops                   = &st7735r_fops,
        .release                = mipi_dbi_release,
        DRM_GEM_CMA_VMAP_DRIVER_OPS,
index 58fd31030834b5fb6120299797f65f9a175ac5e9..d733bbc4ac0e5d95f55b1d4cefae688854541eea 100644 (file)
@@ -9,16 +9,18 @@
  * Copyright (C) 2011 Texas Instruments
  * Copyright (C) 2017 Eric Anholt
  */
+
 #include <linux/clk.h>
 #include <linux/version.h>
 #include <linux/dma-buf.h>
 #include <linux/of_graph.h>
 
-#include <drm/drmP.h>
-#include <drm/drm_panel.h>
+#include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
-#include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_panel.h>
+#include <drm/drm_vblank.h>
 
 #include "tve200_drm.h"
 
index 62061b518397add3b220966d3eeee750f90fd786..5420b52ea16b5ac2105e047afb71b9c21c38af6b 100644 (file)
 #ifndef _TVE200_DRM_H_
 #define _TVE200_DRM_H_
 
+#include <linux/irqreturn.h>
+
+#include <drm/drm_simple_kms_helper.h>
+
+struct clk;
+struct drm_bridge;
+struct drm_connector;
+struct drm_device;
+struct drm_file;
+struct drm_mode_create_dumb;
+struct drm_panel;
+
 /* Bits 2-31 are valid physical base addresses */
 #define TVE200_Y_FRAME_BASE_ADDR       0x00
 #define TVE200_U_FRAME_BASE_ADDR       0x04
 #define TVE200_CTRL_4                  0x24
 #define TVE200_CTRL_4_RESET            BIT(0) /* triggers reset of TVE200 */
 
-#include <drm/drm_gem.h>
-#include <drm/drm_simple_kms_helper.h>
-
 struct tve200_drm_dev_private {
        struct drm_device *drm;
 
index 6e695fbeb6bc3aff4de6a79187b937f5925ff6f2..416f24823c0aa5a9f623b5669c132b3ae491a5e5 100644 (file)
@@ -37,9 +37,9 @@
 #include <linux/slab.h>
 #include <linux/version.h>
 
-#include <drm/drmP.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_gem_cma_helper.h>
@@ -47,6 +47,7 @@
 #include <drm/drm_of.h>
 #include <drm/drm_panel.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
 
 #include "tve200_drm.h"
 
@@ -137,8 +138,7 @@ finish:
 DEFINE_DRM_GEM_CMA_FOPS(drm_fops);
 
 static struct drm_driver tve200_drm_driver = {
-       .driver_features =
-               DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME | DRIVER_ATOMIC,
+       .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
        .ioctls = NULL,
        .fops = &drm_fops,
        .name = "tve200",
@@ -153,8 +153,6 @@ static struct drm_driver tve200_drm_driver = {
 
        .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
-       .gem_prime_import = drm_gem_prime_import,
-       .gem_prime_export = drm_gem_prime_export,
        .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
        .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
        .gem_prime_vmap = drm_gem_cma_prime_vmap,
index 921561875d7fa56920ae4a587d61f00e247e6fae..ddb61a60c61049f787bd580d6f58c8082df172de 100644 (file)
@@ -7,11 +7,9 @@
  * Copyright (C) 2009 Bernie Thompson <bernie@plugable.com>
  */
 
-#include <drm/drmP.h>
-#include <drm/drm_crtc.h>
-#include <drm/drm_edid.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_probe_helper.h>
+
 #include "udl_connector.h"
 #include "udl_drv.h"
 
index 0fb0db5c46120c64a307931a32590d1c9b6f8c7c..7f2d392df17377c81ce44b5fb1764e90366e4401 100644 (file)
@@ -3,6 +3,8 @@
 
 #include <drm/drm_crtc.h>
 
+struct edid;
+
 struct udl_drm_connector {
        struct drm_connector connector;
        /* last udl_detect edid */
index a28892146f7cffbb1144ad391f9f1820f4e0c57f..3108e9a9234b92fc93ded8ff544bd991e160cba1 100644 (file)
@@ -5,11 +5,13 @@
  * Copyright (c) 2014 The Chromium OS Authors
  */
 
-#include <drm/drmP.h>
-#include "udl_drv.h"
 #include <linux/shmem_fs.h>
 #include <linux/dma-buf.h>
 
+#include <drm/drm_prime.h>
+
+#include "udl_drv.h"
+
 struct udl_drm_dmabuf_attachment {
        struct sg_table sgt;
        enum dma_data_direction dir;
@@ -170,8 +172,7 @@ static const struct dma_buf_ops udl_dmabuf_ops = {
        .release                = drm_gem_dmabuf_release,
 };
 
-struct dma_buf *udl_gem_prime_export(struct drm_device *dev,
-                                    struct drm_gem_object *obj, int flags)
+struct dma_buf *udl_gem_prime_export(struct drm_gem_object *obj, int flags)
 {
        DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
 
@@ -180,7 +181,7 @@ struct dma_buf *udl_gem_prime_export(struct drm_device *dev,
        exp_info.flags = flags;
        exp_info.priv = obj;
 
-       return drm_gem_dmabuf_export(dev, &exp_info);
+       return drm_gem_dmabuf_export(obj->dev, &exp_info);
 }
 
 static int udl_prime_create(struct drm_device *dev,
index 4a49facb608df3a2a293c4eb1291af4d77d43d46..8426669433e42c820bdc38a8f8acebf9e0cfc354 100644 (file)
@@ -4,9 +4,14 @@
  */
 
 #include <linux/module.h>
-#include <drm/drmP.h>
+
 #include <drm/drm_crtc_helper.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_file.h>
+#include <drm/drm_ioctl.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_print.h>
+
 #include "udl_drv.h"
 
 static int udl_usb_suspend(struct usb_interface *interface,
@@ -54,7 +59,7 @@ static void udl_driver_release(struct drm_device *dev)
 }
 
 static struct drm_driver driver = {
-       .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME,
+       .driver_features = DRIVER_MODESET | DRIVER_GEM,
        .release = udl_driver_release,
 
        /* gem hooks */
index a928801026c16806462ec810fa2fc496a7bbead8..12a970fd9a870b7216ba5f6aecc0e1fdc787b949 100644 (file)
 #ifndef UDL_DRV_H
 #define UDL_DRV_H
 
+#include <linux/mm_types.h>
 #include <linux/usb.h>
+
+#include <drm/drm_device.h>
+#include <drm/drm_framebuffer.h>
 #include <drm/drm_gem.h>
-#include <linux/mm_types.h>
+
+struct drm_encoder;
+struct drm_mode_create_dumb;
 
 #define DRIVER_NAME            "udl"
 #define DRIVER_DESC            "DisplayLink"
@@ -126,8 +132,7 @@ int udl_gem_mmap(struct drm_file *file_priv, struct drm_device *dev,
 void udl_gem_free_object(struct drm_gem_object *gem_obj);
 struct udl_gem_object *udl_gem_alloc_object(struct drm_device *dev,
                                            size_t size);
-struct dma_buf *udl_gem_prime_export(struct drm_device *dev,
-                                    struct drm_gem_object *obj, int flags);
+struct dma_buf *udl_gem_prime_export(struct drm_gem_object *obj, int flags);
 struct drm_gem_object *udl_gem_prime_import(struct drm_device *dev,
                                struct dma_buf *dma_buf);
 
index f87989e6ee51ca24fe513386c3d8664606806791..203f041e737c4899dbda057aa9f5cc36ac6935da 100644 (file)
@@ -7,9 +7,9 @@
  * Copyright (C) 2009 Bernie Thompson <bernie@plugable.com>
  */
 
-#include <drm/drmP.h>
-#include <drm/drm_crtc.h>
-#include <drm/drm_crtc_helper.h>
+#include <drm/drm_encoder.h>
+#include <drm/drm_modeset_helper_vtables.h>
+
 #include "udl_drv.h"
 
 /* dummy encoder */
index e1116bf7b9d72c0785d5844e51256480fcbf99cb..ef3504d06343434ecede3dccf96514e2cb4ae9c2 100644 (file)
@@ -7,18 +7,17 @@
  * Copyright (C) 2009 Jaya Kumar <jayakumar.lkml@gmail.com>
  * Copyright (C) 2009 Bernie Thompson <bernie@plugable.com>
  */
-#include <linux/module.h>
-#include <linux/slab.h>
-#include <linux/fb.h>
+
+#include <linux/moduleparam.h>
 #include <linux/dma-buf.h>
-#include <linux/mem_encrypt.h>
 
-#include <drm/drmP.h>
-#include <drm/drm_crtc.h>
 #include <drm/drm_crtc_helper.h>
-#include "udl_drv.h"
-
+#include <drm/drm_drv.h>
 #include <drm/drm_fb_helper.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_modeset_helper.h>
+
+#include "udl_drv.h"
 
 #define DL_DEFIO_WRITE_DELAY    (HZ/20) /* fb_deferred_io.delay in jiffies */
 
index c6ca2c09bc9773e5ad0c0130a0e4db3e34e6540b..b23a5c2fcd80c263eec8f327e66b8f81b472745b 100644 (file)
@@ -3,10 +3,13 @@
  * Copyright (C) 2012 Red Hat
  */
 
-#include <drm/drmP.h>
-#include "udl_drv.h"
-#include <linux/shmem_fs.h>
 #include <linux/dma-buf.h>
+#include <linux/vmalloc.h>
+
+#include <drm/drm_mode.h>
+#include <drm/drm_prime.h>
+
+#include "udl_drv.h"
 
 struct udl_gem_object *udl_gem_alloc_object(struct drm_device *dev,
                                            size_t size)
index 1a99c76474441634213031116ff9f80b0d6ac85f..4e854e017390a41ae05a3511d18fe357618a6e3c 100644 (file)
@@ -7,9 +7,11 @@
  * Copyright (C) 2009 Jaya Kumar <jayakumar.lkml@gmail.com>
  * Copyright (C) 2009 Bernie Thompson <bernie@plugable.com>
  */
-#include <drm/drmP.h>
-#include <drm/drm_crtc_helper.h>
+
+#include <drm/drm.h>
+#include <drm/drm_print.h>
 #include <drm/drm_probe_helper.h>
+
 #include "udl_drv.h"
 
 /* -BULK_SIZE as per usb-skeleton. Can we get full page and avoid overhead? */
index 793722d0c8cdbd02a62b76bae13a05a059f730d6..bc1ab6060dc6b96c894caf7af2a9fd73d9aa13b6 100644 (file)
@@ -9,10 +9,10 @@
 
  */
 
-#include <drm/drmP.h>
-#include <drm/drm_crtc.h>
 #include <drm/drm_crtc_helper.h>
-#include <drm/drm_plane_helper.h>
+#include <drm/drm_modeset_helper_vtables.h>
+#include <drm/drm_vblank.h>
+
 #include "udl_drv.h"
 
 /*
index 6837f592f6ba7bd749d4758c5dfb302389db3eb7..1973a4c1e358760e52de877d8b9033cbe7f6c117 100644 (file)
@@ -7,12 +7,8 @@
  * Copyright (C) 2009 Bernie Thompson <bernie@plugable.com>
  */
 
-#include <linux/module.h>
-#include <linux/slab.h>
-#include <linux/fb.h>
 #include <asm/unaligned.h>
 
-#include <drm/drmP.h>
 #include "udl_drv.h"
 
 #define MAX_CMD_PIXELS         255
index 78a78938e81f67096d9039a871df4936af7feb60..9e953ce64ef753632a644c0ea8ac87433951ff5b 100644 (file)
@@ -6,7 +6,8 @@
 #include <linux/debugfs.h>
 #include <linux/pm_runtime.h>
 #include <linux/seq_file.h>
-#include <drm/drmP.h>
+
+#include <drm/drm_debugfs.h>
 
 #include "v3d_drv.h"
 #include "v3d_regs.h"
index fea597f4db8acbdd1178e77825682357517a2cbb..3506ae2723ae156b9ad0f9de9a0c037855529c0c 100644 (file)
 
 #include <linux/clk.h>
 #include <linux/device.h>
+#include <linux/dma-mapping.h>
 #include <linux/io.h>
 #include <linux/module.h>
 #include <linux/of_platform.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/reset.h>
+
+#include <drm/drm_drv.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_fb_helper.h>
+#include <uapi/drm/v3d_drm.h>
 
-#include "uapi/drm/v3d_drm.h"
 #include "v3d_drv.h"
 #include "v3d_regs.h"
 
@@ -188,7 +191,6 @@ static const struct drm_ioctl_desc v3d_drm_ioctls[] = {
 static struct drm_driver v3d_drm_driver = {
        .driver_features = (DRIVER_GEM |
                            DRIVER_RENDER |
-                           DRIVER_PRIME |
                            DRIVER_SYNCOBJ),
 
        .open = v3d_open,
index 9aad9da1eb114fbe95fe9fdee5679c5a26c086b7..9a35c555ec522ecb67001e3c834b27abfc5e4179 100644 (file)
@@ -1,14 +1,23 @@
 // SPDX-License-Identifier: GPL-2.0+
 /* Copyright (C) 2015-2018 Broadcom */
 
-#include <linux/mm_types.h>
-#include <drm/drmP.h>
+#include <linux/delay.h>
+#include <linux/mutex.h>
+#include <linux/spinlock_types.h>
+#include <linux/workqueue.h>
+
 #include <drm/drm_encoder.h>
 #include <drm/drm_gem.h>
 #include <drm/drm_gem_shmem_helper.h>
 #include <drm/gpu_scheduler.h>
+
 #include "uapi/drm/v3d_drm.h"
 
+struct clk;
+struct device;
+struct platform_device;
+struct reset_control;
+
 #define GMP_GRANULARITY (128 * 1024)
 
 /* Enum for each of the V3D queues. */
index 27e0f87075d96343a82fc050ddf570222af170da..79744137d89fe9a8736e00cccc95fcddafd50ca4 100644 (file)
@@ -1,17 +1,19 @@
 // SPDX-License-Identifier: GPL-2.0+
 /* Copyright (C) 2014-2018 Broadcom */
 
-#include <drm/drmP.h>
-#include <drm/drm_syncobj.h>
+#include <linux/device.h>
+#include <linux/dma-mapping.h>
+#include <linux/io.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/reset.h>
-#include <linux/device.h>
-#include <linux/io.h>
 #include <linux/sched/signal.h>
+#include <linux/uaccess.h>
+
+#include <drm/drm_syncobj.h>
+#include <uapi/drm/v3d_drm.h>
 
-#include "uapi/drm/v3d_drm.h"
 #include "v3d_drv.h"
 #include "v3d_regs.h"
 #include "v3d_trace.h"
index 268d8a889ac5b9bc9601cb47d2b69cc1f18a3ca8..662e67279a7bb40554a02e68588e6e538556c8af 100644 (file)
@@ -13,6 +13,8 @@
  * current job can make progress.
  */
 
+#include <linux/platform_device.h>
+
 #include "v3d_drv.h"
 #include "v3d_regs.h"
 #include "v3d_trace.h"
index 1224f313af0c00e1e0ec6a98cd874c4f3674eee5..55d798c76b21f55ccf4179f3d25c292d7962f29e 100644 (file)
@@ -1,6 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0
 vboxvideo-y :=  hgsmi_base.o modesetting.o vbva_base.o \
                vbox_drv.o vbox_fb.o vbox_hgsmi.o vbox_irq.o vbox_main.o \
-               vbox_mode.o vbox_prime.o vbox_ttm.o
+               vbox_mode.o vbox_ttm.o
 
 obj-$(CONFIG_DRM_VBOXVIDEO) += vboxvideo.o
index 02537ab9cc08af1f557d6357d1f783cb901d68cc..6189ea89bb7138f417e9fefe6dd4d9c9b6245926 100644 (file)
@@ -196,7 +196,7 @@ static const struct file_operations vbox_fops = {
 
 static struct drm_driver driver = {
        .driver_features =
-           DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME | DRIVER_ATOMIC,
+           DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
 
        .lastclose = drm_fb_helper_lastclose,
 
@@ -210,17 +210,6 @@ static struct drm_driver driver = {
        .patchlevel = DRIVER_PATCHLEVEL,
 
        DRM_GEM_VRAM_DRIVER,
-       .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
-       .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
-       .gem_prime_export = drm_gem_prime_export,
-       .gem_prime_import = drm_gem_prime_import,
-       .gem_prime_pin = vbox_gem_prime_pin,
-       .gem_prime_unpin = vbox_gem_prime_unpin,
-       .gem_prime_get_sg_table = vbox_gem_prime_get_sg_table,
-       .gem_prime_import_sg_table = vbox_gem_prime_import_sg_table,
-       .gem_prime_vmap = vbox_gem_prime_vmap,
-       .gem_prime_vunmap = vbox_gem_prime_vunmap,
-       .gem_prime_mmap = vbox_gem_prime_mmap,
 };
 
 static int __init vbox_init(void)
index 9028f946bc0663533a7755936a10b578c3363deb..e8cb9efc6088961f6cb28ef2a49d21b4baf1e505 100644 (file)
@@ -167,18 +167,6 @@ void vbox_mm_fini(struct vbox_private *vbox);
 int vbox_gem_create(struct vbox_private *vbox,
                    u32 size, bool iskernel, struct drm_gem_object **obj);
 
-/* vbox_prime.c */
-int vbox_gem_prime_pin(struct drm_gem_object *obj);
-void vbox_gem_prime_unpin(struct drm_gem_object *obj);
-struct sg_table *vbox_gem_prime_get_sg_table(struct drm_gem_object *obj);
-struct drm_gem_object *vbox_gem_prime_import_sg_table(
-       struct drm_device *dev, struct dma_buf_attachment *attach,
-       struct sg_table *table);
-void *vbox_gem_prime_vmap(struct drm_gem_object *obj);
-void vbox_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
-int vbox_gem_prime_mmap(struct drm_gem_object *obj,
-                       struct vm_area_struct *area);
-
 /* vbox_irq.c */
 int vbox_irq_init(struct vbox_private *vbox);
 void vbox_irq_fini(struct vbox_private *vbox);
diff --git a/drivers/gpu/drm/vboxvideo/vbox_prime.c b/drivers/gpu/drm/vboxvideo/vbox_prime.c
deleted file mode 100644 (file)
index 702b1aa..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-// SPDX-License-Identifier: MIT
-/*
- * Copyright (C) 2017 Oracle Corporation
- * Copyright 2017 Canonical
- * Authors: Andreas Pokorny
- */
-
-#include "vbox_drv.h"
-
-/*
- * Based on qxl_prime.c:
- * Empty Implementations as there should not be any other driver for a virtual
- * device that might share buffers with vboxvideo
- */
-
-int vbox_gem_prime_pin(struct drm_gem_object *obj)
-{
-       WARN_ONCE(1, "not implemented");
-       return -ENODEV;
-}
-
-void vbox_gem_prime_unpin(struct drm_gem_object *obj)
-{
-       WARN_ONCE(1, "not implemented");
-}
-
-struct sg_table *vbox_gem_prime_get_sg_table(struct drm_gem_object *obj)
-{
-       WARN_ONCE(1, "not implemented");
-       return ERR_PTR(-ENODEV);
-}
-
-struct drm_gem_object *vbox_gem_prime_import_sg_table(
-       struct drm_device *dev, struct dma_buf_attachment *attach,
-       struct sg_table *table)
-{
-       WARN_ONCE(1, "not implemented");
-       return ERR_PTR(-ENODEV);
-}
-
-void *vbox_gem_prime_vmap(struct drm_gem_object *obj)
-{
-       WARN_ONCE(1, "not implemented");
-       return ERR_PTR(-ENODEV);
-}
-
-void vbox_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
-{
-       WARN_ONCE(1, "not implemented");
-}
-
-int vbox_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *area)
-{
-       WARN_ONCE(1, "not implemented");
-       return -ENODEV;
-}
index a75a2f98b82fd4a5be8e9f7a7f5722da7628244b..72d30d90b856ce2f14249208641e6a720c7fbd1d 100644 (file)
@@ -655,8 +655,7 @@ static void vc4_bo_cache_time_timer(struct timer_list *t)
        schedule_work(&vc4->bo_cache.time_work);
 }
 
-struct dma_buf *
-vc4_prime_export(struct drm_device *dev, struct drm_gem_object *obj, int flags)
+struct dma_buf * vc4_prime_export(struct drm_gem_object *obj, int flags)
 {
        struct vc4_bo *bo = to_vc4_bo(obj);
        struct dma_buf *dmabuf;
@@ -678,7 +677,7 @@ vc4_prime_export(struct drm_device *dev, struct drm_gem_object *obj, int flags)
                return ERR_PTR(ret);
        }
 
-       dmabuf = drm_gem_prime_export(dev, obj, flags);
+       dmabuf = drm_gem_prime_export(obj, flags);
        if (IS_ERR(dmabuf))
                vc4_bo_dec_usecnt(bo);
 
@@ -791,8 +790,6 @@ vc4_prime_import_sg_table(struct drm_device *dev,
        if (IS_ERR(obj))
                return obj;
 
-       obj->resv = attach->dmabuf->resv;
-
        return obj;
 }
 
index 5ea8db74418aae210d4fe501d8fe0bd7f07d4995..f1f0a7c8777138d2b2610f4d443a6e260a8ff729 100644 (file)
  * ones that set the clock.
  */
 
+#include <linux/clk.h>
+#include <linux/component.h>
+#include <linux/of_device.h>
+
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_atomic_uapi.h>
+#include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_print.h>
 #include <drm/drm_probe_helper.h>
-#include <linux/clk.h>
-#include <drm/drm_fb_cma_helper.h>
-#include <linux/component.h>
-#include <linux/of_device.h>
+#include <drm/drm_vblank.h>
+
 #include "vc4_drv.h"
 #include "vc4_regs.h"
 
index 4829a00c16b0760a398ac95132fd38942df00d79..b61b2d3407b516c2c819584652a9051ffa5cb53c 100644 (file)
@@ -7,7 +7,6 @@
 #include <linux/circ_buf.h>
 #include <linux/ctype.h>
 #include <linux/debugfs.h>
-#include <drm/drmP.h>
 
 #include "vc4_drv.h"
 #include "vc4_regs.h"
index bf11930e40e19ea3cd0eb2e65017d8530a64ae0b..048c70a7b59273cbf7ddfaa71b5114618fbaf22d 100644 (file)
 #include <linux/clk.h>
 #include <linux/component.h>
 #include <linux/device.h>
+#include <linux/dma-mapping.h>
 #include <linux/io.h>
 #include <linux/module.h>
 #include <linux/of_platform.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
+
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_fb_helper.h>
-#include <drm/drm_atomic_helper.h>
+#include <drm/drm_vblank.h>
 
 #include "uapi/drm/vc4_drm.h"
+
 #include "vc4_drv.h"
 #include "vc4_regs.h"
 
@@ -177,7 +182,6 @@ static struct drm_driver vc4_drm_driver = {
                            DRIVER_ATOMIC |
                            DRIVER_GEM |
                            DRIVER_RENDER |
-                           DRIVER_PRIME |
                            DRIVER_SYNCOBJ),
        .open = vc4_open,
        .postclose = vc4_close,
@@ -199,7 +203,6 @@ static struct drm_driver vc4_drm_driver = {
 
        .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
-       .gem_prime_import = drm_gem_prime_import,
        .gem_prime_export = vc4_prime_export,
        .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
        .gem_prime_import_sg_table = vc4_prime_import_sg_table,
index 616c011bcb82aef4cea8037ae3805812d124605e..6627b20c99e9c8f2d5b1bcf1f795c4e3601aa58f 100644 (file)
@@ -3,16 +3,23 @@
  * Copyright (C) 2015 Broadcom
  */
 
-#include <linux/mm_types.h>
-#include <drm/drmP.h>
-#include <drm/drm_util.h>
+#include <linux/delay.h>
+#include <linux/refcount.h>
+#include <linux/uaccess.h>
+
+#include <drm/drm_atomic.h>
+#include <drm/drm_debugfs.h>
+#include <drm/drm_device.h>
 #include <drm/drm_encoder.h>
 #include <drm/drm_gem_cma_helper.h>
-#include <drm/drm_atomic.h>
-#include <drm/drm_syncobj.h>
+#include <drm/drm_mm.h>
+#include <drm/drm_modeset_lock.h>
 
 #include "uapi/drm/vc4_drm.h"
 
+struct drm_device;
+struct drm_gem_object;
+
 /* Don't forget to update vc4_bo.c: bo_type_names[] when adding to
  * this.
  */
@@ -705,8 +712,7 @@ struct vc4_bo *vc4_bo_create(struct drm_device *dev, size_t size,
 int vc4_dumb_create(struct drm_file *file_priv,
                    struct drm_device *dev,
                    struct drm_mode_create_dumb *args);
-struct dma_buf *vc4_prime_export(struct drm_device *dev,
-                                struct drm_gem_object *obj, int flags);
+struct dma_buf *vc4_prime_export(struct drm_gem_object *obj, int flags);
 int vc4_create_bo_ioctl(struct drm_device *dev, void *data,
                        struct drm_file *file_priv);
 int vc4_create_shader_bo_ioctl(struct drm_device *dev, void *data,
index 1db39b570cf4166f0fdc88657fb0012f1efdc136..c78fa8144776e7cf9abade9a81791c2c24ae5e62 100644 (file)
  * hopefully present.
  */
 
-#include <drm/drm_atomic_helper.h>
-#include <drm/drm_edid.h>
-#include <drm/drm_mipi_dsi.h>
-#include <drm/drm_of.h>
-#include <drm/drm_panel.h>
-#include <drm/drm_probe_helper.h>
-#include <linux/clk.h>
 #include <linux/clk-provider.h>
+#include <linux/clk.h>
 #include <linux/completion.h>
 #include <linux/component.h>
+#include <linux/dma-mapping.h>
 #include <linux/dmaengine.h>
 #include <linux/i2c.h>
 #include <linux/io.h>
 #include <linux/of_address.h>
 #include <linux/of_platform.h>
 #include <linux/pm_runtime.h>
+
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_edid.h>
+#include <drm/drm_mipi_dsi.h>
+#include <drm/drm_of.h>
+#include <drm/drm_panel.h>
+#include <drm/drm_probe_helper.h>
+
 #include "vc4_drv.h"
 #include "vc4_regs.h"
 
index 84795d928f2062b765d19f5aa5c6b56c33948784..b72b760e301809a5462fe3b2f6e7672459e6ddaf 100644 (file)
@@ -29,6 +29,8 @@
 #include <linux/sched/signal.h>
 #include <linux/dma-fence-array.h>
 
+#include <drm/drm_syncobj.h>
+
 #include "uapi/drm/vc4_drm.h"
 #include "vc4_drv.h"
 #include "vc4_regs.h"
index 0f633bef6b9d92071fd17ba7862031159241f71f..9936b15d0bf1fc076e0c942aef54796e3fe93344 100644 (file)
  * each CRTC.
  */
 
-#include <drm/drm_atomic_helper.h>
 #include <linux/component.h>
+#include <linux/platform_device.h>
+
+#include <drm/drm_atomic_helper.h>
+
 #include "vc4_drv.h"
 #include "vc4_regs.h"
 
index 70d079b7b39f7b5bdcd3214d8ef06351c42ffecf..78d4fb0499e39ac79af6f615c9ef95da2c0a4931 100644 (file)
  * crtc, HDMI encoder).
  */
 
-#include <drm/drm_crtc.h>
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_crtc.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
+
 #include "vc4_drv.h"
 #include "vc4_regs.h"
 
index 0a0207c350a5288fbdaa82686562cd742f8694c7..5e5f90810acaf3b0e9e43b9d5c01e453cc0c50f8 100644 (file)
 
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_atomic_uapi.h>
 #include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_plane_helper.h>
-#include <drm/drm_atomic_uapi.h>
 
 #include "uapi/drm/vc4_drm.h"
+
 #include "vc4_drv.h"
 #include "vc4_regs.h"
 
@@ -1123,7 +1126,6 @@ static int vc4_prepare_fb(struct drm_plane *plane,
                          struct drm_plane_state *state)
 {
        struct vc4_bo *bo;
-       struct dma_fence *fence;
        int ret;
 
        if (!state->fb)
@@ -1131,8 +1133,7 @@ static int vc4_prepare_fb(struct drm_plane *plane,
 
        bo = to_vc4_bo(&drm_fb_cma_get_gem_obj(state->fb, 0)->base);
 
-       fence = reservation_object_get_excl_rcu(bo->base.base.resv);
-       drm_atomic_set_fence_for_plane(state, fence);
+       drm_gem_fb_prepare_fb(plane, state);
 
        if (plane->state->fb == state->fb)
                return 0;
index 96f91c1b4b6e655ac542f807a04671175172a031..1ce4d7142b6e9f1bae20b4dcc20c14692fdf61b6 100644 (file)
@@ -7,18 +7,20 @@
  *     Boris Brezillon <boris.brezillon@bootlin.com>
  */
 
-#include <drm/drm_atomic_helper.h>
-#include <drm/drm_fb_cma_helper.h>
-#include <drm/drm_edid.h>
-#include <drm/drm_panel.h>
-#include <drm/drm_probe_helper.h>
-#include <drm/drm_writeback.h>
 #include <linux/clk.h>
 #include <linux/component.h>
 #include <linux/of_graph.h>
 #include <linux/of_platform.h>
 #include <linux/pm_runtime.h>
 
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_edid.h>
+#include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_panel.h>
+#include <drm/drm_probe_helper.h>
+#include <drm/drm_writeback.h>
+
 #include "vc4_drv.h"
 #include "vc4_regs.h"
 
index fee4f90e71aac2bba818cdc098ac0ef35952ef79..cea77a21b2059ed7f7b5aceaa13758b9135ddbbe 100644 (file)
@@ -7,7 +7,11 @@
 
 #include <linux/clk.h>
 #include <linux/component.h>
+#include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
+
+#include <drm/drm_irq.h>
+
 #include "vc4_drv.h"
 #include "vc4_regs.h"
 
index 11a8f99ba18c5f007734abef1003cc44d5e778a1..5bd60ded3d8151d2e63b85d7c7afbb626a689665 100644 (file)
  * software renderer and the X server for efficient buffer sharing.
  */
 
+#include <linux/dma-buf.h>
 #include <linux/module.h>
-#include <linux/ramfs.h>
+#include <linux/platform_device.h>
 #include <linux/shmem_fs.h>
-#include <linux/dma-buf.h>
+#include <linux/vmalloc.h>
+
+#include <drm/drm_drv.h>
+#include <drm/drm_file.h>
+#include <drm/drm_ioctl.h>
+#include <drm/drm_prime.h>
+
 #include "vgem_drv.h"
 
 #define DRIVER_NAME    "vgem"
@@ -214,7 +221,7 @@ static int vgem_gem_dumb_create(struct drm_file *file, struct drm_device *dev,
        args->size = gem_object->size;
        args->pitch = pitch;
 
-       DRM_DEBUG_DRIVER("Created object of size %lld\n", size);
+       DRM_DEBUG("Created object of size %lld\n", size);
 
        return 0;
 }
@@ -246,8 +253,8 @@ unref:
 }
 
 static struct drm_ioctl_desc vgem_ioctls[] = {
-       DRM_IOCTL_DEF_DRV(VGEM_FENCE_ATTACH, vgem_fence_attach_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF_DRV(VGEM_FENCE_SIGNAL, vgem_fence_signal_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(VGEM_FENCE_ATTACH, vgem_fence_attach_ioctl, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(VGEM_FENCE_SIGNAL, vgem_fence_signal_ioctl, DRM_RENDER_ALLOW),
 };
 
 static int vgem_mmap(struct file *filp, struct vm_area_struct *vma)
@@ -427,8 +434,7 @@ static void vgem_release(struct drm_device *dev)
 }
 
 static struct drm_driver vgem_driver = {
-       .driver_features                = DRIVER_GEM | DRIVER_PRIME |
-                                         DRIVER_RENDER,
+       .driver_features                = DRIVER_GEM | DRIVER_RENDER,
        .release                        = vgem_release,
        .open                           = vgem_open,
        .postclose                      = vgem_postclose,
@@ -446,7 +452,6 @@ static struct drm_driver vgem_driver = {
        .gem_prime_pin = vgem_prime_pin,
        .gem_prime_unpin = vgem_prime_unpin,
        .gem_prime_import = vgem_prime_import,
-       .gem_prime_export = drm_gem_prime_export,
        .gem_prime_import_sg_table = vgem_prime_import_sg_table,
        .gem_prime_get_sg_table = vgem_prime_get_sg_table,
        .gem_prime_vmap = vgem_prime_vmap,
index 5c8f6d619ff382a096d585e82b5ddf4f282366a9..0ed300317f8755b9bc8fcb0ce1c6f8e2275dd6a6 100644 (file)
@@ -29,7 +29,6 @@
 #ifndef _VGEM_DRV_H_
 #define _VGEM_DRV_H_
 
-#include <drm/drmP.h>
 #include <drm/drm_gem.h>
 #include <drm/drm_cache.h>
 
index eb17c0cd3727a46498bc6dc0d0c77ec70cde0cfb..d8630467549cdcedf43029e56f0877d8a30e8f21 100644 (file)
@@ -23,6 +23,8 @@
 #include <linux/dma-buf.h>
 #include <linux/reservation.h>
 
+#include <drm/drm_file.h>
+
 #include "vgem_drv.h"
 
 #define VGEM_FENCE_TIMEOUT (10*HZ)
@@ -100,22 +102,6 @@ static struct dma_fence *vgem_fence_create(struct vgem_file *vfile,
        return &fence->base;
 }
 
-static int attach_dmabuf(struct drm_device *dev,
-                        struct drm_gem_object *obj)
-{
-       struct dma_buf *dmabuf;
-
-       if (obj->dma_buf)
-               return 0;
-
-       dmabuf = dev->driver->gem_prime_export(dev, obj, 0);
-       if (IS_ERR(dmabuf))
-               return PTR_ERR(dmabuf);
-
-       obj->dma_buf = dmabuf;
-       return 0;
-}
-
 /*
  * vgem_fence_attach_ioctl (DRM_IOCTL_VGEM_FENCE_ATTACH):
  *
@@ -157,10 +143,6 @@ int vgem_fence_attach_ioctl(struct drm_device *dev,
        if (!obj)
                return -ENOENT;
 
-       ret = attach_dmabuf(dev, obj);
-       if (ret)
-               goto err;
-
        fence = vgem_fence_create(vfile, arg->flags);
        if (!fence) {
                ret = -ENOMEM;
@@ -168,7 +150,7 @@ int vgem_fence_attach_ioctl(struct drm_device *dev,
        }
 
        /* Check for a conflicting fence */
-       resv = obj->dma_buf->resv;
+       resv = obj->resv;
        if (!reservation_object_test_signaled_rcu(resv,
                                                  arg->flags & VGEM_FENCE_WRITE)) {
                ret = -EBUSY;
index ed0fcda713c3688ed3d2d209f04bd552c43d175a..5156e6b279db122c031a28ceef2b56a07a26b660 100644 (file)
@@ -23,8 +23,8 @@
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
-#include <linux/debugfs.h>
-#include <drm/drmP.h>
+#include <drm/drm_debugfs.h>
+#include <drm/drm_file.h>
 
 #include "virtgpu_drv.h"
 
index ba16e8cb7124798010c120d2df8e4c803a1a7a49..e622485ae82676436937a5226a0c71e0b4040d73 100644 (file)
  * OTHER DEALINGS IN THE SOFTWARE.
  */
 
-#include "virtgpu_drv.h"
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_damage_helper.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_probe_helper.h>
-#include <drm/drm_damage_helper.h>
+#include <drm/drm_vblank.h>
+
+#include "virtgpu_drv.h"
 
 #define XRES_MIN    32
 #define YRES_MIN    32
index c50868753132a9bf3e64d00a8345e16703426715..0fc32fa0b3c0fc818f2f4584064707bf3dadbe01 100644 (file)
 #include <linux/module.h>
 #include <linux/console.h>
 #include <linux/pci.h>
-#include <drm/drmP.h>
+
 #include <drm/drm.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_file.h>
 
 #include "virtgpu_drv.h"
+
 static struct drm_driver driver;
 
 static int virtio_gpu_modeset = -1;
@@ -195,7 +198,7 @@ static const struct file_operations virtio_gpu_driver_fops = {
 };
 
 static struct drm_driver driver = {
-       .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME | DRIVER_RENDER | DRIVER_ATOMIC,
+       .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_RENDER | DRIVER_ATOMIC,
        .open = virtio_gpu_driver_open,
        .postclose = virtio_gpu_driver_postclose,
 
@@ -207,8 +210,6 @@ static struct drm_driver driver = {
 #endif
        .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
-       .gem_prime_export = drm_gem_prime_export,
-       .gem_prime_import = drm_gem_prime_import,
        .gem_prime_get_sg_table = virtgpu_gem_prime_get_sg_table,
        .gem_prime_import_sg_table = virtgpu_gem_prime_import_sg_table,
        .gem_prime_vmap = virtgpu_gem_prime_vmap,
index 9e2d3062b01d4dc53f4e1500d408f0b5ccf0e5dc..f4ecea6054bae93b477069cc0edabdbf022aea5e 100644 (file)
 #include <linux/virtio_config.h>
 #include <linux/virtio_gpu.h>
 
-#include <drm/drmP.h>
-#include <drm/drm_gem.h>
 #include <drm/drm_atomic.h>
 #include <drm/drm_encoder.h>
 #include <drm/drm_fb_helper.h>
+#include <drm/drm_gem.h>
+#include <drm/drm_ioctl.h>
 #include <drm/drm_probe_helper.h>
 #include <drm/ttm/ttm_bo_api.h>
 #include <drm/ttm/ttm_bo_driver.h>
-#include <drm/ttm/ttm_placement.h>
 #include <drm/ttm/ttm_module.h>
+#include <drm/ttm/ttm_placement.h>
 
 #define DRIVER_NAME "virtio_gpu"
 #define DRIVER_DESC "virtio GPU"
index 70d6c432977813e4d3fcef4aac9b3bb69b8be341..a0514f5bd0065a3ff293e0fd6994497cb49970e9 100644 (file)
@@ -23,8 +23,8 @@
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
-#include <drm/drmP.h>
 #include <trace/events/dma_fence.h>
+
 #include "virtgpu_drv.h"
 
 static const char *virtio_get_driver_name(struct dma_fence *f)
index 1e49e08dd545d202a2b937358d51610b37089748..292566146814b846f0574874071120dbb7274014 100644 (file)
@@ -23,7 +23,9 @@
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
-#include <drm/drmP.h>
+#include <drm/drm_file.h>
+#include <drm/drm_fourcc.h>
+
 #include "virtgpu_drv.h"
 
 void virtio_gpu_gem_free_object(struct drm_gem_object *gem_obj)
index ac60be9b5c1904a0fe82d3b103803d8e609fcef2..d379d2e7e3ef9375b452d8e8fecbc52181194c66 100644 (file)
  * OTHER DEALINGS IN THE SOFTWARE.
  */
 
-#include <drm/drmP.h>
-#include <drm/virtgpu_drm.h>
-#include <drm/ttm/ttm_execbuf_util.h>
+#include <linux/file.h>
 #include <linux/sync_file.h>
 
+#include <drm/drm_file.h>
+#include <drm/ttm/ttm_execbuf_util.h>
+#include <drm/virtgpu_drm.h>
+
 #include "virtgpu_drv.h"
 
 static void convert_to_hw_box(struct virtio_gpu_box *dst,
@@ -553,34 +555,34 @@ copy_exit:
 
 struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS] = {
        DRM_IOCTL_DEF_DRV(VIRTGPU_MAP, virtio_gpu_map_ioctl,
-                         DRM_AUTH | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
 
        DRM_IOCTL_DEF_DRV(VIRTGPU_EXECBUFFER, virtio_gpu_execbuffer_ioctl,
-                         DRM_AUTH | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
 
        DRM_IOCTL_DEF_DRV(VIRTGPU_GETPARAM, virtio_gpu_getparam_ioctl,
-                         DRM_AUTH | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
 
        DRM_IOCTL_DEF_DRV(VIRTGPU_RESOURCE_CREATE,
                          virtio_gpu_resource_create_ioctl,
-                         DRM_AUTH | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
 
        DRM_IOCTL_DEF_DRV(VIRTGPU_RESOURCE_INFO, virtio_gpu_resource_info_ioctl,
-                         DRM_AUTH | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
 
        /* make transfer async to the main ring? - no sure, can we
         * thread these in the underlying GL
         */
        DRM_IOCTL_DEF_DRV(VIRTGPU_TRANSFER_FROM_HOST,
                          virtio_gpu_transfer_from_host_ioctl,
-                         DRM_AUTH | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(VIRTGPU_TRANSFER_TO_HOST,
                          virtio_gpu_transfer_to_host_ioctl,
-                         DRM_AUTH | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
 
        DRM_IOCTL_DEF_DRV(VIRTGPU_WAIT, virtio_gpu_wait_ioctl,
-                         DRM_AUTH | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
 
        DRM_IOCTL_DEF_DRV(VIRTGPU_GET_CAPS, virtio_gpu_get_caps_ioctl,
-                         DRM_AUTH | DRM_RENDER_ALLOW),
+                         DRM_RENDER_ALLOW),
 };
index 84b6a6bf00c68222cfde74ec7f9d64c43b0ed9f3..c190702fab72642de0af57e9f1a257445c90cbef 100644 (file)
@@ -25,7 +25,9 @@
 
 #include <linux/virtio.h>
 #include <linux/virtio_config.h>
-#include <drm/drmP.h>
+
+#include <drm/drm_file.h>
+
 #include "virtgpu_drv.h"
 
 static void virtio_gpu_config_changed_work_func(struct work_struct *work)
index 024c2aa0c929eab8ccdb9ef43b879447704b97b3..f96c8296307ed009e642b499e2300ba39ffc189d 100644 (file)
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
-#include "virtgpu_drv.h"
-#include <drm/drm_plane_helper.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_plane_helper.h>
+
+#include "virtgpu_drv.h"
 
 static const uint32_t virtio_gpu_formats[] = {
        DRM_FORMAT_HOST_XRGB8888,
index 8fbf71bd0c5ebd3dcbebd99ecd5bdd774dbb6501..8b3b2caf33644419336f6816f69b4d5061fbbabf 100644 (file)
@@ -22,6 +22,8 @@
  * Authors: Andreas Pokorny
  */
 
+#include <drm/drm_prime.h>
+
 #include "virtgpu_drv.h"
 
 /* Empty Implementations as there should not be any other driver for a virtual
index 300ef3a83538965c0ec0b6e635f69d28be195fd1..f87903641847e05bcd3083af32ef6d31275b4858 100644 (file)
  * OTHER DEALINGS IN THE SOFTWARE.
  */
 
+#include <linux/delay.h>
+
+#include <drm/drm.h>
+#include <drm/drm_file.h>
 #include <drm/ttm/ttm_bo_api.h>
 #include <drm/ttm/ttm_bo_driver.h>
-#include <drm/ttm/ttm_placement.h>
-#include <drm/ttm/ttm_page_alloc.h>
 #include <drm/ttm/ttm_module.h>
-#include <drm/drmP.h>
-#include <drm/drm.h>
+#include <drm/ttm/ttm_page_alloc.h>
+#include <drm/ttm/ttm_placement.h>
 #include <drm/virtgpu_drm.h>
-#include "virtgpu_drv.h"
 
-#include <linux/delay.h>
+#include "virtgpu_drv.h"
 
 static struct
 virtio_gpu_device *virtio_gpu_get_vgdev(struct ttm_bo_device *bdev)
index 981ee16e3ee97bd987097a968528c14766220699..7ac20490e1b4c779fe34a3bbda9008e7307ae811 100644 (file)
  * OTHER DEALINGS IN THE SOFTWARE.
  */
 
-#include <drm/drmP.h>
-#include "virtgpu_drv.h"
-#include "virtgpu_trace.h"
+#include <linux/dma-mapping.h>
 #include <linux/virtio.h>
 #include <linux/virtio_config.h>
 #include <linux/virtio_ring.h>
 
+#include "virtgpu_drv.h"
+#include "virtgpu_trace.h"
+
 #define MAX_INLINE_CMD_SIZE   96
 #define MAX_INLINE_RESP_SIZE  24
 #define VBUFFER_SIZE          (sizeof(struct virtio_gpu_vbuffer) \
index 89f09bec7b2379b0b88766c147aeee18e0cfcdad..0b767d7efa24b2235ef1bc663fff51ddf065dd01 100644 (file)
@@ -1,4 +1,4 @@
 # SPDX-License-Identifier: GPL-2.0-only
-vkms-y := vkms_drv.o vkms_plane.o vkms_output.o vkms_crtc.o vkms_gem.o vkms_crc.o
+vkms-y := vkms_drv.o vkms_plane.o vkms_output.o vkms_crtc.o vkms_gem.o vkms_composer.o
 
 obj-$(CONFIG_DRM_VKMS) += vkms.o
similarity index 52%
rename from drivers/gpu/drm/vkms/vkms_crc.c
rename to drivers/gpu/drm/vkms/vkms_composer.c
index e66ff25c008e6c10e3de7b9294a607e7efbb1015..d5585695c64d1085a6a03c6719dd9f7da4221631 100644 (file)
@@ -1,34 +1,37 @@
 // SPDX-License-Identifier: GPL-2.0+
 
-#include "vkms_drv.h"
 #include <linux/crc32.h>
+
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
+#include <drm/drm_vblank.h>
+
+#include "vkms_drv.h"
 
 /**
  * compute_crc - Compute CRC value on output frame
  *
  * @vaddr_out: address to final framebuffer
- * @crc_out: framebuffer's metadata
+ * @composer: framebuffer's metadata
  *
  * returns CRC value computed using crc32 on the visible portion of
  * the final framebuffer at vaddr_out
  */
-static uint32_t compute_crc(void *vaddr_out, struct vkms_crc_data *crc_out)
+static uint32_t compute_crc(void *vaddr_out, struct vkms_composer *composer)
 {
        int i, j, src_offset;
-       int x_src = crc_out->src.x1 >> 16;
-       int y_src = crc_out->src.y1 >> 16;
-       int h_src = drm_rect_height(&crc_out->src) >> 16;
-       int w_src = drm_rect_width(&crc_out->src) >> 16;
+       int x_src = composer->src.x1 >> 16;
+       int y_src = composer->src.y1 >> 16;
+       int h_src = drm_rect_height(&composer->src) >> 16;
+       int w_src = drm_rect_width(&composer->src) >> 16;
        u32 crc = 0;
 
        for (i = y_src; i < y_src + h_src; ++i) {
                for (j = x_src; j < x_src + w_src; ++j) {
-                       src_offset = crc_out->offset
-                                    + (i * crc_out->pitch)
-                                    + (j * crc_out->cpp);
+                       src_offset = composer->offset
+                                    + (i * composer->pitch)
+                                    + (j * composer->cpp);
                        /* XRGB format ignores Alpha channel */
                        memset(vaddr_out + src_offset + 24, 0,  8);
                        crc = crc32_le(crc, vaddr_out + src_offset,
@@ -43,8 +46,8 @@ static uint32_t compute_crc(void *vaddr_out, struct vkms_crc_data *crc_out)
  * blend - belnd value at vaddr_src with value at vaddr_dst
  * @vaddr_dst: destination address
  * @vaddr_src: source address
- * @crc_dst: destination framebuffer's metadata
- * @crc_src: source framebuffer's metadata
+ * @dest_composer: destination framebuffer's metadata
+ * @src_composer: source framebuffer's metadata
  *
  * Blend value at vaddr_src with value at vaddr_dst.
  * Currently, this function write value at vaddr_src on value
@@ -55,31 +58,31 @@ static uint32_t compute_crc(void *vaddr_out, struct vkms_crc_data *crc_out)
  *      instead of overwriting it.
  */
 static void blend(void *vaddr_dst, void *vaddr_src,
-                 struct vkms_crc_data *crc_dst,
-                 struct vkms_crc_data *crc_src)
+                 struct vkms_composer *dest_composer,
+                 struct vkms_composer *src_composer)
 {
        int i, j, j_dst, i_dst;
        int offset_src, offset_dst;
 
-       int x_src = crc_src->src.x1 >> 16;
-       int y_src = crc_src->src.y1 >> 16;
+       int x_src = src_composer->src.x1 >> 16;
+       int y_src = src_composer->src.y1 >> 16;
 
-       int x_dst = crc_src->dst.x1;
-       int y_dst = crc_src->dst.y1;
-       int h_dst = drm_rect_height(&crc_src->dst);
-       int w_dst = drm_rect_width(&crc_src->dst);
+       int x_dst = src_composer->dst.x1;
+       int y_dst = src_composer->dst.y1;
+       int h_dst = drm_rect_height(&src_composer->dst);
+       int w_dst = drm_rect_width(&src_composer->dst);
 
        int y_limit = y_src + h_dst;
        int x_limit = x_src + w_dst;
 
        for (i = y_src, i_dst = y_dst; i < y_limit; ++i) {
                for (j = x_src, j_dst = x_dst; j < x_limit; ++j) {
-                       offset_dst = crc_dst->offset
-                                    + (i_dst * crc_dst->pitch)
-                                    + (j_dst++ * crc_dst->cpp);
-                       offset_src = crc_src->offset
-                                    + (i * crc_src->pitch)
-                                    + (j * crc_src->cpp);
+                       offset_dst = dest_composer->offset
+                                    + (i_dst * dest_composer->pitch)
+                                    + (j_dst++ * dest_composer->cpp);
+                       offset_src = src_composer->offset
+                                    + (i * src_composer->pitch)
+                                    + (j * src_composer->cpp);
 
                        memcpy(vaddr_dst + offset_dst,
                               vaddr_src + offset_src, sizeof(u32));
@@ -88,31 +91,27 @@ static void blend(void *vaddr_dst, void *vaddr_src,
        }
 }
 
-static void compose_cursor(struct vkms_crc_data *cursor_crc,
-                          struct vkms_crc_data *primary_crc, void *vaddr_out)
+static void compose_cursor(struct vkms_composer *cursor_composer,
+                          struct vkms_composer *primary_composer,
+                          void *vaddr_out)
 {
        struct drm_gem_object *cursor_obj;
        struct vkms_gem_object *cursor_vkms_obj;
 
-       cursor_obj = drm_gem_fb_get_obj(&cursor_crc->fb, 0);
+       cursor_obj = drm_gem_fb_get_obj(&cursor_composer->fb, 0);
        cursor_vkms_obj = drm_gem_to_vkms_gem(cursor_obj);
 
-       mutex_lock(&cursor_vkms_obj->pages_lock);
-       if (!cursor_vkms_obj->vaddr) {
-               DRM_WARN("cursor plane vaddr is NULL");
-               goto out;
-       }
-
-       blend(vaddr_out, cursor_vkms_obj->vaddr, primary_crc, cursor_crc);
+       if (WARN_ON(!cursor_vkms_obj->vaddr))
+               return;
 
-out:
-       mutex_unlock(&cursor_vkms_obj->pages_lock);
+       blend(vaddr_out, cursor_vkms_obj->vaddr,
+             primary_composer, cursor_composer);
 }
 
-static uint32_t _vkms_get_crc(struct vkms_crc_data *primary_crc,
-                             struct vkms_crc_data *cursor_crc)
+static uint32_t _vkms_get_crc(struct vkms_composer *primary_composer,
+                             struct vkms_composer *cursor_composer)
 {
-       struct drm_framebuffer *fb = &primary_crc->fb;
+       struct drm_framebuffer *fb = &primary_composer->fb;
        struct drm_gem_object *gem_obj = drm_gem_fb_get_obj(fb, 0);
        struct vkms_gem_object *vkms_obj = drm_gem_to_vkms_gem(gem_obj);
        void *vaddr_out = kzalloc(vkms_obj->gem.size, GFP_KERNEL);
@@ -123,20 +122,17 @@ static uint32_t _vkms_get_crc(struct vkms_crc_data *primary_crc,
                return 0;
        }
 
-       mutex_lock(&vkms_obj->pages_lock);
        if (WARN_ON(!vkms_obj->vaddr)) {
-               mutex_unlock(&vkms_obj->pages_lock);
                kfree(vaddr_out);
                return crc;
        }
 
        memcpy(vaddr_out, vkms_obj->vaddr, vkms_obj->gem.size);
-       mutex_unlock(&vkms_obj->pages_lock);
 
-       if (cursor_crc)
-               compose_cursor(cursor_crc, primary_crc, vaddr_out);
+       if (cursor_composer)
+               compose_cursor(cursor_composer, primary_composer, vaddr_out);
 
-       crc = compute_crc(vaddr_out, primary_crc);
+       crc = compute_crc(vaddr_out, primary_composer);
 
        kfree(vaddr_out);
 
@@ -144,72 +140,57 @@ static uint32_t _vkms_get_crc(struct vkms_crc_data *primary_crc,
 }
 
 /**
- * vkms_crc_work_handle - ordered work_struct to compute CRC
+ * vkms_composer_worker - ordered work_struct to compute CRC
  *
  * @work: work_struct
  *
- * Work handler for computing CRCs. work_struct scheduled in
+ * Work handler for composing and computing CRCs. work_struct scheduled in
  * an ordered workqueue that's periodically scheduled to run by
  * _vblank_handle() and flushed at vkms_atomic_crtc_destroy_state().
  */
-void vkms_crc_work_handle(struct work_struct *work)
+void vkms_composer_worker(struct work_struct *work)
 {
        struct vkms_crtc_state *crtc_state = container_of(work,
                                                struct vkms_crtc_state,
-                                               crc_work);
+                                               composer_work);
        struct drm_crtc *crtc = crtc_state->base.crtc;
        struct vkms_output *out = drm_crtc_to_vkms_output(crtc);
-       struct vkms_device *vdev = container_of(out, struct vkms_device,
-                                               output);
-       struct vkms_crc_data *primary_crc = NULL;
-       struct vkms_crc_data *cursor_crc = NULL;
-       struct drm_plane *plane;
+       struct vkms_composer *primary_composer = NULL;
+       struct vkms_composer *cursor_composer = NULL;
        u32 crc32 = 0;
        u64 frame_start, frame_end;
-       unsigned long flags;
+       bool crc_pending;
 
-       spin_lock_irqsave(&out->state_lock, flags);
+       spin_lock_irq(&out->composer_lock);
        frame_start = crtc_state->frame_start;
        frame_end = crtc_state->frame_end;
-       spin_unlock_irqrestore(&out->state_lock, flags);
-
-       /* _vblank_handle() hasn't updated frame_start yet */
-       if (!frame_start || frame_start == frame_end)
-               goto out;
-
-       drm_for_each_plane(plane, &vdev->drm) {
-               struct vkms_plane_state *vplane_state;
-               struct vkms_crc_data *crc_data;
-
-               vplane_state = to_vkms_plane_state(plane->state);
-               crc_data = vplane_state->crc_data;
+       crc_pending = crtc_state->crc_pending;
+       crtc_state->frame_start = 0;
+       crtc_state->frame_end = 0;
+       crtc_state->crc_pending = false;
+       spin_unlock_irq(&out->composer_lock);
 
-               if (drm_framebuffer_read_refcount(&crc_data->fb) == 0)
-                       continue;
+       /*
+        * We raced with the vblank hrtimer and previous work already computed
+        * the crc, nothing to do.
+        */
+       if (!crc_pending)
+               return;
 
-               if (plane->type == DRM_PLANE_TYPE_PRIMARY)
-                       primary_crc = crc_data;
-               else
-                       cursor_crc = crc_data;
-       }
+       if (crtc_state->num_active_planes >= 1)
+               primary_composer = crtc_state->active_planes[0]->composer;
 
-       if (primary_crc)
-               crc32 = _vkms_get_crc(primary_crc, cursor_crc);
+       if (crtc_state->num_active_planes == 2)
+               cursor_composer = crtc_state->active_planes[1]->composer;
 
-       frame_end = drm_crtc_accurate_vblank_count(crtc);
+       if (primary_composer)
+               crc32 = _vkms_get_crc(primary_composer, cursor_composer);
 
-       /* queue_work can fail to schedule crc_work; add crc for
-        * missing frames
+       /*
+        * The worker can fall behind the vblank hrtimer, make sure we catch up.
         */
        while (frame_start <= frame_end)
                drm_crtc_add_crc_entry(crtc, true, frame_start++, &crc32);
-
-out:
-       /* to avoid using the same value for frame number again */
-       spin_lock_irqsave(&out->state_lock, flags);
-       crtc_state->frame_end = frame_end;
-       crtc_state->frame_start = 0;
-       spin_unlock_irqrestore(&out->state_lock, flags);
 }
 
 static const char * const pipe_crc_sources[] = {"auto"};
@@ -256,17 +237,13 @@ int vkms_set_crc_source(struct drm_crtc *crtc, const char *src_name)
 {
        struct vkms_output *out = drm_crtc_to_vkms_output(crtc);
        bool enabled = false;
-       unsigned long flags;
        int ret = 0;
 
        ret = vkms_crc_parse_source(src_name, &enabled);
 
-       /* make sure nothing is scheduled on crtc workq */
-       flush_workqueue(out->crc_workq);
-
-       spin_lock_irqsave(&out->lock, flags);
-       out->crc_enabled = enabled;
-       spin_unlock_irqrestore(&out->lock, flags);
+       spin_lock_irq(&out->lock);
+       out->composer_enabled = enabled;
+       spin_unlock_irq(&out->lock);
 
        return ret;
 }
index 4d11292bc6f386ee76d28f30cf8a665d8f5ffa50..927dafaebc766c0f1eba4cb924e2f3575040522b 100644 (file)
@@ -1,15 +1,18 @@
 // SPDX-License-Identifier: GPL-2.0+
 
-#include "vkms_drv.h"
+#include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
+
+#include "vkms_drv.h"
 
 static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer)
 {
        struct vkms_output *output = container_of(timer, struct vkms_output,
                                                  vblank_hrtimer);
        struct drm_crtc *crtc = &output->crtc;
-       struct vkms_crtc_state *state = to_vkms_crtc_state(crtc->state);
+       struct vkms_crtc_state *state;
        u64 ret_overrun;
        bool ret;
 
@@ -23,20 +26,26 @@ static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer)
        if (!ret)
                DRM_ERROR("vkms failure on handling vblank");
 
-       if (state && output->crc_enabled) {
+       state = output->composer_state;
+       if (state && output->composer_enabled) {
                u64 frame = drm_crtc_accurate_vblank_count(crtc);
 
-               /* update frame_start only if a queued vkms_crc_work_handle()
+               /* update frame_start only if a queued vkms_composer_worker()
                 * has read the data
                 */
-               spin_lock(&output->state_lock);
-               if (!state->frame_start)
+               spin_lock(&output->composer_lock);
+               if (!state->crc_pending)
                        state->frame_start = frame;
-               spin_unlock(&output->state_lock);
+               else
+                       DRM_DEBUG_DRIVER("crc worker falling behind, frame_start: %llu, frame_end: %llu\n",
+                                        state->frame_start, frame);
+               state->frame_end = frame;
+               state->crc_pending = true;
+               spin_unlock(&output->composer_lock);
 
-               ret = queue_work(output->crc_workq, &state->crc_work);
+               ret = queue_work(output->composer_workq, &state->composer_work);
                if (!ret)
-                       DRM_WARN("failed to queue vkms_crc_work_handle");
+                       DRM_DEBUG_DRIVER("Composer worker already queued\n");
        }
 
        spin_unlock(&output->lock);
@@ -107,7 +116,7 @@ vkms_atomic_crtc_duplicate_state(struct drm_crtc *crtc)
 
        __drm_atomic_helper_crtc_duplicate_state(crtc, &vkms_state->base);
 
-       INIT_WORK(&vkms_state->crc_work, vkms_crc_work_handle);
+       INIT_WORK(&vkms_state->composer_work, vkms_composer_worker);
 
        return &vkms_state->base;
 }
@@ -119,10 +128,9 @@ static void vkms_atomic_crtc_destroy_state(struct drm_crtc *crtc,
 
        __drm_atomic_helper_crtc_destroy_state(state);
 
-       if (vkms_state) {
-               flush_work(&vkms_state->crc_work);
-               kfree(vkms_state);
-       }
+       WARN_ON(work_pending(&vkms_state->composer_work));
+       kfree(vkms_state->active_planes);
+       kfree(vkms_state);
 }
 
 static void vkms_atomic_crtc_reset(struct drm_crtc *crtc)
@@ -135,7 +143,7 @@ static void vkms_atomic_crtc_reset(struct drm_crtc *crtc)
 
        __drm_atomic_helper_crtc_reset(crtc, &vkms_state->base);
        if (vkms_state)
-               INIT_WORK(&vkms_state->crc_work, vkms_crc_work_handle);
+               INIT_WORK(&vkms_state->composer_work, vkms_composer_worker);
 }
 
 static const struct drm_crtc_funcs vkms_crtc_funcs = {
@@ -152,6 +160,52 @@ static const struct drm_crtc_funcs vkms_crtc_funcs = {
        .verify_crc_source      = vkms_verify_crc_source,
 };
 
+static int vkms_crtc_atomic_check(struct drm_crtc *crtc,
+                                 struct drm_crtc_state *state)
+{
+       struct vkms_crtc_state *vkms_state = to_vkms_crtc_state(state);
+       struct drm_plane *plane;
+       struct drm_plane_state *plane_state;
+       int i = 0, ret;
+
+       if (vkms_state->active_planes)
+               return 0;
+
+       ret = drm_atomic_add_affected_planes(state->state, crtc);
+       if (ret < 0)
+               return ret;
+
+       drm_for_each_plane_mask(plane, crtc->dev, state->plane_mask) {
+               plane_state = drm_atomic_get_existing_plane_state(state->state,
+                                                                 plane);
+               WARN_ON(!plane_state);
+
+               if (!plane_state->visible)
+                       continue;
+
+               i++;
+       }
+
+       vkms_state->active_planes = kcalloc(i, sizeof(plane), GFP_KERNEL);
+       if (!vkms_state->active_planes)
+               return -ENOMEM;
+       vkms_state->num_active_planes = i;
+
+       i = 0;
+       drm_for_each_plane_mask(plane, crtc->dev, state->plane_mask) {
+               plane_state = drm_atomic_get_existing_plane_state(state->state,
+                                                                 plane);
+
+               if (!plane_state->visible)
+                       continue;
+
+               vkms_state->active_planes[i++] =
+                       to_vkms_plane_state(plane_state);
+       }
+
+       return 0;
+}
+
 static void vkms_crtc_atomic_enable(struct drm_crtc *crtc,
                                    struct drm_crtc_state *old_state)
 {
@@ -170,7 +224,7 @@ static void vkms_crtc_atomic_begin(struct drm_crtc *crtc,
        struct vkms_output *vkms_output = drm_crtc_to_vkms_output(crtc);
 
        /* This lock is held across the atomic commit to block vblank timer
-        * from scheduling vkms_crc_work_handle until the crc_data is updated
+        * from scheduling vkms_composer_worker until the composer is updated
         */
        spin_lock_irq(&vkms_output->lock);
 }
@@ -179,25 +233,27 @@ static void vkms_crtc_atomic_flush(struct drm_crtc *crtc,
                                   struct drm_crtc_state *old_crtc_state)
 {
        struct vkms_output *vkms_output = drm_crtc_to_vkms_output(crtc);
-       unsigned long flags;
 
        if (crtc->state->event) {
-               spin_lock_irqsave(&crtc->dev->event_lock, flags);
+               spin_lock(&crtc->dev->event_lock);
 
                if (drm_crtc_vblank_get(crtc) != 0)
                        drm_crtc_send_vblank_event(crtc, crtc->state->event);
                else
                        drm_crtc_arm_vblank_event(crtc, crtc->state->event);
 
-               spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
+               spin_unlock(&crtc->dev->event_lock);
 
                crtc->state->event = NULL;
        }
 
+       vkms_output->composer_state = to_vkms_crtc_state(crtc->state);
+
        spin_unlock_irq(&vkms_output->lock);
 }
 
 static const struct drm_crtc_helper_funcs vkms_crtc_helper_funcs = {
+       .atomic_check   = vkms_crtc_atomic_check,
        .atomic_begin   = vkms_crtc_atomic_begin,
        .atomic_flush   = vkms_crtc_atomic_flush,
        .atomic_enable  = vkms_crtc_atomic_enable,
@@ -220,10 +276,10 @@ int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
        drm_crtc_helper_add(crtc, &vkms_crtc_helper_funcs);
 
        spin_lock_init(&vkms_out->lock);
-       spin_lock_init(&vkms_out->state_lock);
+       spin_lock_init(&vkms_out->composer_lock);
 
-       vkms_out->crc_workq = alloc_ordered_workqueue("vkms_crc_workq", 0);
-       if (!vkms_out->crc_workq)
+       vkms_out->composer_workq = alloc_ordered_workqueue("vkms_composer", 0);
+       if (!vkms_out->composer_workq)
                return -ENOMEM;
 
        return ret;
index 738dd6206d85b0793d4a0c34057837500069baae..44ab9f8ef8be6fc94cc9ebca80054581bb1d38e6 100644 (file)
  */
 
 #include <linux/module.h>
-#include <drm/drm_gem.h>
+#include <linux/platform_device.h>
+
+#include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
-#include <drm/drm_gem_framebuffer_helper.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_fb_helper.h>
+#include <drm/drm_file.h>
+#include <drm/drm_gem.h>
+#include <drm/drm_gem_framebuffer_helper.h>
+#include <drm/drm_ioctl.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
+
 #include "vkms_drv.h"
 
 #define DRIVER_NAME    "vkms"
@@ -55,7 +63,36 @@ static void vkms_release(struct drm_device *dev)
        drm_atomic_helper_shutdown(&vkms->drm);
        drm_mode_config_cleanup(&vkms->drm);
        drm_dev_fini(&vkms->drm);
-       destroy_workqueue(vkms->output.crc_workq);
+       destroy_workqueue(vkms->output.composer_workq);
+}
+
+static void vkms_atomic_commit_tail(struct drm_atomic_state *old_state)
+{
+       struct drm_device *dev = old_state->dev;
+       struct drm_crtc *crtc;
+       struct drm_crtc_state *old_crtc_state;
+       int i;
+
+       drm_atomic_helper_commit_modeset_disables(dev, old_state);
+
+       drm_atomic_helper_commit_planes(dev, old_state, 0);
+
+       drm_atomic_helper_commit_modeset_enables(dev, old_state);
+
+       drm_atomic_helper_fake_vblank(old_state);
+
+       drm_atomic_helper_commit_hw_done(old_state);
+
+       drm_atomic_helper_wait_for_vblanks(dev, old_state);
+
+       for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {
+               struct vkms_crtc_state *vkms_state =
+                       to_vkms_crtc_state(old_crtc_state);
+
+               flush_work(&vkms_state->composer_work);
+       }
+
+       drm_atomic_helper_cleanup_planes(dev, old_state);
 }
 
 static struct drm_driver vkms_driver = {
@@ -80,6 +117,10 @@ static const struct drm_mode_config_funcs vkms_mode_funcs = {
        .atomic_commit = drm_atomic_helper_commit,
 };
 
+static const struct drm_mode_config_helper_funcs vkms_mode_config_helpers = {
+       .atomic_commit_tail = vkms_atomic_commit_tail,
+};
+
 static int vkms_modeset_init(struct vkms_device *vkmsdev)
 {
        struct drm_device *dev = &vkmsdev->drm;
@@ -91,8 +132,9 @@ static int vkms_modeset_init(struct vkms_device *vkmsdev)
        dev->mode_config.max_width = XRES_MAX;
        dev->mode_config.max_height = YRES_MAX;
        dev->mode_config.preferred_depth = 24;
+       dev->mode_config.helper_private = &vkms_mode_config_helpers;
 
-       return vkms_output_init(vkmsdev);
+       return vkms_output_init(vkmsdev, 0);
 }
 
 static int __init vkms_init(void)
index b92c30c66a6f24a23591f6bc7eb43c283ef91fd1..5a95100fa18b631da004faa474d4e13764d008f8 100644 (file)
@@ -3,11 +3,11 @@
 #ifndef _VKMS_DRV_H_
 #define _VKMS_DRV_H_
 
-#include <drm/drmP.h>
+#include <linux/hrtimer.h>
+
 #include <drm/drm.h>
 #include <drm/drm_gem.h>
 #include <drm/drm_encoder.h>
-#include <linux/hrtimer.h>
 
 #define XRES_MIN    20
 #define YRES_MIN    20
@@ -20,7 +20,7 @@
 
 extern bool enable_cursor;
 
-struct vkms_crc_data {
+struct vkms_composer {
        struct drm_framebuffer fb;
        struct drm_rect src, dst;
        unsigned int offset;
@@ -31,23 +31,30 @@ struct vkms_crc_data {
 /**
  * vkms_plane_state - Driver specific plane state
  * @base: base plane state
- * @crc_data: data required for CRC computation
+ * @composer: data required for composing computation
  */
 struct vkms_plane_state {
        struct drm_plane_state base;
-       struct vkms_crc_data *crc_data;
+       struct vkms_composer *composer;
 };
 
 /**
  * vkms_crtc_state - Driver specific CRTC state
  * @base: base CRTC state
- * @crc_work: work struct to compute and add CRC entries
+ * @composer_work: work struct to compose and add CRC entries
  * @n_frame_start: start frame number for computed CRC
  * @n_frame_end: end frame number for computed CRC
  */
 struct vkms_crtc_state {
        struct drm_crtc_state base;
-       struct work_struct crc_work;
+       struct work_struct composer_work;
+
+       int num_active_planes;
+       /* stack of active planes for crc computation, should be in z order */
+       struct vkms_plane_state **active_planes;
+
+       /* below three are protected by vkms_output.composer_lock */
+       bool crc_pending;
        u64 frame_start;
        u64 frame_end;
 };
@@ -59,13 +66,16 @@ struct vkms_output {
        struct hrtimer vblank_hrtimer;
        ktime_t period_ns;
        struct drm_pending_vblank_event *event;
-       bool crc_enabled;
-       /* ordered wq for crc_work */
-       struct workqueue_struct *crc_workq;
-       /* protects concurrent access to crc_data */
+       /* ordered wq for composer_work */
+       struct workqueue_struct *composer_workq;
+       /* protects concurrent access to composer */
        spinlock_t lock;
-       /* protects concurrent access to crtc_state */
-       spinlock_t state_lock;
+
+       /* protected by @lock */
+       bool composer_enabled;
+       struct vkms_crtc_state *composer_state;
+
+       spinlock_t composer_lock;
 };
 
 struct vkms_device {
@@ -105,10 +115,10 @@ bool vkms_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe,
                               int *max_error, ktime_t *vblank_time,
                               bool in_vblank_irq);
 
-int vkms_output_init(struct vkms_device *vkmsdev);
+int vkms_output_init(struct vkms_device *vkmsdev, int index);
 
 struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev,
-                                 enum drm_plane_type type);
+                                 enum drm_plane_type type, int index);
 
 /* Gem stuff */
 struct drm_gem_object *vkms_gem_create(struct drm_device *dev,
@@ -133,6 +143,8 @@ const char *const *vkms_get_crc_sources(struct drm_crtc *crtc,
 int vkms_set_crc_source(struct drm_crtc *crtc, const char *src_name);
 int vkms_verify_crc_source(struct drm_crtc *crtc, const char *source_name,
                           size_t *values_cnt);
-void vkms_crc_work_handle(struct work_struct *work);
+
+/* Composer Support */
+void vkms_composer_worker(struct work_struct *work);
 
 #endif /* _VKMS_DRV_H_ */
index 69048e73377dc97855aa3b71491008e5993a5304..6489bfe0a1490d7137f16decb0352405794a3a78 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0+
 
 #include <linux/shmem_fs.h>
+#include <linux/vmalloc.h>
 
 #include "vkms_drv.h"
 
index 56fb5c2a2315c8fbb65d4ed6fd4e067b8ec6cc98..fb1941a6522cfea38d8d58b419e66e1e57af5082 100644 (file)
@@ -35,7 +35,7 @@ static const struct drm_connector_helper_funcs vkms_conn_helper_funcs = {
        .get_modes    = vkms_conn_get_modes,
 };
 
-int vkms_output_init(struct vkms_device *vkmsdev)
+int vkms_output_init(struct vkms_device *vkmsdev, int index)
 {
        struct vkms_output *output = &vkmsdev->output;
        struct drm_device *dev = &vkmsdev->drm;
@@ -45,12 +45,12 @@ int vkms_output_init(struct vkms_device *vkmsdev)
        struct drm_plane *primary, *cursor = NULL;
        int ret;
 
-       primary = vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_PRIMARY);
+       primary = vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_PRIMARY, index);
        if (IS_ERR(primary))
                return PTR_ERR(primary);
 
        if (enable_cursor) {
-               cursor = vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_CURSOR);
+               cursor = vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_CURSOR, index);
                if (IS_ERR(cursor)) {
                        ret = PTR_ERR(cursor);
                        goto err_cursor;
index 0fceb625842254ce4d288eb0b0a3ad15baabd017..5fc8f85aaf3d8fa817dd2e84e50a0345b3d26d3e 100644 (file)
@@ -1,10 +1,12 @@
 // SPDX-License-Identifier: GPL-2.0+
 
-#include "vkms_drv.h"
-#include <drm/drm_plane_helper.h>
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_gem_framebuffer_helper.h>
+#include <drm/drm_plane_helper.h>
+
+#include "vkms_drv.h"
 
 static const u32 vkms_formats[] = {
        DRM_FORMAT_XRGB8888,
@@ -18,20 +20,20 @@ static struct drm_plane_state *
 vkms_plane_duplicate_state(struct drm_plane *plane)
 {
        struct vkms_plane_state *vkms_state;
-       struct vkms_crc_data *crc_data;
+       struct vkms_composer *composer;
 
        vkms_state = kzalloc(sizeof(*vkms_state), GFP_KERNEL);
        if (!vkms_state)
                return NULL;
 
-       crc_data = kzalloc(sizeof(*crc_data), GFP_KERNEL);
-       if (!crc_data) {
-               DRM_DEBUG_KMS("Couldn't allocate crc_data\n");
+       composer = kzalloc(sizeof(*composer), GFP_KERNEL);
+       if (!composer) {
+               DRM_DEBUG_KMS("Couldn't allocate composer\n");
                kfree(vkms_state);
                return NULL;
        }
 
-       vkms_state->crc_data = crc_data;
+       vkms_state->composer = composer;
 
        __drm_atomic_helper_plane_duplicate_state(plane,
                                                  &vkms_state->base);
@@ -49,12 +51,12 @@ static void vkms_plane_destroy_state(struct drm_plane *plane,
                /* dropping the reference we acquired in
                 * vkms_primary_plane_update()
                 */
-               if (drm_framebuffer_read_refcount(&vkms_state->crc_data->fb))
-                       drm_framebuffer_put(&vkms_state->crc_data->fb);
+               if (drm_framebuffer_read_refcount(&vkms_state->composer->fb))
+                       drm_framebuffer_put(&vkms_state->composer->fb);
        }
 
-       kfree(vkms_state->crc_data);
-       vkms_state->crc_data = NULL;
+       kfree(vkms_state->composer);
+       vkms_state->composer = NULL;
 
        __drm_atomic_helper_plane_destroy_state(old_state);
        kfree(vkms_state);
@@ -91,21 +93,21 @@ static void vkms_plane_atomic_update(struct drm_plane *plane,
 {
        struct vkms_plane_state *vkms_plane_state;
        struct drm_framebuffer *fb = plane->state->fb;
-       struct vkms_crc_data *crc_data;
+       struct vkms_composer *composer;
 
        if (!plane->state->crtc || !fb)
                return;
 
        vkms_plane_state = to_vkms_plane_state(plane->state);
 
-       crc_data = vkms_plane_state->crc_data;
-       memcpy(&crc_data->src, &plane->state->src, sizeof(struct drm_rect));
-       memcpy(&crc_data->dst, &plane->state->dst, sizeof(struct drm_rect));
-       memcpy(&crc_data->fb, fb, sizeof(struct drm_framebuffer));
-       drm_framebuffer_get(&crc_data->fb);
-       crc_data->offset = fb->offsets[0];
-       crc_data->pitch = fb->pitches[0];
-       crc_data->cpp = fb->format->cpp[0];
+       composer = vkms_plane_state->composer;
+       memcpy(&composer->src, &plane->state->src, sizeof(struct drm_rect));
+       memcpy(&composer->dst, &plane->state->dst, sizeof(struct drm_rect));
+       memcpy(&composer->fb, fb, sizeof(struct drm_framebuffer));
+       drm_framebuffer_get(&composer->fb);
+       composer->offset = fb->offsets[0];
+       composer->pitch = fb->pitches[0];
+       composer->cpp = fb->format->cpp[0];
 }
 
 static int vkms_plane_atomic_check(struct drm_plane *plane,
@@ -176,7 +178,7 @@ static const struct drm_plane_helper_funcs vkms_primary_helper_funcs = {
 };
 
 struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev,
-                                 enum drm_plane_type type)
+                                 enum drm_plane_type type, int index)
 {
        struct drm_device *dev = &vkmsdev->drm;
        const struct drm_plane_helper_funcs *funcs;
@@ -198,7 +200,7 @@ struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev,
                funcs = &vkms_primary_helper_funcs;
        }
 
-       ret = drm_universal_plane_init(dev, plane, 0,
+       ret = drm_universal_plane_init(dev, plane, 1 << index,
                                       &vkms_plane_funcs,
                                       formats, nformats,
                                       NULL, type, NULL);
index 9506190a03009cd0e2e6f51d37a0b42096130bfb..cd0d49d8a8dad6cfe6092e80191439021a64271d 100644 (file)
@@ -186,7 +186,7 @@ static const struct drm_ioctl_desc vmw_ioctls[] = {
                      DRM_RENDER_ALLOW),
        VMW_IOCTL_DEF(VMW_REF_SURFACE, vmw_surface_reference_ioctl,
                      DRM_AUTH | DRM_RENDER_ALLOW),
-       VMW_IOCTL_DEF(VMW_EXECBUF, NULL, DRM_AUTH |
+       VMW_IOCTL_DEF(VMW_EXECBUF, vmw_execbuf_ioctl, DRM_AUTH |
                      DRM_RENDER_ALLOW),
        VMW_IOCTL_DEF(VMW_FENCE_WAIT, vmw_fence_obj_wait_ioctl,
                      DRM_RENDER_ALLOW),
@@ -641,7 +641,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
                INIT_LIST_HEAD(&dev_priv->res_lru[i]);
        }
 
-       mutex_init(&dev_priv->init_mutex);
        init_waitqueue_head(&dev_priv->fence_queue);
        init_waitqueue_head(&dev_priv->fifo_queue);
        dev_priv->fence_queue_waiters = 0;
@@ -1121,15 +1120,7 @@ static long vmw_generic_ioctl(struct file *filp, unsigned int cmd,
                        &vmw_ioctls[nr - DRM_COMMAND_BASE];
 
                if (nr == DRM_COMMAND_BASE + DRM_VMW_EXECBUF) {
-                       ret = (long) drm_ioctl_permit(ioctl->flags, file_priv);
-                       if (unlikely(ret != 0))
-                               return ret;
-
-                       if (unlikely((cmd & (IOC_IN | IOC_OUT)) != IOC_IN))
-                               goto out_io_encoding;
-
-                       return (long) vmw_execbuf_ioctl(dev, arg, file_priv,
-                                                       _IOC_SIZE(cmd));
+                       return ioctl_func(filp, cmd, arg);
                } else if (nr == DRM_COMMAND_BASE + DRM_VMW_UPDATE_LAYOUT) {
                        if (!drm_is_current_master(file_priv) &&
                            !capable(CAP_SYS_ADMIN))
@@ -1180,10 +1171,6 @@ static long vmw_compat_ioctl(struct file *filp, unsigned int cmd,
 }
 #endif
 
-static void vmw_lastclose(struct drm_device *dev)
-{
-}
-
 static void vmw_master_init(struct vmw_master *vmaster)
 {
        ttm_lock_init(&vmaster->lock);
@@ -1551,10 +1538,9 @@ static const struct file_operations vmwgfx_driver_fops = {
 
 static struct drm_driver driver = {
        .driver_features =
-       DRIVER_MODESET | DRIVER_PRIME | DRIVER_RENDER | DRIVER_ATOMIC,
+       DRIVER_MODESET | DRIVER_RENDER | DRIVER_ATOMIC,
        .load = vmw_driver_load,
        .unload = vmw_driver_unload,
-       .lastclose = vmw_lastclose,
        .get_vblank_counter = vmw_get_vblank_counter,
        .enable_vblank = vmw_enable_vblank,
        .disable_vblank = vmw_disable_vblank,
index 366dcfc1f9bbc8ea05c67434d07da950d93041bc..dbb04dbcf4789718392b45ec3c6e2b896b41dc87 100644 (file)
@@ -484,11 +484,6 @@ struct vmw_private {
 
        spinlock_t resource_lock;
        struct idr res_idr[vmw_res_max];
-       /*
-        * Block lastclose from racing with firstopen.
-        */
-
-       struct mutex init_mutex;
 
        /*
         * A resource manager for kernel-only surfaces and
@@ -915,8 +910,8 @@ static inline struct page *vmw_piter_page(struct vmw_piter *viter)
  * Command submission - vmwgfx_execbuf.c
  */
 
-extern int vmw_execbuf_ioctl(struct drm_device *dev, unsigned long data,
-                            struct drm_file *file_priv, size_t size);
+extern int vmw_execbuf_ioctl(struct drm_device *dev, void *data,
+                            struct drm_file *file_priv);
 extern int vmw_execbuf_process(struct drm_file *file_priv,
                               struct vmw_private *dev_priv,
                               void __user *user_commands,
index 33533d1262773688d8bd6153f44f96fa3d28fe8b..ff86d49dc5e8acd66d01ce491c67593f13e4cb9f 100644 (file)
@@ -3995,54 +3995,40 @@ void vmw_execbuf_release_pinned_bo(struct vmw_private *dev_priv)
        mutex_unlock(&dev_priv->cmdbuf_mutex);
 }
 
-int vmw_execbuf_ioctl(struct drm_device *dev, unsigned long data,
-                     struct drm_file *file_priv, size_t size)
+int vmw_execbuf_ioctl(struct drm_device *dev, void *data,
+                     struct drm_file *file_priv)
 {
        struct vmw_private *dev_priv = vmw_priv(dev);
-       struct drm_vmw_execbuf_arg arg;
+       struct drm_vmw_execbuf_arg *arg = data;
        int ret;
-       static const size_t copy_offset[] = {
-               offsetof(struct drm_vmw_execbuf_arg, context_handle),
-               sizeof(struct drm_vmw_execbuf_arg)};
        struct dma_fence *in_fence = NULL;
 
-       if (unlikely(size < copy_offset[0])) {
-               VMW_DEBUG_USER("Invalid command size, ioctl %d\n",
-                              DRM_VMW_EXECBUF);
-               return -EINVAL;
-       }
-
-       if (copy_from_user(&arg, (void __user *) data, copy_offset[0]) != 0)
-               return -EFAULT;
-
        /*
         * Extend the ioctl argument while maintaining backwards compatibility:
-        * We take different code paths depending on the value of arg.version.
+        * We take different code paths depending on the value of arg->version.
+        *
+        * Note: The ioctl argument is extended and zeropadded by core DRM.
         */
-       if (unlikely(arg.version > DRM_VMW_EXECBUF_VERSION ||
-                    arg.version == 0)) {
+       if (unlikely(arg->version > DRM_VMW_EXECBUF_VERSION ||
+                    arg->version == 0)) {
                VMW_DEBUG_USER("Incorrect execbuf version.\n");
                return -EINVAL;
        }
 
-       if (arg.version > 1 &&
-           copy_from_user(&arg.context_handle,
-                          (void __user *) (data + copy_offset[0]),
-                          copy_offset[arg.version - 1] - copy_offset[0]) != 0)
-               return -EFAULT;
-
-       switch (arg.version) {
+       switch (arg->version) {
        case 1:
-               arg.context_handle = (uint32_t) -1;
+               /* For v1 core DRM have extended + zeropadded the data */
+               arg->context_handle = (uint32_t) -1;
                break;
        case 2:
        default:
+               /* For v2 and later core DRM would have correctly copied it */
                break;
        }
 
        /* If imported a fence FD from elsewhere, then wait on it */
-       if (arg.flags & DRM_VMW_EXECBUF_FLAG_IMPORT_FENCE_FD) {
-               in_fence = sync_file_get_fence(arg.imported_fence_fd);
+       if (arg->flags & DRM_VMW_EXECBUF_FLAG_IMPORT_FENCE_FD) {
+               in_fence = sync_file_get_fence(arg->imported_fence_fd);
 
                if (!in_fence) {
                        VMW_DEBUG_USER("Cannot get imported fence\n");
@@ -4059,11 +4045,11 @@ int vmw_execbuf_ioctl(struct drm_device *dev, unsigned long data,
                return ret;
 
        ret = vmw_execbuf_process(file_priv, dev_priv,
-                                 (void __user *)(unsigned long)arg.commands,
-                                 NULL, arg.command_size, arg.throttle_us,
-                                 arg.context_handle,
-                                 (void __user *)(unsigned long)arg.fence_rep,
-                                 NULL, arg.flags);
+                                 (void __user *)(unsigned long)arg->commands,
+                                 NULL, arg->command_size, arg->throttle_us,
+                                 arg->context_handle,
+                                 (void __user *)(unsigned long)arg->fence_rep,
+                                 NULL, arg->flags);
 
        ttm_read_unlock(&dev_priv->reservation_sem);
        if (unlikely(ret != 0))
index b97bc8e5944b68266122d48b21895cd2d450182c..34284f0f508410804a53a0e04f6086ca31b2952b 100644 (file)
@@ -1704,14 +1704,6 @@ vmw_kms_atomic_check_modeset(struct drm_device *dev,
        if (ret)
                return ret;
 
-       if (!state->allow_modeset)
-               return ret;
-
-       /*
-        * Legacy path do not set allow_modeset properly like
-        * @drm_atomic_helper_update_plane, This will result in unnecessary call
-        * to vmw_kms_check_topology. So extra set of check.
-        */
        for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
                if (drm_atomic_crtc_needs_modeset(crtc_state))
                        need_modeset = true;
index 84aa4d61dc42f7edca2c5f9d12948522eef1b15e..ba1828acd8c9999029db8ddc7a1cde48cd0b312a 100644 (file)
@@ -8,13 +8,18 @@
  * Author: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
  */
 
-#include <drm/drmP.h>
+#include <linux/delay.h>
+#include <linux/dma-mapping.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_ioctl.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_file.h>
 #include <drm/drm_gem.h>
 
-#include <linux/of_device.h>
-
 #include <xen/platform_pci.h>
 #include <xen/xen.h>
 #include <xen/xenbus.h>
@@ -485,15 +490,12 @@ static const struct vm_operations_struct xen_drm_drv_vm_ops = {
 };
 
 static struct drm_driver xen_drm_driver = {
-       .driver_features           = DRIVER_GEM | DRIVER_MODESET |
-                                    DRIVER_PRIME | DRIVER_ATOMIC,
+       .driver_features           = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
        .release                   = xen_drm_drv_release,
        .gem_vm_ops                = &xen_drm_drv_vm_ops,
        .gem_free_object_unlocked  = xen_drm_drv_free_object_unlocked,
        .prime_handle_to_fd        = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle        = drm_gem_prime_fd_to_handle,
-       .gem_prime_import          = drm_gem_prime_import,
-       .gem_prime_export          = drm_gem_prime_export,
        .gem_prime_import_sg_table = xen_drm_front_gem_import_sg_table,
        .gem_prime_get_sg_table    = xen_drm_front_gem_get_sg_table,
        .gem_prime_vmap            = xen_drm_front_gem_prime_vmap,
index 5693b4a4b02b1a951d897f30bd60bf2e74a6297d..f92c258350ca0ed0776aeeda02db5343c0bcffaa 100644 (file)
 #ifndef __XEN_DRM_FRONT_H_
 #define __XEN_DRM_FRONT_H_
 
-#include <drm/drmP.h>
-#include <drm/drm_simple_kms_helper.h>
-
 #include <linux/scatterlist.h>
 
+#include <drm/drm_connector.h>
+#include <drm/drm_simple_kms_helper.h>
+
 #include "xen_drm_front_cfg.h"
 
+struct drm_device;
+struct drm_framebuffer;
+struct drm_gem_object;
+struct drm_pending_vblank_event;
+
 /**
  * DOC: Driver modes of operation in terms of display buffers used
  *
index 5baf2b9de93c43eb8f01af3e08c0e44358001bb9..ec53b9cc9e0eadee73a7e2db94d82f0b27d4af91 100644 (file)
@@ -8,10 +8,10 @@
  * Author: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
  */
 
-#include <drm/drmP.h>
-
 #include <linux/device.h>
 
+#include <drm/drm_print.h>
+
 #include <xen/interface/io/displif.h>
 #include <xen/xenbus.h>
 
index 9f5f31f77f1e2ed4d1896536dc8e60c751c9186a..459702fa990e6dfa07c20f75ce567b733cb69bd7 100644 (file)
@@ -9,6 +9,7 @@
  */
 
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_probe_helper.h>
 
 #include <video/videomode.h>
index 39de7cf5adbe9a6998d2c04fcdf3bb3099c8f823..3adacba9a23bfb2712b17f7a4094029d83cdb895 100644 (file)
 #ifndef __XEN_DRM_FRONT_CONN_H_
 #define __XEN_DRM_FRONT_CONN_H_
 
-#include <drm/drmP.h>
-#include <drm/drm_crtc.h>
-#include <drm/drm_encoder.h>
+#include <linux/types.h>
 
-#include <linux/wait.h>
+struct drm_connector;
+struct xen_drm_front_drm_info;
 
 struct xen_drm_front_drm_info;
 
index 945226a95e9b9d17ada39948c4fdd3ba4a4653fb..e10d95dddb99f74363e371e8d5c013f7cb5207b8 100644 (file)
@@ -8,11 +8,11 @@
  * Author: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
  */
 
-#include <drm/drmP.h>
-
 #include <linux/errno.h>
 #include <linux/irq.h>
 
+#include <drm/drm_print.h>
+
 #include <xen/xenbus.h>
 #include <xen/events.h>
 #include <xen/grant_table.h>
index a24548489ddeaf3ae04d1ad811d40c1e1204ce38..f0b85e09411149085044b32325b3790fd7772a3f 100644 (file)
@@ -8,20 +8,19 @@
  * Author: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
  */
 
-#include "xen_drm_front_gem.h"
+#include <linux/dma-buf.h>
+#include <linux/scatterlist.h>
+#include <linux/shmem_fs.h>
 
-#include <drm/drmP.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_gem.h>
+#include <drm/drm_prime.h>
 #include <drm/drm_probe_helper.h>
 
-#include <linux/dma-buf.h>
-#include <linux/scatterlist.h>
-#include <linux/shmem_fs.h>
-
 #include <xen/balloon.h>
 
 #include "xen_drm_front.h"
+#include "xen_drm_front_gem.h"
 
 struct xen_gem_object {
        struct drm_gem_object base;
index d5ab734fdafe73375a87549d2f3ba7ebe38bb7d3..a39675fa31b28961be1f4486f6a502b65d39412d 100644 (file)
 #ifndef __XEN_DRM_FRONT_GEM_H
 #define __XEN_DRM_FRONT_GEM_H
 
-#include <drm/drmP.h>
+struct dma_buf_attachment;
+struct drm_device;
+struct drm_gem_object;
+struct file;
+struct sg_table;
+struct vm_area_struct;
 
 struct drm_gem_object *xen_drm_front_gem_create(struct drm_device *dev,
                                                size_t size);
index c2955d3753944aced832197824c9321dac8b41ec..de990036199d4bbfb01bdf45d61d6381c6cb7c70 100644 (file)
@@ -8,17 +8,18 @@
  * Author: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
  */
 
-#include "xen_drm_front_kms.h"
-
-#include <drm/drmP.h>
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_gem.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_vblank.h>
 
 #include "xen_drm_front.h"
 #include "xen_drm_front_conn.h"
+#include "xen_drm_front_kms.h"
 
 /*
  * Timeout in ms to wait for frame done event from the backend:
index 520d7369f85ae821faf078167ff9dc797b4c4c4b..1141c1ed1ed04c76f2c6260057851a1eb4371758 100644 (file)
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_of.h>
 #include <drm/drm_probe_helper.h>
-#include <drm/drmP.h>
+#include <drm/drm_vblank.h>
 
 #include "zx_drm_drv.h"
 #include "zx_vou.h"
@@ -34,15 +35,12 @@ static const struct drm_mode_config_funcs zx_drm_mode_config_funcs = {
 DEFINE_DRM_GEM_CMA_FOPS(zx_drm_fops);
 
 static struct drm_driver zx_drm_driver = {
-       .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME |
-                          DRIVER_ATOMIC,
+       .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
        .gem_free_object_unlocked = drm_gem_cma_free_object,
        .gem_vm_ops = &drm_gem_cma_vm_ops,
        .dumb_create = drm_gem_cma_dumb_create,
        .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
-       .gem_prime_export = drm_gem_prime_export,
-       .gem_prime_import = drm_gem_prime_import,
        .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
        .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
        .gem_prime_vmap = drm_gem_cma_prime_vmap,
index bfe918b27c5c508fa1aa77845c93cabd683e30db..a50f5a1f09b8eeb4ec31c77097314429324eae73 100644 (file)
@@ -19,7 +19,7 @@
 #include <drm/drm_edid.h>
 #include <drm/drm_of.h>
 #include <drm/drm_probe_helper.h>
-#include <drm/drmP.h>
+#include <drm/drm_print.h>
 
 #include <sound/hdmi-codec.h>
 
index 6b812aad411be10aa7d178cf3213dab499940368..086c50fac6894800ad596d3bd07b0aae2cabe3b7 100644 (file)
@@ -7,10 +7,10 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_plane_helper.h>
-#include <drm/drmP.h>
 
 #include "zx_common_regs.h"
 #include "zx_drm_drv.h"
index a768c567b55796e06119e7759a12721cf519eb13..c598b7daf1f18f1d4d4d7f7e576070b0e479cc82 100644 (file)
@@ -7,11 +7,13 @@
 #include <linux/clk.h>
 #include <linux/component.h>
 #include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
 #include <linux/regmap.h>
 
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_print.h>
 #include <drm/drm_probe_helper.h>
-#include <drm/drmP.h>
 
 #include "zx_drm_drv.h"
 #include "zx_tvenc_regs.h"
index 1634a08707fbfcb922ed3e4c4aa4742b76b227c3..9b67e419280caf73aa38d3e0a7bee398d0a926bc 100644 (file)
@@ -7,11 +7,13 @@
 #include <linux/clk.h>
 #include <linux/component.h>
 #include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
 #include <linux/regmap.h>
 
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_print.h>
 #include <drm/drm_probe_helper.h>
-#include <drm/drmP.h>
 
 #include "zx_drm_drv.h"
 #include "zx_vga_regs.h"
index 81b4cf107b7575213e8d1d74933d00f6b10457da..5259ff2825f940693eb4f44bd02e11e2ebb161bf 100644 (file)
@@ -6,7 +6,10 @@
 
 #include <linux/clk.h>
 #include <linux/component.h>
+#include <linux/module.h>
 #include <linux/of_address.h>
+#include <linux/platform_device.h>
+
 #include <video/videomode.h>
 
 #include <drm/drm_atomic_helper.h>
@@ -17,7 +20,7 @@
 #include <drm/drm_of.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_probe_helper.h>
-#include <drm/drmP.h>
+#include <drm/drm_vblank.h>
 
 #include "zx_common_regs.h"
 #include "zx_drm_drv.h"
index b05e462276d588dcd8b147711043c3e05bf180e1..664e120b93e6042120a782fe14c217bc4ccd0e0e 100644 (file)
@@ -31,11 +31,6 @@ struct drm_agp_head {
 void drm_free_agp(struct agp_memory * handle, int pages);
 int drm_bind_agp(struct agp_memory * handle, unsigned int start);
 int drm_unbind_agp(struct agp_memory * handle);
-struct agp_memory *drm_agp_bind_pages(struct drm_device *dev,
-                               struct page **pages,
-                               unsigned long num_pages,
-                               uint32_t gtt_offset,
-                               uint32_t type);
 
 struct drm_agp_head *drm_agp_init(struct drm_device *dev);
 void drm_legacy_agp_clear(struct drm_device *dev);
@@ -80,15 +75,6 @@ static inline int drm_unbind_agp(struct agp_memory * handle)
        return -ENODEV;
 }
 
-static inline struct agp_memory *drm_agp_bind_pages(struct drm_device *dev,
-                                             struct page **pages,
-                                             unsigned long num_pages,
-                                             uint32_t gtt_offset,
-                                             uint32_t type)
-{
-       return NULL;
-}
-
 static inline struct drm_agp_head *drm_agp_init(struct drm_device *dev)
 {
        return NULL;
index 72d51d1e9dd9ea33ea83b7c6fcdbdc0cc1f250ef..5cf2c5dd8b1e63d19a52f61fd8393133f73af25b 100644 (file)
@@ -149,6 +149,8 @@ struct drm_client_buffer {
 struct drm_client_buffer *
 drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 height, u32 format);
 void drm_client_framebuffer_delete(struct drm_client_buffer *buffer);
+void *drm_client_buffer_vmap(struct drm_client_buffer *buffer);
+void drm_client_buffer_vunmap(struct drm_client_buffer *buffer);
 
 int drm_client_modeset_create(struct drm_client_dev *client);
 void drm_client_modeset_free(struct drm_client_dev *client);
index ca745d9feaf541949b44126408b0cc9626158fbf..4c30d751487ab8bf18622f80ab4880a73d547a33 100644 (file)
@@ -323,6 +323,8 @@ enum drm_panel_orientation {
  *                                     edge of the pixel clock
  * @DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE:  Sync signals are sampled on the falling
  *                                     edge of the pixel clock
+ * @DRM_BUS_FLAG_SHARP_SIGNALS:                Set if the Sharp-specific signals
+ *                                     (SPL, CLS, PS, REV) must be used
  */
 enum drm_bus_flags {
        DRM_BUS_FLAG_DE_LOW = BIT(0),
@@ -341,6 +343,7 @@ enum drm_bus_flags {
        DRM_BUS_FLAG_SYNC_DRIVE_NEGEDGE = DRM_BUS_FLAG_SYNC_NEGEDGE,
        DRM_BUS_FLAG_SYNC_SAMPLE_POSEDGE = DRM_BUS_FLAG_SYNC_NEGEDGE,
        DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE = DRM_BUS_FLAG_SYNC_POSEDGE,
+       DRM_BUS_FLAG_SHARP_SIGNALS = BIT(8),
 };
 
 /**
index 68ca736c548d460279c9ebc74c10abb21235fb82..b33f2cee2099c00928a4b4f28b874299799d4a3d 100644 (file)
@@ -61,12 +61,6 @@ enum drm_driver_feature {
         * Driver supports mode setting interfaces (KMS).
         */
        DRIVER_MODESET                  = BIT(1),
-       /**
-        * @DRIVER_PRIME:
-        *
-        * Driver implements DRM PRIME buffer sharing.
-        */
-       DRIVER_PRIME                    = BIT(2),
        /**
         * @DRIVER_RENDER:
         *
@@ -502,21 +496,25 @@ struct drm_driver {
         * @gem_free_object: deconstructor for drm_gem_objects
         *
         * This is deprecated and should not be used by new drivers. Use
-        * @gem_free_object_unlocked instead.
+        * &drm_gem_object_funcs.free instead.
         */
        void (*gem_free_object) (struct drm_gem_object *obj);
 
        /**
         * @gem_free_object_unlocked: deconstructor for drm_gem_objects
         *
-        * This is for drivers which are not encumbered with &drm_device.struct_mutex
-        * legacy locking schemes. Use this hook instead of @gem_free_object.
+        * This is deprecated and should not be used by new drivers. Use
+        * &drm_gem_object_funcs.free instead.
+        * Compared to @gem_free_object this is not encumbered with
+        * &drm_device.struct_mutex legacy locking schemes.
         */
        void (*gem_free_object_unlocked) (struct drm_gem_object *obj);
 
        /**
         * @gem_open_object:
         *
+        * This callback is deprecated in favour of &drm_gem_object_funcs.open.
+        *
         * Driver hook called upon gem handle creation
         */
        int (*gem_open_object) (struct drm_gem_object *, struct drm_file *);
@@ -524,6 +522,8 @@ struct drm_driver {
        /**
         * @gem_close_object:
         *
+        * This callback is deprecated in favour of &drm_gem_object_funcs.close.
+        *
         * Driver hook called upon gem handle release
         */
        void (*gem_close_object) (struct drm_gem_object *, struct drm_file *);
@@ -531,6 +531,9 @@ struct drm_driver {
        /**
         * @gem_print_info:
         *
+        * This callback is deprecated in favour of
+        * &drm_gem_object_funcs.print_info.
+        *
         * If driver subclasses struct &drm_gem_object, it can implement this
         * optional hook for printing additional driver specific info.
         *
@@ -545,56 +548,120 @@ struct drm_driver {
        /**
         * @gem_create_object: constructor for gem objects
         *
-        * Hook for allocating the GEM object struct, for use by core
-        * helpers.
+        * Hook for allocating the GEM object struct, for use by the CMA and
+        * SHMEM GEM helpers.
         */
        struct drm_gem_object *(*gem_create_object)(struct drm_device *dev,
                                                    size_t size);
-
-       /* prime: */
        /**
         * @prime_handle_to_fd:
         *
-        * export handle -> fd (see drm_gem_prime_handle_to_fd() helper)
+        * Main PRIME export function. Should be implemented with
+        * drm_gem_prime_handle_to_fd() for GEM based drivers.
+        *
+        * For an in-depth discussion see :ref:`PRIME buffer sharing
+        * documentation <prime_buffer_sharing>`.
         */
        int (*prime_handle_to_fd)(struct drm_device *dev, struct drm_file *file_priv,
                                uint32_t handle, uint32_t flags, int *prime_fd);
        /**
         * @prime_fd_to_handle:
         *
-        * import fd -> handle (see drm_gem_prime_fd_to_handle() helper)
+        * Main PRIME import function. Should be implemented with
+        * drm_gem_prime_fd_to_handle() for GEM based drivers.
+        *
+        * For an in-depth discussion see :ref:`PRIME buffer sharing
+        * documentation <prime_buffer_sharing>`.
         */
        int (*prime_fd_to_handle)(struct drm_device *dev, struct drm_file *file_priv,
                                int prime_fd, uint32_t *handle);
        /**
         * @gem_prime_export:
         *
-        * export GEM -> dmabuf
-        *
-        * This defaults to drm_gem_prime_export() if not set.
+        * Export hook for GEM drivers. Deprecated in favour of
+        * &drm_gem_object_funcs.export.
         */
-       struct dma_buf * (*gem_prime_export)(struct drm_device *dev,
-                               struct drm_gem_object *obj, int flags);
+       struct dma_buf * (*gem_prime_export)(struct drm_gem_object *obj,
+                                            int flags);
        /**
         * @gem_prime_import:
         *
-        * import dmabuf -> GEM
+        * Import hook for GEM drivers.
         *
         * This defaults to drm_gem_prime_import() if not set.
         */
        struct drm_gem_object * (*gem_prime_import)(struct drm_device *dev,
                                struct dma_buf *dma_buf);
+
+       /**
+        * @gem_prime_pin:
+        *
+        * Deprecated hook in favour of &drm_gem_object_funcs.pin.
+        */
        int (*gem_prime_pin)(struct drm_gem_object *obj);
+
+       /**
+        * @gem_prime_unpin:
+        *
+        * Deprecated hook in favour of &drm_gem_object_funcs.unpin.
+        */
        void (*gem_prime_unpin)(struct drm_gem_object *obj);
+
+
+       /**
+        * @gem_prime_get_sg_table:
+        *
+        * Deprecated hook in favour of &drm_gem_object_funcs.get_sg_table.
+        */
+       struct sg_table *(*gem_prime_get_sg_table)(struct drm_gem_object *obj);
+
+       /**
+        * @gem_prime_res_obj:
+        *
+        * Optional hook to look up the &reservation_object for an buffer when
+        * exporting it.
+        *
+        * FIXME: This hook is deprecated. Users of this hook should be replaced
+        * by setting &drm_gem_object.resv instead.
+        */
        struct reservation_object * (*gem_prime_res_obj)(
                                struct drm_gem_object *obj);
-       struct sg_table *(*gem_prime_get_sg_table)(struct drm_gem_object *obj);
+
+       /**
+        * @gem_prime_import_sg_table:
+        *
+        * Optional hook used by the PRIME helper functions
+        * drm_gem_prime_import() respectively drm_gem_prime_import_dev().
+        */
        struct drm_gem_object *(*gem_prime_import_sg_table)(
                                struct drm_device *dev,
                                struct dma_buf_attachment *attach,
                                struct sg_table *sgt);
+       /**
+        * @gem_prime_vmap:
+        *
+        * Deprecated vmap hook for GEM drivers. Please use
+        * &drm_gem_object_funcs.vmap instead.
+        */
        void *(*gem_prime_vmap)(struct drm_gem_object *obj);
+
+       /**
+        * @gem_prime_vunmap:
+        *
+        * Deprecated vunmap hook for GEM drivers. Please use
+        * &drm_gem_object_funcs.vunmap instead.
+        */
        void (*gem_prime_vunmap)(struct drm_gem_object *obj, void *vaddr);
+
+       /**
+        * @gem_prime_mmap:
+        *
+        * mmap hook for GEM drivers, used to implement dma-buf mmap in the
+        * PRIME helpers.
+        *
+        * FIXME: There's way too much duplication going on here, and also moved
+        * to &drm_gem_object_funcs.
+        */
        int (*gem_prime_mmap)(struct drm_gem_object *obj,
                                struct vm_area_struct *vma);
 
@@ -662,6 +729,9 @@ struct drm_driver {
 
        /**
         * @gem_vm_ops: Driver private ops for this object
+        *
+        * For GEM drivers this is deprecated in favour of
+        * &drm_gem_object_funcs.vm_ops.
         */
        const struct vm_operations_struct *gem_vm_ops;
 
index a9121fe66ea227c4ab01fef54213179fdefc1a48..ae693c0666cdf36cace60af5e36086e107f946b9 100644 (file)
@@ -101,7 +101,7 @@ struct drm_gem_object_funcs {
        /**
         * @pin:
         *
-        * Pin backing buffer in memory.
+        * Pin backing buffer in memory. Used by the drm_gem_map_attach() helper.
         *
         * This callback is optional.
         */
@@ -110,7 +110,7 @@ struct drm_gem_object_funcs {
        /**
         * @unpin:
         *
-        * Unpin backing buffer.
+        * Unpin backing buffer. Used by the drm_gem_map_detach() helper.
         *
         * This callback is optional.
         */
@@ -120,16 +120,21 @@ struct drm_gem_object_funcs {
         * @get_sg_table:
         *
         * Returns a Scatter-Gather table representation of the buffer.
-        * Used when exporting a buffer.
+        * Used when exporting a buffer by the drm_gem_map_dma_buf() helper.
+        * Releasing is done by calling dma_unmap_sg_attrs() and sg_free_table()
+        * in drm_gem_unmap_buf(), therefore these helpers and this callback
+        * here cannot be used for sg tables pointing at driver private memory
+        * ranges.
         *
-        * This callback is mandatory if buffer export is supported.
+        * See also drm_prime_pages_to_sg().
         */
        struct sg_table *(*get_sg_table)(struct drm_gem_object *obj);
 
        /**
         * @vmap:
         *
-        * Returns a virtual address for the buffer.
+        * Returns a virtual address for the buffer. Used by the
+        * drm_gem_dmabuf_vmap() helper.
         *
         * This callback is optional.
         */
@@ -138,7 +143,8 @@ struct drm_gem_object_funcs {
        /**
         * @vunmap:
         *
-        * Releases the the address previously returned by @vmap.
+        * Releases the the address previously returned by @vmap. Used by the
+        * drm_gem_dmabuf_vunmap() helper.
         *
         * This callback is optional.
         */
index 7f307e834eef3a66739cf3b3920dd14ffccfb66b..d9f13fd25b0aef962808e95fc96a3e3b0f04f53d 100644 (file)
@@ -33,11 +33,4 @@ int drm_gem_fb_prepare_fb(struct drm_plane *plane,
                          struct drm_plane_state *state);
 int drm_gem_fb_simple_display_pipe_prepare_fb(struct drm_simple_display_pipe *pipe,
                                              struct drm_plane_state *plane_state);
-
-struct drm_framebuffer *
-drm_gem_fbdev_fb_create(struct drm_device *dev,
-                       struct drm_fb_helper_surface_size *sizes,
-                       unsigned int pitch_align, struct drm_gem_object *obj,
-                       const struct drm_framebuffer_funcs *funcs);
-
 #endif
index 9581ea0a4f7e3674cb8feac030c89ea81f414474..b41d932eb53a452498374ccf1f7d651c8aaea1be 100644 (file)
@@ -108,7 +108,6 @@ extern const struct drm_vram_mm_funcs drm_gem_vram_mm_funcs;
  * Helpers for struct drm_driver
  */
 
-void drm_gem_vram_driver_gem_free_object_unlocked(struct drm_gem_object *gem);
 int drm_gem_vram_driver_dumb_create(struct drm_file *file,
                                    struct drm_device *dev,
                                    struct drm_mode_create_dumb *args);
@@ -124,30 +123,8 @@ int drm_gem_vram_driver_dumb_mmap_offset(struct drm_file *file,
  * &struct drm_driver with default functions.
  */
 #define DRM_GEM_VRAM_DRIVER \
-       .gem_free_object_unlocked = \
-               drm_gem_vram_driver_gem_free_object_unlocked, \
        .dumb_create              = drm_gem_vram_driver_dumb_create, \
-       .dumb_map_offset          = drm_gem_vram_driver_dumb_mmap_offset
-
-/*
- * PRIME helpers for struct drm_driver
- */
-
-int drm_gem_vram_driver_gem_prime_pin(struct drm_gem_object *obj);
-void drm_gem_vram_driver_gem_prime_unpin(struct drm_gem_object *obj);
-void *drm_gem_vram_driver_gem_prime_vmap(struct drm_gem_object *obj);
-void drm_gem_vram_driver_gem_prime_vunmap(struct drm_gem_object *obj,
-                                         void *vaddr);
-int drm_gem_vram_driver_gem_prime_mmap(struct drm_gem_object *obj,
-                                      struct vm_area_struct *vma);
-
-#define DRM_GEM_VRAM_DRIVER_PRIME \
-       .gem_prime_export = drm_gem_prime_export, \
-       .gem_prime_import = drm_gem_prime_import, \
-       .gem_prime_pin    = drm_gem_vram_driver_gem_prime_pin, \
-       .gem_prime_unpin  = drm_gem_vram_driver_gem_prime_unpin, \
-       .gem_prime_vmap   = drm_gem_vram_driver_gem_prime_vmap, \
-       .gem_prime_vunmap = drm_gem_vram_driver_gem_prime_vunmap, \
-       .gem_prime_mmap   = drm_gem_vram_driver_gem_prime_mmap
+       .dumb_map_offset          = drm_gem_vram_driver_dumb_mmap_offset, \
+       .gem_prime_mmap           = drm_gem_prime_mmap
 
 #endif
index fafb6f592c4b97f0567947dc4ed8cffe15f8554f..10100a4bbe2ad63f556a40e7dbc1010e1bdda466 100644 (file)
@@ -114,6 +114,9 @@ enum drm_ioctl_flags {
         * Whether &drm_ioctl_desc.func should be called with the DRM BKL held
         * or not. Enforced as the default for all modern drivers, hence there
         * should never be a need to set this flag.
+        *
+        * Do not use anywhere else than for the VBLANK_WAIT IOCTL, which is the
+        * only legacy IOCTL which needs this.
         */
        DRM_UNLOCKED            = BIT(4),
        /**
index 759d462d028bb7d32459c6e86e6e48564bb809a2..f57eea0481e0fd18a79d0c1178108619ae5e0a38 100644 (file)
@@ -852,6 +852,13 @@ struct drm_mode_config {
        /* dumb ioctl parameters */
        uint32_t preferred_depth, prefer_shadow;
 
+       /**
+        * @prefer_shadow_fbdev:
+        *
+        * Hint to framebuffer emulation to prefer shadow-fb rendering.
+        */
+       bool prefer_shadow_fbdev;
+
        /**
         * @quirk_addfb_prefer_xbgr_30bpp:
         *
index 8c738c0e6e9f744df88864b7783e7e15f54f07c5..26377836141c85a16bc3865a267a264d1352ade6 100644 (file)
@@ -24,6 +24,7 @@
 #ifndef __DRM_PANEL_H__
 #define __DRM_PANEL_H__
 
+#include <linux/err.h>
 #include <linux/errno.h>
 #include <linux/list.h>
 
index b03731a3f079637db295fd02e5735a82d7fa038b..d89311b822d508c7305fa20d5dbc37cf4678d53d 100644 (file)
@@ -42,7 +42,6 @@
  * This just contains the internal &struct dma_buf and handle caches for each
  * &struct drm_file used by the PRIME core code.
  */
-
 struct drm_prime_file_private {
 /* private: */
        struct mutex lock;
@@ -64,25 +63,18 @@ struct drm_file;
 
 struct device;
 
-struct dma_buf *drm_gem_prime_export(struct drm_device *dev,
-                                    struct drm_gem_object *obj,
-                                    int flags);
+/* core prime functions */
+struct dma_buf *drm_gem_dmabuf_export(struct drm_device *dev,
+                                     struct dma_buf_export_info *exp_info);
+void drm_gem_dmabuf_release(struct dma_buf *dma_buf);
+
+int drm_gem_prime_fd_to_handle(struct drm_device *dev,
+                              struct drm_file *file_priv, int prime_fd, uint32_t *handle);
 int drm_gem_prime_handle_to_fd(struct drm_device *dev,
                               struct drm_file *file_priv, uint32_t handle, uint32_t flags,
                               int *prime_fd);
-int drm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
-struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
-                                           struct dma_buf *dma_buf);
 
-struct drm_gem_object *drm_gem_prime_import_dev(struct drm_device *dev,
-                                               struct dma_buf *dma_buf,
-                                               struct device *attach_dev);
-
-int drm_gem_prime_fd_to_handle(struct drm_device *dev,
-                              struct drm_file *file_priv, int prime_fd, uint32_t *handle);
-struct dma_buf *drm_gem_dmabuf_export(struct drm_device *dev,
-                                     struct dma_buf_export_info *exp_info);
-void drm_gem_dmabuf_release(struct dma_buf *dma_buf);
+/* helper functions for exporting */
 int drm_gem_map_attach(struct dma_buf *dma_buf,
                       struct dma_buf_attachment *attach);
 void drm_gem_map_detach(struct dma_buf *dma_buf,
@@ -94,12 +86,25 @@ void drm_gem_unmap_dma_buf(struct dma_buf_attachment *attach,
                           enum dma_data_direction dir);
 void *drm_gem_dmabuf_vmap(struct dma_buf *dma_buf);
 void drm_gem_dmabuf_vunmap(struct dma_buf *dma_buf, void *vaddr);
+
+int drm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
 int drm_gem_dmabuf_mmap(struct dma_buf *dma_buf, struct vm_area_struct *vma);
 
-int drm_prime_sg_to_page_addr_arrays(struct sg_table *sgt, struct page **pages,
-                                    dma_addr_t *addrs, int max_pages);
 struct sg_table *drm_prime_pages_to_sg(struct page **pages, unsigned int nr_pages);
+struct dma_buf *drm_gem_prime_export(struct drm_gem_object *obj,
+                                    int flags);
+
+/* helper functions for importing */
+struct drm_gem_object *drm_gem_prime_import_dev(struct drm_device *dev,
+                                               struct dma_buf *dma_buf,
+                                               struct device *attach_dev);
+struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
+                                           struct dma_buf *dma_buf);
+
 void drm_prime_gem_destroy(struct drm_gem_object *obj, struct sg_table *sg);
 
+int drm_prime_sg_to_page_addr_arrays(struct sg_table *sgt, struct page **pages,
+                                    dma_addr_t *addrs, int max_pages);
+
 
 #endif /* __DRM_PRIME_H__ */
index e528bb2f659d95296062c8206dc1b3f2bad29241..9fe4ba8bc622cdf18f0da9a983f094fa066d9c68 100644 (file)
@@ -30,7 +30,6 @@
 
 #include <drm/drm_file.h>
 #include <drm/drm_modes.h>
-#include <uapi/drm/drm.h>
 
 struct drm_device;
 struct drm_crtc;
index a8ffd8599b08579fbf485082d7b2cbd544daa61e..2aacfb1ccfae40a20d03110a8a98e17dcd8c912e 100644 (file)
@@ -3,6 +3,8 @@
 #ifndef DRM_VRAM_MM_HELPER_H
 #define DRM_VRAM_MM_HELPER_H
 
+#include <drm/drm_file.h>
+#include <drm/drm_ioctl.h>
 #include <drm/ttm/ttm_bo_driver.h>
 
 struct drm_device;
index 644a22dbe53b267fac7ae9bbd91222339781df74..02866ee54d67e479d0ace67ebe4538b7a5de00a7 100644 (file)
@@ -81,50 +81,6 @@ struct reservation_object {
 #define reservation_object_assert_held(obj) \
        lockdep_assert_held(&(obj)->lock.base)
 
-/**
- * reservation_object_init - initialize a reservation object
- * @obj: the reservation object
- */
-static inline void
-reservation_object_init(struct reservation_object *obj)
-{
-       ww_mutex_init(&obj->lock, &reservation_ww_class);
-
-       __seqcount_init(&obj->seq, reservation_seqcount_string, &reservation_seqcount_class);
-       RCU_INIT_POINTER(obj->fence, NULL);
-       RCU_INIT_POINTER(obj->fence_excl, NULL);
-}
-
-/**
- * reservation_object_fini - destroys a reservation object
- * @obj: the reservation object
- */
-static inline void
-reservation_object_fini(struct reservation_object *obj)
-{
-       int i;
-       struct reservation_object_list *fobj;
-       struct dma_fence *excl;
-
-       /*
-        * This object should be dead and all references must have
-        * been released to it, so no need to be protected with rcu.
-        */
-       excl = rcu_dereference_protected(obj->fence_excl, 1);
-       if (excl)
-               dma_fence_put(excl);
-
-       fobj = rcu_dereference_protected(obj->fence, 1);
-       if (fobj) {
-               for (i = 0; i < fobj->shared_count; ++i)
-                       dma_fence_put(rcu_dereference_protected(fobj->shared[i], 1));
-
-               kfree(fobj);
-       }
-
-       ww_mutex_destroy(&obj->lock);
-}
-
 /**
  * reservation_object_get_list - get the reservation object's
  * shared fence list, with update-side lock held
@@ -271,6 +227,8 @@ reservation_object_get_excl_rcu(struct reservation_object *obj)
        return fence;
 }
 
+void reservation_object_init(struct reservation_object *obj);
+void reservation_object_fini(struct reservation_object *obj);
 int reservation_object_reserve_shared(struct reservation_object *obj,
                                      unsigned int num_fences);
 void reservation_object_add_shared_fence(struct reservation_object *obj,
index b4dde2fbeb3fb665ec29b71dea32f621e4fea458..0cb2a6050d1f31a13ec36f21cb9ece305eb44315 100644 (file)
@@ -20,6 +20,7 @@
 #define MESON_CANVAS_ENDIAN_SWAP64     0x7
 #define MESON_CANVAS_ENDIAN_SWAP128    0xf
 
+struct device;
 struct meson_canvas;
 
 /**
index 2a6b253cfb0513034527ac9f6cadaa8e5142aa7b..16c1fa2d89a427c6f4eb47b982d6c3505f74c58e 100644 (file)
@@ -34,7 +34,7 @@
 
 #define MEDIA_BUS_FMT_FIXED                    0x0001
 
-/* RGB - next is       0x101c */
+/* RGB - next is       0x101d */
 #define MEDIA_BUS_FMT_RGB444_1X12              0x1016
 #define MEDIA_BUS_FMT_RGB444_2X8_PADHI_BE      0x1001
 #define MEDIA_BUS_FMT_RGB444_2X8_PADHI_LE      0x1002
@@ -55,6 +55,7 @@
 #define MEDIA_BUS_FMT_RGB888_1X24              0x100a
 #define MEDIA_BUS_FMT_RGB888_2X12_BE           0x100b
 #define MEDIA_BUS_FMT_RGB888_2X12_LE           0x100c
+#define MEDIA_BUS_FMT_RGB888_3X8               0x101c
 #define MEDIA_BUS_FMT_RGB888_1X7X4_SPWG                0x1011
 #define MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA       0x1012
 #define MEDIA_BUS_FMT_ARGB8888_1X32            0x100d