[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