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.

304 lines
7.9 KiB

  1. /*
  2. *
  3. * Copyright (c) Microsoft Corporation. All rights reserved.
  4. *
  5. * OptiFireStar.C - OPTI FIRESTAR PCI chipset routines.
  6. *
  7. * Notes:
  8. * Algorithms from OPTI FIRESTAR Data Sheet
  9. * Opti contact: William@unixgate.opti.com
  10. *
  11. */
  12. #include "local.h"
  13. #ifdef ALLOC_PRAGMA
  14. #pragma alloc_text(INIT, OptiFireStarValidateTable)
  15. #endif //ALLOC_PRAGMA
  16. /****************************************************************************
  17. *
  18. * OptiFireStarSetIRQ - Set a OPTI FIRESTAR 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. OptiFireStarSetIRQ(UCHAR bIRQNumber, UCHAR bLink)
  31. {
  32. UCHAR bData, bOffset;
  33. switch (bLink & 0x07)
  34. {
  35. case 0:
  36. if (bLink == 0)
  37. return (PCIMP_FAILURE);
  38. else
  39. return (PCIMP_INVALID_LINK);
  40. case 1:
  41. //
  42. // FireStar IRQ
  43. //
  44. bLink = (UCHAR)((bLink & 0x70) >> 4);
  45. bData = ReadConfigUchar(bBusPIC, bDevFuncPIC, (UCHAR)(0xB0 + bLink));
  46. bData = (bData & 0xf0) | bIRQNumber;
  47. if (bIRQNumber)
  48. bData |= 0x10;
  49. WriteConfigUchar(bBusPIC, bDevFuncPIC, (UCHAR)(0xB0 + bLink), bData);
  50. return (PCIMP_SUCCESS);
  51. case 2:
  52. //
  53. // FireStar PIO or Serial IRQ
  54. //
  55. case 3:
  56. //
  57. // FireBridge INTs
  58. //
  59. bOffset = (UCHAR)((bLink >> 5) & 1) + 0xB8;
  60. bData = ReadConfigUchar(bBusPIC, bDevFuncPIC, bOffset);
  61. if (bLink & (1<<4)) {
  62. bData &= 0x0f;
  63. bData |= (bIRQNumber<<4);
  64. }
  65. else {
  66. bData &= 0xf0;
  67. bData |= bIRQNumber;
  68. }
  69. WriteConfigUchar(bBusPIC, bDevFuncPIC, bOffset, bData);
  70. return (PCIMP_SUCCESS);
  71. default:
  72. return (PCIMP_INVALID_LINK);
  73. }
  74. return (PCIMP_FAILURE);
  75. }
  76. /****************************************************************************
  77. *
  78. * OptiFireStarGetIRQ - Get the IRQ of a OPTI FIRESTAR PCI link
  79. *
  80. * Exported.
  81. *
  82. * ENTRY: pbIRQNumber is the buffer to fill.
  83. *
  84. * bLink is the Link to be read.
  85. *
  86. * EXIT: Standard PCIMP return value.
  87. *
  88. ***************************************************************************/
  89. PCIMPRET CDECL
  90. OptiFireStarGetIRQ(PUCHAR pbIRQNumber, UCHAR bLink)
  91. {
  92. UCHAR bData, bOffset;
  93. switch (bLink & 0x07)
  94. {
  95. case 0:
  96. //
  97. // Valid link?
  98. //
  99. if (bLink == 0)
  100. return (PCIMP_FAILURE);
  101. else
  102. return (PCIMP_INVALID_LINK);
  103. case 1:
  104. //
  105. // FireStar IRQ
  106. //
  107. bLink = (UCHAR)((bLink & 0x70) >> 4);
  108. bData = ReadConfigUchar(bBusPIC, bDevFuncPIC, (UCHAR)(0xB0 + bLink));
  109. *pbIRQNumber = (bData & 0x0f);
  110. return (PCIMP_SUCCESS);
  111. case 2:
  112. //
  113. // FireStar PIO or Serial IRQ
  114. //
  115. case 3:
  116. //
  117. // FireBridge INTs
  118. //
  119. bOffset = (UCHAR)((bLink >> 5) & 1) + 0xB8;
  120. bData = ReadConfigUchar(bBusPIC, bDevFuncPIC, bOffset);
  121. if (bLink & (1<<4))
  122. bData >>= 4;
  123. *pbIRQNumber = bData & 0x0f;
  124. return (PCIMP_SUCCESS);
  125. default:
  126. return (PCIMP_INVALID_LINK);
  127. }
  128. return (PCIMP_FAILURE);
  129. }
  130. /****************************************************************************
  131. *
  132. * OptiViperSetTrigger - Set the IRQ triggering values for the OptiViper
  133. *
  134. * Exported.
  135. *
  136. * ENTRY: ulTrigger has bits set for Level triggered IRQs.
  137. *
  138. * EXIT: Standard PCIMP return value.
  139. *
  140. ***************************************************************************/
  141. PCIMPRET CDECL
  142. OptiFireStarSetTrigger(ULONG ulTrigger)
  143. {
  144. ULONG i;
  145. UCHAR bData;
  146. for (i = 0; i < 8; i++)
  147. {
  148. UCHAR bTemp;
  149. bData = ReadConfigUchar(bBusPIC, bDevFuncPIC, (UCHAR)(0xB0+i));
  150. bTemp = bData & 0x0F;
  151. if (bTemp && (ulTrigger & (1 << bTemp)))
  152. {
  153. bData |= 0x10;
  154. }
  155. else
  156. {
  157. bData &= ~0x10;
  158. }
  159. WriteConfigUchar(bBusPIC, bDevFuncPIC, (UCHAR)(0xB0+i), bData);
  160. }
  161. return (PCIMP_SUCCESS);
  162. }
  163. /****************************************************************************
  164. *
  165. * OptiViperGetTrigger - Get the IRQ triggering values for the OptiViper
  166. *
  167. * Exported.
  168. *
  169. * ENTRY: pulTrigger will have bits set for Level triggered IRQs.
  170. *
  171. * EXIT: Standard PCIMP return value.
  172. *
  173. ***************************************************************************/
  174. PCIMPRET CDECL
  175. OptiFireStarGetTrigger(PULONG pulTrigger)
  176. {
  177. ULONG i;
  178. UCHAR bData;
  179. //
  180. // Assume all are edge.
  181. //
  182. *pulTrigger = 0;
  183. //
  184. // Check PCIDV1 registers B0-B7.
  185. //
  186. for (i = 0; i < 8; i++)
  187. {
  188. bData = (UCHAR)(ReadConfigUchar(bBusPIC, bDevFuncPIC, (UCHAR)(0xB0 + i)) & 0x1F);
  189. if (bData & 0x10)
  190. *pulTrigger |= (1 << (bData & 0x0f));
  191. }
  192. //
  193. // Check PCIDV1 registers B8-B9.
  194. //
  195. for (i = 0; i < 2; i++)
  196. {
  197. bData = ReadConfigUchar(bBusPIC, bDevFuncPIC, (UCHAR)(0xB8 + i));
  198. *pulTrigger |= (1 << (bData & 0x0F));
  199. bData >>= 4;
  200. *pulTrigger |= (1 << (bData & 0x0F));
  201. }
  202. return (PCIMP_SUCCESS);
  203. }
  204. /****************************************************************************
  205. *
  206. * OptiFireStarValidateTable - Validate an IRQ table
  207. *
  208. * Exported.
  209. *
  210. * ENTRY: piihIRQInfoHeader points to an IRQInfoHeader followed
  211. * by an IRQ Routing Table.
  212. *
  213. * ulFlags are PCIMP_VALIDATE flags.
  214. *
  215. * EXIT: Standard PCIMP return value.
  216. *
  217. ***************************************************************************/
  218. PCIMPRET CDECL
  219. OptiFireStarValidateTable(PIRQINFOHEADER piihIRQInfoHeader, ULONG ulFlags)
  220. {
  221. PIRQINFO pii=(PIRQINFO)(((PUCHAR) piihIRQInfoHeader)+sizeof(IRQINFOHEADER));
  222. ULONG i, j;
  223. ULONG cEntries=(piihIRQInfoHeader->TableSize-sizeof(IRQINFOHEADER))/sizeof(IRQINFO);
  224. PAGED_CODE();
  225. for (i=0; i<cEntries; i++) {
  226. for (j=0; j<4; j++) {
  227. switch (pii->PinInfo[j].Link & 0x07)
  228. {
  229. case 0:
  230. //
  231. // Valid link?
  232. //
  233. if (pii->PinInfo[j].Link & 0x70)
  234. return (PCIMP_FAILURE);
  235. break;
  236. case 1:
  237. //
  238. // FireStar IRQ
  239. //
  240. break;
  241. case 2:
  242. //
  243. // FireStar PIO or Serial IRQ
  244. //
  245. case 3:
  246. //
  247. // FireBridge INTs
  248. //
  249. if ((pii->PinInfo[j].Link & 0x70) > 0x30)
  250. return (PCIMP_FAILURE);
  251. break;
  252. default:
  253. return (PCIMP_FAILURE);
  254. }
  255. }
  256. pii++;
  257. }
  258. return(i? PCIMP_SUCCESS : PCIMP_FAILURE);
  259. }