1 /* 2 * SPU file system -- file contents 3 * 4 * (C) Copyright IBM Deutschland Entwicklung GmbH 2005 5 * 6 * Author: Arnd Bergmann <arndb@de.ibm.com> 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2, or (at your option) 11 * any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program; if not, write to the Free Software 20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 21 */ 22 23 #undef DEBUG 24 25 #include <linux/fs.h> 26 #include <linux/ioctl.h> 27 #include <linux/export.h> 28 #include <linux/pagemap.h> 29 #include <linux/poll.h> 30 #include <linux/ptrace.h> 31 #include <linux/seq_file.h> 32 #include <linux/slab.h> 33 34 #include <asm/io.h> 35 #include <asm/time.h> 36 #include <asm/spu.h> 37 #include <asm/spu_info.h> 38 #include <asm/uaccess.h> 39 40 #include "spufs.h" 41 #include "sputrace.h" 42 43 #define SPUFS_MMAP_4K (PAGE_SIZE == 0x1000) 44 45 /* Simple attribute files */ 46 struct spufs_attr { 47 int (*get)(void *, u64 *); 48 int (*set)(void *, u64); 49 char get_buf[24]; /* enough to store a u64 and "\n\0" */ 50 char set_buf[24]; 51 void *data; 52 const char *fmt; /* format for read operation */ 53 struct mutex mutex; /* protects access to these buffers */ 54 }; 55 56 static int spufs_attr_open(struct inode *inode, struct file *file, 57 int (*get)(void *, u64 *), int (*set)(void *, u64), 58 const char *fmt) 59 { 60 struct spufs_attr *attr; 61 62 attr = kmalloc(sizeof(*attr), GFP_KERNEL); 63 if (!attr) 64 return -ENOMEM; 65 66 attr->get = get; 67 attr->set = set; 68 attr->data = inode->i_private; 69 attr->fmt = fmt; 70 mutex_init(&attr->mutex); 71 file->private_data = attr; 72 73 return nonseekable_open(inode, file); 74 } 75 76 static int spufs_attr_release(struct inode *inode, struct file *file) 77 { 78 kfree(file->private_data); 79 return 0; 80 } 81 82 static ssize_t spufs_attr_read(struct file *file, char __user *buf, 83 size_t len, loff_t *ppos) 84 { 85 struct spufs_attr *attr; 86 size_t size; 87 ssize_t ret; 88 89 attr = file->private_data; 90 if (!attr->get) 91 return -EACCES; 92 93 ret = mutex_lock_interruptible(&attr->mutex); 94 if (ret) 95 return ret; 96 97 if (*ppos) { /* continued read */ 98 size = strlen(attr->get_buf); 99 } else { /* first read */ 100 u64 val; 101 ret = attr->get(attr->data, &val); 102 if (ret) 103 goto out; 104 105 size = scnprintf(attr->get_buf, sizeof(attr->get_buf), 106 attr->fmt, (unsigned long long)val); 107 } 108 109 ret = simple_read_from_buffer(buf, len, ppos, attr->get_buf, size); 110 out: 111 mutex_unlock(&attr->mutex); 112 return ret; 113 } 114 115 static ssize_t spufs_attr_write(struct file *file, const char __user *buf, 116 size_t len, loff_t *ppos) 117 { 118 struct spufs_attr *attr; 119 u64 val; 120 size_t size; 121 ssize_t ret; 122 123 attr = file->private_data; 124 if (!attr->set) 125 return -EACCES; 126 127 ret = mutex_lock_interruptible(&attr->mutex); 128 if (ret) 129 return ret; 130 131 ret = -EFAULT; 132 size = min(sizeof(attr->set_buf) - 1, len); 133 if (copy_from_user(attr->set_buf, buf, size)) 134 goto out; 135 136 ret = len; /* claim we got the whole input */ 137 attr->set_buf[size] = '\0'; 138 val = simple_strtol(attr->set_buf, NULL, 0); 139 attr->set(attr->data, val); 140 out: 141 mutex_unlock(&attr->mutex); 142 return ret; 143 } 144 145 #define DEFINE_SPUFS_SIMPLE_ATTRIBUTE(__fops, __get, __set, __fmt) \ 146 static int __fops ## _open(struct inode *inode, struct file *file) \ 147 { \ 148 __simple_attr_check_format(__fmt, 0ull); \ 149 return spufs_attr_open(inode, file, __get, __set, __fmt); \ 150 } \ 151 static const struct file_operations __fops = { \ 152 .open = __fops ## _open, \ 153 .release = spufs_attr_release, \ 154 .read = spufs_attr_read, \ 155 .write = spufs_attr_write, \ 156 .llseek = generic_file_llseek, \ 157 }; 158 159 160 static int 161 spufs_mem_open(struct inode *inode, struct file *file) 162 { 163 struct spufs_inode_info *i = SPUFS_I(inode); 164 struct spu_context *ctx = i->i_ctx; 165 166 mutex_lock(&ctx->mapping_lock); 167 file->private_data = ctx; 168 if (!i->i_openers++) 169 ctx->local_store = inode->i_mapping; 170 mutex_unlock(&ctx->mapping_lock); 171 return 0; 172 } 173 174 static int 175 spufs_mem_release(struct inode *inode, struct file *file) 176 { 177 struct spufs_inode_info *i = SPUFS_I(inode); 178 struct spu_context *ctx = i->i_ctx; 179 180 mutex_lock(&ctx->mapping_lock); 181 if (!--i->i_openers) 182 ctx->local_store = NULL; 183 mutex_unlock(&ctx->mapping_lock); 184 return 0; 185 } 186 187 static ssize_t 188 __spufs_mem_read(struct spu_context *ctx, char __user *buffer, 189 size_t size, loff_t *pos) 190 { 191 char *local_store = ctx->ops->get_ls(ctx); 192 return simple_read_from_buffer(buffer, size, pos, local_store, 193 LS_SIZE); 194 } 195 196 static ssize_t 197 spufs_mem_read(struct file *file, char __user *buffer, 198 size_t size, loff_t *pos) 199 { 200 struct spu_context *ctx = file->private_data; 201 ssize_t ret; 202 203 ret = spu_acquire(ctx); 204 if (ret) 205 return ret; 206 ret = __spufs_mem_read(ctx, buffer, size, pos); 207 spu_release(ctx); 208 209 return ret; 210 } 211 212 static ssize_t 213 spufs_mem_write(struct file *file, const char __user *buffer, 214 size_t size, loff_t *ppos) 215 { 216 struct spu_context *ctx = file->private_data; 217 char *local_store; 218 loff_t pos = *ppos; 219 int ret; 220 221 if (pos > LS_SIZE) 222 return -EFBIG; 223 224 ret = spu_acquire(ctx); 225 if (ret) 226 return ret; 227 228 local_store = ctx->ops->get_ls(ctx); 229 size = simple_write_to_buffer(local_store, LS_SIZE, ppos, buffer, size); 230 spu_release(ctx); 231 232 return size; 233 } 234 235 static int 236 spufs_mem_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) 237 { 238 struct spu_context *ctx = vma->vm_file->private_data; 239 unsigned long address = (unsigned long)vmf->virtual_address; 240 unsigned long pfn, offset; 241 242 offset = vmf->pgoff << PAGE_SHIFT; 243 if (offset >= LS_SIZE) 244 return VM_FAULT_SIGBUS; 245 246 pr_debug("spufs_mem_mmap_fault address=0x%lx, offset=0x%lx\n", 247 address, offset); 248 249 if (spu_acquire(ctx)) 250 return VM_FAULT_NOPAGE; 251 252 if (ctx->state == SPU_STATE_SAVED) { 253 vma->vm_page_prot = pgprot_cached(vma->vm_page_prot); 254 pfn = vmalloc_to_pfn(ctx->csa.lscsa->ls + offset); 255 } else { 256 vma->vm_page_prot = pgprot_noncached_wc(vma->vm_page_prot); 257 pfn = (ctx->spu->local_store_phys + offset) >> PAGE_SHIFT; 258 } 259 vm_insert_pfn(vma, address, pfn); 260 261 spu_release(ctx); 262 263 return VM_FAULT_NOPAGE; 264 } 265 266 static int spufs_mem_mmap_access(struct vm_area_struct *vma, 267 unsigned long address, 268 void *buf, int len, int write) 269 { 270 struct spu_context *ctx = vma->vm_file->private_data; 271 unsigned long offset = address - vma->vm_start; 272 char *local_store; 273 274 if (write && !(vma->vm_flags & VM_WRITE)) 275 return -EACCES; 276 if (spu_acquire(ctx)) 277 return -EINTR; 278 if ((offset + len) > vma->vm_end) 279 len = vma->vm_end - offset; 280 local_store = ctx->ops->get_ls(ctx); 281 if (write) 282 memcpy_toio(local_store + offset, buf, len); 283 else 284 memcpy_fromio(buf, local_store + offset, len); 285 spu_release(ctx); 286 return len; 287 } 288 289 static const struct vm_operations_struct spufs_mem_mmap_vmops = { 290 .fault = spufs_mem_mmap_fault, 291 .access = spufs_mem_mmap_access, 292 }; 293 294 static int spufs_mem_mmap(struct file *file, struct vm_area_struct *vma) 295 { 296 if (!(vma->vm_flags & VM_SHARED)) 297 return -EINVAL; 298 299 vma->vm_flags |= VM_IO | VM_PFNMAP; 300 vma->vm_page_prot = pgprot_noncached_wc(vma->vm_page_prot); 301 302 vma->vm_ops = &spufs_mem_mmap_vmops; 303 return 0; 304 } 305 306 static const struct file_operations spufs_mem_fops = { 307 .open = spufs_mem_open, 308 .release = spufs_mem_release, 309 .read = spufs_mem_read, 310 .write = spufs_mem_write, 311 .llseek = generic_file_llseek, 312 .mmap = spufs_mem_mmap, 313 }; 314 315 static int spufs_ps_fault(struct vm_area_struct *vma, 316 struct vm_fault *vmf, 317 unsigned long ps_offs, 318 unsigned long ps_size) 319 { 320 struct spu_context *ctx = vma->vm_file->private_data; 321 unsigned long area, offset = vmf->pgoff << PAGE_SHIFT; 322 int ret = 0; 323 324 spu_context_nospu_trace(spufs_ps_fault__enter, ctx); 325 326 if (offset >= ps_size) 327 return VM_FAULT_SIGBUS; 328 329 if (fatal_signal_pending(current)) 330 return VM_FAULT_SIGBUS; 331 332 /* 333 * Because we release the mmap_sem, the context may be destroyed while 334 * we're in spu_wait. Grab an extra reference so it isn't destroyed 335 * in the meantime. 336 */ 337 get_spu_context(ctx); 338 339 /* 340 * We have to wait for context to be loaded before we have 341 * pages to hand out to the user, but we don't want to wait 342 * with the mmap_sem held. 343 * It is possible to drop the mmap_sem here, but then we need 344 * to return VM_FAULT_NOPAGE because the mappings may have 345 * hanged. 346 */ 347 if (spu_acquire(ctx)) 348 goto refault; 349 350 if (ctx->state == SPU_STATE_SAVED) { 351 up_read(¤t->mm->mmap_sem); 352 spu_context_nospu_trace(spufs_ps_fault__sleep, ctx); 353 ret = spufs_wait(ctx->run_wq, ctx->state == SPU_STATE_RUNNABLE); 354 spu_context_trace(spufs_ps_fault__wake, ctx, ctx->spu); 355 down_read(¤t->mm->mmap_sem); 356 } else { 357 area = ctx->spu->problem_phys + ps_offs; 358 vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, 359 (area + offset) >> PAGE_SHIFT); 360 spu_context_trace(spufs_ps_fault__insert, ctx, ctx->spu); 361 } 362 363 if (!ret) 364 spu_release(ctx); 365 366 refault: 367 put_spu_context(ctx); 368 return VM_FAULT_NOPAGE; 369 } 370 371 #if SPUFS_MMAP_4K 372 static int spufs_cntl_mmap_fault(struct vm_area_struct *vma, 373 struct vm_fault *vmf) 374 { 375 return spufs_ps_fault(vma, vmf, 0x4000, SPUFS_CNTL_MAP_SIZE); 376 } 377 378 static const struct vm_operations_struct spufs_cntl_mmap_vmops = { 379 .fault = spufs_cntl_mmap_fault, 380 }; 381 382 /* 383 * mmap support for problem state control area [0x4000 - 0x4fff]. 384 */ 385 static int spufs_cntl_mmap(struct file *file, struct vm_area_struct *vma) 386 { 387 if (!(vma->vm_flags & VM_SHARED)) 388 return -EINVAL; 389 390 vma->vm_flags |= VM_IO | VM_PFNMAP; 391 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 392 393 vma->vm_ops = &spufs_cntl_mmap_vmops; 394 return 0; 395 } 396 #else /* SPUFS_MMAP_4K */ 397 #define spufs_cntl_mmap NULL 398 #endif /* !SPUFS_MMAP_4K */ 399 400 static int spufs_cntl_get(void *data, u64 *val) 401 { 402 struct spu_context *ctx = data; 403 int ret; 404 405 ret = spu_acquire(ctx); 406 if (ret) 407 return ret; 408 *val = ctx->ops->status_read(ctx); 409 spu_release(ctx); 410 411 return 0; 412 } 413 414 static int spufs_cntl_set(void *data, u64 val) 415 { 416 struct spu_context *ctx = data; 417 int ret; 418 419 ret = spu_acquire(ctx); 420 if (ret) 421 return ret; 422 ctx->ops->runcntl_write(ctx, val); 423 spu_release(ctx); 424 425 return 0; 426 } 427 428 static int spufs_cntl_open(struct inode *inode, struct file *file) 429 { 430 struct spufs_inode_info *i = SPUFS_I(inode); 431 struct spu_context *ctx = i->i_ctx; 432 433 mutex_lock(&ctx->mapping_lock); 434 file->private_data = ctx; 435 if (!i->i_openers++) 436 ctx->cntl = inode->i_mapping; 437 mutex_unlock(&ctx->mapping_lock); 438 return simple_attr_open(inode, file, spufs_cntl_get, 439 spufs_cntl_set, "0x%08lx"); 440 } 441 442 static int 443 spufs_cntl_release(struct inode *inode, struct file *file) 444 { 445 struct spufs_inode_info *i = SPUFS_I(inode); 446 struct spu_context *ctx = i->i_ctx; 447 448 simple_attr_release(inode, file); 449 450 mutex_lock(&ctx->mapping_lock); 451 if (!--i->i_openers) 452 ctx->cntl = NULL; 453 mutex_unlock(&ctx->mapping_lock); 454 return 0; 455 } 456 457 static const struct file_operations spufs_cntl_fops = { 458 .open = spufs_cntl_open, 459 .release = spufs_cntl_release, 460 .read = simple_attr_read, 461 .write = simple_attr_write, 462 .llseek = generic_file_llseek, 463 .mmap = spufs_cntl_mmap, 464 }; 465 466 static int 467 spufs_regs_open(struct inode *inode, struct file *file) 468 { 469 struct spufs_inode_info *i = SPUFS_I(inode); 470 file->private_data = i->i_ctx; 471 return 0; 472 } 473 474 static ssize_t 475 __spufs_regs_read(struct spu_context *ctx, char __user *buffer, 476 size_t size, loff_t *pos) 477 { 478 struct spu_lscsa *lscsa = ctx->csa.lscsa; 479 return simple_read_from_buffer(buffer, size, pos, 480 lscsa->gprs, sizeof lscsa->gprs); 481 } 482 483 static ssize_t 484 spufs_regs_read(struct file *file, char __user *buffer, 485 size_t size, loff_t *pos) 486 { 487 int ret; 488 struct spu_context *ctx = file->private_data; 489 490 /* pre-check for file position: if we'd return EOF, there's no point 491 * causing a deschedule */ 492 if (*pos >= sizeof(ctx->csa.lscsa->gprs)) 493 return 0; 494 495 ret = spu_acquire_saved(ctx); 496 if (ret) 497 return ret; 498 ret = __spufs_regs_read(ctx, buffer, size, pos); 499 spu_release_saved(ctx); 500 return ret; 501 } 502 503 static ssize_t 504 spufs_regs_write(struct file *file, const char __user *buffer, 505 size_t size, loff_t *pos) 506 { 507 struct spu_context *ctx = file->private_data; 508 struct spu_lscsa *lscsa = ctx->csa.lscsa; 509 int ret; 510 511 if (*pos >= sizeof(lscsa->gprs)) 512 return -EFBIG; 513 514 ret = spu_acquire_saved(ctx); 515 if (ret) 516 return ret; 517 518 size = simple_write_to_buffer(lscsa->gprs, sizeof(lscsa->gprs), pos, 519 buffer, size); 520 521 spu_release_saved(ctx); 522 return size; 523 } 524 525 static const struct file_operations spufs_regs_fops = { 526 .open = spufs_regs_open, 527 .read = spufs_regs_read, 528 .write = spufs_regs_write, 529 .llseek = generic_file_llseek, 530 }; 531 532 static ssize_t 533 __spufs_fpcr_read(struct spu_context *ctx, char __user * buffer, 534 size_t size, loff_t * pos) 535 { 536 struct spu_lscsa *lscsa = ctx->csa.lscsa; 537 return simple_read_from_buffer(buffer, size, pos, 538 &lscsa->fpcr, sizeof(lscsa->fpcr)); 539 } 540 541 static ssize_t 542 spufs_fpcr_read(struct file *file, char __user * buffer, 543 size_t size, loff_t * pos) 544 { 545 int ret; 546 struct spu_context *ctx = file->private_data; 547 548 ret = spu_acquire_saved(ctx); 549 if (ret) 550 return ret; 551 ret = __spufs_fpcr_read(ctx, buffer, size, pos); 552 spu_release_saved(ctx); 553 return ret; 554 } 555 556 static ssize_t 557 spufs_fpcr_write(struct file *file, const char __user * buffer, 558 size_t size, loff_t * pos) 559 { 560 struct spu_context *ctx = file->private_data; 561 struct spu_lscsa *lscsa = ctx->csa.lscsa; 562 int ret; 563 564 if (*pos >= sizeof(lscsa->fpcr)) 565 return -EFBIG; 566 567 ret = spu_acquire_saved(ctx); 568 if (ret) 569 return ret; 570 571 size = simple_write_to_buffer(&lscsa->fpcr, sizeof(lscsa->fpcr), pos, 572 buffer, size); 573 574 spu_release_saved(ctx); 575 return size; 576 } 577 578 static const struct file_operations spufs_fpcr_fops = { 579 .open = spufs_regs_open, 580 .read = spufs_fpcr_read, 581 .write = spufs_fpcr_write, 582 .llseek = generic_file_llseek, 583 }; 584 585 /* generic open function for all pipe-like files */ 586 static int spufs_pipe_open(struct inode *inode, struct file *file) 587 { 588 struct spufs_inode_info *i = SPUFS_I(inode); 589 file->private_data = i->i_ctx; 590 591 return nonseekable_open(inode, file); 592 } 593 594 /* 595 * Read as many bytes from the mailbox as possible, until 596 * one of the conditions becomes true: 597 * 598 * - no more data available in the mailbox 599 * - end of the user provided buffer 600 * - end of the mapped area 601 */ 602 static ssize_t spufs_mbox_read(struct file *file, char __user *buf, 603 size_t len, loff_t *pos) 604 { 605 struct spu_context *ctx = file->private_data; 606 u32 mbox_data, __user *udata; 607 ssize_t count; 608 609 if (len < 4) 610 return -EINVAL; 611 612 if (!access_ok(VERIFY_WRITE, buf, len)) 613 return -EFAULT; 614 615 udata = (void __user *)buf; 616 617 count = spu_acquire(ctx); 618 if (count) 619 return count; 620 621 for (count = 0; (count + 4) <= len; count += 4, udata++) { 622 int ret; 623 ret = ctx->ops->mbox_read(ctx, &mbox_data); 624 if (ret == 0) 625 break; 626 627 /* 628 * at the end of the mapped area, we can fault 629 * but still need to return the data we have 630 * read successfully so far. 631 */ 632 ret = __put_user(mbox_data, udata); 633 if (ret) { 634 if (!count) 635 count = -EFAULT; 636 break; 637 } 638 } 639 spu_release(ctx); 640 641 if (!count) 642 count = -EAGAIN; 643 644 return count; 645 } 646 647 static const struct file_operations spufs_mbox_fops = { 648 .open = spufs_pipe_open, 649 .read = spufs_mbox_read, 650 .llseek = no_llseek, 651 }; 652 653 static ssize_t spufs_mbox_stat_read(struct file *file, char __user *buf, 654 size_t len, loff_t *pos) 655 { 656 struct spu_context *ctx = file->private_data; 657 ssize_t ret; 658 u32 mbox_stat; 659 660 if (len < 4) 661 return -EINVAL; 662 663 ret = spu_acquire(ctx); 664 if (ret) 665 return ret; 666 667 mbox_stat = ctx->ops->mbox_stat_read(ctx) & 0xff; 668 669 spu_release(ctx); 670 671 if (copy_to_user(buf, &mbox_stat, sizeof mbox_stat)) 672 return -EFAULT; 673 674 return 4; 675 } 676 677 static const struct file_operations spufs_mbox_stat_fops = { 678 .open = spufs_pipe_open, 679 .read = spufs_mbox_stat_read, 680 .llseek = no_llseek, 681 }; 682 683 /* low-level ibox access function */ 684 size_t spu_ibox_read(struct spu_context *ctx, u32 *data) 685 { 686 return ctx->ops->ibox_read(ctx, data); 687 } 688 689 static int spufs_ibox_fasync(int fd, struct file *file, int on) 690 { 691 struct spu_context *ctx = file->private_data; 692 693 return fasync_helper(fd, file, on, &ctx->ibox_fasync); 694 } 695 696 /* interrupt-level ibox callback function. */ 697 void spufs_ibox_callback(struct spu *spu) 698 { 699 struct spu_context *ctx = spu->ctx; 700 701 if (!ctx) 702 return; 703 704 wake_up_all(&ctx->ibox_wq); 705 kill_fasync(&ctx->ibox_fasync, SIGIO, POLLIN); 706 } 707 708 /* 709 * Read as many bytes from the interrupt mailbox as possible, until 710 * one of the conditions becomes true: 711 * 712 * - no more data available in the mailbox 713 * - end of the user provided buffer 714 * - end of the mapped area 715 * 716 * If the file is opened without O_NONBLOCK, we wait here until 717 * any data is available, but return when we have been able to 718 * read something. 719 */ 720 static ssize_t spufs_ibox_read(struct file *file, char __user *buf, 721 size_t len, loff_t *pos) 722 { 723 struct spu_context *ctx = file->private_data; 724 u32 ibox_data, __user *udata; 725 ssize_t count; 726 727 if (len < 4) 728 return -EINVAL; 729 730 if (!access_ok(VERIFY_WRITE, buf, len)) 731 return -EFAULT; 732 733 udata = (void __user *)buf; 734 735 count = spu_acquire(ctx); 736 if (count) 737 goto out; 738 739 /* wait only for the first element */ 740 count = 0; 741 if (file->f_flags & O_NONBLOCK) { 742 if (!spu_ibox_read(ctx, &ibox_data)) { 743 count = -EAGAIN; 744 goto out_unlock; 745 } 746 } else { 747 count = spufs_wait(ctx->ibox_wq, spu_ibox_read(ctx, &ibox_data)); 748 if (count) 749 goto out; 750 } 751 752 /* if we can't write at all, return -EFAULT */ 753 count = __put_user(ibox_data, udata); 754 if (count) 755 goto out_unlock; 756 757 for (count = 4, udata++; (count + 4) <= len; count += 4, udata++) { 758 int ret; 759 ret = ctx->ops->ibox_read(ctx, &ibox_data); 760 if (ret == 0) 761 break; 762 /* 763 * at the end of the mapped area, we can fault 764 * but still need to return the data we have 765 * read successfully so far. 766 */ 767 ret = __put_user(ibox_data, udata); 768 if (ret) 769 break; 770 } 771 772 out_unlock: 773 spu_release(ctx); 774 out: 775 return count; 776 } 777 778 static unsigned int spufs_ibox_poll(struct file *file, poll_table *wait) 779 { 780 struct spu_context *ctx = file->private_data; 781 unsigned int mask; 782 783 poll_wait(file, &ctx->ibox_wq, wait); 784 785 /* 786 * For now keep this uninterruptible and also ignore the rule 787 * that poll should not sleep. Will be fixed later. 788 */ 789 mutex_lock(&ctx->state_mutex); 790 mask = ctx->ops->mbox_stat_poll(ctx, POLLIN | POLLRDNORM); 791 spu_release(ctx); 792 793 return mask; 794 } 795 796 static const struct file_operations spufs_ibox_fops = { 797 .open = spufs_pipe_open, 798 .read = spufs_ibox_read, 799 .poll = spufs_ibox_poll, 800 .fasync = spufs_ibox_fasync, 801 .llseek = no_llseek, 802 }; 803 804 static ssize_t spufs_ibox_stat_read(struct file *file, char __user *buf, 805 size_t len, loff_t *pos) 806 { 807 struct spu_context *ctx = file->private_data; 808 ssize_t ret; 809 u32 ibox_stat; 810 811 if (len < 4) 812 return -EINVAL; 813 814 ret = spu_acquire(ctx); 815 if (ret) 816 return ret; 817 ibox_stat = (ctx->ops->mbox_stat_read(ctx) >> 16) & 0xff; 818 spu_release(ctx); 819 820 if (copy_to_user(buf, &ibox_stat, sizeof ibox_stat)) 821 return -EFAULT; 822 823 return 4; 824 } 825 826 static const struct file_operations spufs_ibox_stat_fops = { 827 .open = spufs_pipe_open, 828 .read = spufs_ibox_stat_read, 829 .llseek = no_llseek, 830 }; 831 832 /* low-level mailbox write */ 833 size_t spu_wbox_write(struct spu_context *ctx, u32 data) 834 { 835 return ctx->ops->wbox_write(ctx, data); 836 } 837 838 static int spufs_wbox_fasync(int fd, struct file *file, int on) 839 { 840 struct spu_context *ctx = file->private_data; 841 int ret; 842 843 ret = fasync_helper(fd, file, on, &ctx->wbox_fasync); 844 845 return ret; 846 } 847 848 /* interrupt-level wbox callback function. */ 849 void spufs_wbox_callback(struct spu *spu) 850 { 851 struct spu_context *ctx = spu->ctx; 852 853 if (!ctx) 854 return; 855 856 wake_up_all(&ctx->wbox_wq); 857 kill_fasync(&ctx->wbox_fasync, SIGIO, POLLOUT); 858 } 859 860 /* 861 * Write as many bytes to the interrupt mailbox as possible, until 862 * one of the conditions becomes true: 863 * 864 * - the mailbox is full 865 * - end of the user provided buffer 866 * - end of the mapped area 867 * 868 * If the file is opened without O_NONBLOCK, we wait here until 869 * space is availabyl, but return when we have been able to 870 * write something. 871 */ 872 static ssize_t spufs_wbox_write(struct file *file, const char __user *buf, 873 size_t len, loff_t *pos) 874 { 875 struct spu_context *ctx = file->private_data; 876 u32 wbox_data, __user *udata; 877 ssize_t count; 878 879 if (len < 4) 880 return -EINVAL; 881 882 udata = (void __user *)buf; 883 if (!access_ok(VERIFY_READ, buf, len)) 884 return -EFAULT; 885 886 if (__get_user(wbox_data, udata)) 887 return -EFAULT; 888 889 count = spu_acquire(ctx); 890 if (count) 891 goto out; 892 893 /* 894 * make sure we can at least write one element, by waiting 895 * in case of !O_NONBLOCK 896 */ 897 count = 0; 898 if (file->f_flags & O_NONBLOCK) { 899 if (!spu_wbox_write(ctx, wbox_data)) { 900 count = -EAGAIN; 901 goto out_unlock; 902 } 903 } else { 904 count = spufs_wait(ctx->wbox_wq, spu_wbox_write(ctx, wbox_data)); 905 if (count) 906 goto out; 907 } 908 909 910 /* write as much as possible */ 911 for (count = 4, udata++; (count + 4) <= len; count += 4, udata++) { 912 int ret; 913 ret = __get_user(wbox_data, udata); 914 if (ret) 915 break; 916 917 ret = spu_wbox_write(ctx, wbox_data); 918 if (ret == 0) 919 break; 920 } 921 922 out_unlock: 923 spu_release(ctx); 924 out: 925 return count; 926 } 927 928 static unsigned int spufs_wbox_poll(struct file *file, poll_table *wait) 929 { 930 struct spu_context *ctx = file->private_data; 931 unsigned int mask; 932 933 poll_wait(file, &ctx->wbox_wq, wait); 934 935 /* 936 * For now keep this uninterruptible and also ignore the rule 937 * that poll should not sleep. Will be fixed later. 938 */ 939 mutex_lock(&ctx->state_mutex); 940 mask = ctx->ops->mbox_stat_poll(ctx, POLLOUT | POLLWRNORM); 941 spu_release(ctx); 942 943 return mask; 944 } 945 946 static const struct file_operations spufs_wbox_fops = { 947 .open = spufs_pipe_open, 948 .write = spufs_wbox_write, 949 .poll = spufs_wbox_poll, 950 .fasync = spufs_wbox_fasync, 951 .llseek = no_llseek, 952 }; 953 954 static ssize_t spufs_wbox_stat_read(struct file *file, char __user *buf, 955 size_t len, loff_t *pos) 956 { 957 struct spu_context *ctx = file->private_data; 958 ssize_t ret; 959 u32 wbox_stat; 960 961 if (len < 4) 962 return -EINVAL; 963 964 ret = spu_acquire(ctx); 965 if (ret) 966 return ret; 967 wbox_stat = (ctx->ops->mbox_stat_read(ctx) >> 8) & 0xff; 968 spu_release(ctx); 969 970 if (copy_to_user(buf, &wbox_stat, sizeof wbox_stat)) 971 return -EFAULT; 972 973 return 4; 974 } 975 976 static const struct file_operations spufs_wbox_stat_fops = { 977 .open = spufs_pipe_open, 978 .read = spufs_wbox_stat_read, 979 .llseek = no_llseek, 980 }; 981 982 static int spufs_signal1_open(struct inode *inode, struct file *file) 983 { 984 struct spufs_inode_info *i = SPUFS_I(inode); 985 struct spu_context *ctx = i->i_ctx; 986 987 mutex_lock(&ctx->mapping_lock); 988 file->private_data = ctx; 989 if (!i->i_openers++) 990 ctx->signal1 = inode->i_mapping; 991 mutex_unlock(&ctx->mapping_lock); 992 return nonseekable_open(inode, file); 993 } 994 995 static int 996 spufs_signal1_release(struct inode *inode, struct file *file) 997 { 998 struct spufs_inode_info *i = SPUFS_I(inode); 999 struct spu_context *ctx = i->i_ctx; 1000 1001 mutex_lock(&ctx->mapping_lock); 1002 if (!--i->i_openers) 1003 ctx->signal1 = NULL; 1004 mutex_unlock(&ctx->mapping_lock); 1005 return 0; 1006 } 1007 1008 static ssize_t __spufs_signal1_read(struct spu_context *ctx, char __user *buf, 1009 size_t len, loff_t *pos) 1010 { 1011 int ret = 0; 1012 u32 data; 1013 1014 if (len < 4) 1015 return -EINVAL; 1016 1017 if (ctx->csa.spu_chnlcnt_RW[3]) { 1018 data = ctx->csa.spu_chnldata_RW[3]; 1019 ret = 4; 1020 } 1021 1022 if (!ret) 1023 goto out; 1024 1025 if (copy_to_user(buf, &data, 4)) 1026 return -EFAULT; 1027 1028 out: 1029 return ret; 1030 } 1031 1032 static ssize_t spufs_signal1_read(struct file *file, char __user *buf, 1033 size_t len, loff_t *pos) 1034 { 1035 int ret; 1036 struct spu_context *ctx = file->private_data; 1037 1038 ret = spu_acquire_saved(ctx); 1039 if (ret) 1040 return ret; 1041 ret = __spufs_signal1_read(ctx, buf, len, pos); 1042 spu_release_saved(ctx); 1043 1044 return ret; 1045 } 1046 1047 static ssize_t spufs_signal1_write(struct file *file, const char __user *buf, 1048 size_t len, loff_t *pos) 1049 { 1050 struct spu_context *ctx; 1051 ssize_t ret; 1052 u32 data; 1053 1054 ctx = file->private_data; 1055 1056 if (len < 4) 1057 return -EINVAL; 1058 1059 if (copy_from_user(&data, buf, 4)) 1060 return -EFAULT; 1061 1062 ret = spu_acquire(ctx); 1063 if (ret) 1064 return ret; 1065 ctx->ops->signal1_write(ctx, data); 1066 spu_release(ctx); 1067 1068 return 4; 1069 } 1070 1071 static int 1072 spufs_signal1_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) 1073 { 1074 #if SPUFS_SIGNAL_MAP_SIZE == 0x1000 1075 return spufs_ps_fault(vma, vmf, 0x14000, SPUFS_SIGNAL_MAP_SIZE); 1076 #elif SPUFS_SIGNAL_MAP_SIZE == 0x10000 1077 /* For 64k pages, both signal1 and signal2 can be used to mmap the whole 1078 * signal 1 and 2 area 1079 */ 1080 return spufs_ps_fault(vma, vmf, 0x10000, SPUFS_SIGNAL_MAP_SIZE); 1081 #else 1082 #error unsupported page size 1083 #endif 1084 } 1085 1086 static const struct vm_operations_struct spufs_signal1_mmap_vmops = { 1087 .fault = spufs_signal1_mmap_fault, 1088 }; 1089 1090 static int spufs_signal1_mmap(struct file *file, struct vm_area_struct *vma) 1091 { 1092 if (!(vma->vm_flags & VM_SHARED)) 1093 return -EINVAL; 1094 1095 vma->vm_flags |= VM_IO | VM_PFNMAP; 1096 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 1097 1098 vma->vm_ops = &spufs_signal1_mmap_vmops; 1099 return 0; 1100 } 1101 1102 static const struct file_operations spufs_signal1_fops = { 1103 .open = spufs_signal1_open, 1104 .release = spufs_signal1_release, 1105 .read = spufs_signal1_read, 1106 .write = spufs_signal1_write, 1107 .mmap = spufs_signal1_mmap, 1108 .llseek = no_llseek, 1109 }; 1110 1111 static const struct file_operations spufs_signal1_nosched_fops = { 1112 .open = spufs_signal1_open, 1113 .release = spufs_signal1_release, 1114 .write = spufs_signal1_write, 1115 .mmap = spufs_signal1_mmap, 1116 .llseek = no_llseek, 1117 }; 1118 1119 static int spufs_signal2_open(struct inode *inode, struct file *file) 1120 { 1121 struct spufs_inode_info *i = SPUFS_I(inode); 1122 struct spu_context *ctx = i->i_ctx; 1123 1124 mutex_lock(&ctx->mapping_lock); 1125 file->private_data = ctx; 1126 if (!i->i_openers++) 1127 ctx->signal2 = inode->i_mapping; 1128 mutex_unlock(&ctx->mapping_lock); 1129 return nonseekable_open(inode, file); 1130 } 1131 1132 static int 1133 spufs_signal2_release(struct inode *inode, struct file *file) 1134 { 1135 struct spufs_inode_info *i = SPUFS_I(inode); 1136 struct spu_context *ctx = i->i_ctx; 1137 1138 mutex_lock(&ctx->mapping_lock); 1139 if (!--i->i_openers) 1140 ctx->signal2 = NULL; 1141 mutex_unlock(&ctx->mapping_lock); 1142 return 0; 1143 } 1144 1145 static ssize_t __spufs_signal2_read(struct spu_context *ctx, char __user *buf, 1146 size_t len, loff_t *pos) 1147 { 1148 int ret = 0; 1149 u32 data; 1150 1151 if (len < 4) 1152 return -EINVAL; 1153 1154 if (ctx->csa.spu_chnlcnt_RW[4]) { 1155 data = ctx->csa.spu_chnldata_RW[4]; 1156 ret = 4; 1157 } 1158 1159 if (!ret) 1160 goto out; 1161 1162 if (copy_to_user(buf, &data, 4)) 1163 return -EFAULT; 1164 1165 out: 1166 return ret; 1167 } 1168 1169 static ssize_t spufs_signal2_read(struct file *file, char __user *buf, 1170 size_t len, loff_t *pos) 1171 { 1172 struct spu_context *ctx = file->private_data; 1173 int ret; 1174 1175 ret = spu_acquire_saved(ctx); 1176 if (ret) 1177 return ret; 1178 ret = __spufs_signal2_read(ctx, buf, len, pos); 1179 spu_release_saved(ctx); 1180 1181 return ret; 1182 } 1183 1184 static ssize_t spufs_signal2_write(struct file *file, const char __user *buf, 1185 size_t len, loff_t *pos) 1186 { 1187 struct spu_context *ctx; 1188 ssize_t ret; 1189 u32 data; 1190 1191 ctx = file->private_data; 1192 1193 if (len < 4) 1194 return -EINVAL; 1195 1196 if (copy_from_user(&data, buf, 4)) 1197 return -EFAULT; 1198 1199 ret = spu_acquire(ctx); 1200 if (ret) 1201 return ret; 1202 ctx->ops->signal2_write(ctx, data); 1203 spu_release(ctx); 1204 1205 return 4; 1206 } 1207 1208 #if SPUFS_MMAP_4K 1209 static int 1210 spufs_signal2_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) 1211 { 1212 #if SPUFS_SIGNAL_MAP_SIZE == 0x1000 1213 return spufs_ps_fault(vma, vmf, 0x1c000, SPUFS_SIGNAL_MAP_SIZE); 1214 #elif SPUFS_SIGNAL_MAP_SIZE == 0x10000 1215 /* For 64k pages, both signal1 and signal2 can be used to mmap the whole 1216 * signal 1 and 2 area 1217 */ 1218 return spufs_ps_fault(vma, vmf, 0x10000, SPUFS_SIGNAL_MAP_SIZE); 1219 #else 1220 #error unsupported page size 1221 #endif 1222 } 1223 1224 static const struct vm_operations_struct spufs_signal2_mmap_vmops = { 1225 .fault = spufs_signal2_mmap_fault, 1226 }; 1227 1228 static int spufs_signal2_mmap(struct file *file, struct vm_area_struct *vma) 1229 { 1230 if (!(vma->vm_flags & VM_SHARED)) 1231 return -EINVAL; 1232 1233 vma->vm_flags |= VM_IO | VM_PFNMAP; 1234 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 1235 1236 vma->vm_ops = &spufs_signal2_mmap_vmops; 1237 return 0; 1238 } 1239 #else /* SPUFS_MMAP_4K */ 1240 #define spufs_signal2_mmap NULL 1241 #endif /* !SPUFS_MMAP_4K */ 1242 1243 static const struct file_operations spufs_signal2_fops = { 1244 .open = spufs_signal2_open, 1245 .release = spufs_signal2_release, 1246 .read = spufs_signal2_read, 1247 .write = spufs_signal2_write, 1248 .mmap = spufs_signal2_mmap, 1249 .llseek = no_llseek, 1250 }; 1251 1252 static const struct file_operations spufs_signal2_nosched_fops = { 1253 .open = spufs_signal2_open, 1254 .release = spufs_signal2_release, 1255 .write = spufs_signal2_write, 1256 .mmap = spufs_signal2_mmap, 1257 .llseek = no_llseek, 1258 }; 1259 1260 /* 1261 * This is a wrapper around DEFINE_SIMPLE_ATTRIBUTE which does the 1262 * work of acquiring (or not) the SPU context before calling through 1263 * to the actual get routine. The set routine is called directly. 1264 */ 1265 #define SPU_ATTR_NOACQUIRE 0 1266 #define SPU_ATTR_ACQUIRE 1 1267 #define SPU_ATTR_ACQUIRE_SAVED 2 1268 1269 #define DEFINE_SPUFS_ATTRIBUTE(__name, __get, __set, __fmt, __acquire) \ 1270 static int __##__get(void *data, u64 *val) \ 1271 { \ 1272 struct spu_context *ctx = data; \ 1273 int ret = 0; \ 1274 \ 1275 if (__acquire == SPU_ATTR_ACQUIRE) { \ 1276 ret = spu_acquire(ctx); \ 1277 if (ret) \ 1278 return ret; \ 1279 *val = __get(ctx); \ 1280 spu_release(ctx); \ 1281 } else if (__acquire == SPU_ATTR_ACQUIRE_SAVED) { \ 1282 ret = spu_acquire_saved(ctx); \ 1283 if (ret) \ 1284 return ret; \ 1285 *val = __get(ctx); \ 1286 spu_release_saved(ctx); \ 1287 } else \ 1288 *val = __get(ctx); \ 1289 \ 1290 return 0; \ 1291 } \ 1292 DEFINE_SPUFS_SIMPLE_ATTRIBUTE(__name, __##__get, __set, __fmt); 1293 1294 static int spufs_signal1_type_set(void *data, u64 val) 1295 { 1296 struct spu_context *ctx = data; 1297 int ret; 1298 1299 ret = spu_acquire(ctx); 1300 if (ret) 1301 return ret; 1302 ctx->ops->signal1_type_set(ctx, val); 1303 spu_release(ctx); 1304 1305 return 0; 1306 } 1307 1308 static u64 spufs_signal1_type_get(struct spu_context *ctx) 1309 { 1310 return ctx->ops->signal1_type_get(ctx); 1311 } 1312 DEFINE_SPUFS_ATTRIBUTE(spufs_signal1_type, spufs_signal1_type_get, 1313 spufs_signal1_type_set, "%llu\n", SPU_ATTR_ACQUIRE); 1314 1315 1316 static int spufs_signal2_type_set(void *data, u64 val) 1317 { 1318 struct spu_context *ctx = data; 1319 int ret; 1320 1321 ret = spu_acquire(ctx); 1322 if (ret) 1323 return ret; 1324 ctx->ops->signal2_type_set(ctx, val); 1325 spu_release(ctx); 1326 1327 return 0; 1328 } 1329 1330 static u64 spufs_signal2_type_get(struct spu_context *ctx) 1331 { 1332 return ctx->ops->signal2_type_get(ctx); 1333 } 1334 DEFINE_SPUFS_ATTRIBUTE(spufs_signal2_type, spufs_signal2_type_get, 1335 spufs_signal2_type_set, "%llu\n", SPU_ATTR_ACQUIRE); 1336 1337 #if SPUFS_MMAP_4K 1338 static int 1339 spufs_mss_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) 1340 { 1341 return spufs_ps_fault(vma, vmf, 0x0000, SPUFS_MSS_MAP_SIZE); 1342 } 1343 1344 static const struct vm_operations_struct spufs_mss_mmap_vmops = { 1345 .fault = spufs_mss_mmap_fault, 1346 }; 1347 1348 /* 1349 * mmap support for problem state MFC DMA area [0x0000 - 0x0fff]. 1350 */ 1351 static int spufs_mss_mmap(struct file *file, struct vm_area_struct *vma) 1352 { 1353 if (!(vma->vm_flags & VM_SHARED)) 1354 return -EINVAL; 1355 1356 vma->vm_flags |= VM_IO | VM_PFNMAP; 1357 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 1358 1359 vma->vm_ops = &spufs_mss_mmap_vmops; 1360 return 0; 1361 } 1362 #else /* SPUFS_MMAP_4K */ 1363 #define spufs_mss_mmap NULL 1364 #endif /* !SPUFS_MMAP_4K */ 1365 1366 static int spufs_mss_open(struct inode *inode, struct file *file) 1367 { 1368 struct spufs_inode_info *i = SPUFS_I(inode); 1369 struct spu_context *ctx = i->i_ctx; 1370 1371 file->private_data = i->i_ctx; 1372 1373 mutex_lock(&ctx->mapping_lock); 1374 if (!i->i_openers++) 1375 ctx->mss = inode->i_mapping; 1376 mutex_unlock(&ctx->mapping_lock); 1377 return nonseekable_open(inode, file); 1378 } 1379 1380 static int 1381 spufs_mss_release(struct inode *inode, struct file *file) 1382 { 1383 struct spufs_inode_info *i = SPUFS_I(inode); 1384 struct spu_context *ctx = i->i_ctx; 1385 1386 mutex_lock(&ctx->mapping_lock); 1387 if (!--i->i_openers) 1388 ctx->mss = NULL; 1389 mutex_unlock(&ctx->mapping_lock); 1390 return 0; 1391 } 1392 1393 static const struct file_operations spufs_mss_fops = { 1394 .open = spufs_mss_open, 1395 .release = spufs_mss_release, 1396 .mmap = spufs_mss_mmap, 1397 .llseek = no_llseek, 1398 }; 1399 1400 static int 1401 spufs_psmap_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) 1402 { 1403 return spufs_ps_fault(vma, vmf, 0x0000, SPUFS_PS_MAP_SIZE); 1404 } 1405 1406 static const struct vm_operations_struct spufs_psmap_mmap_vmops = { 1407 .fault = spufs_psmap_mmap_fault, 1408 }; 1409 1410 /* 1411 * mmap support for full problem state area [0x00000 - 0x1ffff]. 1412 */ 1413 static int spufs_psmap_mmap(struct file *file, struct vm_area_struct *vma) 1414 { 1415 if (!(vma->vm_flags & VM_SHARED)) 1416 return -EINVAL; 1417 1418 vma->vm_flags |= VM_IO | VM_PFNMAP; 1419 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 1420 1421 vma->vm_ops = &spufs_psmap_mmap_vmops; 1422 return 0; 1423 } 1424 1425 static int spufs_psmap_open(struct inode *inode, struct file *file) 1426 { 1427 struct spufs_inode_info *i = SPUFS_I(inode); 1428 struct spu_context *ctx = i->i_ctx; 1429 1430 mutex_lock(&ctx->mapping_lock); 1431 file->private_data = i->i_ctx; 1432 if (!i->i_openers++) 1433 ctx->psmap = inode->i_mapping; 1434 mutex_unlock(&ctx->mapping_lock); 1435 return nonseekable_open(inode, file); 1436 } 1437 1438 static int 1439 spufs_psmap_release(struct inode *inode, struct file *file) 1440 { 1441 struct spufs_inode_info *i = SPUFS_I(inode); 1442 struct spu_context *ctx = i->i_ctx; 1443 1444 mutex_lock(&ctx->mapping_lock); 1445 if (!--i->i_openers) 1446 ctx->psmap = NULL; 1447 mutex_unlock(&ctx->mapping_lock); 1448 return 0; 1449 } 1450 1451 static const struct file_operations spufs_psmap_fops = { 1452 .open = spufs_psmap_open, 1453 .release = spufs_psmap_release, 1454 .mmap = spufs_psmap_mmap, 1455 .llseek = no_llseek, 1456 }; 1457 1458 1459 #if SPUFS_MMAP_4K 1460 static int 1461 spufs_mfc_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) 1462 { 1463 return spufs_ps_fault(vma, vmf, 0x3000, SPUFS_MFC_MAP_SIZE); 1464 } 1465 1466 static const struct vm_operations_struct spufs_mfc_mmap_vmops = { 1467 .fault = spufs_mfc_mmap_fault, 1468 }; 1469 1470 /* 1471 * mmap support for problem state MFC DMA area [0x0000 - 0x0fff]. 1472 */ 1473 static int spufs_mfc_mmap(struct file *file, struct vm_area_struct *vma) 1474 { 1475 if (!(vma->vm_flags & VM_SHARED)) 1476 return -EINVAL; 1477 1478 vma->vm_flags |= VM_IO | VM_PFNMAP; 1479 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 1480 1481 vma->vm_ops = &spufs_mfc_mmap_vmops; 1482 return 0; 1483 } 1484 #else /* SPUFS_MMAP_4K */ 1485 #define spufs_mfc_mmap NULL 1486 #endif /* !SPUFS_MMAP_4K */ 1487 1488 static int spufs_mfc_open(struct inode *inode, struct file *file) 1489 { 1490 struct spufs_inode_info *i = SPUFS_I(inode); 1491 struct spu_context *ctx = i->i_ctx; 1492 1493 /* we don't want to deal with DMA into other processes */ 1494 if (ctx->owner != current->mm) 1495 return -EINVAL; 1496 1497 if (atomic_read(&inode->i_count) != 1) 1498 return -EBUSY; 1499 1500 mutex_lock(&ctx->mapping_lock); 1501 file->private_data = ctx; 1502 if (!i->i_openers++) 1503 ctx->mfc = inode->i_mapping; 1504 mutex_unlock(&ctx->mapping_lock); 1505 return nonseekable_open(inode, file); 1506 } 1507 1508 static int 1509 spufs_mfc_release(struct inode *inode, struct file *file) 1510 { 1511 struct spufs_inode_info *i = SPUFS_I(inode); 1512 struct spu_context *ctx = i->i_ctx; 1513 1514 mutex_lock(&ctx->mapping_lock); 1515 if (!--i->i_openers) 1516 ctx->mfc = NULL; 1517 mutex_unlock(&ctx->mapping_lock); 1518 return 0; 1519 } 1520 1521 /* interrupt-level mfc callback function. */ 1522 void spufs_mfc_callback(struct spu *spu) 1523 { 1524 struct spu_context *ctx = spu->ctx; 1525 1526 if (!ctx) 1527 return; 1528 1529 wake_up_all(&ctx->mfc_wq); 1530 1531 pr_debug("%s %s\n", __func__, spu->name); 1532 if (ctx->mfc_fasync) { 1533 u32 free_elements, tagstatus; 1534 unsigned int mask; 1535 1536 /* no need for spu_acquire in interrupt context */ 1537 free_elements = ctx->ops->get_mfc_free_elements(ctx); 1538 tagstatus = ctx->ops->read_mfc_tagstatus(ctx); 1539 1540 mask = 0; 1541 if (free_elements & 0xffff) 1542 mask |= POLLOUT; 1543 if (tagstatus & ctx->tagwait) 1544 mask |= POLLIN; 1545 1546 kill_fasync(&ctx->mfc_fasync, SIGIO, mask); 1547 } 1548 } 1549 1550 static int spufs_read_mfc_tagstatus(struct spu_context *ctx, u32 *status) 1551 { 1552 /* See if there is one tag group is complete */ 1553 /* FIXME we need locking around tagwait */ 1554 *status = ctx->ops->read_mfc_tagstatus(ctx) & ctx->tagwait; 1555 ctx->tagwait &= ~*status; 1556 if (*status) 1557 return 1; 1558 1559 /* enable interrupt waiting for any tag group, 1560 may silently fail if interrupts are already enabled */ 1561 ctx->ops->set_mfc_query(ctx, ctx->tagwait, 1); 1562 return 0; 1563 } 1564 1565 static ssize_t spufs_mfc_read(struct file *file, char __user *buffer, 1566 size_t size, loff_t *pos) 1567 { 1568 struct spu_context *ctx = file->private_data; 1569 int ret = -EINVAL; 1570 u32 status; 1571 1572 if (size != 4) 1573 goto out; 1574 1575 ret = spu_acquire(ctx); 1576 if (ret) 1577 return ret; 1578 1579 ret = -EINVAL; 1580 if (file->f_flags & O_NONBLOCK) { 1581 status = ctx->ops->read_mfc_tagstatus(ctx); 1582 if (!(status & ctx->tagwait)) 1583 ret = -EAGAIN; 1584 else 1585 /* XXX(hch): shouldn't we clear ret here? */ 1586 ctx->tagwait &= ~status; 1587 } else { 1588 ret = spufs_wait(ctx->mfc_wq, 1589 spufs_read_mfc_tagstatus(ctx, &status)); 1590 if (ret) 1591 goto out; 1592 } 1593 spu_release(ctx); 1594 1595 ret = 4; 1596 if (copy_to_user(buffer, &status, 4)) 1597 ret = -EFAULT; 1598 1599 out: 1600 return ret; 1601 } 1602 1603 static int spufs_check_valid_dma(struct mfc_dma_command *cmd) 1604 { 1605 pr_debug("queueing DMA %x %llx %x %x %x\n", cmd->lsa, 1606 cmd->ea, cmd->size, cmd->tag, cmd->cmd); 1607 1608 switch (cmd->cmd) { 1609 case MFC_PUT_CMD: 1610 case MFC_PUTF_CMD: 1611 case MFC_PUTB_CMD: 1612 case MFC_GET_CMD: 1613 case MFC_GETF_CMD: 1614 case MFC_GETB_CMD: 1615 break; 1616 default: 1617 pr_debug("invalid DMA opcode %x\n", cmd->cmd); 1618 return -EIO; 1619 } 1620 1621 if ((cmd->lsa & 0xf) != (cmd->ea &0xf)) { 1622 pr_debug("invalid DMA alignment, ea %llx lsa %x\n", 1623 cmd->ea, cmd->lsa); 1624 return -EIO; 1625 } 1626 1627 switch (cmd->size & 0xf) { 1628 case 1: 1629 break; 1630 case 2: 1631 if (cmd->lsa & 1) 1632 goto error; 1633 break; 1634 case 4: 1635 if (cmd->lsa & 3) 1636 goto error; 1637 break; 1638 case 8: 1639 if (cmd->lsa & 7) 1640 goto error; 1641 break; 1642 case 0: 1643 if (cmd->lsa & 15) 1644 goto error; 1645 break; 1646 error: 1647 default: 1648 pr_debug("invalid DMA alignment %x for size %x\n", 1649 cmd->lsa & 0xf, cmd->size); 1650 return -EIO; 1651 } 1652 1653 if (cmd->size > 16 * 1024) { 1654 pr_debug("invalid DMA size %x\n", cmd->size); 1655 return -EIO; 1656 } 1657 1658 if (cmd->tag & 0xfff0) { 1659 /* we reserve the higher tag numbers for kernel use */ 1660 pr_debug("invalid DMA tag\n"); 1661 return -EIO; 1662 } 1663 1664 if (cmd->class) { 1665 /* not supported in this version */ 1666 pr_debug("invalid DMA class\n"); 1667 return -EIO; 1668 } 1669 1670 return 0; 1671 } 1672 1673 static int spu_send_mfc_command(struct spu_context *ctx, 1674 struct mfc_dma_command cmd, 1675 int *error) 1676 { 1677 *error = ctx->ops->send_mfc_command(ctx, &cmd); 1678 if (*error == -EAGAIN) { 1679 /* wait for any tag group to complete 1680 so we have space for the new command */ 1681 ctx->ops->set_mfc_query(ctx, ctx->tagwait, 1); 1682 /* try again, because the queue might be 1683 empty again */ 1684 *error = ctx->ops->send_mfc_command(ctx, &cmd); 1685 if (*error == -EAGAIN) 1686 return 0; 1687 } 1688 return 1; 1689 } 1690 1691 static ssize_t spufs_mfc_write(struct file *file, const char __user *buffer, 1692 size_t size, loff_t *pos) 1693 { 1694 struct spu_context *ctx = file->private_data; 1695 struct mfc_dma_command cmd; 1696 int ret = -EINVAL; 1697 1698 if (size != sizeof cmd) 1699 goto out; 1700 1701 ret = -EFAULT; 1702 if (copy_from_user(&cmd, buffer, sizeof cmd)) 1703 goto out; 1704 1705 ret = spufs_check_valid_dma(&cmd); 1706 if (ret) 1707 goto out; 1708 1709 ret = spu_acquire(ctx); 1710 if (ret) 1711 goto out; 1712 1713 ret = spufs_wait(ctx->run_wq, ctx->state == SPU_STATE_RUNNABLE); 1714 if (ret) 1715 goto out; 1716 1717 if (file->f_flags & O_NONBLOCK) { 1718 ret = ctx->ops->send_mfc_command(ctx, &cmd); 1719 } else { 1720 int status; 1721 ret = spufs_wait(ctx->mfc_wq, 1722 spu_send_mfc_command(ctx, cmd, &status)); 1723 if (ret) 1724 goto out; 1725 if (status) 1726 ret = status; 1727 } 1728 1729 if (ret) 1730 goto out_unlock; 1731 1732 ctx->tagwait |= 1 << cmd.tag; 1733 ret = size; 1734 1735 out_unlock: 1736 spu_release(ctx); 1737 out: 1738 return ret; 1739 } 1740 1741 static unsigned int spufs_mfc_poll(struct file *file,poll_table *wait) 1742 { 1743 struct spu_context *ctx = file->private_data; 1744 u32 free_elements, tagstatus; 1745 unsigned int mask; 1746 1747 poll_wait(file, &ctx->mfc_wq, wait); 1748 1749 /* 1750 * For now keep this uninterruptible and also ignore the rule 1751 * that poll should not sleep. Will be fixed later. 1752 */ 1753 mutex_lock(&ctx->state_mutex); 1754 ctx->ops->set_mfc_query(ctx, ctx->tagwait, 2); 1755 free_elements = ctx->ops->get_mfc_free_elements(ctx); 1756 tagstatus = ctx->ops->read_mfc_tagstatus(ctx); 1757 spu_release(ctx); 1758 1759 mask = 0; 1760 if (free_elements & 0xffff) 1761 mask |= POLLOUT | POLLWRNORM; 1762 if (tagstatus & ctx->tagwait) 1763 mask |= POLLIN | POLLRDNORM; 1764 1765 pr_debug("%s: free %d tagstatus %d tagwait %d\n", __func__, 1766 free_elements, tagstatus, ctx->tagwait); 1767 1768 return mask; 1769 } 1770 1771 static int spufs_mfc_flush(struct file *file, fl_owner_t id) 1772 { 1773 struct spu_context *ctx = file->private_data; 1774 int ret; 1775 1776 ret = spu_acquire(ctx); 1777 if (ret) 1778 goto out; 1779 #if 0 1780 /* this currently hangs */ 1781 ret = spufs_wait(ctx->mfc_wq, 1782 ctx->ops->set_mfc_query(ctx, ctx->tagwait, 2)); 1783 if (ret) 1784 goto out; 1785 ret = spufs_wait(ctx->mfc_wq, 1786 ctx->ops->read_mfc_tagstatus(ctx) == ctx->tagwait); 1787 if (ret) 1788 goto out; 1789 #else 1790 ret = 0; 1791 #endif 1792 spu_release(ctx); 1793 out: 1794 return ret; 1795 } 1796 1797 static int spufs_mfc_fsync(struct file *file, loff_t start, loff_t end, int datasync) 1798 { 1799 struct inode *inode = file_inode(file); 1800 int err = filemap_write_and_wait_range(inode->i_mapping, start, end); 1801 if (!err) { 1802 mutex_lock(&inode->i_mutex); 1803 err = spufs_mfc_flush(file, NULL); 1804 mutex_unlock(&inode->i_mutex); 1805 } 1806 return err; 1807 } 1808 1809 static int spufs_mfc_fasync(int fd, struct file *file, int on) 1810 { 1811 struct spu_context *ctx = file->private_data; 1812 1813 return fasync_helper(fd, file, on, &ctx->mfc_fasync); 1814 } 1815 1816 static const struct file_operations spufs_mfc_fops = { 1817 .open = spufs_mfc_open, 1818 .release = spufs_mfc_release, 1819 .read = spufs_mfc_read, 1820 .write = spufs_mfc_write, 1821 .poll = spufs_mfc_poll, 1822 .flush = spufs_mfc_flush, 1823 .fsync = spufs_mfc_fsync, 1824 .fasync = spufs_mfc_fasync, 1825 .mmap = spufs_mfc_mmap, 1826 .llseek = no_llseek, 1827 }; 1828 1829 static int spufs_npc_set(void *data, u64 val) 1830 { 1831 struct spu_context *ctx = data; 1832 int ret; 1833 1834 ret = spu_acquire(ctx); 1835 if (ret) 1836 return ret; 1837 ctx->ops->npc_write(ctx, val); 1838 spu_release(ctx); 1839 1840 return 0; 1841 } 1842 1843 static u64 spufs_npc_get(struct spu_context *ctx) 1844 { 1845 return ctx->ops->npc_read(ctx); 1846 } 1847 DEFINE_SPUFS_ATTRIBUTE(spufs_npc_ops, spufs_npc_get, spufs_npc_set, 1848 "0x%llx\n", SPU_ATTR_ACQUIRE); 1849 1850 static int spufs_decr_set(void *data, u64 val) 1851 { 1852 struct spu_context *ctx = data; 1853 struct spu_lscsa *lscsa = ctx->csa.lscsa; 1854 int ret; 1855 1856 ret = spu_acquire_saved(ctx); 1857 if (ret) 1858 return ret; 1859 lscsa->decr.slot[0] = (u32) val; 1860 spu_release_saved(ctx); 1861 1862 return 0; 1863 } 1864 1865 static u64 spufs_decr_get(struct spu_context *ctx) 1866 { 1867 struct spu_lscsa *lscsa = ctx->csa.lscsa; 1868 return lscsa->decr.slot[0]; 1869 } 1870 DEFINE_SPUFS_ATTRIBUTE(spufs_decr_ops, spufs_decr_get, spufs_decr_set, 1871 "0x%llx\n", SPU_ATTR_ACQUIRE_SAVED); 1872 1873 static int spufs_decr_status_set(void *data, u64 val) 1874 { 1875 struct spu_context *ctx = data; 1876 int ret; 1877 1878 ret = spu_acquire_saved(ctx); 1879 if (ret) 1880 return ret; 1881 if (val) 1882 ctx->csa.priv2.mfc_control_RW |= MFC_CNTL_DECREMENTER_RUNNING; 1883 else 1884 ctx->csa.priv2.mfc_control_RW &= ~MFC_CNTL_DECREMENTER_RUNNING; 1885 spu_release_saved(ctx); 1886 1887 return 0; 1888 } 1889 1890 static u64 spufs_decr_status_get(struct spu_context *ctx) 1891 { 1892 if (ctx->csa.priv2.mfc_control_RW & MFC_CNTL_DECREMENTER_RUNNING) 1893 return SPU_DECR_STATUS_RUNNING; 1894 else 1895 return 0; 1896 } 1897 DEFINE_SPUFS_ATTRIBUTE(spufs_decr_status_ops, spufs_decr_status_get, 1898 spufs_decr_status_set, "0x%llx\n", 1899 SPU_ATTR_ACQUIRE_SAVED); 1900 1901 static int spufs_event_mask_set(void *data, u64 val) 1902 { 1903 struct spu_context *ctx = data; 1904 struct spu_lscsa *lscsa = ctx->csa.lscsa; 1905 int ret; 1906 1907 ret = spu_acquire_saved(ctx); 1908 if (ret) 1909 return ret; 1910 lscsa->event_mask.slot[0] = (u32) val; 1911 spu_release_saved(ctx); 1912 1913 return 0; 1914 } 1915 1916 static u64 spufs_event_mask_get(struct spu_context *ctx) 1917 { 1918 struct spu_lscsa *lscsa = ctx->csa.lscsa; 1919 return lscsa->event_mask.slot[0]; 1920 } 1921 1922 DEFINE_SPUFS_ATTRIBUTE(spufs_event_mask_ops, spufs_event_mask_get, 1923 spufs_event_mask_set, "0x%llx\n", 1924 SPU_ATTR_ACQUIRE_SAVED); 1925 1926 static u64 spufs_event_status_get(struct spu_context *ctx) 1927 { 1928 struct spu_state *state = &ctx->csa; 1929 u64 stat; 1930 stat = state->spu_chnlcnt_RW[0]; 1931 if (stat) 1932 return state->spu_chnldata_RW[0]; 1933 return 0; 1934 } 1935 DEFINE_SPUFS_ATTRIBUTE(spufs_event_status_ops, spufs_event_status_get, 1936 NULL, "0x%llx\n", SPU_ATTR_ACQUIRE_SAVED) 1937 1938 static int spufs_srr0_set(void *data, u64 val) 1939 { 1940 struct spu_context *ctx = data; 1941 struct spu_lscsa *lscsa = ctx->csa.lscsa; 1942 int ret; 1943 1944 ret = spu_acquire_saved(ctx); 1945 if (ret) 1946 return ret; 1947 lscsa->srr0.slot[0] = (u32) val; 1948 spu_release_saved(ctx); 1949 1950 return 0; 1951 } 1952 1953 static u64 spufs_srr0_get(struct spu_context *ctx) 1954 { 1955 struct spu_lscsa *lscsa = ctx->csa.lscsa; 1956 return lscsa->srr0.slot[0]; 1957 } 1958 DEFINE_SPUFS_ATTRIBUTE(spufs_srr0_ops, spufs_srr0_get, spufs_srr0_set, 1959 "0x%llx\n", SPU_ATTR_ACQUIRE_SAVED) 1960 1961 static u64 spufs_id_get(struct spu_context *ctx) 1962 { 1963 u64 num; 1964 1965 if (ctx->state == SPU_STATE_RUNNABLE) 1966 num = ctx->spu->number; 1967 else 1968 num = (unsigned int)-1; 1969 1970 return num; 1971 } 1972 DEFINE_SPUFS_ATTRIBUTE(spufs_id_ops, spufs_id_get, NULL, "0x%llx\n", 1973 SPU_ATTR_ACQUIRE) 1974 1975 static u64 spufs_object_id_get(struct spu_context *ctx) 1976 { 1977 /* FIXME: Should there really be no locking here? */ 1978 return ctx->object_id; 1979 } 1980 1981 static int spufs_object_id_set(void *data, u64 id) 1982 { 1983 struct spu_context *ctx = data; 1984 ctx->object_id = id; 1985 1986 return 0; 1987 } 1988 1989 DEFINE_SPUFS_ATTRIBUTE(spufs_object_id_ops, spufs_object_id_get, 1990 spufs_object_id_set, "0x%llx\n", SPU_ATTR_NOACQUIRE); 1991 1992 static u64 spufs_lslr_get(struct spu_context *ctx) 1993 { 1994 return ctx->csa.priv2.spu_lslr_RW; 1995 } 1996 DEFINE_SPUFS_ATTRIBUTE(spufs_lslr_ops, spufs_lslr_get, NULL, "0x%llx\n", 1997 SPU_ATTR_ACQUIRE_SAVED); 1998 1999 static int spufs_info_open(struct inode *inode, struct file *file) 2000 { 2001 struct spufs_inode_info *i = SPUFS_I(inode); 2002 struct spu_context *ctx = i->i_ctx; 2003 file->private_data = ctx; 2004 return 0; 2005 } 2006 2007 static int spufs_caps_show(struct seq_file *s, void *private) 2008 { 2009 struct spu_context *ctx = s->private; 2010 2011 if (!(ctx->flags & SPU_CREATE_NOSCHED)) 2012 seq_puts(s, "sched\n"); 2013 if (!(ctx->flags & SPU_CREATE_ISOLATE)) 2014 seq_puts(s, "step\n"); 2015 return 0; 2016 } 2017 2018 static int spufs_caps_open(struct inode *inode, struct file *file) 2019 { 2020 return single_open(file, spufs_caps_show, SPUFS_I(inode)->i_ctx); 2021 } 2022 2023 static const struct file_operations spufs_caps_fops = { 2024 .open = spufs_caps_open, 2025 .read = seq_read, 2026 .llseek = seq_lseek, 2027 .release = single_release, 2028 }; 2029 2030 static ssize_t __spufs_mbox_info_read(struct spu_context *ctx, 2031 char __user *buf, size_t len, loff_t *pos) 2032 { 2033 u32 data; 2034 2035 /* EOF if there's no entry in the mbox */ 2036 if (!(ctx->csa.prob.mb_stat_R & 0x0000ff)) 2037 return 0; 2038 2039 data = ctx->csa.prob.pu_mb_R; 2040 2041 return simple_read_from_buffer(buf, len, pos, &data, sizeof data); 2042 } 2043 2044 static ssize_t spufs_mbox_info_read(struct file *file, char __user *buf, 2045 size_t len, loff_t *pos) 2046 { 2047 int ret; 2048 struct spu_context *ctx = file->private_data; 2049 2050 if (!access_ok(VERIFY_WRITE, buf, len)) 2051 return -EFAULT; 2052 2053 ret = spu_acquire_saved(ctx); 2054 if (ret) 2055 return ret; 2056 spin_lock(&ctx->csa.register_lock); 2057 ret = __spufs_mbox_info_read(ctx, buf, len, pos); 2058 spin_unlock(&ctx->csa.register_lock); 2059 spu_release_saved(ctx); 2060 2061 return ret; 2062 } 2063 2064 static const struct file_operations spufs_mbox_info_fops = { 2065 .open = spufs_info_open, 2066 .read = spufs_mbox_info_read, 2067 .llseek = generic_file_llseek, 2068 }; 2069 2070 static ssize_t __spufs_ibox_info_read(struct spu_context *ctx, 2071 char __user *buf, size_t len, loff_t *pos) 2072 { 2073 u32 data; 2074 2075 /* EOF if there's no entry in the ibox */ 2076 if (!(ctx->csa.prob.mb_stat_R & 0xff0000)) 2077 return 0; 2078 2079 data = ctx->csa.priv2.puint_mb_R; 2080 2081 return simple_read_from_buffer(buf, len, pos, &data, sizeof data); 2082 } 2083 2084 static ssize_t spufs_ibox_info_read(struct file *file, char __user *buf, 2085 size_t len, loff_t *pos) 2086 { 2087 struct spu_context *ctx = file->private_data; 2088 int ret; 2089 2090 if (!access_ok(VERIFY_WRITE, buf, len)) 2091 return -EFAULT; 2092 2093 ret = spu_acquire_saved(ctx); 2094 if (ret) 2095 return ret; 2096 spin_lock(&ctx->csa.register_lock); 2097 ret = __spufs_ibox_info_read(ctx, buf, len, pos); 2098 spin_unlock(&ctx->csa.register_lock); 2099 spu_release_saved(ctx); 2100 2101 return ret; 2102 } 2103 2104 static const struct file_operations spufs_ibox_info_fops = { 2105 .open = spufs_info_open, 2106 .read = spufs_ibox_info_read, 2107 .llseek = generic_file_llseek, 2108 }; 2109 2110 static ssize_t __spufs_wbox_info_read(struct spu_context *ctx, 2111 char __user *buf, size_t len, loff_t *pos) 2112 { 2113 int i, cnt; 2114 u32 data[4]; 2115 u32 wbox_stat; 2116 2117 wbox_stat = ctx->csa.prob.mb_stat_R; 2118 cnt = 4 - ((wbox_stat & 0x00ff00) >> 8); 2119 for (i = 0; i < cnt; i++) { 2120 data[i] = ctx->csa.spu_mailbox_data[i]; 2121 } 2122 2123 return simple_read_from_buffer(buf, len, pos, &data, 2124 cnt * sizeof(u32)); 2125 } 2126 2127 static ssize_t spufs_wbox_info_read(struct file *file, char __user *buf, 2128 size_t len, loff_t *pos) 2129 { 2130 struct spu_context *ctx = file->private_data; 2131 int ret; 2132 2133 if (!access_ok(VERIFY_WRITE, buf, len)) 2134 return -EFAULT; 2135 2136 ret = spu_acquire_saved(ctx); 2137 if (ret) 2138 return ret; 2139 spin_lock(&ctx->csa.register_lock); 2140 ret = __spufs_wbox_info_read(ctx, buf, len, pos); 2141 spin_unlock(&ctx->csa.register_lock); 2142 spu_release_saved(ctx); 2143 2144 return ret; 2145 } 2146 2147 static const struct file_operations spufs_wbox_info_fops = { 2148 .open = spufs_info_open, 2149 .read = spufs_wbox_info_read, 2150 .llseek = generic_file_llseek, 2151 }; 2152 2153 static ssize_t __spufs_dma_info_read(struct spu_context *ctx, 2154 char __user *buf, size_t len, loff_t *pos) 2155 { 2156 struct spu_dma_info info; 2157 struct mfc_cq_sr *qp, *spuqp; 2158 int i; 2159 2160 info.dma_info_type = ctx->csa.priv2.spu_tag_status_query_RW; 2161 info.dma_info_mask = ctx->csa.lscsa->tag_mask.slot[0]; 2162 info.dma_info_status = ctx->csa.spu_chnldata_RW[24]; 2163 info.dma_info_stall_and_notify = ctx->csa.spu_chnldata_RW[25]; 2164 info.dma_info_atomic_command_status = ctx->csa.spu_chnldata_RW[27]; 2165 for (i = 0; i < 16; i++) { 2166 qp = &info.dma_info_command_data[i]; 2167 spuqp = &ctx->csa.priv2.spuq[i]; 2168 2169 qp->mfc_cq_data0_RW = spuqp->mfc_cq_data0_RW; 2170 qp->mfc_cq_data1_RW = spuqp->mfc_cq_data1_RW; 2171 qp->mfc_cq_data2_RW = spuqp->mfc_cq_data2_RW; 2172 qp->mfc_cq_data3_RW = spuqp->mfc_cq_data3_RW; 2173 } 2174 2175 return simple_read_from_buffer(buf, len, pos, &info, 2176 sizeof info); 2177 } 2178 2179 static ssize_t spufs_dma_info_read(struct file *file, char __user *buf, 2180 size_t len, loff_t *pos) 2181 { 2182 struct spu_context *ctx = file->private_data; 2183 int ret; 2184 2185 if (!access_ok(VERIFY_WRITE, buf, len)) 2186 return -EFAULT; 2187 2188 ret = spu_acquire_saved(ctx); 2189 if (ret) 2190 return ret; 2191 spin_lock(&ctx->csa.register_lock); 2192 ret = __spufs_dma_info_read(ctx, buf, len, pos); 2193 spin_unlock(&ctx->csa.register_lock); 2194 spu_release_saved(ctx); 2195 2196 return ret; 2197 } 2198 2199 static const struct file_operations spufs_dma_info_fops = { 2200 .open = spufs_info_open, 2201 .read = spufs_dma_info_read, 2202 .llseek = no_llseek, 2203 }; 2204 2205 static ssize_t __spufs_proxydma_info_read(struct spu_context *ctx, 2206 char __user *buf, size_t len, loff_t *pos) 2207 { 2208 struct spu_proxydma_info info; 2209 struct mfc_cq_sr *qp, *puqp; 2210 int ret = sizeof info; 2211 int i; 2212 2213 if (len < ret) 2214 return -EINVAL; 2215 2216 if (!access_ok(VERIFY_WRITE, buf, len)) 2217 return -EFAULT; 2218 2219 info.proxydma_info_type = ctx->csa.prob.dma_querytype_RW; 2220 info.proxydma_info_mask = ctx->csa.prob.dma_querymask_RW; 2221 info.proxydma_info_status = ctx->csa.prob.dma_tagstatus_R; 2222 for (i = 0; i < 8; i++) { 2223 qp = &info.proxydma_info_command_data[i]; 2224 puqp = &ctx->csa.priv2.puq[i]; 2225 2226 qp->mfc_cq_data0_RW = puqp->mfc_cq_data0_RW; 2227 qp->mfc_cq_data1_RW = puqp->mfc_cq_data1_RW; 2228 qp->mfc_cq_data2_RW = puqp->mfc_cq_data2_RW; 2229 qp->mfc_cq_data3_RW = puqp->mfc_cq_data3_RW; 2230 } 2231 2232 return simple_read_from_buffer(buf, len, pos, &info, 2233 sizeof info); 2234 } 2235 2236 static ssize_t spufs_proxydma_info_read(struct file *file, char __user *buf, 2237 size_t len, loff_t *pos) 2238 { 2239 struct spu_context *ctx = file->private_data; 2240 int ret; 2241 2242 ret = spu_acquire_saved(ctx); 2243 if (ret) 2244 return ret; 2245 spin_lock(&ctx->csa.register_lock); 2246 ret = __spufs_proxydma_info_read(ctx, buf, len, pos); 2247 spin_unlock(&ctx->csa.register_lock); 2248 spu_release_saved(ctx); 2249 2250 return ret; 2251 } 2252 2253 static const struct file_operations spufs_proxydma_info_fops = { 2254 .open = spufs_info_open, 2255 .read = spufs_proxydma_info_read, 2256 .llseek = no_llseek, 2257 }; 2258 2259 static int spufs_show_tid(struct seq_file *s, void *private) 2260 { 2261 struct spu_context *ctx = s->private; 2262 2263 seq_printf(s, "%d\n", ctx->tid); 2264 return 0; 2265 } 2266 2267 static int spufs_tid_open(struct inode *inode, struct file *file) 2268 { 2269 return single_open(file, spufs_show_tid, SPUFS_I(inode)->i_ctx); 2270 } 2271 2272 static const struct file_operations spufs_tid_fops = { 2273 .open = spufs_tid_open, 2274 .read = seq_read, 2275 .llseek = seq_lseek, 2276 .release = single_release, 2277 }; 2278 2279 static const char *ctx_state_names[] = { 2280 "user", "system", "iowait", "loaded" 2281 }; 2282 2283 static unsigned long long spufs_acct_time(struct spu_context *ctx, 2284 enum spu_utilization_state state) 2285 { 2286 unsigned long long time = ctx->stats.times[state]; 2287 2288 /* 2289 * In general, utilization statistics are updated by the controlling 2290 * thread as the spu context moves through various well defined 2291 * state transitions, but if the context is lazily loaded its 2292 * utilization statistics are not updated as the controlling thread 2293 * is not tightly coupled with the execution of the spu context. We 2294 * calculate and apply the time delta from the last recorded state 2295 * of the spu context. 2296 */ 2297 if (ctx->spu && ctx->stats.util_state == state) { 2298 time += ktime_get_ns() - ctx->stats.tstamp; 2299 } 2300 2301 return time / NSEC_PER_MSEC; 2302 } 2303 2304 static unsigned long long spufs_slb_flts(struct spu_context *ctx) 2305 { 2306 unsigned long long slb_flts = ctx->stats.slb_flt; 2307 2308 if (ctx->state == SPU_STATE_RUNNABLE) { 2309 slb_flts += (ctx->spu->stats.slb_flt - 2310 ctx->stats.slb_flt_base); 2311 } 2312 2313 return slb_flts; 2314 } 2315 2316 static unsigned long long spufs_class2_intrs(struct spu_context *ctx) 2317 { 2318 unsigned long long class2_intrs = ctx->stats.class2_intr; 2319 2320 if (ctx->state == SPU_STATE_RUNNABLE) { 2321 class2_intrs += (ctx->spu->stats.class2_intr - 2322 ctx->stats.class2_intr_base); 2323 } 2324 2325 return class2_intrs; 2326 } 2327 2328 2329 static int spufs_show_stat(struct seq_file *s, void *private) 2330 { 2331 struct spu_context *ctx = s->private; 2332 int ret; 2333 2334 ret = spu_acquire(ctx); 2335 if (ret) 2336 return ret; 2337 2338 seq_printf(s, "%s %llu %llu %llu %llu " 2339 "%llu %llu %llu %llu %llu %llu %llu %llu\n", 2340 ctx_state_names[ctx->stats.util_state], 2341 spufs_acct_time(ctx, SPU_UTIL_USER), 2342 spufs_acct_time(ctx, SPU_UTIL_SYSTEM), 2343 spufs_acct_time(ctx, SPU_UTIL_IOWAIT), 2344 spufs_acct_time(ctx, SPU_UTIL_IDLE_LOADED), 2345 ctx->stats.vol_ctx_switch, 2346 ctx->stats.invol_ctx_switch, 2347 spufs_slb_flts(ctx), 2348 ctx->stats.hash_flt, 2349 ctx->stats.min_flt, 2350 ctx->stats.maj_flt, 2351 spufs_class2_intrs(ctx), 2352 ctx->stats.libassist); 2353 spu_release(ctx); 2354 return 0; 2355 } 2356 2357 static int spufs_stat_open(struct inode *inode, struct file *file) 2358 { 2359 return single_open(file, spufs_show_stat, SPUFS_I(inode)->i_ctx); 2360 } 2361 2362 static const struct file_operations spufs_stat_fops = { 2363 .open = spufs_stat_open, 2364 .read = seq_read, 2365 .llseek = seq_lseek, 2366 .release = single_release, 2367 }; 2368 2369 static inline int spufs_switch_log_used(struct spu_context *ctx) 2370 { 2371 return (ctx->switch_log->head - ctx->switch_log->tail) % 2372 SWITCH_LOG_BUFSIZE; 2373 } 2374 2375 static inline int spufs_switch_log_avail(struct spu_context *ctx) 2376 { 2377 return SWITCH_LOG_BUFSIZE - spufs_switch_log_used(ctx); 2378 } 2379 2380 static int spufs_switch_log_open(struct inode *inode, struct file *file) 2381 { 2382 struct spu_context *ctx = SPUFS_I(inode)->i_ctx; 2383 int rc; 2384 2385 rc = spu_acquire(ctx); 2386 if (rc) 2387 return rc; 2388 2389 if (ctx->switch_log) { 2390 rc = -EBUSY; 2391 goto out; 2392 } 2393 2394 ctx->switch_log = kmalloc(sizeof(struct switch_log) + 2395 SWITCH_LOG_BUFSIZE * sizeof(struct switch_log_entry), 2396 GFP_KERNEL); 2397 2398 if (!ctx->switch_log) { 2399 rc = -ENOMEM; 2400 goto out; 2401 } 2402 2403 ctx->switch_log->head = ctx->switch_log->tail = 0; 2404 init_waitqueue_head(&ctx->switch_log->wait); 2405 rc = 0; 2406 2407 out: 2408 spu_release(ctx); 2409 return rc; 2410 } 2411 2412 static int spufs_switch_log_release(struct inode *inode, struct file *file) 2413 { 2414 struct spu_context *ctx = SPUFS_I(inode)->i_ctx; 2415 int rc; 2416 2417 rc = spu_acquire(ctx); 2418 if (rc) 2419 return rc; 2420 2421 kfree(ctx->switch_log); 2422 ctx->switch_log = NULL; 2423 spu_release(ctx); 2424 2425 return 0; 2426 } 2427 2428 static int switch_log_sprint(struct spu_context *ctx, char *tbuf, int n) 2429 { 2430 struct switch_log_entry *p; 2431 2432 p = ctx->switch_log->log + ctx->switch_log->tail % SWITCH_LOG_BUFSIZE; 2433 2434 return snprintf(tbuf, n, "%u.%09u %d %u %u %llu\n", 2435 (unsigned int) p->tstamp.tv_sec, 2436 (unsigned int) p->tstamp.tv_nsec, 2437 p->spu_id, 2438 (unsigned int) p->type, 2439 (unsigned int) p->val, 2440 (unsigned long long) p->timebase); 2441 } 2442 2443 static ssize_t spufs_switch_log_read(struct file *file, char __user *buf, 2444 size_t len, loff_t *ppos) 2445 { 2446 struct inode *inode = file_inode(file); 2447 struct spu_context *ctx = SPUFS_I(inode)->i_ctx; 2448 int error = 0, cnt = 0; 2449 2450 if (!buf) 2451 return -EINVAL; 2452 2453 error = spu_acquire(ctx); 2454 if (error) 2455 return error; 2456 2457 while (cnt < len) { 2458 char tbuf[128]; 2459 int width; 2460 2461 if (spufs_switch_log_used(ctx) == 0) { 2462 if (cnt > 0) { 2463 /* If there's data ready to go, we can 2464 * just return straight away */ 2465 break; 2466 2467 } else if (file->f_flags & O_NONBLOCK) { 2468 error = -EAGAIN; 2469 break; 2470 2471 } else { 2472 /* spufs_wait will drop the mutex and 2473 * re-acquire, but since we're in read(), the 2474 * file cannot be _released (and so 2475 * ctx->switch_log is stable). 2476 */ 2477 error = spufs_wait(ctx->switch_log->wait, 2478 spufs_switch_log_used(ctx) > 0); 2479 2480 /* On error, spufs_wait returns without the 2481 * state mutex held */ 2482 if (error) 2483 return error; 2484 2485 /* We may have had entries read from underneath 2486 * us while we dropped the mutex in spufs_wait, 2487 * so re-check */ 2488 if (spufs_switch_log_used(ctx) == 0) 2489 continue; 2490 } 2491 } 2492 2493 width = switch_log_sprint(ctx, tbuf, sizeof(tbuf)); 2494 if (width < len) 2495 ctx->switch_log->tail = 2496 (ctx->switch_log->tail + 1) % 2497 SWITCH_LOG_BUFSIZE; 2498 else 2499 /* If the record is greater than space available return 2500 * partial buffer (so far) */ 2501 break; 2502 2503 error = copy_to_user(buf + cnt, tbuf, width); 2504 if (error) 2505 break; 2506 cnt += width; 2507 } 2508 2509 spu_release(ctx); 2510 2511 return cnt == 0 ? error : cnt; 2512 } 2513 2514 static unsigned int spufs_switch_log_poll(struct file *file, poll_table *wait) 2515 { 2516 struct inode *inode = file_inode(file); 2517 struct spu_context *ctx = SPUFS_I(inode)->i_ctx; 2518 unsigned int mask = 0; 2519 int rc; 2520 2521 poll_wait(file, &ctx->switch_log->wait, wait); 2522 2523 rc = spu_acquire(ctx); 2524 if (rc) 2525 return rc; 2526 2527 if (spufs_switch_log_used(ctx) > 0) 2528 mask |= POLLIN; 2529 2530 spu_release(ctx); 2531 2532 return mask; 2533 } 2534 2535 static const struct file_operations spufs_switch_log_fops = { 2536 .open = spufs_switch_log_open, 2537 .read = spufs_switch_log_read, 2538 .poll = spufs_switch_log_poll, 2539 .release = spufs_switch_log_release, 2540 .llseek = no_llseek, 2541 }; 2542 2543 /** 2544 * Log a context switch event to a switch log reader. 2545 * 2546 * Must be called with ctx->state_mutex held. 2547 */ 2548 void spu_switch_log_notify(struct spu *spu, struct spu_context *ctx, 2549 u32 type, u32 val) 2550 { 2551 if (!ctx->switch_log) 2552 return; 2553 2554 if (spufs_switch_log_avail(ctx) > 1) { 2555 struct switch_log_entry *p; 2556 2557 p = ctx->switch_log->log + ctx->switch_log->head; 2558 ktime_get_ts(&p->tstamp); 2559 p->timebase = get_tb(); 2560 p->spu_id = spu ? spu->number : -1; 2561 p->type = type; 2562 p->val = val; 2563 2564 ctx->switch_log->head = 2565 (ctx->switch_log->head + 1) % SWITCH_LOG_BUFSIZE; 2566 } 2567 2568 wake_up(&ctx->switch_log->wait); 2569 } 2570 2571 static int spufs_show_ctx(struct seq_file *s, void *private) 2572 { 2573 struct spu_context *ctx = s->private; 2574 u64 mfc_control_RW; 2575 2576 mutex_lock(&ctx->state_mutex); 2577 if (ctx->spu) { 2578 struct spu *spu = ctx->spu; 2579 struct spu_priv2 __iomem *priv2 = spu->priv2; 2580 2581 spin_lock_irq(&spu->register_lock); 2582 mfc_control_RW = in_be64(&priv2->mfc_control_RW); 2583 spin_unlock_irq(&spu->register_lock); 2584 } else { 2585 struct spu_state *csa = &ctx->csa; 2586 2587 mfc_control_RW = csa->priv2.mfc_control_RW; 2588 } 2589 2590 seq_printf(s, "%c flgs(%lx) sflgs(%lx) pri(%d) ts(%d) spu(%02d)" 2591 " %c %llx %llx %llx %llx %x %x\n", 2592 ctx->state == SPU_STATE_SAVED ? 'S' : 'R', 2593 ctx->flags, 2594 ctx->sched_flags, 2595 ctx->prio, 2596 ctx->time_slice, 2597 ctx->spu ? ctx->spu->number : -1, 2598 !list_empty(&ctx->rq) ? 'q' : ' ', 2599 ctx->csa.class_0_pending, 2600 ctx->csa.class_0_dar, 2601 ctx->csa.class_1_dsisr, 2602 mfc_control_RW, 2603 ctx->ops->runcntl_read(ctx), 2604 ctx->ops->status_read(ctx)); 2605 2606 mutex_unlock(&ctx->state_mutex); 2607 2608 return 0; 2609 } 2610 2611 static int spufs_ctx_open(struct inode *inode, struct file *file) 2612 { 2613 return single_open(file, spufs_show_ctx, SPUFS_I(inode)->i_ctx); 2614 } 2615 2616 static const struct file_operations spufs_ctx_fops = { 2617 .open = spufs_ctx_open, 2618 .read = seq_read, 2619 .llseek = seq_lseek, 2620 .release = single_release, 2621 }; 2622 2623 const struct spufs_tree_descr spufs_dir_contents[] = { 2624 { "capabilities", &spufs_caps_fops, 0444, }, 2625 { "mem", &spufs_mem_fops, 0666, LS_SIZE, }, 2626 { "regs", &spufs_regs_fops, 0666, sizeof(struct spu_reg128[128]), }, 2627 { "mbox", &spufs_mbox_fops, 0444, }, 2628 { "ibox", &spufs_ibox_fops, 0444, }, 2629 { "wbox", &spufs_wbox_fops, 0222, }, 2630 { "mbox_stat", &spufs_mbox_stat_fops, 0444, sizeof(u32), }, 2631 { "ibox_stat", &spufs_ibox_stat_fops, 0444, sizeof(u32), }, 2632 { "wbox_stat", &spufs_wbox_stat_fops, 0444, sizeof(u32), }, 2633 { "signal1", &spufs_signal1_fops, 0666, }, 2634 { "signal2", &spufs_signal2_fops, 0666, }, 2635 { "signal1_type", &spufs_signal1_type, 0666, }, 2636 { "signal2_type", &spufs_signal2_type, 0666, }, 2637 { "cntl", &spufs_cntl_fops, 0666, }, 2638 { "fpcr", &spufs_fpcr_fops, 0666, sizeof(struct spu_reg128), }, 2639 { "lslr", &spufs_lslr_ops, 0444, }, 2640 { "mfc", &spufs_mfc_fops, 0666, }, 2641 { "mss", &spufs_mss_fops, 0666, }, 2642 { "npc", &spufs_npc_ops, 0666, }, 2643 { "srr0", &spufs_srr0_ops, 0666, }, 2644 { "decr", &spufs_decr_ops, 0666, }, 2645 { "decr_status", &spufs_decr_status_ops, 0666, }, 2646 { "event_mask", &spufs_event_mask_ops, 0666, }, 2647 { "event_status", &spufs_event_status_ops, 0444, }, 2648 { "psmap", &spufs_psmap_fops, 0666, SPUFS_PS_MAP_SIZE, }, 2649 { "phys-id", &spufs_id_ops, 0666, }, 2650 { "object-id", &spufs_object_id_ops, 0666, }, 2651 { "mbox_info", &spufs_mbox_info_fops, 0444, sizeof(u32), }, 2652 { "ibox_info", &spufs_ibox_info_fops, 0444, sizeof(u32), }, 2653 { "wbox_info", &spufs_wbox_info_fops, 0444, sizeof(u32), }, 2654 { "dma_info", &spufs_dma_info_fops, 0444, 2655 sizeof(struct spu_dma_info), }, 2656 { "proxydma_info", &spufs_proxydma_info_fops, 0444, 2657 sizeof(struct spu_proxydma_info)}, 2658 { "tid", &spufs_tid_fops, 0444, }, 2659 { "stat", &spufs_stat_fops, 0444, }, 2660 { "switch_log", &spufs_switch_log_fops, 0444 }, 2661 {}, 2662 }; 2663 2664 const struct spufs_tree_descr spufs_dir_nosched_contents[] = { 2665 { "capabilities", &spufs_caps_fops, 0444, }, 2666 { "mem", &spufs_mem_fops, 0666, LS_SIZE, }, 2667 { "mbox", &spufs_mbox_fops, 0444, }, 2668 { "ibox", &spufs_ibox_fops, 0444, }, 2669 { "wbox", &spufs_wbox_fops, 0222, }, 2670 { "mbox_stat", &spufs_mbox_stat_fops, 0444, sizeof(u32), }, 2671 { "ibox_stat", &spufs_ibox_stat_fops, 0444, sizeof(u32), }, 2672 { "wbox_stat", &spufs_wbox_stat_fops, 0444, sizeof(u32), }, 2673 { "signal1", &spufs_signal1_nosched_fops, 0222, }, 2674 { "signal2", &spufs_signal2_nosched_fops, 0222, }, 2675 { "signal1_type", &spufs_signal1_type, 0666, }, 2676 { "signal2_type", &spufs_signal2_type, 0666, }, 2677 { "mss", &spufs_mss_fops, 0666, }, 2678 { "mfc", &spufs_mfc_fops, 0666, }, 2679 { "cntl", &spufs_cntl_fops, 0666, }, 2680 { "npc", &spufs_npc_ops, 0666, }, 2681 { "psmap", &spufs_psmap_fops, 0666, SPUFS_PS_MAP_SIZE, }, 2682 { "phys-id", &spufs_id_ops, 0666, }, 2683 { "object-id", &spufs_object_id_ops, 0666, }, 2684 { "tid", &spufs_tid_fops, 0444, }, 2685 { "stat", &spufs_stat_fops, 0444, }, 2686 {}, 2687 }; 2688 2689 const struct spufs_tree_descr spufs_dir_debug_contents[] = { 2690 { ".ctx", &spufs_ctx_fops, 0444, }, 2691 {}, 2692 }; 2693 2694 const struct spufs_coredump_reader spufs_coredump_read[] = { 2695 { "regs", __spufs_regs_read, NULL, sizeof(struct spu_reg128[128])}, 2696 { "fpcr", __spufs_fpcr_read, NULL, sizeof(struct spu_reg128) }, 2697 { "lslr", NULL, spufs_lslr_get, 19 }, 2698 { "decr", NULL, spufs_decr_get, 19 }, 2699 { "decr_status", NULL, spufs_decr_status_get, 19 }, 2700 { "mem", __spufs_mem_read, NULL, LS_SIZE, }, 2701 { "signal1", __spufs_signal1_read, NULL, sizeof(u32) }, 2702 { "signal1_type", NULL, spufs_signal1_type_get, 19 }, 2703 { "signal2", __spufs_signal2_read, NULL, sizeof(u32) }, 2704 { "signal2_type", NULL, spufs_signal2_type_get, 19 }, 2705 { "event_mask", NULL, spufs_event_mask_get, 19 }, 2706 { "event_status", NULL, spufs_event_status_get, 19 }, 2707 { "mbox_info", __spufs_mbox_info_read, NULL, sizeof(u32) }, 2708 { "ibox_info", __spufs_ibox_info_read, NULL, sizeof(u32) }, 2709 { "wbox_info", __spufs_wbox_info_read, NULL, 4 * sizeof(u32)}, 2710 { "dma_info", __spufs_dma_info_read, NULL, sizeof(struct spu_dma_info)}, 2711 { "proxydma_info", __spufs_proxydma_info_read, 2712 NULL, sizeof(struct spu_proxydma_info)}, 2713 { "object-id", NULL, spufs_object_id_get, 19 }, 2714 { "npc", NULL, spufs_npc_get, 19 }, 2715 { NULL }, 2716 }; 2717