fsi/sbefifo: Add driver for the SBE FIFO
This driver provides an in-kernel and a user API for accessing the command FIFO of the SBE (Self Boot Engine) of the POWER9 processor, via the FSI bus. It provides an in-kernel interface to submit command and receive responses, along with a helper to locate and analyse the response status block. It's a simple synchronous submit() type API. The user interface uses the write/read interface that an earlier version of this driver already provided, however it has some specific limitations in order to keep the driver simple and avoid using up a lot of kernel memory: - The user should perform a single write() with the command and a single read() to get the response (with a buffer big enough to hold the entire response). - On a write() the command is simply "stored" into a kernel buffer, it is submitted as one operation on the subsequent read(). This allows to have the code write directly from the FIFO into the user buffer and avoid hogging the SBE between the write() and read() syscall as it's critical that the SBE be freed asap to respond to the host. An extra write() will simply replace the previously written command. - A write of a single 4 bytes containing the value 0x52534554 in big endian will trigger a reset request. No read is necessary, the write() call will return when the reset has been acknowledged or times out. - The command is limited to 4K bytes. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Tested-by: Joel Stanley <joel@jms.id.au> ---
This commit is contained in:
parent
52b7116e88
commit
9f4a8a2d7f
|
@ -32,4 +32,11 @@ config FSI_SCOM
|
|||
---help---
|
||||
This option enables an FSI based SCOM device driver.
|
||||
|
||||
config FSI_SBEFIFO
|
||||
tristate "SBEFIFO FSI client device driver"
|
||||
---help---
|
||||
This option enables an FSI based SBEFIFO device driver. The SBEFIFO is
|
||||
a pipe-like FSI device for communicating with the self boot engine
|
||||
(SBE) on POWER processors.
|
||||
|
||||
endif
|
||||
|
|
|
@ -3,3 +3,4 @@ obj-$(CONFIG_FSI) += fsi-core.o
|
|||
obj-$(CONFIG_FSI_MASTER_HUB) += fsi-master-hub.o
|
||||
obj-$(CONFIG_FSI_MASTER_GPIO) += fsi-master-gpio.o
|
||||
obj-$(CONFIG_FSI_SCOM) += fsi-scom.o
|
||||
obj-$(CONFIG_FSI_SBEFIFO) += fsi-sbefifo.o
|
||||
|
|
1005
drivers/fsi/fsi-sbefifo.c
Normal file
1005
drivers/fsi/fsi-sbefifo.c
Normal file
File diff suppressed because it is too large
Load Diff
33
include/linux/fsi-sbefifo.h
Normal file
33
include/linux/fsi-sbefifo.h
Normal file
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* SBEFIFO FSI Client device driver
|
||||
*
|
||||
* Copyright (C) IBM Corporation 2017
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERGCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef LINUX_FSI_SBEFIFO_H
|
||||
#define LINUX_FSI_SBEFIFO_H
|
||||
|
||||
#define SBEFIFO_CMD_PUT_OCC_SRAM 0xa404
|
||||
#define SBEFIFO_CMD_GET_OCC_SRAM 0xa403
|
||||
#define SBEFIFO_CMD_GET_SBE_FFDC 0xa801
|
||||
|
||||
#define SBEFIFO_MAX_FFDC_SIZE 0x2000
|
||||
|
||||
struct device;
|
||||
|
||||
int sbefifo_submit(struct device *dev, const __be32 *command, size_t cmd_len,
|
||||
__be32 *response, size_t *resp_len);
|
||||
|
||||
int sbefifo_parse_status(struct device *dev, u16 cmd, __be32 *response,
|
||||
size_t resp_len, size_t *data_len);
|
||||
|
||||
#endif /* LINUX_FSI_SBEFIFO_H */
|
Loading…
Reference in New Issue
Block a user