[PATCH] drm/mcde: Fix vertical resolution bugs

kbuild test robot lkp at intel.com
Mon Dec 2 17:25:57 UTC 2019


Hi Linus,

I love your patch! Yet something to improve:

[auto build test ERROR on drm-exynos/exynos-drm-next]
[also build test ERROR on v5.4 next-20191202]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]

url:    https://github.com/0day-ci/linux/commits/Linus-Walleij/drm-mcde-Fix-vertical-resolution-bugs/20191202-215029
base:   https://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos.git exynos-drm-next
config: m68k-allmodconfig (attached as .config)
compiler: m68k-linux-gcc (GCC) 7.5.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        GCC_VERSION=7.5.0 make.cross ARCH=m68k 

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp at intel.com>

All errors (new ones prefixed by >>):

   drivers/gpu/drm/mcde/mcde_dsi.c: In function 'mcde_dsi_setup_video_mode':
>> drivers/gpu/drm/mcde/mcde_dsi.c:420:2: error: implicit declaration of function 'writel_dsi'; did you mean 'writesb'? [-Werror=implicit-function-declaration]
     writel_dsi(d, val, DSI_VID_MAIN_CTL);
     ^~~~~~~~~~
     writesb
   cc1: some warnings being treated as errors

vim +420 drivers/gpu/drm/mcde/mcde_dsi.c

   364	
   365	static void mcde_dsi_setup_video_mode(struct mcde_dsi *d,
   366					      const struct drm_display_mode *mode)
   367	{
   368		u8 bpp = mipi_dsi_pixel_format_to_bpp(d->mdsi->format);
   369		u64 bpl;
   370		u32 hfp;
   371		u32 hbp;
   372		u32 hsa;
   373		u32 blkline_pck, line_duration;
   374		u32 blkeol_pck, blkeol_duration;
   375		u32 val;
   376	
   377		val = 0;
   378		if (d->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST)
   379			val |= DSI_VID_MAIN_CTL_BURST_MODE;
   380		if (d->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) {
   381			val |= DSI_VID_MAIN_CTL_SYNC_PULSE_ACTIVE;
   382			val |= DSI_VID_MAIN_CTL_SYNC_PULSE_HORIZONTAL;
   383		}
   384		/* RGB header and pixel mode */
   385		switch (d->mdsi->format) {
   386		case MIPI_DSI_FMT_RGB565:
   387			val |= MIPI_DSI_PACKED_PIXEL_STREAM_16 <<
   388				DSI_VID_MAIN_CTL_HEADER_SHIFT;
   389			val |= DSI_VID_MAIN_CTL_VID_PIXEL_MODE_16BITS;
   390			break;
   391		case MIPI_DSI_FMT_RGB666_PACKED:
   392			val |= MIPI_DSI_PACKED_PIXEL_STREAM_18 <<
   393				DSI_VID_MAIN_CTL_HEADER_SHIFT;
   394			val |= DSI_VID_MAIN_CTL_VID_PIXEL_MODE_18BITS;
   395			break;
   396		case MIPI_DSI_FMT_RGB666:
   397			val |= MIPI_DSI_PIXEL_STREAM_3BYTE_18
   398				<< DSI_VID_MAIN_CTL_HEADER_SHIFT;
   399			val |= DSI_VID_MAIN_CTL_VID_PIXEL_MODE_18BITS_LOOSE;
   400			break;
   401		case MIPI_DSI_FMT_RGB888:
   402			val |= MIPI_DSI_PACKED_PIXEL_STREAM_24 <<
   403				DSI_VID_MAIN_CTL_HEADER_SHIFT;
   404			val |= DSI_VID_MAIN_CTL_VID_PIXEL_MODE_24BITS;
   405			break;
   406		default:
   407			dev_err(d->dev, "unknown pixel mode\n");
   408			return;
   409		}
   410	
   411		/* TODO: TVG could be enabled here */
   412	
   413		/* Send blanking packet */
   414		val |= DSI_VID_MAIN_CTL_REG_BLKLINE_MODE_LP_0;
   415		/* Send EOL packet */
   416		val |= DSI_VID_MAIN_CTL_REG_BLKEOL_MODE_LP_0;
   417		/* Recovery mode 1 */
   418		val |= 1 << DSI_VID_MAIN_CTL_RECOVERY_MODE_SHIFT;
   419		/* All other fields zero */
 > 420		writel_dsi(d, val, DSI_VID_MAIN_CTL);
   421	
   422		/* Vertical frame parameters are pretty straight-forward */
   423		val = mode->vdisplay << DSI_VID_VSIZE_VACT_LENGTH_SHIFT;
   424		/* vertical front porch */
   425		val |= (mode->vsync_start - mode->vdisplay)
   426			<< DSI_VID_VSIZE_VFP_LENGTH_SHIFT;
   427		/* vertical sync active */
   428		val |= (mode->vsync_end - mode->vsync_start)
   429			<< DSI_VID_VSIZE_VSA_LENGTH_SHIFT;
   430		/* vertical back porch */
   431		val |= (mode->vtotal - mode->vsync_end)
   432			<< DSI_VID_VSIZE_VBP_LENGTH_SHIFT;
   433		writel(val, d->regs + DSI_VID_VSIZE);
   434	
   435		/*
   436		 * Horizontal frame parameters:
   437		 * horizontal resolution is given in pixels and must be re-calculated
   438		 * into bytes since this is what the hardware expects.
   439		 *
   440		 * 6 + 2 is HFP header + checksum
   441		 */
   442		hfp = (mode->hsync_start - mode->hdisplay) * bpp - 6 - 2;
   443		if (d->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) {
   444			/*
   445			 * 6 is HBP header + checksum
   446			 * 4 is RGB header + checksum
   447			 */
   448			hbp = (mode->htotal - mode->hsync_end) * bpp - 4 - 6;
   449			/*
   450			 * 6 is HBP header + checksum
   451			 * 4 is HSW packet bytes
   452			 * 4 is RGB header + checksum
   453			 */
   454			hsa = (mode->hsync_end - mode->hsync_start) * bpp - 4 - 4 - 6;
   455		} else {
   456			/*
   457			 * HBP includes both back porch and sync
   458			 * 6 is HBP header + checksum
   459			 * 4 is HSW packet bytes
   460			 * 4 is RGB header + checksum
   461			 */
   462			hbp = (mode->htotal - mode->hsync_start) * bpp - 4 - 4 - 6;
   463			/* HSA is not considered in this mode and set to 0 */
   464			hsa = 0;
   465		}
   466		dev_dbg(d->dev, "hfp: %u, hbp: %u, hsa: %u\n",
   467			hfp, hbp, hsa);
   468	
   469		/* Frame parameters: horizontal sync active */
   470		val = hsa << DSI_VID_HSIZE1_HSA_LENGTH_SHIFT;
   471		/* horizontal back porch */
   472		val |= hbp << DSI_VID_HSIZE1_HBP_LENGTH_SHIFT;
   473		/* horizontal front porch */
   474		val |= hfp << DSI_VID_HSIZE1_HFP_LENGTH_SHIFT;
   475		writel(val, d->regs + DSI_VID_HSIZE1);
   476	
   477		/* RGB data length (bytes on one scanline) */
   478		val = mode->hdisplay * (bpp / 8);
   479		writel(val, d->regs + DSI_VID_HSIZE2);
   480	
   481		/* TODO: further adjustments for TVG mode here */
   482	
   483		/*
   484		 * EOL packet length from bits per line calculations: pixel clock
   485		 * is given in kHz, calculate the time between two pixels in
   486		 * picoseconds.
   487		 */
   488		bpl = mode->clock * mode->htotal;
   489		bpl *= (d->hs_freq / 8);
   490		do_div(bpl, 1000000); /* microseconds */
   491		do_div(bpl, 1000000); /* seconds */
   492		bpl *= d->mdsi->lanes;
   493		dev_dbg(d->dev, "calculated bytes per line: %llu\n", bpl);
   494		/*
   495		 * 6 is header + checksum, header = 4 bytes, checksum = 2 bytes
   496		 * 4 is short packet for vsync/hsync
   497		 */
   498		if (d->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) {
   499			/* Fixme: isn't the hsync width in pixels? */
   500			blkline_pck = bpl - (mode->hsync_end - mode->hsync_start) - 6;
   501			val = blkline_pck << DSI_VID_BLKSIZE2_BLKLINE_PULSE_PCK_SHIFT;
   502			writel(val, d->regs + DSI_VID_BLKSIZE2);
   503		} else {
   504			blkline_pck = bpl - 4 - 6;
   505			val = blkline_pck << DSI_VID_BLKSIZE1_BLKLINE_EVENT_PCK_SHIFT;
   506			writel(val, d->regs + DSI_VID_BLKSIZE1);
   507		}
   508	
   509		line_duration = (blkline_pck + 6) / d->mdsi->lanes;
   510		dev_dbg(d->dev, "line duration %u\n", line_duration);
   511		val = line_duration << DSI_VID_DPHY_TIME_REG_LINE_DURATION_SHIFT;
   512		/*
   513		 * This is the time to perform LP->HS on D-PHY
   514		 * FIXME: nowhere to get this from: DT property on the DSI?
   515		 */
   516		val |= 0 << DSI_VID_DPHY_TIME_REG_WAKEUP_TIME_SHIFT;
   517		writel(val, d->regs + DSI_VID_DPHY_TIME);
   518	
   519		/* Calculate block end of line */
   520		blkeol_pck = bpl - mode->hdisplay * bpp - 6;
   521		blkeol_duration = (blkeol_pck + 6) / d->mdsi->lanes;
   522		dev_dbg(d->dev, "blkeol pck: %u, duration: %u\n",
   523			 blkeol_pck, blkeol_duration);
   524	
   525		if (d->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST) {
   526			/* Set up EOL clock for burst mode */
   527			val = readl(d->regs + DSI_VID_BLKSIZE1);
   528			val |= blkeol_pck << DSI_VID_BLKSIZE1_BLKEOL_PCK_SHIFT;
   529			writel(val, d->regs + DSI_VID_BLKSIZE1);
   530			writel(blkeol_pck, d->regs + DSI_VID_VCA_SETTING2);
   531	
   532			writel(blkeol_duration, d->regs + DSI_VID_PCK_TIME);
   533			writel(blkeol_duration - 6, d->regs + DSI_VID_VCA_SETTING1);
   534		}
   535	
   536		/* Maximum line limit */
   537		val = readl(d->regs + DSI_VID_VCA_SETTING2);
   538		val |= blkline_pck <<
   539			DSI_VID_VCA_SETTING2_EXACT_BURST_LIMIT_SHIFT;
   540		writel(val, d->regs + DSI_VID_VCA_SETTING2);
   541	
   542		/* Put IF1 into video mode */
   543		val = readl(d->regs + DSI_MCTL_MAIN_DATA_CTL);
   544		val |= DSI_MCTL_MAIN_DATA_CTL_IF1_MODE;
   545		writel(val, d->regs + DSI_MCTL_MAIN_DATA_CTL);
   546	
   547		/* Disable command mode on IF1 */
   548		val = readl(d->regs + DSI_CMD_MODE_CTL);
   549		val &= ~DSI_CMD_MODE_CTL_IF1_LP_EN;
   550		writel(val, d->regs + DSI_CMD_MODE_CTL);
   551	
   552		/* Enable some error interrupts */
   553		val = readl(d->regs + DSI_VID_MODE_STS_CTL);
   554		val |= DSI_VID_MODE_STS_CTL_ERR_MISSING_VSYNC;
   555		val |= DSI_VID_MODE_STS_CTL_ERR_MISSING_DATA;
   556		writel(val, d->regs + DSI_VID_MODE_STS_CTL);
   557	
   558		/* Enable video mode */
   559		val = readl(d->regs + DSI_MCTL_MAIN_DATA_CTL);
   560		val |= DSI_MCTL_MAIN_DATA_CTL_VID_EN;
   561		writel(val, d->regs + DSI_MCTL_MAIN_DATA_CTL);
   562	}
   563	

---
0-DAY kernel test infrastructure                 Open Source Technology Center
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org Intel Corporation
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/gzip
Size: 51356 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20191203/936af2fd/attachment-0001.gz>


More information about the dri-devel mailing list