1 /* 2 * 3 * Procedures for interfacing to the RTAS on CHRP machines. 4 * 5 * Peter Bergner, IBM March 2001. 6 * Copyright (C) 2001 IBM. 7 * 8 * This program is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU General Public License 10 * as published by the Free Software Foundation; either version 11 * 2 of the License, or (at your option) any later version. 12 */ 13 14 #include <stdarg.h> 15 #include <linux/kernel.h> 16 #include <linux/types.h> 17 #include <linux/spinlock.h> 18 #include <linux/module.h> 19 #include <linux/init.h> 20 #include <linux/capability.h> 21 #include <linux/delay.h> 22 #include <linux/smp.h> 23 #include <linux/completion.h> 24 #include <linux/cpumask.h> 25 #include <linux/lmb.h> 26 27 #include <asm/prom.h> 28 #include <asm/rtas.h> 29 #include <asm/hvcall.h> 30 #include <asm/machdep.h> 31 #include <asm/firmware.h> 32 #include <asm/page.h> 33 #include <asm/param.h> 34 #include <asm/system.h> 35 #include <asm/delay.h> 36 #include <asm/uaccess.h> 37 #include <asm/udbg.h> 38 #include <asm/syscalls.h> 39 #include <asm/smp.h> 40 #include <asm/atomic.h> 41 42 struct rtas_t rtas = { 43 .lock = SPIN_LOCK_UNLOCKED 44 }; 45 EXPORT_SYMBOL(rtas); 46 47 struct rtas_suspend_me_data { 48 atomic_t working; /* number of cpus accessing this struct */ 49 int token; /* ibm,suspend-me */ 50 int error; 51 struct completion *complete; /* wait on this until working == 0 */ 52 }; 53 54 DEFINE_SPINLOCK(rtas_data_buf_lock); 55 EXPORT_SYMBOL(rtas_data_buf_lock); 56 57 char rtas_data_buf[RTAS_DATA_BUF_SIZE] __cacheline_aligned; 58 EXPORT_SYMBOL(rtas_data_buf); 59 60 unsigned long rtas_rmo_buf; 61 62 /* 63 * If non-NULL, this gets called when the kernel terminates. 64 * This is done like this so rtas_flash can be a module. 65 */ 66 void (*rtas_flash_term_hook)(int); 67 EXPORT_SYMBOL(rtas_flash_term_hook); 68 69 /* 70 * call_rtas_display_status and call_rtas_display_status_delay 71 * are designed only for very early low-level debugging, which 72 * is why the token is hard-coded to 10. 73 */ 74 static void call_rtas_display_status(char c) 75 { 76 struct rtas_args *args = &rtas.args; 77 unsigned long s; 78 79 if (!rtas.base) 80 return; 81 spin_lock_irqsave(&rtas.lock, s); 82 83 args->token = 10; 84 args->nargs = 1; 85 args->nret = 1; 86 args->rets = (rtas_arg_t *)&(args->args[1]); 87 args->args[0] = (unsigned char)c; 88 89 enter_rtas(__pa(args)); 90 91 spin_unlock_irqrestore(&rtas.lock, s); 92 } 93 94 static void call_rtas_display_status_delay(char c) 95 { 96 static int pending_newline = 0; /* did last write end with unprinted newline? */ 97 static int width = 16; 98 99 if (c == '\n') { 100 while (width-- > 0) 101 call_rtas_display_status(' '); 102 width = 16; 103 mdelay(500); 104 pending_newline = 1; 105 } else { 106 if (pending_newline) { 107 call_rtas_display_status('\r'); 108 call_rtas_display_status('\n'); 109 } 110 pending_newline = 0; 111 if (width--) { 112 call_rtas_display_status(c); 113 udelay(10000); 114 } 115 } 116 } 117 118 void __init udbg_init_rtas_panel(void) 119 { 120 udbg_putc = call_rtas_display_status_delay; 121 } 122 123 #ifdef CONFIG_UDBG_RTAS_CONSOLE 124 125 /* If you think you're dying before early_init_dt_scan_rtas() does its 126 * work, you can hard code the token values for your firmware here and 127 * hardcode rtas.base/entry etc. 128 */ 129 static unsigned int rtas_putchar_token = RTAS_UNKNOWN_SERVICE; 130 static unsigned int rtas_getchar_token = RTAS_UNKNOWN_SERVICE; 131 132 static void udbg_rtascon_putc(char c) 133 { 134 int tries; 135 136 if (!rtas.base) 137 return; 138 139 /* Add CRs before LFs */ 140 if (c == '\n') 141 udbg_rtascon_putc('\r'); 142 143 /* if there is more than one character to be displayed, wait a bit */ 144 for (tries = 0; tries < 16; tries++) { 145 if (rtas_call(rtas_putchar_token, 1, 1, NULL, c) == 0) 146 break; 147 udelay(1000); 148 } 149 } 150 151 static int udbg_rtascon_getc_poll(void) 152 { 153 int c; 154 155 if (!rtas.base) 156 return -1; 157 158 if (rtas_call(rtas_getchar_token, 0, 2, &c)) 159 return -1; 160 161 return c; 162 } 163 164 static int udbg_rtascon_getc(void) 165 { 166 int c; 167 168 while ((c = udbg_rtascon_getc_poll()) == -1) 169 ; 170 171 return c; 172 } 173 174 175 void __init udbg_init_rtas_console(void) 176 { 177 udbg_putc = udbg_rtascon_putc; 178 udbg_getc = udbg_rtascon_getc; 179 udbg_getc_poll = udbg_rtascon_getc_poll; 180 } 181 #endif /* CONFIG_UDBG_RTAS_CONSOLE */ 182 183 void rtas_progress(char *s, unsigned short hex) 184 { 185 struct device_node *root; 186 int width; 187 const int *p; 188 char *os; 189 static int display_character, set_indicator; 190 static int display_width, display_lines, form_feed; 191 static const int *row_width; 192 static DEFINE_SPINLOCK(progress_lock); 193 static int current_line; 194 static int pending_newline = 0; /* did last write end with unprinted newline? */ 195 196 if (!rtas.base) 197 return; 198 199 if (display_width == 0) { 200 display_width = 0x10; 201 if ((root = of_find_node_by_path("/rtas"))) { 202 if ((p = of_get_property(root, 203 "ibm,display-line-length", NULL))) 204 display_width = *p; 205 if ((p = of_get_property(root, 206 "ibm,form-feed", NULL))) 207 form_feed = *p; 208 if ((p = of_get_property(root, 209 "ibm,display-number-of-lines", NULL))) 210 display_lines = *p; 211 row_width = of_get_property(root, 212 "ibm,display-truncation-length", NULL); 213 of_node_put(root); 214 } 215 display_character = rtas_token("display-character"); 216 set_indicator = rtas_token("set-indicator"); 217 } 218 219 if (display_character == RTAS_UNKNOWN_SERVICE) { 220 /* use hex display if available */ 221 if (set_indicator != RTAS_UNKNOWN_SERVICE) 222 rtas_call(set_indicator, 3, 1, NULL, 6, 0, hex); 223 return; 224 } 225 226 spin_lock(&progress_lock); 227 228 /* 229 * Last write ended with newline, but we didn't print it since 230 * it would just clear the bottom line of output. Print it now 231 * instead. 232 * 233 * If no newline is pending and form feed is supported, clear the 234 * display with a form feed; otherwise, print a CR to start output 235 * at the beginning of the line. 236 */ 237 if (pending_newline) { 238 rtas_call(display_character, 1, 1, NULL, '\r'); 239 rtas_call(display_character, 1, 1, NULL, '\n'); 240 pending_newline = 0; 241 } else { 242 current_line = 0; 243 if (form_feed) 244 rtas_call(display_character, 1, 1, NULL, 245 (char)form_feed); 246 else 247 rtas_call(display_character, 1, 1, NULL, '\r'); 248 } 249 250 if (row_width) 251 width = row_width[current_line]; 252 else 253 width = display_width; 254 os = s; 255 while (*os) { 256 if (*os == '\n' || *os == '\r') { 257 /* If newline is the last character, save it 258 * until next call to avoid bumping up the 259 * display output. 260 */ 261 if (*os == '\n' && !os[1]) { 262 pending_newline = 1; 263 current_line++; 264 if (current_line > display_lines-1) 265 current_line = display_lines-1; 266 spin_unlock(&progress_lock); 267 return; 268 } 269 270 /* RTAS wants CR-LF, not just LF */ 271 272 if (*os == '\n') { 273 rtas_call(display_character, 1, 1, NULL, '\r'); 274 rtas_call(display_character, 1, 1, NULL, '\n'); 275 } else { 276 /* CR might be used to re-draw a line, so we'll 277 * leave it alone and not add LF. 278 */ 279 rtas_call(display_character, 1, 1, NULL, *os); 280 } 281 282 if (row_width) 283 width = row_width[current_line]; 284 else 285 width = display_width; 286 } else { 287 width--; 288 rtas_call(display_character, 1, 1, NULL, *os); 289 } 290 291 os++; 292 293 /* if we overwrite the screen length */ 294 if (width <= 0) 295 while ((*os != 0) && (*os != '\n') && (*os != '\r')) 296 os++; 297 } 298 299 spin_unlock(&progress_lock); 300 } 301 EXPORT_SYMBOL(rtas_progress); /* needed by rtas_flash module */ 302 303 int rtas_token(const char *service) 304 { 305 const int *tokp; 306 if (rtas.dev == NULL) 307 return RTAS_UNKNOWN_SERVICE; 308 tokp = of_get_property(rtas.dev, service, NULL); 309 return tokp ? *tokp : RTAS_UNKNOWN_SERVICE; 310 } 311 EXPORT_SYMBOL(rtas_token); 312 313 int rtas_service_present(const char *service) 314 { 315 return rtas_token(service) != RTAS_UNKNOWN_SERVICE; 316 } 317 EXPORT_SYMBOL(rtas_service_present); 318 319 #ifdef CONFIG_RTAS_ERROR_LOGGING 320 /* 321 * Return the firmware-specified size of the error log buffer 322 * for all rtas calls that require an error buffer argument. 323 * This includes 'check-exception' and 'rtas-last-error'. 324 */ 325 int rtas_get_error_log_max(void) 326 { 327 static int rtas_error_log_max; 328 if (rtas_error_log_max) 329 return rtas_error_log_max; 330 331 rtas_error_log_max = rtas_token ("rtas-error-log-max"); 332 if ((rtas_error_log_max == RTAS_UNKNOWN_SERVICE) || 333 (rtas_error_log_max > RTAS_ERROR_LOG_MAX)) { 334 printk (KERN_WARNING "RTAS: bad log buffer size %d\n", 335 rtas_error_log_max); 336 rtas_error_log_max = RTAS_ERROR_LOG_MAX; 337 } 338 return rtas_error_log_max; 339 } 340 EXPORT_SYMBOL(rtas_get_error_log_max); 341 342 343 static char rtas_err_buf[RTAS_ERROR_LOG_MAX]; 344 static int rtas_last_error_token; 345 346 /** Return a copy of the detailed error text associated with the 347 * most recent failed call to rtas. Because the error text 348 * might go stale if there are any other intervening rtas calls, 349 * this routine must be called atomically with whatever produced 350 * the error (i.e. with rtas.lock still held from the previous call). 351 */ 352 static char *__fetch_rtas_last_error(char *altbuf) 353 { 354 struct rtas_args err_args, save_args; 355 u32 bufsz; 356 char *buf = NULL; 357 358 if (rtas_last_error_token == -1) 359 return NULL; 360 361 bufsz = rtas_get_error_log_max(); 362 363 err_args.token = rtas_last_error_token; 364 err_args.nargs = 2; 365 err_args.nret = 1; 366 err_args.args[0] = (rtas_arg_t)__pa(rtas_err_buf); 367 err_args.args[1] = bufsz; 368 err_args.args[2] = 0; 369 370 save_args = rtas.args; 371 rtas.args = err_args; 372 373 enter_rtas(__pa(&rtas.args)); 374 375 err_args = rtas.args; 376 rtas.args = save_args; 377 378 /* Log the error in the unlikely case that there was one. */ 379 if (unlikely(err_args.args[2] == 0)) { 380 if (altbuf) { 381 buf = altbuf; 382 } else { 383 buf = rtas_err_buf; 384 if (mem_init_done) 385 buf = kmalloc(RTAS_ERROR_LOG_MAX, GFP_ATOMIC); 386 } 387 if (buf) 388 memcpy(buf, rtas_err_buf, RTAS_ERROR_LOG_MAX); 389 } 390 391 return buf; 392 } 393 394 #define get_errorlog_buffer() kmalloc(RTAS_ERROR_LOG_MAX, GFP_KERNEL) 395 396 #else /* CONFIG_RTAS_ERROR_LOGGING */ 397 #define __fetch_rtas_last_error(x) NULL 398 #define get_errorlog_buffer() NULL 399 #endif 400 401 int rtas_call(int token, int nargs, int nret, int *outputs, ...) 402 { 403 va_list list; 404 int i; 405 unsigned long s; 406 struct rtas_args *rtas_args; 407 char *buff_copy = NULL; 408 int ret; 409 410 if (!rtas.entry || token == RTAS_UNKNOWN_SERVICE) 411 return -1; 412 413 /* Gotta do something different here, use global lock for now... */ 414 spin_lock_irqsave(&rtas.lock, s); 415 rtas_args = &rtas.args; 416 417 rtas_args->token = token; 418 rtas_args->nargs = nargs; 419 rtas_args->nret = nret; 420 rtas_args->rets = (rtas_arg_t *)&(rtas_args->args[nargs]); 421 va_start(list, outputs); 422 for (i = 0; i < nargs; ++i) 423 rtas_args->args[i] = va_arg(list, rtas_arg_t); 424 va_end(list); 425 426 for (i = 0; i < nret; ++i) 427 rtas_args->rets[i] = 0; 428 429 enter_rtas(__pa(rtas_args)); 430 431 /* A -1 return code indicates that the last command couldn't 432 be completed due to a hardware error. */ 433 if (rtas_args->rets[0] == -1) 434 buff_copy = __fetch_rtas_last_error(NULL); 435 436 if (nret > 1 && outputs != NULL) 437 for (i = 0; i < nret-1; ++i) 438 outputs[i] = rtas_args->rets[i+1]; 439 ret = (nret > 0)? rtas_args->rets[0]: 0; 440 441 /* Gotta do something different here, use global lock for now... */ 442 spin_unlock_irqrestore(&rtas.lock, s); 443 444 if (buff_copy) { 445 log_error(buff_copy, ERR_TYPE_RTAS_LOG, 0); 446 if (mem_init_done) 447 kfree(buff_copy); 448 } 449 return ret; 450 } 451 EXPORT_SYMBOL(rtas_call); 452 453 /* For RTAS_BUSY (-2), delay for 1 millisecond. For an extended busy status 454 * code of 990n, perform the hinted delay of 10^n (last digit) milliseconds. 455 */ 456 unsigned int rtas_busy_delay_time(int status) 457 { 458 int order; 459 unsigned int ms = 0; 460 461 if (status == RTAS_BUSY) { 462 ms = 1; 463 } else if (status >= 9900 && status <= 9905) { 464 order = status - 9900; 465 for (ms = 1; order > 0; order--) 466 ms *= 10; 467 } 468 469 return ms; 470 } 471 EXPORT_SYMBOL(rtas_busy_delay_time); 472 473 /* For an RTAS busy status code, perform the hinted delay. */ 474 unsigned int rtas_busy_delay(int status) 475 { 476 unsigned int ms; 477 478 might_sleep(); 479 ms = rtas_busy_delay_time(status); 480 if (ms) 481 msleep(ms); 482 483 return ms; 484 } 485 EXPORT_SYMBOL(rtas_busy_delay); 486 487 static int rtas_error_rc(int rtas_rc) 488 { 489 int rc; 490 491 switch (rtas_rc) { 492 case -1: /* Hardware Error */ 493 rc = -EIO; 494 break; 495 case -3: /* Bad indicator/domain/etc */ 496 rc = -EINVAL; 497 break; 498 case -9000: /* Isolation error */ 499 rc = -EFAULT; 500 break; 501 case -9001: /* Outstanding TCE/PTE */ 502 rc = -EEXIST; 503 break; 504 case -9002: /* No usable slot */ 505 rc = -ENODEV; 506 break; 507 default: 508 printk(KERN_ERR "%s: unexpected RTAS error %d\n", 509 __func__, rtas_rc); 510 rc = -ERANGE; 511 break; 512 } 513 return rc; 514 } 515 516 int rtas_get_power_level(int powerdomain, int *level) 517 { 518 int token = rtas_token("get-power-level"); 519 int rc; 520 521 if (token == RTAS_UNKNOWN_SERVICE) 522 return -ENOENT; 523 524 while ((rc = rtas_call(token, 1, 2, level, powerdomain)) == RTAS_BUSY) 525 udelay(1); 526 527 if (rc < 0) 528 return rtas_error_rc(rc); 529 return rc; 530 } 531 EXPORT_SYMBOL(rtas_get_power_level); 532 533 int rtas_set_power_level(int powerdomain, int level, int *setlevel) 534 { 535 int token = rtas_token("set-power-level"); 536 int rc; 537 538 if (token == RTAS_UNKNOWN_SERVICE) 539 return -ENOENT; 540 541 do { 542 rc = rtas_call(token, 2, 2, setlevel, powerdomain, level); 543 } while (rtas_busy_delay(rc)); 544 545 if (rc < 0) 546 return rtas_error_rc(rc); 547 return rc; 548 } 549 EXPORT_SYMBOL(rtas_set_power_level); 550 551 int rtas_get_sensor(int sensor, int index, int *state) 552 { 553 int token = rtas_token("get-sensor-state"); 554 int rc; 555 556 if (token == RTAS_UNKNOWN_SERVICE) 557 return -ENOENT; 558 559 do { 560 rc = rtas_call(token, 2, 2, state, sensor, index); 561 } while (rtas_busy_delay(rc)); 562 563 if (rc < 0) 564 return rtas_error_rc(rc); 565 return rc; 566 } 567 EXPORT_SYMBOL(rtas_get_sensor); 568 569 int rtas_set_indicator(int indicator, int index, int new_value) 570 { 571 int token = rtas_token("set-indicator"); 572 int rc; 573 574 if (token == RTAS_UNKNOWN_SERVICE) 575 return -ENOENT; 576 577 do { 578 rc = rtas_call(token, 3, 1, NULL, indicator, index, new_value); 579 } while (rtas_busy_delay(rc)); 580 581 if (rc < 0) 582 return rtas_error_rc(rc); 583 return rc; 584 } 585 EXPORT_SYMBOL(rtas_set_indicator); 586 587 /* 588 * Ignoring RTAS extended delay 589 */ 590 int rtas_set_indicator_fast(int indicator, int index, int new_value) 591 { 592 int rc; 593 int token = rtas_token("set-indicator"); 594 595 if (token == RTAS_UNKNOWN_SERVICE) 596 return -ENOENT; 597 598 rc = rtas_call(token, 3, 1, NULL, indicator, index, new_value); 599 600 WARN_ON(rc == -2 || (rc >= 9900 && rc <= 9905)); 601 602 if (rc < 0) 603 return rtas_error_rc(rc); 604 605 return rc; 606 } 607 608 void rtas_restart(char *cmd) 609 { 610 if (rtas_flash_term_hook) 611 rtas_flash_term_hook(SYS_RESTART); 612 printk("RTAS system-reboot returned %d\n", 613 rtas_call(rtas_token("system-reboot"), 0, 1, NULL)); 614 for (;;); 615 } 616 617 void rtas_power_off(void) 618 { 619 if (rtas_flash_term_hook) 620 rtas_flash_term_hook(SYS_POWER_OFF); 621 /* allow power on only with power button press */ 622 printk("RTAS power-off returned %d\n", 623 rtas_call(rtas_token("power-off"), 2, 1, NULL, -1, -1)); 624 for (;;); 625 } 626 627 void rtas_halt(void) 628 { 629 if (rtas_flash_term_hook) 630 rtas_flash_term_hook(SYS_HALT); 631 /* allow power on only with power button press */ 632 printk("RTAS power-off returned %d\n", 633 rtas_call(rtas_token("power-off"), 2, 1, NULL, -1, -1)); 634 for (;;); 635 } 636 637 /* Must be in the RMO region, so we place it here */ 638 static char rtas_os_term_buf[2048]; 639 640 void rtas_os_term(char *str) 641 { 642 int status; 643 644 if (panic_timeout) 645 return; 646 647 if (RTAS_UNKNOWN_SERVICE == rtas_token("ibm,os-term")) 648 return; 649 650 snprintf(rtas_os_term_buf, 2048, "OS panic: %s", str); 651 652 do { 653 status = rtas_call(rtas_token("ibm,os-term"), 1, 1, NULL, 654 __pa(rtas_os_term_buf)); 655 } while (rtas_busy_delay(status)); 656 657 if (status != 0) 658 printk(KERN_EMERG "ibm,os-term call failed %d\n", 659 status); 660 } 661 662 static int ibm_suspend_me_token = RTAS_UNKNOWN_SERVICE; 663 #ifdef CONFIG_PPC_PSERIES 664 static void rtas_percpu_suspend_me(void *info) 665 { 666 long rc; 667 unsigned long msr_save; 668 int cpu; 669 struct rtas_suspend_me_data *data = 670 (struct rtas_suspend_me_data *)info; 671 672 atomic_inc(&data->working); 673 674 /* really need to ensure MSR.EE is off for H_JOIN */ 675 msr_save = mfmsr(); 676 mtmsr(msr_save & ~(MSR_EE)); 677 678 rc = plpar_hcall_norets(H_JOIN); 679 680 mtmsr(msr_save); 681 682 if (rc == H_SUCCESS) { 683 /* This cpu was prodded and the suspend is complete. */ 684 goto out; 685 } else if (rc == H_CONTINUE) { 686 /* All other cpus are in H_JOIN, this cpu does 687 * the suspend. 688 */ 689 printk(KERN_DEBUG "calling ibm,suspend-me on cpu %i\n", 690 smp_processor_id()); 691 data->error = rtas_call(data->token, 0, 1, NULL); 692 693 if (data->error) 694 printk(KERN_DEBUG "ibm,suspend-me returned %d\n", 695 data->error); 696 } else { 697 printk(KERN_ERR "H_JOIN on cpu %i failed with rc = %ld\n", 698 smp_processor_id(), rc); 699 data->error = rc; 700 } 701 /* This cpu did the suspend or got an error; in either case, 702 * we need to prod all other other cpus out of join state. 703 * Extra prods are harmless. 704 */ 705 for_each_online_cpu(cpu) 706 plpar_hcall_norets(H_PROD, get_hard_smp_processor_id(cpu)); 707 out: 708 if (atomic_dec_return(&data->working) == 0) 709 complete(data->complete); 710 } 711 712 static int rtas_ibm_suspend_me(struct rtas_args *args) 713 { 714 long state; 715 long rc; 716 unsigned long retbuf[PLPAR_HCALL_BUFSIZE]; 717 struct rtas_suspend_me_data data; 718 DECLARE_COMPLETION_ONSTACK(done); 719 720 if (!rtas_service_present("ibm,suspend-me")) 721 return -ENOSYS; 722 723 /* Make sure the state is valid */ 724 rc = plpar_hcall(H_VASI_STATE, retbuf, 725 ((u64)args->args[0] << 32) | args->args[1]); 726 727 state = retbuf[0]; 728 729 if (rc) { 730 printk(KERN_ERR "rtas_ibm_suspend_me: vasi_state returned %ld\n",rc); 731 return rc; 732 } else if (state == H_VASI_ENABLED) { 733 args->args[args->nargs] = RTAS_NOT_SUSPENDABLE; 734 return 0; 735 } else if (state != H_VASI_SUSPENDING) { 736 printk(KERN_ERR "rtas_ibm_suspend_me: vasi_state returned state %ld\n", 737 state); 738 args->args[args->nargs] = -1; 739 return 0; 740 } 741 742 atomic_set(&data.working, 0); 743 data.token = rtas_token("ibm,suspend-me"); 744 data.error = 0; 745 data.complete = &done; 746 747 /* Call function on all CPUs. One of us will make the 748 * rtas call 749 */ 750 if (on_each_cpu(rtas_percpu_suspend_me, &data, 0)) 751 data.error = -EINVAL; 752 753 wait_for_completion(&done); 754 755 if (data.error != 0) 756 printk(KERN_ERR "Error doing global join\n"); 757 758 return data.error; 759 } 760 #else /* CONFIG_PPC_PSERIES */ 761 static int rtas_ibm_suspend_me(struct rtas_args *args) 762 { 763 return -ENOSYS; 764 } 765 #endif 766 767 asmlinkage int ppc_rtas(struct rtas_args __user *uargs) 768 { 769 struct rtas_args args; 770 unsigned long flags; 771 char *buff_copy, *errbuf = NULL; 772 int nargs; 773 int rc; 774 775 if (!capable(CAP_SYS_ADMIN)) 776 return -EPERM; 777 778 if (copy_from_user(&args, uargs, 3 * sizeof(u32)) != 0) 779 return -EFAULT; 780 781 nargs = args.nargs; 782 if (nargs > ARRAY_SIZE(args.args) 783 || args.nret > ARRAY_SIZE(args.args) 784 || nargs + args.nret > ARRAY_SIZE(args.args)) 785 return -EINVAL; 786 787 /* Copy in args. */ 788 if (copy_from_user(args.args, uargs->args, 789 nargs * sizeof(rtas_arg_t)) != 0) 790 return -EFAULT; 791 792 if (args.token == RTAS_UNKNOWN_SERVICE) 793 return -EINVAL; 794 795 /* Need to handle ibm,suspend_me call specially */ 796 if (args.token == ibm_suspend_me_token) { 797 rc = rtas_ibm_suspend_me(&args); 798 if (rc) 799 return rc; 800 goto copy_return; 801 } 802 803 buff_copy = get_errorlog_buffer(); 804 805 spin_lock_irqsave(&rtas.lock, flags); 806 807 rtas.args = args; 808 enter_rtas(__pa(&rtas.args)); 809 args = rtas.args; 810 811 args.rets = &args.args[nargs]; 812 813 /* A -1 return code indicates that the last command couldn't 814 be completed due to a hardware error. */ 815 if (args.rets[0] == -1) 816 errbuf = __fetch_rtas_last_error(buff_copy); 817 818 spin_unlock_irqrestore(&rtas.lock, flags); 819 820 if (buff_copy) { 821 if (errbuf) 822 log_error(errbuf, ERR_TYPE_RTAS_LOG, 0); 823 kfree(buff_copy); 824 } 825 826 copy_return: 827 /* Copy out args. */ 828 if (copy_to_user(uargs->args + nargs, 829 args.args + nargs, 830 args.nret * sizeof(rtas_arg_t)) != 0) 831 return -EFAULT; 832 833 return 0; 834 } 835 836 /* 837 * Call early during boot, before mem init or bootmem, to retrieve the RTAS 838 * informations from the device-tree and allocate the RMO buffer for userland 839 * accesses. 840 */ 841 void __init rtas_initialize(void) 842 { 843 unsigned long rtas_region = RTAS_INSTANTIATE_MAX; 844 845 /* Get RTAS dev node and fill up our "rtas" structure with infos 846 * about it. 847 */ 848 rtas.dev = of_find_node_by_name(NULL, "rtas"); 849 if (rtas.dev) { 850 const u32 *basep, *entryp, *sizep; 851 852 basep = of_get_property(rtas.dev, "linux,rtas-base", NULL); 853 sizep = of_get_property(rtas.dev, "rtas-size", NULL); 854 if (basep != NULL && sizep != NULL) { 855 rtas.base = *basep; 856 rtas.size = *sizep; 857 entryp = of_get_property(rtas.dev, 858 "linux,rtas-entry", NULL); 859 if (entryp == NULL) /* Ugh */ 860 rtas.entry = rtas.base; 861 else 862 rtas.entry = *entryp; 863 } else 864 rtas.dev = NULL; 865 } 866 if (!rtas.dev) 867 return; 868 869 /* If RTAS was found, allocate the RMO buffer for it and look for 870 * the stop-self token if any 871 */ 872 #ifdef CONFIG_PPC64 873 if (machine_is(pseries) && firmware_has_feature(FW_FEATURE_LPAR)) { 874 rtas_region = min(lmb.rmo_size, RTAS_INSTANTIATE_MAX); 875 ibm_suspend_me_token = rtas_token("ibm,suspend-me"); 876 } 877 #endif 878 rtas_rmo_buf = lmb_alloc_base(RTAS_RMOBUF_MAX, PAGE_SIZE, rtas_region); 879 880 #ifdef CONFIG_RTAS_ERROR_LOGGING 881 rtas_last_error_token = rtas_token("rtas-last-error"); 882 #endif 883 } 884 885 int __init early_init_dt_scan_rtas(unsigned long node, 886 const char *uname, int depth, void *data) 887 { 888 u32 *basep, *entryp, *sizep; 889 890 if (depth != 1 || strcmp(uname, "rtas") != 0) 891 return 0; 892 893 basep = of_get_flat_dt_prop(node, "linux,rtas-base", NULL); 894 entryp = of_get_flat_dt_prop(node, "linux,rtas-entry", NULL); 895 sizep = of_get_flat_dt_prop(node, "rtas-size", NULL); 896 897 if (basep && entryp && sizep) { 898 rtas.base = *basep; 899 rtas.entry = *entryp; 900 rtas.size = *sizep; 901 } 902 903 #ifdef CONFIG_UDBG_RTAS_CONSOLE 904 basep = of_get_flat_dt_prop(node, "put-term-char", NULL); 905 if (basep) 906 rtas_putchar_token = *basep; 907 908 basep = of_get_flat_dt_prop(node, "get-term-char", NULL); 909 if (basep) 910 rtas_getchar_token = *basep; 911 912 if (rtas_putchar_token != RTAS_UNKNOWN_SERVICE && 913 rtas_getchar_token != RTAS_UNKNOWN_SERVICE) 914 udbg_init_rtas_console(); 915 916 #endif 917 918 /* break now */ 919 return 1; 920 } 921