1 /* 2 * Routines for driver control interface 3 * Copyright (c) by Jaroslav Kysela <perex@perex.cz> 4 * 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 * 20 */ 21 22 #include <linux/threads.h> 23 #include <linux/interrupt.h> 24 #include <linux/module.h> 25 #include <linux/slab.h> 26 #include <linux/vmalloc.h> 27 #include <linux/time.h> 28 #include <linux/mm.h> 29 #include <linux/sched/signal.h> 30 #include <sound/core.h> 31 #include <sound/minors.h> 32 #include <sound/info.h> 33 #include <sound/control.h> 34 35 /* max number of user-defined controls */ 36 #define MAX_USER_CONTROLS 32 37 #define MAX_CONTROL_COUNT 1028 38 39 struct snd_kctl_ioctl { 40 struct list_head list; /* list of all ioctls */ 41 snd_kctl_ioctl_func_t fioctl; 42 }; 43 44 static DECLARE_RWSEM(snd_ioctl_rwsem); 45 static LIST_HEAD(snd_control_ioctls); 46 #ifdef CONFIG_COMPAT 47 static LIST_HEAD(snd_control_compat_ioctls); 48 #endif 49 50 static int snd_ctl_open(struct inode *inode, struct file *file) 51 { 52 unsigned long flags; 53 struct snd_card *card; 54 struct snd_ctl_file *ctl; 55 int i, err; 56 57 err = stream_open(inode, file); 58 if (err < 0) 59 return err; 60 61 card = snd_lookup_minor_data(iminor(inode), SNDRV_DEVICE_TYPE_CONTROL); 62 if (!card) { 63 err = -ENODEV; 64 goto __error1; 65 } 66 err = snd_card_file_add(card, file); 67 if (err < 0) { 68 err = -ENODEV; 69 goto __error1; 70 } 71 if (!try_module_get(card->module)) { 72 err = -EFAULT; 73 goto __error2; 74 } 75 ctl = kzalloc(sizeof(*ctl), GFP_KERNEL); 76 if (ctl == NULL) { 77 err = -ENOMEM; 78 goto __error; 79 } 80 INIT_LIST_HEAD(&ctl->events); 81 init_waitqueue_head(&ctl->change_sleep); 82 spin_lock_init(&ctl->read_lock); 83 ctl->card = card; 84 for (i = 0; i < SND_CTL_SUBDEV_ITEMS; i++) 85 ctl->preferred_subdevice[i] = -1; 86 ctl->pid = get_pid(task_pid(current)); 87 file->private_data = ctl; 88 write_lock_irqsave(&card->ctl_files_rwlock, flags); 89 list_add_tail(&ctl->list, &card->ctl_files); 90 write_unlock_irqrestore(&card->ctl_files_rwlock, flags); 91 snd_card_unref(card); 92 return 0; 93 94 __error: 95 module_put(card->module); 96 __error2: 97 snd_card_file_remove(card, file); 98 __error1: 99 if (card) 100 snd_card_unref(card); 101 return err; 102 } 103 104 static void snd_ctl_empty_read_queue(struct snd_ctl_file * ctl) 105 { 106 unsigned long flags; 107 struct snd_kctl_event *cread; 108 109 spin_lock_irqsave(&ctl->read_lock, flags); 110 while (!list_empty(&ctl->events)) { 111 cread = snd_kctl_event(ctl->events.next); 112 list_del(&cread->list); 113 kfree(cread); 114 } 115 spin_unlock_irqrestore(&ctl->read_lock, flags); 116 } 117 118 static int snd_ctl_release(struct inode *inode, struct file *file) 119 { 120 unsigned long flags; 121 struct snd_card *card; 122 struct snd_ctl_file *ctl; 123 struct snd_kcontrol *control; 124 unsigned int idx; 125 126 ctl = file->private_data; 127 file->private_data = NULL; 128 card = ctl->card; 129 write_lock_irqsave(&card->ctl_files_rwlock, flags); 130 list_del(&ctl->list); 131 write_unlock_irqrestore(&card->ctl_files_rwlock, flags); 132 down_write(&card->controls_rwsem); 133 list_for_each_entry(control, &card->controls, list) 134 for (idx = 0; idx < control->count; idx++) 135 if (control->vd[idx].owner == ctl) 136 control->vd[idx].owner = NULL; 137 up_write(&card->controls_rwsem); 138 snd_ctl_empty_read_queue(ctl); 139 put_pid(ctl->pid); 140 kfree(ctl); 141 module_put(card->module); 142 snd_card_file_remove(card, file); 143 return 0; 144 } 145 146 /** 147 * snd_ctl_notify - Send notification to user-space for a control change 148 * @card: the card to send notification 149 * @mask: the event mask, SNDRV_CTL_EVENT_* 150 * @id: the ctl element id to send notification 151 * 152 * This function adds an event record with the given id and mask, appends 153 * to the list and wakes up the user-space for notification. This can be 154 * called in the atomic context. 155 */ 156 void snd_ctl_notify(struct snd_card *card, unsigned int mask, 157 struct snd_ctl_elem_id *id) 158 { 159 unsigned long flags; 160 struct snd_ctl_file *ctl; 161 struct snd_kctl_event *ev; 162 163 if (snd_BUG_ON(!card || !id)) 164 return; 165 if (card->shutdown) 166 return; 167 read_lock(&card->ctl_files_rwlock); 168 #if IS_ENABLED(CONFIG_SND_MIXER_OSS) 169 card->mixer_oss_change_count++; 170 #endif 171 list_for_each_entry(ctl, &card->ctl_files, list) { 172 if (!ctl->subscribed) 173 continue; 174 spin_lock_irqsave(&ctl->read_lock, flags); 175 list_for_each_entry(ev, &ctl->events, list) { 176 if (ev->id.numid == id->numid) { 177 ev->mask |= mask; 178 goto _found; 179 } 180 } 181 ev = kzalloc(sizeof(*ev), GFP_ATOMIC); 182 if (ev) { 183 ev->id = *id; 184 ev->mask = mask; 185 list_add_tail(&ev->list, &ctl->events); 186 } else { 187 dev_err(card->dev, "No memory available to allocate event\n"); 188 } 189 _found: 190 wake_up(&ctl->change_sleep); 191 spin_unlock_irqrestore(&ctl->read_lock, flags); 192 kill_fasync(&ctl->fasync, SIGIO, POLL_IN); 193 } 194 read_unlock(&card->ctl_files_rwlock); 195 } 196 EXPORT_SYMBOL(snd_ctl_notify); 197 198 /** 199 * snd_ctl_new - create a new control instance with some elements 200 * @kctl: the pointer to store new control instance 201 * @count: the number of elements in this control 202 * @access: the default access flags for elements in this control 203 * @file: given when locking these elements 204 * 205 * Allocates a memory object for a new control instance. The instance has 206 * elements as many as the given number (@count). Each element has given 207 * access permissions (@access). Each element is locked when @file is given. 208 * 209 * Return: 0 on success, error code on failure 210 */ 211 static int snd_ctl_new(struct snd_kcontrol **kctl, unsigned int count, 212 unsigned int access, struct snd_ctl_file *file) 213 { 214 unsigned int size; 215 unsigned int idx; 216 217 if (count == 0 || count > MAX_CONTROL_COUNT) 218 return -EINVAL; 219 220 size = sizeof(struct snd_kcontrol); 221 size += sizeof(struct snd_kcontrol_volatile) * count; 222 223 *kctl = kzalloc(size, GFP_KERNEL); 224 if (!*kctl) 225 return -ENOMEM; 226 227 for (idx = 0; idx < count; idx++) { 228 (*kctl)->vd[idx].access = access; 229 (*kctl)->vd[idx].owner = file; 230 } 231 (*kctl)->count = count; 232 233 return 0; 234 } 235 236 /** 237 * snd_ctl_new1 - create a control instance from the template 238 * @ncontrol: the initialization record 239 * @private_data: the private data to set 240 * 241 * Allocates a new struct snd_kcontrol instance and initialize from the given 242 * template. When the access field of ncontrol is 0, it's assumed as 243 * READWRITE access. When the count field is 0, it's assumes as one. 244 * 245 * Return: The pointer of the newly generated instance, or %NULL on failure. 246 */ 247 struct snd_kcontrol *snd_ctl_new1(const struct snd_kcontrol_new *ncontrol, 248 void *private_data) 249 { 250 struct snd_kcontrol *kctl; 251 unsigned int count; 252 unsigned int access; 253 int err; 254 255 if (snd_BUG_ON(!ncontrol || !ncontrol->info)) 256 return NULL; 257 258 count = ncontrol->count; 259 if (count == 0) 260 count = 1; 261 262 access = ncontrol->access; 263 if (access == 0) 264 access = SNDRV_CTL_ELEM_ACCESS_READWRITE; 265 access &= (SNDRV_CTL_ELEM_ACCESS_READWRITE | 266 SNDRV_CTL_ELEM_ACCESS_VOLATILE | 267 SNDRV_CTL_ELEM_ACCESS_INACTIVE | 268 SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE | 269 SNDRV_CTL_ELEM_ACCESS_TLV_COMMAND | 270 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK); 271 272 err = snd_ctl_new(&kctl, count, access, NULL); 273 if (err < 0) 274 return NULL; 275 276 /* The 'numid' member is decided when calling snd_ctl_add(). */ 277 kctl->id.iface = ncontrol->iface; 278 kctl->id.device = ncontrol->device; 279 kctl->id.subdevice = ncontrol->subdevice; 280 if (ncontrol->name) { 281 strlcpy(kctl->id.name, ncontrol->name, sizeof(kctl->id.name)); 282 if (strcmp(ncontrol->name, kctl->id.name) != 0) 283 pr_warn("ALSA: Control name '%s' truncated to '%s'\n", 284 ncontrol->name, kctl->id.name); 285 } 286 kctl->id.index = ncontrol->index; 287 288 kctl->info = ncontrol->info; 289 kctl->get = ncontrol->get; 290 kctl->put = ncontrol->put; 291 kctl->tlv.p = ncontrol->tlv.p; 292 293 kctl->private_value = ncontrol->private_value; 294 kctl->private_data = private_data; 295 296 return kctl; 297 } 298 EXPORT_SYMBOL(snd_ctl_new1); 299 300 /** 301 * snd_ctl_free_one - release the control instance 302 * @kcontrol: the control instance 303 * 304 * Releases the control instance created via snd_ctl_new() 305 * or snd_ctl_new1(). 306 * Don't call this after the control was added to the card. 307 */ 308 void snd_ctl_free_one(struct snd_kcontrol *kcontrol) 309 { 310 if (kcontrol) { 311 if (kcontrol->private_free) 312 kcontrol->private_free(kcontrol); 313 kfree(kcontrol); 314 } 315 } 316 EXPORT_SYMBOL(snd_ctl_free_one); 317 318 static bool snd_ctl_remove_numid_conflict(struct snd_card *card, 319 unsigned int count) 320 { 321 struct snd_kcontrol *kctl; 322 323 /* Make sure that the ids assigned to the control do not wrap around */ 324 if (card->last_numid >= UINT_MAX - count) 325 card->last_numid = 0; 326 327 list_for_each_entry(kctl, &card->controls, list) { 328 if (kctl->id.numid < card->last_numid + 1 + count && 329 kctl->id.numid + kctl->count > card->last_numid + 1) { 330 card->last_numid = kctl->id.numid + kctl->count - 1; 331 return true; 332 } 333 } 334 return false; 335 } 336 337 static int snd_ctl_find_hole(struct snd_card *card, unsigned int count) 338 { 339 unsigned int iter = 100000; 340 341 while (snd_ctl_remove_numid_conflict(card, count)) { 342 if (--iter == 0) { 343 /* this situation is very unlikely */ 344 dev_err(card->dev, "unable to allocate new control numid\n"); 345 return -ENOMEM; 346 } 347 } 348 return 0; 349 } 350 351 enum snd_ctl_add_mode { 352 CTL_ADD_EXCLUSIVE, CTL_REPLACE, CTL_ADD_ON_REPLACE, 353 }; 354 355 /* add/replace a new kcontrol object; call with card->controls_rwsem locked */ 356 static int __snd_ctl_add_replace(struct snd_card *card, 357 struct snd_kcontrol *kcontrol, 358 enum snd_ctl_add_mode mode) 359 { 360 struct snd_ctl_elem_id id; 361 unsigned int idx; 362 unsigned int count; 363 struct snd_kcontrol *old; 364 int err; 365 366 id = kcontrol->id; 367 if (id.index > UINT_MAX - kcontrol->count) 368 return -EINVAL; 369 370 old = snd_ctl_find_id(card, &id); 371 if (!old) { 372 if (mode == CTL_REPLACE) 373 return -EINVAL; 374 } else { 375 if (mode == CTL_ADD_EXCLUSIVE) { 376 dev_err(card->dev, 377 "control %i:%i:%i:%s:%i is already present\n", 378 id.iface, id.device, id.subdevice, id.name, 379 id.index); 380 return -EBUSY; 381 } 382 383 err = snd_ctl_remove(card, old); 384 if (err < 0) 385 return err; 386 } 387 388 if (snd_ctl_find_hole(card, kcontrol->count) < 0) 389 return -ENOMEM; 390 391 list_add_tail(&kcontrol->list, &card->controls); 392 card->controls_count += kcontrol->count; 393 kcontrol->id.numid = card->last_numid + 1; 394 card->last_numid += kcontrol->count; 395 396 id = kcontrol->id; 397 count = kcontrol->count; 398 for (idx = 0; idx < count; idx++, id.index++, id.numid++) 399 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_ADD, &id); 400 401 return 0; 402 } 403 404 static int snd_ctl_add_replace(struct snd_card *card, 405 struct snd_kcontrol *kcontrol, 406 enum snd_ctl_add_mode mode) 407 { 408 int err = -EINVAL; 409 410 if (! kcontrol) 411 return err; 412 if (snd_BUG_ON(!card || !kcontrol->info)) 413 goto error; 414 415 down_write(&card->controls_rwsem); 416 err = __snd_ctl_add_replace(card, kcontrol, mode); 417 up_write(&card->controls_rwsem); 418 if (err < 0) 419 goto error; 420 return 0; 421 422 error: 423 snd_ctl_free_one(kcontrol); 424 return err; 425 } 426 427 /** 428 * snd_ctl_add - add the control instance to the card 429 * @card: the card instance 430 * @kcontrol: the control instance to add 431 * 432 * Adds the control instance created via snd_ctl_new() or 433 * snd_ctl_new1() to the given card. Assigns also an unique 434 * numid used for fast search. 435 * 436 * It frees automatically the control which cannot be added. 437 * 438 * Return: Zero if successful, or a negative error code on failure. 439 * 440 */ 441 int snd_ctl_add(struct snd_card *card, struct snd_kcontrol *kcontrol) 442 { 443 return snd_ctl_add_replace(card, kcontrol, CTL_ADD_EXCLUSIVE); 444 } 445 EXPORT_SYMBOL(snd_ctl_add); 446 447 /** 448 * snd_ctl_replace - replace the control instance of the card 449 * @card: the card instance 450 * @kcontrol: the control instance to replace 451 * @add_on_replace: add the control if not already added 452 * 453 * Replaces the given control. If the given control does not exist 454 * and the add_on_replace flag is set, the control is added. If the 455 * control exists, it is destroyed first. 456 * 457 * It frees automatically the control which cannot be added or replaced. 458 * 459 * Return: Zero if successful, or a negative error code on failure. 460 */ 461 int snd_ctl_replace(struct snd_card *card, struct snd_kcontrol *kcontrol, 462 bool add_on_replace) 463 { 464 return snd_ctl_add_replace(card, kcontrol, 465 add_on_replace ? CTL_ADD_ON_REPLACE : CTL_REPLACE); 466 } 467 EXPORT_SYMBOL(snd_ctl_replace); 468 469 /** 470 * snd_ctl_remove - remove the control from the card and release it 471 * @card: the card instance 472 * @kcontrol: the control instance to remove 473 * 474 * Removes the control from the card and then releases the instance. 475 * You don't need to call snd_ctl_free_one(). You must be in 476 * the write lock - down_write(&card->controls_rwsem). 477 * 478 * Return: 0 if successful, or a negative error code on failure. 479 */ 480 int snd_ctl_remove(struct snd_card *card, struct snd_kcontrol *kcontrol) 481 { 482 struct snd_ctl_elem_id id; 483 unsigned int idx; 484 485 if (snd_BUG_ON(!card || !kcontrol)) 486 return -EINVAL; 487 list_del(&kcontrol->list); 488 card->controls_count -= kcontrol->count; 489 id = kcontrol->id; 490 for (idx = 0; idx < kcontrol->count; idx++, id.index++, id.numid++) 491 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_REMOVE, &id); 492 snd_ctl_free_one(kcontrol); 493 return 0; 494 } 495 EXPORT_SYMBOL(snd_ctl_remove); 496 497 /** 498 * snd_ctl_remove_id - remove the control of the given id and release it 499 * @card: the card instance 500 * @id: the control id to remove 501 * 502 * Finds the control instance with the given id, removes it from the 503 * card list and releases it. 504 * 505 * Return: 0 if successful, or a negative error code on failure. 506 */ 507 int snd_ctl_remove_id(struct snd_card *card, struct snd_ctl_elem_id *id) 508 { 509 struct snd_kcontrol *kctl; 510 int ret; 511 512 down_write(&card->controls_rwsem); 513 kctl = snd_ctl_find_id(card, id); 514 if (kctl == NULL) { 515 up_write(&card->controls_rwsem); 516 return -ENOENT; 517 } 518 ret = snd_ctl_remove(card, kctl); 519 up_write(&card->controls_rwsem); 520 return ret; 521 } 522 EXPORT_SYMBOL(snd_ctl_remove_id); 523 524 /** 525 * snd_ctl_remove_user_ctl - remove and release the unlocked user control 526 * @file: active control handle 527 * @id: the control id to remove 528 * 529 * Finds the control instance with the given id, removes it from the 530 * card list and releases it. 531 * 532 * Return: 0 if successful, or a negative error code on failure. 533 */ 534 static int snd_ctl_remove_user_ctl(struct snd_ctl_file * file, 535 struct snd_ctl_elem_id *id) 536 { 537 struct snd_card *card = file->card; 538 struct snd_kcontrol *kctl; 539 int idx, ret; 540 541 down_write(&card->controls_rwsem); 542 kctl = snd_ctl_find_id(card, id); 543 if (kctl == NULL) { 544 ret = -ENOENT; 545 goto error; 546 } 547 if (!(kctl->vd[0].access & SNDRV_CTL_ELEM_ACCESS_USER)) { 548 ret = -EINVAL; 549 goto error; 550 } 551 for (idx = 0; idx < kctl->count; idx++) 552 if (kctl->vd[idx].owner != NULL && kctl->vd[idx].owner != file) { 553 ret = -EBUSY; 554 goto error; 555 } 556 ret = snd_ctl_remove(card, kctl); 557 if (ret < 0) 558 goto error; 559 card->user_ctl_count--; 560 error: 561 up_write(&card->controls_rwsem); 562 return ret; 563 } 564 565 /** 566 * snd_ctl_activate_id - activate/inactivate the control of the given id 567 * @card: the card instance 568 * @id: the control id to activate/inactivate 569 * @active: non-zero to activate 570 * 571 * Finds the control instance with the given id, and activate or 572 * inactivate the control together with notification, if changed. 573 * The given ID data is filled with full information. 574 * 575 * Return: 0 if unchanged, 1 if changed, or a negative error code on failure. 576 */ 577 int snd_ctl_activate_id(struct snd_card *card, struct snd_ctl_elem_id *id, 578 int active) 579 { 580 struct snd_kcontrol *kctl; 581 struct snd_kcontrol_volatile *vd; 582 unsigned int index_offset; 583 int ret; 584 585 down_write(&card->controls_rwsem); 586 kctl = snd_ctl_find_id(card, id); 587 if (kctl == NULL) { 588 ret = -ENOENT; 589 goto unlock; 590 } 591 index_offset = snd_ctl_get_ioff(kctl, id); 592 vd = &kctl->vd[index_offset]; 593 ret = 0; 594 if (active) { 595 if (!(vd->access & SNDRV_CTL_ELEM_ACCESS_INACTIVE)) 596 goto unlock; 597 vd->access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE; 598 } else { 599 if (vd->access & SNDRV_CTL_ELEM_ACCESS_INACTIVE) 600 goto unlock; 601 vd->access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE; 602 } 603 snd_ctl_build_ioff(id, kctl, index_offset); 604 ret = 1; 605 unlock: 606 up_write(&card->controls_rwsem); 607 if (ret > 0) 608 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_INFO, id); 609 return ret; 610 } 611 EXPORT_SYMBOL_GPL(snd_ctl_activate_id); 612 613 /** 614 * snd_ctl_rename_id - replace the id of a control on the card 615 * @card: the card instance 616 * @src_id: the old id 617 * @dst_id: the new id 618 * 619 * Finds the control with the old id from the card, and replaces the 620 * id with the new one. 621 * 622 * Return: Zero if successful, or a negative error code on failure. 623 */ 624 int snd_ctl_rename_id(struct snd_card *card, struct snd_ctl_elem_id *src_id, 625 struct snd_ctl_elem_id *dst_id) 626 { 627 struct snd_kcontrol *kctl; 628 629 down_write(&card->controls_rwsem); 630 kctl = snd_ctl_find_id(card, src_id); 631 if (kctl == NULL) { 632 up_write(&card->controls_rwsem); 633 return -ENOENT; 634 } 635 kctl->id = *dst_id; 636 kctl->id.numid = card->last_numid + 1; 637 card->last_numid += kctl->count; 638 up_write(&card->controls_rwsem); 639 return 0; 640 } 641 EXPORT_SYMBOL(snd_ctl_rename_id); 642 643 /** 644 * snd_ctl_find_numid - find the control instance with the given number-id 645 * @card: the card instance 646 * @numid: the number-id to search 647 * 648 * Finds the control instance with the given number-id from the card. 649 * 650 * The caller must down card->controls_rwsem before calling this function 651 * (if the race condition can happen). 652 * 653 * Return: The pointer of the instance if found, or %NULL if not. 654 * 655 */ 656 struct snd_kcontrol *snd_ctl_find_numid(struct snd_card *card, unsigned int numid) 657 { 658 struct snd_kcontrol *kctl; 659 660 if (snd_BUG_ON(!card || !numid)) 661 return NULL; 662 list_for_each_entry(kctl, &card->controls, list) { 663 if (kctl->id.numid <= numid && kctl->id.numid + kctl->count > numid) 664 return kctl; 665 } 666 return NULL; 667 } 668 EXPORT_SYMBOL(snd_ctl_find_numid); 669 670 /** 671 * snd_ctl_find_id - find the control instance with the given id 672 * @card: the card instance 673 * @id: the id to search 674 * 675 * Finds the control instance with the given id from the card. 676 * 677 * The caller must down card->controls_rwsem before calling this function 678 * (if the race condition can happen). 679 * 680 * Return: The pointer of the instance if found, or %NULL if not. 681 * 682 */ 683 struct snd_kcontrol *snd_ctl_find_id(struct snd_card *card, 684 struct snd_ctl_elem_id *id) 685 { 686 struct snd_kcontrol *kctl; 687 688 if (snd_BUG_ON(!card || !id)) 689 return NULL; 690 if (id->numid != 0) 691 return snd_ctl_find_numid(card, id->numid); 692 list_for_each_entry(kctl, &card->controls, list) { 693 if (kctl->id.iface != id->iface) 694 continue; 695 if (kctl->id.device != id->device) 696 continue; 697 if (kctl->id.subdevice != id->subdevice) 698 continue; 699 if (strncmp(kctl->id.name, id->name, sizeof(kctl->id.name))) 700 continue; 701 if (kctl->id.index > id->index) 702 continue; 703 if (kctl->id.index + kctl->count <= id->index) 704 continue; 705 return kctl; 706 } 707 return NULL; 708 } 709 EXPORT_SYMBOL(snd_ctl_find_id); 710 711 static int snd_ctl_card_info(struct snd_card *card, struct snd_ctl_file * ctl, 712 unsigned int cmd, void __user *arg) 713 { 714 struct snd_ctl_card_info *info; 715 716 info = kzalloc(sizeof(*info), GFP_KERNEL); 717 if (! info) 718 return -ENOMEM; 719 down_read(&snd_ioctl_rwsem); 720 info->card = card->number; 721 strlcpy(info->id, card->id, sizeof(info->id)); 722 strlcpy(info->driver, card->driver, sizeof(info->driver)); 723 strlcpy(info->name, card->shortname, sizeof(info->name)); 724 strlcpy(info->longname, card->longname, sizeof(info->longname)); 725 strlcpy(info->mixername, card->mixername, sizeof(info->mixername)); 726 strlcpy(info->components, card->components, sizeof(info->components)); 727 up_read(&snd_ioctl_rwsem); 728 if (copy_to_user(arg, info, sizeof(struct snd_ctl_card_info))) { 729 kfree(info); 730 return -EFAULT; 731 } 732 kfree(info); 733 return 0; 734 } 735 736 static int snd_ctl_elem_list(struct snd_card *card, 737 struct snd_ctl_elem_list __user *_list) 738 { 739 struct snd_ctl_elem_list list; 740 struct snd_kcontrol *kctl; 741 struct snd_ctl_elem_id id; 742 unsigned int offset, space, jidx; 743 int err = 0; 744 745 if (copy_from_user(&list, _list, sizeof(list))) 746 return -EFAULT; 747 offset = list.offset; 748 space = list.space; 749 750 down_read(&card->controls_rwsem); 751 list.count = card->controls_count; 752 list.used = 0; 753 if (space > 0) { 754 list_for_each_entry(kctl, &card->controls, list) { 755 if (offset >= kctl->count) { 756 offset -= kctl->count; 757 continue; 758 } 759 for (jidx = offset; jidx < kctl->count; jidx++) { 760 snd_ctl_build_ioff(&id, kctl, jidx); 761 if (copy_to_user(list.pids + list.used, &id, 762 sizeof(id))) { 763 err = -EFAULT; 764 goto out; 765 } 766 list.used++; 767 if (!--space) 768 goto out; 769 } 770 offset = 0; 771 } 772 } 773 out: 774 up_read(&card->controls_rwsem); 775 if (!err && copy_to_user(_list, &list, sizeof(list))) 776 err = -EFAULT; 777 return err; 778 } 779 780 static bool validate_element_member_dimension(struct snd_ctl_elem_info *info) 781 { 782 unsigned int members; 783 unsigned int i; 784 785 if (info->dimen.d[0] == 0) 786 return true; 787 788 members = 1; 789 for (i = 0; i < ARRAY_SIZE(info->dimen.d); ++i) { 790 if (info->dimen.d[i] == 0) 791 break; 792 members *= info->dimen.d[i]; 793 794 /* 795 * info->count should be validated in advance, to guarantee 796 * calculation soundness. 797 */ 798 if (members > info->count) 799 return false; 800 } 801 802 for (++i; i < ARRAY_SIZE(info->dimen.d); ++i) { 803 if (info->dimen.d[i] > 0) 804 return false; 805 } 806 807 return members == info->count; 808 } 809 810 static int snd_ctl_elem_info(struct snd_ctl_file *ctl, 811 struct snd_ctl_elem_info *info) 812 { 813 struct snd_card *card = ctl->card; 814 struct snd_kcontrol *kctl; 815 struct snd_kcontrol_volatile *vd; 816 unsigned int index_offset; 817 int result; 818 819 down_read(&card->controls_rwsem); 820 kctl = snd_ctl_find_id(card, &info->id); 821 if (kctl == NULL) { 822 up_read(&card->controls_rwsem); 823 return -ENOENT; 824 } 825 #ifdef CONFIG_SND_DEBUG 826 info->access = 0; 827 #endif 828 result = kctl->info(kctl, info); 829 if (result >= 0) { 830 snd_BUG_ON(info->access); 831 index_offset = snd_ctl_get_ioff(kctl, &info->id); 832 vd = &kctl->vd[index_offset]; 833 snd_ctl_build_ioff(&info->id, kctl, index_offset); 834 info->access = vd->access; 835 if (vd->owner) { 836 info->access |= SNDRV_CTL_ELEM_ACCESS_LOCK; 837 if (vd->owner == ctl) 838 info->access |= SNDRV_CTL_ELEM_ACCESS_OWNER; 839 info->owner = pid_vnr(vd->owner->pid); 840 } else { 841 info->owner = -1; 842 } 843 } 844 up_read(&card->controls_rwsem); 845 return result; 846 } 847 848 static int snd_ctl_elem_info_user(struct snd_ctl_file *ctl, 849 struct snd_ctl_elem_info __user *_info) 850 { 851 struct snd_ctl_elem_info info; 852 int result; 853 854 if (copy_from_user(&info, _info, sizeof(info))) 855 return -EFAULT; 856 result = snd_power_wait(ctl->card, SNDRV_CTL_POWER_D0); 857 if (result < 0) 858 return result; 859 result = snd_ctl_elem_info(ctl, &info); 860 if (result < 0) 861 return result; 862 if (copy_to_user(_info, &info, sizeof(info))) 863 return -EFAULT; 864 return result; 865 } 866 867 static int snd_ctl_elem_read(struct snd_card *card, 868 struct snd_ctl_elem_value *control) 869 { 870 struct snd_kcontrol *kctl; 871 struct snd_kcontrol_volatile *vd; 872 unsigned int index_offset; 873 874 kctl = snd_ctl_find_id(card, &control->id); 875 if (kctl == NULL) 876 return -ENOENT; 877 878 index_offset = snd_ctl_get_ioff(kctl, &control->id); 879 vd = &kctl->vd[index_offset]; 880 if (!(vd->access & SNDRV_CTL_ELEM_ACCESS_READ) || kctl->get == NULL) 881 return -EPERM; 882 883 snd_ctl_build_ioff(&control->id, kctl, index_offset); 884 return kctl->get(kctl, control); 885 } 886 887 static int snd_ctl_elem_read_user(struct snd_card *card, 888 struct snd_ctl_elem_value __user *_control) 889 { 890 struct snd_ctl_elem_value *control; 891 int result; 892 893 control = memdup_user(_control, sizeof(*control)); 894 if (IS_ERR(control)) 895 return PTR_ERR(control); 896 897 result = snd_power_wait(card, SNDRV_CTL_POWER_D0); 898 if (result < 0) 899 goto error; 900 901 down_read(&card->controls_rwsem); 902 result = snd_ctl_elem_read(card, control); 903 up_read(&card->controls_rwsem); 904 if (result < 0) 905 goto error; 906 907 if (copy_to_user(_control, control, sizeof(*control))) 908 result = -EFAULT; 909 error: 910 kfree(control); 911 return result; 912 } 913 914 static int snd_ctl_elem_write(struct snd_card *card, struct snd_ctl_file *file, 915 struct snd_ctl_elem_value *control) 916 { 917 struct snd_kcontrol *kctl; 918 struct snd_kcontrol_volatile *vd; 919 unsigned int index_offset; 920 int result; 921 922 kctl = snd_ctl_find_id(card, &control->id); 923 if (kctl == NULL) 924 return -ENOENT; 925 926 index_offset = snd_ctl_get_ioff(kctl, &control->id); 927 vd = &kctl->vd[index_offset]; 928 if (!(vd->access & SNDRV_CTL_ELEM_ACCESS_WRITE) || kctl->put == NULL || 929 (file && vd->owner && vd->owner != file)) { 930 return -EPERM; 931 } 932 933 snd_ctl_build_ioff(&control->id, kctl, index_offset); 934 result = kctl->put(kctl, control); 935 if (result < 0) 936 return result; 937 938 if (result > 0) { 939 struct snd_ctl_elem_id id = control->id; 940 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, &id); 941 } 942 943 return 0; 944 } 945 946 static int snd_ctl_elem_write_user(struct snd_ctl_file *file, 947 struct snd_ctl_elem_value __user *_control) 948 { 949 struct snd_ctl_elem_value *control; 950 struct snd_card *card; 951 int result; 952 953 control = memdup_user(_control, sizeof(*control)); 954 if (IS_ERR(control)) 955 return PTR_ERR(control); 956 957 card = file->card; 958 result = snd_power_wait(card, SNDRV_CTL_POWER_D0); 959 if (result < 0) 960 goto error; 961 962 down_write(&card->controls_rwsem); 963 result = snd_ctl_elem_write(card, file, control); 964 up_write(&card->controls_rwsem); 965 if (result < 0) 966 goto error; 967 968 if (copy_to_user(_control, control, sizeof(*control))) 969 result = -EFAULT; 970 error: 971 kfree(control); 972 return result; 973 } 974 975 static int snd_ctl_elem_lock(struct snd_ctl_file *file, 976 struct snd_ctl_elem_id __user *_id) 977 { 978 struct snd_card *card = file->card; 979 struct snd_ctl_elem_id id; 980 struct snd_kcontrol *kctl; 981 struct snd_kcontrol_volatile *vd; 982 int result; 983 984 if (copy_from_user(&id, _id, sizeof(id))) 985 return -EFAULT; 986 down_write(&card->controls_rwsem); 987 kctl = snd_ctl_find_id(card, &id); 988 if (kctl == NULL) { 989 result = -ENOENT; 990 } else { 991 vd = &kctl->vd[snd_ctl_get_ioff(kctl, &id)]; 992 if (vd->owner != NULL) 993 result = -EBUSY; 994 else { 995 vd->owner = file; 996 result = 0; 997 } 998 } 999 up_write(&card->controls_rwsem); 1000 return result; 1001 } 1002 1003 static int snd_ctl_elem_unlock(struct snd_ctl_file *file, 1004 struct snd_ctl_elem_id __user *_id) 1005 { 1006 struct snd_card *card = file->card; 1007 struct snd_ctl_elem_id id; 1008 struct snd_kcontrol *kctl; 1009 struct snd_kcontrol_volatile *vd; 1010 int result; 1011 1012 if (copy_from_user(&id, _id, sizeof(id))) 1013 return -EFAULT; 1014 down_write(&card->controls_rwsem); 1015 kctl = snd_ctl_find_id(card, &id); 1016 if (kctl == NULL) { 1017 result = -ENOENT; 1018 } else { 1019 vd = &kctl->vd[snd_ctl_get_ioff(kctl, &id)]; 1020 if (vd->owner == NULL) 1021 result = -EINVAL; 1022 else if (vd->owner != file) 1023 result = -EPERM; 1024 else { 1025 vd->owner = NULL; 1026 result = 0; 1027 } 1028 } 1029 up_write(&card->controls_rwsem); 1030 return result; 1031 } 1032 1033 struct user_element { 1034 struct snd_ctl_elem_info info; 1035 struct snd_card *card; 1036 char *elem_data; /* element data */ 1037 unsigned long elem_data_size; /* size of element data in bytes */ 1038 void *tlv_data; /* TLV data */ 1039 unsigned long tlv_data_size; /* TLV data size */ 1040 void *priv_data; /* private data (like strings for enumerated type) */ 1041 }; 1042 1043 static int snd_ctl_elem_user_info(struct snd_kcontrol *kcontrol, 1044 struct snd_ctl_elem_info *uinfo) 1045 { 1046 struct user_element *ue = kcontrol->private_data; 1047 unsigned int offset; 1048 1049 offset = snd_ctl_get_ioff(kcontrol, &uinfo->id); 1050 *uinfo = ue->info; 1051 snd_ctl_build_ioff(&uinfo->id, kcontrol, offset); 1052 1053 return 0; 1054 } 1055 1056 static int snd_ctl_elem_user_enum_info(struct snd_kcontrol *kcontrol, 1057 struct snd_ctl_elem_info *uinfo) 1058 { 1059 struct user_element *ue = kcontrol->private_data; 1060 const char *names; 1061 unsigned int item; 1062 unsigned int offset; 1063 1064 item = uinfo->value.enumerated.item; 1065 1066 offset = snd_ctl_get_ioff(kcontrol, &uinfo->id); 1067 *uinfo = ue->info; 1068 snd_ctl_build_ioff(&uinfo->id, kcontrol, offset); 1069 1070 item = min(item, uinfo->value.enumerated.items - 1); 1071 uinfo->value.enumerated.item = item; 1072 1073 names = ue->priv_data; 1074 for (; item > 0; --item) 1075 names += strlen(names) + 1; 1076 strcpy(uinfo->value.enumerated.name, names); 1077 1078 return 0; 1079 } 1080 1081 static int snd_ctl_elem_user_get(struct snd_kcontrol *kcontrol, 1082 struct snd_ctl_elem_value *ucontrol) 1083 { 1084 struct user_element *ue = kcontrol->private_data; 1085 unsigned int size = ue->elem_data_size; 1086 char *src = ue->elem_data + 1087 snd_ctl_get_ioff(kcontrol, &ucontrol->id) * size; 1088 1089 memcpy(&ucontrol->value, src, size); 1090 return 0; 1091 } 1092 1093 static int snd_ctl_elem_user_put(struct snd_kcontrol *kcontrol, 1094 struct snd_ctl_elem_value *ucontrol) 1095 { 1096 int change; 1097 struct user_element *ue = kcontrol->private_data; 1098 unsigned int size = ue->elem_data_size; 1099 char *dst = ue->elem_data + 1100 snd_ctl_get_ioff(kcontrol, &ucontrol->id) * size; 1101 1102 change = memcmp(&ucontrol->value, dst, size) != 0; 1103 if (change) 1104 memcpy(dst, &ucontrol->value, size); 1105 return change; 1106 } 1107 1108 static int replace_user_tlv(struct snd_kcontrol *kctl, unsigned int __user *buf, 1109 unsigned int size) 1110 { 1111 struct user_element *ue = kctl->private_data; 1112 unsigned int *container; 1113 struct snd_ctl_elem_id id; 1114 unsigned int mask = 0; 1115 int i; 1116 int change; 1117 1118 if (size > 1024 * 128) /* sane value */ 1119 return -EINVAL; 1120 1121 container = vmemdup_user(buf, size); 1122 if (IS_ERR(container)) 1123 return PTR_ERR(container); 1124 1125 change = ue->tlv_data_size != size; 1126 if (!change) 1127 change = memcmp(ue->tlv_data, container, size) != 0; 1128 if (!change) { 1129 kvfree(container); 1130 return 0; 1131 } 1132 1133 if (ue->tlv_data == NULL) { 1134 /* Now TLV data is available. */ 1135 for (i = 0; i < kctl->count; ++i) 1136 kctl->vd[i].access |= SNDRV_CTL_ELEM_ACCESS_TLV_READ; 1137 mask = SNDRV_CTL_EVENT_MASK_INFO; 1138 } 1139 1140 kvfree(ue->tlv_data); 1141 ue->tlv_data = container; 1142 ue->tlv_data_size = size; 1143 1144 mask |= SNDRV_CTL_EVENT_MASK_TLV; 1145 for (i = 0; i < kctl->count; ++i) { 1146 snd_ctl_build_ioff(&id, kctl, i); 1147 snd_ctl_notify(ue->card, mask, &id); 1148 } 1149 1150 return change; 1151 } 1152 1153 static int read_user_tlv(struct snd_kcontrol *kctl, unsigned int __user *buf, 1154 unsigned int size) 1155 { 1156 struct user_element *ue = kctl->private_data; 1157 1158 if (ue->tlv_data_size == 0 || ue->tlv_data == NULL) 1159 return -ENXIO; 1160 1161 if (size < ue->tlv_data_size) 1162 return -ENOSPC; 1163 1164 if (copy_to_user(buf, ue->tlv_data, ue->tlv_data_size)) 1165 return -EFAULT; 1166 1167 return 0; 1168 } 1169 1170 static int snd_ctl_elem_user_tlv(struct snd_kcontrol *kctl, int op_flag, 1171 unsigned int size, unsigned int __user *buf) 1172 { 1173 if (op_flag == SNDRV_CTL_TLV_OP_WRITE) 1174 return replace_user_tlv(kctl, buf, size); 1175 else 1176 return read_user_tlv(kctl, buf, size); 1177 } 1178 1179 static int snd_ctl_elem_init_enum_names(struct user_element *ue) 1180 { 1181 char *names, *p; 1182 size_t buf_len, name_len; 1183 unsigned int i; 1184 const uintptr_t user_ptrval = ue->info.value.enumerated.names_ptr; 1185 1186 if (ue->info.value.enumerated.names_length > 64 * 1024) 1187 return -EINVAL; 1188 1189 names = vmemdup_user((const void __user *)user_ptrval, 1190 ue->info.value.enumerated.names_length); 1191 if (IS_ERR(names)) 1192 return PTR_ERR(names); 1193 1194 /* check that there are enough valid names */ 1195 buf_len = ue->info.value.enumerated.names_length; 1196 p = names; 1197 for (i = 0; i < ue->info.value.enumerated.items; ++i) { 1198 name_len = strnlen(p, buf_len); 1199 if (name_len == 0 || name_len >= 64 || name_len == buf_len) { 1200 kvfree(names); 1201 return -EINVAL; 1202 } 1203 p += name_len + 1; 1204 buf_len -= name_len + 1; 1205 } 1206 1207 ue->priv_data = names; 1208 ue->info.value.enumerated.names_ptr = 0; 1209 1210 return 0; 1211 } 1212 1213 static void snd_ctl_elem_user_free(struct snd_kcontrol *kcontrol) 1214 { 1215 struct user_element *ue = kcontrol->private_data; 1216 1217 kvfree(ue->tlv_data); 1218 kvfree(ue->priv_data); 1219 kfree(ue); 1220 } 1221 1222 static int snd_ctl_elem_add(struct snd_ctl_file *file, 1223 struct snd_ctl_elem_info *info, int replace) 1224 { 1225 /* The capacity of struct snd_ctl_elem_value.value.*/ 1226 static const unsigned int value_sizes[] = { 1227 [SNDRV_CTL_ELEM_TYPE_BOOLEAN] = sizeof(long), 1228 [SNDRV_CTL_ELEM_TYPE_INTEGER] = sizeof(long), 1229 [SNDRV_CTL_ELEM_TYPE_ENUMERATED] = sizeof(unsigned int), 1230 [SNDRV_CTL_ELEM_TYPE_BYTES] = sizeof(unsigned char), 1231 [SNDRV_CTL_ELEM_TYPE_IEC958] = sizeof(struct snd_aes_iec958), 1232 [SNDRV_CTL_ELEM_TYPE_INTEGER64] = sizeof(long long), 1233 }; 1234 static const unsigned int max_value_counts[] = { 1235 [SNDRV_CTL_ELEM_TYPE_BOOLEAN] = 128, 1236 [SNDRV_CTL_ELEM_TYPE_INTEGER] = 128, 1237 [SNDRV_CTL_ELEM_TYPE_ENUMERATED] = 128, 1238 [SNDRV_CTL_ELEM_TYPE_BYTES] = 512, 1239 [SNDRV_CTL_ELEM_TYPE_IEC958] = 1, 1240 [SNDRV_CTL_ELEM_TYPE_INTEGER64] = 64, 1241 }; 1242 struct snd_card *card = file->card; 1243 struct snd_kcontrol *kctl; 1244 unsigned int count; 1245 unsigned int access; 1246 long private_size; 1247 struct user_element *ue; 1248 unsigned int offset; 1249 int err; 1250 1251 if (!*info->id.name) 1252 return -EINVAL; 1253 if (strnlen(info->id.name, sizeof(info->id.name)) >= sizeof(info->id.name)) 1254 return -EINVAL; 1255 1256 /* Delete a control to replace them if needed. */ 1257 if (replace) { 1258 info->id.numid = 0; 1259 err = snd_ctl_remove_user_ctl(file, &info->id); 1260 if (err) 1261 return err; 1262 } 1263 1264 /* 1265 * The number of userspace controls are counted control by control, 1266 * not element by element. 1267 */ 1268 if (card->user_ctl_count + 1 > MAX_USER_CONTROLS) 1269 return -ENOMEM; 1270 1271 /* Check the number of elements for this userspace control. */ 1272 count = info->owner; 1273 if (count == 0) 1274 count = 1; 1275 1276 /* Arrange access permissions if needed. */ 1277 access = info->access; 1278 if (access == 0) 1279 access = SNDRV_CTL_ELEM_ACCESS_READWRITE; 1280 access &= (SNDRV_CTL_ELEM_ACCESS_READWRITE | 1281 SNDRV_CTL_ELEM_ACCESS_INACTIVE | 1282 SNDRV_CTL_ELEM_ACCESS_TLV_WRITE); 1283 1284 /* In initial state, nothing is available as TLV container. */ 1285 if (access & SNDRV_CTL_ELEM_ACCESS_TLV_WRITE) 1286 access |= SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK; 1287 access |= SNDRV_CTL_ELEM_ACCESS_USER; 1288 1289 /* 1290 * Check information and calculate the size of data specific to 1291 * this userspace control. 1292 */ 1293 if (info->type < SNDRV_CTL_ELEM_TYPE_BOOLEAN || 1294 info->type > SNDRV_CTL_ELEM_TYPE_INTEGER64) 1295 return -EINVAL; 1296 if (info->type == SNDRV_CTL_ELEM_TYPE_ENUMERATED && 1297 info->value.enumerated.items == 0) 1298 return -EINVAL; 1299 if (info->count < 1 || 1300 info->count > max_value_counts[info->type]) 1301 return -EINVAL; 1302 if (!validate_element_member_dimension(info)) 1303 return -EINVAL; 1304 private_size = value_sizes[info->type] * info->count; 1305 1306 /* 1307 * Keep memory object for this userspace control. After passing this 1308 * code block, the instance should be freed by snd_ctl_free_one(). 1309 * 1310 * Note that these elements in this control are locked. 1311 */ 1312 err = snd_ctl_new(&kctl, count, access, file); 1313 if (err < 0) 1314 return err; 1315 memcpy(&kctl->id, &info->id, sizeof(kctl->id)); 1316 kctl->private_data = kzalloc(sizeof(struct user_element) + private_size * count, 1317 GFP_KERNEL); 1318 if (kctl->private_data == NULL) { 1319 kfree(kctl); 1320 return -ENOMEM; 1321 } 1322 kctl->private_free = snd_ctl_elem_user_free; 1323 1324 /* Set private data for this userspace control. */ 1325 ue = (struct user_element *)kctl->private_data; 1326 ue->card = card; 1327 ue->info = *info; 1328 ue->info.access = 0; 1329 ue->elem_data = (char *)ue + sizeof(*ue); 1330 ue->elem_data_size = private_size; 1331 if (ue->info.type == SNDRV_CTL_ELEM_TYPE_ENUMERATED) { 1332 err = snd_ctl_elem_init_enum_names(ue); 1333 if (err < 0) { 1334 snd_ctl_free_one(kctl); 1335 return err; 1336 } 1337 } 1338 1339 /* Set callback functions. */ 1340 if (info->type == SNDRV_CTL_ELEM_TYPE_ENUMERATED) 1341 kctl->info = snd_ctl_elem_user_enum_info; 1342 else 1343 kctl->info = snd_ctl_elem_user_info; 1344 if (access & SNDRV_CTL_ELEM_ACCESS_READ) 1345 kctl->get = snd_ctl_elem_user_get; 1346 if (access & SNDRV_CTL_ELEM_ACCESS_WRITE) 1347 kctl->put = snd_ctl_elem_user_put; 1348 if (access & SNDRV_CTL_ELEM_ACCESS_TLV_WRITE) 1349 kctl->tlv.c = snd_ctl_elem_user_tlv; 1350 1351 /* This function manage to free the instance on failure. */ 1352 down_write(&card->controls_rwsem); 1353 err = __snd_ctl_add_replace(card, kctl, CTL_ADD_EXCLUSIVE); 1354 if (err < 0) { 1355 snd_ctl_free_one(kctl); 1356 goto unlock; 1357 } 1358 offset = snd_ctl_get_ioff(kctl, &info->id); 1359 snd_ctl_build_ioff(&info->id, kctl, offset); 1360 /* 1361 * Here we cannot fill any field for the number of elements added by 1362 * this operation because there're no specific fields. The usage of 1363 * 'owner' field for this purpose may cause any bugs to userspace 1364 * applications because the field originally means PID of a process 1365 * which locks the element. 1366 */ 1367 1368 card->user_ctl_count++; 1369 1370 unlock: 1371 up_write(&card->controls_rwsem); 1372 return 0; 1373 } 1374 1375 static int snd_ctl_elem_add_user(struct snd_ctl_file *file, 1376 struct snd_ctl_elem_info __user *_info, int replace) 1377 { 1378 struct snd_ctl_elem_info info; 1379 int err; 1380 1381 if (copy_from_user(&info, _info, sizeof(info))) 1382 return -EFAULT; 1383 err = snd_ctl_elem_add(file, &info, replace); 1384 if (err < 0) 1385 return err; 1386 if (copy_to_user(_info, &info, sizeof(info))) { 1387 snd_ctl_remove_user_ctl(file, &info.id); 1388 return -EFAULT; 1389 } 1390 1391 return 0; 1392 } 1393 1394 static int snd_ctl_elem_remove(struct snd_ctl_file *file, 1395 struct snd_ctl_elem_id __user *_id) 1396 { 1397 struct snd_ctl_elem_id id; 1398 1399 if (copy_from_user(&id, _id, sizeof(id))) 1400 return -EFAULT; 1401 return snd_ctl_remove_user_ctl(file, &id); 1402 } 1403 1404 static int snd_ctl_subscribe_events(struct snd_ctl_file *file, int __user *ptr) 1405 { 1406 int subscribe; 1407 if (get_user(subscribe, ptr)) 1408 return -EFAULT; 1409 if (subscribe < 0) { 1410 subscribe = file->subscribed; 1411 if (put_user(subscribe, ptr)) 1412 return -EFAULT; 1413 return 0; 1414 } 1415 if (subscribe) { 1416 file->subscribed = 1; 1417 return 0; 1418 } else if (file->subscribed) { 1419 snd_ctl_empty_read_queue(file); 1420 file->subscribed = 0; 1421 } 1422 return 0; 1423 } 1424 1425 static int call_tlv_handler(struct snd_ctl_file *file, int op_flag, 1426 struct snd_kcontrol *kctl, 1427 struct snd_ctl_elem_id *id, 1428 unsigned int __user *buf, unsigned int size) 1429 { 1430 static const struct { 1431 int op; 1432 int perm; 1433 } pairs[] = { 1434 {SNDRV_CTL_TLV_OP_READ, SNDRV_CTL_ELEM_ACCESS_TLV_READ}, 1435 {SNDRV_CTL_TLV_OP_WRITE, SNDRV_CTL_ELEM_ACCESS_TLV_WRITE}, 1436 {SNDRV_CTL_TLV_OP_CMD, SNDRV_CTL_ELEM_ACCESS_TLV_COMMAND}, 1437 }; 1438 struct snd_kcontrol_volatile *vd = &kctl->vd[snd_ctl_get_ioff(kctl, id)]; 1439 int i; 1440 1441 /* Check support of the request for this element. */ 1442 for (i = 0; i < ARRAY_SIZE(pairs); ++i) { 1443 if (op_flag == pairs[i].op && (vd->access & pairs[i].perm)) 1444 break; 1445 } 1446 if (i == ARRAY_SIZE(pairs)) 1447 return -ENXIO; 1448 1449 if (kctl->tlv.c == NULL) 1450 return -ENXIO; 1451 1452 /* When locked, this is unavailable. */ 1453 if (vd->owner != NULL && vd->owner != file) 1454 return -EPERM; 1455 1456 return kctl->tlv.c(kctl, op_flag, size, buf); 1457 } 1458 1459 static int read_tlv_buf(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id, 1460 unsigned int __user *buf, unsigned int size) 1461 { 1462 struct snd_kcontrol_volatile *vd = &kctl->vd[snd_ctl_get_ioff(kctl, id)]; 1463 unsigned int len; 1464 1465 if (!(vd->access & SNDRV_CTL_ELEM_ACCESS_TLV_READ)) 1466 return -ENXIO; 1467 1468 if (kctl->tlv.p == NULL) 1469 return -ENXIO; 1470 1471 len = sizeof(unsigned int) * 2 + kctl->tlv.p[1]; 1472 if (size < len) 1473 return -ENOMEM; 1474 1475 if (copy_to_user(buf, kctl->tlv.p, len)) 1476 return -EFAULT; 1477 1478 return 0; 1479 } 1480 1481 static int snd_ctl_tlv_ioctl(struct snd_ctl_file *file, 1482 struct snd_ctl_tlv __user *buf, 1483 int op_flag) 1484 { 1485 struct snd_ctl_tlv header; 1486 unsigned int __user *container; 1487 unsigned int container_size; 1488 struct snd_kcontrol *kctl; 1489 struct snd_ctl_elem_id id; 1490 struct snd_kcontrol_volatile *vd; 1491 1492 if (copy_from_user(&header, buf, sizeof(header))) 1493 return -EFAULT; 1494 1495 /* In design of control core, numerical ID starts at 1. */ 1496 if (header.numid == 0) 1497 return -EINVAL; 1498 1499 /* At least, container should include type and length fields. */ 1500 if (header.length < sizeof(unsigned int) * 2) 1501 return -EINVAL; 1502 container_size = header.length; 1503 container = buf->tlv; 1504 1505 kctl = snd_ctl_find_numid(file->card, header.numid); 1506 if (kctl == NULL) 1507 return -ENOENT; 1508 1509 /* Calculate index of the element in this set. */ 1510 id = kctl->id; 1511 snd_ctl_build_ioff(&id, kctl, header.numid - id.numid); 1512 vd = &kctl->vd[snd_ctl_get_ioff(kctl, &id)]; 1513 1514 if (vd->access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) { 1515 return call_tlv_handler(file, op_flag, kctl, &id, container, 1516 container_size); 1517 } else { 1518 if (op_flag == SNDRV_CTL_TLV_OP_READ) { 1519 return read_tlv_buf(kctl, &id, container, 1520 container_size); 1521 } 1522 } 1523 1524 /* Not supported. */ 1525 return -ENXIO; 1526 } 1527 1528 static long snd_ctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg) 1529 { 1530 struct snd_ctl_file *ctl; 1531 struct snd_card *card; 1532 struct snd_kctl_ioctl *p; 1533 void __user *argp = (void __user *)arg; 1534 int __user *ip = argp; 1535 int err; 1536 1537 ctl = file->private_data; 1538 card = ctl->card; 1539 if (snd_BUG_ON(!card)) 1540 return -ENXIO; 1541 switch (cmd) { 1542 case SNDRV_CTL_IOCTL_PVERSION: 1543 return put_user(SNDRV_CTL_VERSION, ip) ? -EFAULT : 0; 1544 case SNDRV_CTL_IOCTL_CARD_INFO: 1545 return snd_ctl_card_info(card, ctl, cmd, argp); 1546 case SNDRV_CTL_IOCTL_ELEM_LIST: 1547 return snd_ctl_elem_list(card, argp); 1548 case SNDRV_CTL_IOCTL_ELEM_INFO: 1549 return snd_ctl_elem_info_user(ctl, argp); 1550 case SNDRV_CTL_IOCTL_ELEM_READ: 1551 return snd_ctl_elem_read_user(card, argp); 1552 case SNDRV_CTL_IOCTL_ELEM_WRITE: 1553 return snd_ctl_elem_write_user(ctl, argp); 1554 case SNDRV_CTL_IOCTL_ELEM_LOCK: 1555 return snd_ctl_elem_lock(ctl, argp); 1556 case SNDRV_CTL_IOCTL_ELEM_UNLOCK: 1557 return snd_ctl_elem_unlock(ctl, argp); 1558 case SNDRV_CTL_IOCTL_ELEM_ADD: 1559 return snd_ctl_elem_add_user(ctl, argp, 0); 1560 case SNDRV_CTL_IOCTL_ELEM_REPLACE: 1561 return snd_ctl_elem_add_user(ctl, argp, 1); 1562 case SNDRV_CTL_IOCTL_ELEM_REMOVE: 1563 return snd_ctl_elem_remove(ctl, argp); 1564 case SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS: 1565 return snd_ctl_subscribe_events(ctl, ip); 1566 case SNDRV_CTL_IOCTL_TLV_READ: 1567 down_read(&ctl->card->controls_rwsem); 1568 err = snd_ctl_tlv_ioctl(ctl, argp, SNDRV_CTL_TLV_OP_READ); 1569 up_read(&ctl->card->controls_rwsem); 1570 return err; 1571 case SNDRV_CTL_IOCTL_TLV_WRITE: 1572 down_write(&ctl->card->controls_rwsem); 1573 err = snd_ctl_tlv_ioctl(ctl, argp, SNDRV_CTL_TLV_OP_WRITE); 1574 up_write(&ctl->card->controls_rwsem); 1575 return err; 1576 case SNDRV_CTL_IOCTL_TLV_COMMAND: 1577 down_write(&ctl->card->controls_rwsem); 1578 err = snd_ctl_tlv_ioctl(ctl, argp, SNDRV_CTL_TLV_OP_CMD); 1579 up_write(&ctl->card->controls_rwsem); 1580 return err; 1581 case SNDRV_CTL_IOCTL_POWER: 1582 return -ENOPROTOOPT; 1583 case SNDRV_CTL_IOCTL_POWER_STATE: 1584 #ifdef CONFIG_PM 1585 return put_user(card->power_state, ip) ? -EFAULT : 0; 1586 #else 1587 return put_user(SNDRV_CTL_POWER_D0, ip) ? -EFAULT : 0; 1588 #endif 1589 } 1590 down_read(&snd_ioctl_rwsem); 1591 list_for_each_entry(p, &snd_control_ioctls, list) { 1592 err = p->fioctl(card, ctl, cmd, arg); 1593 if (err != -ENOIOCTLCMD) { 1594 up_read(&snd_ioctl_rwsem); 1595 return err; 1596 } 1597 } 1598 up_read(&snd_ioctl_rwsem); 1599 dev_dbg(card->dev, "unknown ioctl = 0x%x\n", cmd); 1600 return -ENOTTY; 1601 } 1602 1603 static ssize_t snd_ctl_read(struct file *file, char __user *buffer, 1604 size_t count, loff_t * offset) 1605 { 1606 struct snd_ctl_file *ctl; 1607 int err = 0; 1608 ssize_t result = 0; 1609 1610 ctl = file->private_data; 1611 if (snd_BUG_ON(!ctl || !ctl->card)) 1612 return -ENXIO; 1613 if (!ctl->subscribed) 1614 return -EBADFD; 1615 if (count < sizeof(struct snd_ctl_event)) 1616 return -EINVAL; 1617 spin_lock_irq(&ctl->read_lock); 1618 while (count >= sizeof(struct snd_ctl_event)) { 1619 struct snd_ctl_event ev; 1620 struct snd_kctl_event *kev; 1621 while (list_empty(&ctl->events)) { 1622 wait_queue_entry_t wait; 1623 if ((file->f_flags & O_NONBLOCK) != 0 || result > 0) { 1624 err = -EAGAIN; 1625 goto __end_lock; 1626 } 1627 init_waitqueue_entry(&wait, current); 1628 add_wait_queue(&ctl->change_sleep, &wait); 1629 set_current_state(TASK_INTERRUPTIBLE); 1630 spin_unlock_irq(&ctl->read_lock); 1631 schedule(); 1632 remove_wait_queue(&ctl->change_sleep, &wait); 1633 if (ctl->card->shutdown) 1634 return -ENODEV; 1635 if (signal_pending(current)) 1636 return -ERESTARTSYS; 1637 spin_lock_irq(&ctl->read_lock); 1638 } 1639 kev = snd_kctl_event(ctl->events.next); 1640 ev.type = SNDRV_CTL_EVENT_ELEM; 1641 ev.data.elem.mask = kev->mask; 1642 ev.data.elem.id = kev->id; 1643 list_del(&kev->list); 1644 spin_unlock_irq(&ctl->read_lock); 1645 kfree(kev); 1646 if (copy_to_user(buffer, &ev, sizeof(struct snd_ctl_event))) { 1647 err = -EFAULT; 1648 goto __end; 1649 } 1650 spin_lock_irq(&ctl->read_lock); 1651 buffer += sizeof(struct snd_ctl_event); 1652 count -= sizeof(struct snd_ctl_event); 1653 result += sizeof(struct snd_ctl_event); 1654 } 1655 __end_lock: 1656 spin_unlock_irq(&ctl->read_lock); 1657 __end: 1658 return result > 0 ? result : err; 1659 } 1660 1661 static __poll_t snd_ctl_poll(struct file *file, poll_table * wait) 1662 { 1663 __poll_t mask; 1664 struct snd_ctl_file *ctl; 1665 1666 ctl = file->private_data; 1667 if (!ctl->subscribed) 1668 return 0; 1669 poll_wait(file, &ctl->change_sleep, wait); 1670 1671 mask = 0; 1672 if (!list_empty(&ctl->events)) 1673 mask |= EPOLLIN | EPOLLRDNORM; 1674 1675 return mask; 1676 } 1677 1678 /* 1679 * register the device-specific control-ioctls. 1680 * called from each device manager like pcm.c, hwdep.c, etc. 1681 */ 1682 static int _snd_ctl_register_ioctl(snd_kctl_ioctl_func_t fcn, struct list_head *lists) 1683 { 1684 struct snd_kctl_ioctl *pn; 1685 1686 pn = kzalloc(sizeof(struct snd_kctl_ioctl), GFP_KERNEL); 1687 if (pn == NULL) 1688 return -ENOMEM; 1689 pn->fioctl = fcn; 1690 down_write(&snd_ioctl_rwsem); 1691 list_add_tail(&pn->list, lists); 1692 up_write(&snd_ioctl_rwsem); 1693 return 0; 1694 } 1695 1696 /** 1697 * snd_ctl_register_ioctl - register the device-specific control-ioctls 1698 * @fcn: ioctl callback function 1699 * 1700 * called from each device manager like pcm.c, hwdep.c, etc. 1701 */ 1702 int snd_ctl_register_ioctl(snd_kctl_ioctl_func_t fcn) 1703 { 1704 return _snd_ctl_register_ioctl(fcn, &snd_control_ioctls); 1705 } 1706 EXPORT_SYMBOL(snd_ctl_register_ioctl); 1707 1708 #ifdef CONFIG_COMPAT 1709 /** 1710 * snd_ctl_register_ioctl_compat - register the device-specific 32bit compat 1711 * control-ioctls 1712 * @fcn: ioctl callback function 1713 */ 1714 int snd_ctl_register_ioctl_compat(snd_kctl_ioctl_func_t fcn) 1715 { 1716 return _snd_ctl_register_ioctl(fcn, &snd_control_compat_ioctls); 1717 } 1718 EXPORT_SYMBOL(snd_ctl_register_ioctl_compat); 1719 #endif 1720 1721 /* 1722 * de-register the device-specific control-ioctls. 1723 */ 1724 static int _snd_ctl_unregister_ioctl(snd_kctl_ioctl_func_t fcn, 1725 struct list_head *lists) 1726 { 1727 struct snd_kctl_ioctl *p; 1728 1729 if (snd_BUG_ON(!fcn)) 1730 return -EINVAL; 1731 down_write(&snd_ioctl_rwsem); 1732 list_for_each_entry(p, lists, list) { 1733 if (p->fioctl == fcn) { 1734 list_del(&p->list); 1735 up_write(&snd_ioctl_rwsem); 1736 kfree(p); 1737 return 0; 1738 } 1739 } 1740 up_write(&snd_ioctl_rwsem); 1741 snd_BUG(); 1742 return -EINVAL; 1743 } 1744 1745 /** 1746 * snd_ctl_unregister_ioctl - de-register the device-specific control-ioctls 1747 * @fcn: ioctl callback function to unregister 1748 */ 1749 int snd_ctl_unregister_ioctl(snd_kctl_ioctl_func_t fcn) 1750 { 1751 return _snd_ctl_unregister_ioctl(fcn, &snd_control_ioctls); 1752 } 1753 EXPORT_SYMBOL(snd_ctl_unregister_ioctl); 1754 1755 #ifdef CONFIG_COMPAT 1756 /** 1757 * snd_ctl_unregister_ioctl - de-register the device-specific compat 32bit 1758 * control-ioctls 1759 * @fcn: ioctl callback function to unregister 1760 */ 1761 int snd_ctl_unregister_ioctl_compat(snd_kctl_ioctl_func_t fcn) 1762 { 1763 return _snd_ctl_unregister_ioctl(fcn, &snd_control_compat_ioctls); 1764 } 1765 EXPORT_SYMBOL(snd_ctl_unregister_ioctl_compat); 1766 #endif 1767 1768 static int snd_ctl_fasync(int fd, struct file * file, int on) 1769 { 1770 struct snd_ctl_file *ctl; 1771 1772 ctl = file->private_data; 1773 return fasync_helper(fd, file, on, &ctl->fasync); 1774 } 1775 1776 /* return the preferred subdevice number if already assigned; 1777 * otherwise return -1 1778 */ 1779 int snd_ctl_get_preferred_subdevice(struct snd_card *card, int type) 1780 { 1781 struct snd_ctl_file *kctl; 1782 int subdevice = -1; 1783 1784 read_lock(&card->ctl_files_rwlock); 1785 list_for_each_entry(kctl, &card->ctl_files, list) { 1786 if (kctl->pid == task_pid(current)) { 1787 subdevice = kctl->preferred_subdevice[type]; 1788 if (subdevice != -1) 1789 break; 1790 } 1791 } 1792 read_unlock(&card->ctl_files_rwlock); 1793 return subdevice; 1794 } 1795 EXPORT_SYMBOL_GPL(snd_ctl_get_preferred_subdevice); 1796 1797 /* 1798 * ioctl32 compat 1799 */ 1800 #ifdef CONFIG_COMPAT 1801 #include "control_compat.c" 1802 #else 1803 #define snd_ctl_ioctl_compat NULL 1804 #endif 1805 1806 /* 1807 * INIT PART 1808 */ 1809 1810 static const struct file_operations snd_ctl_f_ops = 1811 { 1812 .owner = THIS_MODULE, 1813 .read = snd_ctl_read, 1814 .open = snd_ctl_open, 1815 .release = snd_ctl_release, 1816 .llseek = no_llseek, 1817 .poll = snd_ctl_poll, 1818 .unlocked_ioctl = snd_ctl_ioctl, 1819 .compat_ioctl = snd_ctl_ioctl_compat, 1820 .fasync = snd_ctl_fasync, 1821 }; 1822 1823 /* 1824 * registration of the control device 1825 */ 1826 static int snd_ctl_dev_register(struct snd_device *device) 1827 { 1828 struct snd_card *card = device->device_data; 1829 1830 return snd_register_device(SNDRV_DEVICE_TYPE_CONTROL, card, -1, 1831 &snd_ctl_f_ops, card, &card->ctl_dev); 1832 } 1833 1834 /* 1835 * disconnection of the control device 1836 */ 1837 static int snd_ctl_dev_disconnect(struct snd_device *device) 1838 { 1839 struct snd_card *card = device->device_data; 1840 struct snd_ctl_file *ctl; 1841 1842 read_lock(&card->ctl_files_rwlock); 1843 list_for_each_entry(ctl, &card->ctl_files, list) { 1844 wake_up(&ctl->change_sleep); 1845 kill_fasync(&ctl->fasync, SIGIO, POLL_ERR); 1846 } 1847 read_unlock(&card->ctl_files_rwlock); 1848 1849 return snd_unregister_device(&card->ctl_dev); 1850 } 1851 1852 /* 1853 * free all controls 1854 */ 1855 static int snd_ctl_dev_free(struct snd_device *device) 1856 { 1857 struct snd_card *card = device->device_data; 1858 struct snd_kcontrol *control; 1859 1860 down_write(&card->controls_rwsem); 1861 while (!list_empty(&card->controls)) { 1862 control = snd_kcontrol(card->controls.next); 1863 snd_ctl_remove(card, control); 1864 } 1865 up_write(&card->controls_rwsem); 1866 put_device(&card->ctl_dev); 1867 return 0; 1868 } 1869 1870 /* 1871 * create control core: 1872 * called from init.c 1873 */ 1874 int snd_ctl_create(struct snd_card *card) 1875 { 1876 static struct snd_device_ops ops = { 1877 .dev_free = snd_ctl_dev_free, 1878 .dev_register = snd_ctl_dev_register, 1879 .dev_disconnect = snd_ctl_dev_disconnect, 1880 }; 1881 int err; 1882 1883 if (snd_BUG_ON(!card)) 1884 return -ENXIO; 1885 if (snd_BUG_ON(card->number < 0 || card->number >= SNDRV_CARDS)) 1886 return -ENXIO; 1887 1888 snd_device_initialize(&card->ctl_dev, card); 1889 dev_set_name(&card->ctl_dev, "controlC%d", card->number); 1890 1891 err = snd_device_new(card, SNDRV_DEV_CONTROL, card, &ops); 1892 if (err < 0) 1893 put_device(&card->ctl_dev); 1894 return err; 1895 } 1896 1897 /* 1898 * Frequently used control callbacks/helpers 1899 */ 1900 1901 /** 1902 * snd_ctl_boolean_mono_info - Helper function for a standard boolean info 1903 * callback with a mono channel 1904 * @kcontrol: the kcontrol instance 1905 * @uinfo: info to store 1906 * 1907 * This is a function that can be used as info callback for a standard 1908 * boolean control with a single mono channel. 1909 */ 1910 int snd_ctl_boolean_mono_info(struct snd_kcontrol *kcontrol, 1911 struct snd_ctl_elem_info *uinfo) 1912 { 1913 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; 1914 uinfo->count = 1; 1915 uinfo->value.integer.min = 0; 1916 uinfo->value.integer.max = 1; 1917 return 0; 1918 } 1919 EXPORT_SYMBOL(snd_ctl_boolean_mono_info); 1920 1921 /** 1922 * snd_ctl_boolean_stereo_info - Helper function for a standard boolean info 1923 * callback with stereo two channels 1924 * @kcontrol: the kcontrol instance 1925 * @uinfo: info to store 1926 * 1927 * This is a function that can be used as info callback for a standard 1928 * boolean control with stereo two channels. 1929 */ 1930 int snd_ctl_boolean_stereo_info(struct snd_kcontrol *kcontrol, 1931 struct snd_ctl_elem_info *uinfo) 1932 { 1933 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; 1934 uinfo->count = 2; 1935 uinfo->value.integer.min = 0; 1936 uinfo->value.integer.max = 1; 1937 return 0; 1938 } 1939 EXPORT_SYMBOL(snd_ctl_boolean_stereo_info); 1940 1941 /** 1942 * snd_ctl_enum_info - fills the info structure for an enumerated control 1943 * @info: the structure to be filled 1944 * @channels: the number of the control's channels; often one 1945 * @items: the number of control values; also the size of @names 1946 * @names: an array containing the names of all control values 1947 * 1948 * Sets all required fields in @info to their appropriate values. 1949 * If the control's accessibility is not the default (readable and writable), 1950 * the caller has to fill @info->access. 1951 * 1952 * Return: Zero. 1953 */ 1954 int snd_ctl_enum_info(struct snd_ctl_elem_info *info, unsigned int channels, 1955 unsigned int items, const char *const names[]) 1956 { 1957 info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 1958 info->count = channels; 1959 info->value.enumerated.items = items; 1960 if (!items) 1961 return 0; 1962 if (info->value.enumerated.item >= items) 1963 info->value.enumerated.item = items - 1; 1964 WARN(strlen(names[info->value.enumerated.item]) >= sizeof(info->value.enumerated.name), 1965 "ALSA: too long item name '%s'\n", 1966 names[info->value.enumerated.item]); 1967 strlcpy(info->value.enumerated.name, 1968 names[info->value.enumerated.item], 1969 sizeof(info->value.enumerated.name)); 1970 return 0; 1971 } 1972 EXPORT_SYMBOL(snd_ctl_enum_info); 1973