diff options
author | Vasant Hegde <hegdevasant@linux.vnet.ibm.com> | 2017-05-26 14:37:05 +0530 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2017-06-08 17:24:10 +1000 |
commit | a0811f87b84e71c7314d0fd92c34e9715b400817 (patch) | |
tree | 4787af3a3f2dcf3f3267b3ed056a8d7ed5f992fb /hw/sbe-p9.c | |
parent | 9e888546f1ec322ac74b1e58b670d294ae3ea4fc (diff) | |
download | skiboot-a0811f87b84e71c7314d0fd92c34e9715b400817.zip skiboot-a0811f87b84e71c7314d0fd92c34e9715b400817.tar.gz skiboot-a0811f87b84e71c7314d0fd92c34e9715b400817.tar.bz2 |
SBE: Add passthrough command support
SBE sends passthrough command. We have to capture this interrupt and
send event to HBRT via opal-prd (user space daemon).
This patch adds minimal SBE code to capture SBE interrupt and send
event to opal-prd. Next patch will add opal-prd (user space) support.
CC: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'hw/sbe-p9.c')
-rw-r--r-- | hw/sbe-p9.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/hw/sbe-p9.c b/hw/sbe-p9.c new file mode 100644 index 0000000..c9c3feb --- /dev/null +++ b/hw/sbe-p9.c @@ -0,0 +1,61 @@ +/* Copyright 2017 IBM Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define pr_fmt(fmt) "SBE: " fmt + +#include <chip.h> +#include <errorlog.h> +#include <lock.h> +#include <opal.h> +#include <sbe-p9.h> +#include <skiboot.h> +#include <timebase.h> +#include <timer.h> +#include <trace.h> +#include <xscom.h> + +void sbe_interrupt(uint32_t chip_id) +{ + int rc; + u64 data; + struct proc_chip *chip; + + chip = get_chip(chip_id); + if (chip == NULL) + return; + + /* Read doorbell register */ + rc = xscom_read(chip_id, PSU_HOST_DOORBELL_REG_RW, &data); + if (rc) { + prlog(PR_ERR, "Failed to read SBE to Host doorbell register " + "[chip id = %x]\n", chip_id); + goto clr_interrupt; + } + + /* SBE passtrhough command, call prd handler */ + if (data & SBE_HOST_PASSTHROUGH) { + prd_sbe_passthrough(chip_id); + } + +clr_interrupt: + /* Clears all the bits */ + rc = xscom_write(chip_id, PSU_HOST_DOORBELL_REG_AND, + SBE_HOST_RESPONSE_CLEAR); + if (rc) { + prlog(PR_ERR, "Failed to clear SBE to Host doorbell " + "register [chip id = %x]\n", chip_id); + } +} |