[PATCH 7/7] MAINTAINERS:Add maintainer for hibmc DRM driver

2016-02-29 Thread lijianhua
Add maintainer for hibmc DRM driver.

Signed-off-by: lijianhua 
---
 MAINTAINERS | 7 +++
 1 file changed, 7 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 4978dc1..2bf23eb 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3774,6 +3774,13 @@ S:   Maintained
 F: drivers/gpu/drm/gma500
 F: include/drm/gma500*

+DRM DRIVERS FOR HIBMC
+M: lijianhua 
+M: Rongrong Zou 
+L: dri-devel at lists.freedesktop.org
+S: Maintained
+F: drivers/gpu/drm/hisilicon/hibmc
+
 DRM DRIVERS FOR NVIDIA TEGRA
 M: Thierry Reding 
 M: Terje Bergström 
-- 
1.9.1



[PATCH 6/7] drm/hisilicon:Add fbdev

2016-02-29 Thread lijianhua
Add fbdev.

Signed-off-by: lijianhua 
---
 drivers/gpu/drm/hisilicon/hibmc/Makefile  |   2 +-
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c   |   5 +
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h   |   2 +
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c | 290 ++
 4 files changed, 298 insertions(+), 1 deletion(-)
 create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c

diff --git a/drivers/gpu/drm/hisilicon/hibmc/Makefile 
b/drivers/gpu/drm/hisilicon/hibmc/Makefile
index 6ab59b1..1ca1d49 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/Makefile
+++ b/drivers/gpu/drm/hisilicon/hibmc/Makefile
@@ -1,5 +1,5 @@
 ccflags-y := -Iinclude/drm
-hibmc-drm-y := hibmc_drm_drv.o hibmc_drm_de.o hibmc_drm_vdac.o hibmc_drm_hw.o
+hibmc-drm-y := hibmc_drm_drv.o hibmc_drm_de.o hibmc_drm_vdac.o 
hibmc_drm_fbdev.o hibmc_drm_hw.o

 obj-$(CONFIG_DRM_HISI_HIBMC)   +=hibmc-drm.o
 #obj-y += hibmc-drm.o
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c 
b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
index 673a8cd..7439f62 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
@@ -250,6 +250,7 @@ static int hibmc_unload(struct drm_device *dev)
 {
struct hibmc_private *hiprivate = dev->dev_private;

+   hibmc_fbdev_fini(hiprivate);
hibmc_kms_fini(hiprivate);
hibmc_hw_fini(dev);
dev->dev_private = NULL;
@@ -283,6 +284,10 @@ static int hibmc_load(struct drm_device *dev, unsigned 
long flags)
/* reset all the states of crtc/plane/encoder/connector */
drm_mode_config_reset(dev);

+   ret = hibmc_fbdev_init(hiprivate);
+   if (ret)
+   goto err;
+
return 0;

 err:
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h 
b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
index 1f6b25c..e863e1a 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
@@ -50,5 +50,7 @@ int hibmc_plane_init(struct drm_device *dev);
 int hibmc_crtc_init(struct drm_device *dev);
 int hibmc_encoder_init(struct drm_device *dev);
 int hibmc_connector_init(struct drm_device *dev);
+int hibmc_fbdev_init(struct hibmc_private *hiprivate);
+void hibmc_fbdev_fini(struct hibmc_private *hiprivate);

 #endif
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c 
b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c
new file mode 100644
index 000..416a6c6
--- /dev/null
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c
@@ -0,0 +1,290 @@
+/*
+ * Copyright (c) 2016 Huawei Limited.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ */
+#include 
+#include 
+#include 
+#include 
+
+#include "hibmc_drm_drv.h"
+
+/* -- */
+
+void hibmc_drm_fb_destroy(struct drm_framebuffer *fb)
+{
+   struct hibmc_private *hiprivate =
+   container_of(fb, struct hibmc_private, fbdev.fb.fb);
+   struct drm_gem_object *base = >fbdev.fb.obj->base;
+
+   if (hiprivate->fbdev.fb.obj)
+   drm_gem_object_unreference_unlocked(base);
+   drm_framebuffer_cleanup(fb);
+   kfree(fb);
+}
+
+static struct drm_framebuffer_funcs hibmc_drm_fb_funcs = {
+   .destroy= hibmc_drm_fb_destroy,
+};
+
+int hibmc_drm_fb_init(struct drm_device *dev,
+ struct hibmc_framebuffer *gfb,
+ struct drm_mode_fb_cmd2 *mode_cmd,
+ struct drm_gem_cma_object *obj)
+{
+   int ret;
+
+   drm_helper_mode_fill_fb_struct(>fb, mode_cmd);
+   gfb->obj = obj;
+   gfb->is_fbdev_fb = true;
+   ret = drm_framebuffer_init(dev, >fb, _drm_fb_funcs);
+   if (ret) {
+   DRM_ERROR("drm_framebuffer_init failed: %d\n", ret);
+   return ret;
+   }
+   return 0;
+}
+
+struct drm_gem_cma_object *hibmc_drm_gem_create_object(
+   struct hibmc_private *hiprivate,
+   size_t size)
+{
+   struct drm_gem_cma_object *cma_obj;
+   struct drm_gem_object *gem_obj;
+   struct drm_device *drm = hiprivate->dev;
+   int ret;
+
+   cma_obj = devm_kzalloc(drm->dev, sizeof(*cma_obj), GFP_KERNEL);
+   if (!cma_obj)
+   return ERR_PTR(-ENOMEM);
+
+   gem_obj = _obj->base;
+
+   ret = drm_gem_object_init(drm, gem_obj, size);
+   if (ret)
+   return ERR_PTR(ret);
+
+   cma_obj->vaddr = hiprivate->fb_map;
+   cma_obj->paddr = hiprivate->fb_base;
+   return cma_obj;
+}
+
+void hibmc_drm_gem_free_object(struct drm_gem_object *gem_o

[PATCH 5/7] drm/hisilicon:Add connector for VDAC

2016-02-29 Thread lijianhua
Add connector funcs and helper funcs for VDAC.

Signed-off-by: lijianhua 
---
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c  |  8 +++
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h  |  1 +
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c | 89 
 3 files changed, 98 insertions(+)

diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c 
b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
index aa7f8415..673a8cd 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
@@ -143,6 +143,14 @@ int hibmc_kms_init(struct hibmc_private *hiprivate)
return ret;
}

+   ret = hibmc_connector_init(hiprivate->dev);
+   if (ret) {
+   DRM_ERROR("failed to init connector\n");
+   return ret;
+   }
+
+   drm_mode_connector_attach_encoder(>connector,
+ >encoder);
return 0;
 }

diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h 
b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
index 7f3c4bb..1f6b25c 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
@@ -49,5 +49,6 @@ struct hibmc_private {
 int hibmc_plane_init(struct drm_device *dev);
 int hibmc_crtc_init(struct drm_device *dev);
 int hibmc_encoder_init(struct drm_device *dev);
+int hibmc_connector_init(struct drm_device *dev);

 #endif
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c 
b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c
index 06d9549..e832e22 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c
@@ -15,6 +15,14 @@
 #include "hibmc_drm_drv.h"
 #include "hibmc_drm_hw.h"

+static int defx = 800;
+static int defy = 600;
+
+module_param(defx, int, 0444);
+module_param(defy, int, 0444);
+MODULE_PARM_DESC(defx, "default x resolution");
+MODULE_PARM_DESC(defy, "default y resolution");
+
 static void hibmc_encoder_disable(struct drm_encoder *encoder)
 {
 }
@@ -71,3 +79,84 @@ int hibmc_encoder_init(struct drm_device *dev)
return 0;
 }

+int hibmc_connector_get_modes(struct drm_connector *connector)
+{
+   int count;
+
+   count = drm_add_modes_noedid(connector, 800, 600);
+   drm_set_preferred_mode(connector, defx, defy);
+   return count;
+}
+
+static int hibmc_connector_mode_valid(struct drm_connector *connector,
+ struct drm_display_mode *mode)
+{
+   struct hibmc_private *hiprivate =
+container_of(connector, struct hibmc_private, connector);
+   unsigned long size = mode->hdisplay * mode->vdisplay * 4;
+
+   /*
+   * Make sure we can fit two framebuffers into video memory.
+   * This allows up to 1600x1200 with 16 MB (default size).
+   * If you want more try this:
+   * 'qemu -vga std -global VGA.vgamem_mb=32 $otherargs'
+   */
+   if (size * 2 > hiprivate->fb_size)
+   return MODE_BAD;
+
+   return MODE_OK;
+}
+
+static struct drm_encoder *
+hibmc_connector_best_encoder(struct drm_connector *connector)
+{
+   int enc_id = connector->encoder_ids[0];
+
+   /* pick the encoder ids */
+   if (enc_id)
+   return drm_encoder_find(connector->dev, enc_id);
+
+   return NULL;
+}
+
+static enum drm_connector_status hibmc_connector_detect(struct drm_connector
+*connector, bool force)
+{
+   return connector_status_connected;
+}
+
+struct drm_connector_helper_funcs hibmc_connector_connector_helper_funcs = {
+   .get_modes = hibmc_connector_get_modes,
+   .mode_valid = hibmc_connector_mode_valid,
+   .best_encoder = hibmc_connector_best_encoder,
+};
+
+struct drm_connector_funcs hibmc_connector_connector_funcs = {
+   .dpms = drm_atomic_helper_connector_dpms,
+   .detect = hibmc_connector_detect,
+   .fill_modes = drm_helper_probe_single_connector_modes,
+   .destroy = drm_connector_cleanup,
+   .reset = drm_atomic_helper_connector_reset,
+   .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
+   .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
+};
+
+int hibmc_connector_init(struct drm_device *dev)
+{
+   struct hibmc_private *hiprivate = dev->dev_private;
+   struct drm_connector *connector = >connector;
+   int ret;
+
+   ret = drm_connector_init(dev, connector,
+_connector_connector_funcs,
+DRM_MODE_CONNECTOR_VIRTUAL);
+   if (ret) {
+   DRM_ERROR("failed to init connector\n");
+   return ret;
+   }
+   drm_connector_helper_add(connector,
+_connector_connector_helper_funcs);
+   drm_connector_register(connector);
+   return 0;
+}
+
-- 
1.9.1



