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

Kevin Brace kevinbrace at kemper.freedesktop.org
Sat Oct 19 15:16:25 UTC 2019


 drivers/gpu/drm/openchrome/openchrome_crtc.c |  980 ++++++++++++---------------
 drivers/gpu/drm/openchrome/openchrome_drv.h  |    2 
 2 files changed, 438 insertions(+), 544 deletions(-)

New commits:
commit 166c1950bae86a2a45220fd6b9eb71f441363bc3
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Sat Oct 19 08:15:54 2019 -0700

    drm/openchrome: Consolidate mode fixup code
    
    It is being merged into openchrome_crtc_mode_fixup().
    
    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 7c1bffd25412..e3f8de6b4471 100644
--- a/drivers/gpu/drm/openchrome/openchrome_crtc.c
+++ b/drivers/gpu/drm/openchrome/openchrome_crtc.c
@@ -1582,6 +1582,16 @@ drm_mode_crtc_load_lut(struct drm_crtc *crtc)
 	}
 }
 
+static bool openchrome_crtc_mode_fixup(struct drm_crtc *crtc,
+				const struct drm_display_mode *mode,
+				struct drm_display_mode *adjusted_mode)
+{
+	DRM_DEBUG_KMS("Entered %s.\n", __func__);
+
+	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
+	return true;
+}
+
 static int openchrome_crtc_mode_set_base(struct drm_crtc *crtc,
 					int x, int y,
 					struct drm_framebuffer *old_fb)
@@ -2022,17 +2032,6 @@ via_iga1_crtc_commit(struct drm_crtc *crtc)
 	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
 }
 
-static bool
-via_iga1_crtc_mode_fixup(struct drm_crtc *crtc,
-				const struct drm_display_mode *mode,
-				struct drm_display_mode *adjusted_mode)
-{
-	DRM_DEBUG_KMS("Entered %s.\n", __func__);
-
-	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
-	return true;
-}
-
 static void
 via_iga2_crtc_dpms(struct drm_crtc *crtc, int mode)
 {
@@ -2099,24 +2098,13 @@ via_iga2_crtc_commit(struct drm_crtc *crtc)
 	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
 }
 
-static bool
-via_iga2_crtc_mode_fixup(struct drm_crtc *crtc,
-				const struct drm_display_mode *mode,
-				struct drm_display_mode *adjusted_mode)
-{
-	DRM_DEBUG_KMS("Entered %s.\n", __func__);
-
-	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
-	return true;
-}
-
 static const struct
 drm_crtc_helper_funcs openchrome_iga1_drm_crtc_helper_funcs = {
 	.dpms = via_iga1_crtc_dpms,
 	.disable = via_iga1_crtc_disable,
 	.prepare = via_iga1_crtc_prepare,
 	.commit = via_iga1_crtc_commit,
-	.mode_fixup = via_iga1_crtc_mode_fixup,
+	.mode_fixup = openchrome_crtc_mode_fixup,
 	.mode_set = openchrome_crtc_mode_set,
 	.mode_set_base_atomic = openchrome_crtc_mode_set_base_atomic,
 };
@@ -2127,7 +2115,7 @@ drm_crtc_helper_funcs openchrome_iga2_drm_crtc_helper_funcs = {
 	.disable = via_iga2_crtc_disable,
 	.prepare = via_iga2_crtc_prepare,
 	.commit = via_iga2_crtc_commit,
-	.mode_fixup = via_iga2_crtc_mode_fixup,
+	.mode_fixup = openchrome_crtc_mode_fixup,
 	.mode_set = openchrome_crtc_mode_set,
 	.mode_set_base_atomic = openchrome_crtc_mode_set_base_atomic,
 };
commit 0fa5ca600bae4ded73890821352859f24453a36f
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Sat Oct 19 08:15:36 2019 -0700

    drm/openchrome: Consolidate mode set code
    
    It is being merged into openchrome_crtc_mode_set().
    
    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 31c62ce0b2e6..7c1bffd25412 100644
--- a/drivers/gpu/drm/openchrome/openchrome_crtc.c
+++ b/drivers/gpu/drm/openchrome/openchrome_crtc.c
@@ -1663,6 +1663,211 @@ exit:
 	return ret;
 }
 
