diff options
Diffstat (limited to 'arch/ppc64/kernel/rtas.c')
-rw-r--r-- | arch/ppc64/kernel/rtas.c | 59 |
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 | ||