[Skiboot] [RFC 1/2] hw/phb3: add OPAL call to get current PHB CAPI state
Gavin Shan
gwshan at linux.vnet.ibm.com
Sat Oct 22 13:55:48 AEDT 2016
On Fri, Sep 16, 2016 at 08:22:47PM +1000, Andrew Donnellan wrote:
>Add an OPAL call, OPAL_PCI_GET_PHB_CAPI_MODE, to find out whether a PHB is
>currently in CAPI mode or not.
>
s/mode or not/or PCIE mode
>This will be used by Linux to determine whether a PHB needs a complete
>reset to disable CAPI mode post-kexec.
>
>Signed-off-by: Andrew Donnellan <andrew.donnellan at au1.ibm.com>
With one code alignment issue fixed as below:
Reviewed-by: Gavin Shan <gwshan at linux.vnet.ibm.com>
>---
> core/pci-opal.c | 17 +++++++++++++-
> doc/opal-api/opal-pci-get-phb-capi-mode-128.rst | 24 ++++++++++++++++++-
> hw/phb3.c | 14 +++++++++++-
> include/opal-api.h | 3 +-
> include/pci.h | 2 +-
> 5 files changed, 58 insertions(+), 2 deletions(-)
> create mode 100644 doc/opal-api/opal-pci-get-phb-capi-mode-128.rst
>
>diff --git a/core/pci-opal.c b/core/pci-opal.c
>index ba7a261..e877d5d 100644
>--- a/core/pci-opal.c
>+++ b/core/pci-opal.c
>@@ -961,3 +961,20 @@ static int64_t opal_pci_set_phb_capi_mode(uint64_t phb_id, uint64_t mode, uint64
> return rc;
> }
> opal_call(OPAL_PCI_SET_PHB_CAPI_MODE, opal_pci_set_phb_capi_mode, 3);
>+
>+static int64_t opal_pci_get_phb_capi_mode(uint64_t phb_id)
>+{
>+ struct phb *phb = pci_get_phb(phb_id);
>+ int64_t rc;
>+
>+ if (!phb)
>+ return OPAL_PARAMETER;
>+ if (!phb->ops->get_capi_mode)
>+ return OPAL_UNSUPPORTED;
>+
>+ phb_lock(phb);
>+ rc = phb->ops->get_capi_mode(phb);
>+ phb_unlock(phb);
>+ return rc;
>+}
>+opal_call(OPAL_PCI_GET_PHB_CAPI_MODE, opal_pci_get_phb_capi_mode, 1);
>diff --git a/doc/opal-api/opal-pci-get-phb-capi-mode-128.rst b/doc/opal-api/opal-pci-get-phb-capi-mode-128.rst
>new file mode 100644
>index 0000000..e5e0bc2
>--- /dev/null
>+++ b/doc/opal-api/opal-pci-get-phb-capi-mode-128.rst
>@@ -0,0 +1,24 @@
>+OPAL_PCI_GET_PHB_CAPI_MODE
>+==========================
>+
>+Get a PHB's current CAPI mode status.
>+
>+Parameter
>+---------
>+
>+``uint64_t phb_id``
>+ is the value from the PHB node ibm,opal-phbid property.
>+
>+Return Codes
>+------------
>+OPAL_PARAMETER
>+ The specified PHB was not found.
>+
>+OPAL_UNSUPPORTED
>+ The specified PHB does not support this operation.
>+
>+OPAL_PHB_CAPI_MODE_CAPI
>+ The PHB is currently in CAPI mode.
>+
>+OPAL_PHB_CAPI_MODE_PCIE
>+ The PHB is currently in regular PCIe mode.
>diff --git a/hw/phb3.c b/hw/phb3.c
>index d0b5010..4425522 100644
>--- a/hw/phb3.c
>+++ b/hw/phb3.c
>@@ -3422,6 +3422,19 @@ static int64_t enable_capi_mode(struct phb3 *p, uint64_t pe_number, bool dma_mod
> return OPAL_SUCCESS;
> }
>
>+static int64_t phb3_get_capi_mode(struct phb *phb)
>+{
>+ struct phb3 *p = phb_to_phb3(phb);
>+ struct proc_chip *chip = get_chip(p->chip_id);
>+ int64_t ret;
>+ lock(&capi_lock);
>+ ret = (chip->capp_phb3_attached_mask & (1 << p->index)) ?
>+ OPAL_PHB_CAPI_MODE_CAPI :
>+ OPAL_PHB_CAPI_MODE_PCIE;
>+ unlock(&capi_lock);
Tab is need here. By the way, how about renaming @ret to @mode?
>+ return ret;
>+}
>+
> static int64_t phb3_set_capi_mode(struct phb *phb, uint64_t mode,
> uint64_t pe_number)
> {
>@@ -3551,6 +3564,7 @@ static const struct phb_ops phb3_ops = {
> .get_diag_data = NULL,
> .get_diag_data2 = phb3_get_diag_data,
> .set_capi_mode = phb3_set_capi_mode,
>+ .get_capi_mode = phb3_get_capi_mode,
> .set_capp_recovery = phb3_set_capp_recovery,
> };
>
>diff --git a/include/opal-api.h b/include/opal-api.h
>index f607a41..b54378e 100644
>--- a/include/opal-api.h
>+++ b/include/opal-api.h
>@@ -181,7 +181,8 @@
> #define OPAL_INT_SET_MFRR 125
> #define OPAL_PCI_TCE_KILL 126
> #define OPAL_NMMU_SET_PTCR 127
>-#define OPAL_LAST 127
>+#define OPAL_PCI_GET_PHB_CAPI_MODE 128
>+#define OPAL_LAST 128
>
> /* Device tree flags */
>
>diff --git a/include/pci.h b/include/pci.h
>index 92e3dce..7aa0bb8 100644
>--- a/include/pci.h
>+++ b/include/pci.h
>@@ -303,7 +303,7 @@ struct phb_ops {
> /* Put phb in capi mode or pcie mode */
> int64_t (*set_capi_mode)(struct phb *phb, uint64_t mode,
> uint64_t pe_number);
>-
>+ int64_t (*get_capi_mode)(struct phb *phb);
> int64_t (*set_capp_recovery)(struct phb *phb);
> };
>
>--
>git-series 0.8.10
More information about the Skiboot
mailing list