:::::: :::::: Manual check reason: "low confidence static check warning: drivers/pci/controller/pcie-microchip-host.c:1209:25: sparse: sparse: shift count is negative (-32)" :::::: BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev In-Reply-To: <20221116135504.258687-9-daire.mcnamara@microchip.com> References: <20221116135504.258687-9-daire.mcnamara@microchip.com> TO: daire.mcnamara@microchip.com TO: conor.dooley@microchip.com TO: robh+dt@kernel.org TO: krzysztof.kozlowski+dt@linaro.org TO: paul.walmsley@sifive.com TO: palmer@dabbelt.com TO: aou@eecs.berkeley.edu TO: lpieralisi@kernel.org TO: kw@linux.com TO: bhelgaas@google.com TO: linux-riscv@lists.infradead.org TO: devicetree@vger.kernel.org TO: linux-pci@vger.kernel.org CC: Daire McNamara Hi, I love your patch! Perhaps something to improve: [auto build test WARNING on 3c1f24109dfc4fb1a3730ed237e50183c6bb26b3] url: https://github.com/intel-lab-lkp/linux/commits/daire-mcnamara-microchip-com/PCI-microchip-Partition-address-translations/20221116-220208 base: 3c1f24109dfc4fb1a3730ed237e50183c6bb26b3 patch link: https://lore.kernel.org/r/20221116135504.258687-9-daire.mcnamara%40microchip.com patch subject: [PATCH v1 8/9] PCI: microchip: Partition inbound address translation :::::: branch date: 11 days ago :::::: commit date: 11 days ago config: i386-randconfig-s001 compiler: gcc-11 (Debian 11.3.0-8) 11.3.0 reproduce: # apt-get install sparse # sparse version: v0.6.4-39-gce1a6720-dirty # https://github.com/intel-lab-lkp/linux/commit/41006bdc423e557398463818442a7607a8111347 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review daire-mcnamara-microchip-com/PCI-microchip-Partition-address-translations/20221116-220208 git checkout 41006bdc423e557398463818442a7607a8111347 # save the config file mkdir build_dir && cp config build_dir/.config make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=i386 SHELL=/bin/bash drivers/pci/controller/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot sparse warnings: (new ones prefixed by >>) >> drivers/pci/controller/pcie-microchip-host.c:1209:25: sparse: sparse: shift count is negative (-32) vim +1209 drivers/pci/controller/pcie-microchip-host.c 08e387d6bffe3d Daire McNamara 2022-11-16 1198 41006bdc423e55 Daire McNamara 2022-11-16 1199 static int mc_check_for_parent_dma_range_handling(struct platform_device *pdev, 41006bdc423e55 Daire McNamara 2022-11-16 1200 struct mc_pcie *port) 41006bdc423e55 Daire McNamara 2022-11-16 1201 { 41006bdc423e55 Daire McNamara 2022-11-16 1202 struct device *dev = &pdev->dev; 41006bdc423e55 Daire McNamara 2022-11-16 1203 struct device_node *dn = dev->of_node; 41006bdc423e55 Daire McNamara 2022-11-16 1204 struct of_range_parser parser; 41006bdc423e55 Daire McNamara 2022-11-16 1205 struct of_range range; 41006bdc423e55 Daire McNamara 2022-11-16 1206 int num_parent_ranges = 0; 41006bdc423e55 Daire McNamara 2022-11-16 1207 int num_ranges = 0; 41006bdc423e55 Daire McNamara 2022-11-16 1208 struct inbound_windows ranges[MC_MAX_NUM_INBOUND_WINDOWS] = { 0 }; 41006bdc423e55 Daire McNamara 2022-11-16 @1209 u64 start_axi = GENMASK(63, 0); 41006bdc423e55 Daire McNamara 2022-11-16 1210 u64 end_axi = 0; 41006bdc423e55 Daire McNamara 2022-11-16 1211 u64 start_pci = GENMASK(63, 0); 41006bdc423e55 Daire McNamara 2022-11-16 1212 u64 end_pci = 0; 41006bdc423e55 Daire McNamara 2022-11-16 1213 s64 size; 41006bdc423e55 Daire McNamara 2022-11-16 1214 u64 window_size; 41006bdc423e55 Daire McNamara 2022-11-16 1215 int i; 41006bdc423e55 Daire McNamara 2022-11-16 1216 41006bdc423e55 Daire McNamara 2022-11-16 1217 /* find all dma-ranges */ 41006bdc423e55 Daire McNamara 2022-11-16 1218 if (of_pci_dma_range_parser_init(&parser, dn)) { 41006bdc423e55 Daire McNamara 2022-11-16 1219 dev_err(dev, "missing dma-ranges property\n"); 41006bdc423e55 Daire McNamara 2022-11-16 1220 return -EINVAL; 41006bdc423e55 Daire McNamara 2022-11-16 1221 } 41006bdc423e55 Daire McNamara 2022-11-16 1222 41006bdc423e55 Daire McNamara 2022-11-16 1223 for_each_of_range(&parser, &range) { 41006bdc423e55 Daire McNamara 2022-11-16 1224 if (num_ranges > MC_MAX_NUM_INBOUND_WINDOWS) { 41006bdc423e55 Daire McNamara 2022-11-16 1225 dev_err(dev, "too many inbound ranges; %d available tables\n", 41006bdc423e55 Daire McNamara 2022-11-16 1226 MC_MAX_NUM_INBOUND_WINDOWS); 41006bdc423e55 Daire McNamara 2022-11-16 1227 return -EINVAL; 41006bdc423e55 Daire McNamara 2022-11-16 1228 } 41006bdc423e55 Daire McNamara 2022-11-16 1229 ranges[num_ranges].axi_addr = range.cpu_addr; 41006bdc423e55 Daire McNamara 2022-11-16 1230 ranges[num_ranges].pci_addr = range.pci_addr; 41006bdc423e55 Daire McNamara 2022-11-16 1231 ranges[num_ranges].size = range.size; 41006bdc423e55 Daire McNamara 2022-11-16 1232 41006bdc423e55 Daire McNamara 2022-11-16 1233 num_ranges++; 41006bdc423e55 Daire McNamara 2022-11-16 1234 } 41006bdc423e55 Daire McNamara 2022-11-16 1235 41006bdc423e55 Daire McNamara 2022-11-16 1236 /* 41006bdc423e55 Daire McNamara 2022-11-16 1237 * check for one level up; will need to adjust 41006bdc423e55 Daire McNamara 2022-11-16 1238 * address translation tables for these 41006bdc423e55 Daire McNamara 2022-11-16 1239 */ 41006bdc423e55 Daire McNamara 2022-11-16 1240 dn = of_get_parent(dn); 41006bdc423e55 Daire McNamara 2022-11-16 1241 if (dn) { 41006bdc423e55 Daire McNamara 2022-11-16 1242 of_pci_dma_range_parser_init(&parser, dn); 41006bdc423e55 Daire McNamara 2022-11-16 1243 41006bdc423e55 Daire McNamara 2022-11-16 1244 for_each_of_range(&parser, &range) { 41006bdc423e55 Daire McNamara 2022-11-16 1245 if (num_parent_ranges > MC_MAX_NUM_INBOUND_WINDOWS) { 41006bdc423e55 Daire McNamara 2022-11-16 1246 dev_err(dev, "too many parent inbound ranges; %d available tables\n", 41006bdc423e55 Daire McNamara 2022-11-16 1247 MC_MAX_NUM_INBOUND_WINDOWS); 41006bdc423e55 Daire McNamara 2022-11-16 1248 return -EINVAL; 41006bdc423e55 Daire McNamara 2022-11-16 1249 } 41006bdc423e55 Daire McNamara 2022-11-16 1250 ranges[num_parent_ranges].axi_addr = range.pci_addr; 41006bdc423e55 Daire McNamara 2022-11-16 1251 num_parent_ranges++; 41006bdc423e55 Daire McNamara 2022-11-16 1252 } 41006bdc423e55 Daire McNamara 2022-11-16 1253 } 41006bdc423e55 Daire McNamara 2022-11-16 1254 41006bdc423e55 Daire McNamara 2022-11-16 1255 if (num_parent_ranges) { 41006bdc423e55 Daire McNamara 2022-11-16 1256 if (num_ranges != num_parent_ranges) { 41006bdc423e55 Daire McNamara 2022-11-16 1257 dev_err(dev, "num parent inbound ranges must be 0 or match num inbound ranges\n"); 41006bdc423e55 Daire McNamara 2022-11-16 1258 return -EINVAL; 41006bdc423e55 Daire McNamara 2022-11-16 1259 } 41006bdc423e55 Daire McNamara 2022-11-16 1260 } 41006bdc423e55 Daire McNamara 2022-11-16 1261 41006bdc423e55 Daire McNamara 2022-11-16 1262 /* merge ranges */ 41006bdc423e55 Daire McNamara 2022-11-16 1263 for (i = 0; i < num_ranges; i++) { 41006bdc423e55 Daire McNamara 2022-11-16 1264 struct inbound_windows *range = &ranges[i]; 41006bdc423e55 Daire McNamara 2022-11-16 1265 41006bdc423e55 Daire McNamara 2022-11-16 1266 if (range->axi_addr < start_axi) { 41006bdc423e55 Daire McNamara 2022-11-16 1267 start_axi = range->axi_addr; 41006bdc423e55 Daire McNamara 2022-11-16 1268 start_pci = range->pci_addr; 41006bdc423e55 Daire McNamara 2022-11-16 1269 } 41006bdc423e55 Daire McNamara 2022-11-16 1270 41006bdc423e55 Daire McNamara 2022-11-16 1271 if (range->axi_addr + range->size > end_axi) { 41006bdc423e55 Daire McNamara 2022-11-16 1272 end_axi = range->axi_addr + range->size; 41006bdc423e55 Daire McNamara 2022-11-16 1273 end_pci = range->pci_addr + range->size; 41006bdc423e55 Daire McNamara 2022-11-16 1274 } 41006bdc423e55 Daire McNamara 2022-11-16 1275 } 41006bdc423e55 Daire McNamara 2022-11-16 1276 41006bdc423e55 Daire McNamara 2022-11-16 1277 /* move starts back as far as possible */ 41006bdc423e55 Daire McNamara 2022-11-16 1278 start_axi &= MC_ATT_MASK; 41006bdc423e55 Daire McNamara 2022-11-16 1279 start_pci &= MC_ATT_MASK; 41006bdc423e55 Daire McNamara 2022-11-16 1280 41006bdc423e55 Daire McNamara 2022-11-16 1281 /* adjust size to take account of that change */ 41006bdc423e55 Daire McNamara 2022-11-16 1282 size = end_axi - start_axi; 41006bdc423e55 Daire McNamara 2022-11-16 1283 41006bdc423e55 Daire McNamara 2022-11-16 1284 /* may need to adjust size up to the next largest power of 2 */ 41006bdc423e55 Daire McNamara 2022-11-16 1285 if (size < 1ull << ilog2(size)) 41006bdc423e55 Daire McNamara 2022-11-16 1286 size = 1ull << (ilog2(size) + 1); 41006bdc423e55 Daire McNamara 2022-11-16 1287 41006bdc423e55 Daire McNamara 2022-11-16 1288 window_size = 1ull << (ilog2(size) - 1); 41006bdc423e55 Daire McNamara 2022-11-16 1289 41006bdc423e55 Daire McNamara 2022-11-16 1290 /* divide merged range into windows */ 41006bdc423e55 Daire McNamara 2022-11-16 1291 i = 0; 41006bdc423e55 Daire McNamara 2022-11-16 1292 while (size > 0 && i < MC_MAX_NUM_INBOUND_WINDOWS) { 41006bdc423e55 Daire McNamara 2022-11-16 1293 port->inbound_windows[i].axi_addr = start_axi; 41006bdc423e55 Daire McNamara 2022-11-16 1294 port->inbound_windows[i].pci_addr = start_pci; 41006bdc423e55 Daire McNamara 2022-11-16 1295 port->inbound_windows[i].size = window_size; 41006bdc423e55 Daire McNamara 2022-11-16 1296 41006bdc423e55 Daire McNamara 2022-11-16 1297 size -= window_size; 41006bdc423e55 Daire McNamara 2022-11-16 1298 start_axi += window_size; 41006bdc423e55 Daire McNamara 2022-11-16 1299 start_pci += window_size; 41006bdc423e55 Daire McNamara 2022-11-16 1300 i++; 41006bdc423e55 Daire McNamara 2022-11-16 1301 port->num_inbound_windows = i; 41006bdc423e55 Daire McNamara 2022-11-16 1302 } 41006bdc423e55 Daire McNamara 2022-11-16 1303 41006bdc423e55 Daire McNamara 2022-11-16 1304 if (size < 0) { 41006bdc423e55 Daire McNamara 2022-11-16 1305 dev_err(dev, "insufficient windows to map inbound ranges\n"); 41006bdc423e55 Daire McNamara 2022-11-16 1306 return -EINVAL; 41006bdc423e55 Daire McNamara 2022-11-16 1307 } 41006bdc423e55 Daire McNamara 2022-11-16 1308 41006bdc423e55 Daire McNamara 2022-11-16 1309 return 0; 41006bdc423e55 Daire McNamara 2022-11-16 1310 } 41006bdc423e55 Daire McNamara 2022-11-16 1311 -- 0-DAY CI Kernel Test Service https://01.org/lkp