OPAL_PCI_GET_PHB_DIAG_DATA2

#define OPAL_PCI_GET_PHB_DIAG_DATA2          64

/**
 * This structure defines the overlay which will be used to store PHB error
 * data upon request.
 */
 enum {
     OPAL_PHB_ERROR_DATA_VERSION_1 = 1,
 };

enum {
     OPAL_PHB_ERROR_DATA_TYPE_P7IOC = 1,
     OPAL_PHB_ERROR_DATA_TYPE_PHB3 = 2,
     OPAL_PHB_ERROR_DATA_TYPE_PHB4 = 3
};

enum {
     OPAL_P7IOC_NUM_PEST_REGS = 128,
     OPAL_PHB3_NUM_PEST_REGS = 256,
     OPAL_PHB4_NUM_PEST_REGS = 512
};

struct OpalIoPhbErrorCommon {
     __be32 version;
     __be32 ioType;
     __be32 len;
};

struct OpalIoP7IOCPhbErrorData {
     struct OpalIoPhbErrorCommon common;

     __be32 brdgCtl;

     // P7IOC utl regs
     __be32 portStatusReg;
     __be32 rootCmplxStatus;
     __be32 busAgentStatus;

     // P7IOC cfg regs
     __be32 deviceStatus;
     __be32 slotStatus;
     __be32 linkStatus;
     __be32 devCmdStatus;
     __be32 devSecStatus;

     // cfg AER regs
     __be32 rootErrorStatus;
     __be32 uncorrErrorStatus;
     __be32 corrErrorStatus;
     __be32 tlpHdr1;
     __be32 tlpHdr2;
     __be32 tlpHdr3;
     __be32 tlpHdr4;
     __be32 sourceId;

     __be32 rsv3;

     // Record data about the call to allocate a buffer.
     __be64 errorClass;
     __be64 correlator;

     //P7IOC MMIO Error Regs
     __be64 p7iocPlssr;                // n120
     __be64 p7iocCsr;                  // n110
     __be64 lemFir;                    // nC00
     __be64 lemErrorMask;              // nC18
     __be64 lemWOF;                    // nC40
     __be64 phbErrorStatus;            // nC80
     __be64 phbFirstErrorStatus;       // nC88
     __be64 phbErrorLog0;              // nCC0
     __be64 phbErrorLog1;              // nCC8
     __be64 mmioErrorStatus;           // nD00
     __be64 mmioFirstErrorStatus;      // nD08
     __be64 mmioErrorLog0;             // nD40
     __be64 mmioErrorLog1;             // nD48
     __be64 dma0ErrorStatus;           // nD80
     __be64 dma0FirstErrorStatus;      // nD88
     __be64 dma0ErrorLog0;             // nDC0
     __be64 dma0ErrorLog1;             // nDC8
     __be64 dma1ErrorStatus;           // nE00
     __be64 dma1FirstErrorStatus;      // nE08
     __be64 dma1ErrorLog0;             // nE40
     __be64 dma1ErrorLog1;             // nE48
     __be64 pestA[OPAL_P7IOC_NUM_PEST_REGS];
     __be64 pestB[OPAL_P7IOC_NUM_PEST_REGS];
};

struct OpalIoPhb3ErrorData {
     struct OpalIoPhbErrorCommon common;

     __be32 brdgCtl;

     /* PHB3 UTL regs */
     __be32 portStatusReg;
     __be32 rootCmplxStatus;
     __be32 busAgentStatus;

     /* PHB3 cfg regs */
     __be32 deviceStatus;
     __be32 slotStatus;
     __be32 linkStatus;
     __be32 devCmdStatus;
     __be32 devSecStatus;

     /* cfg AER regs */
     __be32 rootErrorStatus;
     __be32 uncorrErrorStatus;
     __be32 corrErrorStatus;
     __be32 tlpHdr1;
     __be32 tlpHdr2;
     __be32 tlpHdr3;
     __be32 tlpHdr4;
     __be32 sourceId;

     __be32 rsv3;

     /* Record data about the call to allocate a buffer */
     __be64 errorClass;
     __be64 correlator;

     /* PHB3 MMIO Error Regs */
     __be64 nFir;                    /* 000 */
     __be64 nFirMask;                /* 003 */
     __be64 nFirWOF;         /* 008 */
     __be64 phbPlssr;                /* 120 */
     __be64 phbCsr;          /* 110 */
     __be64 lemFir;          /* C00 */
     __be64 lemErrorMask;            /* C18 */
     __be64 lemWOF;          /* C40 */
     __be64 phbErrorStatus;  /* C80 */
     __be64 phbFirstErrorStatus;     /* C88 */
     __be64 phbErrorLog0;            /* CC0 */
     __be64 phbErrorLog1;            /* CC8 */
     __be64 mmioErrorStatus; /* D00 */
     __be64 mmioFirstErrorStatus;    /* D08 */
     __be64 mmioErrorLog0;           /* D40 */
     __be64 mmioErrorLog1;           /* D48 */
     __be64 dma0ErrorStatus; /* D80 */
     __be64 dma0FirstErrorStatus;    /* D88 */
     __be64 dma0ErrorLog0;           /* DC0 */
     __be64 dma0ErrorLog1;           /* DC8 */
     __be64 dma1ErrorStatus; /* E00 */
     __be64 dma1FirstErrorStatus;    /* E08 */
     __be64 dma1ErrorLog0;           /* E40 */
     __be64 dma1ErrorLog1;           /* E48 */
     __be64 pestA[OPAL_PHB3_NUM_PEST_REGS];
     __be64 pestB[OPAL_PHB3_NUM_PEST_REGS];
};

