]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/blob - drivers/char/ipmi/ipmi_kcs_sm.c
stmmac: fix DMA channel hang in half-duplex mode
[mirror_ubuntu-eoan-kernel.git] / drivers / char / ipmi / ipmi_kcs_sm.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * ipmi_kcs_sm.c
4 *
5 * State machine for handling IPMI KCS interfaces.
6 *
7 * Author: MontaVista Software, Inc.
8 * Corey Minyard <minyard@mvista.com>
9 * source@mvista.com
10 *
11 * Copyright 2002 MontaVista Software Inc.
12 */
13
14 /*
15 * This state machine is taken from the state machine in the IPMI spec,
16 * pretty much verbatim. If you have questions about the states, see
17 * that document.
18 */
19
20 #include <linux/kernel.h> /* For printk. */
21 #include <linux/module.h>
22 #include <linux/moduleparam.h>
23 #include <linux/string.h>
24 #include <linux/jiffies.h>
25 #include <linux/ipmi_msgdefs.h> /* for completion codes */
26 #include "ipmi_si_sm.h"
27
28 /* kcs_debug is a bit-field
29 * KCS_DEBUG_ENABLE - turned on for now
30 * KCS_DEBUG_MSG - commands and their responses
31 * KCS_DEBUG_STATES - state machine
32 */
33 #define KCS_DEBUG_STATES 4
34 #define KCS_DEBUG_MSG 2
35 #define KCS_DEBUG_ENABLE 1
36
37 static int kcs_debug;
38 module_param(kcs_debug, int, 0644);
39 MODULE_PARM_DESC(kcs_debug, "debug bitmask, 1=enable, 2=messages, 4=states");
40
41 /* The states the KCS driver may be in. */
42 enum kcs_states {
43 /* The KCS interface is currently doing nothing. */
44 KCS_IDLE,
45
46 /*
47 * We are starting an operation. The data is in the output
48 * buffer, but nothing has been done to the interface yet. This
49 * was added to the state machine in the spec to wait for the
50 * initial IBF.
51 */
52 KCS_START_OP,
53
54 /* We have written a write cmd to the interface. */
55 KCS_WAIT_WRITE_START,
56
57 /* We are writing bytes to the interface. */
58 KCS_WAIT_WRITE,
59
60 /*
61 * We have written the write end cmd to the interface, and
62 * still need to write the last byte.
63 */
64 KCS_WAIT_WRITE_END,
65
66 /* We are waiting to read data from the interface. */
67 KCS_WAIT_READ,
68
69 /*
70 * State to transition to the error handler, this was added to
71 * the state machine in the spec to be sure IBF was there.
72 */
73 KCS_ERROR0,
74
75 /*
76 * First stage error handler, wait for the interface to
77 * respond.
78 */
79 KCS_ERROR1,
80
81 /*
82 * The abort cmd has been written, wait for the interface to
83 * respond.
84 */
85 KCS_ERROR2,
86
87 /*
88 * We wrote some data to the interface, wait for it to switch
89 * to read mode.
90 */
91 KCS_ERROR3,
92
93 /* The hardware failed to follow the state machine. */
94 KCS_HOSED
95 };
96
97 #define MAX_KCS_READ_SIZE IPMI_MAX_MSG_LENGTH
98 #define MAX_KCS_WRITE_SIZE IPMI_MAX_MSG_LENGTH
99
100 /* Timeouts in microseconds. */
101 #define IBF_RETRY_TIMEOUT (5*USEC_PER_SEC)
102 #define OBF_RETRY_TIMEOUT (5*USEC_PER_SEC)
103 #define MAX_ERROR_RETRIES 10
104 #define ERROR0_OBF_WAIT_JIFFIES (2*HZ)
105
106 struct si_sm_data {
107 enum kcs_states state;
108 struct si_sm_io *io;
109 unsigned char write_data[MAX_KCS_WRITE_SIZE];
110 int write_pos;
111 int write_count;
112 int orig_write_count;
113 unsigned char read_data[MAX_KCS_READ_SIZE];
114 int read_pos;
115 int truncated;
116
117 unsigned int error_retries;
118 long ibf_timeout;
119 long obf_timeout;
120 unsigned long error0_timeout;
121 };
122
123 static unsigned int init_kcs_data(struct si_sm_data *kcs,
124 struct si_sm_io *io)
125 {
126 kcs->state = KCS_IDLE;
127 kcs->io = io;
128 kcs->write_pos = 0;
129 kcs->write_count = 0;
130 kcs->orig_write_count = 0;
131 kcs->read_pos = 0;
132 kcs->error_retries = 0;
133 kcs->truncated = 0;
134 kcs->ibf_timeout = IBF_RETRY_TIMEOUT;
135 kcs->obf_timeout = OBF_RETRY_TIMEOUT;
136
137 /* Reserve 2 I/O bytes. */
138 return 2;
139 }
140
141 static inline unsigned char read_status(struct si_sm_data *kcs)
142 {
143 return kcs->io->inputb(kcs->io, 1);
144 }
145
146 static inline unsigned char read_data(struct si_sm_data *kcs)
147 {
148 return kcs->io->inputb(kcs->io, 0);
149 }
150
151 static inline void write_cmd(struct si_sm_data *kcs, unsigned char data)
152 {
153 kcs->io->outputb(kcs->io, 1, data);
154 }
155
156 static inline void write_data(struct si_sm_data *kcs, unsigned char data)
157 {
158 kcs->io->outputb(kcs->io, 0, data);
159 }
160
161 /* Control codes. */
162 #define KCS_GET_STATUS_ABORT 0x60
163 #define KCS_WRITE_START 0x61
164 #define KCS_WRITE_END 0x62
165 #define KCS_READ_BYTE 0x68
166
167 /* Status bits. */
168 #define GET_STATUS_STATE(status) (((status) >> 6) & 0x03)
169 #define KCS_IDLE_STATE 0
170 #define KCS_READ_STATE 1
171 #define KCS_WRITE_STATE 2
172 #define KCS_ERROR_STATE 3
173 #define GET_STATUS_ATN(status) ((status) & 0x04)
174 #define GET_STATUS_IBF(status) ((status) & 0x02)
175 #define GET_STATUS_OBF(status) ((status) & 0x01)
176
177
178 static inline void write_next_byte(struct si_sm_data *kcs)
179 {
180 write_data(kcs, kcs->write_data[kcs->write_pos]);
181 (kcs->write_pos)++;
182 (kcs->write_count)--;
183 }
184
185 static inline void start_error_recovery(struct si_sm_data *kcs, char *reason)
186 {
187 (kcs->error_retries)++;
188 if (kcs->error_retries > MAX_ERROR_RETRIES) {
189 if (kcs_debug & KCS_DEBUG_ENABLE)
190 printk(KERN_DEBUG "ipmi_kcs_sm: kcs hosed: %s\n",
191 reason);
192 kcs->state = KCS_HOSED;
193 } else {
194 kcs->error0_timeout = jiffies + ERROR0_OBF_WAIT_JIFFIES;
195 kcs->state = KCS_ERROR0;
196 }
197 }
198
199 static inline void read_next_byte(struct si_sm_data *kcs)
200 {
201 if (kcs->read_pos >= MAX_KCS_READ_SIZE) {
202 /* Throw the data away and mark it truncated. */
203 read_data(kcs);
204 kcs->truncated = 1;
205 } else {
206 kcs->read_data[kcs->read_pos] = read_data(kcs);
207 (kcs->read_pos)++;
208 }
209 write_data(kcs, KCS_READ_BYTE);
210 }
211
212 static inline int check_ibf(struct si_sm_data *kcs, unsigned char status,
213 long time)
214 {
215 if (GET_STATUS_IBF(status)) {
216 kcs->ibf_timeout -= time;
217 if (kcs->ibf_timeout < 0) {
218 start_error_recovery(kcs, "IBF not ready in time");
219 kcs->ibf_timeout = IBF_RETRY_TIMEOUT;
220 return 1;
221 }
222 return 0;
223 }
224 kcs->ibf_timeout = IBF_RETRY_TIMEOUT;
225 return 1;
226 }
227
228 static inline int check_obf(struct si_sm_data *kcs, unsigned char status,
229 long time)
230 {
231 if (!GET_STATUS_OBF(status)) {
232 kcs->obf_timeout -= time;
233 if (kcs->obf_timeout < 0) {
234 kcs->obf_timeout = OBF_RETRY_TIMEOUT;
235 start_error_recovery(kcs, "OBF not ready in time");
236 return 1;
237 }
238 return 0;
239 }
240 kcs->obf_timeout = OBF_RETRY_TIMEOUT;
241 return 1;
242 }
243
244 static void clear_obf(struct si_sm_data *kcs, unsigned char status)
245 {
246 if (GET_STATUS_OBF(status))
247 read_data(kcs);
248 }
249
250 static void restart_kcs_transaction(struct si_sm_data *kcs)
251 {
252 kcs->write_count = kcs->orig_write_count;
253 kcs->write_pos = 0;
254 kcs->read_pos = 0;
255 kcs->state = KCS_WAIT_WRITE_START;
256 kcs->ibf_timeout = IBF_RETRY_TIMEOUT;
257 kcs->obf_timeout = OBF_RETRY_TIMEOUT;
258 write_cmd(kcs, KCS_WRITE_START);
259 }
260
261 static int start_kcs_transaction(struct si_sm_data *kcs, unsigned char *data,
262 unsigned int size)
263 {
264 unsigned int i;
265
266 if (size < 2)
267 return IPMI_REQ_LEN_INVALID_ERR;
268 if (size > MAX_KCS_WRITE_SIZE)
269 return IPMI_REQ_LEN_EXCEEDED_ERR;
270
271 if ((kcs->state != KCS_IDLE) && (kcs->state != KCS_HOSED))
272 return IPMI_NOT_IN_MY_STATE_ERR;
273
274 if (kcs_debug & KCS_DEBUG_MSG) {
275 printk(KERN_DEBUG "start_kcs_transaction -");
276 for (i = 0; i < size; i++)
277 printk(" %02x", (unsigned char) (data [i]));
278 printk("\n");
279 }
280 kcs->error_retries = 0;
281 memcpy(kcs->write_data, data, size);
282 kcs->write_count = size;
283 kcs->orig_write_count = size;
284 kcs->write_pos = 0;
285 kcs->read_pos = 0;
286 kcs->state = KCS_START_OP;
287 kcs->ibf_timeout = IBF_RETRY_TIMEOUT;
288 kcs->obf_timeout = OBF_RETRY_TIMEOUT;
289 return 0;
290 }
291
292 static int get_kcs_result(struct si_sm_data *kcs, unsigned char *data,
293 unsigned int length)
294 {
295 if (length < kcs->read_pos) {
296 kcs->read_pos = length;
297 kcs->truncated = 1;
298 }
299
300 memcpy(data, kcs->read_data, kcs->read_pos);
301
302 if ((length >= 3) && (kcs->read_pos < 3)) {
303 /* Guarantee that we return at least 3 bytes, with an
304 error in the third byte if it is too short. */
305 data[2] = IPMI_ERR_UNSPECIFIED;
306 kcs->read_pos = 3;
307 }
308 if (kcs->truncated) {
309 /*
310 * Report a truncated error. We might overwrite
311 * another error, but that's too bad, the user needs
312 * to know it was truncated.
313 */
314 data[2] = IPMI_ERR_MSG_TRUNCATED;
315 kcs->truncated = 0;
316 }
317
318 return kcs->read_pos;
319 }
320
321 /*
322 * This implements the state machine defined in the IPMI manual, see
323 * that for details on how this works. Divide that flowchart into
324 * sections delimited by "Wait for IBF" and this will become clear.
325 */
326 static enum si_sm_result kcs_event(struct si_sm_data *kcs, long time)
327 {
328 unsigned char status;
329 unsigned char state;
330
331 status = read_status(kcs);
332
333 if (kcs_debug & KCS_DEBUG_STATES)
334 printk(KERN_DEBUG "KCS: State = %d, %x\n", kcs->state, status);
335
336 /* All states wait for ibf, so just do it here. */
337 if (!check_ibf(kcs, status, time))
338 return SI_SM_CALL_WITH_DELAY;
339
340 /* Just about everything looks at the KCS state, so grab that, too. */
341 state = GET_STATUS_STATE(status);
342
343 switch (kcs->state) {
344 case KCS_IDLE:
345 /* If there's and interrupt source, turn it off. */
346 clear_obf(kcs, status);
347
348 if (GET_STATUS_ATN(status))
349 return SI_SM_ATTN;
350 else
351 return SI_SM_IDLE;
352
353 case KCS_START_OP:
354 if (state != KCS_IDLE_STATE) {
355 start_error_recovery(kcs,
356 "State machine not idle at start");
357 break;
358 }
359
360 clear_obf(kcs, status);
361 write_cmd(kcs, KCS_WRITE_START);
362 kcs->state = KCS_WAIT_WRITE_START;
363 break;
364
365 case KCS_WAIT_WRITE_START:
366 if (state != KCS_WRITE_STATE) {
367 start_error_recovery(
368 kcs,
369 "Not in write state at write start");
370 break;
371 }
372 read_data(kcs);
373 if (kcs->write_count == 1) {
374 write_cmd(kcs, KCS_WRITE_END);
375 kcs->state = KCS_WAIT_WRITE_END;
376 } else {
377 write_next_byte(kcs);
378 kcs->state = KCS_WAIT_WRITE;
379 }
380 break;
381
382 case KCS_WAIT_WRITE:
383 if (state != KCS_WRITE_STATE) {
384 start_error_recovery(kcs,
385 "Not in write state for write");
386 break;
387 }
388 clear_obf(kcs, status);
389 if (kcs->write_count == 1) {
390 write_cmd(kcs, KCS_WRITE_END);
391 kcs->state = KCS_WAIT_WRITE_END;
392 } else {
393 write_next_byte(kcs);
394 }
395 break;
396
397 case KCS_WAIT_WRITE_END:
398 if (state != KCS_WRITE_STATE) {
399 start_error_recovery(kcs,
400 "Not in write state"
401 " for write end");
402 break;
403 }
404 clear_obf(kcs, status);
405 write_next_byte(kcs);
406 kcs->state = KCS_WAIT_READ;
407 break;
408
409 case KCS_WAIT_READ:
410 if ((state != KCS_READ_STATE) && (state != KCS_IDLE_STATE)) {
411 start_error_recovery(
412 kcs,
413 "Not in read or idle in read state");
414 break;
415 }
416
417 if (state == KCS_READ_STATE) {
418 if (!check_obf(kcs, status, time))
419 return SI_SM_CALL_WITH_DELAY;
420 read_next_byte(kcs);
421 } else {
422 /*
423 * We don't implement this exactly like the state
424 * machine in the spec. Some broken hardware
425 * does not write the final dummy byte to the
426 * read register. Thus obf will never go high
427 * here. We just go straight to idle, and we
428 * handle clearing out obf in idle state if it
429 * happens to come in.
430 */
431 clear_obf(kcs, status);
432 kcs->orig_write_count = 0;
433 kcs->state = KCS_IDLE;
434 return SI_SM_TRANSACTION_COMPLETE;
435 }
436 break;
437
438 case KCS_ERROR0:
439 clear_obf(kcs, status);
440 status = read_status(kcs);
441 if (GET_STATUS_OBF(status))
442 /* controller isn't responding */
443 if (time_before(jiffies, kcs->error0_timeout))
444 return SI_SM_CALL_WITH_TICK_DELAY;
445 write_cmd(kcs, KCS_GET_STATUS_ABORT);
446 kcs->state = KCS_ERROR1;
447 break;
448
449 case KCS_ERROR1:
450 clear_obf(kcs, status);
451 write_data(kcs, 0);
452 kcs->state = KCS_ERROR2;
453 break;
454
455 case KCS_ERROR2:
456 if (state != KCS_READ_STATE) {
457 start_error_recovery(kcs,
458 "Not in read state for error2");
459 break;
460 }
461 if (!check_obf(kcs, status, time))
462 return SI_SM_CALL_WITH_DELAY;
463
464 clear_obf(kcs, status);
465 write_data(kcs, KCS_READ_BYTE);
466 kcs->state = KCS_ERROR3;
467 break;
468
469 case KCS_ERROR3:
470 if (state != KCS_IDLE_STATE) {
471 start_error_recovery(kcs,
472 "Not in idle state for error3");
473 break;
474 }
475
476 if (!check_obf(kcs, status, time))
477 return SI_SM_CALL_WITH_DELAY;
478
479 clear_obf(kcs, status);
480 if (kcs->orig_write_count) {
481 restart_kcs_transaction(kcs);
482 } else {
483 kcs->state = KCS_IDLE;
484 return SI_SM_TRANSACTION_COMPLETE;
485 }
486 break;
487
488 case KCS_HOSED:
489 break;
490 }
491
492 if (kcs->state == KCS_HOSED) {
493 init_kcs_data(kcs, kcs->io);
494 return SI_SM_HOSED;
495 }
496
497 return SI_SM_CALL_WITHOUT_DELAY;
498 }
499
500 static int kcs_size(void)
501 {
502 return sizeof(struct si_sm_data);
503 }
504
505 static int kcs_detect(struct si_sm_data *kcs)
506 {
507 /*
508 * It's impossible for the KCS status register to be all 1's,
509 * (assuming a properly functioning, self-initialized BMC)
510 * but that's what you get from reading a bogus address, so we
511 * test that first.
512 */
513 if (read_status(kcs) == 0xff)
514 return 1;
515
516 return 0;
517 }
518
519 static void kcs_cleanup(struct si_sm_data *kcs)
520 {
521 }
522
523 const struct si_sm_handlers kcs_smi_handlers = {
524 .init_data = init_kcs_data,
525 .start_transaction = start_kcs_transaction,
526 .get_result = get_kcs_result,
527 .event = kcs_event,
528 .detect = kcs_detect,
529 .cleanup = kcs_cleanup,
530 .size = kcs_size,
531 };