[PATCH] drm/kmb: Fix for build errors with Warray-bounds

2022-01-27 Thread Anitha Chrisanthus
This fixes the following build error

drivers/gpu/drm/kmb/kmb_plane.c: In function 'kmb_plane_atomic_disable':
drivers/gpu/drm/kmb/kmb_plane.c:165:34: error: array subscript 3 is
above array bounds of 'struct layer_status[2]' [-Werror=array-bounds]
  165 | kmb->plane_status[plane_id].ctrl =
  LCD_CTRL_GL2_ENABLE;
  | ~^~
  In file included from drivers/gpu/drm/kmb/kmb_plane.c:17:
  drivers/gpu/drm/kmb/kmb_drv.h:61:41: note: while referencing
  'plane_status'
  61 | struct layer_status
  plane_status[KMB_MAX_PLANES];
  | ^~~~
  drivers/gpu/drm/kmb/kmb_plane.c:162:34: error: array
  subscript 2 is above array bounds of 'struct
  layer_status[2]' [-Werror=array-bounds]
  162 |
  kmb->plane_status[plane_id].ctrl =
  LCD_CTRL_GL1_ENABLE;
  | ~^~
  In file included from
  drivers/gpu/drm/kmb/kmb_plane.c:17:
  drivers/gpu/drm/kmb/kmb_drv.h:61:41: note:
  while referencing 'plane_status'
  61 | struct layer_status
  plane_status[KMB_MAX_PLANES];
  |
  ^~~~

Fixes: 7f7b96a8a0a1 ("drm/kmb: Add support for KeemBay Display")
Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_plane.c | 6 --
 1 file changed, 6 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_plane.c b/drivers/gpu/drm/kmb/kmb_plane.c
index 00404ba4126d..2735b8eb3537 100644
--- a/drivers/gpu/drm/kmb/kmb_plane.c
+++ b/drivers/gpu/drm/kmb/kmb_plane.c
@@ -158,12 +158,6 @@ static void kmb_plane_atomic_disable(struct drm_plane 
*plane,
case LAYER_1:
kmb->plane_status[plane_id].ctrl = LCD_CTRL_VL2_ENABLE;
break;
-   case LAYER_2:
-   kmb->plane_status[plane_id].ctrl = LCD_CTRL_GL1_ENABLE;
-   break;
-   case LAYER_3:
-   kmb->plane_status[plane_id].ctrl = LCD_CTRL_GL2_ENABLE;
-   break;
}
 
kmb->plane_status[plane_id].disable = true;
-- 
2.25.1



[PATCH v4 2/2] drm/kmb: Enable support for framebuffer console

2021-10-19 Thread Anitha Chrisanthus
Enable support for fbcon (framebuffer console).

v2: added missing static clk_enable
v3: removed module parameter, use fbdev_emulation instead. Use
preferred depth of 24 for color depth. (Thomas Z.)

Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_drv.c | 4 
 1 file changed, 4 insertions(+)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index 12ce669650cc..19621535043b 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -15,6 +15,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -176,6 +177,7 @@ static int kmb_setup_mode_config(struct drm_device *drm)
drm->mode_config.min_height = KMB_FB_MIN_HEIGHT;
drm->mode_config.max_width = KMB_FB_MAX_WIDTH;
drm->mode_config.max_height = KMB_FB_MAX_HEIGHT;
+   drm->mode_config.preferred_depth = 24;
drm->mode_config.funcs = _mode_config_funcs;
 
ret = kmb_setup_crtc(drm);
@@ -559,6 +561,8 @@ static int kmb_probe(struct platform_device *pdev)
if (ret)
goto err_register;
 
+   drm_fbdev_generic_setup(>drm, 0);
+
return 0;
 
  err_register:
-- 
2.25.1



[PATCH v4 1/2] drm/kmb: Enable ADV bridge after modeset

2021-10-19 Thread Anitha Chrisanthus
On KMB, ADV bridge must be programmed and powered on prior to
MIPI DSI HW initialization.

v2: changed to atomic_bridge_chain_enable (Sam)

Fixes: 98521f4d4b4c ("drm/kmb: Mipi DSI part of the display driver")
Co-developed-by: Edmund Dea 
Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_crtc.c | 7 ---
 drivers/gpu/drm/kmb/kmb_dsi.c  | 9 +
 drivers/gpu/drm/kmb/kmb_dsi.h  | 2 +-
 3 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_crtc.c b/drivers/gpu/drm/kmb/kmb_crtc.c
index 44327bc629ca..4f240466cf63 100644
--- a/drivers/gpu/drm/kmb/kmb_crtc.c
+++ b/drivers/gpu/drm/kmb/kmb_crtc.c
@@ -66,7 +66,8 @@ static const struct drm_crtc_funcs kmb_crtc_funcs = {
.disable_vblank = kmb_crtc_disable_vblank,
 };
 
-static void kmb_crtc_set_mode(struct drm_crtc *crtc)
+static void kmb_crtc_set_mode(struct drm_crtc *crtc,
+ struct drm_atomic_state *old_state)
 {
struct drm_device *dev = crtc->dev;
struct drm_display_mode *m = >state->adjusted_mode;
@@ -75,7 +76,7 @@ static void kmb_crtc_set_mode(struct drm_crtc *crtc)
unsigned int val = 0;
 
/* Initialize mipi */
-   kmb_dsi_mode_set(kmb->kmb_dsi, m, kmb->sys_clk_mhz);
+   kmb_dsi_mode_set(kmb->kmb_dsi, m, kmb->sys_clk_mhz, old_state);
drm_info(dev,
 "vfp= %d vbp= %d vsync_len=%d hfp=%d hbp=%d hsync_len=%d\n",
 m->crtc_vsync_start - m->crtc_vdisplay,
@@ -138,7 +139,7 @@ static void kmb_crtc_atomic_enable(struct drm_crtc *crtc,
struct kmb_drm_private *kmb = crtc_to_kmb_priv(crtc);
 
clk_prepare_enable(kmb->kmb_clk.clk_lcd);
-   kmb_crtc_set_mode(crtc);
+   kmb_crtc_set_mode(crtc, state);
drm_crtc_vblank_on(crtc);
 }
 
diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
index 1793cd31b117..e4cc61fa5219 100644
--- a/drivers/gpu/drm/kmb/kmb_dsi.c
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -1322,7 +1322,8 @@ static u32 mipi_tx_init_dphy(struct kmb_dsi *kmb_dsi,
return 0;
 }
 
-static void connect_lcd_to_mipi(struct kmb_dsi *kmb_dsi)
+static void connect_lcd_to_mipi(struct kmb_dsi *kmb_dsi,
+   struct drm_atomic_state *old_state)
 {
struct regmap *msscam;
 
@@ -1331,7 +1332,7 @@ static void connect_lcd_to_mipi(struct kmb_dsi *kmb_dsi)
dev_dbg(kmb_dsi->dev, "failed to get msscam syscon");
return;
}
-
+   drm_atomic_bridge_chain_enable(adv_bridge, old_state);
/* DISABLE MIPI->CIF CONNECTION */
regmap_write(msscam, MSS_MIPI_CIF_CFG, 0);
 
@@ -1342,7 +1343,7 @@ static void connect_lcd_to_mipi(struct kmb_dsi *kmb_dsi)
 }
 
 int kmb_dsi_mode_set(struct kmb_dsi *kmb_dsi, struct drm_display_mode *mode,
-int sys_clk_mhz)
+int sys_clk_mhz, struct drm_atomic_state *old_state)
 {
u64 data_rate;
 
@@ -1395,7 +1396,7 @@ int kmb_dsi_mode_set(struct kmb_dsi *kmb_dsi, struct 
drm_display_mode *mode,
/* Dphy initialization */
mipi_tx_init_dphy(kmb_dsi, _tx_init_cfg);
 
-   connect_lcd_to_mipi(kmb_dsi);
+   connect_lcd_to_mipi(kmb_dsi, old_state);
dev_info(kmb_dsi->dev, "mipi hw initialized");
 
return 0;
diff --git a/drivers/gpu/drm/kmb/kmb_dsi.h b/drivers/gpu/drm/kmb/kmb_dsi.h
index 66b7c500d9bc..09dc88743d77 100644
--- a/drivers/gpu/drm/kmb/kmb_dsi.h
+++ b/drivers/gpu/drm/kmb/kmb_dsi.h
@@ -380,7 +380,7 @@ int kmb_dsi_host_bridge_init(struct device *dev);
 struct kmb_dsi *kmb_dsi_init(struct platform_device *pdev);
 void kmb_dsi_host_unregister(struct kmb_dsi *kmb_dsi);
 int kmb_dsi_mode_set(struct kmb_dsi *kmb_dsi, struct drm_display_mode *mode,
-int sys_clk_mhz);
+int sys_clk_mhz, struct drm_atomic_state *old_state);
 int kmb_dsi_map_mmio(struct kmb_dsi *kmb_dsi);
 int kmb_dsi_clk_init(struct kmb_dsi *kmb_dsi);
 int kmb_dsi_encoder_init(struct drm_device *dev, struct kmb_dsi *kmb_dsi);
-- 
2.25.1



[PATCH v3 6/7] drm/kmb: Enable ADV bridge after modeset

2021-10-13 Thread Anitha Chrisanthus
On KMB, ADV bridge must be programmed and powered on prior to
MIPI DSI HW initialization.

Fixes: 98521f4d4b4c ("drm/kmb: Mipi DSI part of the display driver")
Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_dsi.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
index a0669b842ff5..7ab6b7b44cbc 100644
--- a/drivers/gpu/drm/kmb/kmb_dsi.c
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -1341,6 +1341,7 @@ static void connect_lcd_to_mipi(struct kmb_dsi *kmb_dsi)
return;
}
 
+   drm_bridge_chain_enable(adv_bridge);
/* DISABLE MIPI->CIF CONNECTION */
regmap_write(msscam, MSS_MIPI_CIF_CFG, 0);
 
-- 
2.25.1



[PATCH v3 7/7] drm/kmb: Enable support for framebuffer console

2021-10-13 Thread Anitha Chrisanthus
Enable support for fbcon (framebuffer console).
The user can initialize fbcon by loading kmb-drm with the parameter
console=1.

v2: added missing static clk_enable

Signed-off-by: Edmund Dea 
Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_drv.c | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index 961ac6fb5fcf..b4e66eac63b5 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -5,6 +5,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -15,6 +16,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -24,6 +26,12 @@
 #include "kmb_dsi.h"
 #include "kmb_regs.h"
 
+/* Module Parameters */
+static bool console;
+module_param(console, bool, 0400);
+MODULE_PARM_DESC(console,
+"Enable framebuffer console support (0=disable [default], 
1=on)");
+
 static int kmb_display_clk_enable(struct kmb_drm_private *kmb)
 {
int ret = 0;
@@ -559,6 +567,9 @@ static int kmb_probe(struct platform_device *pdev)
if (ret)
goto err_register;
 
+   if (console)
+   drm_fbdev_generic_setup(>drm, 32);
+
return 0;
 
  err_register:
-- 
2.25.1



[PATCH v3 5/7] drm/kmb: Corrected typo in handle_lcd_irq

2021-10-13 Thread Anitha Chrisanthus
Check for Overflow bits for layer3 in the irq handler.

Fixes: 7f7b96a8a0a1 ("drm/kmb: Add support for KeemBay Display")
Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_drv.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index 12ce669650cc..961ac6fb5fcf 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -380,7 +380,7 @@ static irqreturn_t handle_lcd_irq(struct drm_device *dev)
if (val & LAYER3_DMA_FIFO_UNDERFLOW)
drm_dbg(>drm,
"LAYER3:GL1 DMA UNDERFLOW val = 0x%lx", val);
-   if (val & LAYER3_DMA_FIFO_UNDERFLOW)
+   if (val & LAYER3_DMA_FIFO_OVERFLOW)
drm_dbg(>drm,
"LAYER3:GL1 DMA OVERFLOW val = 0x%lx", val);
}
-- 
2.25.1



[PATCH v3 4/7] drm/kmb: Disable change of plane parameters

2021-10-13 Thread Anitha Chrisanthus
From: Edmund Dea 

Due to HW limitations, KMB cannot change height, width, or
pixel format after initial plane configuration.

v2: removed memset disp_cfg as it is already zero.

Fixes: 7f7b96a8a0a1 ("drm/kmb: Add support for KeemBay Display")
Signed-off-by: Edmund Dea 
Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_drv.h   |  1 +
 drivers/gpu/drm/kmb/kmb_plane.c | 43 -
 drivers/gpu/drm/kmb/kmb_plane.h |  6 +
 3 files changed, 49 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.h b/drivers/gpu/drm/kmb/kmb_drv.h
index d297218869e8..b3203f583a46 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.h
+++ b/drivers/gpu/drm/kmb/kmb_drv.h
@@ -57,6 +57,7 @@ struct kmb_drm_private {
spinlock_t  irq_lock;
int irq_lcd;
int sys_clk_mhz;
+   struct disp_cfg init_disp_cfg[KMB_MAX_PLANES];
struct layer_status plane_status[KMB_MAX_PLANES];
int kmb_under_flow;
int kmb_flush_done;
diff --git a/drivers/gpu/drm/kmb/kmb_plane.c b/drivers/gpu/drm/kmb/kmb_plane.c
index 06b0c42c9e91..00404ba4126d 100644
--- a/drivers/gpu/drm/kmb/kmb_plane.c
+++ b/drivers/gpu/drm/kmb/kmb_plane.c
@@ -67,8 +67,21 @@ static const u32 kmb_formats_v[] = {
 
 static unsigned int check_pixel_format(struct drm_plane *plane, u32 format)
 {
+   struct kmb_drm_private *kmb;
+   struct kmb_plane *kmb_plane = to_kmb_plane(plane);
int i;
+   int plane_id = kmb_plane->id;
+   struct disp_cfg init_disp_cfg;
 
+   kmb = to_kmb(plane->dev);
+   init_disp_cfg = kmb->init_disp_cfg[plane_id];
+   /* Due to HW limitations, changing pixel format after initial
+* plane configuration is not supported.
+*/
+   if (init_disp_cfg.format && init_disp_cfg.format != format) {
+   drm_dbg(>drm, "Cannot change format after initial plane 
configuration");
+   return -EINVAL;
+   }
for (i = 0; i < plane->format_count; i++) {
if (plane->format_types[i] == format)
return 0;
@@ -81,11 +94,17 @@ static int kmb_plane_atomic_check(struct drm_plane *plane,
 {
struct drm_plane_state *new_plane_state = 
drm_atomic_get_new_plane_state(state,

 plane);
+   struct kmb_drm_private *kmb;
+   struct kmb_plane *kmb_plane = to_kmb_plane(plane);
+   int plane_id = kmb_plane->id;
+   struct disp_cfg init_disp_cfg;
struct drm_framebuffer *fb;
int ret;
struct drm_crtc_state *crtc_state;
bool can_position;
 
+   kmb = to_kmb(plane->dev);
+   init_disp_cfg = kmb->init_disp_cfg[plane_id];
fb = new_plane_state->fb;
if (!fb || !new_plane_state->crtc)
return 0;
@@ -99,6 +118,16 @@ static int kmb_plane_atomic_check(struct drm_plane *plane,
new_plane_state->crtc_w < KMB_FB_MIN_WIDTH ||
new_plane_state->crtc_h < KMB_FB_MIN_HEIGHT)
return -EINVAL;
+
+   /* Due to HW limitations, changing plane height or width after
+* initial plane configuration is not supported.
+*/
+   if ((init_disp_cfg.width && init_disp_cfg.height) &&
+   (init_disp_cfg.width != fb->width ||
+   init_disp_cfg.height != fb->height)) {
+   drm_dbg(>drm, "Cannot change plane height or width after 
initial configuration");
+   return -EINVAL;
+   }
can_position = (plane->type == DRM_PLANE_TYPE_OVERLAY);
crtc_state =
drm_atomic_get_existing_crtc_state(state,
@@ -335,6 +364,7 @@ static void kmb_plane_atomic_update(struct drm_plane *plane,
unsigned char plane_id;
int num_planes;
static dma_addr_t addr[MAX_SUB_PLANES];
+   struct disp_cfg *init_disp_cfg;
 
if (!plane || !new_plane_state || !old_plane_state)
return;
@@ -357,7 +387,8 @@ static void kmb_plane_atomic_update(struct drm_plane *plane,
}
spin_unlock_irq(>irq_lock);
 
-   src_w = (new_plane_state->src_w >> 16);
+   init_disp_cfg = >init_disp_cfg[plane_id];
+   src_w = new_plane_state->src_w >> 16;
src_h = new_plane_state->src_h >> 16;
crtc_x = new_plane_state->crtc_x;
crtc_y = new_plane_state->crtc_y;
@@ -500,6 +531,16 @@ static void kmb_plane_atomic_update(struct drm_plane 
*plane,
 
/* Enable DMA */
kmb_write_lcd(kmb, LCD_LAYERn_DMA_CFG(plane_id), dma_cfg);
+
+   /* Save initial display config */
+   if (!init_disp_cfg->width ||
+   !init_disp_cfg->height ||
+   !init_disp_

[PATCH v3 3/7] drm/kmb: Remove clearing DPHY regs

2021-10-13 Thread Anitha Chrisanthus
From: Edmund Dea 

Don't clear the shared DPHY registers common to MIPI Rx and MIPI Tx during
DSI initialization since this was causing MIPI Rx reset. Rest of the
writes are bitwise, so will not affect Mipi Rx side.

Fixes: 98521f4d4b4c ("drm/kmb: Mipi DSI part of the display driver")
Signed-off-by: Anitha Chrisanthus 
Signed-off-by: Edmund Dea 
---
 drivers/gpu/drm/kmb/kmb_dsi.c | 5 -
 1 file changed, 5 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
index 86e8e7943e89..a0669b842ff5 100644
--- a/drivers/gpu/drm/kmb/kmb_dsi.c
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -1393,11 +1393,6 @@ int kmb_dsi_mode_set(struct kmb_dsi *kmb_dsi, struct 
drm_display_mode *mode,
mipi_tx_init_cfg.lane_rate_mbps = data_rate;
}
 
-   kmb_write_mipi(kmb_dsi, DPHY_ENABLE, 0);
-   kmb_write_mipi(kmb_dsi, DPHY_INIT_CTRL0, 0);
-   kmb_write_mipi(kmb_dsi, DPHY_INIT_CTRL1, 0);
-   kmb_write_mipi(kmb_dsi, DPHY_INIT_CTRL2, 0);
-
/* Initialize mipi controller */
mipi_tx_init_cntrl(kmb_dsi, _tx_init_cfg);
 
-- 
2.25.1



[PATCH v3 2/7] drm/kmb: Limit supported mode to 1080p

2021-10-13 Thread Anitha Chrisanthus
KMB only supports single resolution(1080p), this commit checks for
1920x1080x60 or 1920x1080x59 in crtc_mode_valid.
Also, modes with vfp < 4 are not supported in KMB display. This change
prunes display modes with vfp < 4.

v2: added vfp check

Fixes: 7f7b96a8a0a1 ("drm/kmb: Add support for KeemBay Display")
Signed-off-by: Anitha Chrisanthus 
Signed-off-by: Edmund Dea 
---
 drivers/gpu/drm/kmb/kmb_crtc.c | 34 ++
 drivers/gpu/drm/kmb/kmb_drv.h  | 13 ++---
 2 files changed, 44 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_crtc.c b/drivers/gpu/drm/kmb/kmb_crtc.c
index 44327bc629ca..08a45e813db7 100644
--- a/drivers/gpu/drm/kmb/kmb_crtc.c
+++ b/drivers/gpu/drm/kmb/kmb_crtc.c
@@ -185,11 +185,45 @@ static void kmb_crtc_atomic_flush(struct drm_crtc *crtc,
spin_unlock_irq(>dev->event_lock);
 }
 
+static enum drm_mode_status
+   kmb_crtc_mode_valid(struct drm_crtc *crtc,
+   const struct drm_display_mode *mode)
+{
+   int refresh;
+   struct drm_device *dev = crtc->dev;
+   int vfp = mode->vsync_start - mode->vdisplay;
+
+   if (mode->vdisplay < KMB_CRTC_MAX_HEIGHT) {
+   drm_dbg(dev, "height = %d less than %d",
+   mode->vdisplay, KMB_CRTC_MAX_HEIGHT);
+   return MODE_BAD_VVALUE;
+   }
+   if (mode->hdisplay < KMB_CRTC_MAX_WIDTH) {
+   drm_dbg(dev, "width = %d less than %d",
+   mode->hdisplay, KMB_CRTC_MAX_WIDTH);
+   return MODE_BAD_HVALUE;
+   }
+   refresh = drm_mode_vrefresh(mode);
+   if (refresh < KMB_MIN_VREFRESH || refresh > KMB_MAX_VREFRESH) {
+   drm_dbg(dev, "refresh = %d less than %d or greater than %d",
+   refresh, KMB_MIN_VREFRESH, KMB_MAX_VREFRESH);
+   return MODE_BAD;
+   }
+
+   if (vfp < KMB_CRTC_MIN_VFP) {
+   drm_dbg(dev, "vfp = %d less than %d", vfp, KMB_CRTC_MIN_VFP);
+   return MODE_BAD;
+   }
+
+   return MODE_OK;
+}
+
 static const struct drm_crtc_helper_funcs kmb_crtc_helper_funcs = {
.atomic_begin = kmb_crtc_atomic_begin,
.atomic_enable = kmb_crtc_atomic_enable,
.atomic_disable = kmb_crtc_atomic_disable,
.atomic_flush = kmb_crtc_atomic_flush,
+   .mode_valid = kmb_crtc_mode_valid,
 };
 
 int kmb_setup_crtc(struct drm_device *drm)
diff --git a/drivers/gpu/drm/kmb/kmb_drv.h b/drivers/gpu/drm/kmb/kmb_drv.h
index 69a62e2d03ff..d297218869e8 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.h
+++ b/drivers/gpu/drm/kmb/kmb_drv.h
@@ -18,13 +18,20 @@
 
 #define DRIVER_DATE"20210223"
 #define DRIVER_MAJOR   1
-#define DRIVER_MINOR   1
-
+#define DRIVER_MINOR   2
+
+/* Platform definitions */
+#define KMB_CRTC_MIN_VFP   4
+#define KMB_CRTC_MAX_WIDTH 1920 /* max width in pixels */
+#define KMB_CRTC_MAX_HEIGHT1080 /* max height in pixels */
+#define KMB_CRTC_MIN_WIDTH 1920
+#define KMB_CRTC_MIN_HEIGHT1080
 #define KMB_FB_MAX_WIDTH   1920
 #define KMB_FB_MAX_HEIGHT  1080
 #define KMB_FB_MIN_WIDTH   1
 #define KMB_FB_MIN_HEIGHT  1
-
+#define KMB_MIN_VREFRESH   59/*vertical refresh in Hz */
+#define KMB_MAX_VREFRESH   60/*vertical refresh in Hz */
 #define KMB_LCD_DEFAULT_CLK2
 #define KMB_SYS_CLK_MHZ500
 
-- 
2.25.1



[PATCH v3 1/7] drm/kmb: Work around for higher system clock

2021-10-13 Thread Anitha Chrisanthus
Use a different value for system clock offset in the
ppl/llp ratio calculations for clocks higher than 500 Mhz.

Fixes: 98521f4d4b4c ("drm/kmb: Mipi DSI part of the display driver")
Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_dsi.c | 11 ++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
index 1793cd31b117..86e8e7943e89 100644
--- a/drivers/gpu/drm/kmb/kmb_dsi.c
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -482,6 +482,10 @@ static u32 mipi_tx_fg_section_cfg(struct kmb_dsi *kmb_dsi,
return 0;
 }
 
+#define CLK_DIFF_LOW 50
+#define CLK_DIFF_HI 60
+#define SYSCLK_500  500
+
 static void mipi_tx_fg_cfg_regs(struct kmb_dsi *kmb_dsi, u8 frame_gen,
struct mipi_tx_frame_timing_cfg *fg_cfg)
 {
@@ -492,7 +496,12 @@ static void mipi_tx_fg_cfg_regs(struct kmb_dsi *kmb_dsi, 
u8 frame_gen,
/* 500 Mhz system clock minus 50 to account for the difference in
 * MIPI clock speed in RTL tests
 */
-   sysclk = kmb_dsi->sys_clk_mhz - 50;
+   if (kmb_dsi->sys_clk_mhz == SYSCLK_500) {
+   sysclk = kmb_dsi->sys_clk_mhz - CLK_DIFF_LOW;
+   } else {
+   /* 700 Mhz clk*/
+   sysclk = kmb_dsi->sys_clk_mhz - CLK_DIFF_HI;
+   }
 
/* PPL-Pixel Packing Layer, LLP-Low Level Protocol
 * Frame genartor timing parameters are clocked on the system clock,
-- 
2.25.1



[PATCH v2 8/8] drm/kmb: Enable support for fbcon (framebuffer console)

2021-08-03 Thread Anitha Chrisanthus
From: Edmund Dea 

Enable support for fbcon (framebuffer console).
The user can initialize fbcon by loading kmb-drm with the parameter
console=1.

v2: added missing static clk_enable

Signed-off-by: Edmund Dea 
Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_drv.c | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index bb7eca9e13ae..b4c29ae297c8 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -5,6 +5,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -15,6 +16,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -25,6 +27,12 @@
 #include "kmb_dsi.h"
 #include "kmb_regs.h"
 
+/* Module Parameters */
+static bool console;
+module_param(console, bool, 0400);
+MODULE_PARM_DESC(console,
+"Enable framebuffer console support (0=disable [default], 
1=on)");
+
 static int kmb_display_clk_enable(struct kmb_drm_private *kmb)
 {
int ret = 0;
@@ -545,6 +553,9 @@ static int kmb_probe(struct platform_device *pdev)
if (ret)
goto err_register;
 
+   if (console)
+   drm_fbdev_generic_setup(>drm, 32);
+
return 0;
 
  err_register:
-- 
2.25.1



[PATCH v2 7/8] drm/kmb: Enable ADV bridge after modeset

2021-08-03 Thread Anitha Chrisanthus
On KMB, ADV bridge must be programmed and powered on prior to
MIPI DSI HW initialization.

Fixes: 98521f4d4b4c ("drm/kmb: Mipi DSI part of the display driver")
Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_dsi.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
index 5bc6c84073a3..1cca0fe6f35f 100644
--- a/drivers/gpu/drm/kmb/kmb_dsi.c
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -1341,6 +1341,7 @@ static void connect_lcd_to_mipi(struct kmb_dsi *kmb_dsi)
return;
}
 
+   drm_bridge_chain_enable(adv_bridge);
/* DISABLE MIPI->CIF CONNECTION */
regmap_write(msscam, MSS_MIPI_CIF_CFG, 0);
 
-- 
2.25.1



[PATCH v2 6/8] drm/kmb: Corrected typo in handle_lcd_irq

2021-08-03 Thread Anitha Chrisanthus
Check for Overflow bits for layer3 in the irq handler.

Fixes: 7f7b96a8a0a1 ("drm/kmb: Add support for KeemBay Display")
Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_drv.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index f54392ec4fab..bb7eca9e13ae 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -381,7 +381,7 @@ static irqreturn_t handle_lcd_irq(struct drm_device *dev)
if (val & LAYER3_DMA_FIFO_UNDERFLOW)
drm_dbg(>drm,
"LAYER3:GL1 DMA UNDERFLOW val = 0x%lx", val);
-   if (val & LAYER3_DMA_FIFO_UNDERFLOW)
+   if (val & LAYER3_DMA_FIFO_OVERFLOW)
drm_dbg(>drm,
"LAYER3:GL1 DMA OVERFLOW val = 0x%lx", val);
}
-- 
2.25.1



[PATCH v2 5/8] drm/kmb: Disable change of plane parameters

2021-08-03 Thread Anitha Chrisanthus
From: Edmund Dea 

Due to HW limitations, KMB cannot change height, width, or
pixel format after initial plane configuration.

Fixes: 7f7b96a8a0a1 ("drm/kmb: Add support for KeemBay Display")
Signed-off-by: Edmund Dea 
Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_crtc.c  |  2 ++
 drivers/gpu/drm/kmb/kmb_drv.h   |  1 +
 drivers/gpu/drm/kmb/kmb_plane.c | 44 -
 drivers/gpu/drm/kmb/kmb_plane.h |  6 +
 4 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/kmb/kmb_crtc.c b/drivers/gpu/drm/kmb/kmb_crtc.c
index 08a45e813db7..0e42c40f0dce 100644
--- a/drivers/gpu/drm/kmb/kmb_crtc.c
+++ b/drivers/gpu/drm/kmb/kmb_crtc.c
@@ -232,6 +232,8 @@ int kmb_setup_crtc(struct drm_device *drm)
struct kmb_plane *primary;
int ret;
 
+   memset(kmb->init_disp_cfg, 0, sizeof(kmb->init_disp_cfg));
+
primary = kmb_plane_init(drm);
if (IS_ERR(primary))
return PTR_ERR(primary);
diff --git a/drivers/gpu/drm/kmb/kmb_drv.h b/drivers/gpu/drm/kmb/kmb_drv.h
index d297218869e8..b3203f583a46 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.h
+++ b/drivers/gpu/drm/kmb/kmb_drv.h
@@ -57,6 +57,7 @@ struct kmb_drm_private {
spinlock_t  irq_lock;
int irq_lcd;
int sys_clk_mhz;
+   struct disp_cfg init_disp_cfg[KMB_MAX_PLANES];
struct layer_status plane_status[KMB_MAX_PLANES];
int kmb_under_flow;
int kmb_flush_done;
diff --git a/drivers/gpu/drm/kmb/kmb_plane.c b/drivers/gpu/drm/kmb/kmb_plane.c
index e61c2798c206..ae4ebba5ea2a 100644
--- a/drivers/gpu/drm/kmb/kmb_plane.c
+++ b/drivers/gpu/drm/kmb/kmb_plane.c
@@ -71,12 +71,26 @@ static const u32 kmb_formats_v[] = {
 
 static unsigned int check_pixel_format(struct drm_plane *plane, u32 format)
 {
+   struct kmb_drm_private *kmb;
+   struct kmb_plane *kmb_plane = to_kmb_plane(plane);
int i;
+   int plane_id = kmb_plane->id;
+   struct disp_cfg init_disp_cfg;
 
+   kmb = to_kmb(plane->dev);
+   init_disp_cfg = kmb->init_disp_cfg[plane_id];
+   /* Due to HW limitations, changing pixel format after initial
+* plane configuration is not supported.
+*/
+   if (init_disp_cfg.format && init_disp_cfg.format != format) {
+   drm_dbg(>drm, "Cannot change format after initial plane 
configuration");
+   return -EINVAL;
+   }
for (i = 0; i < plane->format_count; i++) {
if (plane->format_types[i] == format)
return 0;
}
+
return -EINVAL;
 }
 
@@ -85,11 +99,17 @@ static int kmb_plane_atomic_check(struct drm_plane *plane,
 {
struct drm_plane_state *new_plane_state = 
drm_atomic_get_new_plane_state(state,

 plane);
+   struct kmb_drm_private *kmb;
+   struct kmb_plane *kmb_plane = to_kmb_plane(plane);
+   int plane_id = kmb_plane->id;
+   struct disp_cfg init_disp_cfg;
struct drm_framebuffer *fb;
int ret;
struct drm_crtc_state *crtc_state;
bool can_position;
 
+   kmb = to_kmb(plane->dev);
+   init_disp_cfg = kmb->init_disp_cfg[plane_id];
fb = new_plane_state->fb;
if (!fb || !new_plane_state->crtc)
return 0;
@@ -102,6 +122,16 @@ static int kmb_plane_atomic_check(struct drm_plane *plane,
return -EINVAL;
if (new_plane_state->crtc_w < KMB_MIN_WIDTH || new_plane_state->crtc_h 
< KMB_MIN_HEIGHT)
return -EINVAL;
+
+   /* Due to HW limitations, changing plane height or width after
+* initial plane configuration is not supported.
+*/
+   if ((init_disp_cfg.width && init_disp_cfg.height) &&
+   (init_disp_cfg.width != fb->width ||
+   init_disp_cfg.height != fb->height)) {
+   drm_dbg(>drm, "Cannot change plane height or width after 
initial configuration");
+   return -EINVAL;
+   }
can_position = (plane->type == DRM_PLANE_TYPE_OVERLAY);
crtc_state =
drm_atomic_get_existing_crtc_state(state,
@@ -300,6 +330,7 @@ static void kmb_plane_atomic_update(struct drm_plane *plane,
unsigned char plane_id;
int num_planes;
static dma_addr_t addr[MAX_SUB_PLANES];
+   struct disp_cfg *init_disp_cfg;
struct viv_vidmem_metadata *md = NULL;
struct drm_gem_object *gem_obj;
unsigned int cb_stride, cr_stride;
@@ -324,7 +355,8 @@ static void kmb_plane_atomic_update(struct drm_plane *plane,
}
spin_unlock_irq(>irq_lock);
 
-   src_w = (new_plane_state->src_w >> 16);
+ 

[PATCH v2 3/8] drm/kmb: Limit supported mode to 1080p

2021-08-03 Thread Anitha Chrisanthus
KMB only supports single resolution(1080p), this commit checks for
1920x1080x60 or 1920x1080x59 in crtc_mode_valid.
Also, modes with vfp < 4 are not supported in KMB display. This change
prunes display modes with vfp < 4.

v2: added vfp check

Fixes: 7f7b96a8a0a1 ("drm/kmb: Add support for KeemBay Display")
Signed-off-by: Anitha Chrisanthus 
Signed-off-by: Edmund Dea 
---
 drivers/gpu/drm/kmb/kmb_crtc.c | 34 ++
 drivers/gpu/drm/kmb/kmb_drv.h  | 16 ++--
 2 files changed, 48 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_crtc.c b/drivers/gpu/drm/kmb/kmb_crtc.c
index 44327bc629ca..08a45e813db7 100644
--- a/drivers/gpu/drm/kmb/kmb_crtc.c
+++ b/drivers/gpu/drm/kmb/kmb_crtc.c
@@ -185,11 +185,45 @@ static void kmb_crtc_atomic_flush(struct drm_crtc *crtc,
spin_unlock_irq(>dev->event_lock);
 }
 
+static enum drm_mode_status
+   kmb_crtc_mode_valid(struct drm_crtc *crtc,
+   const struct drm_display_mode *mode)
+{
+   int refresh;
+   struct drm_device *dev = crtc->dev;
+   int vfp = mode->vsync_start - mode->vdisplay;
+
+   if (mode->vdisplay < KMB_CRTC_MAX_HEIGHT) {
+   drm_dbg(dev, "height = %d less than %d",
+   mode->vdisplay, KMB_CRTC_MAX_HEIGHT);
+   return MODE_BAD_VVALUE;
+   }
+   if (mode->hdisplay < KMB_CRTC_MAX_WIDTH) {
+   drm_dbg(dev, "width = %d less than %d",
+   mode->hdisplay, KMB_CRTC_MAX_WIDTH);
+   return MODE_BAD_HVALUE;
+   }
+   refresh = drm_mode_vrefresh(mode);
+   if (refresh < KMB_MIN_VREFRESH || refresh > KMB_MAX_VREFRESH) {
+   drm_dbg(dev, "refresh = %d less than %d or greater than %d",
+   refresh, KMB_MIN_VREFRESH, KMB_MAX_VREFRESH);
+   return MODE_BAD;
+   }
+
+   if (vfp < KMB_CRTC_MIN_VFP) {
+   drm_dbg(dev, "vfp = %d less than %d", vfp, KMB_CRTC_MIN_VFP);
+   return MODE_BAD;
+   }
+
+   return MODE_OK;
+}
+
 static const struct drm_crtc_helper_funcs kmb_crtc_helper_funcs = {
.atomic_begin = kmb_crtc_atomic_begin,
.atomic_enable = kmb_crtc_atomic_enable,
.atomic_disable = kmb_crtc_atomic_disable,
.atomic_flush = kmb_crtc_atomic_flush,
+   .mode_valid = kmb_crtc_mode_valid,
 };
 
 int kmb_setup_crtc(struct drm_device *drm)
diff --git a/drivers/gpu/drm/kmb/kmb_drv.h b/drivers/gpu/drm/kmb/kmb_drv.h
index ebbaa5f422d5..d297218869e8 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.h
+++ b/drivers/gpu/drm/kmb/kmb_drv.h
@@ -18,8 +18,20 @@
 
 #define DRIVER_DATE"20210223"
 #define DRIVER_MAJOR   1
-#define DRIVER_MINOR   1
-
+#define DRIVER_MINOR   2
+
+/* Platform definitions */
+#define KMB_CRTC_MIN_VFP   4
+#define KMB_CRTC_MAX_WIDTH 1920 /* max width in pixels */
+#define KMB_CRTC_MAX_HEIGHT1080 /* max height in pixels */
+#define KMB_CRTC_MIN_WIDTH 1920
+#define KMB_CRTC_MIN_HEIGHT1080
+#define KMB_FB_MAX_WIDTH   1920
+#define KMB_FB_MAX_HEIGHT  1080
+#define KMB_FB_MIN_WIDTH   1
+#define KMB_FB_MIN_HEIGHT  1
+#define KMB_MIN_VREFRESH   59/*vertical refresh in Hz */
+#define KMB_MAX_VREFRESH   60/*vertical refresh in Hz */
 #define KMB_LCD_DEFAULT_CLK2
 #define KMB_SYS_CLK_MHZ500
 
-- 
2.25.1



[PATCH v2 4/8] drm/kmb: Remove clearing DPHY regs

2021-08-03 Thread Anitha Chrisanthus
From: Edmund Dea 

Don't clear the shared DPHY registers common to MIPI Rx and MIPI Tx during
DSI initialization since this was causing MIPI Rx reset. Rest of the
writes are bitwise, so do not affect Mipi Rx side.

Fixes: 98521f4d4b4c ("drm/kmb: Mipi DSI part of the display driver")
Signed-off-by: Anitha Chrisanthus 
Signed-off-by: Edmund Dea 
---
 drivers/gpu/drm/kmb/kmb_dsi.c | 5 -
 1 file changed, 5 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
index 7e2371ffcb18..5bc6c84073a3 100644
--- a/drivers/gpu/drm/kmb/kmb_dsi.c
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -1393,11 +1393,6 @@ int kmb_dsi_mode_set(struct kmb_dsi *kmb_dsi, struct 
drm_display_mode *mode,
mipi_tx_init_cfg.lane_rate_mbps = data_rate;
}
 
-   kmb_write_mipi(kmb_dsi, DPHY_ENABLE, 0);
-   kmb_write_mipi(kmb_dsi, DPHY_INIT_CTRL0, 0);
-   kmb_write_mipi(kmb_dsi, DPHY_INIT_CTRL1, 0);
-   kmb_write_mipi(kmb_dsi, DPHY_INIT_CTRL2, 0);
-
/* Initialize mipi controller */
mipi_tx_init_cntrl(kmb_dsi, _tx_init_cfg);
 
-- 
2.25.1



[PATCH v2 2/8] drm/kmb : W/A for 256B cache alignment for video

2021-08-03 Thread Anitha Chrisanthus
For B0 silicon, the media driver pads the decoded video dmabufs for 256B
alignment. This is the backing buffer of the framebuffer and info in the
drm frame buffer is not correct for these buffers as this is done
internally in the media driver. This change extracts the meta data info
from dmabuf priv structure and uses that info for programming stride and
offsets in kmb_plane_atomic_update().

v2: simplified logic

Fixes: 7f7b96a8a0a1 ("drm/kmb: Add support for KeemBay Display")
Signed-off-by: Edmund Dea 
Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_plane.c  | 58 ++--
 drivers/gpu/drm/kmb/kmb_vidmem.h | 52 
 2 files changed, 99 insertions(+), 11 deletions(-)
 create mode 100644 drivers/gpu/drm/kmb/kmb_vidmem.h

diff --git a/drivers/gpu/drm/kmb/kmb_plane.c b/drivers/gpu/drm/kmb/kmb_plane.c
index ecee6782612d..e61c2798c206 100644
--- a/drivers/gpu/drm/kmb/kmb_plane.c
+++ b/drivers/gpu/drm/kmb/kmb_plane.c
@@ -3,6 +3,8 @@
  * Copyright © 2018-2020 Intel Corporation
  */
 
+#include 
+
 #include 
 #include 
 #include 
@@ -11,12 +13,14 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 
 #include "kmb_drv.h"
 #include "kmb_plane.h"
 #include "kmb_regs.h"
+#include "kmb_vidmem.h"
 
 const u32 layer_irqs[] = {
LCD_INT_VL0,
@@ -296,6 +300,9 @@ static void kmb_plane_atomic_update(struct drm_plane *plane,
unsigned char plane_id;
int num_planes;
static dma_addr_t addr[MAX_SUB_PLANES];
+   struct viv_vidmem_metadata *md = NULL;
+   struct drm_gem_object *gem_obj;
+   unsigned int cb_stride, cr_stride;
 
if (!plane || !new_plane_state || !old_plane_state)
return;
@@ -325,6 +332,16 @@ static void kmb_plane_atomic_update(struct drm_plane 
*plane,
drm_dbg(>drm,
"src_w=%d src_h=%d, fb->format->format=0x%x fb->flags=0x%x\n",
  src_w, src_h, fb->format->format, fb->flags);
+   gem_obj = drm_gem_fb_get_obj(fb, plane_id);
+   if (gem_obj && gem_obj->import_attach &&
+   gem_obj->import_attach->dmabuf &&
+   gem_obj->import_attach->dmabuf->priv) {
+   md = gem_obj->import_attach->dmabuf->priv;
+
+   /* Check if metadata is coming from hantro driver */
+   if (md->magic != HANTRO_IMAGE_VIV_META_DATA_MAGIC)
+   md = NULL;
+   }
 
width = fb->width;
height = fb->height;
@@ -332,8 +349,13 @@ static void kmb_plane_atomic_update(struct drm_plane 
*plane,
drm_dbg(>drm, "dma_len=%d ", dma_len);
kmb_write_lcd(kmb, LCD_LAYERn_DMA_LEN(plane_id), dma_len);
kmb_write_lcd(kmb, LCD_LAYERn_DMA_LEN_SHADOW(plane_id), dma_len);
-   kmb_write_lcd(kmb, LCD_LAYERn_DMA_LINE_VSTRIDE(plane_id),
- fb->pitches[0]);
+   if (md) {
+   kmb_write_lcd(kmb, LCD_LAYERn_DMA_LINE_VSTRIDE(plane_id),
+ md->plane[0].stride);
+   } else {
+   kmb_write_lcd(kmb, LCD_LAYERn_DMA_LINE_VSTRIDE(plane_id),
+ fb->pitches[0]);
+   }
kmb_write_lcd(kmb, LCD_LAYERn_DMA_LINE_WIDTH(plane_id),
  (width * fb->format->cpp[0]));
 
@@ -344,13 +366,19 @@ static void kmb_plane_atomic_update(struct drm_plane 
*plane,
val |= get_bits_per_pixel(fb->format);
/* Program Cb/Cr for planar formats */
if (num_planes > 1) {
-   kmb_write_lcd(kmb, LCD_LAYERn_DMA_CB_LINE_VSTRIDE(plane_id),
- width * fb->format->cpp[0]);
-   kmb_write_lcd(kmb, LCD_LAYERn_DMA_CB_LINE_WIDTH(plane_id),
- (width * fb->format->cpp[0]));
-
-   addr[U_PLANE] = drm_fb_cma_get_gem_addr(fb, new_plane_state,
-   U_PLANE);
+   cb_stride = md ? md->plane[1].stride :
+   width * fb->format->cpp[0];
+   kmb_write_lcd(kmb,
+ LCD_LAYERn_DMA_CB_LINE_VSTRIDE(plane_id),
+ cb_stride);
+
+   if (md) {
+   addr[U_PLANE] = addr[Y_PLANE] + md->plane[1].offset;
+   } else {
+   addr[U_PLANE] = drm_fb_cma_get_gem_addr(fb,
+   new_plane_state,
+   U_PLANE);
+   }
/* check if Cb/Cr is swapped*/
if (num_planes == 3 && (val & LCD_LAYER_CRCB_ORDER))
kmb_write_lcd(kmb,
@@ -362,17 +390,25 @@ static void kmb_plane_atomic_update(struct drm_plane 
*plane,

[PATCH v2 1/8] drm/kmb: Work around for higher system clock

2021-08-03 Thread Anitha Chrisanthus
Use a different value for system clock offset in the
ppl/llp ratio calculations for clocks higher than 500 Mhz.

Fixes: 98521f4d4b4c ("drm/kmb: Mipi DSI part of the display driver")
Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_dsi.c | 11 ++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
index 231041b269f5..7e2371ffcb18 100644
--- a/drivers/gpu/drm/kmb/kmb_dsi.c
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -482,6 +482,10 @@ static u32 mipi_tx_fg_section_cfg(struct kmb_dsi *kmb_dsi,
return 0;
 }
 
+#define CLK_DIFF_LOW 50
+#define CLK_DIFF_HI 60
+#define SYSCLK_500  500
+
 static void mipi_tx_fg_cfg_regs(struct kmb_dsi *kmb_dsi, u8 frame_gen,
struct mipi_tx_frame_timing_cfg *fg_cfg)
 {
@@ -492,7 +496,12 @@ static void mipi_tx_fg_cfg_regs(struct kmb_dsi *kmb_dsi, 
u8 frame_gen,
/* 500 Mhz system clock minus 50 to account for the difference in
 * MIPI clock speed in RTL tests
 */
-   sysclk = kmb_dsi->sys_clk_mhz - 50;
+   if (kmb_dsi->sys_clk_mhz == SYSCLK_500) {
+   sysclk = kmb_dsi->sys_clk_mhz - CLK_DIFF_LOW;
+   } else {
+   /* 700 Mhz clk*/
+   sysclk = kmb_dsi->sys_clk_mhz - CLK_DIFF_HI;
+   }
 
/* PPL-Pixel Packing Layer, LLP-Low Level Protocol
 * Frame genartor timing parameters are clocked on the system clock,
-- 
2.25.1



[PATCH 14/14] drm/kmb: Enable support for fbcon (framebuffer console)

2021-07-27 Thread Anitha Chrisanthus
From: Edmund Dea 

Enable support for fbcon (framebuffer console).
The user can initialize fbcon by loading kmb-drm with the parameter
console=1.

Signed-off-by: Edmund Dea 
Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_drv.c | 13 -
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index d0de1db03493..d39d004f513a 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -5,6 +5,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -15,6 +16,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -25,7 +27,13 @@
 #include "kmb_dsi.h"
 #include "kmb_regs.h"
 
-static int kmb_display_clk_enable(struct kmb_drm_private *kmb)
+/* Module Parameters */
+static bool console;
+module_param(console, bool, 0400);
+MODULE_PARM_DESC(console,
+"Enable framebuffer console support (0=disable [default], 
1=on)");
+
+int kmb_display_clk_enable(struct kmb_drm_private *kmb)
 {
int ret = 0;
 
@@ -546,6 +554,9 @@ static int kmb_probe(struct platform_device *pdev)
if (ret)
goto err_register;
 
+   if (console)
+   drm_fbdev_generic_setup(>drm, 32);
+
return 0;
 
  err_register:
-- 
2.25.1



[PATCH 11/14] drm/kmb: Prune display modes with CRTC vfp < 4

2021-07-27 Thread Anitha Chrisanthus
From: Edmund Dea 

Monitors with vfp < 4 are not supported in KMB display. This change
prunes display modes with vfp < 4.

Fixes: 7f7b96a8a0a1 ("drm/kmb: Add support for KeemBay Display")
Signed-off-by: Edmund Dea 
---
 drivers/gpu/drm/kmb/kmb_crtc.c | 6 ++
 drivers/gpu/drm/kmb/kmb_drv.h  | 1 +
 2 files changed, 7 insertions(+)

diff --git a/drivers/gpu/drm/kmb/kmb_crtc.c b/drivers/gpu/drm/kmb/kmb_crtc.c
index 42c8010ef2f6..0e42c40f0dce 100644
--- a/drivers/gpu/drm/kmb/kmb_crtc.c
+++ b/drivers/gpu/drm/kmb/kmb_crtc.c
@@ -191,6 +191,7 @@ static enum drm_mode_status
 {
int refresh;
struct drm_device *dev = crtc->dev;
+   int vfp = mode->vsync_start - mode->vdisplay;
 
if (mode->vdisplay < KMB_CRTC_MAX_HEIGHT) {
drm_dbg(dev, "height = %d less than %d",
@@ -209,6 +210,11 @@ static enum drm_mode_status
return MODE_BAD;
}
 
+   if (vfp < KMB_CRTC_MIN_VFP) {
+   drm_dbg(dev, "vfp = %d less than %d", vfp, KMB_CRTC_MIN_VFP);
+   return MODE_BAD;
+   }
+
return MODE_OK;
 }
 
diff --git a/drivers/gpu/drm/kmb/kmb_drv.h b/drivers/gpu/drm/kmb/kmb_drv.h
index dc0679a70cc5..c4af1d927e45 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.h
+++ b/drivers/gpu/drm/kmb/kmb_drv.h
@@ -21,6 +21,7 @@
 #define DRIVER_MINOR   2
 
 /* Platform definitions */
+#define KMB_CRTC_MIN_VFP   4
 #define KMB_CRTC_MAX_WIDTH 1920 /* max width in pixels */
 #define KMB_CRTC_MAX_HEIGHT1080 /* max height in pixels */
 #define KMB_CRTC_MIN_WIDTH 1920
-- 
2.25.1



[PATCH 12/14] drm/kmb: Fix possible oops in error handling

2021-07-27 Thread Anitha Chrisanthus
If kmb_dsi_init() fails the "kmb->kmb_dsi" variable is an error pointer.
This can potentially result in kernel panic when kmb_dsi_host_unregister is
called.

Fixes: 7f7b96a8a0a1 ("drm/kmb: Add support for KeemBay Display")
Fixes: 98521f4d4b4c ("drm/kmb: Mipi DSI part of the display driver")
Cc: Dan Carpenter 
Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_drv.c | 9 ++---
 drivers/gpu/drm/kmb/kmb_dsi.c | 9 +
 drivers/gpu/drm/kmb/kmb_dsi.h | 3 ++-
 3 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index bb7eca9e13ae..12f35c43d838 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -454,8 +454,9 @@ static int kmb_remove(struct platform_device *pdev)
dev_set_drvdata(dev, NULL);
 
/* Unregister DSI host */
-   kmb_dsi_host_unregister(kmb->kmb_dsi);
+   kmb_dsi_host_unregister();
drm_atomic_helper_shutdown(drm);
+   drm_dev_put(drm);
return 0;
 }
 
@@ -519,7 +520,7 @@ static int kmb_probe(struct platform_device *pdev)
if (IS_ERR(kmb->kmb_dsi)) {
drm_err(>drm, "failed to initialize DSI\n");
ret = PTR_ERR(kmb->kmb_dsi);
-   goto err_free1;
+   goto err_free2;
}
 
kmb->kmb_dsi->dev = _pdev->dev;
@@ -555,8 +556,10 @@ static int kmb_probe(struct platform_device *pdev)
drm_crtc_cleanup(>crtc);
drm_mode_config_cleanup(>drm);
  err_free1:
+   kmb_dsi_clk_disable(kmb->kmb_dsi);
+ err_free2:
dev_set_drvdata(dev, NULL);
-   kmb_dsi_host_unregister(kmb->kmb_dsi);
+   kmb_dsi_host_unregister();
 
return ret;
 }
diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
index 1cca0fe6f35f..a500172ada87 100644
--- a/drivers/gpu/drm/kmb/kmb_dsi.c
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -172,17 +172,17 @@ mipi_hs_freq_range[MIPI_DPHY_DEFAULT_BIT_RATES] = {
{.default_bit_rate_mbps = 2500, .hsfreqrange_code = 0x49}
 };
 
-static void kmb_dsi_clk_disable(struct kmb_dsi *kmb_dsi)
+void kmb_dsi_clk_disable(struct kmb_dsi *kmb_dsi)
 {
clk_disable_unprepare(kmb_dsi->clk_mipi);
clk_disable_unprepare(kmb_dsi->clk_mipi_ecfg);
clk_disable_unprepare(kmb_dsi->clk_mipi_cfg);
 }
 
-void kmb_dsi_host_unregister(struct kmb_dsi *kmb_dsi)
+void kmb_dsi_host_unregister(void)
 {
-   kmb_dsi_clk_disable(kmb_dsi);
-   mipi_dsi_host_unregister(kmb_dsi->host);
+   if (dsi_host)
+   mipi_dsi_host_unregister(dsi_host);
 }
 
 /*
@@ -229,6 +229,7 @@ int kmb_dsi_host_bridge_init(struct device *dev)
dsi_device = kzalloc(sizeof(*dsi_device), GFP_KERNEL);
if (!dsi_device) {
kfree(dsi_host);
+   dsi_host = NULL;
return -ENOMEM;
}
}
diff --git a/drivers/gpu/drm/kmb/kmb_dsi.h b/drivers/gpu/drm/kmb/kmb_dsi.h
index 66b7c500d9bc..89e85c993609 100644
--- a/drivers/gpu/drm/kmb/kmb_dsi.h
+++ b/drivers/gpu/drm/kmb/kmb_dsi.h
@@ -378,7 +378,8 @@ static inline void kmb_clr_bit_mipi(struct kmb_dsi *kmb_dsi,
 
 int kmb_dsi_host_bridge_init(struct device *dev);
 struct kmb_dsi *kmb_dsi_init(struct platform_device *pdev);
-void kmb_dsi_host_unregister(struct kmb_dsi *kmb_dsi);
+void kmb_dsi_host_unregister(void);
+void kmb_dsi_clk_disable(struct kmb_dsi *kmb_dsi);
 int kmb_dsi_mode_set(struct kmb_dsi *kmb_dsi, struct drm_display_mode *mode,
 int sys_clk_mhz);
 int kmb_dsi_map_mmio(struct kmb_dsi *kmb_dsi);
-- 
2.25.1



[PATCH 13/14] drm/kmb: Enable alpha blended second plane

2021-07-27 Thread Anitha Chrisanthus
From: Edmund Dea 

Enable one additional plane that is alpha blended on top
of the primary plane.

Signed-off-by: Edmund Dea 
---
 drivers/gpu/drm/kmb/kmb_drv.c   |  8 ++--
 drivers/gpu/drm/kmb/kmb_plane.c | 81 +
 drivers/gpu/drm/kmb/kmb_plane.h |  5 +-
 drivers/gpu/drm/kmb/kmb_regs.h  |  3 ++
 4 files changed, 82 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index 12f35c43d838..d0de1db03493 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -173,10 +173,10 @@ static int kmb_setup_mode_config(struct drm_device *drm)
ret = drmm_mode_config_init(drm);
if (ret)
return ret;
-   drm->mode_config.min_width = KMB_MIN_WIDTH;
-   drm->mode_config.min_height = KMB_MIN_HEIGHT;
-   drm->mode_config.max_width = KMB_MAX_WIDTH;
-   drm->mode_config.max_height = KMB_MAX_HEIGHT;
+   drm->mode_config.min_width = KMB_FB_MIN_WIDTH;
+   drm->mode_config.min_height = KMB_FB_MIN_HEIGHT;
+   drm->mode_config.max_width = KMB_FB_MAX_WIDTH;
+   drm->mode_config.max_height = KMB_FB_MAX_HEIGHT;
drm->mode_config.funcs = _mode_config_funcs;
 
ret = kmb_setup_crtc(drm);
diff --git a/drivers/gpu/drm/kmb/kmb_plane.c b/drivers/gpu/drm/kmb/kmb_plane.c
index 4523af949ea1..cbe4e981d73e 100644
--- a/drivers/gpu/drm/kmb/kmb_plane.c
+++ b/drivers/gpu/drm/kmb/kmb_plane.c
@@ -118,9 +118,10 @@ static int kmb_plane_atomic_check(struct drm_plane *plane,
if (ret)
return ret;
 
-   if (new_plane_state->crtc_w > KMB_MAX_WIDTH || new_plane_state->crtc_h 
> KMB_MAX_HEIGHT)
-   return -EINVAL;
-   if (new_plane_state->crtc_w < KMB_MIN_WIDTH || new_plane_state->crtc_h 
< KMB_MIN_HEIGHT)
+   if (new_plane_state->crtc_w > KMB_FB_MAX_WIDTH ||
+   new_plane_state->crtc_h > KMB_FB_MAX_HEIGHT ||
+   new_plane_state->crtc_w < KMB_FB_MIN_WIDTH ||
+   new_plane_state->crtc_h < KMB_FB_MIN_HEIGHT)
return -EINVAL;
 
/* Due to HW limitations, changing plane height or width after
@@ -311,6 +312,44 @@ static void config_csc(struct kmb_drm_private *kmb, int 
plane_id)
kmb_write_lcd(kmb, LCD_LAYERn_CSC_OFF3(plane_id), csc_coef_lcd[11]);
 }
 
+static void kmb_plane_set_alpha(struct kmb_drm_private *kmb,
+   const struct drm_plane_state *state,
+   unsigned char plane_id,
+   unsigned int *val)
+{
+   u16 plane_alpha = state->alpha;
+   u16 pixel_blend_mode = state->pixel_blend_mode;
+   int has_alpha = state->fb->format->has_alpha;
+
+   if (plane_alpha != DRM_BLEND_ALPHA_OPAQUE)
+   *val |= LCD_LAYER_ALPHA_STATIC;
+
+   if (has_alpha) {
+   switch (pixel_blend_mode) {
+   case DRM_MODE_BLEND_PIXEL_NONE:
+   break;
+   case DRM_MODE_BLEND_PREMULTI:
+   *val |= LCD_LAYER_ALPHA_EMBED | LCD_LAYER_ALPHA_PREMULT;
+   break;
+   case DRM_MODE_BLEND_COVERAGE:
+   *val |= LCD_LAYER_ALPHA_EMBED;
+   break;
+   default:
+   DRM_DEBUG("Missing pixel blend mode case (%s == %ld)\n",
+ __stringify(pixel_blend_mode),
+ (long)pixel_blend_mode);
+   break;
+   }
+   }
+
+   if (plane_alpha == DRM_BLEND_ALPHA_OPAQUE && !has_alpha) {
+   *val &= LCD_LAYER_ALPHA_DISABLED;
+   return;
+   }
+
+   kmb_write_lcd(kmb, LCD_LAYERn_ALPHA(plane_id), plane_alpha);
+}
+
 static void kmb_plane_atomic_update(struct drm_plane *plane,
struct drm_atomic_state *state)
 {
@@ -341,11 +380,12 @@ static void kmb_plane_atomic_update(struct drm_plane 
*plane,
fb = new_plane_state->fb;
if (!fb)
return;
+
num_planes = fb->format->num_planes;
kmb_plane = to_kmb_plane(plane);
-   plane_id = kmb_plane->id;
 
kmb = to_kmb(plane->dev);
+   plane_id = kmb_plane->id;
 
spin_lock_irq(>irq_lock);
if (kmb->kmb_under_flow || kmb->kmb_flush_done) {
@@ -467,20 +507,32 @@ static void kmb_plane_atomic_update(struct drm_plane 
*plane,
config_csc(kmb, plane_id);
}
 
+   kmb_plane_set_alpha(kmb, plane->state, plane_id, );
+
kmb_write_lcd(kmb, LCD_LAYERn_CFG(plane_id), val);
 
+   /* Configure LCD_CONTROL */
+   ctrl = kmb_read_lcd(kmb, LCD_CONTROL);
+
+   /* Set layer blending config */
+   ctrl &= ~LCD_CTRL_ALPHA_ALL;
+   ctrl |= LCD_CTRL_ALPHA_BOTTOM_VL1 |
+   LCD_CTRL_ALPHA_BLEND_VL2;
+
+   ctrl &= ~LCD_CTRL_ALPHA_BLEND_BKGND_DISABLE;
+
switch (plane_id) {
case LAYER_0:
-   ctrl = 

[PATCH 10/14] drm/kmb: Enable ADV bridge after modeset

2021-07-27 Thread Anitha Chrisanthus
On KMB, ADV bridge must be programmed and powered on prior to
MIPI DSI HW initialization.

Fixes: 98521f4d4b4c ("drm/kmb: Mipi DSI part of the display driver")
Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_dsi.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
index 5bc6c84073a3..1cca0fe6f35f 100644
--- a/drivers/gpu/drm/kmb/kmb_dsi.c
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -1341,6 +1341,7 @@ static void connect_lcd_to_mipi(struct kmb_dsi *kmb_dsi)
return;
}
 
+   drm_bridge_chain_enable(adv_bridge);
/* DISABLE MIPI->CIF CONNECTION */
regmap_write(msscam, MSS_MIPI_CIF_CFG, 0);
 
-- 
2.25.1



[PATCH 09/14] drm/kmb : W/A for planar formats

2021-07-27 Thread Anitha Chrisanthus
This is a work around for fully planar formats, where color corruption
was observed for formats like YU12, YU16 etc. Set the DMA Vstride and
Line width for U and V planes to the same as the Y plane and not the
actual pitch. For decoded video frames, continue to use the info from
metadata.

Fixes: 7f7b96a8a0a1 ("drm/kmb: Add support for KeemBay Display")
Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_plane.c | 11 ---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_plane.c b/drivers/gpu/drm/kmb/kmb_plane.c
index dacec5c4266f..4523af949ea1 100644
--- a/drivers/gpu/drm/kmb/kmb_plane.c
+++ b/drivers/gpu/drm/kmb/kmb_plane.c
@@ -333,6 +333,7 @@ static void kmb_plane_atomic_update(struct drm_plane *plane,
struct disp_cfg *init_disp_cfg;
struct viv_vidmem_metadata *md = NULL;
struct drm_gem_object *gem_obj;
+   unsigned int cb_stride, cr_stride;
 
if (!plane || !new_plane_state || !old_plane_state)
return;
@@ -397,8 +398,10 @@ static void kmb_plane_atomic_update(struct drm_plane 
*plane,
val |= get_bits_per_pixel(fb->format);
/* Program Cb/Cr for planar formats */
if (num_planes > 1) {
-   kmb_write_lcd(kmb, LCD_LAYERn_DMA_CB_LINE_VSTRIDE(plane_id),
-   fb->pitches[1]);
+   cb_stride = md ? fb->pitches[1] : width * fb->format->cpp[0];
+   kmb_write_lcd(kmb,
+ LCD_LAYERn_DMA_CB_LINE_VSTRIDE(plane_id),
+ cb_stride);
kmb_write_lcd(kmb, LCD_LAYERn_DMA_CB_LINE_WIDTH(plane_id),
  (width * fb->format->cpp[0]));
 
@@ -419,9 +422,11 @@ static void kmb_plane_atomic_update(struct drm_plane 
*plane,
addr[U_PLANE]);
 
if (num_planes == 3) {
+   cr_stride = md ? fb->pitches[2] :
+   width * fb->format->cpp[0];
kmb_write_lcd(kmb,
  LCD_LAYERn_DMA_CR_LINE_VSTRIDE(plane_id),
- fb->pitches[2]);
+ cr_stride);
 
kmb_write_lcd(kmb,
  LCD_LAYERn_DMA_CR_LINE_WIDTH(plane_id),
-- 
2.25.1



[PATCH 08/14] drm/kmb: Corrected typo in handle_lcd_irq

2021-07-27 Thread Anitha Chrisanthus
Check for Overflow bits for layer3 in the irq handler.

Fixes: 7f7b96a8a0a1 ("drm/kmb: Add support for KeemBay Display")
Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_drv.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index f54392ec4fab..bb7eca9e13ae 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -381,7 +381,7 @@ static irqreturn_t handle_lcd_irq(struct drm_device *dev)
if (val & LAYER3_DMA_FIFO_UNDERFLOW)
drm_dbg(>drm,
"LAYER3:GL1 DMA UNDERFLOW val = 0x%lx", val);
-   if (val & LAYER3_DMA_FIFO_UNDERFLOW)
+   if (val & LAYER3_DMA_FIFO_OVERFLOW)
drm_dbg(>drm,
"LAYER3:GL1 DMA OVERFLOW val = 0x%lx", val);
}
-- 
2.25.1



[PATCH 07/14] drm/kmb: Disable change of plane parameters

2021-07-27 Thread Anitha Chrisanthus
From: Edmund Dea 

Due to HW limitations, KMB cannot change height, width, or
pixel format after initial plane configuration.

Fixes: 7f7b96a8a0a1 ("drm/kmb: Add support for KeemBay Display")
Signed-off-by: Edmund Dea 
---
 drivers/gpu/drm/kmb/kmb_crtc.c  |  2 ++
 drivers/gpu/drm/kmb/kmb_drv.h   |  1 +
 drivers/gpu/drm/kmb/kmb_plane.c | 44 -
 drivers/gpu/drm/kmb/kmb_plane.h |  6 +
 4 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/kmb/kmb_crtc.c b/drivers/gpu/drm/kmb/kmb_crtc.c
index 44626044c85e..42c8010ef2f6 100644
--- a/drivers/gpu/drm/kmb/kmb_crtc.c
+++ b/drivers/gpu/drm/kmb/kmb_crtc.c
@@ -226,6 +226,8 @@ int kmb_setup_crtc(struct drm_device *drm)
struct kmb_plane *primary;
int ret;
 
+   memset(kmb->init_disp_cfg, 0, sizeof(kmb->init_disp_cfg));
+
primary = kmb_plane_init(drm);
if (IS_ERR(primary))
return PTR_ERR(primary);
diff --git a/drivers/gpu/drm/kmb/kmb_drv.h b/drivers/gpu/drm/kmb/kmb_drv.h
index fefb1052058c..dc0679a70cc5 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.h
+++ b/drivers/gpu/drm/kmb/kmb_drv.h
@@ -56,6 +56,7 @@ struct kmb_drm_private {
spinlock_t  irq_lock;
int irq_lcd;
int sys_clk_mhz;
+   struct disp_cfg init_disp_cfg[KMB_MAX_PLANES];
struct layer_status plane_status[KMB_MAX_PLANES];
int kmb_under_flow;
int kmb_flush_done;
diff --git a/drivers/gpu/drm/kmb/kmb_plane.c b/drivers/gpu/drm/kmb/kmb_plane.c
index e45419d6ed96..dacec5c4266f 100644
--- a/drivers/gpu/drm/kmb/kmb_plane.c
+++ b/drivers/gpu/drm/kmb/kmb_plane.c
@@ -71,12 +71,26 @@ static const u32 kmb_formats_v[] = {
 
 static unsigned int check_pixel_format(struct drm_plane *plane, u32 format)
 {
+   struct kmb_drm_private *kmb;
+   struct kmb_plane *kmb_plane = to_kmb_plane(plane);
int i;
+   int plane_id = kmb_plane->id;
+   struct disp_cfg init_disp_cfg;
 
+   kmb = to_kmb(plane->dev);
+   init_disp_cfg = kmb->init_disp_cfg[plane_id];
+   /* Due to HW limitations, changing pixel format after initial
+* plane configuration is not supported.
+*/
+   if (init_disp_cfg.format && init_disp_cfg.format != format) {
+   drm_dbg(>drm, "Cannot change format after initial plane 
configuration");
+   return -EINVAL;
+   }
for (i = 0; i < plane->format_count; i++) {
if (plane->format_types[i] == format)
return 0;
}
+
return -EINVAL;
 }
 
@@ -85,11 +99,17 @@ static int kmb_plane_atomic_check(struct drm_plane *plane,
 {
struct drm_plane_state *new_plane_state = 
drm_atomic_get_new_plane_state(state,

 plane);
+   struct kmb_drm_private *kmb;
+   struct kmb_plane *kmb_plane = to_kmb_plane(plane);
+   int plane_id = kmb_plane->id;
+   struct disp_cfg init_disp_cfg;
struct drm_framebuffer *fb;
int ret;
struct drm_crtc_state *crtc_state;
bool can_position;
 
+   kmb = to_kmb(plane->dev);
+   init_disp_cfg = kmb->init_disp_cfg[plane_id];
fb = new_plane_state->fb;
if (!fb || !new_plane_state->crtc)
return 0;
@@ -102,6 +122,16 @@ static int kmb_plane_atomic_check(struct drm_plane *plane,
return -EINVAL;
if (new_plane_state->crtc_w < KMB_MIN_WIDTH || new_plane_state->crtc_h 
< KMB_MIN_HEIGHT)
return -EINVAL;
+
+   /* Due to HW limitations, changing plane height or width after
+* initial plane configuration is not supported.
+*/
+   if ((init_disp_cfg.width && init_disp_cfg.height) &&
+   (init_disp_cfg.width != fb->width ||
+   init_disp_cfg.height != fb->height)) {
+   drm_dbg(>drm, "Cannot change plane height or width after 
initial configuration");
+   return -EINVAL;
+   }
can_position = (plane->type == DRM_PLANE_TYPE_OVERLAY);
crtc_state =
drm_atomic_get_existing_crtc_state(state,
@@ -300,6 +330,7 @@ static void kmb_plane_atomic_update(struct drm_plane *plane,
unsigned char plane_id;
int num_planes, i;
static dma_addr_t addr[MAX_SUB_PLANES];
+   struct disp_cfg *init_disp_cfg;
struct viv_vidmem_metadata *md = NULL;
struct drm_gem_object *gem_obj;
 
@@ -323,7 +354,8 @@ static void kmb_plane_atomic_update(struct drm_plane *plane,
}
spin_unlock_irq(>irq_lock);
 
-   src_w = (new_plane_state->src_w >> 16);
+   init_disp_cfg = >init_disp_cfg[plane_id];
+   src_w = new_plane_state->src_w >> 16;
src_h = new_plane_state->src_h >> 16;
crtc_x = new_plane_state->crtc_x;
crtc_y = 

[PATCH 06/14] drm/kmb: Remove clearing DPHY regs

2021-07-27 Thread Anitha Chrisanthus
From: Edmund Dea 

Don't clear the shared DPHY registers common to MIPI Rx and MIPI Tx during
DSI initialization since this was causing MIPI Rx reset. Rest of the
writes are bitwise, so do not affect Mipi Rx side.

Fixes: 98521f4d4b4c ("drm/kmb: Mipi DSI part of the display driver")
Signed-off-by: Anitha Chrisanthus 
Signed-off-by: Edmund Dea 
---
 drivers/gpu/drm/kmb/kmb_dsi.c | 5 -
 1 file changed, 5 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
index 7e2371ffcb18..5bc6c84073a3 100644
--- a/drivers/gpu/drm/kmb/kmb_dsi.c
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -1393,11 +1393,6 @@ int kmb_dsi_mode_set(struct kmb_dsi *kmb_dsi, struct 
drm_display_mode *mode,
mipi_tx_init_cfg.lane_rate_mbps = data_rate;
}
 
-   kmb_write_mipi(kmb_dsi, DPHY_ENABLE, 0);
-   kmb_write_mipi(kmb_dsi, DPHY_INIT_CTRL0, 0);
-   kmb_write_mipi(kmb_dsi, DPHY_INIT_CTRL1, 0);
-   kmb_write_mipi(kmb_dsi, DPHY_INIT_CTRL2, 0);
-
/* Initialize mipi controller */
mipi_tx_init_cntrl(kmb_dsi, _tx_init_cfg);
 
-- 
2.25.1



[PATCH 05/14] drm/kmb: Limit supported mode to 1080p

2021-07-27 Thread Anitha Chrisanthus
KMB only supports single resolution(1080p), this commit checks for
1920x1080x60 or 1920x1080x59 in crtc_mode_valid.

Fixes: 7f7b96a8a0a1 ("drm/kmb: Add support for KeemBay Display")
Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_crtc.c | 28 
 drivers/gpu/drm/kmb/kmb_drv.h  | 15 +--
 2 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_crtc.c b/drivers/gpu/drm/kmb/kmb_crtc.c
index 44327bc629ca..44626044c85e 100644
--- a/drivers/gpu/drm/kmb/kmb_crtc.c
+++ b/drivers/gpu/drm/kmb/kmb_crtc.c
@@ -185,11 +185,39 @@ static void kmb_crtc_atomic_flush(struct drm_crtc *crtc,
spin_unlock_irq(>dev->event_lock);
 }
 
+static enum drm_mode_status
+   kmb_crtc_mode_valid(struct drm_crtc *crtc,
+   const struct drm_display_mode *mode)
+{
+   int refresh;
+   struct drm_device *dev = crtc->dev;
+
+   if (mode->vdisplay < KMB_CRTC_MAX_HEIGHT) {
+   drm_dbg(dev, "height = %d less than %d",
+   mode->vdisplay, KMB_CRTC_MAX_HEIGHT);
+   return MODE_BAD_VVALUE;
+   }
+   if (mode->hdisplay < KMB_CRTC_MAX_WIDTH) {
+   drm_dbg(dev, "width = %d less than %d",
+   mode->hdisplay, KMB_CRTC_MAX_WIDTH);
+   return MODE_BAD_HVALUE;
+   }
+   refresh = drm_mode_vrefresh(mode);
+   if (refresh < KMB_MIN_VREFRESH || refresh > KMB_MAX_VREFRESH) {
+   drm_dbg(dev, "refresh = %d less than %d or greater than %d",
+   refresh, KMB_MIN_VREFRESH, KMB_MAX_VREFRESH);
+   return MODE_BAD;
+   }
+
+   return MODE_OK;
+}
+
 static const struct drm_crtc_helper_funcs kmb_crtc_helper_funcs = {
.atomic_begin = kmb_crtc_atomic_begin,
.atomic_enable = kmb_crtc_atomic_enable,
.atomic_disable = kmb_crtc_atomic_disable,
.atomic_flush = kmb_crtc_atomic_flush,
+   .mode_valid = kmb_crtc_mode_valid,
 };
 
 int kmb_setup_crtc(struct drm_device *drm)
diff --git a/drivers/gpu/drm/kmb/kmb_drv.h b/drivers/gpu/drm/kmb/kmb_drv.h
index 0904e6eb2a09..fefb1052058c 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.h
+++ b/drivers/gpu/drm/kmb/kmb_drv.h
@@ -18,8 +18,19 @@
 
 #define DRIVER_DATE"20210223"
 #define DRIVER_MAJOR   1
-#define DRIVER_MINOR   1
-
+#define DRIVER_MINOR   2
+
+/* Platform definitions */
+#define KMB_CRTC_MAX_WIDTH 1920 /* max width in pixels */
+#define KMB_CRTC_MAX_HEIGHT1080 /* max height in pixels */
+#define KMB_CRTC_MIN_WIDTH 1920
+#define KMB_CRTC_MIN_HEIGHT1080
+#define KMB_FB_MAX_WIDTH   1920
+#define KMB_FB_MAX_HEIGHT  1080
+#define KMB_FB_MIN_WIDTH   1
+#define KMB_FB_MIN_HEIGHT  1
+#define KMB_MIN_VREFRESH   59/*vertical refresh in Hz */
+#define KMB_MAX_VREFRESH   60/*vertical refresh in Hz */
 #define KMB_LCD_DEFAULT_CLK2
 #define KMB_SYS_CLK_MHZ500
 
-- 
2.25.1



[PATCH 04/14] drm/kmb : W/A for 256B cache alignment for video

2021-07-27 Thread Anitha Chrisanthus
For B0 silicon, the media driver pads the decoded video dmabufs for 256B
alignment. This is the backing buffer of the framebuffer and info in the
drm frame buffer is not correct for these buffers as this is done
internally in the media driver. This change extracts the meta data info
from dmabuf priv structure and uses that info for programming stride and
offsets in kmb_plane_atomic_update().

Fixes: 7f7b96a8a0a1 ("drm/kmb: Add support for KeemBay Display")
Signed-off-by: Edmund Dea 
Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_drv.h|  1 +
 drivers/gpu/drm/kmb/kmb_plane.c  | 38 ---
 drivers/gpu/drm/kmb/kmb_vidmem.h | 52 
 3 files changed, 87 insertions(+), 4 deletions(-)
 create mode 100644 drivers/gpu/drm/kmb/kmb_vidmem.h

diff --git a/drivers/gpu/drm/kmb/kmb_drv.h b/drivers/gpu/drm/kmb/kmb_drv.h
index ebbaa5f422d5..0904e6eb2a09 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.h
+++ b/drivers/gpu/drm/kmb/kmb_drv.h
@@ -49,6 +49,7 @@ struct kmb_drm_private {
int kmb_under_flow;
int kmb_flush_done;
int layer_no;
+   struct viv_vidmem_metadata  *md_info;
 };
 
 static inline struct kmb_drm_private *to_kmb(const struct drm_device *dev)
diff --git a/drivers/gpu/drm/kmb/kmb_plane.c b/drivers/gpu/drm/kmb/kmb_plane.c
index 2888dd5dcc2c..e45419d6ed96 100644
--- a/drivers/gpu/drm/kmb/kmb_plane.c
+++ b/drivers/gpu/drm/kmb/kmb_plane.c
@@ -11,12 +11,16 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 
+#include 
+
 #include "kmb_drv.h"
 #include "kmb_plane.h"
 #include "kmb_regs.h"
+#include "kmb_vidmem.h"
 
 const u32 layer_irqs[] = {
LCD_INT_VL0,
@@ -294,8 +298,10 @@ static void kmb_plane_atomic_update(struct drm_plane 
*plane,
unsigned int ctrl = 0, val = 0, out_format = 0;
unsigned int src_w, src_h, crtc_x, crtc_y;
unsigned char plane_id;
-   int num_planes;
+   int num_planes, i;
static dma_addr_t addr[MAX_SUB_PLANES];
+   struct viv_vidmem_metadata *md = NULL;
+   struct drm_gem_object *gem_obj;
 
if (!plane || !new_plane_state || !old_plane_state)
return;
@@ -325,6 +331,16 @@ static void kmb_plane_atomic_update(struct drm_plane 
*plane,
drm_dbg(>drm,
"src_w=%d src_h=%d, fb->format->format=0x%x fb->flags=0x%x\n",
  src_w, src_h, fb->format->format, fb->flags);
+   gem_obj = drm_gem_fb_get_obj(fb, plane_id);
+   if (gem_obj && gem_obj->import_attach &&
+   gem_obj->import_attach->dmabuf &&
+   gem_obj->import_attach->dmabuf->priv) {
+   md = gem_obj->import_attach->dmabuf->priv;
+
+   /* Check if metadata is coming from hantro driver */
+   if (md->magic != HANTRO_IMAGE_VIV_META_DATA_MAGIC)
+   md = NULL;
+   }
 
width = fb->width;
height = fb->height;
@@ -332,6 +348,11 @@ static void kmb_plane_atomic_update(struct drm_plane 
*plane,
drm_dbg(>drm, "dma_len=%d ", dma_len);
kmb_write_lcd(kmb, LCD_LAYERn_DMA_LEN(plane_id), dma_len);
kmb_write_lcd(kmb, LCD_LAYERn_DMA_LEN_SHADOW(plane_id), dma_len);
+   if (md) {
+   for (i = 0; i < 3; i++)
+   fb->pitches[i] = md->plane[i].stride;
+   }
+
kmb_write_lcd(kmb, LCD_LAYERn_DMA_LINE_VSTRIDE(plane_id),
  fb->pitches[0]);
kmb_write_lcd(kmb, LCD_LAYERn_DMA_LINE_WIDTH(plane_id),
@@ -339,18 +360,22 @@ static void kmb_plane_atomic_update(struct drm_plane 
*plane,
 
addr[Y_PLANE] = drm_fb_cma_get_gem_addr(fb, new_plane_state, 0);
kmb_write_lcd(kmb, LCD_LAYERn_DMA_START_ADDR(plane_id),
- addr[Y_PLANE] + fb->offsets[0]);
+ addr[Y_PLANE]);
val = get_pixel_format(fb->format->format);
val |= get_bits_per_pixel(fb->format);
/* Program Cb/Cr for planar formats */
if (num_planes > 1) {
kmb_write_lcd(kmb, LCD_LAYERn_DMA_CB_LINE_VSTRIDE(plane_id),
- width * fb->format->cpp[0]);
+   fb->pitches[1]);
kmb_write_lcd(kmb, LCD_LAYERn_DMA_CB_LINE_WIDTH(plane_id),
  (width * fb->format->cpp[0]));
 
addr[U_PLANE] = drm_fb_cma_get_gem_addr(fb, new_plane_state,
U_PLANE);
+   if (md) {
+   addr[U_PLANE] += md->plane[1].offset -
+(addr[U_PLANE] - addr[Y_PLANE]);
+   }
/* check if Cb/Cr is swapped*/
if (num_

[PATCH 03/14] drm/kmb: Work around for higher system clock

2021-07-27 Thread Anitha Chrisanthus
Use a different value for system clock offset in the
ppl/llp ratio calculations for clocks higher than 500 Mhz.

Fixes: 98521f4d4b4c ("drm/kmb: Mipi DSI part of the display driver")
Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_dsi.c | 11 ++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
index 231041b269f5..7e2371ffcb18 100644
--- a/drivers/gpu/drm/kmb/kmb_dsi.c
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -482,6 +482,10 @@ static u32 mipi_tx_fg_section_cfg(struct kmb_dsi *kmb_dsi,
return 0;
 }
 
+#define CLK_DIFF_LOW 50
+#define CLK_DIFF_HI 60
+#define SYSCLK_500  500
+
 static void mipi_tx_fg_cfg_regs(struct kmb_dsi *kmb_dsi, u8 frame_gen,
struct mipi_tx_frame_timing_cfg *fg_cfg)
 {
@@ -492,7 +496,12 @@ static void mipi_tx_fg_cfg_regs(struct kmb_dsi *kmb_dsi, 
u8 frame_gen,
/* 500 Mhz system clock minus 50 to account for the difference in
 * MIPI clock speed in RTL tests
 */
-   sysclk = kmb_dsi->sys_clk_mhz - 50;
+   if (kmb_dsi->sys_clk_mhz == SYSCLK_500) {
+   sysclk = kmb_dsi->sys_clk_mhz - CLK_DIFF_LOW;
+   } else {
+   /* 700 Mhz clk*/
+   sysclk = kmb_dsi->sys_clk_mhz - CLK_DIFF_HI;
+   }
 
/* PPL-Pixel Packing Layer, LLP-Low Level Protocol
 * Frame genartor timing parameters are clocked on the system clock,
-- 
2.25.1



[PATCH 02/14] drm/kmb: Define driver date and major/minor version

2021-07-27 Thread Anitha Chrisanthus
From: Edmund Dea 

Added macros for date and version

Fixes: 7f7b96a8a0a1 ("drm/kmb: Add support for KeemBay Display")
Signed-off-by: Edmund Dea 
---
 drivers/gpu/drm/kmb/kmb_drv.c | 8 
 drivers/gpu/drm/kmb/kmb_drv.h | 5 +
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index c0b1c6f99249..f54392ec4fab 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -425,10 +425,10 @@ static const struct drm_driver kmb_driver = {
.fops = ,
DRM_GEM_CMA_DRIVER_OPS_VMAP,
.name = "kmb-drm",
-   .desc = "KEEMBAY DISPLAY DRIVER ",
-   .date = "20201008",
-   .major = 1,
-   .minor = 0,
+   .desc = "KEEMBAY DISPLAY DRIVER",
+   .date = DRIVER_DATE,
+   .major = DRIVER_MAJOR,
+   .minor = DRIVER_MINOR,
 };
 
 static int kmb_remove(struct platform_device *pdev)
diff --git a/drivers/gpu/drm/kmb/kmb_drv.h b/drivers/gpu/drm/kmb/kmb_drv.h
index 02e806712a64..ebbaa5f422d5 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.h
+++ b/drivers/gpu/drm/kmb/kmb_drv.h
@@ -15,6 +15,11 @@
 #define KMB_MAX_HEIGHT 1080 /*Max height in pixels */
 #define KMB_MIN_WIDTH   1920 /*Max width in pixels */
 #define KMB_MIN_HEIGHT  1080 /*Max height in pixels */
+
+#define DRIVER_DATE"20210223"
+#define DRIVER_MAJOR   1
+#define DRIVER_MINOR   1
+
 #define KMB_LCD_DEFAULT_CLK2
 #define KMB_SYS_CLK_MHZ500
 
-- 
2.25.1



[PATCH 01/14] drm/kmb: Enable LCD DMA for low TVDDCV

2021-07-27 Thread Anitha Chrisanthus
From: Edmund Dea 

There's an undocumented dependency between LCD layer enable bits [2-5]
and the AXI pipelined read enable bit [28] in the LCD_CONTROL register.
The proper order of operation is:

1) Clear AXI pipelined read enable bit
2) Set LCD layers
3) Set AXI pipelined read enable bit

With this update, LCD can start DMA when TVDDCV is reduced down to 700mV.

Fixes: 7f7b96a8a0a1 ("drm/kmb: Add support for KeemBay Display")
Signed-off-by: Edmund Dea 
---
 drivers/gpu/drm/kmb/kmb_drv.c   | 14 ++
 drivers/gpu/drm/kmb/kmb_plane.c | 15 +--
 2 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index 96ea1a2c11dd..c0b1c6f99249 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -203,6 +203,7 @@ static irqreturn_t handle_lcd_irq(struct drm_device *dev)
unsigned long status, val, val1;
int plane_id, dma0_state, dma1_state;
struct kmb_drm_private *kmb = to_kmb(dev);
+   u32 ctrl = 0;
 
status = kmb_read_lcd(kmb, LCD_INT_STATUS);
 
@@ -227,6 +228,19 @@ static irqreturn_t handle_lcd_irq(struct drm_device *dev)
kmb_clr_bitmask_lcd(kmb, LCD_CONTROL,

kmb->plane_status[plane_id].ctrl);
 
+   ctrl = kmb_read_lcd(kmb, LCD_CONTROL);
+   if (!(ctrl & (LCD_CTRL_VL1_ENABLE |
+   LCD_CTRL_VL2_ENABLE |
+   LCD_CTRL_GL1_ENABLE |
+   LCD_CTRL_GL2_ENABLE))) {
+   /* If no LCD layers are using DMA,
+* then disable DMA pipelined AXI read
+* transactions.
+*/
+   kmb_clr_bitmask_lcd(kmb, LCD_CONTROL,
+   
LCD_CTRL_PIPELINE_DMA);
+   }
+
kmb->plane_status[plane_id].disable = false;
}
}
diff --git a/drivers/gpu/drm/kmb/kmb_plane.c b/drivers/gpu/drm/kmb/kmb_plane.c
index d5b6195856d1..2888dd5dcc2c 100644
--- a/drivers/gpu/drm/kmb/kmb_plane.c
+++ b/drivers/gpu/drm/kmb/kmb_plane.c
@@ -427,8 +427,14 @@ static void kmb_plane_atomic_update(struct drm_plane 
*plane,
 
kmb_set_bitmask_lcd(kmb, LCD_CONTROL, ctrl);
 
-   /* FIXME no doc on how to set output format,these values are
-* taken from the Myriadx tests
+   /* Enable pipeline AXI read transactions for the DMA
+* after setting graphics layers. This must be done
+* in a separate write cycle.
+*/
+   kmb_set_bitmask_lcd(kmb, LCD_CONTROL, LCD_CTRL_PIPELINE_DMA);
+
+   /* FIXME no doc on how to set output format,these values are taken
+* from the Myriadx tests
 */
out_format |= LCD_OUTF_FORMAT_RGB888;
 
@@ -526,6 +532,11 @@ struct kmb_plane *kmb_plane_init(struct drm_device *drm)
plane->id = i;
}
 
+   /* Disable pipeline AXI read transactions for the DMA
+* prior to setting graphics layers
+*/
+   kmb_clr_bitmask_lcd(kmb, LCD_CONTROL, LCD_CTRL_PIPELINE_DMA);
+
return primary;
 cleanup:
drmm_kfree(drm, plane);
-- 
2.25.1



[PATCH] drm/kmb: Fix build warnings

2020-11-10 Thread Anitha Chrisanthus
Fixed the following W=1 kernel build warnings
 drivers/gpu/drm/kmb/kmb_plane.h:74:18: warning: ‘kmb_formats_v’
 defined but not used [-Wunused-const-variable=]
 drivers/gpu/drm/kmb/kmb_plane.h:61:18: warning: ‘kmb_formats_g’
 defined but not used [-Wunused-const-variable=]

Signed-off-by: Anitha Chrisanthus 
Cc: Sam Ravnborg 
---
 drivers/gpu/drm/kmb/kmb_plane.c | 32 
 drivers/gpu/drm/kmb/kmb_plane.h | 32 
 2 files changed, 32 insertions(+), 32 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_plane.c b/drivers/gpu/drm/kmb/kmb_plane.c
index 770308b..8448d1e 100644
--- a/drivers/gpu/drm/kmb/kmb_plane.c
+++ b/drivers/gpu/drm/kmb/kmb_plane.c
@@ -33,6 +33,38 @@ static const u32 csc_coef_lcd[] = {
-179, 125, -226
 };
 
+/* Graphics layer (layers 2 & 3) formats, only packed formats  are supported */
+static const u32 kmb_formats_g[] = {
+   DRM_FORMAT_RGB332,
+   DRM_FORMAT_XRGB, DRM_FORMAT_XBGR,
+   DRM_FORMAT_ARGB, DRM_FORMAT_ABGR,
+   DRM_FORMAT_XRGB1555, DRM_FORMAT_XBGR1555,
+   DRM_FORMAT_ARGB1555, DRM_FORMAT_ABGR1555,
+   DRM_FORMAT_RGB565, DRM_FORMAT_BGR565,
+   DRM_FORMAT_RGB888, DRM_FORMAT_BGR888,
+   DRM_FORMAT_XRGB, DRM_FORMAT_XBGR,
+   DRM_FORMAT_ARGB, DRM_FORMAT_ABGR,
+};
+
+/* Video layer ( 0 & 1) formats, packed and planar formats are supported */
+static const u32 kmb_formats_v[] = {
+   /* packed formats */
+   DRM_FORMAT_RGB332,
+   DRM_FORMAT_XRGB, DRM_FORMAT_XBGR,
+   DRM_FORMAT_ARGB, DRM_FORMAT_ABGR,
+   DRM_FORMAT_XRGB1555, DRM_FORMAT_XBGR1555,
+   DRM_FORMAT_ARGB1555, DRM_FORMAT_ABGR1555,
+   DRM_FORMAT_RGB565, DRM_FORMAT_BGR565,
+   DRM_FORMAT_RGB888, DRM_FORMAT_BGR888,
+   DRM_FORMAT_XRGB, DRM_FORMAT_XBGR,
+   DRM_FORMAT_ARGB, DRM_FORMAT_ABGR,
+   /*planar formats */
+   DRM_FORMAT_YUV420, DRM_FORMAT_YVU420,
+   DRM_FORMAT_YUV422, DRM_FORMAT_YVU422,
+   DRM_FORMAT_YUV444, DRM_FORMAT_YVU444,
+   DRM_FORMAT_NV12, DRM_FORMAT_NV21,
+};
+
 static unsigned int check_pixel_format(struct drm_plane *plane, u32 format)
 {
int i;
diff --git a/drivers/gpu/drm/kmb/kmb_plane.h b/drivers/gpu/drm/kmb/kmb_plane.h
index 1750113..486490f 100644
--- a/drivers/gpu/drm/kmb/kmb_plane.h
+++ b/drivers/gpu/drm/kmb/kmb_plane.h
@@ -57,38 +57,6 @@ struct kmb_plane {
unsigned char id;
 };
 
-/* Graphics layer (layers 2 & 3) formats, only packed formats  are supported */
-static const u32 kmb_formats_g[] = {
-   DRM_FORMAT_RGB332,
-   DRM_FORMAT_XRGB, DRM_FORMAT_XBGR,
-   DRM_FORMAT_ARGB, DRM_FORMAT_ABGR,
-   DRM_FORMAT_XRGB1555, DRM_FORMAT_XBGR1555,
-   DRM_FORMAT_ARGB1555, DRM_FORMAT_ABGR1555,
-   DRM_FORMAT_RGB565, DRM_FORMAT_BGR565,
-   DRM_FORMAT_RGB888, DRM_FORMAT_BGR888,
-   DRM_FORMAT_XRGB, DRM_FORMAT_XBGR,
-   DRM_FORMAT_ARGB, DRM_FORMAT_ABGR,
-};
-
-/* Video layer ( 0 & 1) formats, packed and planar formats are supported */
-static const u32 kmb_formats_v[] = {
-   /* packed formats */
-   DRM_FORMAT_RGB332,
-   DRM_FORMAT_XRGB, DRM_FORMAT_XBGR,
-   DRM_FORMAT_ARGB, DRM_FORMAT_ABGR,
-   DRM_FORMAT_XRGB1555, DRM_FORMAT_XBGR1555,
-   DRM_FORMAT_ARGB1555, DRM_FORMAT_ABGR1555,
-   DRM_FORMAT_RGB565, DRM_FORMAT_BGR565,
-   DRM_FORMAT_RGB888, DRM_FORMAT_BGR888,
-   DRM_FORMAT_XRGB, DRM_FORMAT_XBGR,
-   DRM_FORMAT_ARGB, DRM_FORMAT_ABGR,
-   /*planar formats */
-   DRM_FORMAT_YUV420, DRM_FORMAT_YVU420,
-   DRM_FORMAT_YUV422, DRM_FORMAT_YVU422,
-   DRM_FORMAT_YUV444, DRM_FORMAT_YVU444,
-   DRM_FORMAT_NV12, DRM_FORMAT_NV21,
-};
-
 struct layer_status {
bool disable;
u32 ctrl;
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v13 6/7] drm/kmb: Mipi DSI part of the display driver

2020-11-04 Thread Anitha Chrisanthus
Initializes Mipi DSI and sets up connects to ADV bridge

v2: removed license text
upclassed dev_private, removed HAVE_IRQ. (Sam)

v3: Squashed all 59 commits to one

v4: review changes from Sam Ravnborg
renamed dev_p to kmb

v5: corrected spellings
v6: corrected checkpatch warnings
v7: review changes Sam Ravnborg and Thomas Zimmerman
removed unnecessary logs and defines and ifdef codes (Sam)
split dphy_init_sequence smaller (Sam)
removed redundant checks in kmb_dsi (Sam)
changed kmb_dsi_init to drm_bridge_connector_init and
drm_connector_attach_encoder to bridge's connector (Sam)
v8: call drm_bridge_attach with DRM_BRIDGE_ATTACH_NO_CONNECTOR
v9: renamed kmb_dsi_hw_init to kmb_dsi_mode_set (Daniel V)
v10: changes in driver to accommodate changes in DT to separate DSI
 entries (Sam R)
 added comments to clarify empty dsi host functions
 review changes from Sam to separate out DSI part,
 removed dependencies on drm side (Sam R)
v11: review changes for separate msscam node (Sam R, Neil A)
v12: fixed warnings Reported-by: kernel test robot 

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Sam Ravnborg 
Cc: Sam Ravnborg 
Cc: Thomas Zimmermann 
Cc: Daniel Vetter 
---
 drivers/gpu/drm/kmb/kmb_dsi.c | 1561 +
 drivers/gpu/drm/kmb/kmb_dsi.h |  387 ++
 2 files changed, 1948 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.h

diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
new file mode 100644
index 000..4b5d82a
--- /dev/null
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -0,0 +1,1561 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright © 2019-2020 Intel Corporation
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "kmb_dsi.h"
+#include "kmb_regs.h"
+
+static struct mipi_dsi_host *dsi_host;
+static struct mipi_dsi_device *dsi_device;
+static struct drm_bridge *adv_bridge;
+
+/* Default setting is 1080p, 4 lanes */
+#define IMG_HEIGHT_LINES  1080
+#define IMG_WIDTH_PX  1920
+#define MIPI_TX_ACTIVE_LANES 4
+
+static struct mipi_tx_frame_section_cfg mipi_tx_frame0_sect_cfg = {
+   .width_pixels = IMG_WIDTH_PX,
+   .height_lines = IMG_HEIGHT_LINES,
+   .data_type = DSI_LP_DT_PPS_RGB888_24B,
+   .data_mode = MIPI_DATA_MODE1,
+   .dma_packed = 0
+};
+
+static struct mipi_tx_frame_cfg mipitx_frame0_cfg = {
+   .sections[0] = _tx_frame0_sect_cfg,
+   .sections[1] = NULL,
+   .sections[2] = NULL,
+   .sections[3] = NULL,
+   .vsync_width = 5,
+   .v_backporch = 36,
+   .v_frontporch = 4,
+   .hsync_width = 44,
+   .h_backporch = 148,
+   .h_frontporch = 88
+};
+
+static const struct mipi_tx_dsi_cfg mipitx_dsi_cfg = {
+   .hfp_blank_en = 0,
+   .eotp_en = 0,
+   .lpm_last_vfp_line = 0,
+   .lpm_first_vsa_line = 0,
+   .sync_pulse_eventn = DSI_VIDEO_MODE_NO_BURST_EVENT,
+   .hfp_blanking = SEND_BLANK_PACKET,
+   .hbp_blanking = SEND_BLANK_PACKET,
+   .hsa_blanking = SEND_BLANK_PACKET,
+   .v_blanking = SEND_BLANK_PACKET,
+};
+
+static struct mipi_ctrl_cfg mipi_tx_init_cfg = {
+   .active_lanes = MIPI_TX_ACTIVE_LANES,
+   .lane_rate_mbps = MIPI_TX_LANE_DATA_RATE_MBPS,
+   .ref_clk_khz = MIPI_TX_REF_CLK_KHZ,
+   .cfg_clk_khz = MIPI_TX_CFG_CLK_KHZ,
+   .tx_ctrl_cfg = {
+   .frames[0] = _frame0_cfg,
+   .frames[1] = NULL,
+   .frames[2] = NULL,
+   .frames[3] = NULL,
+   .tx_dsi_cfg = _dsi_cfg,
+   .line_sync_pkt_en = 0,
+   .line_counter_active = 0,
+   .frame_counter_active = 0,
+   .tx_always_use_hact = 1,
+   .tx_hact_wait_stop = 1,
+   }
+};
+
+struct  mipi_hs_freq_range_cfg {
+   u16 default_bit_rate_mbps;
+   u8 hsfreqrange_code;
+};
+
+struct vco_params {
+   u32 freq;
+   u32 range;
+   u32 divider;
+};
+
+static const struct vco_params vco_table[] = {
+   {52, 0x3f, 8},
+   {80, 0x39, 8},
+   {105, 0x2f, 4},
+   {160, 0x29, 4},
+   {210, 0x1f, 2},
+   {320, 0x19, 2},
+   {420, 0x0f, 1},
+   {630, 0x09, 1},
+   {1100, 0x03, 1},
+   {0x, 0x01, 1},
+};
+
+static const struct mipi_hs_freq_range_cfg
+mipi_hs_freq_range[MIPI_DPHY_DEFAULT_BIT_RATES] = {
+   {.default_bit_rate_mbps = 80, .hsfreqrange_code = 0x00},
+   {.default_bit_rate_mbps = 90, .hsfreqrange_code = 0x10},
+   {.default_bit_rate_mbps = 100, .hsfreqrange_code = 0x20},
+   {.default_bit_rate_mbps = 110, .hsfreqrange_code = 0x30},
+   {.default_bit_rate_mbps = 120, .hsfreqrange_code = 0x01},
+   {.default

[PATCH v13 4/7] drm/kmb: Keem Bay driver register definition

2020-11-04 Thread Anitha Chrisanthus
Register definitions for Keem Bay display driver

v2: removed license text (Sam)
v3: Squashed all 59 commits to one
v4: review changes from Sam Ravnborg
renamed dev_p to kmb
v5: corrected spellings
v6: corrected checkpatch warnings
v7: removed redundant definitions
v8: removed redundant definitions, clean up (Sam R)

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Sam Ravnborg 
Cc: Sam Ravnborg 
Cc: Thomas Zimmermann 
Cc: Daniel Vetter 
---
 drivers/gpu/drm/kmb/kmb_regs.h | 725 +
 1 file changed, 725 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/kmb_regs.h

diff --git a/drivers/gpu/drm/kmb/kmb_regs.h b/drivers/gpu/drm/kmb/kmb_regs.h
new file mode 100644
index 000..4815056
--- /dev/null
+++ b/drivers/gpu/drm/kmb/kmb_regs.h
@@ -0,0 +1,725 @@
+/* SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Copyright © 2018-2020 Intel Corporation
+ */
+
+#ifndef __KMB_REGS_H__
+#define __KMB_REGS_H__
+
+/***
+ *LCD controller control register defines
+ ***/
+#define LCD_CONTROL(0x4 * 0x000)
+#define LCD_CTRL_PROGRESSIVE (0 << 0)
+#define LCD_CTRL_INTERLACED  BIT(0)
+#define LCD_CTRL_ENABLE  BIT(1)
+#define LCD_CTRL_VL1_ENABLE  BIT(2)
+#define LCD_CTRL_VL2_ENABLE  BIT(3)
+#define LCD_CTRL_GL1_ENABLE  BIT(4)
+#define LCD_CTRL_GL2_ENABLE  BIT(5)
+#define LCD_CTRL_ALPHA_BLEND_VL1 (0 << 6)
+#define LCD_CTRL_ALPHA_BLEND_VL2 BIT(6)
+#define LCD_CTRL_ALPHA_BLEND_GL1 (2 << 6)
+#define LCD_CTRL_ALPHA_BLEND_GL2 (3 << 6)
+#define LCD_CTRL_ALPHA_TOP_VL1   (0 << 8)
+#define LCD_CTRL_ALPHA_TOP_VL2   BIT(8)
+#define LCD_CTRL_ALPHA_TOP_GL1   (2 << 8)
+#define LCD_CTRL_ALPHA_TOP_GL2   (3 << 8)
+#define LCD_CTRL_ALPHA_MIDDLE_VL1(0 << 10)
+#define LCD_CTRL_ALPHA_MIDDLE_VL2BIT(10)
+#define LCD_CTRL_ALPHA_MIDDLE_GL1(2 << 10)
+#define LCD_CTRL_ALPHA_MIDDLE_GL2(3 << 10)
+#define LCD_CTRL_ALPHA_BOTTOM_VL1(0 << 12)
+#define LCD_CTRL_ALPHA_BOTTOM_VL2BIT(12)
+#define LCD_CTRL_ALPHA_BOTTOM_GL1(2 << 12)
+#define LCD_CTRL_ALPHA_BOTTOM_GL2(3 << 12)
+#define LCD_CTRL_TIM_GEN_ENABLE  BIT(14)
+#define LCD_CTRL_CONTINUOUS  (0 << 15)
+#define LCD_CTRL_ONE_SHOTBIT(15)
+#define LCD_CTRL_PWM0_EN BIT(16)
+#define LCD_CTRL_PWM1_EN BIT(17)
+#define LCD_CTRL_PWM2_EN BIT(18)
+#define LCD_CTRL_OUTPUT_DISABLED (0 << 19)
+#define LCD_CTRL_OUTPUT_ENABLED  BIT(19)
+#define LCD_CTRL_BPORCH_ENABLE   BIT(21)
+#define LCD_CTRL_FPORCH_ENABLE   BIT(22)
+#define LCD_CTRL_PIPELINE_DMABIT(28)
+#define LCD_CTRL_VHSYNC_IDLE_LVL BIT(31)
+
+/* interrupts */
+#define LCD_INT_STATUS (0x4 * 0x001)
+#define LCD_INT_EOF  BIT(0)
+#define LCD_INT_LINE_CMP BIT(1)
+#define LCD_INT_VERT_COMPBIT(2)
+#define LAYER0_DMA_DONE  BIT(3)
+#define LAYER0_DMA_IDLE  BIT(4)
+#define LAYER0_DMA_FIFO_OVERFLOW BIT(5)
+#define LAYER0_DMA_FIFO_UNDERFLOWBIT(6)
+#define LAYER0_DMA_CB_FIFO_OVERFLOW  BIT(7)
+#define LAYER0_DMA_CB_FIFO_UNDERFLOW BIT(8)
+#define LAYER0_DMA_CR_FIFO_OVERFLOW  BIT(9)
+#define LAYER0_DMA_CR_FIFO_UNDERFLOW BIT(10)
+#define LAYER1_DMA_DONE  BIT(11)
+#define LAYER1_DMA_IDLE  BIT(12)
+#define LAYER1_DMA_FIFO_OVERFLOW BIT(13)
+#define LAYER1_DMA_FIFO_UNDERFLOWBIT(14)
+#define LAYER1_DMA_CB_FIFO_OVERFLOW  BIT(15)
+#define LAYER1_DMA_CB_FIFO_UNDERFLOW BIT(16)
+#define LAYER1_DMA_CR_FIFO_OVERFLOW  BIT(17)
+#define LAYER1_DMA_CR_FIFO_UNDERFLOW BIT(18)
+#define LAYER2_DMA_DONE  BIT(19)
+#define LAYER2_DMA_IDLE  BIT(20)
+#define LAYER2_DMA_FIFO_OVERFLOW BIT(21)
+#define LAYER2_DMA_FIFO_UNDERFLOWBIT(22)
+#define LAYER3_DMA_DONE  BIT(23)
+#define LAYER3_DMA_IDLE  BIT(24)
+#

[PATCH v13 5/7] drm/kmb: Add support for KeemBay Display

2020-11-04 Thread Anitha Chrisanthus
This is a basic KMS atomic modesetting display driver for KeemBay family of
SOCs. Driver has no 2D or 3D graphics. It calls into the ADV bridge
driver at the connector level.

Single CRTC with LCD controller->mipi DSI->ADV bridge

Only 1080p resolution and single plane is supported at this time.

v2: moved extern to .h, removed license text
use drm_dev_init, upclassed dev_private, removed HAVE_IRQ.(Sam)

v3: Squashed all 59 commits to one

v4: review changes from Sam Ravnborg
renamed dev_p to kmb
moved clocks under kmb_clock, consolidated clk initializations
use drmm functions
use DRM_GEM_CMA_DRIVER_OPS_VMAP

v5: corrected spellings
v6: corrected checkpatch warnings
v7: review changes Sam Ravnborg and Thomas Zimmerman
removed kmb_crtc.h kmb_crtc_cleanup (Thomas)
renamed mode_set, kmb_load, inlined unload (Thomas)
moved remaining logging to drm_*(Thomas)
re-orged driver initialization (Thomas)
moved plane_status to drm_private (Sam)
removed unnecessary logs and defines and ifdef codes (Sam)
call helper_check in plane_atomic_check (Sam)
renamed set to get for bpp and format functions(Sam)
use drm helper functions for reset, duplicate/destroy state instead
of kmb functions (Sam)
removed kmb_priv from kmb_plane and removed kmb_plane_state (Sam)
v8: get clk_pll0 from display node in dt
v9: moved csc_coef_lcd to plane.c (Daniel Vetter)
call drm_atomic_helper_shutdown in remove (Daniel V)
use drm_crtc_handle_vblank (Daniel V)
renamed kmb_dsi_hw_init to kmb_dsi_mode_set (Daniel V)
complimentary changes to device tree changes (Rob)
v10: call drm_crtc_arm_vblank_event in atomic_flush (Daniel V)
 moved global vars to kmb_private and added locks (Daniel V)
 changes in driver to accommodate changes in DT to separate DSI
 entries (Sam R)
 review changes to separate mipi DSI (Sam R)
v11: review changes to separate msscam (Neil A,Sam R)
v12: fixed warnings Reported-by: kernel test robot 

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Sam Ravnborg 
Cc: Sam Ravnborg 
Cc: Thomas Zimmermann 
Cc: Daniel Vetter 
---
 drivers/gpu/drm/kmb/kmb_crtc.c  | 214 ++
 drivers/gpu/drm/kmb/kmb_drv.c   | 602 
 drivers/gpu/drm/kmb/kmb_drv.h   |  88 ++
 drivers/gpu/drm/kmb/kmb_plane.c | 490 
 drivers/gpu/drm/kmb/kmb_plane.h |  99 +++
 5 files changed, 1493 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/kmb_crtc.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.h

diff --git a/drivers/gpu/drm/kmb/kmb_crtc.c b/drivers/gpu/drm/kmb/kmb_crtc.c
new file mode 100644
index 000..dd54b03
--- /dev/null
+++ b/drivers/gpu/drm/kmb/kmb_crtc.c
@@ -0,0 +1,214 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright © 2018-2020 Intel Corporation
+ */
+
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "kmb_drv.h"
+#include "kmb_dsi.h"
+#include "kmb_plane.h"
+#include "kmb_regs.h"
+
+struct kmb_crtc_timing {
+   u32 vfront_porch;
+   u32 vback_porch;
+   u32 vsync_len;
+   u32 hfront_porch;
+   u32 hback_porch;
+   u32 hsync_len;
+};
+
+static int kmb_crtc_enable_vblank(struct drm_crtc *crtc)
+{
+   struct drm_device *dev = crtc->dev;
+   struct kmb_drm_private *kmb = to_kmb(dev);
+
+   /* Clear interrupt */
+   kmb_write_lcd(kmb, LCD_INT_CLEAR, LCD_INT_VERT_COMP);
+   /* Set which interval to generate vertical interrupt */
+   kmb_write_lcd(kmb, LCD_VSTATUS_COMPARE,
+ LCD_VSTATUS_COMPARE_VSYNC);
+   /* Enable vertical interrupt */
+   kmb_set_bitmask_lcd(kmb, LCD_INT_ENABLE,
+   LCD_INT_VERT_COMP);
+   return 0;
+}
+
+static void kmb_crtc_disable_vblank(struct drm_crtc *crtc)
+{
+   struct drm_device *dev = crtc->dev;
+   struct kmb_drm_private *kmb = to_kmb(dev);
+
+   /* Clear interrupt */
+   kmb_write_lcd(kmb, LCD_INT_CLEAR, LCD_INT_VERT_COMP);
+   /* Disable vertical interrupt */
+   kmb_clr_bitmask_lcd(kmb, LCD_INT_ENABLE,
+   LCD_INT_VERT_COMP);
+}
+
+static const struct drm_crtc_funcs kmb_crtc_funcs = {
+   .destroy = drm_crtc_cleanup,
+   .set_config = drm_atomic_helper_set_config,
+   .page_flip = drm_atomic_helper_page_flip,
+   .reset = drm_atomic_helper_crtc_reset,
+   .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
+   .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
+   .enable_vblank = kmb_crtc_enable_vblank,
+   .disable_vblank = kmb_crtc_disable_vblank,
+};
+
+static void kmb_crtc_set_mode(struct drm_crtc 

[PATCH v13 2/7] dt-bindings: display: Intel KeemBay MSSCAM

2020-11-04 Thread Anitha Chrisanthus
This patch add bindings for Intel KeemBay MSSCAM syscon

v2: fixed compatible (Sam R.)

Signed-off-by: Anitha Chrisanthus 
Cc: Sam Ravnborg 
Cc: Neil Armstrong 
Cc: Rob Herring 
---
 .../bindings/display/intel,keembay-msscam.yaml | 43 ++
 1 file changed, 43 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/display/intel,keembay-msscam.yaml

diff --git 
a/Documentation/devicetree/bindings/display/intel,keembay-msscam.yaml 
b/Documentation/devicetree/bindings/display/intel,keembay-msscam.yaml
new file mode 100644
index 000..40caa61
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/intel,keembay-msscam.yaml
@@ -0,0 +1,43 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/intel,keembay-msscam.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Devicetree bindings for Intel Keem Bay MSSCAM
+
+maintainers:
+  - Anitha Chrisanthus 
+  - Edmond J Dea 
+
+description: |
+   MSSCAM controls local clocks in the display subsystem namely LCD clocks and
+   MIPI DSI clocks. It also configures the interconnect between LCD and
+   MIPI DSI.
+
+properties:
+  compatible:
+items:
+ - const: intel,keembay-msscam
+ - const: syscon
+
+  reg:
+maxItems: 1
+
+  reg-io-width:
+const: 4
+
+required:
+  - compatible
+  - reg
+  - reg-io-width
+
+additionalProperties: false
+
+examples:
+  - |
+msscam:msscam@2091 {
+compatible = "intel,keembay-msscam", "syscon";
+reg = <0x2091 0x30>;
+reg-io-width = <4>;
+};
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v13 7/7] drm/kmb: Build files for KeemBay Display driver

2020-11-04 Thread Anitha Chrisanthus
v2: Added Maintainer entry
v3: Added one more Maintainer entry
v3: drop videomode_helpers

Cc: Sam Ravnborg 
Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Sam Ravnborg 
---
 MAINTAINERS  |  7 +++
 drivers/gpu/drm/Kconfig  |  2 ++
 drivers/gpu/drm/Makefile |  1 +
 drivers/gpu/drm/kmb/Kconfig  | 12 
 drivers/gpu/drm/kmb/Makefile |  2 ++
 5 files changed, 24 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/Kconfig
 create mode 100644 drivers/gpu/drm/kmb/Makefile

diff --git a/MAINTAINERS b/MAINTAINERS
index 71e29dc..c82ea76 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -8961,6 +8961,13 @@ M:   Deepak Saxena 
 S: Maintained
 F: drivers/char/hw_random/ixp4xx-rng.c
 
+INTEL KEEMBAY DRM DRIVER
+M: Anitha Chrisanthus 
+M: Edmund Dea 
+S: Maintained
+F: Documentation/devicetree/bindings/display/intel,kmb_display.yaml
+F: drivers/gpu/drm/kmb/
+
 INTEL MANAGEMENT ENGINE (mei)
 M: Tomas Winkler 
 L: linux-ker...@vger.kernel.org
diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index 64376dd..3dc293c 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -268,6 +268,8 @@ source "drivers/gpu/drm/nouveau/Kconfig"
 
 source "drivers/gpu/drm/i915/Kconfig"
 
+source "drivers/gpu/drm/kmb/Kconfig"
+
 config DRM_VGEM
tristate "Virtual GEM provider"
depends on DRM
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index 8156900..fefaff4c 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -71,6 +71,7 @@ obj-$(CONFIG_DRM_AMDGPU)+= amd/amdgpu/
 obj-$(CONFIG_DRM_MGA)  += mga/
 obj-$(CONFIG_DRM_I810) += i810/
 obj-$(CONFIG_DRM_I915) += i915/
+obj-$(CONFIG_DRM_KMB_DISPLAY)  += kmb/
 obj-$(CONFIG_DRM_MGAG200) += mgag200/
 obj-$(CONFIG_DRM_V3D)  += v3d/
 obj-$(CONFIG_DRM_VC4)  += vc4/
diff --git a/drivers/gpu/drm/kmb/Kconfig b/drivers/gpu/drm/kmb/Kconfig
new file mode 100644
index 000..2dd7e68
--- /dev/null
+++ b/drivers/gpu/drm/kmb/Kconfig
@@ -0,0 +1,12 @@
+config DRM_KMB_DISPLAY
+   tristate "INTEL KEEMBAY DISPLAY"
+   depends on DRM && OF && (ARM || ARM64)
+   depends on COMMON_CLK
+   select DRM_KMS_HELPER
+   select DRM_KMS_CMA_HELPER
+   select DRM_GEM_CMA_HELPER
+   help
+   Choose this option if you have Intel's KeemBay SOC which integrates
+   an ARM Cortex A53 CPU with an Intel Movidius VPU.
+
+   If M is selected the module will be called kmb-drm.
diff --git a/drivers/gpu/drm/kmb/Makefile b/drivers/gpu/drm/kmb/Makefile
new file mode 100644
index 000..527d737
--- /dev/null
+++ b/drivers/gpu/drm/kmb/Makefile
@@ -0,0 +1,2 @@
+kmb-drm-y := kmb_crtc.o kmb_drv.o kmb_plane.o kmb_dsi.o
+obj-$(CONFIG_DRM_KMB_DISPLAY)  += kmb-drm.o
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v13 1/7] dt-bindings: display: Add support for Intel KeemBay Display

2020-11-04 Thread Anitha Chrisanthus
This patch adds bindings for Intel KeemBay Display

v2: review changes from Rob Herring
v3: review changes from Sam Ravnborg (removed mipi dsi entries, and
encoder entry, connect port to dsi)
MSSCAM is part of the display submodule and its used to reset LCD
and MIPI DSI clocks, so its best to be on this device tree.
v4: review changes from Neil Armstrong and Sam - removed msscam
entries

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Sam Ravnborg 
Cc: Sam Ravnborg 
Cc: Neil Armstrong 
Cc: Thomas Zimmermann 
Cc: Daniel Vetter 
Cc: Rob Herring 
---
 .../bindings/display/intel,keembay-display.yaml| 72 ++
 1 file changed, 72 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/display/intel,keembay-display.yaml

diff --git 
a/Documentation/devicetree/bindings/display/intel,keembay-display.yaml 
b/Documentation/devicetree/bindings/display/intel,keembay-display.yaml
new file mode 100644
index 000..0a697d4
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/intel,keembay-display.yaml
@@ -0,0 +1,72 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/intel,keembay-display.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Devicetree bindings for Intel Keem Bay display controller
+
+maintainers:
+  - Anitha Chrisanthus 
+  - Edmond J Dea 
+
+properties:
+  compatible:
+const: intel,keembay-display
+
+  reg:
+items:
+  - description: LCD registers range
+
+  reg-names:
+items:
+  - const: lcd
+
+  clocks:
+items:
+  - description: LCD controller clock
+  - description: pll0 clock
+
+  clock-names:
+items:
+  - const: clk_lcd
+  - const: clk_pll0
+
+  interrupts:
+maxItems: 1
+
+  port:
+type: object
+description: Display output node to DSI.
+
+required:
+  - compatible
+  - reg
+  - reg-names
+  - clocks
+  - clock-names
+  - interrupts
+  - port
+
+additionalProperties: false
+
+examples:
+  - |
+#include 
+#include 
+
+display@2093 {
+compatible = "intel,keembay-display";
+reg = <0x2093 0x3000>;
+reg-names = "lcd";
+interrupts = ;
+clocks = <_clk 0x83>,
+ <_clk 0x0>;
+clock-names = "clk_lcd", "clk_pll0";
+
+port {
+disp_out: endpoint {
+remote-endpoint = <_in>;
+};
+};
+};
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v13 3/7] dt-bindings: display: bridge: Intel KeemBay DSI

2020-11-04 Thread Anitha Chrisanthus
This patch adds bindings for Intel KeemBay MIPI DSI

v2: corrected description for port

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Sam Ravnborg 
Reviewed-by: Neil Armstrong 
Cc: Sam Ravnborg 
Cc: Thomas Zimmermann 
Cc: Daniel Vetter 
Cc: Rob Herring 
---
 .../bindings/display/bridge/intel,keembay-dsi.yaml | 101 +
 1 file changed, 101 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/display/bridge/intel,keembay-dsi.yaml

diff --git 
a/Documentation/devicetree/bindings/display/bridge/intel,keembay-dsi.yaml 
b/Documentation/devicetree/bindings/display/bridge/intel,keembay-dsi.yaml
new file mode 100644
index 000..ab5be26
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/bridge/intel,keembay-dsi.yaml
@@ -0,0 +1,101 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/bridge/intel,keembay-dsi.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Devicetree bindings for Intel Keem Bay mipi dsi controller
+
+maintainers:
+  - Anitha Chrisanthus 
+  - Edmond J Dea 
+
+properties:
+  compatible:
+const: intel,keembay-dsi
+
+  reg:
+items:
+  - description: MIPI registers range
+
+  reg-names:
+items:
+  - const: mipi
+
+  clocks:
+items:
+  - description: MIPI DSI clock
+  - description: MIPI DSI econfig clock
+  - description: MIPI DSI config clock
+
+  clock-names:
+items:
+  - const: clk_mipi
+  - const: clk_mipi_ecfg
+  - const: clk_mipi_cfg
+
+  ports:
+type: object
+
+properties:
+  '#address-cells':
+   const: 1
+
+  '#size-cells':
+   const: 0
+
+  port@0:
+type: object
+description: MIPI DSI input port.
+
+  port@1:
+type: object
+description: DSI output port.
+
+required:
+  - port@0
+  - port@1
+
+additionalProperties: false
+
+required:
+  - compatible
+  - reg
+  - reg-names
+  - clocks
+  - clock-names
+  - ports
+
+additionalProperties: false
+
+examples:
+  - |
+mipi-dsi@2090 {
+compatible = "intel,keembay-dsi";
+reg = <0x2090 0x4000>;
+reg-names = "mipi";
+clocks = <_clk 0x86>,
+ <_clk 0x88>,
+ <_clk 0x89>;
+clock-names = "clk_mipi", "clk_mipi_ecfg",
+  "clk_mipi_cfg";
+
+ports {
+#address-cells = <1>;
+#size-cells = <0>;
+
+port@0 {
+reg = <0>;
+dsi_in: endpoint {
+remote-endpoint = <_out>;
+};
+};
+
+port@1 {
+reg = <1>;
+dsi_out: endpoint {
+remote-endpoint = <_input>;
+};
+};
+};
+};
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v13 0/7] Add support for KeemBay DRM drive

2020-11-04 Thread Anitha Chrisanthus
This is a new DRM driver for Intel's KeemBay SOC.
The SoC couples an ARM Cortex A53 CPU with an Intel
Movidius VPU.

This driver is tested with the KMB EVM board which is the reference baord
for Keem Bay SOC. The SOC's display pipeline is as follows

+--++-++---+
|LCD controller| -> |Mipi DSI | -> |Mipi to HDMI Converter |
+--++-++---+

LCD controller and Mipi DSI transmitter are part of the SOC and
mipi to HDMI converter is ADV7535 for KMB EVM board.

The DRM driver is a basic KMS atomic modesetting display driver and
has no 2D or 3D graphics.It calls into the ADV bridge driver at
the connector level.

Only 1080p resolution and single plane is supported at this time.
The usecase is for debugging video and camera outputs.

Device tree patches are under review here
https://lore.kernel.org/linux-arm-kernel/20200708175020.194436-1-daniele.alessandre...@linux.intel.com/T/

Changes since v1:
- Removed redundant license text, updated license
- Rearranged include blocks
- renamed global vars and removed extern in c
- Used upclassing for dev_private
- Used drm_dev_init in drm device create
- minor cleanups

Changes since v2:
- squashed all commits to a single commit
- logging changed to drm_info, drm_dbg etc.
- used devm_drm_dev_alloc()
- removed commented out sections and general cleanup

Changes since v3:
- renamed dev_p to kmb
- moved clocks under kmb_clock, consolidated clk initializations
- use drmm functions
- use DRM_GEM_CMA_DRIVER_OPS_VMAP
- more cleanups

Changes since v4:
- corrected spellings

Changes since v5:
- corrected checkpatch warnings/checks
   -Please ignore checkpatch checks on Camelcase - this is how it is
   named in the databook
   - Please ignore checkpatch warnings on misspelled for hsa, dout,
   widthn etc. - they are spelled as in the databook
   - Please ignore checkpatch checks on macro arguments reuse -
   its confirmed ok

Changes since v6:
- review changes Sam Ravnborg and Thomas Zimmerman
split patch into 4 parts, part1 register definitions, part2 display
driver files, part3 mipi dsi, part4 build files (Sam)
removed kmb_crtc.h kmb_crtc_cleanup (Thomas)
renamed mode_set, kmb_load, inlined unload (Thomas)
moved remaining logging to drm_*(Thomas)
re-orged driver initialization (Thomas)
moved plane_status to drm_private (Sam)
removed unnecessary logs and defines and ifdef codes (Sam)
split dphy_init_sequence smaller (Sam)
removed redundant checks in kmb_dsi (Sam)
changed kmb_dsi_init to drm_bridge_connector_init and
drm_connector_attach_encoder to bridge's connector (Sam)
call helper_check in plane_atomic_check (Sam)
renamed set to get for bpp and format functions(Sam)
use drm helper functions for reset, duplicate/destroy state instead
of kmb functions (Sam)
removed kmb_priv from kmb_plane and removed kmb_plane_state (Sam)

Changes since v7:
- tested with 5.9 kernel and made the following changes
get clk_pll0 from display node in dt  
call drm_bridge_attach with DRM_BRIDGE_ATTACH_NO_CONNECTOR
Also added Maintainer entry 

Changes since v8:
DT review changes (Rob)
renamed kmb_dsi_hw_init to kmb_dsi_mode_set (Daniel V)
moved csc_coef_lcd to plane.c (Daniel Vetter)
call drm_atomic_helper_shutdown in remove (Daniel V)
use drm_crtc_handle_vblank (Daniel V)
renamed kmb_dsi_hw_init to kmb_dsi_mode_set (Daniel V)
complimentary changes to device tree changes (Rob)
removed redundant definitions in kmb_dsi.h

Changes since v9:
Review changes from Sam Ravnborg which are:
DT is separated to display and Mipi DSI as per Sam suggestion and the
driver has changes to reflect this separation. Also most of the
MIPI DSI code is isolated and separated from the main driver, worked 
closely with Sam on these changes. This split is to ease review and
driver is only buildable after the last patch (build files).

call drm_crtc_arm_vblank_event in atomic_flush (Daniel V)
moved global vars to kmb_private and added locks (Daniel V)
added comments to clarify empty dsi host functions (Daniel V)

Changes since v10:
Created separate DT binding for msscam as syscon(Neil Armstrong, Sam)
Msscam is used for clocks and also for connecting mipi and lcd.
Corresponding driver changes for the above change (Neil Armstrong, Sam)
corrected description for port in dsi DT bindings file
updated reviewed by in commits.

Changes since v11:
corrected compatible in msscam dt bindings and added description
(Sam R)

Changes since v12:
Fixed warnings Reported-by: kernel test robot 

Anitha Chrisanthus (7):
  dt-bindings: display: Add support for Intel KeemBay Display
  dt-bi

[PATCH v12 3/7] dt-bindings: display: bridge: Intel KeemBay DSI

2020-11-03 Thread Anitha Chrisanthus
This patch adds bindings for Intel KeemBay MIPI DSI

v2: corrected description for port

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Sam Ravnborg 
Reviewed-by: Neil Armstrong 
Cc: Sam Ravnborg 
Cc: Thomas Zimmermann 
Cc: Daniel Vetter 
Cc: Rob Herring 
---
 .../bindings/display/bridge/intel,keembay-dsi.yaml | 101 +
 1 file changed, 101 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/display/bridge/intel,keembay-dsi.yaml

diff --git 
a/Documentation/devicetree/bindings/display/bridge/intel,keembay-dsi.yaml 
b/Documentation/devicetree/bindings/display/bridge/intel,keembay-dsi.yaml
new file mode 100644
index 000..ab5be26
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/bridge/intel,keembay-dsi.yaml
@@ -0,0 +1,101 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/bridge/intel,keembay-dsi.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Devicetree bindings for Intel Keem Bay mipi dsi controller
+
+maintainers:
+  - Anitha Chrisanthus 
+  - Edmond J Dea 
+
+properties:
+  compatible:
+const: intel,keembay-dsi
+
+  reg:
+items:
+  - description: MIPI registers range
+
+  reg-names:
+items:
+  - const: mipi
+
+  clocks:
+items:
+  - description: MIPI DSI clock
+  - description: MIPI DSI econfig clock
+  - description: MIPI DSI config clock
+
+  clock-names:
+items:
+  - const: clk_mipi
+  - const: clk_mipi_ecfg
+  - const: clk_mipi_cfg
+
+  ports:
+type: object
+
+properties:
+  '#address-cells':
+   const: 1
+
+  '#size-cells':
+   const: 0
+
+  port@0:
+type: object
+description: MIPI DSI input port.
+
+  port@1:
+type: object
+description: DSI output port.
+
+required:
+  - port@0
+  - port@1
+
+additionalProperties: false
+
+required:
+  - compatible
+  - reg
+  - reg-names
+  - clocks
+  - clock-names
+  - ports
+
+additionalProperties: false
+
+examples:
+  - |
+mipi-dsi@2090 {
+compatible = "intel,keembay-dsi";
+reg = <0x2090 0x4000>;
+reg-names = "mipi";
+clocks = <_clk 0x86>,
+ <_clk 0x88>,
+ <_clk 0x89>;
+clock-names = "clk_mipi", "clk_mipi_ecfg",
+  "clk_mipi_cfg";
+
+ports {
+#address-cells = <1>;
+#size-cells = <0>;
+
+port@0 {
+reg = <0>;
+dsi_in: endpoint {
+remote-endpoint = <_out>;
+};
+};
+
+port@1 {
+reg = <1>;
+dsi_out: endpoint {
+remote-endpoint = <_input>;
+};
+};
+};
+};
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v12 5/7] drm/kmb: Add support for KeemBay Display

2020-11-03 Thread Anitha Chrisanthus
This is a basic KMS atomic modesetting display driver for KeemBay family of
SOCs. Driver has no 2D or 3D graphics. It calls into the ADV bridge
driver at the connector level.

Single CRTC with LCD controller->mipi DSI->ADV bridge

Only 1080p resolution and single plane is supported at this time.

v2: moved extern to .h, removed license text
use drm_dev_init, upclassed dev_private, removed HAVE_IRQ.(Sam)

v3: Squashed all 59 commits to one

v4: review changes from Sam Ravnborg
renamed dev_p to kmb
moved clocks under kmb_clock, consolidated clk initializations
use drmm functions
use DRM_GEM_CMA_DRIVER_OPS_VMAP

v5: corrected spellings
v6: corrected checkpatch warnings
v7: review changes Sam Ravnborg and Thomas Zimmerman
removed kmb_crtc.h kmb_crtc_cleanup (Thomas)
renamed mode_set, kmb_load, inlined unload (Thomas)
moved remaining logging to drm_*(Thomas)
re-orged driver initialization (Thomas)
moved plane_status to drm_private (Sam)
removed unnecessary logs and defines and ifdef codes (Sam)
call helper_check in plane_atomic_check (Sam)
renamed set to get for bpp and format functions(Sam)
use drm helper functions for reset, duplicate/destroy state instead
of kmb functions (Sam)
removed kmb_priv from kmb_plane and removed kmb_plane_state (Sam)
v8: get clk_pll0 from display node in dt
v9: moved csc_coef_lcd to plane.c (Daniel Vetter)
call drm_atomic_helper_shutdown in remove (Daniel V)
use drm_crtc_handle_vblank (Daniel V)
renamed kmb_dsi_hw_init to kmb_dsi_mode_set (Daniel V)
complimentary changes to device tree changes (Rob)
v10: call drm_crtc_arm_vblank_event in atomic_flush (Daniel V)
 moved global vars to kmb_private and added locks (Daniel V)
 changes in driver to accommodate changes in DT to separate DSI
 entries (Sam R)
 review changes to separate mipi DSI (Sam R)
v11: review changes to separate msscam (Neil A,Sam R)

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Sam Ravnborg 
Cc: Sam Ravnborg 
Cc: Thomas Zimmermann 
Cc: Daniel Vetter 
---
 drivers/gpu/drm/kmb/kmb_crtc.c  | 219 +++
 drivers/gpu/drm/kmb/kmb_drv.c   | 602 
 drivers/gpu/drm/kmb/kmb_drv.h   |  88 ++
 drivers/gpu/drm/kmb/kmb_plane.c | 490 
 drivers/gpu/drm/kmb/kmb_plane.h |  99 +++
 5 files changed, 1498 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/kmb_crtc.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.h

diff --git a/drivers/gpu/drm/kmb/kmb_crtc.c b/drivers/gpu/drm/kmb/kmb_crtc.c
new file mode 100644
index 000..887b6d7
--- /dev/null
+++ b/drivers/gpu/drm/kmb/kmb_crtc.c
@@ -0,0 +1,219 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright © 2018-2020 Intel Corporation
+ */
+
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "kmb_drv.h"
+#include "kmb_dsi.h"
+#include "kmb_plane.h"
+#include "kmb_regs.h"
+
+struct kmb_crtc_timing {
+   u32 vfront_porch;
+   u32 vback_porch;
+   u32 vsync_len;
+   u32 hfront_porch;
+   u32 hback_porch;
+   u32 hsync_len;
+};
+
+static int kmb_crtc_enable_vblank(struct drm_crtc *crtc)
+{
+   struct drm_device *dev = crtc->dev;
+   struct kmb_drm_private *kmb = to_kmb(dev);
+
+   /* Clear interrupt */
+   kmb_write_lcd(kmb, LCD_INT_CLEAR, LCD_INT_VERT_COMP);
+   /* Set which interval to generate vertical interrupt */
+   kmb_write_lcd(kmb, LCD_VSTATUS_COMPARE,
+ LCD_VSTATUS_COMPARE_VSYNC);
+   /* Enable vertical interrupt */
+   kmb_set_bitmask_lcd(kmb, LCD_INT_ENABLE,
+   LCD_INT_VERT_COMP);
+   return 0;
+}
+
+static void kmb_crtc_disable_vblank(struct drm_crtc *crtc)
+{
+   struct drm_device *dev = crtc->dev;
+   struct kmb_drm_private *kmb = to_kmb(dev);
+
+   /* Clear interrupt */
+   kmb_write_lcd(kmb, LCD_INT_CLEAR, LCD_INT_VERT_COMP);
+   /* Disable vertical interrupt */
+   kmb_clr_bitmask_lcd(kmb, LCD_INT_ENABLE,
+   LCD_INT_VERT_COMP);
+}
+
+static const struct drm_crtc_funcs kmb_crtc_funcs = {
+   .destroy = drm_crtc_cleanup,
+   .set_config = drm_atomic_helper_set_config,
+   .page_flip = drm_atomic_helper_page_flip,
+   .reset = drm_atomic_helper_crtc_reset,
+   .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
+   .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
+   .enable_vblank = kmb_crtc_enable_vblank,
+   .disable_vblank = kmb_crtc_disable_vblank,
+};
+
+static void kmb_crtc_set_mode(struct drm_crtc *crtc)
+{
+   struct drm_device *dev = crtc->dev;
+  

[PATCH v12 2/7] dt-bindings: display: Intel KeemBay MSSCAM

2020-11-03 Thread Anitha Chrisanthus
This patch add bindings for Intel KeemBay MSSCAM syscon

v2: fixed compatible (Sam R.)

Signed-off-by: Anitha Chrisanthus 
Cc: Sam Ravnborg 
Cc: Neil Armstrong 
Cc: Rob Herring 
---
 .../bindings/display/intel,keembay-msscam.yaml | 43 ++
 1 file changed, 43 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/display/intel,keembay-msscam.yaml

diff --git 
a/Documentation/devicetree/bindings/display/intel,keembay-msscam.yaml 
b/Documentation/devicetree/bindings/display/intel,keembay-msscam.yaml
new file mode 100644
index 000..40caa61
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/intel,keembay-msscam.yaml
@@ -0,0 +1,43 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/intel,keembay-msscam.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Devicetree bindings for Intel Keem Bay MSSCAM
+
+maintainers:
+  - Anitha Chrisanthus 
+  - Edmond J Dea 
+
+description: |
+   MSSCAM controls local clocks in the display subsystem namely LCD clocks and
+   MIPI DSI clocks. It also configures the interconnect between LCD and
+   MIPI DSI.
+
+properties:
+  compatible:
+items:
+ - const: intel,keembay-msscam
+ - const: syscon
+
+  reg:
+maxItems: 1
+
+  reg-io-width:
+const: 4
+
+required:
+  - compatible
+  - reg
+  - reg-io-width
+
+additionalProperties: false
+
+examples:
+  - |
+msscam:msscam@2091 {
+compatible = "intel,keembay-msscam", "syscon";
+reg = <0x2091 0x30>;
+reg-io-width = <4>;
+};
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v12 6/7] drm/kmb: Mipi DSI part of the display driver

2020-11-03 Thread Anitha Chrisanthus
Initializes Mipi DSI and sets up connects to ADV bridge

v2: removed license text
upclassed dev_private, removed HAVE_IRQ. (Sam)

v3: Squashed all 59 commits to one

v4: review changes from Sam Ravnborg
renamed dev_p to kmb

v5: corrected spellings
v6: corrected checkpatch warnings
v7: review changes Sam Ravnborg and Thomas Zimmerman
removed unnecessary logs and defines and ifdef codes (Sam)
split dphy_init_sequence smaller (Sam)
removed redundant checks in kmb_dsi (Sam)
changed kmb_dsi_init to drm_bridge_connector_init and
drm_connector_attach_encoder to bridge's connector (Sam)
v8: call drm_bridge_attach with DRM_BRIDGE_ATTACH_NO_CONNECTOR
v9: renamed kmb_dsi_hw_init to kmb_dsi_mode_set (Daniel V)
v10: changes in driver to accommodate changes in DT to separate DSI
 entries (Sam R)
 added comments to clarify empty dsi host functions
 review changes from Sam to separate out DSI part,
 removed dependencies on drm side (Sam R)
v11: review changes for separate msscam node (Sam R, Neil A)

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Sam Ravnborg 
Cc: Sam Ravnborg 
Cc: Thomas Zimmermann 
Cc: Daniel Vetter 
---
 drivers/gpu/drm/kmb/kmb_dsi.c | 1562 +
 drivers/gpu/drm/kmb/kmb_dsi.h |  387 ++
 2 files changed, 1949 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.h

diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
new file mode 100644
index 000..a24723d
--- /dev/null
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -0,0 +1,1562 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright © 2019-2020 Intel Corporation
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "kmb_dsi.h"
+#include "kmb_regs.h"
+
+static struct mipi_dsi_host *dsi_host;
+static struct mipi_dsi_device *dsi_device;
+static struct drm_bridge *adv_bridge;
+
+/* Default setting is 1080p, 4 lanes */
+#define IMG_HEIGHT_LINES  1080
+#define IMG_WIDTH_PX  1920
+#define MIPI_TX_ACTIVE_LANES 4
+
+static struct mipi_tx_frame_section_cfg mipi_tx_frame0_sect_cfg = {
+   .width_pixels = IMG_WIDTH_PX,
+   .height_lines = IMG_HEIGHT_LINES,
+   .data_type = DSI_LP_DT_PPS_RGB888_24B,
+   .data_mode = MIPI_DATA_MODE1,
+   .dma_packed = 0
+};
+
+static struct mipi_tx_frame_cfg mipitx_frame0_cfg = {
+   .sections[0] = _tx_frame0_sect_cfg,
+   .sections[1] = NULL,
+   .sections[2] = NULL,
+   .sections[3] = NULL,
+   .vsync_width = 5,
+   .v_backporch = 36,
+   .v_frontporch = 4,
+   .hsync_width = 44,
+   .h_backporch = 148,
+   .h_frontporch = 88
+};
+
+static const struct mipi_tx_dsi_cfg mipitx_dsi_cfg = {
+   .hfp_blank_en = 0,
+   .eotp_en = 0,
+   .lpm_last_vfp_line = 0,
+   .lpm_first_vsa_line = 0,
+   .sync_pulse_eventn = DSI_VIDEO_MODE_NO_BURST_EVENT,
+   .hfp_blanking = SEND_BLANK_PACKET,
+   .hbp_blanking = SEND_BLANK_PACKET,
+   .hsa_blanking = SEND_BLANK_PACKET,
+   .v_blanking = SEND_BLANK_PACKET,
+};
+
+static struct mipi_ctrl_cfg mipi_tx_init_cfg = {
+   .active_lanes = MIPI_TX_ACTIVE_LANES,
+   .lane_rate_mbps = MIPI_TX_LANE_DATA_RATE_MBPS,
+   .ref_clk_khz = MIPI_TX_REF_CLK_KHZ,
+   .cfg_clk_khz = MIPI_TX_CFG_CLK_KHZ,
+   .tx_ctrl_cfg = {
+   .frames[0] = _frame0_cfg,
+   .frames[1] = NULL,
+   .frames[2] = NULL,
+   .frames[3] = NULL,
+   .tx_dsi_cfg = _dsi_cfg,
+   .line_sync_pkt_en = 0,
+   .line_counter_active = 0,
+   .frame_counter_active = 0,
+   .tx_always_use_hact = 1,
+   .tx_hact_wait_stop = 1,
+   }
+};
+
+struct  mipi_hs_freq_range_cfg {
+   u16 default_bit_rate_mbps;
+   u8 hsfreqrange_code;
+};
+
+struct vco_params {
+   u32 freq;
+   u32 range;
+   u32 divider;
+};
+
+static const struct vco_params vco_table[] = {
+   {52, 0x3f, 8},
+   {80, 0x39, 8},
+   {105, 0x2f, 4},
+   {160, 0x29, 4},
+   {210, 0x1f, 2},
+   {320, 0x19, 2},
+   {420, 0x0f, 1},
+   {630, 0x09, 1},
+   {1100, 0x03, 1},
+   {0x, 0x01, 1},
+};
+
+static const struct mipi_hs_freq_range_cfg
+mipi_hs_freq_range[MIPI_DPHY_DEFAULT_BIT_RATES] = {
+   {.default_bit_rate_mbps = 80, .hsfreqrange_code = 0x00},
+   {.default_bit_rate_mbps = 90, .hsfreqrange_code = 0x10},
+   {.default_bit_rate_mbps = 100, .hsfreqrange_code = 0x20},
+   {.default_bit_rate_mbps = 110, .hsfreqrange_code = 0x30},
+   {.default_bit_rate_mbps = 120, .hsfreqrange_code = 0x01},
+   {.default_bit_rate_mbps = 130, .hsf

[PATCH v12 0/7] Add support for KeemBay DRM driver

2020-11-03 Thread Anitha Chrisanthus
This is a new DRM driver for Intel's KeemBay SOC.
The SoC couples an ARM Cortex A53 CPU with an Intel
Movidius VPU.

This driver is tested with the KMB EVM board which is the reference baord
for Keem Bay SOC. The SOC's display pipeline is as follows

+--++-++---+
|LCD controller| -> |Mipi DSI | -> |Mipi to HDMI Converter |
+--++-++---+

LCD controller and Mipi DSI transmitter are part of the SOC and
mipi to HDMI converter is ADV7535 for KMB EVM board.

The DRM driver is a basic KMS atomic modesetting display driver and
has no 2D or 3D graphics.It calls into the ADV bridge driver at
the connector level.

Only 1080p resolution and single plane is supported at this time.
The usecase is for debugging video and camera outputs.

Device tree patches are under review here
https://lore.kernel.org/linux-arm-kernel/20200708175020.194436-1-daniele.alessandre...@linux.intel.com/T/

Changes since v1:
- Removed redundant license text, updated license
- Rearranged include blocks
- renamed global vars and removed extern in c
- Used upclassing for dev_private
- Used drm_dev_init in drm device create
- minor cleanups

Changes since v2:
- squashed all commits to a single commit
- logging changed to drm_info, drm_dbg etc.
- used devm_drm_dev_alloc()
- removed commented out sections and general cleanup

Changes since v3:
- renamed dev_p to kmb
- moved clocks under kmb_clock, consolidated clk initializations
- use drmm functions
- use DRM_GEM_CMA_DRIVER_OPS_VMAP
- more cleanups

Changes since v4:
- corrected spellings

Changes since v5:
- corrected checkpatch warnings/checks
   -Please ignore checkpatch checks on Camelcase - this is how it is
   named in the databook
   - Please ignore checkpatch warnings on misspelled for hsa, dout,
   widthn etc. - they are spelled as in the databook
   - Please ignore checkpatch checks on macro arguments reuse -
   its confirmed ok

Changes since v6:
- review changes Sam Ravnborg and Thomas Zimmerman
split patch into 4 parts, part1 register definitions, part2 display
driver files, part3 mipi dsi, part4 build files (Sam)
removed kmb_crtc.h kmb_crtc_cleanup (Thomas)
renamed mode_set, kmb_load, inlined unload (Thomas)
moved remaining logging to drm_*(Thomas)
re-orged driver initialization (Thomas)
moved plane_status to drm_private (Sam)
removed unnecessary logs and defines and ifdef codes (Sam)
split dphy_init_sequence smaller (Sam)
removed redundant checks in kmb_dsi (Sam)
changed kmb_dsi_init to drm_bridge_connector_init and
drm_connector_attach_encoder to bridge's connector (Sam)
call helper_check in plane_atomic_check (Sam)
renamed set to get for bpp and format functions(Sam)
use drm helper functions for reset, duplicate/destroy state instead
of kmb functions (Sam)
removed kmb_priv from kmb_plane and removed kmb_plane_state (Sam)

Changes since v7:
- tested with 5.9 kernel and made the following changes
get clk_pll0 from display node in dt  
call drm_bridge_attach with DRM_BRIDGE_ATTACH_NO_CONNECTOR
Also added Maintainer entry 

Changes since v8:
DT review changes (Rob)
renamed kmb_dsi_hw_init to kmb_dsi_mode_set (Daniel V)
moved csc_coef_lcd to plane.c (Daniel Vetter)
call drm_atomic_helper_shutdown in remove (Daniel V)
use drm_crtc_handle_vblank (Daniel V)
renamed kmb_dsi_hw_init to kmb_dsi_mode_set (Daniel V)
complimentary changes to device tree changes (Rob)
removed redundant definitions in kmb_dsi.h

Changes since v9:
Review changes from Sam Ravnborg which are:
DT is separated to display and Mipi DSI as per Sam suggestion and the
driver has changes to reflect this separation. Also most of the
MIPI DSI code is isolated and separated from the main driver, worked 
closely with Sam on these changes. This split is to ease review and
driver is only buildable after the last patch (build files).

call drm_crtc_arm_vblank_event in atomic_flush (Daniel V)
moved global vars to kmb_private and added locks (Daniel V)
added comments to clarify empty dsi host functions (Daniel V)

Changes since v10:
Created separate DT binding for msscam as syscon(Neil Armstrong, Sam)
Msscam is used for clocks and also for connecting mipi and lcd.
Corresponding driver changes for the above change (Neil Armstrong, Sam)
corrected description for port in dsi DT bindings file
updated reviewed by in commits.

Changes since v11:
corrected compatible in msscam dt bindings and added description
(Sam R)

Anitha Chrisanthus (7):
  dt-bindings: display: Add support for Intel KeemBay Display
  dt-bindings: display: Intel KeemBay MSSCAM
  dt-bindings: display: bridge: Intel KeemB

[PATCH v12 1/7] dt-bindings: display: Add support for Intel KeemBay Display

2020-11-03 Thread Anitha Chrisanthus
This patch adds bindings for Intel KeemBay Display

v2: review changes from Rob Herring
v3: review changes from Sam Ravnborg (removed mipi dsi entries, and
encoder entry, connect port to dsi)
MSSCAM is part of the display submodule and its used to reset LCD
and MIPI DSI clocks, so its best to be on this device tree.
v4: review changes from Neil Armstrong and Sam - removed msscam
entries

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Sam Ravnborg 
Cc: Sam Ravnborg 
Cc: Neil Armstrong 
Cc: Thomas Zimmermann 
Cc: Daniel Vetter 
Cc: Rob Herring 
---
 .../bindings/display/intel,keembay-display.yaml| 72 ++
 1 file changed, 72 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/display/intel,keembay-display.yaml

diff --git 
a/Documentation/devicetree/bindings/display/intel,keembay-display.yaml 
b/Documentation/devicetree/bindings/display/intel,keembay-display.yaml
new file mode 100644
index 000..0a697d4
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/intel,keembay-display.yaml
@@ -0,0 +1,72 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/intel,keembay-display.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Devicetree bindings for Intel Keem Bay display controller
+
+maintainers:
+  - Anitha Chrisanthus 
+  - Edmond J Dea 
+
+properties:
+  compatible:
+const: intel,keembay-display
+
+  reg:
+items:
+  - description: LCD registers range
+
+  reg-names:
+items:
+  - const: lcd
+
+  clocks:
+items:
+  - description: LCD controller clock
+  - description: pll0 clock
+
+  clock-names:
+items:
+  - const: clk_lcd
+  - const: clk_pll0
+
+  interrupts:
+maxItems: 1
+
+  port:
+type: object
+description: Display output node to DSI.
+
+required:
+  - compatible
+  - reg
+  - reg-names
+  - clocks
+  - clock-names
+  - interrupts
+  - port
+
+additionalProperties: false
+
+examples:
+  - |
+#include 
+#include 
+
+display@2093 {
+compatible = "intel,keembay-display";
+reg = <0x2093 0x3000>;
+reg-names = "lcd";
+interrupts = ;
+clocks = <_clk 0x83>,
+ <_clk 0x0>;
+clock-names = "clk_lcd", "clk_pll0";
+
+port {
+disp_out: endpoint {
+remote-endpoint = <_in>;
+};
+};
+};
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v12 4/7] drm/kmb: Keem Bay driver register definition

2020-11-03 Thread Anitha Chrisanthus
Register definitions for Keem Bay display driver

v2: removed license text (Sam)
v3: Squashed all 59 commits to one
v4: review changes from Sam Ravnborg
renamed dev_p to kmb
v5: corrected spellings
v6: corrected checkpatch warnings
v7: removed redundant definitions
v8: removed redundant definitions, clean up (Sam R)

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Sam Ravnborg 
Cc: Sam Ravnborg 
Cc: Thomas Zimmermann 
Cc: Daniel Vetter 
---
 drivers/gpu/drm/kmb/kmb_regs.h | 725 +
 1 file changed, 725 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/kmb_regs.h

diff --git a/drivers/gpu/drm/kmb/kmb_regs.h b/drivers/gpu/drm/kmb/kmb_regs.h
new file mode 100644
index 000..4815056
--- /dev/null
+++ b/drivers/gpu/drm/kmb/kmb_regs.h
@@ -0,0 +1,725 @@
+/* SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Copyright © 2018-2020 Intel Corporation
+ */
+
+#ifndef __KMB_REGS_H__
+#define __KMB_REGS_H__
+
+/***
+ *LCD controller control register defines
+ ***/
+#define LCD_CONTROL(0x4 * 0x000)
+#define LCD_CTRL_PROGRESSIVE (0 << 0)
+#define LCD_CTRL_INTERLACED  BIT(0)
+#define LCD_CTRL_ENABLE  BIT(1)
+#define LCD_CTRL_VL1_ENABLE  BIT(2)
+#define LCD_CTRL_VL2_ENABLE  BIT(3)
+#define LCD_CTRL_GL1_ENABLE  BIT(4)
+#define LCD_CTRL_GL2_ENABLE  BIT(5)
+#define LCD_CTRL_ALPHA_BLEND_VL1 (0 << 6)
+#define LCD_CTRL_ALPHA_BLEND_VL2 BIT(6)
+#define LCD_CTRL_ALPHA_BLEND_GL1 (2 << 6)
+#define LCD_CTRL_ALPHA_BLEND_GL2 (3 << 6)
+#define LCD_CTRL_ALPHA_TOP_VL1   (0 << 8)
+#define LCD_CTRL_ALPHA_TOP_VL2   BIT(8)
+#define LCD_CTRL_ALPHA_TOP_GL1   (2 << 8)
+#define LCD_CTRL_ALPHA_TOP_GL2   (3 << 8)
+#define LCD_CTRL_ALPHA_MIDDLE_VL1(0 << 10)
+#define LCD_CTRL_ALPHA_MIDDLE_VL2BIT(10)
+#define LCD_CTRL_ALPHA_MIDDLE_GL1(2 << 10)
+#define LCD_CTRL_ALPHA_MIDDLE_GL2(3 << 10)
+#define LCD_CTRL_ALPHA_BOTTOM_VL1(0 << 12)
+#define LCD_CTRL_ALPHA_BOTTOM_VL2BIT(12)
+#define LCD_CTRL_ALPHA_BOTTOM_GL1(2 << 12)
+#define LCD_CTRL_ALPHA_BOTTOM_GL2(3 << 12)
+#define LCD_CTRL_TIM_GEN_ENABLE  BIT(14)
+#define LCD_CTRL_CONTINUOUS  (0 << 15)
+#define LCD_CTRL_ONE_SHOTBIT(15)
+#define LCD_CTRL_PWM0_EN BIT(16)
+#define LCD_CTRL_PWM1_EN BIT(17)
+#define LCD_CTRL_PWM2_EN BIT(18)
+#define LCD_CTRL_OUTPUT_DISABLED (0 << 19)
+#define LCD_CTRL_OUTPUT_ENABLED  BIT(19)
+#define LCD_CTRL_BPORCH_ENABLE   BIT(21)
+#define LCD_CTRL_FPORCH_ENABLE   BIT(22)
+#define LCD_CTRL_PIPELINE_DMABIT(28)
+#define LCD_CTRL_VHSYNC_IDLE_LVL BIT(31)
+
+/* interrupts */
+#define LCD_INT_STATUS (0x4 * 0x001)
+#define LCD_INT_EOF  BIT(0)
+#define LCD_INT_LINE_CMP BIT(1)
+#define LCD_INT_VERT_COMPBIT(2)
+#define LAYER0_DMA_DONE  BIT(3)
+#define LAYER0_DMA_IDLE  BIT(4)
+#define LAYER0_DMA_FIFO_OVERFLOW BIT(5)
+#define LAYER0_DMA_FIFO_UNDERFLOWBIT(6)
+#define LAYER0_DMA_CB_FIFO_OVERFLOW  BIT(7)
+#define LAYER0_DMA_CB_FIFO_UNDERFLOW BIT(8)
+#define LAYER0_DMA_CR_FIFO_OVERFLOW  BIT(9)
+#define LAYER0_DMA_CR_FIFO_UNDERFLOW BIT(10)
+#define LAYER1_DMA_DONE  BIT(11)
+#define LAYER1_DMA_IDLE  BIT(12)
+#define LAYER1_DMA_FIFO_OVERFLOW BIT(13)
+#define LAYER1_DMA_FIFO_UNDERFLOWBIT(14)
+#define LAYER1_DMA_CB_FIFO_OVERFLOW  BIT(15)
+#define LAYER1_DMA_CB_FIFO_UNDERFLOW BIT(16)
+#define LAYER1_DMA_CR_FIFO_OVERFLOW  BIT(17)
+#define LAYER1_DMA_CR_FIFO_UNDERFLOW BIT(18)
+#define LAYER2_DMA_DONE  BIT(19)
+#define LAYER2_DMA_IDLE  BIT(20)
+#define LAYER2_DMA_FIFO_OVERFLOW BIT(21)
+#define LAYER2_DMA_FIFO_UNDERFLOWBIT(22)
+#define LAYER3_DMA_DONE  BIT(23)
+#define LAYER3_DMA_IDLE  BIT(24)
+#

[PATCH v12 7/7] drm/kmb: Build files for KeemBay Display driver

2020-11-03 Thread Anitha Chrisanthus
v2: Added Maintainer entry
v3: Added one more Maintainer entry
v3: drop videomode_helpers

Cc: Sam Ravnborg 
Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Sam Ravnborg 
---
 MAINTAINERS  |  7 +++
 drivers/gpu/drm/Kconfig  |  2 ++
 drivers/gpu/drm/Makefile |  1 +
 drivers/gpu/drm/kmb/Kconfig  | 12 
 drivers/gpu/drm/kmb/Makefile |  2 ++
 5 files changed, 24 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/Kconfig
 create mode 100644 drivers/gpu/drm/kmb/Makefile

diff --git a/MAINTAINERS b/MAINTAINERS
index 71e29dc..c82ea76 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -8961,6 +8961,13 @@ M:   Deepak Saxena 
 S: Maintained
 F: drivers/char/hw_random/ixp4xx-rng.c
 
+INTEL KEEMBAY DRM DRIVER
+M: Anitha Chrisanthus 
+M: Edmund Dea 
+S: Maintained
+F: Documentation/devicetree/bindings/display/intel,kmb_display.yaml
+F: drivers/gpu/drm/kmb/
+
 INTEL MANAGEMENT ENGINE (mei)
 M: Tomas Winkler 
 L: linux-ker...@vger.kernel.org
diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index 64376dd..3dc293c 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -268,6 +268,8 @@ source "drivers/gpu/drm/nouveau/Kconfig"
 
 source "drivers/gpu/drm/i915/Kconfig"
 
+source "drivers/gpu/drm/kmb/Kconfig"
+
 config DRM_VGEM
tristate "Virtual GEM provider"
depends on DRM
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index 8156900..fefaff4c 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -71,6 +71,7 @@ obj-$(CONFIG_DRM_AMDGPU)+= amd/amdgpu/
 obj-$(CONFIG_DRM_MGA)  += mga/
 obj-$(CONFIG_DRM_I810) += i810/
 obj-$(CONFIG_DRM_I915) += i915/
+obj-$(CONFIG_DRM_KMB_DISPLAY)  += kmb/
 obj-$(CONFIG_DRM_MGAG200) += mgag200/
 obj-$(CONFIG_DRM_V3D)  += v3d/
 obj-$(CONFIG_DRM_VC4)  += vc4/
diff --git a/drivers/gpu/drm/kmb/Kconfig b/drivers/gpu/drm/kmb/Kconfig
new file mode 100644
index 000..2dd7e68
--- /dev/null
+++ b/drivers/gpu/drm/kmb/Kconfig
@@ -0,0 +1,12 @@
+config DRM_KMB_DISPLAY
+   tristate "INTEL KEEMBAY DISPLAY"
+   depends on DRM && OF && (ARM || ARM64)
+   depends on COMMON_CLK
+   select DRM_KMS_HELPER
+   select DRM_KMS_CMA_HELPER
+   select DRM_GEM_CMA_HELPER
+   help
+   Choose this option if you have Intel's KeemBay SOC which integrates
+   an ARM Cortex A53 CPU with an Intel Movidius VPU.
+
+   If M is selected the module will be called kmb-drm.
diff --git a/drivers/gpu/drm/kmb/Makefile b/drivers/gpu/drm/kmb/Makefile
new file mode 100644
index 000..527d737
--- /dev/null
+++ b/drivers/gpu/drm/kmb/Makefile
@@ -0,0 +1,2 @@
+kmb-drm-y := kmb_crtc.o kmb_drv.o kmb_plane.o kmb_dsi.o
+obj-$(CONFIG_DRM_KMB_DISPLAY)  += kmb-drm.o
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v11 5/7] drm/kmb: Add support for KeemBay Display

2020-11-03 Thread Anitha Chrisanthus
This is a basic KMS atomic modesetting display driver for KeemBay family of
SOCs. Driver has no 2D or 3D graphics. It calls into the ADV bridge
driver at the connector level.

Single CRTC with LCD controller->mipi DSI->ADV bridge

Only 1080p resolution and single plane is supported at this time.

v2: moved extern to .h, removed license text
use drm_dev_init, upclassed dev_private, removed HAVE_IRQ.(Sam)

v3: Squashed all 59 commits to one

v4: review changes from Sam Ravnborg
renamed dev_p to kmb
moved clocks under kmb_clock, consolidated clk initializations
use drmm functions
use DRM_GEM_CMA_DRIVER_OPS_VMAP

v5: corrected spellings
v6: corrected checkpatch warnings
v7: review changes Sam Ravnborg and Thomas Zimmerman
removed kmb_crtc.h kmb_crtc_cleanup (Thomas)
renamed mode_set, kmb_load, inlined unload (Thomas)
moved remaining logging to drm_*(Thomas)
re-orged driver initialization (Thomas)
moved plane_status to drm_private (Sam)
removed unnecessary logs and defines and ifdef codes (Sam)
call helper_check in plane_atomic_check (Sam)
renamed set to get for bpp and format functions(Sam)
use drm helper functions for reset, duplicate/destroy state instead
of kmb functions (Sam)
removed kmb_priv from kmb_plane and removed kmb_plane_state (Sam)
v8: get clk_pll0 from display node in dt
v9: moved csc_coef_lcd to plane.c (Daniel Vetter)
call drm_atomic_helper_shutdown in remove (Daniel V)
use drm_crtc_handle_vblank (Daniel V)
renamed kmb_dsi_hw_init to kmb_dsi_mode_set (Daniel V)
complimentary changes to device tree changes (Rob)
v10: call drm_crtc_arm_vblank_event in atomic_flush (Daniel V)
 moved global vars to kmb_private and added locks (Daniel V)
 changes in driver to accommodate changes in DT to separate DSI
 entries (Sam R)
 review changes to separate mipi DSI (Sam R)
v11: review changes to separate msscam (Neil A,Sam R)

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Sam Ravnborg 
Cc: Sam Ravnborg 
Cc: Thomas Zimmermann 
Cc: Daniel Vetter 
---
 drivers/gpu/drm/kmb/kmb_crtc.c  | 219 +++
 drivers/gpu/drm/kmb/kmb_drv.c   | 602 
 drivers/gpu/drm/kmb/kmb_drv.h   |  88 ++
 drivers/gpu/drm/kmb/kmb_plane.c | 490 
 drivers/gpu/drm/kmb/kmb_plane.h |  99 +++
 5 files changed, 1498 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/kmb_crtc.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.h

diff --git a/drivers/gpu/drm/kmb/kmb_crtc.c b/drivers/gpu/drm/kmb/kmb_crtc.c
new file mode 100644
index 000..887b6d7
--- /dev/null
+++ b/drivers/gpu/drm/kmb/kmb_crtc.c
@@ -0,0 +1,219 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright © 2018-2020 Intel Corporation
+ */
+
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "kmb_drv.h"
+#include "kmb_dsi.h"
+#include "kmb_plane.h"
+#include "kmb_regs.h"
+
+struct kmb_crtc_timing {
+   u32 vfront_porch;
+   u32 vback_porch;
+   u32 vsync_len;
+   u32 hfront_porch;
+   u32 hback_porch;
+   u32 hsync_len;
+};
+
+static int kmb_crtc_enable_vblank(struct drm_crtc *crtc)
+{
+   struct drm_device *dev = crtc->dev;
+   struct kmb_drm_private *kmb = to_kmb(dev);
+
+   /* Clear interrupt */
+   kmb_write_lcd(kmb, LCD_INT_CLEAR, LCD_INT_VERT_COMP);
+   /* Set which interval to generate vertical interrupt */
+   kmb_write_lcd(kmb, LCD_VSTATUS_COMPARE,
+ LCD_VSTATUS_COMPARE_VSYNC);
+   /* Enable vertical interrupt */
+   kmb_set_bitmask_lcd(kmb, LCD_INT_ENABLE,
+   LCD_INT_VERT_COMP);
+   return 0;
+}
+
+static void kmb_crtc_disable_vblank(struct drm_crtc *crtc)
+{
+   struct drm_device *dev = crtc->dev;
+   struct kmb_drm_private *kmb = to_kmb(dev);
+
+   /* Clear interrupt */
+   kmb_write_lcd(kmb, LCD_INT_CLEAR, LCD_INT_VERT_COMP);
+   /* Disable vertical interrupt */
+   kmb_clr_bitmask_lcd(kmb, LCD_INT_ENABLE,
+   LCD_INT_VERT_COMP);
+}
+
+static const struct drm_crtc_funcs kmb_crtc_funcs = {
+   .destroy = drm_crtc_cleanup,
+   .set_config = drm_atomic_helper_set_config,
+   .page_flip = drm_atomic_helper_page_flip,
+   .reset = drm_atomic_helper_crtc_reset,
+   .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
+   .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
+   .enable_vblank = kmb_crtc_enable_vblank,
+   .disable_vblank = kmb_crtc_disable_vblank,
+};
+
+static void kmb_crtc_set_mode(struct drm_crtc *crtc)
+{
+   struct drm_device *dev = crtc->dev;
+  

[PATCH v11 4/7] drm/kmb: Keem Bay driver register definition

2020-11-03 Thread Anitha Chrisanthus
Register definitions for Keem Bay display driver

v2: removed license text (Sam)
v3: Squashed all 59 commits to one
v4: review changes from Sam Ravnborg
renamed dev_p to kmb
v5: corrected spellings
v6: corrected checkpatch warnings
v7: removed redundant definitions
v8: removed redundant definitions, clean up (Sam R)

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Sam Ravnborg 
Cc: Sam Ravnborg 
Cc: Thomas Zimmermann 
Cc: Daniel Vetter 
---
 drivers/gpu/drm/kmb/kmb_regs.h | 725 +
 1 file changed, 725 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/kmb_regs.h

diff --git a/drivers/gpu/drm/kmb/kmb_regs.h b/drivers/gpu/drm/kmb/kmb_regs.h
new file mode 100644
index 000..4815056
--- /dev/null
+++ b/drivers/gpu/drm/kmb/kmb_regs.h
@@ -0,0 +1,725 @@
+/* SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Copyright © 2018-2020 Intel Corporation
+ */
+
+#ifndef __KMB_REGS_H__
+#define __KMB_REGS_H__
+
+/***
+ *LCD controller control register defines
+ ***/
+#define LCD_CONTROL(0x4 * 0x000)
+#define LCD_CTRL_PROGRESSIVE (0 << 0)
+#define LCD_CTRL_INTERLACED  BIT(0)
+#define LCD_CTRL_ENABLE  BIT(1)
+#define LCD_CTRL_VL1_ENABLE  BIT(2)
+#define LCD_CTRL_VL2_ENABLE  BIT(3)
+#define LCD_CTRL_GL1_ENABLE  BIT(4)
+#define LCD_CTRL_GL2_ENABLE  BIT(5)
+#define LCD_CTRL_ALPHA_BLEND_VL1 (0 << 6)
+#define LCD_CTRL_ALPHA_BLEND_VL2 BIT(6)
+#define LCD_CTRL_ALPHA_BLEND_GL1 (2 << 6)
+#define LCD_CTRL_ALPHA_BLEND_GL2 (3 << 6)
+#define LCD_CTRL_ALPHA_TOP_VL1   (0 << 8)
+#define LCD_CTRL_ALPHA_TOP_VL2   BIT(8)
+#define LCD_CTRL_ALPHA_TOP_GL1   (2 << 8)
+#define LCD_CTRL_ALPHA_TOP_GL2   (3 << 8)
+#define LCD_CTRL_ALPHA_MIDDLE_VL1(0 << 10)
+#define LCD_CTRL_ALPHA_MIDDLE_VL2BIT(10)
+#define LCD_CTRL_ALPHA_MIDDLE_GL1(2 << 10)
+#define LCD_CTRL_ALPHA_MIDDLE_GL2(3 << 10)
+#define LCD_CTRL_ALPHA_BOTTOM_VL1(0 << 12)
+#define LCD_CTRL_ALPHA_BOTTOM_VL2BIT(12)
+#define LCD_CTRL_ALPHA_BOTTOM_GL1(2 << 12)
+#define LCD_CTRL_ALPHA_BOTTOM_GL2(3 << 12)
+#define LCD_CTRL_TIM_GEN_ENABLE  BIT(14)
+#define LCD_CTRL_CONTINUOUS  (0 << 15)
+#define LCD_CTRL_ONE_SHOTBIT(15)
+#define LCD_CTRL_PWM0_EN BIT(16)
+#define LCD_CTRL_PWM1_EN BIT(17)
+#define LCD_CTRL_PWM2_EN BIT(18)
+#define LCD_CTRL_OUTPUT_DISABLED (0 << 19)
+#define LCD_CTRL_OUTPUT_ENABLED  BIT(19)
+#define LCD_CTRL_BPORCH_ENABLE   BIT(21)
+#define LCD_CTRL_FPORCH_ENABLE   BIT(22)
+#define LCD_CTRL_PIPELINE_DMABIT(28)
+#define LCD_CTRL_VHSYNC_IDLE_LVL BIT(31)
+
+/* interrupts */
+#define LCD_INT_STATUS (0x4 * 0x001)
+#define LCD_INT_EOF  BIT(0)
+#define LCD_INT_LINE_CMP BIT(1)
+#define LCD_INT_VERT_COMPBIT(2)
+#define LAYER0_DMA_DONE  BIT(3)
+#define LAYER0_DMA_IDLE  BIT(4)
+#define LAYER0_DMA_FIFO_OVERFLOW BIT(5)
+#define LAYER0_DMA_FIFO_UNDERFLOWBIT(6)
+#define LAYER0_DMA_CB_FIFO_OVERFLOW  BIT(7)
+#define LAYER0_DMA_CB_FIFO_UNDERFLOW BIT(8)
+#define LAYER0_DMA_CR_FIFO_OVERFLOW  BIT(9)
+#define LAYER0_DMA_CR_FIFO_UNDERFLOW BIT(10)
+#define LAYER1_DMA_DONE  BIT(11)
+#define LAYER1_DMA_IDLE  BIT(12)
+#define LAYER1_DMA_FIFO_OVERFLOW BIT(13)
+#define LAYER1_DMA_FIFO_UNDERFLOWBIT(14)
+#define LAYER1_DMA_CB_FIFO_OVERFLOW  BIT(15)
+#define LAYER1_DMA_CB_FIFO_UNDERFLOW BIT(16)
+#define LAYER1_DMA_CR_FIFO_OVERFLOW  BIT(17)
+#define LAYER1_DMA_CR_FIFO_UNDERFLOW BIT(18)
+#define LAYER2_DMA_DONE  BIT(19)
+#define LAYER2_DMA_IDLE  BIT(20)
+#define LAYER2_DMA_FIFO_OVERFLOW BIT(21)
+#define LAYER2_DMA_FIFO_UNDERFLOWBIT(22)
+#define LAYER3_DMA_DONE  BIT(23)
+#define LAYER3_DMA_IDLE  BIT(24)
+#

[PATCH v11 2/7] dt-bindings: display: Intel KeemBay MSSCAM

2020-11-03 Thread Anitha Chrisanthus
This patch add bindings for Intel KeemBay MSSCAM syscon

Signed-off-by: Anitha Chrisanthus 
Cc: Sam Ravnborg 
Cc: Neil Armstrong 
Cc: Rob Herring 
---
 .../bindings/display/intel,keembay-msscam.yaml | 36 ++
 1 file changed, 36 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/display/intel,keembay-msscam.yaml

diff --git 
a/Documentation/devicetree/bindings/display/intel,keembay-msscam.yaml 
b/Documentation/devicetree/bindings/display/intel,keembay-msscam.yaml
new file mode 100644
index 000..10ed8d5
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/intel,keembay-msscam.yaml
@@ -0,0 +1,36 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/intel,keembay-msscam.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Devicetree bindings for Intel Keem Bay MSSCAM
+
+maintainers:
+  - Anitha Chrisanthus 
+  - Edmond J Dea 
+
+properties:
+  compatible:
+const: intel,keembay-msscam, syscon
+
+  reg:
+maxItems: 1
+
+  reg-io-width:
+const: 4
+
+required:
+  - compatible
+  - reg
+  - reg-io-width
+
+additionalProperties: false
+
+examples:
+  - |
+msscam:msscam@2091 {
+compatible = "intel,keembay-msscam", "syscon";
+reg = <0x2091 0x30>;
+reg-io-width = <4>;
+};
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v11 7/7] drm/kmb: Build files for KeemBay Display driver

2020-11-03 Thread Anitha Chrisanthus
v2: Added Maintainer entry
v3: Added one more Maintainer entry
v3: drop videomode_helpers

Cc: Sam Ravnborg 
Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Sam Ravnborg 
---
 MAINTAINERS  |  7 +++
 drivers/gpu/drm/Kconfig  |  2 ++
 drivers/gpu/drm/Makefile |  1 +
 drivers/gpu/drm/kmb/Kconfig  | 12 
 drivers/gpu/drm/kmb/Makefile |  2 ++
 5 files changed, 24 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/Kconfig
 create mode 100644 drivers/gpu/drm/kmb/Makefile

diff --git a/MAINTAINERS b/MAINTAINERS
index 71e29dc..c82ea76 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -8961,6 +8961,13 @@ M:   Deepak Saxena 
 S: Maintained
 F: drivers/char/hw_random/ixp4xx-rng.c
 
+INTEL KEEMBAY DRM DRIVER
+M: Anitha Chrisanthus 
+M: Edmund Dea 
+S: Maintained
+F: Documentation/devicetree/bindings/display/intel,kmb_display.yaml
+F: drivers/gpu/drm/kmb/
+
 INTEL MANAGEMENT ENGINE (mei)
 M: Tomas Winkler 
 L: linux-ker...@vger.kernel.org
diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index 64376dd..3dc293c 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -268,6 +268,8 @@ source "drivers/gpu/drm/nouveau/Kconfig"
 
 source "drivers/gpu/drm/i915/Kconfig"
 
+source "drivers/gpu/drm/kmb/Kconfig"
+
 config DRM_VGEM
tristate "Virtual GEM provider"
depends on DRM
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index 8156900..fefaff4c 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -71,6 +71,7 @@ obj-$(CONFIG_DRM_AMDGPU)+= amd/amdgpu/
 obj-$(CONFIG_DRM_MGA)  += mga/
 obj-$(CONFIG_DRM_I810) += i810/
 obj-$(CONFIG_DRM_I915) += i915/
+obj-$(CONFIG_DRM_KMB_DISPLAY)  += kmb/
 obj-$(CONFIG_DRM_MGAG200) += mgag200/
 obj-$(CONFIG_DRM_V3D)  += v3d/
 obj-$(CONFIG_DRM_VC4)  += vc4/
diff --git a/drivers/gpu/drm/kmb/Kconfig b/drivers/gpu/drm/kmb/Kconfig
new file mode 100644
index 000..2dd7e68
--- /dev/null
+++ b/drivers/gpu/drm/kmb/Kconfig
@@ -0,0 +1,12 @@
+config DRM_KMB_DISPLAY
+   tristate "INTEL KEEMBAY DISPLAY"
+   depends on DRM && OF && (ARM || ARM64)
+   depends on COMMON_CLK
+   select DRM_KMS_HELPER
+   select DRM_KMS_CMA_HELPER
+   select DRM_GEM_CMA_HELPER
+   help
+   Choose this option if you have Intel's KeemBay SOC which integrates
+   an ARM Cortex A53 CPU with an Intel Movidius VPU.
+
+   If M is selected the module will be called kmb-drm.
diff --git a/drivers/gpu/drm/kmb/Makefile b/drivers/gpu/drm/kmb/Makefile
new file mode 100644
index 000..527d737
--- /dev/null
+++ b/drivers/gpu/drm/kmb/Makefile
@@ -0,0 +1,2 @@
+kmb-drm-y := kmb_crtc.o kmb_drv.o kmb_plane.o kmb_dsi.o
+obj-$(CONFIG_DRM_KMB_DISPLAY)  += kmb-drm.o
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v11 3/7] dt-bindings: display: bridge: Intel KeemBay DSI

2020-11-03 Thread Anitha Chrisanthus
This patch adds bindings for Intel KeemBay MIPI DSI

v2: corrected description for port

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Sam Ravnborg 
Reviewed-by: Neil Armstrong 
Cc: Sam Ravnborg 
Cc: Thomas Zimmermann 
Cc: Daniel Vetter 
Cc: Rob Herring 
---
 .../bindings/display/bridge/intel,keembay-dsi.yaml | 101 +
 1 file changed, 101 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/display/bridge/intel,keembay-dsi.yaml

diff --git 
a/Documentation/devicetree/bindings/display/bridge/intel,keembay-dsi.yaml 
b/Documentation/devicetree/bindings/display/bridge/intel,keembay-dsi.yaml
new file mode 100644
index 000..ab5be26
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/bridge/intel,keembay-dsi.yaml
@@ -0,0 +1,101 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/bridge/intel,keembay-dsi.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Devicetree bindings for Intel Keem Bay mipi dsi controller
+
+maintainers:
+  - Anitha Chrisanthus 
+  - Edmond J Dea 
+
+properties:
+  compatible:
+const: intel,keembay-dsi
+
+  reg:
+items:
+  - description: MIPI registers range
+
+  reg-names:
+items:
+  - const: mipi
+
+  clocks:
+items:
+  - description: MIPI DSI clock
+  - description: MIPI DSI econfig clock
+  - description: MIPI DSI config clock
+
+  clock-names:
+items:
+  - const: clk_mipi
+  - const: clk_mipi_ecfg
+  - const: clk_mipi_cfg
+
+  ports:
+type: object
+
+properties:
+  '#address-cells':
+   const: 1
+
+  '#size-cells':
+   const: 0
+
+  port@0:
+type: object
+description: MIPI DSI input port.
+
+  port@1:
+type: object
+description: DSI output port.
+
+required:
+  - port@0
+  - port@1
+
+additionalProperties: false
+
+required:
+  - compatible
+  - reg
+  - reg-names
+  - clocks
+  - clock-names
+  - ports
+
+additionalProperties: false
+
+examples:
+  - |
+mipi-dsi@2090 {
+compatible = "intel,keembay-dsi";
+reg = <0x2090 0x4000>;
+reg-names = "mipi";
+clocks = <_clk 0x86>,
+ <_clk 0x88>,
+ <_clk 0x89>;
+clock-names = "clk_mipi", "clk_mipi_ecfg",
+  "clk_mipi_cfg";
+
+ports {
+#address-cells = <1>;
+#size-cells = <0>;
+
+port@0 {
+reg = <0>;
+dsi_in: endpoint {
+remote-endpoint = <_out>;
+};
+};
+
+port@1 {
+reg = <1>;
+dsi_out: endpoint {
+remote-endpoint = <_input>;
+};
+};
+};
+};
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v11 0/7] Add support for KeemBay DRM driver

2020-11-03 Thread Anitha Chrisanthus
This is a new DRM driver for Intel's KeemBay SOC.
The SoC couples an ARM Cortex A53 CPU with an Intel
Movidius VPU.

This driver is tested with the KMB EVM board which is the reference baord
for Keem Bay SOC. The SOC's display pipeline is as follows

+--++-++---+
|LCD controller| -> |Mipi DSI | -> |Mipi to HDMI Converter |
+--++-++---+

LCD controller and Mipi DSI transmitter are part of the SOC and
mipi to HDMI converter is ADV7535 for KMB EVM board.

The DRM driver is a basic KMS atomic modesetting display driver and
has no 2D or 3D graphics.It calls into the ADV bridge driver at
the connector level.

Only 1080p resolution and single plane is supported at this time.
The usecase is for debugging video and camera outputs.

Device tree patches are under review here
https://lore.kernel.org/linux-arm-kernel/20200708175020.194436-1-daniele.alessandre...@linux.intel.com/T/

Changes since v1:
- Removed redundant license text, updated license
- Rearranged include blocks
- renamed global vars and removed extern in c
- Used upclassing for dev_private
- Used drm_dev_init in drm device create
- minor cleanups

Changes since v2:
- squashed all commits to a single commit
- logging changed to drm_info, drm_dbg etc.
- used devm_drm_dev_alloc()
- removed commented out sections and general cleanup

Changes since v3:
- renamed dev_p to kmb
- moved clocks under kmb_clock, consolidated clk initializations
- use drmm functions
- use DRM_GEM_CMA_DRIVER_OPS_VMAP
- more cleanups

Changes since v4:
- corrected spellings

Changes since v5:
- corrected checkpatch warnings/checks
   -Please ignore checkpatch checks on Camelcase - this is how it is
   named in the databook
   - Please ignore checkpatch warnings on misspelled for hsa, dout,
   widthn etc. - they are spelled as in the databook
   - Please ignore checkpatch checks on macro arguments reuse -
   its confirmed ok

Changes since v6:
- review changes Sam Ravnborg and Thomas Zimmerman
split patch into 4 parts, part1 register definitions, part2 display
driver files, part3 mipi dsi, part4 build files (Sam)
removed kmb_crtc.h kmb_crtc_cleanup (Thomas)
renamed mode_set, kmb_load, inlined unload (Thomas)
moved remaining logging to drm_*(Thomas)
re-orged driver initialization (Thomas)
moved plane_status to drm_private (Sam)
removed unnecessary logs and defines and ifdef codes (Sam)
split dphy_init_sequence smaller (Sam)
removed redundant checks in kmb_dsi (Sam)
changed kmb_dsi_init to drm_bridge_connector_init and
drm_connector_attach_encoder to bridge's connector (Sam)
call helper_check in plane_atomic_check (Sam)
renamed set to get for bpp and format functions(Sam)
use drm helper functions for reset, duplicate/destroy state instead
of kmb functions (Sam)
removed kmb_priv from kmb_plane and removed kmb_plane_state (Sam)

Changes since v7:
- tested with 5.9 kernel and made the following changes
get clk_pll0 from display node in dt  
call drm_bridge_attach with DRM_BRIDGE_ATTACH_NO_CONNECTOR
Also added Maintainer entry 

Changes since v8:
DT review changes (Rob)
renamed kmb_dsi_hw_init to kmb_dsi_mode_set (Daniel V)
moved csc_coef_lcd to plane.c (Daniel Vetter)
call drm_atomic_helper_shutdown in remove (Daniel V)
use drm_crtc_handle_vblank (Daniel V)
renamed kmb_dsi_hw_init to kmb_dsi_mode_set (Daniel V)
complimentary changes to device tree changes (Rob)
removed redundant definitions in kmb_dsi.h

Changes since v9:
Review changes from Sam Ravnborg which are:
DT is separated to display and Mipi DSI as per Sam suggestion and the
driver has changes to reflect this separation. Also most of the
MIPI DSI code is isolated and separated from the main driver, worked 
closely with Sam on these changes. This split is to ease review and
driver is only buildable after the last patch (build files).

call drm_crtc_arm_vblank_event in atomic_flush (Daniel V)
moved global vars to kmb_private and added locks (Daniel V)
added comments to clarify empty dsi host functions (Daniel V)

Changes since v10:
Created separate DT binding for msscam as syscon(Neil Armstrong, Sam)
Msscam is used for clocks and also for connecting mipi and lcd.
Corresponding driver changes for the above change (Neil Armstrong, Sam)
corrected description for port in dsi DT bindings file
updated reviewed by in commits.


Anitha Chrisanthus (7):
  dt-bindings: display: Add support for Intel KeemBay Display
  dt-bindings: display: Intel KeemBay MSSCAM
  dt-bindings: display: bridge: Intel KeemBay DSI
  drm/kmb: Keem Bay driver register definition
  drm/kmb: Add support for KeemBay Display
  drm/kmb

[PATCH v11 6/7] drm/kmb: Mipi DSI part of the display driver

2020-11-03 Thread Anitha Chrisanthus
Initializes Mipi DSI and sets up connects to ADV bridge

v2: removed license text
upclassed dev_private, removed HAVE_IRQ. (Sam)

v3: Squashed all 59 commits to one

v4: review changes from Sam Ravnborg
renamed dev_p to kmb

v5: corrected spellings
v6: corrected checkpatch warnings
v7: review changes Sam Ravnborg and Thomas Zimmerman
removed unnecessary logs and defines and ifdef codes (Sam)
split dphy_init_sequence smaller (Sam)
removed redundant checks in kmb_dsi (Sam)
changed kmb_dsi_init to drm_bridge_connector_init and
drm_connector_attach_encoder to bridge's connector (Sam)
v8: call drm_bridge_attach with DRM_BRIDGE_ATTACH_NO_CONNECTOR
v9: renamed kmb_dsi_hw_init to kmb_dsi_mode_set (Daniel V)
v10: changes in driver to accommodate changes in DT to separate DSI
 entries (Sam R)
 added comments to clarify empty dsi host functions
 review changes from Sam to separate out DSI part,
 removed dependencies on drm side (Sam R)
v11: review changes for separate msscam node (Sam R, Neil A)

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Sam Ravnborg 
Cc: Sam Ravnborg 
Cc: Thomas Zimmermann 
Cc: Daniel Vetter 
---
 drivers/gpu/drm/kmb/kmb_dsi.c | 1562 +
 drivers/gpu/drm/kmb/kmb_dsi.h |  387 ++
 2 files changed, 1949 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.h

diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
new file mode 100644
index 000..a24723d
--- /dev/null
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -0,0 +1,1562 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright © 2019-2020 Intel Corporation
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "kmb_dsi.h"
+#include "kmb_regs.h"
+
+static struct mipi_dsi_host *dsi_host;
+static struct mipi_dsi_device *dsi_device;
+static struct drm_bridge *adv_bridge;
+
+/* Default setting is 1080p, 4 lanes */
+#define IMG_HEIGHT_LINES  1080
+#define IMG_WIDTH_PX  1920
+#define MIPI_TX_ACTIVE_LANES 4
+
+static struct mipi_tx_frame_section_cfg mipi_tx_frame0_sect_cfg = {
+   .width_pixels = IMG_WIDTH_PX,
+   .height_lines = IMG_HEIGHT_LINES,
+   .data_type = DSI_LP_DT_PPS_RGB888_24B,
+   .data_mode = MIPI_DATA_MODE1,
+   .dma_packed = 0
+};
+
+static struct mipi_tx_frame_cfg mipitx_frame0_cfg = {
+   .sections[0] = _tx_frame0_sect_cfg,
+   .sections[1] = NULL,
+   .sections[2] = NULL,
+   .sections[3] = NULL,
+   .vsync_width = 5,
+   .v_backporch = 36,
+   .v_frontporch = 4,
+   .hsync_width = 44,
+   .h_backporch = 148,
+   .h_frontporch = 88
+};
+
+static const struct mipi_tx_dsi_cfg mipitx_dsi_cfg = {
+   .hfp_blank_en = 0,
+   .eotp_en = 0,
+   .lpm_last_vfp_line = 0,
+   .lpm_first_vsa_line = 0,
+   .sync_pulse_eventn = DSI_VIDEO_MODE_NO_BURST_EVENT,
+   .hfp_blanking = SEND_BLANK_PACKET,
+   .hbp_blanking = SEND_BLANK_PACKET,
+   .hsa_blanking = SEND_BLANK_PACKET,
+   .v_blanking = SEND_BLANK_PACKET,
+};
+
+static struct mipi_ctrl_cfg mipi_tx_init_cfg = {
+   .active_lanes = MIPI_TX_ACTIVE_LANES,
+   .lane_rate_mbps = MIPI_TX_LANE_DATA_RATE_MBPS,
+   .ref_clk_khz = MIPI_TX_REF_CLK_KHZ,
+   .cfg_clk_khz = MIPI_TX_CFG_CLK_KHZ,
+   .tx_ctrl_cfg = {
+   .frames[0] = _frame0_cfg,
+   .frames[1] = NULL,
+   .frames[2] = NULL,
+   .frames[3] = NULL,
+   .tx_dsi_cfg = _dsi_cfg,
+   .line_sync_pkt_en = 0,
+   .line_counter_active = 0,
+   .frame_counter_active = 0,
+   .tx_always_use_hact = 1,
+   .tx_hact_wait_stop = 1,
+   }
+};
+
+struct  mipi_hs_freq_range_cfg {
+   u16 default_bit_rate_mbps;
+   u8 hsfreqrange_code;
+};
+
+struct vco_params {
+   u32 freq;
+   u32 range;
+   u32 divider;
+};
+
+static const struct vco_params vco_table[] = {
+   {52, 0x3f, 8},
+   {80, 0x39, 8},
+   {105, 0x2f, 4},
+   {160, 0x29, 4},
+   {210, 0x1f, 2},
+   {320, 0x19, 2},
+   {420, 0x0f, 1},
+   {630, 0x09, 1},
+   {1100, 0x03, 1},
+   {0x, 0x01, 1},
+};
+
+static const struct mipi_hs_freq_range_cfg
+mipi_hs_freq_range[MIPI_DPHY_DEFAULT_BIT_RATES] = {
+   {.default_bit_rate_mbps = 80, .hsfreqrange_code = 0x00},
+   {.default_bit_rate_mbps = 90, .hsfreqrange_code = 0x10},
+   {.default_bit_rate_mbps = 100, .hsfreqrange_code = 0x20},
+   {.default_bit_rate_mbps = 110, .hsfreqrange_code = 0x30},
+   {.default_bit_rate_mbps = 120, .hsfreqrange_code = 0x01},
+   {.default_bit_rate_mbps = 130, .hsf

[PATCH v11 1/7] dt-bindings: display: Add support for Intel KeemBay Display

2020-11-03 Thread Anitha Chrisanthus
This patch adds bindings for Intel KeemBay Display

v2: review changes from Rob Herring
v3: review changes from Sam Ravnborg (removed mipi dsi entries, and
encoder entry, connect port to dsi)
MSSCAM is part of the display submodule and its used to reset LCD
and MIPI DSI clocks, so its best to be on this device tree.
v4: review changes from Neil Armstrong and Sam - removed msscam
entries

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Sam Ravnborg 
Cc: Sam Ravnborg 
Cc: Neil Armstrong 
Cc: Thomas Zimmermann 
Cc: Daniel Vetter 
Cc: Rob Herring 
---
 .../bindings/display/intel,keembay-display.yaml| 72 ++
 1 file changed, 72 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/display/intel,keembay-display.yaml

diff --git 
a/Documentation/devicetree/bindings/display/intel,keembay-display.yaml 
b/Documentation/devicetree/bindings/display/intel,keembay-display.yaml
new file mode 100644
index 000..0a697d4
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/intel,keembay-display.yaml
@@ -0,0 +1,72 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/intel,keembay-display.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Devicetree bindings for Intel Keem Bay display controller
+
+maintainers:
+  - Anitha Chrisanthus 
+  - Edmond J Dea 
+
+properties:
+  compatible:
+const: intel,keembay-display
+
+  reg:
+items:
+  - description: LCD registers range
+
+  reg-names:
+items:
+  - const: lcd
+
+  clocks:
+items:
+  - description: LCD controller clock
+  - description: pll0 clock
+
+  clock-names:
+items:
+  - const: clk_lcd
+  - const: clk_pll0
+
+  interrupts:
+maxItems: 1
+
+  port:
+type: object
+description: Display output node to DSI.
+
+required:
+  - compatible
+  - reg
+  - reg-names
+  - clocks
+  - clock-names
+  - interrupts
+  - port
+
+additionalProperties: false
+
+examples:
+  - |
+#include 
+#include 
+
+display@2093 {
+compatible = "intel,keembay-display";
+reg = <0x2093 0x3000>;
+reg-names = "lcd";
+interrupts = ;
+clocks = <_clk 0x83>,
+ <_clk 0x0>;
+clock-names = "clk_lcd", "clk_pll0";
+
+port {
+disp_out: endpoint {
+remote-endpoint = <_in>;
+};
+};
+};
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v10 5/6] drm/kmb: Mipi DSI part of the display driver

2020-10-29 Thread Anitha Chrisanthus
Initializes Mipi DSI and sets up connects to ADV bridge

v2: removed license text
upclassed dev_private, removed HAVE_IRQ. (Sam)

v3: Squashed all 59 commits to one

v4: review changes from Sam Ravnborg
renamed dev_p to kmb

v5: corrected spellings
v6: corrected checkpatch warnings
v7: review changes Sam Ravnborg and Thomas Zimmerman
removed unnecessary logs and defines and ifdef codes (Sam)
split dphy_init_sequence smaller (Sam)
removed redundant checks in kmb_dsi (Sam)
changed kmb_dsi_init to drm_bridge_connector_init and
drm_connector_attach_encoder to bridge's connector (Sam)
v8: call drm_bridge_attach with DRM_BRIDGE_ATTACH_NO_CONNECTOR
v9: renamed kmb_dsi_hw_init to kmb_dsi_mode_set (Daniel V)
v10: changes in driver to accommodate changes in DT to separate DSI
 entries (Sam R)
 added comments to clarify empty dsi host functions
 review changes from Sam to separate out DSI part,
 removed dependencies on drm side (Sam R)

Signed-off-by: Anitha Chrisanthus 
Cc: Sam Ravnborg 
Cc: Thomas Zimmermann 
Cc: Daniel Vetter 
---
 drivers/gpu/drm/kmb/kmb_dsi.c | 1540 +
 drivers/gpu/drm/kmb/kmb_dsi.h |  387 +++
 2 files changed, 1927 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.h

diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
new file mode 100644
index 000..b65236f
--- /dev/null
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -0,0 +1,1540 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright © 2019-2020 Intel Corporation
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "kmb_dsi.h"
+#include "kmb_regs.h"
+
+static struct mipi_dsi_host *dsi_host;
+static struct mipi_dsi_device *dsi_device;
+static struct drm_bridge *adv_bridge;
+
+/* Default setting is 1080p, 4 lanes */
+#define IMG_HEIGHT_LINES  1080
+#define IMG_WIDTH_PX  1920
+#define MIPI_TX_ACTIVE_LANES 4
+
+static struct mipi_tx_frame_section_cfg mipi_tx_frame0_sect_cfg = {
+   .width_pixels = IMG_WIDTH_PX,
+   .height_lines = IMG_HEIGHT_LINES,
+   .data_type = DSI_LP_DT_PPS_RGB888_24B,
+   .data_mode = MIPI_DATA_MODE1,
+   .dma_packed = 0
+};
+
+static struct mipi_tx_frame_cfg mipitx_frame0_cfg = {
+   .sections[0] = _tx_frame0_sect_cfg,
+   .sections[1] = NULL,
+   .sections[2] = NULL,
+   .sections[3] = NULL,
+   .vsync_width = 5,
+   .v_backporch = 36,
+   .v_frontporch = 4,
+   .hsync_width = 44,
+   .h_backporch = 148,
+   .h_frontporch = 88
+};
+
+static const struct mipi_tx_dsi_cfg mipitx_dsi_cfg = {
+   .hfp_blank_en = 0,
+   .eotp_en = 0,
+   .lpm_last_vfp_line = 0,
+   .lpm_first_vsa_line = 0,
+   .sync_pulse_eventn = DSI_VIDEO_MODE_NO_BURST_EVENT,
+   .hfp_blanking = SEND_BLANK_PACKET,
+   .hbp_blanking = SEND_BLANK_PACKET,
+   .hsa_blanking = SEND_BLANK_PACKET,
+   .v_blanking = SEND_BLANK_PACKET,
+};
+
+static struct mipi_ctrl_cfg mipi_tx_init_cfg = {
+   .active_lanes = MIPI_TX_ACTIVE_LANES,
+   .lane_rate_mbps = MIPI_TX_LANE_DATA_RATE_MBPS,
+   .ref_clk_khz = MIPI_TX_REF_CLK_KHZ,
+   .cfg_clk_khz = MIPI_TX_CFG_CLK_KHZ,
+   .tx_ctrl_cfg = {
+   .frames[0] = _frame0_cfg,
+   .frames[1] = NULL,
+   .frames[2] = NULL,
+   .frames[3] = NULL,
+   .tx_dsi_cfg = _dsi_cfg,
+   .line_sync_pkt_en = 0,
+   .line_counter_active = 0,
+   .frame_counter_active = 0,
+   .tx_always_use_hact = 1,
+   .tx_hact_wait_stop = 1,
+   }
+};
+
+struct  mipi_hs_freq_range_cfg {
+   u16 default_bit_rate_mbps;
+   u8 hsfreqrange_code;
+};
+
+struct vco_params {
+   u32 freq;
+   u32 range;
+   u32 divider;
+};
+
+static const struct vco_params vco_table[] = {
+   {52, 0x3f, 8},
+   {80, 0x39, 8},
+   {105, 0x2f, 4},
+   {160, 0x29, 4},
+   {210, 0x1f, 2},
+   {320, 0x19, 2},
+   {420, 0x0f, 1},
+   {630, 0x09, 1},
+   {1100, 0x03, 1},
+   {0x, 0x01, 1},
+};
+
+static const struct mipi_hs_freq_range_cfg
+mipi_hs_freq_range[MIPI_DPHY_DEFAULT_BIT_RATES] = {
+   {.default_bit_rate_mbps = 80, .hsfreqrange_code = 0x00},
+   {.default_bit_rate_mbps = 90, .hsfreqrange_code = 0x10},
+   {.default_bit_rate_mbps = 100, .hsfreqrange_code = 0x20},
+   {.default_bit_rate_mbps = 110, .hsfreqrange_code = 0x30},
+   {.default_bit_rate_mbps = 120, .hsfreqrange_code = 0x01},
+   {.default_bit_rate_mbps = 130, .hsfreqrange_code = 0x11},
+   {.default_bit_rate_mbps = 140, .hsfreqrange_code = 0x21},
+   {.default_bit_rate_mbps = 150, .hsf

[PATCH v10 3/6] drm/kmb: Keem Bay driver register definition

2020-10-29 Thread Anitha Chrisanthus
Register definitions for Keem Bay display driver

v2: removed license text (Sam)
v3: Squashed all 59 commits to one
v4: review changes from Sam Ravnborg
renamed dev_p to kmb
v5: corrected spellings
v6: corrected checkpatch warnings
v7: removed redundant definitions
v8: removed redundant definitions, clean up (Sam R)

Signed-off-by: Anitha Chrisanthus 
Cc: Sam Ravnborg 
Cc: Thomas Zimmermann 
Cc: Daniel Vetter 
---
 drivers/gpu/drm/kmb/kmb_regs.h | 725 +
 1 file changed, 725 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/kmb_regs.h

diff --git a/drivers/gpu/drm/kmb/kmb_regs.h b/drivers/gpu/drm/kmb/kmb_regs.h
new file mode 100644
index 000..4815056
--- /dev/null
+++ b/drivers/gpu/drm/kmb/kmb_regs.h
@@ -0,0 +1,725 @@
+/* SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Copyright © 2018-2020 Intel Corporation
+ */
+
+#ifndef __KMB_REGS_H__
+#define __KMB_REGS_H__
+
+/***
+ *LCD controller control register defines
+ ***/
+#define LCD_CONTROL(0x4 * 0x000)
+#define LCD_CTRL_PROGRESSIVE (0 << 0)
+#define LCD_CTRL_INTERLACED  BIT(0)
+#define LCD_CTRL_ENABLE  BIT(1)
+#define LCD_CTRL_VL1_ENABLE  BIT(2)
+#define LCD_CTRL_VL2_ENABLE  BIT(3)
+#define LCD_CTRL_GL1_ENABLE  BIT(4)
+#define LCD_CTRL_GL2_ENABLE  BIT(5)
+#define LCD_CTRL_ALPHA_BLEND_VL1 (0 << 6)
+#define LCD_CTRL_ALPHA_BLEND_VL2 BIT(6)
+#define LCD_CTRL_ALPHA_BLEND_GL1 (2 << 6)
+#define LCD_CTRL_ALPHA_BLEND_GL2 (3 << 6)
+#define LCD_CTRL_ALPHA_TOP_VL1   (0 << 8)
+#define LCD_CTRL_ALPHA_TOP_VL2   BIT(8)
+#define LCD_CTRL_ALPHA_TOP_GL1   (2 << 8)
+#define LCD_CTRL_ALPHA_TOP_GL2   (3 << 8)
+#define LCD_CTRL_ALPHA_MIDDLE_VL1(0 << 10)
+#define LCD_CTRL_ALPHA_MIDDLE_VL2BIT(10)
+#define LCD_CTRL_ALPHA_MIDDLE_GL1(2 << 10)
+#define LCD_CTRL_ALPHA_MIDDLE_GL2(3 << 10)
+#define LCD_CTRL_ALPHA_BOTTOM_VL1(0 << 12)
+#define LCD_CTRL_ALPHA_BOTTOM_VL2BIT(12)
+#define LCD_CTRL_ALPHA_BOTTOM_GL1(2 << 12)
+#define LCD_CTRL_ALPHA_BOTTOM_GL2(3 << 12)
+#define LCD_CTRL_TIM_GEN_ENABLE  BIT(14)
+#define LCD_CTRL_CONTINUOUS  (0 << 15)
+#define LCD_CTRL_ONE_SHOTBIT(15)
+#define LCD_CTRL_PWM0_EN BIT(16)
+#define LCD_CTRL_PWM1_EN BIT(17)
+#define LCD_CTRL_PWM2_EN BIT(18)
+#define LCD_CTRL_OUTPUT_DISABLED (0 << 19)
+#define LCD_CTRL_OUTPUT_ENABLED  BIT(19)
+#define LCD_CTRL_BPORCH_ENABLE   BIT(21)
+#define LCD_CTRL_FPORCH_ENABLE   BIT(22)
+#define LCD_CTRL_PIPELINE_DMABIT(28)
+#define LCD_CTRL_VHSYNC_IDLE_LVL BIT(31)
+
+/* interrupts */
+#define LCD_INT_STATUS (0x4 * 0x001)
+#define LCD_INT_EOF  BIT(0)
+#define LCD_INT_LINE_CMP BIT(1)
+#define LCD_INT_VERT_COMPBIT(2)
+#define LAYER0_DMA_DONE  BIT(3)
+#define LAYER0_DMA_IDLE  BIT(4)
+#define LAYER0_DMA_FIFO_OVERFLOW BIT(5)
+#define LAYER0_DMA_FIFO_UNDERFLOWBIT(6)
+#define LAYER0_DMA_CB_FIFO_OVERFLOW  BIT(7)
+#define LAYER0_DMA_CB_FIFO_UNDERFLOW BIT(8)
+#define LAYER0_DMA_CR_FIFO_OVERFLOW  BIT(9)
+#define LAYER0_DMA_CR_FIFO_UNDERFLOW BIT(10)
+#define LAYER1_DMA_DONE  BIT(11)
+#define LAYER1_DMA_IDLE  BIT(12)
+#define LAYER1_DMA_FIFO_OVERFLOW BIT(13)
+#define LAYER1_DMA_FIFO_UNDERFLOWBIT(14)
+#define LAYER1_DMA_CB_FIFO_OVERFLOW  BIT(15)
+#define LAYER1_DMA_CB_FIFO_UNDERFLOW BIT(16)
+#define LAYER1_DMA_CR_FIFO_OVERFLOW  BIT(17)
+#define LAYER1_DMA_CR_FIFO_UNDERFLOW BIT(18)
+#define LAYER2_DMA_DONE  BIT(19)
+#define LAYER2_DMA_IDLE  BIT(20)
+#define LAYER2_DMA_FIFO_OVERFLOW BIT(21)
+#define LAYER2_DMA_FIFO_UNDERFLOWBIT(22)
+#define LAYER3_DMA_DONE  BIT(23)
+#define LAYER3_DMA_IDLE  BIT(24)
+#define LAYER3_DMA_FIFO_OVERFLOW 

[PATCH v10 4/6] drm/kmb: Add support for KeemBay Display

2020-10-29 Thread Anitha Chrisanthus
This is a basic KMS atomic modesetting display driver for KeemBay family of
SOCs. Driver has no 2D or 3D graphics. It calls into the ADV bridge
driver at the connector level.

Single CRTC with LCD controller->mipi DSI->ADV bridge

Only 1080p resolution and single plane is supported at this time.

v2: moved extern to .h, removed license text
use drm_dev_init, upclassed dev_private, removed HAVE_IRQ.(Sam)

v3: Squashed all 59 commits to one

v4: review changes from Sam Ravnborg
renamed dev_p to kmb
moved clocks under kmb_clock, consolidated clk initializations
use drmm functions
use DRM_GEM_CMA_DRIVER_OPS_VMAP

v5: corrected spellings
v6: corrected checkpatch warnings
v7: review changes Sam Ravnborg and Thomas Zimmerman
removed kmb_crtc.h kmb_crtc_cleanup (Thomas)
renamed mode_set, kmb_load, inlined unload (Thomas)
moved remaining logging to drm_*(Thomas)
re-orged driver initialization (Thomas)
moved plane_status to drm_private (Sam)
removed unnecessary logs and defines and ifdef codes (Sam)
call helper_check in plane_atomic_check (Sam)
renamed set to get for bpp and format functions(Sam)
use drm helper functions for reset, duplicate/destroy state instead
of kmb functions (Sam)
removed kmb_priv from kmb_plane and removed kmb_plane_state (Sam)
v8: get clk_pll0 from display node in dt
v9: moved csc_coef_lcd to plane.c (Daniel Vetter)
call drm_atomic_helper_shutdown in remove (Daniel V)
use drm_crtc_handle_vblank (Daniel V)
renamed kmb_dsi_hw_init to kmb_dsi_mode_set (Daniel V)
complimentary changes to device tree changes (Rob)
v10: call drm_crtc_arm_vblank_event in atomic_flush (Daniel V)
 moved global vars to kmb_private and added locks (Daniel V)
 changes in driver to accommodate changes in DT to separate DSI
 entries (Sam R)
 review changes to separate mipi DSI (Sam R)

Signed-off-by: Anitha Chrisanthus 
Cc: Sam Ravnborg 
Cc: Thomas Zimmermann 
Cc: Daniel Vetter 
---
 drivers/gpu/drm/kmb/kmb_crtc.c  | 232 
 drivers/gpu/drm/kmb/kmb_drv.c   | 603 
 drivers/gpu/drm/kmb/kmb_drv.h   | 109 
 drivers/gpu/drm/kmb/kmb_plane.c | 490 
 drivers/gpu/drm/kmb/kmb_plane.h |  99 +++
 5 files changed, 1533 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/kmb_crtc.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.h

diff --git a/drivers/gpu/drm/kmb/kmb_crtc.c b/drivers/gpu/drm/kmb/kmb_crtc.c
new file mode 100644
index 000..6ace64e
--- /dev/null
+++ b/drivers/gpu/drm/kmb/kmb_crtc.c
@@ -0,0 +1,232 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright © 2018-2020 Intel Corporation
+ */
+
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "kmb_drv.h"
+#include "kmb_dsi.h"
+#include "kmb_plane.h"
+#include "kmb_regs.h"
+
+struct kmb_crtc_timing {
+   u32 vfront_porch;
+   u32 vback_porch;
+   u32 vsync_len;
+   u32 hfront_porch;
+   u32 hback_porch;
+   u32 hsync_len;
+};
+
+static int kmb_crtc_enable_vblank(struct drm_crtc *crtc)
+{
+   struct drm_device *dev = crtc->dev;
+   struct kmb_drm_private *kmb = to_kmb(dev);
+
+   /* Clear interrupt */
+   kmb_write_lcd(kmb, LCD_INT_CLEAR, LCD_INT_VERT_COMP);
+   /* Set which interval to generate vertical interrupt */
+   kmb_write_lcd(kmb, LCD_VSTATUS_COMPARE,
+ LCD_VSTATUS_COMPARE_VSYNC);
+   /* Enable vertical interrupt */
+   kmb_set_bitmask_lcd(kmb, LCD_INT_ENABLE,
+   LCD_INT_VERT_COMP);
+   return 0;
+}
+
+static void kmb_crtc_disable_vblank(struct drm_crtc *crtc)
+{
+   struct drm_device *dev = crtc->dev;
+   struct kmb_drm_private *kmb = to_kmb(dev);
+
+   /* Clear interrupt */
+   kmb_write_lcd(kmb, LCD_INT_CLEAR, LCD_INT_VERT_COMP);
+   /* Disable vertical interrupt */
+   kmb_clr_bitmask_lcd(kmb, LCD_INT_ENABLE,
+   LCD_INT_VERT_COMP);
+}
+
+static const struct drm_crtc_funcs kmb_crtc_funcs = {
+   .destroy = drm_crtc_cleanup,
+   .set_config = drm_atomic_helper_set_config,
+   .page_flip = drm_atomic_helper_page_flip,
+   .reset = drm_atomic_helper_crtc_reset,
+   .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
+   .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
+   .enable_vblank = kmb_crtc_enable_vblank,
+   .disable_vblank = kmb_crtc_disable_vblank,
+};
+
+static void connect_lcd_to_mipi(struct kmb_drm_private *kmb)
+{
+   /* DISABLE MIPI->CIF CONNECTION */
+   kmb_write_msscam(kmb, MSS_MIPI_CIF_CFG, 0);
+
+   /* ENAB

[PATCH v10 2/6] dt-bindings: display: bridge: Intel KeemBay DSI

2020-10-29 Thread Anitha Chrisanthus
This patch adds bindings for Intel KeemBay MIPI DSI

Signed-off-by: Anitha Chrisanthus 
Cc: Sam Ravnborg 
Cc: Thomas Zimmermann 
Cc: Daniel Vetter 
---
 .../bindings/display/bridge/intel,keembay-dsi.yaml | 101 +
 1 file changed, 101 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/display/bridge/intel,keembay-dsi.yaml

diff --git 
a/Documentation/devicetree/bindings/display/bridge/intel,keembay-dsi.yaml 
b/Documentation/devicetree/bindings/display/bridge/intel,keembay-dsi.yaml
new file mode 100644
index 000..4cef64e
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/bridge/intel,keembay-dsi.yaml
@@ -0,0 +1,101 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/bridge/intel,keembay-dsi.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Devicetree bindings for Intel Keem Bay mipi dsi controller
+
+maintainers:
+  - Anitha Chrisanthus 
+  - Edmond J Dea 
+
+properties:
+  compatible:
+const: intel,keembay-dsi
+
+  reg:
+items:
+  - description: MIPI registers range
+
+  reg-names:
+items:
+  - const: mipi
+
+  clocks:
+items:
+  - description: MIPI DSI clock
+  - description: MIPI DSI econfig clock
+  - description: MIPI DSI config clock
+
+  clock-names:
+items:
+  - const: clk_mipi
+  - const: clk_mipi_ecfg
+  - const: clk_mipi_cfg
+
+  ports:
+type: object
+
+properties:
+  '#address-cells':
+   const: 1
+
+  '#size-cells':
+   const: 0
+
+  port@0:
+type: object
+description: MIPI DSI input port.
+
+  port@1:
+type: object
+description: DSI output port to adv7535.
+
+required:
+  - port@0
+  - port@1
+
+additionalProperties: false
+
+required:
+  - compatible
+  - reg
+  - reg-names
+  - clocks
+  - clock-names
+  - ports
+
+additionalProperties: false
+
+examples:
+  - |
+mipi-dsi@2090 {
+compatible = "intel,keembay-dsi";
+reg = <0x2090 0x4000>;
+reg-names = "mipi";
+clocks = <_clk 0x86>,
+ <_clk 0x88>,
+ <_clk 0x89>;
+clock-names = "clk_mipi", "clk_mipi_ecfg",
+  "clk_mipi_cfg";
+
+ports {
+#address-cells = <1>;
+#size-cells = <0>;
+
+port@0 {
+reg = <0>;
+dsi_in: endpoint {
+remote-endpoint = <_out>;
+};
+};
+
+port@1 {
+reg = <1>;
+dsi_out: endpoint {
+remote-endpoint = <_input>;
+};
+};
+};
+};
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v10 6/6] drm/kmb: Build files for KeemBay Display driver

2020-10-29 Thread Anitha Chrisanthus
v2: Added Maintainer entry
v3: Added one more Maintainer entry
v3: drop videomode_helpers

Cc: Sam Ravnborg 
Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 MAINTAINERS  |  7 +++
 drivers/gpu/drm/Kconfig  |  2 ++
 drivers/gpu/drm/Makefile |  1 +
 drivers/gpu/drm/kmb/Kconfig  | 12 
 drivers/gpu/drm/kmb/Makefile |  2 ++
 5 files changed, 24 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/Kconfig
 create mode 100644 drivers/gpu/drm/kmb/Makefile

diff --git a/MAINTAINERS b/MAINTAINERS
index bca7bda..442f0b9 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -8965,6 +8965,13 @@ M:   Deepak Saxena 
 S: Maintained
 F: drivers/char/hw_random/ixp4xx-rng.c
 
+INTEL KEEMBAY DRM DRIVER
+M: Anitha Chrisanthus 
+M: Edmund Dea 
+S: Maintained
+F: Documentation/devicetree/bindings/display/intel,kmb_display.yaml
+F: drivers/gpu/drm/kmb/
+
 INTEL MANAGEMENT ENGINE (mei)
 M: Tomas Winkler 
 L: linux-ker...@vger.kernel.org
diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index 64376dd..3dc293c 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -268,6 +268,8 @@ source "drivers/gpu/drm/nouveau/Kconfig"
 
 source "drivers/gpu/drm/i915/Kconfig"
 
+source "drivers/gpu/drm/kmb/Kconfig"
+
 config DRM_VGEM
tristate "Virtual GEM provider"
depends on DRM
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index 8156900..fefaff4c 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -71,6 +71,7 @@ obj-$(CONFIG_DRM_AMDGPU)+= amd/amdgpu/
 obj-$(CONFIG_DRM_MGA)  += mga/
 obj-$(CONFIG_DRM_I810) += i810/
 obj-$(CONFIG_DRM_I915) += i915/
+obj-$(CONFIG_DRM_KMB_DISPLAY)  += kmb/
 obj-$(CONFIG_DRM_MGAG200) += mgag200/
 obj-$(CONFIG_DRM_V3D)  += v3d/
 obj-$(CONFIG_DRM_VC4)  += vc4/
diff --git a/drivers/gpu/drm/kmb/Kconfig b/drivers/gpu/drm/kmb/Kconfig
new file mode 100644
index 000..2dd7e68
--- /dev/null
+++ b/drivers/gpu/drm/kmb/Kconfig
@@ -0,0 +1,12 @@
+config DRM_KMB_DISPLAY
+   tristate "INTEL KEEMBAY DISPLAY"
+   depends on DRM && OF && (ARM || ARM64)
+   depends on COMMON_CLK
+   select DRM_KMS_HELPER
+   select DRM_KMS_CMA_HELPER
+   select DRM_GEM_CMA_HELPER
+   help
+   Choose this option if you have Intel's KeemBay SOC which integrates
+   an ARM Cortex A53 CPU with an Intel Movidius VPU.
+
+   If M is selected the module will be called kmb-drm.
diff --git a/drivers/gpu/drm/kmb/Makefile b/drivers/gpu/drm/kmb/Makefile
new file mode 100644
index 000..527d737
--- /dev/null
+++ b/drivers/gpu/drm/kmb/Makefile
@@ -0,0 +1,2 @@
+kmb-drm-y := kmb_crtc.o kmb_drv.o kmb_plane.o kmb_dsi.o
+obj-$(CONFIG_DRM_KMB_DISPLAY)  += kmb-drm.o
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v10 1/6] dt-bindings: display: Add support for Intel KeemBay Display

2020-10-29 Thread Anitha Chrisanthus
This patch adds bindings for Intel KeemBay Display

v2: review changes from Rob Herring
v3: review changes from Sam Ravnborg (removed mipi dsi entries, and
encoder entry, connect port to dsi)
MSSCAM is part of the display submodule and its used to reset LCD
and MIPI DSI clocks, so its best to be on this device tree.

Signed-off-by: Anitha Chrisanthus 
Cc: Sam Ravnborg 
Cc: Thomas Zimmermann 
Cc: Daniel Vetter 
---
 .../bindings/display/intel,keembay-display.yaml| 75 ++
 1 file changed, 75 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/display/intel,keembay-display.yaml

diff --git 
a/Documentation/devicetree/bindings/display/intel,keembay-display.yaml 
b/Documentation/devicetree/bindings/display/intel,keembay-display.yaml
new file mode 100644
index 000..8a8effe
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/intel,keembay-display.yaml
@@ -0,0 +1,75 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/intel,keembay-display.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Devicetree bindings for Intel Keem Bay display controller
+
+maintainers:
+  - Anitha Chrisanthus 
+  - Edmond J Dea 
+
+properties:
+  compatible:
+const: intel,keembay-display
+
+  reg:
+items:
+  - description: LCD registers range
+  - description: Msscam registers range
+
+  reg-names:
+items:
+  - const: lcd
+  - const: msscam
+
+  clocks:
+items:
+  - description: LCD controller clock
+  - description: pll0 clock
+
+  clock-names:
+items:
+  - const: clk_lcd
+  - const: clk_pll0
+
+  interrupts:
+maxItems: 1
+
+  port:
+type: object
+description: Display output node to DSI.
+
+required:
+  - compatible
+  - reg
+  - reg-names
+  - clocks
+  - clock-names
+  - interrupts
+  - port
+
+additionalProperties: false
+
+examples:
+  - |
+#include 
+#include 
+
+display@2093 {
+compatible = "intel,keembay-display";
+reg = <0x2093 0x3000>,
+  <0x2091 0x30>;
+reg-names = "lcd", "msscam";
+interrupts = ;
+clocks = <_clk 0x83>,
+ <_clk 0x0>;
+clock-names = "clk_lcd", "clk_pll0";
+
+port {
+disp_out: endpoint {
+remote-endpoint = <_in>;
+};
+};
+};
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v10 0/6] Add support for KeemBay DRM driver

2020-10-29 Thread Anitha Chrisanthus
This is a new DRM driver for Intel's KeemBay SOC.
The SoC couples an ARM Cortex A53 CPU with an Intel
Movidius VPU.

This driver is tested with the KMB EVM board which is the refernce baord
for Keem Bay SOC. The SOC's display pipeline is as follows

+--++-++---+
|LCD controller| -> |Mipi DSI | -> |Mipi to HDMI Converter |
+--++-++---+

LCD controller and Mipi DSI transmitter are part of the SOC and
mipi to HDMI converter is ADV7535 for KMB EVM board.

The DRM driver is a basic KMS atomic modesetting display driver and
has no 2D or 3D graphics.It calls into the ADV bridge driver at
the connector level.

Only 1080p resolution and single plane is supported at this time.
The usecase is for debugging video and camera outputs.

Device tree patches are under review here
https://lore.kernel.org/linux-arm-kernel/20200708175020.194436-1-daniele.alessandre...@linux.intel.com/T/

Changes since v1:
- Removed redundant license text, updated license
- Rearranged include blocks
- renamed global vars and removed extern in c
- Used upclassing for dev_private
- Used drm_dev_init in drm device create
- minor cleanups

Changes since v2:
- squashed all commits to a single commit
- logging changed to drm_info, drm_dbg etc.
- used devm_drm_dev_alloc()
- removed commented out sections and general cleanup

Changes since v3:
- renamed dev_p to kmb
- moved clocks under kmb_clock, consolidated clk initializations
- use drmm functions
- use DRM_GEM_CMA_DRIVER_OPS_VMAP
- more cleanups

Changes since v4:
- corrected spellings

Changes since v5:
- corrected checkpatch warnings/checks
   -Please ignore checkpatch checks on Camelcase - this is how it is
   named in the databook
   - Please ignore checkpatch warnings on misspelled for hsa, dout,
   widthn etc. - they are spelled as in the databook
   - Please ignore checkpatch checks on macro arguments reuse -
   its confirmed ok

Changes since v6:
- review changes Sam Ravnborg and Thomas Zimmerman
split patch into 4 parts, part1 register definitions, part2 display
driver files, part3 mipi dsi, part4 build files (Sam)
removed kmb_crtc.h kmb_crtc_cleanup (Thomas)
renamed mode_set, kmb_load, inlined unload (Thomas)
moved remaining logging to drm_*(Thomas)
re-orged driver initialization (Thomas)
moved plane_status to drm_private (Sam)
removed unnecessary logs and defines and ifdef codes (Sam)
split dphy_init_sequence smaller (Sam)
removed redundant checks in kmb_dsi (Sam)
changed kmb_dsi_init to drm_bridge_connector_init and
drm_connector_attach_encoder to bridge's connector (Sam)
call helper_check in plane_atomic_check (Sam)
renamed set to get for bpp and format functions(Sam)
use drm helper functions for reset, duplicate/destroy state instead
of kmb functions (Sam)
removed kmb_priv from kmb_plane and removed kmb_plane_state (Sam)

Changes since v7:
- tested with 5.9 kernel and made the following changes
get clk_pll0 from display node in dt  
call drm_bridge_attach with DRM_BRIDGE_ATTACH_NO_CONNECTOR
Also added Maintainer entry 

Changes since v8:
DT review changes (Rob)
renamed kmb_dsi_hw_init to kmb_dsi_mode_set (Daniel V)
moved csc_coef_lcd to plane.c (Daniel Vetter)
call drm_atomic_helper_shutdown in remove (Daniel V)
use drm_crtc_handle_vblank (Daniel V)
renamed kmb_dsi_hw_init to kmb_dsi_mode_set (Daniel V)
complimentary changes to device tree changes (Rob)
removed redundant definitions in kmb_dsi.h

Changes since v9:
Review changes from Sam Ravnborg which are:
DT is separated to display and Mipi DSI as per Sam suggestion and the
driver has changes to reflect this separation. Also most of the
MIPI DSI code is isolated and separated from the main driver, worked 
closely with Sam on these changes. This split is to ease review and
driver is only buildable after the last patch (build files).

call drm_crtc_arm_vblank_event in atomic_flush (Daniel V)
moved global vars to kmb_private and added locks (Daniel V)
added comments to clarify empty dsi host functions (Daniel V)

Anitha Chrisanthus (6):
  dt-bindings: display: Add support for Intel KeemBay Display
  dt-bindings: display: bridge: Intel KeemBay DSI
  drm/kmb: Keem Bay driver register definition
  drm/kmb: Add support for KeemBay Display
  drm/kmb: Mipi DSI part of the display driver
  drm/kmb: Build files for KeemBay Display driver

 .../bindings/display/bridge/intel,keembay-dsi.yaml |  101 ++
 .../bindings/display/intel,keembay-display.yaml|   75 +
 MAINTAINERS|7 +
 drivers/gpu/drm/Kconfig|2 +
 drivers/gpu/drm/Makefile   |1 +
 drive

[PATCH v9 0/5] Add support for KeemBay DRM driver

2020-10-08 Thread Anitha Chrisanthus
This is a new DRM driver for Intel's KeemBay SOC.
The SoC couples an ARM Cortex A53 CPU with an Intel
Movidius VPU.

This driver is tested with the KMB EVM board which is the refernce baord
for Keem Bay SOC. The SOC's display pipeline is as follows

+--++-++---+
|LCD controller| -> |Mipi DSI | -> |Mipi to HDMI Converter |
+--++-++---+

LCD controller and Mipi DSI transmitter are part of the SOC and
mipi to HDMI converter is ADV7535 for KMB EVM board.

The DRM driver is a basic KMS atomic modesetting display driver and
has no 2D or 3D graphics.It calls into the ADV bridge driver at
the connector level.

Only 1080p resolution and single plane is supported at this time.
The usecase is for debugging video and camera outputs.

Device tree patches are under review here
https://lore.kernel.org/linux-arm-kernel/20200708175020.194436-1-daniele.alessandre...@linux.intel.com/T/

Changes since v1:
- Removed redundant license text, updated license
- Rearranged include blocks
- renamed global vars and removed extern in c
- Used upclassing for dev_private
- Used drm_dev_init in drm device create
- minor cleanups

Changes since v2:
- squashed all commits to a single commit
- logging changed to drm_info, drm_dbg etc.
- used devm_drm_dev_alloc()
- removed commented out sections and general cleanup

Changes since v3:
- renamed dev_p to kmb
- moved clocks under kmb_clock, consolidated clk initializations
- use drmm functions
- use DRM_GEM_CMA_DRIVER_OPS_VMAP
- more cleanups

Changes since v4:
- corrected spellings

Changes since v5:
- corrected checkpatch warnings/checks
   -Please ignore checkpatch checks on Camelcase - this is how it is
   named in the databook
   - Please ignore checkpatch warnings on misspelled for hsa, dout,
   widthn etc. - they are spelled as in the databook
   - Please ignore checkpatch checks on macro arguments reuse -
   its confirmed ok

Changes since v6:
- review changes Sam Ravnborg and Thomas Zimmerman
split patch into 4 parts, part1 register definitions, part2 display
driver files, part3 mipi dsi, part4 build files (Sam)
removed kmb_crtc.h kmb_crtc_cleanup (Thomas)
renamed mode_set, kmb_load, inlined unload (Thomas)
moved remaining logging to drm_*(Thomas)
re-orged driver initialization (Thomas)
moved plane_status to drm_private (Sam)
removed unnecessary logs and defines and ifdef codes (Sam)
split dphy_init_sequence smaller (Sam)
removed redundant checks in kmb_dsi (Sam)
changed kmb_dsi_init to drm_bridge_connector_init and
drm_connector_attach_encoder to bridge's connector (Sam)
call helper_check in plane_atomic_check (Sam)
renamed set to get for bpp and format functions(Sam)
use drm helper functions for reset, duplicate/destroy state instead
of kmb functions (Sam)
removed kmb_priv from kmb_plane and removed kmb_plane_state (Sam)

Changes since v7:
- tested with 5.9 kernel and made the following changes
get clk_pll0 from display node in dt  
call drm_bridge_attach with DRM_BRIDGE_ATTACH_NO_CONNECTOR
Also added Maintainer entry 

Changes since v8:
DT review changes (Rob)
renamed kmb_dsi_hw_init to kmb_dsi_mode_set (Daniel V)
moved csc_coef_lcd to plane.c (Daniel Vetter)
call drm_atomic_helper_shutdown in remove (Daniel V)
use drm_crtc_handle_vblank (Daniel V)
renamed kmb_dsi_hw_init to kmb_dsi_mode_set (Daniel V)
complimentary changes to device tree changes (Rob)
removed redundant definitions in kmb_dsi.h

Anitha Chrisanthus (5):
  dt-bindings: display: Add support for Intel KeemBay Display
  drm/kmb: Keem Bay driver register definition
  drm/kmb: Add support for KeemBay Display
  drm/kmb: Mipi DSI part of the display driver
  drm/kmb: Build files for KeemBay Display driver

 .../bindings/display/intel,keembay-display.yaml|   99 ++
 MAINTAINERS|7 +
 drivers/gpu/drm/Kconfig|2 +
 drivers/gpu/drm/Makefile   |1 +
 drivers/gpu/drm/kmb/Kconfig|   13 +
 drivers/gpu/drm/kmb/Makefile   |2 +
 drivers/gpu/drm/kmb/kmb_crtc.c |  224 +++
 drivers/gpu/drm/kmb/kmb_drv.c  |  676 +
 drivers/gpu/drm/kmb/kmb_drv.h  |  170 +++
 drivers/gpu/drm/kmb/kmb_dsi.c  | 1524 
 drivers/gpu/drm/kmb/kmb_dsi.h  |  350 +
 drivers/gpu/drm/kmb/kmb_plane.c|  488 +++
 drivers/gpu/drm/kmb/kmb_plane.h|  102 ++
 drivers/gpu/drm/kmb/kmb_regs.h |  739 ++
 14 files changed, 4397 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/display

[PATCH v9 2/5] drm/kmb: Keem Bay driver register definition

2020-10-08 Thread Anitha Chrisanthus
Register definitions for Keem Bay display driver

v2: removed license text (Sam)
v3: Squashed all 59 commits to one
v4: review changes from Sam Ravnborg
renamed dev_p to kmb
v5: corrected spellings
v6: corrected checkpatch warnings
v7: removed redundant definitions

Cc: Sam Ravnborg 
Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 drivers/gpu/drm/kmb/kmb_regs.h | 739 +
 1 file changed, 739 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/kmb_regs.h

diff --git a/drivers/gpu/drm/kmb/kmb_regs.h b/drivers/gpu/drm/kmb/kmb_regs.h
new file mode 100644
index 000..d076a85
--- /dev/null
+++ b/drivers/gpu/drm/kmb/kmb_regs.h
@@ -0,0 +1,739 @@
+/* SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Copyright © 2018-2020 Intel Corporation
+ */
+
+#ifndef __KMB_REGS_H__
+#define __KMB_REGS_H__
+
+#define ENABLE  1
+#define DISABLE 0
+
+/***
+ *LCD controller control register defines
+ ***/
+#define LCD_CONTROL(0x4 * 0x000)
+#define LCD_CTRL_PROGRESSIVE (0 << 0)
+#define LCD_CTRL_INTERLACED  BIT(0)
+#define LCD_CTRL_ENABLE  BIT(1)
+#define LCD_CTRL_VL1_ENABLE  BIT(2)
+#define LCD_CTRL_VL2_ENABLE  BIT(3)
+#define LCD_CTRL_GL1_ENABLE  BIT(4)
+#define LCD_CTRL_GL2_ENABLE  BIT(5)
+#define LCD_CTRL_ALPHA_BLEND_VL1 (0 << 6)
+#define LCD_CTRL_ALPHA_BLEND_VL2 BIT(6)
+#define LCD_CTRL_ALPHA_BLEND_GL1 (2 << 6)
+#define LCD_CTRL_ALPHA_BLEND_GL2 (3 << 6)
+#define LCD_CTRL_ALPHA_TOP_VL1   (0 << 8)
+#define LCD_CTRL_ALPHA_TOP_VL2   BIT(8)
+#define LCD_CTRL_ALPHA_TOP_GL1   (2 << 8)
+#define LCD_CTRL_ALPHA_TOP_GL2   (3 << 8)
+#define LCD_CTRL_ALPHA_MIDDLE_VL1(0 << 10)
+#define LCD_CTRL_ALPHA_MIDDLE_VL2BIT(10)
+#define LCD_CTRL_ALPHA_MIDDLE_GL1(2 << 10)
+#define LCD_CTRL_ALPHA_MIDDLE_GL2(3 << 10)
+#define LCD_CTRL_ALPHA_BOTTOM_VL1(0 << 12)
+#define LCD_CTRL_ALPHA_BOTTOM_VL2BIT(12)
+#define LCD_CTRL_ALPHA_BOTTOM_GL1(2 << 12)
+#define LCD_CTRL_ALPHA_BOTTOM_GL2(3 << 12)
+#define LCD_CTRL_TIM_GEN_ENABLE  BIT(14)
+#define LCD_CTRL_CONTINUOUS  (0 << 15)
+#define LCD_CTRL_ONE_SHOTBIT(15)
+#define LCD_CTRL_PWM0_EN BIT(16)
+#define LCD_CTRL_PWM1_EN BIT(17)
+#define LCD_CTRL_PWM2_EN BIT(18)
+#define LCD_CTRL_OUTPUT_DISABLED (0 << 19)
+#define LCD_CTRL_OUTPUT_ENABLED  BIT(19)
+#define LCD_CTRL_BPORCH_ENABLE   BIT(21)
+#define LCD_CTRL_FPORCH_ENABLE   BIT(22)
+#define LCD_CTRL_PIPELINE_DMABIT(28)
+#define LCD_CTRL_VHSYNC_IDLE_LVL BIT(31)
+
+/*interrupts */
+#define LCD_INT_STATUS (0x4 * 0x001)
+#define LCD_INT_EOF  BIT(0)
+#define LCD_INT_LINE_CMP BIT(1)
+#define LCD_INT_VERT_COMPBIT(2)
+#define LAYER0_DMA_DONE  BIT(3)
+#define LAYER0_DMA_IDLE  BIT(4)
+#define LAYER0_DMA_FIFO_OVERFLOW BIT(5)
+#define LAYER0_DMA_FIFO_UNDERFLOWBIT(6)
+#define LAYER0_DMA_CB_FIFO_OVERFLOW  BIT(7)
+#define LAYER0_DMA_CB_FIFO_UNDERFLOW BIT(8)
+#define LAYER0_DMA_CR_FIFO_OVERFLOW  BIT(9)
+#define LAYER0_DMA_CR_FIFO_UNDERFLOW BIT(10)
+#define LAYER1_DMA_DONE  BIT(11)
+#define LAYER1_DMA_IDLE  BIT(12)
+#define LAYER1_DMA_FIFO_OVERFLOW BIT(13)
+#define LAYER1_DMA_FIFO_UNDERFLOWBIT(14)
+#define LAYER1_DMA_CB_FIFO_OVERFLOW  BIT(15)
+#define LAYER1_DMA_CB_FIFO_UNDERFLOW BIT(16)
+#define LAYER1_DMA_CR_FIFO_OVERFLOW  BIT(17)
+#define LAYER1_DMA_CR_FIFO_UNDERFLOW BIT(18)
+#define LAYER2_DMA_DONE  BIT(19)
+#define LAYER2_DMA_IDLE  BIT(20)
+#define LAYER2_DMA_FIFO_OVERFLOW BIT(21)
+#define LAYER2_DMA_FIFO_UNDERFLOWBIT(22)
+#define LAYER3_DMA_DONE  BIT(23)
+#define LAYER3_DMA_IDLE  BIT(24)
+#

[PATCH v9 5/5] drm/kmb: Build files for KeemBay Display driver

2020-10-08 Thread Anitha Chrisanthus
v2: Added Maintainer entry
v3: Added one more Maintainer entry

Cc: Sam Ravnborg 
Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 MAINTAINERS  |  7 +++
 drivers/gpu/drm/Kconfig  |  2 ++
 drivers/gpu/drm/Makefile |  1 +
 drivers/gpu/drm/kmb/Kconfig  | 13 +
 drivers/gpu/drm/kmb/Makefile |  2 ++
 5 files changed, 25 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/Kconfig
 create mode 100644 drivers/gpu/drm/kmb/Makefile

diff --git a/MAINTAINERS b/MAINTAINERS
index c0f494c..a27de1f 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -8899,6 +8899,13 @@ M:   Deepak Saxena 
 S: Maintained
 F: drivers/char/hw_random/ixp4xx-rng.c
 
+INTEL KEEMBAY DRM DRIVER
+M: Anitha Chrisanthus 
+M: Edmund Dea 
+S: Maintained
+F: Documentation/devicetree/bindings/display/intel,kmb_display.yaml
+F: drivers/gpu/drm/kmb/
+
 INTEL MANAGEMENT ENGINE (mei)
 M: Tomas Winkler 
 L: linux-ker...@vger.kernel.org
diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index 147d61b..97a1631b 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -275,6 +275,8 @@ source "drivers/gpu/drm/nouveau/Kconfig"
 
 source "drivers/gpu/drm/i915/Kconfig"
 
+source "drivers/gpu/drm/kmb/Kconfig"
+
 config DRM_VGEM
tristate "Virtual GEM provider"
depends on DRM
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index 8156900..fefaff4 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -71,6 +71,7 @@ obj-$(CONFIG_DRM_AMDGPU)+= amd/amdgpu/
 obj-$(CONFIG_DRM_MGA)  += mga/
 obj-$(CONFIG_DRM_I810) += i810/
 obj-$(CONFIG_DRM_I915) += i915/
+obj-$(CONFIG_DRM_KMB_DISPLAY)  += kmb/
 obj-$(CONFIG_DRM_MGAG200) += mgag200/
 obj-$(CONFIG_DRM_V3D)  += v3d/
 obj-$(CONFIG_DRM_VC4)  += vc4/
diff --git a/drivers/gpu/drm/kmb/Kconfig b/drivers/gpu/drm/kmb/Kconfig
new file mode 100644
index 000..e18b74c
--- /dev/null
+++ b/drivers/gpu/drm/kmb/Kconfig
@@ -0,0 +1,13 @@
+config DRM_KMB_DISPLAY
+   tristate "INTEL KEEMBAY DISPLAY"
+   depends on DRM && OF && (ARM || ARM64)
+   depends on COMMON_CLK
+   select DRM_KMS_HELPER
+   select DRM_KMS_CMA_HELPER
+   select DRM_GEM_CMA_HELPER
+   select VIDEOMODE_HELPERS
+   help
+   Choose this option if you have Intel's KeemBay SOC which integrates
+   an ARM Cortex A53 CPU with an Intel Movidius VPU.
+
+   If M is selected the module will be called kmb-drm.
diff --git a/drivers/gpu/drm/kmb/Makefile b/drivers/gpu/drm/kmb/Makefile
new file mode 100644
index 000..527d737
--- /dev/null
+++ b/drivers/gpu/drm/kmb/Makefile
@@ -0,0 +1,2 @@
+kmb-drm-y := kmb_crtc.o kmb_drv.o kmb_plane.o kmb_dsi.o
+obj-$(CONFIG_DRM_KMB_DISPLAY)  += kmb-drm.o
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v9 4/5] drm/kmb: Mipi DSI part of the display driver

2020-10-08 Thread Anitha Chrisanthus
Initializes Mipi DSI and sets up connects to ADV bridge

v2: removed license text
upclassed dev_private, removed HAVE_IRQ. (Sam)

v3: Squashed all 59 commits to one

v4: review changes from Sam Ravnborg
renamed dev_p to kmb

v5: corrected spellings
v6: corrected checkpatch warnings
v7: review changes Sam Ravnborg and Thomas Zimmerman
removed unnecessary logs and defines and ifdef codes (Sam)
split dphy_init_sequence smaller (Sam)
removed redundant checks in kmb_dsi (Sam)
changed kmb_dsi_init to drm_bridge_connector_init and
drm_connector_attach_encoder to bridge's connector (Sam)
v8: call drm_bridge_attach with DRM_BRIDGE_ATTACH_NO_CONNECTOR
v9: renamed kmb_dsi_hw_init to kmb_dsi_mode_set (Daniel V)

Cc: Sam Ravnborg 
Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 drivers/gpu/drm/kmb/kmb_dsi.c | 1524 +
 drivers/gpu/drm/kmb/kmb_dsi.h |  350 ++
 2 files changed, 1874 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.h

diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
new file mode 100644
index 000..0c00c7d
--- /dev/null
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -0,0 +1,1524 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright © 2019-2020 Intel Corporation
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "kmb_drv.h"
+#include "kmb_dsi.h"
+#include "kmb_regs.h"
+
+static struct mipi_dsi_host *dsi_host;
+static struct mipi_dsi_device *dsi_device;
+
+/* Default setting is 1080p, 4 lanes */
+#define IMG_HEIGHT_LINES  1080
+#define IMG_WIDTH_PX  1920
+#define MIPI_TX_ACTIVE_LANES 4
+
+struct mipi_tx_frame_section_cfg mipi_tx_frame0_sect_cfg = {
+   .width_pixels = IMG_WIDTH_PX,
+   .height_lines = IMG_HEIGHT_LINES,
+   .data_type = DSI_LP_DT_PPS_RGB888_24B,
+   .data_mode = MIPI_DATA_MODE1,
+   .dma_packed = 0
+};
+
+struct mipi_tx_frame_cfg mipitx_frame0_cfg = {
+   .sections[0] = _tx_frame0_sect_cfg,
+   .sections[1] = NULL,
+   .sections[2] = NULL,
+   .sections[3] = NULL,
+   .vsync_width = 5,
+   .v_backporch = 36,
+   .v_frontporch = 4,
+   .hsync_width = 44,
+   .h_backporch = 148,
+   .h_frontporch = 88
+};
+
+struct mipi_tx_dsi_cfg mipitx_dsi_cfg = {
+   .hfp_blank_en = 0,
+   .eotp_en = 0,
+   .lpm_last_vfp_line = 0,
+   .lpm_first_vsa_line = 0,
+   .sync_pulse_eventn = DSI_VIDEO_MODE_NO_BURST_EVENT,
+   .hfp_blanking = SEND_BLANK_PACKET,
+   .hbp_blanking = SEND_BLANK_PACKET,
+   .hsa_blanking = SEND_BLANK_PACKET,
+   .v_blanking = SEND_BLANK_PACKET,
+};
+
+struct mipi_ctrl_cfg mipi_tx_init_cfg = {
+   .active_lanes = MIPI_TX_ACTIVE_LANES,
+   .lane_rate_mbps = MIPI_TX_LANE_DATA_RATE_MBPS,
+   .ref_clk_khz = MIPI_TX_REF_CLK_KHZ,
+   .cfg_clk_khz = MIPI_TX_CFG_CLK_KHZ,
+   .tx_ctrl_cfg = {
+   .frames[0] = _frame0_cfg,
+   .frames[1] = NULL,
+   .frames[2] = NULL,
+   .frames[3] = NULL,
+   .tx_dsi_cfg = _dsi_cfg,
+   .line_sync_pkt_en = 0,
+   .line_counter_active = 0,
+   .frame_counter_active = 0,
+   .tx_always_use_hact = 1,
+   .tx_hact_wait_stop = 1,
+   }
+};
+
+struct  mipi_hs_freq_range_cfg {
+   u16 default_bit_rate_mbps;
+   u8 hsfreqrange_code;
+};
+
+struct vco_params {
+   u32 freq;
+   u32 range;
+   u32 divider;
+};
+
+static struct vco_params vco_table[] = {
+   {52, 0x3f, 8},
+   {80, 0x39, 8},
+   {105, 0x2f, 4},
+   {160, 0x29, 4},
+   {210, 0x1f, 2},
+   {320, 0x19, 2},
+   {420, 0x0f, 1},
+   {630, 0x09, 1},
+   {1100, 0x03, 1},
+   {0x, 0x01, 1},
+};
+
+static struct mipi_hs_freq_range_cfg
+mipi_hs_freq_range[MIPI_DPHY_DEFAULT_BIT_RATES] = {
+   {.default_bit_rate_mbps = 80, .hsfreqrange_code = 0x00},
+   {.default_bit_rate_mbps = 90, .hsfreqrange_code = 0x10},
+   {.default_bit_rate_mbps = 100, .hsfreqrange_code = 0x20},
+   {.default_bit_rate_mbps = 110, .hsfreqrange_code = 0x30},
+   {.default_bit_rate_mbps = 120, .hsfreqrange_code = 0x01},
+   {.default_bit_rate_mbps = 130, .hsfreqrange_code = 0x11},
+   {.default_bit_rate_mbps = 140, .hsfreqrange_code = 0x21},
+   {.default_bit_rate_mbps = 150, .hsfreqrange_code = 0x31},
+   {.default_bit_rate_mbps = 160, .hsfreqrange_code = 0x02},
+   {.default_bit_rate_mbps = 170, .hsfreqrange_code = 0x12},
+   {.default_bit_rate_mbps = 180, .hsfreqrange_code = 0x22},
+   {.default_bit_rate_mbps = 190, .hsfreqrange_code = 0x32},
+

[PATCH v9 3/5] drm/kmb: Add support for KeemBay Display

2020-10-08 Thread Anitha Chrisanthus
This is a basic KMS atomic modesetting display driver for KeemBay family of
SOCs. Driver has no 2D or 3D graphics.It calls into the ADV bridge
driver at the connector level.

Single CRTC with LCD controller->mipi DSI-> ADV bridge

Only 1080p resolution and single plane is supported at this time.

v2: moved extern to .h, removed license text
use drm_dev_init, upclassed dev_private, removed HAVE_IRQ.(Sam)

v3: Squashed all 59 commits to one

v4: review changes from Sam Ravnborg
renamed dev_p to kmb
moved clocks under kmb_clock, consolidated clk initializations
use drmm functions
use DRM_GEM_CMA_DRIVER_OPS_VMAP

v5: corrected spellings
v6: corrected checkpatch warnings
v7: review changes Sam Ravnborg and Thomas Zimmerman
removed kmb_crtc.h kmb_crtc_cleanup (Thomas)
renamed mode_set, kmb_load, inlined unload (Thomas)
moved remaining logging to drm_*(Thomas)
re-orged driver initialization (Thomas)
moved plane_status to drm_private (Sam)
removed unnecessary logs and defines and ifdef codes (Sam)
call helper_check in plane_atomic_check (Sam)
renamed set to get for bpp and format functions(Sam)
use drm helper functions for reset, duplicate/destroy state instead
of kmb functions (Sam)
removed kmb_priv from kmb_plane and removed kmb_plane_state (Sam)
v8: get clk_pll0 from display node in dt
v9: moved csc_coef_lcd to plane.c (Daniel Vetter)
call drm_atomic_helper_shutdown in remove (Daniel V)
use drm_crtc_handle_vblank (Daniel V)
renamed kmb_dsi_hw_init to kmb_dsi_mode_set (Daniel V)
complimentary changes to device tree changes (Rob)

Cc: Sam Ravnborg 
Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 drivers/gpu/drm/kmb/kmb_crtc.c  | 224 +
 drivers/gpu/drm/kmb/kmb_drv.c   | 676 
 drivers/gpu/drm/kmb/kmb_drv.h   | 170 ++
 drivers/gpu/drm/kmb/kmb_plane.c | 488 +
 drivers/gpu/drm/kmb/kmb_plane.h | 102 ++
 5 files changed, 1660 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/kmb_crtc.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.h

diff --git a/drivers/gpu/drm/kmb/kmb_crtc.c b/drivers/gpu/drm/kmb/kmb_crtc.c
new file mode 100644
index 000..72dcbdf
--- /dev/null
+++ b/drivers/gpu/drm/kmb/kmb_crtc.c
@@ -0,0 +1,224 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright © 2018-2020 Intel Corporation
+ */
+
+#include 
+#include 
+#include 
+
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "kmb_drv.h"
+#include "kmb_dsi.h"
+#include "kmb_plane.h"
+#include "kmb_regs.h"
+
+struct kmb_crtc_timing {
+   u32 vfront_porch;
+   u32 vback_porch;
+   u32 vsync_len;
+   u32 hfront_porch;
+   u32 hback_porch;
+   u32 hsync_len;
+};
+
+static int kmb_crtc_enable_vblank(struct drm_crtc *crtc)
+{
+   struct drm_device *dev = crtc->dev;
+   struct kmb_drm_private *kmb = to_kmb(dev);
+
+   /* Clear interrupt */
+   kmb_write_lcd(kmb, LCD_INT_CLEAR, LCD_INT_VERT_COMP);
+   /* Set which interval to generate vertical interrupt */
+   kmb_write_lcd(kmb, LCD_VSTATUS_COMPARE,
+ LCD_VSTATUS_COMPARE_VSYNC);
+   /* Enable vertical interrupt */
+   kmb_set_bitmask_lcd(kmb, LCD_INT_ENABLE,
+   LCD_INT_VERT_COMP);
+   return 0;
+}
+
+static void kmb_crtc_disable_vblank(struct drm_crtc *crtc)
+{
+   struct drm_device *dev = crtc->dev;
+   struct kmb_drm_private *kmb = to_kmb(dev);
+
+   /* Clear interrupt */
+   kmb_write_lcd(kmb, LCD_INT_CLEAR, LCD_INT_VERT_COMP);
+   /* Disable vertical interrupt */
+   kmb_clr_bitmask_lcd(kmb, LCD_INT_ENABLE,
+   LCD_INT_VERT_COMP);
+}
+
+static const struct drm_crtc_funcs kmb_crtc_funcs = {
+   .destroy = drm_crtc_cleanup,
+   .set_config = drm_atomic_helper_set_config,
+   .page_flip = drm_atomic_helper_page_flip,
+   .reset = drm_atomic_helper_crtc_reset,
+   .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
+   .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
+   .enable_vblank = kmb_crtc_enable_vblank,
+   .disable_vblank = kmb_crtc_disable_vblank,
+};
+
+static void kmb_crtc_set_mode(struct drm_crtc *crtc)
+{
+   struct drm_device *dev = crtc->dev;
+   struct drm_display_mode *m = >state->adjusted_mode;
+   struct kmb_crtc_timing vm;
+   int vsync_start_offset;
+   int vsync_end_offset;
+   struct kmb_drm_private *kmb = to_kmb(dev);
+   unsigned int val = 0;
+
+   /* Initiali

[PATCH v9 1/5] dt-bindings: display: Add support for Intel KeemBay Display

2020-10-08 Thread Anitha Chrisanthus
This patch adds bindings for Intel KeemBay Display

v2: review changes from Rob Herring

Signed-off-by: Anitha Chrisanthus 
---
 .../bindings/display/intel,keembay-display.yaml| 99 ++
 1 file changed, 99 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/display/intel,keembay-display.yaml

diff --git 
a/Documentation/devicetree/bindings/display/intel,keembay-display.yaml 
b/Documentation/devicetree/bindings/display/intel,keembay-display.yaml
new file mode 100644
index 000..a38493d
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/intel,keembay-display.yaml
@@ -0,0 +1,99 @@
+# SPDX-License-Identifier: GPL-2.0-only
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/intel,keembay-display.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Devicetree bindings for Intel Keem Bay display controller
+
+maintainers:
+  - Anitha Chrisanthus 
+  - Edmond J Dea 
+
+properties:
+  compatible:
+const: intel,kmb_display
+
+  reg:
+items:
+  - description: Lcd registers range
+  - description: Mipi registers range
+  - description: Msscam registers range
+
+  reg-names:
+items:
+  - const: lcd
+  - const: mipi
+  - const: msscam
+
+  clocks:
+items:
+  - description: LCD controller clock
+  - description: Mipi DSI clock
+  - description: Mipi DSI econfig clock
+  - description: Mipi DSI config clock
+  - description: System clock or pll0 clock
+
+  clock-names:
+items:
+  - const: clk_lcd
+  - const: clk_mipi
+  - const: clk_mipi_ecfg
+  - const: clk_mipi_cfg
+  - const: clk_pll0
+
+  interrupts:
+maxItems: 1
+
+  encoder-slave:
+description: bridge node entry for mipi to hdmi converter
+
+  port:
+type: object
+description: >
+  Port node with one endpoint connected to mipi to hdmi converter node.
+
+required:
+  - compatible
+  - reg
+  - reg-names
+  - clocks
+  - clock-names
+  - interrupts
+  - encoder-slave
+  - port
+
+additionalProperties: false
+
+examples:
+  - |
+#include 
+#include 
+#define MOVISOC_KMB_MSS_AUX_LCD
+#define MOVISOC_KMB_MSS_AUX_MIPI_TX0
+#define MOVISOC_KMB_MSS_AUX_MIPI_ECFG
+#define MOVISOC_KMB_MSS_AUX_MIPI_CFG
+#define MOVISOC_KMB_A53_PLL_0_OUT_0
+display@2090 {
+  compatible = "intel,keembay-display";
+  reg = <0x2093 0x3000>,
+<0x2090 0x4000>,
+<0x2091 0x30>;
+  reg-names = "lcd", "mipi", "msscam";
+  interrupts = ;
+  clocks = <_clk MOVISOC_KMB_MSS_AUX_LCD>,
+   <_clk MOVISOC_KMB_MSS_AUX_MIPI_TX0>,
+   <_clk MOVISOC_KMB_MSS_AUX_MIPI_ECFG>,
+   <_clk MOVISOC_KMB_MSS_AUX_MIPI_CFG>,
+   <_clk MOVISOC_KMB_A53_PLL_0_OUT_0>;
+  clock-names = "clk_lcd", "clk_mipi", "clk_mipi_ecfg",
+"clk_mipi_cfg", "clk_pll0";
+
+  encoder-slave = <>;
+
+  port {
+dsi_output: endpoint {
+remote-endpoint = <_input>;
+};
+  };
+};
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v8 0/4] Add support for KeemBay DRM driver

2020-10-02 Thread Anitha Chrisanthus
This is a new DRM driver for Intel's KeemBay SOC.
The SoC couples an ARM Cortex A53 CPU with an Intel
Movidius VPU.

This driver is tested with the KMB EVM board which is the refernce baord
for Keem Bay SOC. The SOC's display pipeline is as follows

+--++-++---+
|LCD controller| -> |Mipi DSI | -> |Mipi to HDMI Converter |
+--++-++---+

LCD controller and Mipi DSI transmitter are part of the SOC and
mipi to HDMI converter is ADV7535 for KMB EVM board.

The DRM driver is a basic KMS atomic modesetting display driver and
has no 2D or 3D graphics.It calls into the ADV bridge driver at
the connector level.

Only 1080p resolution and single plane is supported at this time.
The usecase is for debugging video and camera outputs.

Device tree patches are under review here
https://lore.kernel.org/linux-arm-kernel/20200708175020.194436-1-daniele.alessandre...@linux.intel.com/T/

Changes since v1:
- Removed redundant license text, updated license
- Rearranged include blocks
- renamed global vars and removed extern in c
- Used upclassing for dev_private
- Used drm_dev_init in drm device create
- minor cleanups

Changes since v2:
- squashed all commits to a single commit
- logging changed to drm_info, drm_dbg etc.
- used devm_drm_dev_alloc()
- removed commented out sections and general cleanup

Changes since v3:
- renamed dev_p to kmb
- moved clocks under kmb_clock, consolidated clk initializations
- use drmm functions
- use DRM_GEM_CMA_DRIVER_OPS_VMAP
- more cleanups

Changes since v4:
- corrected spellings

Changes since v5:
- corrected checkpatch warnings/checks
   -Please ignore checkpatch checks on Camelcase - this is how it is
   named in the databook
   - Please ignore checkpatch warnings on misspelled for hsa, dout,
   widthn etc. - they are spelled as in the databook
   - Please ignore checkpatch checks on macro arguments reuse -
   its confirmed ok

Changes since v6:
- review changes Sam Ravnborg and Thomas Zimmerman
split patch into 4 parts, part1 register definitions, part2 display
driver files, part3 mipi dsi, part4 build files (Sam)
removed kmb_crtc.h kmb_crtc_cleanup (Thomas)
renamed mode_set, kmb_load, inlined unload (Thomas)
moved remaining logging to drm_*(Thomas)
re-orged driver initialization (Thomas)
moved plane_status to drm_private (Sam)
removed unnecessary logs and defines and ifdef codes (Sam)
split dphy_init_sequence smaller (Sam)
removed redundant checks in kmb_dsi (Sam)
changed kmb_dsi_init to drm_bridge_connector_init and
drm_connector_attach_encoder to bridge's connector (Sam)
call helper_check in plane_atomic_check (Sam)
renamed set to get for bpp and format functions(Sam)
use drm helper functions for reset, duplicate/destroy state instead
of kmb functions (Sam)
removed kmb_priv from kmb_plane and removed kmb_plane_state (Sam)

Changes since v7:
- tested with 5.9 kernel and made the following changes
get clk_pll0 from display node in dt  
call drm_bridge_attach with DRM_BRIDGE_ATTACH_NO_CONNECTOR
Also added Maintainer entry 

Anitha Chrisanthus (4):
  drm/kmb: Keem Bay driver register definition
  drm/kmb: Add support for KeemBay Display
  drm/kmb: Mipi DSI part of the display driver
  drm/kmb: Build files for KeemBay Display driver

 MAINTAINERS |6 +
 drivers/gpu/drm/Kconfig |2 +
 drivers/gpu/drm/Makefile|1 +
 drivers/gpu/drm/kmb/Kconfig |   13 +
 drivers/gpu/drm/kmb/Makefile|2 +
 drivers/gpu/drm/kmb/kmb_crtc.c  |  224 ++
 drivers/gpu/drm/kmb/kmb_drv.c   |  675 +
 drivers/gpu/drm/kmb/kmb_drv.h   |  170 +
 drivers/gpu/drm/kmb/kmb_dsi.c   | 1524 +++
 drivers/gpu/drm/kmb/kmb_dsi.h   |  350 +
 drivers/gpu/drm/kmb/kmb_plane.c |  480 
 drivers/gpu/drm/kmb/kmb_plane.h |  110 +++
 drivers/gpu/drm/kmb/kmb_regs.h  |  748 +++
 13 files changed, 4305 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/Kconfig
 create mode 100644 drivers/gpu/drm/kmb/Makefile
 create mode 100644 drivers/gpu/drm/kmb/kmb_crtc.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_regs.h

-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v8 1/4] drm/kmb: Keem Bay driver register definition

2020-10-02 Thread Anitha Chrisanthus
Register definitions for Keem Bay display driver

v2: removed license text (Sam)
v3: Squashed all 59 commits to one
v4: review changes from Sam Ravnborg
renamed dev_p to kmb
v5: corrected spellings
v6: corrected checkpatch warnings

Cc: Sam Ravnborg 
Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 drivers/gpu/drm/kmb/kmb_regs.h | 748 +
 1 file changed, 748 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/kmb_regs.h

diff --git a/drivers/gpu/drm/kmb/kmb_regs.h b/drivers/gpu/drm/kmb/kmb_regs.h
new file mode 100644
index 000..f794ac3
--- /dev/null
+++ b/drivers/gpu/drm/kmb/kmb_regs.h
@@ -0,0 +1,748 @@
+/* SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Copyright © 2018-2020 Intel Corporation
+ */
+
+#ifndef __KMB_REGS_H__
+#define __KMB_REGS_H__
+
+#define ENABLE  1
+#define DISABLE 0
+/*from Data Book section 12.5.8.1 page 4322 */
+#define CPR_BASE_ADDR   (0x2081)
+#define MIPI_BASE_ADDR  (0x2090)
+/*from Data Book section 12.11.6.1 page 4972 */
+#define LCD_BASE_ADDR   (0x2093)
+#define MSS_CAM_BASE_ADDR  (MIPI_BASE_ADDR + 0x1)
+#define LCD_MMIO_SIZE  (0x3000)
+#define MIPI_MMIO_SIZE (0x4000)
+#define MSS_CAM_MMIO_SIZE  (0x30)
+
+/***
+ *LCD controller control register defines
+ ***/
+#define LCD_CONTROL(0x4 * 0x000)
+#define LCD_CTRL_PROGRESSIVE (0 << 0)
+#define LCD_CTRL_INTERLACED  BIT(0)
+#define LCD_CTRL_ENABLE  BIT(1)
+#define LCD_CTRL_VL1_ENABLE  BIT(2)
+#define LCD_CTRL_VL2_ENABLE  BIT(3)
+#define LCD_CTRL_GL1_ENABLE  BIT(4)
+#define LCD_CTRL_GL2_ENABLE  BIT(5)
+#define LCD_CTRL_ALPHA_BLEND_VL1 (0 << 6)
+#define LCD_CTRL_ALPHA_BLEND_VL2 BIT(6)
+#define LCD_CTRL_ALPHA_BLEND_GL1 (2 << 6)
+#define LCD_CTRL_ALPHA_BLEND_GL2 (3 << 6)
+#define LCD_CTRL_ALPHA_TOP_VL1   (0 << 8)
+#define LCD_CTRL_ALPHA_TOP_VL2   BIT(8)
+#define LCD_CTRL_ALPHA_TOP_GL1   (2 << 8)
+#define LCD_CTRL_ALPHA_TOP_GL2   (3 << 8)
+#define LCD_CTRL_ALPHA_MIDDLE_VL1(0 << 10)
+#define LCD_CTRL_ALPHA_MIDDLE_VL2BIT(10)
+#define LCD_CTRL_ALPHA_MIDDLE_GL1(2 << 10)
+#define LCD_CTRL_ALPHA_MIDDLE_GL2(3 << 10)
+#define LCD_CTRL_ALPHA_BOTTOM_VL1(0 << 12)
+#define LCD_CTRL_ALPHA_BOTTOM_VL2BIT(12)
+#define LCD_CTRL_ALPHA_BOTTOM_GL1(2 << 12)
+#define LCD_CTRL_ALPHA_BOTTOM_GL2(3 << 12)
+#define LCD_CTRL_TIM_GEN_ENABLE  BIT(14)
+#define LCD_CTRL_CONTINUOUS  (0 << 15)
+#define LCD_CTRL_ONE_SHOTBIT(15)
+#define LCD_CTRL_PWM0_EN BIT(16)
+#define LCD_CTRL_PWM1_EN BIT(17)
+#define LCD_CTRL_PWM2_EN BIT(18)
+#define LCD_CTRL_OUTPUT_DISABLED (0 << 19)
+#define LCD_CTRL_OUTPUT_ENABLED  BIT(19)
+#define LCD_CTRL_BPORCH_ENABLE   BIT(21)
+#define LCD_CTRL_FPORCH_ENABLE   BIT(22)
+#define LCD_CTRL_PIPELINE_DMABIT(28)
+#define LCD_CTRL_VHSYNC_IDLE_LVL BIT(31)
+
+/*interrupts */
+#define LCD_INT_STATUS (0x4 * 0x001)
+#define LCD_INT_EOF  BIT(0)
+#define LCD_INT_LINE_CMP BIT(1)
+#define LCD_INT_VERT_COMPBIT(2)
+#define LAYER0_DMA_DONE  BIT(3)
+#define LAYER0_DMA_IDLE  BIT(4)
+#define LAYER0_DMA_FIFO_OVERFLOW BIT(5)
+#define LAYER0_DMA_FIFO_UNDERFLOWBIT(6)
+#define LAYER0_DMA_CB_FIFO_OVERFLOW  BIT(7)
+#define LAYER0_DMA_CB_FIFO_UNDERFLOW BIT(8)
+#define LAYER0_DMA_CR_FIFO_OVERFLOW  BIT(9)
+#define LAYER0_DMA_CR_FIFO_UNDERFLOW BIT(10)
+#define LAYER1_DMA_DONE  BIT(11)
+#define LAYER1_DMA_IDLE  BIT(12)
+#define LAYER1_DMA_FIFO_OVERFLOW BIT(13)
+#define LAYER1_DMA_FIFO_UNDERFLOWBIT(14)
+#define LAYER1_DMA_CB_FIFO_OVERFLOW  BIT(15)
+#define LAYER1_DMA_CB_FIFO_UNDERFLOW BIT(16)
+#def

[PATCH v8 2/4] drm/kmb: Add support for KeemBay Display

2020-10-02 Thread Anitha Chrisanthus
This is a basic KMS atomic modesetting display driver for KeemBay family of
SOCs. Driver has no 2D or 3D graphics.It calls into the ADV bridge
driver at the connector level.

Single CRTC with LCD controller->mipi DSI-> ADV bridge

Only 1080p resolution and single plane is supported at this time.

v2: moved extern to .h, removed license text
use drm_dev_init, upclassed dev_private, removed HAVE_IRQ.(Sam)

v3: Squashed all 59 commits to one

v4: review changes from Sam Ravnborg
renamed dev_p to kmb
moved clocks under kmb_clock, consolidated clk initializations
use drmm functions
use DRM_GEM_CMA_DRIVER_OPS_VMAP

v5: corrected spellings
v6: corrected checkpatch warnings
v7: review changes Sam Ravnborg and Thomas Zimmerman
removed kmb_crtc.h kmb_crtc_cleanup (Thomas)
renamed mode_set, kmb_load, inlined unload (Thomas)
moved remaining logging to drm_*(Thomas)
re-orged driver initialization (Thomas)
moved plane_status to drm_private (Sam)
removed unnecessary logs and defines and ifdef codes (Sam)
call helper_check in plane_atomic_check (Sam)
renamed set to get for bpp and format functions(Sam)
use drm helper functions for reset, duplicate/destroy state instead
of kmb functions (Sam)
removed kmb_priv from kmb_plane and removed kmb_plane_state (Sam)
v8: get clk_pll0 from display node in dt

Cc: Sam Ravnborg 
Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 drivers/gpu/drm/kmb/kmb_crtc.c  | 224 +
 drivers/gpu/drm/kmb/kmb_drv.c   | 675 
 drivers/gpu/drm/kmb/kmb_drv.h   | 170 ++
 drivers/gpu/drm/kmb/kmb_plane.c | 480 
 drivers/gpu/drm/kmb/kmb_plane.h | 110 +++
 5 files changed, 1659 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/kmb_crtc.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.h

diff --git a/drivers/gpu/drm/kmb/kmb_crtc.c b/drivers/gpu/drm/kmb/kmb_crtc.c
new file mode 100644
index 000..a684331
--- /dev/null
+++ b/drivers/gpu/drm/kmb/kmb_crtc.c
@@ -0,0 +1,224 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright © 2018-2020 Intel Corporation
+ */
+
+#include 
+#include 
+#include 
+
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "kmb_drv.h"
+#include "kmb_dsi.h"
+#include "kmb_plane.h"
+#include "kmb_regs.h"
+
+struct kmb_crtc_timing {
+   u32 vfront_porch;
+   u32 vback_porch;
+   u32 vsync_len;
+   u32 hfront_porch;
+   u32 hback_porch;
+   u32 hsync_len;
+};
+
+static int kmb_crtc_enable_vblank(struct drm_crtc *crtc)
+{
+   struct drm_device *dev = crtc->dev;
+   struct kmb_drm_private *kmb = to_kmb(dev);
+
+   /* Clear interrupt */
+   kmb_write_lcd(kmb, LCD_INT_CLEAR, LCD_INT_VERT_COMP);
+   /* Set which interval to generate vertical interrupt */
+   kmb_write_lcd(kmb, LCD_VSTATUS_COMPARE,
+ LCD_VSTATUS_COMPARE_VSYNC);
+   /* Enable vertical interrupt */
+   kmb_set_bitmask_lcd(kmb, LCD_INT_ENABLE,
+   LCD_INT_VERT_COMP);
+   return 0;
+}
+
+static void kmb_crtc_disable_vblank(struct drm_crtc *crtc)
+{
+   struct drm_device *dev = crtc->dev;
+   struct kmb_drm_private *kmb = to_kmb(dev);
+
+   /* Clear interrupt */
+   kmb_write_lcd(kmb, LCD_INT_CLEAR, LCD_INT_VERT_COMP);
+   /* Disable vertical interrupt */
+   kmb_clr_bitmask_lcd(kmb, LCD_INT_ENABLE,
+   LCD_INT_VERT_COMP);
+}
+
+static const struct drm_crtc_funcs kmb_crtc_funcs = {
+   .destroy = drm_crtc_cleanup,
+   .set_config = drm_atomic_helper_set_config,
+   .page_flip = drm_atomic_helper_page_flip,
+   .reset = drm_atomic_helper_crtc_reset,
+   .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
+   .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
+   .enable_vblank = kmb_crtc_enable_vblank,
+   .disable_vblank = kmb_crtc_disable_vblank,
+};
+
+static void kmb_crtc_set_mode(struct drm_crtc *crtc)
+{
+   struct drm_device *dev = crtc->dev;
+   struct drm_display_mode *m = >state->adjusted_mode;
+   struct kmb_crtc_timing vm;
+   int vsync_start_offset;
+   int vsync_end_offset;
+   struct kmb_drm_private *kmb = to_kmb(dev);
+   unsigned int val = 0;
+
+   /* Initialize mipi */
+   kmb_dsi_hw_init(dev, m);
+   drm_info(dev,
+"vfp= %d vbp= %d vsyc_len=%d hfp=%d hbp=%d hsync_len=%d\n",
+m->crtc_vsync_start - m->crtc_vdisplay,
+m->crtc_vtot

[PATCH v8 3/4] drm/kmb: Mipi DSI part of the display driver

2020-10-02 Thread Anitha Chrisanthus
Initializes Mipi DSI and sets up connects to ADV bridge

v2: removed license text
upclassed dev_private, removed HAVE_IRQ. (Sam)

v3: Squashed all 59 commits to one

v4: review changes from Sam Ravnborg
renamed dev_p to kmb

v5: corrected spellings
v6: corrected checkpatch warnings
v7: review changes Sam Ravnborg and Thomas Zimmerman
removed unnecessary logs and defines and ifdef codes (Sam)
split dphy_init_sequence smaller (Sam)
removed redundant checks in kmb_dsi (Sam)
changed kmb_dsi_init to drm_bridge_connector_init and
drm_connector_attach_encoder to bridge's connector (Sam)
v8: call drm_bridge_attach with DRM_BRIDGE_ATTACH_NO_CONNECTOR

Cc: Sam Ravnborg 
Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 drivers/gpu/drm/kmb/kmb_dsi.c | 1524 +
 drivers/gpu/drm/kmb/kmb_dsi.h |  350 ++
 2 files changed, 1874 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.h

diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
new file mode 100644
index 000..849f1cc
--- /dev/null
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -0,0 +1,1524 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright © 2019-2020 Intel Corporation
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "kmb_drv.h"
+#include "kmb_dsi.h"
+#include "kmb_regs.h"
+
+static struct mipi_dsi_host *dsi_host;
+static struct mipi_dsi_device *dsi_device;
+
+/* Default setting is 1080p, 4 lanes */
+#define IMG_HEIGHT_LINES  1080
+#define IMG_WIDTH_PX  1920
+#define MIPI_TX_ACTIVE_LANES 4
+
+struct mipi_tx_frame_section_cfg mipi_tx_frame0_sect_cfg = {
+   .width_pixels = IMG_WIDTH_PX,
+   .height_lines = IMG_HEIGHT_LINES,
+   .data_type = DSI_LP_DT_PPS_RGB888_24B,
+   .data_mode = MIPI_DATA_MODE1,
+   .dma_packed = 0
+};
+
+struct mipi_tx_frame_cfg mipitx_frame0_cfg = {
+   .sections[0] = _tx_frame0_sect_cfg,
+   .sections[1] = NULL,
+   .sections[2] = NULL,
+   .sections[3] = NULL,
+   .vsync_width = 5,
+   .v_backporch = 36,
+   .v_frontporch = 4,
+   .hsync_width = 44,
+   .h_backporch = 148,
+   .h_frontporch = 88
+};
+
+struct mipi_tx_dsi_cfg mipitx_dsi_cfg = {
+   .hfp_blank_en = 0,
+   .eotp_en = 0,
+   .lpm_last_vfp_line = 0,
+   .lpm_first_vsa_line = 0,
+   .sync_pulse_eventn = DSI_VIDEO_MODE_NO_BURST_EVENT,
+   .hfp_blanking = SEND_BLANK_PACKET,
+   .hbp_blanking = SEND_BLANK_PACKET,
+   .hsa_blanking = SEND_BLANK_PACKET,
+   .v_blanking = SEND_BLANK_PACKET,
+};
+
+struct mipi_ctrl_cfg mipi_tx_init_cfg = {
+   .active_lanes = MIPI_TX_ACTIVE_LANES,
+   .lane_rate_mbps = MIPI_TX_LANE_DATA_RATE_MBPS,
+   .ref_clk_khz = MIPI_TX_REF_CLK_KHZ,
+   .cfg_clk_khz = MIPI_TX_CFG_CLK_KHZ,
+   .tx_ctrl_cfg = {
+   .frames[0] = _frame0_cfg,
+   .frames[1] = NULL,
+   .frames[2] = NULL,
+   .frames[3] = NULL,
+   .tx_dsi_cfg = _dsi_cfg,
+   .line_sync_pkt_en = 0,
+   .line_counter_active = 0,
+   .frame_counter_active = 0,
+   .tx_always_use_hact = 1,
+   .tx_hact_wait_stop = 1,
+   }
+};
+
+struct  mipi_hs_freq_range_cfg {
+   u16 default_bit_rate_mbps;
+   u8 hsfreqrange_code;
+};
+
+struct vco_params {
+   u32 freq;
+   u32 range;
+   u32 divider;
+};
+
+static struct vco_params vco_table[] = {
+   {52, 0x3f, 8},
+   {80, 0x39, 8},
+   {105, 0x2f, 4},
+   {160, 0x29, 4},
+   {210, 0x1f, 2},
+   {320, 0x19, 2},
+   {420, 0x0f, 1},
+   {630, 0x09, 1},
+   {1100, 0x03, 1},
+   {0x, 0x01, 1},
+};
+
+static struct mipi_hs_freq_range_cfg
+mipi_hs_freq_range[MIPI_DPHY_DEFAULT_BIT_RATES] = {
+   {.default_bit_rate_mbps = 80, .hsfreqrange_code = 0x00},
+   {.default_bit_rate_mbps = 90, .hsfreqrange_code = 0x10},
+   {.default_bit_rate_mbps = 100, .hsfreqrange_code = 0x20},
+   {.default_bit_rate_mbps = 110, .hsfreqrange_code = 0x30},
+   {.default_bit_rate_mbps = 120, .hsfreqrange_code = 0x01},
+   {.default_bit_rate_mbps = 130, .hsfreqrange_code = 0x11},
+   {.default_bit_rate_mbps = 140, .hsfreqrange_code = 0x21},
+   {.default_bit_rate_mbps = 150, .hsfreqrange_code = 0x31},
+   {.default_bit_rate_mbps = 160, .hsfreqrange_code = 0x02},
+   {.default_bit_rate_mbps = 170, .hsfreqrange_code = 0x12},
+   {.default_bit_rate_mbps = 180, .hsfreqrange_code = 0x22},
+   {.default_bit_rate_mbps = 190, .hsfreqrange_code = 0x32},
+   {.default_bit_rate_mbps =

[PATCH v8 4/4] drm/kmb: Build files for KeemBay Display driver

2020-10-02 Thread Anitha Chrisanthus
v2: Added Maintainer entry

Cc: Sam Ravnborg 
Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 MAINTAINERS  |  6 ++
 drivers/gpu/drm/Kconfig  |  2 ++
 drivers/gpu/drm/Makefile |  1 +
 drivers/gpu/drm/kmb/Kconfig  | 13 +
 drivers/gpu/drm/kmb/Makefile |  2 ++
 5 files changed, 24 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/Kconfig
 create mode 100644 drivers/gpu/drm/kmb/Makefile

diff --git a/MAINTAINERS b/MAINTAINERS
index c0f494c..8574f2b 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -8899,6 +8899,12 @@ M:   Deepak Saxena 
 S: Maintained
 F: drivers/char/hw_random/ixp4xx-rng.c
 
+INTEL KEEMBAY DRM DRIVER
+M: Anitha Chrisanthus 
+S: Maintained
+F: Documentation/devicetree/bindings/display/intel,kmb_display.yaml
+F: drivers/gpu/drm/kmb/
+
 INTEL MANAGEMENT ENGINE (mei)
 M: Tomas Winkler 
 L: linux-ker...@vger.kernel.org
diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index 147d61b..97a1631b 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -275,6 +275,8 @@ source "drivers/gpu/drm/nouveau/Kconfig"
 
 source "drivers/gpu/drm/i915/Kconfig"
 
+source "drivers/gpu/drm/kmb/Kconfig"
+
 config DRM_VGEM
tristate "Virtual GEM provider"
depends on DRM
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index 8156900..fefaff4 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -71,6 +71,7 @@ obj-$(CONFIG_DRM_AMDGPU)+= amd/amdgpu/
 obj-$(CONFIG_DRM_MGA)  += mga/
 obj-$(CONFIG_DRM_I810) += i810/
 obj-$(CONFIG_DRM_I915) += i915/
+obj-$(CONFIG_DRM_KMB_DISPLAY)  += kmb/
 obj-$(CONFIG_DRM_MGAG200) += mgag200/
 obj-$(CONFIG_DRM_V3D)  += v3d/
 obj-$(CONFIG_DRM_VC4)  += vc4/
diff --git a/drivers/gpu/drm/kmb/Kconfig b/drivers/gpu/drm/kmb/Kconfig
new file mode 100644
index 000..e18b74c
--- /dev/null
+++ b/drivers/gpu/drm/kmb/Kconfig
@@ -0,0 +1,13 @@
+config DRM_KMB_DISPLAY
+   tristate "INTEL KEEMBAY DISPLAY"
+   depends on DRM && OF && (ARM || ARM64)
+   depends on COMMON_CLK
+   select DRM_KMS_HELPER
+   select DRM_KMS_CMA_HELPER
+   select DRM_GEM_CMA_HELPER
+   select VIDEOMODE_HELPERS
+   help
+   Choose this option if you have Intel's KeemBay SOC which integrates
+   an ARM Cortex A53 CPU with an Intel Movidius VPU.
+
+   If M is selected the module will be called kmb-drm.
diff --git a/drivers/gpu/drm/kmb/Makefile b/drivers/gpu/drm/kmb/Makefile
new file mode 100644
index 000..527d737
--- /dev/null
+++ b/drivers/gpu/drm/kmb/Makefile
@@ -0,0 +1,2 @@
+kmb-drm-y := kmb_crtc.o kmb_drv.o kmb_plane.o kmb_dsi.o
+obj-$(CONFIG_DRM_KMB_DISPLAY)  += kmb-drm.o
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v7 2/4] drm/kmb: Add support for KeemBay Display

2020-08-31 Thread Anitha Chrisanthus
This is a basic KMS atomic modesetting display driver for KeemBay family of
SOCs. Driver has no 2D or 3D graphics.It calls into the ADV bridge
driver at the connector level.

Single CRTC with LCD controller->mipi DSI-> ADV bridge

Only 1080p resolution and single plane is supported at this time.

v2: moved extern to .h, removed license text
use drm_dev_init, upclassed dev_private, removed HAVE_IRQ.(Sam)

v3: Squashed all 59 commits to one

v4: review changes from Sam Ravnborg
renamed dev_p to kmb
moved clocks under kmb_clock, consolidated clk initializations
use drmm functions
use DRM_GEM_CMA_DRIVER_OPS_VMAP

v5: corrected spellings
v6: corrected checkpatch warnings
v7: review changes Sam Ravnborg and Thomas Zimmerman
removed kmb_crtc.h kmb_crtc_cleanup (Thomas)
renamed mode_set, kmb_load, inlined unload (Thomas)
moved remaining logging to drm_*(Thomas)
re-orged driver initialization (Thomas)
moved plane_status to drm_private (Sam)
removed unnecessary logs and defines and ifdef codes (Sam)
call helper_check in plane_atomic_check (Sam)
renamed set to get for bpp and format functions(Sam)
use drm helper functions for reset, duplicate/destroy state instead
of kmb functions (Sam)
removed kmb_priv from kmb_plane and removed kmb_plane_state (Sam)

Cc: Sam Ravnborg 
Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 drivers/gpu/drm/kmb/kmb_crtc.c  | 224 +
 drivers/gpu/drm/kmb/kmb_drv.c   | 676 
 drivers/gpu/drm/kmb/kmb_drv.h   | 170 ++
 drivers/gpu/drm/kmb/kmb_plane.c | 480 
 drivers/gpu/drm/kmb/kmb_plane.h | 110 +++
 5 files changed, 1660 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/kmb_crtc.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.h

diff --git a/drivers/gpu/drm/kmb/kmb_crtc.c b/drivers/gpu/drm/kmb/kmb_crtc.c
new file mode 100644
index 000..a684331
--- /dev/null
+++ b/drivers/gpu/drm/kmb/kmb_crtc.c
@@ -0,0 +1,224 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright © 2018-2020 Intel Corporation
+ */
+
+#include 
+#include 
+#include 
+
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "kmb_drv.h"
+#include "kmb_dsi.h"
+#include "kmb_plane.h"
+#include "kmb_regs.h"
+
+struct kmb_crtc_timing {
+   u32 vfront_porch;
+   u32 vback_porch;
+   u32 vsync_len;
+   u32 hfront_porch;
+   u32 hback_porch;
+   u32 hsync_len;
+};
+
+static int kmb_crtc_enable_vblank(struct drm_crtc *crtc)
+{
+   struct drm_device *dev = crtc->dev;
+   struct kmb_drm_private *kmb = to_kmb(dev);
+
+   /* Clear interrupt */
+   kmb_write_lcd(kmb, LCD_INT_CLEAR, LCD_INT_VERT_COMP);
+   /* Set which interval to generate vertical interrupt */
+   kmb_write_lcd(kmb, LCD_VSTATUS_COMPARE,
+ LCD_VSTATUS_COMPARE_VSYNC);
+   /* Enable vertical interrupt */
+   kmb_set_bitmask_lcd(kmb, LCD_INT_ENABLE,
+   LCD_INT_VERT_COMP);
+   return 0;
+}
+
+static void kmb_crtc_disable_vblank(struct drm_crtc *crtc)
+{
+   struct drm_device *dev = crtc->dev;
+   struct kmb_drm_private *kmb = to_kmb(dev);
+
+   /* Clear interrupt */
+   kmb_write_lcd(kmb, LCD_INT_CLEAR, LCD_INT_VERT_COMP);
+   /* Disable vertical interrupt */
+   kmb_clr_bitmask_lcd(kmb, LCD_INT_ENABLE,
+   LCD_INT_VERT_COMP);
+}
+
+static const struct drm_crtc_funcs kmb_crtc_funcs = {
+   .destroy = drm_crtc_cleanup,
+   .set_config = drm_atomic_helper_set_config,
+   .page_flip = drm_atomic_helper_page_flip,
+   .reset = drm_atomic_helper_crtc_reset,
+   .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
+   .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
+   .enable_vblank = kmb_crtc_enable_vblank,
+   .disable_vblank = kmb_crtc_disable_vblank,
+};
+
+static void kmb_crtc_set_mode(struct drm_crtc *crtc)
+{
+   struct drm_device *dev = crtc->dev;
+   struct drm_display_mode *m = >state->adjusted_mode;
+   struct kmb_crtc_timing vm;
+   int vsync_start_offset;
+   int vsync_end_offset;
+   struct kmb_drm_private *kmb = to_kmb(dev);
+   unsigned int val = 0;
+
+   /* Initialize mipi */
+   kmb_dsi_hw_init(dev, m);
+   drm_info(dev,
+"vfp= %d vbp= %d vsyc_len=%d hfp=%d hbp=%d hsync_len=%d\n",
+m->crtc_vsync_start - m->crtc_vdisplay,
+m->crtc_vtotal - m->crtc_vsync_end,
+m->crtc_vs

[PATCH v7 1/4] drm/kmb: Keem Bay driver register definition

2020-08-31 Thread Anitha Chrisanthus
Register definitions for Keem Bay display driver

v2: removed license text (Sam)
v3: Squashed all 59 commits to one
v4: review changes from Sam Ravnborg
renamed dev_p to kmb
v5: corrected spellings
v6: corrected checkpatch warnings

Cc: Sam Ravnborg 
Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 drivers/gpu/drm/kmb/kmb_regs.h | 748 +
 1 file changed, 748 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/kmb_regs.h

diff --git a/drivers/gpu/drm/kmb/kmb_regs.h b/drivers/gpu/drm/kmb/kmb_regs.h
new file mode 100644
index 000..f794ac3
--- /dev/null
+++ b/drivers/gpu/drm/kmb/kmb_regs.h
@@ -0,0 +1,748 @@
+/* SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Copyright © 2018-2020 Intel Corporation
+ */
+
+#ifndef __KMB_REGS_H__
+#define __KMB_REGS_H__
+
+#define ENABLE  1
+#define DISABLE 0
+/*from Data Book section 12.5.8.1 page 4322 */
+#define CPR_BASE_ADDR   (0x2081)
+#define MIPI_BASE_ADDR  (0x2090)
+/*from Data Book section 12.11.6.1 page 4972 */
+#define LCD_BASE_ADDR   (0x2093)
+#define MSS_CAM_BASE_ADDR  (MIPI_BASE_ADDR + 0x1)
+#define LCD_MMIO_SIZE  (0x3000)
+#define MIPI_MMIO_SIZE (0x4000)
+#define MSS_CAM_MMIO_SIZE  (0x30)
+
+/***
+ *LCD controller control register defines
+ ***/
+#define LCD_CONTROL(0x4 * 0x000)
+#define LCD_CTRL_PROGRESSIVE (0 << 0)
+#define LCD_CTRL_INTERLACED  BIT(0)
+#define LCD_CTRL_ENABLE  BIT(1)
+#define LCD_CTRL_VL1_ENABLE  BIT(2)
+#define LCD_CTRL_VL2_ENABLE  BIT(3)
+#define LCD_CTRL_GL1_ENABLE  BIT(4)
+#define LCD_CTRL_GL2_ENABLE  BIT(5)
+#define LCD_CTRL_ALPHA_BLEND_VL1 (0 << 6)
+#define LCD_CTRL_ALPHA_BLEND_VL2 BIT(6)
+#define LCD_CTRL_ALPHA_BLEND_GL1 (2 << 6)
+#define LCD_CTRL_ALPHA_BLEND_GL2 (3 << 6)
+#define LCD_CTRL_ALPHA_TOP_VL1   (0 << 8)
+#define LCD_CTRL_ALPHA_TOP_VL2   BIT(8)
+#define LCD_CTRL_ALPHA_TOP_GL1   (2 << 8)
+#define LCD_CTRL_ALPHA_TOP_GL2   (3 << 8)
+#define LCD_CTRL_ALPHA_MIDDLE_VL1(0 << 10)
+#define LCD_CTRL_ALPHA_MIDDLE_VL2BIT(10)
+#define LCD_CTRL_ALPHA_MIDDLE_GL1(2 << 10)
+#define LCD_CTRL_ALPHA_MIDDLE_GL2(3 << 10)
+#define LCD_CTRL_ALPHA_BOTTOM_VL1(0 << 12)
+#define LCD_CTRL_ALPHA_BOTTOM_VL2BIT(12)
+#define LCD_CTRL_ALPHA_BOTTOM_GL1(2 << 12)
+#define LCD_CTRL_ALPHA_BOTTOM_GL2(3 << 12)
+#define LCD_CTRL_TIM_GEN_ENABLE  BIT(14)
+#define LCD_CTRL_CONTINUOUS  (0 << 15)
+#define LCD_CTRL_ONE_SHOTBIT(15)
+#define LCD_CTRL_PWM0_EN BIT(16)
+#define LCD_CTRL_PWM1_EN BIT(17)
+#define LCD_CTRL_PWM2_EN BIT(18)
+#define LCD_CTRL_OUTPUT_DISABLED (0 << 19)
+#define LCD_CTRL_OUTPUT_ENABLED  BIT(19)
+#define LCD_CTRL_BPORCH_ENABLE   BIT(21)
+#define LCD_CTRL_FPORCH_ENABLE   BIT(22)
+#define LCD_CTRL_PIPELINE_DMABIT(28)
+#define LCD_CTRL_VHSYNC_IDLE_LVL BIT(31)
+
+/*interrupts */
+#define LCD_INT_STATUS (0x4 * 0x001)
+#define LCD_INT_EOF  BIT(0)
+#define LCD_INT_LINE_CMP BIT(1)
+#define LCD_INT_VERT_COMPBIT(2)
+#define LAYER0_DMA_DONE  BIT(3)
+#define LAYER0_DMA_IDLE  BIT(4)
+#define LAYER0_DMA_FIFO_OVERFLOW BIT(5)
+#define LAYER0_DMA_FIFO_UNDERFLOWBIT(6)
+#define LAYER0_DMA_CB_FIFO_OVERFLOW  BIT(7)
+#define LAYER0_DMA_CB_FIFO_UNDERFLOW BIT(8)
+#define LAYER0_DMA_CR_FIFO_OVERFLOW  BIT(9)
+#define LAYER0_DMA_CR_FIFO_UNDERFLOW BIT(10)
+#define LAYER1_DMA_DONE  BIT(11)
+#define LAYER1_DMA_IDLE  BIT(12)
+#define LAYER1_DMA_FIFO_OVERFLOW BIT(13)
+#define LAYER1_DMA_FIFO_UNDERFLOWBIT(14)
+#define LAYER1_DMA_CB_FIFO_OVERFLOW  BIT(15)
+#define LAYER1_DMA_CB_FIFO_UNDERFLOW BIT(16)
+#def

[PATCH v7 3/4] drm/kmb: Mipi DSI part of the display driver

2020-08-31 Thread Anitha Chrisanthus
Initializes Mipi DSI and sets up connects to ADV bridge

v2: removed license text
upclassed dev_private, removed HAVE_IRQ. (Sam)

v3: Squashed all 59 commits to one

v4: review changes from Sam Ravnborg
renamed dev_p to kmb

v5: corrected spellings
v6: corrected checkpatch warnings
v7: review changes Sam Ravnborg and Thomas Zimmerman
removed unnecessary logs and defines and ifdef codes (Sam)
split dphy_init_sequence smaller (Sam)
removed redundant checks in kmb_dsi (Sam)
changed kmb_dsi_init to drm_bridge_connector_init and
drm_connector_attach_encoder to bridge's connector (Sam)

Cc: Sam Ravnborg 
Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 drivers/gpu/drm/kmb/kmb_dsi.c | 1523 +
 drivers/gpu/drm/kmb/kmb_dsi.h |  350 ++
 2 files changed, 1873 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.h

diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
new file mode 100644
index 000..a0dbfa7
--- /dev/null
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -0,0 +1,1523 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright © 2019-2020 Intel Corporation
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "kmb_drv.h"
+#include "kmb_dsi.h"
+#include "kmb_regs.h"
+
+static struct mipi_dsi_host *dsi_host;
+static struct mipi_dsi_device *dsi_device;
+
+/* Default setting is 1080p, 4 lanes */
+#define IMG_HEIGHT_LINES  1080
+#define IMG_WIDTH_PX  1920
+#define MIPI_TX_ACTIVE_LANES 4
+
+struct mipi_tx_frame_section_cfg mipi_tx_frame0_sect_cfg = {
+   .width_pixels = IMG_WIDTH_PX,
+   .height_lines = IMG_HEIGHT_LINES,
+   .data_type = DSI_LP_DT_PPS_RGB888_24B,
+   .data_mode = MIPI_DATA_MODE1,
+   .dma_packed = 0
+};
+
+struct mipi_tx_frame_cfg mipitx_frame0_cfg = {
+   .sections[0] = _tx_frame0_sect_cfg,
+   .sections[1] = NULL,
+   .sections[2] = NULL,
+   .sections[3] = NULL,
+   .vsync_width = 5,
+   .v_backporch = 36,
+   .v_frontporch = 4,
+   .hsync_width = 44,
+   .h_backporch = 148,
+   .h_frontporch = 88
+};
+
+struct mipi_tx_dsi_cfg mipitx_dsi_cfg = {
+   .hfp_blank_en = 0,
+   .eotp_en = 0,
+   .lpm_last_vfp_line = 0,
+   .lpm_first_vsa_line = 0,
+   .sync_pulse_eventn = DSI_VIDEO_MODE_NO_BURST_EVENT,
+   .hfp_blanking = SEND_BLANK_PACKET,
+   .hbp_blanking = SEND_BLANK_PACKET,
+   .hsa_blanking = SEND_BLANK_PACKET,
+   .v_blanking = SEND_BLANK_PACKET,
+};
+
+struct mipi_ctrl_cfg mipi_tx_init_cfg = {
+   .active_lanes = MIPI_TX_ACTIVE_LANES,
+   .lane_rate_mbps = MIPI_TX_LANE_DATA_RATE_MBPS,
+   .ref_clk_khz = MIPI_TX_REF_CLK_KHZ,
+   .cfg_clk_khz = MIPI_TX_CFG_CLK_KHZ,
+   .tx_ctrl_cfg = {
+   .frames[0] = _frame0_cfg,
+   .frames[1] = NULL,
+   .frames[2] = NULL,
+   .frames[3] = NULL,
+   .tx_dsi_cfg = _dsi_cfg,
+   .line_sync_pkt_en = 0,
+   .line_counter_active = 0,
+   .frame_counter_active = 0,
+   .tx_always_use_hact = 1,
+   .tx_hact_wait_stop = 1,
+   }
+};
+
+struct  mipi_hs_freq_range_cfg {
+   u16 default_bit_rate_mbps;
+   u8 hsfreqrange_code;
+};
+
+struct vco_params {
+   u32 freq;
+   u32 range;
+   u32 divider;
+};
+
+static struct vco_params vco_table[] = {
+   {52, 0x3f, 8},
+   {80, 0x39, 8},
+   {105, 0x2f, 4},
+   {160, 0x29, 4},
+   {210, 0x1f, 2},
+   {320, 0x19, 2},
+   {420, 0x0f, 1},
+   {630, 0x09, 1},
+   {1100, 0x03, 1},
+   {0x, 0x01, 1},
+};
+
+static struct mipi_hs_freq_range_cfg
+mipi_hs_freq_range[MIPI_DPHY_DEFAULT_BIT_RATES] = {
+   {.default_bit_rate_mbps = 80, .hsfreqrange_code = 0x00},
+   {.default_bit_rate_mbps = 90, .hsfreqrange_code = 0x10},
+   {.default_bit_rate_mbps = 100, .hsfreqrange_code = 0x20},
+   {.default_bit_rate_mbps = 110, .hsfreqrange_code = 0x30},
+   {.default_bit_rate_mbps = 120, .hsfreqrange_code = 0x01},
+   {.default_bit_rate_mbps = 130, .hsfreqrange_code = 0x11},
+   {.default_bit_rate_mbps = 140, .hsfreqrange_code = 0x21},
+   {.default_bit_rate_mbps = 150, .hsfreqrange_code = 0x31},
+   {.default_bit_rate_mbps = 160, .hsfreqrange_code = 0x02},
+   {.default_bit_rate_mbps = 170, .hsfreqrange_code = 0x12},
+   {.default_bit_rate_mbps = 180, .hsfreqrange_code = 0x22},
+   {.default_bit_rate_mbps = 190, .hsfreqrange_code = 0x32},
+   {.default_bit_rate_mbps = 205, .hsfreqrange_code = 0x03},
+   {.default_bit_rate_mbps =

[PATCH v7 0/4] Add support for KeemBay DRM driver

2020-08-31 Thread Anitha Chrisanthus
This is a new DRM driver for Intel's KeemBay SOC.
The SoC couples an ARM Cortex A53 CPU with an Intel
Movidius VPU.

This driver is tested with the KMB EVM board which is the refernce baord
for Keem Bay SOC. The SOC's display pipeline is as follows

+--++-++---+
|LCD controller| -> |Mipi DSI | -> |Mipi to HDMI Converter |
+--++-++---+

LCD controller and Mipi DSI transmitter are part of the SOC and
mipi to HDMI converter is ADV7535 for KMB EVM board.

The DRM driver is a basic KMS atomic modesetting display driver and
has no 2D or 3D graphics.It calls into the ADV bridge driver at
the connector level.

Only 1080p resolution and single plane is supported at this time.
The usecase is for debugging video and camera outputs.

Device tree patches are under review here
https://lore.kernel.org/linux-arm-kernel/20200708175020.194436-1-daniele.alessandre...@linux.intel.com/T/

Changes since v1:
- Removed redundant license text, updated license
- Rearranged include blocks
- renamed global vars and removed extern in c
- Used upclassing for dev_private
- Used drm_dev_init in drm device create
- minor cleanups

Changes since v2:
- squashed all commits to a single commit
- logging changed to drm_info, drm_dbg etc.
- used devm_drm_dev_alloc()
- removed commented out sections and general cleanup

Changes since v3:
- renamed dev_p to kmb
- moved clocks under kmb_clock, consolidated clk initializations
- use drmm functions
- use DRM_GEM_CMA_DRIVER_OPS_VMAP
- more cleanups

Changes since v4:
- corrected spellings

Changes since v5:
- corrected checkpatch warnings/checks
   -Please ignore checkpatch checks on Camelcase - this is how it is
   named in the databook
   - Please ignore checkpatch warnings on misspelled for hsa, dout,
   widthn etc. - they are spelled as in the databook
   - Please ignore checkpatch checks on macro arguments reuse -
   its confirmed ok

Changes since v6:
- review changes Sam Ravnborg and Thomas Zimmerman
split patch into 4 parts, part1 register definitions, part2 display
driver files, part3 mipi dsi, part4 build files (Sam)
removed kmb_crtc.h kmb_crtc_cleanup (Thomas)
renamed mode_set, kmb_load, inlined unload (Thomas)
moved remaining logging to drm_*(Thomas)
re-orged driver initialization (Thomas)
moved plane_status to drm_private (Sam)
removed unnecessary logs and defines and ifdef codes (Sam)
split dphy_init_sequence smaller (Sam)
removed redundant checks in kmb_dsi (Sam)
changed kmb_dsi_init to drm_bridge_connector_init and
drm_connector_attach_encoder to bridge's connector (Sam)
call helper_check in plane_atomic_check (Sam)
renamed set to get for bpp and format functions(Sam)
use drm helper functions for reset, duplicate/destroy state instead
of kmb functions (Sam)
removed kmb_priv from kmb_plane and removed kmb_plane_state (Sam)

Anitha Chrisanthus (4):
  drm/kmb: Keem Bay driver register definition
  drm/kmb: Add support for KeemBay Display
  drm/kmb: Mipi DSI part of the display driver
  drm/kmb: Build files for KeemBay Display driver

 drivers/gpu/drm/Kconfig |2 +
 drivers/gpu/drm/Makefile|1 +
 drivers/gpu/drm/kmb/Kconfig |   13 +
 drivers/gpu/drm/kmb/Makefile|2 +
 drivers/gpu/drm/kmb/kmb_crtc.c  |  224 ++
 drivers/gpu/drm/kmb/kmb_drv.c   |  676 +
 drivers/gpu/drm/kmb/kmb_drv.h   |  170 +
 drivers/gpu/drm/kmb/kmb_dsi.c   | 1523 +++
 drivers/gpu/drm/kmb/kmb_dsi.h   |  350 +
 drivers/gpu/drm/kmb/kmb_plane.c |  480 
 drivers/gpu/drm/kmb/kmb_plane.h |  110 +++
 drivers/gpu/drm/kmb/kmb_regs.h  |  748 +++
 12 files changed, 4299 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/Kconfig
 create mode 100644 drivers/gpu/drm/kmb/Makefile
 create mode 100644 drivers/gpu/drm/kmb/kmb_crtc.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_regs.h

-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v7 4/4] drm/kmb: Build files for KeemBay Display driver

2020-08-31 Thread Anitha Chrisanthus
Cc: Sam Ravnborg 
Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 drivers/gpu/drm/Kconfig  |  2 ++
 drivers/gpu/drm/Makefile |  1 +
 drivers/gpu/drm/kmb/Kconfig  | 13 +
 drivers/gpu/drm/kmb/Makefile |  2 ++
 4 files changed, 18 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/Kconfig
 create mode 100644 drivers/gpu/drm/kmb/Makefile

diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index 147d61b..97a1631b 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -275,6 +275,8 @@ source "drivers/gpu/drm/nouveau/Kconfig"
 
 source "drivers/gpu/drm/i915/Kconfig"
 
+source "drivers/gpu/drm/kmb/Kconfig"
+
 config DRM_VGEM
tristate "Virtual GEM provider"
depends on DRM
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index 2f31579..2146ff8 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -71,6 +71,7 @@ obj-$(CONFIG_DRM_AMDGPU)+= amd/amdgpu/
 obj-$(CONFIG_DRM_MGA)  += mga/
 obj-$(CONFIG_DRM_I810) += i810/
 obj-$(CONFIG_DRM_I915) += i915/
+obj-$(CONFIG_DRM_KMB_DISPLAY)  += kmb/
 obj-$(CONFIG_DRM_MGAG200) += mgag200/
 obj-$(CONFIG_DRM_V3D)  += v3d/
 obj-$(CONFIG_DRM_VC4)  += vc4/
diff --git a/drivers/gpu/drm/kmb/Kconfig b/drivers/gpu/drm/kmb/Kconfig
new file mode 100644
index 000..e18b74c
--- /dev/null
+++ b/drivers/gpu/drm/kmb/Kconfig
@@ -0,0 +1,13 @@
+config DRM_KMB_DISPLAY
+   tristate "INTEL KEEMBAY DISPLAY"
+   depends on DRM && OF && (ARM || ARM64)
+   depends on COMMON_CLK
+   select DRM_KMS_HELPER
+   select DRM_KMS_CMA_HELPER
+   select DRM_GEM_CMA_HELPER
+   select VIDEOMODE_HELPERS
+   help
+   Choose this option if you have Intel's KeemBay SOC which integrates
+   an ARM Cortex A53 CPU with an Intel Movidius VPU.
+
+   If M is selected the module will be called kmb-drm.
diff --git a/drivers/gpu/drm/kmb/Makefile b/drivers/gpu/drm/kmb/Makefile
new file mode 100644
index 000..527d737
--- /dev/null
+++ b/drivers/gpu/drm/kmb/Makefile
@@ -0,0 +1,2 @@
+kmb-drm-y := kmb_crtc.o kmb_drv.o kmb_plane.o kmb_dsi.o
+obj-$(CONFIG_DRM_KMB_DISPLAY)  += kmb-drm.o
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v6] Add support for KeemBay DRM driver

2020-08-10 Thread Anitha Chrisanthus
This is a new DRM driver for Intel's KeemBay SOC.
The SoC couples an ARM Cortex A53 CPU with an Intel
Movidius VPU.

This driver is tested with the KMB EVM board which is the refernce baord
for Keem Bay SOC. The SOC's display pipeline is as follows

+--++-++---+
|LCD controller| -> |Mipi DSI | -> |Mipi to HDMI Converter |
+--++-++---+

LCD controller and Mipi DSI transmitter are part of the SOC and
mipi to HDMI converter is ADV7535 for KMB EVM board.

The DRM driver is a basic KMS atomic modesetting display driver and
has no 2D or 3D graphics.It calls into the ADV bridge driver at
the connector level.

Only 1080p resolution and single plane is supported at this time.
The usecase is for debugging video and camera outputs.

Device tree patches are under review here
https://lore.kernel.org/linux-arm-kernel/20200708175020.194436-1-daniele.alessandre...@linux.intel.com/T/

Changes since v1:
- Removed redundant license text, updated license
- Rearranged include blocks
- renamed global vars and removed extern in c
- Used upclassing for dev_private
- Used drm_dev_init in drm device create
- minor cleanups

Changes since v2:
- squashed all commits to a single commit
- logging changed to drm_info, drm_dbg etc.
- used devm_drm_dev_alloc()
- removed commented out sections and general cleanup

Changes since v3:
- renamed dev_p to kmb
- moved clocks under kmb_clock, consolidated clk initializations
- use drmm functions
- use DRM_GEM_CMA_DRIVER_OPS_VMAP
- more cleanups

Changes since v4:
- corrected spellings

Changes since v5:
- corrected checkpatch warnings/checks
-Please ignore checkpatch checks on Camelcase - this is how it is
named in the databook
- Please ignore checkpatch warnings on misspelled for hsa, dout,
widthn etc. - they are spelled as in the databook
- Please ignore checkpatch checks on macro arguments reuse - 
its confirmed ok

Anitha Chrisanthus (1):
  drm/kmb: Add support for KeemBay Display

 drivers/gpu/drm/Kconfig |2 +
 drivers/gpu/drm/Makefile|1 +
 drivers/gpu/drm/kmb/Kconfig |   13 +
 drivers/gpu/drm/kmb/Makefile|2 +
 drivers/gpu/drm/kmb/kmb_crtc.c  |  217 +
 drivers/gpu/drm/kmb/kmb_crtc.h  |   36 +
 drivers/gpu/drm/kmb/kmb_drv.c   |  725 
 drivers/gpu/drm/kmb/kmb_drv.h   |  172 
 drivers/gpu/drm/kmb/kmb_dsi.c   | 1828 +++
 drivers/gpu/drm/kmb/kmb_dsi.h   |  370 
 drivers/gpu/drm/kmb/kmb_plane.c |  519 +++
 drivers/gpu/drm/kmb/kmb_plane.h |  124 +++
 drivers/gpu/drm/kmb/kmb_regs.h  |  748 
 13 files changed, 4757 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/Kconfig
 create mode 100644 drivers/gpu/drm/kmb/Makefile
 create mode 100644 drivers/gpu/drm/kmb/kmb_crtc.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_crtc.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_regs.h

-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v5] Add support for KeemBay DRM driver

2020-08-03 Thread Anitha Chrisanthus
This is a new DRM driver for Intel's KeemBay SOC.
The SoC couples an ARM Cortex A53 CPU with an Intel
Movidius VPU.

This driver is tested with the KMB EVM board which is the refernce baord
for Keem Bay SOC. The SOC's display pipeline is as follows

+--++-++---+
|LCD controller| -> |Mipi DSI | -> |Mipi to HDMI Converter |
+--++-++---+

LCD controller and Mipi DSI transmitter are part of the SOC and
mipi to HDMI converter is ADV7535 for KMB EVM board.

The DRM driver is a basic KMS atomic modesetting display driver and
has no 2D or 3D graphics.It calls into the ADV bridge driver at
the connector level.

Only 1080p resolution and single plane is supported at this time.
The usecase is for debugging video and camera outputs.

Device tree patches are under review here
https://lore.kernel.org/linux-arm-kernel/20200708175020.194436-1-daniele.alessandre...@linux.intel.com/T
/

Changes since v1:
- Removed redundant license text, updated license
- Rearranged include blocks
- renamed global vars and removed extern in c
- Used upclassing for dev_private
- Used drm_dev_init in drm device create
- minor cleanups

Changes since v2:
- squashed all commits to a single commit
- logging changed to drm_info, drm_dbg etc.
- used devm_drm_dev_alloc()
- removed commented out sections and general cleanup

Changes since v3:
- renamed dev_p to kmb
- moved clocks under kmb_clock, consolidated clk initializations
- use drmm functions
- use DRM_GEM_CMA_DRIVER_OPS_VMAP
- more cleanups

Changes since v4:
- corrected spellings

Anitha Chrisanthus (1):
  drm/kmb: Add support for KeemBay Display

 drivers/gpu/drm/Kconfig |2 +
 drivers/gpu/drm/Makefile|1 +
 drivers/gpu/drm/kmb/Kconfig |   13 +
 drivers/gpu/drm/kmb/Makefile|2 +
 drivers/gpu/drm/kmb/kmb_crtc.c  |  217 +
 drivers/gpu/drm/kmb/kmb_crtc.h  |   36 +
 drivers/gpu/drm/kmb/kmb_drv.c   |  728 
 drivers/gpu/drm/kmb/kmb_drv.h   |  172 
 drivers/gpu/drm/kmb/kmb_dsi.c   | 1834 +++
 drivers/gpu/drm/kmb/kmb_dsi.h   |  370 
 drivers/gpu/drm/kmb/kmb_plane.c |  518 +++
 drivers/gpu/drm/kmb/kmb_plane.h |  124 +++
 drivers/gpu/drm/kmb/kmb_regs.h  |  738 
 13 files changed, 4755 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/Kconfig
 create mode 100644 drivers/gpu/drm/kmb/Makefile
 create mode 100644 drivers/gpu/drm/kmb/kmb_crtc.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_crtc.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_regs.h

-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v4] Add support for KeemBay DRM driver

2020-07-30 Thread Anitha Chrisanthus
This is a new DRM driver for Intel's KeemBay SOC.
The SoC couples an ARM Cortex A53 CPU with an Intel
Movidius VPU.

This driver is tested with the KMB EVM board which is the refernce baord
for Keem Bay SOC. The SOC's display pipeline is as follows

+--++-++---+
|LCD controller| -> |Mipi DSI | -> |Mipi to HDMI Converter |
+--++-++---+

LCD controller and Mipi DSI transmitter are part of the SOC and
mipi to HDMI converter is ADV7535 for KMB EVM board.

The DRM driver is a basic KMS atomic modesetting display driver and
has no 2D or 3D graphics.It calls into the ADV bridge driver at
the connector level.

Only 1080p resolution and single plane is supported at this time.
The usecase is for debugging video and camera outputs.

Device tree patches are under review here
https://lore.kernel.org/linux-arm-kernel/20200708175020.194436-1-daniele.alessandre...@linux.intel.com/T/

Changes since v1:
- Removed redundant license text, updated license
- Rearranged include blocks
- renamed global vars and removed extern in c
- Used upclassing for dev_private
- Used drm_dev_init in drm device create
- minor cleanups

Changes since v2:
- squashed all commits to a single commit
- logging changed to drm_info, drm_dbg etc.
- used devm_drm_dev_alloc()
- removed commented out sections and general cleanup

Changes since v3:
- renamed dev_p to kmb
- moved clocks under kmb_clock, consolidated clk initializations
- use drmm functions
- use DRM_GEM_CMA_DRIVER_OPS_VMAP
- more cleanups

Anitha Chrisanthus (1):
  drm/kmb: Add support for KeemBay Display

 drivers/gpu/drm/Kconfig |2 +
 drivers/gpu/drm/Makefile|1 +
 drivers/gpu/drm/kmb/Kconfig |   13 +
 drivers/gpu/drm/kmb/Makefile|2 +
 drivers/gpu/drm/kmb/kmb_crtc.c  |  217 +
 drivers/gpu/drm/kmb/kmb_crtc.h  |   36 +
 drivers/gpu/drm/kmb/kmb_drv.c   |  733 
 drivers/gpu/drm/kmb/kmb_drv.h   |  172 
 drivers/gpu/drm/kmb/kmb_dsi.c   | 1834 +++
 drivers/gpu/drm/kmb/kmb_dsi.h   |  370 
 drivers/gpu/drm/kmb/kmb_plane.c |  518 +++
 drivers/gpu/drm/kmb/kmb_plane.h |  124 +++
 drivers/gpu/drm/kmb/kmb_regs.h  |  738 
 13 files changed, 4760 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/Kconfig
 create mode 100644 drivers/gpu/drm/kmb/Makefile
 create mode 100644 drivers/gpu/drm/kmb/kmb_crtc.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_crtc.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_regs.h

-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3] Add support for KeemBay DRM driver

2020-07-17 Thread Anitha Chrisanthus
This is a new DRM driver for Intel's KeemBay SOC.
The SoC couples an ARM Cortex A53 CPU with an Intel
Movidius VPU.

This driver is tested with the KMB EVM board which is the refernce baord
for Keem Bay SOC. The SOC's display pipeline is as follows

+--++-++---+
|LCD controller| -> |Mipi DSI | -> |Mipi to HDMI Converter |
+--++-++---+

LCD controller and Mipi DSI transmitter are part of the SOC and
mipi to HDMI converter is ADV7535 for KMB EVM board.

The DRM driver is a basic KMS atomic modesetting display driver and
has no 2D or 3D graphics.It calls into the ADV bridge driver at
the connector level.

Only 1080p resolution and single plane is supported at this time.
The usecase is for debugging video and camera outputs.

Device tree patches are under review here
https://lore.kernel.org/linux-arm-kernel/20200708175020.194436-1-daniele.alessandre...@linux.intel.com/T/

Changes since v1:
- Removed redundant license text, updated license
- Rearranged include blocks
- renamed global vars and removed extern in c
- Used upclassing for dev_private
- Used drm_dev_init in drm device create
- minor cleanups

Changes since v2:
- squashed all commits to a single commit
- logging changed to drm_info, drm_dbg etc.
- used devm_drm_dev_alloc()
- removed commented out sections and general cleanup

Anitha Chrisanthus (1):
  drm/kmb: Add support for KeemBay Display

 drivers/gpu/drm/Kconfig |2 +
 drivers/gpu/drm/Makefile|1 +
 drivers/gpu/drm/kmb/Kconfig |   12 +
 drivers/gpu/drm/kmb/Makefile|2 +
 drivers/gpu/drm/kmb/kmb_crtc.c  |  219 +
 drivers/gpu/drm/kmb/kmb_crtc.h  |   41 +
 drivers/gpu/drm/kmb/kmb_drv.c   |  759 
 drivers/gpu/drm/kmb/kmb_drv.h   |  165 
 drivers/gpu/drm/kmb/kmb_dsi.c   | 1833 +++
 drivers/gpu/drm/kmb/kmb_dsi.h   |  370 
 drivers/gpu/drm/kmb/kmb_plane.c |  515 +++
 drivers/gpu/drm/kmb/kmb_plane.h |  124 +++
 drivers/gpu/drm/kmb/kmb_regs.h  |  738 
 13 files changed, 4781 insertions(+)
 create mode 100644 drivers/gpu/drm/kmb/Kconfig
 create mode 100644 drivers/gpu/drm/kmb/Makefile
 create mode 100644 drivers/gpu/drm/kmb/kmb_crtc.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_crtc.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_drv.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_dsi.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.c
 create mode 100644 drivers/gpu/drm/kmb/kmb_plane.h
 create mode 100644 drivers/gpu/drm/kmb/kmb_regs.h

-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v2 25/59] drm/kmb: Display clock enable/disable

2020-07-14 Thread Anitha Chrisanthus
Get clock info from DT and enable it during initialization.
Also changed name of the driver to "kmb,display" to match other
entries in the DT.

v2: fixed error in clk_disable

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 drivers/gpu/drm/kmb/kmb_drv.c | 41 +++--
 1 file changed, 39 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index 5a2ff9d..71fdb94 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -32,6 +32,25 @@
 /*IRQ handler*/
 static irqreturn_t kmb_isr(int irq, void *arg);
 
+static struct clk *clk_lcd;
+static struct clk *clk_mipi;
+
+static int kmb_display_clk_enable(void)
+{
+   clk_prepare_enable(clk_lcd);
+   clk_prepare_enable(clk_mipi);
+   return 0;
+}
+
+static int kmb_display_clk_disable(void)
+{
+   if (clk_lcd)
+   clk_disable_unprepare(clk_lcd);
+   if (clk_mipi)
+   clk_disable_unprepare(clk_mipi);
+   return 0;
+}
+
 static int kmb_load(struct drm_device *drm, unsigned long flags)
 {
struct kmb_drm_private *dev_p = to_kmb(drm);
@@ -153,6 +172,19 @@ static int kmb_load(struct drm_device *drm, unsigned long 
flags)
goto setup_fail;
}
 
+   /* enable display clocks*/
+   clk_lcd = clk_get(>dev, "clk_lcd");
+   if (!clk_lcd) {
+   DRM_ERROR("clk_get() failed clk_lcd\n");
+   goto setup_fail;
+   }
+   clk_mipi = clk_get(>dev, "clk_mipi");
+   if (!clk_mipi) {
+   DRM_ERROR("clk_get() failed clk_mipi\n");
+   goto setup_fail;
+   }
+   kmb_display_clk_enable();
+
ret = drm_irq_install(drm, platform_get_irq(pdev, 0));
if (ret < 0) {
DRM_ERROR("failed to install IRQ handler\n");
@@ -382,6 +414,11 @@ static void kmb_drm_unbind(struct device *dev)
of_reserved_mem_device_release(drm->dev);
drm_mode_config_cleanup(drm);
 
+   /*release clks */
+   kmb_display_clk_disable();
+   clk_put(clk_lcd);
+   clk_put(clk_mipi);
+
drm_dev_put(drm);
drm->dev_private = NULL;
dev_set_drvdata(dev, NULL);
@@ -420,8 +457,8 @@ static int kmb_remove(struct platform_device *pdev)
return 0;
 }
 
-static const struct of_device_id kmb_of_match[] = {
-   {.compatible = "lcd"},
+static const struct of_device_id  kmb_of_match[] = {
+   {.compatible = "kmb,display"},
{},
 };
 
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v2 43/59] drm/kmb: Changed name of driver to kmb-drm

2020-07-14 Thread Anitha Chrisanthus
name change

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 drivers/gpu/drm/kmb/Makefile  | 4 ++--
 drivers/gpu/drm/kmb/kmb_drv.c | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/kmb/Makefile b/drivers/gpu/drm/kmb/Makefile
index 8102bc9..527d737 100644
--- a/drivers/gpu/drm/kmb/Makefile
+++ b/drivers/gpu/drm/kmb/Makefile
@@ -1,2 +1,2 @@
-kmb-display-y := kmb_crtc.o kmb_drv.o kmb_plane.o kmb_dsi.o
-obj-$(CONFIG_DRM_KMB_DISPLAY)  += kmb-display.o
+kmb-drm-y := kmb_crtc.o kmb_drv.o kmb_plane.o kmb_dsi.o
+obj-$(CONFIG_DRM_KMB_DISPLAY)  += kmb-drm.o
diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index 039dd21..bbf3e649 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -447,7 +447,7 @@ static struct drm_driver kmb_driver = {
.gem_prime_vunmap = drm_gem_cma_prime_vunmap,
.gem_prime_mmap = drm_gem_cma_prime_mmap,
.fops = ,
-   .name = "kmb_display",
+   .name = "kmb-drm",
.desc = "KEEMBAY DISPLAY DRIVER ",
.date = "20190122",
.major = 1,
@@ -630,7 +630,7 @@ static struct platform_driver kmb_platform_driver = {
.probe  = kmb_probe,
.remove = kmb_remove,
.driver = {
-   .name = "kmb_display",
+   .name = "kmb-drm",
.pm = _pm_ops,
.of_match_table = kmb_of_match,
},
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v2 55/59] drm/kmb: Added useful messages in LCD ISR

2020-07-14 Thread Anitha Chrisanthus
Print messages for LCD DMA FIFO errors.

v2: corrected spelling

Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_drv.c   | 68 +++--
 drivers/gpu/drm/kmb/kmb_plane.h |  2 ++
 2 files changed, 60 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index 55574c1..7fcab4b 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -361,15 +361,15 @@ static irqreturn_t handle_lcd_irq(struct drm_device *dev)
 * disabled but actually disable the plane when EOF irq is
 * being handled.
 */
-   for (plane_id = LAYER_0; plane_id < KMB_MAX_PLANES;
-   plane_id++) {
+   for (plane_id = LAYER_0; plane_id < KMB_MAX_PLANES; plane_id++) 
{
if (plane_status[plane_id].disable) {
kmb_clr_bitmask_lcd(dev_p,
-   LCD_LAYERn_DMA_CFG(plane_id),
-   LCD_DMA_LAYER_ENABLE);
+   LCD_LAYERn_DMA_CFG
+   (plane_id),
+   LCD_DMA_LAYER_ENABLE);
 
kmb_clr_bitmask_lcd(dev_p, LCD_CONTROL,
-   plane_status[plane_id].ctrl);
+   plane_status[plane_id].ctrl);
 
plane_status[plane_id].disable = false;
}
@@ -381,11 +381,6 @@ static irqreturn_t handle_lcd_irq(struct drm_device *dev)
kmb_write_lcd(dev_p, LCD_INT_CLEAR, LCD_INT_LINE_CMP);
}
 
-   if (status & LCD_INT_LAYER) {
-   /* Clear layer interrupts */
-   kmb_write_lcd(dev_p, LCD_INT_CLEAR, LCD_INT_LAYER);
-   }
-
if (status & LCD_INT_VERT_COMP) {
/* Read VSTATUS */
val = kmb_read_lcd(dev_p, LCD_VSTATUS);
@@ -403,6 +398,59 @@ static irqreturn_t handle_lcd_irq(struct drm_device *dev)
}
}
 
+   if (status & LCD_INT_DMA_ERR) {
+   val = (status & LCD_INT_DMA_ERR);
+   /* LAYER0 - VL0 */
+   if (val & LAYER0_DMA_FIFO_UNDERFLOW)
+   DRM_INFO("LAYER0:VL0 DMA UNDERFLOW val = 0x%lx", val);
+   if (val & LAYER0_DMA_FIFO_OVERFLOW)
+   DRM_INFO("LAYER0:VL0 DMA OVERFLOW val = 0x%lx", val);
+   if (val & LAYER0_DMA_CB_FIFO_OVERFLOW)
+   DRM_INFO("LAYER0:VL0 DMA CB OVERFLOW val = 0x%lx", val);
+   if (val & LAYER0_DMA_CB_FIFO_UNDERFLOW)
+   DRM_INFO("LAYER0:VL0 DMA CB UNDERFLOW val = 0x%lx",
+val);
+   if (val & LAYER0_DMA_CR_FIFO_UNDERFLOW)
+   DRM_INFO("LAYER0:VL0 DMA CR UNDERFLOW val = 0x%lx",
+val);
+   if (val & LAYER0_DMA_CR_FIFO_OVERFLOW)
+   DRM_INFO("LAYER0:VL0 DMA CR OVERFLOW val = 0x%lx", val);
+
+   /* LAYER1 - VL1 */
+   if (val & LAYER1_DMA_FIFO_UNDERFLOW)
+   DRM_INFO("LAYER1:VL1 DMA UNDERFLOW val = 0x%lx", val);
+   if (val & LAYER1_DMA_FIFO_OVERFLOW)
+   DRM_INFO("LAYER1:VL1 DMA OVERFLOW val = 0x%lx", val);
+   if (val & LAYER1_DMA_CB_FIFO_OVERFLOW)
+   DRM_INFO("LAYER1:VL1 DMA CB OVERFLOW val = 0x%lx", val);
+   if (val & LAYER1_DMA_CB_FIFO_UNDERFLOW)
+   DRM_INFO("LAYER1:VL1 DMA CB UNDERFLOW val = 0x%lx",
+val);
+   if (val & LAYER1_DMA_CR_FIFO_UNDERFLOW)
+   DRM_INFO("LAYER1:VL1 DMA CR UNDERFLOW val = 0x%lx",
+val);
+   if (val & LAYER1_DMA_CR_FIFO_OVERFLOW)
+   DRM_INFO("LAYER1:VL1 DMA CR OVERFLOW val = 0x%lx", val);
+
+   /* LAYER2 - GL0 */
+   if (val & LAYER2_DMA_FIFO_UNDERFLOW)
+   DRM_INFO("LAYER2:GL0 DMA UNDERFLOW val = 0x%lx", val);
+   if (val & LAYER2_DMA_FIFO_OVERFLOW)
+   DRM_INFO("LAYER2:GL0 DMA OVERFLOW val = 0x%lx", val);
+
+   /* LAYER3 - GL1 */
+   if (val & LAYER3_DMA_FIFO_UNDERFLOW)
+   DRM_INFO("LAYER3:GL1 DMA UNDERFLOW val = 0x%lx", val);
+   if (val & LAYER3_DMA_FIFO_UNDERFLOW)
+   DRM_INFO("LAYER3:GL1 DMA OVERFLOW val = 0x%lx", val);
+
+   }
+
+  

[PATCH v2 30/59] drm/kmb: call bridge init in the very beginning

2020-07-14 Thread Anitha Chrisanthus
of probe and return probe_defer early on, so that all the other
initializations can be done after adv driver is loaded successfully.

Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_drv.c |  74 +-
 drivers/gpu/drm/kmb/kmb_dsi.c | 144 ++
 drivers/gpu/drm/kmb/kmb_dsi.h |   6 +-
 3 files changed, 138 insertions(+), 86 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index 36edfbf..76f3c43 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -37,11 +37,24 @@ static struct clk *clk_lcd;
 static struct clk *clk_mipi;
 
 static int probe_deferred;
+struct drm_bridge *adv_bridge;
 
 static int kmb_display_clk_enable(void)
 {
-   clk_prepare_enable(clk_lcd);
-   clk_prepare_enable(clk_mipi);
+   int ret;
+
+   ret = clk_prepare_enable(clk_lcd);
+   if (ret) {
+   DRM_ERROR("Failed to enable LCD clock: %d\n", ret);
+   return ret;
+   }
+
+   ret = clk_prepare_enable(clk_mipi);
+   if (ret) {
+   DRM_ERROR("Failed to enable MIPI clock: %d\n", ret);
+   return ret;
+   }
+   DRM_INFO("SUCCESS : enabled LCD MIPI clocks\n");
return 0;
 }
 
@@ -86,8 +99,7 @@ static int kmb_load(struct drm_device *drm, unsigned long 
flags)
 *}
 */
/* LCD mmio */
-   if (!probe_deferred) {
-   probe_deferred = 1;
+   probe_deferred = 1;
 
if (!request_mem_region(LCD_BASE_ADDR, LCD_MMIO_SIZE, "kmb-lcd")) {
DRM_ERROR("failed to reserve LCD registers\n");
@@ -120,9 +132,10 @@ static int kmb_load(struct drm_device *drm, unsigned long 
flags)
 * lists LCD at 79 and 82 for MIPI under MSS CPU -
 * firmware has to redirect it to A53
 */
-/*TBD read and check for correct product version here */
 
-   /* Get the optional framebuffer memory resource */
+   /*TBD read and check for correct product version here */
+
+   /* Get the optional framebuffer memory resource */
ret = of_reserved_mem_device_init(drm->dev);
if (ret && ret != -ENODEV)
return ret;
@@ -134,8 +147,7 @@ static int kmb_load(struct drm_device *drm, unsigned long 
flags)
goto setup_fail;
}
 
-/* ret = kmb_dsi_init(drm, bridge);*/
-   ret = kmb_dsi_init(drm);
+   ret = kmb_dsi_init(drm, adv_bridge);
if (ret == -EPROBE_DEFER) {
DRM_INFO("%s: wait for external bridge driver DT", __func__);
return -EPROBE_DEFER;
@@ -143,7 +155,6 @@ static int kmb_load(struct drm_device *drm, unsigned long 
flags)
DRM_ERROR("failed to initialize DSI\n");
goto setup_fail;
}
-}
/* enable display clocks*/
clk_lcd = clk_get(>dev, "clk_lcd");
if (!clk_lcd) {
@@ -157,10 +168,9 @@ static int kmb_load(struct drm_device *drm, unsigned long 
flags)
goto setup_fail;
}
DRM_INFO("%s : %d\n", __func__, __LINE__);
-   kmb_display_clk_enable();
-
-   DRM_INFO("%s : %d\n", __func__, __LINE__);
+   ret = kmb_display_clk_enable();
 
+   DRM_INFO("%s : %d clk enabling ret=%d\n", __func__, __LINE__, ret);
return 0;
 
drm_crtc_cleanup(_p->crtc);
@@ -268,7 +278,7 @@ static struct drm_driver kmb_driver = {
.gem_prime_vunmap = drm_gem_cma_prime_vunmap,
.gem_prime_mmap = drm_gem_cma_prime_mmap,
.fops = ,
-   .name = "kmb",
+   .name = "kmb_display",
.desc = "KEEMBAY DISPLAY DRIVER ",
.date = "20190122",
.major = 1,
@@ -277,7 +287,7 @@ static struct drm_driver kmb_driver = {
 
 static int kmb_drm_bind(struct device *dev)
 {
-   struct drm_device *drm;
+   struct drm_device *drm = NULL;
struct kmb_drm_private *lcd;
int ret;
 
@@ -296,7 +306,9 @@ static int kmb_drm_bind(struct device *dev)
dev_set_drvdata(dev, drm);
 
kmb_setup_mode_config(drm);
-   DRM_DEBUG("kmb_bind : after kmb_setup_mode_config\n");
+   dev_set_drvdata(dev, drm);
+
+   /* load the driver */
ret = kmb_load(drm, 0);
DRM_INFO("%s : %d ret = %d\n", __func__, __LINE__, ret);
if (ret == -EPROBE_DEFER) {
@@ -337,7 +349,6 @@ static int kmb_drm_bind(struct device *dev)
drm_kms_helper_poll_fini(drm);
 err_vblank:
pm_runtime_disable(drm->dev);
-   component_unbind_all(dev, drm);
of_node_put(lcd->crtc.port);
lcd->crtc.port = NULL;
drm_irq_uninstall(drm);
@@ -355,9 +366,9 @@ static void kmb_drm_unbind(struct device *dev)
struct drm_device *drm = dev_get_drvdata(dev);
struct kmb_drm_private *dev_p = to_km

[PATCH v2 07/59] drm/kmb: Set OUT_FORMAT_CFG register

2020-07-14 Thread Anitha Chrisanthus
v2: code review changes
Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 drivers/gpu/drm/kmb/kmb_plane.c | 14 +-
 drivers/gpu/drm/kmb/kmb_regs.h  |  1 +
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/kmb/kmb_plane.c b/drivers/gpu/drm/kmb/kmb_plane.c
index 74a3573..cb05cb8 100644
--- a/drivers/gpu/drm/kmb/kmb_plane.c
+++ b/drivers/gpu/drm/kmb/kmb_plane.c
@@ -208,7 +208,7 @@ static void kmb_plane_atomic_update(struct drm_plane *plane,
unsigned int dma_len;
struct kmb_plane *kmb_plane = to_kmb_plane(plane);
unsigned int dma_cfg;
-   unsigned int ctrl = 0, val = 0;
+   unsigned int ctrl = 0, val = 0, out_format = 0;
unsigned int src_w, src_h, crtc_x, crtc_y;
unsigned char plane_id = kmb_plane->id;
 
@@ -279,6 +279,18 @@ static void kmb_plane_atomic_update(struct drm_plane 
*plane,
/* enable DMA */
kmb_write(lcd, LCD_LAYERn_DMA_CFG(plane_id), dma_cfg);
 
+   /* FIXME no doc on how to set output format - may need to change
+* this later
+*/
+   if (val & LCD_LAYER_BGR_ORDER)
+   out_format |= LCD_OUTF_BGR_ORDER;
+   else if (val & LCD_LAYER_CRCB_ORDER)
+   out_format |= LCD_OUTF_CRCB_ORDER;
+   /* do not interleave RGB channels for mipi Tx compatibility */
+   out_format |= LCD_OUTF_MIPI_RGB_MODE;
+   /* pixel format from LCD_LAYER_CFG */
+   out_format |= ((val >> 9) & 0x1F);
+   kmb_write(lcd, LCD_OUT_FORMAT_CFG, out_format);
 }
 
 static const struct drm_plane_helper_funcs kmb_plane_helper_funcs = {
diff --git a/drivers/gpu/drm/kmb/kmb_regs.h b/drivers/gpu/drm/kmb/kmb_regs.h
index 8346a04..8b67f2b 100644
--- a/drivers/gpu/drm/kmb/kmb_regs.h
+++ b/drivers/gpu/drm/kmb/kmb_regs.h
@@ -320,6 +320,7 @@
 #define LCD_OUTF_BGR_ORDER   (1 << 5)
 #define LCD_OUTF_Y_ORDER (1 << 6)
 #define LCD_OUTF_CRCB_ORDER  (1 << 7)
+#define LCD_OUTF_MIPI_RGB_MODE   (1 << 18)
 
 #define LCD_HSYNC_WIDTH(0x4 * 0x801)
 #define LCD_H_BACKPORCH(0x4 * 0x802)
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v2 12/59] drm/kmb: Part3 of Mipi Tx initialization

2020-07-14 Thread Anitha Chrisanthus
This initializes the multichannel fifo in the mipi transmitter and
sets the LCD to mipi interconnect which connects LCD to MIPI ctrl #6

v2: code review changes to make code simpler

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 drivers/gpu/drm/kmb/kmb_drv.h  | 25 +++---
 drivers/gpu/drm/kmb/kmb_dsi.c  | 58 ++
 drivers/gpu/drm/kmb/kmb_dsi.h  |  3 +++
 drivers/gpu/drm/kmb/kmb_regs.h | 30 +++---
 4 files changed, 99 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.h b/drivers/gpu/drm/kmb/kmb_drv.h
index d2a0f91..f1d5b3a 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.h
+++ b/drivers/gpu/drm/kmb/kmb_drv.h
@@ -8,8 +8,8 @@
 
 #include "kmb_regs.h"
 
-#define KMB_MAX_WIDTH  16384 /*max width in pixels */
-#define KMB_MAX_HEIGHT 16384 /*max height in pixels */
+#define KMB_MAX_WIDTH  16384   /*max width in pixels */
+#define KMB_MAX_HEIGHT 16384   /*max height in pixels */
 
 struct kmb_drm_private {
struct drm_device drm;
@@ -64,6 +64,11 @@ static inline void kmb_write_bits(struct kmb_drm_private 
*lcd,
 }
 #endif
 
+static inline void kmb_write(void *reg, u32 value)
+{
+   writel(value, reg);
+}
+
 static inline void kmb_write_lcd(unsigned int reg, u32 value)
 {
writel(value, (LCD_BASE_ADDR + reg));
@@ -85,7 +90,7 @@ static inline u32 kmb_read_mipi(unsigned int reg)
 }
 
 static inline void kmb_write_bits_mipi(unsigned int reg, u32 offset,
-   u32 num_bits, u32 value)
+  u32 num_bits, u32 value)
 {
u32 reg_val = kmb_read_mipi(reg);
u32 mask = (1 << num_bits) - 1;
@@ -97,6 +102,20 @@ static inline void kmb_write_bits_mipi(unsigned int reg, 
u32 offset,
kmb_write_mipi(reg, reg_val);
 }
 
+static inline void kmb_set_bit_mipi(unsigned int reg, u32 offset)
+{
+   u32 reg_val = kmb_read_mipi(reg);
+
+   kmb_write_mipi(reg, reg_val | (1 << offset));
+}
+
+static inline void kmb_clr_bit_mipi(unsigned int reg, u32 offset)
+{
+   u32 reg_val = kmb_read_mipi(reg);
+
+   kmb_write_mipi(reg, reg_val & (~(1 << offset)));
+}
+
 int kmb_setup_crtc(struct drm_device *dev);
 void kmb_set_scanout(struct kmb_drm_private *lcd);
 #endif /* __KMB_DRV_H__ */
diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
index 2326d3b..a5b9681 100644
--- a/drivers/gpu/drm/kmb/kmb_dsi.c
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -503,10 +503,41 @@ static void mipi_tx_fg_cfg(struct kmb_drm_private 
*dev_priv, u8 frame_gen,
mipi_tx_fg_cfg_regs(dev_priv, frame_gen, _t_cfg);
 }
 
+static void mipi_tx_multichannel_fifo_cfg(u8 active_lanes, u8 vchannel_id)
+{
+   u32 fifo_size, fifo_rthreshold;
+   u32 ctrl_no = MIPI_CTRL6;
+
+   /*clear all mc fifo channel sizes and thresholds*/
+   kmb_write_mipi(MIPI_TX_HS_MC_FIFO_CTRL_EN, 0);
+   kmb_write_mipi(MIPI_TX_HS_MC_FIFO_CHAN_ALLOC0, 0);
+   kmb_write_mipi(MIPI_TX_HS_MC_FIFO_CHAN_ALLOC1, 0);
+   kmb_write_mipi(MIPI_TX_HS_MC_FIFO_RTHRESHOLD0, 0);
+   kmb_write_mipi(MIPI_TX_HS_MC_FIFO_RTHRESHOLD1, 0);
+
+   fifo_size = (active_lanes > MIPI_D_LANES_PER_DPHY) ?
+   MIPI_CTRL_4LANE_MAX_MC_FIFO_LOC :
+   MIPI_CTRL_2LANE_MAX_MC_FIFO_LOC;
+   /*MC fifo size for virtual channels 0-3 */
+   /*
+*REG_MC_FIFO_CHAN_ALLOC0: [8:0]-channel0, [24:16]-channel1
+*REG_MC_FIFO_CHAN_ALLOC1: [8:0]-2, [24:16]-channel3
+*/
+   SET_MC_FIFO_CHAN_ALLOC(ctrl_no, vchannel_id, fifo_size);
+
+   /*set threshold to half the fifo size, actual size=size*16*/
+   fifo_rthreshold = ((fifo_size + 1) * 8) & BIT_MASK_16;
+   SET_MC_FIFO_RTHRESHOLD(ctrl_no, vchannel_id, fifo_rthreshold);
+
+   /*enable the MC FIFO channel corresponding to the Virtual Channel */
+   kmb_set_bit_mipi(MIPI_TXm_HS_MC_FIFO_CTRL_EN(ctrl_no), vchannel_id);
+}
+
 static u32 mipi_tx_init_cntrl(struct kmb_drm_private *dev_priv,
- struct mipi_ctrl_cfg *ctrl_cfg)
+   struct mipi_ctrl_cfg *ctrl_cfg)
 {
u32 ret;
+   u8 active_vchannels = 0;
u8 frame_id, sect;
u32 bits_per_pclk = 0;
u32 word_count = 0;
@@ -544,18 +575,23 @@ static u32 mipi_tx_init_cntrl(struct kmb_drm_private 
*dev_priv,
 
/* set frame specific parameters */
mipi_tx_fg_cfg(dev_priv, frame_id, ctrl_cfg->active_lanes,
-  bits_per_pclk,
-  word_count,
-  ctrl_cfg->lane_rate_mbps,
-  ctrl_cfg->tx_ctrl_cfg.frames[frame_id]);
-   /*function for setting frame sepecific parameters will be
-* called here
-*/
-   /*bits_per_pclk and word_count will 

[PATCH v2 58/59] drm/kmb: Get System Clock from SCMI

2020-07-14 Thread Anitha Chrisanthus
System clock is different for A0 and B0 silicons, so get it directly
from clk_PLL0 through SCMI calls.

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 drivers/gpu/drm/kmb/kmb_drv.c | 11 +++
 drivers/gpu/drm/kmb/kmb_drv.h |  1 +
 drivers/gpu/drm/kmb/kmb_dsi.c | 12 +---
 3 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index 559742b8..17d303f 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -39,6 +39,7 @@ static struct clk *clk_lcd;
 static struct clk *clk_mipi;
 static struct clk *clk_mipi_ecfg;
 static struct clk *clk_mipi_cfg;
+static struct clk *clk_pll0;
 
 struct drm_bridge *adv_bridge;
 
@@ -122,6 +123,7 @@ static int kmb_load(struct drm_device *drm, unsigned long 
flags)
 #ifdef ICAM_LCD_QOS
int val = 0;
 #endif
+   struct device_node *vpu_dev;
 
/* Map MIPI MMIO registers */
dev_p->mipi_mmio = kmb_map_mmio(pdev, "mipi_regs");
@@ -188,6 +190,15 @@ static int kmb_load(struct drm_device *drm, unsigned long 
flags)
DRM_ERROR("clk_get() failed clk_mipi_cfg\n");
goto setup_fail;
}
+   vpu_dev = of_find_node_by_path("/soc/vpu-ipc");
+   DRM_INFO("vpu node = %pOF", vpu_dev);
+   clk_pll0 = of_clk_get_by_name(vpu_dev, "pll_0_out_0");
+   if (IS_ERR(clk_pll0)) {
+   DRM_ERROR("clk_get() failed clk_pll0 ");
+   goto setup_fail;
+   }
+   dev_p->sys_clk_mhz = clk_get_rate(clk_pll0)/100;
+   DRM_INFO("system clk = %d Mhz", dev_p->sys_clk_mhz);
 #ifdef LCD_TEST
/* Set LCD clock to 200 Mhz */
DRM_DEBUG("Get clk_lcd before set = %ld\n", clk_get_rate(clk_lcd));
diff --git a/drivers/gpu/drm/kmb/kmb_drv.h b/drivers/gpu/drm/kmb/kmb_drv.h
index 939f8b4..72d0746 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.h
+++ b/drivers/gpu/drm/kmb/kmb_drv.h
@@ -38,6 +38,7 @@ struct kmb_drm_private {
spinlock_t  irq_lock;
int irq_lcd;
int irq_mipi;
+   int sys_clk_mhz;
dma_addr_t  fb_addr;
 };
 
diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
index 47798ed..8f8b50c 100644
--- a/drivers/gpu/drm/kmb/kmb_dsi.c
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -588,20 +588,10 @@ static void mipi_tx_fg_cfg_regs(struct kmb_drm_private 
*dev_p, u8 frame_gen,
u32 ppl_llp_ratio;
u32 ctrl_no = MIPI_CTRL6, reg_adr, val, offset;
 
-#ifdef GET_SYS_CLK
-   /* Get system clock for blanking period cnfigurations */
-   sc = get_clock_frequency(CPR_CLK_SYSTEM, );
-   if (sc)
-   return sc;
-
-   /* Convert to MHZ */
-   sysclk /= 1000;
-#else
/* 500 Mhz system clock minus 50 to account for the difference in
 * MIPI clock speed in RTL tests
 */
-   sysclk = KMB_SYS_CLK_MHZ - 50;
-#endif
+   sysclk = dev_p->sys_clk_mhz - 50;
 
/* PPL-Pixel Packing Layer, LLP-Low Level Protocol
 * Frame genartor timing parameters are clocked on the system clock,
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v2 49/59] drm/kmb: Disable ping pong mode

2020-07-14 Thread Anitha Chrisanthus
Disable ping pong mode otherwise video corruption results,
use continuous mode and also fetch the dma
addresses before disabling dma. For now, only initialize the dma and
planes once and for next plane updates only update the addresses for
dma.

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 drivers/gpu/drm/kmb/kmb_plane.c | 301 
 drivers/gpu/drm/kmb/kmb_plane.h |   8 ++
 2 files changed, 159 insertions(+), 150 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_plane.c b/drivers/gpu/drm/kmb/kmb_plane.c
index 5fd1837..a1d616a 100644
--- a/drivers/gpu/drm/kmb/kmb_plane.c
+++ b/drivers/gpu/drm/kmb/kmb_plane.c
@@ -83,11 +83,12 @@ static const u32 kmb_formats_v[] = {
 #define LCD_INT_GL1 (LAYER3_DMA_DONE | LAYER3_DMA_IDLE | LCD_INT_GL1_ERR)
 
 const uint32_t layer_irqs[] = {
-   LCD_INT_VL0,
-   LCD_INT_VL1,
-   LCD_INT_GL0,
-   LCD_INT_GL1
- };
+   LCD_INT_VL0,
+   LCD_INT_VL1,
+   LCD_INT_GL0,
+   LCD_INT_GL1
+};
+
 /*Conversion (yuv->rgb) matrix from myriadx */
 static const u32 csc_coef_lcd[] = {
1024, 0, 1436,
@@ -96,7 +97,6 @@ static const u32 csc_coef_lcd[] = {
-179, 125, -226
 };
 
-
 static unsigned int check_pixel_format(struct drm_plane *plane, u32 format)
 {
int i;
@@ -114,7 +114,6 @@ static int kmb_plane_atomic_check(struct drm_plane *plane,
struct drm_framebuffer *fb;
int ret;
 
-
fb = state->fb;
 
if (!fb || !state->crtc)
@@ -130,7 +129,7 @@ static int kmb_plane_atomic_check(struct drm_plane *plane,
 }
 
 static void kmb_plane_atomic_disable(struct drm_plane *plane,
-   struct drm_plane_state *state)
+struct drm_plane_state *state)
 {
struct kmb_plane *kmb_plane = to_kmb_plane(plane);
int ctrl = 0;
@@ -156,14 +155,13 @@ static void kmb_plane_atomic_disable(struct drm_plane 
*plane,
}
 
kmb_clr_bitmask_lcd(dev_p, LCD_LAYERn_DMA_CFG(plane_id),
-   LCD_DMA_LAYER_ENABLE);
+   LCD_DMA_LAYER_ENABLE);
kmb_clr_bitmask_lcd(dev_p, LCD_CONTROL, ctrl);
DRM_INFO("%s : %d lcd_ctrl = 0x%x lcd_int_enable=0x%x\n",
-   __func__, __LINE__, kmb_read_lcd(dev_p, LCD_CONTROL),
-   kmb_read_lcd(dev_p, LCD_INT_ENABLE));
+__func__, __LINE__, kmb_read_lcd(dev_p, LCD_CONTROL),
+kmb_read_lcd(dev_p, LCD_INT_ENABLE));
 }
 
-
 unsigned int set_pixel_format(u32 format)
 {
unsigned int val = 0;
@@ -198,8 +196,8 @@ unsigned int set_pixel_format(u32 format)
val = LCD_LAYER_FORMAT_NV12 | LCD_LAYER_PLANAR_STORAGE
| LCD_LAYER_CRCB_ORDER;
break;
-   /* packed formats */
-   /* looks hw requires B & G to be swapped when RGB */
+   /* packed formats */
+   /* looks hw requires B & G to be swapped when RGB */
case DRM_FORMAT_RGB332:
val = LCD_LAYER_FORMAT_RGB332 | LCD_LAYER_BGR_ORDER;
break;
@@ -263,7 +261,7 @@ unsigned int set_bits_per_pixel(const struct 
drm_format_info *format)
return val;
}
 
-   bpp += 8*format->cpp[0];
+   bpp += 8 * format->cpp[0];
 
switch (bpp) {
case 8:
@@ -310,7 +308,6 @@ static void kmb_plane_atomic_update(struct drm_plane *plane,
 #ifdef LCD_TEST
struct drm_framebuffer *fb;
struct kmb_drm_private *dev_p;
-   dma_addr_t addr;
unsigned int width;
unsigned int height;
unsigned int dma_len;
@@ -320,6 +317,9 @@ static void kmb_plane_atomic_update(struct drm_plane *plane,
unsigned int src_w, src_h, crtc_x, crtc_y;
unsigned char plane_id;
int num_planes;
+   /*plane initialization status */
+   static int plane_init_status[KMB_MAX_PLANES] = { 0, 0, 0, 0 };
+   static dma_addr_t addr[MAX_SUB_PLANES] = { 0, 0, 0 };
 
if (!plane || !plane->state || !state)
return;
@@ -339,146 +339,145 @@ static void kmb_plane_atomic_update(struct drm_plane 
*plane,
crtc_x = plane->state->crtc_x;
crtc_y = plane->state->crtc_y;
 
-   DRM_INFO("src_w=%d src_h=%d\n", src_w, src_h);
-   kmb_write_lcd(dev_p, LCD_LAYERn_WIDTH(plane_id), src_w-1);
-   kmb_write_lcd(dev_p, LCD_LAYERn_HEIGHT(plane_id), src_h-1);
-   kmb_write_lcd(dev_p, LCD_LAYERn_COL_START(plane_id), crtc_x);
-   kmb_write_lcd(dev_p, LCD_LAYERn_ROW_START(plane_id), crtc_y);
-
-   val = set_pixel_format(fb->format->format);
-   val |= set_bits_per_pixel(fb->format);
-   /*CHECKME Leon drvr sets it to 100 try this for now */
-   val |= LCD_LAYER_FIFO_100;
-   kmb_write_lcd(dev_p, L

[PATCH v2 16/59] drm/kmb: Part6 of Mipi Tx Initialization

2020-07-14 Thread Anitha Chrisanthus
This is part2 of DPHY initialization- sets up DPHY PLLs.

v2: simplified mipi_tx_get_vco_params() based on review
v3: added WARN_ON for invalid freq
v4: fixed bug in mipi_tx_get_vco_params

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 drivers/gpu/drm/kmb/kmb_dsi.c  | 194 +++--
 drivers/gpu/drm/kmb/kmb_regs.h |   2 +
 2 files changed, 189 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
index d15cf6f..02555c6 100644
--- a/drivers/gpu/drm/kmb/kmb_dsi.c
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -28,11 +28,33 @@
 #define MIPI_TX_CFG_CLK_KHZ 24000
 
 /*DPHY Tx test codes*/
-#define TEST_CODE_HS_FREQ_RANGE_CFG0x44
-#define TEST_CODE_PLL_ANALOG_PROG  0x1F
-#define TEST_CODE_SLEW_RATE_OVERRIDE_CTRL  0xA0
-#define TEST_CODE_SLEW_RATE_DDL_LOOP_CTRL  0xA3
-#define TEST_CODE_SLEW_RATE_DDL_CYCLES 0xA4
+#define TEST_CODE_PLL_PROPORTIONAL_CHARGE_PUMP_CTRL0x0E
+#define TEST_CODE_PLL_INTEGRAL_CHARGE_PUMP_CTRL0x0F
+#define TEST_CODE_PLL_VCO_CTRL 0x12
+#define TEST_CODE_PLL_GMP_CTRL 0x13
+#define TEST_CODE_PLL_PHASE_ERR_CTRL   0x14
+#define TEST_CODE_PLL_LOCK_FILTER  0x15
+#define TEST_CODE_PLL_UNLOCK_FILTER0x16
+#define TEST_CODE_PLL_INPUT_DIVIDER0x17
+#define TEST_CODE_PLL_FEEDBACK_DIVIDER 0x18
+#define   PLL_FEEDBACK_DIVIDER_HIGH(1 << 7)
+#define TEST_CODE_PLL_OUTPUT_CLK_SEL   0x19
+#define   PLL_N_OVR_EN (1 << 4)
+#define   PLL_M_OVR_EN (1 << 5)
+#define TEST_CODE_PLL_CHARGE_PUMP_BIAS 0x1C
+#define TEST_CODE_PLL_LOCK_DETECTOR0x1D
+#define TEST_CODE_HS_FREQ_RANGE_CFG0x44
+#define TEST_CODE_PLL_ANALOG_PROG  0x1F
+#define TEST_CODE_SLEW_RATE_OVERRIDE_CTRL  0xA0
+#define TEST_CODE_SLEW_RATE_DDL_LOOP_CTRL  0xA3
+#define TEST_CODE_SLEW_RATE_DDL_CYCLES 0xA4
+
+/* D-Phy params  */
+#define PLL_N_MIN  0
+#define PLL_N_MAX  15
+#define PLL_M_MIN  62
+#define PLL_M_MAX  623
+#define PLL_FVCO_MAX   1250
 
 /*
  * These are added here only temporarily for testing,
@@ -780,8 +802,158 @@ static inline void 
set_test_mode_src_osc_freq_target_hi_bits(u32 dphy_no,
test_mode_send(dphy_no, TEST_CODE_SLEW_RATE_DDL_CYCLES, data);
 }
 
+struct vco_params {
+   u32 freq;
+   u32 range;
+   u32 divider;
+};
+
+static struct vco_params vco_table[] = {
+   {52, 0x3f, 8},
+   {80, 0x39, 8},
+   {105, 0x2f, 4},
+   {160, 0x29, 4},
+   {210, 0x1f, 2},
+   {320, 0x19, 2},
+   {420, 0x0f, 1},
+   {630, 0x09, 1},
+   {1100, 0x03, 1},
+   {0x, 0x01, 1},
+};
+
+static void mipi_tx_get_vco_params(struct vco_params *vco)
+{
+   int i;
+
+   for (i = 0; i < ARRAY_SIZE(vco_table); i++) {
+   if (vco->freq < vco_table[i].freq) {
+   *vco = vco_table[i];
+   return;
+   }
+   }
+   WARN_ONCE(1, "Invalid vco freq = %u for PLL setup\n", vco->freq);
+}
+
+static void mipi_tx_pll_setup(u32 dphy_no, u32 ref_clk_mhz, u32 
target_freq_mhz)
+{
+   /* pll_ref_clk: - valid range: 2~64 MHz; Typically 24 MHz
+* Fvco: - valid range: 320~1250 MHz (Gen3 D-PHY)
+* Fout: - valid range: 40~1250 MHz (Gen3 D-PHY)
+* n: - valid range [0 15]
+* N: - N = n + 1
+*  -valid range: [1 16]
+*  -conditions: - (pll_ref_clk / N) >= 2 MHz
+*  -(pll_ref_clk / N) <= 8 MHz
+* m: valid range [62 623]
+* M: - M = m + 2
+*  -valid range [64 625]
+*  -Fvco = (M/N) * pll_ref_clk
+*/
+   struct vco_params vco_p = {
+   .range = 0,
+   .divider = 1,
+   };
+   u32 best_n = 0, best_m = 0;
+   u32 n = 0, m = 0, div = 0, delta, freq = 0, t_freq;
+   u32 best_freq_delta = 3000;
+
+   vco_p.freq = target_freq_mhz;
+   mipi_tx_get_vco_params(_p);
+   /*search pll n parameter */
+   for (n = PLL_N_MIN; n <= PLL_N_MAX; n++) {
+   /*calculate the pll input frequency division ratio
+* multiply by 1000 for precision -
+* no floating point, add n for rounding
+*/
+   div = ((ref_clk_mhz * 1000) + n)/(n+1);
+   /*found a valid n parameter */
+   if ((div < 2000 || div > 8000))
+   continue;
+   /*search pll m parameter */
+   for (m = PLL_M_MIN; m <= PLL_M_MAX; m++) {
+   /*calculate the Fvco(DPHY PLL output frequenc

[PATCH v2 02/59] drm/kmb: Added id to kmb_plane

2020-07-14 Thread Anitha Chrisanthus
This is to keep track of the id of the plane as there are 4 planes in
Kmb and when update() is called, we need to know which plane need to be
updated so that the corresponding plane's registers can be programmed.

v2: moved extern to .h, upclassed dev_private,
minor changes from code review.

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 drivers/gpu/drm/kmb/kmb_crtc.c  | 13 ---
 drivers/gpu/drm/kmb/kmb_crtc.h  |  2 +-
 drivers/gpu/drm/kmb/kmb_drv.h   |  2 +-
 drivers/gpu/drm/kmb/kmb_plane.c | 80 +++--
 drivers/gpu/drm/kmb/kmb_plane.h | 28 +--
 5 files changed, 79 insertions(+), 46 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_crtc.c b/drivers/gpu/drm/kmb/kmb_crtc.c
index 1a00015..63821ed 100644
--- a/drivers/gpu/drm/kmb/kmb_crtc.c
+++ b/drivers/gpu/drm/kmb/kmb_crtc.c
@@ -105,9 +105,8 @@ static void kmb_crtc_mode_set_nofb(struct drm_crtc *crtc)
kmb_write(lcd, LCD_VSYNC_START_EVEN, vsync_start_offset);
kmb_write(lcd, LCD_VSYNC_END_EVEN, vsync_end_offset);
}
-   /* enable all 4 layers */
-   ctrl = LCD_CTRL_ENABLE | LCD_CTRL_VL1_ENABLE
-   | LCD_CTRL_VL2_ENABLE | LCD_CTRL_GL1_ENABLE | LCD_CTRL_GL2_ENABLE;
+   /* enable VL1 layer as default */
+   ctrl = LCD_CTRL_ENABLE | LCD_CTRL_VL1_ENABLE;
ctrl |= LCD_CTRL_PROGRESSIVE | LCD_CTRL_TIM_GEN_ENABLE
| LCD_CTRL_OUTPUT_ENABLED;
kmb_write(lcd, LCD_CONTROL, ctrl);
@@ -175,17 +174,17 @@ static const struct drm_crtc_helper_funcs 
kmb_crtc_helper_funcs = {
 int kmb_setup_crtc(struct drm_device *drm)
 {
struct kmb_drm_private *lcd = to_kmb(drm);
-   struct drm_plane *primary;
+   struct kmb_plane *primary;
int ret;
 
primary = kmb_plane_init(drm);
if (IS_ERR(primary))
return PTR_ERR(primary);
 
-   ret = drm_crtc_init_with_planes(drm, >crtc, primary, NULL,
-   _crtc_funcs, NULL);
+   ret = drm_crtc_init_with_planes(drm, >crtc, >base_plane,
+   NULL, _crtc_funcs, NULL);
if (ret) {
-   kmb_plane_destroy(primary);
+   kmb_plane_destroy(>base_plane);
return ret;
}
 
diff --git a/drivers/gpu/drm/kmb/kmb_crtc.h b/drivers/gpu/drm/kmb/kmb_crtc.h
index d7cc441..6c3efdd 100644
--- a/drivers/gpu/drm/kmb/kmb_crtc.h
+++ b/drivers/gpu/drm/kmb/kmb_crtc.h
@@ -35,5 +35,5 @@ struct kmb_crtc_state {
 #define to_kmb_crtc_state(x) container_of(x, struct kmb_crtc_state, crtc_base)
 #define to_kmb_crtc(x) container_of(x, struct kmb_crtc, crtc_base)
 extern void kmb_plane_destroy(struct drm_plane *plane);
-extern struct drm_plane *kmb_plane_init(struct drm_device *drm);
+extern struct kmb_plane *kmb_plane_init(struct drm_device *drm);
 #endif /* __KMB_CRTC_H__ */
diff --git a/drivers/gpu/drm/kmb/kmb_drv.h b/drivers/gpu/drm/kmb/kmb_drv.h
index 90e1c86..23299a5 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.h
+++ b/drivers/gpu/drm/kmb/kmb_drv.h
@@ -16,7 +16,7 @@ struct kmb_drm_private {
struct clk *clk;
struct drm_fbdev_cma *fbdev;
struct drm_crtc crtc;
-   struct drm_plane *plane;
+   struct kmb_plane *plane;
struct drm_atomic_state *state;
 };
 
diff --git a/drivers/gpu/drm/kmb/kmb_plane.c b/drivers/gpu/drm/kmb/kmb_plane.c
index 9d4c8dc..7077a4c 100644
--- a/drivers/gpu/drm/kmb/kmb_plane.c
+++ b/drivers/gpu/drm/kmb/kmb_plane.c
@@ -41,46 +41,69 @@ static void kmb_plane_atomic_update(struct drm_plane *plane,
dma_addr_t addr;
unsigned int width;
unsigned int height;
-   unsigned int i;
unsigned int dma_len;
-   struct kmb_plane_state *kmb_state = to_kmb_plane_state(plane->state);
+   struct kmb_plane *kmb_plane = to_kmb_plane(plane);
unsigned int dma_cfg;
+   unsigned int ctrl = 0;
+   unsigned char plane_id = kmb_plane->id;
 
if (!fb)
return;
 
lcd = to_kmb(plane->dev);
 
+   switch (plane_id) {
+   case LAYER_0:
+   ctrl = LCD_CTRL_VL1_ENABLE;
+   break;
+   case LAYER_1:
+   ctrl = LCD_CTRL_VL2_ENABLE;
+   break;
+   case LAYER_2:
+   ctrl = LCD_CTRL_GL1_ENABLE;
+   break;
+   case LAYER_3:
+   ctrl = LCD_CTRL_GL2_ENABLE;
+   break;
+   }
+
+   ctrl |= LCD_CTRL_ENABLE;
+   ctrl |= LCD_CTRL_PROGRESSIVE | LCD_CTRL_TIM_GEN_ENABLE
+   | LCD_CTRL_OUTPUT_ENABLED;
+   kmb_write(lcd, LCD_CONTROL, ctrl);
+
/* TBD */
/*set LCD_LAYERn_WIDTH, LCD_LAYERn_HEIGHT, LCD_LAYERn_COL_START,
 * LCD_LAYERn_ROW_START, LCD_LAYERn_CFG
 * CFG should set the pixel format, FIFO level and BPP
 */
 
+   /*TBD check visible? */
+
/* we may have to set LCD_DMA_VSTRIDE_ENABLE in the future */
dma_cfg =

[PATCH v2 26/59] drm/kmb: rebase to newer kernel version

2020-07-14 Thread Anitha Chrisanthus
cleanup code

Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_drv.c | 5 +++--
 drivers/gpu/drm/kmb/kmb_drv.h | 1 -
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index 71fdb94..78cb91b 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -282,8 +282,7 @@ DEFINE_DRM_GEM_CMA_FOPS(fops);
 
 static struct drm_driver kmb_driver = {
.driver_features = DRIVER_GEM |
-   DRIVER_MODESET |
-   DRIVER_ATOMIC,
+   DRIVER_MODESET | DRIVER_ATOMIC,
.irq_handler = kmb_isr,
.irq_preinstall = kmb_irq_reset,
.irq_uninstall = kmb_irq_reset,
@@ -362,6 +361,8 @@ static int kmb_drm_bind(struct device *dev)
if (ret)
goto err_register;
 
+   drm_fbdev_generic_setup(drm, 32);
+
return 0;
 
 err_register:
diff --git a/drivers/gpu/drm/kmb/kmb_drv.h b/drivers/gpu/drm/kmb/kmb_drv.h
index 586b53e..1150505 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.h
+++ b/drivers/gpu/drm/kmb/kmb_drv.h
@@ -18,7 +18,6 @@ struct kmb_drm_private {
void __iomem*msscam_mmio;
unsigned char   n_layers;
struct clk  *clk;
-   struct drm_fbdev_cma*fbdev;
struct drm_crtc crtc;
struct kmb_plane*plane;
struct drm_atomic_state *state;
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v2 57/59] drm/kmb: workaround for dma undeflow issue

2020-07-14 Thread Anitha Chrisanthus
Initial issue was that display remains shifted after undeflow, this fix is
to recover the dma after underflow so display is clean. Major changes are
reduce LCD_CLK to 200Mhz and some changes in the lcd timing params
run recovery sequence at the EOF after underflow happens
do nothing in plan_update() during recovery
reenable dma at the vsync interrupt after recovery is done

v2: renamed global vars, upclassed dev_private.

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 drivers/gpu/drm/kmb/kmb_crtc.c  |  27 +++
 drivers/gpu/drm/kmb/kmb_drv.c   | 154 +++-
 drivers/gpu/drm/kmb/kmb_drv.h   |  33 +
 drivers/gpu/drm/kmb/kmb_plane.c |  12 +++-
 drivers/gpu/drm/kmb/kmb_plane.h |  29 
 drivers/gpu/drm/kmb/kmb_regs.h  |   5 ++
 6 files changed, 185 insertions(+), 75 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_crtc.c b/drivers/gpu/drm/kmb/kmb_crtc.c
index aceca94..8308a9e1 100644
--- a/drivers/gpu/drm/kmb/kmb_crtc.c
+++ b/drivers/gpu/drm/kmb/kmb_crtc.c
@@ -96,25 +96,25 @@ static void kmb_crtc_mode_set_nofb(struct drm_crtc *crtc)
vm.vfront_porch = 2;
 //  vm.vback_porch = m->crtc_vtotal - m->crtc_vsync_end;
vm.vback_porch = 2;
-//  vm.vsync_len = m->crtc_vsync_end - m->crtc_vsync_start;
-   vm.vsync_len = 1;
+// vm.vsync_len = m->crtc_vsync_end - m->crtc_vsync_start;
+   vm.vsync_len = 8;
//vm.hfront_porch = m->crtc_hsync_start - m->crtc_hdisplay;
vm.hfront_porch = 0;
vm.hback_porch = 0;
//vm.hback_porch = m->crtc_htotal - m->crtc_hsync_end;
-   vm.hsync_len = 7;
-//  vm.hsync_len = m->crtc_hsync_end - m->crtc_hsync_start;
+   vm.hsync_len = 28;
+// vm.hsync_len = m->crtc_hsync_end - m->crtc_hsync_start;
 
-   vsync_start_offset = m->crtc_vsync_start - m->crtc_hsync_start;
-   vsync_end_offset = m->crtc_vsync_end - m->crtc_hsync_end;
+   vsync_start_offset =  m->crtc_vsync_start -  m->crtc_hsync_start;
+   vsync_end_offset =  m->crtc_vsync_end - m->crtc_hsync_end;
 
-   DRM_DEBUG
-   ("%s : %dactive height= %d vbp=%d vfp=%d vsync-w=%d h-active=%d 
h-bp=%d h-fp=%d hysnc-l=%d",
-__func__, __LINE__, m->crtc_vdisplay, vm.vback_porch,
-vm.vfront_porch, vm.vsync_len, m->crtc_hdisplay, vm.hback_porch,
-vm.hfront_porch, vm.hsync_len);
+   DRM_DEBUG("%s : %dactive height= %d vbp=%d vfp=%d vsync-w=%d 
h-active=%d h-bp=%d h-fp=%d hysnc-l=%d",
+   __func__, __LINE__,
+   m->crtc_vdisplay, vm.vback_porch, vm.vfront_porch,
+   vm.vsync_len, m->crtc_hdisplay, vm.hback_porch,
+   vm.hfront_porch, vm.hsync_len);
kmb_write_lcd(dev_p, LCD_V_ACTIVEHEIGHT,
- m->crtc_vdisplay - 1);
+   m->crtc_vdisplay - 1);
kmb_write_lcd(dev_p, LCD_V_BACKPORCH, vm.vback_porch);
kmb_write_lcd(dev_p, LCD_V_FRONTPORCH, vm.vfront_porch);
kmb_write_lcd(dev_p, LCD_VSYNC_WIDTH, vm.vsync_len - 1);
@@ -126,7 +126,8 @@ static void kmb_crtc_mode_set_nofb(struct drm_crtc *crtc)
/*this is hardcoded as 0 in the Myriadx code */
kmb_write_lcd(dev_p, LCD_VSYNC_START, 0);
kmb_write_lcd(dev_p, LCD_VSYNC_END, 0);
-
+   /* back ground color */
+   kmb_write_lcd(dev_p, LCD_BG_COLOUR_LS, 0x4);
if (m->flags == DRM_MODE_FLAG_INTERLACE) {
kmb_write_lcd(dev_p,
  LCD_VSYNC_WIDTH_EVEN, vm.vsync_len - 1);
diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index b844c77..559742b8 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -31,10 +31,10 @@
 #include "kmb_regs.h"
 
 //#define DEBUG
-
 /* IRQ handler */
 static irqreturn_t kmb_isr(int irq, void *arg);
 
+int kmb_under_flow = 0, kmb_flush_done = 0, layer_no = 0;
 static struct clk *clk_lcd;
 static struct clk *clk_mipi;
 static struct clk *clk_mipi_ecfg;
@@ -111,6 +111,7 @@ static void __iomem *kmb_map_mmio(struct platform_device 
*pdev, char *name)
return mem;
 }
 
+//#define ICAM_LCD_QOS
 static int kmb_load(struct drm_device *drm, unsigned long flags)
 {
struct kmb_drm_private *dev_p = to_kmb(drm);
@@ -118,6 +119,9 @@ static int kmb_load(struct drm_device *drm, unsigned long 
flags)
int irq_lcd;
int ret = 0;
unsigned long clk;
+#ifdef ICAM_LCD_QOS
+   int val = 0;
+#endif
 
/* Map MIPI MMIO registers */
dev_p->mipi_mmio = kmb_map_mmio(pdev, "mipi_regs");
@@ -151,6 +155,13 @@ static int kmb_load(struct drm_device *drm, unsigned long 
flags)
iounmap(dev_p->mipi_mmio);
return -ENOMEM;
}
+#ifdef ICAM_LCD_QOS
+   dev_p->icamlcd_mmio = ioremap_nocache(ICAM_MMIO, ICAM_MMIO_SIZE)

[PATCH v2 21/59] drm/kmb: IRQ handlers for LCD and mipi dsi

2020-07-14 Thread Anitha Chrisanthus
Added handlers for lcd and mipi, it only finds and clears the interrupt
as of now, more functionality can be added as needed.

v2: upclassed dev_private

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 drivers/gpu/drm/kmb/kmb_drv.c  | 55 +++---
 drivers/gpu/drm/kmb/kmb_drv.h  |  2 ++
 drivers/gpu/drm/kmb/kmb_dsi.c  | 37 ++--
 drivers/gpu/drm/kmb/kmb_dsi.h  |  1 +
 drivers/gpu/drm/kmb/kmb_regs.h | 35 ---
 5 files changed, 110 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index 594e64c..f4553c2 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -38,7 +38,7 @@ static int kmb_load(struct drm_device *drm, unsigned long 
flags)
struct platform_device *pdev = to_platform_device(drm->dev);
/*struct resource *res;*/
/*u32 version;*/
-   /*int irq_lcd, irq_mipi; */
+   int irq_lcd, irq_mipi;
int ret;
 
/* TBD - not sure if clock_get needs to be called here */
@@ -89,11 +89,29 @@ static int kmb_load(struct drm_device *drm, unsigned long 
flags)
dev_p->msscam_mmio = ioremap_cache(MSS_CAM_BASE_ADDR,
MSS_CAM_MMIO_SIZE);
 
-   /*TODO - register irqs here - section 17.3 in databook
-* lists LCD at 79 under MSS CPU - firmware has to redirect it to A53
-* May be 33 for LCD and 34 for MIPI? Will wait till firmware
-* finalizes the IRQ numbers for redirection
+   /* register irqs here - section 17.3 in databook
+* lists LCD at 79 and 82 for MIPI under MSS CPU -
+* firmware has to redirect it to A53
 */
+   irq_lcd = platform_get_irq_byname(pdev, "irq_lcd");
+   if (irq_lcd < 0) {
+   DRM_ERROR("irq_lcd not found");
+   return irq_lcd;
+   }
+   pr_info("irq_lcd platform_get_irq = %d\n", irq_lcd);
+   ret = request_irq(irq_lcd, kmb_isr, IRQF_SHARED, "irq_lcd", dev_p);
+   dev_p->irq_lcd = irq_lcd;
+
+   irq_mipi = platform_get_irq_byname(pdev, "irq_mipi");
+   if (irq_mipi < 0) {
+   DRM_ERROR("irq_mipi not found");
+   return irq_mipi;
+   }
+   pr_info("irq_mipi platform_get_irq = %d\n", irq_mipi);
+   ret = request_irq(irq_mipi, kmb_isr, IRQF_SHARED, "irq_mipi", dev_p);
+   dev_p->irq_mipi = irq_mipi;
+
+
 
 /*TBD read and check for correct product version here */
 
@@ -142,9 +160,9 @@ static void kmb_setup_mode_config(struct drm_device *drm)
drm->mode_config.funcs = _mode_config_funcs;
 }
 
-static irqreturn_t kmb_isr(int irq, void *arg)
+
+static irqreturn_t handle_lcd_irq(struct drm_device *dev)
 {
-   struct drm_device *dev = (struct drm_device *)arg;
unsigned long status, val;
struct kmb_drm_private *dev_p = to_kmb(dev);
 
@@ -174,14 +192,33 @@ static irqreturn_t kmb_isr(int irq, void *arg)
break;
}
}
+   return IRQ_HANDLED;
+}
 
+static irqreturn_t  handle_mipi_irq(struct drm_device *dev)
+{
+   mipi_tx_handle_irqs(to_kmb(dev));
return IRQ_HANDLED;
 }
 
+static irqreturn_t kmb_isr(int irq, void *arg)
+{
+   struct drm_device *dev = (struct drm_device *)arg;
+   struct kmb_drm_private *dev_p = to_kmb(dev);
+   irqreturn_t ret = IRQ_NONE;
+
+   if (irq == dev_p->irq_lcd)
+   ret = handle_lcd_irq(dev);
+   else if (irq == dev_p->irq_mipi)
+   ret = handle_mipi_irq(dev);
+
+   return ret;
+}
+
 static void kmb_irq_reset(struct drm_device *drm)
 {
-   kmb_write_lcd(drm->dev_private, LCD_INT_CLEAR, 0x);
-   kmb_write_lcd(drm->dev_private, LCD_INT_ENABLE, 0);
+   kmb_write_lcd(to_kmb(drm), LCD_INT_CLEAR, 0x);
+   kmb_write_lcd(to_kmb(drm), LCD_INT_ENABLE, 0);
 }
 
 DEFINE_DRM_GEM_CMA_FOPS(fops);
diff --git a/drivers/gpu/drm/kmb/kmb_drv.h b/drivers/gpu/drm/kmb/kmb_drv.h
index a56d548..1e81d44 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.h
+++ b/drivers/gpu/drm/kmb/kmb_drv.h
@@ -23,6 +23,8 @@ struct kmb_drm_private {
struct kmb_plane*plane;
struct drm_atomic_state *state;
spinlock_t  irq_lock;
+   int irq_lcd;
+   int irq_mipi;
 };
 
 static inline struct kmb_drm_private *to_kmb(const struct drm_device *dev)
diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
index 94c9adc..969890b 100644
--- a/drivers/gpu/drm/kmb/kmb_dsi.c
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -1214,7 +1214,7 @@ static void mipi_tx_init_irqs(struct kmb_drm_private 
*dev_p,
SET_MIPI_TX_HS_IRQ_CLEAR(dev_p, MIPI_CTRL6, MIPI_TX_HS_IRQ_ALL);
/*global interrupts */
SET_MIPI_CTRL

[PATCH v2 37/59] drm/kmb: Set MSS_CAM_RSTN_CTRL along with enable

2020-07-14 Thread Anitha Chrisanthus
Also moved num_planes init before load, time out for dsi
fixed kmb regs read/write to only pass dev_p and few other minor
changes.

Signed-off-by: Anitha Chrisanthus 
---
 drivers/gpu/drm/kmb/kmb_drv.c   | 32 ++--
 drivers/gpu/drm/kmb/kmb_drv.h   | 34 +-
 drivers/gpu/drm/kmb/kmb_dsi.c   | 37 -
 drivers/gpu/drm/kmb/kmb_plane.c | 27 +--
 drivers/gpu/drm/kmb/kmb_regs.h  |  1 +
 5 files changed, 77 insertions(+), 54 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index 861aa97..64db9a1 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -58,11 +58,12 @@ static int kmb_display_clk_enable(void)
return ret;
}
 
-   ret = clk_prepare_enable(clk_msscam);
+/* ret = clk_prepare_enable(clk_msscam);
if (ret) {
DRM_ERROR("Failed to enable MSSCAM clock: %d\n", ret);
return ret;
}
+   */
 
ret = clk_prepare_enable(clk_mipi_ecfg);
if (ret) {
@@ -116,6 +117,8 @@ static void __iomem *kmb_map_mmio(struct platform_device 
*pdev, char *name)
release_mem_region(res->start, size);
return ERR_PTR(-ENOMEM);
}
+   DRM_INFO("%s : %d mapped %s mmio size = %d\n", __func__, __LINE__,
+   name, size);
return mem;
 }
 
@@ -130,13 +133,6 @@ static int kmb_load(struct drm_device *drm, unsigned long 
flags)
int ret = 0;
unsigned long clk;
 
-   /* Map LCD MMIO registers */
-   dev_p->lcd_mmio = kmb_map_mmio(pdev, "lcd_regs");
-   if (IS_ERR(dev_p->lcd_mmio)) {
-   DRM_ERROR("failed to map LCD registers\n");
-   return -ENOMEM;
-   }
-
/* Map MIPI MMIO registers */
dev_p->mipi_mmio = kmb_map_mmio(pdev, "mipi_regs");
if (IS_ERR(dev_p->mipi_mmio)) {
@@ -145,6 +141,13 @@ static int kmb_load(struct drm_device *drm, unsigned long 
flags)
return -ENOMEM;
}
 
+   /* Map LCD MMIO registers */
+   dev_p->lcd_mmio = kmb_map_mmio(pdev, "lcd_regs");
+   if (IS_ERR(dev_p->lcd_mmio)) {
+   DRM_ERROR("failed to map LCD registers\n");
+   return -ENOMEM;
+   }
+
/* This is only for MIPI_TX_MSS_LCD_MIPI_CFG and MSS_CAM_CLK_CTRL
 * register
 */
@@ -169,12 +172,6 @@ static int kmb_load(struct drm_device *drm, unsigned long 
flags)
goto setup_fail;
}
 
-   clk_msscam = clk_get(>dev, "clk_msscam");
-   if (IS_ERR(clk_msscam)) {
-   DRM_ERROR("clk_get() failed clk_msscam\n");
-   goto setup_fail;
-   }
-
clk_mipi_ecfg = clk_get(>dev, "clk_mipi_ecfg");
if (IS_ERR(clk_mipi_ecfg)) {
DRM_ERROR("clk_get() failed clk_mipi_ecfg\n");
@@ -195,7 +192,6 @@ static int kmb_load(struct drm_device *drm, unsigned long 
flags)
if (clk_get_rate(clk_lcd) != KMB_LCD_DEFAULT_CLK) {
DRM_ERROR("failed to set to clk_lcd to %d\n",
KMB_LCD_DEFAULT_CLK);
-   goto setup_fail;
}
DRM_INFO("Setting LCD clock to %d Mhz ret = %d\n",
KMB_LCD_DEFAULT_CLK/100, ret);
@@ -245,8 +241,8 @@ static int kmb_load(struct drm_device *drm, unsigned long 
flags)
}
 
/* enable MSS_CAM_CLK_CTRL for MIPI TX and LCD */
-   kmb_set_bitmask_msscam(dev_p, MSS_CAM_CLK_CTRL, LCD | MIPI_COMMON |
-   MIPI_TX0);
+   kmb_set_bitmask_msscam(dev_p, MSS_CAM_CLK_CTRL, 0xfff);
+   kmb_set_bitmask_msscam(dev_p, MSS_CAM_RSTN_CTRL, 0xfff);
 #ifdef WIP
/* Register irqs here - section 17.3 in databook
 * lists LCD at 79 and 82 for MIPI under MSS CPU -
@@ -514,6 +510,7 @@ static int kmb_probe(struct platform_device *pdev)
dev_set_drvdata(dev, drm);
 
/* Load driver */
+   lcd->n_layers = KMB_MAX_PLANES;
ret = kmb_load(drm, 0);
if (ret == -EPROBE_DEFER) {
DRM_INFO("wait for external bridge driver DT\n");
@@ -536,7 +533,6 @@ static int kmb_probe(struct platform_device *pdev)
/* Register graphics device with the kernel */
ret = drm_dev_register(drm, 0);
 
-   lcd->n_layers = KMB_MAX_PLANES;
if (ret)
goto err_register;
 
diff --git a/drivers/gpu/drm/kmb/kmb_drv.h b/drivers/gpu/drm/kmb/kmb_drv.h
index 71dc883..f3f2c34 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.h
+++ b/drivers/gpu/drm/kmb/kmb_drv.h
@@ -8,9 +8,9 @@
 
 #include "kmb_regs.h"
 
-#define KMB_MAX_WIDTH  16384   /*max width in pixels */
-#define KMB_MAX_HEIGHT 16384   /*max height 

[PATCH v2 38/59] drm/kmb: Mipi DPHY initialization changes

2020-07-14 Thread Anitha Chrisanthus
Fix test_mode_send and dphy_wait_fsm for 2-lane MIPI

- Fix test_mode_send when sending normal mode test codes
- Change dphy_wait_fsm to check for IDLE status rather than LOCK
  status for 2-lane MIPI

v2: upclassed dev_private

Signed-off-by: Anitha Chrisanthus 
Signed-off-by: Edmund Dea 
---
 drivers/gpu/drm/kmb/kmb_crtc.c  |  23 +-
 drivers/gpu/drm/kmb/kmb_drv.c   |  90 ++--
 drivers/gpu/drm/kmb/kmb_drv.h   |  23 +-
 drivers/gpu/drm/kmb/kmb_dsi.c   | 904 +---
 drivers/gpu/drm/kmb/kmb_dsi.h   |   2 +-
 drivers/gpu/drm/kmb/kmb_plane.c |  57 ++-
 drivers/gpu/drm/kmb/kmb_regs.h  |  34 +-
 7 files changed, 838 insertions(+), 295 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_crtc.c b/drivers/gpu/drm/kmb/kmb_crtc.c
index eca0f3a..21b2d7f 100644
--- a/drivers/gpu/drm/kmb/kmb_crtc.c
+++ b/drivers/gpu/drm/kmb/kmb_crtc.c
@@ -20,6 +20,7 @@
 #include "kmb_drv.h"
 #include "kmb_plane.h"
 #include "kmb_regs.h"
+#include "kmb_dsi.h"
 
 static void kmb_crtc_cleanup(struct drm_crtc *crtc)
 {
@@ -74,24 +75,34 @@ static const struct drm_crtc_funcs kmb_crtc_funcs = {
 
 static void kmb_crtc_mode_set_nofb(struct drm_crtc *crtc)
 {
-   struct drm_display_mode *m = >state->adjusted_mode;
struct drm_device *dev = crtc->dev;
+#ifdef LCD_TEST
+   struct drm_display_mode *m = >state->adjusted_mode;
struct videomode vm;
int vsync_start_offset;
int vsync_end_offset;
unsigned int ctrl = 0;
struct kmb_drm_private *dev_p = to_kmb(dev);
-
+#endif
+   /* initialize mipi */
+   kmb_dsi_hw_init(dev);
+#ifdef LCD_TEST
vm.vfront_porch = m->crtc_vsync_start - m->crtc_vdisplay;
vm.vback_porch = m->crtc_vtotal - m->crtc_vsync_end;
vm.vsync_len = m->crtc_vsync_end - m->crtc_vsync_start;
-   vm.hfront_porch = m->crtc_hsync_start - m->crtc_hdisplay;
+   //vm.hfront_porch = m->crtc_hsync_start - m->crtc_hdisplay;
+   vm.hfront_porch = 0;
vm.hback_porch = m->crtc_htotal - m->crtc_hsync_end;
vm.hsync_len = m->crtc_hsync_end - m->crtc_hsync_start;
 
vsync_start_offset = m->crtc_vsync_start - m->crtc_hsync_start;
vsync_end_offset = m->crtc_vsync_end - m->crtc_hsync_end;
 
+   DRM_INFO("%s : %dactive height= %d vbp=%d vfp=%d vsync-w=%d h-active=%d 
h-bp=%d h-fp=%d hysnc-l=%d\n",
+   __func__, __LINE__, m->crtc_vdisplay,
+   vm.vback_porch, vm.vfront_porch,
+   vm.vsync_len, m->crtc_hdisplay,
+   vm.hback_porch, vm.hfront_porch, vm.hsync_len);
kmb_write_lcd(dev_p, LCD_V_ACTIVEHEIGHT,
m->crtc_vdisplay - 1);
kmb_write_lcd(dev_p, LCD_V_BACKPORCH, vm.vback_porch - 1);
@@ -126,7 +137,7 @@ static void kmb_crtc_mode_set_nofb(struct drm_crtc *crtc)
kmb_write_lcd(dev_p, LCD_CONTROL, ctrl);
 
kmb_write_lcd(dev_p, LCD_TIMING_GEN_TRIG, ENABLE);
-
+#endif
/* TBD */
/* set clocks here */
 }
@@ -138,7 +149,7 @@ static void kmb_crtc_atomic_enable(struct drm_crtc *crtc,
 
clk_prepare_enable(lcd->clk);
kmb_crtc_mode_set_nofb(crtc);
-   drm_crtc_vblank_on(crtc);
+// drm_crtc_vblank_on(crtc);
 }
 
 static void kmb_crtc_atomic_disable(struct drm_crtc *crtc,
@@ -149,7 +160,7 @@ static void kmb_crtc_atomic_disable(struct drm_crtc *crtc,
/* always disable planes on the CRTC that is being turned off */
drm_atomic_helper_disable_planes_on_crtc(old_state, false);
 
-   drm_crtc_vblank_off(crtc);
+// drm_crtc_vblank_off(crtc);
clk_disable_unprepare(lcd->clk);
 }
 
diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index 64db9a1..2a93b13 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -13,6 +13,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -37,27 +38,27 @@ static irqreturn_t kmb_isr(int irq, void *arg);
 static struct clk *clk_lcd;
 static struct clk *clk_mipi;
 static struct clk *clk_msscam;
+static struct clk *clk_pll0out0;
 static struct clk *clk_mipi_ecfg;
 static struct clk *clk_mipi_cfg;
 
 struct drm_bridge *adv_bridge;
 
-static int kmb_display_clk_enable(void)
+int kmb_display_clk_enable(void)
 {
int ret = 0;
-
+#ifdef LCD_TEST
ret = clk_prepare_enable(clk_lcd);
if (ret) {
DRM_ERROR("Failed to enable LCD clock: %d\n", ret);
return ret;
}
-
+#endif
ret = clk_prepare_enable(clk_mipi);
if (ret) {
DRM_ERROR("Failed to enable MIPI clock: %d\n", ret);
return ret;
}
-
 /* ret = clk_prepare_enable(clk_msscam);
if (ret) {
DRM_ERROR("Failed to enable MSSCAM clock: %d\n", ret);
@@ -158,19 +159,47 

[PATCH v2 24/59] drm/kmb: Add ADV7535 bridge

2020-07-14 Thread Anitha Chrisanthus
Find ADV 7535 from the device tree and get the bridge driver and attach
it to the DRM and the MIPI encoder.

v2: check for valid encoder node

Signed-off-by: Anitha Chrisanthus 
Reviewed-by: Bob Paauwe 
---
 drivers/gpu/drm/kmb/kmb_drv.c | 27 ++-
 drivers/gpu/drm/kmb/kmb_dsi.c | 26 +-
 drivers/gpu/drm/kmb/kmb_dsi.h |  3 ++-
 3 files changed, 49 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index f4553c2..5a2ff9d 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -36,10 +36,12 @@ static int kmb_load(struct drm_device *drm, unsigned long 
flags)
 {
struct kmb_drm_private *dev_p = to_kmb(drm);
struct platform_device *pdev = to_platform_device(drm->dev);
+   struct drm_bridge *bridge;
/*struct resource *res;*/
/*u32 version;*/
int irq_lcd, irq_mipi;
int ret;
+   struct device_node *encoder_node;
 
/* TBD - not sure if clock_get needs to be called here */
/*
@@ -127,7 +129,30 @@ static int kmb_load(struct drm_device *drm, unsigned long 
flags)
goto setup_fail;
}
 
-   kmb_dsi_init(drm);
+   /* find ADV7535 node and initialize it */
+   encoder_node = of_parse_phandle(drm->dev->of_node, "encoder-slave", 0);
+   if (!encoder_node) {
+   DRM_ERROR("failed to get bridge info from DT\n");
+   ret = -EPROBE_DEFER;
+   goto setup_fail;
+   }
+
+   /* Locate drm bridge from the hdmi encoder DT node */
+   bridge = of_drm_find_bridge(encoder_node);
+   if (!bridge) {
+   DRM_ERROR("failed to get bridge driver from DT\n");
+   ret = -EPROBE_DEFER;
+   goto setup_fail;
+   }
+
+   of_node_put(encoder_node);
+
+   ret = kmb_dsi_init(drm, bridge);
+   if (ret) {
+   DRM_ERROR("failed to initialize DSI\n");
+   goto setup_fail;
+   }
+
ret = drm_irq_install(drm, platform_get_irq(pdev, 0));
if (ret < 0) {
DRM_ERROR("failed to install IRQ handler\n");
diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c
index 969890b..09d5805 100644
--- a/drivers/gpu/drm/kmb/kmb_dsi.c
+++ b/drivers/gpu/drm/kmb/kmb_dsi.c
@@ -7,6 +7,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -1240,7 +1241,6 @@ static void mipi_tx_init_irqs(struct kmb_drm_private 
*dev_p,
spin_unlock_irqrestore(_p->irq_lock, irqflags);
 }
 
-
 void mipi_tx_handle_irqs(struct kmb_drm_private *dev_p)
 {
uint32_t irq_ctrl_stat_0, hs_stat, hs_enable;
@@ -1273,7 +1273,7 @@ void mipi_tx_handle_irqs(struct kmb_drm_private *dev_p)
 
 }
 
-void kmb_dsi_init(struct drm_device *dev)
+int kmb_dsi_init(struct drm_device *dev, struct drm_bridge *bridge)
 {
struct kmb_dsi *kmb_dsi;
struct drm_encoder *encoder;
@@ -1281,21 +1281,27 @@ void kmb_dsi_init(struct drm_device *dev)
struct drm_connector *connector;
struct kmb_dsi_host *host;
struct kmb_drm_private *dev_p = dev->dev_private;
+   int ret = 0;
 
kmb_dsi = kzalloc(sizeof(*kmb_dsi), GFP_KERNEL);
-   if (!kmb_dsi)
-   return;
+   if (!kmb_dsi) {
+   DRM_ERROR("failed to allocate kmb_dsi\n");
+   return -ENOMEM;
+   }
 
kmb_connector = kzalloc(sizeof(*kmb_connector), GFP_KERNEL);
if (!kmb_connector) {
kfree(kmb_dsi);
-   return;
+   DRM_ERROR("failed to allocate kmb_connector\n");
+   return -ENOMEM;
}
 
kmb_dsi->attached_connector = kmb_connector;
 
connector = _connector->base;
encoder = _dsi->base;
+   encoder->possible_crtcs = 1;
+   encoder->possible_clones = 0;
drm_encoder_init(dev, encoder, _dsi_funcs, DRM_MODE_ENCODER_DSI,
 "MIPI-DSI");
 
@@ -1313,6 +1319,14 @@ void kmb_dsi_init(struct drm_device *dev)
connector->encoder = encoder;
drm_connector_attach_encoder(connector, encoder);
 
+   /* Link drm_bridge to encoder */
+   ret = drm_bridge_attach(encoder, bridge, NULL, 0);
+   if (ret) {
+   DRM_ERROR("failed to attach bridge to MIPI\n");
+   drm_encoder_cleanup(encoder);
+   return ret;
+   }
+
/* initialize mipi controller */
mipi_tx_init_cntrl(dev_p, _tx_init_cfg);
 
@@ -1321,4 +1335,6 @@ void kmb_dsi_init(struct drm_device *dev)
 
/* irq initialization */
mipi_tx_init_irqs(dev_p, _cfg, _tx_init_cfg.tx_ctrl_cfg);
+
+   return 0;
 }
diff --git a/drivers/gpu/drm/kmb/kmb_dsi.h b/drivers/gpu/drm/kmb/kmb_dsi.h
index f7e2f9e..702ad58 100644
--- a/drivers/gpu/drm/kmb/kmb_dsi.h
+++ b/

  1   2   3   >