⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ls-ecaps.c

📁 linux下的pci设备浏览工具
💻 C
字号:
/* *	The PCI Utilities -- Show Extended Capabilities * *	Copyright (c) 1997--2008 Martin Mares <mj@ucw.cz> * *	Can be freely distributed and used under the terms of the GNU GPL. */#include <stdio.h>#include <string.h>#include "lspci.h"static voidcap_dsn(struct device *d, int where){  u32 t1, t2;  if (!config_fetch(d, where + 4, 8))    return;  t1 = get_conf_long(d, where + 4);  t2 = get_conf_long(d, where + 8);  printf("Device Serial Number %02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\n",	t1 & 0xff, (t1 >> 8) & 0xff, (t1 >> 16) & 0xff, t1 >> 24,	t2 & 0xff, (t2 >> 8) & 0xff, (t2 >> 16) & 0xff, t2 >> 24);}static voidcap_aer(struct device *d, int where){  u32 l;  printf("Advanced Error Reporting\n");  if (verbose < 2)    return;  if (!config_fetch(d, where + PCI_ERR_UNCOR_STATUS, 24))    return;  l = get_conf_long(d, where + PCI_ERR_UNCOR_STATUS);  printf("\t\tUESta:\tDLP%c SDES%c TLP%c FCP%c CmpltTO%c CmpltAbrt%c UnxCmplt%c RxOF%c "	"MalfTLP%c ECRC%c UnsupReq%c ACSViol%c\n",	FLAG(l, PCI_ERR_UNC_DLP), FLAG(l, PCI_ERR_UNC_SDES), FLAG(l, PCI_ERR_UNC_POISON_TLP),	FLAG(l, PCI_ERR_UNC_FCP), FLAG(l, PCI_ERR_UNC_COMP_TIME), FLAG(l, PCI_ERR_UNC_COMP_ABORT),	FLAG(l, PCI_ERR_UNC_UNX_COMP), FLAG(l, PCI_ERR_UNC_RX_OVER), FLAG(l, PCI_ERR_UNC_MALF_TLP),	FLAG(l, PCI_ERR_UNC_ECRC), FLAG(l, PCI_ERR_UNC_UNSUP), FLAG(l, PCI_ERR_UNC_ACS_VIOL));  l = get_conf_long(d, where + PCI_ERR_UNCOR_MASK);  printf("\t\tUEMsk:\tDLP%c SDES%c TLP%c FCP%c CmpltTO%c CmpltAbrt%c UnxCmplt%c RxOF%c "	"MalfTLP%c ECRC%c UnsupReq%c ACSViol%c\n",	FLAG(l, PCI_ERR_UNC_DLP), FLAG(l, PCI_ERR_UNC_SDES), FLAG(l, PCI_ERR_UNC_POISON_TLP),	FLAG(l, PCI_ERR_UNC_FCP), FLAG(l, PCI_ERR_UNC_COMP_TIME), FLAG(l, PCI_ERR_UNC_COMP_ABORT),	FLAG(l, PCI_ERR_UNC_UNX_COMP), FLAG(l, PCI_ERR_UNC_RX_OVER), FLAG(l, PCI_ERR_UNC_MALF_TLP),	FLAG(l, PCI_ERR_UNC_ECRC), FLAG(l, PCI_ERR_UNC_UNSUP), FLAG(l, PCI_ERR_UNC_ACS_VIOL));  l = get_conf_long(d, where + PCI_ERR_UNCOR_SEVER);  printf("\t\tUESvrt:\tDLP%c SDES%c TLP%c FCP%c CmpltTO%c CmpltAbrt%c UnxCmplt%c RxOF%c "	"MalfTLP%c ECRC%c UnsupReq%c ACSViol%c\n",	FLAG(l, PCI_ERR_UNC_DLP), FLAG(l, PCI_ERR_UNC_SDES), FLAG(l, PCI_ERR_UNC_POISON_TLP),	FLAG(l, PCI_ERR_UNC_FCP), FLAG(l, PCI_ERR_UNC_COMP_TIME), FLAG(l, PCI_ERR_UNC_COMP_ABORT),	FLAG(l, PCI_ERR_UNC_UNX_COMP), FLAG(l, PCI_ERR_UNC_RX_OVER), FLAG(l, PCI_ERR_UNC_MALF_TLP),	FLAG(l, PCI_ERR_UNC_ECRC), FLAG(l, PCI_ERR_UNC_UNSUP), FLAG(l, PCI_ERR_UNC_ACS_VIOL));  l = get_conf_long(d, where + PCI_ERR_COR_STATUS);  printf("\t\tCESta:\tRxErr%c BadTLP%c BadDLLP%c Rollover%c Timeout%c NonFatalErr%c\n",	FLAG(l, PCI_ERR_COR_RCVR), FLAG(l, PCI_ERR_COR_BAD_TLP), FLAG(l, PCI_ERR_COR_BAD_DLLP),	FLAG(l, PCI_ERR_COR_REP_ROLL), FLAG(l, PCI_ERR_COR_REP_TIMER), FLAG(l, PCI_ERR_COR_REP_ANFE));  l = get_conf_long(d, where + PCI_ERR_COR_MASK);  printf("\t\tCEMsk:\tRxErr%c BadTLP%c BadDLLP%c Rollover%c Timeout%c NonFatalErr%c\n",	FLAG(l, PCI_ERR_COR_RCVR), FLAG(l, PCI_ERR_COR_BAD_TLP), FLAG(l, PCI_ERR_COR_BAD_DLLP),	FLAG(l, PCI_ERR_COR_REP_ROLL), FLAG(l, PCI_ERR_COR_REP_TIMER), FLAG(l, PCI_ERR_COR_REP_ANFE));  l = get_conf_long(d, where + PCI_ERR_CAP);  printf("\t\tAERCap:\tFirst Error Pointer: %02x, GenCap%c CGenEn%c ChkCap%c ChkEn%c\n",	PCI_ERR_CAP_FEP(l), FLAG(l, PCI_ERR_CAP_ECRC_GENC), FLAG(l, PCI_ERR_CAP_ECRC_GENE),	FLAG(l, PCI_ERR_CAP_ECRC_CHKC), FLAG(l, PCI_ERR_CAP_ECRC_CHKE));}static voidcap_acs(struct device *d, int where){  u16 w;  printf("Access Control Services\n");  if (verbose < 2)    return;  if (!config_fetch(d, where + PCI_ACS_CAP, 4))    return;  w = get_conf_word(d, where + PCI_ACS_CAP);  printf("\t\tACSCap:\tSrcValid%c TransBlk%c ReqRedir%c CmpltRedir%c UpstreamFwd%c EgressCtrl%c "	"DirectTrans%c\n",	FLAG(w, PCI_ACS_CAP_VALID), FLAG(w, PCI_ACS_CAP_BLOCK), FLAG(w, PCI_ACS_CAP_REQ_RED),	FLAG(w, PCI_ACS_CAP_CMPLT_RED), FLAG(w, PCI_ACS_CAP_FORWARD), FLAG(w, PCI_ACS_CAP_EGRESS),	FLAG(w, PCI_ACS_CAP_TRANS));  w = get_conf_word(d, where + PCI_ACS_CTRL);  printf("\t\tACSCtl:\tSrcValid%c TransBlk%c ReqRedir%c CmpltRedir%c UpstreamFwd%c EgressCtrl%c "	"DirectTrans%c\n",	FLAG(w, PCI_ACS_CTRL_VALID), FLAG(w, PCI_ACS_CTRL_BLOCK), FLAG(w, PCI_ACS_CTRL_REQ_RED),	FLAG(w, PCI_ACS_CTRL_CMPLT_RED), FLAG(w, PCI_ACS_CTRL_FORWARD), FLAG(w, PCI_ACS_CTRL_EGRESS),	FLAG(w, PCI_ACS_CTRL_TRANS));}static voidcap_ari(struct device *d, int where){  u16 w;  printf("Alternative Routing-ID Interpretation (ARI)\n");  if (verbose < 2)    return;  if (!config_fetch(d, where + PCI_ARI_CAP, 4))    return;  w = get_conf_word(d, where + PCI_ARI_CAP);  printf("\t\tARICap:\tMFVC%c ACS%c, Next Function: %d\n",	FLAG(w, PCI_ARI_CAP_MFVC), FLAG(w, PCI_ARI_CAP_ACS),	PCI_ARI_CAP_NFN(w));  w = get_conf_word(d, where + PCI_ARI_CTRL);  printf("\t\tARICtl:\tMFVC%c ACS%c, Function Group: %d\n",	FLAG(w, PCI_ARI_CTRL_MFVC), FLAG(w, PCI_ARI_CTRL_ACS),	PCI_ARI_CTRL_FG(w));}static voidcap_ats(struct device *d, int where){  u16 w;  printf("Address Translation Service (ATS)\n");  if (verbose < 2)    return;  if (!config_fetch(d, where + PCI_ATS_CAP, 4))    return;  w = get_conf_word(d, where + PCI_ATS_CAP);  printf("\t\tATSCap:\tInvalidate Queue Depth: %02x\n", PCI_ATS_CAP_IQD(w));  w = get_conf_word(d, where + PCI_ATS_CTRL);  printf("\t\tATSCtl:\tEnable%c, Smallest Translation Unit: %02x\n",	FLAG(w, PCI_ATS_CTRL_ENABLE), PCI_ATS_CTRL_STU(w));}static voidcap_sriov(struct device *d, int where){  u16 b;  u16 w;  u32 l;  printf("Single Root I/O Virtualization (SR-IOV)\n");  if (verbose < 2)    return;  if (!config_fetch(d, where + PCI_IOV_CAP, 0x3c))    return;  l = get_conf_long(d, where + PCI_IOV_CAP);  printf("\t\tIOVCap:\tMigration%c, Interrupt Message Number: %03x\n",	FLAG(l, PCI_IOV_CAP_VFM), PCI_IOV_CAP_IMN(l));  w = get_conf_word(d, where + PCI_IOV_CTRL);  printf("\t\tIOVCtl:\tEnable%c Migration%c Interrupt%c MSE%c ARIHierarchy%c\n",	FLAG(w, PCI_IOV_CTRL_VFE), FLAG(w, PCI_IOV_CTRL_VFME),	FLAG(w, PCI_IOV_CTRL_VFMIE), FLAG(w, PCI_IOV_CTRL_MSE),	FLAG(w, PCI_IOV_CTRL_ARI));  w = get_conf_word(d, where + PCI_IOV_STATUS);  printf("\t\tIOVSta:\tMigration%c\n", FLAG(w, PCI_IOV_STATUS_MS));  w = get_conf_word(d, where + PCI_IOV_INITIALVF);  printf("\t\tInitial VFs: %d, ", w);  w = get_conf_word(d, where + PCI_IOV_TOTALVF);  printf("Total VFs: %d, ", w);  w = get_conf_word(d, where + PCI_IOV_NUMVF);  printf("Number of VFs: %d, ", w);  b = get_conf_byte(d, where + PCI_IOV_FDL);  printf("Function Dependency Link: %02x\n", b);  w = get_conf_word(d, where + PCI_IOV_OFFSET);  printf("\t\tVF offset: %d, ", w);  w = get_conf_word(d, where + PCI_IOV_STRIDE);  printf("stride: %d, ", w);  w = get_conf_word(d, where + PCI_IOV_DID);  printf("Device ID: %04x\n", w);  l = get_conf_long(d, where + PCI_IOV_SUPPS);  printf("\t\tSupported Page Size: %08x, ", l);  l = get_conf_long(d, where + PCI_IOV_SYSPS);  printf("System Page Size: %08x\n", l);  l = get_conf_long(d, where + PCI_IOV_MSAO);  printf("\t\tVF Migration: offset: %08x, BIR: %x\n", PCI_IOV_MSA_OFFSET(l),	PCI_IOV_MSA_BIR(l));}voidshow_ext_caps(struct device *d){  int where = 0x100;  char been_there[0x1000];  memset(been_there, 0, 0x1000);  do    {      u32 header;      int id;      if (!config_fetch(d, where, 4))	break;      header = get_conf_long(d, where);      if (!header)	break;      id = header & 0xffff;      printf("\tCapabilities: [%03x] ", where);      if (been_there[where]++)	{	  printf("<chain looped>\n");	  break;	}      switch (id)	{	  case PCI_EXT_CAP_ID_AER:	    cap_aer(d, where);	    break;	  case PCI_EXT_CAP_ID_VC:	    printf("Virtual Channel <?>\n");	    break;	  case PCI_EXT_CAP_ID_DSN:	    cap_dsn(d, where);	    break;	  case PCI_EXT_CAP_ID_PB:	    printf("Power Budgeting <?>\n");	    break;	  case PCI_EXT_CAP_ID_RCLINK:	    printf("Root Complex Link <?>\n");	    break;	  case PCI_EXT_CAP_ID_RCILINK:	    printf("Root Complex Internal Link <?>\n");	    break;	  case PCI_EXT_CAP_ID_RCECOLL:	    printf("Root Complex Event Collector <?>\n");	    break;	  case PCI_EXT_CAP_ID_MFVC:	    printf("Multi-Function Virtual Channel <?>\n");	    break;	  case PCI_EXT_CAP_ID_RBCB:	    printf("Root Bridge Control Block <?>\n");	    break;	  case PCI_EXT_CAP_ID_VNDR:	    printf("Vendor Specific Information <?>\n");	    break;	  case PCI_EXT_CAP_ID_ACS:	    cap_acs(d, where);	    break;	  case PCI_EXT_CAP_ID_ARI:	    cap_ari(d, where);	    break;	  case PCI_EXT_CAP_ID_ATS:	    cap_ats(d, where);	    break;	  case PCI_EXT_CAP_ID_SRIOV:	    cap_sriov(d, where);	    break;	  default:	    printf("#%02x\n", id);	    break;	}      where = header >> 20;    } while (where);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -