static int omap_rproc_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) { int rc = 0; struct omap_rproc *rproc = filp->private_data; if (!rproc) return -EINVAL; if (_IOC_TYPE(cmd) != RPROC_IOC_MAGIC) return -ENOTTY; if (_IOC_NR(cmd) > RPROC_IOC_MAXNR) return -ENOTTY; if (_IOC_DIR(cmd) & _IOC_READ) { if (!access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd))) return -EFAULT; } else if (_IOC_DIR(cmd) & _IOC_WRITE) { if (!access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd))) return -EFAULT; } switch (cmd) { case RPROC_IOCSTART: /*FIXME: re-visit this check to perform proper permission checks */ /*if (!capable(CAP_SYS_ADMIN)) return -EPERM;*/ rc = rproc_start(rproc, (const void __user *) arg); break; case RPROC_IOCSTOP: /*FIXME: re-visit this check to perform proper permission checks */ /*if (!capable(CAP_SYS_ADMIN)) return -EPERM;*/ rc = rproc_stop(rproc); break; case RPROC_IOCGETSTATE: rc = rproc_get_state(rproc); break; default: return -ENOTTY; } return rc; }
/** * do_remoteproc_wrapper() - wrapper for various rproc commands * @cmdtp: unused * @flag: unused * @argc: argument count for the rproc command * @argv: arguments for the rproc command * * Most of the commands just take id as a parameter andinvoke various * helper routines in remote processor core. by using a set of * common checks, we can reduce the amount of code used for this. * * Return: 0 if no error, else returns appropriate error value. */ static int do_remoteproc_wrapper(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) { int id, ret = CMD_RET_USAGE; if (argc != 2) return CMD_RET_USAGE; id = (int)simple_strtoul(argv[1], NULL, 3); if (!rproc_is_initialized()) { printf("\tRemote Processors are not initialized\n"); return CMD_RET_USAGE; } if (!strcmp(argv[0], "start")) { ret = rproc_start(id); } else if (!strcmp(argv[0], "stop")) { ret = rproc_stop(id); } else if (!strcmp(argv[0], "reset")) { ret = rproc_reset(id); } else if (!strcmp(argv[0], "is_running")) { ret = rproc_is_running(id); if (!ret) { printf("Remote processor is Running\n"); } else if (ret == 1) { printf("Remote processor is NOT Running\n"); ret = 0; } /* Else error.. */ } else if (!strcmp(argv[0], "ping")) { ret = rproc_ping(id); if (!ret) { printf("Remote processor responds 'Pong'\n"); } else if (ret == 1) { printf("No response from Remote processor\n"); ret = 0; } /* Else error.. */ } if (ret < 0) printf("Operation Failed with error (%d)\n", ret); return ret ? CMD_RET_FAILURE : 0; }
/** * dm_test_remoteproc_base() - test the operations after initializations * @uts: unit test state * * Return: 0 if test passed, else error */ static int dm_test_remoteproc_base(struct unit_test_state *uts) { if (!rproc_is_initialized()) ut_assertok(rproc_init()); /* Ensure we are initialized */ ut_asserteq(true, rproc_is_initialized()); /* platform data device 1 */ ut_assertok(rproc_stop(0)); ut_assertok(rproc_reset(0)); /* -> invalid attempt tests */ ut_asserteq(-EINVAL, rproc_start(0)); ut_asserteq(-EINVAL, rproc_ping(0)); /* Valid tests */ ut_assertok(rproc_load(0, 1, 0)); ut_assertok(rproc_start(0)); ut_assertok(rproc_is_running(0)); ut_assertok(rproc_ping(0)); ut_assertok(rproc_reset(0)); ut_assertok(rproc_stop(0)); /* dt device device 1 */ ut_assertok(rproc_stop(1)); ut_assertok(rproc_reset(1)); ut_assertok(rproc_load(1, 1, 0)); ut_assertok(rproc_start(1)); ut_assertok(rproc_is_running(1)); ut_assertok(rproc_ping(1)); ut_assertok(rproc_reset(1)); ut_assertok(rproc_stop(1)); /* dt device device 2 */ ut_assertok(rproc_stop(0)); ut_assertok(rproc_reset(0)); /* -> invalid attempt tests */ ut_asserteq(-EINVAL, rproc_start(0)); ut_asserteq(-EINVAL, rproc_ping(0)); /* Valid tests */ ut_assertok(rproc_load(2, 1, 0)); ut_assertok(rproc_start(2)); ut_assertok(rproc_is_running(2)); ut_assertok(rproc_ping(2)); ut_assertok(rproc_reset(2)); ut_assertok(rproc_stop(2)); return 0; }