console.c 3.9 KB

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