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/20221222-002812 base: 3c1f24109dfc4fb1a3730ed237e50183c6bb26b3 patch link: https://lore.kernel.org/r/20221221162630.3632486-9-daire.mcnamara%40microchip.com patch subject: [PATCH v2 8/9] PCI: microchip: Partition inbound address translation config: arm-randconfig-r046-20221218 compiler: clang version 16.0.0 (https://github.com/llvm/llvm-project 98b13979fb05f3ed288a900deb843e7b27589e58) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install arm cross compiling tool for clang build # apt-get install binutils-arm-linux-gnueabi # https://github.com/intel-lab-lkp/linux/commit/c128777fa7543f8ce931e855b7a69663509047c8 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/20221222-002812 git checkout c128777fa7543f8ce931e855b7a69663509047c8 # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm olddefconfig COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm SHELL=/bin/bash drivers/pci/controller/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot All warnings (new ones prefixed by >>): drivers/pci/controller/pcie-microchip-host.c:896:32: warning: cast from 'void (*)(struct clk *)' to 'void (*)(void *)' converts to incompatible function type [-Wcast-function-type-strict] devm_add_action_or_reset(dev, (void (*) (void *))clk_disable_unprepare, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> drivers/pci/controller/pcie-microchip-host.c:1216:18: warning: shift count is negative [-Wshift-count-negative] u64 start_axi = GENMASK(63, 0); ^~~~~~~~~~~~~~ include/linux/bits.h:38:31: note: expanded from macro 'GENMASK' (GENMASK_INPUT_CHECK(h, l) + __GENMASK(h, l)) ^~~~~~~~~~~~~~~ include/linux/bits.h:36:11: note: expanded from macro '__GENMASK' (~UL(0) >> (BITS_PER_LONG - 1 - (h)))) ^ ~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/pci/controller/pcie-microchip-host.c:1218:18: warning: shift count is negative [-Wshift-count-negative] u64 start_pci = GENMASK(63, 0); ^~~~~~~~~~~~~~ include/linux/bits.h:38:31: note: expanded from macro 'GENMASK' (GENMASK_INPUT_CHECK(h, l) + __GENMASK(h, l)) ^~~~~~~~~~~~~~~ include/linux/bits.h:36:11: note: expanded from macro '__GENMASK' (~UL(0) >> (BITS_PER_LONG - 1 - (h)))) ^ ~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/pci/controller/pcie-microchip-host.c:1282:15: warning: shift count is negative [-Wshift-count-negative] start_axi &= MC_ATT_MASK; ^~~~~~~~~~~ drivers/pci/controller/pcie-microchip-host.c:26:24: note: expanded from macro 'MC_ATT_MASK' #define MC_ATT_MASK GENMASK(63, 31) ^~~~~~~~~~~~~~~ include/linux/bits.h:38:31: note: expanded from macro 'GENMASK' (GENMASK_INPUT_CHECK(h, l) + __GENMASK(h, l)) ^~~~~~~~~~~~~~~ include/linux/bits.h:36:11: note: expanded from macro '__GENMASK' (~UL(0) >> (BITS_PER_LONG - 1 - (h)))) ^ ~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/pci/controller/pcie-microchip-host.c:1283:15: warning: shift count is negative [-Wshift-count-negative] start_pci &= MC_ATT_MASK; ^~~~~~~~~~~ drivers/pci/controller/pcie-microchip-host.c:26:24: note: expanded from macro 'MC_ATT_MASK' #define MC_ATT_MASK GENMASK(63, 31) ^~~~~~~~~~~~~~~ include/linux/bits.h:38:31: note: expanded from macro 'GENMASK' (GENMASK_INPUT_CHECK(h, l) + __GENMASK(h, l)) ^~~~~~~~~~~~~~~ include/linux/bits.h:36:11: note: expanded from macro '__GENMASK' (~UL(0) >> (BITS_PER_LONG - 1 - (h)))) ^ ~~~~~~~~~~~~~~~~~~~~~~~~~ 5 warnings generated. vim +1216 drivers/pci/controller/pcie-microchip-host.c 1205 1206 static int mc_check_for_parent_dma_range_handling(struct platform_device *pdev, 1207 struct mc_pcie *port) 1208 { 1209 struct device *dev = &pdev->dev; 1210 struct device_node *dn = dev->of_node; 1211 struct of_range_parser parser; 1212 struct of_range range; 1213 int num_parent_ranges = 0; 1214 int num_ranges = 0; 1215 struct inbound_windows ranges[MC_MAX_NUM_INBOUND_WINDOWS] = { 0 }; > 1216 u64 start_axi = GENMASK(63, 0); 1217 u64 end_axi = 0; 1218 u64 start_pci = GENMASK(63, 0); 1219 s64 size; 1220 u64 window_size; 1221 int i; 1222 1223 /* Find all dma-ranges */ 1224 if (of_pci_dma_range_parser_init(&parser, dn)) { 1225 dev_err(dev, "missing dma-ranges property\n"); 1226 return -EINVAL; 1227 } 1228 1229 for_each_of_range(&parser, &range) { 1230 if (num_ranges > MC_MAX_NUM_INBOUND_WINDOWS) { 1231 dev_err(dev, "too many inbound ranges; %d available tables\n", 1232 MC_MAX_NUM_INBOUND_WINDOWS); 1233 return -EINVAL; 1234 } 1235 ranges[num_ranges].axi_addr = range.cpu_addr; 1236 ranges[num_ranges].pci_addr = range.pci_addr; 1237 ranges[num_ranges].size = range.size; 1238 1239 num_ranges++; 1240 } 1241 1242 /* 1243 * Check for one level up; will need to adjust address translation 1244 * tables for these 1245 */ 1246 dn = of_get_parent(dn); 1247 if (dn) { 1248 of_pci_dma_range_parser_init(&parser, dn); 1249 1250 for_each_of_range(&parser, &range) { 1251 if (num_parent_ranges > MC_MAX_NUM_INBOUND_WINDOWS) { 1252 dev_err(dev, "too many parent inbound ranges; %d available tables\n", 1253 MC_MAX_NUM_INBOUND_WINDOWS); 1254 return -EINVAL; 1255 } 1256 ranges[num_parent_ranges].axi_addr = range.pci_addr; 1257 num_parent_ranges++; 1258 } 1259 } 1260 1261 if (num_parent_ranges) { 1262 if (num_ranges != num_parent_ranges) { 1263 dev_err(dev, "num parent inbound ranges must be 0 or match num inbound ranges\n"); 1264 return -EINVAL; 1265 } 1266 } 1267 1268 /* Merge ranges */ 1269 for (i = 0; i < num_ranges; i++) { 1270 struct inbound_windows *range = &ranges[i]; 1271 1272 if (range->axi_addr < start_axi) { 1273 start_axi = range->axi_addr; 1274 start_pci = range->pci_addr; 1275 } 1276 1277 if (range->axi_addr + range->size > end_axi) 1278 end_axi = range->axi_addr + range->size; 1279 } 1280 1281 /* Move starts back as far as possible */ 1282 start_axi &= MC_ATT_MASK; 1283 start_pci &= MC_ATT_MASK; 1284 1285 /* Adjust size to take account of that change */ 1286 size = end_axi - start_axi; 1287 1288 /* May need to adjust size up to the next largest power of 2 */ 1289 if (size < 1ull << ilog2(size)) 1290 size = 1ull << (ilog2(size) + 1); 1291 1292 window_size = 1ull << (ilog2(size) - 1); 1293 1294 /* Divide merged range into windows */ 1295 i = 0; 1296 while (size > 0 && i < MC_MAX_NUM_INBOUND_WINDOWS) { 1297 port->inbound_windows[i].axi_addr = start_axi; 1298 port->inbound_windows[i].pci_addr = start_pci; 1299 port->inbound_windows[i].size = window_size; 1300 1301 size -= window_size; 1302 start_axi += window_size; 1303 start_pci += window_size; 1304 i++; 1305 port->num_inbound_windows = i; 1306 } 1307 1308 if (size < 0) { 1309 dev_err(dev, "insufficient windows to map inbound ranges\n"); 1310 return -EINVAL; 1311 } 1312 1313 return 0; 1314 } 1315 -- 0-DAY CI Kernel Test Service https://01.org/lkp