+static int openchrome_crtc_mode_set(struct drm_crtc *crtc,
+				struct drm_display_mode *mode,
+				struct drm_display_mode *adjusted_mode,
+				int x, int y,
+				struct drm_framebuffer *fb)
+{
+	struct via_crtc *iga = container_of(crtc,
+						struct via_crtc, base);
+	struct openchrome_drm_private *dev_private =
+						crtc->dev->dev_private;
+	struct drm_device *dev = crtc->dev;
+	u8 reg_value = 0;
+	int ret;
+
+	DRM_DEBUG_KMS("Entered %s.\n", __func__);
+
+	if (!iga->index) {
+		/* Load standard registers */
+		via_load_vpit_regs(dev_private);
+
+		/* Unlock */
+		via_unlock_crtc(VGABASE, dev->pdev->device);
+
+		/* IGA1 reset */
+		vga_wcrt(VGABASE, 0x09, 0x00); /* initial CR09=0 */
+		svga_wcrt_mask(VGABASE, 0x11, 0x00, BIT(6));
+
+		/* disable IGA scales first */
+		via_disable_iga_scaling(crtc);
+
+		/*
+		 * when not down scaling, we only need load one
+		 * timing.
+		 */
+		via_load_crtc_timing(iga, adjusted_mode);
+
+		switch (adjusted_mode->crtc_htotal % 8) {
+		case 0:
+		default:
+			break;
+		case 2:
+			reg_value = BIT(7);
+			break;
+		case 4:
+			reg_value = BIT(6);
+			break;
+		case 6:
+			reg_value = BIT(3);
+			break;
+		}
+
+		svga_wcrt_mask(VGABASE, 0x47,
+				reg_value, BIT(7) | BIT(6) | BIT(3));
+
+		/* Relock */
+		via_lock_crtc(VGABASE);
+
+		/* Set non-interlace / interlace mode. */
+		via_iga1_set_interlace_mode(VGABASE,
+					adjusted_mode->flags &
+					DRM_MODE_FLAG_INTERLACE);
+
+		/* No HSYNC shift. */
+		via_iga1_set_hsync_shift(VGABASE, 0x05);
+
+		/* Load display FIFO. */
+		ret = via_iga1_display_fifo_regs(dev, dev_private,
+						iga, adjusted_mode,
+						crtc->primary->fb);
+		if (ret) {
+			goto exit;
+		}
+
+		/* Set PLL */
+		if (adjusted_mode->clock) {
+			u32 clock = adjusted_mode->clock * 1000;
+			u32 pll_regs;
+
+			if (iga->scaling_mode & VIA_SHRINK)
+				clock *= 2;
+			pll_regs = via_get_clk_value(crtc->dev, clock);
+			via_set_vclock(crtc, pll_regs);
+		}
+	} else {
+		/* Load standard registers */
+		via_load_vpit_regs(dev_private);
+
+		/* Unlock */
+		via_unlock_crtc(VGABASE, dev->pdev->device);
+
+		/* disable IGA scales first */
+		via_disable_iga_scaling(crtc);
+
+		/* Load crtc timing and IGA scaling */
+		if (iga->scaling_mode & VIA_SHRINK) {
+			/*
+			 * enable IGA2 down scaling and set
+			 * Interpolation
+			 */
+			via_set_iga_scale_function(crtc, VIA_SHRINK);
+
+			/* load hor and ver downscaling factor */
+			/*
+			 * interlace modes scaling support(example
+			 * 1080I): we should use mode->crtc_vdisplay
+			 * here, because crtc_vdisplay=540,
+			 * vdisplay=1080, we need 540 here, not 1080.
+			 */
+			via_load_iga_scale_factor_regs(dev_private,
+							mode,
+							adjusted_mode,
+							VIA_SHRINK,
+							HOR_VER_SCALE);
+			/* load src timing to timing registers */
+			/*
+			 * interlace modes scaling support(example
+			 * 1080I): we should use mode->crtc_vdisplay
+			 * here, because crtc_vdisplay=540,
+			 * vdisplay=1080, we need 540 here, not 1080.
+			 */
+			via_set_iga2_downscale_source_timing(crtc,
+							mode,
+							adjusted_mode);
+
+			/* Download dst timing */
+			via_set_scale_path(crtc, VIA_SHRINK);
+			via_load_crtc_timing(iga, adjusted_mode);
+			/*
+			 * very necessary to set IGA to none scaling
+			 * status need to fix why so need.
+			 */
+			via_set_scale_path(crtc, VIA_NO_SCALING);
+		} else {
+			/*
+			 * when not down scaling, we only need load
+			 * one timing.
+			 */
+			via_load_crtc_timing(iga, adjusted_mode);
+
+			/* II. up scaling */
+			if (iga->scaling_mode & VIA_EXPAND) {
+				/* Horizontal scaling */
+				if (iga->scaling_mode &
+					VIA_HOR_EXPAND) {
+					via_set_iga_scale_function(
+						crtc,
+						VIA_HOR_EXPAND);
+					via_load_iga_scale_factor_regs(
+							dev_private,
+							mode,
+							adjusted_mode,
+							VIA_EXPAND,
+							HOR_SCALE);
+				}
+
+				/* Vertical scaling */
+				if (iga->scaling_mode &
+					VIA_VER_EXPAND) {
+					via_set_iga_scale_function(
+							crtc,
+							VIA_VER_EXPAND);
+					via_load_iga_scale_factor_regs(
+							dev_private,
+							mode,
+							adjusted_mode,
+							VIA_EXPAND,
+							VER_SCALE);
+				}
+			}
+		}
+
+		/* Relock */
+		via_lock_crtc(VGABASE);
+
+		/* Set non-interlace / interlace mode. */
+		via_iga2_set_interlace_mode(VGABASE,
+					adjusted_mode->flags &
+					DRM_MODE_FLAG_INTERLACE);
+
+		/* Load display FIFO. */
+		ret = via_iga2_display_fifo_regs(dev, dev_private,
+						iga, adjusted_mode,
+						crtc->primary->fb);
+		if (ret) {
+			goto exit;
+		}
+
+		/* Set PLL */
+		if (adjusted_mode->clock) {
+			u32 clock = adjusted_mode->clock * 1000;
+			u32 pll_regs;
+
+			if (iga->scaling_mode & VIA_SHRINK)
+				clock *= 2;
+			pll_regs = via_get_clk_value(crtc->dev, clock);
+			via_set_vclock(crtc, pll_regs);
+		}
+	}
+
+	ret = openchrome_crtc_mode_set_base(crtc, x, y, fb);
+exit:
+	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
+	return ret;
+}
+
 static int openchrome_crtc_mode_set_base_atomic(struct drm_crtc *crtc,
 					struct drm_framebuffer *fb,
 					int x, int y,
@@ -1828,95 +2033,6 @@ via_iga1_crtc_mode_fixup(struct drm_crtc *crtc,
 	return true;
 }
 
-static int
-via_iga1_crtc_mode_set(struct drm_crtc *crtc,
-			struct drm_display_mode *mode,
-			struct drm_display_mode *adjusted_mode,
-			int x, int y, struct drm_framebuffer *fb)
-{
-	struct via_crtc *iga = container_of(crtc, struct via_crtc, base);
-	struct openchrome_drm_private *dev_private =
-						crtc->dev->dev_private;
-	struct drm_device *dev = crtc->dev;
-	u8 reg_value = 0;
-	int ret;
-
-	DRM_DEBUG_KMS("Entered %s.\n", __func__);
-
-	/* Check for IGA2. */
-	if (iga->index) {
-		DRM_ERROR("Wrong display controller (CRTC) selection.");
-		ret = -EINVAL;
-		goto exit;
-	}
-
-	/* Load standard registers */
-	via_load_vpit_regs(dev_private);
-
-	/* Unlock */
-	via_unlock_crtc(VGABASE, dev->pdev->device);
-
-	/* IGA1 reset */
-	vga_wcrt(VGABASE, 0x09, 0x00); /* initial CR09=0 */
-	svga_wcrt_mask(VGABASE, 0x11, 0x00, BIT(6));
-
-	/* disable IGA scales first */
-	via_disable_iga_scaling(crtc);
-
-	/* when not down scaling, we only need load one timing. */
-	via_load_crtc_timing(iga, adjusted_mode);
-
-	switch (adjusted_mode->crtc_htotal % 8) {
-	case 0:
-	default:
-		break;
-	case 2:
-		reg_value = BIT(7);
-		break;
-	case 4:
-		reg_value = BIT(6);
-		break;
-	case 6:
-		reg_value = BIT(3);
-		break;
-	}
-
-	svga_wcrt_mask(VGABASE, 0x47, reg_value, BIT(7) | BIT(6) | BIT(3));
-
-	/* Relock */
-	via_lock_crtc(VGABASE);
-
-	/* Set non-interlace / interlace mode. */
-	via_iga1_set_interlace_mode(VGABASE,
-			adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE);
-
-	/* No HSYNC shift. */
-	via_iga1_set_hsync_shift(VGABASE, 0x05);
-
-	/* Load display FIFO. */
-	ret = via_iga1_display_fifo_regs(dev, dev_private, iga,
-						adjusted_mode,
-						crtc->primary->fb);
-	if (ret) {
-		goto exit;
-	}
-
-	/* Set PLL */
-	if (adjusted_mode->clock) {
-		u32 clock = adjusted_mode->clock * 1000, pll_regs;
-
-		if (iga->scaling_mode & VIA_SHRINK)
-			clock *= 2;
-		pll_regs = via_get_clk_value(crtc->dev, clock);
-		via_set_vclock(crtc, pll_regs);
-	}
-
-	ret = openchrome_crtc_mode_set_base(crtc, x, y, fb);
-exit:
-	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
-	return ret;
-}
-
 static void
 via_iga2_crtc_dpms(struct drm_crtc *crtc, int mode)
 {
@@ -1994,127 +2110,6 @@ via_iga2_crtc_mode_fixup(struct drm_crtc *crtc,
 	return true;
 }
 
-static int
-via_iga2_crtc_mode_set(struct drm_crtc *crtc,
-			struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode,
-			int x, int y, struct drm_framebuffer *fb)
-{
-	struct via_crtc *iga = container_of(crtc, struct via_crtc, base);
-	struct openchrome_drm_private *dev_private =
-						crtc->dev->dev_private;
-	struct drm_device *dev = crtc->dev;
-	int ret;
-
-	DRM_DEBUG_KMS("Entered %s.\n", __func__);
-
-	/* Check for IGA1. */
-	if (!iga->index) {
-		DRM_ERROR("Wrong display controller (CRTC) selection.");
-		ret = -EINVAL;
-		goto exit;
-	}
-
-	/* Load standard registers */
-	via_load_vpit_regs(dev_private);
-
-	/* Unlock */
-	via_unlock_crtc(VGABASE, dev->pdev->device);
-
-	/* disable IGA scales first */
-	via_disable_iga_scaling(crtc);
-
-	/* Load crtc timing and IGA scaling */
-	if (iga->scaling_mode & VIA_SHRINK) {
-		/* enable IGA2 down scaling and set Interpolation */
-		via_set_iga_scale_function(crtc, VIA_SHRINK);
-
-		/* load hor and ver downscaling factor */
-		/**
-		 * interlace modes scaling support(example 1080I):
-		 * we should use mode->crtc_vdisplay here,
-		 * because crtc_vdisplay=540, vdisplay=1080,
-		 * we need 540 here, not 1080.
-		 */
-		via_load_iga_scale_factor_regs(dev_private,
-						mode, adjusted_mode,
-						VIA_SHRINK,
-						HOR_VER_SCALE);
-		/* load src timing to timing registers */
-		/**
-		 * interlace modes scaling support(example 1080I):
-		 * we should use mode->crtc_vdisplay here,
-		 * because crtc_vdisplay=540, vdisplay=1080,
-		 * we need 540 here, not 1080.
-		 */
-		via_set_iga2_downscale_source_timing(crtc, mode, adjusted_mode);
-
-		/* Download dst timing */
-		via_set_scale_path(crtc, VIA_SHRINK);
-		via_load_crtc_timing(iga, adjusted_mode);
-		/* very necessary to set IGA to none scaling status */
-		/* need to fix why so need. */
-		via_set_scale_path(crtc, VIA_NO_SCALING);
-	} else {
-		/* when not down scaling, we only need load one timing. */
-		via_load_crtc_timing(iga, adjusted_mode);
-
-		/* II. up scaling */
-		if (iga->scaling_mode & VIA_EXPAND) {
-			/* Horizontal scaling */
-			if (iga->scaling_mode & VIA_HOR_EXPAND) {
-				via_set_iga_scale_function(crtc,
-							VIA_HOR_EXPAND);
-				via_load_iga_scale_factor_regs(
-						dev_private,
-						mode, adjusted_mode,
-						VIA_EXPAND,
-						HOR_SCALE);
-			}
-
-			/* Vertical scaling */
-			if (iga->scaling_mode & VIA_VER_EXPAND) {
-				via_set_iga_scale_function(crtc,
-							VIA_VER_EXPAND);
-				via_load_iga_scale_factor_regs(
-						dev_private,
-						mode, adjusted_mode,
-						VIA_EXPAND,
-						VER_SCALE);
-			}
-		}
-	}
-
-	/* Relock */
-	via_lock_crtc(VGABASE);
-
-	/* Set non-interlace / interlace mode. */
-	via_iga2_set_interlace_mode(VGABASE,
-			adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE);
-
-	/* Load display FIFO. */
-	ret = via_iga2_display_fifo_regs(dev, dev_private, iga,
-						adjusted_mode,
-						crtc->primary->fb);
-	if (ret) {
-		goto exit;
-	}
-
-	/* Set PLL */
-	if (adjusted_mode->clock) {
-		u32 clock = adjusted_mode->clock * 1000, pll_regs;
-
-		if (iga->scaling_mode & VIA_SHRINK)
-			clock *= 2;
-		pll_regs = via_get_clk_value(crtc->dev, clock);
-		via_set_vclock(crtc, pll_regs);
-	}
-
-	ret = openchrome_crtc_mode_set_base(crtc, x, y, fb);
-exit:
-	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
-	return ret;
-}
-
 static const struct
 drm_crtc_helper_funcs openchrome_iga1_drm_crtc_helper_funcs = {
 	.dpms = via_iga1_crtc_dpms,
@@ -2122,7 +2117,7 @@ drm_crtc_helper_funcs openchrome_iga1_drm_crtc_helper_funcs = {
 	.prepare = via_iga1_crtc_prepare,
 	.commit = via_iga1_crtc_commit,
 	.mode_fixup = via_iga1_crtc_mode_fixup,
-	.mode_set = via_iga1_crtc_mode_set,
+	.mode_set = openchrome_crtc_mode_set,
 	.mode_set_base_atomic = openchrome_crtc_mode_set_base_atomic,
 };
 
@@ -2133,7 +2128,7 @@ drm_crtc_helper_funcs openchrome_iga2_drm_crtc_helper_funcs = {
 	.prepare = via_iga2_crtc_prepare,
 	.commit = via_iga2_crtc_commit,
 	.mode_fixup = via_iga2_crtc_mode_fixup,
-	.mode_set = via_iga2_crtc_mode_set,
+	.mode_set = openchrome_crtc_mode_set,
 	.mode_set_base_atomic = openchrome_crtc_mode_set_base_atomic,
 };
 
commit db13b2ec61ce4ec34900fc2207a52c77fd6d9cef
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Sat Oct 19 08:15:25 2019 -0700

    drm/openchrome: Consolidate mode set base code
    
    It is being merged into openchrome_crtc_mode_set_base().
    
    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 cf9599fe311d..31c62ce0b2e6 100644
--- a/drivers/gpu/drm/openchrome/openchrome_crtc.c
+++ b/drivers/gpu/drm/openchrome/openchrome_crtc.c
@@ -1582,6 +1582,87 @@ drm_mode_crtc_load_lut(struct drm_crtc *crtc)
 	}
 }
 
+static int openchrome_crtc_mode_set_base(struct drm_crtc *crtc,
+					int x, int y,
+					struct drm_framebuffer *old_fb)
+{
+	struct via_framebuffer *via_fb = container_of(
+					crtc->primary->fb,
+					struct via_framebuffer, fb);
+	struct drm_framebuffer *new_fb = &via_fb->fb;
+	struct openchrome_bo *bo;
+	struct drm_gem_object *gem;
+	int ret = 0;
+	int fake_ret = 0;
+
+	DRM_DEBUG_KMS("Entered %s.\n", __func__);
+
+	/* No FB found. */
+	if (!new_fb) {
+		ret = -ENOMEM;
+		DRM_DEBUG_KMS("No FB found.\n");
+		goto exit;
+	}
+
+	gem = via_fb->gem;
+	bo = container_of(gem, struct openchrome_bo, gem);
+
+	ret = ttm_bo_reserve(&bo->ttm_bo, true, false, NULL);
+	if (ret) {
+		DRM_DEBUG_KMS("Failed to reserve FB.\n");
+		goto exit;
+	}
+
+	ret = openchrome_bo_pin(bo, TTM_PL_FLAG_VRAM);
+	ttm_bo_unreserve(&bo->ttm_bo);
+	if (ret) {
+		DRM_DEBUG_KMS("Failed to pin FB.\n");
+		goto exit;
+	}
+
+	ret = crtc->helper_private->mode_set_base_atomic(crtc,
+						new_fb, x, y,
+						ENTER_ATOMIC_MODE_SET);
+	if (unlikely(ret)) {
+		DRM_DEBUG_KMS("Failed to set a new FB.\n");
+		fake_ret = ttm_bo_reserve(&bo->ttm_bo, true, false, NULL);
+		if (fake_ret) {
+			goto exit;
+		}
+
+		fake_ret = openchrome_bo_unpin(bo);
+		ttm_bo_unreserve(&bo->ttm_bo);
+		goto exit;
+	}
+
+	/*
+	 * Free the old framebuffer if it exists.
+	 */
+	if (old_fb) {
+		via_fb = container_of(old_fb,
+					struct via_framebuffer, fb);
+		gem = via_fb->gem;
+		bo = container_of(gem, struct openchrome_bo, gem);
+
+		ret = ttm_bo_reserve(&bo->ttm_bo, true, false, NULL);
+		if (ret) {
+			DRM_DEBUG_KMS("FB still locked.\n");
+			goto exit;
+		}
+
+		ret = openchrome_bo_unpin(bo);
+		ttm_bo_unreserve(&bo->ttm_bo);
+		if (ret) {
+			DRM_DEBUG_KMS("FB still locked.\n");
+			goto exit;
+		}
+	}
+
+exit:
+	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
+	return ret;
+}
+
 static int openchrome_crtc_mode_set_base_atomic(struct drm_crtc *crtc,
 					struct drm_framebuffer *fb,
 					int x, int y,
@@ -1748,86 +1829,6 @@ via_iga1_crtc_mode_fixup(struct drm_crtc *crtc,
 }
 
 static int
-via_iga1_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
-				struct drm_framebuffer *old_fb)
-{
-	struct via_framebuffer *via_fb = container_of(crtc->primary->fb,
-					struct via_framebuffer, fb);
-	struct drm_framebuffer *new_fb = &via_fb->fb;
-	struct openchrome_bo *bo;
-	struct drm_gem_object *gem;
-	int ret = 0;
-	int fake_ret = 0;
-
-	DRM_DEBUG_KMS("Entered %s.\n", __func__);
-
-	/* No FB found. */
-	if (!new_fb) {
-		ret = -ENOMEM;
-		DRM_DEBUG_KMS("No FB found.\n");
-		goto exit;
-	}
-
-	gem = via_fb->gem;
-	bo = container_of(gem, struct openchrome_bo, gem);
-
-	ret = ttm_bo_reserve(&bo->ttm_bo, true, false, NULL);
-	if (ret) {
-		DRM_DEBUG_KMS("Failed to reserve FB.\n");
-		goto exit;
-	}
-
-	ret = openchrome_bo_pin(bo, TTM_PL_FLAG_VRAM);
-	ttm_bo_unreserve(&bo->ttm_bo);
-	if (ret) {
-		DRM_DEBUG_KMS("Failed to pin FB.\n");
-		goto exit;
-	}
-
-	ret = crtc->helper_private->mode_set_base_atomic(crtc,
-						new_fb, x, y,
-						ENTER_ATOMIC_MODE_SET);
-	if (unlikely(ret)) {
-		DRM_DEBUG_KMS("Failed to set a new FB.\n");
-		fake_ret = ttm_bo_reserve(&bo->ttm_bo, true, false, NULL);
-		if (fake_ret) {
-			goto exit;
-		}
-
-		fake_ret = openchrome_bo_unpin(bo);
-		ttm_bo_unreserve(&bo->ttm_bo);
-		goto exit;
-	}
-
-	/*
-	 * Free the old framebuffer if it exists.
-	 */
-	if (old_fb) {
-		via_fb = container_of(old_fb,
-					struct via_framebuffer, fb);
-		gem = via_fb->gem;
-		bo = container_of(gem, struct openchrome_bo, gem);
-
-		ret = ttm_bo_reserve(&bo->ttm_bo, true, false, NULL);
-		if (ret) {
-			DRM_DEBUG_KMS("FB still locked.\n");
-			goto exit;
-		}
-
-		ret = openchrome_bo_unpin(bo);
-		ttm_bo_unreserve(&bo->ttm_bo);
-		if (ret) {
-			DRM_DEBUG_KMS("FB still locked.\n");
-			goto exit;
-		}
-	}
-
-exit:
-	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
-	return ret;
-}
-
-static int
 via_iga1_crtc_mode_set(struct drm_crtc *crtc,
 			struct drm_display_mode *mode,
 			struct drm_display_mode *adjusted_mode,
@@ -1910,7 +1911,7 @@ via_iga1_crtc_mode_set(struct drm_crtc *crtc,
 		via_set_vclock(crtc, pll_regs);
 	}
 
-	ret = via_iga1_crtc_mode_set_base(crtc, x, y, fb);
+	ret = openchrome_crtc_mode_set_base(crtc, x, y, fb);
 exit:
 	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
 	return ret;
@@ -1994,85 +1995,6 @@ via_iga2_crtc_mode_fixup(struct drm_crtc *crtc,
 }
 
 static int
-via_iga2_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
-				struct drm_framebuffer *old_fb)
-{
-	struct via_framebuffer *via_fb = container_of(crtc->primary->fb,
-					struct via_framebuffer, fb);
-	struct drm_framebuffer *new_fb = &via_fb->fb;
-	struct openchrome_bo *bo;
-	struct drm_gem_object *gem;
-	int ret = 0;
-	int fake_ret = 0;
-
-	DRM_DEBUG_KMS("Entered %s.\n", __func__);
-
-	/* No FB found. */
-	if (!new_fb) {
-		ret = -ENOMEM;
-		DRM_DEBUG_KMS("No FB found.\n");
-		goto exit;
-	}
-
-	gem = via_fb->gem;
-	bo = container_of(gem, struct openchrome_bo, gem);
-
-	ret = ttm_bo_reserve(&bo->ttm_bo, true, false, NULL);
-	if (ret) {
-		DRM_DEBUG_KMS("Failed to reserve FB.\n");
-		goto exit;
-	}
-
-	ret = openchrome_bo_pin(bo, TTM_PL_FLAG_VRAM);
-	ttm_bo_unreserve(&bo->ttm_bo);
-	if (ret) {
-		DRM_DEBUG_KMS("Failed to pin FB.\n");
-		goto exit;
-	}
-
-	ret = crtc->helper_private->mode_set_base_atomic(crtc, new_fb, x, y,
-			ENTER_ATOMIC_MODE_SET);
-	if (unlikely(ret)) {
-		DRM_DEBUG_KMS("Failed to set a new FB.\n");
-		fake_ret = ttm_bo_reserve(&bo->ttm_bo, true, false,
-						NULL);
-		if (fake_ret) {
-			goto exit;
-		}
-
-		fake_ret = openchrome_bo_unpin(bo);
-		ttm_bo_unreserve(&bo->ttm_bo);
-		goto exit;
-	}
-
-	/*
-	 * Free the old framebuffer if it exists.
-	 */
-	if (old_fb) {
-		via_fb = container_of(old_fb,
-					struct via_framebuffer, fb);
-		gem = via_fb->gem;
-		bo = container_of(gem, struct openchrome_bo, gem);
-		ret = ttm_bo_reserve(&bo->ttm_bo, true, false, NULL);
-		if (ret) {
-			DRM_DEBUG_KMS("FB still locked.\n");
-			goto exit;
-		}
-
-		ret = openchrome_bo_unpin(bo);
-		ttm_bo_unreserve(&bo->ttm_bo);
-		if (ret) {
-			DRM_DEBUG_KMS("FB still locked.\n");
-			goto exit;
-		}
-	}
-
-exit:
-	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
-	return ret;
-}
-
-static int
 via_iga2_crtc_mode_set(struct drm_crtc *crtc,
 			struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode,
 			int x, int y, struct drm_framebuffer *fb)
@@ -2187,7 +2109,7 @@ via_iga2_crtc_mode_set(struct drm_crtc *crtc,
 		via_set_vclock(crtc, pll_regs);
 	}
 
-	ret = via_iga2_crtc_mode_set_base(crtc, x, y, fb);
+	ret = openchrome_crtc_mode_set_base(crtc, x, y, fb);
 exit:
 	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
 	return ret;
commit 62d9922346b7c1d130e63b5ddb0fe383801471e8
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Sat Oct 19 08:14:36 2019 -0700

    drm/openchrome: Consolidate mode set base atomic code
    
    It is being merged into openchrome_crtc_mode_set_base_atomic().
    
    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 8c8b91eda519..cf9599fe311d 100644
--- a/drivers/gpu/drm/openchrome/openchrome_crtc.c
+++ b/drivers/gpu/drm/openchrome/openchrome_crtc.c
@@ -1582,6 +1582,94 @@ drm_mode_crtc_load_lut(struct drm_crtc *crtc)
 	}
 }
 
