* [Qemu-devel] [PATCH v4 0/3] sPAPR: Support EEH Error Injection
@ 2015-08-10 7:13 Gavin Shan
2015-08-10 7:13 ` [Qemu-devel] [PATCH v4 1/3] linux-headers: Add eeh.h Gavin Shan
` (2 more replies)
0 siblings, 3 replies; 12+ messages in thread
From: Gavin Shan @ 2015-08-10 7:13 UTC (permalink / raw)
To: qemu-devel; +Cc: aik, qemu-ppc, Gavin Shan, david
The patchset depends on below Linux upstream commits:
commit ed3e81f ("powerpc/eeh: Move PE state constants around")
commit ec33d36 ("powerpc/eeh: Introduce eeh_pe_inject_err()")
According to PAPR specification 2.7, there're 3 RTAS calls relevent to error
injection: "ibm,open-errinjct", "ibm,close-errinjct", "ibm,errinjct". The
userland utility "errinjct" running on guest utilizes those 3 RTAS calls like
this way: Call "ibm,open-errinjct" that returns open-token, which is passed to
"ibm,errinjct" together with error specific arguments to do error injection.
Finally, to return the open-token by calling "ibm,close-errinject".
"ibm,errinjct" can be used to inject various errors, not limited to EEH errors.
However, this patchset is going to support injecting EEH errors only for VFIO
PCI devices.
=========
Changelog
=========
v3 -> v4:
* To record currently opened token, not next one as suggested by Alexey.
v2 -> v3:
* Replace random token number with incremental counter. Another boolean
variable to track if it's opened. Both of them are added to migration
stream.
* The return value from sPAPRPHBClass::eeh_inject_error() can be passed
to user directly. No need to do conversion.
* Corrected error code to RTAS_OUT_CLOSE_ERROR in rtas_ibm_errinjct().
* Don't expose error injection tokens for unsupported types.
v1 -> v2:
* Rebased to git://github.com/dgibson/qemu.git (branch: spapr-next)
* Remove specific PCI error types in hw/ppc/spapr.h. Use those macros
asm-powerpc/eeh.h instead.
Gavin Shan (3):
linux-headers: Add eeh.h
sPAPR: Support RTAS call ibm, {open, close}-errinjct
sPAPR: Support RTAS call ibm,errinjct
hw/ppc/spapr.c | 5 ++
hw/ppc/spapr_pci.c | 36 ++++++++++
hw/ppc/spapr_pci_vfio.c | 56 ++++++++++++++++
hw/ppc/spapr_rtas.c | 143 ++++++++++++++++++++++++++++++++++++++++
include/hw/pci-host/spapr.h | 2 +
include/hw/ppc/spapr.h | 17 ++++-
linux-headers/asm-powerpc/eeh.h | 56 ++++++++++++++++
7 files changed, 314 insertions(+), 1 deletion(-)
create mode 100644 linux-headers/asm-powerpc/eeh.h
--
2.1.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Qemu-devel] [PATCH v4 1/3] linux-headers: Add eeh.h
2015-08-10 7:13 [Qemu-devel] [PATCH v4 0/3] sPAPR: Support EEH Error Injection Gavin Shan
@ 2015-08-10 7:13 ` Gavin Shan
2015-08-11 9:11 ` Peter Maydell
2015-08-10 7:13 ` [Qemu-devel] [PATCH v4 2/3] sPAPR: Support RTAS call ibm, {open, close}-errinjct Gavin Shan
2015-08-10 7:13 ` [Qemu-devel] [PATCH v4 3/3] sPAPR: Support RTAS call ibm,errinjct Gavin Shan
2 siblings, 1 reply; 12+ messages in thread
From: Gavin Shan @ 2015-08-10 7:13 UTC (permalink / raw)
To: qemu-devel; +Cc: aik, qemu-ppc, Gavin Shan, david
The header file was introduced by following Linux upstream commits:
commit ed3e81f ("powerpc/eeh: Move PE state constants around")
commit ec33d36 ("powerpc/eeh: Introduce eeh_pe_inject_err()")
Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
---
| 56 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 56 insertions(+)
create mode 100644 linux-headers/asm-powerpc/eeh.h
--git a/linux-headers/asm-powerpc/eeh.h b/linux-headers/asm-powerpc/eeh.h
new file mode 100644
index 0000000..291b7d1
--- /dev/null
+++ b/linux-headers/asm-powerpc/eeh.h
@@ -0,0 +1,56 @@
+/*
+ * 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
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Copyright IBM Corp. 2015
+ *
+ * Authors: Gavin Shan <gwshan@linux.vnet.ibm.com>
+ */
+
+#ifndef _ASM_POWERPC_EEH_H
+#define _ASM_POWERPC_EEH_H
+
+/* PE states */
+#define EEH_PE_STATE_NORMAL 0 /* Normal state */
+#define EEH_PE_STATE_RESET 1 /* PE reset asserted */
+#define EEH_PE_STATE_STOPPED_IO_DMA 2 /* Frozen PE */
+#define EEH_PE_STATE_STOPPED_DMA 4 /* Stopped DMA only */
+#define EEH_PE_STATE_UNAVAIL 5 /* Unavailable */
+
+/* EEH error types and functions */
+#define EEH_ERR_TYPE_32 0 /* 32-bits error */
+#define EEH_ERR_TYPE_64 1 /* 64-bits error */
+#define EEH_ERR_FUNC_MIN 0
+#define EEH_ERR_FUNC_LD_MEM_ADDR 0 /* Memory load */
+#define EEH_ERR_FUNC_LD_MEM_DATA 1
+#define EEH_ERR_FUNC_LD_IO_ADDR 2 /* IO load */
+#define EEH_ERR_FUNC_LD_IO_DATA 3
+#define EEH_ERR_FUNC_LD_CFG_ADDR 4 /* Config load */
+#define EEH_ERR_FUNC_LD_CFG_DATA 5
+#define EEH_ERR_FUNC_ST_MEM_ADDR 6 /* Memory store */
+#define EEH_ERR_FUNC_ST_MEM_DATA 7
+#define EEH_ERR_FUNC_ST_IO_ADDR 8 /* IO store */
+#define EEH_ERR_FUNC_ST_IO_DATA 9
+#define EEH_ERR_FUNC_ST_CFG_ADDR 10 /* Config store */
+#define EEH_ERR_FUNC_ST_CFG_DATA 11
+#define EEH_ERR_FUNC_DMA_RD_ADDR 12 /* DMA read */
+#define EEH_ERR_FUNC_DMA_RD_DATA 13
+#define EEH_ERR_FUNC_DMA_RD_MASTER 14
+#define EEH_ERR_FUNC_DMA_RD_TARGET 15
+#define EEH_ERR_FUNC_DMA_WR_ADDR 16 /* DMA write */
+#define EEH_ERR_FUNC_DMA_WR_DATA 17
+#define EEH_ERR_FUNC_DMA_WR_MASTER 18
+#define EEH_ERR_FUNC_DMA_WR_TARGET 19
+#define EEH_ERR_FUNC_MAX 19
+
+#endif /* _ASM_POWERPC_EEH_H */
--
2.1.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PATCH v4 2/3] sPAPR: Support RTAS call ibm, {open, close}-errinjct
2015-08-10 7:13 [Qemu-devel] [PATCH v4 0/3] sPAPR: Support EEH Error Injection Gavin Shan
2015-08-10 7:13 ` [Qemu-devel] [PATCH v4 1/3] linux-headers: Add eeh.h Gavin Shan
@ 2015-08-10 7:13 ` Gavin Shan
2015-08-10 7:13 ` [Qemu-devel] [PATCH v4 3/3] sPAPR: Support RTAS call ibm,errinjct Gavin Shan
2 siblings, 0 replies; 12+ messages in thread
From: Gavin Shan @ 2015-08-10 7:13 UTC (permalink / raw)
To: qemu-devel; +Cc: aik, qemu-ppc, Gavin Shan, david
The patch supports RTAS calls "ibm,{open,close}-errinjct" to
manupliate the token, which is passed to RTAS call "ibm,errinjct"
to indicate the valid context for error injection. Each VM is
permitted to have only one token at once and we simply have one
random number for that.
Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
---
hw/ppc/spapr.c | 5 ++++
hw/ppc/spapr_rtas.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++
include/hw/ppc/spapr.h | 10 +++++++-
3 files changed, 80 insertions(+), 1 deletion(-)
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index dfd808f..c74184c 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -1225,6 +1225,11 @@ static const VMStateDescription vmstate_spapr = {
VMSTATE_UINT64_TEST(rtc_offset, sPAPRMachineState, version_before_3),
VMSTATE_PPC_TIMEBASE_V(tb, sPAPRMachineState, 2),
+
+ /* Error injection token */
+ VMSTATE_BOOL(is_errinjct_opened, sPAPRMachineState),
+ VMSTATE_UINT32(errinjct_token, sPAPRMachineState),
+
VMSTATE_END_OF_LIST()
},
};
diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c
index e99e25f..8405056 100644
--- a/hw/ppc/spapr_rtas.c
+++ b/hw/ppc/spapr_rtas.c
@@ -604,6 +604,68 @@ out:
rtas_st(rets, 0, rc);
}
+static void rtas_ibm_open_errinjct(PowerPCCPU *cpu,
+ sPAPRMachineState *spapr,
+ uint32_t token, uint32_t nargs,
+ target_ulong args, uint32_t nret,
+ target_ulong rets)
+{
+ int32_t ret;
+
+ /* Sanity check on number of arguments */
+ if ((nargs != 0) || (nret != 2)) {
+ ret = RTAS_OUT_PARAM_ERROR;
+ goto out;
+ }
+
+ /* Check if we already had token */
+ if (spapr->is_errinjct_opened) {
+ ret = RTAS_OUT_TOKEN_OPENED;
+ goto out;
+ }
+
+ /* Grab the token */
+ spapr->is_errinjct_opened = true;
+ rtas_st(rets, 0, ++spapr->errinjct_token);
+ ret = RTAS_OUT_SUCCESS;
+out:
+ rtas_st(rets, 1, ret);
+}
+
+static void rtas_ibm_close_errinjct(PowerPCCPU *cpu,
+ sPAPRMachineState *spapr,
+ uint32_t token, uint32_t nargs,
+ target_ulong args, uint32_t nret,
+ target_ulong rets)
+{
+ uint32_t open_token;
+ int32_t ret;
+
+ /* Sanity check on number of arguments */
+ if ((nargs != 1) || (nret != 1)) {
+ ret = RTAS_OUT_PARAM_ERROR;
+ goto out;
+ }
+
+ /* Check if we had opened token */
+ if (!spapr->is_errinjct_opened) {
+ ret = RTAS_OUT_CLOSE_ERROR;
+ goto out;
+ }
+
+ /* Match with the passed token */
+ open_token = rtas_ld(args, 0);
+ if (spapr->errinjct_token != open_token) {
+ ret = RTAS_OUT_CLOSE_ERROR;
+ goto out;
+ }
+
+ spapr->is_errinjct_opened = false;
+ ret = RTAS_OUT_SUCCESS;
+out:
+ rtas_st(rets, 0, ret);
+}
+
static struct rtas_call {
const char *name;
spapr_rtas_fn fn;
@@ -754,6 +816,10 @@ static void core_rtas_register_types(void)
rtas_get_sensor_state);
spapr_rtas_register(RTAS_IBM_CONFIGURE_CONNECTOR, "ibm,configure-connector",
rtas_ibm_configure_connector);
+ spapr_rtas_register(RTAS_IBM_OPEN_ERRINJCT, "ibm,open-errinjct",
+ rtas_ibm_open_errinjct);
+ spapr_rtas_register(RTAS_IBM_CLOSE_ERRINJCT, "ibm,close-errinjct",
+ rtas_ibm_close_errinjct);
}
type_init(core_rtas_register_types)
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index b6cb0d0..2430d48 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -73,6 +73,10 @@ struct sPAPRMachineState {
int htab_fd;
bool htab_fd_stale;
+ /* Error injection token */
+ bool is_errinjct_opened;
+ uint32_t errinjct_token;
+
/* RTAS state */
QTAILQ_HEAD(, sPAPRConfigureConnectorState) ccs_list;
@@ -412,6 +416,8 @@ int spapr_allocate_irq_block(int num, bool lsi, bool msi);
#define RTAS_OUT_BUSY -2
#define RTAS_OUT_PARAM_ERROR -3
#define RTAS_OUT_NOT_SUPPORTED -3
+#define RTAS_OUT_TOKEN_OPENED -4
+#define RTAS_OUT_CLOSE_ERROR -4
#define RTAS_OUT_NOT_AUTHORIZED -9002
/* RTAS tokens */
@@ -455,8 +461,10 @@ int spapr_allocate_irq_block(int num, bool lsi, bool msi);
#define RTAS_IBM_SET_SLOT_RESET (RTAS_TOKEN_BASE + 0x23)
#define RTAS_IBM_CONFIGURE_PE (RTAS_TOKEN_BASE + 0x24)
#define RTAS_IBM_SLOT_ERROR_DETAIL (RTAS_TOKEN_BASE + 0x25)
+#define RTAS_IBM_OPEN_ERRINJCT (RTAS_TOKEN_BASE + 0x26)
+#define RTAS_IBM_CLOSE_ERRINJCT (RTAS_TOKEN_BASE + 0x27)
-#define RTAS_TOKEN_MAX (RTAS_TOKEN_BASE + 0x26)
+#define RTAS_TOKEN_MAX (RTAS_TOKEN_BASE + 0x28)
/* RTAS ibm,get-system-parameter token values */
#define RTAS_SYSPARM_SPLPAR_CHARACTERISTICS 20
--
2.1.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PATCH v4 3/3] sPAPR: Support RTAS call ibm,errinjct
2015-08-10 7:13 [Qemu-devel] [PATCH v4 0/3] sPAPR: Support EEH Error Injection Gavin Shan
2015-08-10 7:13 ` [Qemu-devel] [PATCH v4 1/3] linux-headers: Add eeh.h Gavin Shan
2015-08-10 7:13 ` [Qemu-devel] [PATCH v4 2/3] sPAPR: Support RTAS call ibm, {open, close}-errinjct Gavin Shan
@ 2015-08-10 7:13 ` Gavin Shan
2 siblings, 0 replies; 12+ messages in thread
From: Gavin Shan @ 2015-08-10 7:13 UTC (permalink / raw)
To: qemu-devel; +Cc: aik, qemu-ppc, Gavin Shan, david
The patch supports RTAS call "ibm,errinjct" to allow injecting
EEH errors to VFIO PCI devices. The implementation is similiar
to EEH support for VFIO PCI devices: The RTAS request is captured
by QEMU and routed to sPAPRPHBClass::eeh_inject_error() where the
request is translated to VFIO container IOCTL command to be handled
by the host.
Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
---
hw/ppc/spapr_pci.c | 36 +++++++++++++++++++++
hw/ppc/spapr_pci_vfio.c | 56 +++++++++++++++++++++++++++++++++
hw/ppc/spapr_rtas.c | 77 +++++++++++++++++++++++++++++++++++++++++++++
include/hw/pci-host/spapr.h | 2 ++
include/hw/ppc/spapr.h | 9 +++++-
5 files changed, 179 insertions(+), 1 deletion(-)
diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
index cfd3b7b..050c3ea 100644
--- a/hw/ppc/spapr_pci.c
+++ b/hw/ppc/spapr_pci.c
@@ -682,6 +682,42 @@ param_error_exit:
rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR);
}
+int spapr_rtas_errinjct_ioa(sPAPRMachineState *spapr,
+ target_ulong param_buf,
+ bool is_64bits)
+{
+ sPAPRPHBState *sphb;
+ sPAPRPHBClass *spc;
+ uint64_t buid, addr, mask;
+ uint32_t func;
+
+ if (is_64bits) {
+ addr = ((uint64_t)rtas_ld(param_buf, 0) << 32) | rtas_ld(param_buf, 1);
+ mask = ((uint64_t)rtas_ld(param_buf, 2) << 32) | rtas_ld(param_buf, 3);
+ buid = ((uint64_t)rtas_ld(param_buf, 5) << 32) | rtas_ld(param_buf, 6);
+ func = rtas_ld(param_buf, 7);
+ } else {
+ addr = rtas_ld(param_buf, 0);
+ mask = rtas_ld(param_buf, 1);
+ buid = ((uint64_t)rtas_ld(param_buf, 3) << 32) | rtas_ld(param_buf, 4);
+ func = rtas_ld(param_buf, 5);
+ }
+
+ /* Find PHB */
+ sphb = spapr_pci_find_phb(spapr, buid);
+ if (!sphb) {
+ return RTAS_OUT_PARAM_ERROR;
+ }
+
+ spc = SPAPR_PCI_HOST_BRIDGE_GET_CLASS(sphb);
+ if (!spc->eeh_inject_error) {
+ return RTAS_OUT_PARAM_ERROR;
+ }
+
+ /* Handle the request */
+ return spc->eeh_inject_error(sphb, func, addr, mask, is_64bits);
+}
+
static int pci_spapr_swizzle(int slot, int pin)
{
return (slot + pin) % PCI_NUM_PINS;
diff --git a/hw/ppc/spapr_pci_vfio.c b/hw/ppc/spapr_pci_vfio.c
index cca45ed..a3674ee 100644
--- a/hw/ppc/spapr_pci_vfio.c
+++ b/hw/ppc/spapr_pci_vfio.c
@@ -17,6 +17,8 @@
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
+#include <asm/eeh.h>
+
#include "hw/ppc/spapr.h"
#include "hw/pci-host/spapr.h"
#include "hw/pci/msix.h"
@@ -250,6 +252,59 @@ static int spapr_phb_vfio_eeh_configure(sPAPRPHBState *sphb)
return RTAS_OUT_SUCCESS;
}
+static int spapr_phb_vfio_eeh_inject_error(sPAPRPHBState *sphb,
+ uint32_t func, uint64_t addr,
+ uint64_t mask, bool is_64bits)
+{
+ sPAPRPHBVFIOState *svphb = SPAPR_PCI_VFIO_HOST_BRIDGE(sphb);
+ struct vfio_eeh_pe_op op = {
+ .op = VFIO_EEH_PE_INJECT_ERR,
+ .argsz = sizeof(op)
+ };
+ int ret = RTAS_OUT_SUCCESS;
+
+ op.err.type = is_64bits ? EEH_ERR_TYPE_64 : EEH_ERR_TYPE_32;
+ op.err.addr = addr;
+ op.err.mask = mask;
+
+ switch (func) {
+ case EEH_ERR_FUNC_LD_MEM_ADDR:
+ case EEH_ERR_FUNC_LD_MEM_DATA:
+ case EEH_ERR_FUNC_LD_IO_ADDR:
+ case EEH_ERR_FUNC_LD_IO_DATA:
+ case EEH_ERR_FUNC_LD_CFG_ADDR:
+ case EEH_ERR_FUNC_LD_CFG_DATA:
+ case EEH_ERR_FUNC_ST_MEM_ADDR:
+ case EEH_ERR_FUNC_ST_MEM_DATA:
+ case EEH_ERR_FUNC_ST_IO_ADDR:
+ case EEH_ERR_FUNC_ST_IO_DATA:
+ case EEH_ERR_FUNC_ST_CFG_ADDR:
+ case EEH_ERR_FUNC_ST_CFG_DATA:
+ case EEH_ERR_FUNC_DMA_RD_ADDR:
+ case EEH_ERR_FUNC_DMA_RD_DATA:
+ case EEH_ERR_FUNC_DMA_RD_MASTER:
+ case EEH_ERR_FUNC_DMA_RD_TARGET:
+ case EEH_ERR_FUNC_DMA_WR_ADDR:
+ case EEH_ERR_FUNC_DMA_WR_DATA:
+ case EEH_ERR_FUNC_DMA_WR_MASTER:
+ op.err.func = func;
+ break;
+ default:
+ ret = RTAS_OUT_PARAM_ERROR;
+ goto out;
+ }
+
+ if (vfio_container_ioctl(&svphb->phb.iommu_as, svphb->iommugroupid,
+ VFIO_EEH_PE_OP, &op) < 0) {
+ ret = RTAS_OUT_HW_ERROR;
+ goto out;
+ }
+
+ ret = RTAS_OUT_SUCCESS;
+out:
+ return ret;
+}
+
static void spapr_phb_vfio_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
@@ -262,6 +317,7 @@ static void spapr_phb_vfio_class_init(ObjectClass *klass, void *data)
spc->eeh_get_state = spapr_phb_vfio_eeh_get_state;
spc->eeh_reset = spapr_phb_vfio_eeh_reset;
spc->eeh_configure = spapr_phb_vfio_eeh_configure;
+ spc->eeh_inject_error = spapr_phb_vfio_eeh_inject_error;
}
static const TypeInfo spapr_phb_vfio_info = {
diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c
index 8405056..5645f43 100644
--- a/hw/ppc/spapr_rtas.c
+++ b/hw/ppc/spapr_rtas.c
@@ -632,6 +632,54 @@ out:
rtas_st(rets, 1, ret);
}
+static void rtas_ibm_errinjct(PowerPCCPU *cpu,
+ sPAPRMachineState *spapr,
+ uint32_t token, uint32_t nargs,
+ target_ulong args, uint32_t nret,
+ target_ulong rets)
+{
+ target_ulong param_buf;
+ uint32_t type, open_token;
+ int32_t ret;
+
+ /* Sanity check on number of arguments */
+ if ((nargs != 3) || (nret != 1)) {
+ ret = RTAS_OUT_PARAM_ERROR;
+ goto out;
+ }
+
+ /* Check if we have opened token */
+ open_token = rtas_ld(args, 1);
+ if (!spapr->is_errinjct_opened ||
+ spapr->errinjct_token != open_token) {
+ ret = RTAS_OUT_CLOSE_ERROR;
+ goto out;
+ }
+
+ /* The parameter buffer should be 1KB aligned */
+ param_buf = rtas_ld(args, 2);
+ if (param_buf & 0x3ff) {
+ ret = RTAS_OUT_PARAM_ERROR;
+ goto out;
+ }
+
+ /* Check the error type */
+ type = rtas_ld(args, 0);
+ switch (type) {
+ case RTAS_ERRINJCT_TYPE_IOA_BUS_ERROR:
+ ret = spapr_rtas_errinjct_ioa(spapr, param_buf, false);
+ break;
+ case RTAS_ERRINJCT_TYPE_IOA_BUS_ERROR64:
+ ret = spapr_rtas_errinjct_ioa(spapr, param_buf, true);
+ break;
+ default:
+ ret = RTAS_OUT_PARAM_ERROR;
+ }
+
+out:
+ rtas_st(rets, 0, ret);
+}
+
static void rtas_ibm_close_errinjct(PowerPCCPU *cpu,
sPAPRMachineState *spapr,
uint32_t token, uint32_t nargs,
@@ -723,6 +771,33 @@ int spapr_rtas_device_tree_setup(void *fdt, hwaddr rtas_addr,
int i;
uint32_t lrdr_capacity[5];
MachineState *machine = MACHINE(qdev_get_machine());
+ char errinjct_tokens[1024];
+ int fdt_offset, offset;
+ const int tokens[] = {
+ RTAS_ERRINJCT_TYPE_IOA_BUS_ERROR,
+ RTAS_ERRINJCT_TYPE_IOA_BUS_ERROR64
+ };
+ const char *token_strings[] = {
+ "ioa-bus-error",
+ "ioa-bus-error-64"
+ };
+
+ /* ibm,errinjct-tokens */
+ offset = 0;
+ for (i = 0; i < ARRAY_SIZE(tokens); i++) {
+ offset += sprintf(errinjct_tokens + offset, "%s", token_strings[i]);
+ errinjct_tokens[offset++] = '\0';
+ *(int *)(&errinjct_tokens[offset]) = tokens[i];
+ offset += sizeof(int);
+ }
+
+ fdt_offset = fdt_path_offset(fdt, "/rtas");
+ ret = fdt_setprop(fdt, fdt_offset, "ibm,errinjct-tokens",
+ errinjct_tokens, offset);
+ if (ret < 0) {
+ fprintf(stderr, "Couldn't add ibm,errinjct-tokens\n");
+ return ret;
+ }
ret = fdt_add_mem_rsv(fdt, rtas_addr, rtas_size);
if (ret < 0) {
@@ -818,6 +893,8 @@ static void core_rtas_register_types(void)
rtas_ibm_configure_connector);
spapr_rtas_register(RTAS_IBM_OPEN_ERRINJCT, "ibm,open-errinjct",
rtas_ibm_open_errinjct);
+ spapr_rtas_register(RTAS_IBM_ERRINJCT, "ibm,errinjct",
+ rtas_ibm_errinjct);
spapr_rtas_register(RTAS_IBM_CLOSE_ERRINJCT, "ibm,close-errinjct",
rtas_ibm_close_errinjct);
}
diff --git a/include/hw/pci-host/spapr.h b/include/hw/pci-host/spapr.h
index 5322b56..069300d 100644
--- a/include/hw/pci-host/spapr.h
+++ b/include/hw/pci-host/spapr.h
@@ -53,6 +53,8 @@ struct sPAPRPHBClass {
int (*eeh_get_state)(sPAPRPHBState *sphb, int *state);
int (*eeh_reset)(sPAPRPHBState *sphb, int option);
int (*eeh_configure)(sPAPRPHBState *sphb);
+ int (*eeh_inject_error)(sPAPRPHBState *sphb, uint32_t func,
+ uint64_t addr, uint64_t mask, bool is_64bits);
};
typedef struct spapr_pci_msi {
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index 2430d48..a0c8c4c 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -409,6 +409,10 @@ int spapr_allocate_irq_block(int num, bool lsi, bool msi);
#define RTAS_SLOT_TEMP_ERR_LOG 1
#define RTAS_SLOT_PERM_ERR_LOG 2
+/* ibm,errinjct */
+#define RTAS_ERRINJCT_TYPE_IOA_BUS_ERROR 7
+#define RTAS_ERRINJCT_TYPE_IOA_BUS_ERROR64 8
+
/* RTAS return codes */
#define RTAS_OUT_SUCCESS 0
#define RTAS_OUT_NO_ERRORS_FOUND 1
@@ -463,8 +467,9 @@ int spapr_allocate_irq_block(int num, bool lsi, bool msi);
#define RTAS_IBM_SLOT_ERROR_DETAIL (RTAS_TOKEN_BASE + 0x25)
#define RTAS_IBM_OPEN_ERRINJCT (RTAS_TOKEN_BASE + 0x26)
#define RTAS_IBM_CLOSE_ERRINJCT (RTAS_TOKEN_BASE + 0x27)
+#define RTAS_IBM_ERRINJCT (RTAS_TOKEN_BASE + 0x28)
-#define RTAS_TOKEN_MAX (RTAS_TOKEN_BASE + 0x28)
+#define RTAS_TOKEN_MAX (RTAS_TOKEN_BASE + 0x29)
/* RTAS ibm,get-system-parameter token values */
#define RTAS_SYSPARM_SPLPAR_CHARACTERISTICS 20
@@ -596,6 +601,8 @@ int spapr_dma_dt(void *fdt, int node_off, const char *propname,
int spapr_tcet_dma_dt(void *fdt, int node_off, const char *propname,
sPAPRTCETable *tcet);
void spapr_pci_switch_vga(bool big_endian);
+int spapr_rtas_errinjct_ioa(sPAPRMachineState *spapr,
+ target_ulong param_buf, bool is_64bits);
void spapr_hotplug_req_add_event(sPAPRDRConnector *drc);
void spapr_hotplug_req_remove_event(sPAPRDRConnector *drc);
--
2.1.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH v4 1/3] linux-headers: Add eeh.h
2015-08-10 7:13 ` [Qemu-devel] [PATCH v4 1/3] linux-headers: Add eeh.h Gavin Shan
@ 2015-08-11 9:11 ` Peter Maydell
2015-08-12 1:55 ` David Gibson
` (2 more replies)
0 siblings, 3 replies; 12+ messages in thread
From: Peter Maydell @ 2015-08-11 9:11 UTC (permalink / raw)
To: Gavin Shan
Cc: Alexey Kardashevskiy, qemu-ppc@nongnu.org, QEMU Developers,
David Gibson
On 10 August 2015 at 08:13, Gavin Shan <gwshan@linux.vnet.ibm.com> wrote:
> The header file was introduced by following Linux upstream commits:
>
> commit ed3e81f ("powerpc/eeh: Move PE state constants around")
> commit ec33d36 ("powerpc/eeh: Introduce eeh_pe_inject_err()")
>
> Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
> ---
> linux-headers/asm-powerpc/eeh.h | 56 +++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 56 insertions(+)
> create mode 100644 linux-headers/asm-powerpc/eeh.h
Shouldn't this be added by updating scripts/update-linux-headers.sh
and then doing a plain "synchronize headers against kernel version $X" ?
Otherwise you won't get any future changes to this file.
thanks
-- PMM
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH v4 1/3] linux-headers: Add eeh.h
2015-08-11 9:11 ` Peter Maydell
@ 2015-08-12 1:55 ` David Gibson
2015-08-12 2:00 ` Alexey Kardashevskiy
2015-08-24 7:23 ` Gavin Shan
2 siblings, 0 replies; 12+ messages in thread
From: David Gibson @ 2015-08-12 1:55 UTC (permalink / raw)
To: Peter Maydell
Cc: Alexey Kardashevskiy, qemu-ppc@nongnu.org, Gavin Shan,
QEMU Developers
[-- Attachment #1: Type: text/plain, Size: 1044 bytes --]
On Tue, Aug 11, 2015 at 10:11:03AM +0100, Peter Maydell wrote:
> On 10 August 2015 at 08:13, Gavin Shan <gwshan@linux.vnet.ibm.com> wrote:
> > The header file was introduced by following Linux upstream commits:
> >
> > commit ed3e81f ("powerpc/eeh: Move PE state constants around")
> > commit ec33d36 ("powerpc/eeh: Introduce eeh_pe_inject_err()")
> >
> > Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
> > ---
> > linux-headers/asm-powerpc/eeh.h | 56 +++++++++++++++++++++++++++++++++++++++++
> > 1 file changed, 56 insertions(+)
> > create mode 100644 linux-headers/asm-powerpc/eeh.h
>
> Shouldn't this be added by updating scripts/update-linux-headers.sh
> and then doing a plain "synchronize headers against kernel version $X" ?
> Otherwise you won't get any future changes to this file.
Indeed it should.
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
[-- Attachment #2: Type: application/pgp-signature, Size: 819 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH v4 1/3] linux-headers: Add eeh.h
2015-08-11 9:11 ` Peter Maydell
2015-08-12 1:55 ` David Gibson
@ 2015-08-12 2:00 ` Alexey Kardashevskiy
2015-08-13 1:30 ` Gavin Shan
2015-08-24 7:23 ` Gavin Shan
2 siblings, 1 reply; 12+ messages in thread
From: Alexey Kardashevskiy @ 2015-08-12 2:00 UTC (permalink / raw)
To: Peter Maydell, Gavin Shan
Cc: qemu-ppc@nongnu.org, QEMU Developers, David Gibson
On 08/11/2015 07:11 PM, Peter Maydell wrote:
> On 10 August 2015 at 08:13, Gavin Shan <gwshan@linux.vnet.ibm.com> wrote:
>> The header file was introduced by following Linux upstream commits:
>>
>> commit ed3e81f ("powerpc/eeh: Move PE state constants around")
>> commit ec33d36 ("powerpc/eeh: Introduce eeh_pe_inject_err()")
>>
>> Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
>> ---
>> linux-headers/asm-powerpc/eeh.h | 56 +++++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 56 insertions(+)
>> create mode 100644 linux-headers/asm-powerpc/eeh.h
>
> Shouldn't this be added by updating scripts/update-linux-headers.sh
> and then doing a plain "synchronize headers against kernel version $X" ?
I also thought this is the protocol but then I looked into the git history
and discovered this is not always the case :)
> Otherwise you won't get any future changes to this file.
>
> thanks
> -- PMM
>
--
Alexey
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH v4 1/3] linux-headers: Add eeh.h
2015-08-12 2:00 ` Alexey Kardashevskiy
@ 2015-08-13 1:30 ` Gavin Shan
2015-08-13 1:42 ` David Gibson
0 siblings, 1 reply; 12+ messages in thread
From: Gavin Shan @ 2015-08-13 1:30 UTC (permalink / raw)
To: Alexey Kardashevskiy
Cc: Peter Maydell, David Gibson, qemu-ppc@nongnu.org, Gavin Shan,
QEMU Developers
On Wed, Aug 12, 2015 at 12:00:35PM +1000, Alexey Kardashevskiy wrote:
>On 08/11/2015 07:11 PM, Peter Maydell wrote:
>>On 10 August 2015 at 08:13, Gavin Shan <gwshan@linux.vnet.ibm.com> wrote:
>>>The header file was introduced by following Linux upstream commits:
>>>
>>> commit ed3e81f ("powerpc/eeh: Move PE state constants around")
>>> commit ec33d36 ("powerpc/eeh: Introduce eeh_pe_inject_err()")
>>>
>>>Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
>>>---
>>> linux-headers/asm-powerpc/eeh.h | 56 +++++++++++++++++++++++++++++++++++++++++
>>> 1 file changed, 56 insertions(+)
>>> create mode 100644 linux-headers/asm-powerpc/eeh.h
>>
>>Shouldn't this be added by updating scripts/update-linux-headers.sh
>>and then doing a plain "synchronize headers against kernel version $X" ?
>
>
>I also thought this is the protocol but then I looked into the git history
>and discovered this is not always the case :)
>
>
So should I use scripts/update-linux-headers.sh or what I had is fine?
>>Otherwise you won't get any future changes to this file.
>>
Thanks,
Gavin
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH v4 1/3] linux-headers: Add eeh.h
2015-08-13 1:30 ` Gavin Shan
@ 2015-08-13 1:42 ` David Gibson
2015-08-14 1:10 ` Gavin Shan
0 siblings, 1 reply; 12+ messages in thread
From: David Gibson @ 2015-08-13 1:42 UTC (permalink / raw)
To: Gavin Shan
Cc: Alexey Kardashevskiy, Peter Maydell, qemu-ppc@nongnu.org,
QEMU Developers
[-- Attachment #1: Type: text/plain, Size: 1485 bytes --]
On Thu, Aug 13, 2015 at 11:30:37AM +1000, Gavin Shan wrote:
> On Wed, Aug 12, 2015 at 12:00:35PM +1000, Alexey Kardashevskiy wrote:
> >On 08/11/2015 07:11 PM, Peter Maydell wrote:
> >>On 10 August 2015 at 08:13, Gavin Shan <gwshan@linux.vnet.ibm.com> wrote:
> >>>The header file was introduced by following Linux upstream commits:
> >>>
> >>> commit ed3e81f ("powerpc/eeh: Move PE state constants around")
> >>> commit ec33d36 ("powerpc/eeh: Introduce eeh_pe_inject_err()")
> >>>
> >>>Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
> >>>---
> >>> linux-headers/asm-powerpc/eeh.h | 56 +++++++++++++++++++++++++++++++++++++++++
> >>> 1 file changed, 56 insertions(+)
> >>> create mode 100644 linux-headers/asm-powerpc/eeh.h
> >>
> >>Shouldn't this be added by updating scripts/update-linux-headers.sh
> >>and then doing a plain "synchronize headers against kernel version $X" ?
> >
> >
> >I also thought this is the protocol but then I looked into the git history
> >and discovered this is not always the case :)
> >
> >
>
> So should I use scripts/update-linux-headers.sh or what I had is
> fine?
Please use update-linux-headers.sh - and make sure you also update the
script itself (if necessary) so it will pull in future updates to
eeh.h
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
[-- Attachment #2: Type: application/pgp-signature, Size: 819 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH v4 1/3] linux-headers: Add eeh.h
2015-08-13 1:42 ` David Gibson
@ 2015-08-14 1:10 ` Gavin Shan
0 siblings, 0 replies; 12+ messages in thread
From: Gavin Shan @ 2015-08-14 1:10 UTC (permalink / raw)
To: David Gibson
Cc: Alexey Kardashevskiy, Peter Maydell, qemu-ppc@nongnu.org,
Gavin Shan, QEMU Developers
On Thu, Aug 13, 2015 at 11:42:59AM +1000, David Gibson wrote:
>On Thu, Aug 13, 2015 at 11:30:37AM +1000, Gavin Shan wrote:
>> On Wed, Aug 12, 2015 at 12:00:35PM +1000, Alexey Kardashevskiy wrote:
>> >On 08/11/2015 07:11 PM, Peter Maydell wrote:
>> >>On 10 August 2015 at 08:13, Gavin Shan <gwshan@linux.vnet.ibm.com> wrote:
>> >>>The header file was introduced by following Linux upstream commits:
>> >>>
>> >>> commit ed3e81f ("powerpc/eeh: Move PE state constants around")
>> >>> commit ec33d36 ("powerpc/eeh: Introduce eeh_pe_inject_err()")
>> >>>
>> >>>Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
>> >>>---
>> >>> linux-headers/asm-powerpc/eeh.h | 56 +++++++++++++++++++++++++++++++++++++++++
>> >>> 1 file changed, 56 insertions(+)
>> >>> create mode 100644 linux-headers/asm-powerpc/eeh.h
>> >>
>> >>Shouldn't this be added by updating scripts/update-linux-headers.sh
>> >>and then doing a plain "synchronize headers against kernel version $X" ?
>> >
>> >
>> >I also thought this is the protocol but then I looked into the git history
>> >and discovered this is not always the case :)
>> >
>> >
>>
>> So should I use scripts/update-linux-headers.sh or what I had is
>> fine?
>
>Please use update-linux-headers.sh - and make sure you also update the
>script itself (if necessary) so it will pull in future updates to
>eeh.h
>
Sure, thanks, David. It will be covered in next revision.
Thanks,
Gavin
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH v4 1/3] linux-headers: Add eeh.h
2015-08-11 9:11 ` Peter Maydell
2015-08-12 1:55 ` David Gibson
2015-08-12 2:00 ` Alexey Kardashevskiy
@ 2015-08-24 7:23 ` Gavin Shan
2015-08-24 12:00 ` Gavin Shan
2 siblings, 1 reply; 12+ messages in thread
From: Gavin Shan @ 2015-08-24 7:23 UTC (permalink / raw)
To: Peter Maydell
Cc: Alexey Kardashevskiy, David Gibson, qemu-ppc@nongnu.org,
Gavin Shan, QEMU Developers
On Tue, Aug 11, 2015 at 10:11:03AM +0100, Peter Maydell wrote:
>On 10 August 2015 at 08:13, Gavin Shan <gwshan@linux.vnet.ibm.com> wrote:
>> The header file was introduced by following Linux upstream commits:
>>
>> commit ed3e81f ("powerpc/eeh: Move PE state constants around")
>> commit ec33d36 ("powerpc/eeh: Introduce eeh_pe_inject_err()")
>>
>> Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
>> ---
>> linux-headers/asm-powerpc/eeh.h | 56 +++++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 56 insertions(+)
>> create mode 100644 linux-headers/asm-powerpc/eeh.h
>
>Shouldn't this be added by updating scripts/update-linux-headers.sh
>and then doing a plain "synchronize headers against kernel version $X" ?
>Otherwise you won't get any future changes to this file.
>
When I started to sync header files with 4.2.0-rc2 kernel, I found lots
of changes existing in the Linux kernel wasn't updated to QEMU source
tree. Some changes were introduced into the kernel in 2013, for example
commit 24bc69da ("PCI: Clean up MSI/MSI-X capability #defines"). Is there
any reason why the header file wasn't updated in time?
Also, "struct virtio_pci_cfg_cap" has been removed from 4.2.0-rc2 kernel,
but QEMU is still using it. If all header files are sync'ed with this
kernel, then the source code should be adjusted as well. I'm not sure
it's reasonable for someone who (like me) is unfamiliar with VFIO to do
so? :-)
Thanks,
Gavin
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH v4 1/3] linux-headers: Add eeh.h
2015-08-24 7:23 ` Gavin Shan
@ 2015-08-24 12:00 ` Gavin Shan
0 siblings, 0 replies; 12+ messages in thread
From: Gavin Shan @ 2015-08-24 12:00 UTC (permalink / raw)
To: Gavin Shan
Cc: Alexey Kardashevskiy, Peter Maydell, qemu-ppc@nongnu.org,
QEMU Developers, David Gibson
On Mon, Aug 24, 2015 at 05:23:15PM +1000, Gavin Shan wrote:
>On Tue, Aug 11, 2015 at 10:11:03AM +0100, Peter Maydell wrote:
>>On 10 August 2015 at 08:13, Gavin Shan <gwshan@linux.vnet.ibm.com> wrote:
>>> The header file was introduced by following Linux upstream commits:
>>>
>>> commit ed3e81f ("powerpc/eeh: Move PE state constants around")
>>> commit ec33d36 ("powerpc/eeh: Introduce eeh_pe_inject_err()")
>>>
>>> Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
>>> ---
>>> linux-headers/asm-powerpc/eeh.h | 56 +++++++++++++++++++++++++++++++++++++++++
>>> 1 file changed, 56 insertions(+)
>>> create mode 100644 linux-headers/asm-powerpc/eeh.h
>>
>>Shouldn't this be added by updating scripts/update-linux-headers.sh
>>and then doing a plain "synchronize headers against kernel version $X" ?
>>Otherwise you won't get any future changes to this file.
>>
>
>When I started to sync header files with 4.2.0-rc2 kernel, I found lots
>of changes existing in the Linux kernel wasn't updated to QEMU source
>tree. Some changes were introduced into the kernel in 2013, for example
>commit 24bc69da ("PCI: Clean up MSI/MSI-X capability #defines"). Is there
>any reason why the header file wasn't updated in time?
>
Anyway, I'll sync all headers with 4.2.rc8 and change the source code
accordingly to use those macros valid in 4.2.rc8.
>Also, "struct virtio_pci_cfg_cap" has been removed from 4.2.0-rc2 kernel,
>but QEMU is still using it. If all header files are sync'ed with this
>kernel, then the source code should be adjusted as well. I'm not sure
>it's reasonable for someone who (like me) is unfamiliar with VFIO to do
>so? :-)
Please ignore this question. I was using wrong Linux git repository.
After switching to Linux upstream (mainline), I didn't find this issue.
Thanks,
Gavin
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2015-08-24 12:00 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-08-10 7:13 [Qemu-devel] [PATCH v4 0/3] sPAPR: Support EEH Error Injection Gavin Shan
2015-08-10 7:13 ` [Qemu-devel] [PATCH v4 1/3] linux-headers: Add eeh.h Gavin Shan
2015-08-11 9:11 ` Peter Maydell
2015-08-12 1:55 ` David Gibson
2015-08-12 2:00 ` Alexey Kardashevskiy
2015-08-13 1:30 ` Gavin Shan
2015-08-13 1:42 ` David Gibson
2015-08-14 1:10 ` Gavin Shan
2015-08-24 7:23 ` Gavin Shan
2015-08-24 12:00 ` Gavin Shan
2015-08-10 7:13 ` [Qemu-devel] [PATCH v4 2/3] sPAPR: Support RTAS call ibm, {open, close}-errinjct Gavin Shan
2015-08-10 7:13 ` [Qemu-devel] [PATCH v4 3/3] sPAPR: Support RTAS call ibm,errinjct Gavin Shan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).