tree: https://git.kernel.org/pub/scm/linux/kernel/git/sudeep.holla/linux.git ffa_el3_spmc head: 39d86dc85a6f4c5d0f56e8e7ddd94296c1774460 commit: 39d86dc85a6f4c5d0f56e8e7ddd94296c1774460 [7/7] firmware: test_ffa: Add Test FFA driver config: arm64-randconfig-r033-20211011 (attached as .config) compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project f95d9c95bbf4cf662b9a181245fc6dcede39f590) 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 arm64 cross compiling tool for clang build # apt-get install binutils-aarch64-linux-gnu # https://git.kernel.org/pub/scm/linux/kernel/git/sudeep.holla/linux.git/commit/?id=39d86dc85a6f4c5d0f56e8e7ddd94296c1774460 git remote add sudeep-holla https://git.kernel.org/pub/scm/linux/kernel/git/sudeep.holla/linux.git git fetch --no-tags sudeep-holla ffa_el3_spmc git checkout 39d86dc85a6f4c5d0f56e8e7ddd94296c1774460 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 ARCH=arm64 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot All error/warnings (new ones prefixed by >>): >> drivers/firmware/arm_ffa_test/test_driver_ffa.c:74:5: warning: no previous prototype for function 'check_status' [-Wmissing-prototypes] int check_status(int status, int test_id) { ^ drivers/firmware/arm_ffa_test/test_driver_ffa.c:74:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int check_status(int status, int test_id) { ^ static >> drivers/firmware/arm_ffa_test/test_driver_ffa.c:150:52: warning: format specifies type 'unsigned long long' but the argument has type 'struct page *' [-Wformat] pr_debug("Page: %d at 0x%llx (0x%llx)\n", index, virt_to_page(mem_region + (index*4096*2)), ~~~~ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/printk.h:576:38: note: expanded from macro 'pr_debug' no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) ~~~ ^~~~~~~~~~~ include/linux/printk.h:132:17: note: expanded from macro 'no_printk' printk(fmt, ##__VA_ARGS__); \ ~~~ ^~~~~~~~~~~ include/linux/printk.h:446:60: note: expanded from macro 'printk' #define printk(fmt, ...) printk_index_wrap(_printk, fmt, ##__VA_ARGS__) ~~~ ^~~~~~~~~~~ include/linux/printk.h:418:19: note: expanded from macro 'printk_index_wrap' _p_func(_fmt, ##__VA_ARGS__); \ ~~~~ ^~~~~~~~~~~ arch/arm64/include/asm/memory.h:343:25: note: expanded from macro 'virt_to_page' #define virt_to_page(x) ({ \ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> drivers/firmware/arm_ffa_test/test_driver_ffa.c:115:12: warning: ISO C90 forbids mixing declarations and code [-Wdeclaration-after-statement] const u32 magic_number = 42; ^ >> drivers/firmware/arm_ffa_test/test_driver_ffa.c:84:6: warning: no previous prototype for function 'test_memory_send' [-Wmissing-prototypes] long test_memory_send(struct ffa_device *dev, bool share, bool fragmented) ^ drivers/firmware/arm_ffa_test/test_driver_ffa.c:84:1: note: declare 'static' if the function is not intended to be used outside of this translation unit long test_memory_send(struct ffa_device *dev, bool share, bool fragmented) ^ static >> drivers/firmware/arm_ffa_test/test_driver_ffa.c:227:5: warning: no previous prototype for function 'relay_message' [-Wmissing-prototypes] int relay_message(u32 message, struct ffa_device *ffa_dev, ffa_partition_id_t target) ^ drivers/firmware/arm_ffa_test/test_driver_ffa.c:227:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int relay_message(u32 message, struct ffa_device *ffa_dev, ffa_partition_id_t target) ^ static >> drivers/firmware/arm_ffa_test/test_driver_ffa.c:253:5: warning: no previous prototype for function 'echo_message' [-Wmissing-prototypes] int echo_message(u32 message, struct ffa_device *ffa_dev) ^ drivers/firmware/arm_ffa_test/test_driver_ffa.c:253:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int echo_message(u32 message, struct ffa_device *ffa_dev) ^ static >> drivers/firmware/arm_ffa_test/test_driver_ffa.c:276:6: warning: no previous prototype for function 'run_test' [-Wmissing-prototypes] long run_test(int test_id){ ^ drivers/firmware/arm_ffa_test/test_driver_ffa.c:276:1: note: declare 'static' if the function is not intended to be used outside of this translation unit long run_test(int test_id){ ^ static >> drivers/firmware/arm_ffa_test/test_driver_ffa.c:431:1: error: passing 'const struct ffa_driver *' to parameter of type 'struct ffa_driver *' discards qualifiers [-Werror,-Wincompatible-pointer-types-discards-qualifiers] module_ffa_driver(test_ffa_driver); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/arm_ffa.h:95:2: note: expanded from macro 'module_ffa_driver' module_driver(__ffa_driver, ffa_register, ffa_unregister) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/device/driver.h:261:20: note: expanded from macro 'module_driver' return __register(&(__driver) , ##__VA_ARGS__); \ ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/arm_ffa.h:82:22: note: expanded from macro 'ffa_register' ffa_driver_register(driver, THIS_MODULE, KBUILD_MODNAME) ^~~~~~ include/linux/arm_ffa.h:47:44: note: passing argument to parameter 'driver' here int ffa_driver_register(struct ffa_driver *driver, struct module *owner, ^ >> drivers/firmware/arm_ffa_test/test_driver_ffa.c:431:1: error: passing 'const struct ffa_driver *' to parameter of type 'struct ffa_driver *' discards qualifiers [-Werror,-Wincompatible-pointer-types-discards-qualifiers] module_ffa_driver(test_ffa_driver); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/arm_ffa.h:95:2: note: expanded from macro 'module_ffa_driver' module_driver(__ffa_driver, ffa_register, ffa_unregister) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/device/driver.h:266:15: note: expanded from macro 'module_driver' __unregister(&(__driver) , ##__VA_ARGS__); \ ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/arm_ffa.h:84:24: note: expanded from macro 'ffa_unregister' ffa_driver_unregister(driver) ^~~~~~ include/linux/arm_ffa.h:49:47: note: passing argument to parameter 'driver' here void ffa_driver_unregister(struct ffa_driver *driver); ^ >> drivers/firmware/arm_ffa_test/test_driver_ffa.c:433:5: warning: no previous prototype for function 'ff_a_test_init' [-Wmissing-prototypes] int ff_a_test_init(void) ^ drivers/firmware/arm_ffa_test/test_driver_ffa.c:433:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int ff_a_test_init(void) ^ static 8 warnings and 2 errors generated. vim +431 drivers/firmware/arm_ffa_test/test_driver_ffa.c 249 250 251 252 /* Test basic communication. Echo message back. */ > 253 int echo_message(u32 message, struct ffa_device *ffa_dev) 254 { 255 int rc; 256 struct ffa_send_direct_data data = { FF_A_ECHO_MESSAGE, message }; 257 258 if (ffa_dev == NULL) { 259 return -1; 260 } 261 262 rc = ffa_ops->sync_send_receive(ffa_dev, &data); 263 while (rc == -EBUSY) { 264 pr_debug("DIR_REQ: Busy - Retrying...\n"); 265 rc = ffa_ops->sync_send_receive(ffa_dev, &data); 266 } 267 268 pr_debug("Echoed data: 0x%lx 0x%lx 0x%lx\n", data.data0, data.data1, data.data2); 269 if (message != data.data0){ 270 pr_err("ERROR: Echo Test Case to %x Failed!: %lx\n", ffa_dev->vm_id, data.data0); 271 return -1; 272 } 273 return 0; 274 } 275 > 276 long run_test(int test_id){ 277 278 long ret = -3; 279 280 switch (test_id) { 281 case FF_A_MEMORY_SHARE: 282 ret = test_memory_send(sp_partition_dev, true, false); 283 break; 284 case FF_A_MEMORY_SHARE_FRAGMENTED: 285 ret = test_memory_send(sp_partition_dev, true, true); 286 break; 287 case FF_A_MEMORY_LEND: 288 ret = test_memory_send(sp_partition_dev, false, false); 289 break; 290 case FF_A_MEMORY_LEND_FRAGMENTED: 291 ret = test_memory_send(sp_partition_dev, false, true); 292 break; 293 case FF_A_ECHO_MESSAGE: 294 ret = echo_message(0xDEADBEEF, sp_partition_dev); 295 break; 296 case FF_A_RELAY_MESSAGE_EL3: 297 ret = relay_message(0xDEADBEEF, sp_partition_dev, lsp_partition_id); 298 break; 299 default: 300 ret = -2; 301 break; 302 } 303 return ret; 304 } 305 306 long ff_a_test_ioctl(struct file *fd, unsigned int cmd, unsigned long arg) 307 { 308 long ret; 309 int user_cmd = 0; 310 int i; 311 int failed = 0; 312 313 ret = copy_from_user(&user_cmd, (void *)arg, 1); 314 if(ret!=0) 315 { 316 pr_err("Failed to obtain data from userspaced\n"); 317 return -1; 318 } 319 320 /* Run individual test cases. */ 321 if (user_cmd != FF_A_RUN_ALL) { 322 ret = run_test(user_cmd); 323 if (ret == -2){ 324 pr_err("Invalid Test ID: %ld\n", ret); 325 return 0; 326 } 327 else { 328 check_status(ret, user_cmd); 329 } 330 } 331 /* Run all tests at once. */ 332 else { 333 for (i = 0; i < LAST; i++) { 334 ret = run_test(i); 335 if (ret == -2){ 336 // Ignore invalid test IDs. 337 continue; 338 } 339 else { 340 pr_info("Completed Test Case: %d\n", i); 341 ret = check_status(ret, i); 342 if (ret) { 343 failed++; 344 break; 345 } 346 } 347 } 348 pr_info("\n\n\n%d Tests Failed\n\n\n", failed); 349 } 350 351 pr_info("Exiting Test Application - Total Failures: %d\n", failed); 352 return 0; 353 } 354 355 static int device_driver_init(void) 356 { 357 struct class *cl; 358 int rc; 359 360 cl = class_create(THIS_MODULE, "ff_a_test"); 361 if (IS_ERR(cl)) 362 return PTR_ERR(cl); 363 364 /* Create char device. */ 365 rc = register_chrdev(0, "FF_A_TEST", &fops); 366 367 /* Create device file in the /dev directory. */ 368 device_create(cl, NULL, MKDEV(rc, 0),NULL, "FF_A_TEST_DEVICE"); 369 370 return rc; 371 } 372 373 static int ffa_test_driver_probe(struct ffa_device *ffa_dev) 374 { 375 pr_info("Initialising driver for Partition: 0x%x\n", ffa_dev->vm_id); 376 377 /* Check if we've discovered the Logical SP ID. */ 378 if (IS_LOGICAL_SP_ID(ffa_dev->vm_id)) { 379 pr_info("Found Logical SP with ID 0x%x\n", ffa_dev->vm_id); 380 lsp_partition_id = ffa_dev->vm_id; 381 } 382 else if (IS_PHYSICAL_SP_ID(ffa_dev->vm_id)) { 383 /* Store the discovered phyiscal partition ID. 384 * This is the partition we will interact directly with. 385 */ 386 sp_partition_id = ffa_dev->vm_id; 387 sp_partition_dev = ffa_dev; 388 pr_info("Found Physical SP with ID 0x%x\n", ffa_dev->vm_id); 389 } else { 390 pr_warn("Discovered unknown partition type.\n"); 391 return -1; 392 } 393 394 395 ffa_ops = ffa_dev_ops_get(ffa_dev); 396 if (IS_ERR_OR_NULL(ffa_ops)) 397 { 398 pr_err("Failed to obtain FFA ops %s:%d\n", __FILE__, __LINE__); 399 return -1; 400 } 401 402 /* Only do this setup once */ 403 if (!device_driver_initalized) { 404 device_driver_init(); 405 device_driver_initalized = true; 406 } 407 408 pr_info("FF-A test module init finalized\n"); 409 return 0; 410 } 411 412 static const struct of_device_id int_driver_id[] = { 413 { .compatible = "arm,ffa-1.0" }, 414 {}, 415 }; 416 417 static const struct ffa_device_id test_ffa_device_id[] = { 418 /* Physical SP UUID - BE Format */ 419 { UUID_INIT(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0) }, 420 /* Logical SP UUID - BE Format*/ 421 { UUID_INIT(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0) }, 422 {} 423 }; 424 425 static const struct ffa_driver test_ffa_driver = { 426 .name = "test_ffa", 427 .probe = ffa_test_driver_probe, 428 .id_table = test_ffa_device_id, 429 }; 430 > 431 module_ffa_driver(test_ffa_driver); 432 > 433 int ff_a_test_init(void) 434 { 435 pr_debug("FF-A test module init\n"); 436 return 0; 437 } 438 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org