patch-2.4.22 linux-2.4.22/arch/ppc64/kernel/chrp_setup.c
Next file: linux-2.4.22/arch/ppc64/kernel/cputable.c
Previous file: linux-2.4.22/arch/ppc64/kernel/align.c
Back to the patch index
Back to the overall index
- Lines: 143
- Date:
2003-08-25 04:44:40.000000000 -0700
- Orig file:
linux-2.4.21/arch/ppc64/kernel/chrp_setup.c
- Orig date:
2003-06-13 07:51:31.000000000 -0700
diff -urN linux-2.4.21/arch/ppc64/kernel/chrp_setup.c linux-2.4.22/arch/ppc64/kernel/chrp_setup.c
@@ -65,6 +65,7 @@
#include "open_pic.h"
#include "xics.h"
#include <asm/ppcdebug.h>
+#include <asm/cputable.h>
extern volatile unsigned char *chrp_int_ack_special;
@@ -305,6 +306,32 @@
SYSRQ_KEY = 0x63; /* Print Screen */
#endif
#endif
+ /* Build up the firmware_features bitmask field
+ * using contents of device-tree/ibm,hypertas-functions.
+ * Ultimately this functionality may be moved into prom.c prom_init().
+ */
+ struct device_node * dn;
+ char * hypertas;
+ unsigned int len;
+ dn = find_path_device("/rtas");
+ cur_cpu_spec->firmware_features=0;
+ hypertas = get_property(dn, "ibm,hypertas-functions", &len);
+ if (hypertas) {
+ while (len > 0){
+ int i;
+ /* check value against table of strings */
+ for(i=0; i < FIRMWARE_MAX_FEATURES ;i++) {
+ if ((firmware_features_table[i].name) && (strcmp(firmware_features_table[i].name,hypertas))==0) {
+ /* we have a match */
+ cur_cpu_spec->firmware_features |= (1UL << firmware_features_table[i].val );
+ break;
+ }
+ }
+ int hypertas_len = strlen(hypertas);
+ len -= hypertas_len +1;
+ hypertas+= hypertas_len +1;
+ }
+ }
}
void __chrp
@@ -315,6 +342,8 @@
char *os;
static int display_character, set_indicator;
static int max_width;
+ static spinlock_t progress_lock = SPIN_LOCK_UNLOCKED;
+ static int pending_newline = 0; /* did last write end with unprinted newline? */
if (!rtas.base)
return;
@@ -330,34 +359,79 @@
display_character = rtas_token("display-character");
set_indicator = rtas_token("set-indicator");
}
- if (display_character == RTAS_UNKNOWN_SERVICE) {
- /* use hex display */
- if (set_indicator == RTAS_UNKNOWN_SERVICE)
- return;
- rtas_call(set_indicator, 3, 1, NULL, 6, 0, hex);
+
+ if(display_character == RTAS_UNKNOWN_SERVICE) {
+ /* use hex display if available */
+ if(set_indicator != RTAS_UNKNOWN_SERVICE)
+ rtas_call(set_indicator, 3, 1, NULL, 6, 0, hex);
return;
}
- rtas_call(display_character, 1, 1, NULL, '\r');
+ spin_lock(&progress_lock);
+ /* Last write ended with newline, but we didn't print it since
+ * it would just clear the bottom line of output. Print it now
+ * instead.
+ *
+ * If no newline is pending, print a CR to start output at the
+ * beginning of the line.
+ */
+ if(pending_newline) {
+ rtas_call(display_character, 1, 1, NULL, '\r');
+ rtas_call(display_character, 1, 1, NULL, '\n');
+ pending_newline = 0;
+ } else
+ rtas_call(display_character, 1, 1, NULL, '\r');
+
width = max_width;
os = s;
- while ( *os )
- {
- if ( (*os == '\n') || (*os == '\r') )
+ while (*os) {
+ if(*os == '\n' || *os == '\r') {
+ /* Blank to end of line. */
+ while(width-- > 0)
+ rtas_call(display_character, 1, 1, NULL, ' ');
+
+ /* If newline is the last character, save it
+ * until next call to avoid bumping up the
+ * display output.
+ */
+ if(*os == '\n' && !os[1]) {
+ pending_newline = 1;
+ spin_unlock(&progress_lock);
+ return;
+ }
+
+ /* RTAS wants CR-LF, not just LF */
+
+ if(*os == '\n') {
+ rtas_call(display_character, 1, 1, NULL, '\r');
+ rtas_call(display_character, 1, 1, NULL, '\n');
+ } else {
+ /* CR might be used to re-draw a line, so we'll
+ * leave it alone and not add LF.
+ */
+ rtas_call(display_character, 1, 1, NULL, *os);
+ }
+
width = max_width;
- else
+ } else {
width--;
- rtas_call(display_character, 1, 1, NULL, *os++ );
+ rtas_call(display_character, 1, 1, NULL, *os);
+ }
+
+ os++;
+
/* if we overwrite the screen length */
- if ( width == 0 )
+ if ( width <= 0 )
while ( (*os != 0) && (*os != '\n') && (*os != '\r') )
os++;
}
-
+
/* Blank to end of line. */
while ( width-- > 0 )
rtas_call(display_character, 1, 1, NULL, ' ' );
+
+ spin_unlock(&progress_lock);
}
extern void setup_default_decr(void);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)