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

drm/komeda: Adds register dump support for gcu, lup and dou

Adds to support register dump on lpu and dou of pipeline and gcu on D71

Changes since v1:
- For a constant format without additional arguments, use seq_puts()
instead of seq_printf().

Signed-off-by: Lowry Li (Arm Technology China) <lowry.li@arm.com>
Signed-off-by: james qian wang (Arm Technology China) <james.qian.wang@arm.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190917112525.25490-1-lowry.li@arm.com

+101 -12
+85 -1
drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
··· 1218 1218 return err; 1219 1219 } 1220 1220 1221 + static void d71_gcu_dump(struct d71_dev *d71, struct seq_file *sf) 1222 + { 1223 + u32 v[5]; 1224 + 1225 + seq_puts(sf, "\n------ GCU ------\n"); 1226 + 1227 + get_values_from_reg(d71->gcu_addr, 0, 3, v); 1228 + seq_printf(sf, "GLB_ARCH_ID:\t\t0x%X\n", v[0]); 1229 + seq_printf(sf, "GLB_CORE_ID:\t\t0x%X\n", v[1]); 1230 + seq_printf(sf, "GLB_CORE_INFO:\t\t0x%X\n", v[2]); 1231 + 1232 + get_values_from_reg(d71->gcu_addr, 0x10, 1, v); 1233 + seq_printf(sf, "GLB_IRQ_STATUS:\t\t0x%X\n", v[0]); 1234 + 1235 + get_values_from_reg(d71->gcu_addr, 0xA0, 5, v); 1236 + seq_printf(sf, "GCU_IRQ_RAW_STATUS:\t0x%X\n", v[0]); 1237 + seq_printf(sf, "GCU_IRQ_CLEAR:\t\t0x%X\n", v[1]); 1238 + seq_printf(sf, "GCU_IRQ_MASK:\t\t0x%X\n", v[2]); 1239 + seq_printf(sf, "GCU_IRQ_STATUS:\t\t0x%X\n", v[3]); 1240 + seq_printf(sf, "GCU_STATUS:\t\t0x%X\n", v[4]); 1241 + 1242 + get_values_from_reg(d71->gcu_addr, 0xD0, 3, v); 1243 + seq_printf(sf, "GCU_CONTROL:\t\t0x%X\n", v[0]); 1244 + seq_printf(sf, "GCU_CONFIG_VALID0:\t0x%X\n", v[1]); 1245 + seq_printf(sf, "GCU_CONFIG_VALID1:\t0x%X\n", v[2]); 1246 + } 1247 + 1248 + static void d71_lpu_dump(struct d71_pipeline *pipe, struct seq_file *sf) 1249 + { 1250 + u32 v[6]; 1251 + 1252 + seq_printf(sf, "\n------ LPU%d ------\n", pipe->base.id); 1253 + 1254 + dump_block_header(sf, pipe->lpu_addr); 1255 + 1256 + get_values_from_reg(pipe->lpu_addr, 0xA0, 6, v); 1257 + seq_printf(sf, "LPU_IRQ_RAW_STATUS:\t0x%X\n", v[0]); 1258 + seq_printf(sf, "LPU_IRQ_CLEAR:\t\t0x%X\n", v[1]); 1259 + seq_printf(sf, "LPU_IRQ_MASK:\t\t0x%X\n", v[2]); 1260 + seq_printf(sf, "LPU_IRQ_STATUS:\t\t0x%X\n", v[3]); 1261 + seq_printf(sf, "LPU_STATUS:\t\t0x%X\n", v[4]); 1262 + seq_printf(sf, "LPU_TBU_STATUS:\t\t0x%X\n", v[5]); 1263 + 1264 + get_values_from_reg(pipe->lpu_addr, 0xC0, 1, v); 1265 + seq_printf(sf, "LPU_INFO:\t\t0x%X\n", v[0]); 1266 + 1267 + get_values_from_reg(pipe->lpu_addr, 0xD0, 3, v); 1268 + seq_printf(sf, "LPU_RAXI_CONTROL:\t0x%X\n", v[0]); 1269 + seq_printf(sf, "LPU_WAXI_CONTROL:\t0x%X\n", v[1]); 1270 + seq_printf(sf, "LPU_TBU_CONTROL:\t0x%X\n", v[2]); 1271 + } 1272 + 1273 + static void d71_dou_dump(struct d71_pipeline *pipe, struct seq_file *sf) 1274 + { 1275 + u32 v[5]; 1276 + 1277 + seq_printf(sf, "\n------ DOU%d ------\n", pipe->base.id); 1278 + 1279 + dump_block_header(sf, pipe->dou_addr); 1280 + 1281 + get_values_from_reg(pipe->dou_addr, 0xA0, 5, v); 1282 + seq_printf(sf, "DOU_IRQ_RAW_STATUS:\t0x%X\n", v[0]); 1283 + seq_printf(sf, "DOU_IRQ_CLEAR:\t\t0x%X\n", v[1]); 1284 + seq_printf(sf, "DOU_IRQ_MASK:\t\t0x%X\n", v[2]); 1285 + seq_printf(sf, "DOU_IRQ_STATUS:\t\t0x%X\n", v[3]); 1286 + seq_printf(sf, "DOU_STATUS:\t\t0x%X\n", v[4]); 1287 + } 1288 + 1289 + static void d71_pipeline_dump(struct komeda_pipeline *pipe, struct seq_file *sf) 1290 + { 1291 + struct d71_pipeline *d71_pipe = to_d71_pipeline(pipe); 1292 + 1293 + d71_lpu_dump(d71_pipe, sf); 1294 + d71_dou_dump(d71_pipe, sf); 1295 + } 1296 + 1221 1297 const struct komeda_pipeline_funcs d71_pipeline_funcs = { 1222 - .downscaling_clk_check = d71_downscaling_clk_check, 1298 + .downscaling_clk_check = d71_downscaling_clk_check, 1299 + .dump_register = d71_pipeline_dump, 1223 1300 }; 1301 + 1302 + void d71_dump(struct komeda_dev *mdev, struct seq_file *sf) 1303 + { 1304 + struct d71_dev *d71 = mdev->chip_data; 1305 + 1306 + d71_gcu_dump(d71, sf); 1307 + }
+12 -11
drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
··· 561 561 } 562 562 563 563 static const struct komeda_dev_funcs d71_chip_funcs = { 564 - .init_format_table = d71_init_fmt_tbl, 565 - .enum_resources = d71_enum_resources, 566 - .cleanup = d71_cleanup, 567 - .irq_handler = d71_irq_handler, 568 - .enable_irq = d71_enable_irq, 569 - .disable_irq = d71_disable_irq, 570 - .on_off_vblank = d71_on_off_vblank, 571 - .change_opmode = d71_change_opmode, 572 - .flush = d71_flush, 573 - .connect_iommu = d71_connect_iommu, 574 - .disconnect_iommu = d71_disconnect_iommu, 564 + .init_format_table = d71_init_fmt_tbl, 565 + .enum_resources = d71_enum_resources, 566 + .cleanup = d71_cleanup, 567 + .irq_handler = d71_irq_handler, 568 + .enable_irq = d71_enable_irq, 569 + .disable_irq = d71_disable_irq, 570 + .on_off_vblank = d71_on_off_vblank, 571 + .change_opmode = d71_change_opmode, 572 + .flush = d71_flush, 573 + .connect_iommu = d71_connect_iommu, 574 + .disconnect_iommu = d71_disconnect_iommu, 575 + .dump_register = d71_dump, 575 576 }; 576 577 577 578 const struct komeda_dev_funcs *
+2
drivers/gpu/drm/arm/display/komeda/d71/d71_dev.h
··· 49 49 struct block_header *blk, u32 __iomem *reg); 50 50 void d71_read_block_header(u32 __iomem *reg, struct block_header *blk); 51 51 52 + void d71_dump(struct komeda_dev *mdev, struct seq_file *sf); 53 + 52 54 #endif /* !_D71_DEV_H_ */
+2
drivers/gpu/drm/arm/display/komeda/komeda_dev.c
··· 25 25 struct komeda_dev *mdev = sf->private; 26 26 int i; 27 27 28 + seq_puts(sf, "\n====== Komeda register dump =========\n"); 29 + 28 30 if (mdev->funcs->dump_register) 29 31 mdev->funcs->dump_register(mdev, sf); 30 32