1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * PPS core file 4 * 5 * Copyright (C) 2005-2009 Rodolfo Giometti <giometti@linux.it> 6 */ 7 8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 9 10 #include <linux/kernel.h> 11 #include <linux/module.h> 12 #include <linux/init.h> 13 #include <linux/sched.h> 14 #include <linux/uaccess.h> 15 #include <linux/idr.h> 16 #include <linux/mutex.h> 17 #include <linux/cdev.h> 18 #include <linux/poll.h> 19 #include <linux/pps_kernel.h> 20 #include <linux/slab.h> 21 22 #include "kc.h" 23 24 /* 25 * Local variables 26 */ 27 28 static dev_t pps_devt; 29 static struct class *pps_class; 30 31 static DEFINE_MUTEX(pps_idr_lock); 32 static DEFINE_IDR(pps_idr); 33 34 /* 35 * Char device methods 36 */ 37 38 static __poll_t pps_cdev_poll(struct file *file, poll_table *wait) 39 { 40 struct pps_device *pps = file->private_data; 41 42 poll_wait(file, &pps->queue, wait); 43 44 return EPOLLIN | EPOLLRDNORM; 45 } 46 47 static int pps_cdev_fasync(int fd, struct file *file, int on) 48 { 49 struct pps_device *pps = file->private_data; 50 return fasync_helper(fd, file, on, &pps->async_queue); 51 } 52 53 static int pps_cdev_pps_fetch(struct pps_device *pps, struct pps_fdata *fdata) 54 { 55 unsigned int ev = pps->last_ev; 56 int err = 0; 57 58 /* Manage the timeout */ 59 if (fdata->timeout.flags & PPS_TIME_INVALID) 60 err = wait_event_interruptible(pps->queue, 61 ev != pps->last_ev); 62 else { 63 unsigned long ticks; 64 65 dev_dbg(pps->dev, "timeout %lld.%09d\n", 66 (long long) fdata->timeout.sec, 67 fdata->timeout.nsec); 68 ticks = fdata->timeout.sec * HZ; 69 ticks += fdata->timeout.nsec / (NSEC_PER_SEC / HZ); 70 71 if (ticks != 0) { 72 err = wait_event_interruptible_timeout( 73 pps->queue, 74 ev != pps->last_ev, 75 ticks); 76 if (err == 0) 77 return -ETIMEDOUT; 78 } 79 } 80 81 /* Check for pending signals */ 82 if (err == -ERESTARTSYS) { 83 dev_dbg(pps->dev, "pending signal caught\n"); 84 return -EINTR; 85 } 86 87 return 0; 88 } 89 90 static long pps_cdev_ioctl(struct file *file, 91 unsigned int cmd, unsigned long arg) 92 { 93 struct pps_device *pps = file->private_data; 94 struct pps_kparams params; 95 void __user *uarg = (void __user *) arg; 96 int __user *iuarg = (int __user *) arg; 97 int err; 98 99 switch (cmd) { 100 case PPS_GETPARAMS: 101 dev_dbg(pps->dev, "PPS_GETPARAMS\n"); 102 103 spin_lock_irq(&pps->lock); 104 105 /* Get the current parameters */ 106 params = pps->params; 107 108 spin_unlock_irq(&pps->lock); 109 110 err = copy_to_user(uarg, ¶ms, sizeof(struct pps_kparams)); 111 if (err) 112 return -EFAULT; 113 114 break; 115 116 case PPS_SETPARAMS: 117 dev_dbg(pps->dev, "PPS_SETPARAMS\n"); 118 119 /* Check the capabilities */ 120 if (!capable(CAP_SYS_TIME)) 121 return -EPERM; 122 123 err = copy_from_user(¶ms, uarg, sizeof(struct pps_kparams)); 124 if (err) 125 return -EFAULT; 126 if (!(params.mode & (PPS_CAPTUREASSERT | PPS_CAPTURECLEAR))) { 127 dev_dbg(pps->dev, "capture mode unspecified (%x)\n", 128 params.mode); 129 return -EINVAL; 130 } 131 132 /* Check for supported capabilities */ 133 if ((params.mode & ~pps->info.mode) != 0) { 134 dev_dbg(pps->dev, "unsupported capabilities (%x)\n", 135 params.mode); 136 return -EINVAL; 137 } 138 139 spin_lock_irq(&pps->lock); 140 141 /* Save the new parameters */ 142 pps->params = params; 143 144 /* Restore the read only parameters */ 145 if ((params.mode & (PPS_TSFMT_TSPEC | PPS_TSFMT_NTPFP)) == 0) { 146 /* section 3.3 of RFC 2783 interpreted */ 147 dev_dbg(pps->dev, "time format unspecified (%x)\n", 148 params.mode); 149 pps->params.mode |= PPS_TSFMT_TSPEC; 150 } 151 if (pps->info.mode & PPS_CANWAIT) 152 pps->params.mode |= PPS_CANWAIT; 153 pps->params.api_version = PPS_API_VERS; 154 155 /* 156 * Clear unused fields of pps_kparams to avoid leaking 157 * uninitialized data of the PPS_SETPARAMS caller via 158 * PPS_GETPARAMS 159 */ 160 pps->params.assert_off_tu.flags = 0; 161 pps->params.clear_off_tu.flags = 0; 162 163 spin_unlock_irq(&pps->lock); 164 165 break; 166 167 case PPS_GETCAP: 168 dev_dbg(pps->dev, "PPS_GETCAP\n"); 169 170 err = put_user(pps->info.mode, iuarg); 171 if (err) 172 return -EFAULT; 173 174 break; 175 176 case PPS_FETCH: { 177 struct pps_fdata fdata; 178 179 dev_dbg(pps->dev, "PPS_FETCH\n"); 180 181 err = copy_from_user(&fdata, uarg, sizeof(struct pps_fdata)); 182 if (err) 183 return -EFAULT; 184 185 err = pps_cdev_pps_fetch(pps, &fdata); 186 if (err) 187 return err; 188 189 /* Return the fetched timestamp */ 190 spin_lock_irq(&pps->lock); 191 192 fdata.info.assert_sequence = pps->assert_sequence; 193 fdata.info.clear_sequence = pps->clear_sequence; 194 fdata.info.assert_tu = pps->assert_tu; 195 fdata.info.clear_tu = pps->clear_tu; 196 fdata.info.current_mode = pps->current_mode; 197 198 spin_unlock_irq(&pps->lock); 199 200 err = copy_to_user(uarg, &fdata, sizeof(struct pps_fdata)); 201 if (err) 202 return -EFAULT; 203 204 break; 205 } 206 case PPS_KC_BIND: { 207 struct pps_bind_args bind_args; 208 209 dev_dbg(pps->dev, "PPS_KC_BIND\n"); 210 211 /* Check the capabilities */ 212 if (!capable(CAP_SYS_TIME)) 213 return -EPERM; 214 215 if (copy_from_user(&bind_args, uarg, 216 sizeof(struct pps_bind_args))) 217 return -EFAULT; 218 219 /* Check for supported capabilities */ 220 if ((bind_args.edge & ~pps->info.mode) != 0) { 221 dev_err(pps->dev, "unsupported capabilities (%x)\n", 222 bind_args.edge); 223 return -EINVAL; 224 } 225 226 /* Validate parameters roughly */ 227 if (bind_args.tsformat != PPS_TSFMT_TSPEC || 228 (bind_args.edge & ~PPS_CAPTUREBOTH) != 0 || 229 bind_args.consumer != PPS_KC_HARDPPS) { 230 dev_err(pps->dev, "invalid kernel consumer bind" 231 " parameters (%x)\n", bind_args.edge); 232 return -EINVAL; 233 } 234 235 err = pps_kc_bind(pps, &bind_args); 236 if (err < 0) 237 return err; 238 239 break; 240 } 241 default: 242 return -ENOTTY; 243 } 244 245 return 0; 246 } 247 248 #ifdef CONFIG_COMPAT 249 static long pps_cdev_compat_ioctl(struct file *file, 250 unsigned int cmd, unsigned long arg) 251 { 252 struct pps_device *pps = file->private_data; 253 void __user *uarg = (void __user *) arg; 254 255 cmd = _IOC(_IOC_DIR(cmd), _IOC_TYPE(cmd), _IOC_NR(cmd), sizeof(void *)); 256 257 if (cmd == PPS_FETCH) { 258 struct pps_fdata_compat compat; 259 struct pps_fdata fdata; 260 int err; 261 262 dev_dbg(pps->dev, "PPS_FETCH\n"); 263 264 err = copy_from_user(&compat, uarg, sizeof(struct pps_fdata_compat)); 265 if (err) 266 return -EFAULT; 267 268 memcpy(&fdata.timeout, &compat.timeout, 269 sizeof(struct pps_ktime_compat)); 270 271 err = pps_cdev_pps_fetch(pps, &fdata); 272 if (err) 273 return err; 274 275 /* Return the fetched timestamp */ 276 spin_lock_irq(&pps->lock); 277 278 compat.info.assert_sequence = pps->assert_sequence; 279 compat.info.clear_sequence = pps->clear_sequence; 280 compat.info.current_mode = pps->current_mode; 281 282 memcpy(&compat.info.assert_tu, &pps->assert_tu, 283 sizeof(struct pps_ktime_compat)); 284 memcpy(&compat.info.clear_tu, &pps->clear_tu, 285 sizeof(struct pps_ktime_compat)); 286 287 spin_unlock_irq(&pps->lock); 288 289 return copy_to_user(uarg, &compat, 290 sizeof(struct pps_fdata_compat)) ? -EFAULT : 0; 291 } 292 293 return pps_cdev_ioctl(file, cmd, arg); 294 } 295 #else 296 #define pps_cdev_compat_ioctl NULL 297 #endif 298 299 static int pps_cdev_open(struct inode *inode, struct file *file) 300 { 301 struct pps_device *pps = container_of(inode->i_cdev, 302 struct pps_device, cdev); 303 file->private_data = pps; 304 kobject_get(&pps->dev->kobj); 305 return 0; 306 } 307 308 static int pps_cdev_release(struct inode *inode, struct file *file) 309 { 310 struct pps_device *pps = container_of(inode->i_cdev, 311 struct pps_device, cdev); 312 kobject_put(&pps->dev->kobj); 313 return 0; 314 } 315 316 /* 317 * Char device stuff 318 */ 319 320 static const struct file_operations pps_cdev_fops = { 321 .owner = THIS_MODULE, 322 .poll = pps_cdev_poll, 323 .fasync = pps_cdev_fasync, 324 .compat_ioctl = pps_cdev_compat_ioctl, 325 .unlocked_ioctl = pps_cdev_ioctl, 326 .open = pps_cdev_open, 327 .release = pps_cdev_release, 328 }; 329 330 static void pps_device_destruct(struct device *dev) 331 { 332 struct pps_device *pps = dev_get_drvdata(dev); 333 334 cdev_del(&pps->cdev); 335 336 /* Now we can release the ID for re-use */ 337 pr_debug("deallocating pps%d\n", pps->id); 338 mutex_lock(&pps_idr_lock); 339 idr_remove(&pps_idr, pps->id); 340 mutex_unlock(&pps_idr_lock); 341 342 kfree(dev); 343 kfree(pps); 344 } 345 346 int pps_register_cdev(struct pps_device *pps) 347 { 348 int err; 349 dev_t devt; 350 351 mutex_lock(&pps_idr_lock); 352 /* 353 * Get new ID for the new PPS source. After idr_alloc() calling 354 * the new source will be freely available into the kernel. 355 */ 356 err = idr_alloc(&pps_idr, pps, 0, PPS_MAX_SOURCES, GFP_KERNEL); 357 if (err < 0) { 358 if (err == -ENOSPC) { 359 pr_err("%s: too many PPS sources in the system\n", 360 pps->info.name); 361 err = -EBUSY; 362 } 363 goto out_unlock; 364 } 365 pps->id = err; 366 mutex_unlock(&pps_idr_lock); 367 368 devt = MKDEV(MAJOR(pps_devt), pps->id); 369 370 cdev_init(&pps->cdev, &pps_cdev_fops); 371 pps->cdev.owner = pps->info.owner; 372 373 err = cdev_add(&pps->cdev, devt, 1); 374 if (err) { 375 pr_err("%s: failed to add char device %d:%d\n", 376 pps->info.name, MAJOR(pps_devt), pps->id); 377 goto free_idr; 378 } 379 pps->dev = device_create(pps_class, pps->info.dev, devt, pps, 380 "pps%d", pps->id); 381 if (IS_ERR(pps->dev)) { 382 err = PTR_ERR(pps->dev); 383 goto del_cdev; 384 } 385 386 /* Override the release function with our own */ 387 pps->dev->release = pps_device_destruct; 388 389 pr_debug("source %s got cdev (%d:%d)\n", pps->info.name, 390 MAJOR(pps_devt), pps->id); 391 392 return 0; 393 394 del_cdev: 395 cdev_del(&pps->cdev); 396 397 free_idr: 398 mutex_lock(&pps_idr_lock); 399 idr_remove(&pps_idr, pps->id); 400 out_unlock: 401 mutex_unlock(&pps_idr_lock); 402 return err; 403 } 404 405 void pps_unregister_cdev(struct pps_device *pps) 406 { 407 pr_debug("unregistering pps%d\n", pps->id); 408 pps->lookup_cookie = NULL; 409 device_destroy(pps_class, pps->dev->devt); 410 } 411 412 /* 413 * Look up a pps device by magic cookie. 414 * The cookie is usually a pointer to some enclosing device, but this 415 * code doesn't care; you should never be dereferencing it. 416 * 417 * This is a bit of a kludge that is currently used only by the PPS 418 * serial line discipline. It may need to be tweaked when a second user 419 * is found. 420 * 421 * There is no function interface for setting the lookup_cookie field. 422 * It's initialized to NULL when the pps device is created, and if a 423 * client wants to use it, just fill it in afterward. 424 * 425 * The cookie is automatically set to NULL in pps_unregister_source() 426 * so that it will not be used again, even if the pps device cannot 427 * be removed from the idr due to pending references holding the minor 428 * number in use. 429 */ 430 struct pps_device *pps_lookup_dev(void const *cookie) 431 { 432 struct pps_device *pps; 433 unsigned id; 434 435 rcu_read_lock(); 436 idr_for_each_entry(&pps_idr, pps, id) 437 if (cookie == pps->lookup_cookie) 438 break; 439 rcu_read_unlock(); 440 return pps; 441 } 442 EXPORT_SYMBOL(pps_lookup_dev); 443 444 /* 445 * Module stuff 446 */ 447 448 static void __exit pps_exit(void) 449 { 450 class_destroy(pps_class); 451 unregister_chrdev_region(pps_devt, PPS_MAX_SOURCES); 452 } 453 454 static int __init pps_init(void) 455 { 456 int err; 457 458 pps_class = class_create("pps"); 459 if (IS_ERR(pps_class)) { 460 pr_err("failed to allocate class\n"); 461 return PTR_ERR(pps_class); 462 } 463 pps_class->dev_groups = pps_groups; 464 465 err = alloc_chrdev_region(&pps_devt, 0, PPS_MAX_SOURCES, "pps"); 466 if (err < 0) { 467 pr_err("failed to allocate char device region\n"); 468 goto remove_class; 469 } 470 471 pr_info("LinuxPPS API ver. %d registered\n", PPS_API_VERS); 472 pr_info("Software ver. %s - Copyright 2005-2007 Rodolfo Giometti " 473 "<giometti@linux.it>\n", PPS_VERSION); 474 475 return 0; 476 477 remove_class: 478 class_destroy(pps_class); 479 480 return err; 481 } 482 483 subsys_initcall(pps_init); 484 module_exit(pps_exit); 485 486 MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>"); 487 MODULE_DESCRIPTION("LinuxPPS support (RFC 2783) - ver. " PPS_VERSION); 488 MODULE_LICENSE("GPL"); 489