dce80_resource.c 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350
  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 "dce/dce_8_0_d.h"
  26. #include "dce/dce_8_0_sh_mask.h"
  27. #include "dm_services.h"
  28. #include "link_encoder.h"
  29. #include "stream_encoder.h"
  30. #include "resource.h"
  31. #include "include/irq_service_interface.h"
  32. #include "irq/dce80/irq_service_dce80.h"
  33. #include "dce110/dce110_timing_generator.h"
  34. #include "dce110/dce110_resource.h"
  35. #include "dce80/dce80_timing_generator.h"
  36. #include "dce/dce_mem_input.h"
  37. #include "dce/dce_link_encoder.h"
  38. #include "dce/dce_stream_encoder.h"
  39. #include "dce/dce_mem_input.h"
  40. #include "dce/dce_ipp.h"
  41. #include "dce/dce_transform.h"
  42. #include "dce/dce_opp.h"
  43. #include "dce/dce_clocks.h"
  44. #include "dce/dce_clock_source.h"
  45. #include "dce/dce_audio.h"
  46. #include "dce/dce_hwseq.h"
  47. #include "dce80/dce80_hw_sequencer.h"
  48. #include "dce100/dce100_resource.h"
  49. #include "reg_helper.h"
  50. #include "dce/dce_dmcu.h"
  51. #include "dce/dce_abm.h"
  52. /* TODO remove this include */
  53. #ifndef mmMC_HUB_RDREQ_DMIF_LIMIT
  54. #include "gmc/gmc_7_1_d.h"
  55. #include "gmc/gmc_7_1_sh_mask.h"
  56. #endif
  57. #ifndef mmDP_DPHY_INTERNAL_CTRL
  58. #define mmDP_DPHY_INTERNAL_CTRL 0x1CDE
  59. #define mmDP0_DP_DPHY_INTERNAL_CTRL 0x1CDE
  60. #define mmDP1_DP_DPHY_INTERNAL_CTRL 0x1FDE
  61. #define mmDP2_DP_DPHY_INTERNAL_CTRL 0x42DE
  62. #define mmDP3_DP_DPHY_INTERNAL_CTRL 0x45DE
  63. #define mmDP4_DP_DPHY_INTERNAL_CTRL 0x48DE
  64. #define mmDP5_DP_DPHY_INTERNAL_CTRL 0x4BDE
  65. #define mmDP6_DP_DPHY_INTERNAL_CTRL 0x4EDE
  66. #endif
  67. #ifndef mmBIOS_SCRATCH_2
  68. #define mmBIOS_SCRATCH_2 0x05CB
  69. #define mmBIOS_SCRATCH_6 0x05CF
  70. #endif
  71. #ifndef mmDP_DPHY_FAST_TRAINING
  72. #define mmDP_DPHY_FAST_TRAINING 0x1CCE
  73. #define mmDP0_DP_DPHY_FAST_TRAINING 0x1CCE
  74. #define mmDP1_DP_DPHY_FAST_TRAINING 0x1FCE
  75. #define mmDP2_DP_DPHY_FAST_TRAINING 0x42CE
  76. #define mmDP3_DP_DPHY_FAST_TRAINING 0x45CE
  77. #define mmDP4_DP_DPHY_FAST_TRAINING 0x48CE
  78. #define mmDP5_DP_DPHY_FAST_TRAINING 0x4BCE
  79. #define mmDP6_DP_DPHY_FAST_TRAINING 0x4ECE
  80. #endif
  81. #ifndef mmHPD_DC_HPD_CONTROL
  82. #define mmHPD_DC_HPD_CONTROL 0x189A
  83. #define mmHPD0_DC_HPD_CONTROL 0x189A
  84. #define mmHPD1_DC_HPD_CONTROL 0x18A2
  85. #define mmHPD2_DC_HPD_CONTROL 0x18AA
  86. #define mmHPD3_DC_HPD_CONTROL 0x18B2
  87. #define mmHPD4_DC_HPD_CONTROL 0x18BA
  88. #define mmHPD5_DC_HPD_CONTROL 0x18C2
  89. #endif
  90. #define DCE11_DIG_FE_CNTL 0x4a00
  91. #define DCE11_DIG_BE_CNTL 0x4a47
  92. #define DCE11_DP_SEC 0x4ac3
  93. static const struct dce110_timing_generator_offsets dce80_tg_offsets[] = {
  94. {
  95. .crtc = (mmCRTC0_CRTC_CONTROL - mmCRTC_CONTROL),
  96. .dcp = (mmGRPH_CONTROL - mmGRPH_CONTROL),
  97. .dmif = (mmDMIF_PG0_DPG_WATERMARK_MASK_CONTROL
  98. - mmDPG_WATERMARK_MASK_CONTROL),
  99. },
  100. {
  101. .crtc = (mmCRTC1_CRTC_CONTROL - mmCRTC_CONTROL),
  102. .dcp = (mmDCP1_GRPH_CONTROL - mmGRPH_CONTROL),
  103. .dmif = (mmDMIF_PG1_DPG_WATERMARK_MASK_CONTROL
  104. - mmDPG_WATERMARK_MASK_CONTROL),
  105. },
  106. {
  107. .crtc = (mmCRTC2_CRTC_CONTROL - mmCRTC_CONTROL),
  108. .dcp = (mmDCP2_GRPH_CONTROL - mmGRPH_CONTROL),
  109. .dmif = (mmDMIF_PG2_DPG_WATERMARK_MASK_CONTROL
  110. - mmDPG_WATERMARK_MASK_CONTROL),
  111. },
  112. {
  113. .crtc = (mmCRTC3_CRTC_CONTROL - mmCRTC_CONTROL),
  114. .dcp = (mmDCP3_GRPH_CONTROL - mmGRPH_CONTROL),
  115. .dmif = (mmDMIF_PG3_DPG_WATERMARK_MASK_CONTROL
  116. - mmDPG_WATERMARK_MASK_CONTROL),
  117. },
  118. {
  119. .crtc = (mmCRTC4_CRTC_CONTROL - mmCRTC_CONTROL),
  120. .dcp = (mmDCP4_GRPH_CONTROL - mmGRPH_CONTROL),
  121. .dmif = (mmDMIF_PG4_DPG_WATERMARK_MASK_CONTROL
  122. - mmDPG_WATERMARK_MASK_CONTROL),
  123. },
  124. {
  125. .crtc = (mmCRTC5_CRTC_CONTROL - mmCRTC_CONTROL),
  126. .dcp = (mmDCP5_GRPH_CONTROL - mmGRPH_CONTROL),
  127. .dmif = (mmDMIF_PG5_DPG_WATERMARK_MASK_CONTROL
  128. - mmDPG_WATERMARK_MASK_CONTROL),
  129. }
  130. };
  131. /* set register offset */
  132. #define SR(reg_name)\
  133. .reg_name = mm ## reg_name
  134. /* set register offset with instance */
  135. #define SRI(reg_name, block, id)\
  136. .reg_name = mm ## block ## id ## _ ## reg_name
  137. static const struct dce_disp_clk_registers disp_clk_regs = {
  138. CLK_COMMON_REG_LIST_DCE_BASE()
  139. };
  140. static const struct dce_disp_clk_shift disp_clk_shift = {
  141. CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
  142. };
  143. static const struct dce_disp_clk_mask disp_clk_mask = {
  144. CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
  145. };
  146. #define ipp_regs(id)\
  147. [id] = {\
  148. IPP_COMMON_REG_LIST_DCE_BASE(id)\
  149. }
  150. static const struct dce_ipp_registers ipp_regs[] = {
  151. ipp_regs(0),
  152. ipp_regs(1),
  153. ipp_regs(2),
  154. ipp_regs(3),
  155. ipp_regs(4),
  156. ipp_regs(5)
  157. };
  158. static const struct dce_ipp_shift ipp_shift = {
  159. IPP_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
  160. };
  161. static const struct dce_ipp_mask ipp_mask = {
  162. IPP_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
  163. };
  164. #define transform_regs(id)\
  165. [id] = {\
  166. XFM_COMMON_REG_LIST_DCE80(id)\
  167. }
  168. static const struct dce_transform_registers xfm_regs[] = {
  169. transform_regs(0),
  170. transform_regs(1),
  171. transform_regs(2),
  172. transform_regs(3),
  173. transform_regs(4),
  174. transform_regs(5)
  175. };
  176. static const struct dce_transform_shift xfm_shift = {
  177. XFM_COMMON_MASK_SH_LIST_DCE80(__SHIFT)
  178. };
  179. static const struct dce_transform_mask xfm_mask = {
  180. XFM_COMMON_MASK_SH_LIST_DCE80(_MASK)
  181. };
  182. #define aux_regs(id)\
  183. [id] = {\
  184. AUX_REG_LIST(id)\
  185. }
  186. static const struct dce110_link_enc_aux_registers link_enc_aux_regs[] = {
  187. aux_regs(0),
  188. aux_regs(1),
  189. aux_regs(2),
  190. aux_regs(3),
  191. aux_regs(4),
  192. aux_regs(5)
  193. };
  194. #define hpd_regs(id)\
  195. [id] = {\
  196. HPD_REG_LIST(id)\
  197. }
  198. static const struct dce110_link_enc_hpd_registers link_enc_hpd_regs[] = {
  199. hpd_regs(0),
  200. hpd_regs(1),
  201. hpd_regs(2),
  202. hpd_regs(3),
  203. hpd_regs(4),
  204. hpd_regs(5)
  205. };
  206. #define link_regs(id)\
  207. [id] = {\
  208. LE_DCE80_REG_LIST(id)\
  209. }
  210. static const struct dce110_link_enc_registers link_enc_regs[] = {
  211. link_regs(0),
  212. link_regs(1),
  213. link_regs(2),
  214. link_regs(3),
  215. link_regs(4),
  216. link_regs(5),
  217. link_regs(6),
  218. };
  219. #define stream_enc_regs(id)\
  220. [id] = {\
  221. SE_COMMON_REG_LIST_DCE_BASE(id),\
  222. .AFMT_CNTL = 0,\
  223. }
  224. static const struct dce110_stream_enc_registers stream_enc_regs[] = {
  225. stream_enc_regs(0),
  226. stream_enc_regs(1),
  227. stream_enc_regs(2),
  228. stream_enc_regs(3),
  229. stream_enc_regs(4),
  230. stream_enc_regs(5),
  231. stream_enc_regs(6)
  232. };
  233. static const struct dce_stream_encoder_shift se_shift = {
  234. SE_COMMON_MASK_SH_LIST_DCE80_100(__SHIFT)
  235. };
  236. static const struct dce_stream_encoder_mask se_mask = {
  237. SE_COMMON_MASK_SH_LIST_DCE80_100(_MASK)
  238. };
  239. #define opp_regs(id)\
  240. [id] = {\
  241. OPP_DCE_80_REG_LIST(id),\
  242. }
  243. static const struct dce_opp_registers opp_regs[] = {
  244. opp_regs(0),
  245. opp_regs(1),
  246. opp_regs(2),
  247. opp_regs(3),
  248. opp_regs(4),
  249. opp_regs(5)
  250. };
  251. static const struct dce_opp_shift opp_shift = {
  252. OPP_COMMON_MASK_SH_LIST_DCE_80(__SHIFT)
  253. };
  254. static const struct dce_opp_mask opp_mask = {
  255. OPP_COMMON_MASK_SH_LIST_DCE_80(_MASK)
  256. };
  257. #define audio_regs(id)\
  258. [id] = {\
  259. AUD_COMMON_REG_LIST(id)\
  260. }
  261. static const struct dce_audio_registers audio_regs[] = {
  262. audio_regs(0),
  263. audio_regs(1),
  264. audio_regs(2),
  265. audio_regs(3),
  266. audio_regs(4),
  267. audio_regs(5),
  268. audio_regs(6),
  269. };
  270. static const struct dce_audio_shift audio_shift = {
  271. AUD_COMMON_MASK_SH_LIST(__SHIFT)
  272. };
  273. static const struct dce_aduio_mask audio_mask = {
  274. AUD_COMMON_MASK_SH_LIST(_MASK)
  275. };
  276. #define clk_src_regs(id)\
  277. [id] = {\
  278. CS_COMMON_REG_LIST_DCE_80(id),\
  279. }
  280. static const struct dce110_clk_src_regs clk_src_regs[] = {
  281. clk_src_regs(0),
  282. clk_src_regs(1),
  283. clk_src_regs(2)
  284. };
  285. static const struct dce110_clk_src_shift cs_shift = {
  286. CS_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
  287. };
  288. static const struct dce110_clk_src_mask cs_mask = {
  289. CS_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
  290. };
  291. static const struct bios_registers bios_regs = {
  292. .BIOS_SCRATCH_6 = mmBIOS_SCRATCH_6
  293. };
  294. static const struct resource_caps res_cap = {
  295. .num_timing_generator = 6,
  296. .num_audio = 6,
  297. .num_stream_encoder = 6,
  298. .num_pll = 3,
  299. };
  300. static const struct resource_caps res_cap_81 = {
  301. .num_timing_generator = 4,
  302. .num_audio = 7,
  303. .num_stream_encoder = 7,
  304. .num_pll = 3,
  305. };
  306. static const struct resource_caps res_cap_83 = {
  307. .num_timing_generator = 2,
  308. .num_audio = 6,
  309. .num_stream_encoder = 6,
  310. .num_pll = 2,
  311. };
  312. static const struct dce_dmcu_registers dmcu_regs = {
  313. DMCU_DCE80_REG_LIST()
  314. };
  315. static const struct dce_dmcu_shift dmcu_shift = {
  316. DMCU_MASK_SH_LIST_DCE80(__SHIFT)
  317. };
  318. static const struct dce_dmcu_mask dmcu_mask = {
  319. DMCU_MASK_SH_LIST_DCE80(_MASK)
  320. };
  321. static const struct dce_abm_registers abm_regs = {
  322. ABM_DCE110_COMMON_REG_LIST()
  323. };
  324. static const struct dce_abm_shift abm_shift = {
  325. ABM_MASK_SH_LIST_DCE110(__SHIFT)
  326. };
  327. static const struct dce_abm_mask abm_mask = {
  328. ABM_MASK_SH_LIST_DCE110(_MASK)
  329. };
  330. #define CTX ctx
  331. #define REG(reg) mm ## reg
  332. #ifndef mmCC_DC_HDMI_STRAPS
  333. #define mmCC_DC_HDMI_STRAPS 0x1918
  334. #define CC_DC_HDMI_STRAPS__HDMI_DISABLE_MASK 0x40
  335. #define CC_DC_HDMI_STRAPS__HDMI_DISABLE__SHIFT 0x6
  336. #define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER_MASK 0x700
  337. #define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER__SHIFT 0x8
  338. #endif
  339. static void read_dce_straps(
  340. struct dc_context *ctx,
  341. struct resource_straps *straps)
  342. {
  343. REG_GET_2(CC_DC_HDMI_STRAPS,
  344. HDMI_DISABLE, &straps->hdmi_disable,
  345. AUDIO_STREAM_NUMBER, &straps->audio_stream_number);
  346. REG_GET(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO, &straps->dc_pinstraps_audio);
  347. }
  348. static struct audio *create_audio(
  349. struct dc_context *ctx, unsigned int inst)
  350. {
  351. return dce_audio_create(ctx, inst,
  352. &audio_regs[inst], &audio_shift, &audio_mask);
  353. }
  354. static struct timing_generator *dce80_timing_generator_create(
  355. struct dc_context *ctx,
  356. uint32_t instance,
  357. const struct dce110_timing_generator_offsets *offsets)
  358. {
  359. struct dce110_timing_generator *tg110 =
  360. kzalloc(sizeof(struct dce110_timing_generator), GFP_KERNEL);
  361. if (!tg110)
  362. return NULL;
  363. dce80_timing_generator_construct(tg110, ctx, instance, offsets);
  364. return &tg110->base;
  365. }
  366. static struct output_pixel_processor *dce80_opp_create(
  367. struct dc_context *ctx,
  368. uint32_t inst)
  369. {
  370. struct dce110_opp *opp =
  371. kzalloc(sizeof(struct dce110_opp), GFP_KERNEL);
  372. if (!opp)
  373. return NULL;
  374. dce110_opp_construct(opp,
  375. ctx, inst, &opp_regs[inst], &opp_shift, &opp_mask);
  376. return &opp->base;
  377. }
  378. static struct stream_encoder *dce80_stream_encoder_create(
  379. enum engine_id eng_id,
  380. struct dc_context *ctx)
  381. {
  382. struct dce110_stream_encoder *enc110 =
  383. kzalloc(sizeof(struct dce110_stream_encoder), GFP_KERNEL);
  384. if (!enc110)
  385. return NULL;
  386. dce110_stream_encoder_construct(enc110, ctx, ctx->dc_bios, eng_id,
  387. &stream_enc_regs[eng_id],
  388. &se_shift, &se_mask);
  389. return &enc110->base;
  390. }
  391. #define SRII(reg_name, block, id)\
  392. .reg_name[id] = mm ## block ## id ## _ ## reg_name
  393. static const struct dce_hwseq_registers hwseq_reg = {
  394. HWSEQ_DCE8_REG_LIST()
  395. };
  396. static const struct dce_hwseq_shift hwseq_shift = {
  397. HWSEQ_DCE8_MASK_SH_LIST(__SHIFT)
  398. };
  399. static const struct dce_hwseq_mask hwseq_mask = {
  400. HWSEQ_DCE8_MASK_SH_LIST(_MASK)
  401. };
  402. static struct dce_hwseq *dce80_hwseq_create(
  403. struct dc_context *ctx)
  404. {
  405. struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
  406. if (hws) {
  407. hws->ctx = ctx;
  408. hws->regs = &hwseq_reg;
  409. hws->shifts = &hwseq_shift;
  410. hws->masks = &hwseq_mask;
  411. }
  412. return hws;
  413. }
  414. static const struct resource_create_funcs res_create_funcs = {
  415. .read_dce_straps = read_dce_straps,
  416. .create_audio = create_audio,
  417. .create_stream_encoder = dce80_stream_encoder_create,
  418. .create_hwseq = dce80_hwseq_create,
  419. };
  420. #define mi_inst_regs(id) { \
  421. MI_DCE8_REG_LIST(id), \
  422. .MC_HUB_RDREQ_DMIF_LIMIT = mmMC_HUB_RDREQ_DMIF_LIMIT \
  423. }
  424. static const struct dce_mem_input_registers mi_regs[] = {
  425. mi_inst_regs(0),
  426. mi_inst_regs(1),
  427. mi_inst_regs(2),
  428. mi_inst_regs(3),
  429. mi_inst_regs(4),
  430. mi_inst_regs(5),
  431. };
  432. static const struct dce_mem_input_shift mi_shifts = {
  433. MI_DCE8_MASK_SH_LIST(__SHIFT),
  434. .ENABLE = MC_HUB_RDREQ_DMIF_LIMIT__ENABLE__SHIFT
  435. };
  436. static const struct dce_mem_input_mask mi_masks = {
  437. MI_DCE8_MASK_SH_LIST(_MASK),
  438. .ENABLE = MC_HUB_RDREQ_DMIF_LIMIT__ENABLE_MASK
  439. };
  440. static struct mem_input *dce80_mem_input_create(
  441. struct dc_context *ctx,
  442. uint32_t inst)
  443. {
  444. struct dce_mem_input *dce_mi = kzalloc(sizeof(struct dce_mem_input),
  445. GFP_KERNEL);
  446. if (!dce_mi) {
  447. BREAK_TO_DEBUGGER();
  448. return NULL;
  449. }
  450. dce_mem_input_construct(dce_mi, ctx, inst, &mi_regs[inst], &mi_shifts, &mi_masks);
  451. dce_mi->wa.single_head_rdreq_dmif_limit = 2;
  452. return &dce_mi->base;
  453. }
  454. static void dce80_transform_destroy(struct transform **xfm)
  455. {
  456. kfree(TO_DCE_TRANSFORM(*xfm));
  457. *xfm = NULL;
  458. }
  459. static struct transform *dce80_transform_create(
  460. struct dc_context *ctx,
  461. uint32_t inst)
  462. {
  463. struct dce_transform *transform =
  464. kzalloc(sizeof(struct dce_transform), GFP_KERNEL);
  465. if (!transform)
  466. return NULL;
  467. dce_transform_construct(transform, ctx, inst,
  468. &xfm_regs[inst], &xfm_shift, &xfm_mask);
  469. transform->prescaler_on = false;
  470. return &transform->base;
  471. }
  472. static const struct encoder_feature_support link_enc_feature = {
  473. .max_hdmi_deep_color = COLOR_DEPTH_121212,
  474. .max_hdmi_pixel_clock = 297000,
  475. .flags.bits.IS_HBR2_CAPABLE = true,
  476. .flags.bits.IS_TPS3_CAPABLE = true,
  477. .flags.bits.IS_YCBCR_CAPABLE = true
  478. };
  479. struct link_encoder *dce80_link_encoder_create(
  480. const struct encoder_init_data *enc_init_data)
  481. {
  482. struct dce110_link_encoder *enc110 =
  483. kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
  484. if (!enc110)
  485. return NULL;
  486. dce110_link_encoder_construct(enc110,
  487. enc_init_data,
  488. &link_enc_feature,
  489. &link_enc_regs[enc_init_data->transmitter],
  490. &link_enc_aux_regs[enc_init_data->channel - 1],
  491. &link_enc_hpd_regs[enc_init_data->hpd_source]);
  492. return &enc110->base;
  493. }
  494. struct clock_source *dce80_clock_source_create(
  495. struct dc_context *ctx,
  496. struct dc_bios *bios,
  497. enum clock_source_id id,
  498. const struct dce110_clk_src_regs *regs,
  499. bool dp_clk_src)
  500. {
  501. struct dce110_clk_src *clk_src =
  502. kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
  503. if (!clk_src)
  504. return NULL;
  505. if (dce110_clk_src_construct(clk_src, ctx, bios, id,
  506. regs, &cs_shift, &cs_mask)) {
  507. clk_src->base.dp_clk_src = dp_clk_src;
  508. return &clk_src->base;
  509. }
  510. BREAK_TO_DEBUGGER();
  511. return NULL;
  512. }
  513. void dce80_clock_source_destroy(struct clock_source **clk_src)
  514. {
  515. kfree(TO_DCE110_CLK_SRC(*clk_src));
  516. *clk_src = NULL;
  517. }
  518. static struct input_pixel_processor *dce80_ipp_create(
  519. struct dc_context *ctx, uint32_t inst)
  520. {
  521. struct dce_ipp *ipp = kzalloc(sizeof(struct dce_ipp), GFP_KERNEL);
  522. if (!ipp) {
  523. BREAK_TO_DEBUGGER();
  524. return NULL;
  525. }
  526. dce_ipp_construct(ipp, ctx, inst,
  527. &ipp_regs[inst], &ipp_shift, &ipp_mask);
  528. return &ipp->base;
  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. dce80_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. dce80_clock_source_destroy(&pool->base.clock_sources[i]);
  556. }
  557. }
  558. if (pool->base.abm != NULL)
  559. dce_abm_destroy(&pool->base.abm);
  560. if (pool->base.dmcu != NULL)
  561. dce_dmcu_destroy(&pool->base.dmcu);
  562. if (pool->base.dp_clock_source != NULL)
  563. dce80_clock_source_destroy(&pool->base.dp_clock_source);
  564. for (i = 0; i < pool->base.audio_count; i++) {
  565. if (pool->base.audios[i] != NULL) {
  566. dce_aud_destroy(&pool->base.audios[i]);
  567. }
  568. }
  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 enum dc_status build_mapped_resource(
  576. const struct dc *dc,
  577. struct dc_state *context,
  578. struct dc_stream_state *stream)
  579. {
  580. struct pipe_ctx *pipe_ctx = resource_get_head_pipe_for_stream(&context->res_ctx, stream);
  581. if (!pipe_ctx)
  582. return DC_ERROR_UNEXPECTED;
  583. dce110_resource_build_pipe_hw_param(pipe_ctx);
  584. resource_build_info_frame(pipe_ctx);
  585. return DC_OK;
  586. }
  587. bool dce80_validate_bandwidth(
  588. struct dc *dc,
  589. struct dc_state *context)
  590. {
  591. /* TODO implement when needed but for now hardcode max value*/
  592. context->bw.dce.dispclk_khz = 681000;
  593. context->bw.dce.yclk_khz = 250000 * MEMORY_TYPE_MULTIPLIER;
  594. return true;
  595. }
  596. static bool dce80_validate_surface_sets(
  597. struct dc_state *context)
  598. {
  599. int i;
  600. for (i = 0; i < context->stream_count; i++) {
  601. if (context->stream_status[i].plane_count == 0)
  602. continue;
  603. if (context->stream_status[i].plane_count > 1)
  604. return false;
  605. if (context->stream_status[i].plane_states[0]->format
  606. >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN)
  607. return false;
  608. }
  609. return true;
  610. }
  611. enum dc_status dce80_validate_global(
  612. struct dc *dc,
  613. struct dc_state *context)
  614. {
  615. if (!dce80_validate_surface_sets(context))
  616. return DC_FAIL_SURFACE_VALIDATE;
  617. return DC_OK;
  618. }
  619. enum dc_status dce80_validate_guaranteed(
  620. struct dc *dc,
  621. struct dc_stream_state *dc_stream,
  622. struct dc_state *context)
  623. {
  624. enum dc_status result = DC_ERROR_UNEXPECTED;
  625. context->streams[0] = dc_stream;
  626. dc_stream_retain(context->streams[0]);
  627. context->stream_count++;
  628. result = resource_map_pool_resources(dc, context, dc_stream);
  629. if (result == DC_OK)
  630. result = resource_map_clock_resources(dc, context, dc_stream);
  631. if (result == DC_OK)
  632. result = build_mapped_resource(dc, context, dc_stream);
  633. if (result == DC_OK) {
  634. validate_guaranteed_copy_streams(
  635. context, dc->caps.max_streams);
  636. result = resource_build_scaling_params_for_context(dc, context);
  637. }
  638. if (result == DC_OK)
  639. result = dce80_validate_bandwidth(dc, context);
  640. return result;
  641. }
  642. static void dce80_destroy_resource_pool(struct resource_pool **pool)
  643. {
  644. struct dce110_resource_pool *dce110_pool = TO_DCE110_RES_POOL(*pool);
  645. destruct(dce110_pool);
  646. kfree(dce110_pool);
  647. *pool = NULL;
  648. }
  649. static const struct resource_funcs dce80_res_pool_funcs = {
  650. .destroy = dce80_destroy_resource_pool,
  651. .link_enc_create = dce80_link_encoder_create,
  652. .validate_guaranteed = dce80_validate_guaranteed,
  653. .validate_bandwidth = dce80_validate_bandwidth,
  654. .validate_plane = dce100_validate_plane,
  655. .add_stream_to_ctx = dce100_add_stream_to_ctx,
  656. .validate_global = dce80_validate_global
  657. };
  658. static bool dce80_construct(
  659. uint8_t num_virtual_links,
  660. struct dc *dc,
  661. struct dce110_resource_pool *pool)
  662. {
  663. unsigned int i;
  664. struct dc_context *ctx = dc->ctx;
  665. struct dc_firmware_info info;
  666. struct dc_bios *bp;
  667. struct dm_pp_static_clock_info static_clk_info = {0};
  668. ctx->dc_bios->regs = &bios_regs;
  669. pool->base.res_cap = &res_cap;
  670. pool->base.funcs = &dce80_res_pool_funcs;
  671. /*************************************************
  672. * Resource + asic cap harcoding *
  673. *************************************************/
  674. pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
  675. pool->base.pipe_count = res_cap.num_timing_generator;
  676. pool->base.timing_generator_count = res_cap.num_timing_generator;
  677. dc->caps.max_downscale_ratio = 200;
  678. dc->caps.i2c_speed_in_khz = 40;
  679. dc->caps.max_cursor_size = 128;
  680. dc->caps.dual_link_dvi = true;
  681. /*************************************************
  682. * Create resources *
  683. *************************************************/
  684. bp = ctx->dc_bios;
  685. if ((bp->funcs->get_firmware_info(bp, &info) == BP_RESULT_OK) &&
  686. info.external_clock_source_frequency_for_dp != 0) {
  687. pool->base.dp_clock_source =
  688. dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
  689. pool->base.clock_sources[0] =
  690. dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], false);
  691. pool->base.clock_sources[1] =
  692. dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
  693. pool->base.clock_sources[2] =
  694. dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
  695. pool->base.clk_src_count = 3;
  696. } else {
  697. pool->base.dp_clock_source =
  698. dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], true);
  699. pool->base.clock_sources[0] =
  700. dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
  701. pool->base.clock_sources[1] =
  702. dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
  703. pool->base.clk_src_count = 2;
  704. }
  705. if (pool->base.dp_clock_source == NULL) {
  706. dm_error("DC: failed to create dp clock source!\n");
  707. BREAK_TO_DEBUGGER();
  708. goto res_create_fail;
  709. }
  710. for (i = 0; i < pool->base.clk_src_count; i++) {
  711. if (pool->base.clock_sources[i] == NULL) {
  712. dm_error("DC: failed to create clock sources!\n");
  713. BREAK_TO_DEBUGGER();
  714. goto res_create_fail;
  715. }
  716. }
  717. pool->base.display_clock = dce_disp_clk_create(ctx,
  718. &disp_clk_regs,
  719. &disp_clk_shift,
  720. &disp_clk_mask);
  721. if (pool->base.display_clock == NULL) {
  722. dm_error("DC: failed to create display clock!\n");
  723. BREAK_TO_DEBUGGER();
  724. goto res_create_fail;
  725. }
  726. pool->base.dmcu = dce_dmcu_create(ctx,
  727. &dmcu_regs,
  728. &dmcu_shift,
  729. &dmcu_mask);
  730. if (pool->base.dmcu == NULL) {
  731. dm_error("DC: failed to create dmcu!\n");
  732. BREAK_TO_DEBUGGER();
  733. goto res_create_fail;
  734. }
  735. pool->base.abm = dce_abm_create(ctx,
  736. &abm_regs,
  737. &abm_shift,
  738. &abm_mask);
  739. if (pool->base.abm == NULL) {
  740. dm_error("DC: failed to create abm!\n");
  741. BREAK_TO_DEBUGGER();
  742. goto res_create_fail;
  743. }
  744. if (dm_pp_get_static_clocks(ctx, &static_clk_info))
  745. pool->base.display_clock->max_clks_state =
  746. static_clk_info.max_clocks_state;
  747. {
  748. struct irq_service_init_data init_data;
  749. init_data.ctx = dc->ctx;
  750. pool->base.irqs = dal_irq_service_dce80_create(&init_data);
  751. if (!pool->base.irqs)
  752. goto res_create_fail;
  753. }
  754. for (i = 0; i < pool->base.pipe_count; i++) {
  755. pool->base.timing_generators[i] = dce80_timing_generator_create(
  756. ctx, i, &dce80_tg_offsets[i]);
  757. if (pool->base.timing_generators[i] == NULL) {
  758. BREAK_TO_DEBUGGER();
  759. dm_error("DC: failed to create tg!\n");
  760. goto res_create_fail;
  761. }
  762. pool->base.mis[i] = dce80_mem_input_create(ctx, i);
  763. if (pool->base.mis[i] == NULL) {
  764. BREAK_TO_DEBUGGER();
  765. dm_error("DC: failed to create memory input!\n");
  766. goto res_create_fail;
  767. }
  768. pool->base.ipps[i] = dce80_ipp_create(ctx, i);
  769. if (pool->base.ipps[i] == NULL) {
  770. BREAK_TO_DEBUGGER();
  771. dm_error("DC: failed to create input pixel processor!\n");
  772. goto res_create_fail;
  773. }
  774. pool->base.transforms[i] = dce80_transform_create(ctx, i);
  775. if (pool->base.transforms[i] == NULL) {
  776. BREAK_TO_DEBUGGER();
  777. dm_error("DC: failed to create transform!\n");
  778. goto res_create_fail;
  779. }
  780. pool->base.opps[i] = dce80_opp_create(ctx, i);
  781. if (pool->base.opps[i] == NULL) {
  782. BREAK_TO_DEBUGGER();
  783. dm_error("DC: failed to create output pixel processor!\n");
  784. goto res_create_fail;
  785. }
  786. }
  787. dc->caps.max_planes = pool->base.pipe_count;
  788. if (!resource_construct(num_virtual_links, dc, &pool->base,
  789. &res_create_funcs))
  790. goto res_create_fail;
  791. /* Create hardware sequencer */
  792. dce80_hw_sequencer_construct(dc);
  793. return true;
  794. res_create_fail:
  795. destruct(pool);
  796. return false;
  797. }
  798. struct resource_pool *dce80_create_resource_pool(
  799. uint8_t num_virtual_links,
  800. struct dc *dc)
  801. {
  802. struct dce110_resource_pool *pool =
  803. kzalloc(sizeof(struct dce110_resource_pool), GFP_KERNEL);
  804. if (!pool)
  805. return NULL;
  806. if (dce80_construct(num_virtual_links, dc, pool))
  807. return &pool->base;
  808. BREAK_TO_DEBUGGER();
  809. return NULL;
  810. }
  811. static bool dce81_construct(
  812. uint8_t num_virtual_links,
  813. struct dc *dc,
  814. struct dce110_resource_pool *pool)
  815. {
  816. unsigned int i;
  817. struct dc_context *ctx = dc->ctx;
  818. struct dc_firmware_info info;
  819. struct dc_bios *bp;
  820. struct dm_pp_static_clock_info static_clk_info = {0};
  821. ctx->dc_bios->regs = &bios_regs;
  822. pool->base.res_cap = &res_cap_81;
  823. pool->base.funcs = &dce80_res_pool_funcs;
  824. /*************************************************
  825. * Resource + asic cap harcoding *
  826. *************************************************/
  827. pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
  828. pool->base.pipe_count = res_cap_81.num_timing_generator;
  829. pool->base.timing_generator_count = res_cap_81.num_timing_generator;
  830. dc->caps.max_downscale_ratio = 200;
  831. dc->caps.i2c_speed_in_khz = 40;
  832. dc->caps.max_cursor_size = 128;
  833. dc->caps.is_apu = true;
  834. /*************************************************
  835. * Create resources *
  836. *************************************************/
  837. bp = ctx->dc_bios;
  838. if ((bp->funcs->get_firmware_info(bp, &info) == BP_RESULT_OK) &&
  839. info.external_clock_source_frequency_for_dp != 0) {
  840. pool->base.dp_clock_source =
  841. dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
  842. pool->base.clock_sources[0] =
  843. dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], false);
  844. pool->base.clock_sources[1] =
  845. dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
  846. pool->base.clock_sources[2] =
  847. dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
  848. pool->base.clk_src_count = 3;
  849. } else {
  850. pool->base.dp_clock_source =
  851. dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], true);
  852. pool->base.clock_sources[0] =
  853. dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
  854. pool->base.clock_sources[1] =
  855. dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
  856. pool->base.clk_src_count = 2;
  857. }
  858. if (pool->base.dp_clock_source == NULL) {
  859. dm_error("DC: failed to create dp clock source!\n");
  860. BREAK_TO_DEBUGGER();
  861. goto res_create_fail;
  862. }
  863. for (i = 0; i < pool->base.clk_src_count; i++) {
  864. if (pool->base.clock_sources[i] == NULL) {
  865. dm_error("DC: failed to create clock sources!\n");
  866. BREAK_TO_DEBUGGER();
  867. goto res_create_fail;
  868. }
  869. }
  870. pool->base.display_clock = dce_disp_clk_create(ctx,
  871. &disp_clk_regs,
  872. &disp_clk_shift,
  873. &disp_clk_mask);
  874. if (pool->base.display_clock == NULL) {
  875. dm_error("DC: failed to create display clock!\n");
  876. BREAK_TO_DEBUGGER();
  877. goto res_create_fail;
  878. }
  879. pool->base.dmcu = dce_dmcu_create(ctx,
  880. &dmcu_regs,
  881. &dmcu_shift,
  882. &dmcu_mask);
  883. if (pool->base.dmcu == NULL) {
  884. dm_error("DC: failed to create dmcu!\n");
  885. BREAK_TO_DEBUGGER();
  886. goto res_create_fail;
  887. }
  888. pool->base.abm = dce_abm_create(ctx,
  889. &abm_regs,
  890. &abm_shift,
  891. &abm_mask);
  892. if (pool->base.abm == NULL) {
  893. dm_error("DC: failed to create abm!\n");
  894. BREAK_TO_DEBUGGER();
  895. goto res_create_fail;
  896. }
  897. if (dm_pp_get_static_clocks(ctx, &static_clk_info))
  898. pool->base.display_clock->max_clks_state =
  899. static_clk_info.max_clocks_state;
  900. {
  901. struct irq_service_init_data init_data;
  902. init_data.ctx = dc->ctx;
  903. pool->base.irqs = dal_irq_service_dce80_create(&init_data);
  904. if (!pool->base.irqs)
  905. goto res_create_fail;
  906. }
  907. for (i = 0; i < pool->base.pipe_count; i++) {
  908. pool->base.timing_generators[i] = dce80_timing_generator_create(
  909. ctx, i, &dce80_tg_offsets[i]);
  910. if (pool->base.timing_generators[i] == NULL) {
  911. BREAK_TO_DEBUGGER();
  912. dm_error("DC: failed to create tg!\n");
  913. goto res_create_fail;
  914. }
  915. pool->base.mis[i] = dce80_mem_input_create(ctx, i);
  916. if (pool->base.mis[i] == NULL) {
  917. BREAK_TO_DEBUGGER();
  918. dm_error("DC: failed to create memory input!\n");
  919. goto res_create_fail;
  920. }
  921. pool->base.ipps[i] = dce80_ipp_create(ctx, i);
  922. if (pool->base.ipps[i] == NULL) {
  923. BREAK_TO_DEBUGGER();
  924. dm_error("DC: failed to create input pixel processor!\n");
  925. goto res_create_fail;
  926. }
  927. pool->base.transforms[i] = dce80_transform_create(ctx, i);
  928. if (pool->base.transforms[i] == NULL) {
  929. BREAK_TO_DEBUGGER();
  930. dm_error("DC: failed to create transform!\n");
  931. goto res_create_fail;
  932. }
  933. pool->base.opps[i] = dce80_opp_create(ctx, i);
  934. if (pool->base.opps[i] == NULL) {
  935. BREAK_TO_DEBUGGER();
  936. dm_error("DC: failed to create output pixel processor!\n");
  937. goto res_create_fail;
  938. }
  939. }
  940. dc->caps.max_planes = pool->base.pipe_count;
  941. if (!resource_construct(num_virtual_links, dc, &pool->base,
  942. &res_create_funcs))
  943. goto res_create_fail;
  944. /* Create hardware sequencer */
  945. dce80_hw_sequencer_construct(dc);
  946. return true;
  947. res_create_fail:
  948. destruct(pool);
  949. return false;
  950. }
  951. struct resource_pool *dce81_create_resource_pool(
  952. uint8_t num_virtual_links,
  953. struct dc *dc)
  954. {
  955. struct dce110_resource_pool *pool =
  956. kzalloc(sizeof(struct dce110_resource_pool), GFP_KERNEL);
  957. if (!pool)
  958. return NULL;
  959. if (dce81_construct(num_virtual_links, dc, pool))
  960. return &pool->base;
  961. BREAK_TO_DEBUGGER();
  962. return NULL;
  963. }
  964. static bool dce83_construct(
  965. uint8_t num_virtual_links,
  966. struct dc *dc,
  967. struct dce110_resource_pool *pool)
  968. {
  969. unsigned int i;
  970. struct dc_context *ctx = dc->ctx;
  971. struct dc_firmware_info info;
  972. struct dc_bios *bp;
  973. struct dm_pp_static_clock_info static_clk_info = {0};
  974. ctx->dc_bios->regs = &bios_regs;
  975. pool->base.res_cap = &res_cap_83;
  976. pool->base.funcs = &dce80_res_pool_funcs;
  977. /*************************************************
  978. * Resource + asic cap harcoding *
  979. *************************************************/
  980. pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
  981. pool->base.pipe_count = res_cap_83.num_timing_generator;
  982. pool->base.timing_generator_count = res_cap_83.num_timing_generator;
  983. dc->caps.max_downscale_ratio = 200;
  984. dc->caps.i2c_speed_in_khz = 40;
  985. dc->caps.max_cursor_size = 128;
  986. dc->caps.is_apu = true;
  987. /*************************************************
  988. * Create resources *
  989. *************************************************/
  990. bp = ctx->dc_bios;
  991. if ((bp->funcs->get_firmware_info(bp, &info) == BP_RESULT_OK) &&
  992. info.external_clock_source_frequency_for_dp != 0) {
  993. pool->base.dp_clock_source =
  994. dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
  995. pool->base.clock_sources[0] =
  996. dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[0], false);
  997. pool->base.clock_sources[1] =
  998. dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[1], false);
  999. pool->base.clk_src_count = 2;
  1000. } else {
  1001. pool->base.dp_clock_source =
  1002. dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[0], true);
  1003. pool->base.clock_sources[0] =
  1004. dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[1], false);
  1005. pool->base.clk_src_count = 1;
  1006. }
  1007. if (pool->base.dp_clock_source == NULL) {
  1008. dm_error("DC: failed to create dp clock source!\n");
  1009. BREAK_TO_DEBUGGER();
  1010. goto res_create_fail;
  1011. }
  1012. for (i = 0; i < pool->base.clk_src_count; i++) {
  1013. if (pool->base.clock_sources[i] == NULL) {
  1014. dm_error("DC: failed to create clock sources!\n");
  1015. BREAK_TO_DEBUGGER();
  1016. goto res_create_fail;
  1017. }
  1018. }
  1019. pool->base.display_clock = dce_disp_clk_create(ctx,
  1020. &disp_clk_regs,
  1021. &disp_clk_shift,
  1022. &disp_clk_mask);
  1023. if (pool->base.display_clock == NULL) {
  1024. dm_error("DC: failed to create display clock!\n");
  1025. BREAK_TO_DEBUGGER();
  1026. goto res_create_fail;
  1027. }
  1028. pool->base.dmcu = dce_dmcu_create(ctx,
  1029. &dmcu_regs,
  1030. &dmcu_shift,
  1031. &dmcu_mask);
  1032. if (pool->base.dmcu == NULL) {
  1033. dm_error("DC: failed to create dmcu!\n");
  1034. BREAK_TO_DEBUGGER();
  1035. goto res_create_fail;
  1036. }
  1037. pool->base.abm = dce_abm_create(ctx,
  1038. &abm_regs,
  1039. &abm_shift,
  1040. &abm_mask);
  1041. if (pool->base.abm == NULL) {
  1042. dm_error("DC: failed to create abm!\n");
  1043. BREAK_TO_DEBUGGER();
  1044. goto res_create_fail;
  1045. }
  1046. if (dm_pp_get_static_clocks(ctx, &static_clk_info))
  1047. pool->base.display_clock->max_clks_state =
  1048. static_clk_info.max_clocks_state;
  1049. {
  1050. struct irq_service_init_data init_data;
  1051. init_data.ctx = dc->ctx;
  1052. pool->base.irqs = dal_irq_service_dce80_create(&init_data);
  1053. if (!pool->base.irqs)
  1054. goto res_create_fail;
  1055. }
  1056. for (i = 0; i < pool->base.pipe_count; i++) {
  1057. pool->base.timing_generators[i] = dce80_timing_generator_create(
  1058. ctx, i, &dce80_tg_offsets[i]);
  1059. if (pool->base.timing_generators[i] == NULL) {
  1060. BREAK_TO_DEBUGGER();
  1061. dm_error("DC: failed to create tg!\n");
  1062. goto res_create_fail;
  1063. }
  1064. pool->base.mis[i] = dce80_mem_input_create(ctx, i);
  1065. if (pool->base.mis[i] == NULL) {
  1066. BREAK_TO_DEBUGGER();
  1067. dm_error("DC: failed to create memory input!\n");
  1068. goto res_create_fail;
  1069. }
  1070. pool->base.ipps[i] = dce80_ipp_create(ctx, i);
  1071. if (pool->base.ipps[i] == NULL) {
  1072. BREAK_TO_DEBUGGER();
  1073. dm_error("DC: failed to create input pixel processor!\n");
  1074. goto res_create_fail;
  1075. }
  1076. pool->base.transforms[i] = dce80_transform_create(ctx, i);
  1077. if (pool->base.transforms[i] == NULL) {
  1078. BREAK_TO_DEBUGGER();
  1079. dm_error("DC: failed to create transform!\n");
  1080. goto res_create_fail;
  1081. }
  1082. pool->base.opps[i] = dce80_opp_create(ctx, i);
  1083. if (pool->base.opps[i] == NULL) {
  1084. BREAK_TO_DEBUGGER();
  1085. dm_error("DC: failed to create output pixel processor!\n");
  1086. goto res_create_fail;
  1087. }
  1088. }
  1089. dc->caps.max_planes = pool->base.pipe_count;
  1090. if (!resource_construct(num_virtual_links, dc, &pool->base,
  1091. &res_create_funcs))
  1092. goto res_create_fail;
  1093. /* Create hardware sequencer */
  1094. dce80_hw_sequencer_construct(dc);
  1095. return true;
  1096. res_create_fail:
  1097. destruct(pool);
  1098. return false;
  1099. }
  1100. struct resource_pool *dce83_create_resource_pool(
  1101. uint8_t num_virtual_links,
  1102. struct dc *dc)
  1103. {
  1104. struct dce110_resource_pool *pool =
  1105. kzalloc(sizeof(struct dce110_resource_pool), GFP_KERNEL);
  1106. if (!pool)
  1107. return NULL;
  1108. if (dce83_construct(num_virtual_links, dc, pool))
  1109. return &pool->base;
  1110. BREAK_TO_DEBUGGER();
  1111. return NULL;
  1112. }