aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2018-09-27 19:31:03 -0400
committerDave Airlie <airlied@redhat.com>2018-09-27 19:36:48 -0400
commit156e60bc71aa31a3b42b1d66a822c2999bd0994c (patch)
treedbc2fa3c30c78b1465aa29ca37fefbb8a16bde8e
parentbf78296ab1cb215d0609ac6cff4e43e941e51265 (diff)
parentc2b70ffcd34eca60013d90bd6cd56e60b07adef8 (diff)
Merge tag 'drm-misc-next-2018-09-27' of git://anongit.freedesktop.org/drm/drm-misc into drm-next
drm-misc-next for 4.20: UAPI Changes: - None Cross-subsystem Changes: - MAINTAINERS: Move udl, mxsfb, and fsl-dcu into drm-misc (Stefan, Sean) Core Changes: - syncobj: Check condition before returning timeout in schedule() (Chris) Driver Changes: - various: First wave of drm_fbdev_generic_setup() conversions (Noralf) - bochs/virtio: More format byte-order improvements (Gerd) - mxsfb: A couple fixes + add runtime pm support (Leonard) - virtio: Add vmap support for prime objects (Ezequiel) Cc: Stefan Agner <stefan@agner.ch> Cc: Sean Paul <sean@poorly.run> Cc: Noralf Trønnes <noralf@tronnes.org> Cc: Gerd Hoffman <kraxel@redhat.com> Cc: Leonard Crestez <leonard.crestez@nxp.com> Cc: Chris Wilson <chris@chris-wilson.co.uk> Cc: Ezequiel Garcia <ezequiel@collabora.com> Signed-off-by: Dave Airlie <airlied@redhat.com> From: Sean Paul <sean@poorly.run> Link: https://patchwork.freedesktop.org/patch/msgid/20180927093950.GA180365@art_vandelay
-rw-r--r--Documentation/devicetree/bindings/display/sunxi/sun4i-drm.txt2
-rw-r--r--MAINTAINERS7
-rw-r--r--drivers/gpu/drm/arm/hdlcd_drv.c11
-rw-r--r--drivers/gpu/drm/arm/malidp_drv.c11
-rw-r--r--drivers/gpu/drm/bochs/bochs.h4
-rw-r--r--drivers/gpu/drm/bochs/bochs_fbdev.c18
-rw-r--r--drivers/gpu/drm/bochs/bochs_hw.c64
-rw-r--r--drivers/gpu/drm/bochs/bochs_kms.c40
-rw-r--r--drivers/gpu/drm/drm_atomic_helper.c4
-rw-r--r--drivers/gpu/drm/drm_fb_helper.c8
-rw-r--r--drivers/gpu/drm/drm_fourcc.c35
-rw-r--r--drivers/gpu/drm/drm_framebuffer.c17
-rw-r--r--drivers/gpu/drm/drm_gem_framebuffer_helper.c4
-rw-r--r--drivers/gpu/drm/drm_ioctl.c6
-rw-r--r--drivers/gpu/drm/drm_syncobj.c52
-rw-r--r--drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c8
-rw-r--r--drivers/gpu/drm/imx/imx-drm-core.c19
-rw-r--r--drivers/gpu/drm/mxsfb/mxsfb_crtc.c53
-rw-r--r--drivers/gpu/drm/mxsfb/mxsfb_drv.c40
-rw-r--r--drivers/gpu/drm/pl111/pl111_drv.c6
-rw-r--r--drivers/gpu/drm/sti/sti_drv.c8
-rw-r--r--drivers/gpu/drm/sun4i/sun4i_drv.c1
-rw-r--r--drivers/gpu/drm/sun4i/sun8i_mixer.c24
-rw-r--r--drivers/gpu/drm/sun4i/sun8i_tcon_top.c1
-rw-r--r--drivers/gpu/drm/tegra/drm.c10
-rw-r--r--drivers/gpu/drm/tve200/tve200_drv.c14
-rw-r--r--drivers/gpu/drm/udl/udl_drv.c2
-rw-r--r--drivers/gpu/drm/vc4/vc4_drv.c5
-rw-r--r--drivers/gpu/drm/vc4/vc4_kms.c6
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_display.c5
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_drv.h9
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_fb.c14
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_gem.c7
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_ioctl.c4
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_object.c19
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_plane.c58
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_prime.c11
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_vq.c20
-rw-r--r--drivers/gpu/drm/vkms/vkms_crc.c1
-rw-r--r--drivers/gpu/drm/zte/zx_drm_drv.c19
-rw-r--r--include/drm/drm_fourcc.h2
41 files changed, 367 insertions, 282 deletions
diff --git a/Documentation/devicetree/bindings/display/sunxi/sun4i-drm.txt b/Documentation/devicetree/bindings/display/sunxi/sun4i-drm.txt
index 22d6dda587c5..7854fff4fc16 100644
--- a/Documentation/devicetree/bindings/display/sunxi/sun4i-drm.txt
+++ b/Documentation/devicetree/bindings/display/sunxi/sun4i-drm.txt
@@ -376,6 +376,8 @@ Required properties:
376 * allwinner,sun8i-a83t-de2-mixer-0 376 * allwinner,sun8i-a83t-de2-mixer-0
377 * allwinner,sun8i-a83t-de2-mixer-1 377 * allwinner,sun8i-a83t-de2-mixer-1
378 * allwinner,sun8i-h3-de2-mixer-0 378 * allwinner,sun8i-h3-de2-mixer-0
379 * allwinner,sun8i-r40-de2-mixer-0
380 * allwinner,sun8i-r40-de2-mixer-1
379 * allwinner,sun8i-v3s-de2-mixer 381 * allwinner,sun8i-v3s-de2-mixer
380 * allwinner,sun50i-a64-de2-mixer-0 382 * allwinner,sun50i-a64-de2-mixer-0
381 * allwinner,sun50i-a64-de2-mixer-1 383 * allwinner,sun50i-a64-de2-mixer-1
diff --git a/MAINTAINERS b/MAINTAINERS
index 0d039697fe2a..94c1fef3279b 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -4721,8 +4721,11 @@ F: drivers/gpu/drm/tdfx/
4721 4721
4722DRM DRIVER FOR USB DISPLAYLINK VIDEO ADAPTERS 4722DRM DRIVER FOR USB DISPLAYLINK VIDEO ADAPTERS
4723M: Dave Airlie <airlied@redhat.com> 4723M: Dave Airlie <airlied@redhat.com>
4724R: Sean Paul <sean@poorly.run>
4725L: dri-devel@lists.freedesktop.org
4724S: Odd Fixes 4726S: Odd Fixes
4725F: drivers/gpu/drm/udl/ 4727F: drivers/gpu/drm/udl/
4728T: git git://anongit.freedesktop.org/drm/drm-misc
4726 4729
4727DRM DRIVER FOR VMWARE VIRTUAL GPU 4730DRM DRIVER FOR VMWARE VIRTUAL GPU
4728M: "VMware Graphics" <linux-graphics-maintainer@vmware.com> 4731M: "VMware Graphics" <linux-graphics-maintainer@vmware.com>
@@ -4822,6 +4825,7 @@ F: drivers/gpu/drm/fsl-dcu/
4822F: Documentation/devicetree/bindings/display/fsl,dcu.txt 4825F: Documentation/devicetree/bindings/display/fsl,dcu.txt
4823F: Documentation/devicetree/bindings/display/fsl,tcon.txt 4826F: Documentation/devicetree/bindings/display/fsl,tcon.txt
4824F: Documentation/devicetree/bindings/display/panel/nec,nl4827hc19-05b.txt 4827F: Documentation/devicetree/bindings/display/panel/nec,nl4827hc19-05b.txt
4828T: git git://anongit.freedesktop.org/drm/drm-misc
4825 4829
4826DRM DRIVERS FOR FREESCALE IMX 4830DRM DRIVERS FOR FREESCALE IMX
4827M: Philipp Zabel <p.zabel@pengutronix.de> 4831M: Philipp Zabel <p.zabel@pengutronix.de>
@@ -9906,9 +9910,12 @@ F: drivers/media/tuners/mxl5007t.*
9906 9910
9907MXSFB DRM DRIVER 9911MXSFB DRM DRIVER
9908M: Marek Vasut <marex@denx.de> 9912M: Marek Vasut <marex@denx.de>
9913M: Stefan Agner <stefan@agner.ch>
9914L: dri-devel@lists.freedesktop.org
9909S: Supported 9915S: Supported
9910F: drivers/gpu/drm/mxsfb/ 9916F: drivers/gpu/drm/mxsfb/
9911F: Documentation/devicetree/bindings/display/mxsfb.txt 9917F: Documentation/devicetree/bindings/display/mxsfb.txt
9918T: git git://anongit.freedesktop.org/drm/drm-misc
9912 9919
9913MYRICOM MYRI-10G 10GbE DRIVER (MYRI10GE) 9920MYRICOM MYRI-10G 10GbE DRIVER (MYRI10GE)
9914M: Chris Lee <christopher.lee@cspi.com> 9921M: Chris Lee <christopher.lee@cspi.com>
diff --git a/drivers/gpu/drm/arm/hdlcd_drv.c b/drivers/gpu/drm/arm/hdlcd_drv.c
index 0ed1cde98cf8..dfad8d06d108 100644
--- a/drivers/gpu/drm/arm/hdlcd_drv.c
+++ b/drivers/gpu/drm/arm/hdlcd_drv.c
@@ -103,7 +103,6 @@ setup_fail:
103 103
104static const struct drm_mode_config_funcs hdlcd_mode_config_funcs = { 104static const struct drm_mode_config_funcs hdlcd_mode_config_funcs = {
105 .fb_create = drm_gem_fb_create, 105 .fb_create = drm_gem_fb_create,
106 .output_poll_changed = drm_fb_helper_output_poll_changed,
107 .atomic_check = drm_atomic_helper_check, 106 .atomic_check = drm_atomic_helper_check,
108 .atomic_commit = drm_atomic_helper_commit, 107 .atomic_commit = drm_atomic_helper_commit,
109}; 108};
@@ -233,7 +232,6 @@ static struct drm_driver hdlcd_driver = {
233 .driver_features = DRIVER_HAVE_IRQ | DRIVER_GEM | 232 .driver_features = DRIVER_HAVE_IRQ | DRIVER_GEM |
234 DRIVER_MODESET | DRIVER_PRIME | 233 DRIVER_MODESET | DRIVER_PRIME |
235 DRIVER_ATOMIC, 234 DRIVER_ATOMIC,
236 .lastclose = drm_fb_helper_lastclose,
237 .irq_handler = hdlcd_irq, 235 .irq_handler = hdlcd_irq,
238 .irq_preinstall = hdlcd_irq_preinstall, 236 .irq_preinstall = hdlcd_irq_preinstall,
239 .irq_postinstall = hdlcd_irq_postinstall, 237 .irq_postinstall = hdlcd_irq_postinstall,
@@ -308,19 +306,15 @@ static int hdlcd_drm_bind(struct device *dev)
308 drm_mode_config_reset(drm); 306 drm_mode_config_reset(drm);
309 drm_kms_helper_poll_init(drm); 307 drm_kms_helper_poll_init(drm);
310 308
311 ret = drm_fb_cma_fbdev_init(drm, 32, 0);
312 if (ret)
313 goto err_fbdev;
314
315 ret = drm_dev_register(drm, 0); 309 ret = drm_dev_register(drm, 0);
316 if (ret) 310 if (ret)
317 goto err_register; 311 goto err_register;
318 312
313 drm_fbdev_generic_setup(drm, 32);
314
319 return 0; 315 return 0;
320 316
321err_register: 317err_register:
322 drm_fb_cma_fbdev_fini(drm);
323err_fbdev:
324 drm_kms_helper_poll_fini(drm); 318 drm_kms_helper_poll_fini(drm);
325err_vblank: 319err_vblank:
326 pm_runtime_disable(drm->dev); 320 pm_runtime_disable(drm->dev);
@@ -346,7 +340,6 @@ static void hdlcd_drm_unbind(struct device *dev)
346 struct hdlcd_drm_private *hdlcd = drm->dev_private; 340 struct hdlcd_drm_private *hdlcd = drm->dev_private;
347 341
348 drm_dev_unregister(drm); 342 drm_dev_unregister(drm);
349 drm_fb_cma_fbdev_fini(drm);
350 drm_kms_helper_poll_fini(drm); 343 drm_kms_helper_poll_fini(drm);
351 component_unbind_all(dev, drm); 344 component_unbind_all(dev, drm);
352 of_node_put(hdlcd->crtc.port); 345 of_node_put(hdlcd->crtc.port);
diff --git a/drivers/gpu/drm/arm/malidp_drv.c b/drivers/gpu/drm/arm/malidp_drv.c
index 08b5bb219816..3171ffaadd77 100644
--- a/drivers/gpu/drm/arm/malidp_drv.c
+++ b/drivers/gpu/drm/arm/malidp_drv.c
@@ -260,7 +260,6 @@ static const struct drm_mode_config_helper_funcs malidp_mode_config_helpers = {
260 260
261static const struct drm_mode_config_funcs malidp_mode_config_funcs = { 261static const struct drm_mode_config_funcs malidp_mode_config_funcs = {
262 .fb_create = drm_gem_fb_create, 262 .fb_create = drm_gem_fb_create,
263 .output_poll_changed = drm_fb_helper_output_poll_changed,
264 .atomic_check = drm_atomic_helper_check, 263 .atomic_check = drm_atomic_helper_check,
265 .atomic_commit = drm_atomic_helper_commit, 264 .atomic_commit = drm_atomic_helper_commit,
266}; 265};
@@ -450,7 +449,6 @@ static int malidp_debugfs_init(struct drm_minor *minor)
450static struct drm_driver malidp_driver = { 449static struct drm_driver malidp_driver = {
451 .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC | 450 .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC |
452 DRIVER_PRIME, 451 DRIVER_PRIME,
453 .lastclose = drm_fb_helper_lastclose,
454 .gem_free_object_unlocked = drm_gem_cma_free_object, 452 .gem_free_object_unlocked = drm_gem_cma_free_object,
455 .gem_vm_ops = &drm_gem_cma_vm_ops, 453 .gem_vm_ops = &drm_gem_cma_vm_ops,
456 .dumb_create = malidp_dumb_create, 454 .dumb_create = malidp_dumb_create,
@@ -762,22 +760,18 @@ static int malidp_bind(struct device *dev)
762 760
763 drm_mode_config_reset(drm); 761 drm_mode_config_reset(drm);
764 762
765 ret = drm_fb_cma_fbdev_init(drm, 32, 0);
766 if (ret)
767 goto fbdev_fail;
768
769 drm_kms_helper_poll_init(drm); 763 drm_kms_helper_poll_init(drm);
770 764
771 ret = drm_dev_register(drm, 0); 765 ret = drm_dev_register(drm, 0);
772 if (ret) 766 if (ret)
773 goto register_fail; 767 goto register_fail;
774 768
769 drm_fbdev_generic_setup(drm, 32);
770
775 return 0; 771 return 0;
776 772
777register_fail: 773register_fail:
778 drm_fb_cma_fbdev_fini(drm);
779 drm_kms_helper_poll_fini(drm); 774 drm_kms_helper_poll_fini(drm);
780fbdev_fail:
781 pm_runtime_get_sync(dev); 775 pm_runtime_get_sync(dev);
782vblank_fail: 776vblank_fail:
783 malidp_se_irq_fini(hwdev); 777 malidp_se_irq_fini(hwdev);
@@ -814,7 +808,6 @@ static void malidp_unbind(struct device *dev)
814 struct malidp_hw_device *hwdev = malidp->dev; 808 struct malidp_hw_device *hwdev = malidp->dev;
815 809
816 drm_dev_unregister(drm); 810 drm_dev_unregister(drm);
817 drm_fb_cma_fbdev_fini(drm);
818 drm_kms_helper_poll_fini(drm); 811 drm_kms_helper_poll_fini(drm);
819 pm_runtime_get_sync(dev); 812 pm_runtime_get_sync(dev);
820 drm_crtc_vblank_off(&malidp->crtc); 813 drm_crtc_vblank_off(&malidp->crtc);
diff --git a/drivers/gpu/drm/bochs/bochs.h b/drivers/gpu/drm/bochs/bochs.h
index b4f6bb521900..e7a69077e45a 100644
--- a/drivers/gpu/drm/bochs/bochs.h
+++ b/drivers/gpu/drm/bochs/bochs.h
@@ -58,6 +58,7 @@ struct bochs_device {
58 void __iomem *fb_map; 58 void __iomem *fb_map;
59 unsigned long fb_base; 59 unsigned long fb_base;
60 unsigned long fb_size; 60 unsigned long fb_size;
61 unsigned long qext_size;
61 62
62 /* mode */ 63 /* mode */
63 u16 xres; 64 u16 xres;
@@ -121,7 +122,8 @@ int bochs_hw_init(struct drm_device *dev);
121void bochs_hw_fini(struct drm_device *dev); 122void bochs_hw_fini(struct drm_device *dev);
122 123
123void bochs_hw_setmode(struct bochs_device *bochs, 124void bochs_hw_setmode(struct bochs_device *bochs,
124 struct drm_display_mode *mode); 125 struct drm_display_mode *mode,
126 const struct drm_format_info *format);
125void bochs_hw_setbase(struct bochs_device *bochs, 127void bochs_hw_setbase(struct bochs_device *bochs,
126 int x, int y, u64 addr); 128 int x, int y, u64 addr);
127 129
diff --git a/drivers/gpu/drm/bochs/bochs_fbdev.c b/drivers/gpu/drm/bochs/bochs_fbdev.c
index 8f4d6c052f7b..dd3c7df267da 100644
--- a/drivers/gpu/drm/bochs/bochs_fbdev.c
+++ b/drivers/gpu/drm/bochs/bochs_fbdev.c
@@ -63,9 +63,8 @@ static int bochsfb_create(struct drm_fb_helper *helper,
63 63
64 mode_cmd.width = sizes->surface_width; 64 mode_cmd.width = sizes->surface_width;
65 mode_cmd.height = sizes->surface_height; 65 mode_cmd.height = sizes->surface_height;
66 mode_cmd.pitches[0] = mode_cmd.width * ((sizes->surface_bpp + 7) / 8); 66 mode_cmd.pitches[0] = sizes->surface_width * 4;
67 mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp, 67 mode_cmd.pixel_format = DRM_FORMAT_HOST_XRGB8888;
68 sizes->surface_depth);
69 size = mode_cmd.pitches[0] * mode_cmd.height; 68 size = mode_cmd.pitches[0] * mode_cmd.height;
70 69
71 /* alloc, pin & map bo */ 70 /* alloc, pin & map bo */
@@ -137,8 +136,19 @@ static const struct drm_fb_helper_funcs bochs_fb_helper_funcs = {
137 .fb_probe = bochsfb_create, 136 .fb_probe = bochsfb_create,
138}; 137};
139 138
139static struct drm_framebuffer *
140bochs_gem_fb_create(struct drm_device *dev, struct drm_file *file,
141 const struct drm_mode_fb_cmd2 *mode_cmd)
142{
143 if (mode_cmd->pixel_format != DRM_FORMAT_XRGB8888 &&
144 mode_cmd->pixel_format != DRM_FORMAT_BGRX8888)
145 return ERR_PTR(-EINVAL);
146
147 return drm_gem_fb_create(dev, file, mode_cmd);
148}
149
140const struct drm_mode_config_funcs bochs_mode_funcs = { 150const struct drm_mode_config_funcs bochs_mode_funcs = {
141 .fb_create = drm_gem_fb_create, 151 .fb_create = bochs_gem_fb_create,
142}; 152};
143 153
144int bochs_fbdev_init(struct bochs_device *bochs) 154int bochs_fbdev_init(struct bochs_device *bochs)
diff --git a/drivers/gpu/drm/bochs/bochs_hw.c b/drivers/gpu/drm/bochs/bochs_hw.c
index 16e4f1caccca..cacff73a64ab 100644
--- a/drivers/gpu/drm/bochs/bochs_hw.c
+++ b/drivers/gpu/drm/bochs/bochs_hw.c
@@ -47,11 +47,33 @@ static void bochs_dispi_write(struct bochs_device *bochs, u16 reg, u16 val)
47 } 47 }
48} 48}
49 49
50static void bochs_hw_set_big_endian(struct bochs_device *bochs)
51{
52 if (bochs->qext_size < 8)
53 return;
54
55 writel(0xbebebebe, bochs->mmio + 0x604);
56}
57
58static void bochs_hw_set_little_endian(struct bochs_device *bochs)
59{
60 if (bochs->qext_size < 8)
61 return;
62
63 writel(0x1e1e1e1e, bochs->mmio + 0x604);
64}
65
66#ifdef __BIG_ENDIAN
67#define bochs_hw_set_native_endian(_b) bochs_hw_set_big_endian(_b)
68#else
69#define bochs_hw_set_native_endian(_b) bochs_hw_set_little_endian(_b)
70#endif
71
50int bochs_hw_init(struct drm_device *dev) 72int bochs_hw_init(struct drm_device *dev)
51{ 73{
52 struct bochs_device *bochs = dev->dev_private; 74 struct bochs_device *bochs = dev->dev_private;
53 struct pci_dev *pdev = dev->pdev; 75 struct pci_dev *pdev = dev->pdev;
54 unsigned long addr, size, mem, ioaddr, iosize, qext_size; 76 unsigned long addr, size, mem, ioaddr, iosize;
55 u16 id; 77 u16 id;
56 78
57 if (pdev->resource[2].flags & IORESOURCE_MEM) { 79 if (pdev->resource[2].flags & IORESOURCE_MEM) {
@@ -117,19 +139,14 @@ int bochs_hw_init(struct drm_device *dev)
117 ioaddr); 139 ioaddr);
118 140
119 if (bochs->mmio && pdev->revision >= 2) { 141 if (bochs->mmio && pdev->revision >= 2) {
120 qext_size = readl(bochs->mmio + 0x600); 142 bochs->qext_size = readl(bochs->mmio + 0x600);
121 if (qext_size < 4 || qext_size > iosize) 143 if (bochs->qext_size < 4 || bochs->qext_size > iosize) {
144 bochs->qext_size = 0;
122 goto noext; 145 goto noext;
123 DRM_DEBUG("Found qemu ext regs, size %ld\n", qext_size);
124 if (qext_size >= 8) {
125#ifdef __BIG_ENDIAN
126 writel(0xbebebebe, bochs->mmio + 0x604);
127#else
128 writel(0x1e1e1e1e, bochs->mmio + 0x604);
129#endif
130 DRM_DEBUG(" qext endian: 0x%x\n",
131 readl(bochs->mmio + 0x604));
132 } 146 }
147 DRM_DEBUG("Found qemu ext regs, size %ld\n",
148 bochs->qext_size);
149 bochs_hw_set_native_endian(bochs);
133 } 150 }
134 151
135noext: 152noext:
@@ -150,7 +167,8 @@ void bochs_hw_fini(struct drm_device *dev)
150} 167}
151 168
152void bochs_hw_setmode(struct bochs_device *bochs, 169void bochs_hw_setmode(struct bochs_device *bochs,
153 struct drm_display_mode *mode) 170 struct drm_display_mode *mode,
171 const struct drm_format_info *format)
154{ 172{
155 bochs->xres = mode->hdisplay; 173 bochs->xres = mode->hdisplay;
156 bochs->yres = mode->vdisplay; 174 bochs->yres = mode->vdisplay;
@@ -158,8 +176,12 @@ void bochs_hw_setmode(struct bochs_device *bochs,
158 bochs->stride = mode->hdisplay * (bochs->bpp / 8); 176 bochs->stride = mode->hdisplay * (bochs->bpp / 8);
159 bochs->yres_virtual = bochs->fb_size / bochs->stride; 177 bochs->yres_virtual = bochs->fb_size / bochs->stride;
160 178
161 DRM_DEBUG_DRIVER("%dx%d @ %d bpp, vy %d\n", 179 DRM_DEBUG_DRIVER("%dx%d @ %d bpp, format %c%c%c%c, vy %d\n",
162 bochs->xres, bochs->yres, bochs->bpp, 180 bochs->xres, bochs->yres, bochs->bpp,
181 (format->format >> 0) & 0xff,
182 (format->format >> 8) & 0xff,
183 (format->format >> 16) & 0xff,
184 (format->format >> 24) & 0xff,
163 bochs->yres_virtual); 185 bochs->yres_virtual);
164 186
165 bochs_vga_writeb(bochs, 0x3c0, 0x20); /* unblank */ 187 bochs_vga_writeb(bochs, 0x3c0, 0x20); /* unblank */
@@ -177,6 +199,20 @@ void bochs_hw_setmode(struct bochs_device *bochs,
177 199
178 bochs_dispi_write(bochs, VBE_DISPI_INDEX_ENABLE, 200 bochs_dispi_write(bochs, VBE_DISPI_INDEX_ENABLE,
179 VBE_DISPI_ENABLED | VBE_DISPI_LFB_ENABLED); 201 VBE_DISPI_ENABLED | VBE_DISPI_LFB_ENABLED);
202
203 switch (format->format) {
204 case DRM_FORMAT_XRGB8888:
205 bochs_hw_set_little_endian(bochs);
206 break;
207 case DRM_FORMAT_BGRX8888:
208 bochs_hw_set_big_endian(bochs);
209 break;
210 default:
211 /* should not happen */
212 DRM_ERROR("%s: Huh? Got framebuffer format 0x%x",
213 __func__, format->format);
214 break;
215 };
180} 216}
181 217
182void bochs_hw_setbase(struct bochs_device *bochs, 218void bochs_hw_setbase(struct bochs_device *bochs,
diff --git a/drivers/gpu/drm/bochs/bochs_kms.c b/drivers/gpu/drm/bochs/bochs_kms.c
index ea9a43d31bf1..9bc5b438aefd 100644
--- a/drivers/gpu/drm/bochs/bochs_kms.c
+++ b/drivers/gpu/drm/bochs/bochs_kms.c
@@ -77,7 +77,10 @@ static int bochs_crtc_mode_set(struct drm_crtc *crtc,
77 struct bochs_device *bochs = 77 struct bochs_device *bochs =
78 container_of(crtc, struct bochs_device, crtc); 78 container_of(crtc, struct bochs_device, crtc);
79 79
80 bochs_hw_setmode(bochs, mode); 80 if (WARN_ON(crtc->primary->fb == NULL))
81 return -EINVAL;
82
83 bochs_hw_setmode(bochs, mode, crtc->primary->fb->format);
81 bochs_crtc_mode_set_base(crtc, x, y, old_fb); 84 bochs_crtc_mode_set_base(crtc, x, y, old_fb);
82 return 0; 85 return 0;
83} 86}
@@ -126,12 +129,44 @@ static const struct drm_crtc_helper_funcs bochs_helper_funcs = {
126 .commit = bochs_crtc_commit, 129 .commit = bochs_crtc_commit,
127}; 130};
128 131
132static const uint32_t bochs_formats[] = {
133 DRM_FORMAT_XRGB8888,
134 DRM_FORMAT_BGRX8888,
135};
136
137static struct drm_plane *bochs_primary_plane(struct drm_device *dev)
138{
139 struct drm_plane *primary;
140 int ret;
141
142 primary = kzalloc(sizeof(*primary), GFP_KERNEL);
143 if (primary == NULL) {
144 DRM_DEBUG_KMS("Failed to allocate primary plane\n");
145 return NULL;
146 }
147
148 ret = drm_universal_plane_init(dev, primary, 0,
149 &drm_primary_helper_funcs,
150 bochs_formats,
151 ARRAY_SIZE(bochs_formats),
152 NULL,
153 DRM_PLANE_TYPE_PRIMARY, NULL);
154 if (ret) {
155 kfree(primary);
156 primary = NULL;
157 }
158
159 return primary;
160}
161
129static void bochs_crtc_init(struct drm_device *dev) 162static void bochs_crtc_init(struct drm_device *dev)
130{ 163{
131 struct bochs_device *bochs = dev->dev_private; 164 struct bochs_device *bochs = dev->dev_private;
132 struct drm_crtc *crtc = &bochs->crtc; 165 struct drm_crtc *crtc = &bochs->crtc;
166 struct drm_plane *primary = bochs_primary_plane(dev);
133 167
134 drm_crtc_init(dev, crtc, &bochs_crtc_funcs); 168 drm_crtc_init_with_planes(dev, crtc, primary, NULL,
169 &bochs_crtc_funcs, NULL);
135 drm_crtc_helper_add(crtc, &bochs_helper_funcs); 170 drm_crtc_helper_add(crtc, &bochs_helper_funcs);
136} 171}
137 172
@@ -250,6 +285,7 @@ int bochs_kms_init(struct bochs_device *bochs)
250 bochs->dev->mode_config.fb_base = bochs->fb_base; 285 bochs->dev->mode_config.fb_base = bochs->fb_base;
251 bochs->dev->mode_config.preferred_depth = 24; 286 bochs->dev->mode_config.preferred_depth = 24;
252 bochs->dev->mode_config.prefer_shadow = 0; 287 bochs->dev->mode_config.prefer_shadow = 0;
288 bochs->dev->mode_config.quirk_addfb_prefer_host_byte_order = true;
253 289
254 bochs->dev->mode_config.funcs = &bochs_mode_funcs; 290 bochs->dev->mode_config.funcs = &bochs_mode_funcs;
255 291
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
index 3cf1aa132778..e49b22381048 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -3569,9 +3569,7 @@ void __drm_atomic_helper_plane_reset(struct drm_plane *plane,
3569 state->plane = plane; 3569 state->plane = plane;
3570 state->rotation = DRM_MODE_ROTATE_0; 3570 state->rotation = DRM_MODE_ROTATE_0;
3571 3571
3572 /* Reset the alpha value to fully opaque if it matters */ 3572 state->alpha = DRM_BLEND_ALPHA_OPAQUE;
3573 if (plane->alpha_property)
3574 state->alpha = plane->alpha_property->values[1];
3575 state->pixel_blend_mode = DRM_MODE_BLEND_PREMULTI; 3573 state->pixel_blend_mode = DRM_MODE_BLEND_PREMULTI;
3576 3574
3577 plane->state = state; 3575 plane->state = state;
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 66493178ffcf..a504a5e05676 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -2843,7 +2843,7 @@ int drm_fb_helper_fbdev_setup(struct drm_device *dev,
2843 if (!max_conn_count) 2843 if (!max_conn_count)
2844 max_conn_count = dev->mode_config.num_connector; 2844 max_conn_count = dev->mode_config.num_connector;
2845 if (!max_conn_count) { 2845 if (!max_conn_count) {
2846 DRM_DEV_ERROR(dev->dev, "No connectors\n"); 2846 DRM_DEV_ERROR(dev->dev, "fbdev: No connectors\n");
2847 return -EINVAL; 2847 return -EINVAL;
2848 } 2848 }
2849 2849
@@ -2851,13 +2851,13 @@ int drm_fb_helper_fbdev_setup(struct drm_device *dev,
2851 2851
2852 ret = drm_fb_helper_init(dev, fb_helper, max_conn_count); 2852 ret = drm_fb_helper_init(dev, fb_helper, max_conn_count);
2853 if (ret < 0) { 2853 if (ret < 0) {
2854 DRM_DEV_ERROR(dev->dev, "Failed to initialize fbdev helper\n"); 2854 DRM_DEV_ERROR(dev->dev, "fbdev: Failed to initialize (ret=%d)\n", ret);
2855 return ret; 2855 return ret;
2856 } 2856 }
2857 2857
2858 ret = drm_fb_helper_single_add_all_connectors(fb_helper); 2858 ret = drm_fb_helper_single_add_all_connectors(fb_helper);
2859 if (ret < 0) { 2859 if (ret < 0) {
2860 DRM_DEV_ERROR(dev->dev, "Failed to add connectors\n"); 2860 DRM_DEV_ERROR(dev->dev, "fbdev: Failed to add connectors (ret=%d)\n", ret);
2861 goto err_drm_fb_helper_fini; 2861 goto err_drm_fb_helper_fini;
2862 } 2862 }
2863 2863
@@ -2866,7 +2866,7 @@ int drm_fb_helper_fbdev_setup(struct drm_device *dev,
2866 2866
2867 ret = drm_fb_helper_initial_config(fb_helper, preferred_bpp); 2867 ret = drm_fb_helper_initial_config(fb_helper, preferred_bpp);
2868 if (ret < 0) { 2868 if (ret < 0) {
2869 DRM_DEV_ERROR(dev->dev, "Failed to set fbdev configuration\n"); 2869 DRM_DEV_ERROR(dev->dev, "fbdev: Failed to set configuration (ret=%d)\n", ret);
2870 goto err_drm_fb_helper_fini; 2870 goto err_drm_fb_helper_fini;
2871 } 2871 }
2872 2872
diff --git a/drivers/gpu/drm/drm_fourcc.c b/drivers/gpu/drm/drm_fourcc.c
index be1d6aaef651..90a1c846fc25 100644
--- a/drivers/gpu/drm/drm_fourcc.c
+++ b/drivers/gpu/drm/drm_fourcc.c
@@ -96,6 +96,41 @@ uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth)
96EXPORT_SYMBOL(drm_mode_legacy_fb_format); 96EXPORT_SYMBOL(drm_mode_legacy_fb_format);
97 97
98/** 98/**
99 * drm_driver_legacy_fb_format - compute drm fourcc code from legacy description
100 * @bpp: bits per pixels
101 * @depth: bit depth per pixel
102 * @native: use host native byte order
103 *
104 * Computes a drm fourcc pixel format code for the given @bpp/@depth values.
105 * Unlike drm_mode_legacy_fb_format() this looks at the drivers mode_config,
106 * and depending on the quirk_addfb_prefer_host_byte_order flag it returns
107 * little endian byte order or host byte order framebuffer formats.
108 */
109uint32_t drm_driver_legacy_fb_format(struct drm_device *dev,
110 uint32_t bpp, uint32_t depth)
111{
112 uint32_t fmt = drm_mode_legacy_fb_format(bpp, depth);
113
114 if (dev->mode_config.quirk_addfb_prefer_host_byte_order) {
115 if (fmt == DRM_FORMAT_XRGB8888)
116 fmt = DRM_FORMAT_HOST_XRGB8888;
117 if (fmt == DRM_FORMAT_ARGB8888)
118 fmt = DRM_FORMAT_HOST_ARGB8888;
119 if (fmt == DRM_FORMAT_RGB565)
120 fmt = DRM_FORMAT_HOST_RGB565;
121 if (fmt == DRM_FORMAT_XRGB1555)
122 fmt = DRM_FORMAT_HOST_XRGB1555;
123 }
124
125 if (dev->mode_config.quirk_addfb_prefer_xbgr_30bpp &&
126 fmt == DRM_FORMAT_XRGB2101010)
127 fmt = DRM_FORMAT_XBGR2101010;
128
129 return fmt;
130}
131EXPORT_SYMBOL(drm_driver_legacy_fb_format);
132
133/**
99 * drm_get_format_name - fill a string with a drm fourcc format's name 134 * drm_get_format_name - fill a string with a drm fourcc format's name
100 * @format: format to compute name of 135 * @format: format to compute name of
101 * @buf: caller-supplied buffer 136 * @buf: caller-supplied buffer
diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c
index 1ee3d6b44280..3bf729d0aae5 100644
--- a/drivers/gpu/drm/drm_framebuffer.c
+++ b/drivers/gpu/drm/drm_framebuffer.c
@@ -116,7 +116,7 @@ int drm_mode_addfb(struct drm_device *dev, struct drm_mode_fb_cmd *or,
116 if (!drm_core_check_feature(dev, DRIVER_MODESET)) 116 if (!drm_core_check_feature(dev, DRIVER_MODESET))
117 return -EOPNOTSUPP; 117 return -EOPNOTSUPP;
118 118
119 r.pixel_format = drm_mode_legacy_fb_format(or->bpp, or->depth); 119 r.pixel_format = drm_driver_legacy_fb_format(dev, or->bpp, or->depth);
120 if (r.pixel_format == DRM_FORMAT_INVALID) { 120 if (r.pixel_format == DRM_FORMAT_INVALID) {
121 DRM_DEBUG("bad {bpp:%d, depth:%d}\n", or->bpp, or->depth); 121 DRM_DEBUG("bad {bpp:%d, depth:%d}\n", or->bpp, or->depth);
122 return -EINVAL; 122 return -EINVAL;
@@ -129,21 +129,6 @@ int drm_mode_addfb(struct drm_device *dev, struct drm_mode_fb_cmd *or,
129 r.pitches[0] = or->pitch; 129 r.pitches[0] = or->pitch;
130 r.handles[0] = or->handle; 130 r.handles[0] = or->handle;
131 131
132 if (dev->mode_config.quirk_addfb_prefer_xbgr_30bpp &&
133 r.pixel_format == DRM_FORMAT_XRGB2101010)
134 r.pixel_format = DRM_FORMAT_XBGR2101010;
135
136 if (dev->mode_config.quirk_addfb_prefer_host_byte_order) {
137 if (r.pixel_format == DRM_FORMAT_XRGB8888)
138 r.pixel_format = DRM_FORMAT_HOST_XRGB8888;
139 if (r.pixel_format == DRM_FORMAT_ARGB8888)
140 r.pixel_format = DRM_FORMAT_HOST_ARGB8888;
141 if (r.pixel_format == DRM_FORMAT_RGB565)
142 r.pixel_format = DRM_FORMAT_HOST_RGB565;
143 if (r.pixel_format == DRM_FORMAT_XRGB1555)
144 r.pixel_format = DRM_FORMAT_HOST_XRGB1555;
145 }
146
147 ret = drm_mode_addfb2(dev, &r, file_priv); 132 ret = drm_mode_addfb2(dev, &r, file_priv);
148 if (ret) 133 if (ret)
149 return ret; 134 return ret;
diff --git a/drivers/gpu/drm/drm_gem_framebuffer_helper.c b/drivers/gpu/drm/drm_gem_framebuffer_helper.c
index 7607f9cd6f77..ded7a379ac35 100644
--- a/drivers/gpu/drm/drm_gem_framebuffer_helper.c
+++ b/drivers/gpu/drm/drm_gem_framebuffer_helper.c
@@ -316,8 +316,8 @@ drm_gem_fbdev_fb_create(struct drm_device *dev,
316 if (pitch_align) 316 if (pitch_align)
317 mode_cmd.pitches[0] = roundup(mode_cmd.pitches[0], 317 mode_cmd.pitches[0] = roundup(mode_cmd.pitches[0],
318 pitch_align); 318 pitch_align);
319 mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp, 319 mode_cmd.pixel_format = drm_driver_legacy_fb_format(dev, sizes->surface_bpp,
320 sizes->surface_depth); 320 sizes->surface_depth);
321 if (obj->size < mode_cmd.pitches[0] * mode_cmd.height) 321 if (obj->size < mode_cmd.pitches[0] * mode_cmd.height)
322 return ERR_PTR(-EINVAL); 322 return ERR_PTR(-EINVAL);
323 323
diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
index 60dfbfae6a02..94bd872d56c4 100644
--- a/drivers/gpu/drm/drm_ioctl.c
+++ b/drivers/gpu/drm/drm_ioctl.c
@@ -306,6 +306,12 @@ drm_setclientcap(struct drm_device *dev, void *data, struct drm_file *file_priv)
306{ 306{
307 struct drm_set_client_cap *req = data; 307 struct drm_set_client_cap *req = data;
308 308
309 /* No render-only settable capabilities for now */
310
311 /* Below caps that only works with KMS drivers */
312 if (!drm_core_check_feature(dev, DRIVER_MODESET))
313 return -EOPNOTSUPP;
314
309 switch (req->capability) { 315 switch (req->capability) {
310 case DRM_CLIENT_CAP_STEREO_3D: 316 case DRM_CLIENT_CAP_STEREO_3D:
311 if (req->value > 1) 317 if (req->value > 1)
diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
index 497729202bfe..5bcb3ef9b256 100644
--- a/drivers/gpu/drm/drm_syncobj.c
+++ b/drivers/gpu/drm/drm_syncobj.c
@@ -66,20 +66,9 @@ static const char *drm_syncobj_stub_fence_get_name(struct dma_fence *fence)
66 return "syncobjstub"; 66 return "syncobjstub";
67} 67}
68 68
69static bool drm_syncobj_stub_fence_enable_signaling(struct dma_fence *fence)
70{
71 return !dma_fence_is_signaled(fence);
72}
73
74static void drm_syncobj_stub_fence_release(struct dma_fence *f)
75{
76 kfree(f);
77}
78static const struct dma_fence_ops drm_syncobj_stub_fence_ops = { 69static const struct dma_fence_ops drm_syncobj_stub_fence_ops = {
79 .get_driver_name = drm_syncobj_stub_fence_get_name, 70 .get_driver_name = drm_syncobj_stub_fence_get_name,
80 .get_timeline_name = drm_syncobj_stub_fence_get_name, 71 .get_timeline_name = drm_syncobj_stub_fence_get_name,
81 .enable_signaling = drm_syncobj_stub_fence_enable_signaling,
82 .release = drm_syncobj_stub_fence_release,
83}; 72};
84 73
85 74
@@ -683,7 +672,6 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs,
683{ 672{
684 struct syncobj_wait_entry *entries; 673 struct syncobj_wait_entry *entries;
685 struct dma_fence *fence; 674 struct dma_fence *fence;
686 signed long ret;
687 uint32_t signaled_count, i; 675 uint32_t signaled_count, i;
688 676
689 entries = kcalloc(count, sizeof(*entries), GFP_KERNEL); 677 entries = kcalloc(count, sizeof(*entries), GFP_KERNEL);
@@ -703,7 +691,7 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs,
703 if (flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT) { 691 if (flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT) {
704 continue; 692 continue;
705 } else { 693 } else {
706 ret = -EINVAL; 694 timeout = -EINVAL;
707 goto cleanup_entries; 695 goto cleanup_entries;
708 } 696 }
709 } 697 }
@@ -715,12 +703,6 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs,
715 } 703 }
716 } 704 }
717 705
718 /* Initialize ret to the max of timeout and 1. That way, the
719 * default return value indicates a successful wait and not a
720 * timeout.
721 */
722 ret = max_t(signed long, timeout, 1);
723
724 if (signaled_count == count || 706 if (signaled_count == count ||
725 (signaled_count > 0 && 707 (signaled_count > 0 &&
726 !(flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL))) 708 !(flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL)))
@@ -771,18 +753,17 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs,
771 goto done_waiting; 753 goto done_waiting;
772 754
773 if (timeout == 0) { 755 if (timeout == 0) {
774 /* If we are doing a 0 timeout wait and we got 756 timeout = -ETIME;
775 * here, then we just timed out.
776 */
777 ret = 0;
778 goto done_waiting; 757 goto done_waiting;
779 } 758 }
780 759
781 ret = schedule_timeout(ret); 760 if (signal_pending(current)) {
761 timeout = -ERESTARTSYS;
762 goto done_waiting;
763 }
782 764
783 if (ret > 0 && signal_pending(current)) 765 timeout = schedule_timeout(timeout);
784 ret = -ERESTARTSYS; 766 } while (1);
785 } while (ret > 0);
786 767
787done_waiting: 768done_waiting:
788 __set_current_state(TASK_RUNNING); 769 __set_current_state(TASK_RUNNING);
@@ -799,7 +780,7 @@ cleanup_entries:
799 } 780 }
800 kfree(entries); 781 kfree(entries);
801 782
802 return ret; 783 return timeout;
803} 784}
804 785
805/** 786/**
@@ -840,19 +821,16 @@ static int drm_syncobj_array_wait(struct drm_device *dev,
840 struct drm_syncobj **syncobjs) 821 struct drm_syncobj **syncobjs)
841{ 822{
842 signed long timeout = drm_timeout_abs_to_jiffies(wait->timeout_nsec); 823 signed long timeout = drm_timeout_abs_to_jiffies(wait->timeout_nsec);
843 signed long ret = 0;
844 uint32_t first = ~0; 824 uint32_t first = ~0;
845 825
846 ret = drm_syncobj_array_wait_timeout(syncobjs, 826 timeout = drm_syncobj_array_wait_timeout(syncobjs,
847 wait->count_handles, 827 wait->count_handles,
848 wait->flags, 828 wait->flags,
849 timeout, &first); 829 timeout, &first);
850 if (ret < 0) 830 if (timeout < 0)
851 return ret; 831 return timeout;
852 832
853 wait->first_signaled = first; 833 wait->first_signaled = first;
854 if (ret == 0)
855 return -ETIME;
856 return 0; 834 return 0;
857} 835}
858 836
diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
index 80232321a244..0496be5212e1 100644
--- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
+++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
@@ -353,12 +353,12 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev)
353 353
354 ret = drm_dev_register(drm, 0); 354 ret = drm_dev_register(drm, 0);
355 if (ret < 0) 355 if (ret < 0)
356 goto unref; 356 goto put;
357 357
358 return 0; 358 return 0;
359 359
360unref: 360put:
361 drm_dev_unref(drm); 361 drm_dev_put(drm);
362unregister_pix_clk: 362unregister_pix_clk:
363 clk_unregister(fsl_dev->pix_clk); 363 clk_unregister(fsl_dev->pix_clk);
364disable_clk: 364disable_clk:
@@ -371,7 +371,7 @@ static int fsl_dcu_drm_remove(struct platform_device *pdev)
371 struct fsl_dcu_drm_device *fsl_dev = platform_get_drvdata(pdev); 371 struct fsl_dcu_drm_device *fsl_dev = platform_get_drvdata(pdev);
372 372
373 drm_dev_unregister(fsl_dev->drm); 373 drm_dev_unregister(fsl_dev->drm);
374 drm_dev_unref(fsl_dev->drm); 374 drm_dev_put(fsl_dev->drm);
375 clk_disable_unprepare(fsl_dev->clk); 375 clk_disable_unprepare(fsl_dev->clk);
376 clk_unregister(fsl_dev->pix_clk); 376 clk_unregister(fsl_dev->pix_clk);
377 377
diff --git a/drivers/gpu/drm/imx/imx-drm-core.c b/drivers/gpu/drm/imx/imx-drm-core.c
index 5ea0c82f9957..a70f3131a377 100644
--- a/drivers/gpu/drm/imx/imx-drm-core.c
+++ b/drivers/gpu/drm/imx/imx-drm-core.c
@@ -86,7 +86,6 @@ static int imx_drm_atomic_check(struct drm_device *dev,
86 86
87static const struct drm_mode_config_funcs imx_drm_mode_config_funcs = { 87static const struct drm_mode_config_funcs imx_drm_mode_config_funcs = {
88 .fb_create = drm_gem_fb_create, 88 .fb_create = drm_gem_fb_create,
89 .output_poll_changed = drm_fb_helper_output_poll_changed,
90 .atomic_check = imx_drm_atomic_check, 89 .atomic_check = imx_drm_atomic_check,
91 .atomic_commit = drm_atomic_helper_commit, 90 .atomic_commit = drm_atomic_helper_commit,
92}; 91};
@@ -165,7 +164,6 @@ static const struct drm_ioctl_desc imx_drm_ioctls[] = {
165static struct drm_driver imx_drm_driver = { 164static struct drm_driver imx_drm_driver = {
166 .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME | 165 .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME |
167 DRIVER_ATOMIC, 166 DRIVER_ATOMIC,
168 .lastclose = drm_fb_helper_lastclose,
169 .gem_free_object_unlocked = drm_gem_cma_free_object, 167 .gem_free_object_unlocked = drm_gem_cma_free_object,
170 .gem_vm_ops = &drm_gem_cma_vm_ops, 168 .gem_vm_ops = &drm_gem_cma_vm_ops,
171 .dumb_create = drm_gem_cma_dumb_create, 169 .dumb_create = drm_gem_cma_dumb_create,
@@ -263,30 +261,23 @@ static int imx_drm_bind(struct device *dev)
263 * The fb helper takes copies of key hardware information, so the 261 * The fb helper takes copies of key hardware information, so the
264 * crtcs/connectors/encoders must not change after this point. 262 * crtcs/connectors/encoders must not change after this point.
265 */ 263 */
266#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION)
267 if (legacyfb_depth != 16 && legacyfb_depth != 32) { 264 if (legacyfb_depth != 16 && legacyfb_depth != 32) {
268 dev_warn(dev, "Invalid legacyfb_depth. Defaulting to 16bpp\n"); 265 dev_warn(dev, "Invalid legacyfb_depth. Defaulting to 16bpp\n");
269 legacyfb_depth = 16; 266 legacyfb_depth = 16;
270 } 267 }
271 ret = drm_fb_cma_fbdev_init(drm, legacyfb_depth, MAX_CRTC);
272 if (ret)
273 goto err_unbind;
274#endif
275 268
276 drm_kms_helper_poll_init(drm); 269 drm_kms_helper_poll_init(drm);
277 270
278 ret = drm_dev_register(drm, 0); 271 ret = drm_dev_register(drm, 0);
279 if (ret) 272 if (ret)
280 goto err_fbhelper; 273 goto err_poll_fini;
274
275 drm_fbdev_generic_setup(drm, legacyfb_depth);
281 276
282 return 0; 277 return 0;
283 278
284err_fbhelper: 279err_poll_fini:
285 drm_kms_helper_poll_fini(drm); 280 drm_kms_helper_poll_fini(drm);
286#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION)
287 drm_fb_cma_fbdev_fini(drm);
288err_unbind:
289#endif
290 component_unbind_all(drm->dev, drm); 281 component_unbind_all(drm->dev, drm);
291err_kms: 282err_kms:
292 drm_mode_config_cleanup(drm); 283 drm_mode_config_cleanup(drm);
@@ -303,8 +294,6 @@ static void imx_drm_unbind(struct device *dev)
303 294
304 drm_kms_helper_poll_fini(drm); 295 drm_kms_helper_poll_fini(drm);
305 296
306 drm_fb_cma_fbdev_fini(drm);
307
308 drm_mode_config_cleanup(drm); 297 drm_mode_config_cleanup(drm);
309 298
310 component_unbind_all(drm->dev, drm); 299 component_unbind_all(drm->dev, drm);
diff --git a/drivers/gpu/drm/mxsfb/mxsfb_crtc.c b/drivers/gpu/drm/mxsfb/mxsfb_crtc.c
index 0abe77675b76..24b1f0c1432e 100644
--- a/drivers/gpu/drm/mxsfb/mxsfb_crtc.c
+++ b/drivers/gpu/drm/mxsfb/mxsfb_crtc.c
@@ -129,7 +129,6 @@ static void mxsfb_enable_controller(struct mxsfb_drm_private *mxsfb)
129 if (mxsfb->clk_disp_axi) 129 if (mxsfb->clk_disp_axi)
130 clk_prepare_enable(mxsfb->clk_disp_axi); 130 clk_prepare_enable(mxsfb->clk_disp_axi);
131 clk_prepare_enable(mxsfb->clk); 131 clk_prepare_enable(mxsfb->clk);
132 mxsfb_enable_axi_clk(mxsfb);
133 132
134 /* If it was disabled, re-enable the mode again */ 133 /* If it was disabled, re-enable the mode again */
135 writel(CTRL_DOTCLK_MODE, mxsfb->base + LCDC_CTRL + REG_SET); 134 writel(CTRL_DOTCLK_MODE, mxsfb->base + LCDC_CTRL + REG_SET);
@@ -159,8 +158,6 @@ static void mxsfb_disable_controller(struct mxsfb_drm_private *mxsfb)
159 reg &= ~VDCTRL4_SYNC_SIGNALS_ON; 158 reg &= ~VDCTRL4_SYNC_SIGNALS_ON;
160 writel(reg, mxsfb->base + LCDC_VDCTRL4); 159 writel(reg, mxsfb->base + LCDC_VDCTRL4);
161 160
162 mxsfb_disable_axi_clk(mxsfb);
163
164 clk_disable_unprepare(mxsfb->clk); 161 clk_disable_unprepare(mxsfb->clk);
165 if (mxsfb->clk_disp_axi) 162 if (mxsfb->clk_disp_axi)
166 clk_disable_unprepare(mxsfb->clk_disp_axi); 163 clk_disable_unprepare(mxsfb->clk_disp_axi);
@@ -196,6 +193,21 @@ static int mxsfb_reset_block(void __iomem *reset_addr)
196 return clear_poll_bit(reset_addr, MODULE_CLKGATE); 193 return clear_poll_bit(reset_addr, MODULE_CLKGATE);
197} 194}
198 195
196static dma_addr_t mxsfb_get_fb_paddr(struct mxsfb_drm_private *mxsfb)
197{
198 struct drm_framebuffer *fb = mxsfb->pipe.plane.state->fb;
199 struct drm_gem_cma_object *gem;
200
201 if (!fb)
202 return 0;
203
204 gem = drm_fb_cma_get_gem_obj(fb, 0);
205 if (!gem)
206 return 0;
207
208 return gem->paddr;
209}
210
199static void mxsfb_crtc_mode_set_nofb(struct mxsfb_drm_private *mxsfb) 211static void mxsfb_crtc_mode_set_nofb(struct mxsfb_drm_private *mxsfb)
200{ 212{
201 struct drm_display_mode *m = &mxsfb->pipe.crtc.state->adjusted_mode; 213 struct drm_display_mode *m = &mxsfb->pipe.crtc.state->adjusted_mode;
@@ -208,7 +220,6 @@ static void mxsfb_crtc_mode_set_nofb(struct mxsfb_drm_private *mxsfb)
208 * running. This may lead to shifted pictures (FIFO issue?), so 220 * running. This may lead to shifted pictures (FIFO issue?), so
209 * first stop the controller and drain its FIFOs. 221 * first stop the controller and drain its FIFOs.
210 */ 222 */
211 mxsfb_enable_axi_clk(mxsfb);
212 223
213 /* Mandatory eLCDIF reset as per the Reference Manual */ 224 /* Mandatory eLCDIF reset as per the Reference Manual */
214 err = mxsfb_reset_block(mxsfb->base); 225 err = mxsfb_reset_block(mxsfb->base);
@@ -269,19 +280,29 @@ static void mxsfb_crtc_mode_set_nofb(struct mxsfb_drm_private *mxsfb)
269 280
270 writel(SET_DOTCLK_H_VALID_DATA_CNT(m->hdisplay), 281 writel(SET_DOTCLK_H_VALID_DATA_CNT(m->hdisplay),
271 mxsfb->base + LCDC_VDCTRL4); 282 mxsfb->base + LCDC_VDCTRL4);
272
273 mxsfb_disable_axi_clk(mxsfb);
274} 283}
275 284
276void mxsfb_crtc_enable(struct mxsfb_drm_private *mxsfb) 285void mxsfb_crtc_enable(struct mxsfb_drm_private *mxsfb)
277{ 286{
287 dma_addr_t paddr;
288
289 mxsfb_enable_axi_clk(mxsfb);
278 mxsfb_crtc_mode_set_nofb(mxsfb); 290 mxsfb_crtc_mode_set_nofb(mxsfb);
291
292 /* Write cur_buf as well to avoid an initial corrupt frame */
293 paddr = mxsfb_get_fb_paddr(mxsfb);
294 if (paddr) {
295 writel(paddr, mxsfb->base + mxsfb->devdata->cur_buf);
296 writel(paddr, mxsfb->base + mxsfb->devdata->next_buf);
297 }
298
279 mxsfb_enable_controller(mxsfb); 299 mxsfb_enable_controller(mxsfb);
280} 300}
281 301
282void mxsfb_crtc_disable(struct mxsfb_drm_private *mxsfb) 302void mxsfb_crtc_disable(struct mxsfb_drm_private *mxsfb)
283{ 303{
284 mxsfb_disable_controller(mxsfb); 304 mxsfb_disable_controller(mxsfb);
305 mxsfb_disable_axi_clk(mxsfb);
285} 306}
286 307
287void mxsfb_plane_atomic_update(struct mxsfb_drm_private *mxsfb, 308void mxsfb_plane_atomic_update(struct mxsfb_drm_private *mxsfb,
@@ -289,12 +310,8 @@ void mxsfb_plane_atomic_update(struct mxsfb_drm_private *mxsfb,
289{ 310{
290 struct drm_simple_display_pipe *pipe = &mxsfb->pipe; 311 struct drm_simple_display_pipe *pipe = &mxsfb->pipe;
291 struct drm_crtc *crtc = &pipe->crtc; 312 struct drm_crtc *crtc = &pipe->crtc;
292 struct drm_framebuffer *fb = pipe->plane.state->fb;
293 struct drm_pending_vblank_event *event; 313 struct drm_pending_vblank_event *event;
294 struct drm_gem_cma_object *gem; 314 dma_addr_t paddr;
295
296 if (!crtc)
297 return;
298 315
299 spin_lock_irq(&crtc->dev->event_lock); 316 spin_lock_irq(&crtc->dev->event_lock);
300 event = crtc->state->event; 317 event = crtc->state->event;
@@ -309,12 +326,10 @@ void mxsfb_plane_atomic_update(struct mxsfb_drm_private *mxsfb,
309 } 326 }
310 spin_unlock_irq(&crtc->dev->event_lock); 327 spin_unlock_irq(&crtc->dev->event_lock);
311 328
312 if (!fb) 329 paddr = mxsfb_get_fb_paddr(mxsfb);
313 return; 330 if (paddr) {
314 331 mxsfb_enable_axi_clk(mxsfb);
315 gem = drm_fb_cma_get_gem_obj(fb, 0); 332 writel(paddr, mxsfb->base + mxsfb->devdata->next_buf);
316 333 mxsfb_disable_axi_clk(mxsfb);
317 mxsfb_enable_axi_clk(mxsfb); 334 }
318 writel(gem->paddr, mxsfb->base + mxsfb->devdata->next_buf);
319 mxsfb_disable_axi_clk(mxsfb);
320} 335}
diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.c b/drivers/gpu/drm/mxsfb/mxsfb_drv.c
index ffe5137ccaf8..2393e6d16ffd 100644
--- a/drivers/gpu/drm/mxsfb/mxsfb_drv.c
+++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.c
@@ -98,12 +98,18 @@ static const struct drm_mode_config_funcs mxsfb_mode_config_funcs = {
98 .atomic_commit = drm_atomic_helper_commit, 98 .atomic_commit = drm_atomic_helper_commit,
99}; 99};
100 100
101static const struct drm_mode_config_helper_funcs mxsfb_mode_config_helpers = {
102 .atomic_commit_tail = drm_atomic_helper_commit_tail_rpm,
103};
104
101static void mxsfb_pipe_enable(struct drm_simple_display_pipe *pipe, 105static void mxsfb_pipe_enable(struct drm_simple_display_pipe *pipe,
102 struct drm_crtc_state *crtc_state, 106 struct drm_crtc_state *crtc_state,
103 struct drm_plane_state *plane_state) 107 struct drm_plane_state *plane_state)
104{ 108{
105 struct mxsfb_drm_private *mxsfb = drm_pipe_to_mxsfb_drm_private(pipe); 109 struct mxsfb_drm_private *mxsfb = drm_pipe_to_mxsfb_drm_private(pipe);
110 struct drm_device *drm = pipe->plane.dev;
106 111
112 pm_runtime_get_sync(drm->dev);
107 drm_panel_prepare(mxsfb->panel); 113 drm_panel_prepare(mxsfb->panel);
108 mxsfb_crtc_enable(mxsfb); 114 mxsfb_crtc_enable(mxsfb);
109 drm_panel_enable(mxsfb->panel); 115 drm_panel_enable(mxsfb->panel);
@@ -112,10 +118,22 @@ static void mxsfb_pipe_enable(struct drm_simple_display_pipe *pipe,
112static void mxsfb_pipe_disable(struct drm_simple_display_pipe *pipe) 118static void mxsfb_pipe_disable(struct drm_simple_display_pipe *pipe)
113{ 119{
114 struct mxsfb_drm_private *mxsfb = drm_pipe_to_mxsfb_drm_private(pipe); 120 struct mxsfb_drm_private *mxsfb = drm_pipe_to_mxsfb_drm_private(pipe);
121 struct drm_device *drm = pipe->plane.dev;
122 struct drm_crtc *crtc = &pipe->crtc;
123 struct drm_pending_vblank_event *event;
115 124
116 drm_panel_disable(mxsfb->panel); 125 drm_panel_disable(mxsfb->panel);
117 mxsfb_crtc_disable(mxsfb); 126 mxsfb_crtc_disable(mxsfb);
118 drm_panel_unprepare(mxsfb->panel); 127 drm_panel_unprepare(mxsfb->panel);
128 pm_runtime_put_sync(drm->dev);
129
130 spin_lock_irq(&drm->event_lock);
131 event = crtc->state->event;
132 if (event) {
133 crtc->state->event = NULL;
134 drm_crtc_send_vblank_event(crtc, event);
135 }
136 spin_unlock_irq(&drm->event_lock);
119} 137}
120 138
121static void mxsfb_pipe_update(struct drm_simple_display_pipe *pipe, 139static void mxsfb_pipe_update(struct drm_simple_display_pipe *pipe,
@@ -230,6 +248,7 @@ static int mxsfb_load(struct drm_device *drm, unsigned long flags)
230 drm->mode_config.max_width = MXSFB_MAX_XRES; 248 drm->mode_config.max_width = MXSFB_MAX_XRES;
231 drm->mode_config.max_height = MXSFB_MAX_YRES; 249 drm->mode_config.max_height = MXSFB_MAX_YRES;
232 drm->mode_config.funcs = &mxsfb_mode_config_funcs; 250 drm->mode_config.funcs = &mxsfb_mode_config_funcs;
251 drm->mode_config.helper_private = &mxsfb_mode_config_helpers;
233 252
234 drm_mode_config_reset(drm); 253 drm_mode_config_reset(drm);
235 254
@@ -414,6 +433,26 @@ static int mxsfb_remove(struct platform_device *pdev)
414 return 0; 433 return 0;
415} 434}
416 435
436#ifdef CONFIG_PM_SLEEP
437static int mxsfb_suspend(struct device *dev)
438{
439 struct drm_device *drm = dev_get_drvdata(dev);
440
441 return drm_mode_config_helper_suspend(drm);
442}
443
444static int mxsfb_resume(struct device *dev)
445{
446 struct drm_device *drm = dev_get_drvdata(dev);
447
448 return drm_mode_config_helper_resume(drm);
449}
450#endif
451
452static const struct dev_pm_ops mxsfb_pm_ops = {
453 SET_SYSTEM_SLEEP_PM_OPS(mxsfb_suspend, mxsfb_resume)
454};
455
417static struct platform_driver mxsfb_platform_driver = { 456static struct platform_driver mxsfb_platform_driver = {
418 .probe = mxsfb_probe, 457 .probe = mxsfb_probe,
419 .remove = mxsfb_remove, 458 .remove = mxsfb_remove,
@@ -421,6 +460,7 @@ static struct platform_driver mxsfb_platform_driver = {
421 .driver = { 460 .driver = {
422 .name = "mxsfb", 461 .name = "mxsfb",
423 .of_match_table = mxsfb_dt_ids, 462 .of_match_table = mxsfb_dt_ids,
463 .pm = &mxsfb_pm_ops,
424 }, 464 },
425}; 465};
426 466
diff --git a/drivers/gpu/drm/pl111/pl111_drv.c b/drivers/gpu/drm/pl111/pl111_drv.c
index 47fe30223444..33e0483d62ae 100644
--- a/drivers/gpu/drm/pl111/pl111_drv.c
+++ b/drivers/gpu/drm/pl111/pl111_drv.c
@@ -194,8 +194,6 @@ static int pl111_modeset_init(struct drm_device *dev)
194 194
195 drm_mode_config_reset(dev); 195 drm_mode_config_reset(dev);
196 196
197 drm_fb_cma_fbdev_init(dev, priv->variant->fb_bpp, 0);
198
199 drm_kms_helper_poll_init(dev); 197 drm_kms_helper_poll_init(dev);
200 198
201 goto finish; 199 goto finish;
@@ -232,7 +230,6 @@ DEFINE_DRM_GEM_CMA_FOPS(drm_fops);
232static struct drm_driver pl111_drm_driver = { 230static struct drm_driver pl111_drm_driver = {
233 .driver_features = 231 .driver_features =
234 DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME | DRIVER_ATOMIC, 232 DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME | DRIVER_ATOMIC,
235 .lastclose = drm_fb_helper_lastclose,
236 .ioctls = NULL, 233 .ioctls = NULL,
237 .fops = &drm_fops, 234 .fops = &drm_fops,
238 .name = "pl111", 235 .name = "pl111",
@@ -332,6 +329,8 @@ static int pl111_amba_probe(struct amba_device *amba_dev,
332 if (ret < 0) 329 if (ret < 0)
333 goto dev_put; 330 goto dev_put;
334 331
332 drm_fbdev_generic_setup(drm, priv->variant->fb_bpp);
333
335 return 0; 334 return 0;
336 335
337dev_put: 336dev_put:
@@ -348,7 +347,6 @@ static int pl111_amba_remove(struct amba_device *amba_dev)
348 struct pl111_drm_dev_private *priv = drm->dev_private; 347 struct pl111_drm_dev_private *priv = drm->dev_private;
349 348
350 drm_dev_unregister(drm); 349 drm_dev_unregister(drm);
351 drm_fb_cma_fbdev_fini(drm);
352 if (priv->panel) 350 if (priv->panel)
353 drm_panel_bridge_remove(priv->bridge); 351 drm_panel_bridge_remove(priv->bridge);
354 drm_mode_config_cleanup(drm); 352 drm_mode_config_cleanup(drm);
diff --git a/drivers/gpu/drm/sti/sti_drv.c b/drivers/gpu/drm/sti/sti_drv.c
index 832fc43960ee..6dced8abcf16 100644
--- a/drivers/gpu/drm/sti/sti_drv.c
+++ b/drivers/gpu/drm/sti/sti_drv.c
@@ -121,7 +121,6 @@ err:
121 121
122static const struct drm_mode_config_funcs sti_mode_config_funcs = { 122static const struct drm_mode_config_funcs sti_mode_config_funcs = {
123 .fb_create = drm_gem_fb_create, 123 .fb_create = drm_gem_fb_create,
124 .output_poll_changed = drm_fb_helper_output_poll_changed,
125 .atomic_check = drm_atomic_helper_check, 124 .atomic_check = drm_atomic_helper_check,
126 .atomic_commit = drm_atomic_helper_commit, 125 .atomic_commit = drm_atomic_helper_commit,
127}; 126};
@@ -206,7 +205,6 @@ static void sti_cleanup(struct drm_device *ddev)
206{ 205{
207 struct sti_private *private = ddev->dev_private; 206 struct sti_private *private = ddev->dev_private;
208 207
209 drm_fb_cma_fbdev_fini(ddev);
210 drm_kms_helper_poll_fini(ddev); 208 drm_kms_helper_poll_fini(ddev);
211 component_unbind_all(ddev->dev, ddev); 209 component_unbind_all(ddev->dev, ddev);
212 kfree(private); 210 kfree(private);
@@ -236,11 +234,7 @@ static int sti_bind(struct device *dev)
236 234
237 drm_mode_config_reset(ddev); 235 drm_mode_config_reset(ddev);
238 236
239 if (ddev->mode_config.num_connector) { 237 drm_fbdev_generic_setup(ddev, 32);
240 ret = drm_fb_cma_fbdev_init(ddev, 32, 0);
241 if (ret)
242 DRM_DEBUG_DRIVER("Warning: fails to create fbdev\n");
243 }
244 238
245 return 0; 239 return 0;
246 240
diff --git a/drivers/gpu/drm/sun4i/sun4i_drv.c b/drivers/gpu/drm/sun4i/sun4i_drv.c
index 9027ddde4262..1e41c3f5fd6d 100644
--- a/drivers/gpu/drm/sun4i/sun4i_drv.c
+++ b/drivers/gpu/drm/sun4i/sun4i_drv.c
@@ -402,6 +402,7 @@ static const struct of_device_id sun4i_drv_of_table[] = {
402 { .compatible = "allwinner,sun8i-a33-display-engine" }, 402 { .compatible = "allwinner,sun8i-a33-display-engine" },
403 { .compatible = "allwinner,sun8i-a83t-display-engine" }, 403 { .compatible = "allwinner,sun8i-a83t-display-engine" },
404 { .compatible = "allwinner,sun8i-h3-display-engine" }, 404 { .compatible = "allwinner,sun8i-h3-display-engine" },
405 { .compatible = "allwinner,sun8i-r40-display-engine" },
405 { .compatible = "allwinner,sun8i-v3s-display-engine" }, 406 { .compatible = "allwinner,sun8i-v3s-display-engine" },
406 { .compatible = "allwinner,sun9i-a80-display-engine" }, 407 { .compatible = "allwinner,sun9i-a80-display-engine" },
407 { .compatible = "allwinner,sun50i-a64-display-engine" }, 408 { .compatible = "allwinner,sun50i-a64-display-engine" },
diff --git a/drivers/gpu/drm/sun4i/sun8i_mixer.c b/drivers/gpu/drm/sun4i/sun8i_mixer.c
index 091f6cf40353..8b3d02b146b7 100644
--- a/drivers/gpu/drm/sun4i/sun8i_mixer.c
+++ b/drivers/gpu/drm/sun4i/sun8i_mixer.c
@@ -545,6 +545,22 @@ static const struct sun8i_mixer_cfg sun8i_h3_mixer0_cfg = {
545 .vi_num = 1, 545 .vi_num = 1,
546}; 546};
547 547
548static const struct sun8i_mixer_cfg sun8i_r40_mixer0_cfg = {
549 .ccsc = 0,
550 .mod_rate = 297000000,
551 .scaler_mask = 0xf,
552 .ui_num = 3,
553 .vi_num = 1,
554};
555
556static const struct sun8i_mixer_cfg sun8i_r40_mixer1_cfg = {
557 .ccsc = 1,
558 .mod_rate = 297000000,
559 .scaler_mask = 0x3,
560 .ui_num = 1,
561 .vi_num = 1,
562};
563
548static const struct sun8i_mixer_cfg sun8i_v3s_mixer_cfg = { 564static const struct sun8i_mixer_cfg sun8i_v3s_mixer_cfg = {
549 .vi_num = 2, 565 .vi_num = 2,
550 .ui_num = 1, 566 .ui_num = 1,
@@ -583,6 +599,14 @@ static const struct of_device_id sun8i_mixer_of_table[] = {
583 .data = &sun8i_h3_mixer0_cfg, 599 .data = &sun8i_h3_mixer0_cfg,
584 }, 600 },
585 { 601 {
602 .compatible = "allwinner,sun8i-r40-de2-mixer-0",
603 .data = &sun8i_r40_mixer0_cfg,
604 },
605 {
606 .compatible = "allwinner,sun8i-r40-de2-mixer-1",
607 .data = &sun8i_r40_mixer1_cfg,
608 },
609 {
586 .compatible = "allwinner,sun8i-v3s-de2-mixer", 610 .compatible = "allwinner,sun8i-v3s-de2-mixer",
587 .data = &sun8i_v3s_mixer_cfg, 611 .data = &sun8i_v3s_mixer_cfg,
588 }, 612 },
diff --git a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
index 9831a9fe2cf4..3040a79f298f 100644
--- a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
+++ b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
@@ -252,6 +252,7 @@ static int sun8i_tcon_top_remove(struct platform_device *pdev)
252 252
253/* sun4i_drv uses this list to check if a device node is a TCON TOP */ 253/* sun4i_drv uses this list to check if a device node is a TCON TOP */
254const struct of_device_id sun8i_tcon_top_of_table[] = { 254const struct of_device_id sun8i_tcon_top_of_table[] = {
255 { .compatible = "allwinner,sun8i-r40-tcon-top" },
255 { /* sentinel */ } 256 { /* sentinel */ }
256}; 257};
257MODULE_DEVICE_TABLE(of, sun8i_tcon_top_of_table); 258MODULE_DEVICE_TABLE(of, sun8i_tcon_top_of_table);
diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
index b424bc911b95..8cdb610561ba 100644
--- a/drivers/gpu/drm/tegra/drm.c
+++ b/drivers/gpu/drm/tegra/drm.c
@@ -1189,16 +1189,16 @@ static int host1x_drm_probe(struct host1x_device *dev)
1189 1189
1190 err = drm_fb_helper_remove_conflicting_framebuffers(NULL, "tegradrmfb", false); 1190 err = drm_fb_helper_remove_conflicting_framebuffers(NULL, "tegradrmfb", false);
1191 if (err < 0) 1191 if (err < 0)
1192 goto unref; 1192 goto put;
1193 1193
1194 err = drm_dev_register(drm, 0); 1194 err = drm_dev_register(drm, 0);
1195 if (err < 0) 1195 if (err < 0)
1196 goto unref; 1196 goto put;
1197 1197
1198 return 0; 1198 return 0;
1199 1199
1200unref: 1200put:
1201 drm_dev_unref(drm); 1201 drm_dev_put(drm);
1202 return err; 1202 return err;
1203} 1203}
1204 1204
@@ -1207,7 +1207,7 @@ static int host1x_drm_remove(struct host1x_device *dev)
1207 struct drm_device *drm = dev_get_drvdata(&dev->dev); 1207 struct drm_device *drm = dev_get_drvdata(&dev->dev);
1208 1208
1209 drm_dev_unregister(drm); 1209 drm_dev_unregister(drm);
1210 drm_dev_unref(drm); 1210 drm_dev_put(drm);
1211 1211
1212 return 0; 1212 return 0;
1213} 1213}
diff --git a/drivers/gpu/drm/tve200/tve200_drv.c b/drivers/gpu/drm/tve200/tve200_drv.c
index ac344ddb23bc..72efcecb44f7 100644
--- a/drivers/gpu/drm/tve200/tve200_drv.c
+++ b/drivers/gpu/drm/tve200/tve200_drv.c
@@ -126,12 +126,6 @@ static int tve200_modeset_init(struct drm_device *dev)
126 } 126 }
127 127
128 drm_mode_config_reset(dev); 128 drm_mode_config_reset(dev);
129
130 /*
131 * Passing in 16 here will make the RGB656 mode the default
132 * Passing in 32 will use XRGB8888 mode
133 */
134 drm_fb_cma_fbdev_init(dev, 16, 0);
135 drm_kms_helper_poll_init(dev); 129 drm_kms_helper_poll_init(dev);
136 130
137 goto finish; 131 goto finish;
@@ -149,7 +143,6 @@ DEFINE_DRM_GEM_CMA_FOPS(drm_fops);
149static struct drm_driver tve200_drm_driver = { 143static struct drm_driver tve200_drm_driver = {
150 .driver_features = 144 .driver_features =
151 DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME | DRIVER_ATOMIC, 145 DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME | DRIVER_ATOMIC,
152 .lastclose = drm_fb_helper_lastclose,
153 .ioctls = NULL, 146 .ioctls = NULL,
154 .fops = &drm_fops, 147 .fops = &drm_fops,
155 .name = "tve200", 148 .name = "tve200",
@@ -245,6 +238,12 @@ static int tve200_probe(struct platform_device *pdev)
245 if (ret < 0) 238 if (ret < 0)
246 goto clk_disable; 239 goto clk_disable;
247 240
241 /*
242 * Passing in 16 here will make the RGB565 mode the default
243 * Passing in 32 will use XRGB8888 mode
244 */
245 drm_fbdev_generic_setup(drm, 16);
246
248 return 0; 247 return 0;
249 248
250clk_disable: 249clk_disable:
@@ -260,7 +259,6 @@ static int tve200_remove(struct platform_device *pdev)
260 struct tve200_drm_dev_private *priv = drm->dev_private; 259 struct tve200_drm_dev_private *priv = drm->dev_private;
261 260
262 drm_dev_unregister(drm); 261 drm_dev_unregister(drm);
263 drm_fb_cma_fbdev_fini(drm);
264 if (priv->panel) 262 if (priv->panel)
265 drm_panel_bridge_remove(priv->bridge); 263 drm_panel_bridge_remove(priv->bridge);
266 drm_mode_config_cleanup(drm); 264 drm_mode_config_cleanup(drm);
diff --git a/drivers/gpu/drm/udl/udl_drv.c b/drivers/gpu/drm/udl/udl_drv.c
index 9ef515df724b..a63e3011e971 100644
--- a/drivers/gpu/drm/udl/udl_drv.c
+++ b/drivers/gpu/drm/udl/udl_drv.c
@@ -94,7 +94,7 @@ static int udl_usb_probe(struct usb_interface *interface,
94 return 0; 94 return 0;
95 95
96err_free: 96err_free:
97 drm_dev_unref(dev); 97 drm_dev_put(dev);
98 return r; 98 return r;
99} 99}
100 100
diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c
index e2a15c63a81f..1f1780ccdbdf 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.c
+++ b/drivers/gpu/drm/vc4/vc4_drv.c
@@ -178,7 +178,6 @@ static struct drm_driver vc4_drm_driver = {
178 DRIVER_RENDER | 178 DRIVER_RENDER |
179 DRIVER_PRIME | 179 DRIVER_PRIME |
180 DRIVER_SYNCOBJ), 180 DRIVER_SYNCOBJ),
181 .lastclose = drm_fb_helper_lastclose,
182 .open = vc4_open, 181 .open = vc4_open,
183 .postclose = vc4_close, 182 .postclose = vc4_close,
184 .irq_handler = vc4_irq, 183 .irq_handler = vc4_irq,
@@ -288,6 +287,8 @@ static int vc4_drm_bind(struct device *dev)
288 287
289 vc4_kms_load(drm); 288 vc4_kms_load(drm);
290 289
290 drm_fbdev_generic_setup(drm, 32);
291
291 return 0; 292 return 0;
292 293
293unbind_all: 294unbind_all:
@@ -307,8 +308,6 @@ static void vc4_drm_unbind(struct device *dev)
307 308
308 drm_dev_unregister(drm); 309 drm_dev_unregister(drm);
309 310
310 drm_fb_cma_fbdev_fini(drm);
311
312 drm_mode_config_cleanup(drm); 311 drm_mode_config_cleanup(drm);
313 312
314 drm_atomic_private_obj_fini(&vc4->ctm_manager); 313 drm_atomic_private_obj_fini(&vc4->ctm_manager);
diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
index ca5aa7fba769..127468785f74 100644
--- a/drivers/gpu/drm/vc4/vc4_kms.c
+++ b/drivers/gpu/drm/vc4/vc4_kms.c
@@ -19,8 +19,6 @@
19#include <drm/drm_atomic_helper.h> 19#include <drm/drm_atomic_helper.h>
20#include <drm/drm_crtc_helper.h> 20#include <drm/drm_crtc_helper.h>
21#include <drm/drm_plane_helper.h> 21#include <drm/drm_plane_helper.h>
22#include <drm/drm_fb_helper.h>
23#include <drm/drm_fb_cma_helper.h>
24#include <drm/drm_gem_framebuffer_helper.h> 22#include <drm/drm_gem_framebuffer_helper.h>
25#include "vc4_drv.h" 23#include "vc4_drv.h"
26#include "vc4_regs.h" 24#include "vc4_regs.h"
@@ -394,7 +392,6 @@ vc4_atomic_check(struct drm_device *dev, struct drm_atomic_state *state)
394} 392}
395 393
396static const struct drm_mode_config_funcs vc4_mode_funcs = { 394static const struct drm_mode_config_funcs vc4_mode_funcs = {
397 .output_poll_changed = drm_fb_helper_output_poll_changed,
398 .atomic_check = vc4_atomic_check, 395 .atomic_check = vc4_atomic_check,
399 .atomic_commit = vc4_atomic_commit, 396 .atomic_commit = vc4_atomic_commit,
400 .fb_create = vc4_fb_create, 397 .fb_create = vc4_fb_create,
@@ -434,9 +431,6 @@ int vc4_kms_load(struct drm_device *dev)
434 431
435 drm_mode_config_reset(dev); 432 drm_mode_config_reset(dev);
436 433
437 if (dev->mode_config.num_connector)
438 drm_fb_cma_fbdev_init(dev, 32, 0);
439
440 drm_kms_helper_poll_init(dev); 434 drm_kms_helper_poll_init(dev);
441 435
442 return 0; 436 return 0;
diff --git a/drivers/gpu/drm/virtio/virtgpu_display.c b/drivers/gpu/drm/virtio/virtgpu_display.c
index 0379d6897659..8f8fed471e34 100644
--- a/drivers/gpu/drm/virtio/virtgpu_display.c
+++ b/drivers/gpu/drm/virtio/virtgpu_display.c
@@ -307,6 +307,10 @@ virtio_gpu_user_framebuffer_create(struct drm_device *dev,
307 struct virtio_gpu_framebuffer *virtio_gpu_fb; 307 struct virtio_gpu_framebuffer *virtio_gpu_fb;
308 int ret; 308 int ret;
309 309
310 if (mode_cmd->pixel_format != DRM_FORMAT_HOST_XRGB8888 &&
311 mode_cmd->pixel_format != DRM_FORMAT_HOST_ARGB8888)
312 return ERR_PTR(-ENOENT);
313
310 /* lookup object associated with res handle */ 314 /* lookup object associated with res handle */
311 obj = drm_gem_object_lookup(file_priv, mode_cmd->handles[0]); 315 obj = drm_gem_object_lookup(file_priv, mode_cmd->handles[0]);
312 if (!obj) 316 if (!obj)
@@ -355,6 +359,7 @@ int virtio_gpu_modeset_init(struct virtio_gpu_device *vgdev)
355 int i; 359 int i;
356 360
357 drm_mode_config_init(vgdev->ddev); 361 drm_mode_config_init(vgdev->ddev);
362 vgdev->ddev->mode_config.quirk_addfb_prefer_host_byte_order = true;
358 vgdev->ddev->mode_config.funcs = &virtio_gpu_mode_funcs; 363 vgdev->ddev->mode_config.funcs = &virtio_gpu_mode_funcs;
359 vgdev->ddev->mode_config.helper_private = &virtio_mode_config_helpers; 364 vgdev->ddev->mode_config.helper_private = &virtio_mode_config_helpers;
360 365
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index a2d79e18bda7..d29f0c7c768c 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -270,7 +270,8 @@ void virtio_gpu_cmd_create_resource(struct virtio_gpu_device *vgdev,
270void virtio_gpu_cmd_unref_resource(struct virtio_gpu_device *vgdev, 270void virtio_gpu_cmd_unref_resource(struct virtio_gpu_device *vgdev,
271 uint32_t resource_id); 271 uint32_t resource_id);
272void virtio_gpu_cmd_transfer_to_host_2d(struct virtio_gpu_device *vgdev, 272void virtio_gpu_cmd_transfer_to_host_2d(struct virtio_gpu_device *vgdev,
273 uint32_t resource_id, uint64_t offset, 273 struct virtio_gpu_object *bo,
274 uint64_t offset,
274 __le32 width, __le32 height, 275 __le32 width, __le32 height,
275 __le32 x, __le32 y, 276 __le32 x, __le32 y,
276 struct virtio_gpu_fence **fence); 277 struct virtio_gpu_fence **fence);
@@ -316,7 +317,8 @@ void virtio_gpu_cmd_transfer_from_host_3d(struct virtio_gpu_device *vgdev,
316 struct virtio_gpu_box *box, 317 struct virtio_gpu_box *box,
317 struct virtio_gpu_fence **fence); 318 struct virtio_gpu_fence **fence);
318void virtio_gpu_cmd_transfer_to_host_3d(struct virtio_gpu_device *vgdev, 319void virtio_gpu_cmd_transfer_to_host_3d(struct virtio_gpu_device *vgdev,
319 uint32_t resource_id, uint32_t ctx_id, 320 struct virtio_gpu_object *bo,
321 uint32_t ctx_id,
320 uint64_t offset, uint32_t level, 322 uint64_t offset, uint32_t level,
321 struct virtio_gpu_box *box, 323 struct virtio_gpu_box *box,
322 struct virtio_gpu_fence **fence); 324 struct virtio_gpu_fence **fence);
@@ -361,7 +363,8 @@ void virtio_gpu_fence_event_process(struct virtio_gpu_device *vdev,
361int virtio_gpu_object_create(struct virtio_gpu_device *vgdev, 363int virtio_gpu_object_create(struct virtio_gpu_device *vgdev,
362 unsigned long size, bool kernel, bool pinned, 364 unsigned long size, bool kernel, bool pinned,
363 struct virtio_gpu_object **bo_ptr); 365 struct virtio_gpu_object **bo_ptr);
364int virtio_gpu_object_kmap(struct virtio_gpu_object *bo, void **ptr); 366void virtio_gpu_object_kunmap(struct virtio_gpu_object *bo);
367int virtio_gpu_object_kmap(struct virtio_gpu_object *bo);
365int virtio_gpu_object_get_sg_table(struct virtio_gpu_device *qdev, 368int virtio_gpu_object_get_sg_table(struct virtio_gpu_device *qdev,
366 struct virtio_gpu_object *bo); 369 struct virtio_gpu_object *bo);
367void virtio_gpu_object_free_sg_table(struct virtio_gpu_object *bo); 370void virtio_gpu_object_free_sg_table(struct virtio_gpu_object *bo);
diff --git a/drivers/gpu/drm/virtio/virtgpu_fb.c b/drivers/gpu/drm/virtio/virtgpu_fb.c
index b9678c4082ac..cea749f4ec39 100644
--- a/drivers/gpu/drm/virtio/virtgpu_fb.c
+++ b/drivers/gpu/drm/virtio/virtgpu_fb.c
@@ -95,7 +95,7 @@ static int virtio_gpu_dirty_update(struct virtio_gpu_framebuffer *fb,
95 95
96 offset = (y * fb->base.pitches[0]) + x * bpp; 96 offset = (y * fb->base.pitches[0]) + x * bpp;
97 97
98 virtio_gpu_cmd_transfer_to_host_2d(vgdev, obj->hw_res_handle, 98 virtio_gpu_cmd_transfer_to_host_2d(vgdev, obj,
99 offset, 99 offset,
100 cpu_to_le32(w), 100 cpu_to_le32(w),
101 cpu_to_le32(h), 101 cpu_to_le32(h),
@@ -203,12 +203,6 @@ static struct fb_ops virtio_gpufb_ops = {
203 .fb_imageblit = virtio_gpu_3d_imageblit, 203 .fb_imageblit = virtio_gpu_3d_imageblit,
204}; 204};
205 205
206static int virtio_gpu_vmap_fb(struct virtio_gpu_device *vgdev,
207 struct virtio_gpu_object *obj)
208{
209 return virtio_gpu_object_kmap(obj, NULL);
210}
211
212static int virtio_gpufb_create(struct drm_fb_helper *helper, 206static int virtio_gpufb_create(struct drm_fb_helper *helper,
213 struct drm_fb_helper_surface_size *sizes) 207 struct drm_fb_helper_surface_size *sizes)
214{ 208{
@@ -226,7 +220,7 @@ static int virtio_gpufb_create(struct drm_fb_helper *helper,
226 mode_cmd.width = sizes->surface_width; 220 mode_cmd.width = sizes->surface_width;
227 mode_cmd.height = sizes->surface_height; 221 mode_cmd.height = sizes->surface_height;
228 mode_cmd.pitches[0] = mode_cmd.width * 4; 222 mode_cmd.pitches[0] = mode_cmd.width * 4;
229 mode_cmd.pixel_format = drm_mode_legacy_fb_format(32, 24); 223 mode_cmd.pixel_format = DRM_FORMAT_HOST_XRGB8888;
230 224
231 format = virtio_gpu_translate_format(mode_cmd.pixel_format); 225 format = virtio_gpu_translate_format(mode_cmd.pixel_format);
232 if (format == 0) 226 if (format == 0)
@@ -241,9 +235,9 @@ static int virtio_gpufb_create(struct drm_fb_helper *helper,
241 virtio_gpu_cmd_create_resource(vgdev, resid, format, 235 virtio_gpu_cmd_create_resource(vgdev, resid, format,
242 mode_cmd.width, mode_cmd.height); 236 mode_cmd.width, mode_cmd.height);
243 237
244 ret = virtio_gpu_vmap_fb(vgdev, obj); 238 ret = virtio_gpu_object_kmap(obj);
245 if (ret) { 239 if (ret) {
246 DRM_ERROR("failed to vmap fb %d\n", ret); 240 DRM_ERROR("failed to kmap fb %d\n", ret);
247 goto err_obj_vmap; 241 goto err_obj_vmap;
248 } 242 }
249 243
diff --git a/drivers/gpu/drm/virtio/virtgpu_gem.c b/drivers/gpu/drm/virtio/virtgpu_gem.c
index 0f2768eacaee..82c817f37cf7 100644
--- a/drivers/gpu/drm/virtio/virtgpu_gem.c
+++ b/drivers/gpu/drm/virtio/virtgpu_gem.c
@@ -90,7 +90,10 @@ int virtio_gpu_mode_dumb_create(struct drm_file *file_priv,
90 uint32_t resid; 90 uint32_t resid;
91 uint32_t format; 91 uint32_t format;
92 92
93 pitch = args->width * ((args->bpp + 1) / 8); 93 if (args->bpp != 32)
94 return -EINVAL;
95
96 pitch = args->width * 4;
94 args->size = pitch * args->height; 97 args->size = pitch * args->height;
95 args->size = ALIGN(args->size, PAGE_SIZE); 98 args->size = ALIGN(args->size, PAGE_SIZE);
96 99
@@ -99,7 +102,7 @@ int virtio_gpu_mode_dumb_create(struct drm_file *file_priv,
99 if (ret) 102 if (ret)
100 goto fail; 103 goto fail;
101 104
102 format = virtio_gpu_translate_format(DRM_FORMAT_XRGB8888); 105 format = virtio_gpu_translate_format(DRM_FORMAT_HOST_XRGB8888);
103 virtio_gpu_resource_id_get(vgdev, &resid); 106 virtio_gpu_resource_id_get(vgdev, &resid);
104 virtio_gpu_cmd_create_resource(vgdev, resid, format, 107 virtio_gpu_cmd_create_resource(vgdev, resid, format,
105 args->width, args->height); 108 args->width, args->height);
diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
index 7bdf6f0e58a5..f16b875d6a46 100644
--- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c
+++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
@@ -429,11 +429,11 @@ static int virtio_gpu_transfer_to_host_ioctl(struct drm_device *dev, void *data,
429 convert_to_hw_box(&box, &args->box); 429 convert_to_hw_box(&box, &args->box);
430 if (!vgdev->has_virgl_3d) { 430 if (!vgdev->has_virgl_3d) {
431 virtio_gpu_cmd_transfer_to_host_2d 431 virtio_gpu_cmd_transfer_to_host_2d
432 (vgdev, qobj->hw_res_handle, offset, 432 (vgdev, qobj, offset,
433 box.w, box.h, box.x, box.y, NULL); 433 box.w, box.h, box.x, box.y, NULL);
434 } else { 434 } else {
435 virtio_gpu_cmd_transfer_to_host_3d 435 virtio_gpu_cmd_transfer_to_host_3d
436 (vgdev, qobj->hw_res_handle, 436 (vgdev, qobj,
437 vfpriv ? vfpriv->ctx_id : 0, offset, 437 vfpriv ? vfpriv->ctx_id : 0, offset,
438 args->level, &box, &fence); 438 args->level, &box, &fence);
439 reservation_object_add_excl_fence(qobj->tbo.resv, 439 reservation_object_add_excl_fence(qobj->tbo.resv,
diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c
index 9f2f470efd9b..eca765537470 100644
--- a/drivers/gpu/drm/virtio/virtgpu_object.c
+++ b/drivers/gpu/drm/virtio/virtgpu_object.c
@@ -37,6 +37,8 @@ static void virtio_gpu_ttm_bo_destroy(struct ttm_buffer_object *tbo)
37 virtio_gpu_cmd_unref_resource(vgdev, bo->hw_res_handle); 37 virtio_gpu_cmd_unref_resource(vgdev, bo->hw_res_handle);
38 if (bo->pages) 38 if (bo->pages)
39 virtio_gpu_object_free_sg_table(bo); 39 virtio_gpu_object_free_sg_table(bo);
40 if (bo->vmap)
41 virtio_gpu_object_kunmap(bo);
40 drm_gem_object_release(&bo->gem_base); 42 drm_gem_object_release(&bo->gem_base);
41 kfree(bo); 43 kfree(bo);
42} 44}
@@ -99,22 +101,23 @@ int virtio_gpu_object_create(struct virtio_gpu_device *vgdev,
99 return 0; 101 return 0;
100} 102}
101 103
102int virtio_gpu_object_kmap(struct virtio_gpu_object *bo, void **ptr) 104void virtio_gpu_object_kunmap(struct virtio_gpu_object *bo)
105{
106 bo->vmap = NULL;
107 ttm_bo_kunmap(&bo->kmap);
108}
109
110int virtio_gpu_object_kmap(struct virtio_gpu_object *bo)
103{ 111{
104 bool is_iomem; 112 bool is_iomem;
105 int r; 113 int r;
106 114
107 if (bo->vmap) { 115 WARN_ON(bo->vmap);
108 if (ptr) 116
109 *ptr = bo->vmap;
110 return 0;
111 }
112 r = ttm_bo_kmap(&bo->tbo, 0, bo->tbo.num_pages, &bo->kmap); 117 r = ttm_bo_kmap(&bo->tbo, 0, bo->tbo.num_pages, &bo->kmap);
113 if (r) 118 if (r)
114 return r; 119 return r;
115 bo->vmap = ttm_kmap_obj_virtual(&bo->kmap, &is_iomem); 120 bo->vmap = ttm_kmap_obj_virtual(&bo->kmap, &is_iomem);
116 if (ptr)
117 *ptr = bo->vmap;
118 return 0; 121 return 0;
119} 122}
120 123
diff --git a/drivers/gpu/drm/virtio/virtgpu_plane.c b/drivers/gpu/drm/virtio/virtgpu_plane.c
index 88f2fb8c61c4..a9f4ae7d4483 100644
--- a/drivers/gpu/drm/virtio/virtgpu_plane.c
+++ b/drivers/gpu/drm/virtio/virtgpu_plane.c
@@ -28,22 +28,11 @@
28#include <drm/drm_atomic_helper.h> 28#include <drm/drm_atomic_helper.h>
29 29
30static const uint32_t virtio_gpu_formats[] = { 30static const uint32_t virtio_gpu_formats[] = {
31 DRM_FORMAT_XRGB8888, 31 DRM_FORMAT_HOST_XRGB8888,
32 DRM_FORMAT_ARGB8888,
33 DRM_FORMAT_BGRX8888,
34 DRM_FORMAT_BGRA8888,
35 DRM_FORMAT_RGBX8888,
36 DRM_FORMAT_RGBA8888,
37 DRM_FORMAT_XBGR8888,
38 DRM_FORMAT_ABGR8888,
39}; 32};
40 33
41static const uint32_t virtio_gpu_cursor_formats[] = { 34static const uint32_t virtio_gpu_cursor_formats[] = {
42#ifdef __BIG_ENDIAN 35 DRM_FORMAT_HOST_ARGB8888,
43 DRM_FORMAT_BGRA8888,
44#else
45 DRM_FORMAT_ARGB8888,
46#endif
47}; 36};
48 37
49uint32_t virtio_gpu_translate_format(uint32_t drm_fourcc) 38uint32_t virtio_gpu_translate_format(uint32_t drm_fourcc)
@@ -51,32 +40,6 @@ uint32_t virtio_gpu_translate_format(uint32_t drm_fourcc)
51 uint32_t format; 40 uint32_t format;
52 41
53 switch (drm_fourcc) { 42 switch (drm_fourcc) {
54#ifdef __BIG_ENDIAN
55 case DRM_FORMAT_XRGB8888:
56 format = VIRTIO_GPU_FORMAT_X8R8G8B8_UNORM;
57 break;
58 case DRM_FORMAT_ARGB8888:
59 format = VIRTIO_GPU_FORMAT_A8R8G8B8_UNORM;
60 break;
61 case DRM_FORMAT_BGRX8888:
62 format = VIRTIO_GPU_FORMAT_B8G8R8X8_UNORM;
63 break;
64 case DRM_FORMAT_BGRA8888:
65 format = VIRTIO_GPU_FORMAT_B8G8R8A8_UNORM;
66 break;
67 case DRM_FORMAT_RGBX8888:
68 format = VIRTIO_GPU_FORMAT_R8G8B8X8_UNORM;
69 break;
70 case DRM_FORMAT_RGBA8888:
71 format = VIRTIO_GPU_FORMAT_R8G8B8A8_UNORM;
72 break;
73 case DRM_FORMAT_XBGR8888:
74 format = VIRTIO_GPU_FORMAT_X8B8G8R8_UNORM;
75 break;
76 case DRM_FORMAT_ABGR8888:
77 format = VIRTIO_GPU_FORMAT_A8B8G8R8_UNORM;
78 break;
79#else
80 case DRM_FORMAT_XRGB8888: 43 case DRM_FORMAT_XRGB8888:
81 format = VIRTIO_GPU_FORMAT_B8G8R8X8_UNORM; 44 format = VIRTIO_GPU_FORMAT_B8G8R8X8_UNORM;
82 break; 45 break;
@@ -89,19 +52,6 @@ uint32_t virtio_gpu_translate_format(uint32_t drm_fourcc)
89 case DRM_FORMAT_BGRA8888: 52 case DRM_FORMAT_BGRA8888:
90 format = VIRTIO_GPU_FORMAT_A8R8G8B8_UNORM; 53 format = VIRTIO_GPU_FORMAT_A8R8G8B8_UNORM;
91 break; 54 break;
92 case DRM_FORMAT_RGBX8888:
93 format = VIRTIO_GPU_FORMAT_X8B8G8R8_UNORM;
94 break;
95 case DRM_FORMAT_RGBA8888:
96 format = VIRTIO_GPU_FORMAT_A8B8G8R8_UNORM;
97 break;
98 case DRM_FORMAT_XBGR8888:
99 format = VIRTIO_GPU_FORMAT_R8G8B8X8_UNORM;
100 break;
101 case DRM_FORMAT_ABGR8888:
102 format = VIRTIO_GPU_FORMAT_R8G8B8A8_UNORM;
103 break;
104#endif
105 default: 55 default:
106 /* 56 /*
107 * This should not happen, we handle everything listed 57 * This should not happen, we handle everything listed
@@ -158,7 +108,7 @@ static void virtio_gpu_primary_plane_update(struct drm_plane *plane,
158 handle = bo->hw_res_handle; 108 handle = bo->hw_res_handle;
159 if (bo->dumb) { 109 if (bo->dumb) {
160 virtio_gpu_cmd_transfer_to_host_2d 110 virtio_gpu_cmd_transfer_to_host_2d
161 (vgdev, handle, 0, 111 (vgdev, bo, 0,
162 cpu_to_le32(plane->state->src_w >> 16), 112 cpu_to_le32(plane->state->src_w >> 16),
163 cpu_to_le32(plane->state->src_h >> 16), 113 cpu_to_le32(plane->state->src_h >> 16),
164 cpu_to_le32(plane->state->src_x >> 16), 114 cpu_to_le32(plane->state->src_x >> 16),
@@ -217,7 +167,7 @@ static void virtio_gpu_cursor_plane_update(struct drm_plane *plane,
217 if (bo && bo->dumb && (plane->state->fb != old_state->fb)) { 167 if (bo && bo->dumb && (plane->state->fb != old_state->fb)) {
218 /* new cursor -- update & wait */ 168 /* new cursor -- update & wait */
219 virtio_gpu_cmd_transfer_to_host_2d 169 virtio_gpu_cmd_transfer_to_host_2d
220 (vgdev, handle, 0, 170 (vgdev, bo, 0,
221 cpu_to_le32(plane->state->crtc_w), 171 cpu_to_le32(plane->state->crtc_w),
222 cpu_to_le32(plane->state->crtc_h), 172 cpu_to_le32(plane->state->crtc_h),
223 0, 0, &fence); 173 0, 0, &fence);
diff --git a/drivers/gpu/drm/virtio/virtgpu_prime.c b/drivers/gpu/drm/virtio/virtgpu_prime.c
index d27a1688714f..86ce0ae93f59 100644
--- a/drivers/gpu/drm/virtio/virtgpu_prime.c
+++ b/drivers/gpu/drm/virtio/virtgpu_prime.c
@@ -55,13 +55,18 @@ struct drm_gem_object *virtgpu_gem_prime_import_sg_table(
55 55
56void *virtgpu_gem_prime_vmap(struct drm_gem_object *obj) 56void *virtgpu_gem_prime_vmap(struct drm_gem_object *obj)
57{ 57{
58 WARN_ONCE(1, "not implemented"); 58 struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(obj);
59 return ERR_PTR(-ENODEV); 59 int ret;
60
61 ret = virtio_gpu_object_kmap(bo);
62 if (ret)
63 return NULL;
64 return bo->vmap;
60} 65}
61 66
62void virtgpu_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr) 67void virtgpu_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
63{ 68{
64 WARN_ONCE(1, "not implemented"); 69 virtio_gpu_object_kunmap(gem_to_virtio_gpu_obj(obj));
65} 70}
66 71
67int virtgpu_gem_prime_mmap(struct drm_gem_object *obj, 72int virtgpu_gem_prime_mmap(struct drm_gem_object *obj,
diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c
index df32811f2c3e..4e2e037aed34 100644
--- a/drivers/gpu/drm/virtio/virtgpu_vq.c
+++ b/drivers/gpu/drm/virtio/virtgpu_vq.c
@@ -483,28 +483,26 @@ void virtio_gpu_cmd_resource_flush(struct virtio_gpu_device *vgdev,
483} 483}
484 484
485void virtio_gpu_cmd_transfer_to_host_2d(struct virtio_gpu_device *vgdev, 485void virtio_gpu_cmd_transfer_to_host_2d(struct virtio_gpu_device *vgdev,
486 uint32_t resource_id, uint64_t offset, 486 struct virtio_gpu_object *bo,
487 uint64_t offset,
487 __le32 width, __le32 height, 488 __le32 width, __le32 height,
488 __le32 x, __le32 y, 489 __le32 x, __le32 y,
489 struct virtio_gpu_fence **fence) 490 struct virtio_gpu_fence **fence)
490{ 491{
491 struct virtio_gpu_transfer_to_host_2d *cmd_p; 492 struct virtio_gpu_transfer_to_host_2d *cmd_p;
492 struct virtio_gpu_vbuffer *vbuf; 493 struct virtio_gpu_vbuffer *vbuf;
493 struct virtio_gpu_fbdev *vgfbdev = vgdev->vgfbdev;
494 struct virtio_gpu_framebuffer *fb = &vgfbdev->vgfb;
495 struct virtio_gpu_object *obj = gem_to_virtio_gpu_obj(fb->base.obj[0]);
496 bool use_dma_api = !virtio_has_iommu_quirk(vgdev->vdev); 494 bool use_dma_api = !virtio_has_iommu_quirk(vgdev->vdev);
497 495
498 if (use_dma_api) 496 if (use_dma_api)
499 dma_sync_sg_for_device(vgdev->vdev->dev.parent, 497 dma_sync_sg_for_device(vgdev->vdev->dev.parent,
500 obj->pages->sgl, obj->pages->nents, 498 bo->pages->sgl, bo->pages->nents,
501 DMA_TO_DEVICE); 499 DMA_TO_DEVICE);
502 500
503 cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); 501 cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p));
504 memset(cmd_p, 0, sizeof(*cmd_p)); 502 memset(cmd_p, 0, sizeof(*cmd_p));
505 503
506 cmd_p->hdr.type = cpu_to_le32(VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D); 504 cmd_p->hdr.type = cpu_to_le32(VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D);
507 cmd_p->resource_id = cpu_to_le32(resource_id); 505 cmd_p->resource_id = cpu_to_le32(bo->hw_res_handle);
508 cmd_p->offset = cpu_to_le64(offset); 506 cmd_p->offset = cpu_to_le64(offset);
509 cmd_p->r.width = width; 507 cmd_p->r.width = width;
510 cmd_p->r.height = height; 508 cmd_p->r.height = height;
@@ -791,21 +789,19 @@ virtio_gpu_cmd_resource_create_3d(struct virtio_gpu_device *vgdev,
791} 789}
792 790
793void virtio_gpu_cmd_transfer_to_host_3d(struct virtio_gpu_device *vgdev, 791void virtio_gpu_cmd_transfer_to_host_3d(struct virtio_gpu_device *vgdev,
794 uint32_t resource_id, uint32_t ctx_id, 792 struct virtio_gpu_object *bo,
793 uint32_t ctx_id,
795 uint64_t offset, uint32_t level, 794 uint64_t offset, uint32_t level,
796 struct virtio_gpu_box *box, 795 struct virtio_gpu_box *box,
797 struct virtio_gpu_fence **fence) 796 struct virtio_gpu_fence **fence)
798{ 797{
799 struct virtio_gpu_transfer_host_3d *cmd_p; 798 struct virtio_gpu_transfer_host_3d *cmd_p;
800 struct virtio_gpu_vbuffer *vbuf; 799 struct virtio_gpu_vbuffer *vbuf;
801 struct virtio_gpu_fbdev *vgfbdev = vgdev->vgfbdev;
802 struct virtio_gpu_framebuffer *fb = &vgfbdev->vgfb;
803 struct virtio_gpu_object *obj = gem_to_virtio_gpu_obj(fb->base.obj[0]);
804 bool use_dma_api = !virtio_has_iommu_quirk(vgdev->vdev); 800 bool use_dma_api = !virtio_has_iommu_quirk(vgdev->vdev);
805 801
806 if (use_dma_api) 802 if (use_dma_api)
807 dma_sync_sg_for_device(vgdev->vdev->dev.parent, 803 dma_sync_sg_for_device(vgdev->vdev->dev.parent,
808 obj->pages->sgl, obj->pages->nents, 804 bo->pages->sgl, bo->pages->nents,
809 DMA_TO_DEVICE); 805 DMA_TO_DEVICE);
810 806
811 cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); 807 cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p));
@@ -813,7 +809,7 @@ void virtio_gpu_cmd_transfer_to_host_3d(struct virtio_gpu_device *vgdev,
813 809
814 cmd_p->hdr.type = cpu_to_le32(VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D); 810 cmd_p->hdr.type = cpu_to_le32(VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D);
815 cmd_p->hdr.ctx_id = cpu_to_le32(ctx_id); 811 cmd_p->hdr.ctx_id = cpu_to_le32(ctx_id);
816 cmd_p->resource_id = cpu_to_le32(resource_id); 812 cmd_p->resource_id = cpu_to_le32(bo->hw_res_handle);
817 cmd_p->box = *box; 813 cmd_p->box = *box;
818 cmd_p->offset = cpu_to_le64(offset); 814 cmd_p->offset = cpu_to_le64(offset);
819 cmd_p->level = cpu_to_le32(level); 815 cmd_p->level = cpu_to_le32(level);
diff --git a/drivers/gpu/drm/vkms/vkms_crc.c b/drivers/gpu/drm/vkms/vkms_crc.c
index 0a2745646dfa..9d9e8146db90 100644
--- a/drivers/gpu/drm/vkms/vkms_crc.c
+++ b/drivers/gpu/drm/vkms/vkms_crc.c
@@ -125,6 +125,7 @@ static uint32_t _vkms_get_crc(struct vkms_crc_data *primary_crc,
125 mutex_lock(&vkms_obj->pages_lock); 125 mutex_lock(&vkms_obj->pages_lock);
126 if (WARN_ON(!vkms_obj->vaddr)) { 126 if (WARN_ON(!vkms_obj->vaddr)) {
127 mutex_unlock(&vkms_obj->pages_lock); 127 mutex_unlock(&vkms_obj->pages_lock);
128 kfree(vaddr_out);
128 return crc; 129 return crc;
129 } 130 }
130 131
diff --git a/drivers/gpu/drm/zte/zx_drm_drv.c b/drivers/gpu/drm/zte/zx_drm_drv.c
index 6f4205e80378..11ef17c2d1c1 100644
--- a/drivers/gpu/drm/zte/zx_drm_drv.c
+++ b/drivers/gpu/drm/zte/zx_drm_drv.c
@@ -31,7 +31,6 @@
31 31
32static const struct drm_mode_config_funcs zx_drm_mode_config_funcs = { 32static const struct drm_mode_config_funcs zx_drm_mode_config_funcs = {
33 .fb_create = drm_gem_fb_create, 33 .fb_create = drm_gem_fb_create,
34 .output_poll_changed = drm_fb_helper_output_poll_changed,
35 .atomic_check = drm_atomic_helper_check, 34 .atomic_check = drm_atomic_helper_check,
36 .atomic_commit = drm_atomic_helper_commit, 35 .atomic_commit = drm_atomic_helper_commit,
37}; 36};
@@ -41,7 +40,6 @@ DEFINE_DRM_GEM_CMA_FOPS(zx_drm_fops);
41static struct drm_driver zx_drm_driver = { 40static struct drm_driver zx_drm_driver = {
42 .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | 41 .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME |
43 DRIVER_ATOMIC, 42 DRIVER_ATOMIC,
44 .lastclose = drm_fb_helper_lastclose,
45 .gem_free_object_unlocked = drm_gem_cma_free_object, 43 .gem_free_object_unlocked = drm_gem_cma_free_object,
46 .gem_vm_ops = &drm_gem_cma_vm_ops, 44 .gem_vm_ops = &drm_gem_cma_vm_ops,
47 .dumb_create = drm_gem_cma_dumb_create, 45 .dumb_create = drm_gem_cma_dumb_create,
@@ -101,20 +99,14 @@ static int zx_drm_bind(struct device *dev)
101 drm_mode_config_reset(drm); 99 drm_mode_config_reset(drm);
102 drm_kms_helper_poll_init(drm); 100 drm_kms_helper_poll_init(drm);
103 101
104 ret = drm_fb_cma_fbdev_init(drm, 32, 0);
105 if (ret) {
106 DRM_DEV_ERROR(dev, "failed to init cma fbdev: %d\n", ret);
107 goto out_poll_fini;
108 }
109
110 ret = drm_dev_register(drm, 0); 102 ret = drm_dev_register(drm, 0);
111 if (ret) 103 if (ret)
112 goto out_fbdev_fini; 104 goto out_poll_fini;
105
106 drm_fbdev_generic_setup(drm, 32);
113 107
114 return 0; 108 return 0;
115 109
116out_fbdev_fini:
117 drm_fb_cma_fbdev_fini(drm);
118out_poll_fini: 110out_poll_fini:
119 drm_kms_helper_poll_fini(drm); 111 drm_kms_helper_poll_fini(drm);
120 drm_mode_config_cleanup(drm); 112 drm_mode_config_cleanup(drm);
@@ -131,7 +123,6 @@ static void zx_drm_unbind(struct device *dev)
131 struct drm_device *drm = dev_get_drvdata(dev); 123 struct drm_device *drm = dev_get_drvdata(dev);
132 124
133 drm_dev_unregister(drm); 125 drm_dev_unregister(drm);
134 drm_fb_cma_fbdev_fini(drm);
135 drm_kms_helper_poll_fini(drm); 126 drm_kms_helper_poll_fini(drm);
136 drm_mode_config_cleanup(drm); 127 drm_mode_config_cleanup(drm);
137 component_unbind_all(dev, drm); 128 component_unbind_all(dev, drm);
@@ -161,10 +152,8 @@ static int zx_drm_probe(struct platform_device *pdev)
161 if (ret) 152 if (ret)
162 return ret; 153 return ret;
163 154
164 for_each_available_child_of_node(parent, child) { 155 for_each_available_child_of_node(parent, child)
165 component_match_add(dev, &match, compare_of, child); 156 component_match_add(dev, &match, compare_of, child);
166 of_node_put(child);
167 }
168 157
169 return component_master_add_with_match(dev, &zx_drm_master_ops, match); 158 return component_master_add_with_match(dev, &zx_drm_master_ops, match);
170} 159}
diff --git a/include/drm/drm_fourcc.h b/include/drm/drm_fourcc.h
index fac831c40106..865ef60c17af 100644
--- a/include/drm/drm_fourcc.h
+++ b/include/drm/drm_fourcc.h
@@ -88,6 +88,8 @@ const struct drm_format_info *
88drm_get_format_info(struct drm_device *dev, 88drm_get_format_info(struct drm_device *dev,
89 const struct drm_mode_fb_cmd2 *mode_cmd); 89 const struct drm_mode_fb_cmd2 *mode_cmd);
90uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth); 90uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth);
91uint32_t drm_driver_legacy_fb_format(struct drm_device *dev,
92 uint32_t bpp, uint32_t depth);
91int drm_format_num_planes(uint32_t format); 93int drm_format_num_planes(uint32_t format);
92int drm_format_plane_cpp(uint32_t format, int plane); 94int drm_format_plane_cpp(uint32_t format, int plane);
93int drm_format_horz_chroma_subsampling(uint32_t format); 95int drm_format_horz_chroma_subsampling(uint32_t format);