dce112_resource.c 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312
  1. /*
  2. * Copyright 2012-15 Advanced Micro Devices, 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: AMD
  23. *
  24. */
  25. #include "dm_services.h"
  26. #include "link_encoder.h"
  27. #include "stream_encoder.h"
  28. #include "resource.h"
  29. #include "include/irq_service_interface.h"
  30. #include "dce110/dce110_resource.h"
  31. #include "dce110/dce110_timing_generator.h"
  32. #include "irq/dce110/irq_service_dce110.h"
  33. #include "dce/dce_mem_input.h"
  34. #include "dce/dce_transform.h"
  35. #include "dce/dce_link_encoder.h"
  36. #include "dce/dce_stream_encoder.h"
  37. #include "dce/dce_audio.h"
  38. #include "dce/dce_opp.h"
  39. #include "dce/dce_ipp.h"
  40. #include "dce/dce_clocks.h"
  41. #include "dce/dce_clock_source.h"
  42. #include "dce/dce_hwseq.h"
  43. #include "dce112/dce112_hw_sequencer.h"
  44. #include "dce/dce_abm.h"
  45. #include "dce/dce_dmcu.h"
  46. #include "reg_helper.h"
  47. #include "dce/dce_11_2_d.h"
  48. #include "dce/dce_11_2_sh_mask.h"
  49. #include "dce100/dce100_resource.h"
  50. #ifndef mmDP_DPHY_INTERNAL_CTRL
  51. #define mmDP_DPHY_INTERNAL_CTRL 0x4aa7
  52. #define mmDP0_DP_DPHY_INTERNAL_CTRL 0x4aa7
  53. #define mmDP1_DP_DPHY_INTERNAL_CTRL 0x4ba7
  54. #define mmDP2_DP_DPHY_INTERNAL_CTRL 0x4ca7
  55. #define mmDP3_DP_DPHY_INTERNAL_CTRL 0x4da7
  56. #define mmDP4_DP_DPHY_INTERNAL_CTRL 0x4ea7
  57. #define mmDP5_DP_DPHY_INTERNAL_CTRL 0x4fa7
  58. #define mmDP6_DP_DPHY_INTERNAL_CTRL 0x54a7
  59. #define mmDP7_DP_DPHY_INTERNAL_CTRL 0x56a7
  60. #define mmDP8_DP_DPHY_INTERNAL_CTRL 0x57a7
  61. #endif
  62. #ifndef mmBIOS_SCRATCH_2
  63. #define mmBIOS_SCRATCH_2 0x05CB
  64. #define mmBIOS_SCRATCH_6 0x05CF
  65. #endif
  66. #ifndef mmDP_DPHY_BS_SR_SWAP_CNTL
  67. #define mmDP_DPHY_BS_SR_SWAP_CNTL 0x4ADC
  68. #define mmDP0_DP_DPHY_BS_SR_SWAP_CNTL 0x4ADC
  69. #define mmDP1_DP_DPHY_BS_SR_SWAP_CNTL 0x4BDC
  70. #define mmDP2_DP_DPHY_BS_SR_SWAP_CNTL 0x4CDC
  71. #define mmDP3_DP_DPHY_BS_SR_SWAP_CNTL 0x4DDC
  72. #define mmDP4_DP_DPHY_BS_SR_SWAP_CNTL 0x4EDC
  73. #define mmDP5_DP_DPHY_BS_SR_SWAP_CNTL 0x4FDC
  74. #define mmDP6_DP_DPHY_BS_SR_SWAP_CNTL 0x54DC
  75. #endif
  76. #ifndef mmDP_DPHY_FAST_TRAINING
  77. #define mmDP_DPHY_FAST_TRAINING 0x4ABC
  78. #define mmDP0_DP_DPHY_FAST_TRAINING 0x4ABC
  79. #define mmDP1_DP_DPHY_FAST_TRAINING 0x4BBC
  80. #define mmDP2_DP_DPHY_FAST_TRAINING 0x4CBC
  81. #define mmDP3_DP_DPHY_FAST_TRAINING 0x4DBC
  82. #define mmDP4_DP_DPHY_FAST_TRAINING 0x4EBC
  83. #define mmDP5_DP_DPHY_FAST_TRAINING 0x4FBC
  84. #define mmDP6_DP_DPHY_FAST_TRAINING 0x54BC
  85. #endif
  86. enum dce112_clk_src_array_id {
  87. DCE112_CLK_SRC_PLL0,
  88. DCE112_CLK_SRC_PLL1,
  89. DCE112_CLK_SRC_PLL2,
  90. DCE112_CLK_SRC_PLL3,
  91. DCE112_CLK_SRC_PLL4,
  92. DCE112_CLK_SRC_PLL5,
  93. DCE112_CLK_SRC_TOTAL
  94. };
  95. static const struct dce110_timing_generator_offsets dce112_tg_offsets[] = {
  96. {
  97. .crtc = (mmCRTC0_CRTC_CONTROL - mmCRTC_CONTROL),
  98. .dcp = (mmDCP0_GRPH_CONTROL - mmGRPH_CONTROL),
  99. },
  100. {
  101. .crtc = (mmCRTC1_CRTC_CONTROL - mmCRTC_CONTROL),
  102. .dcp = (mmDCP1_GRPH_CONTROL - mmGRPH_CONTROL),
  103. },
  104. {
  105. .crtc = (mmCRTC2_CRTC_CONTROL - mmCRTC_CONTROL),
  106. .dcp = (mmDCP2_GRPH_CONTROL - mmGRPH_CONTROL),
  107. },
  108. {
  109. .crtc = (mmCRTC3_CRTC_CONTROL - mmCRTC_CONTROL),
  110. .dcp = (mmDCP3_GRPH_CONTROL - mmGRPH_CONTROL),
  111. },
  112. {
  113. .crtc = (mmCRTC4_CRTC_CONTROL - mmCRTC_CONTROL),
  114. .dcp = (mmDCP4_GRPH_CONTROL - mmGRPH_CONTROL),
  115. },
  116. {
  117. .crtc = (mmCRTC5_CRTC_CONTROL - mmCRTC_CONTROL),
  118. .dcp = (mmDCP5_GRPH_CONTROL - mmGRPH_CONTROL),
  119. }
  120. };
  121. /* set register offset */
  122. #define SR(reg_name)\
  123. .reg_name = mm ## reg_name
  124. /* set register offset with instance */
  125. #define SRI(reg_name, block, id)\
  126. .reg_name = mm ## block ## id ## _ ## reg_name
  127. static const struct dce_disp_clk_registers disp_clk_regs = {
  128. CLK_COMMON_REG_LIST_DCE_BASE()
  129. };
  130. static const struct dce_disp_clk_shift disp_clk_shift = {
  131. CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
  132. };
  133. static const struct dce_disp_clk_mask disp_clk_mask = {
  134. CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
  135. };
  136. static const struct dce_dmcu_registers dmcu_regs = {
  137. DMCU_DCE110_COMMON_REG_LIST()
  138. };
  139. static const struct dce_dmcu_shift dmcu_shift = {
  140. DMCU_MASK_SH_LIST_DCE110(__SHIFT)
  141. };
  142. static const struct dce_dmcu_mask dmcu_mask = {
  143. DMCU_MASK_SH_LIST_DCE110(_MASK)
  144. };
  145. static const struct dce_abm_registers abm_regs = {
  146. ABM_DCE110_COMMON_REG_LIST()
  147. };
  148. static const struct dce_abm_shift abm_shift = {
  149. ABM_MASK_SH_LIST_DCE110(__SHIFT)
  150. };
  151. static const struct dce_abm_mask abm_mask = {
  152. ABM_MASK_SH_LIST_DCE110(_MASK)
  153. };
  154. #define ipp_regs(id)\
  155. [id] = {\
  156. IPP_DCE110_REG_LIST_DCE_BASE(id)\
  157. }
  158. static const struct dce_ipp_registers ipp_regs[] = {
  159. ipp_regs(0),
  160. ipp_regs(1),
  161. ipp_regs(2),
  162. ipp_regs(3),
  163. ipp_regs(4),
  164. ipp_regs(5)
  165. };
  166. static const struct dce_ipp_shift ipp_shift = {
  167. IPP_DCE100_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
  168. };
  169. static const struct dce_ipp_mask ipp_mask = {
  170. IPP_DCE100_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
  171. };
  172. #define transform_regs(id)\
  173. [id] = {\
  174. XFM_COMMON_REG_LIST_DCE110(id)\
  175. }
  176. static const struct dce_transform_registers xfm_regs[] = {
  177. transform_regs(0),
  178. transform_regs(1),
  179. transform_regs(2),
  180. transform_regs(3),
  181. transform_regs(4),
  182. transform_regs(5)
  183. };
  184. static const struct dce_transform_shift xfm_shift = {
  185. XFM_COMMON_MASK_SH_LIST_DCE110(__SHIFT)
  186. };
  187. static const struct dce_transform_mask xfm_mask = {
  188. XFM_COMMON_MASK_SH_LIST_DCE110(_MASK)
  189. };
  190. #define aux_regs(id)\
  191. [id] = {\
  192. AUX_REG_LIST(id)\
  193. }
  194. static const struct dce110_link_enc_aux_registers link_enc_aux_regs[] = {
  195. aux_regs(0),
  196. aux_regs(1),
  197. aux_regs(2),
  198. aux_regs(3),
  199. aux_regs(4),
  200. aux_regs(5)
  201. };
  202. #define hpd_regs(id)\
  203. [id] = {\
  204. HPD_REG_LIST(id)\
  205. }
  206. static const struct dce110_link_enc_hpd_registers link_enc_hpd_regs[] = {
  207. hpd_regs(0),
  208. hpd_regs(1),
  209. hpd_regs(2),
  210. hpd_regs(3),
  211. hpd_regs(4),
  212. hpd_regs(5)
  213. };
  214. #define link_regs(id)\
  215. [id] = {\
  216. LE_DCE110_REG_LIST(id)\
  217. }
  218. static const struct dce110_link_enc_registers link_enc_regs[] = {
  219. link_regs(0),
  220. link_regs(1),
  221. link_regs(2),
  222. link_regs(3),
  223. link_regs(4),
  224. link_regs(5),
  225. link_regs(6),
  226. };
  227. #define stream_enc_regs(id)\
  228. [id] = {\
  229. SE_COMMON_REG_LIST(id),\
  230. .TMDS_CNTL = 0,\
  231. }
  232. static const struct dce110_stream_enc_registers stream_enc_regs[] = {
  233. stream_enc_regs(0),
  234. stream_enc_regs(1),
  235. stream_enc_regs(2),
  236. stream_enc_regs(3),
  237. stream_enc_regs(4),
  238. stream_enc_regs(5)
  239. };
  240. static const struct dce_stream_encoder_shift se_shift = {
  241. SE_COMMON_MASK_SH_LIST_DCE112(__SHIFT)
  242. };
  243. static const struct dce_stream_encoder_mask se_mask = {
  244. SE_COMMON_MASK_SH_LIST_DCE112(_MASK)
  245. };
  246. #define opp_regs(id)\
  247. [id] = {\
  248. OPP_DCE_112_REG_LIST(id),\
  249. }
  250. static const struct dce_opp_registers opp_regs[] = {
  251. opp_regs(0),
  252. opp_regs(1),
  253. opp_regs(2),
  254. opp_regs(3),
  255. opp_regs(4),
  256. opp_regs(5)
  257. };
  258. static const struct dce_opp_shift opp_shift = {
  259. OPP_COMMON_MASK_SH_LIST_DCE_112(__SHIFT)
  260. };
  261. static const struct dce_opp_mask opp_mask = {
  262. OPP_COMMON_MASK_SH_LIST_DCE_112(_MASK)
  263. };
  264. #define audio_regs(id)\
  265. [id] = {\
  266. AUD_COMMON_REG_LIST(id)\
  267. }
  268. static const struct dce_audio_registers audio_regs[] = {
  269. audio_regs(0),
  270. audio_regs(1),
  271. audio_regs(2),
  272. audio_regs(3),
  273. audio_regs(4),
  274. audio_regs(5)
  275. };
  276. static const struct dce_audio_shift audio_shift = {
  277. AUD_COMMON_MASK_SH_LIST(__SHIFT)
  278. };
  279. static const struct dce_aduio_mask audio_mask = {
  280. AUD_COMMON_MASK_SH_LIST(_MASK)
  281. };
  282. #define clk_src_regs(index, id)\
  283. [index] = {\
  284. CS_COMMON_REG_LIST_DCE_112(id),\
  285. }
  286. static const struct dce110_clk_src_regs clk_src_regs[] = {
  287. clk_src_regs(0, A),
  288. clk_src_regs(1, B),
  289. clk_src_regs(2, C),
  290. clk_src_regs(3, D),
  291. clk_src_regs(4, E),
  292. clk_src_regs(5, F)
  293. };
  294. static const struct dce110_clk_src_shift cs_shift = {
  295. CS_COMMON_MASK_SH_LIST_DCE_112(__SHIFT)
  296. };
  297. static const struct dce110_clk_src_mask cs_mask = {
  298. CS_COMMON_MASK_SH_LIST_DCE_112(_MASK)
  299. };
  300. static const struct bios_registers bios_regs = {
  301. .BIOS_SCRATCH_6 = mmBIOS_SCRATCH_6
  302. };
  303. static const struct resource_caps polaris_10_resource_cap = {
  304. .num_timing_generator = 6,
  305. .num_audio = 6,
  306. .num_stream_encoder = 6,
  307. .num_pll = 8, /* why 8? 6 combo PHY PLL + 2 regular PLLs? */
  308. };
  309. static const struct resource_caps polaris_11_resource_cap = {
  310. .num_timing_generator = 5,
  311. .num_audio = 5,
  312. .num_stream_encoder = 5,
  313. .num_pll = 8, /* why 8? 6 combo PHY PLL + 2 regular PLLs? */
  314. };
  315. #define CTX ctx
  316. #define REG(reg) mm ## reg
  317. #ifndef mmCC_DC_HDMI_STRAPS
  318. #define mmCC_DC_HDMI_STRAPS 0x4819
  319. #define CC_DC_HDMI_STRAPS__HDMI_DISABLE_MASK 0x40
  320. #define CC_DC_HDMI_STRAPS__HDMI_DISABLE__SHIFT 0x6
  321. #define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER_MASK 0x700
  322. #define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER__SHIFT 0x8
  323. #endif
  324. static void read_dce_straps(
  325. struct dc_context *ctx,
  326. struct resource_straps *straps)
  327. {
  328. REG_GET_2(CC_DC_HDMI_STRAPS,
  329. HDMI_DISABLE, &straps->hdmi_disable,
  330. AUDIO_STREAM_NUMBER, &straps->audio_stream_number);
  331. REG_GET(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO, &straps->dc_pinstraps_audio);
  332. }
  333. static struct audio *create_audio(
  334. struct dc_context *ctx, unsigned int inst)
  335. {
  336. return dce_audio_create(ctx, inst,
  337. &audio_regs[inst], &audio_shift, &audio_mask);
  338. }
  339. static struct timing_generator *dce112_timing_generator_create(
  340. struct dc_context *ctx,
  341. uint32_t instance,
  342. const struct dce110_timing_generator_offsets *offsets)
  343. {
  344. struct dce110_timing_generator *tg110 =
  345. kzalloc(sizeof(struct dce110_timing_generator), GFP_KERNEL);
  346. if (!tg110)
  347. return NULL;
  348. if (dce110_timing_generator_construct(tg110, ctx, instance, offsets))
  349. return &tg110->base;
  350. BREAK_TO_DEBUGGER();
  351. kfree(tg110);
  352. return NULL;
  353. }
  354. static struct stream_encoder *dce112_stream_encoder_create(
  355. enum engine_id eng_id,
  356. struct dc_context *ctx)
  357. {
  358. struct dce110_stream_encoder *enc110 =
  359. kzalloc(sizeof(struct dce110_stream_encoder), GFP_KERNEL);
  360. if (!enc110)
  361. return NULL;
  362. if (dce110_stream_encoder_construct(
  363. enc110, ctx, ctx->dc_bios, eng_id,
  364. &stream_enc_regs[eng_id], &se_shift, &se_mask))
  365. return &enc110->base;
  366. BREAK_TO_DEBUGGER();
  367. kfree(enc110);
  368. return NULL;
  369. }
  370. #define SRII(reg_name, block, id)\
  371. .reg_name[id] = mm ## block ## id ## _ ## reg_name
  372. static const struct dce_hwseq_registers hwseq_reg = {
  373. HWSEQ_DCE112_REG_LIST()
  374. };
  375. static const struct dce_hwseq_shift hwseq_shift = {
  376. HWSEQ_DCE112_MASK_SH_LIST(__SHIFT)
  377. };
  378. static const struct dce_hwseq_mask hwseq_mask = {
  379. HWSEQ_DCE112_MASK_SH_LIST(_MASK)
  380. };
  381. static struct dce_hwseq *dce112_hwseq_create(
  382. struct dc_context *ctx)
  383. {
  384. struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
  385. if (hws) {
  386. hws->ctx = ctx;
  387. hws->regs = &hwseq_reg;
  388. hws->shifts = &hwseq_shift;
  389. hws->masks = &hwseq_mask;
  390. }
  391. return hws;
  392. }
  393. static const struct resource_create_funcs res_create_funcs = {
  394. .read_dce_straps = read_dce_straps,
  395. .create_audio = create_audio,
  396. .create_stream_encoder = dce112_stream_encoder_create,
  397. .create_hwseq = dce112_hwseq_create,
  398. };
  399. #define mi_inst_regs(id) { MI_DCE11_2_REG_LIST(id) }
  400. static const struct dce_mem_input_registers mi_regs[] = {
  401. mi_inst_regs(0),
  402. mi_inst_regs(1),
  403. mi_inst_regs(2),
  404. mi_inst_regs(3),
  405. mi_inst_regs(4),
  406. mi_inst_regs(5),
  407. };
  408. static const struct dce_mem_input_shift mi_shifts = {
  409. MI_DCE11_2_MASK_SH_LIST(__SHIFT)
  410. };
  411. static const struct dce_mem_input_mask mi_masks = {
  412. MI_DCE11_2_MASK_SH_LIST(_MASK)
  413. };
  414. static struct mem_input *dce112_mem_input_create(
  415. struct dc_context *ctx,
  416. uint32_t inst)
  417. {
  418. struct dce_mem_input *dce_mi = kzalloc(sizeof(struct dce_mem_input),
  419. GFP_KERNEL);
  420. if (!dce_mi) {
  421. BREAK_TO_DEBUGGER();
  422. return NULL;
  423. }
  424. dce112_mem_input_construct(dce_mi, ctx, inst, &mi_regs[inst], &mi_shifts, &mi_masks);
  425. return &dce_mi->base;
  426. }
  427. static void dce112_transform_destroy(struct transform **xfm)
  428. {
  429. kfree(TO_DCE_TRANSFORM(*xfm));
  430. *xfm = NULL;
  431. }
  432. static struct transform *dce112_transform_create(
  433. struct dc_context *ctx,
  434. uint32_t inst)
  435. {
  436. struct dce_transform *transform =
  437. kzalloc(sizeof(struct dce_transform), GFP_KERNEL);
  438. if (!transform)
  439. return NULL;
  440. if (dce_transform_construct(transform, ctx, inst,
  441. &xfm_regs[inst], &xfm_shift, &xfm_mask)) {
  442. transform->lb_memory_size = 0x1404; /*5124*/
  443. return &transform->base;
  444. }
  445. BREAK_TO_DEBUGGER();
  446. kfree(transform);
  447. return NULL;
  448. }
  449. static const struct encoder_feature_support link_enc_feature = {
  450. .max_hdmi_deep_color = COLOR_DEPTH_121212,
  451. .max_hdmi_pixel_clock = 600000,
  452. .ycbcr420_supported = true,
  453. .flags.bits.IS_HBR2_CAPABLE = true,
  454. .flags.bits.IS_HBR3_CAPABLE = true,
  455. .flags.bits.IS_TPS3_CAPABLE = true,
  456. .flags.bits.IS_TPS4_CAPABLE = true,
  457. .flags.bits.IS_YCBCR_CAPABLE = true
  458. };
  459. struct link_encoder *dce112_link_encoder_create(
  460. const struct encoder_init_data *enc_init_data)
  461. {
  462. struct dce110_link_encoder *enc110 =
  463. kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
  464. if (!enc110)
  465. return NULL;
  466. if (dce110_link_encoder_construct(
  467. enc110,
  468. enc_init_data,
  469. &link_enc_feature,
  470. &link_enc_regs[enc_init_data->transmitter],
  471. &link_enc_aux_regs[enc_init_data->channel - 1],
  472. &link_enc_hpd_regs[enc_init_data->hpd_source])) {
  473. return &enc110->base;
  474. }
  475. BREAK_TO_DEBUGGER();
  476. kfree(enc110);
  477. return NULL;
  478. }
  479. static struct input_pixel_processor *dce112_ipp_create(
  480. struct dc_context *ctx, uint32_t inst)
  481. {
  482. struct dce_ipp *ipp = kzalloc(sizeof(struct dce_ipp), GFP_KERNEL);
  483. if (!ipp) {
  484. BREAK_TO_DEBUGGER();
  485. return NULL;
  486. }
  487. dce_ipp_construct(ipp, ctx, inst,
  488. &ipp_regs[inst], &ipp_shift, &ipp_mask);
  489. return &ipp->base;
  490. }
  491. struct output_pixel_processor *dce112_opp_create(
  492. struct dc_context *ctx,
  493. uint32_t inst)
  494. {
  495. struct dce110_opp *opp =
  496. kzalloc(sizeof(struct dce110_opp), GFP_KERNEL);
  497. if (!opp)
  498. return NULL;
  499. if (dce110_opp_construct(opp,
  500. ctx, inst, &opp_regs[inst], &opp_shift, &opp_mask))
  501. return &opp->base;
  502. BREAK_TO_DEBUGGER();
  503. kfree(opp);
  504. return NULL;
  505. }
  506. struct clock_source *dce112_clock_source_create(
  507. struct dc_context *ctx,
  508. struct dc_bios *bios,
  509. enum clock_source_id id,
  510. const struct dce110_clk_src_regs *regs,
  511. bool dp_clk_src)
  512. {
  513. struct dce110_clk_src *clk_src =
  514. kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
  515. if (!clk_src)
  516. return NULL;
  517. if (dce110_clk_src_construct(clk_src, ctx, bios, id,
  518. regs, &cs_shift, &cs_mask)) {
  519. clk_src->base.dp_clk_src = dp_clk_src;
  520. return &clk_src->base;
  521. }
  522. BREAK_TO_DEBUGGER();
  523. return NULL;
  524. }
  525. void dce112_clock_source_destroy(struct clock_source **clk_src)
  526. {
  527. kfree(TO_DCE110_CLK_SRC(*clk_src));
  528. *clk_src = NULL;
  529. }
  530. static void destruct(struct dce110_resource_pool *pool)
  531. {
  532. unsigned int i;
  533. for (i = 0; i < pool->base.pipe_count; i++) {
  534. if (pool->base.opps[i] != NULL)
  535. dce110_opp_destroy(&pool->base.opps[i]);
  536. if (pool->base.transforms[i] != NULL)
  537. dce112_transform_destroy(&pool->base.transforms[i]);
  538. if (pool->base.ipps[i] != NULL)
  539. dce_ipp_destroy(&pool->base.ipps[i]);
  540. if (pool->base.mis[i] != NULL) {
  541. kfree(TO_DCE_MEM_INPUT(pool->base.mis[i]));
  542. pool->base.mis[i] = NULL;
  543. }
  544. if (pool->base.timing_generators[i] != NULL) {
  545. kfree(DCE110TG_FROM_TG(pool->base.timing_generators[i]));
  546. pool->base.timing_generators[i] = NULL;
  547. }
  548. }
  549. for (i = 0; i < pool->base.stream_enc_count; i++) {
  550. if (pool->base.stream_enc[i] != NULL)
  551. kfree(DCE110STRENC_FROM_STRENC(pool->base.stream_enc[i]));
  552. }
  553. for (i = 0; i < pool->base.clk_src_count; i++) {
  554. if (pool->base.clock_sources[i] != NULL) {
  555. dce112_clock_source_destroy(&pool->base.clock_sources[i]);
  556. }
  557. }
  558. if (pool->base.dp_clock_source != NULL)
  559. dce112_clock_source_destroy(&pool->base.dp_clock_source);
  560. for (i = 0; i < pool->base.audio_count; i++) {
  561. if (pool->base.audios[i] != NULL) {
  562. dce_aud_destroy(&pool->base.audios[i]);
  563. }
  564. }
  565. if (pool->base.abm != NULL)
  566. dce_abm_destroy(&pool->base.abm);
  567. if (pool->base.dmcu != NULL)
  568. dce_dmcu_destroy(&pool->base.dmcu);
  569. if (pool->base.display_clock != NULL)
  570. dce_disp_clk_destroy(&pool->base.display_clock);
  571. if (pool->base.irqs != NULL) {
  572. dal_irq_service_destroy(&pool->base.irqs);
  573. }
  574. }
  575. static struct clock_source *find_matching_pll(
  576. struct resource_context *res_ctx,
  577. const struct resource_pool *pool,
  578. const struct dc_stream_state *const stream)
  579. {
  580. switch (stream->sink->link->link_enc->transmitter) {
  581. case TRANSMITTER_UNIPHY_A:
  582. return pool->clock_sources[DCE112_CLK_SRC_PLL0];
  583. case TRANSMITTER_UNIPHY_B:
  584. return pool->clock_sources[DCE112_CLK_SRC_PLL1];
  585. case TRANSMITTER_UNIPHY_C:
  586. return pool->clock_sources[DCE112_CLK_SRC_PLL2];
  587. case TRANSMITTER_UNIPHY_D:
  588. return pool->clock_sources[DCE112_CLK_SRC_PLL3];
  589. case TRANSMITTER_UNIPHY_E:
  590. return pool->clock_sources[DCE112_CLK_SRC_PLL4];
  591. case TRANSMITTER_UNIPHY_F:
  592. return pool->clock_sources[DCE112_CLK_SRC_PLL5];
  593. default:
  594. return NULL;
  595. };
  596. return 0;
  597. }
  598. static enum dc_status build_mapped_resource(
  599. const struct dc *dc,
  600. struct dc_state *context,
  601. struct dc_stream_state *stream)
  602. {
  603. enum dc_status status = DC_OK;
  604. struct pipe_ctx *pipe_ctx = resource_get_head_pipe_for_stream(&context->res_ctx, stream);
  605. if (!pipe_ctx)
  606. return DC_ERROR_UNEXPECTED;
  607. status = dce110_resource_build_pipe_hw_param(pipe_ctx);
  608. if (status != DC_OK)
  609. return status;
  610. resource_build_info_frame(pipe_ctx);
  611. return DC_OK;
  612. }
  613. bool dce112_validate_bandwidth(
  614. struct dc *dc,
  615. struct dc_state *context)
  616. {
  617. bool result = false;
  618. dm_logger_write(
  619. dc->ctx->logger, LOG_BANDWIDTH_CALCS,
  620. "%s: start",
  621. __func__);
  622. if (bw_calcs(
  623. dc->ctx,
  624. dc->bw_dceip,
  625. dc->bw_vbios,
  626. context->res_ctx.pipe_ctx,
  627. dc->res_pool->pipe_count,
  628. &context->bw.dce))
  629. result = true;
  630. if (!result)
  631. dm_logger_write(dc->ctx->logger, LOG_BANDWIDTH_VALIDATION,
  632. "%s: Bandwidth validation failed!",
  633. __func__);
  634. if (memcmp(&dc->current_state->bw.dce,
  635. &context->bw.dce, sizeof(context->bw.dce))) {
  636. struct log_entry log_entry;
  637. dm_logger_open(
  638. dc->ctx->logger,
  639. &log_entry,
  640. LOG_BANDWIDTH_CALCS);
  641. dm_logger_append(&log_entry, "%s: finish,\n"
  642. "nbpMark_b: %d nbpMark_a: %d urgentMark_b: %d urgentMark_a: %d\n"
  643. "stutMark_b: %d stutMark_a: %d\n",
  644. __func__,
  645. context->bw.dce.nbp_state_change_wm_ns[0].b_mark,
  646. context->bw.dce.nbp_state_change_wm_ns[0].a_mark,
  647. context->bw.dce.urgent_wm_ns[0].b_mark,
  648. context->bw.dce.urgent_wm_ns[0].a_mark,
  649. context->bw.dce.stutter_exit_wm_ns[0].b_mark,
  650. context->bw.dce.stutter_exit_wm_ns[0].a_mark);
  651. dm_logger_append(&log_entry,
  652. "nbpMark_b: %d nbpMark_a: %d urgentMark_b: %d urgentMark_a: %d\n"
  653. "stutMark_b: %d stutMark_a: %d\n",
  654. context->bw.dce.nbp_state_change_wm_ns[1].b_mark,
  655. context->bw.dce.nbp_state_change_wm_ns[1].a_mark,
  656. context->bw.dce.urgent_wm_ns[1].b_mark,
  657. context->bw.dce.urgent_wm_ns[1].a_mark,
  658. context->bw.dce.stutter_exit_wm_ns[1].b_mark,
  659. context->bw.dce.stutter_exit_wm_ns[1].a_mark);
  660. dm_logger_append(&log_entry,
  661. "nbpMark_b: %d nbpMark_a: %d urgentMark_b: %d urgentMark_a: %d\n"
  662. "stutMark_b: %d stutMark_a: %d stutter_mode_enable: %d\n",
  663. context->bw.dce.nbp_state_change_wm_ns[2].b_mark,
  664. context->bw.dce.nbp_state_change_wm_ns[2].a_mark,
  665. context->bw.dce.urgent_wm_ns[2].b_mark,
  666. context->bw.dce.urgent_wm_ns[2].a_mark,
  667. context->bw.dce.stutter_exit_wm_ns[2].b_mark,
  668. context->bw.dce.stutter_exit_wm_ns[2].a_mark,
  669. context->bw.dce.stutter_mode_enable);
  670. dm_logger_append(&log_entry,
  671. "cstate: %d pstate: %d nbpstate: %d sync: %d dispclk: %d\n"
  672. "sclk: %d sclk_sleep: %d yclk: %d blackout_recovery_time_us: %d\n",
  673. context->bw.dce.cpuc_state_change_enable,
  674. context->bw.dce.cpup_state_change_enable,
  675. context->bw.dce.nbp_state_change_enable,
  676. context->bw.dce.all_displays_in_sync,
  677. context->bw.dce.dispclk_khz,
  678. context->bw.dce.sclk_khz,
  679. context->bw.dce.sclk_deep_sleep_khz,
  680. context->bw.dce.yclk_khz,
  681. context->bw.dce.blackout_recovery_time_us);
  682. dm_logger_close(&log_entry);
  683. }
  684. return result;
  685. }
  686. enum dc_status resource_map_phy_clock_resources(
  687. const struct dc *dc,
  688. struct dc_state *context,
  689. struct dc_stream_state *stream)
  690. {
  691. /* acquire new resources */
  692. struct pipe_ctx *pipe_ctx = resource_get_head_pipe_for_stream(
  693. &context->res_ctx, stream);
  694. if (!pipe_ctx)
  695. return DC_ERROR_UNEXPECTED;
  696. if (dc_is_dp_signal(pipe_ctx->stream->signal)
  697. || pipe_ctx->stream->signal == SIGNAL_TYPE_VIRTUAL)
  698. pipe_ctx->clock_source =
  699. dc->res_pool->dp_clock_source;
  700. else
  701. pipe_ctx->clock_source = find_matching_pll(
  702. &context->res_ctx, dc->res_pool,
  703. stream);
  704. if (pipe_ctx->clock_source == NULL)
  705. return DC_NO_CLOCK_SOURCE_RESOURCE;
  706. resource_reference_clock_source(
  707. &context->res_ctx,
  708. dc->res_pool,
  709. pipe_ctx->clock_source);
  710. return DC_OK;
  711. }
  712. static bool dce112_validate_surface_sets(
  713. struct dc_state *context)
  714. {
  715. int i;
  716. for (i = 0; i < context->stream_count; i++) {
  717. if (context->stream_status[i].plane_count == 0)
  718. continue;
  719. if (context->stream_status[i].plane_count > 1)
  720. return false;
  721. if (context->stream_status[i].plane_states[0]->format
  722. >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN)
  723. return false;
  724. }
  725. return true;
  726. }
  727. enum dc_status dce112_add_stream_to_ctx(
  728. struct dc *dc,
  729. struct dc_state *new_ctx,
  730. struct dc_stream_state *dc_stream)
  731. {
  732. enum dc_status result = DC_ERROR_UNEXPECTED;
  733. result = resource_map_pool_resources(dc, new_ctx, dc_stream);
  734. if (result == DC_OK)
  735. result = resource_map_phy_clock_resources(dc, new_ctx, dc_stream);
  736. if (result == DC_OK)
  737. result = build_mapped_resource(dc, new_ctx, dc_stream);
  738. return result;
  739. }
  740. enum dc_status dce112_validate_guaranteed(
  741. struct dc *dc,
  742. struct dc_stream_state *stream,
  743. struct dc_state *context)
  744. {
  745. enum dc_status result = DC_ERROR_UNEXPECTED;
  746. context->streams[0] = stream;
  747. dc_stream_retain(context->streams[0]);
  748. context->stream_count++;
  749. result = resource_map_pool_resources(dc, context, stream);
  750. if (result == DC_OK)
  751. result = resource_map_phy_clock_resources(dc, context, stream);
  752. if (result == DC_OK)
  753. result = build_mapped_resource(dc, context, stream);
  754. if (result == DC_OK) {
  755. validate_guaranteed_copy_streams(
  756. context, dc->caps.max_streams);
  757. result = resource_build_scaling_params_for_context(dc, context);
  758. }
  759. if (result == DC_OK)
  760. if (!dce112_validate_bandwidth(dc, context))
  761. result = DC_FAIL_BANDWIDTH_VALIDATE;
  762. return result;
  763. }
  764. enum dc_status dce112_validate_global(
  765. struct dc *dc,
  766. struct dc_state *context)
  767. {
  768. if (!dce112_validate_surface_sets(context))
  769. return DC_FAIL_SURFACE_VALIDATE;
  770. return DC_OK;
  771. }
  772. static void dce112_destroy_resource_pool(struct resource_pool **pool)
  773. {
  774. struct dce110_resource_pool *dce110_pool = TO_DCE110_RES_POOL(*pool);
  775. destruct(dce110_pool);
  776. kfree(dce110_pool);
  777. *pool = NULL;
  778. }
  779. static const struct resource_funcs dce112_res_pool_funcs = {
  780. .destroy = dce112_destroy_resource_pool,
  781. .link_enc_create = dce112_link_encoder_create,
  782. .validate_guaranteed = dce112_validate_guaranteed,
  783. .validate_bandwidth = dce112_validate_bandwidth,
  784. .validate_plane = dce100_validate_plane,
  785. .add_stream_to_ctx = dce112_add_stream_to_ctx,
  786. .validate_global = dce112_validate_global
  787. };
  788. static void bw_calcs_data_update_from_pplib(struct dc *dc)
  789. {
  790. struct dm_pp_clock_levels_with_latency eng_clks = {0};
  791. struct dm_pp_clock_levels_with_latency mem_clks = {0};
  792. struct dm_pp_wm_sets_with_clock_ranges clk_ranges = {0};
  793. struct dm_pp_clock_levels clks = {0};
  794. /*do system clock TODO PPLIB: after PPLIB implement,
  795. * then remove old way
  796. */
  797. if (!dm_pp_get_clock_levels_by_type_with_latency(
  798. dc->ctx,
  799. DM_PP_CLOCK_TYPE_ENGINE_CLK,
  800. &eng_clks)) {
  801. /* This is only for temporary */
  802. dm_pp_get_clock_levels_by_type(
  803. dc->ctx,
  804. DM_PP_CLOCK_TYPE_ENGINE_CLK,
  805. &clks);
  806. /* convert all the clock fro kHz to fix point mHz */
  807. dc->bw_vbios->high_sclk = bw_frc_to_fixed(
  808. clks.clocks_in_khz[clks.num_levels-1], 1000);
  809. dc->bw_vbios->mid1_sclk = bw_frc_to_fixed(
  810. clks.clocks_in_khz[clks.num_levels/8], 1000);
  811. dc->bw_vbios->mid2_sclk = bw_frc_to_fixed(
  812. clks.clocks_in_khz[clks.num_levels*2/8], 1000);
  813. dc->bw_vbios->mid3_sclk = bw_frc_to_fixed(
  814. clks.clocks_in_khz[clks.num_levels*3/8], 1000);
  815. dc->bw_vbios->mid4_sclk = bw_frc_to_fixed(
  816. clks.clocks_in_khz[clks.num_levels*4/8], 1000);
  817. dc->bw_vbios->mid5_sclk = bw_frc_to_fixed(
  818. clks.clocks_in_khz[clks.num_levels*5/8], 1000);
  819. dc->bw_vbios->mid6_sclk = bw_frc_to_fixed(
  820. clks.clocks_in_khz[clks.num_levels*6/8], 1000);
  821. dc->bw_vbios->low_sclk = bw_frc_to_fixed(
  822. clks.clocks_in_khz[0], 1000);
  823. /*do memory clock*/
  824. dm_pp_get_clock_levels_by_type(
  825. dc->ctx,
  826. DM_PP_CLOCK_TYPE_MEMORY_CLK,
  827. &clks);
  828. dc->bw_vbios->low_yclk = bw_frc_to_fixed(
  829. clks.clocks_in_khz[0] * MEMORY_TYPE_MULTIPLIER, 1000);
  830. dc->bw_vbios->mid_yclk = bw_frc_to_fixed(
  831. clks.clocks_in_khz[clks.num_levels>>1] * MEMORY_TYPE_MULTIPLIER,
  832. 1000);
  833. dc->bw_vbios->high_yclk = bw_frc_to_fixed(
  834. clks.clocks_in_khz[clks.num_levels-1] * MEMORY_TYPE_MULTIPLIER,
  835. 1000);
  836. return;
  837. }
  838. /* convert all the clock fro kHz to fix point mHz TODO: wloop data */
  839. dc->bw_vbios->high_sclk = bw_frc_to_fixed(
  840. eng_clks.data[eng_clks.num_levels-1].clocks_in_khz, 1000);
  841. dc->bw_vbios->mid1_sclk = bw_frc_to_fixed(
  842. eng_clks.data[eng_clks.num_levels/8].clocks_in_khz, 1000);
  843. dc->bw_vbios->mid2_sclk = bw_frc_to_fixed(
  844. eng_clks.data[eng_clks.num_levels*2/8].clocks_in_khz, 1000);
  845. dc->bw_vbios->mid3_sclk = bw_frc_to_fixed(
  846. eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz, 1000);
  847. dc->bw_vbios->mid4_sclk = bw_frc_to_fixed(
  848. eng_clks.data[eng_clks.num_levels*4/8].clocks_in_khz, 1000);
  849. dc->bw_vbios->mid5_sclk = bw_frc_to_fixed(
  850. eng_clks.data[eng_clks.num_levels*5/8].clocks_in_khz, 1000);
  851. dc->bw_vbios->mid6_sclk = bw_frc_to_fixed(
  852. eng_clks.data[eng_clks.num_levels*6/8].clocks_in_khz, 1000);
  853. dc->bw_vbios->low_sclk = bw_frc_to_fixed(
  854. eng_clks.data[0].clocks_in_khz, 1000);
  855. /*do memory clock*/
  856. dm_pp_get_clock_levels_by_type_with_latency(
  857. dc->ctx,
  858. DM_PP_CLOCK_TYPE_MEMORY_CLK,
  859. &mem_clks);
  860. /* we don't need to call PPLIB for validation clock since they
  861. * also give us the highest sclk and highest mclk (UMA clock).
  862. * ALSO always convert UMA clock (from PPLIB) to YCLK (HW formula):
  863. * YCLK = UMACLK*m_memoryTypeMultiplier
  864. */
  865. dc->bw_vbios->low_yclk = bw_frc_to_fixed(
  866. mem_clks.data[0].clocks_in_khz * MEMORY_TYPE_MULTIPLIER, 1000);
  867. dc->bw_vbios->mid_yclk = bw_frc_to_fixed(
  868. mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz * MEMORY_TYPE_MULTIPLIER,
  869. 1000);
  870. dc->bw_vbios->high_yclk = bw_frc_to_fixed(
  871. mem_clks.data[mem_clks.num_levels-1].clocks_in_khz * MEMORY_TYPE_MULTIPLIER,
  872. 1000);
  873. /* Now notify PPLib/SMU about which Watermarks sets they should select
  874. * depending on DPM state they are in. And update BW MGR GFX Engine and
  875. * Memory clock member variables for Watermarks calculations for each
  876. * Watermark Set
  877. */
  878. clk_ranges.num_wm_sets = 4;
  879. clk_ranges.wm_clk_ranges[0].wm_set_id = WM_SET_A;
  880. clk_ranges.wm_clk_ranges[0].wm_min_eng_clk_in_khz =
  881. eng_clks.data[0].clocks_in_khz;
  882. clk_ranges.wm_clk_ranges[0].wm_max_eng_clk_in_khz =
  883. eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz - 1;
  884. clk_ranges.wm_clk_ranges[0].wm_min_memg_clk_in_khz =
  885. mem_clks.data[0].clocks_in_khz;
  886. clk_ranges.wm_clk_ranges[0].wm_max_mem_clk_in_khz =
  887. mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz - 1;
  888. clk_ranges.wm_clk_ranges[1].wm_set_id = WM_SET_B;
  889. clk_ranges.wm_clk_ranges[1].wm_min_eng_clk_in_khz =
  890. eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz;
  891. /* 5 GHz instead of data[7].clockInKHz to cover Overdrive */
  892. clk_ranges.wm_clk_ranges[1].wm_max_eng_clk_in_khz = 5000000;
  893. clk_ranges.wm_clk_ranges[1].wm_min_memg_clk_in_khz =
  894. mem_clks.data[0].clocks_in_khz;
  895. clk_ranges.wm_clk_ranges[1].wm_max_mem_clk_in_khz =
  896. mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz - 1;
  897. clk_ranges.wm_clk_ranges[2].wm_set_id = WM_SET_C;
  898. clk_ranges.wm_clk_ranges[2].wm_min_eng_clk_in_khz =
  899. eng_clks.data[0].clocks_in_khz;
  900. clk_ranges.wm_clk_ranges[2].wm_max_eng_clk_in_khz =
  901. eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz - 1;
  902. clk_ranges.wm_clk_ranges[2].wm_min_memg_clk_in_khz =
  903. mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz;
  904. /* 5 GHz instead of data[2].clockInKHz to cover Overdrive */
  905. clk_ranges.wm_clk_ranges[2].wm_max_mem_clk_in_khz = 5000000;
  906. clk_ranges.wm_clk_ranges[3].wm_set_id = WM_SET_D;
  907. clk_ranges.wm_clk_ranges[3].wm_min_eng_clk_in_khz =
  908. eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz;
  909. /* 5 GHz instead of data[7].clockInKHz to cover Overdrive */
  910. clk_ranges.wm_clk_ranges[3].wm_max_eng_clk_in_khz = 5000000;
  911. clk_ranges.wm_clk_ranges[3].wm_min_memg_clk_in_khz =
  912. mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz;
  913. /* 5 GHz instead of data[2].clockInKHz to cover Overdrive */
  914. clk_ranges.wm_clk_ranges[3].wm_max_mem_clk_in_khz = 5000000;
  915. /* Notify PP Lib/SMU which Watermarks to use for which clock ranges */
  916. dm_pp_notify_wm_clock_changes(dc->ctx, &clk_ranges);
  917. }
  918. const struct resource_caps *dce112_resource_cap(
  919. struct hw_asic_id *asic_id)
  920. {
  921. if (ASIC_REV_IS_POLARIS11_M(asic_id->hw_internal_rev) ||
  922. ASIC_REV_IS_POLARIS12_V(asic_id->hw_internal_rev))
  923. return &polaris_11_resource_cap;
  924. else
  925. return &polaris_10_resource_cap;
  926. }
  927. static bool construct(
  928. uint8_t num_virtual_links,
  929. struct dc *dc,
  930. struct dce110_resource_pool *pool)
  931. {
  932. unsigned int i;
  933. struct dc_context *ctx = dc->ctx;
  934. struct dm_pp_static_clock_info static_clk_info = {0};
  935. ctx->dc_bios->regs = &bios_regs;
  936. pool->base.res_cap = dce112_resource_cap(&ctx->asic_id);
  937. pool->base.funcs = &dce112_res_pool_funcs;
  938. /*************************************************
  939. * Resource + asic cap harcoding *
  940. *************************************************/
  941. pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
  942. pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
  943. dc->caps.max_downscale_ratio = 200;
  944. dc->caps.i2c_speed_in_khz = 100;
  945. dc->caps.max_cursor_size = 128;
  946. /*************************************************
  947. * Create resources *
  948. *************************************************/
  949. pool->base.clock_sources[DCE112_CLK_SRC_PLL0] =
  950. dce112_clock_source_create(
  951. ctx, ctx->dc_bios,
  952. CLOCK_SOURCE_COMBO_PHY_PLL0,
  953. &clk_src_regs[0], false);
  954. pool->base.clock_sources[DCE112_CLK_SRC_PLL1] =
  955. dce112_clock_source_create(
  956. ctx, ctx->dc_bios,
  957. CLOCK_SOURCE_COMBO_PHY_PLL1,
  958. &clk_src_regs[1], false);
  959. pool->base.clock_sources[DCE112_CLK_SRC_PLL2] =
  960. dce112_clock_source_create(
  961. ctx, ctx->dc_bios,
  962. CLOCK_SOURCE_COMBO_PHY_PLL2,
  963. &clk_src_regs[2], false);
  964. pool->base.clock_sources[DCE112_CLK_SRC_PLL3] =
  965. dce112_clock_source_create(
  966. ctx, ctx->dc_bios,
  967. CLOCK_SOURCE_COMBO_PHY_PLL3,
  968. &clk_src_regs[3], false);
  969. pool->base.clock_sources[DCE112_CLK_SRC_PLL4] =
  970. dce112_clock_source_create(
  971. ctx, ctx->dc_bios,
  972. CLOCK_SOURCE_COMBO_PHY_PLL4,
  973. &clk_src_regs[4], false);
  974. pool->base.clock_sources[DCE112_CLK_SRC_PLL5] =
  975. dce112_clock_source_create(
  976. ctx, ctx->dc_bios,
  977. CLOCK_SOURCE_COMBO_PHY_PLL5,
  978. &clk_src_regs[5], false);
  979. pool->base.clk_src_count = DCE112_CLK_SRC_TOTAL;
  980. pool->base.dp_clock_source = dce112_clock_source_create(
  981. ctx, ctx->dc_bios,
  982. CLOCK_SOURCE_ID_DP_DTO, &clk_src_regs[0], true);
  983. for (i = 0; i < pool->base.clk_src_count; i++) {
  984. if (pool->base.clock_sources[i] == NULL) {
  985. dm_error("DC: failed to create clock sources!\n");
  986. BREAK_TO_DEBUGGER();
  987. goto res_create_fail;
  988. }
  989. }
  990. pool->base.display_clock = dce112_disp_clk_create(ctx,
  991. &disp_clk_regs,
  992. &disp_clk_shift,
  993. &disp_clk_mask);
  994. if (pool->base.display_clock == NULL) {
  995. dm_error("DC: failed to create display clock!\n");
  996. BREAK_TO_DEBUGGER();
  997. goto res_create_fail;
  998. }
  999. pool->base.dmcu = dce_dmcu_create(ctx,
  1000. &dmcu_regs,
  1001. &dmcu_shift,
  1002. &dmcu_mask);
  1003. if (pool->base.dmcu == NULL) {
  1004. dm_error("DC: failed to create dmcu!\n");
  1005. BREAK_TO_DEBUGGER();
  1006. goto res_create_fail;
  1007. }
  1008. pool->base.abm = dce_abm_create(ctx,
  1009. &abm_regs,
  1010. &abm_shift,
  1011. &abm_mask);
  1012. if (pool->base.abm == NULL) {
  1013. dm_error("DC: failed to create abm!\n");
  1014. BREAK_TO_DEBUGGER();
  1015. goto res_create_fail;
  1016. }
  1017. /* get static clock information for PPLIB or firmware, save
  1018. * max_clock_state
  1019. */
  1020. if (dm_pp_get_static_clocks(ctx, &static_clk_info))
  1021. pool->base.display_clock->max_clks_state =
  1022. static_clk_info.max_clocks_state;
  1023. {
  1024. struct irq_service_init_data init_data;
  1025. init_data.ctx = dc->ctx;
  1026. pool->base.irqs = dal_irq_service_dce110_create(&init_data);
  1027. if (!pool->base.irqs)
  1028. goto res_create_fail;
  1029. }
  1030. for (i = 0; i < pool->base.pipe_count; i++) {
  1031. pool->base.timing_generators[i] =
  1032. dce112_timing_generator_create(
  1033. ctx,
  1034. i,
  1035. &dce112_tg_offsets[i]);
  1036. if (pool->base.timing_generators[i] == NULL) {
  1037. BREAK_TO_DEBUGGER();
  1038. dm_error("DC: failed to create tg!\n");
  1039. goto res_create_fail;
  1040. }
  1041. pool->base.mis[i] = dce112_mem_input_create(ctx, i);
  1042. if (pool->base.mis[i] == NULL) {
  1043. BREAK_TO_DEBUGGER();
  1044. dm_error(
  1045. "DC: failed to create memory input!\n");
  1046. goto res_create_fail;
  1047. }
  1048. pool->base.ipps[i] = dce112_ipp_create(ctx, i);
  1049. if (pool->base.ipps[i] == NULL) {
  1050. BREAK_TO_DEBUGGER();
  1051. dm_error(
  1052. "DC:failed to create input pixel processor!\n");
  1053. goto res_create_fail;
  1054. }
  1055. pool->base.transforms[i] = dce112_transform_create(ctx, i);
  1056. if (pool->base.transforms[i] == NULL) {
  1057. BREAK_TO_DEBUGGER();
  1058. dm_error(
  1059. "DC: failed to create transform!\n");
  1060. goto res_create_fail;
  1061. }
  1062. pool->base.opps[i] = dce112_opp_create(
  1063. ctx,
  1064. i);
  1065. if (pool->base.opps[i] == NULL) {
  1066. BREAK_TO_DEBUGGER();
  1067. dm_error(
  1068. "DC:failed to create output pixel processor!\n");
  1069. goto res_create_fail;
  1070. }
  1071. }
  1072. if (!resource_construct(num_virtual_links, dc, &pool->base,
  1073. &res_create_funcs))
  1074. goto res_create_fail;
  1075. dc->caps.max_planes = pool->base.pipe_count;
  1076. /* Create hardware sequencer */
  1077. if (!dce112_hw_sequencer_construct(dc))
  1078. goto res_create_fail;
  1079. bw_calcs_init(dc->bw_dceip, dc->bw_vbios, dc->ctx->asic_id);
  1080. bw_calcs_data_update_from_pplib(dc);
  1081. return true;
  1082. res_create_fail:
  1083. destruct(pool);
  1084. return false;
  1085. }
  1086. struct resource_pool *dce112_create_resource_pool(
  1087. uint8_t num_virtual_links,
  1088. struct dc *dc)
  1089. {
  1090. struct dce110_resource_pool *pool =
  1091. kzalloc(sizeof(struct dce110_resource_pool), GFP_KERNEL);
  1092. if (!pool)
  1093. return NULL;
  1094. if (construct(num_virtual_links, dc, pool))
  1095. return &pool->base;
  1096. BREAK_TO_DEBUGGER();
  1097. return NULL;
  1098. }