[PATCH 2/2] drm/komeda: add Crossbar support

2019-12-12 Thread Tiannan Zhu (Arm Technology China)
Active D77's Crossbar

Crossbar(CBU) is a new component added in D77, which is used for zorder
control.
At a time (per display frame) up to 5 inputs of the CBU can be enabled

Signed-off-by: Tiannan Zhu (Arm Technology China) 
---
 .../arm/display/komeda/d71/d71_component.c| 61 +++
 .../drm/arm/display/komeda/komeda_pipeline.c  | 10 +++
 .../drm/arm/display/komeda/komeda_pipeline.h  |  7 +++
 .../display/komeda/komeda_pipeline_state.c| 36 +++
 .../arm/display/komeda/komeda_private_obj.c   | 49 +++
 5 files changed, 163 insertions(+)

diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c 
b/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
index ec96b69a5ade..3f2fee43867e 100644
--- a/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
+++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
@@ -44,6 +44,9 @@ static void get_resources_id(u32 hw_id, u32 *pipe_id, u32 
*comp_id)
case D71_BLK_TYPE_DOU:
id = KOMEDA_COMPONENT_TIMING_CTRLR;
break;
+   case D77_BLK_TYPE_CBU:
+   id += KOMEDA_COMPONENT_CROSSBAR0;
+   break;
default:
id = 0x;
}
@@ -969,6 +972,63 @@ static int d71_splitter_init(struct d71_dev *d71,
return 0;
 }
 