struct OpalIoPhb4ErrorData {
     struct OpalIoPhbErrorCommon common;

     __be32 brdgCtl;

     /* XXX missing UTL registers? */

     /* PHB4 cfg regs */
     __be32 deviceStatus;
     __be32 slotStatus;
     __be32 linkStatus;
     __be32 devCmdStatus;
     __be32 devSecStatus;

     /* cfg AER regs */
     __be32 rootErrorStatus;
     __be32 uncorrErrorStatus;
     __be32 corrErrorStatus;
     __be32 tlpHdr1;
     __be32 tlpHdr2;
     __be32 tlpHdr3;
     __be32 tlpHdr4;
     __be32 sourceId;

     /* PHB4 ETU Error Regs */
     __be64 nFir;                            /* 000 */
     __be64 nFirMask;                        /* 003 */
     __be64 nFirWOF;                         /* 008 */
     __be64 phbPlssr;                        /* 120 */
     __be64 phbCsr;                          /* 110 */
     __be64 lemFir;                          /* C00 */
     __be64 lemErrorMask;                    /* C18 */
     __be64 lemWOF;                          /* C40 */
     __be64 phbErrorStatus;                  /* C80 */
     __be64 phbFirstErrorStatus;             /* C88 */
     __be64 phbErrorLog0;                    /* CC0 */
     __be64 phbErrorLog1;                    /* CC8 */
     __be64 phbTxeErrorStatus;               /* D00 */
     __be64 phbTxeFirstErrorStatus;          /* D08 */
     __be64 phbTxeErrorLog0;                 /* D40 */
     __be64 phbTxeErrorLog1;                 /* D48 */
     __be64 phbRxeArbErrorStatus;            /* D80 */
     __be64 phbRxeArbFirstErrorStatus;       /* D88 */
     __be64 phbRxeArbErrorLog0;              /* DC0 */
     __be64 phbRxeArbErrorLog1;              /* DC8 */
     __be64 phbRxeMrgErrorStatus;            /* E00 */
     __be64 phbRxeMrgFirstErrorStatus;       /* E08 */
     __be64 phbRxeMrgErrorLog0;              /* E40 */
     __be64 phbRxeMrgErrorLog1;              /* E48 */
     __be64 phbRxeTceErrorStatus;            /* E80 */
     __be64 phbRxeTceFirstErrorStatus;       /* E88 */
     __be64 phbRxeTceErrorLog0;              /* EC0 */
     __be64 phbRxeTceErrorLog1;              /* EC8 */

     /* PHB4 REGB Error Regs */
     __be64 phbPblErrorStatus;               /* 1900 */
     __be64 phbPblFirstErrorStatus;          /* 1908 */
     __be64 phbPblErrorLog0;                 /* 1940 */
     __be64 phbPblErrorLog1;                 /* 1948 */
     __be64 phbPcieDlpErrorLog1;             /* 1AA0 */
     __be64 phbPcieDlpErrorLog2;             /* 1AA8 */
     __be64 phbPcieDlpErrorStatus;           /* 1AB0 */
     __be64 phbRegbErrorStatus;              /* 1C00 */
     __be64 phbRegbFirstErrorStatus;         /* 1C08 */
     __be64 phbRegbErrorLog0;                /* 1C40 */
     __be64 phbRegbErrorLog1;                /* 1C48 */

     __be64 pestA[OPAL_PHB4_NUM_PEST_REGS];
     __be64 pestB[OPAL_PHB4_NUM_PEST_REGS];
};

int64_t opal_pci_get_phb_diag_data2(uint64_t phb_id, void *diag_buffer, uint64_t diag_buffer_len);

Get PCI diagnostic data from a given PHB. Each PHB present in the device tree has a ibm,phb-diag-data-size property which is the size of the diagnostic data structure that can be returned.

Each PHB generation has a different structure for diagnostic data, and the small common structure will allow the OS to work out what format the data is coming in.

In future, it’s possible that the format will change to be more flexible, and require less OS support.

Parameters

uint64_t phb_id
the ID of the PHB you want to retrieve data from
void *diag_buffer
an allocated buffer to store diag data in
uint64_t diag_buffer_len
size in bytes of the diag buffer

Calling

Retrieve the PHB’s diagnostic data. The diagnostic data is stored in the buffer pointed by @diag_buffer. Different PHB versions will store different diagnostics, defined in include/opal-api.h as struct OpalIo<PHBVer>ErrorData.

OPAL_PCI_GET_PHB_DIAG_DATA is deprecated and OPAL_PCI_GET_PHB_DIAG_DATA2 should be used instead.

Return Codes

OPAL_SUCCESS
Diagnostic data has been retrieved and stored successfully
OPAL_PARAMETER
The given buffer is too small to store the diagnostic data
OPAL_HARDWARE
The PHB is in a broken state and its data cannot be retreived
OPAL_UNSUPPORTED
Diagnostic data is not implemented for this PHB type