tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: e138138003eb3b3d06cc91cf2e8c5dec77e2a31e commit: d4ce2de7e4af8b978eb816784d0eafc220336d52 remoteproc: pru: Add a PRU remoteproc driver date: 4 months ago config: arm64-randconfig-m031-20210325 (attached as .config) compiler: aarch64-linux-gcc (GCC) 9.3.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot smatch warnings: drivers/remoteproc/pru_rproc.c:145 pru_d_da_to_va() warn: always true condition '(da >= 0) => (0-u32max >= 0)' drivers/remoteproc/pru_rproc.c:176 pru_i_da_to_va() warn: always true condition '(da >= 0) => (0-u32max >= 0)' vim +145 drivers/remoteproc/pru_rproc.c 118 119 /* 120 * Convert PRU device address (data spaces only) to kernel virtual address. 121 * 122 * Each PRU has access to all data memories within the PRUSS, accessible at 123 * different ranges. So, look through both its primary and secondary Data 124 * RAMs as well as any shared Data RAM to convert a PRU device address to 125 * kernel virtual address. Data RAM0 is primary Data RAM for PRU0 and Data 126 * RAM1 is primary Data RAM for PRU1. 127 */ 128 static void *pru_d_da_to_va(struct pru_rproc *pru, u32 da, size_t len) 129 { 130 struct pruss_mem_region dram0, dram1, shrd_ram; 131 struct pruss *pruss = pru->pruss; 132 u32 offset; 133 void *va = NULL; 134 135 if (len == 0) 136 return NULL; 137 138 dram0 = pruss->mem_regions[PRUSS_MEM_DRAM0]; 139 dram1 = pruss->mem_regions[PRUSS_MEM_DRAM1]; 140 /* PRU1 has its local RAM addresses reversed */ 141 if (pru->id == 1) 142 swap(dram0, dram1); 143 shrd_ram = pruss->mem_regions[PRUSS_MEM_SHRD_RAM2]; 144 > 145 if (da >= PRU_PDRAM_DA && da + len <= PRU_PDRAM_DA + dram0.size) { 146 offset = da - PRU_PDRAM_DA; 147 va = (__force void *)(dram0.va + offset); 148 } else if (da >= PRU_SDRAM_DA && 149 da + len <= PRU_SDRAM_DA + dram1.size) { 150 offset = da - PRU_SDRAM_DA; 151 va = (__force void *)(dram1.va + offset); 152 } else if (da >= PRU_SHRDRAM_DA && 153 da + len <= PRU_SHRDRAM_DA + shrd_ram.size) { 154 offset = da - PRU_SHRDRAM_DA; 155 va = (__force void *)(shrd_ram.va + offset); 156 } 157 158 return va; 159 } 160 161 /* 162 * Convert PRU device address (instruction space) to kernel virtual address. 163 * 164 * A PRU does not have an unified address space. Each PRU has its very own 165 * private Instruction RAM, and its device address is identical to that of 166 * its primary Data RAM device address. 167 */ 168 static void *pru_i_da_to_va(struct pru_rproc *pru, u32 da, size_t len) 169 { 170 u32 offset; 171 void *va = NULL; 172 173 if (len == 0) 174 return NULL; 175 > 176 if (da >= PRU_IRAM_DA && 177 da + len <= PRU_IRAM_DA + pru->mem_regions[PRU_IOMEM_IRAM].size) { 178 offset = da - PRU_IRAM_DA; 179 va = (__force void *)(pru->mem_regions[PRU_IOMEM_IRAM].va + 180 offset); 181 } 182 183 return va; 184 } 185 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org