Skip to content

Commit 34a286a

Browse files
sambltcmpe
authored andcommitted
powerpc/eeh: Add eeh_state_active() helper
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 <[email protected]> Reviewed-by: Alexey Kardashevskiy <[email protected]> Signed-off-by: Michael Ellerman <[email protected]>
1 parent 54048cf commit 34a286a

File tree

3 files changed

+14
-20
lines changed

3 files changed

+14
-20
lines changed

arch/powerpc/include/asm/eeh.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,12 @@ static inline void eeh_serialize_unlock(unsigned long flags)
256256
raw_spin_unlock_irqrestore(&confirm_error_lock, flags);
257257
}
258258

259+
static inline bool eeh_state_active(int state)
260+
{
261+
return (state & (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE))
262+
== (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE);
263+
}
264+
259265
typedef void *(*eeh_traverse_func)(void *data, void *flag);
260266
void eeh_set_pe_aux_size(int size);
261267
int eeh_phb_pe_create(struct pci_controller *phb);

arch/powerpc/kernel/eeh.c

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -394,9 +394,7 @@ static int eeh_phb_check_failure(struct eeh_pe *pe)
394394
/* Check PHB state */
395395
ret = eeh_ops->get_state(phb_pe, NULL);
396396
if ((ret < 0) ||
397-
(ret == EEH_STATE_NOT_SUPPORT) ||
398-
(ret & (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE)) ==
399-
(EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE)) {
397+
(ret == EEH_STATE_NOT_SUPPORT) || eeh_state_active(ret)) {
400398
ret = 0;
401399
goto out;
402400
}
@@ -433,7 +431,6 @@ static int eeh_phb_check_failure(struct eeh_pe *pe)
433431
int eeh_dev_check_failure(struct eeh_dev *edev)
434432
{
435433
int ret;
436-
int active_flags = (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE);
437434
unsigned long flags;
438435
struct device_node *dn;
439436
struct pci_dev *dev;
@@ -525,8 +522,7 @@ int eeh_dev_check_failure(struct eeh_dev *edev)
525522
* state, PE is in good state.
526523
*/
527524
if ((ret < 0) ||
528-
(ret == EEH_STATE_NOT_SUPPORT) ||
529-
((ret & active_flags) == active_flags)) {
525+
(ret == EEH_STATE_NOT_SUPPORT) || eeh_state_active(ret)) {
530526
eeh_stats.false_positives++;
531527
pe->false_positives++;
532528
rc = 0;
@@ -546,8 +542,7 @@ int eeh_dev_check_failure(struct eeh_dev *edev)
546542

547543
/* Frozen parent PE ? */
548544
ret = eeh_ops->get_state(parent_pe, NULL);
549-
if (ret > 0 &&
550-
(ret & active_flags) != active_flags)
545+
if (ret > 0 && !eeh_state_active(ret))
551546
pe = parent_pe;
552547

553548
/* Next parent level */
@@ -888,7 +883,6 @@ static void *eeh_set_dev_freset(void *data, void *flag)
888883
*/
889884
int eeh_pe_reset_full(struct eeh_pe *pe)
890885
{
891-
int active_flags = (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE);
892886
int reset_state = (EEH_PE_RESET | EEH_PE_CFG_BLOCKED);
893887
int type = EEH_RESET_HOT;
894888
unsigned int freset = 0;
@@ -919,7 +913,7 @@ int eeh_pe_reset_full(struct eeh_pe *pe)
919913

920914
/* Wait until the PE is in a functioning state */
921915
state = eeh_ops->wait_state(pe, PCI_BUS_RESET_WAIT_MSEC);
922-
if ((state & active_flags) == active_flags)
916+
if (eeh_state_active(state))
923917
break;
924918

925919
if (state < 0) {
@@ -1352,16 +1346,15 @@ static int eeh_pe_change_owner(struct eeh_pe *pe)
13521346
struct eeh_dev *edev, *tmp;
13531347
struct pci_dev *pdev;
13541348
struct pci_device_id *id;
1355-
int flags, ret;
1349+
int ret;
13561350

13571351
/* Check PE state */
1358-
flags = (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE);
13591352
ret = eeh_ops->get_state(pe, NULL);
13601353
if (ret < 0 || ret == EEH_STATE_NOT_SUPPORT)
13611354
return 0;
13621355

13631356
/* Unfrozen PE, nothing to do */
1364-
if ((ret & flags) == flags)
1357+
if (eeh_state_active(ret))
13651358
return 0;
13661359

13671360
/* Frozen PE, check if it needs PE level reset */

arch/powerpc/platforms/powernv/eeh-powernv.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1425,11 +1425,8 @@ static int pnv_eeh_get_pe(struct pci_controller *hose,
14251425
dev_pe = dev_pe->parent;
14261426
while (dev_pe && !(dev_pe->type & EEH_PE_PHB)) {
14271427
int ret;
1428-
int active_flags = (EEH_STATE_MMIO_ACTIVE |
1429-
EEH_STATE_DMA_ACTIVE);
1430-
14311428
ret = eeh_ops->get_state(dev_pe, NULL);
1432-
if (ret <= 0 || (ret & active_flags) == active_flags) {
1429+
if (ret <= 0 || eeh_state_active(ret)) {
14331430
dev_pe = dev_pe->parent;
14341431
continue;
14351432
}
@@ -1463,7 +1460,6 @@ static int pnv_eeh_next_error(struct eeh_pe **pe)
14631460
struct eeh_pe *phb_pe, *parent_pe;
14641461
__be64 frozen_pe_no;
14651462
__be16 err_type, severity;
1466-
int active_flags = (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE);
14671463
long rc;
14681464
int state, ret = EEH_NEXT_ERR_NONE;
14691465

@@ -1626,8 +1622,7 @@ static int pnv_eeh_next_error(struct eeh_pe **pe)
16261622

16271623
/* Frozen parent PE ? */
16281624
state = eeh_ops->get_state(parent_pe, NULL);
1629-
if (state > 0 &&
1630-
(state & active_flags) != active_flags)
1625+
if (state > 0 && !eeh_state_active(state))
16311626
*pe = parent_pe;
16321627

16331628
/* Next parent level */

0 commit comments

Comments
 (0)