Annotation of embedaddon/pciutils/ls-caps.c, revision 1.1
1.1 ! misho 1: /*
! 2: * The PCI Utilities -- Show Capabilities
! 3: *
! 4: * Copyright (c) 1997--2010 Martin Mares <mj@ucw.cz>
! 5: *
! 6: * Can be freely distributed and used under the terms of the GNU GPL.
! 7: */
! 8:
! 9: #include <stdio.h>
! 10: #include <string.h>
! 11:
! 12: #include "lspci.h"
! 13:
! 14: static void
! 15: cap_pm(struct device *d, int where, int cap)
! 16: {
! 17: int t, b;
! 18: static int pm_aux_current[8] = { 0, 55, 100, 160, 220, 270, 320, 375 };
! 19:
! 20: printf("Power Management version %d\n", cap & PCI_PM_CAP_VER_MASK);
! 21: if (verbose < 2)
! 22: return;
! 23: printf("\t\tFlags: PMEClk%c DSI%c D1%c D2%c AuxCurrent=%dmA PME(D0%c,D1%c,D2%c,D3hot%c,D3cold%c)\n",
! 24: FLAG(cap, PCI_PM_CAP_PME_CLOCK),
! 25: FLAG(cap, PCI_PM_CAP_DSI),
! 26: FLAG(cap, PCI_PM_CAP_D1),
! 27: FLAG(cap, PCI_PM_CAP_D2),
! 28: pm_aux_current[(cap >> 6) & 7],
! 29: FLAG(cap, PCI_PM_CAP_PME_D0),
! 30: FLAG(cap, PCI_PM_CAP_PME_D1),
! 31: FLAG(cap, PCI_PM_CAP_PME_D2),
! 32: FLAG(cap, PCI_PM_CAP_PME_D3_HOT),
! 33: FLAG(cap, PCI_PM_CAP_PME_D3_COLD));
! 34: if (!config_fetch(d, where + PCI_PM_CTRL, PCI_PM_SIZEOF - PCI_PM_CTRL))
! 35: return;
! 36: t = get_conf_word(d, where + PCI_PM_CTRL);
! 37: printf("\t\tStatus: D%d NoSoftRst%c PME-Enable%c DSel=%d DScale=%d PME%c\n",
! 38: t & PCI_PM_CTRL_STATE_MASK,
! 39: FLAG(t, PCI_PM_CTRL_NO_SOFT_RST),
! 40: FLAG(t, PCI_PM_CTRL_PME_ENABLE),
! 41: (t & PCI_PM_CTRL_DATA_SEL_MASK) >> 9,
! 42: (t & PCI_PM_CTRL_DATA_SCALE_MASK) >> 13,
! 43: FLAG(t, PCI_PM_CTRL_PME_STATUS));
! 44: b = get_conf_byte(d, where + PCI_PM_PPB_EXTENSIONS);
! 45: if (b)
! 46: printf("\t\tBridge: PM%c B3%c\n",
! 47: FLAG(t, PCI_PM_BPCC_ENABLE),
! 48: FLAG(~t, PCI_PM_PPB_B2_B3));
! 49: }
! 50:
! 51: static void
! 52: format_agp_rate(int rate, char *buf, int agp3)
! 53: {
! 54: char *c = buf;
! 55: int i;
! 56:
! 57: for (i=0; i<=2; i++)
! 58: if (rate & (1 << i))
! 59: {
! 60: if (c != buf)
! 61: *c++ = ',';
! 62: c += sprintf(c, "x%d", 1 << (i + 2*agp3));
! 63: }
! 64: if (c != buf)
! 65: *c = 0;
! 66: else
! 67: strcpy(buf, "<none>");
! 68: }
! 69:
! 70: static void
! 71: cap_agp(struct device *d, int where, int cap)
! 72: {
! 73: u32 t;
! 74: char rate[16];
! 75: int ver, rev;
! 76: int agp3 = 0;
! 77:
! 78: ver = (cap >> 4) & 0x0f;
! 79: rev = cap & 0x0f;
! 80: printf("AGP version %x.%x\n", ver, rev);
! 81: if (verbose < 2)
! 82: return;
! 83: if (!config_fetch(d, where + PCI_AGP_STATUS, PCI_AGP_SIZEOF - PCI_AGP_STATUS))
! 84: return;
! 85: t = get_conf_long(d, where + PCI_AGP_STATUS);
! 86: if (ver >= 3 && (t & PCI_AGP_STATUS_AGP3))
! 87: agp3 = 1;
! 88: format_agp_rate(t & 7, rate, agp3);
! 89: printf("\t\tStatus: RQ=%d Iso%c ArqSz=%d Cal=%d SBA%c ITACoh%c GART64%c HTrans%c 64bit%c FW%c AGP3%c Rate=%s\n",
! 90: ((t & PCI_AGP_STATUS_RQ_MASK) >> 24U) + 1,
! 91: FLAG(t, PCI_AGP_STATUS_ISOCH),
! 92: ((t & PCI_AGP_STATUS_ARQSZ_MASK) >> 13),
! 93: ((t & PCI_AGP_STATUS_CAL_MASK) >> 10),
! 94: FLAG(t, PCI_AGP_STATUS_SBA),
! 95: FLAG(t, PCI_AGP_STATUS_ITA_COH),
! 96: FLAG(t, PCI_AGP_STATUS_GART64),
! 97: FLAG(t, PCI_AGP_STATUS_HTRANS),
! 98: FLAG(t, PCI_AGP_STATUS_64BIT),
! 99: FLAG(t, PCI_AGP_STATUS_FW),
! 100: FLAG(t, PCI_AGP_STATUS_AGP3),
! 101: rate);
! 102: t = get_conf_long(d, where + PCI_AGP_COMMAND);
! 103: format_agp_rate(t & 7, rate, agp3);
! 104: printf("\t\tCommand: RQ=%d ArqSz=%d Cal=%d SBA%c AGP%c GART64%c 64bit%c FW%c Rate=%s\n",
! 105: ((t & PCI_AGP_COMMAND_RQ_MASK) >> 24U) + 1,
! 106: ((t & PCI_AGP_COMMAND_ARQSZ_MASK) >> 13),
! 107: ((t & PCI_AGP_COMMAND_CAL_MASK) >> 10),
! 108: FLAG(t, PCI_AGP_COMMAND_SBA),
! 109: FLAG(t, PCI_AGP_COMMAND_AGP),
! 110: FLAG(t, PCI_AGP_COMMAND_GART64),
! 111: FLAG(t, PCI_AGP_COMMAND_64BIT),
! 112: FLAG(t, PCI_AGP_COMMAND_FW),
! 113: rate);
! 114: }
! 115:
! 116: static void
! 117: cap_pcix_nobridge(struct device *d, int where)
! 118: {
! 119: u16 command;
! 120: u32 status;
! 121: static const byte max_outstanding[8] = { 1, 2, 3, 4, 8, 12, 16, 32 };
! 122:
! 123: printf("PCI-X non-bridge device\n");
! 124:
! 125: if (verbose < 2)
! 126: return;
! 127:
! 128: if (!config_fetch(d, where + PCI_PCIX_STATUS, 4))
! 129: return;
! 130:
! 131: command = get_conf_word(d, where + PCI_PCIX_COMMAND);
! 132: status = get_conf_long(d, where + PCI_PCIX_STATUS);
! 133: printf("\t\tCommand: DPERE%c ERO%c RBC=%d OST=%d\n",
! 134: FLAG(command, PCI_PCIX_COMMAND_DPERE),
! 135: FLAG(command, PCI_PCIX_COMMAND_ERO),
! 136: 1 << (9 + ((command & PCI_PCIX_COMMAND_MAX_MEM_READ_BYTE_COUNT) >> 2U)),
! 137: max_outstanding[(command & PCI_PCIX_COMMAND_MAX_OUTSTANDING_SPLIT_TRANS) >> 4U]);
! 138: printf("\t\tStatus: Dev=%02x:%02x.%d 64bit%c 133MHz%c SCD%c USC%c DC=%s DMMRBC=%u DMOST=%u DMCRS=%u RSCEM%c 266MHz%c 533MHz%c\n",
! 139: ((status >> 8) & 0xff),
! 140: ((status >> 3) & 0x1f),
! 141: (status & PCI_PCIX_STATUS_FUNCTION),
! 142: FLAG(status, PCI_PCIX_STATUS_64BIT),
! 143: FLAG(status, PCI_PCIX_STATUS_133MHZ),
! 144: FLAG(status, PCI_PCIX_STATUS_SC_DISCARDED),
! 145: FLAG(status, PCI_PCIX_STATUS_UNEXPECTED_SC),
! 146: ((status & PCI_PCIX_STATUS_DEVICE_COMPLEXITY) ? "bridge" : "simple"),
! 147: 1 << (9 + ((status >> 21) & 3U)),
! 148: max_outstanding[(status >> 23) & 7U],
! 149: 1 << (3 + ((status >> 26) & 7U)),
! 150: FLAG(status, PCI_PCIX_STATUS_RCVD_SC_ERR_MESS),
! 151: FLAG(status, PCI_PCIX_STATUS_266MHZ),
! 152: FLAG(status, PCI_PCIX_STATUS_533MHZ));
! 153: }
! 154:
! 155: static void
! 156: cap_pcix_bridge(struct device *d, int where)
! 157: {
! 158: static const char * const sec_clock_freq[8] = { "conv", "66MHz", "100MHz", "133MHz", "?4", "?5", "?6", "?7" };
! 159: u16 secstatus;
! 160: u32 status, upstcr, downstcr;
! 161:
! 162: printf("PCI-X bridge device\n");
! 163:
! 164: if (verbose < 2)
! 165: return;
! 166:
! 167: if (!config_fetch(d, where + PCI_PCIX_BRIDGE_STATUS, 12))
! 168: return;
! 169:
! 170: secstatus = get_conf_word(d, where + PCI_PCIX_BRIDGE_SEC_STATUS);
! 171: printf("\t\tSecondary Status: 64bit%c 133MHz%c SCD%c USC%c SCO%c SRD%c Freq=%s\n",
! 172: FLAG(secstatus, PCI_PCIX_BRIDGE_SEC_STATUS_64BIT),
! 173: FLAG(secstatus, PCI_PCIX_BRIDGE_SEC_STATUS_133MHZ),
! 174: FLAG(secstatus, PCI_PCIX_BRIDGE_SEC_STATUS_SC_DISCARDED),
! 175: FLAG(secstatus, PCI_PCIX_BRIDGE_SEC_STATUS_UNEXPECTED_SC),
! 176: FLAG(secstatus, PCI_PCIX_BRIDGE_SEC_STATUS_SC_OVERRUN),
! 177: FLAG(secstatus, PCI_PCIX_BRIDGE_SEC_STATUS_SPLIT_REQUEST_DELAYED),
! 178: sec_clock_freq[(secstatus >> 6) & 7]);
! 179: status = get_conf_long(d, where + PCI_PCIX_BRIDGE_STATUS);
! 180: printf("\t\tStatus: Dev=%02x:%02x.%d 64bit%c 133MHz%c SCD%c USC%c SCO%c SRD%c\n",
! 181: ((status >> 8) & 0xff),
! 182: ((status >> 3) & 0x1f),
! 183: (status & PCI_PCIX_BRIDGE_STATUS_FUNCTION),
! 184: FLAG(status, PCI_PCIX_BRIDGE_STATUS_64BIT),
! 185: FLAG(status, PCI_PCIX_BRIDGE_STATUS_133MHZ),
! 186: FLAG(status, PCI_PCIX_BRIDGE_STATUS_SC_DISCARDED),
! 187: FLAG(status, PCI_PCIX_BRIDGE_STATUS_UNEXPECTED_SC),
! 188: FLAG(status, PCI_PCIX_BRIDGE_STATUS_SC_OVERRUN),
! 189: FLAG(status, PCI_PCIX_BRIDGE_STATUS_SPLIT_REQUEST_DELAYED));
! 190: upstcr = get_conf_long(d, where + PCI_PCIX_BRIDGE_UPSTREAM_SPLIT_TRANS_CTRL);
! 191: printf("\t\tUpstream: Capacity=%u CommitmentLimit=%u\n",
! 192: (upstcr & PCI_PCIX_BRIDGE_STR_CAPACITY),
! 193: (upstcr >> 16) & 0xffff);
! 194: downstcr = get_conf_long(d, where + PCI_PCIX_BRIDGE_DOWNSTREAM_SPLIT_TRANS_CTRL);
! 195: printf("\t\tDownstream: Capacity=%u CommitmentLimit=%u\n",
! 196: (downstcr & PCI_PCIX_BRIDGE_STR_CAPACITY),
! 197: (downstcr >> 16) & 0xffff);
! 198: }
! 199:
! 200: static void
! 201: cap_pcix(struct device *d, int where)
! 202: {
! 203: switch (get_conf_byte(d, PCI_HEADER_TYPE) & 0x7f)
! 204: {
! 205: case PCI_HEADER_TYPE_NORMAL:
! 206: cap_pcix_nobridge(d, where);
! 207: break;
! 208: case PCI_HEADER_TYPE_BRIDGE:
! 209: cap_pcix_bridge(d, where);
! 210: break;
! 211: }
! 212: }
! 213:
! 214: static inline char *
! 215: ht_link_width(unsigned width)
! 216: {
! 217: static char * const widths[8] = { "8bit", "16bit", "[2]", "32bit", "2bit", "4bit", "[6]", "N/C" };
! 218: return widths[width];
! 219: }
! 220:
! 221: static inline char *
! 222: ht_link_freq(unsigned freq)
! 223: {
! 224: static char * const freqs[16] = { "200MHz", "300MHz", "400MHz", "500MHz", "600MHz", "800MHz", "1.0GHz", "1.2GHz",
! 225: "1.4GHz", "1.6GHz", "[a]", "[b]", "[c]", "[d]", "[e]", "Vend" };
! 226: return freqs[freq];
! 227: }
! 228:
! 229: static void
! 230: cap_ht_pri(struct device *d, int where, int cmd)
! 231: {
! 232: u16 lctr0, lcnf0, lctr1, lcnf1, eh;
! 233: u8 rid, lfrer0, lfcap0, ftr, lfrer1, lfcap1, mbu, mlu, bn;
! 234: char *fmt;
! 235:
! 236: printf("HyperTransport: Slave or Primary Interface\n");
! 237: if (verbose < 2)
! 238: return;
! 239:
! 240: if (!config_fetch(d, where + PCI_HT_PRI_LCTR0, PCI_HT_PRI_SIZEOF - PCI_HT_PRI_LCTR0))
! 241: return;
! 242: rid = get_conf_byte(d, where + PCI_HT_PRI_RID);
! 243: if (rid < 0x22 && rid > 0x11)
! 244: printf("\t\t!!! Possibly incomplete decoding\n");
! 245:
! 246: if (rid >= 0x22)
! 247: fmt = "\t\tCommand: BaseUnitID=%u UnitCnt=%u MastHost%c DefDir%c DUL%c\n";
! 248: else
! 249: fmt = "\t\tCommand: BaseUnitID=%u UnitCnt=%u MastHost%c DefDir%c\n";
! 250: printf(fmt,
! 251: (cmd & PCI_HT_PRI_CMD_BUID),
! 252: (cmd & PCI_HT_PRI_CMD_UC) >> 5,
! 253: FLAG(cmd, PCI_HT_PRI_CMD_MH),
! 254: FLAG(cmd, PCI_HT_PRI_CMD_DD),
! 255: FLAG(cmd, PCI_HT_PRI_CMD_DUL));
! 256: lctr0 = get_conf_word(d, where + PCI_HT_PRI_LCTR0);
! 257: if (rid >= 0x22)
! 258: fmt = "\t\tLink Control 0: CFlE%c CST%c CFE%c <LkFail%c Init%c EOC%c TXO%c <CRCErr=%x IsocEn%c LSEn%c ExtCTL%c 64b%c\n";
! 259: else
! 260: fmt = "\t\tLink Control 0: CFlE%c CST%c CFE%c <LkFail%c Init%c EOC%c TXO%c <CRCErr=%x\n";
! 261: printf(fmt,
! 262: FLAG(lctr0, PCI_HT_LCTR_CFLE),
! 263: FLAG(lctr0, PCI_HT_LCTR_CST),
! 264: FLAG(lctr0, PCI_HT_LCTR_CFE),
! 265: FLAG(lctr0, PCI_HT_LCTR_LKFAIL),
! 266: FLAG(lctr0, PCI_HT_LCTR_INIT),
! 267: FLAG(lctr0, PCI_HT_LCTR_EOC),
! 268: FLAG(lctr0, PCI_HT_LCTR_TXO),
! 269: (lctr0 & PCI_HT_LCTR_CRCERR) >> 8,
! 270: FLAG(lctr0, PCI_HT_LCTR_ISOCEN),
! 271: FLAG(lctr0, PCI_HT_LCTR_LSEN),
! 272: FLAG(lctr0, PCI_HT_LCTR_EXTCTL),
! 273: FLAG(lctr0, PCI_HT_LCTR_64B));
! 274: lcnf0 = get_conf_word(d, where + PCI_HT_PRI_LCNF0);
! 275: if (rid >= 0x22)
! 276: fmt = "\t\tLink Config 0: MLWI=%1$s DwFcIn%5$c MLWO=%2$s DwFcOut%6$c LWI=%3$s DwFcInEn%7$c LWO=%4$s DwFcOutEn%8$c\n";
! 277: else
! 278: fmt = "\t\tLink Config 0: MLWI=%s MLWO=%s LWI=%s LWO=%s\n";
! 279: printf(fmt,
! 280: ht_link_width(lcnf0 & PCI_HT_LCNF_MLWI),
! 281: ht_link_width((lcnf0 & PCI_HT_LCNF_MLWO) >> 4),
! 282: ht_link_width((lcnf0 & PCI_HT_LCNF_LWI) >> 8),
! 283: ht_link_width((lcnf0 & PCI_HT_LCNF_LWO) >> 12),
! 284: FLAG(lcnf0, PCI_HT_LCNF_DFI),
! 285: FLAG(lcnf0, PCI_HT_LCNF_DFO),
! 286: FLAG(lcnf0, PCI_HT_LCNF_DFIE),
! 287: FLAG(lcnf0, PCI_HT_LCNF_DFOE));
! 288: lctr1 = get_conf_word(d, where + PCI_HT_PRI_LCTR1);
! 289: if (rid >= 0x22)
! 290: fmt = "\t\tLink Control 1: CFlE%c CST%c CFE%c <LkFail%c Init%c EOC%c TXO%c <CRCErr=%x IsocEn%c LSEn%c ExtCTL%c 64b%c\n";
! 291: else
! 292: fmt = "\t\tLink Control 1: CFlE%c CST%c CFE%c <LkFail%c Init%c EOC%c TXO%c <CRCErr=%x\n";
! 293: printf(fmt,
! 294: FLAG(lctr1, PCI_HT_LCTR_CFLE),
! 295: FLAG(lctr1, PCI_HT_LCTR_CST),
! 296: FLAG(lctr1, PCI_HT_LCTR_CFE),
! 297: FLAG(lctr1, PCI_HT_LCTR_LKFAIL),
! 298: FLAG(lctr1, PCI_HT_LCTR_INIT),
! 299: FLAG(lctr1, PCI_HT_LCTR_EOC),
! 300: FLAG(lctr1, PCI_HT_LCTR_TXO),
! 301: (lctr1 & PCI_HT_LCTR_CRCERR) >> 8,
! 302: FLAG(lctr1, PCI_HT_LCTR_ISOCEN),
! 303: FLAG(lctr1, PCI_HT_LCTR_LSEN),
! 304: FLAG(lctr1, PCI_HT_LCTR_EXTCTL),
! 305: FLAG(lctr1, PCI_HT_LCTR_64B));
! 306: lcnf1 = get_conf_word(d, where + PCI_HT_PRI_LCNF1);
! 307: if (rid >= 0x22)
! 308: fmt = "\t\tLink Config 1: MLWI=%1$s DwFcIn%5$c MLWO=%2$s DwFcOut%6$c LWI=%3$s DwFcInEn%7$c LWO=%4$s DwFcOutEn%8$c\n";
! 309: else
! 310: fmt = "\t\tLink Config 1: MLWI=%s MLWO=%s LWI=%s LWO=%s\n";
! 311: printf(fmt,
! 312: ht_link_width(lcnf1 & PCI_HT_LCNF_MLWI),
! 313: ht_link_width((lcnf1 & PCI_HT_LCNF_MLWO) >> 4),
! 314: ht_link_width((lcnf1 & PCI_HT_LCNF_LWI) >> 8),
! 315: ht_link_width((lcnf1 & PCI_HT_LCNF_LWO) >> 12),
! 316: FLAG(lcnf1, PCI_HT_LCNF_DFI),
! 317: FLAG(lcnf1, PCI_HT_LCNF_DFO),
! 318: FLAG(lcnf1, PCI_HT_LCNF_DFIE),
! 319: FLAG(lcnf1, PCI_HT_LCNF_DFOE));
! 320: printf("\t\tRevision ID: %u.%02u\n",
! 321: (rid & PCI_HT_RID_MAJ) >> 5, (rid & PCI_HT_RID_MIN));
! 322: if (rid < 0x22)
! 323: return;
! 324: lfrer0 = get_conf_byte(d, where + PCI_HT_PRI_LFRER0);
! 325: printf("\t\tLink Frequency 0: %s\n", ht_link_freq(lfrer0 & PCI_HT_LFRER_FREQ));
! 326: printf("\t\tLink Error 0: <Prot%c <Ovfl%c <EOC%c CTLTm%c\n",
! 327: FLAG(lfrer0, PCI_HT_LFRER_PROT),
! 328: FLAG(lfrer0, PCI_HT_LFRER_OV),
! 329: FLAG(lfrer0, PCI_HT_LFRER_EOC),
! 330: FLAG(lfrer0, PCI_HT_LFRER_CTLT));
! 331: lfcap0 = get_conf_byte(d, where + PCI_HT_PRI_LFCAP0);
! 332: printf("\t\tLink Frequency Capability 0: 200MHz%c 300MHz%c 400MHz%c 500MHz%c 600MHz%c 800MHz%c 1.0GHz%c 1.2GHz%c 1.4GHz%c 1.6GHz%c Vend%c\n",
! 333: FLAG(lfcap0, PCI_HT_LFCAP_200),
! 334: FLAG(lfcap0, PCI_HT_LFCAP_300),
! 335: FLAG(lfcap0, PCI_HT_LFCAP_400),
! 336: FLAG(lfcap0, PCI_HT_LFCAP_500),
! 337: FLAG(lfcap0, PCI_HT_LFCAP_600),
! 338: FLAG(lfcap0, PCI_HT_LFCAP_800),
! 339: FLAG(lfcap0, PCI_HT_LFCAP_1000),
! 340: FLAG(lfcap0, PCI_HT_LFCAP_1200),
! 341: FLAG(lfcap0, PCI_HT_LFCAP_1400),
! 342: FLAG(lfcap0, PCI_HT_LFCAP_1600),
! 343: FLAG(lfcap0, PCI_HT_LFCAP_VEND));
! 344: ftr = get_conf_byte(d, where + PCI_HT_PRI_FTR);
! 345: printf("\t\tFeature Capability: IsocFC%c LDTSTOP%c CRCTM%c ECTLT%c 64bA%c UIDRD%c\n",
! 346: FLAG(ftr, PCI_HT_FTR_ISOCFC),
! 347: FLAG(ftr, PCI_HT_FTR_LDTSTOP),
! 348: FLAG(ftr, PCI_HT_FTR_CRCTM),
! 349: FLAG(ftr, PCI_HT_FTR_ECTLT),
! 350: FLAG(ftr, PCI_HT_FTR_64BA),
! 351: FLAG(ftr, PCI_HT_FTR_UIDRD));
! 352: lfrer1 = get_conf_byte(d, where + PCI_HT_PRI_LFRER1);
! 353: printf("\t\tLink Frequency 1: %s\n", ht_link_freq(lfrer1 & PCI_HT_LFRER_FREQ));
! 354: printf("\t\tLink Error 1: <Prot%c <Ovfl%c <EOC%c CTLTm%c\n",
! 355: FLAG(lfrer1, PCI_HT_LFRER_PROT),
! 356: FLAG(lfrer1, PCI_HT_LFRER_OV),
! 357: FLAG(lfrer1, PCI_HT_LFRER_EOC),
! 358: FLAG(lfrer1, PCI_HT_LFRER_CTLT));
! 359: lfcap1 = get_conf_byte(d, where + PCI_HT_PRI_LFCAP1);
! 360: printf("\t\tLink Frequency Capability 1: 200MHz%c 300MHz%c 400MHz%c 500MHz%c 600MHz%c 800MHz%c 1.0GHz%c 1.2GHz%c 1.4GHz%c 1.6GHz%c Vend%c\n",
! 361: FLAG(lfcap1, PCI_HT_LFCAP_200),
! 362: FLAG(lfcap1, PCI_HT_LFCAP_300),
! 363: FLAG(lfcap1, PCI_HT_LFCAP_400),
! 364: FLAG(lfcap1, PCI_HT_LFCAP_500),
! 365: FLAG(lfcap1, PCI_HT_LFCAP_600),
! 366: FLAG(lfcap1, PCI_HT_LFCAP_800),
! 367: FLAG(lfcap1, PCI_HT_LFCAP_1000),
! 368: FLAG(lfcap1, PCI_HT_LFCAP_1200),
! 369: FLAG(lfcap1, PCI_HT_LFCAP_1400),
! 370: FLAG(lfcap1, PCI_HT_LFCAP_1600),
! 371: FLAG(lfcap1, PCI_HT_LFCAP_VEND));
! 372: eh = get_conf_word(d, where + PCI_HT_PRI_EH);
! 373: printf("\t\tError Handling: PFlE%c OFlE%c PFE%c OFE%c EOCFE%c RFE%c CRCFE%c SERRFE%c CF%c RE%c PNFE%c ONFE%c EOCNFE%c RNFE%c CRCNFE%c SERRNFE%c\n",
! 374: FLAG(eh, PCI_HT_EH_PFLE),
! 375: FLAG(eh, PCI_HT_EH_OFLE),
! 376: FLAG(eh, PCI_HT_EH_PFE),
! 377: FLAG(eh, PCI_HT_EH_OFE),
! 378: FLAG(eh, PCI_HT_EH_EOCFE),
! 379: FLAG(eh, PCI_HT_EH_RFE),
! 380: FLAG(eh, PCI_HT_EH_CRCFE),
! 381: FLAG(eh, PCI_HT_EH_SERRFE),
! 382: FLAG(eh, PCI_HT_EH_CF),
! 383: FLAG(eh, PCI_HT_EH_RE),
! 384: FLAG(eh, PCI_HT_EH_PNFE),
! 385: FLAG(eh, PCI_HT_EH_ONFE),
! 386: FLAG(eh, PCI_HT_EH_EOCNFE),
! 387: FLAG(eh, PCI_HT_EH_RNFE),
! 388: FLAG(eh, PCI_HT_EH_CRCNFE),
! 389: FLAG(eh, PCI_HT_EH_SERRNFE));
! 390: mbu = get_conf_byte(d, where + PCI_HT_PRI_MBU);
! 391: mlu = get_conf_byte(d, where + PCI_HT_PRI_MLU);
! 392: printf("\t\tPrefetchable memory behind bridge Upper: %02x-%02x\n", mbu, mlu);
! 393: bn = get_conf_byte(d, where + PCI_HT_PRI_BN);
! 394: printf("\t\tBus Number: %02x\n", bn);
! 395: }
! 396:
! 397: static void
! 398: cap_ht_sec(struct device *d, int where, int cmd)
! 399: {
! 400: u16 lctr, lcnf, ftr, eh;
! 401: u8 rid, lfrer, lfcap, mbu, mlu;
! 402: char *fmt;
! 403:
! 404: printf("HyperTransport: Host or Secondary Interface\n");
! 405: if (verbose < 2)
! 406: return;
! 407:
! 408: if (!config_fetch(d, where + PCI_HT_SEC_LCTR, PCI_HT_SEC_SIZEOF - PCI_HT_SEC_LCTR))
! 409: return;
! 410: rid = get_conf_byte(d, where + PCI_HT_SEC_RID);
! 411: if (rid < 0x22 && rid > 0x11)
! 412: printf("\t\t!!! Possibly incomplete decoding\n");
! 413:
! 414: if (rid >= 0x22)
! 415: fmt = "\t\tCommand: WarmRst%c DblEnd%c DevNum=%u ChainSide%c HostHide%c Slave%c <EOCErr%c DUL%c\n";
! 416: else
! 417: fmt = "\t\tCommand: WarmRst%c DblEnd%c\n";
! 418: printf(fmt,
! 419: FLAG(cmd, PCI_HT_SEC_CMD_WR),
! 420: FLAG(cmd, PCI_HT_SEC_CMD_DE),
! 421: (cmd & PCI_HT_SEC_CMD_DN) >> 2,
! 422: FLAG(cmd, PCI_HT_SEC_CMD_CS),
! 423: FLAG(cmd, PCI_HT_SEC_CMD_HH),
! 424: FLAG(cmd, PCI_HT_SEC_CMD_AS),
! 425: FLAG(cmd, PCI_HT_SEC_CMD_HIECE),
! 426: FLAG(cmd, PCI_HT_SEC_CMD_DUL));
! 427: lctr = get_conf_word(d, where + PCI_HT_SEC_LCTR);
! 428: if (rid >= 0x22)
! 429: fmt = "\t\tLink Control: CFlE%c CST%c CFE%c <LkFail%c Init%c EOC%c TXO%c <CRCErr=%x IsocEn%c LSEn%c ExtCTL%c 64b%c\n";
! 430: else
! 431: fmt = "\t\tLink Control: CFlE%c CST%c CFE%c <LkFail%c Init%c EOC%c TXO%c <CRCErr=%x\n";
! 432: printf(fmt,
! 433: FLAG(lctr, PCI_HT_LCTR_CFLE),
! 434: FLAG(lctr, PCI_HT_LCTR_CST),
! 435: FLAG(lctr, PCI_HT_LCTR_CFE),
! 436: FLAG(lctr, PCI_HT_LCTR_LKFAIL),
! 437: FLAG(lctr, PCI_HT_LCTR_INIT),
! 438: FLAG(lctr, PCI_HT_LCTR_EOC),
! 439: FLAG(lctr, PCI_HT_LCTR_TXO),
! 440: (lctr & PCI_HT_LCTR_CRCERR) >> 8,
! 441: FLAG(lctr, PCI_HT_LCTR_ISOCEN),
! 442: FLAG(lctr, PCI_HT_LCTR_LSEN),
! 443: FLAG(lctr, PCI_HT_LCTR_EXTCTL),
! 444: FLAG(lctr, PCI_HT_LCTR_64B));
! 445: lcnf = get_conf_word(d, where + PCI_HT_SEC_LCNF);
! 446: if (rid >= 0x22)
! 447: fmt = "\t\tLink Config: MLWI=%1$s DwFcIn%5$c MLWO=%2$s DwFcOut%6$c LWI=%3$s DwFcInEn%7$c LWO=%4$s DwFcOutEn%8$c\n";
! 448: else
! 449: fmt = "\t\tLink Config: MLWI=%s MLWO=%s LWI=%s LWO=%s\n";
! 450: printf(fmt,
! 451: ht_link_width(lcnf & PCI_HT_LCNF_MLWI),
! 452: ht_link_width((lcnf & PCI_HT_LCNF_MLWO) >> 4),
! 453: ht_link_width((lcnf & PCI_HT_LCNF_LWI) >> 8),
! 454: ht_link_width((lcnf & PCI_HT_LCNF_LWO) >> 12),
! 455: FLAG(lcnf, PCI_HT_LCNF_DFI),
! 456: FLAG(lcnf, PCI_HT_LCNF_DFO),
! 457: FLAG(lcnf, PCI_HT_LCNF_DFIE),
! 458: FLAG(lcnf, PCI_HT_LCNF_DFOE));
! 459: printf("\t\tRevision ID: %u.%02u\n",
! 460: (rid & PCI_HT_RID_MAJ) >> 5, (rid & PCI_HT_RID_MIN));
! 461: if (rid < 0x22)
! 462: return;
! 463: lfrer = get_conf_byte(d, where + PCI_HT_SEC_LFRER);
! 464: printf("\t\tLink Frequency: %s\n", ht_link_freq(lfrer & PCI_HT_LFRER_FREQ));
! 465: printf("\t\tLink Error: <Prot%c <Ovfl%c <EOC%c CTLTm%c\n",
! 466: FLAG(lfrer, PCI_HT_LFRER_PROT),
! 467: FLAG(lfrer, PCI_HT_LFRER_OV),
! 468: FLAG(lfrer, PCI_HT_LFRER_EOC),
! 469: FLAG(lfrer, PCI_HT_LFRER_CTLT));
! 470: lfcap = get_conf_byte(d, where + PCI_HT_SEC_LFCAP);
! 471: printf("\t\tLink Frequency Capability: 200MHz%c 300MHz%c 400MHz%c 500MHz%c 600MHz%c 800MHz%c 1.0GHz%c 1.2GHz%c 1.4GHz%c 1.6GHz%c Vend%c\n",
! 472: FLAG(lfcap, PCI_HT_LFCAP_200),
! 473: FLAG(lfcap, PCI_HT_LFCAP_300),
! 474: FLAG(lfcap, PCI_HT_LFCAP_400),
! 475: FLAG(lfcap, PCI_HT_LFCAP_500),
! 476: FLAG(lfcap, PCI_HT_LFCAP_600),
! 477: FLAG(lfcap, PCI_HT_LFCAP_800),
! 478: FLAG(lfcap, PCI_HT_LFCAP_1000),
! 479: FLAG(lfcap, PCI_HT_LFCAP_1200),
! 480: FLAG(lfcap, PCI_HT_LFCAP_1400),
! 481: FLAG(lfcap, PCI_HT_LFCAP_1600),
! 482: FLAG(lfcap, PCI_HT_LFCAP_VEND));
! 483: ftr = get_conf_word(d, where + PCI_HT_SEC_FTR);
! 484: printf("\t\tFeature Capability: IsocFC%c LDTSTOP%c CRCTM%c ECTLT%c 64bA%c UIDRD%c ExtRS%c UCnfE%c\n",
! 485: FLAG(ftr, PCI_HT_FTR_ISOCFC),
! 486: FLAG(ftr, PCI_HT_FTR_LDTSTOP),
! 487: FLAG(ftr, PCI_HT_FTR_CRCTM),
! 488: FLAG(ftr, PCI_HT_FTR_ECTLT),
! 489: FLAG(ftr, PCI_HT_FTR_64BA),
! 490: FLAG(ftr, PCI_HT_FTR_UIDRD),
! 491: FLAG(ftr, PCI_HT_SEC_FTR_EXTRS),
! 492: FLAG(ftr, PCI_HT_SEC_FTR_UCNFE));
! 493: if (ftr & PCI_HT_SEC_FTR_EXTRS)
! 494: {
! 495: eh = get_conf_word(d, where + PCI_HT_SEC_EH);
! 496: printf("\t\tError Handling: PFlE%c OFlE%c PFE%c OFE%c EOCFE%c RFE%c CRCFE%c SERRFE%c CF%c RE%c PNFE%c ONFE%c EOCNFE%c RNFE%c CRCNFE%c SERRNFE%c\n",
! 497: FLAG(eh, PCI_HT_EH_PFLE),
! 498: FLAG(eh, PCI_HT_EH_OFLE),
! 499: FLAG(eh, PCI_HT_EH_PFE),
! 500: FLAG(eh, PCI_HT_EH_OFE),
! 501: FLAG(eh, PCI_HT_EH_EOCFE),
! 502: FLAG(eh, PCI_HT_EH_RFE),
! 503: FLAG(eh, PCI_HT_EH_CRCFE),
! 504: FLAG(eh, PCI_HT_EH_SERRFE),
! 505: FLAG(eh, PCI_HT_EH_CF),
! 506: FLAG(eh, PCI_HT_EH_RE),
! 507: FLAG(eh, PCI_HT_EH_PNFE),
! 508: FLAG(eh, PCI_HT_EH_ONFE),
! 509: FLAG(eh, PCI_HT_EH_EOCNFE),
! 510: FLAG(eh, PCI_HT_EH_RNFE),
! 511: FLAG(eh, PCI_HT_EH_CRCNFE),
! 512: FLAG(eh, PCI_HT_EH_SERRNFE));
! 513: mbu = get_conf_byte(d, where + PCI_HT_SEC_MBU);
! 514: mlu = get_conf_byte(d, where + PCI_HT_SEC_MLU);
! 515: printf("\t\tPrefetchable memory behind bridge Upper: %02x-%02x\n", mbu, mlu);
! 516: }
! 517: }
! 518:
! 519: static void
! 520: cap_ht(struct device *d, int where, int cmd)
! 521: {
! 522: int type;
! 523:
! 524: switch (cmd & PCI_HT_CMD_TYP_HI)
! 525: {
! 526: case PCI_HT_CMD_TYP_HI_PRI:
! 527: cap_ht_pri(d, where, cmd);
! 528: return;
! 529: case PCI_HT_CMD_TYP_HI_SEC:
! 530: cap_ht_sec(d, where, cmd);
! 531: return;
! 532: }
! 533:
! 534: type = cmd & PCI_HT_CMD_TYP;
! 535: switch (type)
! 536: {
! 537: case PCI_HT_CMD_TYP_SW:
! 538: printf("HyperTransport: Switch\n");
! 539: break;
! 540: case PCI_HT_CMD_TYP_IDC:
! 541: printf("HyperTransport: Interrupt Discovery and Configuration\n");
! 542: break;
! 543: case PCI_HT_CMD_TYP_RID:
! 544: printf("HyperTransport: Revision ID: %u.%02u\n",
! 545: (cmd & PCI_HT_RID_MAJ) >> 5, (cmd & PCI_HT_RID_MIN));
! 546: break;
! 547: case PCI_HT_CMD_TYP_UIDC:
! 548: printf("HyperTransport: UnitID Clumping\n");
! 549: break;
! 550: case PCI_HT_CMD_TYP_ECSA:
! 551: printf("HyperTransport: Extended Configuration Space Access\n");
! 552: break;
! 553: case PCI_HT_CMD_TYP_AM:
! 554: printf("HyperTransport: Address Mapping\n");
! 555: break;
! 556: case PCI_HT_CMD_TYP_MSIM:
! 557: printf("HyperTransport: MSI Mapping Enable%c Fixed%c\n",
! 558: FLAG(cmd, PCI_HT_MSIM_CMD_EN),
! 559: FLAG(cmd, PCI_HT_MSIM_CMD_FIXD));
! 560: if (verbose >= 2 && !(cmd & PCI_HT_MSIM_CMD_FIXD))
! 561: {
! 562: u32 offl, offh;
! 563: if (!config_fetch(d, where + PCI_HT_MSIM_ADDR_LO, 8))
! 564: break;
! 565: offl = get_conf_long(d, where + PCI_HT_MSIM_ADDR_LO);
! 566: offh = get_conf_long(d, where + PCI_HT_MSIM_ADDR_HI);
! 567: printf("\t\tMapping Address Base: %016llx\n", ((unsigned long long)offh << 32) | (offl & ~0xfffff));
! 568: }
! 569: break;
! 570: case PCI_HT_CMD_TYP_DR:
! 571: printf("HyperTransport: DirectRoute\n");
! 572: break;
! 573: case PCI_HT_CMD_TYP_VCS:
! 574: printf("HyperTransport: VCSet\n");
! 575: break;
! 576: case PCI_HT_CMD_TYP_RM:
! 577: printf("HyperTransport: Retry Mode\n");
! 578: break;
! 579: case PCI_HT_CMD_TYP_X86:
! 580: printf("HyperTransport: X86 (reserved)\n");
! 581: break;
! 582: default:
! 583: printf("HyperTransport: #%02x\n", type >> 11);
! 584: }
! 585: }
! 586:
! 587: static void
! 588: cap_msi(struct device *d, int where, int cap)
! 589: {
! 590: int is64;
! 591: u32 t;
! 592: u16 w;
! 593:
! 594: printf("MSI: Enable%c Count=%d/%d Maskable%c 64bit%c\n",
! 595: FLAG(cap, PCI_MSI_FLAGS_ENABLE),
! 596: 1 << ((cap & PCI_MSI_FLAGS_QSIZE) >> 4),
! 597: 1 << ((cap & PCI_MSI_FLAGS_QMASK) >> 1),
! 598: FLAG(cap, PCI_MSI_FLAGS_MASK_BIT),
! 599: FLAG(cap, PCI_MSI_FLAGS_64BIT));
! 600: if (verbose < 2)
! 601: return;
! 602: is64 = cap & PCI_MSI_FLAGS_64BIT;
! 603: if (!config_fetch(d, where + PCI_MSI_ADDRESS_LO, (is64 ? PCI_MSI_DATA_64 : PCI_MSI_DATA_32) + 2 - PCI_MSI_ADDRESS_LO))
! 604: return;
! 605: printf("\t\tAddress: ");
! 606: if (is64)
! 607: {
! 608: t = get_conf_long(d, where + PCI_MSI_ADDRESS_HI);
! 609: w = get_conf_word(d, where + PCI_MSI_DATA_64);
! 610: printf("%08x", t);
! 611: }
! 612: else
! 613: w = get_conf_word(d, where + PCI_MSI_DATA_32);
! 614: t = get_conf_long(d, where + PCI_MSI_ADDRESS_LO);
! 615: printf("%08x Data: %04x\n", t, w);
! 616: if (cap & PCI_MSI_FLAGS_MASK_BIT)
! 617: {
! 618: u32 mask, pending;
! 619:
! 620: if (is64)
! 621: {
! 622: if (!config_fetch(d, where + PCI_MSI_MASK_BIT_64, 8))
! 623: return;
! 624: mask = get_conf_long(d, where + PCI_MSI_MASK_BIT_64);
! 625: pending = get_conf_long(d, where + PCI_MSI_PENDING_64);
! 626: }
! 627: else
! 628: {
! 629: if (!config_fetch(d, where + PCI_MSI_MASK_BIT_32, 8))
! 630: return;
! 631: mask = get_conf_long(d, where + PCI_MSI_MASK_BIT_32);
! 632: pending = get_conf_long(d, where + PCI_MSI_PENDING_32);
! 633: }
! 634: printf("\t\tMasking: %08x Pending: %08x\n", mask, pending);
! 635: }
! 636: }
! 637:
! 638: static float power_limit(int value, int scale)
! 639: {
! 640: static const float scales[4] = { 1.0, 0.1, 0.01, 0.001 };
! 641: return value * scales[scale];
! 642: }
! 643:
! 644: static const char *latency_l0s(int value)
! 645: {
! 646: static const char *latencies[] = { "<64ns", "<128ns", "<256ns", "<512ns", "<1us", "<2us", "<4us", "unlimited" };
! 647: return latencies[value];
! 648: }
! 649:
! 650: static const char *latency_l1(int value)
! 651: {
! 652: static const char *latencies[] = { "<1us", "<2us", "<4us", "<8us", "<16us", "<32us", "<64us", "unlimited" };
! 653: return latencies[value];
! 654: }
! 655:
! 656: static void cap_express_dev(struct device *d, int where, int type)
! 657: {
! 658: u32 t;
! 659: u16 w;
! 660:
! 661: t = get_conf_long(d, where + PCI_EXP_DEVCAP);
! 662: printf("\t\tDevCap:\tMaxPayload %d bytes, PhantFunc %d, Latency L0s %s, L1 %s\n",
! 663: 128 << (t & PCI_EXP_DEVCAP_PAYLOAD),
! 664: (1 << ((t & PCI_EXP_DEVCAP_PHANTOM) >> 3)) - 1,
! 665: latency_l0s((t & PCI_EXP_DEVCAP_L0S) >> 6),
! 666: latency_l1((t & PCI_EXP_DEVCAP_L1) >> 9));
! 667: printf("\t\t\tExtTag%c", FLAG(t, PCI_EXP_DEVCAP_EXT_TAG));
! 668: if ((type == PCI_EXP_TYPE_ENDPOINT) || (type == PCI_EXP_TYPE_LEG_END) ||
! 669: (type == PCI_EXP_TYPE_UPSTREAM) || (type == PCI_EXP_TYPE_PCI_BRIDGE))
! 670: printf(" AttnBtn%c AttnInd%c PwrInd%c",
! 671: FLAG(t, PCI_EXP_DEVCAP_ATN_BUT),
! 672: FLAG(t, PCI_EXP_DEVCAP_ATN_IND), FLAG(t, PCI_EXP_DEVCAP_PWR_IND));
! 673: printf(" RBE%c FLReset%c",
! 674: FLAG(t, PCI_EXP_DEVCAP_RBE),
! 675: FLAG(t, PCI_EXP_DEVCAP_FLRESET));
! 676: if (type == PCI_EXP_TYPE_UPSTREAM)
! 677: printf("SlotPowerLimit %.3fW",
! 678: power_limit((t & PCI_EXP_DEVCAP_PWR_VAL) >> 18,
! 679: (t & PCI_EXP_DEVCAP_PWR_SCL) >> 26));
! 680: printf("\n");
! 681:
! 682: w = get_conf_word(d, where + PCI_EXP_DEVCTL);
! 683: printf("\t\tDevCtl:\tReport errors: Correctable%c Non-Fatal%c Fatal%c Unsupported%c\n",
! 684: FLAG(w, PCI_EXP_DEVCTL_CERE),
! 685: FLAG(w, PCI_EXP_DEVCTL_NFERE),
! 686: FLAG(w, PCI_EXP_DEVCTL_FERE),
! 687: FLAG(w, PCI_EXP_DEVCTL_URRE));
! 688: printf("\t\t\tRlxdOrd%c ExtTag%c PhantFunc%c AuxPwr%c NoSnoop%c",
! 689: FLAG(w, PCI_EXP_DEVCTL_RELAXED),
! 690: FLAG(w, PCI_EXP_DEVCTL_EXT_TAG),
! 691: FLAG(w, PCI_EXP_DEVCTL_PHANTOM),
! 692: FLAG(w, PCI_EXP_DEVCTL_AUX_PME),
! 693: FLAG(w, PCI_EXP_DEVCTL_NOSNOOP));
! 694: if (type == PCI_EXP_TYPE_PCI_BRIDGE || type == PCI_EXP_TYPE_PCIE_BRIDGE)
! 695: printf(" BrConfRtry%c", FLAG(w, PCI_EXP_DEVCTL_BCRE));
! 696: if (type == PCI_EXP_TYPE_ENDPOINT && (t & PCI_EXP_DEVCAP_FLRESET))
! 697: printf(" FLReset%c", FLAG(w, PCI_EXP_DEVCTL_FLRESET));
! 698: printf("\n\t\t\tMaxPayload %d bytes, MaxReadReq %d bytes\n",
! 699: 128 << ((w & PCI_EXP_DEVCTL_PAYLOAD) >> 5),
! 700: 128 << ((w & PCI_EXP_DEVCTL_READRQ) >> 12));
! 701:
! 702: w = get_conf_word(d, where + PCI_EXP_DEVSTA);
! 703: printf("\t\tDevSta:\tCorrErr%c UncorrErr%c FatalErr%c UnsuppReq%c AuxPwr%c TransPend%c\n",
! 704: FLAG(w, PCI_EXP_DEVSTA_CED),
! 705: FLAG(w, PCI_EXP_DEVSTA_NFED),
! 706: FLAG(w, PCI_EXP_DEVSTA_FED),
! 707: FLAG(w, PCI_EXP_DEVSTA_URD),
! 708: FLAG(w, PCI_EXP_DEVSTA_AUXPD),
! 709: FLAG(w, PCI_EXP_DEVSTA_TRPND));
! 710: }
! 711:
! 712: static char *link_speed(int speed)
! 713: {
! 714: switch (speed)
! 715: {
! 716: case 1:
! 717: return "2.5GT/s";
! 718: case 2:
! 719: return "5GT/s";
! 720: case 3:
! 721: return "8GT/s";
! 722: default:
! 723: return "unknown";
! 724: }
! 725: }
! 726:
! 727: static char *aspm_support(int code)
! 728: {
! 729: switch (code)
! 730: {
! 731: case 1:
! 732: return "L0s";
! 733: case 2:
! 734: return "L1";
! 735: case 3:
! 736: return "L0s L1";
! 737: default:
! 738: return "unknown";
! 739: }
! 740: }
! 741:
! 742: static const char *aspm_enabled(int code)
! 743: {
! 744: static const char *desc[] = { "Disabled", "L0s Enabled", "L1 Enabled", "L0s L1 Enabled" };
! 745: return desc[code];
! 746: }
! 747:
! 748: static void cap_express_link(struct device *d, int where, int type)
! 749: {
! 750: u32 t;
! 751: u16 w;
! 752:
! 753: t = get_conf_long(d, where + PCI_EXP_LNKCAP);
! 754: printf("\t\tLnkCap:\tPort #%d, Speed %s, Width x%d, ASPM %s, Latency L0 %s, L1 %s\n",
! 755: t >> 24,
! 756: link_speed(t & PCI_EXP_LNKCAP_SPEED), (t & PCI_EXP_LNKCAP_WIDTH) >> 4,
! 757: aspm_support((t & PCI_EXP_LNKCAP_ASPM) >> 10),
! 758: latency_l0s((t & PCI_EXP_LNKCAP_L0S) >> 12),
! 759: latency_l1((t & PCI_EXP_LNKCAP_L1) >> 15));
! 760: printf("\t\t\tClockPM%c Surprise%c LLActRep%c BwNot%c\n",
! 761: FLAG(t, PCI_EXP_LNKCAP_CLOCKPM),
! 762: FLAG(t, PCI_EXP_LNKCAP_SURPRISE),
! 763: FLAG(t, PCI_EXP_LNKCAP_DLLA),
! 764: FLAG(t, PCI_EXP_LNKCAP_LBNC));
! 765:
! 766: w = get_conf_word(d, where + PCI_EXP_LNKCTL);
! 767: printf("\t\tLnkCtl:\tASPM %s;", aspm_enabled(w & PCI_EXP_LNKCTL_ASPM));
! 768: if ((type == PCI_EXP_TYPE_ROOT_PORT) || (type == PCI_EXP_TYPE_ENDPOINT) ||
! 769: (type == PCI_EXP_TYPE_LEG_END))
! 770: printf(" RCB %d bytes", w & PCI_EXP_LNKCTL_RCB ? 128 : 64);
! 771: printf(" Disabled%c Retrain%c CommClk%c\n\t\t\tExtSynch%c ClockPM%c AutWidDis%c BWInt%c AutBWInt%c\n",
! 772: FLAG(w, PCI_EXP_LNKCTL_DISABLE),
! 773: FLAG(w, PCI_EXP_LNKCTL_RETRAIN),
! 774: FLAG(w, PCI_EXP_LNKCTL_CLOCK),
! 775: FLAG(w, PCI_EXP_LNKCTL_XSYNCH),
! 776: FLAG(w, PCI_EXP_LNKCTL_CLOCKPM),
! 777: FLAG(w, PCI_EXP_LNKCTL_HWAUTWD),
! 778: FLAG(w, PCI_EXP_LNKCTL_BWMIE),
! 779: FLAG(w, PCI_EXP_LNKCTL_AUTBWIE));
! 780:
! 781: w = get_conf_word(d, where + PCI_EXP_LNKSTA);
! 782: printf("\t\tLnkSta:\tSpeed %s, Width x%d, TrErr%c Train%c SlotClk%c DLActive%c BWMgmt%c ABWMgmt%c\n",
! 783: link_speed(w & PCI_EXP_LNKSTA_SPEED),
! 784: (w & PCI_EXP_LNKSTA_WIDTH) >> 4,
! 785: FLAG(w, PCI_EXP_LNKSTA_TR_ERR),
! 786: FLAG(w, PCI_EXP_LNKSTA_TRAIN),
! 787: FLAG(w, PCI_EXP_LNKSTA_SL_CLK),
! 788: FLAG(w, PCI_EXP_LNKSTA_DL_ACT),
! 789: FLAG(w, PCI_EXP_LNKSTA_BWMGMT),
! 790: FLAG(w, PCI_EXP_LNKSTA_AUTBW));
! 791: }
! 792:
! 793: static const char *indicator(int code)
! 794: {
! 795: static const char *names[] = { "Unknown", "On", "Blink", "Off" };
! 796: return names[code];
! 797: }
! 798:
! 799: static void cap_express_slot(struct device *d, int where)
! 800: {
! 801: u32 t;
! 802: u16 w;
! 803:
! 804: t = get_conf_long(d, where + PCI_EXP_SLTCAP);
! 805: printf("\t\tSltCap:\tAttnBtn%c PwrCtrl%c MRL%c AttnInd%c PwrInd%c HotPlug%c Surprise%c\n",
! 806: FLAG(t, PCI_EXP_SLTCAP_ATNB),
! 807: FLAG(t, PCI_EXP_SLTCAP_PWRC),
! 808: FLAG(t, PCI_EXP_SLTCAP_MRL),
! 809: FLAG(t, PCI_EXP_SLTCAP_ATNI),
! 810: FLAG(t, PCI_EXP_SLTCAP_PWRI),
! 811: FLAG(t, PCI_EXP_SLTCAP_HPC),
! 812: FLAG(t, PCI_EXP_SLTCAP_HPS));
! 813: printf("\t\t\tSlot #%d, PowerLimit %.3fW; Interlock%c NoCompl%c\n",
! 814: t >> 19,
! 815: power_limit((t & PCI_EXP_SLTCAP_PWR_VAL) >> 7, (t & PCI_EXP_SLTCAP_PWR_SCL) >> 15),
! 816: FLAG(t, PCI_EXP_SLTCAP_INTERLOCK),
! 817: FLAG(t, PCI_EXP_SLTCAP_NOCMDCOMP));
! 818:
! 819: w = get_conf_word(d, where + PCI_EXP_SLTCTL);
! 820: printf("\t\tSltCtl:\tEnable: AttnBtn%c PwrFlt%c MRL%c PresDet%c CmdCplt%c HPIrq%c LinkChg%c\n",
! 821: FLAG(w, PCI_EXP_SLTCTL_ATNB),
! 822: FLAG(w, PCI_EXP_SLTCTL_PWRF),
! 823: FLAG(w, PCI_EXP_SLTCTL_MRLS),
! 824: FLAG(w, PCI_EXP_SLTCTL_PRSD),
! 825: FLAG(w, PCI_EXP_SLTCTL_CMDC),
! 826: FLAG(w, PCI_EXP_SLTCTL_HPIE),
! 827: FLAG(w, PCI_EXP_SLTCTL_LLCHG));
! 828: printf("\t\t\tControl: AttnInd %s, PwrInd %s, Power%c Interlock%c\n",
! 829: indicator((w & PCI_EXP_SLTCTL_ATNI) >> 6),
! 830: indicator((w & PCI_EXP_SLTCTL_PWRI) >> 8),
! 831: FLAG(w, PCI_EXP_SLTCTL_PWRC),
! 832: FLAG(w, PCI_EXP_SLTCTL_INTERLOCK));
! 833:
! 834: w = get_conf_word(d, where + PCI_EXP_SLTSTA);
! 835: printf("\t\tSltSta:\tStatus: AttnBtn%c PowerFlt%c MRL%c CmdCplt%c PresDet%c Interlock%c\n",
! 836: FLAG(w, PCI_EXP_SLTSTA_ATNB),
! 837: FLAG(w, PCI_EXP_SLTSTA_PWRF),
! 838: FLAG(w, PCI_EXP_SLTSTA_MRL_ST),
! 839: FLAG(w, PCI_EXP_SLTSTA_CMDC),
! 840: FLAG(w, PCI_EXP_SLTSTA_PRES),
! 841: FLAG(w, PCI_EXP_SLTSTA_INTERLOCK));
! 842: printf("\t\t\tChanged: MRL%c PresDet%c LinkState%c\n",
! 843: FLAG(w, PCI_EXP_SLTSTA_MRLS),
! 844: FLAG(w, PCI_EXP_SLTSTA_PRSD),
! 845: FLAG(w, PCI_EXP_SLTSTA_LLCHG));
! 846: }
! 847:
! 848: static void cap_express_root(struct device *d, int where)
! 849: {
! 850: u32 w = get_conf_word(d, where + PCI_EXP_RTCTL);
! 851: printf("\t\tRootCtl: ErrCorrectable%c ErrNon-Fatal%c ErrFatal%c PMEIntEna%c CRSVisible%c\n",
! 852: FLAG(w, PCI_EXP_RTCTL_SECEE),
! 853: FLAG(w, PCI_EXP_RTCTL_SENFEE),
! 854: FLAG(w, PCI_EXP_RTCTL_SEFEE),
! 855: FLAG(w, PCI_EXP_RTCTL_PMEIE),
! 856: FLAG(w, PCI_EXP_RTCTL_CRSVIS));
! 857:
! 858: w = get_conf_word(d, where + PCI_EXP_RTCAP);
! 859: printf("\t\tRootCap: CRSVisible%c\n",
! 860: FLAG(w, PCI_EXP_RTCAP_CRSVIS));
! 861:
! 862: w = get_conf_word(d, where + PCI_EXP_RTSTA);
! 863: printf("\t\tRootSta: PME ReqID %04x, PMEStatus%c PMEPending%c\n",
! 864: w & PCI_EXP_RTSTA_PME_REQID,
! 865: FLAG(w, PCI_EXP_RTSTA_PME_STATUS),
! 866: FLAG(w, PCI_EXP_RTSTA_PME_PENDING));
! 867: }
! 868:
! 869: static const char *cap_express_dev2_timeout_range(int type)
! 870: {
! 871: /* Decode Completion Timeout Ranges. */
! 872: switch (type)
! 873: {
! 874: case 0:
! 875: return "Not Supported";
! 876: case 1:
! 877: return "Range A";
! 878: case 2:
! 879: return "Range B";
! 880: case 3:
! 881: return "Range AB";
! 882: case 6:
! 883: return "Range BC";
! 884: case 7:
! 885: return "Range ABC";
! 886: case 14:
! 887: return "Range BCD";
! 888: case 15:
! 889: return "Range ABCD";
! 890: default:
! 891: return "Unknown";
! 892: }
! 893: }
! 894:
! 895: static const char *cap_express_dev2_timeout_value(int type)
! 896: {
! 897: /* Decode Completion Timeout Value. */
! 898: switch (type)
! 899: {
! 900: case 0:
! 901: return "50us to 50ms";
! 902: case 1:
! 903: return "50us to 100us";
! 904: case 2:
! 905: return "1ms to 10ms";
! 906: case 5:
! 907: return "16ms to 55ms";
! 908: case 6:
! 909: return "65ms to 210ms";
! 910: case 9:
! 911: return "260ms to 900ms";
! 912: case 10:
! 913: return "1s to 3.5s";
! 914: case 13:
! 915: return "4s to 13s";
! 916: case 14:
! 917: return "17s to 64s";
! 918: default:
! 919: return "Unknown";
! 920: }
! 921: }
! 922:
! 923: static void cap_express_dev2(struct device *d, int where, int type)
! 924: {
! 925: u32 l;
! 926: u16 w;
! 927:
! 928: l = get_conf_long(d, where + PCI_EXP_DEVCAP2);
! 929: printf("\t\tDevCap2: Completion Timeout: %s, TimeoutDis%c",
! 930: cap_express_dev2_timeout_range(PCI_EXP_DEV2_TIMEOUT_RANGE(l)),
! 931: FLAG(l, PCI_EXP_DEV2_TIMEOUT_DIS));
! 932: if (type == PCI_EXP_TYPE_ROOT_PORT || type == PCI_EXP_TYPE_DOWNSTREAM)
! 933: printf(" ARIFwd%c\n", FLAG(l, PCI_EXP_DEV2_ARI));
! 934: else
! 935: printf("\n");
! 936:
! 937: w = get_conf_word(d, where + PCI_EXP_DEVCTL2);
! 938: printf("\t\tDevCtl2: Completion Timeout: %s, TimeoutDis%c",
! 939: cap_express_dev2_timeout_value(PCI_EXP_DEV2_TIMEOUT_VALUE(w)),
! 940: FLAG(w, PCI_EXP_DEV2_TIMEOUT_DIS));
! 941: if (type == PCI_EXP_TYPE_ROOT_PORT || type == PCI_EXP_TYPE_DOWNSTREAM)
! 942: printf(" ARIFwd%c\n", FLAG(w, PCI_EXP_DEV2_ARI));
! 943: else
! 944: printf("\n");
! 945: }
! 946:
! 947: static const char *cap_express_link2_speed(int type)
! 948: {
! 949: switch (type)
! 950: {
! 951: case 0: /* hardwire to 0 means only the 2.5GT/s is supported */
! 952: case 1:
! 953: return "2.5GT/s";
! 954: case 2:
! 955: return "5GT/s";
! 956: case 3:
! 957: return "8GT/s";
! 958: default:
! 959: return "Unknown";
! 960: }
! 961: }
! 962:
! 963: static const char *cap_express_link2_deemphasis(int type)
! 964: {
! 965: switch (type)
! 966: {
! 967: case 0:
! 968: return "-6dB";
! 969: case 1:
! 970: return "-3.5dB";
! 971: default:
! 972: return "Unknown";
! 973: }
! 974: }
! 975:
! 976: static const char *cap_express_link2_transmargin(int type)
! 977: {
! 978: switch (type)
! 979: {
! 980: case 0:
! 981: return "Normal Operating Range";
! 982: case 1:
! 983: return "800-1200mV(full-swing)/400-700mV(half-swing)";
! 984: case 2:
! 985: case 3:
! 986: case 4:
! 987: case 5:
! 988: return "200-400mV(full-swing)/100-200mV(half-swing)";
! 989: default:
! 990: return "Unknown";
! 991: }
! 992: }
! 993:
! 994: static void cap_express_link2(struct device *d, int where, int type UNUSED)
! 995: {
! 996: u16 w;
! 997:
! 998: w = get_conf_word(d, where + PCI_EXP_LNKCTL2);
! 999: printf("\t\tLnkCtl2: Target Link Speed: %s, EnterCompliance%c SpeedDis%c, Selectable De-emphasis: %s\n"
! 1000: "\t\t\t Transmit Margin: %s, EnterModifiedCompliance%c ComplianceSOS%c\n"
! 1001: "\t\t\t Compliance De-emphasis: %s\n",
! 1002: cap_express_link2_speed(PCI_EXP_LNKCTL2_SPEED(w)),
! 1003: FLAG(w, PCI_EXP_LNKCTL2_CMPLNC),
! 1004: FLAG(w, PCI_EXP_LNKCTL2_SPEED_DIS),
! 1005: cap_express_link2_deemphasis(PCI_EXP_LNKCTL2_DEEMPHASIS(w)),
! 1006: cap_express_link2_transmargin(PCI_EXP_LNKCTL2_MARGIN(w)),
! 1007: FLAG(w, PCI_EXP_LNKCTL2_MOD_CMPLNC),
! 1008: FLAG(w, PCI_EXP_LNKCTL2_CMPLNC_SOS),
! 1009: cap_express_link2_deemphasis(PCI_EXP_LNKCTL2_COM_DEEMPHASIS(w)));
! 1010:
! 1011: w = get_conf_word(d, where + PCI_EXP_LNKSTA2);
! 1012: printf("\t\tLnkSta2: Current De-emphasis Level: %s, EqualizationComplete%c, EqualizationPhase1%c\n"
! 1013: "\t\t\t EqualizationPhase2%c, EqualizationPhase3%c, LinkEqualizationRequest%c\n",
! 1014: cap_express_link2_deemphasis(PCI_EXP_LINKSTA2_DEEMPHASIS(w)),
! 1015: FLAG(w, PCI_EXP_LINKSTA2_EQU_COMP),
! 1016: FLAG(w, PCI_EXP_LINKSTA2_EQU_PHASE1),
! 1017: FLAG(w, PCI_EXP_LINKSTA2_EQU_PHASE2),
! 1018: FLAG(w, PCI_EXP_LINKSTA2_EQU_PHASE3),
! 1019: FLAG(w, PCI_EXP_LINKSTA2_EQU_REQ));
! 1020: }
! 1021:
! 1022: static void cap_express_slot2(struct device *d UNUSED, int where UNUSED)
! 1023: {
! 1024: /* No capabilities that require this field in PCIe rev2.0 spec. */
! 1025: }
! 1026:
! 1027: static void
! 1028: cap_express(struct device *d, int where, int cap)
! 1029: {
! 1030: int type = (cap & PCI_EXP_FLAGS_TYPE) >> 4;
! 1031: int size;
! 1032: int slot = 0;
! 1033:
! 1034: printf("Express ");
! 1035: if (verbose >= 2)
! 1036: printf("(v%d) ", cap & PCI_EXP_FLAGS_VERS);
! 1037: switch (type)
! 1038: {
! 1039: case PCI_EXP_TYPE_ENDPOINT:
! 1040: printf("Endpoint");
! 1041: break;
! 1042: case PCI_EXP_TYPE_LEG_END:
! 1043: printf("Legacy Endpoint");
! 1044: break;
! 1045: case PCI_EXP_TYPE_ROOT_PORT:
! 1046: slot = cap & PCI_EXP_FLAGS_SLOT;
! 1047: printf("Root Port (Slot%c)", FLAG(cap, PCI_EXP_FLAGS_SLOT));
! 1048: break;
! 1049: case PCI_EXP_TYPE_UPSTREAM:
! 1050: printf("Upstream Port");
! 1051: break;
! 1052: case PCI_EXP_TYPE_DOWNSTREAM:
! 1053: slot = cap & PCI_EXP_FLAGS_SLOT;
! 1054: printf("Downstream Port (Slot%c)", FLAG(cap, PCI_EXP_FLAGS_SLOT));
! 1055: break;
! 1056: case PCI_EXP_TYPE_PCI_BRIDGE:
! 1057: printf("PCI/PCI-X Bridge");
! 1058: break;
! 1059: case PCI_EXP_TYPE_PCIE_BRIDGE:
! 1060: printf("PCI/PCI-X to PCI-Express Bridge");
! 1061: break;
! 1062: case PCI_EXP_TYPE_ROOT_INT_EP:
! 1063: printf("Root Complex Integrated Endpoint");
! 1064: break;
! 1065: case PCI_EXP_TYPE_ROOT_EC:
! 1066: printf("Root Complex Event Collector");
! 1067: break;
! 1068: default:
! 1069: printf("Unknown type %d", type);
! 1070: }
! 1071: printf(", MSI %02x\n", (cap & PCI_EXP_FLAGS_IRQ) >> 9);
! 1072: if (verbose < 2)
! 1073: return;
! 1074:
! 1075: size = 16;
! 1076: if (slot)
! 1077: size = 24;
! 1078: if (type == PCI_EXP_TYPE_ROOT_PORT)
! 1079: size = 32;
! 1080: if (!config_fetch(d, where + PCI_EXP_DEVCAP, size))
! 1081: return;
! 1082:
! 1083: cap_express_dev(d, where, type);
! 1084: cap_express_link(d, where, type);
! 1085: if (slot)
! 1086: cap_express_slot(d, where);
! 1087: if (type == PCI_EXP_TYPE_ROOT_PORT)
! 1088: cap_express_root(d, where);
! 1089:
! 1090: if ((cap & PCI_EXP_FLAGS_VERS) < 2)
! 1091: return;
! 1092:
! 1093: size = 16;
! 1094: if (slot)
! 1095: size = 24;
! 1096: if (!config_fetch(d, where + PCI_EXP_DEVCAP2, size))
! 1097: return;
! 1098:
! 1099: cap_express_dev2(d, where, type);
! 1100: cap_express_link2(d, where, type);
! 1101: if (slot)
! 1102: cap_express_slot2(d, where);
! 1103: }
! 1104:
! 1105: static void
! 1106: cap_msix(struct device *d, int where, int cap)
! 1107: {
! 1108: u32 off;
! 1109:
! 1110: printf("MSI-X: Enable%c Count=%d Masked%c\n",
! 1111: FLAG(cap, PCI_MSIX_ENABLE),
! 1112: (cap & PCI_MSIX_TABSIZE) + 1,
! 1113: FLAG(cap, PCI_MSIX_MASK));
! 1114: if (verbose < 2 || !config_fetch(d, where + PCI_MSIX_TABLE, 8))
! 1115: return;
! 1116:
! 1117: off = get_conf_long(d, where + PCI_MSIX_TABLE);
! 1118: printf("\t\tVector table: BAR=%d offset=%08x\n",
! 1119: off & PCI_MSIX_BIR, off & ~PCI_MSIX_BIR);
! 1120: off = get_conf_long(d, where + PCI_MSIX_PBA);
! 1121: printf("\t\tPBA: BAR=%d offset=%08x\n",
! 1122: off & PCI_MSIX_BIR, off & ~PCI_MSIX_BIR);
! 1123: }
! 1124:
! 1125: static void
! 1126: cap_slotid(int cap)
! 1127: {
! 1128: int esr = cap & 0xff;
! 1129: int chs = cap >> 8;
! 1130:
! 1131: printf("Slot ID: %d slots, First%c, chassis %02x\n",
! 1132: esr & PCI_SID_ESR_NSLOTS,
! 1133: FLAG(esr, PCI_SID_ESR_FIC),
! 1134: chs);
! 1135: }
! 1136:
! 1137: static void
! 1138: cap_ssvid(struct device *d, int where)
! 1139: {
! 1140: u16 subsys_v, subsys_d;
! 1141: char ssnamebuf[256];
! 1142:
! 1143: if (!config_fetch(d, where, 8))
! 1144: return;
! 1145: subsys_v = get_conf_word(d, where + PCI_SSVID_VENDOR);
! 1146: subsys_d = get_conf_word(d, where + PCI_SSVID_DEVICE);
! 1147: printf("Subsystem: %s\n",
! 1148: pci_lookup_name(pacc, ssnamebuf, sizeof(ssnamebuf),
! 1149: PCI_LOOKUP_SUBSYSTEM | PCI_LOOKUP_VENDOR | PCI_LOOKUP_DEVICE,
! 1150: d->dev->vendor_id, d->dev->device_id, subsys_v, subsys_d));
! 1151: }
! 1152:
! 1153: static void
! 1154: cap_debug_port(int cap)
! 1155: {
! 1156: int bar = cap >> 13;
! 1157: int pos = cap & 0x1fff;
! 1158: printf("Debug port: BAR=%d offset=%04x\n", bar, pos);
! 1159: }
! 1160:
! 1161: static void
! 1162: cap_af(struct device *d, int where)
! 1163: {
! 1164: u8 reg;
! 1165:
! 1166: printf("PCI Advanced Features\n");
! 1167: if (verbose < 2 || !config_fetch(d, where + PCI_AF_CAP, 3))
! 1168: return;
! 1169:
! 1170: reg = get_conf_byte(d, where + PCI_AF_CAP);
! 1171: printf("\t\tAFCap: TP%c FLR%c\n", FLAG(reg, PCI_AF_CAP_TP),
! 1172: FLAG(reg, PCI_AF_CAP_FLR));
! 1173: reg = get_conf_byte(d, where + PCI_AF_CTRL);
! 1174: printf("\t\tAFCtrl: FLR%c\n", FLAG(reg, PCI_AF_CTRL_FLR));
! 1175: reg = get_conf_byte(d, where + PCI_AF_STATUS);
! 1176: printf("\t\tAFStatus: TP%c\n", FLAG(reg, PCI_AF_STATUS_TP));
! 1177: }
! 1178:
! 1179: static void
! 1180: cap_sata_hba(struct device *d, int where, int cap)
! 1181: {
! 1182: u32 bars;
! 1183: int bar;
! 1184:
! 1185: printf("SATA HBA v%d.%d", BITS(cap, 4, 4), BITS(cap, 0, 4));
! 1186: if (verbose < 2 || !config_fetch(d, where + PCI_SATA_HBA_BARS, 4))
! 1187: {
! 1188: printf("\n");
! 1189: return;
! 1190: }
! 1191:
! 1192: bars = get_conf_long(d, where + PCI_SATA_HBA_BARS);
! 1193: bar = BITS(bars, 0, 4);
! 1194: if (bar >= 4 && bar <= 9)
! 1195: printf(" BAR%d Offset=%08x\n", bar - 4, BITS(bars, 4, 20));
! 1196: else if (bar == 15)
! 1197: printf(" InCfgSpace\n");
! 1198: else
! 1199: printf(" BAR??%d\n", bar);
! 1200: }
! 1201:
! 1202: void
! 1203: show_caps(struct device *d)
! 1204: {
! 1205: int can_have_ext_caps = 0;
! 1206:
! 1207: if (get_conf_word(d, PCI_STATUS) & PCI_STATUS_CAP_LIST)
! 1208: {
! 1209: int where = get_conf_byte(d, PCI_CAPABILITY_LIST) & ~3;
! 1210: byte been_there[256];
! 1211: memset(been_there, 0, 256);
! 1212: while (where)
! 1213: {
! 1214: int id, next, cap;
! 1215: printf("\tCapabilities: ");
! 1216: if (!config_fetch(d, where, 4))
! 1217: {
! 1218: puts("<access denied>");
! 1219: break;
! 1220: }
! 1221: id = get_conf_byte(d, where + PCI_CAP_LIST_ID);
! 1222: next = get_conf_byte(d, where + PCI_CAP_LIST_NEXT) & ~3;
! 1223: cap = get_conf_word(d, where + PCI_CAP_FLAGS);
! 1224: printf("[%02x] ", where);
! 1225: if (been_there[where]++)
! 1226: {
! 1227: printf("<chain looped>\n");
! 1228: break;
! 1229: }
! 1230: if (id == 0xff)
! 1231: {
! 1232: printf("<chain broken>\n");
! 1233: break;
! 1234: }
! 1235: switch (id)
! 1236: {
! 1237: case PCI_CAP_ID_PM:
! 1238: cap_pm(d, where, cap);
! 1239: break;
! 1240: case PCI_CAP_ID_AGP:
! 1241: cap_agp(d, where, cap);
! 1242: break;
! 1243: case PCI_CAP_ID_VPD:
! 1244: cap_vpd(d);
! 1245: break;
! 1246: case PCI_CAP_ID_SLOTID:
! 1247: cap_slotid(cap);
! 1248: break;
! 1249: case PCI_CAP_ID_MSI:
! 1250: cap_msi(d, where, cap);
! 1251: break;
! 1252: case PCI_CAP_ID_CHSWP:
! 1253: printf("CompactPCI hot-swap <?>\n");
! 1254: break;
! 1255: case PCI_CAP_ID_PCIX:
! 1256: cap_pcix(d, where);
! 1257: can_have_ext_caps = 1;
! 1258: break;
! 1259: case PCI_CAP_ID_HT:
! 1260: cap_ht(d, where, cap);
! 1261: break;
! 1262: case PCI_CAP_ID_VNDR:
! 1263: printf("Vendor Specific Information: Len=%02x <?>\n", BITS(cap, 0, 8));
! 1264: break;
! 1265: case PCI_CAP_ID_DBG:
! 1266: cap_debug_port(cap);
! 1267: break;
! 1268: case PCI_CAP_ID_CCRC:
! 1269: printf("CompactPCI central resource control <?>\n");
! 1270: break;
! 1271: case PCI_CAP_ID_HOTPLUG:
! 1272: printf("Hot-plug capable\n");
! 1273: break;
! 1274: case PCI_CAP_ID_SSVID:
! 1275: cap_ssvid(d, where);
! 1276: break;
! 1277: case PCI_CAP_ID_AGP3:
! 1278: printf("AGP3 <?>\n");
! 1279: break;
! 1280: case PCI_CAP_ID_SECURE:
! 1281: printf("Secure device <?>\n");
! 1282: break;
! 1283: case PCI_CAP_ID_EXP:
! 1284: cap_express(d, where, cap);
! 1285: can_have_ext_caps = 1;
! 1286: break;
! 1287: case PCI_CAP_ID_MSIX:
! 1288: cap_msix(d, where, cap);
! 1289: break;
! 1290: case PCI_CAP_ID_SATA:
! 1291: cap_sata_hba(d, where, cap);
! 1292: break;
! 1293: case PCI_CAP_ID_AF:
! 1294: cap_af(d, where);
! 1295: break;
! 1296: default:
! 1297: printf("#%02x [%04x]\n", id, cap);
! 1298: }
! 1299: where = next;
! 1300: }
! 1301: }
! 1302: if (can_have_ext_caps)
! 1303: show_ext_caps(d);
! 1304: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>