[openchrome-devel] drm-openchrome: Branch 'drm-next-5.5' - 12 commits - drivers/gpu/drm

Kevin Brace kevinbrace at kemper.freedesktop.org
Thu Oct 17 01:02:48 UTC 2019


 drivers/gpu/drm/openchrome/Makefile            |    2 
 drivers/gpu/drm/openchrome/openchrome_crtc.c   |  382 +-----------------------
 drivers/gpu/drm/openchrome/openchrome_cursor.c |  385 +++++++++++++++++++++++++
 drivers/gpu/drm/openchrome/openchrome_drv.h    |   25 +
 drivers/gpu/drm/openchrome/openchrome_fb.c     |  164 +---------
 drivers/gpu/drm/openchrome/openchrome_fbdev.c  |  118 +++++++
 drivers/gpu/drm/openchrome/openchrome_init.c   |   36 ++
 drivers/gpu/drm/openchrome/openchrome_ttm.c    |    4 
 8 files changed, 602 insertions(+), 514 deletions(-)

New commits:
commit d693feb416eff609e51ebb996efacf89141e81fe
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Wed Oct 16 18:01:57 2019 -0700

    drm/openchrome: Version bumped to 3.1.18
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/openchrome_drv.h b/drivers/gpu/drm/openchrome/openchrome_drv.h
index 9e3b7759ed86..c34d78f5a2b9 100644
--- a/drivers/gpu/drm/openchrome/openchrome_drv.h
+++ b/drivers/gpu/drm/openchrome/openchrome_drv.h
@@ -52,10 +52,10 @@
 
 #define DRIVER_MAJOR		3
 #define DRIVER_MINOR		1
-#define DRIVER_PATCHLEVEL	17
+#define DRIVER_PATCHLEVEL	18
 #define DRIVER_NAME		"openchrome"
 #define DRIVER_DESC		"OpenChrome DRM for VIA Technologies Chrome IGP"
-#define DRIVER_DATE		"20191014"
+#define DRIVER_DATE		"20191016"
 #define DRIVER_AUTHOR		"OpenChrome Project"
 
 
commit 139b4b70b42443af71418abfa11d3465fe4b3ddd
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Wed Oct 16 18:01:29 2019 -0700

    drm/openchrome: Move openchrome_mode_config_init() inside openchrome_fb.c
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/openchrome_fb.c b/drivers/gpu/drm/openchrome/openchrome_fb.c
index 7f9bb6814a5e..56b1da592556 100644
--- a/drivers/gpu/drm/openchrome/openchrome_fb.c
+++ b/drivers/gpu/drm/openchrome/openchrome_fb.c
@@ -117,6 +117,27 @@ static const struct drm_mode_config_funcs via_mode_funcs = {
 	.output_poll_changed	= via_output_poll_changed
 };
 
+void openchrome_mode_config_init(
+			struct openchrome_drm_private *dev_private)
+{
+	struct drm_device *dev = dev_private->dev;
+
+	DRM_DEBUG_KMS("Entered %s.\n", __func__);
+
+	drm_mode_config_init(dev);
+
+	dev->mode_config.min_width = 0;
+	dev->mode_config.min_height = 0;
+	dev->mode_config.max_width = 2044;
+	dev->mode_config.max_height = 4096;
+
+	dev->mode_config.funcs = &via_mode_funcs;
+
+	dev->mode_config.preferred_depth = 24;
+
+	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
+}
+
 static struct fb_ops via_fb_ops = {
 	.owner		= THIS_MODULE,
 	.fb_check_var	= drm_fb_helper_check_var,
@@ -231,24 +252,3 @@ exit:
 struct drm_fb_helper_funcs via_drm_fb_helper_funcs = {
 	.fb_probe = via_fb_probe,
 };
-
-void openchrome_mode_config_init(
-			struct openchrome_drm_private *dev_private)
-{
-	struct drm_device *dev = dev_private->dev;
-
-	DRM_DEBUG_KMS("Entered %s.\n", __func__);
-
-	drm_mode_config_init(dev);
-
-	dev->mode_config.min_width = 0;
-	dev->mode_config.min_height = 0;
-	dev->mode_config.max_width = 2044;
-	dev->mode_config.max_height = 4096;
-
-	dev->mode_config.funcs = &via_mode_funcs;
-
-	dev->mode_config.preferred_depth = 24;
-
-	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
-}
commit c586f890100ec8d292214e54c56a893c0137c3ec
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Wed Oct 16 17:22:56 2019 -0700

    drm/openchrome: Move FBDEV code into openchrome_fbdev.c
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/Makefile b/drivers/gpu/drm/openchrome/Makefile
index 73f688dde579..b7fc2ff9dc8d 100644
--- a/drivers/gpu/drm/openchrome/Makefile
+++ b/drivers/gpu/drm/openchrome/Makefile
@@ -12,6 +12,7 @@ openchrome-y := openchrome_analog.o \
 		openchrome_drv.o \
 		openchrome_encoder.o \
 		openchrome_fb.o \
+		openchrome_fbdev.o \
 		openchrome_fp.o \
 		openchrome_hdmi.o \
 		openchrome_i2c.o \
diff --git a/drivers/gpu/drm/openchrome/openchrome_drv.h b/drivers/gpu/drm/openchrome/openchrome_drv.h
index a78ee673e1b3..9e3b7759ed86 100644
--- a/drivers/gpu/drm/openchrome/openchrome_drv.h
+++ b/drivers/gpu/drm/openchrome/openchrome_drv.h
@@ -316,4 +316,6 @@ extern const struct drm_plane_funcs openchrome_cursor_drm_plane_funcs;
 extern const uint32_t openchrome_cursor_formats[];
 extern const unsigned int openchrome_cursor_formats_size;
 
+extern struct drm_fb_helper_funcs via_drm_fb_helper_funcs;
+
 #endif /* _OPENCHROME_DRV_H */
diff --git a/drivers/gpu/drm/openchrome/openchrome_fb.c b/drivers/gpu/drm/openchrome/openchrome_fb.c
index 836f3ba7b40f..7f9bb6814a5e 100644
--- a/drivers/gpu/drm/openchrome/openchrome_fb.c
+++ b/drivers/gpu/drm/openchrome/openchrome_fb.c
@@ -228,7 +228,7 @@ exit:
 	return ret;
 }
 
