[PATCH] drm: ast: fix double __iomem sparse warning

kernel test robot lkp at intel.com
Tue Aug 18 23:37:11 UTC 2020


Hi Randy,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on drm-tip/drm-tip]
[also build test WARNING on linus/master v5.9-rc1 next-20200818]
[cannot apply to linux/master drm-intel/for-linux-next]
[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]

url:    https://github.com/0day-ci/linux/commits/Randy-Dunlap/drm-ast-fix-double-__iomem-sparse-warning/20200819-043022
base:   git://anongit.freedesktop.org/drm/drm-tip drm-tip
config: i386-randconfig-s002-20200818 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
reproduce:
        # apt-get install sparse
        # sparse version: v0.6.2-183-gaa6ede3b-dirty
        # save the attached .config to linux build tree
        make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=i386 

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


sparse warnings: (new ones prefixed by >>)

>> drivers/gpu/drm/ast/ast_cursor.c:42:59: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void *vaddr @@     got void [noderef] __iomem * @@
>> drivers/gpu/drm/ast/ast_cursor.c:42:59: sparse:     expected void *vaddr
>> drivers/gpu/drm/ast/ast_cursor.c:42:59: sparse:     got void [noderef] __iomem *
>> drivers/gpu/drm/ast/ast_cursor.c:80:23: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected void [noderef] __iomem *vaddr @@     got void * @@
>> drivers/gpu/drm/ast/ast_cursor.c:80:23: sparse:     expected void [noderef] __iomem *vaddr
>> drivers/gpu/drm/ast/ast_cursor.c:80:23: sparse:     got void *
   drivers/gpu/drm/ast/ast_cursor.c:98:59: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void *vaddr @@     got void [noderef] __iomem * @@
   drivers/gpu/drm/ast/ast_cursor.c:98:59: sparse:     expected void *vaddr
   drivers/gpu/drm/ast/ast_cursor.c:98:59: sparse:     got void [noderef] __iomem *
>> drivers/gpu/drm/ast/ast_cursor.c:126:19: sparse: sparse: cast removes address space '__iomem' of expression
>> drivers/gpu/drm/ast/ast_cursor.c:126:16: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected unsigned char [noderef] [usertype] __iomem *dstxor @@     got unsigned char [usertype] * @@
>> drivers/gpu/drm/ast/ast_cursor.c:126:16: sparse:     expected unsigned char [noderef] [usertype] __iomem *dstxor
>> drivers/gpu/drm/ast/ast_cursor.c:126:16: sparse:     got unsigned char [usertype] *

# https://github.com/0day-ci/linux/commit/7e1ff39fdb33febec4c542a6be21c28b352eb588
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Randy-Dunlap/drm-ast-fix-double-__iomem-sparse-warning/20200819-043022
git checkout 7e1ff39fdb33febec4c542a6be21c28b352eb588
vim +42 drivers/gpu/drm/ast/ast_cursor.c

