Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/komeda: Enable new product D32 support

D32 is simple version of D71, the difference is:
- Only has one pipeline
- Drop the periph block and merge it to GCU

v2: Rebase.
v3: Isolate the block counting fix to a new patch

Signed-off-by: James Qian Wang (Arm Technology China) <james.qian.wang@arm.com>
Reviewed-by: Mihail Atanassov <mihail.atanassov@arm.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191210084828.19664-3-james.qian.wang@arm.com

+42 -16
+2 -1
drivers/gpu/drm/arm/display/include/malidp_product.h
··· 18 18 #define MALIDP_CORE_ID_STATUS(__core_id) (((__u32)(__core_id)) & 0xFF) 19 19 20 20 /* Mali-display product IDs */ 21 - #define MALIDP_D71_PRODUCT_ID 0x0071 21 + #define MALIDP_D71_PRODUCT_ID 0x0071 22 + #define MALIDP_D32_PRODUCT_ID 0x0032 22 23 23 24 union komeda_config_id { 24 25 struct {
+1 -1
drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
··· 1270 1270 1271 1271 ctrlr = to_ctrlr(c); 1272 1272 1273 - ctrlr->supports_dual_link = true; 1273 + ctrlr->supports_dual_link = d71->supports_dual_link; 1274 1274 1275 1275 return 0; 1276 1276 }
+25 -14
drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
··· 371 371 goto err_cleanup; 372 372 } 373 373 374 - /* probe PERIPH */ 374 + /* Only the legacy HW has the periph block, the newer merges the periph 375 + * into GCU 376 + */ 375 377 value = malidp_read32(d71->periph_addr, BLK_BLOCK_INFO); 376 - if (BLOCK_INFO_BLK_TYPE(value) != D71_BLK_TYPE_PERIPH) { 377 - DRM_ERROR("access blk periph but got blk: %d.\n", 378 - BLOCK_INFO_BLK_TYPE(value)); 379 - err = -EINVAL; 380 - goto err_cleanup; 378 + if (BLOCK_INFO_BLK_TYPE(value) != D71_BLK_TYPE_PERIPH) 379 + d71->periph_addr = NULL; 380 + 381 + if (d71->periph_addr) { 382 + /* probe PERIPHERAL in legacy HW */ 383 + value = malidp_read32(d71->periph_addr, PERIPH_CONFIGURATION_ID); 384 + 385 + d71->max_line_size = value & PERIPH_MAX_LINE_SIZE ? 4096 : 2048; 386 + d71->max_vsize = 4096; 387 + d71->num_rich_layers = value & PERIPH_NUM_RICH_LAYERS ? 2 : 1; 388 + d71->supports_dual_link = !!(value & PERIPH_SPLIT_EN); 389 + d71->integrates_tbu = !!(value & PERIPH_TBU_EN); 390 + } else { 391 + value = malidp_read32(d71->gcu_addr, GCU_CONFIGURATION_ID0); 392 + d71->max_line_size = GCU_MAX_LINE_SIZE(value); 393 + d71->max_vsize = GCU_MAX_NUM_LINES(value); 394 + 395 + value = malidp_read32(d71->gcu_addr, GCU_CONFIGURATION_ID1); 396 + d71->num_rich_layers = GCU_NUM_RICH_LAYERS(value); 397 + d71->supports_dual_link = GCU_DISPLAY_SPLIT_EN(value); 398 + d71->integrates_tbu = GCU_DISPLAY_TBU_EN(value); 381 399 } 382 - 383 - value = malidp_read32(d71->periph_addr, PERIPH_CONFIGURATION_ID); 384 - 385 - d71->max_line_size = value & PERIPH_MAX_LINE_SIZE ? 4096 : 2048; 386 - d71->max_vsize = 4096; 387 - d71->num_rich_layers = value & PERIPH_NUM_RICH_LAYERS ? 2 : 1; 388 - d71->supports_dual_link = value & PERIPH_SPLIT_EN ? true : false; 389 - d71->integrates_tbu = value & PERIPH_TBU_EN ? true : false; 390 400 391 401 for (i = 0; i < d71->num_pipelines; i++) { 392 402 pipe = komeda_pipeline_add(mdev, sizeof(struct d71_pipeline), ··· 616 606 617 607 switch (product_id) { 618 608 case MALIDP_D71_PRODUCT_ID: 609 + case MALIDP_D32_PRODUCT_ID: 619 610 funcs = &d71_chip_funcs; 620 611 break; 621 612 default:
+13
drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h
··· 72 72 #define GCU_CONTROL_MODE(x) ((x) & 0x7) 73 73 #define GCU_CONTROL_SRST BIT(16) 74 74 75 + /* GCU_CONFIGURATION registers */ 76 + #define GCU_CONFIGURATION_ID0 0x100 77 + #define GCU_CONFIGURATION_ID1 0x104 78 + 79 + /* GCU configuration */ 80 + #define GCU_MAX_LINE_SIZE(x) ((x) & 0xFFFF) 81 + #define GCU_MAX_NUM_LINES(x) ((x) >> 16) 82 + #define GCU_NUM_RICH_LAYERS(x) ((x) & 0x7) 83 + #define GCU_NUM_PIPELINES(x) (((x) >> 3) & 0x7) 84 + #define GCU_NUM_SCALERS(x) (((x) >> 6) & 0x7) 85 + #define GCU_DISPLAY_SPLIT_EN(x) (((x) >> 16) & 0x1) 86 + #define GCU_DISPLAY_TBU_EN(x) (((x) >> 17) & 0x1) 87 + 75 88 /* GCU opmode */ 76 89 #define INACTIVE_MODE 0 77 90 #define TBU_CONNECT_MODE 1
+1
drivers/gpu/drm/arm/display/komeda/komeda_drv.c
··· 125 125 126 126 static const struct of_device_id komeda_of_match[] = { 127 127 { .compatible = "arm,mali-d71", .data = d71_identify, }, 128 + { .compatible = "arm,mali-d32", .data = d71_identify, }, 128 129 {}, 129 130 }; 130 131