-static struct drm_fb_helper_funcs via_drm_fb_helper_funcs = {
+struct drm_fb_helper_funcs via_drm_fb_helper_funcs = {
 	.fb_probe = via_fb_probe,
 };
 
@@ -252,87 +252,3 @@ void openchrome_mode_config_init(
 
 	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
 }
-
-int via_fbdev_init(struct drm_device *dev)
-{
-	struct openchrome_drm_private *dev_private = dev->dev_private;
-	struct via_framebuffer_device *via_fbdev;
-	int bpp_sel = 32;
-	int ret = 0;
-
-	DRM_DEBUG_KMS("Entered %s.\n", __func__);
-
-	via_fbdev = kzalloc(sizeof(struct via_framebuffer_device),
-				GFP_KERNEL);
-	if (!via_fbdev) {
-		ret = -ENOMEM;
-		goto exit;
-	}
-
-	dev_private->via_fbdev = via_fbdev;
-
-	drm_fb_helper_prepare(dev, &via_fbdev->helper,
-				&via_drm_fb_helper_funcs);
-
-	ret = drm_fb_helper_init(dev, &via_fbdev->helper,
-				dev->mode_config.num_connector);
-	if (ret) {
-		goto free_fbdev;
-	}
-
-	ret = drm_fb_helper_single_add_all_connectors(&via_fbdev->helper);
-	if (ret) {
-		goto free_fb_helper;
-	}
-
-	drm_helper_disable_unused_functions(dev);
-	ret = drm_fb_helper_initial_config(&via_fbdev->helper, bpp_sel);
-	if (ret) {
-		goto free_fb_helper;
-	}
-
-	goto exit;
-free_fb_helper:
-	drm_fb_helper_fini(&via_fbdev->helper);
-free_fbdev:
-	kfree(via_fbdev);
-exit:
-	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
-	return ret;
-}
-
-void via_fbdev_fini(struct drm_device *dev)
-{
-	struct openchrome_drm_private *dev_private = dev->dev_private;
-	struct drm_fb_helper *fb_helper = &dev_private->via_fbdev->helper;
-	struct via_framebuffer *via_fb = &dev_private->via_fbdev->via_fb;
-	struct fb_info *info;
-
-	DRM_DEBUG_KMS("Entered %s.\n", __func__);
-
-	if (!fb_helper) {
-		goto exit;
-	}
-
-	info = fb_helper->fbdev;
-	if (info) {
-		unregister_framebuffer(info);
-		kfree(info->apertures);
-		framebuffer_release(info);
-		fb_helper->fbdev = NULL;
-	}
-
-	if (via_fb->gem) {
-		drm_gem_object_put_unlocked(via_fb->gem);
-		via_fb->gem = NULL;
-	}
-
-	drm_fb_helper_fini(&dev_private->via_fbdev->helper);
-	drm_framebuffer_cleanup(&dev_private->via_fbdev->via_fb.fb);
-	if (dev_private->via_fbdev) {
-		kfree(dev_private->via_fbdev);
-		dev_private->via_fbdev = NULL;
-	}
-exit:
-	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
-}
diff --git a/drivers/gpu/drm/openchrome/openchrome_fbdev.c b/drivers/gpu/drm/openchrome/openchrome_fbdev.c
new file mode 100644
index 000000000000..58fe9c0398d3
--- /dev/null
+++ b/drivers/gpu/drm/openchrome/openchrome_fbdev.c
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2012 James Simmons <jsimmons at infradead.org>. All Rights Reserved.
+ *
+ * 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 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 NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) OR COPYRIGHT HOLDER(S) 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 <linux/fb.h>
+
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_fb_helper.h>
+#include <drm/drm_gem.h>
+
+#include "openchrome_drv.h"
+
+
+int via_fbdev_init(struct drm_device *dev)
+{
+	struct openchrome_drm_private *dev_private = dev->dev_private;
+	struct via_framebuffer_device *via_fbdev;
+	int bpp_sel = 32;
+	int ret = 0;
+
+	DRM_DEBUG_KMS("Entered %s.\n", __func__);
+
+	via_fbdev = kzalloc(sizeof(struct via_framebuffer_device),
+				GFP_KERNEL);
+	if (!via_fbdev) {
+		ret = -ENOMEM;
+		goto exit;
+	}
+
+	dev_private->via_fbdev = via_fbdev;
+
+	drm_fb_helper_prepare(dev, &via_fbdev->helper,
+				&via_drm_fb_helper_funcs);
+
+	ret = drm_fb_helper_init(dev, &via_fbdev->helper,
+				dev->mode_config.num_connector);
+	if (ret) {
+		goto free_fbdev;
+	}
+
+	ret = drm_fb_helper_single_add_all_connectors(&via_fbdev->helper);
+	if (ret) {
+		goto free_fb_helper;
+	}
+
+	drm_helper_disable_unused_functions(dev);
+	ret = drm_fb_helper_initial_config(&via_fbdev->helper, bpp_sel);
+	if (ret) {
+		goto free_fb_helper;
+	}
+
+	goto exit;
+free_fb_helper:
+	drm_fb_helper_fini(&via_fbdev->helper);
+free_fbdev:
+	kfree(via_fbdev);
+exit:
+	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
+	return ret;
+}
+
+void via_fbdev_fini(struct drm_device *dev)
+{
+	struct openchrome_drm_private *dev_private = dev->dev_private;
+	struct drm_fb_helper *fb_helper = &dev_private->
+						via_fbdev->helper;
+	struct via_framebuffer *via_fb = &dev_private->
+						via_fbdev->via_fb;
+	struct fb_info *info;
+
+	DRM_DEBUG_KMS("Entered %s.\n", __func__);
+
+	if (!fb_helper) {
+		goto exit;
+	}
+
+	info = fb_helper->fbdev;
+	if (info) {
+		unregister_framebuffer(info);
+		kfree(info->apertures);
+		framebuffer_release(info);
+		fb_helper->fbdev = NULL;
+	}
+
+	if (via_fb->gem) {
+		drm_gem_object_put_unlocked(via_fb->gem);
+		via_fb->gem = NULL;
+	}
+
+	drm_fb_helper_fini(&dev_private->via_fbdev->helper);
+	drm_framebuffer_cleanup(&dev_private->via_fbdev->via_fb.fb);
+	if (dev_private->via_fbdev) {
+		kfree(dev_private->via_fbdev);
+		dev_private->via_fbdev = NULL;
+	}
+exit:
+	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
+}
commit a70a803174d93c0aa817fc6cf5f9abf254dd6af8
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Wed Oct 16 17:03:18 2019 -0700

    drm/openchrome: Change how drm_crtc_init_with_planes() is invoked
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/openchrome_crtc.c b/drivers/gpu/drm/openchrome/openchrome_crtc.c
index 867a9a14d51e..4249cc9910e5 100644
--- a/drivers/gpu/drm/openchrome/openchrome_crtc.c
+++ b/drivers/gpu/drm/openchrome/openchrome_crtc.c
@@ -2295,17 +2295,28 @@ int via_crtc_init(struct drm_device *dev, uint32_t index)
 		goto free_cursor;
 	}
 
