Re: [PATCH v8 14/16] drm/mediatek: Support CRC in display driver

From: kernel test robot
Date: Sat Jun 15 2024 - 17:22:51 EST


Hi Shawn,

kernel test robot noticed the following build warnings:

[auto build test WARNING on v6.10-rc2]
[also build test WARNING on linus/master next-20240613]
[cannot apply to chrome-os/chromeos-6.1]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Shawn-Sung/soc-mediatek-Disable-9-bit-alpha-in-ETHDR/20240606-172904
base: v6.10-rc2
patch link: https://lore.kernel.org/r/20240606092635.27981-15-shawn.sung%40mediatek.com
patch subject: [PATCH v8 14/16] drm/mediatek: Support CRC in display driver
config: arm64-randconfig-r113-20240615 (https://download.01.org/0day-ci/archive/20240616/202406160407.yfZ2cNh2-lkp@xxxxxxxxx/config)
compiler: aarch64-linux-gcc (GCC) 13.2.0
reproduce: (https://download.01.org/0day-ci/archive/20240616/202406160407.yfZ2cNh2-lkp@xxxxxxxxx/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202406160407.yfZ2cNh2-lkp@xxxxxxxxx/

sparse warnings: (new ones prefixed by >>)
>> drivers/gpu/drm/mediatek/mtk_crtc.c:1373:66: sparse: sparse: Using plain integer as NULL pointer
drivers/gpu/drm/mediatek/mtk_crtc.c:1377:65: sparse: sparse: Using plain integer as NULL pointer

vim +1373 drivers/gpu/drm/mediatek/mtk_crtc.c

1286
1287 #if IS_REACHABLE(CONFIG_MTK_CMDQ)
1288 /**
1289 * mtk_crtc_create_crc_cmdq - Create a CMDQ thread for syncing the CRCs
1290 * @dev: Kernel device node of the CRC provider
1291 * @crc: Pointer of the CRC to init
1292 *
1293 * This function will create a looping thread on GCE (Global Command Engine) to
1294 * keep the CRC up to date by monitoring the assigned event (usually the frame
1295 * done event) of the CRC provider, and read the CRCs from the registers to a
1296 * shared memory for the workqueue to read. To start/stop the looping thread,
1297 * please call `mtk_crtc_start_crc_cmdq()` and `mtk_crtc_stop_crc_cmdq()`
1298 * defined blow.
1299 *
1300 * The reason why we don't update the CRCs with CPU is that the front porch of
1301 * 4K60 timing in CEA-861 is less than 60us, and register read/write speed is
1302 * relatively unreliable comparing to GCE due to the bus design.
1303 *
1304 * We must create a new thread instead of using the original one for plane
1305 * update is because:
1306 * 1. We cannot add another wait-for-event command at the end of cmdq packet, or
1307 * the cmdq callback will delay for too long
1308 * 2. Will get the CRC of the previous frame if using the existed wait-for-event
1309 * command which is at the beginning of the packet
1310 */
1311 void mtk_crtc_create_crc_cmdq(struct device *dev, struct mtk_crtc_crc *crc)
1312 {
1313 int i;
1314
1315 if (!crc->cnt) {
1316 dev_warn(dev, "%s: not support\n", __func__);
1317 goto cleanup;
1318 }
1319
1320 if (!crc->ofs) {
1321 dev_warn(dev, "%s: not defined\n", __func__);
1322 goto cleanup;
1323 }
1324
1325 crc->cmdq_client.client.dev = dev;
1326 crc->cmdq_client.client.tx_block = false;
1327 crc->cmdq_client.client.knows_txdone = true;
1328 crc->cmdq_client.client.rx_callback = NULL;
1329 crc->cmdq_client.chan = mbox_request_channel(&crc->cmdq_client.client, 0);
1330 if (IS_ERR(crc->cmdq_client.chan)) {
1331 dev_warn(dev, "%s: failed to create mailbox client\n", __func__);
1332 crc->cmdq_client.chan = NULL;
1333 goto cleanup;
1334 }
1335
1336 if (mtk_drm_cmdq_pkt_create(&crc->cmdq_client, &crc->cmdq_handle, PAGE_SIZE)) {
1337 dev_warn(dev, "%s: failed to create cmdq packet\n", __func__);
1338 goto cleanup;
1339 }
1340
1341 if (!crc->va) {
1342 dev_warn(dev, "%s: no memory\n", __func__);
1343 goto cleanup;
1344 }
1345
1346 /* map the entry to get a dma address for cmdq to store the crc */
1347 crc->pa = dma_map_single(crc->cmdq_client.chan->mbox->dev,
1348 crc->va, crc->cnt * sizeof(*crc->va),
1349 DMA_FROM_DEVICE);
1350
1351 if (dma_mapping_error(crc->cmdq_client.chan->mbox->dev, crc->pa)) {
1352 dev_err(dev, "%s: failed to map dma\n", __func__);
1353 goto cleanup;
1354 }
1355
1356 if (crc->cmdq_event)
1357 cmdq_pkt_wfe(&crc->cmdq_handle, crc->cmdq_event, true);
1358
1359 for (i = 0; i < crc->cnt; i++) {
1360 /* put crc to spr1 register */
1361 cmdq_pkt_read_s(&crc->cmdq_handle, crc->cmdq_reg->subsys,
1362 crc->cmdq_reg->offset + crc->ofs[i],
1363 CMDQ_THR_SPR_IDX1);
1364
1365 /* copy spr1 register to physical address of the crc */
1366 cmdq_pkt_assign(&crc->cmdq_handle, CMDQ_THR_SPR_IDX0,
1367 CMDQ_ADDR_HIGH(crc->pa + i * sizeof(*crc->va)));
1368 cmdq_pkt_write_s(&crc->cmdq_handle, CMDQ_THR_SPR_IDX0,
1369 CMDQ_ADDR_LOW(crc->pa + i * sizeof(*crc->va)),
1370 CMDQ_THR_SPR_IDX1);
1371 }
1372 /* reset crc */
> 1373 mtk_ddp_write_mask(&crc->cmdq_handle, ~0, crc->cmdq_reg, 0,
1374 crc->rst_ofs, crc->rst_msk);
1375
1376 /* clear reset bit */
1377 mtk_ddp_write_mask(&crc->cmdq_handle, 0, crc->cmdq_reg, 0,
1378 crc->rst_ofs, crc->rst_msk);
1379
1380 /* jump to head of the cmdq packet */
1381 cmdq_pkt_jump_abs(&crc->cmdq_handle, crc->cmdq_handle.pa_base,
1382 cmdq_get_shift_pa(crc->cmdq_client.chan));
1383
1384 return;
1385 cleanup:
1386 mtk_crtc_destroy_crc(crc);
1387 }
1388

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki