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 */