[PATCH 4/7] drm/hisilicon:Add encoder for VDAC

2016-02-29 Thread lijianhua
Add encoder funcs and helpers for VDAC.

Signed-off-by: lijianhua 
---
 drivers/gpu/drm/hisilicon/hibmc/Makefile |  2 +-
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c  |  6 ++
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h  |  1 +
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c | 73 
 4 files changed, 81 insertions(+), 1 deletion(-)
 create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c

diff --git a/drivers/gpu/drm/hisilicon/hibmc/Makefile 
b/drivers/gpu/drm/hisilicon/hibmc/Makefile
index bca651b..6ab59b1 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/Makefile
+++ b/drivers/gpu/drm/hisilicon/hibmc/Makefile
@@ -1,5 +1,5 @@
 ccflags-y := -Iinclude/drm
-hibmc-drm-y := hibmc_drm_drv.o hibmc_drm_de.o hibmc_drm_hw.o
+hibmc-drm-y := hibmc_drm_drv.o hibmc_drm_de.o hibmc_drm_vdac.o hibmc_drm_hw.o

 obj-$(CONFIG_DRM_HISI_HIBMC)   +=hibmc-drm.o
 #obj-y += hibmc-drm.o
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c 
b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
index 732836d..aa7f8415 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
@@ -137,6 +137,12 @@ int hibmc_kms_init(struct hibmc_private *hiprivate)
return ret;
}

+   ret = hibmc_encoder_init(hiprivate->dev);
+   if (ret) {
+   DRM_ERROR("failed to init encoder\n");
+   return ret;
+   }
+
return 0;
 }

diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h 
b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
index 7b4cb5e..7f3c4bb 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
@@ -48,5 +48,6 @@ struct hibmc_private {

 int hibmc_plane_init(struct drm_device *dev);
 int hibmc_crtc_init(struct drm_device *dev);
+int hibmc_encoder_init(struct drm_device *dev);

 #endif
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c 
b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c
new file mode 100644
index 000..06d9549
--- /dev/null
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2016 Huawei Limited.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ */
+#include 
+#include 
+#include 
+#include 
+
+#include "hibmc_drm_drv.h"
+#include "hibmc_drm_hw.h"
+
+static void hibmc_encoder_disable(struct drm_encoder *encoder)
+{
+}
+
+static void hibmc_encoder_enable(struct drm_encoder *encoder)
+{
+}
+
+static void hibmc_encoder_mode_set(struct drm_encoder *encoder,
+  struct drm_display_mode *mode,
+  struct drm_display_mode *adj_mode)
+{
+   u32 reg;
+
+   /* just open DISPLAY_CONTROL_HISILE register bit 3:0*/
+   reg = PEEK32(DISPLAY_CONTROL_HISILE);
+   reg |= 0xf;
+   POKE32(DISPLAY_CONTROL_HISILE, reg);
+}
+
+static int hibmc_encoder_atomic_check(struct drm_encoder *encoder,
+ struct drm_crtc_state *crtc_state,
+ struct drm_connector_state *conn_state)
+{
+   return 0;
+}
+
+static const struct drm_encoder_helper_funcs hibmc_encoder_helper_funcs = {
+   .mode_set = hibmc_encoder_mode_set,
+   .disable = hibmc_encoder_disable,
+   .enable = hibmc_encoder_enable,
+   .atomic_check = hibmc_encoder_atomic_check,
+};
+
+static const struct drm_encoder_funcs hibmc_encoder_encoder_funcs = {
+   .destroy = drm_encoder_cleanup,
+};
+
+int hibmc_encoder_init(struct drm_device *dev)
+{
+   struct hibmc_private *hiprivate = dev->dev_private;
+   struct drm_encoder *encoder = >encoder;
+   int ret;
+
+   encoder->possible_crtcs = 0x1;
+   ret = drm_encoder_init(dev, encoder, _encoder_encoder_funcs,
+  DRM_MODE_ENCODER_DAC, NULL);
+   if (ret) {
+   DRM_ERROR("failed to init encoder\n");
+   return ret;
+   }
+
+   drm_encoder_helper_add(encoder, _encoder_helper_funcs);
+   return 0;
+}
+
-- 
1.9.1



[PATCH 3/7] drm/hisilicon:Add crtc for DE

2016-02-29 Thread lijianhua
Add crtc funcs and helper funcs for DE.

Signed-off-by: lijianhua 
---
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c  | 279 
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.h  |  20 ++
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c |   6 +
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h |   1 +
 4 files changed, 306 insertions(+)
 create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.h

diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c 
b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c
index 35a675c..5d3ed66 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c
@@ -18,6 +18,7 @@

 #include "hibmc_drm_drv.h"
 #include "hibmc_drm_hw.h"
+#include "hibmc_drm_de.h"

 /* -- */

@@ -156,3 +157,281 @@ int hibmc_plane_init(struct drm_device *dev)
return 0;
 }

