console.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * console.c: Routines that deal with sending and receiving IO
  4. * to/from the current console device using the PROM.
  5. *
  6. * Copyright (C) 1995 David S. Miller ([email protected])
  7. */
  8. #include <linux/types.h>
  9. #include <linux/kernel.h>
  10. #include <linux/sched.h>
  11. #include <asm/openprom.h>
  12. #include <asm/oplib.h>
  13. #include <linux/string.h>
  14. /* Non blocking get character from console input device, returns -1
  15. * if no input was taken. This can be used for polling.
  16. */
  17. int
  18. prom_nbgetchar(void)
  19. {
  20. int i = -1;
  21. unsigned long flags;
  22. local_irq_save(flags);
  23. i = (*(romvec->pv_nbgetchar))();
  24. local_irq_restore(flags);
  25. return i; /* Ugh, we could spin forever on unsupported proms ;( */
  26. }
  27. /* Non blocking put character to console device, returns -1 if
  28. * unsuccessful.
  29. */
  30. int
  31. prom_nbputchar(char c)
  32. {
  33. unsigned long flags;
  34. int i = -1;
  35. local_irq_save(flags);
  36. i = (*(romvec->pv_nbputchar))(c);
  37. local_irq_restore(flags);
  38. return i; /* Ugh, we could spin forever on unsupported proms ;( */
  39. }
  40. /* Blocking version of get character routine above. */
  41. char
  42. prom_getchar(void)
  43. {
  44. int character;
  45. while((character = prom_nbgetchar()) == -1) ;
  46. return (char) character;
  47. }
  48. /* Blocking version of put character routine above. */
  49. void
  50. prom_putchar(char c)
  51. {
  52. while(prom_nbputchar(c) == -1) ;
  53. return;
  54. }
  55. /* Query for input device type */
  56. #if 0
  57. enum prom_input_device
  58. prom_query_input_device()
  59. {
  60. unsigned long flags;
  61. int st_p;
  62. char propb[64];
  63. char *p;
  64. switch(prom_vers) {
  65. case PROM_V0:
  66. case PROM_V2:
  67. default:
  68. switch(*romvec->pv_stdin) {
  69. case PROMDEV_KBD: return PROMDEV_IKBD;
  70. case PROMDEV_TTYA: return PROMDEV_ITTYA;
  71. case PROMDEV_TTYB: return PROMDEV_ITTYB;
  72. default:
  73. return PROMDEV_I_UNK;
  74. };
  75. case PROM_V3:
  76. case PROM_P1275:
  77. local_irq_save(flags);
  78. st_p = (*romvec->pv_v2devops.v2_inst2pkg)(*romvec->pv_v2bootargs.fd_stdin);
  79. __asm__ __volatile__("ld [%0], %%g6\n\t" : :
  80. "r" (&current_set[smp_processor_id()]) :
  81. "memory");
  82. local_irq_restore(flags);
  83. if(prom_node_has_property(st_p, "keyboard"))
  84. return PROMDEV_IKBD;
  85. prom_getproperty(st_p, "device_type", propb, sizeof(propb));
  86. if(strncmp(propb, "serial", sizeof("serial")))
  87. return PROMDEV_I_UNK;
  88. prom_getproperty(prom_root_node, "stdin-path", propb, sizeof(propb));
  89. p = propb;
  90. while(*p) p++; p -= 2;
  91. if(p[0] == ':') {
  92. if(p[1] == 'a')
  93. return PROMDEV_ITTYA;
  94. else if(p[1] == 'b')
  95. return PROMDEV_ITTYB;
  96. }
  97. return PROMDEV_I_UNK;
  98. };
  99. }
  100. #endif
  101. /* Query for output device type */
  102. #if 0
  103. enum prom_output_device
  104. prom_query_output_device()
  105. {
  106. unsigned long flags;
  107. int st_p;
  108. char propb[64];
  109. char *p;
  110. int propl;
  111. switch(prom_vers) {
  112. case PROM_V0:
  113. switch(*romvec->pv_stdin) {
  114. case PROMDEV_SCREEN: return PROMDEV_OSCREEN;
  115. case PROMDEV_TTYA: return PROMDEV_OTTYA;
  116. case PROMDEV_TTYB: return PROMDEV_OTTYB;
  117. };
  118. break;
  119. case PROM_V2:
  120. case PROM_V3:
  121. case PROM_P1275:
  122. local_irq_save(flags);
  123. st_p = (*romvec->pv_v2devops.v2_inst2pkg)(*romvec->pv_v2bootargs.fd_stdout);
  124. __asm__ __volatile__("ld [%0], %%g6\n\t" : :
  125. "r" (&current_set[smp_processor_id()]) :
  126. "memory");
  127. local_irq_restore(flags);
  128. propl = prom_getproperty(st_p, "device_type", propb, sizeof(propb));
  129. if (propl >= 0 && propl == sizeof("display") &&
  130. strncmp("display", propb, sizeof("display")) == 0)
  131. {
  132. return PROMDEV_OSCREEN;
  133. }
  134. if(prom_vers == PROM_V3) {
  135. if(strncmp("serial", propb, sizeof("serial")))
  136. return PROMDEV_O_UNK;
  137. prom_getproperty(prom_root_node, "stdout-path", propb, sizeof(propb));
  138. p = propb;
  139. while(*p) p++; p -= 2;
  140. if(p[0]==':') {
  141. if(p[1] == 'a')
  142. return PROMDEV_OTTYA;
  143. else if(p[1] == 'b')
  144. return PROMDEV_OTTYB;
  145. }
  146. return PROMDEV_O_UNK;
  147. } else {
  148. /* This works on SS-2 (an early OpenFirmware) still. */
  149. switch(*romvec->pv_stdin) {
  150. case PROMDEV_TTYA: return PROMDEV_OTTYA;
  151. case PROMDEV_TTYB: return PROMDEV_OTTYB;
  152. };
  153. }
  154. break;
  155. };
  156. return PROMDEV_O_UNK;
  157. }
  158. #endif