tree: https://git.kernel.org/pub/scm/linux/kernel/git/lpieralisi/pci.git pci/endpoint head: 386ea4d311f756d9053d103873d54892b61fbebb commit: a4e8103481a0fa227ad6d1bf8022a2fa41f0259b [18/19] misc: pci_endpoint_test: Add support to get DMA option from userspace reproduce: # apt-get install sparse # sparse version: v0.6.1-174-g094d5a94-dirty git checkout a4e8103481a0fa227ad6d1bf8022a2fa41f0259b make ARCH=x86_64 allmodconfig make C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' If you fix the issue, kindly add following tag Reported-by: kbuild test robot sparse warnings: (new ones prefixed by >>) >> drivers/misc/pci_endpoint_test.c:347:39: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void const [noderef] *from @@ got n:1> *from @@ drivers/misc/pci_endpoint_test.c:347:39: sparse: expected void const [noderef] *from drivers/misc/pci_endpoint_test.c:347:39: sparse: got void * drivers/misc/pci_endpoint_test.c:480:39: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void const [noderef] *from @@ got n:1> *from @@ drivers/misc/pci_endpoint_test.c:480:39: sparse: expected void const [noderef] *from drivers/misc/pci_endpoint_test.c:480:39: sparse: got void * drivers/misc/pci_endpoint_test.c:577:39: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void const [noderef] *from @@ got n:1> *from @@ drivers/misc/pci_endpoint_test.c:577:39: sparse: expected void const [noderef] *from drivers/misc/pci_endpoint_test.c:577:39: sparse: got void * vim +347 drivers/misc/pci_endpoint_test.c 322 323 static bool pci_endpoint_test_copy(struct pci_endpoint_test *test, 324 unsigned long arg) 325 { 326 struct pci_endpoint_test_xfer_param param; 327 bool ret = false; 328 void *src_addr; 329 void *dst_addr; 330 u32 flags = 0; 331 bool use_dma; 332 size_t size; 333 dma_addr_t src_phys_addr; 334 dma_addr_t dst_phys_addr; 335 struct pci_dev *pdev = test->pdev; 336 struct device *dev = &pdev->dev; 337 void *orig_src_addr; 338 dma_addr_t orig_src_phys_addr; 339 void *orig_dst_addr; 340 dma_addr_t orig_dst_phys_addr; 341 size_t offset; 342 size_t alignment = test->alignment; 343 u32 src_crc32; 344 u32 dst_crc32; 345 int err; 346 > 347 err = copy_from_user(¶m, (void *)arg, sizeof(param)); 348 if (err) { 349 dev_err(dev, "Failed to get transfer param\n"); 350 return false; 351 } 352 353 size = param.size; 354 if (size > SIZE_MAX - alignment) 355 goto err; 356 357 use_dma = param.use_dma; 358 if (use_dma) 359 flags |= FLAG_USE_DMA; 360 361 if (irq_type < IRQ_TYPE_LEGACY || irq_type > IRQ_TYPE_MSIX) { 362 dev_err(dev, "Invalid IRQ type option\n"); 363 goto err; 364 } 365 366 orig_src_addr = kzalloc(size + alignment, GFP_KERNEL); 367 if (!orig_src_addr) { 368 dev_err(dev, "Failed to allocate source buffer\n"); 369 ret = false; 370 goto err; 371 } 372 373 get_random_bytes(orig_src_addr, size + alignment); 374 orig_src_phys_addr = dma_map_single(dev, orig_src_addr, 375 size + alignment, DMA_TO_DEVICE); 376 if (dma_mapping_error(dev, orig_src_phys_addr)) { 377 dev_err(dev, "failed to map source buffer address\n"); 378 ret = false; 379 goto err_src_phys_addr; 380 } 381 382 if (alignment && !IS_ALIGNED(orig_src_phys_addr, alignment)) { 383 src_phys_addr = PTR_ALIGN(orig_src_phys_addr, alignment); 384 offset = src_phys_addr - orig_src_phys_addr; 385 src_addr = orig_src_addr + offset; 386 } else { 387 src_phys_addr = orig_src_phys_addr; 388 src_addr = orig_src_addr; 389 } 390 391 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_SRC_ADDR, 392 lower_32_bits(src_phys_addr)); 393 394 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_SRC_ADDR, 395 upper_32_bits(src_phys_addr)); 396 397 src_crc32 = crc32_le(~0, src_addr, size); 398 399 orig_dst_addr = kzalloc(size + alignment, GFP_KERNEL); 400 if (!orig_dst_addr) { 401 dev_err(dev, "Failed to allocate destination address\n"); 402 ret = false; 403 goto err_dst_addr; 404 } 405 406 orig_dst_phys_addr = dma_map_single(dev, orig_dst_addr, 407 size + alignment, DMA_FROM_DEVICE); 408 if (dma_mapping_error(dev, orig_dst_phys_addr)) { 409 dev_err(dev, "failed to map destination buffer address\n"); 410 ret = false; 411 goto err_dst_phys_addr; 412 } 413 414 if (alignment && !IS_ALIGNED(orig_dst_phys_addr, alignment)) { 415 dst_phys_addr = PTR_ALIGN(orig_dst_phys_addr, alignment); 416 offset = dst_phys_addr - orig_dst_phys_addr; 417 dst_addr = orig_dst_addr + offset; 418 } else { 419 dst_phys_addr = orig_dst_phys_addr; 420 dst_addr = orig_dst_addr; 421 } 422 423 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_DST_ADDR, 424 lower_32_bits(dst_phys_addr)); 425 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_DST_ADDR, 426 upper_32_bits(dst_phys_addr)); 427 428 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE, 429 size); 430 431 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_FLAGS, flags); 432 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, irq_type); 433 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1); 434 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND, 435 COMMAND_COPY); 436 437 wait_for_completion(&test->irq_raised); 438 439 dma_unmap_single(dev, orig_dst_phys_addr, size + alignment, 440 DMA_FROM_DEVICE); 441 442 dst_crc32 = crc32_le(~0, dst_addr, size); 443 if (dst_crc32 == src_crc32) 444 ret = true; 445 446 err_dst_phys_addr: 447 kfree(orig_dst_addr); 448 449 err_dst_addr: 450 dma_unmap_single(dev, orig_src_phys_addr, size + alignment, 451 DMA_TO_DEVICE); 452 453 err_src_phys_addr: 454 kfree(orig_src_addr); 455 456 err: 457 return ret; 458 } 459 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org