+static void hibmc_crtc_enable(struct drm_crtc *crtc)
+{
+   unsigned int reg;
+   /* power mode 0 is default. */
+   set_power_mode(POWER_MODE_CTRL_MODE_MODE0);
+
+   /* Enable display power gate & LOCALMEM power gate*/
+   reg = PEEK32(CURRENT_GATE);
+   reg = FIELD_SET(reg, CURRENT_GATE, DISPLAY, ON);
+   reg = FIELD_SET(reg, CURRENT_GATE, LOCALMEM, ON);
+   set_current_gate(reg);
+}
+
+static void hibmc_crtc_disable(struct drm_crtc *crtc)
+{
+   unsigned int reg;
+
+   set_power_mode(POWER_MODE_CTRL_MODE_SLEEP);
+
+   /* Enable display power gate & LOCALMEM power gate*/
+   reg = PEEK32(CURRENT_GATE);
+   reg = FIELD_SET(reg, CURRENT_GATE, DISPLAY, OFF);
+   reg = FIELD_SET(reg, CURRENT_GATE, LOCALMEM, OFF);
+   set_current_gate(reg);
+}
+
+int hibmc_crtc_atomic_check(struct drm_crtc *crtc,
+   struct drm_crtc_state *state)
+{
+   return 0;
+}
+
+unsigned int format_pll_reg(void)
+{
+   unsigned int pllreg = 0;
+   struct panel_pll pll = {0};
+
+   /* Note that all PLL's have the same format. Here,
+ * we just use Panel PLL parameter to work out the bit
+ * fields in the register.On returning a 32 bit number, the value can
+ * be applied to any PLL in the calling function.
+ */
+   pllreg = FIELD_SET(0, PANEL_PLL_CTRL, BYPASS, OFF) |
+   FIELD_SET(0, PANEL_PLL_CTRL, POWER,  ON) |
+   FIELD_SET(0, PANEL_PLL_CTRL, INPUT,  OSC) |
+   FIELD_VALUE(0, PANEL_PLL_CTRL, POD,pll.POD) |
+   FIELD_VALUE(0, PANEL_PLL_CTRL, OD, pll.OD) |
+   FIELD_VALUE(0, PANEL_PLL_CTRL, N,  pll.N) |
+   FIELD_VALUE(0, PANEL_PLL_CTRL, M,  pll.M);
+
+   return pllreg;
+}
+
+void set_vclock_hisilicon(unsigned long pll)
+{
+   unsigned long tmp0, tmp1;
+
+/* 1. outer_bypass_n=0 */
+   tmp0 = PEEK32(CRT_PLL1_HS);
+   tmp0 &= 0xBFFF;
+   POKE32(CRT_PLL1_HS, tmp0);
+
+   /* 2. pll_pd=1?inter_bypass=1 */
+   POKE32(CRT_PLL1_HS, 0x2100);
+
+   /* 3. config pll */
+   POKE32(CRT_PLL1_HS, pll);
+
+   /* 4. delay  */
+   mdelay(1);
+
+   /* 5. pll_pd =0 */
+   tmp1 = pll & ~0x0100;
+   POKE32(CRT_PLL1_HS, tmp1);
+
+   /* 6. delay  */
+   mdelay(1);
+
+   /* 7. inter_bypass=0 */
+   tmp1 &= ~0x2000;
+   POKE32(CRT_PLL1_HS, tmp1);
+
+   /* 8. delay  */
+   mdelay(1);
+
+   /* 9. outer_bypass_n=1 */
+   tmp1 |= 0x4000;
+   POKE32(CRT_PLL1_HS, tmp1);
+}
+
+/* This function takes care the extra registers and bit fields required to
+*setup a mode in board.
+*Explanation about Display Control register:
+*FPGA only supports 7 predefined pixel clocks, and clock select is
+*in bit 4:0 of new register 0x802a8.
+*/
+unsigned int display_ctrl_adjust(struct drm_display_mode *mode,
+unsigned int ctrl)
+{
+   unsigned long x, y;
+   unsigned long pll1; /* bit[31:0] of PLL */
+   unsigned long pll2; /* bit[63:32] of PLL */
+
+   x = mode->hdisplay;
+   y = mode->vdisplay;
+
+   /* Hisilicon has to set up a new register for PLL control
+*(CRT_PLL1_HS & CRT_PLL2_HS).
+*/
+   if (x == 800 && y == 600) {
+   pll1 = CRT_PLL1_HS_40MHZ;
+   pll2 = CRT_PLL2_HS_40MHZ;
+   } else if (x == 1024 && y == 768) {
+   pll1 = CRT_PLL1_HS_65MHZ;
+   pll2 = CRT_PLL2_HS_65MHZ;
+   } else if (x == 1152 && y == 864) {
+   pll1 = CRT_PLL1_HS_80MHZ_1152;
+   pll2 = CRT_PLL2_HS_80MHZ;
+   } else if (x == 1280 && y == 768) {
+   pll1 = CRT_PLL1_HS_80MHZ;
+   pll2 = CRT_PLL2_HS_80MHZ;
+   } else if (x == 1280 && y == 720) {
+   pll1 = CRT_PLL1_HS_74MHZ;
+   pll2 = CRT_PLL2_HS_74MHZ;
+   } else if (x == 1280 && y == 960) {
+   pll1 = CRT_PLL1_HS_108MHZ;

[PATCH 2/7] drm/hisilicon:Add plane for DE

2016-02-29 Thread lijianhua
Add plane funcs and helper funcs for DE.

Signed-off-by: lijianhua 
---
 drivers/gpu/drm/hisilicon/hibmc/Makefile|   2 +-
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c  | 158 
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c |  48 +++
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h |   2 +
 4 files changed, 209 insertions(+), 1 deletion(-)
 create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c

diff --git a/drivers/gpu/drm/hisilicon/hibmc/Makefile 
b/drivers/gpu/drm/hisilicon/hibmc/Makefile
index 28e59bb..bca651b 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/Makefile
+++ b/drivers/gpu/drm/hisilicon/hibmc/Makefile
@@ -1,5 +1,5 @@
 ccflags-y := -Iinclude/drm
-hibmc-drm-y := hibmc_drm_drv.o hibmc_drm_hw.o
+hibmc-drm-y := hibmc_drm_drv.o hibmc_drm_de.o hibmc_drm_hw.o

 obj-$(CONFIG_DRM_HISI_HIBMC)   +=hibmc-drm.o
 #obj-y += hibmc-drm.o
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c 
b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c
new file mode 100644
index 000..35a675c
--- /dev/null
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 2016 Huawei Limited.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "hibmc_drm_drv.h"
+#include "hibmc_drm_hw.h"
+
+/* -- */
+
+static int
+hibmc_plane_prepare_fb(struct drm_plane *plane,
+  const struct drm_plane_state *new_state)
+{
+   /* do nothing */
+   return 0;
+}
+
+static void hibmc_plane_cleanup_fb(struct drm_plane *plane,
+  const struct drm_plane_state *old_state)
+{
+   /* do nothing */
+}
+
+static int hibmc_plane_atomic_check(struct drm_plane *plane,
+   struct drm_plane_state *state)
+{
+   struct drm_framebuffer *fb = state->fb;
+   struct drm_crtc *crtc = state->crtc;
+   struct drm_crtc_state *crtc_state;
+   u32 src_x = state->src_x >> 16;
+   u32 src_y = state->src_y >> 16;
+   u32 src_w = state->src_w >> 16;
+   u32 src_h = state->src_h >> 16;
+   int crtc_x = state->crtc_x;
+   int crtc_y = state->crtc_y;
+   u32 crtc_w = state->crtc_w;
+   u32 crtc_h = state->crtc_h;
+
+   if (!crtc || !fb)
+   return 0;
+
+   crtc_state = drm_atomic_get_crtc_state(state->state, crtc);
+   if (IS_ERR(crtc_state))
+   return PTR_ERR(crtc_state);
+
+   if (src_w != crtc_w || src_h != crtc_h) {
+   DRM_ERROR("Scale not support!!!\n");
+   return -EINVAL;
+   }
+
+   if (src_x + src_w > fb->width ||
+   src_y + src_h > fb->height)
+   return -EINVAL;
+
+   if (crtc_x < 0 || crtc_y < 0)
+   return -EINVAL;
+
+   if (crtc_x + crtc_w > crtc_state->adjusted_mode.hdisplay ||
+   crtc_y + crtc_h > crtc_state->adjusted_mode.vdisplay)
+   return -EINVAL;
+
+   return 0;
+}
+
+static void hibmc_plane_atomic_update(struct drm_plane *plane,
+ struct drm_plane_state *old_state)
+{
+   struct drm_plane_state  *state  = plane->state;
+   u32 reg;
+   unsigned int line_length;
+
+   /* now just support one plane */
+   POKE32(CRT_FB_ADDRESS, 0);
+   reg = state->fb->width * (state->fb->bits_per_pixel >> 3);
+   /* now line_pad is 16 */
+   reg = PADDING(16, reg);
+
+   line_length = state->fb->width * state->fb->bits_per_pixel / 8;
+   line_length = PADDING(16, line_length);
+   POKE32(CRT_FB_WIDTH,
+  FIELD_VALUE(0, CRT_FB_WIDTH, WIDTH, reg) |
+ FIELD_VALUE(0, CRT_FB_WIDTH, OFFSET, line_length));
+
+   /* SET PIXEL FORMAT */
+   reg = PEEK32(CRT_DISPLAY_CTRL);
+   reg = FIELD_VALUE(reg, CRT_DISPLAY_CTRL,
+ FORMAT, state->fb->bits_per_pixel >> 4);
+   POKE32(CRT_DISPLAY_CTRL, reg);
+}
+
+static void hibmc_plane_atomic_disable(struct drm_plane *plane,
+  struct drm_plane_state *old_state)
+{
+}
+
+static const u32 channel_formats1[] = {
+   DRM_FORMAT_RGB565, DRM_FORMAT_BGR565, DRM_FORMAT_RGB888,
+   DRM_FORMAT_BGR888, DRM_FORMAT_XRGB, DRM_FORMAT_XBGR,
+   DRM_FORMAT_RGBA, DRM_FORMAT_BGRA, DRM_FORMAT_ARGB,
+   DRM_FORMAT_ABGR
+};
+
+static struct drm_plane_funcs hibmc_plane_funcs = {
+   .update_plane   = drm_atomic_helper_update_plane,
+   .di

[PATCH 1/7] drm/hisilicon:Add hisilicon hibmc master driver.

2016-02-29 Thread lijianhua
Add hibmc DRM master driver for hi1710 which used in arm64 board.

Signed-off-by: lijianhua 
---
 drivers/gpu/drm/Kconfig |   2 +
 drivers/gpu/drm/Makefile|   1 +
 drivers/gpu/drm/hisilicon/Kconfig   |   4 +
 drivers/gpu/drm/hisilicon/Makefile  |   4 +
 drivers/gpu/drm/hisilicon/hibmc/Kconfig |  13 +
 drivers/gpu/drm/hisilicon/hibmc/Makefile|   5 +
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 301 +++
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h |  49 +++
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_hw.c  |  83 
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_hw.h  | 484 
 10 files changed, 946 insertions(+)
 create mode 100644 drivers/gpu/drm/hisilicon/Kconfig
 create mode 100644 drivers/gpu/drm/hisilicon/Makefile
 create mode 100644 drivers/gpu/drm/hisilicon/hibmc/Kconfig
 create mode 100644 drivers/gpu/drm/hisilicon/hibmc/Makefile
 create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
 create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
 create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_hw.c
 create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_hw.h

diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index 8ae7ab6..600f94d 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -269,3 +269,5 @@ source "drivers/gpu/drm/imx/Kconfig"
 source "drivers/gpu/drm/vc4/Kconfig"

 source "drivers/gpu/drm/etnaviv/Kconfig"
+
+source "drivers/gpu/drm/hisilicon/Kconfig"
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index 61766de..6055483 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -74,3 +74,4 @@ obj-y += panel/
 obj-y  += bridge/
 obj-$(CONFIG_DRM_FSL_DCU) += fsl-dcu/
 obj-$(CONFIG_DRM_ETNAVIV) += etnaviv/
+obj-y  += hisilicon/
diff --git a/drivers/gpu/drm/hisilicon/Kconfig 
b/drivers/gpu/drm/hisilicon/Kconfig
new file mode 100644
index 000..1f10e17
--- /dev/null
+++ b/drivers/gpu/drm/hisilicon/Kconfig
@@ -0,0 +1,4 @@
+# hisilicon drm device configuration.
+# Please keep this sorted alphabetically.
+
+source "drivers/gpu/drm/hisilicon/hibmc/Kconfig"
diff --git a/drivers/gpu/drm/hisilicon/Makefile 
b/drivers/gpu/drm/hisilicon/Makefile
new file mode 100644
index 000..487d5b0
--- /dev/null
+++ b/drivers/gpu/drm/hisilicon/Makefile
@@ -0,0 +1,4 @@
+# Makefile for hisilicon drm drivers.
+# Please keep this list sorted alphabetically
+
+obj-$(CONFIG_DRM_HISI_HIBMC) += hibmc/
\ No newline at end of file
diff --git a/drivers/gpu/drm/hisilicon/hibmc/Kconfig 
b/drivers/gpu/drm/hisilicon/hibmc/Kconfig
new file mode 100644
index 000..c60ace6
--- /dev/null
+++ b/drivers/gpu/drm/hisilicon/hibmc/Kconfig
@@ -0,0 +1,13 @@
+config DRM_HISI_HIBMC
+   tristate "DRM Support for hisilicon hibmc dispi vga interface"
+   depends on DRM && PCI
+   select DRM_KMS_HELPER
+   select DRM_KMS_FB_HELPER
+   select DRM_GEM_CMA_HELPER
+   select DRM_KMS_CMA_HELPER
+   select FB_SYS_FILLRECT
+   select FB_SYS_COPYAREA
+   select FB_SYS_IMAGEBLIT
+   help
+ Choose this option for qemu.
+ If M is selected the module will be called hibmc-drm.
diff --git a/drivers/gpu/drm/hisilicon/hibmc/Makefile 
b/drivers/gpu/drm/hisilicon/hibmc/Makefile
new file mode 100644
index 000..28e59bb
--- /dev/null
+++ b/drivers/gpu/drm/hisilicon/hibmc/Makefile
@@ -0,0 +1,5 @@
+ccflags-y := -Iinclude/drm
+hibmc-drm-y := hibmc_drm_drv.o hibmc_drm_hw.o
+
+obj-$(CONFIG_DRM_HISI_HIBMC)   +=hibmc-drm.o
+#obj-y += hibmc-drm.o
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c 
b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
new file mode 100644
index 000..444ced8
--- /dev/null
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
@@ -0,0 +1,301 @@
+/*
+ * Copyright (c) 2016 Huawei Limited.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "hibmc_drm_drv.h"
+#include "hibmc_drm_hw.h"
+
+unsigned char __iomem *mmio_bmc_vga;
+
+static const struct file_operations hibmc_fops = {
+   .owner  = THIS_MODULE,
+   .open   = drm_open,
+   .release= drm_release,
+   .unlocked_ioctl = drm_ioctl,
+#ifdef CONFIG_COMPAT
+   .compat_ioctl   = drm_compat_ioctl,
+#endif
+   .poll   = drm_poll,
+   .read   = drm_read,
+   .llseek = no_llseek,
+};
+
+int hibmc_enable_vblank(struct drm_device *dev, unsigned int pipe)
+{
+   return 0;
+}
+
+voi

[PATCH 0/7] Add DRM driver for Hisilicon hi1710

2016-02-29 Thread lijianhua
This patch set adds a new drm driver for Hisilicon hi1710.
hi1710 is an BMC controller, and now we use it in arm64 board.
In this patch set, we just support basic function for hi1710 display subsystem.
hi1710 display subsytem is connected to arm64 by PCIe as bellow:

+-++---+
| |  PCIe  |   hi1710  |
|  arm64  |<-->|  display  |
| || subsystem |
+-++---+

Hardware Detail for hi1710 display subsystem

  The display sybsystem of hi1710 is show as bellow:
  ++ +--+ +--+ ++
  || |  | |  | ||
  | FB |>|  DE  |>| VDAC |>|  External  |
  || |  | |  | |VGA |
  ++ +--+ +--+ ++

 - DE(Display Engine) is the display controller.
 - VDAC(Video Digital-to-Analog Converter) converts the RGB digital data stream 
 from DE to VGA analog signals. 

lijianhua (7):
  drm/hisilicon:Add hisilicon hibmc master driver.
  drm/hisilicon:Add plane for DE
  drm/hisilicon:Add crtc for DE
  drm/hisilicon:Add encoder for VDAC
  drm/hisilicon:Add connector for VDAC
  drm/hisilicon:Add fbdev
  MAINTAINERS:Add maintainer for hibmc DRM driver

 MAINTAINERS   |   7 +
 drivers/gpu/drm/Kconfig   |   2 +
 drivers/gpu/drm/Makefile  |   1 +
 drivers/gpu/drm/hisilicon/Kconfig |   4 +
 drivers/gpu/drm/hisilicon/Makefile|   4 +
 drivers/gpu/drm/hisilicon/hibmc/Kconfig   |  13 +
 drivers/gpu/drm/hisilicon/hibmc/Makefile  |   5 +
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c| 437 +++
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.h|  20 +
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c   | 374 +
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h   |  56 +++
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c | 290 +
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_hw.c|  83 
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_hw.h| 484 ++
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c  | 162 
 15 files changed, 1942 insertions(+)
 create mode 100644 drivers/gpu/drm/hisilicon/Kconfig
 create mode 100644 drivers/gpu/drm/hisilicon/Makefile
 create mode 100644 drivers/gpu/drm/hisilicon/hibmc/Kconfig
 create mode 100644 drivers/gpu/drm/hisilicon/hibmc/Makefile
 create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c
 create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.h
 create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
 create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
 create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c
 create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_hw.c
 create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_hw.h
 create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c

-- 
1.9.1