openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

pci_common.c (8308B)


      1 /*
      2  * 
      3  * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file.
      4  * 
      5  * Copyright 2007-2019 Broadcom Inc. All rights reserved.
      6  *
      7  * SAL PCI abstraction common to all platforms
      8  * See also: vxworks/pci.c, unix/pci.c
      9  */
     10 #if !defined(BCM_ICS) && !defined(__KERNEL__) && !defined(GHS)
     11 
     12 #include <sal/types.h>
     13 #include <sal/appl/io.h>
     14 #include <sal/appl/pci.h>
     15 
     16 #ifndef PCI_MAX_BUS
     17 # ifdef PLISIM
     18 #  define PCI_MAX_BUS		1
     19 # else
     20 #  define PCI_MAX_BUS		4
     21 # endif
     22 #endif
     23 
     24 #ifndef PCI_MAX_DEV
     25 #define PCI_MAX_DEV		32
     26 #endif
     27 
     28 #if defined(OVERRIDE_PCI_MAX_DEV)
     29 #undef PCI_MAX_DEV
     30 #define PCI_MAX_DEV             OVERRIDE_PCI_MAX_DEV
     31 #endif
     32 
     33 #if defined(OVERRIDE_PCI_MAX_BUS)
     34 #undef PCI_MAX_BUS
     35 #define PCI_MAX_BUS             OVERRIDE_PCI_MAX_BUS
     36 #endif
     37 
     38 #if defined(OVERRIDE_PCI_BUS_NO_START)
     39 #define PCI_BUS_NO_START        OVERRIDE_PCI_BUS_NO_START
     40 #else
     41 #define PCI_BUS_NO_START        0
     42 #endif
     43 
     44 /*
     45  * For historical reasons the PCI probe function skips device 12
     46  * by default to prevent a system hang on certain platforms.
     47  * Override this value with zero to probe all PCI devices.
     48  */
     49 #if defined(OVERRIDE_PCI_SKIP_DEV_MASK)
     50 #define PCI_SKIP_DEV_MASK       OVERRIDE_PCI_SKIP_DEV_MASK
     51 #else
     52 #define PCI_SKIP_DEV_MASK       (1L << 12)
     53 #endif
     54 
     55 /*
     56  * pci_device_iter
     57  *
     58  *   Scans all PCI busses and slots.
     59  *   Calls a user-supplied routine once per PCI device found.
     60  *   Passes the device location (dev) and device IDs to the routine.
     61  *   Continues as long as the user routine returns 0.
     62  *   Otherwise, stops and returns the value from the user routine.
     63  */
     64 
     65 int
     66 pci_device_iter(int (*rtn)(pci_dev_t *dev,
     67 			   uint16 pciVenID,
     68 			   uint16 pciDevID,
     69 			   uint8 pciRevID))
     70 {
     71     uint32		venID, devID, revID;
     72     int			rv = 0;
     73     pci_dev_t		dev;
     74 
     75     sal_memset(&dev, 0, sizeof(pci_dev_t));
     76 
     77     for (dev.busNo = PCI_BUS_NO_START;
     78 	 dev.busNo < PCI_MAX_BUS && rv == 0;
     79 	 dev.busNo++) {
     80 
     81 	for (dev.devNo = 0;
     82 	     dev.devNo < PCI_MAX_DEV && rv == 0;
     83 	     dev.devNo++) {
     84 
     85 	    if ((1L << dev.devNo) & PCI_SKIP_DEV_MASK) {
     86 		continue;
     87 	    }
     88 
     89 	    venID = pci_config_getw(&dev, PCI_CONF_VENDOR_ID) & 0xffff;
     90 
     91 	    if (venID == 0xffff) {
     92 		continue;
     93 	    }
     94 
     95 	    devID = pci_config_getw(&dev, PCI_CONF_VENDOR_ID) >> 16;
     96 	    revID = pci_config_getw(&dev, PCI_CONF_REVISION_ID) & 0xff;
     97 
     98 	    rv = (*rtn)(&dev, venID, devID, revID);
     99 	}
    100     }
    101 
    102     return rv;
    103 }
    104 
    105 /*
    106  * Scan function 0 of all busses and devices, printing a line for each
    107  * device found.
    108  */
    109 
    110 void
    111 pci_print_all(void)
    112 {
    113 #ifdef VXWORKS
    114 #if (defined(IPROC_CMICD) && defined(INTERNAL_CPU))
    115     /* Will not use PCIe to access switch core */
    116     int pciLibInitStatus=0;
    117     int pciConfigMech=0;
    118 #else
    119     extern int pciLibInitStatus;
    120     extern int pciConfigMech;
    121 #endif /* IPROC_CMICD */
    122 #endif
    123     int		dev_count = PCI_MAX_DEV;
    124     int		bus_count = PCI_MAX_BUS;
    125     pci_dev_t	dev;
    126 
    127     /* coverity[stack_use_callee_max : FALSE] */
    128     sal_memset(&dev, 0, sizeof(pci_dev_t));
    129 
    130 #if defined(VXWORKS)
    131     if (pciLibInitStatus != OK) {
    132 	sal_printf("ERROR: pciLibInitStatus is not OK\n");
    133 	return;
    134     }
    135 
    136     sal_printf("Using configuration mechanism %d\n", pciConfigMech);
    137 #endif /* VXWORKS */
    138 
    139     sal_printf("Scanning function 0 of PCI busses 0-%d, devices 0-%d\n",
    140 		 bus_count - 1, dev_count - 1);
    141     sal_printf("bus dev fn venID devID class  rev MBAR0    MBAR1    MBAR2    MBAR3    MBAR4    MBAR5    IPIN ILINE\n");
    142 
    143     for (dev.busNo = PCI_BUS_NO_START; dev.busNo < bus_count; dev.busNo++)
    144 	for (dev.devNo = 0; dev.devNo < dev_count; dev.devNo++) {
    145 	    uint32		vendorID, deviceID, class, revID;
    146 	    uint32		MBAR0, MBAR1, MBAR2, MBAR3, MBAR4, MBAR5, ipin, iline;
    147 
    148 	    vendorID = (pci_config_getw(&dev, PCI_CONF_VENDOR_ID) & 0x0000ffff);
    149 
    150 	    if (vendorID == 0xffff)
    151 		continue;
    152 
    153 
    154 #define CONFIG(offset)	pci_config_getw(&dev, (offset))
    155 
    156 	    deviceID = (CONFIG(PCI_CONF_VENDOR_ID) & 0xffff0000) >> 16;
    157 	    class    = (CONFIG(PCI_CONF_REVISION_ID) & 0xffffff00) >>  8;
    158 	    revID    = (CONFIG(PCI_CONF_REVISION_ID) & 0x000000ff) >>  0;
    159 	    MBAR0    = (CONFIG(PCI_CONF_BAR0) & 0xffffffff) >>  0;
    160 	    MBAR1    = (CONFIG(PCI_CONF_BAR1) & 0xffffffff) >>  0;
    161 	    MBAR2    = (CONFIG(PCI_CONF_BAR2) & 0xffffffff) >>  0;
    162 	    MBAR3    = (CONFIG(PCI_CONF_BAR3) & 0xffffffff) >>  0;
    163 	    MBAR4    = (CONFIG(PCI_CONF_BAR4) & 0xffffffff) >>  0;
    164 	    MBAR5    = (CONFIG(PCI_CONF_BAR5) & 0xffffffff) >>  0;
    165 	    iline    = (CONFIG(PCI_CONF_INTERRUPT_LINE) & 0x000000ff) >>  0;
    166 	    ipin     = (CONFIG(PCI_CONF_INTERRUPT_LINE) & 0x0000ff00) >>  8;
    167 
    168 #undef CONFIG
    169 
    170 	    sal_printf("%02x  %02x  %02x %04x  %04x  "
    171 		       "%06x %02x  %08x %08x %08x %08x %08x %08x %02x   %02x\n",
    172 		       dev.busNo, dev.devNo, dev.funcNo,
    173 		       vendorID, deviceID, class, revID,
    174 		       MBAR0, MBAR1, MBAR2, MBAR3, MBAR4, MBAR5, ipin, iline);
    175 	}
    176 }
    177 
    178 void
    179 pci_print_config(pci_dev_t *dev)
    180 {
    181     uint32		data;
    182 
    183     data = pci_config_getw(dev, PCI_CONF_VENDOR_ID);
    184     sal_printf("%04x: %08x  DeviceID=%04x  VendorID=%04x\n",
    185 	       PCI_CONF_VENDOR_ID, data,
    186 	       (data & 0xffff0000) >> 16,
    187 	       (data & 0x0000ffff) >>  0);
    188 
    189     data = pci_config_getw(dev, PCI_CONF_COMMAND);
    190     sal_printf("%04x: %08x  Status=%04x  Command=%04x\n",
    191 	       PCI_CONF_COMMAND, data,
    192 	       (data & 0xffff0000) >> 16,
    193 	       (data & 0x0000ffff) >>  0);
    194 
    195     data = pci_config_getw(dev, PCI_CONF_REVISION_ID);
    196     sal_printf("%04x: %08x  ClassCode=%06x  RevisionID=%02x\n", 
    197 	       PCI_CONF_REVISION_ID, data,
    198 	       (data & 0xffffff00) >> 8,
    199 	       (data & 0x000000ff) >> 0);
    200 
    201     data = pci_config_getw(dev, PCI_CONF_CACHE_LINE_SIZE);
    202     sal_printf("%04x: %08x  BIST=%02x  HeaderType=%02x  "
    203 	       "LatencyTimer=%02x  CacheLineSize=%02x\n",
    204 	       PCI_CONF_CACHE_LINE_SIZE, data,
    205 	       (data & 0xff000000) >> 24,
    206 	       (data & 0x00ff0000) >> 16,
    207 	       (data & 0x0000ff00) >>  8,
    208 	       (data & 0x000000ff) >>  0);
    209 
    210     data = pci_config_getw(dev, PCI_CONF_BAR0);
    211     sal_printf("%04x: %08x  BaseAddress0=%08x\n",
    212 	       PCI_CONF_BAR0, data, data);
    213 
    214     data = pci_config_getw(dev, PCI_CONF_BAR1);
    215     sal_printf("%04x: %08x  BaseAddress1=%08x\n",
    216 	       PCI_CONF_BAR1, data, data);
    217 
    218     data = pci_config_getw(dev, PCI_CONF_BAR2);
    219     sal_printf("%04x: %08x  BaseAddress2=%08x\n",
    220 	       PCI_CONF_BAR2, data, data);
    221 
    222     data = pci_config_getw(dev, PCI_CONF_BAR3);
    223     sal_printf("%04x: %08x  BaseAddress3=%08x\n",
    224 	       PCI_CONF_BAR3, data, data);
    225 
    226     data = pci_config_getw(dev, PCI_CONF_BAR4);
    227     sal_printf("%04x: %08x  BaseAddress4=%08x\n",
    228 	       PCI_CONF_BAR4, data, data);
    229 
    230     data = pci_config_getw(dev, PCI_CONF_BAR5);
    231     sal_printf("%04x: %08x  BaseAddress5=%08x\n",
    232 	       PCI_CONF_BAR5, data, data);
    233 
    234     data = pci_config_getw(dev, PCI_CONF_CB_CIS_PTR);
    235     sal_printf("%04x: %08x  CardbusCISPointer=%08x\n",
    236 	       PCI_CONF_CB_CIS_PTR, data, data);
    237 
    238     data = pci_config_getw(dev, PCI_CONF_SUBSYS_VENDOR_ID);
    239     sal_printf("%04x: %08x  SubsystemID=%02x  SubsystemVendorID=%02x\n",
    240 	       PCI_CONF_SUBSYS_VENDOR_ID, data,
    241 	       (data & 0xffff0000) >> 16,
    242 	       (data & 0x0000ffff) >>  0);
    243 
    244     data = pci_config_getw(dev, PCI_CONF_EXP_ROM);
    245     sal_printf("%04x: %08x  ExpansionROMBaseAddress=%08x\n",
    246 	       PCI_CONF_EXP_ROM, data, data);
    247 
    248     data = pci_config_getw(dev, 0x34);
    249     sal_printf("%04x: %08x  Reserved=%06x  CapabilitiesPointer=%02x\n",
    250 	       0x34, data,
    251 	       (data & 0xffffff00) >> 8,
    252 	       (data & 0x000000ff) >> 0);
    253 
    254     data = pci_config_getw(dev, 0x38);
    255     sal_printf("%04x: %08x  Reserved=%08x\n",
    256 	       0x38, data, data);
    257 
    258     data = pci_config_getw(dev, PCI_CONF_INTERRUPT_LINE);
    259     sal_printf("%04x: %08x  Max_Lat=%02x  Min_Gnt=%02x  "
    260 	       "InterruptLine=%02x  InterruptPin=%02x\n",
    261 	       PCI_CONF_INTERRUPT_LINE, data,
    262 	       (data & 0xff000000) >> 24,
    263 	       (data & 0x00ff0000) >> 16,
    264 	       (data & 0x0000ff00) >>  8,
    265 	       (data & 0x000000ff) >>  0);
    266 
    267     data = pci_config_getw(dev, 0x40);
    268     sal_printf("%04x: %08x  Reserved=%02x  "
    269 	       "RetryTimeoutValue=%02x  TRDYTimeoutValue=%02x\n",
    270 	       0x40, data,
    271 	       (data & 0xffff0000) >> 16,
    272 	       (data & 0x0000ff00) >>  8,
    273 	       (data & 0x000000ff) >>  0);
    274 }
    275 #else
    276 int _sal_appl_pci_common_not_empty;
    277 #endif /* !BCM_ICS && !LINUX && !GHS */