longhaul.h 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * longhaul.h
  4. * (C) 2003 Dave Jones.
  5. *
  6. * VIA-specific information
  7. */
  8. union msr_bcr2 {
  9. struct {
  10. unsigned Reseved:19, // 18:0
  11. ESOFTBF:1, // 19
  12. Reserved2:3, // 22:20
  13. CLOCKMUL:4, // 26:23
  14. Reserved3:5; // 31:27
  15. } bits;
  16. unsigned long val;
  17. };
  18. union msr_longhaul {
  19. struct {
  20. unsigned RevisionID:4, // 3:0
  21. RevisionKey:4, // 7:4
  22. EnableSoftBusRatio:1, // 8
  23. EnableSoftVID:1, // 9
  24. EnableSoftBSEL:1, // 10
  25. Reserved:3, // 11:13
  26. SoftBusRatio4:1, // 14
  27. VRMRev:1, // 15
  28. SoftBusRatio:4, // 19:16
  29. SoftVID:5, // 24:20
  30. Reserved2:3, // 27:25
  31. SoftBSEL:2, // 29:28
  32. Reserved3:2, // 31:30
  33. MaxMHzBR:4, // 35:32
  34. MaximumVID:5, // 40:36
  35. MaxMHzFSB:2, // 42:41
  36. MaxMHzBR4:1, // 43
  37. Reserved4:4, // 47:44
  38. MinMHzBR:4, // 51:48
  39. MinimumVID:5, // 56:52
  40. MinMHzFSB:2, // 58:57
  41. MinMHzBR4:1, // 59
  42. Reserved5:4; // 63:60
  43. } bits;
  44. unsigned long long val;
  45. };
  46. /*
  47. * Clock ratio tables. Div/Mod by 10 to get ratio.
  48. * The eblcr values specify the ratio read from the CPU.
  49. * The mults values specify what to write to the CPU.
  50. */
  51. /*
  52. * VIA C3 Samuel 1 & Samuel 2 (stepping 0)
  53. */
  54. static const int samuel1_mults[16] = {
  55. -1, /* 0000 -> RESERVED */
  56. 30, /* 0001 -> 3.0x */
  57. 40, /* 0010 -> 4.0x */
  58. -1, /* 0011 -> RESERVED */
  59. -1, /* 0100 -> RESERVED */
  60. 35, /* 0101 -> 3.5x */
  61. 45, /* 0110 -> 4.5x */
  62. 55, /* 0111 -> 5.5x */
  63. 60, /* 1000 -> 6.0x */
  64. 70, /* 1001 -> 7.0x */
  65. 80, /* 1010 -> 8.0x */
  66. 50, /* 1011 -> 5.0x */
  67. 65, /* 1100 -> 6.5x */
  68. 75, /* 1101 -> 7.5x */
  69. -1, /* 1110 -> RESERVED */
  70. -1, /* 1111 -> RESERVED */
  71. };
  72. static const int samuel1_eblcr[16] = {
  73. 50, /* 0000 -> RESERVED */
  74. 30, /* 0001 -> 3.0x */
  75. 40, /* 0010 -> 4.0x */
  76. -1, /* 0011 -> RESERVED */
  77. 55, /* 0100 -> 5.5x */
  78. 35, /* 0101 -> 3.5x */
  79. 45, /* 0110 -> 4.5x */
  80. -1, /* 0111 -> RESERVED */
  81. -1, /* 1000 -> RESERVED */
  82. 70, /* 1001 -> 7.0x */
  83. 80, /* 1010 -> 8.0x */
  84. 60, /* 1011 -> 6.0x */
  85. -1, /* 1100 -> RESERVED */
  86. 75, /* 1101 -> 7.5x */
  87. -1, /* 1110 -> RESERVED */
  88. 65, /* 1111 -> 6.5x */
  89. };
  90. /*
  91. * VIA C3 Samuel2 Stepping 1->15
  92. */
  93. static const int samuel2_eblcr[16] = {
  94. 50, /* 0000 -> 5.0x */
  95. 30, /* 0001 -> 3.0x */
  96. 40, /* 0010 -> 4.0x */
  97. 100, /* 0011 -> 10.0x */
  98. 55, /* 0100 -> 5.5x */
  99. 35, /* 0101 -> 3.5x */
  100. 45, /* 0110 -> 4.5x */
  101. 110, /* 0111 -> 11.0x */
  102. 90, /* 1000 -> 9.0x */
  103. 70, /* 1001 -> 7.0x */
  104. 80, /* 1010 -> 8.0x */
  105. 60, /* 1011 -> 6.0x */
  106. 120, /* 1100 -> 12.0x */
  107. 75, /* 1101 -> 7.5x */
  108. 130, /* 1110 -> 13.0x */
  109. 65, /* 1111 -> 6.5x */
  110. };
  111. /*
  112. * VIA C3 Ezra
  113. */
  114. static const int ezra_mults[16] = {
  115. 100, /* 0000 -> 10.0x */
  116. 30, /* 0001 -> 3.0x */
  117. 40, /* 0010 -> 4.0x */
  118. 90, /* 0011 -> 9.0x */
  119. 95, /* 0100 -> 9.5x */
  120. 35, /* 0101 -> 3.5x */
  121. 45, /* 0110 -> 4.5x */
  122. 55, /* 0111 -> 5.5x */
  123. 60, /* 1000 -> 6.0x */
  124. 70, /* 1001 -> 7.0x */
  125. 80, /* 1010 -> 8.0x */
  126. 50, /* 1011 -> 5.0x */
  127. 65, /* 1100 -> 6.5x */
  128. 75, /* 1101 -> 7.5x */
  129. 85, /* 1110 -> 8.5x */
  130. 120, /* 1111 -> 12.0x */
  131. };
  132. static const int ezra_eblcr[16] = {
  133. 50, /* 0000 -> 5.0x */
  134. 30, /* 0001 -> 3.0x */
  135. 40, /* 0010 -> 4.0x */
  136. 100, /* 0011 -> 10.0x */
  137. 55, /* 0100 -> 5.5x */
  138. 35, /* 0101 -> 3.5x */
  139. 45, /* 0110 -> 4.5x */
  140. 95, /* 0111 -> 9.5x */
  141. 90, /* 1000 -> 9.0x */
  142. 70, /* 1001 -> 7.0x */
  143. 80, /* 1010 -> 8.0x */
  144. 60, /* 1011 -> 6.0x */
  145. 120, /* 1100 -> 12.0x */
  146. 75, /* 1101 -> 7.5x */
  147. 85, /* 1110 -> 8.5x */
  148. 65, /* 1111 -> 6.5x */
  149. };
  150. /*
  151. * VIA C3 (Ezra-T) [C5M].
  152. */
  153. static const int ezrat_mults[32] = {
  154. 100, /* 0000 -> 10.0x */
  155. 30, /* 0001 -> 3.0x */
  156. 40, /* 0010 -> 4.0x */
  157. 90, /* 0011 -> 9.0x */
  158. 95, /* 0100 -> 9.5x */
  159. 35, /* 0101 -> 3.5x */
  160. 45, /* 0110 -> 4.5x */
  161. 55, /* 0111 -> 5.5x */
  162. 60, /* 1000 -> 6.0x */
  163. 70, /* 1001 -> 7.0x */
  164. 80, /* 1010 -> 8.0x */
  165. 50, /* 1011 -> 5.0x */
  166. 65, /* 1100 -> 6.5x */
  167. 75, /* 1101 -> 7.5x */
  168. 85, /* 1110 -> 8.5x */
  169. 120, /* 1111 -> 12.0x */
  170. -1, /* 0000 -> RESERVED (10.0x) */
  171. 110, /* 0001 -> 11.0x */
  172. -1, /* 0010 -> 12.0x */
  173. -1, /* 0011 -> RESERVED (9.0x)*/
  174. 105, /* 0100 -> 10.5x */
  175. 115, /* 0101 -> 11.5x */
  176. 125, /* 0110 -> 12.5x */
  177. 135, /* 0111 -> 13.5x */
  178. 140, /* 1000 -> 14.0x */
  179. 150, /* 1001 -> 15.0x */
  180. 160, /* 1010 -> 16.0x */
  181. 130, /* 1011 -> 13.0x */
  182. 145, /* 1100 -> 14.5x */
  183. 155, /* 1101 -> 15.5x */
  184. -1, /* 1110 -> RESERVED (13.0x) */
  185. -1, /* 1111 -> RESERVED (12.0x) */
  186. };
  187. static const int ezrat_eblcr[32] = {
  188. 50, /* 0000 -> 5.0x */
  189. 30, /* 0001 -> 3.0x */
  190. 40, /* 0010 -> 4.0x */
  191. 100, /* 0011 -> 10.0x */
  192. 55, /* 0100 -> 5.5x */
  193. 35, /* 0101 -> 3.5x */
  194. 45, /* 0110 -> 4.5x */
  195. 95, /* 0111 -> 9.5x */
  196. 90, /* 1000 -> 9.0x */
  197. 70, /* 1001 -> 7.0x */
  198. 80, /* 1010 -> 8.0x */
  199. 60, /* 1011 -> 6.0x */
  200. 120, /* 1100 -> 12.0x */
  201. 75, /* 1101 -> 7.5x */
  202. 85, /* 1110 -> 8.5x */
  203. 65, /* 1111 -> 6.5x */
  204. -1, /* 0000 -> RESERVED (9.0x) */
  205. 110, /* 0001 -> 11.0x */
  206. 120, /* 0010 -> 12.0x */
  207. -1, /* 0011 -> RESERVED (10.0x)*/
  208. 135, /* 0100 -> 13.5x */
  209. 115, /* 0101 -> 11.5x */
  210. 125, /* 0110 -> 12.5x */
  211. 105, /* 0111 -> 10.5x */
  212. 130, /* 1000 -> 13.0x */
  213. 150, /* 1001 -> 15.0x */
  214. 160, /* 1010 -> 16.0x */
  215. 140, /* 1011 -> 14.0x */
  216. -1, /* 1100 -> RESERVED (12.0x) */
  217. 155, /* 1101 -> 15.5x */
  218. -1, /* 1110 -> RESERVED (13.0x) */
  219. 145, /* 1111 -> 14.5x */
  220. };
  221. /*
  222. * VIA C3 Nehemiah */
  223. static const int nehemiah_mults[32] = {
  224. 100, /* 0000 -> 10.0x */
  225. -1, /* 0001 -> 16.0x */
  226. 40, /* 0010 -> 4.0x */
  227. 90, /* 0011 -> 9.0x */
  228. 95, /* 0100 -> 9.5x */
  229. -1, /* 0101 -> RESERVED */
  230. 45, /* 0110 -> 4.5x */
  231. 55, /* 0111 -> 5.5x */
  232. 60, /* 1000 -> 6.0x */
  233. 70, /* 1001 -> 7.0x */
  234. 80, /* 1010 -> 8.0x */
  235. 50, /* 1011 -> 5.0x */
  236. 65, /* 1100 -> 6.5x */
  237. 75, /* 1101 -> 7.5x */
  238. 85, /* 1110 -> 8.5x */
  239. 120, /* 1111 -> 12.0x */
  240. -1, /* 0000 -> 10.0x */
  241. 110, /* 0001 -> 11.0x */
  242. -1, /* 0010 -> 12.0x */
  243. -1, /* 0011 -> 9.0x */
  244. 105, /* 0100 -> 10.5x */
  245. 115, /* 0101 -> 11.5x */
  246. 125, /* 0110 -> 12.5x */
  247. 135, /* 0111 -> 13.5x */
  248. 140, /* 1000 -> 14.0x */
  249. 150, /* 1001 -> 15.0x */
  250. 160, /* 1010 -> 16.0x */
  251. 130, /* 1011 -> 13.0x */
  252. 145, /* 1100 -> 14.5x */
  253. 155, /* 1101 -> 15.5x */
  254. -1, /* 1110 -> RESERVED (13.0x) */
  255. -1, /* 1111 -> 12.0x */
  256. };
  257. static const int nehemiah_eblcr[32] = {
  258. 50, /* 0000 -> 5.0x */
  259. 160, /* 0001 -> 16.0x */
  260. 40, /* 0010 -> 4.0x */
  261. 100, /* 0011 -> 10.0x */
  262. 55, /* 0100 -> 5.5x */
  263. -1, /* 0101 -> RESERVED */
  264. 45, /* 0110 -> 4.5x */
  265. 95, /* 0111 -> 9.5x */
  266. 90, /* 1000 -> 9.0x */
  267. 70, /* 1001 -> 7.0x */
  268. 80, /* 1010 -> 8.0x */
  269. 60, /* 1011 -> 6.0x */
  270. 120, /* 1100 -> 12.0x */
  271. 75, /* 1101 -> 7.5x */
  272. 85, /* 1110 -> 8.5x */
  273. 65, /* 1111 -> 6.5x */
  274. 90, /* 0000 -> 9.0x */
  275. 110, /* 0001 -> 11.0x */
  276. 120, /* 0010 -> 12.0x */
  277. 100, /* 0011 -> 10.0x */
  278. 135, /* 0100 -> 13.5x */
  279. 115, /* 0101 -> 11.5x */
  280. 125, /* 0110 -> 12.5x */
  281. 105, /* 0111 -> 10.5x */
  282. 130, /* 1000 -> 13.0x */
  283. 150, /* 1001 -> 15.0x */
  284. 160, /* 1010 -> 16.0x */
  285. 140, /* 1011 -> 14.0x */
  286. 120, /* 1100 -> 12.0x */
  287. 155, /* 1101 -> 15.5x */
  288. -1, /* 1110 -> RESERVED (13.0x) */
  289. 145 /* 1111 -> 14.5x */
  290. };
  291. /*
  292. * Voltage scales. Div/Mod by 1000 to get actual voltage.
  293. * Which scale to use depends on the VRM type in use.
  294. */
  295. struct mV_pos {
  296. unsigned short mV;
  297. unsigned short pos;
  298. };
  299. static const struct mV_pos vrm85_mV[32] = {
  300. {1250, 8}, {1200, 6}, {1150, 4}, {1100, 2},
  301. {1050, 0}, {1800, 30}, {1750, 28}, {1700, 26},
  302. {1650, 24}, {1600, 22}, {1550, 20}, {1500, 18},
  303. {1450, 16}, {1400, 14}, {1350, 12}, {1300, 10},
  304. {1275, 9}, {1225, 7}, {1175, 5}, {1125, 3},
  305. {1075, 1}, {1825, 31}, {1775, 29}, {1725, 27},
  306. {1675, 25}, {1625, 23}, {1575, 21}, {1525, 19},
  307. {1475, 17}, {1425, 15}, {1375, 13}, {1325, 11}
  308. };
  309. static const unsigned char mV_vrm85[32] = {
  310. 0x04, 0x14, 0x03, 0x13, 0x02, 0x12, 0x01, 0x11,
  311. 0x00, 0x10, 0x0f, 0x1f, 0x0e, 0x1e, 0x0d, 0x1d,
  312. 0x0c, 0x1c, 0x0b, 0x1b, 0x0a, 0x1a, 0x09, 0x19,
  313. 0x08, 0x18, 0x07, 0x17, 0x06, 0x16, 0x05, 0x15
  314. };
  315. static const struct mV_pos mobilevrm_mV[32] = {
  316. {1750, 31}, {1700, 30}, {1650, 29}, {1600, 28},
  317. {1550, 27}, {1500, 26}, {1450, 25}, {1400, 24},
  318. {1350, 23}, {1300, 22}, {1250, 21}, {1200, 20},
  319. {1150, 19}, {1100, 18}, {1050, 17}, {1000, 16},
  320. {975, 15}, {950, 14}, {925, 13}, {900, 12},
  321. {875, 11}, {850, 10}, {825, 9}, {800, 8},
  322. {775, 7}, {750, 6}, {725, 5}, {700, 4},
  323. {675, 3}, {650, 2}, {625, 1}, {600, 0}
  324. };
  325. static const unsigned char mV_mobilevrm[32] = {
  326. 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18,
  327. 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10,
  328. 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08,
  329. 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00
  330. };