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.

161 lines
3.6 KiB

  1. /*
  2. *
  3. * Copyright (c) Microsoft Corporation. All rights reserved.
  4. *
  5. * MERCURY.C - Intel Mercury PCI chipset routines.
  6. *
  7. * Notes:
  8. * Algorithms from Intel 82420/82430 PCISet EISA Bridge doc,
  9. * 82374EB/SB EISA System Component (ESC) spec.
  10. *
  11. */
  12. #include "local.h"
  13. #ifdef ALLOC_PRAGMA
  14. #pragma alloc_text(INIT, MercuryValidateTable)
  15. #endif //ALLOC_PRAGMA
  16. /****************************************************************************
  17. *
  18. * MercurySetIRQ - Set a Mercury PCI link to a specific IRQ
  19. *
  20. * Exported.
  21. *
  22. * ENTRY: bIRQNumber is the new IRQ to be used.
  23. *
  24. * bLink is the Link to be set.
  25. *
  26. * EXIT: Standard PCIMP return value.
  27. *
  28. ***************************************************************************/
  29. PCIMPRET CDECL
  30. MercurySetIRQ(UCHAR bIRQNumber, UCHAR bLink)
  31. {
  32. //
  33. // Make link number 0 based, and validate.
  34. //
  35. bLink--;
  36. if (bLink > 3) {
  37. return(PCIMP_INVALID_LINK);
  38. }
  39. //
  40. // Use 0x80 to disable.
  41. //
  42. if (!bIRQNumber)
  43. bIRQNumber=0x80;
  44. //
  45. // Start talking to interrupt controller.
  46. //
  47. WRITE_PORT_UCHAR((PUCHAR)0x22, 0x02);
  48. WRITE_PORT_UCHAR((PUCHAR)0x23, 0x0f);
  49. //
  50. // Set our link to the new IRQ.
  51. //
  52. WRITE_PORT_UCHAR((PUCHAR)0x22, (UCHAR)(bLink+0x60));
  53. WRITE_PORT_UCHAR((PUCHAR)0x23, bIRQNumber);
  54. //
  55. // Done talking to interrupt controller.
  56. //
  57. WRITE_PORT_UCHAR((PUCHAR)0x22, 0x02);
  58. WRITE_PORT_UCHAR((PUCHAR)0x23, 0x00);
  59. return(PCIMP_SUCCESS);
  60. }
  61. /****************************************************************************
  62. *
  63. * MercuryGetIRQ - Get the IRQ of a Mercury PCI link
  64. *
  65. * Exported.
  66. *
  67. * ENTRY: pbIRQNumber is the buffer to fill.
  68. *
  69. * bLink is the Link to be read.
  70. *
  71. * EXIT: Standard PCIMP return value.
  72. *
  73. ***************************************************************************/
  74. PCIMPRET CDECL
  75. MercuryGetIRQ(PUCHAR pbIRQNumber, UCHAR bLink)
  76. {
  77. //
  78. // Make link number 0 based, and validate.
  79. //
  80. bLink--;
  81. if (bLink > 3) {
  82. return(PCIMP_INVALID_LINK);
  83. }
  84. //
  85. // Start talking to interrupt controller.
  86. //
  87. WRITE_PORT_UCHAR((PUCHAR)0x22, 0x02);
  88. WRITE_PORT_UCHAR((PUCHAR)0x23, 0x0f);
  89. //
  90. // Get our link's IRQ.
  91. //
  92. WRITE_PORT_UCHAR((PUCHAR)0x22, (UCHAR)(bLink+0x60));
  93. *pbIRQNumber=READ_PORT_UCHAR((PUCHAR)0x23);
  94. //
  95. // Done talking to interrupt controller.
  96. //
  97. WRITE_PORT_UCHAR((PUCHAR)0x22, 0x02);
  98. WRITE_PORT_UCHAR((PUCHAR)0x23, 0x00);
  99. //
  100. // Return 0 if disabled.
  101. //
  102. if (*pbIRQNumber & 0x80)
  103. *pbIRQNumber=0;
  104. return(PCIMP_SUCCESS);
  105. }
  106. /****************************************************************************
  107. *
  108. * MercuryValidateTable - Validate an IRQ table
  109. *
  110. * Exported.
  111. *
  112. * ENTRY: piihIRQInfoHeader points to an IRQInfoHeader followed
  113. * by an IRQ Routing Table.
  114. *
  115. * ulFlags are PCIMP_VALIDATE flags.
  116. *
  117. * EXIT: Standard PCIMP return value.
  118. *
  119. ***************************************************************************/
  120. PCIMPRET CDECL
  121. MercuryValidateTable(PIRQINFOHEADER piihIRQInfoHeader, ULONG ulFlags)
  122. {
  123. UCHAR bMin=GetMinLink(piihIRQInfoHeader);
  124. UCHAR bMax=GetMaxLink(piihIRQInfoHeader);
  125. PAGED_CODE();
  126. if (bMax<=0x04) {
  127. return(PCIMP_SUCCESS);
  128. }
  129. if ((bMin<0x60) || (bMax>0x63)) {
  130. return(PCIMP_FAILURE);
  131. }
  132. NormalizeLinks(piihIRQInfoHeader, (UCHAR)(0-0x5F));
  133. return(PCIMP_SUCCESS);
  134. }