aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ppc64/kernel/rtas.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/ppc64/kernel/rtas.c')
-rw-r--r--arch/ppc64/kernel/rtas.c59
1 files changed, 37 insertions, 22 deletions
diff --git a/arch/ppc64/kernel/rtas.c b/arch/ppc64/kernel/rtas.c
index 43e1518653d5..5e8eb33b8e54 100644
--- a/arch/ppc64/kernel/rtas.c
+++ b/arch/ppc64/kernel/rtas.c
@@ -98,21 +98,29 @@ rtas_progress(char *s, unsigned short hex)
98 int width, *p; 98 int width, *p;
99 char *os; 99 char *os;
100 static int display_character, set_indicator; 100 static int display_character, set_indicator;
101 static int max_width; 101 static int display_width, display_lines, *row_width, form_feed;
102 static DEFINE_SPINLOCK(progress_lock); 102 static DEFINE_SPINLOCK(progress_lock);
103 static int current_line;
103 static int pending_newline = 0; /* did last write end with unprinted newline? */ 104 static int pending_newline = 0; /* did last write end with unprinted newline? */
104 105
105 if (!rtas.base) 106 if (!rtas.base)
106 return; 107 return;
107 108
108 if (max_width == 0) { 109 if (display_width == 0) {
109 if ((root = find_path_device("/rtas")) && 110 display_width = 0x10;
110 (p = (unsigned int *)get_property(root, 111 if ((root = find_path_device("/rtas"))) {
111 "ibm,display-line-length", 112 if ((p = (unsigned int *)get_property(root,
112 NULL))) 113 "ibm,display-line-length", NULL)))
113 max_width = *p; 114 display_width = *p;
114 else 115 if ((p = (unsigned int *)get_property(root,
115 max_width = 0x10; 116 "ibm,form-feed", NULL)))
117 form_feed = *p;
118 if ((p = (unsigned int *)get_property(root,
119 "ibm,display-number-of-lines", NULL)))
120 display_lines = *p;
121 row_width = (unsigned int *)get_property(root,
122 "ibm,display-truncation-length", NULL);
123 }
116 display_character = rtas_token("display-character"); 124 display_character = rtas_token("display-character");
117 set_indicator = rtas_token("set-indicator"); 125 set_indicator = rtas_token("set-indicator");
118 } 126 }
@@ -131,31 +139,39 @@ rtas_progress(char *s, unsigned short hex)
131 * it would just clear the bottom line of output. Print it now 139 * it would just clear the bottom line of output. Print it now
132 * instead. 140 * instead.
133 * 141 *
134 * If no newline is pending, print a CR to start output at the 142 * If no newline is pending and form feed is supported, clear the
135 * beginning of the line. 143 * display with a form feed; otherwise, print a CR to start output
144 * at the beginning of the line.
136 */ 145 */
137 if (pending_newline) { 146 if (pending_newline) {
138 rtas_call(display_character, 1, 1, NULL, '\r'); 147 rtas_call(display_character, 1, 1, NULL, '\r');
139 rtas_call(display_character, 1, 1, NULL, '\n'); 148 rtas_call(display_character, 1, 1, NULL, '\n');
140 pending_newline = 0; 149 pending_newline = 0;
141 } else { 150 } else {
142 rtas_call(display_character, 1, 1, NULL, '\r'); 151 current_line = 0;
152 if (form_feed)
153 rtas_call(display_character, 1, 1, NULL,
154 (char)form_feed);
155 else
156 rtas_call(display_character, 1, 1, NULL, '\r');
143 } 157 }
144 158
145 width = max_width; 159 if (row_width)
160 width = row_width[current_line];
161 else
162 width = display_width;
146 os = s; 163 os = s;
147 while (*os) { 164 while (*os) {
148 if (*os == '\n' || *os == '\r') { 165 if (*os == '\n' || *os == '\r') {
149 /* Blank to end of line. */
150 while (width-- > 0)
151 rtas_call(display_character, 1, 1, NULL, ' ');
152
153 /* If newline is the last character, save it 166 /* If newline is the last character, save it
154 * until next call to avoid bumping up the 167 * until next call to avoid bumping up the
155 * display output. 168 * display output.
156 */ 169 */
157 if (*os == '\n' && !os[1]) { 170 if (*os == '\n' && !os[1]) {
158 pending_newline = 1; 171 pending_newline = 1;
172 current_line++;
173 if (current_line > display_lines-1)
174 current_line = display_lines-1;
159 spin_unlock(&progress_lock); 175 spin_unlock(&progress_lock);
160 return; 176 return;
161 } 177 }
@@ -172,7 +188,10 @@ rtas_progress(char *s, unsigned short hex)
172 rtas_call(display_character, 1, 1, NULL, *os); 188 rtas_call(display_character, 1, 1, NULL, *os);
173 } 189 }
174 190
175 width = max_width; 191 if (row_width)
192 width = row_width[current_line];
193 else
194 width = display_width;
176 } else { 195 } else {
177 width--; 196 width--;
178 rtas_call(display_character, 1, 1, NULL, *os); 197 rtas_call(display_character, 1, 1, NULL, *os);
@@ -186,10 +205,6 @@ rtas_progress(char *s, unsigned short hex)
186 os++; 205 os++;
187 } 206 }
188 207
189 /* Blank to end of line. */
190 while (width-- > 0)
191 rtas_call(display_character, 1, 1, NULL, ' ');
192
193 spin_unlock(&progress_lock); 208 spin_unlock(&progress_lock);
194} 209}
195 210