[PATCH 5/6] fbdev: Move CFB read and write code into helper functions

Thomas Zimmermann tzimmermann at suse.de
Wed Apr 26 14:24:06 UTC 2023


Hi

Am 26.04.23 um 07:16 schrieb kernel test robot:
> Hi Thomas,
> 
> kernel test robot noticed the following build warnings:

FYI these errors come from systems that use volatile __iomem pointers 
with plain memcpy(). See my patchset at [1] for an improvement.

Best regards
Thomas

[1] https://patchwork.freedesktop.org/series/116985/

> 
> [auto build test WARNING on drm-misc/drm-misc-next]
> [also build test WARNING on linus/master next-20230425]
> [cannot apply to v6.3]
> [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/Thomas-Zimmermann/fbdev-Return-number-of-bytes-read-or-written/20230425-223011
> base:   git://anongit.freedesktop.org/drm/drm-misc drm-misc-next
> patch link:    https://lore.kernel.org/r/20230425142846.730-6-tzimmermann%40suse.de
> patch subject: [PATCH 5/6] fbdev: Move CFB read and write code into helper functions
> config: riscv-randconfig-s033-20230423 (https://download.01.org/0day-ci/archive/20230426/202304261317.QAEwArcB-lkp@intel.com/config)
> compiler: riscv64-linux-gcc (GCC) 12.1.0
> reproduce:
>          wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
>          chmod +x ~/bin/make.cross
>          # apt-get install sparse
>          # sparse version: v0.6.4-39-gce1a6720-dirty
>          # https://github.com/intel-lab-lkp/linux/commit/d4a150f3dfa8e73f2e92f1c7efc9271e17632cc2
>          git remote add linux-review https://github.com/intel-lab-lkp/linux
>          git fetch --no-tags linux-review Thomas-Zimmermann/fbdev-Return-number-of-bytes-read-or-written/20230425-223011
>          git checkout d4a150f3dfa8e73f2e92f1c7efc9271e17632cc2
>          # save the config file
>          mkdir build_dir && cp config build_dir/.config
>          COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=riscv olddefconfig
>          COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=riscv SHELL=/bin/bash drivers/video/fbdev/core/
> 
> If you fix the issue, kindly add following tag where applicable
> | Reported-by: kernel test robot <lkp at intel.com>
> | Link: https://lore.kernel.org/oe-kbuild-all/202304261317.QAEwArcB-lkp@intel.com/
> 
> sparse warnings: (new ones prefixed by >>)
>     WARNING: invalid argument to '-march': '_zihintpause'
>>> drivers/video/fbdev/core/fb_cfb_fops.c:44:39: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void const * @@     got unsigned char [noderef] [usertype] __iomem *[assigned] src @@
>     drivers/video/fbdev/core/fb_cfb_fops.c:44:39: sparse:     expected void const *
>     drivers/video/fbdev/core/fb_cfb_fops.c:44:39: sparse:     got unsigned char [noderef] [usertype] __iomem *[assigned] src
>>> drivers/video/fbdev/core/fb_cfb_fops.c:113:32: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void * @@     got unsigned char [noderef] [usertype] __iomem *[assigned] dst @@
>     drivers/video/fbdev/core/fb_cfb_fops.c:113:32: sparse:     expected void *
>     drivers/video/fbdev/core/fb_cfb_fops.c:113:32: sparse:     got unsigned char [noderef] [usertype] __iomem *[assigned] dst
> 
> vim +44 drivers/video/fbdev/core/fb_cfb_fops.c
> 
>       6	
>       7	ssize_t fb_cfb_read(struct fb_info *info, char __user *buf, size_t count, loff_t *ppos)
>       8	{
>       9		unsigned long p = *ppos;
>      10		u8 *buffer, *dst;
>      11		u8 __iomem *src;
>      12		int c, cnt = 0, err = 0;
>      13		unsigned long total_size;
>      14	
>      15		if (!info->screen_base)
>      16			return -ENODEV;
>      17	
>      18		total_size = info->screen_size;
>      19	
>      20		if (total_size == 0)
>      21			total_size = info->fix.smem_len;
>      22	
>      23		if (p >= total_size)
>      24			return 0;
>      25	
>      26		if (count >= total_size)
>      27			count = total_size;
>      28	
>      29		if (count + p > total_size)
>      30			count = total_size - p;
>      31	
>      32		buffer = kmalloc((count > PAGE_SIZE) ? PAGE_SIZE : count, GFP_KERNEL);
>      33		if (!buffer)
>      34			return -ENOMEM;
>      35	
>      36		src = (u8 __iomem *)(info->screen_base + p);
>      37	
>      38		if (info->fbops->fb_sync)
>      39			info->fbops->fb_sync(info);
>      40	
>      41		while (count) {
>      42			c  = (count > PAGE_SIZE) ? PAGE_SIZE : count;
>      43			dst = buffer;
>    > 44			fb_memcpy_fromfb(dst, src, c);
>      45			dst += c;
>      46			src += c;
>      47	
>      48			if (copy_to_user(buf, buffer, c)) {
>      49				err = -EFAULT;
>      50				break;
>      51			}
>      52			*ppos += c;
>      53			buf += c;
>      54			cnt += c;
>      55			count -= c;
>      56		}
>      57	
>      58		kfree(buffer);
>      59	
>      60		return cnt ? cnt : err;
>      61	}
>      62	EXPORT_SYMBOL(fb_cfb_read);
>      63	
>      64	ssize_t fb_cfb_write(struct fb_info *info, const char __user *buf, size_t count, loff_t *ppos)
>      65	{
>      66		unsigned long p = *ppos;
>      67		u8 *buffer, *src;
>      68		u8 __iomem *dst;
>      69		int c, cnt = 0, err = 0;
>      70		unsigned long total_size;
>      71	
>      72		if (!info->screen_base)
>      73			return -ENODEV;
>      74	
>      75		total_size = info->screen_size;
>      76	
>      77		if (total_size == 0)
>      78			total_size = info->fix.smem_len;
>      79	
>      80		if (p > total_size)
>      81			return -EFBIG;
>      82	
>      83		if (count > total_size) {
>      84			err = -EFBIG;
>      85			count = total_size;
>      86		}
>      87	
>      88		if (count + p > total_size) {
>      89			if (!err)
>      90				err = -ENOSPC;
>      91	
>      92			count = total_size - p;
>      93		}
>      94	
>      95		buffer = kmalloc((count > PAGE_SIZE) ? PAGE_SIZE : count, GFP_KERNEL);
>      96		if (!buffer)
>      97			return -ENOMEM;
>      98	
>      99		dst = (u8 __iomem *)(info->screen_base + p);
>     100	
>     101		if (info->fbops->fb_sync)
>     102			info->fbops->fb_sync(info);
>     103	
>     104		while (count) {
>     105			c = (count > PAGE_SIZE) ? PAGE_SIZE : count;
>     106			src = buffer;
>     107	
>     108			if (copy_from_user(src, buf, c)) {
>     109				err = -EFAULT;
>     110				break;
>     111			}
>     112	
>   > 113			fb_memcpy_tofb(dst, src, c);
> 

-- 
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 840 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20230426/fdb88f5e/attachment-0001.sig>


More information about the dri-devel mailing list