+static int openchrome_crtc_mode_set_base_atomic(struct drm_crtc *crtc,
+					struct drm_framebuffer *fb,
+					int x, int y,
+					enum mode_set_atomic state)
+{
+	u32 pitch = y * fb->pitches[0] +
+			((x * fb->format->cpp[0] * 8) >> 3), addr;
+	struct via_crtc *iga = container_of(crtc, struct via_crtc, base);
+	struct openchrome_drm_private *dev_private =
+						crtc->dev->dev_private;
+	struct via_framebuffer *via_fb = container_of(fb,
+					struct via_framebuffer, fb);
+	struct drm_gem_object *gem = via_fb->gem;
+	struct openchrome_bo *bo = container_of(gem,
+					struct openchrome_bo, gem);
+	int ret = 0;
+
+	DRM_DEBUG_KMS("Entered %s.\n", __func__);
+
+	if ((fb->format->depth != 8) && (fb->format->depth != 16) &&
+		(fb->format->depth != 24)) {
+		ret = -EINVAL;
+		DRM_ERROR("Unsupported IGA%s Color Depth: %d bit\n",
+					(!iga->index) ? "1" : "2",
+					fb->format->depth);
+		goto exit;
+	}
+
+	if (!iga->index) {
+		via_iga_common_init(VGABASE);
+
+		/* Set palette LUT to 8-bit mode. */
+		via_iga1_set_palette_lut_resolution(VGABASE, true);
+
+		via_iga1_set_color_depth(dev_private, fb->format->depth);
+
+		/* Set the framebuffer offset */
+		addr = round_up(bo->ttm_bo.offset + pitch, 16) >> 1;
+		vga_wcrt(VGABASE, 0x0D, addr & 0xFF);
+		vga_wcrt(VGABASE, 0x0C, (addr >> 8) & 0xFF);
+		/* Yes order of setting these registers matters on some hardware */
+		svga_wcrt_mask(VGABASE, 0x48, ((addr >> 24) & 0x1F), 0x1F);
+		vga_wcrt(VGABASE, 0x34, (addr >> 16) & 0xFF);
+
+		/* Load fetch count registers */
+		pitch = ALIGN(crtc->mode.hdisplay * (fb->format->cpp[0] * 8) >> 3, 16);
+		load_value_to_registers(VGABASE, &iga->fetch, pitch >> 4);
+
+		/* Set the primary pitch */
+		pitch = ALIGN(fb->pitches[0], 16);
+		/* Spec does not say that first adapter skips 3 bits but old
+		 * code did it and seems to be reasonable in analogy to
+		 * second adapter */
+		load_value_to_registers(VGABASE, &iga->offset, pitch >> 3);
+	} else {
+		via_iga_common_init(VGABASE);
+
+		/* Set palette LUT to 8-bit mode. */
+		via_iga2_set_palette_lut_resolution(VGABASE, true);
+
+		via_iga2_set_color_depth(dev_private, fb->format->depth);
+
+		/* Set the framebuffer offset */
+		addr = round_up(bo->ttm_bo.offset + pitch, 16);
+		/* Bits 9 to 3 of the frame buffer go into bits 7 to 1
+		 * of the register. Bit 0 is for setting tile mode or
+		 * linear mode. A value of zero sets it to linear mode */
+		vga_wcrt(VGABASE, 0x62, ((addr >> 3) & 0x7F) << 1);
+		vga_wcrt(VGABASE, 0x63, (addr >> 10) & 0xFF);
+		vga_wcrt(VGABASE, 0x64, (addr >> 18) & 0xFF);
+		svga_wcrt_mask(VGABASE, 0xA3, ((addr >> 26) & 0x07), 0x07);
+
+		/* Load fetch count registers */
+		pitch = ALIGN(crtc->mode.hdisplay * (fb->format->cpp[0] * 8) >> 3, 16);
+		load_value_to_registers(VGABASE, &iga->fetch, pitch >> 4);
+
+		/* Set secondary pitch */
+		pitch = ALIGN(fb->pitches[0], 16);
+		load_value_to_registers(VGABASE, &iga->offset, pitch >> 3);
+
+		enable_second_display_channel(VGABASE);
+	}
+
+exit:
+	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
+	return ret;
+}
+
 static void
 via_iga1_crtc_dpms(struct drm_crtc *crtc, int mode)
 {
@@ -1828,58 +1916,6 @@ exit:
 	return ret;
 }
 
-static int
-via_iga1_mode_set_base_atomic(struct drm_crtc *crtc,
-				struct drm_framebuffer *fb, int x, int y,
-				enum mode_set_atomic state)
-{
-	u32 pitch = y * fb->pitches[0] +
-			((x * fb->format->cpp[0] * 8) >> 3), addr;
-	struct via_crtc *iga = container_of(crtc, struct via_crtc, base);
-	struct openchrome_drm_private *dev_private =
-						crtc->dev->dev_private;
-	struct via_framebuffer *via_fb = container_of(fb,
-					struct via_framebuffer, fb);
-	struct drm_gem_object *gem = via_fb->gem;
-	struct openchrome_bo *bo = container_of(gem,
-					struct openchrome_bo, gem);
-
-	if ((fb->format->depth != 8) && (fb->format->depth != 16) &&
-		(fb->format->depth != 24)) {
-		DRM_ERROR("Unsupported IGA1 Color Depth: %d bit\n",
-						fb->format->depth);
-		return -EINVAL;
-	}
-
-	via_iga_common_init(VGABASE);
-
-	/* Set palette LUT to 8-bit mode. */
-	via_iga1_set_palette_lut_resolution(VGABASE, true);
-
-	via_iga1_set_color_depth(dev_private, fb->format->depth);
-
-	/* Set the framebuffer offset */
-	addr = round_up(bo->ttm_bo.offset + pitch, 16) >> 1;
-	vga_wcrt(VGABASE, 0x0D, addr & 0xFF);
-	vga_wcrt(VGABASE, 0x0C, (addr >> 8) & 0xFF);
-	/* Yes order of setting these registers matters on some hardware */
-	svga_wcrt_mask(VGABASE, 0x48, ((addr >> 24) & 0x1F), 0x1F);
-	vga_wcrt(VGABASE, 0x34, (addr >> 16) & 0xFF);
-
-	/* Load fetch count registers */
-	pitch = ALIGN(crtc->mode.hdisplay * (fb->format->cpp[0] * 8) >> 3, 16);
-	load_value_to_registers(VGABASE, &iga->fetch, pitch >> 4);
-
-	/* Set the primary pitch */
-	pitch = ALIGN(fb->pitches[0], 16);
-	/* Spec does not say that first adapter skips 3 bits but old
-	 * code did it and seems to be reasonable in analogy to
-	 * second adapter */
-	load_value_to_registers(VGABASE, &iga->offset, pitch >> 3);
-
-	return 0;
-}
-
 static void
 via_iga2_crtc_dpms(struct drm_crtc *crtc, int mode)
 {
@@ -2157,59 +2193,6 @@ exit:
 	return ret;
 }
 
-static int
-via_iga2_mode_set_base_atomic(struct drm_crtc *crtc,
-				struct drm_framebuffer *fb,
-				int x, int y, enum mode_set_atomic state)
-{
-	u32 pitch = y * fb->pitches[0] +
-			((x * fb->format->cpp[0] * 8) >> 3), addr;
-	struct via_crtc *iga = container_of(crtc, struct via_crtc, base);
-	struct openchrome_drm_private *dev_private =
-						crtc->dev->dev_private;
-	struct via_framebuffer *via_fb = container_of(fb,
-					struct via_framebuffer, fb);
-	struct drm_gem_object *gem = via_fb->gem;
-	struct openchrome_bo *bo = container_of(gem,
-					struct openchrome_bo, gem);
-
-	if ((fb->format->depth != 8) && (fb->format->depth != 16) &&
-		(fb->format->depth != 24)) {
-		DRM_ERROR("Unsupported IGA2 Color Depth: %d bit\n",
-						fb->format->depth);
-		return -EINVAL;
-	}
-
-	via_iga_common_init(VGABASE);
-
-	/* Set palette LUT to 8-bit mode. */
-	via_iga2_set_palette_lut_resolution(VGABASE, true);
-
-	via_iga2_set_color_depth(dev_private, fb->format->depth);
-
-	/* Set the framebuffer offset */
-	addr = round_up(bo->ttm_bo.offset + pitch, 16);
-	/* Bits 9 to 3 of the frame buffer go into bits 7 to 1
-	 * of the register. Bit 0 is for setting tile mode or
-	 * linear mode. A value of zero sets it to linear mode */
-	vga_wcrt(VGABASE, 0x62, ((addr >> 3) & 0x7F) << 1);
-	vga_wcrt(VGABASE, 0x63, (addr >> 10) & 0xFF);
-	vga_wcrt(VGABASE, 0x64, (addr >> 18) & 0xFF);
-	svga_wcrt_mask(VGABASE, 0xA3, ((addr >> 26) & 0x07), 0x07);
-
-	/* Load fetch count registers */
-	pitch = ALIGN(crtc->mode.hdisplay * (fb->format->cpp[0] * 8) >> 3, 16);
-	load_value_to_registers(VGABASE, &iga->fetch, pitch >> 4);
-
-	/* Set secondary pitch */
-	pitch = ALIGN(fb->pitches[0], 16);
-	load_value_to_registers(VGABASE, &iga->offset, pitch >> 3);
-
-	enable_second_display_channel(VGABASE);
-
-	return 0;
-}
-
 static const struct
 drm_crtc_helper_funcs openchrome_iga1_drm_crtc_helper_funcs = {
 	.dpms = via_iga1_crtc_dpms,
@@ -2218,7 +2201,7 @@ drm_crtc_helper_funcs openchrome_iga1_drm_crtc_helper_funcs = {
 	.commit = via_iga1_crtc_commit,
 	.mode_fixup = via_iga1_crtc_mode_fixup,
 	.mode_set = via_iga1_crtc_mode_set,
-	.mode_set_base_atomic = via_iga1_mode_set_base_atomic,
+	.mode_set_base_atomic = openchrome_crtc_mode_set_base_atomic,
 };
 
 static const struct
@@ -2229,7 +2212,7 @@ drm_crtc_helper_funcs openchrome_iga2_drm_crtc_helper_funcs = {
 	.commit = via_iga2_crtc_commit,
 	.mode_fixup = via_iga2_crtc_mode_fixup,
 	.mode_set = via_iga2_crtc_mode_set,
-	.mode_set_base_atomic = via_iga2_mode_set_base_atomic,
+	.mode_set_base_atomic = openchrome_crtc_mode_set_base_atomic,
 };
 
 static const uint32_t openchrome_primary_formats[] = {
commit 4f2df65a12607a0aa110a853fe31d2682dda6c76
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Sat Oct 19 08:14:17 2019 -0700

    drm/openchrome: Use uint32_t type for identifying which IGA is being used
    
    IGA (Integrated Graphics Accelerator) is a VIA Technologies term for
    a display engine.  In DRM / KMS terminology, CRTC (Cathode Ray Tube
    Controller) is the closest term for it.
    
    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 448e2570c3f2..d27469d32084 100644
--- a/drivers/gpu/drm/openchrome/openchrome_drv.h
+++ b/drivers/gpu/drm/openchrome/openchrome_drv.h
@@ -167,7 +167,7 @@ struct via_crtc {
 	struct vga_registers offset;
 	struct vga_registers fetch;
 	int scaling_mode;
-	uint8_t index;
+	uint32_t index;
 };
 
 struct via_connector {
commit e15bbae9900242222074f24de2839cb94153b610
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Sat Oct 19 08:13:56 2019 -0700

    drm/openchrome: Drop erroneous reference to 32 bit color depth
    
    In the future, the code should test bpp (bits per pixel) rather than
    color depth when determining the number of bytes a pixel might occupy.
    
    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 1ad8e050bac9..8c8b91eda519 100644
--- a/drivers/gpu/drm/openchrome/openchrome_crtc.c
+++ b/drivers/gpu/drm/openchrome/openchrome_crtc.c
@@ -98,15 +98,13 @@ static void via_iga1_set_color_depth(
 		value |= BIT(4) | BIT(2);
 		break;
 	case 24:
-	case 32:
 		value |= BIT(3) | BIT(2);
 		break;
 	default:
 		break;
 	}
 
-	if ((depth == 8) || (depth == 16) ||
-		(depth == 24) || (depth == 32)) {
+	if ((depth == 8) || (depth == 16) || (depth == 24)) {
 		/* 3C5.15[4]   - Hi Color Mode Select
 		 *               0: 555
 		 *               1: 565
@@ -144,15 +142,13 @@ static void via_iga2_set_color_depth(
 		value = BIT(6);
 		break;
 	case 24:
-	case 32:
 		value = BIT(7) | BIT(6);
 		break;
 	default:
 		break;
 	}
 
-	if ((depth == 8) || (depth == 16) ||
-		(depth == 24) || (depth == 32)) {
+	if ((depth == 8) || (depth == 16) || (depth == 24)) {
 		/* 3X5.67[7:6] - Display Color Depth Select
 		 *               00: 8bpp
 		 *               01: 16bpp
@@ -418,7 +414,7 @@ static int via_iga1_display_fifo_regs(
 			}
 
 			if (dev_private->vram_type <= VIA_MEM_DDR_200) {
-				if (fb->format->depth == 32) {
+				if (fb->format->depth == 24) {
 					if (mode->hdisplay > 1024) {
 						if (mode->vdisplay > 768) {
 							/* SR22[4:0] */
@@ -565,7 +561,7 @@ static int via_iga1_display_fifo_regs(
 		/* SR18[7], SR18[5:0] */
 		fifo_high_threshold = 296;
 
-		if ((fb->format->depth == 32) &&
+		if ((fb->format->depth == 24) &&
 			(mode->hdisplay >= 1400)) {
 			/* SR22[4:0] */
 			display_queue_expire_num = 64;
@@ -585,7 +581,7 @@ static int via_iga1_display_fifo_regs(
 		/* SR18[7], SR18[5:0] */
 		fifo_high_threshold = 64;
 
-		if ((fb->format->depth == 32) &&
+		if ((fb->format->depth == 24) &&
 			(mode->hdisplay >= 1400)) {
 			/* SR22[4:0] */
 			display_queue_expire_num = 64;
@@ -849,10 +845,10 @@ static int via_iga2_display_fifo_regs(
 
 			enable_extended_display_fifo = true;
 		} else if (((mode->hdisplay > 1024) &&
-			(fb->format->depth == 32) &&
+			(fb->format->depth == 24) &&
 			(dev_private->vram_type <= VIA_MEM_DDR_333)) ||
 			((mode->hdisplay == 1024) &&
-			(fb->format->depth == 32) &&
+			(fb->format->depth == 24) &&
 			(dev_private->vram_type <= VIA_MEM_DDR_200))) {
 			/* CR68[7:4] */
 			fifo_max_depth = 104;
@@ -895,7 +891,7 @@ static int via_iga2_display_fifo_regs(
 		/* CR95[2:0], CR92[3:0] */
 		fifo_high_threshold = 296;
 
-		if ((fb->format->depth == 32) &&
+		if ((fb->format->depth == 24) &&
 			(mode->hdisplay >= 1400)) {
 			/* CR94[6:0] */
 			display_queue_expire_num = 64;
@@ -915,7 +911,7 @@ static int via_iga2_display_fifo_regs(
 		/* CR95[2:0], CR92[3:0] */
 		fifo_high_threshold = 32;
 
-		if ((fb->format->depth == 32) &&
+		if ((fb->format->depth == 24) &&
 				(mode->hdisplay >= 1400)) {
 			/* CR94[6:0] */
 			display_queue_expire_num = 64;
@@ -1849,7 +1845,7 @@ via_iga1_mode_set_base_atomic(struct drm_crtc *crtc,
 					struct openchrome_bo, gem);
 
 	if ((fb->format->depth != 8) && (fb->format->depth != 16) &&
-		(fb->format->depth != 24) && (fb->format->depth != 32)) {
+		(fb->format->depth != 24)) {
 		DRM_ERROR("Unsupported IGA1 Color Depth: %d bit\n",
 						fb->format->depth);
 		return -EINVAL;
@@ -2178,7 +2174,7 @@ via_iga2_mode_set_base_atomic(struct drm_crtc *crtc,
 					struct openchrome_bo, gem);
 
 	if ((fb->format->depth != 8) && (fb->format->depth != 16) &&
-		(fb->format->depth != 24) && (fb->format->depth != 32)) {
+		(fb->format->depth != 24)) {
 		DRM_ERROR("Unsupported IGA2 Color Depth: %d bit\n",
 						fb->format->depth);
 		return -EINVAL;
commit 349a46a63289080617e841b4d1cf255c739145b4
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Sat Oct 19 08:13:31 2019 -0700

    drm/openchrome: Fix for openchrome_gamma_set()
    
    IGA reference was reversed, so this was leading to a freeze.
    
    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 21604c3b99ed..1ad8e050bac9 100644
--- a/drivers/gpu/drm/openchrome/openchrome_crtc.c
+++ b/drivers/gpu/drm/openchrome/openchrome_crtc.c
@@ -62,22 +62,135 @@ static struct vga_regset vpit_table[] = {
 	{VGA_GFX_I, 0x08, 0xFF, 0xFF }
 };
 
+static void via_iga_common_init(void __iomem *regs)
+{
+	DRM_DEBUG_KMS("Entered %s.\n", __func__);
+
+	/* Be careful with 3C5.15[5] - Wrap Around Disable.
+	 * It must be set to 1 for proper operation. */
+	/* 3C5.15[5]   - Wrap Around Disable
+	 *               0: Disable (For Mode 0-13)
+	 *               1: Enable
+	 * 3C5.15[1]   - Extended Display Mode Enable
+	 *               0: Disable
+	 *               1: Enable */
+	svga_wseq_mask(regs, 0x15, BIT(5) | BIT(1), BIT(5) | BIT(1));
+
+	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
+}
+
+static void via_iga1_set_color_depth(
+			struct openchrome_drm_private *dev_private,
+			u8 depth)
+{
+	u8 value;
+
+	DRM_DEBUG_KMS("Entered %s.\n", __func__);
+
+	value = 0x00;
+
+	/* Set the color depth for IGA1. */
+	switch (depth) {
+	case 8:
+		break;
+	case 16:
+		/* Bit 4 is for 555 (15-bit) / 565 (16-bit) color selection. */
+		value |= BIT(4) | BIT(2);
+		break;
+	case 24:
+	case 32:
+		value |= BIT(3) | BIT(2);
+		break;
+	default:
+		break;
+	}
+
+	if ((depth == 8) || (depth == 16) ||
+		(depth == 24) || (depth == 32)) {
+		/* 3C5.15[4]   - Hi Color Mode Select
+		 *               0: 555
+		 *               1: 565
+		 * 3C5.15[3:2] - Display Color Depth Select
+		 *               00: 8bpp
+		 *               01: 16bpp
+		 *               10: 30bpp
+		 *               11: 32bpp */
+		svga_wseq_mask(VGABASE, 0x15, value,
+				BIT(4) | BIT(3) | BIT(2));
+		DRM_INFO("IGA1 Color Depth: %d bit\n", depth);
+	} else {
+		DRM_ERROR("Unsupported IGA1 Color Depth: %d bit\n",
+				depth);
+	}
+
+	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
+}
+
+static void via_iga2_set_color_depth(
+			struct openchrome_drm_private *dev_private,
+			u8 depth)
+{
+	u8 value;
+
+	DRM_DEBUG_KMS("Entered %s.\n", __func__);
+
+	value = 0x00;
+
+	/* Set the color depth for IGA2. */
+	switch (depth) {
+	case 8:
+		break;
+	case 16:
+		value = BIT(6);
+		break;
+	case 24:
+	case 32:
+		value = BIT(7) | BIT(6);
+		break;
+	default:
+		break;
+	}
+
+	if ((depth == 8) || (depth == 16) ||
+		(depth == 24) || (depth == 32)) {
+		/* 3X5.67[7:6] - Display Color Depth Select
+		 *               00: 8bpp
+		 *               01: 16bpp
+		 *               10: 30bpp
+		 *               11: 32bpp */
+		svga_wcrt_mask(VGABASE, 0x67, value, 0xC0);
+		DRM_INFO("IGA2 Color Depth: %d bit\n", depth);
+	} else {
+		DRM_ERROR("Unsupported IGA2 Color Depth: %d bit\n",
+				depth);
+	}
+
+	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
+}
+
 static int openchrome_gamma_set(struct drm_crtc *crtc,
 				u16 *r, u16 *g, u16 *b,
 				uint32_t size,
 				struct drm_modeset_acquire_ctx *ctx)
 {
-	struct via_crtc *iga = container_of(crtc,
-						struct via_crtc, base);
 	struct openchrome_drm_private *dev_private =
 						crtc->dev->dev_private;
+	struct via_crtc *iga = container_of(crtc,
+						struct via_crtc, base);
 	int end = (size > 256) ? 256 : size, i;
-	u8 val = 0, sr1a = vga_rseq(VGABASE, 0x1A);
+	u8 val = 0, sr1a;
+	int ret = 0;
 
-	if (!crtc->enabled || !crtc->primary->fb)
-		return -EINVAL;
+	DRM_DEBUG_KMS("Entered %s.\n", __func__);
 
-	if (iga->index) {
+	sr1a = vga_rseq(VGABASE, 0x1A);
+
+	if ((!crtc->enabled) || (!crtc->primary->fb)) {
+		ret = -EINVAL;
+		goto exit;
+	}
+
+	if (!iga->index) {
 		if (crtc->primary->fb->format->cpp[0] * 8 == 8) {
 			/* Prepare for initialize IGA1's LUT: */
 			vga_wseq(VGABASE, 0x1A, sr1a & 0xFE);
@@ -200,113 +313,10 @@ static int openchrome_gamma_set(struct drm_crtc *crtc,
 			vga_wseq(VGABASE, 0x1A, sr1a);
 		}
 	}
-	return 0;
-}
-
-static void via_iga_common_init(void __iomem *regs)
-{
-	DRM_DEBUG_KMS("Entered %s.\n", __func__);
-
-	/* Be careful with 3C5.15[5] - Wrap Around Disable.
-	 * It must be set to 1 for proper operation. */
-	/* 3C5.15[5]   - Wrap Around Disable
-	 *               0: Disable (For Mode 0-13)
-	 *               1: Enable
-	 * 3C5.15[1]   - Extended Display Mode Enable
-	 *               0: Disable
-	 *               1: Enable */
-	svga_wseq_mask(regs, 0x15, BIT(5) | BIT(1), BIT(5) | BIT(1));
-
-	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
-}
-
-static void via_iga1_set_color_depth(
-			struct openchrome_drm_private *dev_private,
-			u8 depth)
-{
-	u8 value;
-
-	DRM_DEBUG_KMS("Entered %s.\n", __func__);
-
-	value = 0x00;
-
-	/* Set the color depth for IGA1. */
-	switch (depth) {
-	case 8:
-		break;
-	case 16:
-		/* Bit 4 is for 555 (15-bit) / 565 (16-bit) color selection. */
-		value |= BIT(4) | BIT(2);
-		break;
-	case 24:
-	case 32:
-		value |= BIT(3) | BIT(2);
-		break;
-	default:
-		break;
-	}
-
-	if ((depth == 8) || (depth == 16) ||
-		(depth == 24) || (depth == 32)) {
-		/* 3C5.15[4]   - Hi Color Mode Select
-		 *               0: 555
-		 *               1: 565
-		 * 3C5.15[3:2] - Display Color Depth Select
-		 *               00: 8bpp
-		 *               01: 16bpp
-		 *               10: 30bpp
-		 *               11: 32bpp */
-		svga_wseq_mask(VGABASE, 0x15, value,
-				BIT(4) | BIT(3) | BIT(2));
-		DRM_INFO("IGA1 Color Depth: %d bit\n", depth);
-	} else {
-		DRM_ERROR("Unsupported IGA1 Color Depth: %d bit\n",
-				depth);
-	}
-
-	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
-}
-
-static void via_iga2_set_color_depth(
-			struct openchrome_drm_private *dev_private,
-			u8 depth)
-{
-	u8 value;
-
-	DRM_DEBUG_KMS("Entered %s.\n", __func__);
-
-	value = 0x00;
-
-	/* Set the color depth for IGA2. */
-	switch (depth) {
-	case 8:
-		break;
-	case 16:
-		value = BIT(6);
-		break;
-	case 24:
-	case 32:
-		value = BIT(7) | BIT(6);
-		break;
-	default:
-		break;
-	}
-
-	if ((depth == 8) || (depth == 16) ||
-		(depth == 24) || (depth == 32)) {
-		/* 3X5.67[7:6] - Display Color Depth Select
-		 *               00: 8bpp
-		 *               01: 16bpp
-		 *               10: 30bpp
-		 *               11: 32bpp */
-		svga_wcrt_mask(VGABASE, 0x67, value, 0xC0);
-		DRM_INFO("IGA2 Color Depth: %d bit\n", depth);
-	} else {
-		DRM_ERROR("Unsupported IGA2 Color Depth: %d bit\n",
-				depth);
-	}
 
+exit:
 	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
+	return ret;
 }
 
 static void openchrome_crtc_destroy(struct drm_crtc *crtc)


More information about the openchrome-devel mailing list