setup.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. *
  4. * arch/xtensa/platform-iss/setup.c
  5. *
  6. * Platform specific initialization.
  7. *
  8. * Authors: Chris Zankel <[email protected]>
  9. * Joe Taylor <[email protected]>
  10. *
  11. * Copyright 2001 - 2005 Tensilica Inc.
  12. * Copyright 2017 Cadence Design Systems Inc.
  13. */
  14. #include <linux/init.h>
  15. #include <linux/kernel.h>
  16. #include <linux/notifier.h>
  17. #include <linux/panic_notifier.h>
  18. #include <linux/printk.h>
  19. #include <linux/string.h>
  20. #include <asm/platform.h>
  21. #include <asm/setup.h>
  22. #include <platform/simcall.h>
  23. void platform_halt(void)
  24. {
  25. pr_info(" ** Called platform_halt() **\n");
  26. simc_exit(0);
  27. }
  28. void platform_power_off(void)
  29. {
  30. pr_info(" ** Called platform_power_off() **\n");
  31. simc_exit(0);
  32. }
  33. void platform_restart(void)
  34. {
  35. /* Flush and reset the mmu, simulate a processor reset, and
  36. * jump to the reset vector. */
  37. cpu_reset();
  38. /* control never gets here */
  39. }
  40. static int
  41. iss_panic_event(struct notifier_block *this, unsigned long event, void *ptr)
  42. {
  43. simc_exit(1);
  44. return NOTIFY_DONE;
  45. }
  46. static struct notifier_block iss_panic_block = {
  47. .notifier_call = iss_panic_event,
  48. };
  49. void __init platform_setup(char **p_cmdline)
  50. {
  51. static void *argv[COMMAND_LINE_SIZE / sizeof(void *)] __initdata;
  52. static char cmdline[COMMAND_LINE_SIZE] __initdata;
  53. int argc = simc_argc();
  54. int argv_size = simc_argv_size();
  55. if (argc > 1) {
  56. if (argv_size > sizeof(argv)) {
  57. pr_err("%s: command line too long: argv_size = %d\n",
  58. __func__, argv_size);
  59. } else {
  60. int i;
  61. cmdline[0] = 0;
  62. simc_argv((void *)argv);
  63. for (i = 1; i < argc; ++i) {
  64. if (i > 1)
  65. strcat(cmdline, " ");
  66. strcat(cmdline, argv[i]);
  67. }
  68. *p_cmdline = cmdline;
  69. }
  70. }
  71. atomic_notifier_chain_register(&panic_notifier_list, &iss_panic_block);
  72. }