[PATCH 2/2] drm/komeda: add Crossbar support
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
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
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