kernel/iomem.c:18:32: sparse: sparse: cast truncates bits from constant value (38400000050e becomes 50e)

From: kernel test robot
Date: Fri Sep 13 2024 - 17:23:41 EST


tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: e936e7d4a83b5ff6b7a685722f0ba348383af68c
commit: 0453c9a78015cb2219cda7239d881f4e3137bff8 sh: mm: convert to GENERIC_IOREMAP
date: 1 year, 1 month ago
config: sh-randconfig-r113-20240913 (https://download.01.org/0day-ci/archive/20240914/202409140544.bY7KrkTy-lkp@xxxxxxxxx/config)
compiler: sh4-linux-gcc (GCC) 14.1.0
reproduce: (https://download.01.org/0day-ci/archive/20240914/202409140544.bY7KrkTy-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/202409140544.bY7KrkTy-lkp@xxxxxxxxx/

sparse warnings: (new ones prefixed by >>)
kernel/iomem.c:113:22: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected void *[assigned] addr @@ got void [noderef] __iomem * @@
kernel/iomem.c:113:22: sparse: expected void *[assigned] addr
kernel/iomem.c:113:22: sparse: got void [noderef] __iomem *
kernel/iomem.c:116:22: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected void *[assigned] addr @@ got void [noderef] __iomem * @@
kernel/iomem.c:116:22: sparse: expected void *[assigned] addr
kernel/iomem.c:116:22: sparse: got void [noderef] __iomem *
>> kernel/iomem.c:18:32: sparse: sparse: cast truncates bits from constant value (38400000050e becomes 50e)
kernel/iomem.c: note: in included file (through include/linux/gfp.h, include/linux/xarray.h, include/linux/radix-tree.h, ...):
include/linux/mmzone.h:1997:40: sparse: sparse: self-comparison always evaluates to false
--
drivers/usb/musb/tusb6010.c: note: in included file (through arch/sh/include/asm/io.h, include/linux/io.h, include/linux/irq.h, ...):
>> include/asm-generic/io.h:1089:41: sparse: sparse: cast truncates bits from constant value (384000000506 becomes 506)

vim +18 kernel/iomem.c

5981690ddb8f72 Dan Williams 2018-03-29 14
5981690ddb8f72 Dan Williams 2018-03-29 15 #ifndef arch_memremap_wb
5981690ddb8f72 Dan Williams 2018-03-29 16 static void *arch_memremap_wb(resource_size_t offset, unsigned long size)
5981690ddb8f72 Dan Williams 2018-03-29 17 {
5981690ddb8f72 Dan Williams 2018-03-29 @18 return (__force void *)ioremap_cache(offset, size);
5981690ddb8f72 Dan Williams 2018-03-29 19 }
5981690ddb8f72 Dan Williams 2018-03-29 20 #endif
5981690ddb8f72 Dan Williams 2018-03-29 21
5981690ddb8f72 Dan Williams 2018-03-29 22 #ifndef arch_memremap_can_ram_remap
5981690ddb8f72 Dan Williams 2018-03-29 23 static bool arch_memremap_can_ram_remap(resource_size_t offset, size_t size,
5981690ddb8f72 Dan Williams 2018-03-29 24 unsigned long flags)
5981690ddb8f72 Dan Williams 2018-03-29 25 {
5981690ddb8f72 Dan Williams 2018-03-29 26 return true;
5981690ddb8f72 Dan Williams 2018-03-29 27 }
5981690ddb8f72 Dan Williams 2018-03-29 28 #endif
5981690ddb8f72 Dan Williams 2018-03-29 29
5981690ddb8f72 Dan Williams 2018-03-29 30 static void *try_ram_remap(resource_size_t offset, size_t size,
5981690ddb8f72 Dan Williams 2018-03-29 31 unsigned long flags)
5981690ddb8f72 Dan Williams 2018-03-29 32 {
5981690ddb8f72 Dan Williams 2018-03-29 33 unsigned long pfn = PHYS_PFN(offset);
5981690ddb8f72 Dan Williams 2018-03-29 34
5981690ddb8f72 Dan Williams 2018-03-29 35 /* In the simple case just return the existing linear address */
5981690ddb8f72 Dan Williams 2018-03-29 36 if (pfn_valid(pfn) && !PageHighMem(pfn_to_page(pfn)) &&
5981690ddb8f72 Dan Williams 2018-03-29 37 arch_memremap_can_ram_remap(offset, size, flags))
5981690ddb8f72 Dan Williams 2018-03-29 38 return __va(offset);
5981690ddb8f72 Dan Williams 2018-03-29 39
5981690ddb8f72 Dan Williams 2018-03-29 40 return NULL; /* fallback to arch_memremap_wb */
5981690ddb8f72 Dan Williams 2018-03-29 41 }
5981690ddb8f72 Dan Williams 2018-03-29 42
5981690ddb8f72 Dan Williams 2018-03-29 43 /**
5981690ddb8f72 Dan Williams 2018-03-29 44 * memremap() - remap an iomem_resource as cacheable memory
5981690ddb8f72 Dan Williams 2018-03-29 45 * @offset: iomem resource start address
5981690ddb8f72 Dan Williams 2018-03-29 46 * @size: size of remap
5981690ddb8f72 Dan Williams 2018-03-29 47 * @flags: any of MEMREMAP_WB, MEMREMAP_WT, MEMREMAP_WC,
5981690ddb8f72 Dan Williams 2018-03-29 48 * MEMREMAP_ENC, MEMREMAP_DEC
5981690ddb8f72 Dan Williams 2018-03-29 49 *
5981690ddb8f72 Dan Williams 2018-03-29 50 * memremap() is "ioremap" for cases where it is known that the resource
5981690ddb8f72 Dan Williams 2018-03-29 51 * being mapped does not have i/o side effects and the __iomem
5981690ddb8f72 Dan Williams 2018-03-29 52 * annotation is not applicable. In the case of multiple flags, the different
5981690ddb8f72 Dan Williams 2018-03-29 53 * mapping types will be attempted in the order listed below until one of
5981690ddb8f72 Dan Williams 2018-03-29 54 * them succeeds.
5981690ddb8f72 Dan Williams 2018-03-29 55 *
5981690ddb8f72 Dan Williams 2018-03-29 56 * MEMREMAP_WB - matches the default mapping for System RAM on
5981690ddb8f72 Dan Williams 2018-03-29 57 * the architecture. This is usually a read-allocate write-back cache.
f6c6010a077341 Wei Yang 2019-03-05 58 * Moreover, if MEMREMAP_WB is specified and the requested remap region is RAM
5981690ddb8f72 Dan Williams 2018-03-29 59 * memremap() will bypass establishing a new mapping and instead return
5981690ddb8f72 Dan Williams 2018-03-29 60 * a pointer into the direct map.
5981690ddb8f72 Dan Williams 2018-03-29 61 *
5981690ddb8f72 Dan Williams 2018-03-29 62 * MEMREMAP_WT - establish a mapping whereby writes either bypass the
5981690ddb8f72 Dan Williams 2018-03-29 63 * cache or are written through to memory and never exist in a
5981690ddb8f72 Dan Williams 2018-03-29 64 * cache-dirty state with respect to program visibility. Attempts to
5981690ddb8f72 Dan Williams 2018-03-29 65 * map System RAM with this mapping type will fail.
5981690ddb8f72 Dan Williams 2018-03-29 66 *
5981690ddb8f72 Dan Williams 2018-03-29 67 * MEMREMAP_WC - establish a writecombine mapping, whereby writes may
5981690ddb8f72 Dan Williams 2018-03-29 68 * be coalesced together (e.g. in the CPU's write buffers), but is otherwise
5981690ddb8f72 Dan Williams 2018-03-29 69 * uncached. Attempts to map System RAM with this mapping type will fail.
5981690ddb8f72 Dan Williams 2018-03-29 70 */
5981690ddb8f72 Dan Williams 2018-03-29 71 void *memremap(resource_size_t offset, size_t size, unsigned long flags)
5981690ddb8f72 Dan Williams 2018-03-29 72 {
5981690ddb8f72 Dan Williams 2018-03-29 73 int is_ram = region_intersects(offset, size,
5981690ddb8f72 Dan Williams 2018-03-29 74 IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE);
5981690ddb8f72 Dan Williams 2018-03-29 75 void *addr = NULL;
5981690ddb8f72 Dan Williams 2018-03-29 76
5981690ddb8f72 Dan Williams 2018-03-29 77 if (!flags)
5981690ddb8f72 Dan Williams 2018-03-29 78 return NULL;
5981690ddb8f72 Dan Williams 2018-03-29 79
5981690ddb8f72 Dan Williams 2018-03-29 80 if (is_ram == REGION_MIXED) {
5981690ddb8f72 Dan Williams 2018-03-29 81 WARN_ONCE(1, "memremap attempted on mixed range %pa size: %#lx\n",
5981690ddb8f72 Dan Williams 2018-03-29 82 &offset, (unsigned long) size);
5981690ddb8f72 Dan Williams 2018-03-29 83 return NULL;
5981690ddb8f72 Dan Williams 2018-03-29 84 }
5981690ddb8f72 Dan Williams 2018-03-29 85
5981690ddb8f72 Dan Williams 2018-03-29 86 /* Try all mapping types requested until one returns non-NULL */
5981690ddb8f72 Dan Williams 2018-03-29 87 if (flags & MEMREMAP_WB) {
5981690ddb8f72 Dan Williams 2018-03-29 88 /*
f6c6010a077341 Wei Yang 2019-03-05 89 * MEMREMAP_WB is special in that it can be satisfied
5981690ddb8f72 Dan Williams 2018-03-29 90 * from the direct map. Some archs depend on the
5981690ddb8f72 Dan Williams 2018-03-29 91 * capability of memremap() to autodetect cases where
5981690ddb8f72 Dan Williams 2018-03-29 92 * the requested range is potentially in System RAM.
5981690ddb8f72 Dan Williams 2018-03-29 93 */
5981690ddb8f72 Dan Williams 2018-03-29 94 if (is_ram == REGION_INTERSECTS)
5981690ddb8f72 Dan Williams 2018-03-29 95 addr = try_ram_remap(offset, size, flags);
5981690ddb8f72 Dan Williams 2018-03-29 96 if (!addr)
5981690ddb8f72 Dan Williams 2018-03-29 97 addr = arch_memremap_wb(offset, size);
5981690ddb8f72 Dan Williams 2018-03-29 98 }
5981690ddb8f72 Dan Williams 2018-03-29 99
5981690ddb8f72 Dan Williams 2018-03-29 100 /*
5981690ddb8f72 Dan Williams 2018-03-29 101 * If we don't have a mapping yet and other request flags are
5981690ddb8f72 Dan Williams 2018-03-29 102 * present then we will be attempting to establish a new virtual
5981690ddb8f72 Dan Williams 2018-03-29 103 * address mapping. Enforce that this mapping is not aliasing
5981690ddb8f72 Dan Williams 2018-03-29 104 * System RAM.
5981690ddb8f72 Dan Williams 2018-03-29 105 */
5981690ddb8f72 Dan Williams 2018-03-29 106 if (!addr && is_ram == REGION_INTERSECTS && flags != MEMREMAP_WB) {
5981690ddb8f72 Dan Williams 2018-03-29 107 WARN_ONCE(1, "memremap attempted on ram %pa size: %#lx\n",
5981690ddb8f72 Dan Williams 2018-03-29 108 &offset, (unsigned long) size);
5981690ddb8f72 Dan Williams 2018-03-29 109 return NULL;
5981690ddb8f72 Dan Williams 2018-03-29 110 }
5981690ddb8f72 Dan Williams 2018-03-29 111
5981690ddb8f72 Dan Williams 2018-03-29 112 if (!addr && (flags & MEMREMAP_WT))
5981690ddb8f72 Dan Williams 2018-03-29 @113 addr = ioremap_wt(offset, size);
5981690ddb8f72 Dan Williams 2018-03-29 114
5981690ddb8f72 Dan Williams 2018-03-29 115 if (!addr && (flags & MEMREMAP_WC))
5981690ddb8f72 Dan Williams 2018-03-29 116 addr = ioremap_wc(offset, size);
5981690ddb8f72 Dan Williams 2018-03-29 117
5981690ddb8f72 Dan Williams 2018-03-29 118 return addr;
5981690ddb8f72 Dan Williams 2018-03-29 119 }
5981690ddb8f72 Dan Williams 2018-03-29 120 EXPORT_SYMBOL(memremap);
5981690ddb8f72 Dan Williams 2018-03-29 121

:::::: The code at line 18 was first introduced by commit
:::::: 5981690ddb8f72f9546a2d017a914cf56095fc1f memremap: split devm_memremap_pages() and memremap() infrastructure

:::::: TO: Dan Williams <dan.j.williams@xxxxxxxxx>
:::::: CC: Dan Williams <dan.j.williams@xxxxxxxxx>

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