Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2522 lines
68 KiB

  1. /*++
  2. Copyright (c) 1997 Microsoft Corporation
  3. Module Name:
  4. mts.c
  5. Abstract:
  6. MikeTs's little KD extension.
  7. Author:
  8. Michael Tsang (mikets) 18-November-1997
  9. Environment:
  10. User Mode.
  11. Revision History:
  12. --*/
  13. #include "precomp.h"
  14. #include "pcskthw.h"
  15. #include "pci.h"
  16. #include "pcip.h"
  17. #pragma hdrstop
  18. VOID PrintClassInfo(PBYTE pb, DWORD dwReg);
  19. VOID
  20. PrintPciStatusReg(
  21. USHORT Status
  22. )
  23. {
  24. if (Status & PCI_STATUS_CAPABILITIES_LIST) {
  25. dprintf("CapList ");
  26. }
  27. if (Status & PCI_STATUS_66MHZ_CAPABLE) {
  28. dprintf("66MHzCapable ");
  29. }
  30. if (Status & PCI_STATUS_UDF_SUPPORTED) {
  31. dprintf("UDFSupported ");
  32. }
  33. if (Status & PCI_STATUS_FAST_BACK_TO_BACK) {
  34. dprintf("FB2BCapable ");
  35. }
  36. if (Status & PCI_STATUS_DATA_PARITY_DETECTED) {
  37. dprintf("DataPERR ");
  38. }
  39. if (Status & PCI_STATUS_SIGNALED_TARGET_ABORT) {
  40. dprintf("TargetDevAbort ");
  41. }
  42. if (Status & PCI_STATUS_RECEIVED_TARGET_ABORT) {
  43. dprintf("TargetAbort ");
  44. }
  45. if (Status & PCI_STATUS_RECEIVED_MASTER_ABORT) {
  46. dprintf("InitiatorAbort ");
  47. }
  48. if (Status & PCI_STATUS_SIGNALED_SYSTEM_ERROR) {
  49. dprintf("SERR ");
  50. }
  51. if (Status & PCI_STATUS_DETECTED_PARITY_ERROR) {
  52. dprintf("PERR ");
  53. }
  54. if (Status & PCI_STATUS_DEVSEL) {
  55. dprintf("DEVSELTiming:%lx",(Status & PCI_STATUS_DEVSEL) >> 9);
  56. }
  57. dprintf("\n");
  58. }
  59. VOID
  60. PrintPciBridgeCtrlReg(
  61. USHORT Bridge
  62. )
  63. {
  64. PCI_BRIDBG_CTRL_REG bReg = *((PCI_BRIDBG_CTRL_REG *) &Bridge);
  65. if (bReg.PERRREnable) {
  66. dprintf("PERRREnable ");
  67. }
  68. if (bReg.SERREnable) {
  69. dprintf("SERREnable ");
  70. }
  71. if (bReg.ISAEnable) {
  72. dprintf("ISAEnable ");
  73. }
  74. if (bReg.MasterAbort) {
  75. dprintf("MasterAbort ");
  76. }
  77. if (bReg.CBRst) {
  78. dprintf("CBRst ");
  79. }
  80. if (bReg.IRQRoutingEnable) {
  81. dprintf("IRQRoutingEnable ");
  82. }
  83. if (bReg.Mem0Prefetch) {
  84. dprintf("Mem0Prefetch ");
  85. }
  86. if (bReg.Mem1Prefetch) {
  87. dprintf("Mem1Prefetch ");
  88. }
  89. if (bReg.WritePostEnable) {
  90. dprintf("WritePostEnable ");
  91. }
  92. dprintf("\n");
  93. }
  94. BOOL
  95. PrintCommonConfigSpace(
  96. PCI_COMMON_CONFIG *pCmnCfg,
  97. PCHAR Pad
  98. )
  99. {
  100. PCHAR pch = NULL;
  101. if (!Pad) {
  102. Pad = "";
  103. }
  104. dprintf("%s%02x: VendorID %04lx ", Pad, CONFIG_OFFSET(VendorID), pCmnCfg->VendorID);
  105. dprintf("%s\n", ((pch = GetVendorDesc(pCmnCfg->VendorID, TRUE)) ? pch : ""));
  106. dprintf("%s%02x: DeviceID %04lx\n", Pad, CONFIG_OFFSET(DeviceID), pCmnCfg->DeviceID);
  107. dprintf("%s%02x: Command %04lx ", Pad, CONFIG_OFFSET(Command), pCmnCfg->Command);
  108. if (pCmnCfg->Command & PCI_ENABLE_IO_SPACE) {
  109. dprintf("IOSpaceEnable ");
  110. }
  111. if (pCmnCfg->Command & PCI_ENABLE_MEMORY_SPACE) {
  112. dprintf("MemSpaceEnable ");
  113. }
  114. if (pCmnCfg->Command & PCI_ENABLE_BUS_MASTER) {
  115. dprintf("BusInitiate ");
  116. }
  117. if (pCmnCfg->Command & PCI_ENABLE_SPECIAL_CYCLES) {
  118. dprintf("SpecialCycle ");
  119. }
  120. if (pCmnCfg->Command & PCI_ENABLE_WRITE_AND_INVALIDATE) {
  121. dprintf("MemWriteEnable ");
  122. }
  123. if (pCmnCfg->Command & PCI_ENABLE_VGA_COMPATIBLE_PALETTE) {
  124. dprintf("VGASnoop ");
  125. }
  126. if (pCmnCfg->Command & PCI_ENABLE_PARITY) {
  127. dprintf("PERREnable ");
  128. }
  129. if (pCmnCfg->Command & PCI_ENABLE_WAIT_CYCLE) {
  130. dprintf("WaitCycle ");
  131. }
  132. if (pCmnCfg->Command & PCI_ENABLE_SERR) {
  133. dprintf("SERREnable ");
  134. }
  135. if (pCmnCfg->Command & PCI_ENABLE_FAST_BACK_TO_BACK) {
  136. dprintf("FB2BEnable ");
  137. }
  138. dprintf("\n");
  139. dprintf("%s%02x: Status %04lx ", Pad, CONFIG_OFFSET(Status), pCmnCfg->Status);
  140. PrintPciStatusReg(pCmnCfg->Status);
  141. dprintf("%s%02x: RevisionID %02lx\n%s%02x: ProgIF %02lx",
  142. Pad,
  143. CONFIG_OFFSET(RevisionID),
  144. pCmnCfg->RevisionID,
  145. Pad,
  146. CONFIG_OFFSET(ProgIf),
  147. pCmnCfg->ProgIf);
  148. PrintClassInfo((PBYTE) pCmnCfg, CONFIG_OFFSET(ProgIf));
  149. dprintf("%s%02x: SubClass %02lx", Pad, CONFIG_OFFSET(SubClass), pCmnCfg->SubClass);
  150. PrintClassInfo((PBYTE) pCmnCfg, CONFIG_OFFSET(SubClass));
  151. dprintf("%s%02x: BaseClass %02lx", Pad, CONFIG_OFFSET(BaseClass), pCmnCfg->BaseClass);
  152. PrintClassInfo((PBYTE) pCmnCfg, CONFIG_OFFSET(BaseClass));
  153. dprintf("%s%02x: CacheLineSize %04lx", Pad, CONFIG_OFFSET(CacheLineSize), pCmnCfg->CacheLineSize);
  154. if (pCmnCfg->CacheLineSize & 0xf0) {
  155. dprintf("BurstDisabled ");
  156. }
  157. if (pCmnCfg->CacheLineSize & 0xf) {
  158. dprintf("Burst4DW");
  159. }
  160. dprintf("\n");
  161. dprintf("%s%02x: LatencyTimer %02lx\n",
  162. Pad,
  163. CONFIG_OFFSET(LatencyTimer),
  164. pCmnCfg->LatencyTimer);
  165. dprintf("%s%02x: HeaderType %02lx\n",
  166. Pad,
  167. CONFIG_OFFSET(HeaderType),
  168. pCmnCfg->HeaderType);
  169. dprintf("%s%02x: BIST %02lx\n",
  170. Pad,
  171. CONFIG_OFFSET(BIST),
  172. pCmnCfg->BIST);
  173. return TRUE;
  174. }
  175. BOOL
  176. PrintCfgSpaceType0(
  177. PCI_COMMON_CONFIG *pCmnCfg,
  178. PCHAR Pad
  179. )
  180. {
  181. int i;
  182. if (!Pad) {
  183. Pad = "";
  184. }
  185. for (i=0; i<PCI_TYPE0_ADDRESSES; ++i) {
  186. dprintf("%s%02x: BAR%x %08lx\n", Pad, TYPE0_OFFSET(BaseAddresses[i]), i, pCmnCfg->u.type0.BaseAddresses[i]);
  187. }
  188. dprintf("%s%02x: CBCISPtr %08lx\n", Pad, TYPE0_OFFSET(CIS), pCmnCfg->u.type0.CIS);
  189. dprintf("%s%02x: SubSysVenID %04lx\n", Pad, TYPE0_OFFSET(SubVendorID), pCmnCfg->u.type0.SubVendorID);
  190. dprintf("%s%02x: SubSysID %04lx\n", Pad, TYPE0_OFFSET(SubSystemID), pCmnCfg->u.type0.SubSystemID);
  191. dprintf("%s%02x: ROMBAR %08lx\n", Pad, TYPE0_OFFSET(ROMBaseAddress), pCmnCfg->u.type0.ROMBaseAddress);
  192. dprintf("%s%02x: CapPtr %02lx\n", Pad, TYPE0_OFFSET(CapabilitiesPtr), pCmnCfg->u.type0.CapabilitiesPtr);
  193. dprintf("%s%02x: IntLine %02lx\n", Pad, TYPE0_OFFSET(InterruptLine), pCmnCfg->u.type0.InterruptLine);
  194. dprintf("%s%02x: IntPin %02lx\n", Pad, TYPE0_OFFSET(InterruptPin), pCmnCfg->u.type0.InterruptPin);
  195. dprintf("%s%02x: MinGnt %02lx\n", Pad, TYPE0_OFFSET(MinimumGrant), pCmnCfg->u.type0.MinimumGrant);
  196. dprintf("%s%02x: MaxLat %02lx\n", Pad, TYPE0_OFFSET(MaximumLatency), pCmnCfg->u.type0.MaximumLatency);
  197. return TRUE;
  198. }
  199. BOOL
  200. PrintCfgSpaceType1(
  201. PCI_COMMON_CONFIG *pCmnCfg,
  202. PCHAR Pad
  203. )
  204. {
  205. int i;
  206. if (!Pad) {
  207. Pad = "";
  208. }
  209. for (i=0; i<PCI_TYPE1_ADDRESSES; ++i) {
  210. dprintf("%s%02x: BAR%x %08lx\n",
  211. Pad, CONFIG_OFFSET(u.type1.BaseAddresses[i]), i, pCmnCfg->u.type1.BaseAddresses[i]);
  212. }
  213. dprintf("%s%02x: PriBusNum %02lx\n", Pad, TYPE1_OFFSET(PrimaryBus), pCmnCfg->u.type1.PrimaryBus);
  214. dprintf("%s%02x: SecBusNum %02lx\n", Pad, TYPE1_OFFSET(SecondaryBus), pCmnCfg->u.type1.SecondaryBus);
  215. dprintf("%s%02x: SubBusNum %02lx\n", Pad, TYPE1_OFFSET(SubordinateBus), pCmnCfg->u.type1.SubordinateBus);
  216. dprintf("%s%02x: SecLatencyTmr %02lx\n", Pad, TYPE1_OFFSET(SecondaryLatency), pCmnCfg->u.type1.SecondaryLatency);
  217. dprintf("%s%02x: IOBase %02lx\n", Pad, TYPE1_OFFSET(IOBase), pCmnCfg->u.type1.IOBase);
  218. dprintf("%s%02x: IOLimit %02lx\n", Pad, TYPE1_OFFSET(IOLimit), pCmnCfg->u.type1.IOLimit);
  219. dprintf("%s%02x: SecStatus %04lx ",Pad, TYPE1_OFFSET(SecondaryStatus), pCmnCfg->u.type1.SecondaryStatus);
  220. PrintPciStatusReg(pCmnCfg->u.type1.SecondaryStatus);
  221. dprintf("%s%02x: MemBase %04lx\n", Pad, TYPE1_OFFSET(MemoryBase), pCmnCfg->u.type1.MemoryBase);
  222. dprintf("%s%02x: MemLimit %04lx\n", Pad, TYPE1_OFFSET(MemoryLimit), pCmnCfg->u.type1.MemoryLimit);
  223. dprintf("%s%02x: PrefMemBase %04lx\n", Pad, TYPE1_OFFSET(PrefetchBase), pCmnCfg->u.type1.PrefetchBase);
  224. dprintf("%s%02x: PrefMemLimit %04lx\n", Pad, TYPE1_OFFSET(PrefetchLimit), pCmnCfg->u.type1.PrefetchLimit);
  225. dprintf("%s%02x: PrefBaseHi %08lx\n", Pad, TYPE1_OFFSET(PrefetchBaseUpper32), pCmnCfg->u.type1.PrefetchBaseUpper32);
  226. dprintf("%s%02x: PrefLimitHi %08lx\n", Pad, TYPE1_OFFSET(PrefetchLimitUpper32), pCmnCfg->u.type1.PrefetchLimitUpper32);
  227. dprintf("%s%02x: IOBaseHi %04lx\n", Pad, TYPE1_OFFSET(IOBaseUpper16), pCmnCfg->u.type1.IOBaseUpper16);
  228. dprintf("%s%02x: IOLimitHi %04lx\n", Pad, TYPE1_OFFSET(IOLimitUpper16), pCmnCfg->u.type1.IOLimitUpper16);
  229. dprintf("%s%02x: CapPtr %02lx\n", Pad, TYPE1_OFFSET(CapabilitiesPtr), pCmnCfg->u.type1.CapabilitiesPtr);
  230. dprintf("%s%02x: ROMBAR %08lx\n", Pad, TYPE1_OFFSET(ROMBaseAddress), pCmnCfg->u.type1.ROMBaseAddress);
  231. dprintf("%s%02x: IntLine %02lx\n", Pad, TYPE1_OFFSET(InterruptLine), pCmnCfg->u.type1.InterruptLine);
  232. dprintf("%s%02x: IntPin %02lx\n", Pad, TYPE1_OFFSET(InterruptPin), pCmnCfg->u.type1.InterruptPin);
  233. dprintf("%s%02x: BridgeCtrl %04lx ", Pad, TYPE1_OFFSET(BridgeControl), pCmnCfg->u.type1.BridgeControl);
  234. PrintPciBridgeCtrlReg(pCmnCfg->u.type2.BridgeControl);
  235. return TRUE;
  236. }
  237. BOOL
  238. PrintCfgSpaceType2(
  239. PCI_COMMON_CONFIG *pCmnCfg,
  240. PCHAR Pad
  241. )
  242. {
  243. PPCI_TYPE2_HEADER_EXTRAS extras;
  244. ULONG extraOffset;
  245. if (!Pad) {
  246. Pad = "";
  247. }
  248. dprintf("%s%02x: RegBaseAddr %08lx\n", Pad, TYPE2_OFFSET(SocketRegistersBaseAddress), pCmnCfg->u.type2.SocketRegistersBaseAddress);
  249. dprintf("%s%02x: CapPtr %02lx\n", Pad, TYPE2_OFFSET(SocketRegistersBaseAddress), pCmnCfg->u.type2.CapabilitiesPtr);
  250. dprintf("%s%02x: SecStatus %04lx ", Pad, TYPE2_OFFSET(SecondaryStatus), pCmnCfg->u.type2.SecondaryStatus);
  251. PrintPciStatusReg(pCmnCfg->u.type2.SecondaryStatus);
  252. dprintf("%s%02x: PCIBusNum %02lx\n", Pad, TYPE2_OFFSET(PrimaryBus), pCmnCfg->u.type2.PrimaryBus);
  253. dprintf("%s%02x: CBBusNum %02lx\n", Pad, TYPE2_OFFSET(SecondaryBus), pCmnCfg->u.type2.SecondaryBus);
  254. dprintf("%s%02x: SubBusNum %02lx\n", Pad, TYPE2_OFFSET(SubordinateBus), pCmnCfg->u.type2.SubordinateBus);
  255. dprintf("%s%02x: CBLatencyTimer %02lx\n", Pad, TYPE2_OFFSET(SecondaryLatency), pCmnCfg->u.type2.SecondaryLatency);
  256. dprintf("%s%02x: MemBase0 %08lx\n", Pad, TYPE2_OFFSET(Range[0].Base), pCmnCfg->u.type2.Range[0].Base);
  257. dprintf("%s%02x: MemLimit1 %08lx\n", Pad, TYPE2_OFFSET(Range[1].Limit), pCmnCfg->u.type2.Range[1].Limit);
  258. dprintf("%s%02x: IOBase0 %08lx\n", Pad, TYPE2_OFFSET(Range[2].Base), pCmnCfg->u.type2.Range[2].Base);
  259. dprintf("%s%02x: IOLimit1 %08lx\n", Pad, TYPE2_OFFSET(Range[3].Limit), pCmnCfg->u.type2.Range[3].Limit);
  260. dprintf("%s%02x: IntLine %02lx\n", Pad, TYPE2_OFFSET(InterruptLine), pCmnCfg->u.type2.InterruptLine);
  261. dprintf("%s%02x: IntPin %02lx\n", Pad, TYPE2_OFFSET(InterruptPin), pCmnCfg->u.type2.InterruptPin);
  262. dprintf("%s%02x: BridgeCtrl %04lx ", Pad, TYPE2_OFFSET(BridgeControl), pCmnCfg->u.type2.BridgeControl);
  263. PrintPciBridgeCtrlReg(pCmnCfg->u.type2.BridgeControl);
  264. extras = (PPCI_TYPE2_HEADER_EXTRAS) ((PUCHAR) pCmnCfg + CONFIG_OFFSET(DeviceSpecific));
  265. extraOffset = CONFIG_OFFSET(DeviceSpecific);
  266. dprintf("%s%02x: SubSysVenID %04lx\n", Pad, extraOffset, extras->SubVendorID);
  267. dprintf("%s%02x: SubSystemID %04lx\n",
  268. Pad, extraOffset + FIELD_OFFSET(PCI_TYPE2_HEADER_EXTRAS, SubSystemID), extras->SubSystemID);
  269. dprintf("%s%02x: LegacyBaseAddr %04lx\n",
  270. Pad, extraOffset + FIELD_OFFSET(PCI_TYPE2_HEADER_EXTRAS, LegacyModeBaseAddress), extras->LegacyModeBaseAddress);
  271. return TRUE;
  272. }
  273. VOID
  274. PrintDataRange(
  275. PCHAR pData,
  276. ULONG nDwords,
  277. ULONG base,
  278. PCHAR Pad
  279. )
  280. {
  281. unsigned int i;
  282. unsigned int j;
  283. PULONG pRange;
  284. pRange = (PULONG) pData;
  285. if (!Pad) {
  286. Pad = "";
  287. }
  288. for (i=0; i<((nDwords+3)/4); i++) {
  289. dprintf("%s%02lx:", Pad, base + i*16);
  290. for (j=0; (j < 4) && (i*4+j < nDwords); j++) {
  291. dprintf(" %08lx", pRange[i*4+j]);
  292. }
  293. dprintf("\n");
  294. }
  295. }
  296. BOOL
  297. PrintPciCapHeader(
  298. PCI_CAPABILITIES_HEADER *pCapHdr,
  299. ULONG CapOffset,
  300. PCHAR Pad
  301. )
  302. {
  303. if (!Pad) Pad = "";
  304. dprintf("%s%02x: CapID %02x ", Pad, CapOffset, pCapHdr->CapabilityID);
  305. switch (pCapHdr->CapabilityID) {
  306. case PCI_CAPABILITY_ID_POWER_MANAGEMENT:
  307. dprintf("PwrMgmt ");
  308. break;
  309. case PCI_CAPABILITY_ID_AGP:
  310. dprintf("AGP ");
  311. break;
  312. case PCI_CAPABILITY_ID_AGP_TARGET:
  313. dprintf("AGPT ");
  314. break;
  315. case PCI_CAPABILITY_ID_VPD:
  316. dprintf("VPD ");
  317. break;
  318. case PCI_CAPABILITY_ID_SLOT_ID:
  319. dprintf("SLOT ID ");
  320. break;
  321. case PCI_CAPABILITY_ID_MSI:
  322. dprintf("MSI ");
  323. break;
  324. case PCI_CAPABILITY_ID_CPCI_HOTSWAP:
  325. dprintf("CPCI HotSwap ");
  326. break;
  327. case PCI_CAPABILITY_ID_PCIX:
  328. dprintf("PCI-X ");
  329. break;
  330. case PCI_CAPABILITY_ID_HYPERTRANSPORT:
  331. dprintf("HyperTransport ");
  332. break;
  333. case PCI_CAPABILITY_ID_VENDOR_SPECIFIC:
  334. dprintf("Vendor Specific ");
  335. break;
  336. case PCI_CAPABILITY_ID_DEBUG_PORT:
  337. dprintf("Debug Port ");
  338. break;
  339. case PCI_CAPABILITY_ID_CPCI_RES_CTRL:
  340. dprintf("CPCI Resource Control ");
  341. break;
  342. case PCI_CAPABILITY_ID_SHPC:
  343. dprintf("SHPC ");
  344. break;
  345. default:
  346. dprintf("Unknown ");
  347. break;
  348. }
  349. dprintf("\n");
  350. dprintf("%s%02x: NextPtr %02lx\n",
  351. Pad,
  352. (CapOffset + FIELD_OFFSET(PCI_CAPABILITIES_HEADER, Next)), pCapHdr->Next);
  353. return TRUE;
  354. }
  355. VOID
  356. PrintPciPwrMgmtCaps(
  357. USHORT Capabilities
  358. )
  359. {
  360. PCI_PMC pmc;
  361. pmc = *((PCI_PMC *) &Capabilities);
  362. if (pmc.PMEClock) {
  363. dprintf("PMECLK ");
  364. }
  365. if (pmc.Rsvd1) {
  366. dprintf("AUXPWR ");
  367. }
  368. if (pmc.DeviceSpecificInitialization) {
  369. dprintf("DSI ");
  370. }
  371. if (pmc.Support.D1) {
  372. dprintf("D1Support ");
  373. }
  374. if (pmc.Support.D2) {
  375. dprintf("D2Support ");
  376. }
  377. if (pmc.Support.PMED0) {
  378. dprintf("PMED0 ");
  379. }
  380. if (pmc.Support.PMED1) {
  381. dprintf("PMED1 ");
  382. }
  383. if (pmc.Support.PMED2) {
  384. dprintf("PMED2 ");
  385. }
  386. if (pmc.Support.PMED3Hot) {
  387. dprintf("PMED3Hot ");
  388. }
  389. if (pmc.Support.PMED3Cold) {
  390. dprintf("PMED3Cold ");
  391. }
  392. dprintf("Version=%lx\n", pmc.Version);
  393. }
  394. BOOL
  395. PrintPciPowerManagement(
  396. PCHAR pData,
  397. ULONG CapOffset,
  398. PCHAR Pad
  399. )
  400. {
  401. PPCI_PM_CAPABILITY pPmC;
  402. int i;
  403. pPmC = (PPCI_PM_CAPABILITY) pData;
  404. if (!Pad) {
  405. Pad = "";
  406. }
  407. dprintf("%s%02x: PwrMgmtCap %04x ",
  408. Pad,
  409. CapOffset + FIELD_OFFSET(PCI_PM_CAPABILITY, PMC),
  410. pPmC->PMC.AsUSHORT);
  411. PrintPciPwrMgmtCaps(pPmC->PMC.AsUSHORT);
  412. dprintf("%s%02x: PwrMgmtCtrl %04x ",
  413. Pad,
  414. CapOffset+FIELD_OFFSET(PCI_PM_CAPABILITY, PMCSR),
  415. pPmC->PMCSR.AsUSHORT);
  416. PCI_PMCSR CtrlStatus = pPmC->PMCSR.ControlStatus;
  417. if (CtrlStatus.PMEEnable) {
  418. dprintf("PMEEnable ");
  419. }
  420. if (CtrlStatus.PMEStatus) {
  421. dprintf("PMESTAT ");
  422. }
  423. dprintf("DataScale:%lx ", CtrlStatus.DataScale);
  424. dprintf("DataSel:%lx ", CtrlStatus.DataSelect);
  425. dprintf("D%lx%s", CtrlStatus.PowerState, (CtrlStatus.PowerState == 3) ? "Hot " : " ");
  426. if (pPmC->PMCSR_BSE.AsUCHAR){
  427. dprintf("\n%sPwrMgmtBridge ", Pad);
  428. if (pPmC->PMCSR_BSE.BridgeSupport.D3HotSupportsStopClock) {
  429. dprintf("D3HotStopClock ");
  430. }
  431. if (pPmC->PMCSR_BSE.BridgeSupport.BusPowerClockControlEnabled) {
  432. dprintf("BPCCEnable ");
  433. }
  434. }
  435. dprintf("\n");
  436. return TRUE;
  437. }
  438. BOOL
  439. PrintPciAGP(
  440. PCHAR pData,
  441. ULONG CapOffset,
  442. PCHAR Pad
  443. )
  444. {
  445. PPCI_AGP_CAPABILITY pAGP;
  446. int i;
  447. pAGP = (PPCI_AGP_CAPABILITY) pData;
  448. if (!Pad) {
  449. Pad = "";
  450. }
  451. dprintf("%s%02x: Version Major %lx, Minor %lx\n",
  452. Pad,
  453. CapOffset + sizeof(PCI_CAPABILITIES_HEADER),
  454. pAGP->Major,
  455. pAGP->Minor);
  456. dprintf("%s%02x: Status MaxRQDepth:%lx",
  457. Pad,
  458. CapOffset + FIELD_OFFSET(PCI_AGP_CAPABILITY, AGPStatus),
  459. pAGP->AGPStatus.RequestQueueDepthMaximum);
  460. dprintf(" ARSize:%lx", pAGP->AGPStatus.AsyncRequestSize);
  461. dprintf(" CCycle:%lx", pAGP->AGPStatus.CalibrationCycle);
  462. if (pAGP->AGPStatus.SideBandAddressing) {
  463. dprintf(" SBA");
  464. }
  465. if (pAGP->AGPStatus.ITA_Coherent) {
  466. dprintf(" COH");
  467. }
  468. if (pAGP->AGPStatus.Gart64) {
  469. dprintf(" Gart64");
  470. }
  471. if (pAGP->AGPStatus.HostTransDisable) {
  472. dprintf(" HTXDisable");
  473. }
  474. if (pAGP->AGPStatus.FourGB) {
  475. dprintf(" 4GB");
  476. }
  477. if (pAGP->AGPStatus.FastWrite) {
  478. dprintf(" FW");
  479. }
  480. if (pAGP->AGPStatus.Agp3Mode) {
  481. dprintf(" AGP3Mode");
  482. }
  483. dprintf(" Rate:%lx\n", pAGP->AGPStatus.Rate);
  484. dprintf("%s%02x: Command ",
  485. Pad,
  486. CapOffset + FIELD_OFFSET(PCI_AGP_CAPABILITY, AGPCommand));
  487. dprintf("RQDepth:%lx ", pAGP->AGPCommand.RequestQueueDepth);
  488. dprintf("ARSize:%lx ", pAGP->AGPCommand.AsyncReqSize);
  489. dprintf("CCycle:%lx ", pAGP->AGPCommand.CalibrationCycle);
  490. if (pAGP->AGPCommand.SBAEnable) {
  491. dprintf("SBA ");
  492. }
  493. if (pAGP->AGPCommand.AGPEnable) {
  494. dprintf("AGPEnable ");
  495. }
  496. if (pAGP->AGPCommand.Gart64) {
  497. dprintf("Gart64 ");
  498. }
  499. if (pAGP->AGPCommand.FourGBEnable) {
  500. dprintf("4GB ");
  501. }
  502. if (pAGP->AGPCommand.FastWriteEnable) {
  503. dprintf("FW ");
  504. }
  505. dprintf("Rate:%lx ", pAGP->AGPCommand.Rate);
  506. dprintf("\n");
  507. if (pAGP->Header.CapabilityID == PCI_CAPABILITY_ID_AGP_TARGET) {
  508. DWORD dwOff = sizeof(PCI_AGP_CAPABILITY);
  509. PPCI_AGP_EXTENDED_CAPABILITY pAGPExt =
  510. (PPCI_AGP_EXTENDED_CAPABILITY)(pAGP + 1);
  511. dprintf("%s%02x: Control ", Pad,
  512. CapOffset + dwOff + FIELD_OFFSET(PCI_AGP_EXTENDED_CAPABILITY, AgpControl));
  513. if (!pAGPExt->AgpControl.CAL_Disable) {
  514. dprintf("CALEnable ");
  515. }
  516. if (pAGPExt->AgpControl.AP_Enable) {
  517. dprintf("APEnable ");
  518. }
  519. if (pAGPExt->AgpControl.GTLB_Enable) {
  520. dprintf("GTLBEnable ");
  521. }
  522. dprintf("\n");
  523. dprintf("%s%02x: Aperture Size:%lx PageSize:%lx\n",
  524. Pad,
  525. CapOffset + dwOff + FIELD_OFFSET(PCI_AGP_EXTENDED_CAPABILITY, ApertureSize),
  526. pAGPExt->ApertureSize, pAGPExt->AperturePageSize);
  527. dprintf("%s%02x: Gart %08lx:%08lx\n", Pad,
  528. CapOffset + dwOff + FIELD_OFFSET(PCI_AGP_EXTENDED_CAPABILITY, GartLow),
  529. pAGPExt->GartHigh, pAGPExt->GartLow);
  530. }
  531. return TRUE;
  532. }
  533. VOID
  534. PrintPciHtCommandReg(
  535. IN PPCI_HT_CAPABILITY PciHtCap
  536. )
  537. {
  538. dprintf("Type: ");
  539. switch (PciHtCap->Command.Generic.CapabilityType) {
  540. case HTHostSecondary:
  541. dprintf("Secondary/Host ");
  542. if (PciHtCap->Command.HostSecondary.DeviceNumber) {
  543. dprintf("DeviceNumber:%02x ", PciHtCap->Command.HostSecondary.DeviceNumber);
  544. }
  545. if (PciHtCap->Command.HostSecondary.WarmReset) {
  546. dprintf("WarmReset ");
  547. }
  548. if (PciHtCap->Command.HostSecondary.DoubleEnded) {
  549. dprintf("DoubleEnded ");
  550. }
  551. if (PciHtCap->Command.HostSecondary.ChainSide) {
  552. dprintf("ChainSide ");
  553. }
  554. if (PciHtCap->Command.HostSecondary.HostHide) {
  555. dprintf("HostHide ");
  556. }
  557. if (PciHtCap->Command.HostSecondary.ActAsSlave) {
  558. dprintf("ActAsSlave ");
  559. }
  560. if (PciHtCap->Command.HostSecondary.InboundEOCError) {
  561. dprintf("InboundEOCError ");
  562. }
  563. if (PciHtCap->Command.HostSecondary.DropOnUnitinit) {
  564. dprintf("DropOnUnitinit ");
  565. }
  566. dprintf("\n");
  567. break;
  568. case HTSlavePrimary:
  569. dprintf("Primary/Slave ");
  570. dprintf("BaseUnitID:%lx ", PciHtCap->Command.SlavePrimary.BaseUnitID);
  571. dprintf("UnitCount:%lx ", PciHtCap->Command.SlavePrimary.UnitCount);
  572. if (PciHtCap->Command.SlavePrimary.MasterHost) {
  573. dprintf("MasterHost ");
  574. }
  575. if (PciHtCap->Command.SlavePrimary.DefaultDirection) {
  576. dprintf("DefaultDirection ");
  577. }
  578. if (PciHtCap->Command.SlavePrimary.DropOnUnitinit) {
  579. dprintf("DropOnUnitinit ");
  580. }
  581. dprintf("\n");
  582. break;
  583. case HTInterruptDiscoveryConfig:
  584. dprintf("InterruptDiscovery ");
  585. break;
  586. case HTAddressMapping:
  587. dprintf("AddressMapping - ");
  588. default:
  589. dprintf("(not implemented)\n");
  590. break;
  591. }
  592. }
  593. VOID
  594. PrintPciHtLinkControl(
  595. IN PPCI_HT_LinkControl LinkControl
  596. )
  597. {
  598. if (LinkControl->CFlE) {
  599. dprintf("CFlE ");
  600. }
  601. if (LinkControl->CST) {
  602. dprintf("CST ");
  603. }
  604. if (LinkControl->CFE) {
  605. dprintf("CFE ");
  606. }
  607. if (LinkControl->LkFail) {
  608. dprintf("LkFail ");
  609. }
  610. if (LinkControl->Init) {
  611. dprintf("Init ");
  612. }
  613. if (LinkControl->EOC) {
  614. dprintf("EOC ");
  615. }
  616. if (LinkControl->TXO) {
  617. dprintf("TXO ");
  618. }
  619. if (LinkControl->CRCError) {
  620. dprintf("CRCError: %lx ", LinkControl->CRCError);
  621. }
  622. if (LinkControl->IsocEn) {
  623. dprintf("IsocEn ");
  624. }
  625. if (LinkControl->LSEn) {
  626. dprintf("LSEn ");
  627. }
  628. if (LinkControl->ExtCTL) {
  629. dprintf("ExtCTL ");
  630. }
  631. dprintf("\n");
  632. }
  633. VOID
  634. PrintPciHtLinkConfig(
  635. IN PPCI_HT_LinkConfig LinkConfig
  636. )
  637. {
  638. dprintf("MxLnkWdthIn:");
  639. switch (LinkConfig->MaxLinkWidthIn) {
  640. case HTMaxLinkWidth8bits:
  641. dprintf("8 ");
  642. break;
  643. case HTMaxLinkWidth16bits:
  644. dprintf("16 ");
  645. break;
  646. case HTMaxLinkWidth32bits:
  647. dprintf("32 ");
  648. break;
  649. case HTMaxLinkWidth2bits:
  650. dprintf("2 ");
  651. break;
  652. case HTMaxLinkWidth4bits:
  653. dprintf("4 ");
  654. break;
  655. case HTMaxLinkWidthNotConnected:
  656. dprintf("!Connected ");
  657. break;
  658. }
  659. if (LinkConfig->DwFlowControlIn) {
  660. dprintf("DwFcIn ");
  661. }
  662. dprintf("MxLnkWdthOut:");
  663. switch (LinkConfig->MaxLinkWidthOut) {
  664. case HTMaxLinkWidth8bits:
  665. dprintf("8 ");
  666. break;
  667. case HTMaxLinkWidth16bits:
  668. dprintf("16 ");
  669. break;
  670. case HTMaxLinkWidth32bits:
  671. dprintf("32 ");
  672. break;
  673. case HTMaxLinkWidth2bits:
  674. dprintf("2 ");
  675. break;
  676. case HTMaxLinkWidth4bits:
  677. dprintf("4 ");
  678. break;
  679. case HTMaxLinkWidthNotConnected:
  680. dprintf("!Connected ");
  681. break;
  682. }
  683. if (LinkConfig->DwFlowControlOut) {
  684. dprintf("DwFcOut ");
  685. }
  686. dprintf("LnkWdthIn:");
  687. switch (LinkConfig->LinkWidthIn) {
  688. case HTMaxLinkWidth8bits:
  689. dprintf("8 ");
  690. break;
  691. case HTMaxLinkWidth16bits:
  692. dprintf("16 ");
  693. break;
  694. case HTMaxLinkWidth32bits:
  695. dprintf("32 ");
  696. break;
  697. case HTMaxLinkWidth2bits:
  698. dprintf("2 ");
  699. break;
  700. case HTMaxLinkWidth4bits:
  701. dprintf("4 ");
  702. break;
  703. case HTMaxLinkWidthNotConnected:
  704. dprintf("!Connected ");
  705. break;
  706. }
  707. if (LinkConfig->DwFlowControlInEn) {
  708. dprintf("DwFcInEn ");
  709. }
  710. dprintf("LnkWdthOut:");
  711. switch (LinkConfig->LinkWidthOut) {
  712. case HTMaxLinkWidth8bits:
  713. dprintf("8 ");
  714. break;
  715. case HTMaxLinkWidth16bits:
  716. dprintf("16 ");
  717. break;
  718. case HTMaxLinkWidth32bits:
  719. dprintf("32 ");
  720. break;
  721. case HTMaxLinkWidth2bits:
  722. dprintf("2 ");
  723. break;
  724. case HTMaxLinkWidth4bits:
  725. dprintf("4 ");
  726. break;
  727. case HTMaxLinkWidthNotConnected:
  728. dprintf("!Connected ");
  729. break;
  730. }
  731. if (LinkConfig->DwFlowControlOutEn) {
  732. dprintf("DwFcOutEn ");
  733. }
  734. dprintf("\n");
  735. }
  736. VOID
  737. PrintPciHtInterruptBlock(
  738. IN PPCI_TYPE1_CFG_BITS PciCfg1,
  739. IN ULONG CapOffset
  740. )
  741. {
  742. UCHAR index;
  743. ULONG writeOffset, readOffset;
  744. ULONG currentInterrupt;
  745. PULONG dataPort;
  746. PCI_HT_INTERRUPT_INDEX_1 index1;
  747. PCI_HT_INTERRUPT_INDEX_N interruptIndex;
  748. writeOffset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, Command.Interrupt);
  749. readOffset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, DataPort);
  750. //
  751. // Start with the first index to determine the max interrupt count
  752. //
  753. index = 1;
  754. if (!(WritePci(PciCfg1, (PUCHAR)&index, writeOffset, sizeof(UCHAR)))){
  755. dprintf("write operation failed!\n");
  756. return;
  757. }
  758. RtlZeroMemory(&index1, sizeof(PCI_HT_INTERRUPT_INDEX_1));
  759. ReadPci(PciCfg1, (PUCHAR)&index1, readOffset, sizeof(ULONG));
  760. dprintf("- Last Interrupt: 0x%lx\n", index1.LastInterrupt);
  761. //
  762. // According to the HyperTransport spec the interrupt index list
  763. // starts at index 0x10
  764. //
  765. index = 0x10;
  766. currentInterrupt = 0;
  767. dprintf(" InterruptBlock:\n");
  768. while (currentInterrupt <= (ULONG)index1.LastInterrupt) {
  769. ULONG i = 0;
  770. dataPort = (PULONG)&interruptIndex.LowPart;
  771. RtlZeroMemory(&interruptIndex, sizeof(PCI_HT_INTERRUPT_INDEX_N));
  772. //
  773. // Each interruptIndex is 64bits long so we have to read from the
  774. // dataport twice to get the full value
  775. //
  776. while (i <= 1) {
  777. if (!(WritePci(PciCfg1, (PUCHAR)&index, writeOffset, sizeof(UCHAR)))){
  778. dprintf("write operation failed!\n");
  779. return;
  780. }
  781. ReadPci(PciCfg1, (PUCHAR)dataPort, readOffset, sizeof(ULONG));
  782. index++;
  783. dataPort++;
  784. i++;
  785. }
  786. dprintf(" INT%02x: %08x%08x ( ",
  787. currentInterrupt,
  788. interruptIndex.HighPart,
  789. interruptIndex.LowPart);
  790. dprintf("MessageType: %lx ", interruptIndex.LowPart.MessageType);
  791. if (interruptIndex.LowPart.Mask) {
  792. dprintf("Masked ");
  793. }
  794. if (interruptIndex.LowPart.Polarity) {
  795. dprintf("active-low ");
  796. }else{
  797. dprintf("active-high ");
  798. }
  799. if (interruptIndex.LowPart.RequestEOI) {
  800. dprintf("RequestEOI ");
  801. }
  802. if (interruptIndex.HighPart.PassPW) {
  803. dprintf("PassPW ");
  804. }
  805. if (interruptIndex.HighPart.WaitingForEOI) {
  806. dprintf("WaitingForEOI ");
  807. }
  808. dprintf(")\n");
  809. currentInterrupt++;
  810. }
  811. }
  812. VOID
  813. PrintPciHtFreqError(
  814. IN PPCI_HT_Frequency_Error FreqError
  815. )
  816. {
  817. UCHAR asUCHAR;
  818. asUCHAR = (*(PUCHAR)FreqError);
  819. dprintf("Freq: ");
  820. switch (FreqError->LinkFrequency) {
  821. case HTFreq200MHz:
  822. dprintf("200MHz ");
  823. break;
  824. case HTFreq300MHz:
  825. dprintf("300MHz ");
  826. break;
  827. case HTFreq400MHz:
  828. dprintf("400MHz ");
  829. break;
  830. case HTFreq500MHz:
  831. dprintf("500MHz ");
  832. break;
  833. case HTFreq600MHz:
  834. dprintf("600MHz ");
  835. break;
  836. case HTFreq800MHz:
  837. dprintf("800MHz ");
  838. break;
  839. case HTFreq1000MHz:
  840. dprintf("1000MHz ");
  841. break;
  842. case HTFreqReserved:
  843. case HTFreqVendorDefined:
  844. default:
  845. dprintf("?? ");
  846. break;
  847. }
  848. //
  849. // only print an error if we have one
  850. //
  851. if (asUCHAR & 0xf0) {
  852. dprintf("Error: ");
  853. if (FreqError->ProtocolError) {
  854. dprintf("ProtocolError ");
  855. }
  856. if (FreqError->OverflowError) {
  857. dprintf("OverflowError ");
  858. }
  859. if (FreqError->EndOfChainError) {
  860. dprintf("EndOfChainError ");
  861. }
  862. if (FreqError->CTLTimeout) {
  863. dprintf("CTLTimeout ");
  864. }
  865. }
  866. dprintf("\n");
  867. }
  868. VOID
  869. PrintPciHtFeatureCap(
  870. IN PPCI_HT_FeatureCap FeatureCap,
  871. IN PPCI_HT_FeatureCap_Ex FeatureCapEx
  872. )
  873. {
  874. if (FeatureCap->IsocMode) {
  875. dprintf("IsocMode ");
  876. }
  877. if (FeatureCap->LDTSTOP) {
  878. dprintf("LDTSTOP ");
  879. }
  880. if (FeatureCap->CRCTestMode) {
  881. dprintf("CRCTestMode ");
  882. }
  883. if (FeatureCapEx){
  884. if (FeatureCapEx->ExtendedRegisterSet) {
  885. dprintf("ExtendedRegisterSet ");
  886. }
  887. }
  888. dprintf("\n");
  889. }
  890. VOID
  891. PrintPciHtErrorHandling(
  892. IN PPCI_HT_ErrorHandling ErrorHandling
  893. )
  894. {
  895. USHORT asUSHORT = (*(PUSHORT)ErrorHandling);
  896. if (asUSHORT & 0xffff) {
  897. if (ErrorHandling->ProtFloodEn){
  898. dprintf("ProtFloodEn ");
  899. }
  900. if (ErrorHandling->OverflowFloodEn){
  901. dprintf("OverflowFloodEn ");
  902. }
  903. if (ErrorHandling->ProtFatalEn){
  904. dprintf("ProtFatalEn ");
  905. }
  906. if (ErrorHandling->OverflowFatalEn){
  907. dprintf("OverflowFatalEn ");
  908. }
  909. if (ErrorHandling->EOCFatalEn){
  910. dprintf("EOCFatalEn ");
  911. }
  912. if (ErrorHandling->RespFatalEn){
  913. dprintf("RespFatalEn ");
  914. }
  915. if (ErrorHandling->CRCFatalEn){
  916. dprintf("CRCFatalEn ");
  917. }
  918. if (ErrorHandling->SERRFataEn){
  919. dprintf("SERRFataEn ");
  920. }
  921. if (ErrorHandling->ChainFail){
  922. dprintf("ChainFail ");
  923. }
  924. if (ErrorHandling->ResponseError){
  925. dprintf("ResponseError ");
  926. }
  927. if (ErrorHandling->ProtNonFatalEn){
  928. dprintf("ProtNonFatalEn ");
  929. }
  930. if (ErrorHandling->OverflowNonFatalEn){
  931. dprintf("OverflowNonFatalEn ");
  932. }
  933. if (ErrorHandling->EOCNonFatalEn){
  934. dprintf("EOCNonFatalEn ");
  935. }
  936. if (ErrorHandling->RespNonFatalEn){
  937. dprintf("RespNonFatalEn ");
  938. }
  939. if (ErrorHandling->CRCNonFatalEn){
  940. dprintf("CRCNonFatalEn ");
  941. }
  942. if (ErrorHandling->SERRNonFatalEn){
  943. dprintf("SERRNonFatalEn ");
  944. }
  945. }
  946. dprintf("\n");
  947. }
  948. BOOL
  949. PrintPciHtCaps(
  950. IN PPCI_TYPE1_CFG_BITS PciCfg1,
  951. IN PCHAR CapData,
  952. IN ULONG CapOffset,
  953. IN PCHAR Pad
  954. )
  955. {
  956. PPCI_HT_CAPABILITY pciHtCap;
  957. ULONG offset;
  958. pciHtCap = (PPCI_HT_CAPABILITY)CapData;
  959. if (!Pad) {
  960. Pad = "";
  961. }
  962. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, Command);
  963. dprintf("%s%02x: Command %04x ", Pad, offset, pciHtCap->Command);
  964. PrintPciHtCommandReg(pciHtCap);
  965. if (pciHtCap->Command.Generic.CapabilityType == HTInterruptDiscoveryConfig){
  966. //
  967. // Handle the interrupt stuff and return
  968. //
  969. PrintPciHtInterruptBlock(PciCfg1, CapOffset);
  970. return TRUE;
  971. }
  972. //
  973. // Print the common link control/config
  974. //
  975. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, LinkControl_0);
  976. dprintf("%s%02x: LinkControl_0 %04x ", Pad, offset, pciHtCap->LinkControl_0);
  977. PrintPciHtLinkControl(&pciHtCap->LinkControl_0);
  978. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, LinkConfig_0);
  979. dprintf("%s%02x: LinkConfig_0 %04x ", Pad, offset, pciHtCap->LinkConfig_0);
  980. PrintPciHtLinkConfig(&pciHtCap->LinkConfig_0);
  981. //
  982. // Now deal with the host/slave specifics
  983. //
  984. switch (pciHtCap->Command.Generic.CapabilityType) {
  985. case HTSlavePrimary:
  986. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, LinkControl_0);
  987. dprintf("%s%02x: LinkControl_1 %04x ", Pad, offset, pciHtCap->LinkControl_0);
  988. PrintPciHtLinkControl(&pciHtCap->SlavePrimary.LinkControl_1);
  989. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, SlavePrimary.LinkConfig_1);
  990. dprintf("%s%02x: LinkConfig_1 %04x ", Pad, offset, pciHtCap->SlavePrimary.LinkConfig_1);
  991. PrintPciHtLinkConfig(&pciHtCap->SlavePrimary.LinkConfig_1);
  992. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, SlavePrimary.RevisionID);
  993. dprintf("%s%02x: RevisionID %02x:%02x (Major:Minor)\n", Pad, offset,
  994. pciHtCap->SlavePrimary.RevisionID.MajorRev,
  995. pciHtCap->SlavePrimary.RevisionID.MinorRev);
  996. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, SlavePrimary.FreqErr_0);
  997. dprintf("%s%02x: FreqErr_0 %02x ", Pad, offset, pciHtCap->SlavePrimary.FreqErr_0);
  998. PrintPciHtFreqError(&pciHtCap->SlavePrimary.FreqErr_0);
  999. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, SlavePrimary.LinkFreqCap_0);
  1000. dprintf("%s%02x: LinkFreqCap_0 %04x\n", Pad, offset, pciHtCap->SlavePrimary.LinkFreqCap_0);
  1001. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, SlavePrimary.FeatureCap);
  1002. dprintf("%s%02x: FeatureCap %02x ", Pad, offset, pciHtCap->SlavePrimary.FeatureCap);
  1003. PrintPciHtFeatureCap(&pciHtCap->SlavePrimary.FeatureCap, NULL);
  1004. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, SlavePrimary.FreqErr_1);
  1005. dprintf("%s%02x: FreqErr_1 %02x ", Pad, offset, pciHtCap->SlavePrimary.FreqErr_1);
  1006. PrintPciHtFreqError(&pciHtCap->SlavePrimary.FreqErr_1);
  1007. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, SlavePrimary.LinkFreqCap_1);
  1008. dprintf("%s%02x: LinkFreqCap_1 %04x\n", Pad, offset, pciHtCap->SlavePrimary.LinkFreqCap_1);
  1009. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, SlavePrimary.EnumerationScratchpad);
  1010. dprintf("%s%02x: EnumScratchpad %04x\n", Pad, offset, pciHtCap->SlavePrimary.EnumerationScratchpad);
  1011. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, SlavePrimary.ErrorHandling);
  1012. dprintf("%s%02x: ErrorHandling %04x ", Pad, offset, pciHtCap->SlavePrimary.ErrorHandling);
  1013. PrintPciHtErrorHandling(&pciHtCap->SlavePrimary.ErrorHandling);
  1014. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, SlavePrimary.MemoryBaseUpper8Bits);
  1015. dprintf("%s%02x: MemBaseUpper %02x\n", Pad, offset, pciHtCap->SlavePrimary.MemoryBaseUpper8Bits);
  1016. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, SlavePrimary.MemoryLimitUpper8Bits);
  1017. dprintf("%s%02x: MemLimitUpper %02x\n", Pad, offset, pciHtCap->SlavePrimary.MemoryLimitUpper8Bits);
  1018. break;
  1019. case HTHostSecondary:
  1020. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, HostSecondary.RevisionID);
  1021. dprintf("%s%02x: RevisionID %02x:%02x (Major:Minor)\n", Pad, offset,
  1022. pciHtCap->HostSecondary.RevisionID.MajorRev,
  1023. pciHtCap->HostSecondary.RevisionID.MinorRev);
  1024. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, HostSecondary.FreqErr_0);
  1025. dprintf("%s%02x: FreqErr_0 %02x ", Pad, offset, pciHtCap->HostSecondary.FreqErr_0);
  1026. PrintPciHtFreqError(&pciHtCap->HostSecondary.FreqErr_0);
  1027. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, HostSecondary.LinkFreqCap_0);
  1028. dprintf("%s%02x: LinkFreqCap_0 %04x\n", Pad, offset, pciHtCap->HostSecondary.LinkFreqCap_0);
  1029. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, HostSecondary.FeatureCap);
  1030. dprintf("%s%02x: FeatureCap %04x ", Pad, offset, pciHtCap->HostSecondary.FeatureCap);
  1031. PrintPciHtFeatureCap(&pciHtCap->HostSecondary.FeatureCap, &pciHtCap->HostSecondary.FeatureCapEx);
  1032. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, HostSecondary.EnumerationScratchpad);
  1033. dprintf("%s%02x: EnumScratchpad %04x\n", Pad, offset, pciHtCap->HostSecondary.EnumerationScratchpad);
  1034. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, HostSecondary.ErrorHandling);
  1035. dprintf("%s%02x: ErrorHandling %04x ", Pad, offset, pciHtCap->HostSecondary.ErrorHandling);
  1036. PrintPciHtErrorHandling(&pciHtCap->HostSecondary.ErrorHandling);
  1037. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, HostSecondary.MemoryBaseUpper8Bits);
  1038. dprintf("%s%02x: MemBaseUpper %02x\n", Pad, offset, pciHtCap->HostSecondary.MemoryBaseUpper8Bits);
  1039. offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, HostSecondary.MemoryLimitUpper8Bits);
  1040. dprintf("%s%02x: MemLimitUpper %02x\n", Pad, offset, pciHtCap->HostSecondary.MemoryLimitUpper8Bits);
  1041. break;
  1042. default:
  1043. break;
  1044. }
  1045. return TRUE;
  1046. }
  1047. BOOL
  1048. PrintPciMSICaps(
  1049. PCHAR pData,
  1050. ULONG CapOffset,
  1051. PCHAR Pad
  1052. )
  1053. {
  1054. PPCI_MSI_CAPABILITY pMsiCap;
  1055. pMsiCap = (PPCI_MSI_CAPABILITY) pData;
  1056. if (!Pad) {
  1057. Pad = "";
  1058. }
  1059. dprintf("%s%02x: MsgCtrl ",
  1060. Pad,
  1061. CapOffset + FIELD_OFFSET(PCI_MSI_CAPABILITY, MessageControl));
  1062. if (pMsiCap->MessageControl.CapableOf64Bits) {
  1063. dprintf("64BitCapable ");
  1064. }
  1065. if (pMsiCap->MessageControl.MSIEnable) {
  1066. dprintf("MSIEnable ");
  1067. }
  1068. dprintf("MultipleMsgEnable:%lx ", pMsiCap->MessageControl.MultipleMessageEnable);
  1069. dprintf("MultipleMsgCapable:%lx ", pMsiCap->MessageControl.MultipleMessageCapable);
  1070. dprintf("%s%02x: MsgAddr %lx\n",
  1071. Pad,
  1072. CapOffset + FIELD_OFFSET(PCI_MSI_CAPABILITY, MessageAddressLower),
  1073. pMsiCap->MessageAddressLower.Raw);
  1074. if (pMsiCap->MessageControl.CapableOf64Bits) {
  1075. dprintf("%s%02x: MsgAddrHi %lx\n",
  1076. Pad,
  1077. CapOffset + FIELD_OFFSET(PCI_MSI_CAPABILITY, Option64Bit.MessageAddressUpper),
  1078. pMsiCap->Option64Bit.MessageAddressUpper);
  1079. dprintf("%s%02x: MsData %lx\n",
  1080. Pad,
  1081. CapOffset + FIELD_OFFSET(PCI_MSI_CAPABILITY, Option64Bit.MessageData),
  1082. pMsiCap->Option64Bit.MessageData);
  1083. } else {
  1084. dprintf("%s%02x: MsData %lx\n",
  1085. Pad,
  1086. CapOffset + FIELD_OFFSET(PCI_MSI_CAPABILITY, Option32Bit.MessageData),
  1087. pMsiCap->Option32Bit.MessageData);
  1088. }
  1089. return TRUE;
  1090. }
  1091. /*** CardBus Registers
  1092. */
  1093. VOID
  1094. PrintCBSktEventReg(
  1095. UCHAR Register
  1096. )
  1097. {
  1098. dprintf("%lx ", Register);
  1099. if (Register & SKTEVENT_CSTSCHG) {
  1100. dprintf("CSTSCHG ");
  1101. }
  1102. if (Register & SKTEVENT_CCD1) {
  1103. dprintf("/CCD1 ");
  1104. }
  1105. if (Register & SKTEVENT_CCD2) {
  1106. dprintf("/CCD2 ");
  1107. }
  1108. if (Register & SKTEVENT_POWERCYCLE) {
  1109. dprintf("PowerCycle ");
  1110. }
  1111. }
  1112. //Socket Mask Register
  1113. VOID
  1114. PrintCBSktMaskReg(
  1115. UCHAR Register
  1116. )
  1117. {
  1118. dprintf("%lx ", Register);
  1119. if (Register & SKTMSK_POWERCYCLE) {
  1120. dprintf("PowerCycle ");
  1121. }
  1122. if (Register & SKTMSK_CSTSCHG) {
  1123. dprintf("CSTSCHG ");
  1124. }
  1125. if ((Register & SKTMSK_CCD) == 0) {
  1126. dprintf("CSCDisabled ");
  1127. } else if ((Register & SKTMSK_CCD) == SKTMSK_CCD) {
  1128. dprintf("CSCEnabled ");
  1129. } else {
  1130. dprintf("Undefined ");
  1131. }
  1132. }
  1133. //Socket Present State Register
  1134. VOID
  1135. PrintCBSktStateReg(
  1136. ULONG Register
  1137. )
  1138. {
  1139. dprintf("%08lx ", Register);
  1140. if (Register & SKTSTATE_CSTSCHG) {
  1141. dprintf("CSTSCHG ");
  1142. }
  1143. if (Register & SKTSTATE_POWERCYCLE) {
  1144. dprintf("PowerCycle ");
  1145. }
  1146. if (Register & SKTSTATE_CARDTYPE_MASK) {
  1147. dprintf("");
  1148. }
  1149. if (Register & SKTSTATE_R2CARD) {
  1150. dprintf("R2Card ");
  1151. }
  1152. if (Register & SKTSTATE_CBCARD) {
  1153. dprintf("CBCard ");
  1154. }
  1155. if (Register & SKTSTATE_OPTI_DOCK) {
  1156. dprintf("OptiDock ");
  1157. }
  1158. if (Register & SKTSTATE_CARDINT) {
  1159. dprintf("CardInt ");
  1160. }
  1161. if (Register & SKTSTATE_NOTACARD) {
  1162. dprintf("NotACard ");
  1163. }
  1164. if (Register & SKTSTATE_DATALOST) {
  1165. dprintf("DataLoss ");
  1166. }
  1167. if (Register & SKTSTATE_BADVCCREQ) {
  1168. dprintf("BadVccReq ");
  1169. }
  1170. if (Register & SKTSTATE_5VCARD) {
  1171. dprintf("5VCard ");
  1172. }
  1173. if (Register & SKTSTATE_3VCARD) {
  1174. dprintf("3VCard ");
  1175. }
  1176. if (Register & SKTSTATE_XVCARD) {
  1177. dprintf("XVCard ");
  1178. }
  1179. if (Register & SKTSTATE_YVCARD) {
  1180. dprintf("YVCard ");
  1181. }
  1182. if (Register & SKTSTATE_5VSOCKET) {
  1183. dprintf("5VSkt ");
  1184. }
  1185. if (Register & SKTSTATE_3VSOCKET) {
  1186. dprintf("3VSkt ");
  1187. }
  1188. if (Register & SKTSTATE_XVSOCKET) {
  1189. dprintf("XVSkt ");
  1190. }
  1191. if (Register & SKTSTATE_YVSOCKET) {
  1192. dprintf("YVSkt ");
  1193. }
  1194. if ((Register & SKTSTATE_CCD_MASK) == 0) {
  1195. dprintf("CardPresent ");
  1196. } else if ((Register & SKTSTATE_CCD_MASK) == SKTSTATE_CCD_MASK) {
  1197. dprintf("NoCard ");
  1198. } else {
  1199. dprintf("CardMayPresent ");
  1200. }
  1201. }
  1202. //Socket Control Register
  1203. VOID
  1204. PrintCBSktCtrlReg(
  1205. ULONG Register
  1206. )
  1207. {
  1208. ULONG Ctrl;
  1209. dprintf("%08lx ", Register);
  1210. Ctrl = Register & SKTPOWER_VPP_CONTROL;
  1211. dprintf("Vpp:");
  1212. switch (Ctrl) {
  1213. case SKTPOWER_VPP_OFF:
  1214. dprintf("Off");
  1215. break;
  1216. case SKTPOWER_VPP_120V:
  1217. dprintf("12V");
  1218. break;
  1219. case SKTPOWER_VPP_050V:
  1220. dprintf("5V");
  1221. break;
  1222. case SKTPOWER_VPP_033V:
  1223. dprintf("3.3V");
  1224. break;
  1225. case SKTPOWER_VPP_0XXV:
  1226. dprintf("X.XV");
  1227. break;
  1228. case SKTPOWER_VPP_0YYV:
  1229. dprintf("Y.YV");
  1230. break;
  1231. }
  1232. dprintf(" Vcc:");
  1233. switch (Register & SKTPOWER_VCC_CONTROL) {
  1234. case SKTPOWER_VCC_OFF:
  1235. dprintf("Off");
  1236. break;
  1237. case SKTPOWER_VCC_050V:
  1238. dprintf("5V");
  1239. break;
  1240. case SKTPOWER_VCC_033V:
  1241. dprintf("3.3V");
  1242. break;
  1243. case SKTPOWER_VCC_0XXV:
  1244. dprintf("X.XV");
  1245. break;
  1246. case SKTPOWER_VCC_0YYV:
  1247. dprintf("Y.YV");
  1248. break;
  1249. }
  1250. if (Register & SKTPOWER_STOPCLOCK) {
  1251. dprintf(" ClockStopEnabled ");
  1252. }
  1253. }
  1254. BOOL
  1255. PrintCBRegs(
  1256. PCHAR pData,
  1257. PCHAR Pad
  1258. )
  1259. {
  1260. ULONG Off=0;
  1261. dprintf("%s%02lx: SktEvent ", Pad, Off);
  1262. PrintCBSktEventReg(*pData);
  1263. dprintf("\n");
  1264. pData+=4; Off+=4;
  1265. dprintf("%s%02lx: SktMask ", Pad, Off);
  1266. PrintCBSktMaskReg(*pData);
  1267. dprintf("\n");
  1268. pData+=4; Off+=4;
  1269. dprintf("%s%02lx: SktState ", Pad, Off);
  1270. PrintCBSktStateReg(*((PULONG)pData));
  1271. dprintf("\n");
  1272. pData+=4; Off+=4;
  1273. dprintf("%s%02lx: SktForce %08lx\n", Pad, Off, *((PULONG)pData));
  1274. pData+=4; Off+=4;
  1275. dprintf("%s%02lx: SktCtrl ", Pad, Off);
  1276. PrintCBSktEventReg(*(pData));
  1277. dprintf("\n");
  1278. return FALSE;
  1279. }
  1280. /*** ExCA Registers
  1281. */
  1282. VOID
  1283. PrintExCARegs(
  1284. PEXCAREGS pExCARegs
  1285. )
  1286. {
  1287. struct _MEMWIN_EXCA {
  1288. USHORT Start;
  1289. USHORT Stop;
  1290. USHORT Offset;
  1291. USHORT Reserved;
  1292. } MemWin, *pMemWin;
  1293. dprintf("%02lx: IDRev %02lx", FIELD_OFFSET(EXCAREGS, bIDRev),pExCARegs->bIDRev);
  1294. if ((pExCARegs->bIDRev & IDREV_IFID_MASK) == IDREV_IFID_IO) {
  1295. dprintf(" IOOnly");
  1296. }
  1297. else if ((pExCARegs->bIDRev & IDREV_IFID_MASK) == IDREV_IFID_MEM) {
  1298. dprintf(" MemOnly");
  1299. } else if ((pExCARegs->bIDRev & IDREV_IFID_MASK) == IDREV_IFID_IOMEM) {
  1300. dprintf(" IO&Mem");
  1301. }
  1302. dprintf(" Rev: %02lx\n", pExCARegs->bIDRev & IDREV_REV_MASK);
  1303. dprintf("%02lx: IFStatus %02lx",
  1304. FIELD_OFFSET(EXCAREGS, bInterfaceStatus),
  1305. pExCARegs->bInterfaceStatus);
  1306. if (pExCARegs->bInterfaceStatus & IFS_BVD1) {
  1307. dprintf(" BVD1");
  1308. }
  1309. if (pExCARegs->bInterfaceStatus & IFS_BVD2) {
  1310. dprintf(" BVD2");
  1311. }
  1312. if (pExCARegs->bInterfaceStatus & IFS_CD1) {
  1313. dprintf(" CD1");
  1314. }
  1315. if (pExCARegs->bInterfaceStatus & IFS_CD2) {
  1316. dprintf(" CD2");
  1317. }
  1318. if (pExCARegs->bInterfaceStatus & IFS_WP) {
  1319. dprintf(" WP");
  1320. }
  1321. if (pExCARegs->bInterfaceStatus & IFS_RDYBSY) {
  1322. dprintf(" Ready");
  1323. }
  1324. if (pExCARegs->bInterfaceStatus & IFS_CARDPWR_ACTIVE) {
  1325. dprintf(" PowerActive");
  1326. }
  1327. if (pExCARegs->bInterfaceStatus & IFS_VPP_VALID) {
  1328. dprintf(" VppValid");
  1329. }
  1330. dprintf("\n");
  1331. dprintf("%02lx: PwrCtrl %02lx", FIELD_OFFSET(EXCAREGS, bPowerControl), pExCARegs->bPowerControl);
  1332. dprintf(" Vpp1=");
  1333. switch (pExCARegs->bPowerControl & PC_VPP1_MASK) {
  1334. case PC_VPP_NO_CONNECT:
  1335. dprintf("Off");
  1336. break;
  1337. case PC_VPP_SETTO_VCC:
  1338. dprintf("Vcc");
  1339. break;
  1340. case PC_VPP_SETTO_VPP:
  1341. dprintf("Vpp");
  1342. break;
  1343. }
  1344. dprintf(" Vpp2=");
  1345. switch ((pExCARegs->bPowerControl & PC_VPP2_MASK) >> 2) {
  1346. case PC_VPP_NO_CONNECT:
  1347. dprintf("Off");
  1348. break;
  1349. case PC_VPP_SETTO_VCC:
  1350. dprintf("Vcc");
  1351. break;
  1352. case PC_VPP_SETTO_VPP:
  1353. dprintf("Vpp");
  1354. break;
  1355. }
  1356. if (pExCARegs->bPowerControl & PC_CARDPWR_ENABLE) {
  1357. dprintf(" PwrEnable");
  1358. }
  1359. if (pExCARegs->bPowerControl & PC_AUTOPWR_ENABLE) {
  1360. dprintf(" AutoPwrEnabled");
  1361. }
  1362. if (pExCARegs->bPowerControl & PC_RESETDRV_DISABLE) {
  1363. dprintf(" RESETDRVDisabled");
  1364. }
  1365. if (pExCARegs->bPowerControl & PC_OUTPUT_ENABLE) {
  1366. dprintf(" OutputEnable");
  1367. }
  1368. dprintf("\n");
  1369. dprintf("%02lx: IntGenCtrl %02lx",
  1370. FIELD_OFFSET(EXCAREGS, bIntGenControl),
  1371. pExCARegs->bIntGenControl);
  1372. if (pExCARegs->bIntGenControl & IGC_INTR_ENABLE) {
  1373. dprintf(" INTREnable");
  1374. }
  1375. if (pExCARegs->bIntGenControl & IGC_PCCARD_IO) {
  1376. dprintf(" IOCard");
  1377. }
  1378. if (pExCARegs->bIntGenControl & IGC_PCCARD_RESETLO) {
  1379. dprintf(" ResetOff");
  1380. }
  1381. if (pExCARegs->bIntGenControl & IGC_RINGIND_ENABLE) {
  1382. dprintf(" RingIndEnable");
  1383. }
  1384. dprintf(" CardIRQ:%lx\n", pExCARegs->bIntGenControl & IGC_IRQ_MASK);
  1385. dprintf("%02lx: CardStatChange %02lx", FIELD_OFFSET(EXCAREGS, bCardStatusChange), pExCARegs->bCardStatusChange);
  1386. if (pExCARegs->bCardStatusChange & CSC_BATT_DEAD) {
  1387. dprintf(" BATTDEAD");
  1388. }
  1389. if (pExCARegs->bCardStatusChange & CSC_BATT_WARNING) {
  1390. dprintf(" BATTWARN");
  1391. }
  1392. if (pExCARegs->bCardStatusChange & CSC_READY_CHANGE) {
  1393. dprintf(" RDYC");
  1394. }
  1395. if (pExCARegs->bCardStatusChange & CSC_CD_CHANGE) {
  1396. dprintf(" CDC");
  1397. }
  1398. dprintf("\n");
  1399. dprintf("%02lx: IntConfig %02lx",
  1400. FIELD_OFFSET(EXCAREGS, bCardStatusIntConfig),
  1401. pExCARegs->bCardStatusIntConfig);
  1402. if (pExCARegs->bCardStatusIntConfig & CSCFG_BATT_DEAD) {
  1403. dprintf(" BattDeadEnable");
  1404. }
  1405. if (pExCARegs->bCardStatusIntConfig & CSCFG_BATT_WARNING) {
  1406. dprintf(" BattWarnEnable");
  1407. }
  1408. if (pExCARegs->bCardStatusIntConfig & CSCFG_READY_ENABLE) {
  1409. dprintf(" RDYEnable");
  1410. }
  1411. if (pExCARegs->bCardStatusIntConfig & CSCFG_CD_ENABLE) {
  1412. dprintf(" CDEnable");
  1413. }
  1414. dprintf(" CSCIRQ:%lx\n",(pExCARegs->bCardStatusIntConfig & CSCFG_IRQ_MASK));
  1415. dprintf("%02lx: WinEnable %02lx",
  1416. FIELD_OFFSET(EXCAREGS, bWindowEnable),
  1417. pExCARegs->bWindowEnable);
  1418. if (pExCARegs->bWindowEnable & WE_MEM0_ENABLE) {
  1419. dprintf(" Mem0Enable");
  1420. }
  1421. if (pExCARegs->bWindowEnable & WE_MEM1_ENABLE) {
  1422. dprintf(" Mem1Enable");
  1423. }
  1424. if (pExCARegs->bWindowEnable & WE_MEM2_ENABLE) {
  1425. dprintf(" Mem2Enable");
  1426. }
  1427. if (pExCARegs->bWindowEnable & WE_MEM3_ENABLE) {
  1428. dprintf(" Mem3Enable");
  1429. }
  1430. if (pExCARegs->bWindowEnable & WE_MEM4_ENABLE) {
  1431. dprintf(" Mem4Enable");
  1432. }
  1433. if (pExCARegs->bWindowEnable & WE_MEMCS16_DECODE) {
  1434. dprintf(" DecodeA23-A12");
  1435. }
  1436. if (pExCARegs->bWindowEnable & WE_IO0_ENABLE) {
  1437. dprintf(" IO0Enable");
  1438. }
  1439. if (pExCARegs->bWindowEnable & WE_IO1_ENABLE) {
  1440. dprintf(" IO1Enable");
  1441. }
  1442. dprintf("\n");
  1443. dprintf("%02lx: IOWinCtrl %02lx",
  1444. FIELD_OFFSET(EXCAREGS, bIOControl),
  1445. pExCARegs->bIOControl);
  1446. if (pExCARegs->bIOControl & IOC_IO0_DATASIZE) {
  1447. dprintf(" IO0CardIOCS");
  1448. }
  1449. if (pExCARegs->bIOControl & IOC_IO0_IOCS16) {
  1450. dprintf(" IO016Bit");
  1451. }
  1452. if (pExCARegs->bIOControl & IOC_IO0_ZEROWS) {
  1453. dprintf(" IO0ZeroWS");
  1454. }
  1455. if (pExCARegs->bIOControl & IOC_IO0_WAITSTATE) {
  1456. dprintf(" IO0WS");
  1457. }
  1458. if (pExCARegs->bIOControl & IOC_IO1_DATASIZE) {
  1459. dprintf(" IO1CardIOCS");
  1460. }
  1461. if (pExCARegs->bIOControl & IOC_IO1_IOCS16) {
  1462. dprintf(" IO116Bit");
  1463. }
  1464. if (pExCARegs->bIOControl & IOC_IO1_ZEROWS) {
  1465. dprintf(" IO1ZeroWS");
  1466. }
  1467. if (pExCARegs->bIOControl & IOC_IO1_WAITSTATE) {
  1468. dprintf(" IO1WS");
  1469. }
  1470. dprintf("\n");
  1471. dprintf("%02lx: IOWin0Start %02lx %02lx\n",
  1472. FIELD_OFFSET(EXCAREGS, bIO0StartLo),
  1473. pExCARegs->bIO0StartHi, pExCARegs->bIO0StartLo);
  1474. dprintf("%02lx: IOWin0Stop %02lx %02lx\n",
  1475. FIELD_OFFSET(EXCAREGS, bIO0StopLo),
  1476. pExCARegs->bIO0StopHi, pExCARegs->bIO0StopLo);
  1477. dprintf("%02lx: IOWin1Start %02lx %02lx\n",
  1478. FIELD_OFFSET(EXCAREGS, bIO1StartLo),
  1479. pExCARegs->bIO1StartHi, pExCARegs->bIO1StartLo);
  1480. dprintf("%02lx: IOWin1Stop %02lx %02lx\n",
  1481. FIELD_OFFSET(EXCAREGS, bIO1StopLo),
  1482. pExCARegs->bIO1StopHi, pExCARegs->bIO1StopLo);
  1483. pMemWin = (struct _MEMWIN_EXCA*) &pExCARegs->bMem0StartLo;
  1484. for (int i=0;
  1485. i<5;
  1486. i++, pMemWin++) {
  1487. dprintf("%02lx: MemWin%lxStart %04lx",
  1488. FIELD_OFFSET(EXCAREGS, bMem0StartLo) + i*sizeof(_MEMWIN_EXCA),
  1489. i, pMemWin->Start & MEMBASE_ADDR_MASK);
  1490. if (pMemWin->Start & MEMBASE_ZEROWS) {
  1491. dprintf(" ZeroWs");
  1492. } else if (pMemWin->Start & MEMBASE_16BIT) {
  1493. dprintf(" 16Bit");
  1494. }
  1495. dprintf("\n");
  1496. dprintf("%02lx: MemWin%lxStop %04lx, WaitState:%lx\n",
  1497. FIELD_OFFSET(EXCAREGS, bMem0StopLo) + i*sizeof(_MEMWIN_EXCA),
  1498. i,
  1499. (pMemWin->Stop & MEMEND_ADDR_MASK),
  1500. (pMemWin->Stop & MEMEND_WS_MASK));
  1501. dprintf("%02lx: MemWin%lxOffset %04lx %s%s\n",
  1502. FIELD_OFFSET(EXCAREGS, bMem0OffsetLo) + i*sizeof(_MEMWIN_EXCA),
  1503. i,
  1504. (pMemWin->Offset & MEMOFF_ADDR_MASK),
  1505. ((pMemWin->Offset & MEMOFF_REG_ACTIVE) ? " RegActive" : ""),
  1506. ((pMemWin->Offset & MEMOFF_WP) ? " WP" : "")
  1507. );
  1508. }
  1509. }
  1510. VOID
  1511. PrintExCAHiRegs(
  1512. PUCHAR pExCaReg,
  1513. PCHAR Pad
  1514. )
  1515. {
  1516. ULONG Off = sizeof(EXCAREGS);
  1517. dprintf("%s%02lx: MemWin0High %02lx\n", Pad, Off++, *(pExCaReg++));
  1518. dprintf("%s%02lx: MemWin1High %02lx\n", Pad, Off++, *(pExCaReg++));
  1519. dprintf("%s%02lx: MemWin2High %02lx\n", Pad, Off++, *(pExCaReg++));
  1520. dprintf("%s%02lx: MemWin3High %02lx\n", Pad, Off++, *(pExCaReg++));
  1521. dprintf("%s%02lx: MemWin4High %02lx\n", Pad, Off++, *(pExCaReg++));
  1522. dprintf("%s%02lx: CLIOWin0High %02lx\n", Pad, Off++, *(pExCaReg++));
  1523. dprintf("%s%02lx: CLIOWin1High %02lx\n", Pad, Off++, *(pExCaReg++));
  1524. }
  1525. /***LP ReadExCAByte - Read ExCA byte register
  1526. *
  1527. * ENTRY
  1528. * dwBaseAddr - Base port address
  1529. * dwReg - register offset
  1530. *
  1531. * EXIT
  1532. * returns data read
  1533. */
  1534. BYTE
  1535. ReadExCAByte(ULONG64 dwBaseAddr, DWORD dwReg)
  1536. {
  1537. BYTE bData=0;
  1538. ULONG ulSize;
  1539. ulSize = sizeof(BYTE);
  1540. WriteIoSpace64(dwBaseAddr, dwReg, &ulSize);
  1541. ulSize = sizeof(BYTE);
  1542. ReadIoSpace64(dwBaseAddr + 1, (PULONG)&bData, &ulSize);
  1543. return bData;
  1544. } //ReadExCAByte
  1545. /***LP GetClassDesc - Get class description string
  1546. *
  1547. * ENTRY
  1548. * BaseClass - Base Class code
  1549. * SubClass - Sub Class code
  1550. * ProgIF - Program Interface code
  1551. * ClassDesc - Which string call wants
  1552. *
  1553. * EXIT-SUCCESS
  1554. * returns pointer to description string
  1555. * EXIT-FAILURE
  1556. * returns NULL
  1557. */
  1558. PCHAR
  1559. GetClassDesc(
  1560. IN UCHAR BaseClass,
  1561. IN UCHAR SubClass,
  1562. IN UCHAR ProgIf,
  1563. IN PCI_CLASSCODEDESC ClassDesc
  1564. )
  1565. {
  1566. ULONG i;
  1567. if ((BaseClass == 1) && (SubClass == 1)){
  1568. //
  1569. // IDE progIf is special. Ignore it here.
  1570. //
  1571. ProgIf = 0;;
  1572. }
  1573. i = 0;
  1574. while (PciClassCodeTable[i].BaseDesc){
  1575. if ((PciClassCodeTable[i].BaseClass == BaseClass) &&
  1576. (PciClassCodeTable[i].SubClass == SubClass) &&
  1577. (PciClassCodeTable[i].ProgIf == ProgIf)) {
  1578. switch (ClassDesc) {
  1579. case BaseClassDescription:
  1580. return PciClassCodeTable[i].BaseDesc;
  1581. break;
  1582. case SubClassDescription:
  1583. return PciClassCodeTable[i].SubDesc;
  1584. break;
  1585. case ProgIfDescription:
  1586. return PciClassCodeTable[i].ProgDesc;
  1587. break;
  1588. default:
  1589. break;
  1590. }
  1591. }
  1592. i++;
  1593. }
  1594. return NULL;
  1595. } //GetClassDesc
  1596. /*** GetVendorDesc - Get Vendor ID Description string.
  1597. *
  1598. * ENTRY
  1599. * VendorID -> Device's Vendor ID
  1600. * FullVenDesc - Flag to determine which string to return
  1601. *
  1602. * EXIT
  1603. * None
  1604. */
  1605. PCHAR
  1606. GetVendorDesc(
  1607. IN USHORT VendorID,
  1608. IN BOOL FullVenDesc
  1609. )
  1610. {
  1611. ULONG i;
  1612. i = 0;
  1613. while (PciVenTable[i].VenId != 0xFFFF) {
  1614. if (PciVenTable[i].VenId == VendorID) {
  1615. if (FullVenDesc) {
  1616. return PciVenTable[i].VenFull;
  1617. }
  1618. if (PciVenTable[i].VenShort) {
  1619. return PciVenTable[i].VenShort;
  1620. }else{
  1621. break;
  1622. }
  1623. }
  1624. i++;
  1625. }
  1626. return NULL;
  1627. }
  1628. /***LP PrintClassInfo - Print device class info.
  1629. *
  1630. * ENTRY
  1631. * Config -> ConfigSpace
  1632. * Reg - ConfigSpace register
  1633. *
  1634. * EXIT
  1635. * None
  1636. */
  1637. VOID
  1638. PrintClassInfo(
  1639. IN PUCHAR Config,
  1640. IN ULONG Reg
  1641. )
  1642. {
  1643. PPCI_COMMON_CONFIG pcc = (PPCI_COMMON_CONFIG) Config;
  1644. PCI_CLASSCODEDESC classDesc;
  1645. UCHAR baseClass, subClass, progIF;
  1646. PCHAR pch;
  1647. baseClass = pcc->BaseClass;
  1648. subClass = pcc->SubClass;
  1649. progIF = pcc->ProgIf;
  1650. if (Reg == CONFIG_OFFSET(BaseClass)){
  1651. classDesc = BaseClassDescription;
  1652. }else if (Reg == CONFIG_OFFSET(SubClass)){
  1653. classDesc = SubClassDescription;
  1654. }else{
  1655. classDesc = ProgIfDescription;
  1656. //
  1657. // ProgIf for IDE gets extra attention
  1658. //
  1659. if ((pcc->BaseClass == 0x01) &&
  1660. (pcc->SubClass == 0x01) &&
  1661. (pcc->ProgIf != 0)){
  1662. dprintf(" ");
  1663. if (pcc->ProgIf & 0x80)
  1664. dprintf("MasterIDE ");
  1665. if (pcc->ProgIf & 0x02)
  1666. dprintf("PriNativeCapable ");
  1667. if (pcc->ProgIf & 0x01)
  1668. dprintf("PriNativeMode ");
  1669. if (pcc->ProgIf & 0x08)
  1670. dprintf("SecNativeCapable ");
  1671. if (pcc->ProgIf & 0x04)
  1672. dprintf("SecNativeMode");
  1673. dprintf("\n");
  1674. return;
  1675. }
  1676. }
  1677. if ((pch = GetClassDesc(baseClass, subClass, progIF, classDesc)) != NULL){
  1678. dprintf(" %s", pch);
  1679. }
  1680. dprintf("\n");
  1681. } //PrintClassInfo
  1682. VOID
  1683. DumpCfgSpace (
  1684. IN PPCI_TYPE1_CFG_BITS PciCfg1
  1685. )
  1686. {
  1687. PCI_COMMON_CONFIG commonConfig;
  1688. PPCI_COMMON_CONFIG pcs;
  1689. BYTE bHeaderType;
  1690. DWORD dwOffset, devicePrivateStart;
  1691. dwOffset = 0;
  1692. ReadPci(PciCfg1, (PUCHAR)&commonConfig, 0, sizeof(commonConfig));
  1693. pcs = &commonConfig;
  1694. bHeaderType = pcs->HeaderType & ~PCI_MULTIFUNCTION;
  1695. if (PrintCommonConfigSpace(pcs, " ")) {
  1696. switch (bHeaderType)
  1697. {
  1698. case PCI_DEVICE_TYPE:
  1699. PrintCfgSpaceType0(pcs, " ");
  1700. break;
  1701. case PCI_BRIDGE_TYPE:
  1702. PrintCfgSpaceType1(pcs, " ");
  1703. break;
  1704. case PCI_CARDBUS_BRIDGE_TYPE:
  1705. PrintCfgSpaceType2(pcs, " ");
  1706. break;
  1707. default:
  1708. dprintf(" TypeUnknown:\n");
  1709. PrintDataRange((PCHAR) &pcs->u, 12, CONFIG_OFFSET(u), " ");
  1710. }
  1711. if (bHeaderType == PCI_DEVICE_TYPE) {
  1712. dwOffset = pcs->u.type0.CapabilitiesPtr;
  1713. }
  1714. else if (bHeaderType == PCI_BRIDGE_TYPE) {
  1715. dwOffset = pcs->u.type1.CapabilitiesPtr;
  1716. }
  1717. else if (bHeaderType == PCI_CARDBUS_BRIDGE_TYPE) {
  1718. dwOffset = pcs->u.type2.CapabilitiesPtr;
  1719. }
  1720. else {
  1721. dwOffset = 0;
  1722. }
  1723. // dprintf("Status : %lx Offset %lx\n", pcs->Status, dwOffset);
  1724. if ((pcs->Status & PCI_STATUS_CAPABILITIES_LIST) &&
  1725. (dwOffset >= PCI_COMMON_HDR_LENGTH)) {
  1726. dprintf(" Capabilities:\n");
  1727. while ((dwOffset != 0)) {
  1728. PPCI_CAPABILITIES_HEADER pCap;
  1729. pCap = (PPCI_CAPABILITIES_HEADER)&((PBYTE)pcs)[dwOffset];
  1730. if (PrintPciCapHeader(pCap, dwOffset, " ")) {
  1731. switch (pCap->CapabilityID) {
  1732. case PCI_CAPABILITY_ID_POWER_MANAGEMENT:
  1733. PrintPciPowerManagement(((PCHAR)pCap), dwOffset, " ");
  1734. break;
  1735. case PCI_CAPABILITY_ID_AGP_TARGET:
  1736. case PCI_CAPABILITY_ID_AGP:
  1737. PrintPciAGP(((PCHAR)pCap), dwOffset, " ");
  1738. break;
  1739. case PCI_CAPABILITY_ID_MSI:
  1740. PrintPciMSICaps(((PCHAR)pCap), dwOffset, " ");
  1741. break;
  1742. case PCI_CAPABILITY_ID_HYPERTRANSPORT:
  1743. PrintPciHtCaps(PciCfg1, ((PCHAR)pCap), dwOffset, " ");
  1744. break;
  1745. }
  1746. dwOffset = pCap->Next;
  1747. } else {
  1748. break;
  1749. }
  1750. }
  1751. }
  1752. }
  1753. dprintf(" Device Private:\n");
  1754. devicePrivateStart = CONFIG_OFFSET(DeviceSpecific);
  1755. devicePrivateStart += (bHeaderType == PCI_CARDBUS_BRIDGE_TYPE ? sizeof(PCI_TYPE2_HEADER_EXTRAS) : 0);
  1756. PrintDataRange((PCHAR) pcs+devicePrivateStart,
  1757. (sizeof(PCI_COMMON_CONFIG) - devicePrivateStart)/4, devicePrivateStart, " ");
  1758. }
  1759. /***LP DumpCBRegs - Dump CardBus registers
  1760. *
  1761. * ENTRY
  1762. * pbBuff -> register base
  1763. *
  1764. * EXIT
  1765. * None
  1766. */
  1767. VOID DumpCBRegs(PBYTE pbBuff)
  1768. {
  1769. PrintCBRegs((PCHAR) pbBuff, "");
  1770. } //DumpCBRegs
  1771. /***LP DumpExCARegs - Dump ExCA registers
  1772. *
  1773. * ENTRY
  1774. * pbBuff -> buffer
  1775. * dwSize - size of buffer
  1776. *
  1777. * EXIT
  1778. * None
  1779. */
  1780. VOID DumpExCARegs(PBYTE pbBuff, DWORD dwSize)
  1781. {
  1782. PrintExCARegs((PEXCAREGS) pbBuff);
  1783. PrintExCAHiRegs(pbBuff + sizeof(EXCAREGS), "");
  1784. } //DumpExCARegs
  1785. DECLARE_API( dcs )
  1786. /*++
  1787. Routine Description:
  1788. Dumps PCI ConfigSpace
  1789. Arguments:
  1790. args - Supplies the Bus.Dev.Fn numbers
  1791. Return Value:
  1792. None
  1793. --*/
  1794. {
  1795. LONG lcArgs;
  1796. DWORD dwBus = 0;
  1797. DWORD dwDev = 0;
  1798. DWORD dwFn = 0;
  1799. lcArgs = sscanf(args, "%lx.%lx.%lx", &dwBus, &dwDev, &dwFn);
  1800. dprintf("!dcs now integrated into !pci 1xx (flag 100).\n"
  1801. "Use !pci 100 %lx %lx %lx to dump PCI config space.\n",
  1802. dwBus, dwDev, dwFn);
  1803. return E_INVALIDARG;
  1804. if (lcArgs != 3)
  1805. {
  1806. dprintf("invalid command syntax\n"
  1807. "Usage: dcs <Bus>.<Dev>.<Func>\n");
  1808. }
  1809. else
  1810. {
  1811. PCI_TYPE1_CFG_BITS PciCfg1;
  1812. PciCfg1.u.AsULONG = 0;
  1813. PciCfg1.u.bits.BusNumber = dwBus;
  1814. PciCfg1.u.bits.DeviceNumber = dwDev;
  1815. PciCfg1.u.bits.FunctionNumber = dwFn;
  1816. PciCfg1.u.bits.Enable = TRUE;
  1817. DumpCfgSpace(&PciCfg1);
  1818. }
  1819. return S_OK;
  1820. }
  1821. DECLARE_API( ecs )
  1822. /*++
  1823. Routine Description:
  1824. Edit PCI ConfigSpace
  1825. Arguments:
  1826. args - Bus.Dev.Fn
  1827. Dword Offset
  1828. Data
  1829. Return Value:
  1830. None
  1831. --*/
  1832. {
  1833. dprintf("Edit PCI ConfigSpace - must use one of the following:\n"
  1834. "!ecd - edit dword\n"
  1835. "!ecw - edit word\n"
  1836. "!ecb - edit byte\n");
  1837. return S_OK;
  1838. }
  1839. DECLARE_API( ecb )
  1840. /*++
  1841. Routine Description:
  1842. Edit PCI ConfigSpace BYTE
  1843. Arguments:
  1844. args - Bus.Dev.Fn Offset Data
  1845. Return Value:
  1846. None
  1847. --*/
  1848. {
  1849. LONG lcArgs;
  1850. DWORD bus = 0, dev = 0, fn = 0;
  1851. DWORD offset = 0, data = 0;
  1852. PCI_TYPE1_CFG_BITS pcicfg;
  1853. lcArgs = sscanf(args, "%lx.%lx.%lx %lx %lx", &bus, &dev, &fn, &offset, &data);
  1854. if (lcArgs != 5)
  1855. {
  1856. dprintf("invalid command syntax\n"
  1857. "Usage: ecb <Bus>.<Dev>.<Func> Offset Data\n");
  1858. }else{
  1859. //
  1860. // Init for PCI config.
  1861. //
  1862. pcicfg.u.AsULONG = 0;
  1863. pcicfg.u.bits.BusNumber = bus;
  1864. pcicfg.u.bits.DeviceNumber = dev;
  1865. pcicfg.u.bits.FunctionNumber = fn;
  1866. pcicfg.u.bits.Enable = TRUE;
  1867. if (!(WritePci (&pcicfg, (PUCHAR)&data, offset, sizeof(UCHAR)))){
  1868. dprintf("write operation failed!\n");
  1869. return S_FALSE;
  1870. }
  1871. }
  1872. return S_OK;
  1873. }
  1874. DECLARE_API( ecw )
  1875. /*++
  1876. Routine Description:
  1877. Edit PCI ConfigSpace WORD
  1878. Arguments:
  1879. args - Bus.Dev.Fn Offset Data
  1880. Return Value:
  1881. None
  1882. --*/
  1883. {
  1884. LONG lcArgs;
  1885. DWORD bus = 0, dev = 0, fn = 0;
  1886. DWORD offset = 0, data = 0;
  1887. PCI_TYPE1_CFG_BITS pcicfg;
  1888. lcArgs = sscanf(args, "%lx.%lx.%lx %lx %lx", &bus, &dev, &fn, &offset, &data);
  1889. if (lcArgs != 5)
  1890. {
  1891. dprintf("invalid command syntax\n"
  1892. "Usage: ecw <Bus>.<Dev>.<Func> Offset Data\n");
  1893. }else{
  1894. if ((offset & 0x1) || (offset > 0xfe)) {
  1895. //
  1896. // not word aligned.
  1897. //
  1898. dprintf("offset must be word aligned and no greater than 0xfe\n");
  1899. return S_OK;
  1900. }
  1901. //
  1902. // Init for PCI config.
  1903. //
  1904. pcicfg.u.AsULONG = 0;
  1905. pcicfg.u.bits.BusNumber = bus;
  1906. pcicfg.u.bits.DeviceNumber = dev;
  1907. pcicfg.u.bits.FunctionNumber = fn;
  1908. pcicfg.u.bits.Enable = TRUE;
  1909. if (!(WritePci (&pcicfg, (PUCHAR)&data, offset, sizeof(USHORT)))){
  1910. dprintf("write operation failed!\n");
  1911. return S_FALSE;
  1912. }
  1913. }
  1914. return S_OK;
  1915. }
  1916. DECLARE_API( ecd )
  1917. /*++
  1918. Routine Description:
  1919. Edit PCI ConfigSpace DWORD
  1920. Arguments:
  1921. args - Bus.Dev.Fn Offset Data
  1922. Return Value:
  1923. None
  1924. --*/
  1925. {
  1926. LONG lcArgs;
  1927. DWORD bus = 0, dev = 0, fn = 0;
  1928. DWORD offset = 0, data = 0;
  1929. PCI_TYPE1_CFG_BITS pcicfg;
  1930. lcArgs = sscanf(args, "%lx.%lx.%lx %lx %lx", &bus, &dev, &fn, &offset, &data);
  1931. if (lcArgs != 5)
  1932. {
  1933. dprintf("invalid command syntax\n"
  1934. "Usage: ecd <Bus>.<Dev>.<Func> Offset Data\n");
  1935. }else{
  1936. if ((offset & 0x3) || (offset > 0xfc)) {
  1937. //
  1938. // not dword aligned.
  1939. //
  1940. dprintf("offset must be dword aligned and no greater than 0xfc\n");
  1941. return S_OK;
  1942. }
  1943. //
  1944. // Init for PCI config.
  1945. //
  1946. pcicfg.u.AsULONG = 0;
  1947. pcicfg.u.bits.BusNumber = bus;
  1948. pcicfg.u.bits.DeviceNumber = dev;
  1949. pcicfg.u.bits.FunctionNumber = fn;
  1950. pcicfg.u.bits.Enable = TRUE;
  1951. if (!(WritePci (&pcicfg, (PUCHAR)&data, offset, sizeof(ULONG)))){
  1952. dprintf("write operation failed!\n");
  1953. return S_FALSE;
  1954. }
  1955. }
  1956. return S_OK;
  1957. }
  1958. DECLARE_API( cbreg )
  1959. /*++
  1960. Routine Description:
  1961. Dumps CardBus registers
  1962. Arguments:
  1963. args - Supplies the address in hex.
  1964. Return Value:
  1965. None
  1966. --*/
  1967. {
  1968. BOOL rc = TRUE;
  1969. LONG lcArgs;
  1970. BOOL fPhysical = FALSE;
  1971. DWORD dwAddr = 0;
  1972. if (args == NULL)
  1973. {
  1974. dprintf("invalid command syntax\n"
  1975. "Usage: cbreg <RegBaseAddr>\n");
  1976. rc = FALSE;
  1977. }
  1978. else if ((args[0] == '%') && (args[1] == '%'))
  1979. {
  1980. lcArgs = sscanf(&args[2], "%lx", &dwAddr);
  1981. fPhysical = TRUE;
  1982. }
  1983. else
  1984. {
  1985. lcArgs = sscanf(args, "%lx", &dwAddr);
  1986. }
  1987. if ((rc == TRUE) && (lcArgs == 1))
  1988. {
  1989. BYTE abCBRegs[0x14];
  1990. BYTE abExCARegs[0x47];
  1991. DWORD dwSize;
  1992. if (fPhysical)
  1993. {
  1994. ULONG64 phyaddr = 0;
  1995. phyaddr = dwAddr;
  1996. ReadPhysicalWithFlags(phyaddr, abCBRegs, sizeof(abCBRegs), PHYS_FLAG_UNCACHED, &dwSize);
  1997. if (dwSize != sizeof(abCBRegs))
  1998. {
  1999. dprintf("failed to read physical CBRegs (SizeRead=%x)\n",
  2000. dwSize);
  2001. rc = FALSE;
  2002. }
  2003. else
  2004. {
  2005. phyaddr += 0x800;
  2006. ReadPhysicalWithFlags(phyaddr, abExCARegs, sizeof(abExCARegs), PHYS_FLAG_UNCACHED, &dwSize);
  2007. if (dwSize != sizeof(abExCARegs))
  2008. {
  2009. dprintf("failed to read physical ExCARegs (SizeRead=%x)\n",
  2010. dwSize);
  2011. rc = FALSE;
  2012. }
  2013. }
  2014. }
  2015. else if (!ReadMemory(dwAddr, abCBRegs, sizeof(abCBRegs), &dwSize) ||
  2016. (dwSize != sizeof(abCBRegs)))
  2017. {
  2018. dprintf("failed to read CBRegs (SizeRead=%x)\n", dwSize);
  2019. rc = FALSE;
  2020. }
  2021. else if (!ReadMemory(dwAddr + 0x800, abExCARegs, sizeof(abExCARegs),
  2022. &dwSize) ||
  2023. (dwSize != sizeof(abExCARegs)))
  2024. {
  2025. dprintf("failed to read CBRegs (SizeRead=%x)\n", dwSize);
  2026. rc = FALSE;
  2027. }
  2028. if (rc == TRUE)
  2029. {
  2030. dprintf("\nCardBus Registers:\n");
  2031. DumpCBRegs(abCBRegs);
  2032. dprintf("\nExCA Registers:\n");
  2033. DumpExCARegs(abExCARegs, sizeof(abExCARegs));
  2034. }
  2035. }
  2036. return S_OK;
  2037. }
  2038. DECLARE_API( exca )
  2039. /*++
  2040. Routine Description:
  2041. Dumps CardBus ExCA registers
  2042. Arguments:
  2043. args - Supplies <BasePort>.<SktNum>
  2044. Return Value:
  2045. None
  2046. --*/
  2047. {
  2048. LONG lcArgs;
  2049. DWORD dwBasePort = 0;
  2050. DWORD dwSktNum = 0;
  2051. if (TargetMachine != IMAGE_FILE_MACHINE_I386) {
  2052. dprintf("X86 target only API.\n");
  2053. return E_INVALIDARG;
  2054. }
  2055. lcArgs = sscanf(args, "%lx.%lx", &dwBasePort, &dwSktNum);
  2056. if (lcArgs != 2)
  2057. {
  2058. dprintf("invalid command syntax\n"
  2059. "Usage: exca <BasePort>.<SocketNum>\n");
  2060. }
  2061. else
  2062. {
  2063. int i;
  2064. BYTE abExCARegs[0x40];
  2065. for (i = 0; i < sizeof(abExCARegs); ++i)
  2066. {
  2067. abExCARegs[i] = ReadExCAByte(dwBasePort,
  2068. (ULONG)(dwSktNum*0x40 + i));
  2069. }
  2070. DumpExCARegs(abExCARegs, sizeof(abExCARegs));
  2071. }
  2072. return S_OK;
  2073. }