ramgf100.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713
  1. /*
  2. * Copyright 2013 Red Hat Inc.
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in
  12. * all copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  17. * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18. * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19. * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20. * OTHER DEALINGS IN THE SOFTWARE.
  21. *
  22. * Authors: Ben Skeggs
  23. */
  24. #define gf100_ram(p) container_of((p), struct gf100_ram, base)
  25. #include "ram.h"
  26. #include "ramfuc.h"
  27. #include <core/option.h>
  28. #include <subdev/bios.h>
  29. #include <subdev/bios/pll.h>
  30. #include <subdev/bios/rammap.h>
  31. #include <subdev/bios/timing.h>
  32. #include <subdev/clk.h>
  33. #include <subdev/clk/pll.h>
  34. #include <subdev/ltc.h>
  35. struct gf100_ramfuc {
  36. struct ramfuc base;
  37. struct ramfuc_reg r_0x10fe20;
  38. struct ramfuc_reg r_0x10fe24;
  39. struct ramfuc_reg r_0x137320;
  40. struct ramfuc_reg r_0x137330;
  41. struct ramfuc_reg r_0x132000;
  42. struct ramfuc_reg r_0x132004;
  43. struct ramfuc_reg r_0x132100;
  44. struct ramfuc_reg r_0x137390;
  45. struct ramfuc_reg r_0x10f290;
  46. struct ramfuc_reg r_0x10f294;
  47. struct ramfuc_reg r_0x10f298;
  48. struct ramfuc_reg r_0x10f29c;
  49. struct ramfuc_reg r_0x10f2a0;
  50. struct ramfuc_reg r_0x10f300;
  51. struct ramfuc_reg r_0x10f338;
  52. struct ramfuc_reg r_0x10f340;
  53. struct ramfuc_reg r_0x10f344;
  54. struct ramfuc_reg r_0x10f348;
  55. struct ramfuc_reg r_0x10f910;
  56. struct ramfuc_reg r_0x10f914;
  57. struct ramfuc_reg r_0x100b0c;
  58. struct ramfuc_reg r_0x10f050;
  59. struct ramfuc_reg r_0x10f090;
  60. struct ramfuc_reg r_0x10f200;
  61. struct ramfuc_reg r_0x10f210;
  62. struct ramfuc_reg r_0x10f310;
  63. struct ramfuc_reg r_0x10f314;
  64. struct ramfuc_reg r_0x10f610;
  65. struct ramfuc_reg r_0x10f614;
  66. struct ramfuc_reg r_0x10f800;
  67. struct ramfuc_reg r_0x10f808;
  68. struct ramfuc_reg r_0x10f824;
  69. struct ramfuc_reg r_0x10f830;
  70. struct ramfuc_reg r_0x10f988;
  71. struct ramfuc_reg r_0x10f98c;
  72. struct ramfuc_reg r_0x10f990;
  73. struct ramfuc_reg r_0x10f998;
  74. struct ramfuc_reg r_0x10f9b0;
  75. struct ramfuc_reg r_0x10f9b4;
  76. struct ramfuc_reg r_0x10fb04;
  77. struct ramfuc_reg r_0x10fb08;
  78. struct ramfuc_reg r_0x137300;
  79. struct ramfuc_reg r_0x137310;
  80. struct ramfuc_reg r_0x137360;
  81. struct ramfuc_reg r_0x1373ec;
  82. struct ramfuc_reg r_0x1373f0;
  83. struct ramfuc_reg r_0x1373f8;
  84. struct ramfuc_reg r_0x61c140;
  85. struct ramfuc_reg r_0x611200;
  86. struct ramfuc_reg r_0x13d8f4;
  87. };
  88. struct gf100_ram {
  89. struct nvkm_ram base;
  90. struct gf100_ramfuc fuc;
  91. struct nvbios_pll refpll;
  92. struct nvbios_pll mempll;
  93. };
  94. static void
  95. gf100_ram_train(struct gf100_ramfuc *fuc, u32 magic)
  96. {
  97. struct gf100_ram *ram = container_of(fuc, typeof(*ram), fuc);
  98. struct nvkm_fb *fb = ram->base.fb;
  99. struct nvkm_device *device = fb->subdev.device;
  100. u32 part = nvkm_rd32(device, 0x022438), i;
  101. u32 mask = nvkm_rd32(device, 0x022554);
  102. u32 addr = 0x110974;
  103. ram_wr32(fuc, 0x10f910, magic);
  104. ram_wr32(fuc, 0x10f914, magic);
  105. for (i = 0; (magic & 0x80000000) && i < part; addr += 0x1000, i++) {
  106. if (mask & (1 << i))
  107. continue;
  108. ram_wait(fuc, addr, 0x0000000f, 0x00000000, 500000);
  109. }
  110. }
  111. static int
  112. gf100_ram_calc(struct nvkm_ram *base, u32 freq)
  113. {
  114. struct gf100_ram *ram = gf100_ram(base);
  115. struct gf100_ramfuc *fuc = &ram->fuc;
  116. struct nvkm_subdev *subdev = &ram->base.fb->subdev;
  117. struct nvkm_device *device = subdev->device;
  118. struct nvkm_clk *clk = device->clk;
  119. struct nvkm_bios *bios = device->bios;
  120. struct nvbios_ramcfg cfg;
  121. u8 ver, cnt, len, strap;
  122. struct {
  123. u32 data;
  124. u8 size;
  125. } rammap, ramcfg, timing;
  126. int ref, div, out;
  127. int from, mode;
  128. int N1, M1, P;
  129. int ret;
  130. /* lookup memory config data relevant to the target frequency */
  131. rammap.data = nvbios_rammapEm(bios, freq / 1000, &ver, &rammap.size,
  132. &cnt, &ramcfg.size, &cfg);
  133. if (!rammap.data || ver != 0x10 || rammap.size < 0x0e) {
  134. nvkm_error(subdev, "invalid/missing rammap entry\n");
  135. return -EINVAL;
  136. }
  137. /* locate specific data set for the attached memory */
  138. strap = nvbios_ramcfg_index(subdev);
  139. if (strap >= cnt) {
  140. nvkm_error(subdev, "invalid ramcfg strap\n");
  141. return -EINVAL;
  142. }
  143. ramcfg.data = rammap.data + rammap.size + (strap * ramcfg.size);
  144. if (!ramcfg.data || ver != 0x10 || ramcfg.size < 0x0e) {
  145. nvkm_error(subdev, "invalid/missing ramcfg entry\n");
  146. return -EINVAL;
  147. }
  148. /* lookup memory timings, if bios says they're present */
  149. strap = nvbios_rd08(bios, ramcfg.data + 0x01);
  150. if (strap != 0xff) {
  151. timing.data = nvbios_timingEe(bios, strap, &ver, &timing.size,
  152. &cnt, &len);
  153. if (!timing.data || ver != 0x10 || timing.size < 0x19) {
  154. nvkm_error(subdev, "invalid/missing timing entry\n");
  155. return -EINVAL;
  156. }
  157. } else {
  158. timing.data = 0;
  159. }
  160. ret = ram_init(fuc, ram->base.fb);
  161. if (ret)
  162. return ret;
  163. /* determine current mclk configuration */
  164. from = !!(ram_rd32(fuc, 0x1373f0) & 0x00000002); /*XXX: ok? */
  165. /* determine target mclk configuration */
  166. if (!(ram_rd32(fuc, 0x137300) & 0x00000100))
  167. ref = nvkm_clk_read(clk, nv_clk_src_sppll0);
  168. else
  169. ref = nvkm_clk_read(clk, nv_clk_src_sppll1);
  170. div = max(min((ref * 2) / freq, (u32)65), (u32)2) - 2;
  171. out = (ref * 2) / (div + 2);
  172. mode = freq != out;
  173. ram_mask(fuc, 0x137360, 0x00000002, 0x00000000);
  174. if ((ram_rd32(fuc, 0x132000) & 0x00000002) || 0 /*XXX*/) {
  175. ram_nuke(fuc, 0x132000);
  176. ram_mask(fuc, 0x132000, 0x00000002, 0x00000002);
  177. ram_mask(fuc, 0x132000, 0x00000002, 0x00000000);
  178. }
  179. if (mode == 1) {
  180. ram_nuke(fuc, 0x10fe20);
  181. ram_mask(fuc, 0x10fe20, 0x00000002, 0x00000002);
  182. ram_mask(fuc, 0x10fe20, 0x00000002, 0x00000000);
  183. }
  184. // 0x00020034 // 0x0000000a
  185. ram_wr32(fuc, 0x132100, 0x00000001);
  186. if (mode == 1 && from == 0) {
  187. /* calculate refpll */
  188. ret = gt215_pll_calc(subdev, &ram->refpll, ram->mempll.refclk,
  189. &N1, NULL, &M1, &P);
  190. if (ret <= 0) {
  191. nvkm_error(subdev, "unable to calc refpll\n");
  192. return ret ? ret : -ERANGE;
  193. }
  194. ram_wr32(fuc, 0x10fe20, 0x20010000);
  195. ram_wr32(fuc, 0x137320, 0x00000003);
  196. ram_wr32(fuc, 0x137330, 0x81200006);
  197. ram_wr32(fuc, 0x10fe24, (P << 16) | (N1 << 8) | M1);
  198. ram_wr32(fuc, 0x10fe20, 0x20010001);
  199. ram_wait(fuc, 0x137390, 0x00020000, 0x00020000, 64000);
  200. /* calculate mempll */
  201. ret = gt215_pll_calc(subdev, &ram->mempll, freq,
  202. &N1, NULL, &M1, &P);
  203. if (ret <= 0) {
  204. nvkm_error(subdev, "unable to calc refpll\n");
  205. return ret ? ret : -ERANGE;
  206. }
  207. ram_wr32(fuc, 0x10fe20, 0x20010005);
  208. ram_wr32(fuc, 0x132004, (P << 16) | (N1 << 8) | M1);
  209. ram_wr32(fuc, 0x132000, 0x18010101);
  210. ram_wait(fuc, 0x137390, 0x00000002, 0x00000002, 64000);
  211. } else
  212. if (mode == 0) {
  213. ram_wr32(fuc, 0x137300, 0x00000003);
  214. }
  215. if (from == 0) {
  216. ram_nuke(fuc, 0x10fb04);
  217. ram_mask(fuc, 0x10fb04, 0x0000ffff, 0x00000000);
  218. ram_nuke(fuc, 0x10fb08);
  219. ram_mask(fuc, 0x10fb08, 0x0000ffff, 0x00000000);
  220. ram_wr32(fuc, 0x10f988, 0x2004ff00);
  221. ram_wr32(fuc, 0x10f98c, 0x003fc040);
  222. ram_wr32(fuc, 0x10f990, 0x20012001);
  223. ram_wr32(fuc, 0x10f998, 0x00011a00);
  224. ram_wr32(fuc, 0x13d8f4, 0x00000000);
  225. } else {
  226. ram_wr32(fuc, 0x10f988, 0x20010000);
  227. ram_wr32(fuc, 0x10f98c, 0x00000000);
  228. ram_wr32(fuc, 0x10f990, 0x20012001);
  229. ram_wr32(fuc, 0x10f998, 0x00010a00);
  230. }
  231. if (from == 0) {
  232. // 0x00020039 // 0x000000ba
  233. }
  234. // 0x0002003a // 0x00000002
  235. ram_wr32(fuc, 0x100b0c, 0x00080012);
  236. // 0x00030014 // 0x00000000 // 0x02b5f070
  237. // 0x00030014 // 0x00010000 // 0x02b5f070
  238. ram_wr32(fuc, 0x611200, 0x00003300);
  239. // 0x00020034 // 0x0000000a
  240. // 0x00030020 // 0x00000001 // 0x00000000
  241. ram_mask(fuc, 0x10f200, 0x00000800, 0x00000000);
  242. ram_wr32(fuc, 0x10f210, 0x00000000);
  243. ram_nsec(fuc, 1000);
  244. if (mode == 0)
  245. gf100_ram_train(fuc, 0x000c1001);
  246. ram_wr32(fuc, 0x10f310, 0x00000001);
  247. ram_nsec(fuc, 1000);
  248. ram_wr32(fuc, 0x10f090, 0x00000061);
  249. ram_wr32(fuc, 0x10f090, 0xc000007f);
  250. ram_nsec(fuc, 1000);
  251. if (from == 0) {
  252. ram_wr32(fuc, 0x10f824, 0x00007fd4);
  253. } else {
  254. ram_wr32(fuc, 0x1373ec, 0x00020404);
  255. }
  256. if (mode == 0) {
  257. ram_mask(fuc, 0x10f808, 0x00080000, 0x00000000);
  258. ram_mask(fuc, 0x10f200, 0x00008000, 0x00008000);
  259. ram_wr32(fuc, 0x10f830, 0x41500010);
  260. ram_mask(fuc, 0x10f830, 0x01000000, 0x00000000);
  261. ram_mask(fuc, 0x132100, 0x00000100, 0x00000100);
  262. ram_wr32(fuc, 0x10f050, 0xff000090);
  263. ram_wr32(fuc, 0x1373ec, 0x00020f0f);
  264. ram_wr32(fuc, 0x1373f0, 0x00000003);
  265. ram_wr32(fuc, 0x137310, 0x81201616);
  266. ram_wr32(fuc, 0x132100, 0x00000001);
  267. // 0x00020039 // 0x000000ba
  268. ram_wr32(fuc, 0x10f830, 0x00300017);
  269. ram_wr32(fuc, 0x1373f0, 0x00000001);
  270. ram_wr32(fuc, 0x10f824, 0x00007e77);
  271. ram_wr32(fuc, 0x132000, 0x18030001);
  272. ram_wr32(fuc, 0x10f090, 0x4000007e);
  273. ram_nsec(fuc, 2000);
  274. ram_wr32(fuc, 0x10f314, 0x00000001);
  275. ram_wr32(fuc, 0x10f210, 0x80000000);
  276. ram_wr32(fuc, 0x10f338, 0x00300220);
  277. ram_wr32(fuc, 0x10f300, 0x0000011d);
  278. ram_nsec(fuc, 1000);
  279. ram_wr32(fuc, 0x10f290, 0x02060505);
  280. ram_wr32(fuc, 0x10f294, 0x34208288);
  281. ram_wr32(fuc, 0x10f298, 0x44050411);
  282. ram_wr32(fuc, 0x10f29c, 0x0000114c);
  283. ram_wr32(fuc, 0x10f2a0, 0x42e10069);
  284. ram_wr32(fuc, 0x10f614, 0x40044f77);
  285. ram_wr32(fuc, 0x10f610, 0x40044f77);
  286. ram_wr32(fuc, 0x10f344, 0x00600009);
  287. ram_nsec(fuc, 1000);
  288. ram_wr32(fuc, 0x10f348, 0x00700008);
  289. ram_wr32(fuc, 0x61c140, 0x19240000);
  290. ram_wr32(fuc, 0x10f830, 0x00300017);
  291. gf100_ram_train(fuc, 0x80021001);
  292. gf100_ram_train(fuc, 0x80081001);
  293. ram_wr32(fuc, 0x10f340, 0x00500004);
  294. ram_nsec(fuc, 1000);
  295. ram_wr32(fuc, 0x10f830, 0x01300017);
  296. ram_wr32(fuc, 0x10f830, 0x00300017);
  297. // 0x00030020 // 0x00000000 // 0x00000000
  298. // 0x00020034 // 0x0000000b
  299. ram_wr32(fuc, 0x100b0c, 0x00080028);
  300. ram_wr32(fuc, 0x611200, 0x00003330);
  301. } else {
  302. ram_wr32(fuc, 0x10f800, 0x00001800);
  303. ram_wr32(fuc, 0x13d8f4, 0x00000000);
  304. ram_wr32(fuc, 0x1373ec, 0x00020404);
  305. ram_wr32(fuc, 0x1373f0, 0x00000003);
  306. ram_wr32(fuc, 0x10f830, 0x40700010);
  307. ram_wr32(fuc, 0x10f830, 0x40500010);
  308. ram_wr32(fuc, 0x13d8f4, 0x00000000);
  309. ram_wr32(fuc, 0x1373f8, 0x00000000);
  310. ram_wr32(fuc, 0x132100, 0x00000101);
  311. ram_wr32(fuc, 0x137310, 0x89201616);
  312. ram_wr32(fuc, 0x10f050, 0xff000090);
  313. ram_wr32(fuc, 0x1373ec, 0x00030404);
  314. ram_wr32(fuc, 0x1373f0, 0x00000002);
  315. // 0x00020039 // 0x00000011
  316. ram_wr32(fuc, 0x132100, 0x00000001);
  317. ram_wr32(fuc, 0x1373f8, 0x00002000);
  318. ram_nsec(fuc, 2000);
  319. ram_wr32(fuc, 0x10f808, 0x7aaa0050);
  320. ram_wr32(fuc, 0x10f830, 0x00500010);
  321. ram_wr32(fuc, 0x10f200, 0x00ce1000);
  322. ram_wr32(fuc, 0x10f090, 0x4000007e);
  323. ram_nsec(fuc, 2000);
  324. ram_wr32(fuc, 0x10f314, 0x00000001);
  325. ram_wr32(fuc, 0x10f210, 0x80000000);
  326. ram_wr32(fuc, 0x10f338, 0x00300200);
  327. ram_wr32(fuc, 0x10f300, 0x0000084d);
  328. ram_nsec(fuc, 1000);
  329. ram_wr32(fuc, 0x10f290, 0x0b343825);
  330. ram_wr32(fuc, 0x10f294, 0x3483028e);
  331. ram_wr32(fuc, 0x10f298, 0x440c0600);
  332. ram_wr32(fuc, 0x10f29c, 0x0000214c);
  333. ram_wr32(fuc, 0x10f2a0, 0x42e20069);
  334. ram_wr32(fuc, 0x10f200, 0x00ce0000);
  335. ram_wr32(fuc, 0x10f614, 0x60044e77);
  336. ram_wr32(fuc, 0x10f610, 0x60044e77);
  337. ram_wr32(fuc, 0x10f340, 0x00500000);
  338. ram_nsec(fuc, 1000);
  339. ram_wr32(fuc, 0x10f344, 0x00600228);
  340. ram_nsec(fuc, 1000);
  341. ram_wr32(fuc, 0x10f348, 0x00700000);
  342. ram_wr32(fuc, 0x13d8f4, 0x00000000);
  343. ram_wr32(fuc, 0x61c140, 0x09a40000);
  344. gf100_ram_train(fuc, 0x800e1008);
  345. ram_nsec(fuc, 1000);
  346. ram_wr32(fuc, 0x10f800, 0x00001804);
  347. // 0x00030020 // 0x00000000 // 0x00000000
  348. // 0x00020034 // 0x0000000b
  349. ram_wr32(fuc, 0x13d8f4, 0x00000000);
  350. ram_wr32(fuc, 0x100b0c, 0x00080028);
  351. ram_wr32(fuc, 0x611200, 0x00003330);
  352. ram_nsec(fuc, 100000);
  353. ram_wr32(fuc, 0x10f9b0, 0x05313f41);
  354. ram_wr32(fuc, 0x10f9b4, 0x00002f50);
  355. gf100_ram_train(fuc, 0x010c1001);
  356. }
  357. ram_mask(fuc, 0x10f200, 0x00000800, 0x00000800);
  358. // 0x00020016 // 0x00000000
  359. if (mode == 0)
  360. ram_mask(fuc, 0x132000, 0x00000001, 0x00000000);
  361. return 0;
  362. }
  363. static int
  364. gf100_ram_prog(struct nvkm_ram *base)
  365. {
  366. struct gf100_ram *ram = gf100_ram(base);
  367. struct nvkm_device *device = ram->base.fb->subdev.device;
  368. ram_exec(&ram->fuc, nvkm_boolopt(device->cfgopt, "NvMemExec", true));
  369. return 0;
  370. }
  371. static void
  372. gf100_ram_tidy(struct nvkm_ram *base)
  373. {
  374. struct gf100_ram *ram = gf100_ram(base);
  375. ram_exec(&ram->fuc, false);
  376. }
  377. void
  378. gf100_ram_put(struct nvkm_ram *ram, struct nvkm_mem **pmem)
  379. {
  380. struct nvkm_ltc *ltc = ram->fb->subdev.device->ltc;
  381. struct nvkm_mem *mem = *pmem;
  382. *pmem = NULL;
  383. if (unlikely(mem == NULL))
  384. return;
  385. mutex_lock(&ram->fb->subdev.mutex);
  386. if (mem->tag)
  387. nvkm_ltc_tags_free(ltc, &mem->tag);
  388. __nv50_ram_put(ram, mem);
  389. mutex_unlock(&ram->fb->subdev.mutex);
  390. kfree(mem);
  391. }
  392. int
  393. gf100_ram_get(struct nvkm_ram *ram, u64 size, u32 align, u32 ncmin,
  394. u32 memtype, struct nvkm_mem **pmem)
  395. {
  396. struct nvkm_ltc *ltc = ram->fb->subdev.device->ltc;
  397. struct nvkm_mm *mm = &ram->vram;
  398. struct nvkm_mm_node *r;
  399. struct nvkm_mem *mem;
  400. int type = (memtype & 0x0ff);
  401. int back = (memtype & 0x800);
  402. const bool comp = gf100_pte_storage_type_map[type] != type;
  403. int ret;
  404. size >>= NVKM_RAM_MM_SHIFT;
  405. align >>= NVKM_RAM_MM_SHIFT;
  406. ncmin >>= NVKM_RAM_MM_SHIFT;
  407. if (!ncmin)
  408. ncmin = size;
  409. mem = kzalloc(sizeof(*mem), GFP_KERNEL);
  410. if (!mem)
  411. return -ENOMEM;
  412. INIT_LIST_HEAD(&mem->regions);
  413. mem->size = size;
  414. mutex_lock(&ram->fb->subdev.mutex);
  415. if (comp) {
  416. /* compression only works with lpages */
  417. if (align == (1 << (17 - NVKM_RAM_MM_SHIFT))) {
  418. int n = size >> 5;
  419. nvkm_ltc_tags_alloc(ltc, n, &mem->tag);
  420. }
  421. if (unlikely(!mem->tag))
  422. type = gf100_pte_storage_type_map[type];
  423. }
  424. mem->memtype = type;
  425. do {
  426. if (back)
  427. ret = nvkm_mm_tail(mm, 0, 1, size, ncmin, align, &r);
  428. else
  429. ret = nvkm_mm_head(mm, 0, 1, size, ncmin, align, &r);
  430. if (ret) {
  431. mutex_unlock(&ram->fb->subdev.mutex);
  432. ram->func->put(ram, &mem);
  433. return ret;
  434. }
  435. list_add_tail(&r->rl_entry, &mem->regions);
  436. size -= r->length;
  437. } while (size);
  438. mutex_unlock(&ram->fb->subdev.mutex);
  439. r = list_first_entry(&mem->regions, struct nvkm_mm_node, rl_entry);
  440. mem->offset = (u64)r->offset << NVKM_RAM_MM_SHIFT;
  441. *pmem = mem;
  442. return 0;
  443. }
  444. static int
  445. gf100_ram_init(struct nvkm_ram *base)
  446. {
  447. static const u8 train0[] = {
  448. 0x00, 0xff, 0x55, 0xaa, 0x33, 0xcc,
  449. 0x00, 0xff, 0xff, 0x00, 0xff, 0x00,
  450. };
  451. static const u32 train1[] = {
  452. 0x00000000, 0xffffffff,
  453. 0x55555555, 0xaaaaaaaa,
  454. 0x33333333, 0xcccccccc,
  455. 0xf0f0f0f0, 0x0f0f0f0f,
  456. 0x00ff00ff, 0xff00ff00,
  457. 0x0000ffff, 0xffff0000,
  458. };
  459. struct gf100_ram *ram = gf100_ram(base);
  460. struct nvkm_device *device = ram->base.fb->subdev.device;
  461. int i;
  462. switch (ram->base.type) {
  463. case NVKM_RAM_TYPE_GDDR5:
  464. break;
  465. default:
  466. return 0;
  467. }
  468. /* prepare for ddr link training, and load training patterns */
  469. for (i = 0; i < 0x30; i++) {
  470. nvkm_wr32(device, 0x10f968, 0x00000000 | (i << 8));
  471. nvkm_wr32(device, 0x10f96c, 0x00000000 | (i << 8));
  472. nvkm_wr32(device, 0x10f920, 0x00000100 | train0[i % 12]);
  473. nvkm_wr32(device, 0x10f924, 0x00000100 | train0[i % 12]);
  474. nvkm_wr32(device, 0x10f918, train1[i % 12]);
  475. nvkm_wr32(device, 0x10f91c, train1[i % 12]);
  476. nvkm_wr32(device, 0x10f920, 0x00000000 | train0[i % 12]);
  477. nvkm_wr32(device, 0x10f924, 0x00000000 | train0[i % 12]);
  478. nvkm_wr32(device, 0x10f918, train1[i % 12]);
  479. nvkm_wr32(device, 0x10f91c, train1[i % 12]);
  480. }
  481. return 0;
  482. }
  483. static const struct nvkm_ram_func
  484. gf100_ram_func = {
  485. .init = gf100_ram_init,
  486. .get = gf100_ram_get,
  487. .put = gf100_ram_put,
  488. .calc = gf100_ram_calc,
  489. .prog = gf100_ram_prog,
  490. .tidy = gf100_ram_tidy,
  491. };
  492. int
  493. gf100_ram_ctor(const struct nvkm_ram_func *func, struct nvkm_fb *fb,
  494. u32 maskaddr, struct nvkm_ram *ram)
  495. {
  496. struct nvkm_subdev *subdev = &fb->subdev;
  497. struct nvkm_device *device = subdev->device;
  498. struct nvkm_bios *bios = device->bios;
  499. const u32 rsvd_head = ( 256 * 1024); /* vga memory */
  500. const u32 rsvd_tail = (1024 * 1024); /* vbios etc */
  501. u32 parts = nvkm_rd32(device, 0x022438);
  502. u32 pmask = nvkm_rd32(device, maskaddr);
  503. u64 bsize = (u64)nvkm_rd32(device, 0x10f20c) << 20;
  504. u64 psize, size = 0;
  505. enum nvkm_ram_type type = nvkm_fb_bios_memtype(bios);
  506. bool uniform = true;
  507. int ret, i;
  508. nvkm_debug(subdev, "100800: %08x\n", nvkm_rd32(device, 0x100800));
  509. nvkm_debug(subdev, "parts %08x mask %08x\n", parts, pmask);
  510. /* read amount of vram attached to each memory controller */
  511. for (i = 0; i < parts; i++) {
  512. if (pmask & (1 << i))
  513. continue;
  514. psize = (u64)nvkm_rd32(device, 0x11020c + (i * 0x1000)) << 20;
  515. if (psize != bsize) {
  516. if (psize < bsize)
  517. bsize = psize;
  518. uniform = false;
  519. }
  520. nvkm_debug(subdev, "%d: %d MiB\n", i, (u32)(psize >> 20));
  521. size += psize;
  522. }
  523. ret = nvkm_ram_ctor(func, fb, type, size, 0, ram);
  524. if (ret)
  525. return ret;
  526. nvkm_mm_fini(&ram->vram);
  527. /* if all controllers have the same amount attached, there's no holes */
  528. if (uniform) {
  529. ret = nvkm_mm_init(&ram->vram, rsvd_head >> NVKM_RAM_MM_SHIFT,
  530. (size - rsvd_head - rsvd_tail) >>
  531. NVKM_RAM_MM_SHIFT, 1);
  532. if (ret)
  533. return ret;
  534. } else {
  535. /* otherwise, address lowest common amount from 0GiB */
  536. ret = nvkm_mm_init(&ram->vram, rsvd_head >> NVKM_RAM_MM_SHIFT,
  537. ((bsize * parts) - rsvd_head) >>
  538. NVKM_RAM_MM_SHIFT, 1);
  539. if (ret)
  540. return ret;
  541. /* and the rest starting from (8GiB + common_size) */
  542. ret = nvkm_mm_init(&ram->vram, (0x0200000000ULL + bsize) >>
  543. NVKM_RAM_MM_SHIFT,
  544. (size - (bsize * parts) - rsvd_tail) >>
  545. NVKM_RAM_MM_SHIFT, 1);
  546. if (ret)
  547. return ret;
  548. }
  549. ram->ranks = (nvkm_rd32(device, 0x10f200) & 0x00000004) ? 2 : 1;
  550. return 0;
  551. }
  552. int
  553. gf100_ram_new(struct nvkm_fb *fb, struct nvkm_ram **pram)
  554. {
  555. struct nvkm_subdev *subdev = &fb->subdev;
  556. struct nvkm_bios *bios = subdev->device->bios;
  557. struct gf100_ram *ram;
  558. int ret;
  559. if (!(ram = kzalloc(sizeof(*ram), GFP_KERNEL)))
  560. return -ENOMEM;
  561. *pram = &ram->base;
  562. ret = gf100_ram_ctor(&gf100_ram_func, fb, 0x022554, &ram->base);
  563. if (ret)
  564. return ret;
  565. ret = nvbios_pll_parse(bios, 0x0c, &ram->refpll);
  566. if (ret) {
  567. nvkm_error(subdev, "mclk refpll data not found\n");
  568. return ret;
  569. }
  570. ret = nvbios_pll_parse(bios, 0x04, &ram->mempll);
  571. if (ret) {
  572. nvkm_error(subdev, "mclk pll data not found\n");
  573. return ret;
  574. }
  575. ram->fuc.r_0x10fe20 = ramfuc_reg(0x10fe20);
  576. ram->fuc.r_0x10fe24 = ramfuc_reg(0x10fe24);
  577. ram->fuc.r_0x137320 = ramfuc_reg(0x137320);
  578. ram->fuc.r_0x137330 = ramfuc_reg(0x137330);
  579. ram->fuc.r_0x132000 = ramfuc_reg(0x132000);
  580. ram->fuc.r_0x132004 = ramfuc_reg(0x132004);
  581. ram->fuc.r_0x132100 = ramfuc_reg(0x132100);
  582. ram->fuc.r_0x137390 = ramfuc_reg(0x137390);
  583. ram->fuc.r_0x10f290 = ramfuc_reg(0x10f290);
  584. ram->fuc.r_0x10f294 = ramfuc_reg(0x10f294);
  585. ram->fuc.r_0x10f298 = ramfuc_reg(0x10f298);
  586. ram->fuc.r_0x10f29c = ramfuc_reg(0x10f29c);
  587. ram->fuc.r_0x10f2a0 = ramfuc_reg(0x10f2a0);
  588. ram->fuc.r_0x10f300 = ramfuc_reg(0x10f300);
  589. ram->fuc.r_0x10f338 = ramfuc_reg(0x10f338);
  590. ram->fuc.r_0x10f340 = ramfuc_reg(0x10f340);
  591. ram->fuc.r_0x10f344 = ramfuc_reg(0x10f344);
  592. ram->fuc.r_0x10f348 = ramfuc_reg(0x10f348);
  593. ram->fuc.r_0x10f910 = ramfuc_reg(0x10f910);
  594. ram->fuc.r_0x10f914 = ramfuc_reg(0x10f914);
  595. ram->fuc.r_0x100b0c = ramfuc_reg(0x100b0c);
  596. ram->fuc.r_0x10f050 = ramfuc_reg(0x10f050);
  597. ram->fuc.r_0x10f090 = ramfuc_reg(0x10f090);
  598. ram->fuc.r_0x10f200 = ramfuc_reg(0x10f200);
  599. ram->fuc.r_0x10f210 = ramfuc_reg(0x10f210);
  600. ram->fuc.r_0x10f310 = ramfuc_reg(0x10f310);
  601. ram->fuc.r_0x10f314 = ramfuc_reg(0x10f314);
  602. ram->fuc.r_0x10f610 = ramfuc_reg(0x10f610);
  603. ram->fuc.r_0x10f614 = ramfuc_reg(0x10f614);
  604. ram->fuc.r_0x10f800 = ramfuc_reg(0x10f800);
  605. ram->fuc.r_0x10f808 = ramfuc_reg(0x10f808);
  606. ram->fuc.r_0x10f824 = ramfuc_reg(0x10f824);
  607. ram->fuc.r_0x10f830 = ramfuc_reg(0x10f830);
  608. ram->fuc.r_0x10f988 = ramfuc_reg(0x10f988);
  609. ram->fuc.r_0x10f98c = ramfuc_reg(0x10f98c);
  610. ram->fuc.r_0x10f990 = ramfuc_reg(0x10f990);
  611. ram->fuc.r_0x10f998 = ramfuc_reg(0x10f998);
  612. ram->fuc.r_0x10f9b0 = ramfuc_reg(0x10f9b0);
  613. ram->fuc.r_0x10f9b4 = ramfuc_reg(0x10f9b4);
  614. ram->fuc.r_0x10fb04 = ramfuc_reg(0x10fb04);
  615. ram->fuc.r_0x10fb08 = ramfuc_reg(0x10fb08);
  616. ram->fuc.r_0x137310 = ramfuc_reg(0x137300);
  617. ram->fuc.r_0x137310 = ramfuc_reg(0x137310);
  618. ram->fuc.r_0x137360 = ramfuc_reg(0x137360);
  619. ram->fuc.r_0x1373ec = ramfuc_reg(0x1373ec);
  620. ram->fuc.r_0x1373f0 = ramfuc_reg(0x1373f0);
  621. ram->fuc.r_0x1373f8 = ramfuc_reg(0x1373f8);
  622. ram->fuc.r_0x61c140 = ramfuc_reg(0x61c140);
  623. ram->fuc.r_0x611200 = ramfuc_reg(0x611200);
  624. ram->fuc.r_0x13d8f4 = ramfuc_reg(0x13d8f4);
  625. return 0;
  626. }