2ccebf561e4a902 Thomas Zimmermann 2020-07-02   34  
3e9d787371eaa84 Thomas Zimmermann 2020-07-02   35  static void ast_cursor_fini(struct ast_private *ast)
3e9d787371eaa84 Thomas Zimmermann 2020-07-02   36  {
3e9d787371eaa84 Thomas Zimmermann 2020-07-02   37  	size_t i;
3e9d787371eaa84 Thomas Zimmermann 2020-07-02   38  	struct drm_gem_vram_object *gbo;
3e9d787371eaa84 Thomas Zimmermann 2020-07-02   39  
3e9d787371eaa84 Thomas Zimmermann 2020-07-02   40  	for (i = 0; i < ARRAY_SIZE(ast->cursor.gbo); ++i) {
3e9d787371eaa84 Thomas Zimmermann 2020-07-02   41  		gbo = ast->cursor.gbo[i];
3e9d787371eaa84 Thomas Zimmermann 2020-07-02  @42  		drm_gem_vram_vunmap(gbo, ast->cursor.vaddr[i]);
3e9d787371eaa84 Thomas Zimmermann 2020-07-02   43  		drm_gem_vram_unpin(gbo);
3e9d787371eaa84 Thomas Zimmermann 2020-07-02   44  		drm_gem_vram_put(gbo);
3e9d787371eaa84 Thomas Zimmermann 2020-07-02   45  	}
3e9d787371eaa84 Thomas Zimmermann 2020-07-02   46  }
3e9d787371eaa84 Thomas Zimmermann 2020-07-02   47  
3e9d787371eaa84 Thomas Zimmermann 2020-07-02   48  static void ast_cursor_release(struct drm_device *dev, void *ptr)
3e9d787371eaa84 Thomas Zimmermann 2020-07-02   49  {
365c0e70da83a52 Thomas Zimmermann 2020-07-30   50  	struct ast_private *ast = to_ast_private(dev);
3e9d787371eaa84 Thomas Zimmermann 2020-07-02   51  
3e9d787371eaa84 Thomas Zimmermann 2020-07-02   52  	ast_cursor_fini(ast);
3e9d787371eaa84 Thomas Zimmermann 2020-07-02   53  }
3e9d787371eaa84 Thomas Zimmermann 2020-07-02   54  
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   55  /*
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   56   * Allocate cursor BOs and pins them at the end of VRAM.
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   57   */
beb2355eecbf67d Thomas Zimmermann 2020-07-02   58  int ast_cursor_init(struct ast_private *ast)
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   59  {
e0f5a738cfe572b Thomas Zimmermann 2020-07-30   60  	struct drm_device *dev = &ast->base;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   61  	size_t size, i;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   62  	struct drm_gem_vram_object *gbo;
0d384eec10ea723 Thomas Zimmermann 2020-07-02   63  	void __iomem *vaddr;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   64  	int ret;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   65  
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   66  	size = roundup(AST_HWC_SIZE + AST_HWC_SIGNATURE_SIZE, PAGE_SIZE);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   67  
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   68  	for (i = 0; i < ARRAY_SIZE(ast->cursor.gbo); ++i) {
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   69  		gbo = drm_gem_vram_create(dev, size, 0);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   70  		if (IS_ERR(gbo)) {
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   71  			ret = PTR_ERR(gbo);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   72  			goto err_drm_gem_vram_put;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   73  		}
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   74  		ret = drm_gem_vram_pin(gbo, DRM_GEM_VRAM_PL_FLAG_VRAM |
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   75  					    DRM_GEM_VRAM_PL_FLAG_TOPDOWN);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   76  		if (ret) {
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   77  			drm_gem_vram_put(gbo);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   78  			goto err_drm_gem_vram_put;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   79  		}
0d384eec10ea723 Thomas Zimmermann 2020-07-02  @80  		vaddr = drm_gem_vram_vmap(gbo);
0d384eec10ea723 Thomas Zimmermann 2020-07-02   81  		if (IS_ERR(vaddr)) {
0d384eec10ea723 Thomas Zimmermann 2020-07-02   82  			ret = PTR_ERR(vaddr);
0d384eec10ea723 Thomas Zimmermann 2020-07-02   83  			drm_gem_vram_unpin(gbo);
0d384eec10ea723 Thomas Zimmermann 2020-07-02   84  			drm_gem_vram_put(gbo);
0d384eec10ea723 Thomas Zimmermann 2020-07-02   85  			goto err_drm_gem_vram_put;
0d384eec10ea723 Thomas Zimmermann 2020-07-02   86  		}
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   87  
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   88  		ast->cursor.gbo[i] = gbo;
0d384eec10ea723 Thomas Zimmermann 2020-07-02   89  		ast->cursor.vaddr[i] = vaddr;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   90  	}
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   91  
3e9d787371eaa84 Thomas Zimmermann 2020-07-02   92  	return drmm_add_action_or_reset(dev, ast_cursor_release, NULL);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   93  
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   94  err_drm_gem_vram_put:
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   95  	while (i) {
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   96  		--i;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   97  		gbo = ast->cursor.gbo[i];
0d384eec10ea723 Thomas Zimmermann 2020-07-02   98  		drm_gem_vram_vunmap(gbo, ast->cursor.vaddr[i]);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02   99  		drm_gem_vram_unpin(gbo);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  100  		drm_gem_vram_put(gbo);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  101  	}
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  102  	return ret;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  103  }
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  104  
932a62aa3bfd96e Thomas Zimmermann 2020-07-02  105  static void update_cursor_image(u8 __iomem *dst, const u8 *src, int width, int height)
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  106  {
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  107  	union {
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  108  		u32 ul;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  109  		u8 b[4];
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  110  	} srcdata32[2], data32;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  111  	union {
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  112  		u16 us;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  113  		u8 b[2];
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  114  	} data16;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  115  	u32 csum = 0;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  116  	s32 alpha_dst_delta, last_alpha_dst_delta;
932a62aa3bfd96e Thomas Zimmermann 2020-07-02  117  	u8 __iomem *dstxor;
932a62aa3bfd96e Thomas Zimmermann 2020-07-02  118  	const u8 *srcxor;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  119  	int i, j;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  120  	u32 per_pixel_copy, two_pixel_copy;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  121  
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  122  	alpha_dst_delta = AST_MAX_HWC_WIDTH << 1;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  123  	last_alpha_dst_delta = alpha_dst_delta - (width << 1);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  124  
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  125  	srcxor = src;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02 @126  	dstxor = (u8 *)dst + last_alpha_dst_delta + (AST_MAX_HWC_HEIGHT - height) * alpha_dst_delta;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  127  	per_pixel_copy = width & 1;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  128  	two_pixel_copy = width >> 1;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  129  
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  130  	for (j = 0; j < height; j++) {
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  131  		for (i = 0; i < two_pixel_copy; i++) {
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  132  			srcdata32[0].ul = *((u32 *)srcxor) & 0xf0f0f0f0;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  133  			srcdata32[1].ul = *((u32 *)(srcxor + 4)) & 0xf0f0f0f0;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  134  			data32.b[0] = srcdata32[0].b[1] | (srcdata32[0].b[0] >> 4);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  135  			data32.b[1] = srcdata32[0].b[3] | (srcdata32[0].b[2] >> 4);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  136  			data32.b[2] = srcdata32[1].b[1] | (srcdata32[1].b[0] >> 4);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  137  			data32.b[3] = srcdata32[1].b[3] | (srcdata32[1].b[2] >> 4);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  138  
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  139  			writel(data32.ul, dstxor);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  140  			csum += data32.ul;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  141  
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  142  			dstxor += 4;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  143  			srcxor += 8;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  144  
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  145  		}
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  146  
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  147  		for (i = 0; i < per_pixel_copy; i++) {
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  148  			srcdata32[0].ul = *((u32 *)srcxor) & 0xf0f0f0f0;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  149  			data16.b[0] = srcdata32[0].b[1] | (srcdata32[0].b[0] >> 4);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  150  			data16.b[1] = srcdata32[0].b[3] | (srcdata32[0].b[2] >> 4);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  151  			writew(data16.us, dstxor);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  152  			csum += (u32)data16.us;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  153  
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  154  			dstxor += 2;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  155  			srcxor += 4;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  156  		}
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  157  		dstxor += last_alpha_dst_delta;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  158  	}
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  159  
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  160  	/* write checksum + signature */
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  161  	dst += AST_HWC_SIZE;
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  162  	writel(csum, dst);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  163  	writel(width, dst + AST_HWC_SIGNATURE_SizeX);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  164  	writel(height, dst + AST_HWC_SIGNATURE_SizeY);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  165  	writel(0, dst + AST_HWC_SIGNATURE_HOTSPOTX);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  166  	writel(0, dst + AST_HWC_SIGNATURE_HOTSPOTY);
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  167  }
2ccebf561e4a902 Thomas Zimmermann 2020-07-02  168  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/gzip
Size: 34962 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20200819/ee30d5df/attachment-0001.gz>


More information about the dri-devel mailing list