-	if (index) {
+	if (iga->index) {
 		drm_crtc_helper_add(crtc,
 			&openchrome_iga2_drm_crtc_helper_funcs);
-		ret = drm_crtc_init_with_planes(dev, crtc, primary,
-				cursor, &openchrome_iga2_drm_crtc_funcs,
+		ret = drm_crtc_init_with_planes(dev, crtc,
+				primary, cursor,
+				&openchrome_iga2_drm_crtc_funcs,
 				NULL);
-		if (ret) {
-			DRM_ERROR("Failed to initialize CRTC!\n");
-			goto cleanup_cursor;
-		}
+	} else {
+		drm_crtc_helper_add(crtc,
+			&openchrome_iga1_drm_crtc_helper_funcs);
+		ret = drm_crtc_init_with_planes(dev, crtc,
+				primary, cursor,
+				&openchrome_iga1_drm_crtc_funcs,
+				NULL);
+	}
 
+	if (ret) {
+		DRM_ERROR("Failed to initialize CRTC!\n");
+		goto cleanup_cursor;
+	}
+
+	if (iga->index) {
 		iga->timings.htotal.count = ARRAY_SIZE(iga2_hor_total);
 		iga->timings.htotal.regs = iga2_hor_total;
 
@@ -2380,16 +2391,6 @@ int via_crtc_init(struct drm_device *dev, uint32_t index)
 		iga->offset.count = ARRAY_SIZE(iga2_offset) - 1;
 		iga->offset.regs = iga2_offset;
 	} else {
-		drm_crtc_helper_add(crtc,
-			&openchrome_iga1_drm_crtc_helper_funcs);
-		ret = drm_crtc_init_with_planes(dev, crtc, primary,
-				cursor, &openchrome_iga1_drm_crtc_funcs,
-				NULL);
-		if (ret) {
-			DRM_ERROR("Failed to initialize CRTC!\n");
-			goto cleanup_cursor;
-		}
-
 		iga->timings.htotal.count = ARRAY_SIZE(iga1_hor_total);
 		iga->timings.htotal.regs = iga1_hor_total;
 
commit 12721675e2eba407bcc6c8ce95877ec3c39e5818
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Wed Oct 16 16:46:14 2019 -0700

    drm/openchrome: Move VRAM initialization code into openchrome_init.c
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/openchrome_drv.h b/drivers/gpu/drm/openchrome/openchrome_drv.h
index 33eb94aa251f..a78ee673e1b3 100644
--- a/drivers/gpu/drm/openchrome/openchrome_drv.h
+++ b/drivers/gpu/drm/openchrome/openchrome_drv.h
@@ -263,6 +263,10 @@ extern int via_hdmi_audio;
 extern struct ttm_bo_driver openchrome_bo_driver;
 
 int openchrome_vram_detect(struct openchrome_drm_private *dev_private);
+extern int openchrome_vram_init(
+			struct openchrome_drm_private *dev_private);
+extern void openchrome_vram_fini(
+			struct openchrome_drm_private *dev_private);
 int openchrome_mmio_init(struct openchrome_drm_private *dev_private);
 void openchrome_mmio_fini(struct openchrome_drm_private *dev_private);
 void openchrome_graphics_unlock(
@@ -276,10 +280,6 @@ extern void via_engine_init(struct drm_device *dev);
 int openchrome_dev_pm_ops_suspend(struct device *dev);
 int openchrome_dev_pm_ops_resume(struct device *dev);
 
-extern int openchrome_vram_init(
-			struct openchrome_drm_private *dev_private);
-extern void openchrome_vram_fini(
-			struct openchrome_drm_private *dev_private);
 void openchrome_mode_config_init(
 			struct openchrome_drm_private *dev_private);
 
diff --git a/drivers/gpu/drm/openchrome/openchrome_fb.c b/drivers/gpu/drm/openchrome/openchrome_fb.c
index 53efa28efc8f..836f3ba7b40f 100644
--- a/drivers/gpu/drm/openchrome/openchrome_fb.c
+++ b/drivers/gpu/drm/openchrome/openchrome_fb.c
@@ -28,42 +28,6 @@
 
 #include "openchrome_drv.h"
 
-int openchrome_vram_init(struct openchrome_drm_private *dev_private)
-{
-	int ret = 0;
-
-	DRM_DEBUG_KMS("Entered %s.\n", __func__);
-
-	/* Add an MTRR for the video RAM. */
-	dev_private->vram_mtrr = arch_phys_wc_add(
-					dev_private->vram_start,
-					dev_private->vram_size);
-
-	DRM_INFO("VIA Technologies Chrome IGP VRAM "
-			"Physical Address: 0x%08llx\n",
-			dev_private->vram_start);
-	DRM_INFO("VIA Technologies Chrome IGP VRAM "
-			"Size: %llu\n",
-			(unsigned long long) dev_private->vram_size >> 20);
-
-	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
-	return ret;
-}
-
-void openchrome_vram_fini(struct openchrome_drm_private *dev_private)
-{
-	DRM_DEBUG_KMS("Entered %s.\n", __func__);
-
-	if (dev_private->vram_mtrr) {
-		arch_phys_wc_del(dev_private->vram_mtrr);
-		arch_io_free_memtype_wc(dev_private->vram_start,
-					dev_private->vram_size);
-		dev_private->vram_mtrr = 0;
-	}
-
-	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
-}
-
 static int
 via_user_framebuffer_create_handle(struct drm_framebuffer *fb,
 					struct drm_file *file_priv,
diff --git a/drivers/gpu/drm/openchrome/openchrome_init.c b/drivers/gpu/drm/openchrome/openchrome_init.c
index 2dd287d3d86e..e49fdc0c1ad9 100644
--- a/drivers/gpu/drm/openchrome/openchrome_init.c
+++ b/drivers/gpu/drm/openchrome/openchrome_init.c
@@ -970,6 +970,42 @@ out_err:
 	return ret;
 }
 
+int openchrome_vram_init(struct openchrome_drm_private *dev_private)
+{
+	int ret = 0;
+
+	DRM_DEBUG_KMS("Entered %s.\n", __func__);
+
+	/* Add an MTRR for the video RAM. */
+	dev_private->vram_mtrr = arch_phys_wc_add(
+					dev_private->vram_start,
+					dev_private->vram_size);
+
+	DRM_INFO("VIA Technologies Chrome IGP VRAM "
+			"Physical Address: 0x%08llx\n",
+			dev_private->vram_start);
+	DRM_INFO("VIA Technologies Chrome IGP VRAM "
+			"Size: %llu\n",
+			(unsigned long long) dev_private->vram_size >> 20);
+
+	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
+	return ret;
+}
+
+void openchrome_vram_fini(struct openchrome_drm_private *dev_private)
+{
+	DRM_DEBUG_KMS("Entered %s.\n", __func__);
+
+	if (dev_private->vram_mtrr) {
+		arch_phys_wc_del(dev_private->vram_mtrr);
+		arch_io_free_memtype_wc(dev_private->vram_start,
+					dev_private->vram_size);
+		dev_private->vram_mtrr = 0;
+	}
+
+	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
+}
+
 int openchrome_mmio_init(
 			struct openchrome_drm_private *dev_private)
 {
commit 215876a8252369c73d9a88b894aab4e1c0e1d59e
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Wed Oct 16 16:45:19 2019 -0700

    drm/openchrome: Use <drm/ttm/*.h> rather than "ttm/*.h" for TTM headers
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/openchrome_drv.h b/drivers/gpu/drm/openchrome/openchrome_drv.h
index 26c51025ff4c..33eb94aa251f 100644
--- a/drivers/gpu/drm/openchrome/openchrome_drv.h
+++ b/drivers/gpu/drm/openchrome/openchrome_drv.h
@@ -40,9 +40,9 @@
 #include <drm/drm_ioctl.h>
 #include <drm/drm_plane.h>
 
-#include "ttm/ttm_bo_api.h"
-#include "ttm/ttm_bo_driver.h"
-#include "ttm/ttm_placement.h"
+#include <drm/ttm/ttm_bo_api.h>
+#include <drm/ttm/ttm_bo_driver.h>
+#include <drm/ttm/ttm_placement.h>
 
 #include <drm/via_drm.h>
 
commit 4668841359f0e23355893d681a68c51588fd34ad
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Wed Oct 16 16:42:26 2019 -0700

    drm/openchrome: Add PCI ID and TTM headers to openchrome_ttm.c
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/openchrome_ttm.c b/drivers/gpu/drm/openchrome/openchrome_ttm.c
index 7ecfd15daee1..cf258d21774d 100644
--- a/drivers/gpu/drm/openchrome/openchrome_ttm.c
+++ b/drivers/gpu/drm/openchrome/openchrome_ttm.c
@@ -35,6 +35,10 @@
  *
  */
 
+#include <linux/pci.h>
+
+#include <drm/ttm/ttm_bo_api.h>
+#include <drm/ttm/ttm_bo_driver.h>
 
 #include "openchrome_drv.h"
 
commit a80a0df53cf363fdcfac7f06c3f0888b8ba0f600
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Wed Oct 16 16:41:28 2019 -0700

    drm/openchrome: Move cursor plane code into openchrome_cursor.c
    
    This happened thanks to universal plane related restructuring of
    DRM / KMS interface.
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/Makefile b/drivers/gpu/drm/openchrome/Makefile
index 261c40f8e3eb..73f688dde579 100644
--- a/drivers/gpu/drm/openchrome/Makefile
+++ b/drivers/gpu/drm/openchrome/Makefile
@@ -7,6 +7,7 @@ openchrome-y := openchrome_analog.o \
 		openchrome_clocks.o \
 		openchrome_crtc.o \
 		openchrome_crtc_hw.o \
+		openchrome_cursor.o \
 		openchrome_display.o \
 		openchrome_drv.o \
 		openchrome_encoder.o \
diff --git a/drivers/gpu/drm/openchrome/openchrome_crtc.c b/drivers/gpu/drm/openchrome/openchrome_crtc.c
index d300c862c034..867a9a14d51e 100644
--- a/drivers/gpu/drm/openchrome/openchrome_crtc.c
+++ b/drivers/gpu/drm/openchrome/openchrome_crtc.c
@@ -168,135 +168,6 @@ static void via_iga2_set_color_depth(
 	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
 }
 
-static void openchrome_hide_cursor(struct drm_crtc *crtc)
-{
-	struct drm_device *dev = crtc->dev;
-	struct via_crtc *iga = container_of(crtc, struct via_crtc, base);
-	struct openchrome_drm_private *dev_private =
-						crtc->dev->dev_private;
-	uint32_t temp;
-
-	switch (dev->pdev->device) {
-	case PCI_DEVICE_ID_VIA_PM800:
-	case PCI_DEVICE_ID_VIA_VT3157:
-	case PCI_DEVICE_ID_VIA_VT3343:
-	case PCI_DEVICE_ID_VIA_P4M900:
-	case PCI_DEVICE_ID_VIA_VT1122:
-	case PCI_DEVICE_ID_VIA_VX875:
-	case PCI_DEVICE_ID_VIA_VX900_VGA:
-		if (iga->index) {
-			temp = VIA_READ(HI_CONTROL);
-			VIA_WRITE(HI_CONTROL, temp & 0xFFFFFFFA);
-		} else {
-			temp = VIA_READ(PRIM_HI_CTRL);
-			VIA_WRITE(PRIM_HI_CTRL, temp & 0xFFFFFFFA);
-		}
-
-		break;
-	default:
-		temp = VIA_READ(HI_CONTROL);
-		VIA_WRITE(HI_CONTROL, temp & 0xFFFFFFFA);
-		break;
-	}
-}
-
-static void openchrome_show_cursor(struct drm_crtc *crtc)
-{
-	struct drm_device *dev = crtc->dev;
-	struct via_crtc *iga = container_of(crtc, struct via_crtc, base);
-	struct openchrome_drm_private *dev_private =
-						crtc->dev->dev_private;
-
-	switch (dev->pdev->device) {
-	case PCI_DEVICE_ID_VIA_PM800:
-	case PCI_DEVICE_ID_VIA_VT3157:
-	case PCI_DEVICE_ID_VIA_VT3343:
-	case PCI_DEVICE_ID_VIA_P4M900:
-	case PCI_DEVICE_ID_VIA_VT1122:
-	case PCI_DEVICE_ID_VIA_VX875:
-	case PCI_DEVICE_ID_VIA_VX900_VGA:
-		/* Program Hardware Icon (HI) FIFO, foreground, and
-		 * background colors. */
-		if (iga->index) {
-			VIA_WRITE(HI_TRANSPARENT_COLOR, 0x00000000);
-			VIA_WRITE(HI_INVTCOLOR, 0x00FFFFFF);
-			VIA_WRITE(ALPHA_V3_PREFIFO_CONTROL, 0x000E0000);
-			VIA_WRITE(ALPHA_V3_FIFO_CONTROL, 0x0E0F0000);
-		} else {
-			VIA_WRITE(PRIM_HI_TRANSCOLOR, 0x00000000);
-			VIA_WRITE(PRIM_HI_INVTCOLOR, 0x00FFFFFF);
-			VIA_WRITE(V327_HI_INVTCOLOR, 0x00FFFFFF);
-			VIA_WRITE(PRIM_HI_FIFO, 0x0D000D0F);
-		}
-
-		break;
-	default:
-		VIA_WRITE(HI_TRANSPARENT_COLOR, 0x00000000);
-		VIA_WRITE(HI_INVTCOLOR, 0x00FFFFFF);
-		VIA_WRITE(ALPHA_V3_PREFIFO_CONTROL, 0x000E0000);
-		VIA_WRITE(ALPHA_V3_FIFO_CONTROL, 0xE0F0000);
-		break;
-	}
-
-	switch (dev->pdev->device) {
-	case PCI_DEVICE_ID_VIA_PM800:
-	case PCI_DEVICE_ID_VIA_VT3157:
-	case PCI_DEVICE_ID_VIA_VT3343:
-	case PCI_DEVICE_ID_VIA_P4M900:
-	case PCI_DEVICE_ID_VIA_VT1122:
-	case PCI_DEVICE_ID_VIA_VX875:
-	case PCI_DEVICE_ID_VIA_VX900_VGA:
-		/* Turn on Hardware icon Cursor */
-		if (iga->index) {
-			VIA_WRITE(HI_CONTROL, 0xB6000005);
-		} else {
-			VIA_WRITE(PRIM_HI_CTRL, 0x36000005);
-		}
-
-		break;
-	default:
-		if (iga->index) {
-			VIA_WRITE(HI_CONTROL, 0xB6000005);
-		} else {
-			VIA_WRITE(HI_CONTROL, 0x36000005);
-		}
-
-		break;
-	}
-}
-
-static void openchrome_cursor_address(struct drm_crtc *crtc)
-{
-	struct drm_device *dev = crtc->dev;
-	struct via_crtc *iga = container_of(crtc, struct via_crtc, base);
-	struct openchrome_drm_private *dev_private =
-						crtc->dev->dev_private;
-
-	if (!iga->cursor_bo->kmap.bo) {
-		return;
-	}
-
-	switch (dev->pdev->device) {
-	case PCI_DEVICE_ID_VIA_PM800:
-	case PCI_DEVICE_ID_VIA_VT3157:
-	case PCI_DEVICE_ID_VIA_VT3343:
-	case PCI_DEVICE_ID_VIA_P4M900:
-	case PCI_DEVICE_ID_VIA_VT1122:
-	case PCI_DEVICE_ID_VIA_VX875:
-	case PCI_DEVICE_ID_VIA_VX900_VGA:
-		/* Program the HI offset. */
-		if (iga->index) {
-			VIA_WRITE(HI_FBOFFSET, iga->cursor_bo->kmap.bo->offset);
-		} else {
-			VIA_WRITE(PRIM_HI_FBOFFSET, iga->cursor_bo->kmap.bo->offset);
-		}
-		break;
-	default:
-		VIA_WRITE(HI_FBOFFSET, iga->cursor_bo->kmap.bo->offset);
-		break;
-	}
-}
-
 static int via_iga1_gamma_set(struct drm_crtc *crtc,
 				u16 *r, u16 *g, u16 *b,
 				uint32_t size,
@@ -2371,204 +2242,6 @@ static const uint32_t openchrome_primary_formats[] = {
 	DRM_FORMAT_RGB332,
 };
 
-static void openchrome_set_hi_location(struct drm_crtc *crtc,
-					int crtc_x,
-					int crtc_y)
-{
-	struct drm_device *dev = crtc->dev;
-	struct via_crtc *iga = container_of(crtc,
-						struct via_crtc, base);
-	struct openchrome_drm_private *dev_private =
-						crtc->dev->dev_private;
-	uint32_t location_x = 0, location_y = 0;
-	uint32_t offset_x = 0, offset_y = 0;
-
-	if (crtc_x < 0) {
-		offset_x = -crtc_x;
-	} else {
-		location_x = crtc_x;
-	}
-
-	if (crtc_y < 0) {
-		offset_y = -crtc_y;
-	} else {
-		location_y = crtc_y;
-	}
-
-	switch (dev->pdev->device) {
-	case PCI_DEVICE_ID_VIA_PM800:
-	case PCI_DEVICE_ID_VIA_VT3157:
-	case PCI_DEVICE_ID_VIA_VT3343:
-	case PCI_DEVICE_ID_VIA_P4M900:
-	case PCI_DEVICE_ID_VIA_VT1122:
-	case PCI_DEVICE_ID_VIA_VX875:
-	case PCI_DEVICE_ID_VIA_VX900_VGA:
-		if (iga->index) {
-			VIA_WRITE(HI_POSSTART,
-				(((location_x & 0x07ff) << 16) |
-				(location_y & 0x07ff)));
-			VIA_WRITE(HI_CENTEROFFSET,
-				(((offset_x & 0x07ff) << 16) |
-				(offset_y & 0x07ff)));
-		} else {
-			VIA_WRITE(PRIM_HI_POSSTART,
-				(((location_x & 0x07ff) << 16) |
-				(location_y & 0x07ff)));
-			VIA_WRITE(PRIM_HI_CENTEROFFSET,
-				(((offset_x & 0x07ff) << 16) |
-				(offset_y & 0x07ff)));
-		}
-
-		break;
-	default:
-		VIA_WRITE(HI_POSSTART,
-				(((location_x & 0x07ff) << 16) |
-				(location_y & 0x07ff)));
-		VIA_WRITE(HI_CENTEROFFSET,
-				(((offset_x & 0x07ff) << 16) |
-				(offset_y & 0x07ff)));
-		break;
-	}
-}
-
-static int openchrome_cursor_update_plane(struct drm_plane *plane,
-				struct drm_crtc *crtc,
-				struct drm_framebuffer *fb,
-				int crtc_x, int crtc_y,
-				unsigned int crtc_w,
-				unsigned int crtc_h,
-				uint32_t src_x, uint32_t src_y,
-				uint32_t src_w, uint32_t src_h,
-				struct drm_modeset_acquire_ctx *ctx)
-{
-	struct drm_device *dev = plane->dev;
-	struct via_crtc *iga = container_of(crtc, struct via_crtc, base);
-	struct via_framebuffer *via_fb;
-	struct openchrome_bo *user_bo;
-	struct drm_gem_object *gem;
-	uint32_t *user_bo_src, *cursor_dst;
-	bool is_iomem;
-	uint32_t i;
-	uint32_t width, height;
-	uint32_t max_width = 64, max_height = 64;
-	int ret = 0;
-
-	if (!crtc) {
-		DRM_ERROR("Invalid CRTC!\n");
-		ret = -EINVAL;
-		goto exit;
-	}
-
-	if (!crtc->enabled) {
-		DRM_ERROR("CRTC is currently disabled!\n");
-		ret = -EINVAL;
-		goto exit;
-	}
-
-	if (!fb) {
-		DRM_ERROR("Invalid frame buffer!\n");
-		ret = -EINVAL;
-		goto exit;
-	}
-
-	if ((fb->width != 64) || (fb->height != 64)) {
-		DRM_ERROR("Cursor dimensions are expected to be "
-				"64 x 64.\n");
-		ret = -EINVAL;
-		goto exit;
-	}
-
-	if (fb->width != fb->height) {
-		DRM_ERROR("Hardware cursor is expected to have "
-				"square dimensions.\n");
-		ret = -EINVAL;
-		goto exit;
-	}
-
-	if (fb != crtc->cursor->fb) {
-		if ((dev->pdev->device == PCI_DEVICE_ID_VIA_CLE266) ||
-			(dev->pdev->device == PCI_DEVICE_ID_VIA_KM400)) {
-			if ((fb->width == 64) || (fb->height == 64)) {
-				max_width >>= 1;
-				max_height >>= 1;
-			}
-		}
-
-		width = fb->width;
-		height = fb->height;
-
-		via_fb = container_of(fb, struct via_framebuffer, fb);
-		gem = via_fb->gem;
-		user_bo = container_of(gem, struct openchrome_bo, gem);
-		ret = ttm_bo_kmap(&user_bo->ttm_bo, 0,
-					user_bo->ttm_bo.num_pages,
-					&user_bo->kmap);
-		if (ret) {
-			goto exit;
-		}
-
-		user_bo_src = ttm_kmap_obj_virtual(&user_bo->kmap,
-							&is_iomem);
-		cursor_dst =
-			ttm_kmap_obj_virtual(&iga->cursor_bo->kmap,
-						&is_iomem);
-		memset_io(cursor_dst, 0x0,
-				iga->cursor_bo->kmap.bo->mem.size);
-		for (i = 0; i < height; i++) {
-			__iowrite32_copy(cursor_dst, user_bo_src, width);
-			user_bo_src += width;
-			cursor_dst += max_width;
-		}
-
-		ttm_bo_kunmap(&user_bo->kmap);
-
-		openchrome_cursor_address(crtc);
-	} else {
-		crtc->cursor_x = crtc_x;
-		crtc->cursor_y = crtc_y;
-		openchrome_set_hi_location(crtc, crtc_x, crtc_y);
-	}
-
-	openchrome_show_cursor(crtc);
-exit:
-	return ret;
-}
-
-static int openchrome_cursor_disable_plane(struct drm_plane *plane,
-				struct drm_modeset_acquire_ctx *ctx)
-{
-	if (plane->crtc) {
-		openchrome_hide_cursor(plane->crtc);
-	}
-
-	if (plane->fb) {
-		drm_framebuffer_put(plane->fb);
-		plane->fb = NULL;
-	}
-
-	return 0;
-}
-
-static void openchrome_cursor_destroy(struct drm_plane *plane)
-{
-	if (plane->crtc) {
-		openchrome_hide_cursor(plane->crtc);
-	}
-
-	drm_plane_cleanup(plane);
-}
-
-static const struct
-drm_plane_funcs openchrome_cursor_drm_plane_funcs = {
-	.update_plane	= openchrome_cursor_update_plane,
-	.disable_plane	= openchrome_cursor_disable_plane,
-	.destroy	= openchrome_cursor_destroy,
-};
-
-static const uint32_t openchrome_cursor_formats[] = {
-	DRM_FORMAT_ARGB8888
-};
-
 int via_crtc_init(struct drm_device *dev, uint32_t index)
 {
 	struct openchrome_drm_private *dev_private =
@@ -2614,7 +2287,7 @@ int via_crtc_init(struct drm_device *dev, uint32_t index)
 	ret = drm_universal_plane_init(dev, cursor, possible_crtcs,
 			&openchrome_cursor_drm_plane_funcs,
 			openchrome_cursor_formats,
-			ARRAY_SIZE(openchrome_cursor_formats),
+			openchrome_cursor_formats_size,
 			NULL, DRM_PLANE_TYPE_CURSOR, NULL);
 	if (ret) {
 		DRM_ERROR("Failed to initialize a cursor "
diff --git a/drivers/gpu/drm/openchrome/openchrome_cursor.c b/drivers/gpu/drm/openchrome/openchrome_cursor.c
new file mode 100644
index 000000000000..878274ca84fd
--- /dev/null
+++ b/drivers/gpu/drm/openchrome/openchrome_cursor.c
@@ -0,0 +1,385 @@
+/*
+ * Copyright © 2019 Kevin Brace
+ * Copyright 2012 James Simmons <jsimmons at infradead.org>. All Rights Reserved.
+ *
+ * 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.
+ */
+/*
+ * Author(s):
+ *
+ * Kevin Brace <kevinbrace at gmx.com>
+ * James Simmons <jsimmons at infradead.org>
+ */
+
+#include <linux/pci_ids.h>
+
+#include <drm/drm_crtc.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_framebuffer.h>
+#include <drm/drm_mode.h>
+#include <drm/drm_modeset_helper_vtables.h>
+#include <drm/drm_plane.h>
+#include <drm/drm_plane_helper.h>
+
+#include <drm/ttm/ttm_bo_api.h>
+#include <drm/ttm/ttm_bo_driver.h>
+
+#include "openchrome_drv.h"
+
+
+static void openchrome_hide_cursor(struct drm_crtc *crtc)
+{
+	struct drm_device *dev = crtc->dev;
+	struct via_crtc *iga = container_of(crtc,
+					struct via_crtc, base);
+	struct openchrome_drm_private *dev_private =
+					crtc->dev->dev_private;
+	uint32_t temp;
+
+	switch (dev->pdev->device) {
+	case PCI_DEVICE_ID_VIA_PM800:
+	case PCI_DEVICE_ID_VIA_VT3157:
+	case PCI_DEVICE_ID_VIA_VT3343:
+	case PCI_DEVICE_ID_VIA_P4M900:
+	case PCI_DEVICE_ID_VIA_VT1122:
+	case PCI_DEVICE_ID_VIA_VX875:
+	case PCI_DEVICE_ID_VIA_VX900_VGA:
+		if (iga->index) {
+			temp = VIA_READ(HI_CONTROL);
+			VIA_WRITE(HI_CONTROL, temp & 0xFFFFFFFA);
+		} else {
+			temp = VIA_READ(PRIM_HI_CTRL);
+			VIA_WRITE(PRIM_HI_CTRL, temp & 0xFFFFFFFA);
+		}
+
+		break;
+	default:
+		temp = VIA_READ(HI_CONTROL);
+		VIA_WRITE(HI_CONTROL, temp & 0xFFFFFFFA);
+		break;
+	}
+}
+
+static void openchrome_show_cursor(struct drm_crtc *crtc)
+{
+	struct drm_device *dev = crtc->dev;
+	struct via_crtc *iga = container_of(crtc,
+					struct via_crtc, base);
+	struct openchrome_drm_private *dev_private =
+					crtc->dev->dev_private;
+
+	switch (dev->pdev->device) {
+	case PCI_DEVICE_ID_VIA_PM800:
+	case PCI_DEVICE_ID_VIA_VT3157:
+	case PCI_DEVICE_ID_VIA_VT3343:
+	case PCI_DEVICE_ID_VIA_P4M900:
+	case PCI_DEVICE_ID_VIA_VT1122:
+	case PCI_DEVICE_ID_VIA_VX875:
+	case PCI_DEVICE_ID_VIA_VX900_VGA:
+		/* Program Hardware Icon (HI) FIFO, foreground, and
+		 * background colors. */
+		if (iga->index) {
+			VIA_WRITE(HI_TRANSPARENT_COLOR, 0x00000000);
+			VIA_WRITE(HI_INVTCOLOR, 0x00FFFFFF);
+			VIA_WRITE(ALPHA_V3_PREFIFO_CONTROL,
+							0x000E0000);
+			VIA_WRITE(ALPHA_V3_FIFO_CONTROL, 0x0E0F0000);
+		} else {
+			VIA_WRITE(PRIM_HI_TRANSCOLOR, 0x00000000);
+			VIA_WRITE(PRIM_HI_INVTCOLOR, 0x00FFFFFF);
+			VIA_WRITE(V327_HI_INVTCOLOR, 0x00FFFFFF);
+			VIA_WRITE(PRIM_HI_FIFO, 0x0D000D0F);
+		}
+
+		break;
+	default:
+		VIA_WRITE(HI_TRANSPARENT_COLOR, 0x00000000);
+		VIA_WRITE(HI_INVTCOLOR, 0x00FFFFFF);
+		VIA_WRITE(ALPHA_V3_PREFIFO_CONTROL, 0x000E0000);
+		VIA_WRITE(ALPHA_V3_FIFO_CONTROL, 0xE0F0000);
+		break;
+	}
+
+	switch (dev->pdev->device) {
+	case PCI_DEVICE_ID_VIA_PM800:
+	case PCI_DEVICE_ID_VIA_VT3157:
+	case PCI_DEVICE_ID_VIA_VT3343:
+	case PCI_DEVICE_ID_VIA_P4M900:
+	case PCI_DEVICE_ID_VIA_VT1122:
+	case PCI_DEVICE_ID_VIA_VX875:
+	case PCI_DEVICE_ID_VIA_VX900_VGA:
+		/* Turn on Hardware icon Cursor */
+		if (iga->index) {
+			VIA_WRITE(HI_CONTROL, 0xB6000005);
+		} else {
+			VIA_WRITE(PRIM_HI_CTRL, 0x36000005);
+		}
+
+		break;
+	default:
+		if (iga->index) {
+			VIA_WRITE(HI_CONTROL, 0xB6000005);
+		} else {
+			VIA_WRITE(HI_CONTROL, 0x36000005);
+		}
+
+		break;
+	}
+}
+
+static void openchrome_cursor_address(struct drm_crtc *crtc)
+{
+	struct drm_device *dev = crtc->dev;
+	struct via_crtc *iga = container_of(crtc,
+					struct via_crtc, base);
+	struct openchrome_drm_private *dev_private =
+					crtc->dev->dev_private;
+
+	if (!iga->cursor_bo->kmap.bo) {
+		return;
+	}
+
+	switch (dev->pdev->device) {
+	case PCI_DEVICE_ID_VIA_PM800:
+	case PCI_DEVICE_ID_VIA_VT3157:
+	case PCI_DEVICE_ID_VIA_VT3343:
+	case PCI_DEVICE_ID_VIA_P4M900:
+	case PCI_DEVICE_ID_VIA_VT1122:
+	case PCI_DEVICE_ID_VIA_VX875:
+	case PCI_DEVICE_ID_VIA_VX900_VGA:
+		/* Program the HI offset. */
+		if (iga->index) {
+			VIA_WRITE(HI_FBOFFSET,
+				iga->cursor_bo->kmap.bo->offset);
+		} else {
+			VIA_WRITE(PRIM_HI_FBOFFSET,
+				iga->cursor_bo->kmap.bo->offset);
+		}
+		break;
+	default:
+		VIA_WRITE(HI_FBOFFSET,
+				iga->cursor_bo->kmap.bo->offset);
+		break;
+	}
+}
+
+static void openchrome_set_hi_location(struct drm_crtc *crtc,
+					int crtc_x,
+					int crtc_y)
+{
+	struct drm_device *dev = crtc->dev;
+	struct via_crtc *iga = container_of(crtc,
+					struct via_crtc, base);
+	struct openchrome_drm_private *dev_private =
+					crtc->dev->dev_private;
+	uint32_t location_x = 0, location_y = 0;
+	uint32_t offset_x = 0, offset_y = 0;
+
+	if (crtc_x < 0) {
+		offset_x = -crtc_x;
+	} else {
+		location_x = crtc_x;
+	}
+
+	if (crtc_y < 0) {
+		offset_y = -crtc_y;
+	} else {
+		location_y = crtc_y;
+	}
+
+	switch (dev->pdev->device) {
+	case PCI_DEVICE_ID_VIA_PM800:
+	case PCI_DEVICE_ID_VIA_VT3157:
+	case PCI_DEVICE_ID_VIA_VT3343:
+	case PCI_DEVICE_ID_VIA_P4M900:
+	case PCI_DEVICE_ID_VIA_VT1122:
+	case PCI_DEVICE_ID_VIA_VX875:
+	case PCI_DEVICE_ID_VIA_VX900_VGA:
+		if (iga->index) {
+			VIA_WRITE(HI_POSSTART,
+				(((location_x & 0x07ff) << 16) |
+				(location_y & 0x07ff)));
+			VIA_WRITE(HI_CENTEROFFSET,
+				(((offset_x & 0x07ff) << 16) |
+				(offset_y & 0x07ff)));
+		} else {
+			VIA_WRITE(PRIM_HI_POSSTART,
+				(((location_x & 0x07ff) << 16) |
+				(location_y & 0x07ff)));
+			VIA_WRITE(PRIM_HI_CENTEROFFSET,
+				(((offset_x & 0x07ff) << 16) |
+				(offset_y & 0x07ff)));
+		}
+
+		break;
+	default:
+		VIA_WRITE(HI_POSSTART,
+				(((location_x & 0x07ff) << 16) |
+				(location_y & 0x07ff)));
+		VIA_WRITE(HI_CENTEROFFSET,
+				(((offset_x & 0x07ff) << 16) |
+				(offset_y & 0x07ff)));
+		break;
+	}
+}
+
+static int openchrome_cursor_update_plane(struct drm_plane *plane,
+				struct drm_crtc *crtc,
+				struct drm_framebuffer *fb,
+				int crtc_x, int crtc_y,
+				unsigned int crtc_w,
+				unsigned int crtc_h,
+				uint32_t src_x, uint32_t src_y,
+				uint32_t src_w, uint32_t src_h,
+				struct drm_modeset_acquire_ctx *ctx)
+{
+	struct drm_device *dev = plane->dev;
+	struct via_crtc *iga = container_of(crtc,
+					struct via_crtc, base);
+	struct via_framebuffer *via_fb;
+	struct openchrome_bo *user_bo;
+	struct drm_gem_object *gem;
+	uint32_t *user_bo_src, *cursor_dst;
+	bool is_iomem;
+	uint32_t i;
+	uint32_t width, height;
+	uint32_t max_width = 64, max_height = 64;
+	int ret = 0;
+
+	if (!crtc) {
+		DRM_ERROR("Invalid CRTC!\n");
+		ret = -EINVAL;
+		goto exit;
+	}
+
+	if (!crtc->enabled) {
+		DRM_ERROR("CRTC is currently disabled!\n");
+		ret = -EINVAL;
+		goto exit;
+	}
+
+	if (!fb) {
+		DRM_ERROR("Invalid frame buffer!\n");
+		ret = -EINVAL;
+		goto exit;
+	}
+
+	if ((fb->width != 64) || (fb->height != 64)) {
+		DRM_ERROR("Cursor dimensions are expected to be "
+				"64 x 64.\n");
+		ret = -EINVAL;
+		goto exit;
+	}
+
+	if (fb->width != fb->height) {
+		DRM_ERROR("Hardware cursor is expected to have "
+				"square dimensions.\n");
+		ret = -EINVAL;
+		goto exit;
+	}
+
+	if (fb != crtc->cursor->fb) {
+		if ((dev->pdev->device == PCI_DEVICE_ID_VIA_CLE266) ||
+		(dev->pdev->device == PCI_DEVICE_ID_VIA_KM400)) {
+			if ((fb->width == 64) || (fb->height == 64)) {
+				max_width >>= 1;
+				max_height >>= 1;
+			}
+		}
+
+		width = fb->width;
+		height = fb->height;
+
+		via_fb = container_of(fb, struct via_framebuffer, fb);
+		gem = via_fb->gem;
+		user_bo = container_of(gem, struct openchrome_bo, gem);
+		ret = ttm_bo_kmap(&user_bo->ttm_bo, 0,
+					user_bo->ttm_bo.num_pages,
+					&user_bo->kmap);
+		if (ret) {
+			goto exit;
+		}
+
+		user_bo_src = ttm_kmap_obj_virtual(&user_bo->kmap,
+							&is_iomem);
+		cursor_dst =
+			ttm_kmap_obj_virtual(&iga->cursor_bo->kmap,
+						&is_iomem);
+		memset_io(cursor_dst, 0x0,
+				iga->cursor_bo->kmap.bo->mem.size);
+		for (i = 0; i < height; i++) {
+			__iowrite32_copy(cursor_dst, user_bo_src,
+						width);
+			user_bo_src += width;
+			cursor_dst += max_width;
+		}
+
+		ttm_bo_kunmap(&user_bo->kmap);
+
+		openchrome_cursor_address(crtc);
+	} else {
+		crtc->cursor_x = crtc_x;
+		crtc->cursor_y = crtc_y;
+		openchrome_set_hi_location(crtc, crtc_x, crtc_y);
+	}
+
+	openchrome_show_cursor(crtc);
+exit:
+	return ret;
+}
+
+static int openchrome_cursor_disable_plane(struct drm_plane *plane,
+				struct drm_modeset_acquire_ctx *ctx)
+{
+	if (plane->crtc) {
+		openchrome_hide_cursor(plane->crtc);
+	}
+
+	if (plane->fb) {
+		drm_framebuffer_put(plane->fb);
+		plane->fb = NULL;
+	}
+
+	return 0;
+}
+
+static void openchrome_cursor_destroy(struct drm_plane *plane)
+{
+	if (plane->crtc) {
+		openchrome_hide_cursor(plane->crtc);
+	}
+
+	drm_plane_cleanup(plane);
+}
+
+const struct drm_plane_funcs openchrome_cursor_drm_plane_funcs = {
+	.update_plane	= openchrome_cursor_update_plane,
+	.disable_plane	= openchrome_cursor_disable_plane,
+	.destroy	= openchrome_cursor_destroy,
+};
+
+const uint32_t openchrome_cursor_formats[] = {
+	DRM_FORMAT_ARGB8888,
+};
+
+const unsigned int openchrome_cursor_formats_size =
+				ARRAY_SIZE(openchrome_cursor_formats);
diff --git a/drivers/gpu/drm/openchrome/openchrome_drv.h b/drivers/gpu/drm/openchrome/openchrome_drv.h
index 349453078091..26c51025ff4c 100644
--- a/drivers/gpu/drm/openchrome/openchrome_drv.h
+++ b/drivers/gpu/drm/openchrome/openchrome_drv.h
@@ -38,6 +38,7 @@
 
 #include <drm/drm_gem.h>
 #include <drm/drm_ioctl.h>
+#include <drm/drm_plane.h>
 
 #include "ttm/ttm_bo_api.h"
 #include "ttm/ttm_bo_driver.h"
@@ -311,4 +312,8 @@ void openchrome_transmitter_display_source(
 			struct openchrome_drm_private *dev_private,
 			u32 di_port, int index);
 
+extern const struct drm_plane_funcs openchrome_cursor_drm_plane_funcs;
+extern const uint32_t openchrome_cursor_formats[];
+extern const unsigned int openchrome_cursor_formats_size;
+
 #endif /* _OPENCHROME_DRV_H */
commit 1b5aca04bc5025db104f50df79f220d0f8b16422
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Tue Oct 15 17:19:55 2019 -0700

    drm/openchrome: Rename via_cursor_address() to openchrome_cursor_address()
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/openchrome_crtc.c b/drivers/gpu/drm/openchrome/openchrome_crtc.c
index 9e9fb0bbf3cd..d300c862c034 100644
--- a/drivers/gpu/drm/openchrome/openchrome_crtc.c
+++ b/drivers/gpu/drm/openchrome/openchrome_crtc.c
@@ -265,7 +265,7 @@ static void openchrome_show_cursor(struct drm_crtc *crtc)
 	}
 }
 
-static void via_cursor_address(struct drm_crtc *crtc)
+static void openchrome_cursor_address(struct drm_crtc *crtc)
 {
 	struct drm_device *dev = crtc->dev;
 	struct via_crtc *iga = container_of(crtc, struct via_crtc, base);
@@ -2522,7 +2522,7 @@ static int openchrome_cursor_update_plane(struct drm_plane *plane,
 
 		ttm_bo_kunmap(&user_bo->kmap);
 
-		via_cursor_address(crtc);
+		openchrome_cursor_address(crtc);
 	} else {
 		crtc->cursor_x = crtc_x;
 		crtc->cursor_y = crtc_y;
commit e192035ff89293307f86d3ca98da5b4cbb7e6320
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Tue Oct 15 17:17:28 2019 -0700

    drm/openchrome: Rename via_hide_cursor() to openchrome_hide_cursor()
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/openchrome_crtc.c b/drivers/gpu/drm/openchrome/openchrome_crtc.c
index 8c352b49c7d4..9e9fb0bbf3cd 100644
--- a/drivers/gpu/drm/openchrome/openchrome_crtc.c
+++ b/drivers/gpu/drm/openchrome/openchrome_crtc.c
@@ -168,7 +168,7 @@ static void via_iga2_set_color_depth(
 	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
 }
 
-static void via_hide_cursor(struct drm_crtc *crtc)
+static void openchrome_hide_cursor(struct drm_crtc *crtc)
 {
 	struct drm_device *dev = crtc->dev;
 	struct via_crtc *iga = container_of(crtc, struct via_crtc, base);
@@ -2538,7 +2538,7 @@ static int openchrome_cursor_disable_plane(struct drm_plane *plane,
 				struct drm_modeset_acquire_ctx *ctx)
 {
 	if (plane->crtc) {
-		via_hide_cursor(plane->crtc);
+		openchrome_hide_cursor(plane->crtc);
 	}
 
 	if (plane->fb) {
@@ -2552,7 +2552,7 @@ static int openchrome_cursor_disable_plane(struct drm_plane *plane,
 static void openchrome_cursor_destroy(struct drm_plane *plane)
 {
 	if (plane->crtc) {
-		via_hide_cursor(plane->crtc);
+		openchrome_hide_cursor(plane->crtc);
 	}
 
 	drm_plane_cleanup(plane);
commit 4d8653644a65845882b0df98c193980a9b0c348d
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Tue Oct 15 17:07:19 2019 -0700

    drm/openchrome: Rename via_show_cursor() to openchrome_show_cursor()
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/openchrome_crtc.c b/drivers/gpu/drm/openchrome/openchrome_crtc.c
index 795368e68fd6..8c352b49c7d4 100644
--- a/drivers/gpu/drm/openchrome/openchrome_crtc.c
+++ b/drivers/gpu/drm/openchrome/openchrome_crtc.c
@@ -200,7 +200,7 @@ static void via_hide_cursor(struct drm_crtc *crtc)
 	}
 }
 
-static void via_show_cursor(struct drm_crtc *crtc)
+static void openchrome_show_cursor(struct drm_crtc *crtc)
 {
 	struct drm_device *dev = crtc->dev;
 	struct via_crtc *iga = container_of(crtc, struct via_crtc, base);
@@ -2529,7 +2529,7 @@ static int openchrome_cursor_update_plane(struct drm_plane *plane,
 		openchrome_set_hi_location(crtc, crtc_x, crtc_y);
 	}
 
-	via_show_cursor(crtc);
+	openchrome_show_cursor(crtc);
 exit:
 	return ret;
 }
commit 6b39e5a08e9731f19bc92748b539b439b1a05800
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Tue Oct 15 17:04:00 2019 -0700

    drm/openchrome: Stop accessing hardware cursor from mode setting callbacks
    
    Since cursor plane is now in use, hardware cursor should not be accessed
    from primary plane related mode setting callbacks.
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/openchrome_crtc.c b/drivers/gpu/drm/openchrome/openchrome_crtc.c
index 5dbe22f9fcf0..795368e68fd6 100644
--- a/drivers/gpu/drm/openchrome/openchrome_crtc.c
+++ b/drivers/gpu/drm/openchrome/openchrome_crtc.c
@@ -1750,9 +1750,6 @@ via_iga1_crtc_disable(struct drm_crtc *crtc)
 {
 	DRM_DEBUG_KMS("Entered %s.\n", __func__);
 
-	/* Turn off the cursor */
-	via_hide_cursor(crtc);
-
 	via_iga1_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
 
 	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
@@ -1957,12 +1954,6 @@ via_iga1_crtc_mode_set(struct drm_crtc *crtc,
 	}
 
 	ret = via_iga1_crtc_mode_set_base(crtc, x, y, fb);
-
-	/* Specify the cursor pattern. */
-	via_cursor_address(crtc);
-
-	/* Turn off the cursor. */
-	via_hide_cursor(crtc);
 exit:
 	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
 	return ret;
@@ -2057,9 +2048,6 @@ via_iga2_crtc_disable(struct drm_crtc *crtc)
 {
 	DRM_DEBUG_KMS("Entered %s.\n", __func__);
 
-	/* Turn off the cursor */
-	via_hide_cursor(crtc);
-
 	via_iga2_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
 
 	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
@@ -2295,12 +2283,6 @@ via_iga2_crtc_mode_set(struct drm_crtc *crtc,
 	}
 
 	ret = via_iga2_crtc_mode_set_base(crtc, x, y, fb);
-
-	/* Specify the cursor pattern. */
-	via_cursor_address(crtc);
-
-	/* Turn off the cursor. */
-	via_hide_cursor(crtc);
 exit:
 	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
 	return ret;


More information about the openchrome-devel mailing list