1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) IBM Corporation 2017
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERGCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
15 #include <linux/device.h>
16 #include <linux/errno.h>
18 #include <linux/fsi.h>
19 #include <linux/fsi-sbefifo.h>
20 #include <linux/kernel.h>
21 #include <linux/cdev.h>
22 #include <linux/module.h>
23 #include <linux/mutex.h>
25 #include <linux/of_platform.h>
26 #include <linux/platform_device.h>
27 #include <linux/sched.h>
28 #include <linux/slab.h>
29 #include <linux/uaccess.h>
30 #include <linux/delay.h>
31 #include <linux/uio.h>
32 #include <linux/vmalloc.h>
35 #include <uapi/linux/fsi.h>
38 * The SBEFIFO is a pipe-like FSI device for communicating with
39 * the self boot engine on POWER processors.
42 #define DEVICE_NAME "sbefifo"
43 #define FSI_ENGID_SBE 0x22
50 #define SBEFIFO_UP 0x00 /* FSI -> Host */
51 #define SBEFIFO_DOWN 0x40 /* Host -> FSI */
53 /* Per-bank registers */
54 #define SBEFIFO_FIFO 0x00 /* The FIFO itself */
55 #define SBEFIFO_STS 0x04 /* Status register */
56 #define SBEFIFO_STS_PARITY_ERR 0x20000000
57 #define SBEFIFO_STS_RESET_REQ 0x02000000
58 #define SBEFIFO_STS_GOT_EOT 0x00800000
59 #define SBEFIFO_STS_MAX_XFER_LIMIT 0x00400000
60 #define SBEFIFO_STS_FULL 0x00200000
61 #define SBEFIFO_STS_EMPTY 0x00100000
62 #define SBEFIFO_STS_ECNT_MASK 0x000f0000
63 #define SBEFIFO_STS_ECNT_SHIFT 16
64 #define SBEFIFO_STS_VALID_MASK 0x0000ff00
65 #define SBEFIFO_STS_VALID_SHIFT 8
66 #define SBEFIFO_STS_EOT_MASK 0x000000ff
67 #define SBEFIFO_STS_EOT_SHIFT 0
68 #define SBEFIFO_EOT_RAISE 0x08 /* (Up only) Set End Of Transfer */
69 #define SBEFIFO_REQ_RESET 0x0C /* (Up only) Reset Request */
70 #define SBEFIFO_PERFORM_RESET 0x10 /* (Down only) Perform Reset */
71 #define SBEFIFO_EOT_ACK 0x14 /* (Down only) Acknowledge EOT */
72 #define SBEFIFO_DOWN_MAX 0x18 /* (Down only) Max transfer */
74 /* CFAM GP Mailbox SelfBoot Message register */
75 #define CFAM_GP_MBOX_SBM_ADDR 0x2824 /* Converted 0x2809 */
77 #define CFAM_SBM_SBE_BOOTED 0x80000000
78 #define CFAM_SBM_SBE_ASYNC_FFDC 0x40000000
79 #define CFAM_SBM_SBE_STATE_MASK 0x00f00000
80 #define CFAM_SBM_SBE_STATE_SHIFT 20
84 SBE_STATE_UNKNOWN
= 0x0, // Unknown, initial state
85 SBE_STATE_IPLING
= 0x1, // IPL'ing - autonomous mode (transient)
86 SBE_STATE_ISTEP
= 0x2, // ISTEP - Running IPL by steps (transient)
87 SBE_STATE_MPIPL
= 0x3, // MPIPL
88 SBE_STATE_RUNTIME
= 0x4, // SBE Runtime
89 SBE_STATE_DMT
= 0x5, // Dead Man Timer State (transient)
90 SBE_STATE_DUMP
= 0x6, // Dumping
91 SBE_STATE_FAILURE
= 0x7, // Internal SBE failure
92 SBE_STATE_QUIESCE
= 0x8, // Final state - needs SBE reset to get out
96 #define SBEFIFO_FIFO_DEPTH 8
99 #define sbefifo_empty(sts) ((sts) & SBEFIFO_STS_EMPTY)
100 #define sbefifo_full(sts) ((sts) & SBEFIFO_STS_FULL)
101 #define sbefifo_parity_err(sts) ((sts) & SBEFIFO_STS_PARITY_ERR)
102 #define sbefifo_populated(sts) (((sts) & SBEFIFO_STS_ECNT_MASK) >> SBEFIFO_STS_ECNT_SHIFT)
103 #define sbefifo_vacant(sts) (SBEFIFO_FIFO_DEPTH - sbefifo_populated(sts))
104 #define sbefifo_eot_set(sts) (((sts) & SBEFIFO_STS_EOT_MASK) >> SBEFIFO_STS_EOT_SHIFT)
106 /* Reset request timeout in ms */
107 #define SBEFIFO_RESET_TIMEOUT 10000
109 /* Timeouts for commands in ms */
110 #define SBEFIFO_TIMEOUT_START_CMD 10000
111 #define SBEFIFO_TIMEOUT_IN_CMD 1000
112 #define SBEFIFO_TIMEOUT_START_RSP 10000
113 #define SBEFIFO_TIMEOUT_IN_RSP 1000
115 /* Other constants */
116 #define SBEFIFO_MAX_USER_CMD_LEN (0x100000 + PAGE_SIZE)
117 #define SBEFIFO_RESET_MAGIC 0x52534554 /* "RSET" */
121 #define SBEFIFO_MAGIC 0x53424546 /* "SBEF" */
122 struct fsi_device
*fsi_dev
;
130 u32 timeout_in_cmd_ms
;
131 u32 timeout_start_rsp_ms
;
134 struct sbefifo_user
{
135 struct sbefifo
*sbefifo
;
136 struct mutex file_lock
;
144 static DEFINE_MUTEX(sbefifo_ffdc_mutex
);
146 static ssize_t
timeout_show(struct device
*dev
, struct device_attribute
*attr
,
149 struct sbefifo
*sbefifo
= container_of(dev
, struct sbefifo
, dev
);
151 return sysfs_emit(buf
, "%d\n", sbefifo
->timed_out
? 1 : 0);
153 static DEVICE_ATTR_RO(timeout
);
155 static void __sbefifo_dump_ffdc(struct device
*dev
, const __be32
*ffdc
,
156 size_t ffdc_sz
, bool internal
)
159 #define FFDC_LSIZE 60
160 static char ffdc_line
[FFDC_LSIZE
];
166 dev_err(dev
, "SBE invalid FFDC package size %zd\n", ffdc_sz
);
169 w0
= be32_to_cpu(*(ffdc
++));
170 w1
= be32_to_cpu(*(ffdc
++));
171 w2
= be32_to_cpu(*(ffdc
++));
173 if ((w0
>> 16) != 0xFFDC) {
174 dev_err(dev
, "SBE invalid FFDC package signature %08x %08x %08x\n",
180 dev_err(dev
, "SBE FFDC package len %d words but only %zd remaining\n",
186 dev_warn(dev
, "+---- SBE FFDC package %d for async err -----+\n",
189 dev_warn(dev
, "+---- SBE FFDC package %d for cmd %02x:%02x -----+\n",
190 pack
++, (w1
>> 8) & 0xff, w1
& 0xff);
192 dev_warn(dev
, "| Response code: %08x |\n", w2
);
193 dev_warn(dev
, "|-------------------------------------------|\n");
194 for (i
= 0; i
< w0
; i
++) {
197 p
+= sprintf(p
, "| %04x:", i
<< 4);
199 p
+= sprintf(p
, " %08x", be32_to_cpu(*(ffdc
++)));
201 if ((i
& 3) == 3 || i
== (w0
- 1)) {
202 while ((i
& 3) < 3) {
203 p
+= sprintf(p
, " ");
206 dev_warn(dev
, "%s |\n", ffdc_line
);
209 dev_warn(dev
, "+-------------------------------------------+\n");
213 static void sbefifo_dump_ffdc(struct device
*dev
, const __be32
*ffdc
,
214 size_t ffdc_sz
, bool internal
)
216 mutex_lock(&sbefifo_ffdc_mutex
);
217 __sbefifo_dump_ffdc(dev
, ffdc
, ffdc_sz
, internal
);
218 mutex_unlock(&sbefifo_ffdc_mutex
);
221 int sbefifo_parse_status(struct device
*dev
, u16 cmd
, __be32
*response
,
222 size_t resp_len
, size_t *data_len
)
228 pr_debug("sbefifo: cmd %04x, response too small: %zd\n",
232 dh
= be32_to_cpu(response
[resp_len
- 1]);
233 if (dh
> resp_len
|| dh
< 3) {
234 dev_err(dev
, "SBE cmd %02x:%02x status offset out of range: %d/%zd\n",
235 cmd
>> 8, cmd
& 0xff, dh
, resp_len
);
238 s0
= be32_to_cpu(response
[resp_len
- dh
]);
239 s1
= be32_to_cpu(response
[resp_len
- dh
+ 1]);
240 if (((s0
>> 16) != 0xC0DE) || ((s0
& 0xffff) != cmd
)) {
241 dev_err(dev
, "SBE cmd %02x:%02x, status signature invalid: 0x%08x 0x%08x\n",
242 cmd
>> 8, cmd
& 0xff, s0
, s1
);
247 dev_warn(dev
, "SBE error cmd %02x:%02x status=%04x:%04x\n",
248 cmd
>> 8, cmd
& 0xff, s1
>> 16, s1
& 0xffff);
250 sbefifo_dump_ffdc(dev
, &response
[resp_len
- dh
+ 2],
254 *data_len
= resp_len
- dh
;
257 * Primary status don't have the top bit set, so can't be confused with
258 * Linux negative error codes, so return the status word whole.
262 EXPORT_SYMBOL_GPL(sbefifo_parse_status
);
264 static int sbefifo_regr(struct sbefifo
*sbefifo
, int reg
, u32
*word
)
269 rc
= fsi_device_read(sbefifo
->fsi_dev
, reg
, &raw_word
,
274 *word
= be32_to_cpu(raw_word
);
279 static int sbefifo_regw(struct sbefifo
*sbefifo
, int reg
, u32 word
)
281 __be32 raw_word
= cpu_to_be32(word
);
283 return fsi_device_write(sbefifo
->fsi_dev
, reg
, &raw_word
,
287 static int sbefifo_check_sbe_state(struct sbefifo
*sbefifo
)
293 rc
= fsi_slave_read(sbefifo
->fsi_dev
->slave
, CFAM_GP_MBOX_SBM_ADDR
,
294 &raw_word
, sizeof(raw_word
));
297 sbm
= be32_to_cpu(raw_word
);
299 /* SBE booted at all ? */
300 if (!(sbm
& CFAM_SBM_SBE_BOOTED
))
303 /* Check its state */
304 switch ((sbm
& CFAM_SBM_SBE_STATE_MASK
) >> CFAM_SBM_SBE_STATE_SHIFT
) {
305 case SBE_STATE_UNKNOWN
:
309 case SBE_STATE_IPLING
:
310 case SBE_STATE_ISTEP
:
311 case SBE_STATE_MPIPL
:
312 case SBE_STATE_RUNTIME
:
313 case SBE_STATE_DUMP
: /* Not sure about that one */
315 case SBE_STATE_FAILURE
:
316 case SBE_STATE_QUIESCE
:
320 /* Is there async FFDC available ? Remember it */
321 if (sbm
& CFAM_SBM_SBE_ASYNC_FFDC
)
322 sbefifo
->async_ffdc
= true;
327 /* Don't flip endianness of data to/from FIFO, just pass through. */
328 static int sbefifo_down_read(struct sbefifo
*sbefifo
, __be32
*word
)
330 return fsi_device_read(sbefifo
->fsi_dev
, SBEFIFO_DOWN
, word
,
334 static int sbefifo_up_write(struct sbefifo
*sbefifo
, __be32 word
)
336 return fsi_device_write(sbefifo
->fsi_dev
, SBEFIFO_UP
, &word
,
340 static int sbefifo_request_reset(struct sbefifo
*sbefifo
)
342 struct device
*dev
= &sbefifo
->fsi_dev
->dev
;
343 unsigned long end_time
;
347 dev_dbg(dev
, "Requesting FIFO reset\n");
349 /* Mark broken first, will be cleared if reset succeeds */
350 sbefifo
->broken
= true;
352 /* Send reset request */
353 rc
= sbefifo_regw(sbefifo
, SBEFIFO_UP
| SBEFIFO_REQ_RESET
, 1);
355 dev_err(dev
, "Sending reset request failed, rc=%d\n", rc
);
359 /* Wait for it to complete */
360 end_time
= jiffies
+ msecs_to_jiffies(SBEFIFO_RESET_TIMEOUT
);
361 while (!time_after(jiffies
, end_time
)) {
362 rc
= sbefifo_regr(sbefifo
, SBEFIFO_UP
| SBEFIFO_STS
, &status
);
364 dev_err(dev
, "Failed to read UP fifo status during reset"
369 if (!(status
& SBEFIFO_STS_RESET_REQ
)) {
370 dev_dbg(dev
, "FIFO reset done\n");
371 sbefifo
->broken
= false;
377 dev_err(dev
, "FIFO reset timed out\n");
382 static int sbefifo_cleanup_hw(struct sbefifo
*sbefifo
)
384 struct device
*dev
= &sbefifo
->fsi_dev
->dev
;
385 u32 up_status
, down_status
;
386 bool need_reset
= false;
389 rc
= sbefifo_check_sbe_state(sbefifo
);
391 dev_dbg(dev
, "SBE state=%d\n", rc
);
395 /* If broken, we don't need to look at status, go straight to reset */
399 rc
= sbefifo_regr(sbefifo
, SBEFIFO_UP
| SBEFIFO_STS
, &up_status
);
401 dev_err(dev
, "Cleanup: Reading UP status failed, rc=%d\n", rc
);
403 /* Will try reset again on next attempt at using it */
404 sbefifo
->broken
= true;
408 rc
= sbefifo_regr(sbefifo
, SBEFIFO_DOWN
| SBEFIFO_STS
, &down_status
);
410 dev_err(dev
, "Cleanup: Reading DOWN status failed, rc=%d\n", rc
);
412 /* Will try reset again on next attempt at using it */
413 sbefifo
->broken
= true;
417 /* The FIFO already contains a reset request from the SBE ? */
418 if (down_status
& SBEFIFO_STS_RESET_REQ
) {
419 dev_info(dev
, "Cleanup: FIFO reset request set, resetting\n");
420 rc
= sbefifo_regw(sbefifo
, SBEFIFO_DOWN
, SBEFIFO_PERFORM_RESET
);
422 sbefifo
->broken
= true;
423 dev_err(dev
, "Cleanup: Reset reg write failed, rc=%d\n", rc
);
426 sbefifo
->broken
= false;
430 /* Parity error on either FIFO ? */
431 if ((up_status
| down_status
) & SBEFIFO_STS_PARITY_ERR
)
434 /* Either FIFO not empty ? */
435 if (!((up_status
& down_status
) & SBEFIFO_STS_EMPTY
))
441 dev_info(dev
, "Cleanup: FIFO not clean (up=0x%08x down=0x%08x)\n",
442 up_status
, down_status
);
446 /* Mark broken, will be cleared if/when reset succeeds */
447 return sbefifo_request_reset(sbefifo
);
450 static int sbefifo_wait(struct sbefifo
*sbefifo
, bool up
,
451 u32
*status
, unsigned long timeout
)
453 struct device
*dev
= &sbefifo
->fsi_dev
->dev
;
454 unsigned long end_time
;
459 dev_vdbg(dev
, "Wait on %s fifo...\n", up
? "up" : "down");
461 addr
= (up
? SBEFIFO_UP
: SBEFIFO_DOWN
) | SBEFIFO_STS
;
463 end_time
= jiffies
+ timeout
;
464 while (!time_after(jiffies
, end_time
)) {
466 rc
= sbefifo_regr(sbefifo
, addr
, &sts
);
468 dev_err(dev
, "FSI error %d reading status register\n", rc
);
471 if (!up
&& sbefifo_parity_err(sts
)) {
472 dev_err(dev
, "Parity error in DOWN FIFO\n");
475 ready
= !(up
? sbefifo_full(sts
) : sbefifo_empty(sts
));
480 sysfs_notify(&sbefifo
->dev
.kobj
, NULL
, dev_attr_timeout
.attr
.name
);
481 sbefifo
->timed_out
= true;
482 dev_err(dev
, "%s FIFO Timeout (%u ms)! status=%08x\n",
483 up
? "UP" : "DOWN", jiffies_to_msecs(timeout
), sts
);
486 dev_vdbg(dev
, "End of wait status: %08x\n", sts
);
488 sbefifo
->timed_out
= false;
494 static int sbefifo_send_command(struct sbefifo
*sbefifo
,
495 const __be32
*command
, size_t cmd_len
)
497 struct device
*dev
= &sbefifo
->fsi_dev
->dev
;
498 size_t len
, chunk
, vacant
= 0, remaining
= cmd_len
;
499 unsigned long timeout
;
503 dev_dbg(dev
, "sending command (%zd words, cmd=%04x)\n",
504 cmd_len
, be32_to_cpu(command
[1]));
506 /* As long as there's something to send */
507 timeout
= msecs_to_jiffies(SBEFIFO_TIMEOUT_START_CMD
);
509 /* Wait for room in the FIFO */
510 rc
= sbefifo_wait(sbefifo
, true, &status
, timeout
);
513 timeout
= msecs_to_jiffies(sbefifo
->timeout_in_cmd_ms
);
515 vacant
= sbefifo_vacant(status
);
516 len
= chunk
= min(vacant
, remaining
);
518 dev_vdbg(dev
, " status=%08x vacant=%zd chunk=%zd\n",
519 status
, vacant
, chunk
);
521 /* Write as much as we can */
523 rc
= sbefifo_up_write(sbefifo
, *(command
++));
525 dev_err(dev
, "FSI error %d writing UP FIFO\n", rc
);
533 /* If there's no room left, wait for some to write EOT */
535 rc
= sbefifo_wait(sbefifo
, true, &status
, timeout
);
541 rc
= sbefifo_regw(sbefifo
, SBEFIFO_UP
| SBEFIFO_EOT_RAISE
, 0);
543 dev_err(dev
, "FSI error %d writing EOT\n", rc
);
547 static int sbefifo_read_response(struct sbefifo
*sbefifo
, struct iov_iter
*response
)
549 struct device
*dev
= &sbefifo
->fsi_dev
->dev
;
551 unsigned long timeout
;
552 bool overflow
= false;
557 dev_dbg(dev
, "reading response, buflen = %zd\n", iov_iter_count(response
));
559 timeout
= msecs_to_jiffies(sbefifo
->timeout_start_rsp_ms
);
561 /* Grab FIFO status (this will handle parity errors) */
562 rc
= sbefifo_wait(sbefifo
, false, &status
, timeout
);
564 dev_dbg(dev
, "timeout waiting (%u ms)\n", jiffies_to_msecs(timeout
));
567 timeout
= msecs_to_jiffies(SBEFIFO_TIMEOUT_IN_RSP
);
570 len
= sbefifo_populated(status
);
571 eot_set
= sbefifo_eot_set(status
);
573 dev_dbg(dev
, " chunk size %zd eot_set=0x%x\n", len
, eot_set
);
575 /* Go through the chunk */
578 rc
= sbefifo_down_read(sbefifo
, &data
);
582 /* Was it an EOT ? */
583 if (eot_set
& 0x80) {
585 * There should be nothing else in the FIFO,
586 * if there is, mark broken, this will force
587 * a reset on next use, but don't fail the
591 dev_warn(dev
, "FIFO read hit"
592 " EOT with still %zd data\n",
594 sbefifo
->broken
= true;
598 rc
= sbefifo_regw(sbefifo
,
599 SBEFIFO_DOWN
| SBEFIFO_EOT_ACK
, 0);
602 * If that write fail, still complete the request but mark
603 * the fifo as broken for subsequent reset (not much else
607 dev_err(dev
, "FSI error %d ack'ing EOT\n", rc
);
608 sbefifo
->broken
= true;
611 /* Tell whether we overflowed */
612 return overflow
? -EOVERFLOW
: 0;
615 /* Store it if there is room */
616 if (iov_iter_count(response
) >= sizeof(__be32
)) {
617 if (copy_to_iter(&data
, sizeof(__be32
), response
) < sizeof(__be32
))
620 dev_vdbg(dev
, "Response overflowed !\n");
629 /* Shouldn't happen */
633 static int sbefifo_do_command(struct sbefifo
*sbefifo
,
634 const __be32
*command
, size_t cmd_len
,
635 struct iov_iter
*response
)
637 /* Try sending the command */
638 int rc
= sbefifo_send_command(sbefifo
, command
, cmd_len
);
642 /* Now, get the response */
643 return sbefifo_read_response(sbefifo
, response
);
646 static void sbefifo_collect_async_ffdc(struct sbefifo
*sbefifo
)
648 struct device
*dev
= &sbefifo
->fsi_dev
->dev
;
649 struct iov_iter ffdc_iter
;
650 struct kvec ffdc_iov
;
656 sbefifo
->async_ffdc
= false;
657 ffdc
= vmalloc(SBEFIFO_MAX_FFDC_SIZE
);
659 dev_err(dev
, "Failed to allocate SBE FFDC buffer\n");
662 ffdc_iov
.iov_base
= ffdc
;
663 ffdc_iov
.iov_len
= SBEFIFO_MAX_FFDC_SIZE
;
664 iov_iter_kvec(&ffdc_iter
, ITER_DEST
, &ffdc_iov
, 1, SBEFIFO_MAX_FFDC_SIZE
);
665 cmd
[0] = cpu_to_be32(2);
666 cmd
[1] = cpu_to_be32(SBEFIFO_CMD_GET_SBE_FFDC
);
667 rc
= sbefifo_do_command(sbefifo
, cmd
, 2, &ffdc_iter
);
669 dev_err(dev
, "Error %d retrieving SBE FFDC\n", rc
);
672 ffdc_sz
= SBEFIFO_MAX_FFDC_SIZE
- iov_iter_count(&ffdc_iter
);
673 ffdc_sz
/= sizeof(__be32
);
674 rc
= sbefifo_parse_status(dev
, SBEFIFO_CMD_GET_SBE_FFDC
, ffdc
,
677 dev_err(dev
, "Error %d decoding SBE FFDC\n", rc
);
681 sbefifo_dump_ffdc(dev
, ffdc
, ffdc_sz
, true);
687 static int __sbefifo_submit(struct sbefifo
*sbefifo
,
688 const __be32
*command
, size_t cmd_len
,
689 struct iov_iter
*response
)
691 struct device
*dev
= &sbefifo
->fsi_dev
->dev
;
697 if (cmd_len
< 2 || be32_to_cpu(command
[0]) != cmd_len
) {
698 dev_vdbg(dev
, "Invalid command len %zd (header: %d)\n",
699 cmd_len
, be32_to_cpu(command
[0]));
703 /* First ensure the HW is in a clean state */
704 rc
= sbefifo_cleanup_hw(sbefifo
);
708 /* Look for async FFDC first if any */
709 if (sbefifo
->async_ffdc
)
710 sbefifo_collect_async_ffdc(sbefifo
);
712 rc
= sbefifo_do_command(sbefifo
, command
, cmd_len
, response
);
713 if (rc
!= 0 && rc
!= -EOVERFLOW
)
718 * On failure, attempt a reset. Ignore the result, it will mark
719 * the fifo broken if the reset fails
721 sbefifo_request_reset(sbefifo
);
723 /* Return original error */
728 * sbefifo_submit() - Submit and SBE fifo command and receive response
729 * @dev: The sbefifo device
730 * @command: The raw command data
731 * @cmd_len: The command size (in 32-bit words)
732 * @response: The output response buffer
733 * @resp_len: In: Response buffer size, Out: Response size
735 * This will perform the entire operation. If the response buffer
736 * overflows, returns -EOVERFLOW
738 int sbefifo_submit(struct device
*dev
, const __be32
*command
, size_t cmd_len
,
739 __be32
*response
, size_t *resp_len
)
741 struct sbefifo
*sbefifo
;
742 struct iov_iter resp_iter
;
743 struct kvec resp_iov
;
749 sbefifo
= dev_get_drvdata(dev
);
752 if (WARN_ON_ONCE(sbefifo
->magic
!= SBEFIFO_MAGIC
))
754 if (!resp_len
|| !command
|| !response
)
757 /* Prepare iov iterator */
758 rbytes
= (*resp_len
) * sizeof(__be32
);
759 resp_iov
.iov_base
= response
;
760 resp_iov
.iov_len
= rbytes
;
761 iov_iter_kvec(&resp_iter
, ITER_DEST
, &resp_iov
, 1, rbytes
);
763 /* Perform the command */
764 rc
= mutex_lock_interruptible(&sbefifo
->lock
);
767 rc
= __sbefifo_submit(sbefifo
, command
, cmd_len
, &resp_iter
);
768 mutex_unlock(&sbefifo
->lock
);
770 /* Extract the response length */
771 rbytes
-= iov_iter_count(&resp_iter
);
772 *resp_len
= rbytes
/ sizeof(__be32
);
776 EXPORT_SYMBOL_GPL(sbefifo_submit
);
779 * Char device interface
782 static void sbefifo_release_command(struct sbefifo_user
*user
)
784 if (is_vmalloc_addr(user
->pending_cmd
))
785 vfree(user
->pending_cmd
);
786 user
->pending_cmd
= NULL
;
787 user
->pending_len
= 0;
790 static int sbefifo_user_open(struct inode
*inode
, struct file
*file
)
792 struct sbefifo
*sbefifo
= container_of(inode
->i_cdev
, struct sbefifo
, cdev
);
793 struct sbefifo_user
*user
;
795 user
= kzalloc(sizeof(struct sbefifo_user
), GFP_KERNEL
);
799 file
->private_data
= user
;
800 user
->sbefifo
= sbefifo
;
801 user
->cmd_page
= (void *)__get_free_page(GFP_KERNEL
);
802 if (!user
->cmd_page
) {
806 mutex_init(&user
->file_lock
);
807 user
->cmd_timeout_ms
= SBEFIFO_TIMEOUT_IN_CMD
;
808 user
->read_timeout_ms
= SBEFIFO_TIMEOUT_START_RSP
;
813 static ssize_t
sbefifo_user_read(struct file
*file
, char __user
*buf
,
814 size_t len
, loff_t
*offset
)
816 struct sbefifo_user
*user
= file
->private_data
;
817 struct sbefifo
*sbefifo
;
818 struct iov_iter resp_iter
;
819 struct iovec resp_iov
;
825 sbefifo
= user
->sbefifo
;
829 mutex_lock(&user
->file_lock
);
831 /* Cronus relies on -EAGAIN after a short read */
832 if (user
->pending_len
== 0) {
836 if (user
->pending_len
< 8) {
840 cmd_len
= user
->pending_len
>> 2;
842 /* Prepare iov iterator */
843 resp_iov
.iov_base
= buf
;
844 resp_iov
.iov_len
= len
;
845 iov_iter_init(&resp_iter
, ITER_DEST
, &resp_iov
, 1, len
);
847 /* Perform the command */
848 rc
= mutex_lock_interruptible(&sbefifo
->lock
);
851 sbefifo
->timeout_in_cmd_ms
= user
->cmd_timeout_ms
;
852 sbefifo
->timeout_start_rsp_ms
= user
->read_timeout_ms
;
853 rc
= __sbefifo_submit(sbefifo
, user
->pending_cmd
, cmd_len
, &resp_iter
);
854 sbefifo
->timeout_start_rsp_ms
= SBEFIFO_TIMEOUT_START_RSP
;
855 sbefifo
->timeout_in_cmd_ms
= SBEFIFO_TIMEOUT_IN_CMD
;
856 mutex_unlock(&sbefifo
->lock
);
860 /* Extract the response length */
861 rc
= len
- iov_iter_count(&resp_iter
);
863 sbefifo_release_command(user
);
864 mutex_unlock(&user
->file_lock
);
868 static ssize_t
sbefifo_user_write(struct file
*file
, const char __user
*buf
,
869 size_t len
, loff_t
*offset
)
871 struct sbefifo_user
*user
= file
->private_data
;
872 struct sbefifo
*sbefifo
;
877 sbefifo
= user
->sbefifo
;
878 if (len
> SBEFIFO_MAX_USER_CMD_LEN
)
883 mutex_lock(&user
->file_lock
);
885 /* Can we use the pre-allocate buffer ? If not, allocate */
886 if (len
<= PAGE_SIZE
)
887 user
->pending_cmd
= user
->cmd_page
;
889 user
->pending_cmd
= vmalloc(len
);
890 if (!user
->pending_cmd
) {
895 /* Copy the command into the staging buffer */
896 if (copy_from_user(user
->pending_cmd
, buf
, len
)) {
901 /* Check for the magic reset command */
902 if (len
== 4 && be32_to_cpu(*(__be32
*)user
->pending_cmd
) ==
903 SBEFIFO_RESET_MAGIC
) {
905 /* Clear out any pending command */
906 user
->pending_len
= 0;
908 /* Trigger reset request */
909 rc
= mutex_lock_interruptible(&sbefifo
->lock
);
912 rc
= sbefifo_request_reset(user
->sbefifo
);
913 mutex_unlock(&sbefifo
->lock
);
919 /* Update the staging buffer size */
920 user
->pending_len
= len
;
922 if (!user
->pending_len
)
923 sbefifo_release_command(user
);
925 mutex_unlock(&user
->file_lock
);
927 /* And that's it, we'll issue the command on a read */
931 static int sbefifo_user_release(struct inode
*inode
, struct file
*file
)
933 struct sbefifo_user
*user
= file
->private_data
;
938 sbefifo_release_command(user
);
939 free_page((unsigned long)user
->cmd_page
);
945 static int sbefifo_cmd_timeout(struct sbefifo_user
*user
, void __user
*argp
)
947 struct device
*dev
= &user
->sbefifo
->dev
;
950 if (get_user(timeout
, (__u32 __user
*)argp
))
954 user
->cmd_timeout_ms
= SBEFIFO_TIMEOUT_IN_CMD
;
955 dev_dbg(dev
, "Command timeout reset to %us\n", user
->cmd_timeout_ms
/ 1000);
959 user
->cmd_timeout_ms
= timeout
* 1000; /* user timeout is in sec */
960 dev_dbg(dev
, "Command timeout set to %us\n", timeout
);
964 static int sbefifo_read_timeout(struct sbefifo_user
*user
, void __user
*argp
)
966 struct device
*dev
= &user
->sbefifo
->dev
;
969 if (get_user(timeout
, (__u32 __user
*)argp
))
973 user
->read_timeout_ms
= SBEFIFO_TIMEOUT_START_RSP
;
974 dev_dbg(dev
, "Timeout reset to %us\n", user
->read_timeout_ms
/ 1000);
978 user
->read_timeout_ms
= timeout
* 1000; /* user timeout is in sec */
979 dev_dbg(dev
, "Timeout set to %us\n", timeout
);
983 static long sbefifo_user_ioctl(struct file
*file
, unsigned int cmd
, unsigned long arg
)
985 struct sbefifo_user
*user
= file
->private_data
;
991 mutex_lock(&user
->file_lock
);
993 case FSI_SBEFIFO_CMD_TIMEOUT_SECONDS
:
994 rc
= sbefifo_cmd_timeout(user
, (void __user
*)arg
);
996 case FSI_SBEFIFO_READ_TIMEOUT_SECONDS
:
997 rc
= sbefifo_read_timeout(user
, (void __user
*)arg
);
1000 mutex_unlock(&user
->file_lock
);
1004 static const struct file_operations sbefifo_fops
= {
1005 .owner
= THIS_MODULE
,
1006 .open
= sbefifo_user_open
,
1007 .read
= sbefifo_user_read
,
1008 .write
= sbefifo_user_write
,
1009 .release
= sbefifo_user_release
,
1010 .unlocked_ioctl
= sbefifo_user_ioctl
,
1013 static void sbefifo_free(struct device
*dev
)
1015 struct sbefifo
*sbefifo
= container_of(dev
, struct sbefifo
, dev
);
1017 put_device(&sbefifo
->fsi_dev
->dev
);
1025 static int sbefifo_probe(struct device
*dev
)
1027 struct fsi_device
*fsi_dev
= to_fsi_dev(dev
);
1028 struct sbefifo
*sbefifo
;
1029 struct device_node
*np
;
1030 struct platform_device
*child
;
1031 char child_name
[32];
1032 int rc
, didx
, child_idx
= 0;
1034 dev_dbg(dev
, "Found sbefifo device\n");
1036 sbefifo
= kzalloc(sizeof(*sbefifo
), GFP_KERNEL
);
1040 /* Grab a reference to the device (parent of our cdev), we'll drop it later */
1041 if (!get_device(dev
)) {
1046 sbefifo
->magic
= SBEFIFO_MAGIC
;
1047 sbefifo
->fsi_dev
= fsi_dev
;
1048 dev_set_drvdata(dev
, sbefifo
);
1049 mutex_init(&sbefifo
->lock
);
1050 sbefifo
->timeout_in_cmd_ms
= SBEFIFO_TIMEOUT_IN_CMD
;
1051 sbefifo
->timeout_start_rsp_ms
= SBEFIFO_TIMEOUT_START_RSP
;
1053 /* Create chardev for userspace access */
1054 sbefifo
->dev
.type
= &fsi_cdev_type
;
1055 sbefifo
->dev
.parent
= dev
;
1056 sbefifo
->dev
.release
= sbefifo_free
;
1057 device_initialize(&sbefifo
->dev
);
1059 /* Allocate a minor in the FSI space */
1060 rc
= fsi_get_new_minor(fsi_dev
, fsi_dev_sbefifo
, &sbefifo
->dev
.devt
, &didx
);
1064 dev_set_name(&sbefifo
->dev
, "sbefifo%d", didx
);
1065 cdev_init(&sbefifo
->cdev
, &sbefifo_fops
);
1066 rc
= cdev_device_add(&sbefifo
->cdev
, &sbefifo
->dev
);
1068 dev_err(dev
, "Error %d creating char device %s\n",
1069 rc
, dev_name(&sbefifo
->dev
));
1070 goto err_free_minor
;
1073 /* Create platform devs for dts child nodes (occ, etc) */
1074 for_each_available_child_of_node(dev
->of_node
, np
) {
1075 snprintf(child_name
, sizeof(child_name
), "%s-dev%d",
1076 dev_name(&sbefifo
->dev
), child_idx
++);
1077 child
= of_platform_device_create(np
, child_name
, dev
);
1079 dev_warn(dev
, "failed to create child %s dev\n",
1083 device_create_file(&sbefifo
->dev
, &dev_attr_timeout
);
1087 fsi_free_minor(sbefifo
->dev
.devt
);
1089 put_device(&sbefifo
->dev
);
1093 static int sbefifo_unregister_child(struct device
*dev
, void *data
)
1095 struct platform_device
*child
= to_platform_device(dev
);
1097 of_device_unregister(child
);
1099 of_node_clear_flag(dev
->of_node
, OF_POPULATED
);
1104 static int sbefifo_remove(struct device
*dev
)
1106 struct sbefifo
*sbefifo
= dev_get_drvdata(dev
);
1108 dev_dbg(dev
, "Removing sbefifo device...\n");
1110 device_remove_file(&sbefifo
->dev
, &dev_attr_timeout
);
1112 mutex_lock(&sbefifo
->lock
);
1113 sbefifo
->dead
= true;
1114 mutex_unlock(&sbefifo
->lock
);
1116 cdev_device_del(&sbefifo
->cdev
, &sbefifo
->dev
);
1117 fsi_free_minor(sbefifo
->dev
.devt
);
1118 device_for_each_child(dev
, NULL
, sbefifo_unregister_child
);
1119 put_device(&sbefifo
->dev
);
1124 static const struct fsi_device_id sbefifo_ids
[] = {
1126 .engine_type
= FSI_ENGID_SBE
,
1127 .version
= FSI_VERSION_ANY
,
1132 static struct fsi_driver sbefifo_drv
= {
1133 .id_table
= sbefifo_ids
,
1135 .name
= DEVICE_NAME
,
1136 .bus
= &fsi_bus_type
,
1137 .probe
= sbefifo_probe
,
1138 .remove
= sbefifo_remove
,
1142 static int sbefifo_init(void)
1144 return fsi_driver_register(&sbefifo_drv
);
1147 static void sbefifo_exit(void)
1149 fsi_driver_unregister(&sbefifo_drv
);
1152 module_init(sbefifo_init
);
1153 module_exit(sbefifo_exit
);
1154 MODULE_LICENSE("GPL");
1155 MODULE_AUTHOR("Brad Bishop <bradleyb@fuzziesquirrel.com>");
1156 MODULE_AUTHOR("Eddie James <eajames@linux.vnet.ibm.com>");
1157 MODULE_AUTHOR("Andrew Jeffery <andrew@aj.id.au>");
1158 MODULE_AUTHOR("Benjamin Herrenschmidt <benh@kernel.crashing.org>");
1159 MODULE_DESCRIPTION("Linux device interface to the POWER Self Boot Engine");