[Openchrome-devel] drm-openchrome: 3 commits - drivers/gpu/drm
Kevin Brace
kevinbrace at kemper.freedesktop.org
Tue Dec 20 10:15:19 UTC 2016
drivers/gpu/drm/via/via_crtc.c | 270 +++++++++++++++++++++++++----------------
drivers/gpu/drm/via/via_drv.h | 6
2 files changed, 169 insertions(+), 107 deletions(-)
New commits:
commit e49d06ded168f30588150b2149ca1e8c22a5fc56
Author: Kevin Brace <kevinbrace at gmx.com>
Date: Tue Dec 20 02:14:00 2016 -0800
Version bumped to 3.0.4
Signed-off-by: Kevin Brace <kevinbrace at gmx.com>
diff --git a/drivers/gpu/drm/via/via_drv.h b/drivers/gpu/drm/via/via_drv.h
index 77d9c10..d9dae95 100644
--- a/drivers/gpu/drm/via/via_drv.h
+++ b/drivers/gpu/drm/via/via_drv.h
@@ -31,7 +31,7 @@
#define DRIVER_MAJOR 3
#define DRIVER_MINOR 0
-#define DRIVER_PATCHLEVEL 3
+#define DRIVER_PATCHLEVEL 4
#include <linux/module.h>
commit ea4b72cc55e9e8b8f58f205fda03d41117d651ab
Author: Kevin Brace <kevinbrace at gmx.com>
Date: Tue Dec 20 02:12:26 2016 -0800
Changed OpenChrome DRM device driver description
Signed-off-by: Kevin Brace <kevinbrace at gmx.com>
diff --git a/drivers/gpu/drm/via/via_drv.h b/drivers/gpu/drm/via/via_drv.h
index 3ba95e6..77d9c10 100644
--- a/drivers/gpu/drm/via/via_drv.h
+++ b/drivers/gpu/drm/via/via_drv.h
@@ -26,8 +26,8 @@
#define DRIVER_AUTHOR "The OpenChrome Project"
#define DRIVER_NAME "via"
-#define DRIVER_DESC "VIA Technologies UniChrome / Chrome9"
-#define DRIVER_DATE "20161204"
+#define DRIVER_DESC "OpenChrome DRM for VIA Technologies Chrome IGP"
+#define DRIVER_DATE "20161220"
#define DRIVER_MAJOR 3
#define DRIVER_MINOR 0
commit 60631eacf5bba30b0aebdef674e099e5d3495d9f
Author: Kevin Brace <kevinbrace at gmx.com>
Date: Tue Dec 20 02:04:08 2016 -0800
Separated a mode_set callback function for IGA1 and IGA2
IGA1 and IGA2 now have separate callback functions.
Signed-off-by: Kevin Brace <kevinbrace at gmx.com>
diff --git a/drivers/gpu/drm/via/via_crtc.c b/drivers/gpu/drm/via/via_crtc.c
index 6f83bfb..8416fc0 100644
--- a/drivers/gpu/drm/via/via_crtc.c
+++ b/drivers/gpu/drm/via/via_crtc.c
@@ -1073,7 +1073,7 @@ via_crtc_mode_fixup(struct drm_crtc *crtc, const struct drm_display_mode *mode,
}
static int
-via_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode,
+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)
{
@@ -1081,6 +1081,17 @@ via_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode,
struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
struct drm_via_private *dev_priv = crtc->dev->dev_private;
struct drm_device *dev = crtc->dev;
+ u8 reg_value = 0;
+ int ret;
+
+ DRM_DEBUG("Entered via_iga1_crtc_mode_set.\n");
+
+ /* 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_priv);
@@ -1089,119 +1100,40 @@ via_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode,
via_unlock_crtc(VGABASE, dev->pdev->device);
/* IGA1 reset */
- if (!iga->index) {
- vga_wcrt(VGABASE, 0x09, 0x00); /* initial CR09=0 */
- svga_wcrt_mask(VGABASE, 0x11, 0x00, BIT(6));
- }
+ 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);
- /* Load crtc timing and IGA scaling */
- if (iga->scaling_mode & VIA_SHRINK) {
- /* I. down scaling */
- if (iga->index) {
- /* 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_priv, 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 {
- /* IGA1 downscaling not supported */
- }
- } else {
- /* when not down scaling, we only need load one timing. */
- via_load_crtc_timing(iga, adjusted_mode);
-
- /* Patch the IGA1 ECK clock */
- if (!iga->index) {
- u8 reg_value = 0;
-
- 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));
- }
+ /* 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) {
- if (iga->index) {
- /* 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_priv,
- 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_priv,
- mode, adjusted_mode,
- VIA_EXPAND, VER_SCALE);
- }
- } else {
- /* IGA1 Upscaling not supported */
- }
- } else {
- /* III. no scaling */
- }
+ 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);
/* interlace setting */
if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) {
- if (iga->index)
- svga_wcrt_mask(VGABASE, 0x67, BIT(5), BIT(5));
- else
- svga_wcrt_mask(VGABASE, 0x33, BIT(6), BIT(6));
+ svga_wcrt_mask(VGABASE, 0x33, BIT(6), BIT(6));
} else {
- /* non-interlace, clear interlace setting. */
- if (iga->index)
- svga_wcrt_mask(VGABASE, 0x67, 0, BIT(5));
- else
- svga_wcrt_mask(VGABASE, 0x33, 0, BIT(6));
+ svga_wcrt_mask(VGABASE, 0x33, 0, BIT(6));
}
/* Load FIFO */
@@ -1224,7 +1156,12 @@ via_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode,
pll_regs = via_get_clk_value(crtc->dev, clock);
via_set_vclock(crtc, pll_regs);
}
- return crtc_funcs->mode_set_base(crtc, x, y, fb);
+
+ ret = crtc_funcs->mode_set_base(crtc, x, y, fb);
+
+exit:
+ DRM_DEBUG("Exiting via_iga1_crtc_mode_set.\n");
+ return ret;
}
static int
@@ -1325,6 +1262,131 @@ via_iga1_mode_set_base_atomic(struct drm_crtc *crtc, struct drm_framebuffer *fb,
}
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 drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
+ struct drm_via_private *dev_priv = crtc->dev->dev_private;
+ struct drm_device *dev = crtc->dev;
+ int ret;
+
+ DRM_DEBUG("Entered via_iga2_crtc_mode_set.\n");
+
+ /* 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_priv);
+
+ /* 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_priv, 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_priv,
+ 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_priv,
+ mode, adjusted_mode,
+ VIA_EXPAND, VER_SCALE);
+ }
+ }
+ }
+
+ /* Relock */
+ via_lock_crtc(VGABASE);
+
+ /* interlace setting */
+ if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) {
+ svga_wcrt_mask(VGABASE, 0x33, BIT(6), BIT(6));
+ } else {
+ svga_wcrt_mask(VGABASE, 0x33, 0, BIT(6));
+ }
+
+ /* Load FIFO */
+ if ((dev->pdev->device != PCI_DEVICE_ID_VIA_CLE266) &&
+ (dev->pdev->device != PCI_DEVICE_ID_VIA_KM400)) {
+ via_load_fifo_regs(iga, adjusted_mode);
+ } else if (adjusted_mode->hdisplay == 1024 &&
+ adjusted_mode->vdisplay == 768) {
+ /* Update Patch Register */
+ svga_wseq_mask(VGABASE, 0x16, 0x0C, 0xBF);
+ vga_wseq(VGABASE, 0x18, 0x4C);
+ }
+
+ /* 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 = crtc_funcs->mode_set_base(crtc, x, y, fb);
+
+exit:
+ DRM_DEBUG("Exiting via_iga2_crtc_mode_set.\n");
+ 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)
{
@@ -1373,7 +1435,7 @@ static const struct drm_crtc_helper_funcs via_iga1_helper_funcs = {
.prepare = via_crtc_prepare,
.commit = via_crtc_commit,
.mode_fixup = via_crtc_mode_fixup,
- .mode_set = via_crtc_mode_set,
+ .mode_set = via_iga1_crtc_mode_set,
.mode_set_base = via_crtc_mode_set_base,
.mode_set_base_atomic = via_iga1_mode_set_base_atomic,
.load_lut = drm_mode_crtc_load_lut,
@@ -1385,7 +1447,7 @@ static const struct drm_crtc_helper_funcs via_iga2_helper_funcs = {
.prepare = via_crtc_prepare,
.commit = via_crtc_commit,
.mode_fixup = via_crtc_mode_fixup,
- .mode_set = via_crtc_mode_set,
+ .mode_set = via_iga2_crtc_mode_set,
.mode_set_base = via_crtc_mode_set_base,
.mode_set_base_atomic = via_iga2_mode_set_base_atomic,
.load_lut = drm_mode_crtc_load_lut,
More information about the Openchrome-devel
mailing list