+static void d77_crossbar_update(struct komeda_component *c,
+   struct komeda_component_state *state)
+{
+   u32 __iomem *reg;
+   u32 index, input_hw_id;
+
+   for_each_changed_input(state, index) {
+   reg = c->reg + index;
+   input_hw_id = to_d71_input_id(state, index);
+   if (state->active_inputs & BIT(index)) {
+   malidp_write32(reg, BLK_INPUT_ID0, input_hw_id);
+   malidp_write32(reg, BLK_CONTROL, CBU_INPUT_CTRL_EN);
+   } else {
+   malidp_write32(reg, BLK_INPUT_ID0, 0);
+   malidp_write32(reg, BLK_CONTROL, 0);
+   }
+   }
+}
+
+static void d77_crossbar_disable(struct komeda_component *c)
+{
+   u32 __iomem *reg = c->reg;
+   u32 i;
+
+   for (i = 0; i < c->max_active_inputs; i++) {
+   malidp_write32(reg, BLK_CONTROL + (i << 2), 0);
+   malidp_write32(reg, BLK_INPUT_ID0 + (i << 2), 0);
+   }
+}
+
+static struct komeda_component_funcs d77_crossbar_funcs = {
+   .update = d77_crossbar_update,
+   .disable= d77_crossbar_disable,
+};
+
+static int d77_crossbar_init(struct d71_dev *d71,
+struct block_header *blk, u32 __iomem *reg)
+{
+   struct komeda_component *c;
+   u32 pipe_id, comp_id;
+
+   get_resources_id(blk->block_info, &pipe_id, &comp_id);
+   c = komeda_component_add(&d71->pipes[pipe_id]->base, sizeof(*c),
+comp_id,
+BLOCK_INFO_INPUT_ID(blk->block_info),
+&d77_crossbar_funcs,
+CBU_NUM_INPUT_IDS, get_valid_inputs(blk),
+CBU_NUM_OUTPUT_IDS, reg,
+"CBU%d", pipe_id);
+   if (IS_ERR(c)) {
+   DRM_ERROR("Failed to add crossbar component\n");
+   return -EINVAL;
+   }
+
+   return 0;
+}
+
 static void d71_merger_update(struct komeda_component *c,
  struct komeda_component_state *state)
 {
@@ -1351,6 +1411,7 @@ int d71_probe_block(struct d71_dev *d71,
break;
 
case D77_BLK_TYPE_CBU:
+   err = d77_crossbar_init(d71, blk, reg);
break;
 
case D77_BLK_TYPE_ATU:
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.c 
b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.c
index 104e27cc1dc3..fdb17a7c6fb6 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.c
@@ -76,6 +76,16 @@ komeda_pipeline_get_component_pos(struct komeda_pipeline 
*pipe, int id)
case KOMEDA_COMPONENT_LAYER3:
pos = to_cpos(pipe->layers[id - KOMEDA_COMPONENT_LAYER0]);
break;
+   case KOMEDA_COMPONENT_CROSSBAR0:
+   case KOMEDA_COMPONENT_CROSSBAR1:
+   temp = mdev->pipelines[id - KOMEDA_COMPONENT_CROSSBAR0];
+   if (!temp) {
+   DRM_ERROR("crossbar-%d's pipeline doesn't exist.\n",
+ id);
+   return NULL;
+   }
+   pos = to_cpos(temp->cbar);
+   break;
case KOMEDA_COMPONENT_WB_LAYER:
pos = to_cpos(pipe->wb_layer);
break;
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h 
b/drivers/gpu/drm/arm/display/komeda/komeda

[PATCH 0/2] Add most basic function to support D77

2019-12-12 Thread Tiannan Zhu (Arm Technology China)
D77 is the next generation of D71, compared with D71, it add some new
features(components) like ATU, Crossbar, PerfCounter etc.

Crossbar is used to control every plane's zorder.
ATU (Asyncronise Timewarp Unit) is used to support and optimize VR/AR
PerfCounter is used to log device performance data

To enable D77 and make it work as D71, we need do the following things
1. make D77 recongnise these new components.
2. enable crossbar.

and the other new features will be commited later.

Tiannan Zhu (Arm Technology China) (2):
  drm/komeda: Add basic support for D77
  drm/komeda: add Crossbar support

 .../drm/arm/display/include/malidp_product.h  |  1 +
 .../arm/display/komeda/d71/d71_component.c| 76 +++
 .../gpu/drm/arm/display/komeda/d71/d71_dev.c  |  1 +
 .../gpu/drm/arm/display/komeda/d71/d71_regs.h |  4 +
 .../gpu/drm/arm/display/komeda/komeda_drv.c   |  1 +
 .../drm/arm/display/komeda/komeda_pipeline.c  | 10 +++
 .../drm/arm/display/komeda/komeda_pipeline.h  |  7 ++
 .../display/komeda/komeda_pipeline_state.c| 36 +
 .../arm/display/komeda/komeda_private_obj.c   | 49 
 9 files changed, 185 insertions(+)

-- 
2.17.1

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


[PATCH 1/2] drm/komeda: Add basic support for D77

2019-12-12 Thread Tiannan Zhu (Arm Technology China)
Make komeda driver can recongise D77, D77 is arm latest display
product, compare with D71, D77 support some new features:
1. Crossbar: adjust every plane's zorder
2. ATU: Asynchronous Timewarp Unit, which is used to support VR/AR

Signed-off-by: Tiannan Zhu (Arm Technology China) 
---
 .../gpu/drm/arm/display/include/malidp_product.h  |  1 +
 .../drm/arm/display/komeda/d71/d71_component.c| 15 +++
 drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c  |  1 +
 drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h |  4 
 drivers/gpu/drm/arm/display/komeda/komeda_drv.c   |  1 +
 5 files changed, 22 insertions(+)

diff --git a/drivers/gpu/drm/arm/display/include/malidp_product.h 
b/drivers/gpu/drm/arm/display/include/malidp_product.h
index dbd3d4765065..cbde47f06c9f 100644
--- a/drivers/gpu/drm/arm/display/include/malidp_product.h
+++ b/drivers/gpu/drm/arm/display/include/malidp_product.h
@@ -19,6 +19,7 @@
 
 /* Mali-display product IDs */
 #define MALIDP_D71_PRODUCT_ID  0x0071
+#define MALIDP_D77_PRODUCT_ID  0x0072
 #define MALIDP_D32_PRODUCT_ID  0x0032
 
 union komeda_config_id {
diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c 
b/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
index c7f7e9c545c7..ec96b69a5ade 100644
--- a/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
+++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
@@ -1347,6 +1347,21 @@ int d71_probe_block(struct d71_dev *d71,
d71->glb_scl_coeff_addr[blk_id] = reg;
break;
 
+   case D71_BLK_TYPE_GLB_SC_COEFF:
+   break;
+
+   case D77_BLK_TYPE_CBU:
+   break;
+
+   case D77_BLK_TYPE_ATU:
+   break;
+
+   case D77_BLK_TYPE_ATU_VP:
+   break;
+
+   case D77_BLK_TYPE_LPU_PERF:
+   break;
+
default:
DRM_ERROR("Unknown block (block_info: 0x%x) is found\n",
  blk->block_info);
diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c 
b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
index 2d429e310e5b..7598e4856e0c 100644
--- a/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
+++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
@@ -614,6 +614,7 @@ d71_identify(u32 __iomem *reg_base, struct komeda_chip_info 
*chip)
switch (product_id) {
case MALIDP_D71_PRODUCT_ID:
case MALIDP_D32_PRODUCT_ID:
+   case MALIDP_D77_PRODUCT_ID:
funcs = &d71_chip_funcs;
break;
default:
diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h 
b/drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h
index 81de6a23e7f3..01ea53918cf1 100644
--- a/drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h
+++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h
@@ -477,8 +477,11 @@ enum d71_blk_type {
D71_BLK_TYPE_PERIPH = 0x08,
D71_BLK_TYPE_LPU_TRUSTED= 0x09,
D71_BLK_TYPE_AEU_TRUSTED= 0x0A,
+   D77_BLK_TYPE_CBU= 0x0B,
+   D77_BLK_TYPE_ATU= 0x0C,
D71_BLK_TYPE_LPU_LAYER  = 0x10,
D71_BLK_TYPE_LPU_WB_LAYER   = 0x11,
+   D77_BLK_TYPE_LPU_PERF   = 0x12,
D71_BLK_TYPE_CU_SPLITTER= 0x20,
D71_BLK_TYPE_CU_SCALER  = 0x21,
D71_BLK_TYPE_CU_MERGER  = 0x22,
@@ -487,6 +490,7 @@ enum d71_blk_type {
D71_BLK_TYPE_DOU_FT_COEFF   = 0x32,
D71_BLK_TYPE_AEU_DS = 0x40,
D71_BLK_TYPE_AEU_AES= 0x41,
+   D77_BLK_TYPE_ATU_VP = 0xC0,
D71_BLK_TYPE_RESERVED   = 0xFF
 };
 
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c 
b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
index ad38bbc7431e..3ac6b43beb2c 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
@@ -126,6 +126,7 @@ static int komeda_platform_remove(struct platform_device 
*pdev)
 static const struct of_device_id komeda_of_match[] = {
{ .compatible = "arm,mali-d71", .data = d71_identify, },
{ .compatible = "arm,mali-d32", .data = d71_identify, },
+   { .compatible = "arm,mali-d77", .data = d71_identify, },
{},
 };
 
-- 
2.17.1

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