mcde_display.c 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2018 Linus Walleij <linus.walleij@linaro.org>
  4. * Parts of this file were based on the MCDE driver by Marcus Lorentzon
  5. * (C) ST-Ericsson SA 2013
  6. */
  7. #include <linux/clk.h>
  8. #include <linux/delay.h>
  9. #include <linux/dma-buf.h>
  10. #include <linux/regulator/consumer.h>
  11. #include <linux/media-bus-format.h>
  12. #include <drm/drm_device.h>
  13. #include <drm/drm_fb_dma_helper.h>
  14. #include <drm/drm_fourcc.h>
  15. #include <drm/drm_framebuffer.h>
  16. #include <drm/drm_gem_atomic_helper.h>
  17. #include <drm/drm_gem_dma_helper.h>
  18. #include <drm/drm_mipi_dsi.h>
  19. #include <drm/drm_print.h>
  20. #include <drm/drm_simple_kms_helper.h>
  21. #include <drm/drm_bridge.h>
  22. #include <drm/drm_vblank.h>
  23. #include <video/mipi_display.h>
  24. #include "mcde_drm.h"
  25. #include "mcde_display_regs.h"
  26. enum mcde_fifo {
  27. MCDE_FIFO_A,
  28. MCDE_FIFO_B,
  29. /* TODO: implement FIFO C0 and FIFO C1 */
  30. };
  31. enum mcde_channel {
  32. MCDE_CHANNEL_0 = 0,
  33. MCDE_CHANNEL_1,
  34. MCDE_CHANNEL_2,
  35. MCDE_CHANNEL_3,
  36. };
  37. enum mcde_extsrc {
  38. MCDE_EXTSRC_0 = 0,
  39. MCDE_EXTSRC_1,
  40. MCDE_EXTSRC_2,
  41. MCDE_EXTSRC_3,
  42. MCDE_EXTSRC_4,
  43. MCDE_EXTSRC_5,
  44. MCDE_EXTSRC_6,
  45. MCDE_EXTSRC_7,
  46. MCDE_EXTSRC_8,
  47. MCDE_EXTSRC_9,
  48. };
  49. enum mcde_overlay {
  50. MCDE_OVERLAY_0 = 0,
  51. MCDE_OVERLAY_1,
  52. MCDE_OVERLAY_2,
  53. MCDE_OVERLAY_3,
  54. MCDE_OVERLAY_4,
  55. MCDE_OVERLAY_5,
  56. };
  57. enum mcde_formatter {
  58. MCDE_DSI_FORMATTER_0 = 0,
  59. MCDE_DSI_FORMATTER_1,
  60. MCDE_DSI_FORMATTER_2,
  61. MCDE_DSI_FORMATTER_3,
  62. MCDE_DSI_FORMATTER_4,
  63. MCDE_DSI_FORMATTER_5,
  64. MCDE_DPI_FORMATTER_0,
  65. MCDE_DPI_FORMATTER_1,
  66. };
  67. void mcde_display_irq(struct mcde *mcde)
  68. {
  69. u32 mispp, misovl, mischnl;
  70. bool vblank = false;
  71. /* Handle display IRQs */
  72. mispp = readl(mcde->regs + MCDE_MISPP);
  73. misovl = readl(mcde->regs + MCDE_MISOVL);
  74. mischnl = readl(mcde->regs + MCDE_MISCHNL);
  75. /*
  76. * Handle IRQs from the DSI link. All IRQs from the DSI links
  77. * are just latched onto the MCDE IRQ line, so we need to traverse
  78. * any active DSI masters and check if an IRQ is originating from
  79. * them.
  80. *
  81. * TODO: Currently only one DSI link is supported.
  82. */
  83. if (!mcde->dpi_output && mcde_dsi_irq(mcde->mdsi)) {
  84. u32 val;
  85. /*
  86. * In oneshot mode we do not send continuous updates
  87. * to the display, instead we only push out updates when
  88. * the update function is called, then we disable the
  89. * flow on the channel once we get the TE IRQ.
  90. */
  91. if (mcde->flow_mode == MCDE_COMMAND_ONESHOT_FLOW) {
  92. spin_lock(&mcde->flow_lock);
  93. if (--mcde->flow_active == 0) {
  94. dev_dbg(mcde->dev, "TE0 IRQ\n");
  95. /* Disable FIFO A flow */
  96. val = readl(mcde->regs + MCDE_CRA0);
  97. val &= ~MCDE_CRX0_FLOEN;
  98. writel(val, mcde->regs + MCDE_CRA0);
  99. }
  100. spin_unlock(&mcde->flow_lock);
  101. }
  102. }
  103. /* Vblank from one of the channels */
  104. if (mispp & MCDE_PP_VCMPA) {
  105. dev_dbg(mcde->dev, "chnl A vblank IRQ\n");
  106. vblank = true;
  107. }
  108. if (mispp & MCDE_PP_VCMPB) {
  109. dev_dbg(mcde->dev, "chnl B vblank IRQ\n");
  110. vblank = true;
  111. }
  112. if (mispp & MCDE_PP_VCMPC0)
  113. dev_dbg(mcde->dev, "chnl C0 vblank IRQ\n");
  114. if (mispp & MCDE_PP_VCMPC1)
  115. dev_dbg(mcde->dev, "chnl C1 vblank IRQ\n");
  116. if (mispp & MCDE_PP_VSCC0)
  117. dev_dbg(mcde->dev, "chnl C0 TE IRQ\n");
  118. if (mispp & MCDE_PP_VSCC1)
  119. dev_dbg(mcde->dev, "chnl C1 TE IRQ\n");
  120. writel(mispp, mcde->regs + MCDE_RISPP);
  121. if (vblank)
  122. drm_crtc_handle_vblank(&mcde->pipe.crtc);
  123. if (misovl)
  124. dev_info(mcde->dev, "some stray overlay IRQ %08x\n", misovl);
  125. writel(misovl, mcde->regs + MCDE_RISOVL);
  126. if (mischnl)
  127. dev_info(mcde->dev, "some stray channel error IRQ %08x\n",
  128. mischnl);
  129. writel(mischnl, mcde->regs + MCDE_RISCHNL);
  130. }
  131. void mcde_display_disable_irqs(struct mcde *mcde)
  132. {
  133. /* Disable all IRQs */
  134. writel(0, mcde->regs + MCDE_IMSCPP);
  135. writel(0, mcde->regs + MCDE_IMSCOVL);
  136. writel(0, mcde->regs + MCDE_IMSCCHNL);
  137. /* Clear any pending IRQs */
  138. writel(0xFFFFFFFF, mcde->regs + MCDE_RISPP);
  139. writel(0xFFFFFFFF, mcde->regs + MCDE_RISOVL);
  140. writel(0xFFFFFFFF, mcde->regs + MCDE_RISCHNL);
  141. }
  142. static int mcde_display_check(struct drm_simple_display_pipe *pipe,
  143. struct drm_plane_state *pstate,
  144. struct drm_crtc_state *cstate)
  145. {
  146. const struct drm_display_mode *mode = &cstate->mode;
  147. struct drm_framebuffer *old_fb = pipe->plane.state->fb;
  148. struct drm_framebuffer *fb = pstate->fb;
  149. if (fb) {
  150. u32 offset = drm_fb_dma_get_gem_addr(fb, pstate, 0);
  151. /* FB base address must be dword aligned. */
  152. if (offset & 3) {
  153. DRM_DEBUG_KMS("FB not 32-bit aligned\n");
  154. return -EINVAL;
  155. }
  156. /*
  157. * There's no pitch register, the mode's hdisplay
  158. * controls this.
  159. */
  160. if (fb->pitches[0] != mode->hdisplay * fb->format->cpp[0]) {
  161. DRM_DEBUG_KMS("can't handle pitches\n");
  162. return -EINVAL;
  163. }
  164. /*
  165. * We can't change the FB format in a flicker-free
  166. * manner (and only update it during CRTC enable).
  167. */
  168. if (old_fb && old_fb->format != fb->format)
  169. cstate->mode_changed = true;
  170. }
  171. return 0;
  172. }
  173. static int mcde_configure_extsrc(struct mcde *mcde, enum mcde_extsrc src,
  174. u32 format)
  175. {
  176. u32 val;
  177. u32 conf;
  178. u32 cr;
  179. switch (src) {
  180. case MCDE_EXTSRC_0:
  181. conf = MCDE_EXTSRC0CONF;
  182. cr = MCDE_EXTSRC0CR;
  183. break;
  184. case MCDE_EXTSRC_1:
  185. conf = MCDE_EXTSRC1CONF;
  186. cr = MCDE_EXTSRC1CR;
  187. break;
  188. case MCDE_EXTSRC_2:
  189. conf = MCDE_EXTSRC2CONF;
  190. cr = MCDE_EXTSRC2CR;
  191. break;
  192. case MCDE_EXTSRC_3:
  193. conf = MCDE_EXTSRC3CONF;
  194. cr = MCDE_EXTSRC3CR;
  195. break;
  196. case MCDE_EXTSRC_4:
  197. conf = MCDE_EXTSRC4CONF;
  198. cr = MCDE_EXTSRC4CR;
  199. break;
  200. case MCDE_EXTSRC_5:
  201. conf = MCDE_EXTSRC5CONF;
  202. cr = MCDE_EXTSRC5CR;
  203. break;
  204. case MCDE_EXTSRC_6:
  205. conf = MCDE_EXTSRC6CONF;
  206. cr = MCDE_EXTSRC6CR;
  207. break;
  208. case MCDE_EXTSRC_7:
  209. conf = MCDE_EXTSRC7CONF;
  210. cr = MCDE_EXTSRC7CR;
  211. break;
  212. case MCDE_EXTSRC_8:
  213. conf = MCDE_EXTSRC8CONF;
  214. cr = MCDE_EXTSRC8CR;
  215. break;
  216. case MCDE_EXTSRC_9:
  217. conf = MCDE_EXTSRC9CONF;
  218. cr = MCDE_EXTSRC9CR;
  219. break;
  220. }
  221. /*
  222. * Configure external source 0 one buffer (buffer 0)
  223. * primary overlay ID 0.
  224. * From mcde_hw.c ovly_update_registers() in the vendor tree
  225. */
  226. val = 0 << MCDE_EXTSRCXCONF_BUF_ID_SHIFT;
  227. val |= 1 << MCDE_EXTSRCXCONF_BUF_NB_SHIFT;
  228. val |= 0 << MCDE_EXTSRCXCONF_PRI_OVLID_SHIFT;
  229. switch (format) {
  230. case DRM_FORMAT_ARGB8888:
  231. val |= MCDE_EXTSRCXCONF_BPP_ARGB8888 <<
  232. MCDE_EXTSRCXCONF_BPP_SHIFT;
  233. break;
  234. case DRM_FORMAT_ABGR8888:
  235. val |= MCDE_EXTSRCXCONF_BPP_ARGB8888 <<
  236. MCDE_EXTSRCXCONF_BPP_SHIFT;
  237. val |= MCDE_EXTSRCXCONF_BGR;
  238. break;
  239. case DRM_FORMAT_XRGB8888:
  240. val |= MCDE_EXTSRCXCONF_BPP_XRGB8888 <<
  241. MCDE_EXTSRCXCONF_BPP_SHIFT;
  242. break;
  243. case DRM_FORMAT_XBGR8888:
  244. val |= MCDE_EXTSRCXCONF_BPP_XRGB8888 <<
  245. MCDE_EXTSRCXCONF_BPP_SHIFT;
  246. val |= MCDE_EXTSRCXCONF_BGR;
  247. break;
  248. case DRM_FORMAT_RGB888:
  249. val |= MCDE_EXTSRCXCONF_BPP_RGB888 <<
  250. MCDE_EXTSRCXCONF_BPP_SHIFT;
  251. break;
  252. case DRM_FORMAT_BGR888:
  253. val |= MCDE_EXTSRCXCONF_BPP_RGB888 <<
  254. MCDE_EXTSRCXCONF_BPP_SHIFT;
  255. val |= MCDE_EXTSRCXCONF_BGR;
  256. break;
  257. case DRM_FORMAT_ARGB4444:
  258. val |= MCDE_EXTSRCXCONF_BPP_ARGB4444 <<
  259. MCDE_EXTSRCXCONF_BPP_SHIFT;
  260. break;
  261. case DRM_FORMAT_ABGR4444:
  262. val |= MCDE_EXTSRCXCONF_BPP_ARGB4444 <<
  263. MCDE_EXTSRCXCONF_BPP_SHIFT;
  264. val |= MCDE_EXTSRCXCONF_BGR;
  265. break;
  266. case DRM_FORMAT_XRGB4444:
  267. val |= MCDE_EXTSRCXCONF_BPP_RGB444 <<
  268. MCDE_EXTSRCXCONF_BPP_SHIFT;
  269. break;
  270. case DRM_FORMAT_XBGR4444:
  271. val |= MCDE_EXTSRCXCONF_BPP_RGB444 <<
  272. MCDE_EXTSRCXCONF_BPP_SHIFT;
  273. val |= MCDE_EXTSRCXCONF_BGR;
  274. break;
  275. case DRM_FORMAT_XRGB1555:
  276. val |= MCDE_EXTSRCXCONF_BPP_IRGB1555 <<
  277. MCDE_EXTSRCXCONF_BPP_SHIFT;
  278. break;
  279. case DRM_FORMAT_XBGR1555:
  280. val |= MCDE_EXTSRCXCONF_BPP_IRGB1555 <<
  281. MCDE_EXTSRCXCONF_BPP_SHIFT;
  282. val |= MCDE_EXTSRCXCONF_BGR;
  283. break;
  284. case DRM_FORMAT_RGB565:
  285. val |= MCDE_EXTSRCXCONF_BPP_RGB565 <<
  286. MCDE_EXTSRCXCONF_BPP_SHIFT;
  287. break;
  288. case DRM_FORMAT_BGR565:
  289. val |= MCDE_EXTSRCXCONF_BPP_RGB565 <<
  290. MCDE_EXTSRCXCONF_BPP_SHIFT;
  291. val |= MCDE_EXTSRCXCONF_BGR;
  292. break;
  293. case DRM_FORMAT_YUV422:
  294. val |= MCDE_EXTSRCXCONF_BPP_YCBCR422 <<
  295. MCDE_EXTSRCXCONF_BPP_SHIFT;
  296. break;
  297. default:
  298. dev_err(mcde->dev, "Unknown pixel format 0x%08x\n",
  299. format);
  300. return -EINVAL;
  301. }
  302. writel(val, mcde->regs + conf);
  303. /* Software select, primary */
  304. val = MCDE_EXTSRCXCR_SEL_MOD_SOFTWARE_SEL;
  305. val |= MCDE_EXTSRCXCR_MULTIOVL_CTRL_PRIMARY;
  306. writel(val, mcde->regs + cr);
  307. return 0;
  308. }
  309. static void mcde_configure_overlay(struct mcde *mcde, enum mcde_overlay ovl,
  310. enum mcde_extsrc src,
  311. enum mcde_channel ch,
  312. const struct drm_display_mode *mode,
  313. u32 format, int cpp)
  314. {
  315. u32 val;
  316. u32 conf1;
  317. u32 conf2;
  318. u32 crop;
  319. u32 ljinc;
  320. u32 cr;
  321. u32 comp;
  322. u32 pixel_fetcher_watermark;
  323. switch (ovl) {
  324. case MCDE_OVERLAY_0:
  325. conf1 = MCDE_OVL0CONF;
  326. conf2 = MCDE_OVL0CONF2;
  327. crop = MCDE_OVL0CROP;
  328. ljinc = MCDE_OVL0LJINC;
  329. cr = MCDE_OVL0CR;
  330. comp = MCDE_OVL0COMP;
  331. break;
  332. case MCDE_OVERLAY_1:
  333. conf1 = MCDE_OVL1CONF;
  334. conf2 = MCDE_OVL1CONF2;
  335. crop = MCDE_OVL1CROP;
  336. ljinc = MCDE_OVL1LJINC;
  337. cr = MCDE_OVL1CR;
  338. comp = MCDE_OVL1COMP;
  339. break;
  340. case MCDE_OVERLAY_2:
  341. conf1 = MCDE_OVL2CONF;
  342. conf2 = MCDE_OVL2CONF2;
  343. crop = MCDE_OVL2CROP;
  344. ljinc = MCDE_OVL2LJINC;
  345. cr = MCDE_OVL2CR;
  346. comp = MCDE_OVL2COMP;
  347. break;
  348. case MCDE_OVERLAY_3:
  349. conf1 = MCDE_OVL3CONF;
  350. conf2 = MCDE_OVL3CONF2;
  351. crop = MCDE_OVL3CROP;
  352. ljinc = MCDE_OVL3LJINC;
  353. cr = MCDE_OVL3CR;
  354. comp = MCDE_OVL3COMP;
  355. break;
  356. case MCDE_OVERLAY_4:
  357. conf1 = MCDE_OVL4CONF;
  358. conf2 = MCDE_OVL4CONF2;
  359. crop = MCDE_OVL4CROP;
  360. ljinc = MCDE_OVL4LJINC;
  361. cr = MCDE_OVL4CR;
  362. comp = MCDE_OVL4COMP;
  363. break;
  364. case MCDE_OVERLAY_5:
  365. conf1 = MCDE_OVL5CONF;
  366. conf2 = MCDE_OVL5CONF2;
  367. crop = MCDE_OVL5CROP;
  368. ljinc = MCDE_OVL5LJINC;
  369. cr = MCDE_OVL5CR;
  370. comp = MCDE_OVL5COMP;
  371. break;
  372. }
  373. val = mode->hdisplay << MCDE_OVLXCONF_PPL_SHIFT;
  374. val |= mode->vdisplay << MCDE_OVLXCONF_LPF_SHIFT;
  375. /* Use external source 0 that we just configured */
  376. val |= src << MCDE_OVLXCONF_EXTSRC_ID_SHIFT;
  377. writel(val, mcde->regs + conf1);
  378. val = MCDE_OVLXCONF2_BP_PER_PIXEL_ALPHA;
  379. val |= 0xff << MCDE_OVLXCONF2_ALPHAVALUE_SHIFT;
  380. /* OPQ: overlay is opaque */
  381. switch (format) {
  382. case DRM_FORMAT_ARGB8888:
  383. case DRM_FORMAT_ABGR8888:
  384. case DRM_FORMAT_ARGB4444:
  385. case DRM_FORMAT_ABGR4444:
  386. case DRM_FORMAT_XRGB1555:
  387. case DRM_FORMAT_XBGR1555:
  388. /* No OPQ */
  389. break;
  390. case DRM_FORMAT_XRGB8888:
  391. case DRM_FORMAT_XBGR8888:
  392. case DRM_FORMAT_RGB888:
  393. case DRM_FORMAT_BGR888:
  394. case DRM_FORMAT_RGB565:
  395. case DRM_FORMAT_BGR565:
  396. case DRM_FORMAT_YUV422:
  397. val |= MCDE_OVLXCONF2_OPQ;
  398. break;
  399. default:
  400. dev_err(mcde->dev, "Unknown pixel format 0x%08x\n",
  401. format);
  402. break;
  403. }
  404. /*
  405. * Pixel fetch watermark level is max 0x1FFF pixels.
  406. * Two basic rules should be followed:
  407. * 1. The value should be at least 256 bits.
  408. * 2. The sum of all active overlays pixelfetch watermark level
  409. * multiplied with bits per pixel, should be lower than the
  410. * size of input_fifo_size in bits.
  411. * 3. The value should be a multiple of a line (256 bits).
  412. */
  413. switch (cpp) {
  414. case 2:
  415. pixel_fetcher_watermark = 128;
  416. break;
  417. case 3:
  418. pixel_fetcher_watermark = 96;
  419. break;
  420. case 4:
  421. pixel_fetcher_watermark = 48;
  422. break;
  423. default:
  424. pixel_fetcher_watermark = 48;
  425. break;
  426. }
  427. dev_dbg(mcde->dev, "pixel fetcher watermark level %d pixels\n",
  428. pixel_fetcher_watermark);
  429. val |= pixel_fetcher_watermark << MCDE_OVLXCONF2_PIXELFETCHERWATERMARKLEVEL_SHIFT;
  430. writel(val, mcde->regs + conf2);
  431. /* Number of bytes to fetch per line */
  432. writel(mcde->stride, mcde->regs + ljinc);
  433. /* No cropping */
  434. writel(0, mcde->regs + crop);
  435. /* Set up overlay control register */
  436. val = MCDE_OVLXCR_OVLEN;
  437. val |= MCDE_OVLXCR_COLCCTRL_DISABLED;
  438. val |= MCDE_OVLXCR_BURSTSIZE_8W <<
  439. MCDE_OVLXCR_BURSTSIZE_SHIFT;
  440. val |= MCDE_OVLXCR_MAXOUTSTANDING_8_REQ <<
  441. MCDE_OVLXCR_MAXOUTSTANDING_SHIFT;
  442. /* Not using rotation but set it up anyways */
  443. val |= MCDE_OVLXCR_ROTBURSTSIZE_8W <<
  444. MCDE_OVLXCR_ROTBURSTSIZE_SHIFT;
  445. writel(val, mcde->regs + cr);
  446. /*
  447. * Set up the overlay compositor to route the overlay out to
  448. * the desired channel
  449. */
  450. val = ch << MCDE_OVLXCOMP_CH_ID_SHIFT;
  451. writel(val, mcde->regs + comp);
  452. }
  453. static void mcde_configure_channel(struct mcde *mcde, enum mcde_channel ch,
  454. enum mcde_fifo fifo,
  455. const struct drm_display_mode *mode)
  456. {
  457. u32 val;
  458. u32 conf;
  459. u32 sync;
  460. u32 stat;
  461. u32 bgcol;
  462. u32 mux;
  463. switch (ch) {
  464. case MCDE_CHANNEL_0:
  465. conf = MCDE_CHNL0CONF;
  466. sync = MCDE_CHNL0SYNCHMOD;
  467. stat = MCDE_CHNL0STAT;
  468. bgcol = MCDE_CHNL0BCKGNDCOL;
  469. mux = MCDE_CHNL0MUXING;
  470. break;
  471. case MCDE_CHANNEL_1:
  472. conf = MCDE_CHNL1CONF;
  473. sync = MCDE_CHNL1SYNCHMOD;
  474. stat = MCDE_CHNL1STAT;
  475. bgcol = MCDE_CHNL1BCKGNDCOL;
  476. mux = MCDE_CHNL1MUXING;
  477. break;
  478. case MCDE_CHANNEL_2:
  479. conf = MCDE_CHNL2CONF;
  480. sync = MCDE_CHNL2SYNCHMOD;
  481. stat = MCDE_CHNL2STAT;
  482. bgcol = MCDE_CHNL2BCKGNDCOL;
  483. mux = MCDE_CHNL2MUXING;
  484. break;
  485. case MCDE_CHANNEL_3:
  486. conf = MCDE_CHNL3CONF;
  487. sync = MCDE_CHNL3SYNCHMOD;
  488. stat = MCDE_CHNL3STAT;
  489. bgcol = MCDE_CHNL3BCKGNDCOL;
  490. mux = MCDE_CHNL3MUXING;
  491. return;
  492. }
  493. /* Set up channel 0 sync (based on chnl_update_registers()) */
  494. switch (mcde->flow_mode) {
  495. case MCDE_COMMAND_ONESHOT_FLOW:
  496. /* Oneshot is achieved with software sync */
  497. val = MCDE_CHNLXSYNCHMOD_SRC_SYNCH_SOFTWARE
  498. << MCDE_CHNLXSYNCHMOD_SRC_SYNCH_SHIFT;
  499. break;
  500. case MCDE_COMMAND_TE_FLOW:
  501. val = MCDE_CHNLXSYNCHMOD_SRC_SYNCH_HARDWARE
  502. << MCDE_CHNLXSYNCHMOD_SRC_SYNCH_SHIFT;
  503. val |= MCDE_CHNLXSYNCHMOD_OUT_SYNCH_SRC_TE0
  504. << MCDE_CHNLXSYNCHMOD_OUT_SYNCH_SRC_SHIFT;
  505. break;
  506. case MCDE_COMMAND_BTA_TE_FLOW:
  507. val = MCDE_CHNLXSYNCHMOD_SRC_SYNCH_HARDWARE
  508. << MCDE_CHNLXSYNCHMOD_SRC_SYNCH_SHIFT;
  509. /*
  510. * TODO:
  511. * The vendor driver uses the formatter as sync source
  512. * for BTA TE mode. Test to use TE if you have a panel
  513. * that uses this mode.
  514. */
  515. val |= MCDE_CHNLXSYNCHMOD_OUT_SYNCH_SRC_FORMATTER
  516. << MCDE_CHNLXSYNCHMOD_OUT_SYNCH_SRC_SHIFT;
  517. break;
  518. case MCDE_VIDEO_TE_FLOW:
  519. val = MCDE_CHNLXSYNCHMOD_SRC_SYNCH_HARDWARE
  520. << MCDE_CHNLXSYNCHMOD_SRC_SYNCH_SHIFT;
  521. val |= MCDE_CHNLXSYNCHMOD_OUT_SYNCH_SRC_TE0
  522. << MCDE_CHNLXSYNCHMOD_OUT_SYNCH_SRC_SHIFT;
  523. break;
  524. case MCDE_VIDEO_FORMATTER_FLOW:
  525. case MCDE_DPI_FORMATTER_FLOW:
  526. val = MCDE_CHNLXSYNCHMOD_SRC_SYNCH_HARDWARE
  527. << MCDE_CHNLXSYNCHMOD_SRC_SYNCH_SHIFT;
  528. val |= MCDE_CHNLXSYNCHMOD_OUT_SYNCH_SRC_FORMATTER
  529. << MCDE_CHNLXSYNCHMOD_OUT_SYNCH_SRC_SHIFT;
  530. break;
  531. default:
  532. dev_err(mcde->dev, "unknown flow mode %d\n",
  533. mcde->flow_mode);
  534. return;
  535. }
  536. writel(val, mcde->regs + sync);
  537. /* Set up pixels per line and lines per frame */
  538. val = (mode->hdisplay - 1) << MCDE_CHNLXCONF_PPL_SHIFT;
  539. val |= (mode->vdisplay - 1) << MCDE_CHNLXCONF_LPF_SHIFT;
  540. writel(val, mcde->regs + conf);
  541. /*
  542. * Normalize color conversion:
  543. * black background, OLED conversion disable on channel
  544. */
  545. val = MCDE_CHNLXSTAT_CHNLBLBCKGND_EN |
  546. MCDE_CHNLXSTAT_CHNLRD;
  547. writel(val, mcde->regs + stat);
  548. writel(0, mcde->regs + bgcol);
  549. /* Set up muxing: connect the channel to the desired FIFO */
  550. switch (fifo) {
  551. case MCDE_FIFO_A:
  552. writel(MCDE_CHNLXMUXING_FIFO_ID_FIFO_A,
  553. mcde->regs + mux);
  554. break;
  555. case MCDE_FIFO_B:
  556. writel(MCDE_CHNLXMUXING_FIFO_ID_FIFO_B,
  557. mcde->regs + mux);
  558. break;
  559. }
  560. /*
  561. * If using DPI configure the sync event.
  562. * TODO: this is for LCD only, it does not cover TV out.
  563. */
  564. if (mcde->dpi_output) {
  565. u32 stripwidth;
  566. stripwidth = 0xF000 / (mode->vdisplay * 4);
  567. dev_info(mcde->dev, "stripwidth: %d\n", stripwidth);
  568. val = MCDE_SYNCHCONF_HWREQVEVENT_ACTIVE_VIDEO |
  569. (mode->hdisplay - 1 - stripwidth) << MCDE_SYNCHCONF_HWREQVCNT_SHIFT |
  570. MCDE_SYNCHCONF_SWINTVEVENT_ACTIVE_VIDEO |
  571. (mode->hdisplay - 1 - stripwidth) << MCDE_SYNCHCONF_SWINTVCNT_SHIFT;
  572. switch (fifo) {
  573. case MCDE_FIFO_A:
  574. writel(val, mcde->regs + MCDE_SYNCHCONFA);
  575. break;
  576. case MCDE_FIFO_B:
  577. writel(val, mcde->regs + MCDE_SYNCHCONFB);
  578. break;
  579. }
  580. }
  581. }
  582. static void mcde_configure_fifo(struct mcde *mcde, enum mcde_fifo fifo,
  583. enum mcde_formatter fmt,
  584. int fifo_wtrmrk)
  585. {
  586. u32 val;
  587. u32 ctrl;
  588. u32 cr0, cr1;
  589. switch (fifo) {
  590. case MCDE_FIFO_A:
  591. ctrl = MCDE_CTRLA;
  592. cr0 = MCDE_CRA0;
  593. cr1 = MCDE_CRA1;
  594. break;
  595. case MCDE_FIFO_B:
  596. ctrl = MCDE_CTRLB;
  597. cr0 = MCDE_CRB0;
  598. cr1 = MCDE_CRB1;
  599. break;
  600. }
  601. val = fifo_wtrmrk << MCDE_CTRLX_FIFOWTRMRK_SHIFT;
  602. /*
  603. * Select the formatter to use for this FIFO
  604. *
  605. * The register definitions imply that different IDs should be used
  606. * by the DSI formatters depending on if they are in VID or CMD
  607. * mode, and the manual says they are dedicated but identical.
  608. * The vendor code uses them as it seems fit.
  609. */
  610. switch (fmt) {
  611. case MCDE_DSI_FORMATTER_0:
  612. val |= MCDE_CTRLX_FORMTYPE_DSI << MCDE_CTRLX_FORMTYPE_SHIFT;
  613. val |= MCDE_CTRLX_FORMID_DSI0VID << MCDE_CTRLX_FORMID_SHIFT;
  614. break;
  615. case MCDE_DSI_FORMATTER_1:
  616. val |= MCDE_CTRLX_FORMTYPE_DSI << MCDE_CTRLX_FORMTYPE_SHIFT;
  617. val |= MCDE_CTRLX_FORMID_DSI0CMD << MCDE_CTRLX_FORMID_SHIFT;
  618. break;
  619. case MCDE_DSI_FORMATTER_2:
  620. val |= MCDE_CTRLX_FORMTYPE_DSI << MCDE_CTRLX_FORMTYPE_SHIFT;
  621. val |= MCDE_CTRLX_FORMID_DSI1VID << MCDE_CTRLX_FORMID_SHIFT;
  622. break;
  623. case MCDE_DSI_FORMATTER_3:
  624. val |= MCDE_CTRLX_FORMTYPE_DSI << MCDE_CTRLX_FORMTYPE_SHIFT;
  625. val |= MCDE_CTRLX_FORMID_DSI1CMD << MCDE_CTRLX_FORMID_SHIFT;
  626. break;
  627. case MCDE_DSI_FORMATTER_4:
  628. val |= MCDE_CTRLX_FORMTYPE_DSI << MCDE_CTRLX_FORMTYPE_SHIFT;
  629. val |= MCDE_CTRLX_FORMID_DSI2VID << MCDE_CTRLX_FORMID_SHIFT;
  630. break;
  631. case MCDE_DSI_FORMATTER_5:
  632. val |= MCDE_CTRLX_FORMTYPE_DSI << MCDE_CTRLX_FORMTYPE_SHIFT;
  633. val |= MCDE_CTRLX_FORMID_DSI2CMD << MCDE_CTRLX_FORMID_SHIFT;
  634. break;
  635. case MCDE_DPI_FORMATTER_0:
  636. val |= MCDE_CTRLX_FORMTYPE_DPITV << MCDE_CTRLX_FORMTYPE_SHIFT;
  637. val |= MCDE_CTRLX_FORMID_DPIA << MCDE_CTRLX_FORMID_SHIFT;
  638. break;
  639. case MCDE_DPI_FORMATTER_1:
  640. val |= MCDE_CTRLX_FORMTYPE_DPITV << MCDE_CTRLX_FORMTYPE_SHIFT;
  641. val |= MCDE_CTRLX_FORMID_DPIB << MCDE_CTRLX_FORMID_SHIFT;
  642. break;
  643. }
  644. writel(val, mcde->regs + ctrl);
  645. /* Blend source with Alpha 0xff on FIFO */
  646. val = MCDE_CRX0_BLENDEN |
  647. 0xff << MCDE_CRX0_ALPHABLEND_SHIFT;
  648. writel(val, mcde->regs + cr0);
  649. spin_lock(&mcde->fifo_crx1_lock);
  650. val = readl(mcde->regs + cr1);
  651. /*
  652. * Set-up from mcde_fmtr_dsi.c, fmtr_dsi_enable_video()
  653. * FIXME: a different clock needs to be selected for TV out.
  654. */
  655. if (mcde->dpi_output) {
  656. struct drm_connector *connector = drm_panel_bridge_connector(mcde->bridge);
  657. u32 bus_format;
  658. /* Assume RGB888 24 bit if we have no further info */
  659. if (!connector->display_info.num_bus_formats) {
  660. dev_info(mcde->dev, "panel does not specify bus format, assume RGB888\n");
  661. bus_format = MEDIA_BUS_FMT_RGB888_1X24;
  662. } else {
  663. bus_format = connector->display_info.bus_formats[0];
  664. }
  665. /*
  666. * Set up the CDWIN and OUTBPP for the LCD
  667. *
  668. * FIXME: fill this in if you know the correspondance between the MIPI
  669. * DPI specification and the media bus formats.
  670. */
  671. val &= ~MCDE_CRX1_CDWIN_MASK;
  672. val &= ~MCDE_CRX1_OUTBPP_MASK;
  673. switch (bus_format) {
  674. case MEDIA_BUS_FMT_RGB888_1X24:
  675. val |= MCDE_CRX1_CDWIN_24BPP << MCDE_CRX1_CDWIN_SHIFT;
  676. val |= MCDE_CRX1_OUTBPP_24BPP << MCDE_CRX1_OUTBPP_SHIFT;
  677. break;
  678. default:
  679. dev_err(mcde->dev, "unknown bus format, assume RGB888\n");
  680. val |= MCDE_CRX1_CDWIN_24BPP << MCDE_CRX1_CDWIN_SHIFT;
  681. val |= MCDE_CRX1_OUTBPP_24BPP << MCDE_CRX1_OUTBPP_SHIFT;
  682. break;
  683. }
  684. } else {
  685. /* Use the MCDE clock for DSI */
  686. val &= ~MCDE_CRX1_CLKSEL_MASK;
  687. val |= MCDE_CRX1_CLKSEL_MCDECLK << MCDE_CRX1_CLKSEL_SHIFT;
  688. }
  689. writel(val, mcde->regs + cr1);
  690. spin_unlock(&mcde->fifo_crx1_lock);
  691. };
  692. static void mcde_configure_dsi_formatter(struct mcde *mcde,
  693. enum mcde_formatter fmt,
  694. u32 formatter_frame,
  695. int pkt_size)
  696. {
  697. u32 val;
  698. u32 conf0;
  699. u32 frame;
  700. u32 pkt;
  701. u32 sync;
  702. u32 cmdw;
  703. u32 delay0, delay1;
  704. switch (fmt) {
  705. case MCDE_DSI_FORMATTER_0:
  706. conf0 = MCDE_DSIVID0CONF0;
  707. frame = MCDE_DSIVID0FRAME;
  708. pkt = MCDE_DSIVID0PKT;
  709. sync = MCDE_DSIVID0SYNC;
  710. cmdw = MCDE_DSIVID0CMDW;
  711. delay0 = MCDE_DSIVID0DELAY0;
  712. delay1 = MCDE_DSIVID0DELAY1;
  713. break;
  714. case MCDE_DSI_FORMATTER_1:
  715. conf0 = MCDE_DSIVID1CONF0;
  716. frame = MCDE_DSIVID1FRAME;
  717. pkt = MCDE_DSIVID1PKT;
  718. sync = MCDE_DSIVID1SYNC;
  719. cmdw = MCDE_DSIVID1CMDW;
  720. delay0 = MCDE_DSIVID1DELAY0;
  721. delay1 = MCDE_DSIVID1DELAY1;
  722. break;
  723. case MCDE_DSI_FORMATTER_2:
  724. conf0 = MCDE_DSIVID2CONF0;
  725. frame = MCDE_DSIVID2FRAME;
  726. pkt = MCDE_DSIVID2PKT;
  727. sync = MCDE_DSIVID2SYNC;
  728. cmdw = MCDE_DSIVID2CMDW;
  729. delay0 = MCDE_DSIVID2DELAY0;
  730. delay1 = MCDE_DSIVID2DELAY1;
  731. break;
  732. default:
  733. dev_err(mcde->dev, "tried to configure a non-DSI formatter as DSI\n");
  734. return;
  735. }
  736. /*
  737. * Enable formatter
  738. * 8 bit commands and DCS commands (notgen = not generic)
  739. */
  740. val = MCDE_DSICONF0_CMD8 | MCDE_DSICONF0_DCSVID_NOTGEN;
  741. if (mcde->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO)
  742. val |= MCDE_DSICONF0_VID_MODE_VID;
  743. switch (mcde->mdsi->format) {
  744. case MIPI_DSI_FMT_RGB888:
  745. val |= MCDE_DSICONF0_PACKING_RGB888 <<
  746. MCDE_DSICONF0_PACKING_SHIFT;
  747. break;
  748. case MIPI_DSI_FMT_RGB666:
  749. val |= MCDE_DSICONF0_PACKING_RGB666 <<
  750. MCDE_DSICONF0_PACKING_SHIFT;
  751. break;
  752. case MIPI_DSI_FMT_RGB666_PACKED:
  753. dev_err(mcde->dev,
  754. "we cannot handle the packed RGB666 format\n");
  755. val |= MCDE_DSICONF0_PACKING_RGB666 <<
  756. MCDE_DSICONF0_PACKING_SHIFT;
  757. break;
  758. case MIPI_DSI_FMT_RGB565:
  759. val |= MCDE_DSICONF0_PACKING_RGB565 <<
  760. MCDE_DSICONF0_PACKING_SHIFT;
  761. break;
  762. default:
  763. dev_err(mcde->dev, "unknown DSI format\n");
  764. return;
  765. }
  766. writel(val, mcde->regs + conf0);
  767. writel(formatter_frame, mcde->regs + frame);
  768. writel(pkt_size, mcde->regs + pkt);
  769. writel(0, mcde->regs + sync);
  770. /* Define the MIPI command: we want to write into display memory */
  771. val = MIPI_DCS_WRITE_MEMORY_CONTINUE <<
  772. MCDE_DSIVIDXCMDW_CMDW_CONTINUE_SHIFT;
  773. val |= MIPI_DCS_WRITE_MEMORY_START <<
  774. MCDE_DSIVIDXCMDW_CMDW_START_SHIFT;
  775. writel(val, mcde->regs + cmdw);
  776. /*
  777. * FIXME: the vendor driver has some hack around this value in
  778. * CMD mode with autotrig.
  779. */
  780. writel(0, mcde->regs + delay0);
  781. writel(0, mcde->regs + delay1);
  782. }
  783. static void mcde_enable_fifo(struct mcde *mcde, enum mcde_fifo fifo)
  784. {
  785. u32 val;
  786. u32 cr;
  787. switch (fifo) {
  788. case MCDE_FIFO_A:
  789. cr = MCDE_CRA0;
  790. break;
  791. case MCDE_FIFO_B:
  792. cr = MCDE_CRB0;
  793. break;
  794. default:
  795. dev_err(mcde->dev, "cannot enable FIFO %c\n",
  796. 'A' + fifo);
  797. return;
  798. }
  799. spin_lock(&mcde->flow_lock);
  800. val = readl(mcde->regs + cr);
  801. val |= MCDE_CRX0_FLOEN;
  802. writel(val, mcde->regs + cr);
  803. mcde->flow_active++;
  804. spin_unlock(&mcde->flow_lock);
  805. }
  806. static void mcde_disable_fifo(struct mcde *mcde, enum mcde_fifo fifo,
  807. bool wait_for_drain)
  808. {
  809. int timeout = 100;
  810. u32 val;
  811. u32 cr;
  812. switch (fifo) {
  813. case MCDE_FIFO_A:
  814. cr = MCDE_CRA0;
  815. break;
  816. case MCDE_FIFO_B:
  817. cr = MCDE_CRB0;
  818. break;
  819. default:
  820. dev_err(mcde->dev, "cannot disable FIFO %c\n",
  821. 'A' + fifo);
  822. return;
  823. }
  824. spin_lock(&mcde->flow_lock);
  825. val = readl(mcde->regs + cr);
  826. val &= ~MCDE_CRX0_FLOEN;
  827. writel(val, mcde->regs + cr);
  828. mcde->flow_active = 0;
  829. spin_unlock(&mcde->flow_lock);
  830. if (!wait_for_drain)
  831. return;
  832. /* Check that we really drained and stopped the flow */
  833. while (readl(mcde->regs + cr) & MCDE_CRX0_FLOEN) {
  834. usleep_range(1000, 1500);
  835. if (!--timeout) {
  836. dev_err(mcde->dev,
  837. "FIFO timeout while clearing FIFO %c\n",
  838. 'A' + fifo);
  839. return;
  840. }
  841. }
  842. }
  843. /*
  844. * This drains a pipe i.e. a FIFO connected to a certain channel
  845. */
  846. static void mcde_drain_pipe(struct mcde *mcde, enum mcde_fifo fifo,
  847. enum mcde_channel ch)
  848. {
  849. u32 val;
  850. u32 ctrl;
  851. u32 synsw;
  852. switch (fifo) {
  853. case MCDE_FIFO_A:
  854. ctrl = MCDE_CTRLA;
  855. break;
  856. case MCDE_FIFO_B:
  857. ctrl = MCDE_CTRLB;
  858. break;
  859. }
  860. switch (ch) {
  861. case MCDE_CHANNEL_0:
  862. synsw = MCDE_CHNL0SYNCHSW;
  863. break;
  864. case MCDE_CHANNEL_1:
  865. synsw = MCDE_CHNL1SYNCHSW;
  866. break;
  867. case MCDE_CHANNEL_2:
  868. synsw = MCDE_CHNL2SYNCHSW;
  869. break;
  870. case MCDE_CHANNEL_3:
  871. synsw = MCDE_CHNL3SYNCHSW;
  872. return;
  873. }
  874. val = readl(mcde->regs + ctrl);
  875. if (!(val & MCDE_CTRLX_FIFOEMPTY)) {
  876. dev_err(mcde->dev, "Channel A FIFO not empty (handover)\n");
  877. /* Attempt to clear the FIFO */
  878. mcde_enable_fifo(mcde, fifo);
  879. /* Trigger a software sync out on respective channel (0-3) */
  880. writel(MCDE_CHNLXSYNCHSW_SW_TRIG, mcde->regs + synsw);
  881. /* Disable FIFO A flow again */
  882. mcde_disable_fifo(mcde, fifo, true);
  883. }
  884. }
  885. static int mcde_dsi_get_pkt_div(int ppl, int fifo_size)
  886. {
  887. /*
  888. * DSI command mode line packets should be split into an even number of
  889. * packets smaller than or equal to the fifo size.
  890. */
  891. int div;
  892. const int max_div = DIV_ROUND_UP(MCDE_MAX_WIDTH, fifo_size);
  893. for (div = 1; div < max_div; div++)
  894. if (ppl % div == 0 && ppl / div <= fifo_size)
  895. return div;
  896. return 1;
  897. }
  898. static void mcde_setup_dpi(struct mcde *mcde, const struct drm_display_mode *mode,
  899. int *fifo_wtrmrk_lvl)
  900. {
  901. struct drm_connector *connector = drm_panel_bridge_connector(mcde->bridge);
  902. u32 hsw, hfp, hbp;
  903. u32 vsw, vfp, vbp;
  904. u32 val;
  905. /* FIXME: we only support LCD, implement TV out */
  906. hsw = mode->hsync_end - mode->hsync_start;
  907. hfp = mode->hsync_start - mode->hdisplay;
  908. hbp = mode->htotal - mode->hsync_end;
  909. vsw = mode->vsync_end - mode->vsync_start;
  910. vfp = mode->vsync_start - mode->vdisplay;
  911. vbp = mode->vtotal - mode->vsync_end;
  912. dev_info(mcde->dev, "output on DPI LCD from channel A\n");
  913. /* Display actual values */
  914. dev_info(mcde->dev, "HSW: %d, HFP: %d, HBP: %d, VSW: %d, VFP: %d, VBP: %d\n",
  915. hsw, hfp, hbp, vsw, vfp, vbp);
  916. /*
  917. * The pixel fetcher is 128 64-bit words deep = 1024 bytes.
  918. * One overlay of 32bpp (4 cpp) assumed, fetch 160 pixels.
  919. * 160 * 4 = 640 bytes.
  920. */
  921. *fifo_wtrmrk_lvl = 640;
  922. /* Set up the main control, watermark level at 7 */
  923. val = 7 << MCDE_CONF0_IFIFOCTRLWTRMRKLVL_SHIFT;
  924. /*
  925. * This sets up the internal silicon muxing of the DPI
  926. * lines. This is how the silicon connects out to the
  927. * external pins, then the pins need to be further
  928. * configured into "alternate functions" using pin control
  929. * to actually get the signals out.
  930. *
  931. * FIXME: this is hardcoded to the only setting found in
  932. * the wild. If we need to use different settings for
  933. * different DPI displays, make this parameterizable from
  934. * the device tree.
  935. */
  936. /* 24 bits DPI: connect Ch A LSB to D[0:7] */
  937. val |= 0 << MCDE_CONF0_OUTMUX0_SHIFT;
  938. /* 24 bits DPI: connect Ch A MID to D[8:15] */
  939. val |= 1 << MCDE_CONF0_OUTMUX1_SHIFT;
  940. /* Don't care about this muxing */
  941. val |= 0 << MCDE_CONF0_OUTMUX2_SHIFT;
  942. /* Don't care about this muxing */
  943. val |= 0 << MCDE_CONF0_OUTMUX3_SHIFT;
  944. /* 24 bits DPI: connect Ch A MSB to D[32:39] */
  945. val |= 2 << MCDE_CONF0_OUTMUX4_SHIFT;
  946. /* Syncmux bits zero: DPI channel A */
  947. writel(val, mcde->regs + MCDE_CONF0);
  948. /* This hammers us into LCD mode */
  949. writel(0, mcde->regs + MCDE_TVCRA);
  950. /* Front porch and sync width */
  951. val = (vsw << MCDE_TVBL1_BEL1_SHIFT);
  952. val |= (vfp << MCDE_TVBL1_BSL1_SHIFT);
  953. writel(val, mcde->regs + MCDE_TVBL1A);
  954. /* The vendor driver sets the same value into TVBL2A */
  955. writel(val, mcde->regs + MCDE_TVBL2A);
  956. /* Vertical back porch */
  957. val = (vbp << MCDE_TVDVO_DVO1_SHIFT);
  958. /* The vendor drivers sets the same value into TVDVOA */
  959. val |= (vbp << MCDE_TVDVO_DVO2_SHIFT);
  960. writel(val, mcde->regs + MCDE_TVDVOA);
  961. /* Horizontal back porch, as 0 = 1 cycle we need to subtract 1 */
  962. writel((hbp - 1), mcde->regs + MCDE_TVTIM1A);
  963. /* Horizongal sync width and horizonal front porch, 0 = 1 cycle */
  964. val = ((hsw - 1) << MCDE_TVLBALW_LBW_SHIFT);
  965. val |= ((hfp - 1) << MCDE_TVLBALW_ALW_SHIFT);
  966. writel(val, mcde->regs + MCDE_TVLBALWA);
  967. /* Blank some TV registers we don't use */
  968. writel(0, mcde->regs + MCDE_TVISLA);
  969. writel(0, mcde->regs + MCDE_TVBLUA);
  970. /* Set up sync inversion etc */
  971. val = 0;
  972. if (mode->flags & DRM_MODE_FLAG_NHSYNC)
  973. val |= MCDE_LCDTIM1B_IHS;
  974. if (mode->flags & DRM_MODE_FLAG_NVSYNC)
  975. val |= MCDE_LCDTIM1B_IVS;
  976. if (connector->display_info.bus_flags & DRM_BUS_FLAG_DE_LOW)
  977. val |= MCDE_LCDTIM1B_IOE;
  978. if (connector->display_info.bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE)
  979. val |= MCDE_LCDTIM1B_IPC;
  980. writel(val, mcde->regs + MCDE_LCDTIM1A);
  981. }
  982. static void mcde_setup_dsi(struct mcde *mcde, const struct drm_display_mode *mode,
  983. int cpp, int *fifo_wtrmrk_lvl, int *dsi_formatter_frame,
  984. int *dsi_pkt_size)
  985. {
  986. u32 formatter_ppl = mode->hdisplay; /* pixels per line */
  987. u32 formatter_lpf = mode->vdisplay; /* lines per frame */
  988. int formatter_frame;
  989. int formatter_cpp;
  990. int fifo_wtrmrk;
  991. u32 pkt_div;
  992. int pkt_size;
  993. u32 val;
  994. dev_info(mcde->dev, "output in %s mode, format %dbpp\n",
  995. (mcde->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO) ?
  996. "VIDEO" : "CMD",
  997. mipi_dsi_pixel_format_to_bpp(mcde->mdsi->format));
  998. formatter_cpp =
  999. mipi_dsi_pixel_format_to_bpp(mcde->mdsi->format) / 8;
  1000. dev_info(mcde->dev, "Overlay CPP: %d bytes, DSI formatter CPP %d bytes\n",
  1001. cpp, formatter_cpp);
  1002. /* Set up the main control, watermark level at 7 */
  1003. val = 7 << MCDE_CONF0_IFIFOCTRLWTRMRKLVL_SHIFT;
  1004. /*
  1005. * This is the internal silicon muxing of the DPI
  1006. * (parallell display) lines. Since we are not using
  1007. * this at all (we are using DSI) these are just
  1008. * dummy values from the vendor tree.
  1009. */
  1010. val |= 3 << MCDE_CONF0_OUTMUX0_SHIFT;
  1011. val |= 3 << MCDE_CONF0_OUTMUX1_SHIFT;
  1012. val |= 0 << MCDE_CONF0_OUTMUX2_SHIFT;
  1013. val |= 4 << MCDE_CONF0_OUTMUX3_SHIFT;
  1014. val |= 5 << MCDE_CONF0_OUTMUX4_SHIFT;
  1015. writel(val, mcde->regs + MCDE_CONF0);
  1016. /* Calculations from mcde_fmtr_dsi.c, fmtr_dsi_enable_video() */
  1017. /*
  1018. * Set up FIFO A watermark level:
  1019. * 128 for LCD 32bpp video mode
  1020. * 48 for LCD 32bpp command mode
  1021. * 128 for LCD 16bpp video mode
  1022. * 64 for LCD 16bpp command mode
  1023. * 128 for HDMI 32bpp
  1024. * 192 for HDMI 16bpp
  1025. */
  1026. fifo_wtrmrk = mode->hdisplay;
  1027. if (mcde->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO) {
  1028. fifo_wtrmrk = min(fifo_wtrmrk, 128);
  1029. pkt_div = 1;
  1030. } else {
  1031. fifo_wtrmrk = min(fifo_wtrmrk, 48);
  1032. /* The FIFO is 640 entries deep on this v3 hardware */
  1033. pkt_div = mcde_dsi_get_pkt_div(mode->hdisplay, 640);
  1034. }
  1035. dev_dbg(mcde->dev, "FIFO watermark after flooring: %d bytes\n",
  1036. fifo_wtrmrk);
  1037. dev_dbg(mcde->dev, "Packet divisor: %d bytes\n", pkt_div);
  1038. /* NOTE: pkt_div is 1 for video mode */
  1039. pkt_size = (formatter_ppl * formatter_cpp) / pkt_div;
  1040. /* Commands CMD8 need one extra byte */
  1041. if (!(mcde->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO))
  1042. pkt_size++;
  1043. dev_dbg(mcde->dev, "DSI packet size: %d * %d bytes per line\n",
  1044. pkt_size, pkt_div);
  1045. dev_dbg(mcde->dev, "Overlay frame size: %u bytes\n",
  1046. mode->hdisplay * mode->vdisplay * cpp);
  1047. /* NOTE: pkt_div is 1 for video mode */
  1048. formatter_frame = pkt_size * pkt_div * formatter_lpf;
  1049. dev_dbg(mcde->dev, "Formatter frame size: %u bytes\n", formatter_frame);
  1050. *fifo_wtrmrk_lvl = fifo_wtrmrk;
  1051. *dsi_pkt_size = pkt_size;
  1052. *dsi_formatter_frame = formatter_frame;
  1053. }
  1054. static void mcde_display_enable(struct drm_simple_display_pipe *pipe,
  1055. struct drm_crtc_state *cstate,
  1056. struct drm_plane_state *plane_state)
  1057. {
  1058. struct drm_crtc *crtc = &pipe->crtc;
  1059. struct drm_plane *plane = &pipe->plane;
  1060. struct drm_device *drm = crtc->dev;
  1061. struct mcde *mcde = to_mcde(drm);
  1062. const struct drm_display_mode *mode = &cstate->mode;
  1063. struct drm_framebuffer *fb = plane->state->fb;
  1064. u32 format = fb->format->format;
  1065. int dsi_pkt_size;
  1066. int fifo_wtrmrk;
  1067. int cpp = fb->format->cpp[0];
  1068. u32 dsi_formatter_frame;
  1069. u32 val;
  1070. int ret;
  1071. /* This powers up the entire MCDE block and the DSI hardware */
  1072. ret = regulator_enable(mcde->epod);
  1073. if (ret) {
  1074. dev_err(drm->dev, "can't re-enable EPOD regulator\n");
  1075. return;
  1076. }
  1077. dev_info(drm->dev, "enable MCDE, %d x %d format %p4cc\n",
  1078. mode->hdisplay, mode->vdisplay, &format);
  1079. /* Clear any pending interrupts */
  1080. mcde_display_disable_irqs(mcde);
  1081. writel(0, mcde->regs + MCDE_IMSCERR);
  1082. writel(0xFFFFFFFF, mcde->regs + MCDE_RISERR);
  1083. if (mcde->dpi_output)
  1084. mcde_setup_dpi(mcde, mode, &fifo_wtrmrk);
  1085. else
  1086. mcde_setup_dsi(mcde, mode, cpp, &fifo_wtrmrk,
  1087. &dsi_formatter_frame, &dsi_pkt_size);
  1088. mcde->stride = mode->hdisplay * cpp;
  1089. dev_dbg(drm->dev, "Overlay line stride: %u bytes\n",
  1090. mcde->stride);
  1091. /* Drain the FIFO A + channel 0 pipe so we have a clean slate */
  1092. mcde_drain_pipe(mcde, MCDE_FIFO_A, MCDE_CHANNEL_0);
  1093. /*
  1094. * We set up our display pipeline:
  1095. * EXTSRC 0 -> OVERLAY 0 -> CHANNEL 0 -> FIFO A -> DSI FORMATTER 0
  1096. *
  1097. * First configure the external source (memory) on external source 0
  1098. * using the desired bitstream/bitmap format
  1099. */
  1100. mcde_configure_extsrc(mcde, MCDE_EXTSRC_0, format);
  1101. /*
  1102. * Configure overlay 0 according to format and mode and take input
  1103. * from external source 0 and route the output of this overlay to
  1104. * channel 0
  1105. */
  1106. mcde_configure_overlay(mcde, MCDE_OVERLAY_0, MCDE_EXTSRC_0,
  1107. MCDE_CHANNEL_0, mode, format, cpp);
  1108. /*
  1109. * Configure pixel-per-line and line-per-frame for channel 0 and then
  1110. * route channel 0 to FIFO A
  1111. */
  1112. mcde_configure_channel(mcde, MCDE_CHANNEL_0, MCDE_FIFO_A, mode);
  1113. if (mcde->dpi_output) {
  1114. unsigned long lcd_freq;
  1115. /* Configure FIFO A to use DPI formatter 0 */
  1116. mcde_configure_fifo(mcde, MCDE_FIFO_A, MCDE_DPI_FORMATTER_0,
  1117. fifo_wtrmrk);
  1118. /* Set up and enable the LCD clock */
  1119. lcd_freq = clk_round_rate(mcde->fifoa_clk, mode->clock * 1000);
  1120. ret = clk_set_rate(mcde->fifoa_clk, lcd_freq);
  1121. if (ret)
  1122. dev_err(mcde->dev, "failed to set LCD clock rate %lu Hz\n",
  1123. lcd_freq);
  1124. ret = clk_prepare_enable(mcde->fifoa_clk);
  1125. if (ret) {
  1126. dev_err(mcde->dev, "failed to enable FIFO A DPI clock\n");
  1127. return;
  1128. }
  1129. dev_info(mcde->dev, "LCD FIFO A clk rate %lu Hz\n",
  1130. clk_get_rate(mcde->fifoa_clk));
  1131. } else {
  1132. /* Configure FIFO A to use DSI formatter 0 */
  1133. mcde_configure_fifo(mcde, MCDE_FIFO_A, MCDE_DSI_FORMATTER_0,
  1134. fifo_wtrmrk);
  1135. /*
  1136. * This brings up the DSI bridge which is tightly connected
  1137. * to the MCDE DSI formatter.
  1138. */
  1139. mcde_dsi_enable(mcde->bridge);
  1140. /* Configure the DSI formatter 0 for the DSI panel output */
  1141. mcde_configure_dsi_formatter(mcde, MCDE_DSI_FORMATTER_0,
  1142. dsi_formatter_frame, dsi_pkt_size);
  1143. }
  1144. switch (mcde->flow_mode) {
  1145. case MCDE_COMMAND_TE_FLOW:
  1146. case MCDE_COMMAND_BTA_TE_FLOW:
  1147. case MCDE_VIDEO_TE_FLOW:
  1148. /* We are using TE in some combination */
  1149. if (mode->flags & DRM_MODE_FLAG_NVSYNC)
  1150. val = MCDE_VSCRC_VSPOL;
  1151. else
  1152. val = 0;
  1153. writel(val, mcde->regs + MCDE_VSCRC0);
  1154. /* Enable VSYNC capture on TE0 */
  1155. val = readl(mcde->regs + MCDE_CRC);
  1156. val |= MCDE_CRC_SYCEN0;
  1157. writel(val, mcde->regs + MCDE_CRC);
  1158. break;
  1159. default:
  1160. /* No TE capture */
  1161. break;
  1162. }
  1163. drm_crtc_vblank_on(crtc);
  1164. /*
  1165. * If we're using oneshot mode we don't start the flow
  1166. * until each time the display is given an update, and
  1167. * then we disable it immediately after. For all other
  1168. * modes (command or video) we start the FIFO flow
  1169. * right here. This is necessary for the hardware to
  1170. * behave right.
  1171. */
  1172. if (mcde->flow_mode != MCDE_COMMAND_ONESHOT_FLOW) {
  1173. mcde_enable_fifo(mcde, MCDE_FIFO_A);
  1174. dev_dbg(mcde->dev, "started MCDE video FIFO flow\n");
  1175. }
  1176. /* Enable MCDE with automatic clock gating */
  1177. val = readl(mcde->regs + MCDE_CR);
  1178. val |= MCDE_CR_MCDEEN | MCDE_CR_AUTOCLKG_EN;
  1179. writel(val, mcde->regs + MCDE_CR);
  1180. dev_info(drm->dev, "MCDE display is enabled\n");
  1181. }
  1182. static void mcde_display_disable(struct drm_simple_display_pipe *pipe)
  1183. {
  1184. struct drm_crtc *crtc = &pipe->crtc;
  1185. struct drm_device *drm = crtc->dev;
  1186. struct mcde *mcde = to_mcde(drm);
  1187. struct drm_pending_vblank_event *event;
  1188. int ret;
  1189. drm_crtc_vblank_off(crtc);
  1190. /* Disable FIFO A flow */
  1191. mcde_disable_fifo(mcde, MCDE_FIFO_A, true);
  1192. if (mcde->dpi_output) {
  1193. clk_disable_unprepare(mcde->fifoa_clk);
  1194. } else {
  1195. /* This disables the DSI bridge */
  1196. mcde_dsi_disable(mcde->bridge);
  1197. }
  1198. event = crtc->state->event;
  1199. if (event) {
  1200. crtc->state->event = NULL;
  1201. spin_lock_irq(&crtc->dev->event_lock);
  1202. drm_crtc_send_vblank_event(crtc, event);
  1203. spin_unlock_irq(&crtc->dev->event_lock);
  1204. }
  1205. ret = regulator_disable(mcde->epod);
  1206. if (ret)
  1207. dev_err(drm->dev, "can't disable EPOD regulator\n");
  1208. /* Make sure we are powered down (before we may power up again) */
  1209. usleep_range(50000, 70000);
  1210. dev_info(drm->dev, "MCDE display is disabled\n");
  1211. }
  1212. static void mcde_start_flow(struct mcde *mcde)
  1213. {
  1214. /* Request a TE ACK only in TE+BTA mode */
  1215. if (mcde->flow_mode == MCDE_COMMAND_BTA_TE_FLOW)
  1216. mcde_dsi_te_request(mcde->mdsi);
  1217. /* Enable FIFO A flow */
  1218. mcde_enable_fifo(mcde, MCDE_FIFO_A);
  1219. /*
  1220. * If oneshot mode is enabled, the flow will be disabled
  1221. * when the TE0 IRQ arrives in the interrupt handler. Otherwise
  1222. * updates are continuously streamed to the display after this
  1223. * point.
  1224. */
  1225. if (mcde->flow_mode == MCDE_COMMAND_ONESHOT_FLOW) {
  1226. /* Trigger a software sync out on channel 0 */
  1227. writel(MCDE_CHNLXSYNCHSW_SW_TRIG,
  1228. mcde->regs + MCDE_CHNL0SYNCHSW);
  1229. /*
  1230. * Disable FIFO A flow again: since we are using TE sync we
  1231. * need to wait for the FIFO to drain before we continue
  1232. * so repeated calls to this function will not cause a mess
  1233. * in the hardware by pushing updates will updates are going
  1234. * on already.
  1235. */
  1236. mcde_disable_fifo(mcde, MCDE_FIFO_A, true);
  1237. }
  1238. dev_dbg(mcde->dev, "started MCDE FIFO flow\n");
  1239. }
  1240. static void mcde_set_extsrc(struct mcde *mcde, u32 buffer_address)
  1241. {
  1242. /* Write bitmap base address to register */
  1243. writel(buffer_address, mcde->regs + MCDE_EXTSRCXA0);
  1244. /*
  1245. * Base address for next line this is probably only used
  1246. * in interlace modes.
  1247. */
  1248. writel(buffer_address + mcde->stride, mcde->regs + MCDE_EXTSRCXA1);
  1249. }
  1250. static void mcde_display_update(struct drm_simple_display_pipe *pipe,
  1251. struct drm_plane_state *old_pstate)
  1252. {
  1253. struct drm_crtc *crtc = &pipe->crtc;
  1254. struct drm_device *drm = crtc->dev;
  1255. struct mcde *mcde = to_mcde(drm);
  1256. struct drm_pending_vblank_event *event = crtc->state->event;
  1257. struct drm_plane *plane = &pipe->plane;
  1258. struct drm_plane_state *pstate = plane->state;
  1259. struct drm_framebuffer *fb = pstate->fb;
  1260. /*
  1261. * Handle any pending event first, we need to arm the vblank
  1262. * interrupt before sending any update to the display so we don't
  1263. * miss the interrupt.
  1264. */
  1265. if (event) {
  1266. crtc->state->event = NULL;
  1267. spin_lock_irq(&crtc->dev->event_lock);
  1268. /*
  1269. * Hardware must be on before we can arm any vblank event,
  1270. * this is not a scanout controller where there is always
  1271. * some periodic update going on, it is completely frozen
  1272. * until we get an update. If MCDE output isn't yet enabled,
  1273. * we just send a vblank dummy event back.
  1274. */
  1275. if (crtc->state->active && drm_crtc_vblank_get(crtc) == 0) {
  1276. dev_dbg(mcde->dev, "arm vblank event\n");
  1277. drm_crtc_arm_vblank_event(crtc, event);
  1278. } else {
  1279. dev_dbg(mcde->dev, "insert fake vblank event\n");
  1280. drm_crtc_send_vblank_event(crtc, event);
  1281. }
  1282. spin_unlock_irq(&crtc->dev->event_lock);
  1283. }
  1284. /*
  1285. * We do not start sending framebuffer updates before the
  1286. * display is enabled. Update events will however be dispatched
  1287. * from the DRM core before the display is enabled.
  1288. */
  1289. if (fb) {
  1290. mcde_set_extsrc(mcde, drm_fb_dma_get_gem_addr(fb, pstate, 0));
  1291. dev_info_once(mcde->dev, "first update of display contents\n");
  1292. /*
  1293. * Usually the flow is already active, unless we are in
  1294. * oneshot mode, then we need to kick the flow right here.
  1295. */
  1296. if (mcde->flow_active == 0)
  1297. mcde_start_flow(mcde);
  1298. } else {
  1299. /*
  1300. * If an update is receieved before the MCDE is enabled
  1301. * (before mcde_display_enable() is called) we can't really
  1302. * do much with that buffer.
  1303. */
  1304. dev_info(mcde->dev, "ignored a display update\n");
  1305. }
  1306. }
  1307. static int mcde_display_enable_vblank(struct drm_simple_display_pipe *pipe)
  1308. {
  1309. struct drm_crtc *crtc = &pipe->crtc;
  1310. struct drm_device *drm = crtc->dev;
  1311. struct mcde *mcde = to_mcde(drm);
  1312. u32 val;
  1313. /* Enable all VBLANK IRQs */
  1314. val = MCDE_PP_VCMPA |
  1315. MCDE_PP_VCMPB |
  1316. MCDE_PP_VSCC0 |
  1317. MCDE_PP_VSCC1 |
  1318. MCDE_PP_VCMPC0 |
  1319. MCDE_PP_VCMPC1;
  1320. writel(val, mcde->regs + MCDE_IMSCPP);
  1321. return 0;
  1322. }
  1323. static void mcde_display_disable_vblank(struct drm_simple_display_pipe *pipe)
  1324. {
  1325. struct drm_crtc *crtc = &pipe->crtc;
  1326. struct drm_device *drm = crtc->dev;
  1327. struct mcde *mcde = to_mcde(drm);
  1328. /* Disable all VBLANK IRQs */
  1329. writel(0, mcde->regs + MCDE_IMSCPP);
  1330. /* Clear any pending IRQs */
  1331. writel(0xFFFFFFFF, mcde->regs + MCDE_RISPP);
  1332. }
  1333. static struct drm_simple_display_pipe_funcs mcde_display_funcs = {
  1334. .check = mcde_display_check,
  1335. .enable = mcde_display_enable,
  1336. .disable = mcde_display_disable,
  1337. .update = mcde_display_update,
  1338. .enable_vblank = mcde_display_enable_vblank,
  1339. .disable_vblank = mcde_display_disable_vblank,
  1340. };
  1341. int mcde_display_init(struct drm_device *drm)
  1342. {
  1343. struct mcde *mcde = to_mcde(drm);
  1344. int ret;
  1345. static const u32 formats[] = {
  1346. DRM_FORMAT_ARGB8888,
  1347. DRM_FORMAT_ABGR8888,
  1348. DRM_FORMAT_XRGB8888,
  1349. DRM_FORMAT_XBGR8888,
  1350. DRM_FORMAT_RGB888,
  1351. DRM_FORMAT_BGR888,
  1352. DRM_FORMAT_ARGB4444,
  1353. DRM_FORMAT_ABGR4444,
  1354. DRM_FORMAT_XRGB4444,
  1355. DRM_FORMAT_XBGR4444,
  1356. /* These are actually IRGB1555 so intensity bit is lost */
  1357. DRM_FORMAT_XRGB1555,
  1358. DRM_FORMAT_XBGR1555,
  1359. DRM_FORMAT_RGB565,
  1360. DRM_FORMAT_BGR565,
  1361. DRM_FORMAT_YUV422,
  1362. };
  1363. ret = mcde_init_clock_divider(mcde);
  1364. if (ret)
  1365. return ret;
  1366. ret = drm_simple_display_pipe_init(drm, &mcde->pipe,
  1367. &mcde_display_funcs,
  1368. formats, ARRAY_SIZE(formats),
  1369. NULL,
  1370. mcde->connector);
  1371. if (ret)
  1372. return ret;
  1373. return 0;
  1374. }
  1375. EXPORT_SYMBOL_GPL(mcde_display_init);