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.

231 lines
5.1 KiB

  1. /*
  2. *
  3. * Copyright (c) Microsoft Corporation. All rights reserved.
  4. *
  5. * TOSHIBA.C - Toshiba Tecra IRQ routing spec
  6. *
  7. * Notes:
  8. * Algorithms from TECS-1010-1001
  9. *
  10. */
  11. #include "local.h"
  12. BOOLEAN CDECL
  13. CallSMI(
  14. IN ULONG rAX,
  15. IN ULONG rBX,
  16. IN ULONG rCX,
  17. IN PULONG prCX
  18. );
  19. #ifdef ALLOC_DATA_PRAGMA
  20. #pragma data_seg()
  21. #pragma const_seg()
  22. #endif
  23. GLOBAL_DATA ULONG SMIPort=0xB2;
  24. #ifdef ALLOC_PRAGMA
  25. #pragma alloc_text(INIT, ToshibaValidateTable)
  26. #endif //ALLOC_PRAGMA
  27. /****************************************************************************
  28. *
  29. * CallSMI - Get into SMI
  30. *
  31. * Not exported.
  32. *
  33. * ENTRY: rAX is the value for AX as input.
  34. *
  35. * rBX is the value for BX as input.
  36. *
  37. * rCX is the value for CX as input.
  38. *
  39. * prCX is filled with the returned CX, if not NULL.
  40. *
  41. * EXIT: TRUE iff no error.
  42. *
  43. ***************************************************************************/
  44. BOOLEAN CDECL
  45. CallSMI(ULONG rAX, ULONG rBX, ULONG rCX, PULONG prCX)
  46. {
  47. ULONG ulAX, ulCX;
  48. _asm mov eax, rAX
  49. _asm mov ebx, rBX
  50. _asm mov ecx, rCX
  51. _asm mov edx, SMIPort
  52. _asm in al, dx
  53. _asm movzx ecx, cx
  54. _asm mov ulCX, ecx
  55. _asm movzx eax, ah
  56. _asm mov ulAX, eax
  57. if (prCX)
  58. *prCX=ulCX;
  59. return(ulAX==0);
  60. }
  61. /****************************************************************************
  62. *
  63. * ToshibaSetIRQ - Set a Toshiba PCI link to a specific IRQ
  64. *
  65. * Exported.
  66. *
  67. * ENTRY: bIRQNumber is the new IRQ to be used.
  68. *
  69. * bLink is the Link to be set.
  70. *
  71. * EXIT: Standard PCIMP return value.
  72. *
  73. ***************************************************************************/
  74. PCIMPRET CDECL
  75. ToshibaSetIRQ(UCHAR bIRQNumber, UCHAR bLink)
  76. {
  77. //
  78. // Use 0xFF to disable.
  79. //
  80. if (!bIRQNumber)
  81. bIRQNumber=0xFF;
  82. //
  83. // Ask SMI to set the link.
  84. //
  85. return(CallSMI( 0xFF44,
  86. 0x0701,
  87. (bLink<<8)+bIRQNumber,
  88. NULL) ?
  89. PCIMP_SUCCESS :
  90. PCIMP_FAILURE);
  91. }
  92. /****************************************************************************
  93. *
  94. * ToshibaGetIRQ - Get the IRQ of a Toshiba PCI link
  95. *
  96. * Exported.
  97. *
  98. * ENTRY: pbIRQNumber is the buffer to fill.
  99. *
  100. * bLink is the Link to be read.
  101. *
  102. * EXIT: Standard PCIMP return value.
  103. *
  104. ***************************************************************************/
  105. PCIMPRET CDECL
  106. ToshibaGetIRQ(PUCHAR pbIRQNumber, UCHAR bLink)
  107. {
  108. ULONG ulCX;
  109. //
  110. // Ask SMI to get the link.
  111. //
  112. if (!CallSMI( 0xFE44,
  113. 0x0701,
  114. bLink<<8,
  115. &ulCX))
  116. return(PCIMP_FAILURE);
  117. //
  118. // Get the byte only.
  119. //
  120. ulCX&=0xFF;
  121. //
  122. // Use 0xFF to disable.
  123. //
  124. if (ulCX==0xFF)
  125. ulCX=0;
  126. //
  127. // Store the IRQ value.
  128. //
  129. *pbIRQNumber=(UCHAR)ulCX;
  130. return(PCIMP_SUCCESS);
  131. }
  132. /****************************************************************************
  133. *
  134. * ToshibaSetTrigger - Set the IRQ triggering values for the Toshiba
  135. *
  136. * Exported.
  137. *
  138. * ENTRY: ulTrigger has bits set for Level triggered IRQs.
  139. *
  140. * EXIT: Standard PCIMP return value.
  141. *
  142. ***************************************************************************/
  143. PCIMPRET CDECL
  144. ToshibaSetTrigger(ULONG ulTrigger)
  145. {
  146. //
  147. // Ask SMI to set the triggering mechanism.
  148. //
  149. return(CallSMI( 0xFF44,
  150. 0x0702,
  151. ulTrigger,
  152. NULL) ?
  153. PCIMP_SUCCESS :
  154. PCIMP_FAILURE);
  155. }
  156. /****************************************************************************
  157. *
  158. * ToshibaGetTrigger - Get the IRQ triggering values for the Toshiba
  159. *
  160. * Exported.
  161. *
  162. * ENTRY: pulTrigger will have bits set for Level triggered IRQs.
  163. *
  164. * EXIT: Standard PCIMP return value.
  165. *
  166. ***************************************************************************/
  167. PCIMPRET CDECL
  168. ToshibaGetTrigger(PULONG pulTrigger)
  169. {
  170. //
  171. // Assume all edge.
  172. //
  173. *pulTrigger = 0;
  174. //
  175. // Ask SMI to get the triggering mechanism.
  176. //
  177. return(CallSMI( 0xFE44,
  178. 0x0702,
  179. 0,
  180. pulTrigger) ?
  181. PCIMP_SUCCESS :
  182. PCIMP_FAILURE);
  183. }
  184. /****************************************************************************
  185. *
  186. * ToshibaValidateTable - Validate an IRQ table
  187. *
  188. * Exported.
  189. *
  190. * ENTRY: piihIRQInfoHeader points to an IRQInfoHeader followed
  191. * by an IRQ Routing Table.
  192. *
  193. * ulFlags are PCIMP_VALIDATE flags.
  194. *
  195. * EXIT: Standard PCIMP return value.
  196. *
  197. ***************************************************************************/
  198. PCIMPRET CDECL
  199. ToshibaValidateTable(PIRQINFOHEADER piihIRQInfoHeader, ULONG ulFlags)
  200. {
  201. PAGED_CODE();
  202. SMIPort=*(((PUSHORT)&(piihIRQInfoHeader->MiniportData))+1);
  203. return(((ulFlags & PCIMP_VALIDATE_SOURCE_BITS)==PCIMP_VALIDATE_SOURCE_PCIBIOS) ?
  204. PCIMP_FAILURE : PCIMP_SUCCESS);
  205. }