powerpc/eeh: Add eeh_state_active() helper
authorSam Bobroff <sam.bobroff@au1.ibm.com>
Mon, 19 Mar 2018 02:49:23 +0000 (13:49 +1100)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 27 Mar 2018 12:45:19 +0000 (23:45 +1100)
Checking for a "fully active" device state requires testing two flag
bits, which is open coded in several places, so add a function to do
it.

Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/eeh.h
arch/powerpc/kernel/eeh.c
arch/powerpc/platforms/powernv/eeh-powernv.c

index fd37cc101f4f2f6fcba5fe1b5aecd7885d1da074..c2266ca61853c4df4c0d356abafc2a135d13fe45 100644 (file)
@@ -256,6 +256,12 @@ static inline void eeh_serialize_unlock(unsigned long flags)
        raw_spin_unlock_irqrestore(&confirm_error_lock, flags);
 }
 
+static inline bool eeh_state_active(int state)
+{
+       return (state & (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE))
+       == (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE);
+}
+
 typedef void *(*eeh_traverse_func)(void *data, void *flag);
 void eeh_set_pe_aux_size(int size);
 int eeh_phb_pe_create(struct pci_controller *phb);
index 2b9df0040d6b507c1c64de47d9c7101c91f9a2f7..bc640e4c5ca5a67e36952e666110fc61cf04a4db 100644 (file)
@@ -394,9 +394,7 @@ static int eeh_phb_check_failure(struct eeh_pe *pe)
        /* Check PHB state */
        ret = eeh_ops->get_state(phb_pe, NULL);
        if ((ret < 0) ||
-           (ret == EEH_STATE_NOT_SUPPORT) ||
-           (ret & (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE)) ==
-           (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE)) {
+           (ret == EEH_STATE_NOT_SUPPORT) || eeh_state_active(ret)) {
                ret = 0;
                goto out;
        }
@@ -433,7 +431,6 @@ out:
 int eeh_dev_check_failure(struct eeh_dev *edev)
 {
        int ret;
-       int active_flags = (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE);
        unsigned long flags;
        struct device_node *dn;
        struct pci_dev *dev;
@@ -525,8 +522,7 @@ int eeh_dev_check_failure(struct eeh_dev *edev)
         * state, PE is in good state.
         */
        if ((ret < 0) ||
-           (ret == EEH_STATE_NOT_SUPPORT) ||
-           ((ret & active_flags) == active_flags)) {
+           (ret == EEH_STATE_NOT_SUPPORT) || eeh_state_active(ret)) {
                eeh_stats.false_positives++;
                pe->false_positives++;
                rc = 0;
@@ -546,8 +542,7 @@ int eeh_dev_check_failure(struct eeh_dev *edev)
 
                /* Frozen parent PE ? */
                ret = eeh_ops->get_state(parent_pe, NULL);
-               if (ret > 0 &&
-                   (ret & active_flags) != active_flags)
+               if (ret > 0 && !eeh_state_active(ret))
                        pe = parent_pe;
 
                /* Next parent level */
@@ -888,7 +883,6 @@ static void *eeh_set_dev_freset(void *data, void *flag)
  */
 int eeh_pe_reset_full(struct eeh_pe *pe)
 {
-       int active_flags = (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE);
        int reset_state = (EEH_PE_RESET | EEH_PE_CFG_BLOCKED);
        int type = EEH_RESET_HOT;
        unsigned int freset = 0;
@@ -919,7 +913,7 @@ int eeh_pe_reset_full(struct eeh_pe *pe)
 
                /* Wait until the PE is in a functioning state */
                state = eeh_ops->wait_state(pe, PCI_BUS_RESET_WAIT_MSEC);
-               if ((state & active_flags) == active_flags)
+               if (eeh_state_active(state))
                        break;
 
                if (state < 0) {
@@ -1352,16 +1346,15 @@ static int eeh_pe_change_owner(struct eeh_pe *pe)
        struct eeh_dev *edev, *tmp;
        struct pci_dev *pdev;
        struct pci_device_id *id;
-       int flags, ret;
+       int ret;
 
        /* Check PE state */
-       flags = (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE);
        ret = eeh_ops->get_state(pe, NULL);
        if (ret < 0 || ret == EEH_STATE_NOT_SUPPORT)
                return 0;
 
        /* Unfrozen PE, nothing to do */
-       if ((ret & flags) == flags)
+       if (eeh_state_active(ret))
                return 0;
 
        /* Frozen PE, check if it needs PE level reset */
index 33c86c1a17204445a231828c0b7467335a823098..ddfc3544d28514aedf4e57008e687940ce94cda3 100644 (file)
@@ -1425,11 +1425,8 @@ static int pnv_eeh_get_pe(struct pci_controller *hose,
        dev_pe = dev_pe->parent;
        while (dev_pe && !(dev_pe->type & EEH_PE_PHB)) {
                int ret;
-               int active_flags = (EEH_STATE_MMIO_ACTIVE |
-                                   EEH_STATE_DMA_ACTIVE);
-
                ret = eeh_ops->get_state(dev_pe, NULL);
-               if (ret <= 0 || (ret & active_flags) == active_flags) {
+               if (ret <= 0 || eeh_state_active(ret)) {
                        dev_pe = dev_pe->parent;
                        continue;
                }
@@ -1463,7 +1460,6 @@ static int pnv_eeh_next_error(struct eeh_pe **pe)
        struct eeh_pe *phb_pe, *parent_pe;
        __be64 frozen_pe_no;
        __be16 err_type, severity;
-       int active_flags = (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE);
        long rc;
        int state, ret = EEH_NEXT_ERR_NONE;
 
@@ -1626,8 +1622,7 @@ static int pnv_eeh_next_error(struct eeh_pe **pe)
 
                                /* Frozen parent PE ? */
                                state = eeh_ops->get_state(parent_pe, NULL);
-                               if (state > 0 &&
-                                   (state & active_flags) != active_flags)
+                               if (state > 0 && !eeh_state_active(state))
                                        *pe = parent_pe;
 
                                /* Next parent level */