zynqmp_dp.c 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * ZynqMP DisplayPort Driver
  4. *
  5. * Copyright (C) 2017 - 2020 Xilinx, Inc.
  6. *
  7. * Authors:
  8. * - Hyun Woo Kwon <hyun.kwon@xilinx.com>
  9. * - Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  10. */
  11. #include <drm/display/drm_dp_helper.h>
  12. #include <drm/drm_atomic_helper.h>
  13. #include <drm/drm_crtc.h>
  14. #include <drm/drm_device.h>
  15. #include <drm/drm_edid.h>
  16. #include <drm/drm_fourcc.h>
  17. #include <drm/drm_modes.h>
  18. #include <drm/drm_of.h>
  19. #include <linux/clk.h>
  20. #include <linux/delay.h>
  21. #include <linux/device.h>
  22. #include <linux/io.h>
  23. #include <linux/media-bus-format.h>
  24. #include <linux/module.h>
  25. #include <linux/platform_device.h>
  26. #include <linux/pm_runtime.h>
  27. #include <linux/phy/phy.h>
  28. #include <linux/reset.h>
  29. #include <linux/slab.h>
  30. #include "zynqmp_disp.h"
  31. #include "zynqmp_dp.h"
  32. #include "zynqmp_dpsub.h"
  33. #include "zynqmp_kms.h"
  34. static uint zynqmp_dp_aux_timeout_ms = 50;
  35. module_param_named(aux_timeout_ms, zynqmp_dp_aux_timeout_ms, uint, 0444);
  36. MODULE_PARM_DESC(aux_timeout_ms, "DP aux timeout value in msec (default: 50)");
  37. /*
  38. * Some sink requires a delay after power on request
  39. */
  40. static uint zynqmp_dp_power_on_delay_ms = 4;
  41. module_param_named(power_on_delay_ms, zynqmp_dp_power_on_delay_ms, uint, 0444);
  42. MODULE_PARM_DESC(power_on_delay_ms, "DP power on delay in msec (default: 4)");
  43. /* Link configuration registers */
  44. #define ZYNQMP_DP_LINK_BW_SET 0x0
  45. #define ZYNQMP_DP_LANE_COUNT_SET 0x4
  46. #define ZYNQMP_DP_ENHANCED_FRAME_EN 0x8
  47. #define ZYNQMP_DP_TRAINING_PATTERN_SET 0xc
  48. #define ZYNQMP_DP_SCRAMBLING_DISABLE 0x14
  49. #define ZYNQMP_DP_DOWNSPREAD_CTL 0x18
  50. #define ZYNQMP_DP_SOFTWARE_RESET 0x1c
  51. #define ZYNQMP_DP_SOFTWARE_RESET_STREAM1 BIT(0)
  52. #define ZYNQMP_DP_SOFTWARE_RESET_STREAM2 BIT(1)
  53. #define ZYNQMP_DP_SOFTWARE_RESET_STREAM3 BIT(2)
  54. #define ZYNQMP_DP_SOFTWARE_RESET_STREAM4 BIT(3)
  55. #define ZYNQMP_DP_SOFTWARE_RESET_AUX BIT(7)
  56. #define ZYNQMP_DP_SOFTWARE_RESET_ALL (ZYNQMP_DP_SOFTWARE_RESET_STREAM1 | \
  57. ZYNQMP_DP_SOFTWARE_RESET_STREAM2 | \
  58. ZYNQMP_DP_SOFTWARE_RESET_STREAM3 | \
  59. ZYNQMP_DP_SOFTWARE_RESET_STREAM4 | \
  60. ZYNQMP_DP_SOFTWARE_RESET_AUX)
  61. /* Core enable registers */
  62. #define ZYNQMP_DP_TRANSMITTER_ENABLE 0x80
  63. #define ZYNQMP_DP_MAIN_STREAM_ENABLE 0x84
  64. #define ZYNQMP_DP_FORCE_SCRAMBLER_RESET 0xc0
  65. #define ZYNQMP_DP_VERSION 0xf8
  66. #define ZYNQMP_DP_VERSION_MAJOR_MASK GENMASK(31, 24)
  67. #define ZYNQMP_DP_VERSION_MAJOR_SHIFT 24
  68. #define ZYNQMP_DP_VERSION_MINOR_MASK GENMASK(23, 16)
  69. #define ZYNQMP_DP_VERSION_MINOR_SHIFT 16
  70. #define ZYNQMP_DP_VERSION_REVISION_MASK GENMASK(15, 12)
  71. #define ZYNQMP_DP_VERSION_REVISION_SHIFT 12
  72. #define ZYNQMP_DP_VERSION_PATCH_MASK GENMASK(11, 8)
  73. #define ZYNQMP_DP_VERSION_PATCH_SHIFT 8
  74. #define ZYNQMP_DP_VERSION_INTERNAL_MASK GENMASK(7, 0)
  75. #define ZYNQMP_DP_VERSION_INTERNAL_SHIFT 0
  76. /* Core ID registers */
  77. #define ZYNQMP_DP_CORE_ID 0xfc
  78. #define ZYNQMP_DP_CORE_ID_MAJOR_MASK GENMASK(31, 24)
  79. #define ZYNQMP_DP_CORE_ID_MAJOR_SHIFT 24
  80. #define ZYNQMP_DP_CORE_ID_MINOR_MASK GENMASK(23, 16)
  81. #define ZYNQMP_DP_CORE_ID_MINOR_SHIFT 16
  82. #define ZYNQMP_DP_CORE_ID_REVISION_MASK GENMASK(15, 8)
  83. #define ZYNQMP_DP_CORE_ID_REVISION_SHIFT 8
  84. #define ZYNQMP_DP_CORE_ID_DIRECTION GENMASK(1)
  85. /* AUX channel interface registers */
  86. #define ZYNQMP_DP_AUX_COMMAND 0x100
  87. #define ZYNQMP_DP_AUX_COMMAND_CMD_SHIFT 8
  88. #define ZYNQMP_DP_AUX_COMMAND_ADDRESS_ONLY BIT(12)
  89. #define ZYNQMP_DP_AUX_COMMAND_BYTES_SHIFT 0
  90. #define ZYNQMP_DP_AUX_WRITE_FIFO 0x104
  91. #define ZYNQMP_DP_AUX_ADDRESS 0x108
  92. #define ZYNQMP_DP_AUX_CLK_DIVIDER 0x10c
  93. #define ZYNQMP_DP_AUX_CLK_DIVIDER_AUX_FILTER_SHIFT 8
  94. #define ZYNQMP_DP_INTERRUPT_SIGNAL_STATE 0x130
  95. #define ZYNQMP_DP_INTERRUPT_SIGNAL_STATE_HPD BIT(0)
  96. #define ZYNQMP_DP_INTERRUPT_SIGNAL_STATE_REQUEST BIT(1)
  97. #define ZYNQMP_DP_INTERRUPT_SIGNAL_STATE_REPLY BIT(2)
  98. #define ZYNQMP_DP_INTERRUPT_SIGNAL_STATE_REPLY_TIMEOUT BIT(3)
  99. #define ZYNQMP_DP_AUX_REPLY_DATA 0x134
  100. #define ZYNQMP_DP_AUX_REPLY_CODE 0x138
  101. #define ZYNQMP_DP_AUX_REPLY_CODE_AUX_ACK (0)
  102. #define ZYNQMP_DP_AUX_REPLY_CODE_AUX_NACK BIT(0)
  103. #define ZYNQMP_DP_AUX_REPLY_CODE_AUX_DEFER BIT(1)
  104. #define ZYNQMP_DP_AUX_REPLY_CODE_I2C_ACK (0)
  105. #define ZYNQMP_DP_AUX_REPLY_CODE_I2C_NACK BIT(2)
  106. #define ZYNQMP_DP_AUX_REPLY_CODE_I2C_DEFER BIT(3)
  107. #define ZYNQMP_DP_AUX_REPLY_COUNT 0x13c
  108. #define ZYNQMP_DP_REPLY_DATA_COUNT 0x148
  109. #define ZYNQMP_DP_REPLY_DATA_COUNT_MASK 0xff
  110. #define ZYNQMP_DP_INT_STATUS 0x3a0
  111. #define ZYNQMP_DP_INT_MASK 0x3a4
  112. #define ZYNQMP_DP_INT_EN 0x3a8
  113. #define ZYNQMP_DP_INT_DS 0x3ac
  114. #define ZYNQMP_DP_INT_HPD_IRQ BIT(0)
  115. #define ZYNQMP_DP_INT_HPD_EVENT BIT(1)
  116. #define ZYNQMP_DP_INT_REPLY_RECEIVED BIT(2)
  117. #define ZYNQMP_DP_INT_REPLY_TIMEOUT BIT(3)
  118. #define ZYNQMP_DP_INT_HPD_PULSE_DET BIT(4)
  119. #define ZYNQMP_DP_INT_EXT_PKT_TXD BIT(5)
  120. #define ZYNQMP_DP_INT_LIV_ABUF_UNDRFLW BIT(12)
  121. #define ZYNQMP_DP_INT_VBLANK_START BIT(13)
  122. #define ZYNQMP_DP_INT_PIXEL1_MATCH BIT(14)
  123. #define ZYNQMP_DP_INT_PIXEL0_MATCH BIT(15)
  124. #define ZYNQMP_DP_INT_CHBUF_UNDERFLW_MASK 0x3f0000
  125. #define ZYNQMP_DP_INT_CHBUF_OVERFLW_MASK 0xfc00000
  126. #define ZYNQMP_DP_INT_CUST_TS_2 BIT(28)
  127. #define ZYNQMP_DP_INT_CUST_TS BIT(29)
  128. #define ZYNQMP_DP_INT_EXT_VSYNC_TS BIT(30)
  129. #define ZYNQMP_DP_INT_VSYNC_TS BIT(31)
  130. #define ZYNQMP_DP_INT_ALL (ZYNQMP_DP_INT_HPD_IRQ | \
  131. ZYNQMP_DP_INT_HPD_EVENT | \
  132. ZYNQMP_DP_INT_CHBUF_UNDERFLW_MASK | \
  133. ZYNQMP_DP_INT_CHBUF_OVERFLW_MASK)
  134. /* Main stream attribute registers */
  135. #define ZYNQMP_DP_MAIN_STREAM_HTOTAL 0x180
  136. #define ZYNQMP_DP_MAIN_STREAM_VTOTAL 0x184
  137. #define ZYNQMP_DP_MAIN_STREAM_POLARITY 0x188
  138. #define ZYNQMP_DP_MAIN_STREAM_POLARITY_HSYNC_SHIFT 0
  139. #define ZYNQMP_DP_MAIN_STREAM_POLARITY_VSYNC_SHIFT 1
  140. #define ZYNQMP_DP_MAIN_STREAM_HSWIDTH 0x18c
  141. #define ZYNQMP_DP_MAIN_STREAM_VSWIDTH 0x190
  142. #define ZYNQMP_DP_MAIN_STREAM_HRES 0x194
  143. #define ZYNQMP_DP_MAIN_STREAM_VRES 0x198
  144. #define ZYNQMP_DP_MAIN_STREAM_HSTART 0x19c
  145. #define ZYNQMP_DP_MAIN_STREAM_VSTART 0x1a0
  146. #define ZYNQMP_DP_MAIN_STREAM_MISC0 0x1a4
  147. #define ZYNQMP_DP_MAIN_STREAM_MISC0_SYNC_LOCK BIT(0)
  148. #define ZYNQMP_DP_MAIN_STREAM_MISC0_COMP_FORMAT_RGB (0 << 1)
  149. #define ZYNQMP_DP_MAIN_STREAM_MISC0_COMP_FORMAT_YCRCB_422 (5 << 1)
  150. #define ZYNQMP_DP_MAIN_STREAM_MISC0_COMP_FORMAT_YCRCB_444 (6 << 1)
  151. #define ZYNQMP_DP_MAIN_STREAM_MISC0_COMP_FORMAT_MASK (7 << 1)
  152. #define ZYNQMP_DP_MAIN_STREAM_MISC0_DYNAMIC_RANGE BIT(3)
  153. #define ZYNQMP_DP_MAIN_STREAM_MISC0_YCBCR_COLR BIT(4)
  154. #define ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_6 (0 << 5)
  155. #define ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_8 (1 << 5)
  156. #define ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_10 (2 << 5)
  157. #define ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_12 (3 << 5)
  158. #define ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_16 (4 << 5)
  159. #define ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_MASK (7 << 5)
  160. #define ZYNQMP_DP_MAIN_STREAM_MISC1 0x1a8
  161. #define ZYNQMP_DP_MAIN_STREAM_MISC1_Y_ONLY_EN BIT(7)
  162. #define ZYNQMP_DP_MAIN_STREAM_M_VID 0x1ac
  163. #define ZYNQMP_DP_MSA_TRANSFER_UNIT_SIZE 0x1b0
  164. #define ZYNQMP_DP_MSA_TRANSFER_UNIT_SIZE_TU_SIZE_DEF 64
  165. #define ZYNQMP_DP_MAIN_STREAM_N_VID 0x1b4
  166. #define ZYNQMP_DP_USER_PIX_WIDTH 0x1b8
  167. #define ZYNQMP_DP_USER_DATA_COUNT_PER_LANE 0x1bc
  168. #define ZYNQMP_DP_MIN_BYTES_PER_TU 0x1c4
  169. #define ZYNQMP_DP_FRAC_BYTES_PER_TU 0x1c8
  170. #define ZYNQMP_DP_INIT_WAIT 0x1cc
  171. /* PHY configuration and status registers */
  172. #define ZYNQMP_DP_PHY_RESET 0x200
  173. #define ZYNQMP_DP_PHY_RESET_PHY_RESET BIT(0)
  174. #define ZYNQMP_DP_PHY_RESET_GTTX_RESET BIT(1)
  175. #define ZYNQMP_DP_PHY_RESET_PHY_PMA_RESET BIT(8)
  176. #define ZYNQMP_DP_PHY_RESET_PHY_PCS_RESET BIT(9)
  177. #define ZYNQMP_DP_PHY_RESET_ALL_RESET (ZYNQMP_DP_PHY_RESET_PHY_RESET | \
  178. ZYNQMP_DP_PHY_RESET_GTTX_RESET | \
  179. ZYNQMP_DP_PHY_RESET_PHY_PMA_RESET | \
  180. ZYNQMP_DP_PHY_RESET_PHY_PCS_RESET)
  181. #define ZYNQMP_DP_PHY_PREEMPHASIS_LANE_0 0x210
  182. #define ZYNQMP_DP_PHY_PREEMPHASIS_LANE_1 0x214
  183. #define ZYNQMP_DP_PHY_PREEMPHASIS_LANE_2 0x218
  184. #define ZYNQMP_DP_PHY_PREEMPHASIS_LANE_3 0x21c
  185. #define ZYNQMP_DP_PHY_VOLTAGE_DIFF_LANE_0 0x220
  186. #define ZYNQMP_DP_PHY_VOLTAGE_DIFF_LANE_1 0x224
  187. #define ZYNQMP_DP_PHY_VOLTAGE_DIFF_LANE_2 0x228
  188. #define ZYNQMP_DP_PHY_VOLTAGE_DIFF_LANE_3 0x22c
  189. #define ZYNQMP_DP_PHY_CLOCK_SELECT 0x234
  190. #define ZYNQMP_DP_PHY_CLOCK_SELECT_1_62G 0x1
  191. #define ZYNQMP_DP_PHY_CLOCK_SELECT_2_70G 0x3
  192. #define ZYNQMP_DP_PHY_CLOCK_SELECT_5_40G 0x5
  193. #define ZYNQMP_DP_TX_PHY_POWER_DOWN 0x238
  194. #define ZYNQMP_DP_TX_PHY_POWER_DOWN_LANE_0 BIT(0)
  195. #define ZYNQMP_DP_TX_PHY_POWER_DOWN_LANE_1 BIT(1)
  196. #define ZYNQMP_DP_TX_PHY_POWER_DOWN_LANE_2 BIT(2)
  197. #define ZYNQMP_DP_TX_PHY_POWER_DOWN_LANE_3 BIT(3)
  198. #define ZYNQMP_DP_TX_PHY_POWER_DOWN_ALL 0xf
  199. #define ZYNQMP_DP_PHY_PRECURSOR_LANE_0 0x23c
  200. #define ZYNQMP_DP_PHY_PRECURSOR_LANE_1 0x240
  201. #define ZYNQMP_DP_PHY_PRECURSOR_LANE_2 0x244
  202. #define ZYNQMP_DP_PHY_PRECURSOR_LANE_3 0x248
  203. #define ZYNQMP_DP_PHY_POSTCURSOR_LANE_0 0x24c
  204. #define ZYNQMP_DP_PHY_POSTCURSOR_LANE_1 0x250
  205. #define ZYNQMP_DP_PHY_POSTCURSOR_LANE_2 0x254
  206. #define ZYNQMP_DP_PHY_POSTCURSOR_LANE_3 0x258
  207. #define ZYNQMP_DP_SUB_TX_PHY_PRECURSOR_LANE_0 0x24c
  208. #define ZYNQMP_DP_SUB_TX_PHY_PRECURSOR_LANE_1 0x250
  209. #define ZYNQMP_DP_PHY_STATUS 0x280
  210. #define ZYNQMP_DP_PHY_STATUS_PLL_LOCKED_SHIFT 4
  211. #define ZYNQMP_DP_PHY_STATUS_FPGA_PLL_LOCKED BIT(6)
  212. /* Audio registers */
  213. #define ZYNQMP_DP_TX_AUDIO_CONTROL 0x300
  214. #define ZYNQMP_DP_TX_AUDIO_CHANNELS 0x304
  215. #define ZYNQMP_DP_TX_AUDIO_INFO_DATA 0x308
  216. #define ZYNQMP_DP_TX_M_AUD 0x328
  217. #define ZYNQMP_DP_TX_N_AUD 0x32c
  218. #define ZYNQMP_DP_TX_AUDIO_EXT_DATA 0x330
  219. #define ZYNQMP_DP_MAX_LANES 2
  220. #define ZYNQMP_MAX_FREQ 3000000
  221. #define DP_REDUCED_BIT_RATE 162000
  222. #define DP_HIGH_BIT_RATE 270000
  223. #define DP_HIGH_BIT_RATE2 540000
  224. #define DP_MAX_TRAINING_TRIES 5
  225. #define DP_V1_2 0x12
  226. /**
  227. * struct zynqmp_dp_link_config - Common link config between source and sink
  228. * @max_rate: maximum link rate
  229. * @max_lanes: maximum number of lanes
  230. */
  231. struct zynqmp_dp_link_config {
  232. int max_rate;
  233. u8 max_lanes;
  234. };
  235. /**
  236. * struct zynqmp_dp_mode - Configured mode of DisplayPort
  237. * @bw_code: code for bandwidth(link rate)
  238. * @lane_cnt: number of lanes
  239. * @pclock: pixel clock frequency of current mode
  240. * @fmt: format identifier string
  241. */
  242. struct zynqmp_dp_mode {
  243. const char *fmt;
  244. int pclock;
  245. u8 bw_code;
  246. u8 lane_cnt;
  247. };
  248. /**
  249. * struct zynqmp_dp_config - Configuration of DisplayPort from DTS
  250. * @misc0: misc0 configuration (per DP v1.2 spec)
  251. * @misc1: misc1 configuration (per DP v1.2 spec)
  252. * @bpp: bits per pixel
  253. */
  254. struct zynqmp_dp_config {
  255. u8 misc0;
  256. u8 misc1;
  257. u8 bpp;
  258. };
  259. /**
  260. * struct zynqmp_dp - Xilinx DisplayPort core
  261. * @dev: device structure
  262. * @dpsub: Display subsystem
  263. * @iomem: device I/O memory for register access
  264. * @reset: reset controller
  265. * @irq: irq
  266. * @bridge: DRM bridge for the DP encoder
  267. * @next_bridge: The downstream bridge
  268. * @config: IP core configuration from DTS
  269. * @aux: aux channel
  270. * @phy: PHY handles for DP lanes
  271. * @num_lanes: number of enabled phy lanes
  272. * @hpd_work: hot plug detection worker
  273. * @status: connection status
  274. * @enabled: flag to indicate if the device is enabled
  275. * @dpcd: DP configuration data from currently connected sink device
  276. * @link_config: common link configuration between IP core and sink device
  277. * @mode: current mode between IP core and sink device
  278. * @train_set: set of training data
  279. */
  280. struct zynqmp_dp {
  281. struct drm_dp_aux aux;
  282. struct drm_bridge bridge;
  283. struct work_struct hpd_work;
  284. struct drm_bridge *next_bridge;
  285. struct device *dev;
  286. struct zynqmp_dpsub *dpsub;
  287. void __iomem *iomem;
  288. struct reset_control *reset;
  289. struct phy *phy[ZYNQMP_DP_MAX_LANES];
  290. enum drm_connector_status status;
  291. int irq;
  292. bool enabled;
  293. struct zynqmp_dp_mode mode;
  294. struct zynqmp_dp_link_config link_config;
  295. struct zynqmp_dp_config config;
  296. u8 dpcd[DP_RECEIVER_CAP_SIZE];
  297. u8 train_set[ZYNQMP_DP_MAX_LANES];
  298. u8 num_lanes;
  299. };
  300. static inline struct zynqmp_dp *bridge_to_dp(struct drm_bridge *bridge)
  301. {
  302. return container_of(bridge, struct zynqmp_dp, bridge);
  303. }
  304. static void zynqmp_dp_write(struct zynqmp_dp *dp, int offset, u32 val)
  305. {
  306. writel(val, dp->iomem + offset);
  307. }
  308. static u32 zynqmp_dp_read(struct zynqmp_dp *dp, int offset)
  309. {
  310. return readl(dp->iomem + offset);
  311. }
  312. static void zynqmp_dp_clr(struct zynqmp_dp *dp, int offset, u32 clr)
  313. {
  314. zynqmp_dp_write(dp, offset, zynqmp_dp_read(dp, offset) & ~clr);
  315. }
  316. static void zynqmp_dp_set(struct zynqmp_dp *dp, int offset, u32 set)
  317. {
  318. zynqmp_dp_write(dp, offset, zynqmp_dp_read(dp, offset) | set);
  319. }
  320. /* -----------------------------------------------------------------------------
  321. * PHY Handling
  322. */
  323. #define RST_TIMEOUT_MS 1000
  324. static int zynqmp_dp_reset(struct zynqmp_dp *dp, bool assert)
  325. {
  326. unsigned long timeout;
  327. if (assert)
  328. reset_control_assert(dp->reset);
  329. else
  330. reset_control_deassert(dp->reset);
  331. /* Wait for the (de)assert to complete. */
  332. timeout = jiffies + msecs_to_jiffies(RST_TIMEOUT_MS);
  333. while (!time_after_eq(jiffies, timeout)) {
  334. bool status = !!reset_control_status(dp->reset);
  335. if (assert == status)
  336. return 0;
  337. cpu_relax();
  338. }
  339. dev_err(dp->dev, "reset %s timeout\n", assert ? "assert" : "deassert");
  340. return -ETIMEDOUT;
  341. }
  342. /**
  343. * zynqmp_dp_phy_init - Initialize the phy
  344. * @dp: DisplayPort IP core structure
  345. *
  346. * Initialize the phy.
  347. *
  348. * Return: 0 if the phy instances are initialized correctly, or the error code
  349. * returned from the callee functions.
  350. */
  351. static int zynqmp_dp_phy_init(struct zynqmp_dp *dp)
  352. {
  353. int ret;
  354. int i;
  355. for (i = 0; i < dp->num_lanes; i++) {
  356. ret = phy_init(dp->phy[i]);
  357. if (ret) {
  358. dev_err(dp->dev, "failed to init phy lane %d\n", i);
  359. return ret;
  360. }
  361. }
  362. zynqmp_dp_clr(dp, ZYNQMP_DP_PHY_RESET, ZYNQMP_DP_PHY_RESET_ALL_RESET);
  363. /*
  364. * Power on lanes in reverse order as only lane 0 waits for the PLL to
  365. * lock.
  366. */
  367. for (i = dp->num_lanes - 1; i >= 0; i--) {
  368. ret = phy_power_on(dp->phy[i]);
  369. if (ret) {
  370. dev_err(dp->dev, "failed to power on phy lane %d\n", i);
  371. return ret;
  372. }
  373. }
  374. return 0;
  375. }
  376. /**
  377. * zynqmp_dp_phy_exit - Exit the phy
  378. * @dp: DisplayPort IP core structure
  379. *
  380. * Exit the phy.
  381. */
  382. static void zynqmp_dp_phy_exit(struct zynqmp_dp *dp)
  383. {
  384. unsigned int i;
  385. int ret;
  386. for (i = 0; i < dp->num_lanes; i++) {
  387. ret = phy_power_off(dp->phy[i]);
  388. if (ret)
  389. dev_err(dp->dev, "failed to power off phy(%d) %d\n", i,
  390. ret);
  391. }
  392. for (i = 0; i < dp->num_lanes; i++) {
  393. ret = phy_exit(dp->phy[i]);
  394. if (ret)
  395. dev_err(dp->dev, "failed to exit phy(%d) %d\n", i, ret);
  396. }
  397. }
  398. /**
  399. * zynqmp_dp_phy_probe - Probe the PHYs
  400. * @dp: DisplayPort IP core structure
  401. *
  402. * Probe PHYs for all lanes. Less PHYs may be available than the number of
  403. * lanes, which is not considered an error as long as at least one PHY is
  404. * found. The caller can check dp->num_lanes to check how many PHYs were found.
  405. *
  406. * Return:
  407. * * 0 - Success
  408. * * -ENXIO - No PHY found
  409. * * -EPROBE_DEFER - Probe deferral requested
  410. * * Other negative value - PHY retrieval failure
  411. */
  412. static int zynqmp_dp_phy_probe(struct zynqmp_dp *dp)
  413. {
  414. unsigned int i;
  415. for (i = 0; i < ZYNQMP_DP_MAX_LANES; i++) {
  416. char phy_name[16];
  417. struct phy *phy;
  418. snprintf(phy_name, sizeof(phy_name), "dp-phy%d", i);
  419. phy = devm_phy_get(dp->dev, phy_name);
  420. if (IS_ERR(phy)) {
  421. switch (PTR_ERR(phy)) {
  422. case -ENODEV:
  423. if (dp->num_lanes)
  424. return 0;
  425. dev_err(dp->dev, "no PHY found\n");
  426. return -ENXIO;
  427. case -EPROBE_DEFER:
  428. return -EPROBE_DEFER;
  429. default:
  430. dev_err(dp->dev, "failed to get PHY lane %u\n",
  431. i);
  432. return PTR_ERR(phy);
  433. }
  434. }
  435. dp->phy[i] = phy;
  436. dp->num_lanes++;
  437. }
  438. return 0;
  439. }
  440. /**
  441. * zynqmp_dp_phy_ready - Check if PHY is ready
  442. * @dp: DisplayPort IP core structure
  443. *
  444. * Check if PHY is ready. If PHY is not ready, wait 1ms to check for 100 times.
  445. * This amount of delay was suggested by IP designer.
  446. *
  447. * Return: 0 if PHY is ready, or -ENODEV if PHY is not ready.
  448. */
  449. static int zynqmp_dp_phy_ready(struct zynqmp_dp *dp)
  450. {
  451. u32 i, reg, ready;
  452. ready = (1 << dp->num_lanes) - 1;
  453. /* Wait for 100 * 1ms. This should be enough time for PHY to be ready */
  454. for (i = 0; ; i++) {
  455. reg = zynqmp_dp_read(dp, ZYNQMP_DP_PHY_STATUS);
  456. if ((reg & ready) == ready)
  457. return 0;
  458. if (i == 100) {
  459. dev_err(dp->dev, "PHY isn't ready\n");
  460. return -ENODEV;
  461. }
  462. usleep_range(1000, 1100);
  463. }
  464. return 0;
  465. }
  466. /* -----------------------------------------------------------------------------
  467. * DisplayPort Link Training
  468. */
  469. /**
  470. * zynqmp_dp_max_rate - Calculate and return available max pixel clock
  471. * @link_rate: link rate (Kilo-bytes / sec)
  472. * @lane_num: number of lanes
  473. * @bpp: bits per pixel
  474. *
  475. * Return: max pixel clock (KHz) supported by current link config.
  476. */
  477. static inline int zynqmp_dp_max_rate(int link_rate, u8 lane_num, u8 bpp)
  478. {
  479. return link_rate * lane_num * 8 / bpp;
  480. }
  481. /**
  482. * zynqmp_dp_mode_configure - Configure the link values
  483. * @dp: DisplayPort IP core structure
  484. * @pclock: pixel clock for requested display mode
  485. * @current_bw: current link rate
  486. *
  487. * Find the link configuration values, rate and lane count for requested pixel
  488. * clock @pclock. The @pclock is stored in the mode to be used in other
  489. * functions later. The returned rate is downshifted from the current rate
  490. * @current_bw.
  491. *
  492. * Return: Current link rate code, or -EINVAL.
  493. */
  494. static int zynqmp_dp_mode_configure(struct zynqmp_dp *dp, int pclock,
  495. u8 current_bw)
  496. {
  497. int max_rate = dp->link_config.max_rate;
  498. u8 bw_code;
  499. u8 max_lanes = dp->link_config.max_lanes;
  500. u8 max_link_rate_code = drm_dp_link_rate_to_bw_code(max_rate);
  501. u8 bpp = dp->config.bpp;
  502. u8 lane_cnt;
  503. /* Downshift from current bandwidth */
  504. switch (current_bw) {
  505. case DP_LINK_BW_5_4:
  506. bw_code = DP_LINK_BW_2_7;
  507. break;
  508. case DP_LINK_BW_2_7:
  509. bw_code = DP_LINK_BW_1_62;
  510. break;
  511. case DP_LINK_BW_1_62:
  512. dev_err(dp->dev, "can't downshift. already lowest link rate\n");
  513. return -EINVAL;
  514. default:
  515. /* If not given, start with max supported */
  516. bw_code = max_link_rate_code;
  517. break;
  518. }
  519. for (lane_cnt = 1; lane_cnt <= max_lanes; lane_cnt <<= 1) {
  520. int bw;
  521. u32 rate;
  522. bw = drm_dp_bw_code_to_link_rate(bw_code);
  523. rate = zynqmp_dp_max_rate(bw, lane_cnt, bpp);
  524. if (pclock <= rate) {
  525. dp->mode.bw_code = bw_code;
  526. dp->mode.lane_cnt = lane_cnt;
  527. dp->mode.pclock = pclock;
  528. return dp->mode.bw_code;
  529. }
  530. }
  531. dev_err(dp->dev, "failed to configure link values\n");
  532. return -EINVAL;
  533. }
  534. /**
  535. * zynqmp_dp_adjust_train - Adjust train values
  536. * @dp: DisplayPort IP core structure
  537. * @link_status: link status from sink which contains requested training values
  538. */
  539. static void zynqmp_dp_adjust_train(struct zynqmp_dp *dp,
  540. u8 link_status[DP_LINK_STATUS_SIZE])
  541. {
  542. u8 *train_set = dp->train_set;
  543. u8 i;
  544. for (i = 0; i < dp->mode.lane_cnt; i++) {
  545. u8 voltage = drm_dp_get_adjust_request_voltage(link_status, i);
  546. u8 preemphasis =
  547. drm_dp_get_adjust_request_pre_emphasis(link_status, i);
  548. if (voltage >= DP_TRAIN_VOLTAGE_SWING_LEVEL_3)
  549. voltage |= DP_TRAIN_MAX_SWING_REACHED;
  550. if (preemphasis >= DP_TRAIN_PRE_EMPH_LEVEL_2)
  551. preemphasis |= DP_TRAIN_MAX_PRE_EMPHASIS_REACHED;
  552. train_set[i] = voltage | preemphasis;
  553. }
  554. }
  555. /**
  556. * zynqmp_dp_update_vs_emph - Update the training values
  557. * @dp: DisplayPort IP core structure
  558. *
  559. * Update the training values based on the request from sink. The mapped values
  560. * are predefined, and values(vs, pe, pc) are from the device manual.
  561. *
  562. * Return: 0 if vs and emph are updated successfully, or the error code returned
  563. * by drm_dp_dpcd_write().
  564. */
  565. static int zynqmp_dp_update_vs_emph(struct zynqmp_dp *dp)
  566. {
  567. unsigned int i;
  568. int ret;
  569. ret = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET, dp->train_set,
  570. dp->mode.lane_cnt);
  571. if (ret < 0)
  572. return ret;
  573. for (i = 0; i < dp->mode.lane_cnt; i++) {
  574. u32 reg = ZYNQMP_DP_SUB_TX_PHY_PRECURSOR_LANE_0 + i * 4;
  575. union phy_configure_opts opts = { 0 };
  576. u8 train = dp->train_set[i];
  577. opts.dp.voltage[0] = (train & DP_TRAIN_VOLTAGE_SWING_MASK)
  578. >> DP_TRAIN_VOLTAGE_SWING_SHIFT;
  579. opts.dp.pre[0] = (train & DP_TRAIN_PRE_EMPHASIS_MASK)
  580. >> DP_TRAIN_PRE_EMPHASIS_SHIFT;
  581. phy_configure(dp->phy[i], &opts);
  582. zynqmp_dp_write(dp, reg, 0x2);
  583. }
  584. return 0;
  585. }
  586. /**
  587. * zynqmp_dp_link_train_cr - Train clock recovery
  588. * @dp: DisplayPort IP core structure
  589. *
  590. * Return: 0 if clock recovery train is done successfully, or corresponding
  591. * error code.
  592. */
  593. static int zynqmp_dp_link_train_cr(struct zynqmp_dp *dp)
  594. {
  595. u8 link_status[DP_LINK_STATUS_SIZE];
  596. u8 lane_cnt = dp->mode.lane_cnt;
  597. u8 vs = 0, tries = 0;
  598. u16 max_tries, i;
  599. bool cr_done;
  600. int ret;
  601. zynqmp_dp_write(dp, ZYNQMP_DP_TRAINING_PATTERN_SET,
  602. DP_TRAINING_PATTERN_1);
  603. ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
  604. DP_TRAINING_PATTERN_1 |
  605. DP_LINK_SCRAMBLING_DISABLE);
  606. if (ret < 0)
  607. return ret;
  608. /*
  609. * 256 loops should be maximum iterations for 4 lanes and 4 values.
  610. * So, This loop should exit before 512 iterations
  611. */
  612. for (max_tries = 0; max_tries < 512; max_tries++) {
  613. ret = zynqmp_dp_update_vs_emph(dp);
  614. if (ret)
  615. return ret;
  616. drm_dp_link_train_clock_recovery_delay(&dp->aux, dp->dpcd);
  617. ret = drm_dp_dpcd_read_link_status(&dp->aux, link_status);
  618. if (ret < 0)
  619. return ret;
  620. cr_done = drm_dp_clock_recovery_ok(link_status, lane_cnt);
  621. if (cr_done)
  622. break;
  623. for (i = 0; i < lane_cnt; i++)
  624. if (!(dp->train_set[i] & DP_TRAIN_MAX_SWING_REACHED))
  625. break;
  626. if (i == lane_cnt)
  627. break;
  628. if ((dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK) == vs)
  629. tries++;
  630. else
  631. tries = 0;
  632. if (tries == DP_MAX_TRAINING_TRIES)
  633. break;
  634. vs = dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK;
  635. zynqmp_dp_adjust_train(dp, link_status);
  636. }
  637. if (!cr_done)
  638. return -EIO;
  639. return 0;
  640. }
  641. /**
  642. * zynqmp_dp_link_train_ce - Train channel equalization
  643. * @dp: DisplayPort IP core structure
  644. *
  645. * Return: 0 if channel equalization train is done successfully, or
  646. * corresponding error code.
  647. */
  648. static int zynqmp_dp_link_train_ce(struct zynqmp_dp *dp)
  649. {
  650. u8 link_status[DP_LINK_STATUS_SIZE];
  651. u8 lane_cnt = dp->mode.lane_cnt;
  652. u32 pat, tries;
  653. int ret;
  654. bool ce_done;
  655. if (dp->dpcd[DP_DPCD_REV] >= DP_V1_2 &&
  656. dp->dpcd[DP_MAX_LANE_COUNT] & DP_TPS3_SUPPORTED)
  657. pat = DP_TRAINING_PATTERN_3;
  658. else
  659. pat = DP_TRAINING_PATTERN_2;
  660. zynqmp_dp_write(dp, ZYNQMP_DP_TRAINING_PATTERN_SET, pat);
  661. ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
  662. pat | DP_LINK_SCRAMBLING_DISABLE);
  663. if (ret < 0)
  664. return ret;
  665. for (tries = 0; tries < DP_MAX_TRAINING_TRIES; tries++) {
  666. ret = zynqmp_dp_update_vs_emph(dp);
  667. if (ret)
  668. return ret;
  669. drm_dp_link_train_channel_eq_delay(&dp->aux, dp->dpcd);
  670. ret = drm_dp_dpcd_read_link_status(&dp->aux, link_status);
  671. if (ret < 0)
  672. return ret;
  673. ce_done = drm_dp_channel_eq_ok(link_status, lane_cnt);
  674. if (ce_done)
  675. break;
  676. zynqmp_dp_adjust_train(dp, link_status);
  677. }
  678. if (!ce_done)
  679. return -EIO;
  680. return 0;
  681. }
  682. /**
  683. * zynqmp_dp_train - Train the link
  684. * @dp: DisplayPort IP core structure
  685. *
  686. * Return: 0 if all trains are done successfully, or corresponding error code.
  687. */
  688. static int zynqmp_dp_train(struct zynqmp_dp *dp)
  689. {
  690. u32 reg;
  691. u8 bw_code = dp->mode.bw_code;
  692. u8 lane_cnt = dp->mode.lane_cnt;
  693. u8 aux_lane_cnt = lane_cnt;
  694. bool enhanced;
  695. int ret;
  696. zynqmp_dp_write(dp, ZYNQMP_DP_LANE_COUNT_SET, lane_cnt);
  697. enhanced = drm_dp_enhanced_frame_cap(dp->dpcd);
  698. if (enhanced) {
  699. zynqmp_dp_write(dp, ZYNQMP_DP_ENHANCED_FRAME_EN, 1);
  700. aux_lane_cnt |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
  701. }
  702. if (dp->dpcd[3] & 0x1) {
  703. zynqmp_dp_write(dp, ZYNQMP_DP_DOWNSPREAD_CTL, 1);
  704. drm_dp_dpcd_writeb(&dp->aux, DP_DOWNSPREAD_CTRL,
  705. DP_SPREAD_AMP_0_5);
  706. } else {
  707. zynqmp_dp_write(dp, ZYNQMP_DP_DOWNSPREAD_CTL, 0);
  708. drm_dp_dpcd_writeb(&dp->aux, DP_DOWNSPREAD_CTRL, 0);
  709. }
  710. ret = drm_dp_dpcd_writeb(&dp->aux, DP_LANE_COUNT_SET, aux_lane_cnt);
  711. if (ret < 0) {
  712. dev_err(dp->dev, "failed to set lane count\n");
  713. return ret;
  714. }
  715. ret = drm_dp_dpcd_writeb(&dp->aux, DP_MAIN_LINK_CHANNEL_CODING_SET,
  716. DP_SET_ANSI_8B10B);
  717. if (ret < 0) {
  718. dev_err(dp->dev, "failed to set ANSI 8B/10B encoding\n");
  719. return ret;
  720. }
  721. ret = drm_dp_dpcd_writeb(&dp->aux, DP_LINK_BW_SET, bw_code);
  722. if (ret < 0) {
  723. dev_err(dp->dev, "failed to set DP bandwidth\n");
  724. return ret;
  725. }
  726. zynqmp_dp_write(dp, ZYNQMP_DP_LINK_BW_SET, bw_code);
  727. switch (bw_code) {
  728. case DP_LINK_BW_1_62:
  729. reg = ZYNQMP_DP_PHY_CLOCK_SELECT_1_62G;
  730. break;
  731. case DP_LINK_BW_2_7:
  732. reg = ZYNQMP_DP_PHY_CLOCK_SELECT_2_70G;
  733. break;
  734. case DP_LINK_BW_5_4:
  735. default:
  736. reg = ZYNQMP_DP_PHY_CLOCK_SELECT_5_40G;
  737. break;
  738. }
  739. zynqmp_dp_write(dp, ZYNQMP_DP_PHY_CLOCK_SELECT, reg);
  740. ret = zynqmp_dp_phy_ready(dp);
  741. if (ret < 0)
  742. return ret;
  743. zynqmp_dp_write(dp, ZYNQMP_DP_SCRAMBLING_DISABLE, 1);
  744. memset(dp->train_set, 0, sizeof(dp->train_set));
  745. ret = zynqmp_dp_link_train_cr(dp);
  746. if (ret)
  747. return ret;
  748. ret = zynqmp_dp_link_train_ce(dp);
  749. if (ret)
  750. return ret;
  751. ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
  752. DP_TRAINING_PATTERN_DISABLE);
  753. if (ret < 0) {
  754. dev_err(dp->dev, "failed to disable training pattern\n");
  755. return ret;
  756. }
  757. zynqmp_dp_write(dp, ZYNQMP_DP_TRAINING_PATTERN_SET,
  758. DP_TRAINING_PATTERN_DISABLE);
  759. zynqmp_dp_write(dp, ZYNQMP_DP_SCRAMBLING_DISABLE, 0);
  760. return 0;
  761. }
  762. /**
  763. * zynqmp_dp_train_loop - Downshift the link rate during training
  764. * @dp: DisplayPort IP core structure
  765. *
  766. * Train the link by downshifting the link rate if training is not successful.
  767. */
  768. static void zynqmp_dp_train_loop(struct zynqmp_dp *dp)
  769. {
  770. struct zynqmp_dp_mode *mode = &dp->mode;
  771. u8 bw = mode->bw_code;
  772. int ret;
  773. do {
  774. if (dp->status == connector_status_disconnected ||
  775. !dp->enabled)
  776. return;
  777. ret = zynqmp_dp_train(dp);
  778. if (!ret)
  779. return;
  780. ret = zynqmp_dp_mode_configure(dp, mode->pclock, bw);
  781. if (ret < 0)
  782. goto err_out;
  783. bw = ret;
  784. } while (bw >= DP_LINK_BW_1_62);
  785. err_out:
  786. dev_err(dp->dev, "failed to train the DP link\n");
  787. }
  788. /* -----------------------------------------------------------------------------
  789. * DisplayPort AUX
  790. */
  791. #define AUX_READ_BIT 0x1
  792. /**
  793. * zynqmp_dp_aux_cmd_submit - Submit aux command
  794. * @dp: DisplayPort IP core structure
  795. * @cmd: aux command
  796. * @addr: aux address
  797. * @buf: buffer for command data
  798. * @bytes: number of bytes for @buf
  799. * @reply: reply code to be returned
  800. *
  801. * Submit an aux command. All aux related commands, native or i2c aux
  802. * read/write, are submitted through this function. The function is mapped to
  803. * the transfer function of struct drm_dp_aux. This function involves in
  804. * multiple register reads/writes, thus synchronization is needed, and it is
  805. * done by drm_dp_helper using @hw_mutex. The calling thread goes into sleep
  806. * if there's no immediate reply to the command submission. The reply code is
  807. * returned at @reply if @reply != NULL.
  808. *
  809. * Return: 0 if the command is submitted properly, or corresponding error code:
  810. * -EBUSY when there is any request already being processed
  811. * -ETIMEDOUT when receiving reply is timed out
  812. * -EIO when received bytes are less than requested
  813. */
  814. static int zynqmp_dp_aux_cmd_submit(struct zynqmp_dp *dp, u32 cmd, u16 addr,
  815. u8 *buf, u8 bytes, u8 *reply)
  816. {
  817. bool is_read = (cmd & AUX_READ_BIT) ? true : false;
  818. u32 reg, i;
  819. reg = zynqmp_dp_read(dp, ZYNQMP_DP_INTERRUPT_SIGNAL_STATE);
  820. if (reg & ZYNQMP_DP_INTERRUPT_SIGNAL_STATE_REQUEST)
  821. return -EBUSY;
  822. zynqmp_dp_write(dp, ZYNQMP_DP_AUX_ADDRESS, addr);
  823. if (!is_read)
  824. for (i = 0; i < bytes; i++)
  825. zynqmp_dp_write(dp, ZYNQMP_DP_AUX_WRITE_FIFO,
  826. buf[i]);
  827. reg = cmd << ZYNQMP_DP_AUX_COMMAND_CMD_SHIFT;
  828. if (!buf || !bytes)
  829. reg |= ZYNQMP_DP_AUX_COMMAND_ADDRESS_ONLY;
  830. else
  831. reg |= (bytes - 1) << ZYNQMP_DP_AUX_COMMAND_BYTES_SHIFT;
  832. zynqmp_dp_write(dp, ZYNQMP_DP_AUX_COMMAND, reg);
  833. /* Wait for reply to be delivered upto 2ms */
  834. for (i = 0; ; i++) {
  835. reg = zynqmp_dp_read(dp, ZYNQMP_DP_INTERRUPT_SIGNAL_STATE);
  836. if (reg & ZYNQMP_DP_INTERRUPT_SIGNAL_STATE_REPLY)
  837. break;
  838. if (reg & ZYNQMP_DP_INTERRUPT_SIGNAL_STATE_REPLY_TIMEOUT ||
  839. i == 2)
  840. return -ETIMEDOUT;
  841. usleep_range(1000, 1100);
  842. }
  843. reg = zynqmp_dp_read(dp, ZYNQMP_DP_AUX_REPLY_CODE);
  844. if (reply)
  845. *reply = reg;
  846. if (is_read &&
  847. (reg == ZYNQMP_DP_AUX_REPLY_CODE_AUX_ACK ||
  848. reg == ZYNQMP_DP_AUX_REPLY_CODE_I2C_ACK)) {
  849. reg = zynqmp_dp_read(dp, ZYNQMP_DP_REPLY_DATA_COUNT);
  850. if ((reg & ZYNQMP_DP_REPLY_DATA_COUNT_MASK) != bytes)
  851. return -EIO;
  852. for (i = 0; i < bytes; i++)
  853. buf[i] = zynqmp_dp_read(dp, ZYNQMP_DP_AUX_REPLY_DATA);
  854. }
  855. return 0;
  856. }
  857. static ssize_t
  858. zynqmp_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
  859. {
  860. struct zynqmp_dp *dp = container_of(aux, struct zynqmp_dp, aux);
  861. int ret;
  862. unsigned int i, iter;
  863. /* Number of loops = timeout in msec / aux delay (400 usec) */
  864. iter = zynqmp_dp_aux_timeout_ms * 1000 / 400;
  865. iter = iter ? iter : 1;
  866. for (i = 0; i < iter; i++) {
  867. ret = zynqmp_dp_aux_cmd_submit(dp, msg->request, msg->address,
  868. msg->buffer, msg->size,
  869. &msg->reply);
  870. if (!ret) {
  871. dev_vdbg(dp->dev, "aux %d retries\n", i);
  872. return msg->size;
  873. }
  874. if (dp->status == connector_status_disconnected) {
  875. dev_dbg(dp->dev, "no connected aux device\n");
  876. return -ENODEV;
  877. }
  878. usleep_range(400, 500);
  879. }
  880. dev_dbg(dp->dev, "failed to do aux transfer (%d)\n", ret);
  881. return ret;
  882. }
  883. /**
  884. * zynqmp_dp_aux_init - Initialize and register the DP AUX
  885. * @dp: DisplayPort IP core structure
  886. *
  887. * Program the AUX clock divider and filter and register the DP AUX adapter.
  888. *
  889. * Return: 0 on success, error value otherwise
  890. */
  891. static int zynqmp_dp_aux_init(struct zynqmp_dp *dp)
  892. {
  893. unsigned long rate;
  894. unsigned int w;
  895. /*
  896. * The AUX_SIGNAL_WIDTH_FILTER is the number of APB clock cycles
  897. * corresponding to the AUX pulse. Allowable values are 8, 16, 24, 32,
  898. * 40 and 48. The AUX pulse width must be between 0.4µs and 0.6µs,
  899. * compute the w / 8 value corresponding to 0.4µs rounded up, and make
  900. * sure it stays below 0.6µs and within the allowable values.
  901. */
  902. rate = clk_get_rate(dp->dpsub->apb_clk);
  903. w = DIV_ROUND_UP(4 * rate, 1000 * 1000 * 10 * 8) * 8;
  904. if (w > 6 * rate / (1000 * 1000 * 10) || w > 48) {
  905. dev_err(dp->dev, "aclk frequency too high\n");
  906. return -EINVAL;
  907. }
  908. zynqmp_dp_write(dp, ZYNQMP_DP_AUX_CLK_DIVIDER,
  909. (w << ZYNQMP_DP_AUX_CLK_DIVIDER_AUX_FILTER_SHIFT) |
  910. (rate / (1000 * 1000)));
  911. dp->aux.name = "ZynqMP DP AUX";
  912. dp->aux.dev = dp->dev;
  913. dp->aux.drm_dev = dp->bridge.dev;
  914. dp->aux.transfer = zynqmp_dp_aux_transfer;
  915. return drm_dp_aux_register(&dp->aux);
  916. }
  917. /**
  918. * zynqmp_dp_aux_cleanup - Cleanup the DP AUX
  919. * @dp: DisplayPort IP core structure
  920. *
  921. * Unregister the DP AUX adapter.
  922. */
  923. static void zynqmp_dp_aux_cleanup(struct zynqmp_dp *dp)
  924. {
  925. drm_dp_aux_unregister(&dp->aux);
  926. }
  927. /* -----------------------------------------------------------------------------
  928. * DisplayPort Generic Support
  929. */
  930. /**
  931. * zynqmp_dp_update_misc - Write the misc registers
  932. * @dp: DisplayPort IP core structure
  933. *
  934. * The misc register values are stored in the structure, and this
  935. * function applies the values into the registers.
  936. */
  937. static void zynqmp_dp_update_misc(struct zynqmp_dp *dp)
  938. {
  939. zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_MISC0, dp->config.misc0);
  940. zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_MISC1, dp->config.misc1);
  941. }
  942. /**
  943. * zynqmp_dp_set_format - Set the input format
  944. * @dp: DisplayPort IP core structure
  945. * @info: Display info
  946. * @format: input format
  947. * @bpc: bits per component
  948. *
  949. * Update misc register values based on input @format and @bpc.
  950. *
  951. * Return: 0 on success, or -EINVAL.
  952. */
  953. static int zynqmp_dp_set_format(struct zynqmp_dp *dp,
  954. const struct drm_display_info *info,
  955. enum zynqmp_dpsub_format format,
  956. unsigned int bpc)
  957. {
  958. struct zynqmp_dp_config *config = &dp->config;
  959. unsigned int num_colors;
  960. config->misc0 &= ~ZYNQMP_DP_MAIN_STREAM_MISC0_COMP_FORMAT_MASK;
  961. config->misc1 &= ~ZYNQMP_DP_MAIN_STREAM_MISC1_Y_ONLY_EN;
  962. switch (format) {
  963. case ZYNQMP_DPSUB_FORMAT_RGB:
  964. config->misc0 |= ZYNQMP_DP_MAIN_STREAM_MISC0_COMP_FORMAT_RGB;
  965. num_colors = 3;
  966. break;
  967. case ZYNQMP_DPSUB_FORMAT_YCRCB444:
  968. config->misc0 |= ZYNQMP_DP_MAIN_STREAM_MISC0_COMP_FORMAT_YCRCB_444;
  969. num_colors = 3;
  970. break;
  971. case ZYNQMP_DPSUB_FORMAT_YCRCB422:
  972. config->misc0 |= ZYNQMP_DP_MAIN_STREAM_MISC0_COMP_FORMAT_YCRCB_422;
  973. num_colors = 2;
  974. break;
  975. case ZYNQMP_DPSUB_FORMAT_YONLY:
  976. config->misc1 |= ZYNQMP_DP_MAIN_STREAM_MISC1_Y_ONLY_EN;
  977. num_colors = 1;
  978. break;
  979. default:
  980. dev_err(dp->dev, "Invalid colormetry in DT\n");
  981. return -EINVAL;
  982. }
  983. if (info && info->bpc && bpc > info->bpc) {
  984. dev_warn(dp->dev,
  985. "downgrading requested %ubpc to display limit %ubpc\n",
  986. bpc, info->bpc);
  987. bpc = info->bpc;
  988. }
  989. config->misc0 &= ~ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_MASK;
  990. switch (bpc) {
  991. case 6:
  992. config->misc0 |= ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_6;
  993. break;
  994. case 8:
  995. config->misc0 |= ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_8;
  996. break;
  997. case 10:
  998. config->misc0 |= ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_10;
  999. break;
  1000. case 12:
  1001. config->misc0 |= ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_12;
  1002. break;
  1003. case 16:
  1004. config->misc0 |= ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_16;
  1005. break;
  1006. default:
  1007. dev_warn(dp->dev, "Not supported bpc (%u). fall back to 8bpc\n",
  1008. bpc);
  1009. config->misc0 |= ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_8;
  1010. bpc = 8;
  1011. break;
  1012. }
  1013. /* Update the current bpp based on the format. */
  1014. config->bpp = bpc * num_colors;
  1015. return 0;
  1016. }
  1017. /**
  1018. * zynqmp_dp_encoder_mode_set_transfer_unit - Set the transfer unit values
  1019. * @dp: DisplayPort IP core structure
  1020. * @mode: requested display mode
  1021. *
  1022. * Set the transfer unit, and calculate all transfer unit size related values.
  1023. * Calculation is based on DP and IP core specification.
  1024. */
  1025. static void
  1026. zynqmp_dp_encoder_mode_set_transfer_unit(struct zynqmp_dp *dp,
  1027. const struct drm_display_mode *mode)
  1028. {
  1029. u32 tu = ZYNQMP_DP_MSA_TRANSFER_UNIT_SIZE_TU_SIZE_DEF;
  1030. u32 bw, vid_kbytes, avg_bytes_per_tu, init_wait;
  1031. /* Use the max transfer unit size (default) */
  1032. zynqmp_dp_write(dp, ZYNQMP_DP_MSA_TRANSFER_UNIT_SIZE, tu);
  1033. vid_kbytes = mode->clock * (dp->config.bpp / 8);
  1034. bw = drm_dp_bw_code_to_link_rate(dp->mode.bw_code);
  1035. avg_bytes_per_tu = vid_kbytes * tu / (dp->mode.lane_cnt * bw / 1000);
  1036. zynqmp_dp_write(dp, ZYNQMP_DP_MIN_BYTES_PER_TU,
  1037. avg_bytes_per_tu / 1000);
  1038. zynqmp_dp_write(dp, ZYNQMP_DP_FRAC_BYTES_PER_TU,
  1039. avg_bytes_per_tu % 1000);
  1040. /* Configure the initial wait cycle based on transfer unit size */
  1041. if (tu < (avg_bytes_per_tu / 1000))
  1042. init_wait = 0;
  1043. else if ((avg_bytes_per_tu / 1000) <= 4)
  1044. init_wait = tu;
  1045. else
  1046. init_wait = tu - avg_bytes_per_tu / 1000;
  1047. zynqmp_dp_write(dp, ZYNQMP_DP_INIT_WAIT, init_wait);
  1048. }
  1049. /**
  1050. * zynqmp_dp_encoder_mode_set_stream - Configure the main stream
  1051. * @dp: DisplayPort IP core structure
  1052. * @mode: requested display mode
  1053. *
  1054. * Configure the main stream based on the requested mode @mode. Calculation is
  1055. * based on IP core specification.
  1056. */
  1057. static void zynqmp_dp_encoder_mode_set_stream(struct zynqmp_dp *dp,
  1058. const struct drm_display_mode *mode)
  1059. {
  1060. u8 lane_cnt = dp->mode.lane_cnt;
  1061. u32 reg, wpl;
  1062. unsigned int rate;
  1063. zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_HTOTAL, mode->htotal);
  1064. zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_VTOTAL, mode->vtotal);
  1065. zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_POLARITY,
  1066. (!!(mode->flags & DRM_MODE_FLAG_PVSYNC) <<
  1067. ZYNQMP_DP_MAIN_STREAM_POLARITY_VSYNC_SHIFT) |
  1068. (!!(mode->flags & DRM_MODE_FLAG_PHSYNC) <<
  1069. ZYNQMP_DP_MAIN_STREAM_POLARITY_HSYNC_SHIFT));
  1070. zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_HSWIDTH,
  1071. mode->hsync_end - mode->hsync_start);
  1072. zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_VSWIDTH,
  1073. mode->vsync_end - mode->vsync_start);
  1074. zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_HRES, mode->hdisplay);
  1075. zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_VRES, mode->vdisplay);
  1076. zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_HSTART,
  1077. mode->htotal - mode->hsync_start);
  1078. zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_VSTART,
  1079. mode->vtotal - mode->vsync_start);
  1080. /* In synchronous mode, set the dividers */
  1081. if (dp->config.misc0 & ZYNQMP_DP_MAIN_STREAM_MISC0_SYNC_LOCK) {
  1082. reg = drm_dp_bw_code_to_link_rate(dp->mode.bw_code);
  1083. zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_N_VID, reg);
  1084. zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_M_VID, mode->clock);
  1085. rate = zynqmp_dpsub_get_audio_clk_rate(dp->dpsub);
  1086. if (rate) {
  1087. dev_dbg(dp->dev, "Audio rate: %d\n", rate / 512);
  1088. zynqmp_dp_write(dp, ZYNQMP_DP_TX_N_AUD, reg);
  1089. zynqmp_dp_write(dp, ZYNQMP_DP_TX_M_AUD, rate / 1000);
  1090. }
  1091. }
  1092. /* Only 2 channel audio is supported now */
  1093. if (zynqmp_dpsub_audio_enabled(dp->dpsub))
  1094. zynqmp_dp_write(dp, ZYNQMP_DP_TX_AUDIO_CHANNELS, 1);
  1095. zynqmp_dp_write(dp, ZYNQMP_DP_USER_PIX_WIDTH, 1);
  1096. /* Translate to the native 16 bit datapath based on IP core spec */
  1097. wpl = (mode->hdisplay * dp->config.bpp + 15) / 16;
  1098. reg = wpl + wpl % lane_cnt - lane_cnt;
  1099. zynqmp_dp_write(dp, ZYNQMP_DP_USER_DATA_COUNT_PER_LANE, reg);
  1100. }
  1101. /* -----------------------------------------------------------------------------
  1102. * DISP Configuration
  1103. */
  1104. /**
  1105. * zynqmp_dp_disp_connected_live_layer - Return the first connected live layer
  1106. * @dp: DisplayPort IP core structure
  1107. *
  1108. * Return: The first connected live display layer or NULL if none of the live
  1109. * layers are connected.
  1110. */
  1111. static struct zynqmp_disp_layer *
  1112. zynqmp_dp_disp_connected_live_layer(struct zynqmp_dp *dp)
  1113. {
  1114. if (dp->dpsub->connected_ports & BIT(ZYNQMP_DPSUB_PORT_LIVE_VIDEO))
  1115. return dp->dpsub->layers[ZYNQMP_DPSUB_LAYER_VID];
  1116. else if (dp->dpsub->connected_ports & BIT(ZYNQMP_DPSUB_PORT_LIVE_GFX))
  1117. return dp->dpsub->layers[ZYNQMP_DPSUB_LAYER_GFX];
  1118. else
  1119. return NULL;
  1120. }
  1121. static void zynqmp_dp_disp_enable(struct zynqmp_dp *dp,
  1122. struct drm_bridge_state *old_bridge_state)
  1123. {
  1124. struct zynqmp_disp_layer *layer;
  1125. struct drm_bridge_state *bridge_state;
  1126. u32 bus_fmt;
  1127. layer = zynqmp_dp_disp_connected_live_layer(dp);
  1128. if (!layer)
  1129. return;
  1130. bridge_state = drm_atomic_get_new_bridge_state(old_bridge_state->base.state,
  1131. old_bridge_state->bridge);
  1132. if (WARN_ON(!bridge_state))
  1133. return;
  1134. bus_fmt = bridge_state->input_bus_cfg.format;
  1135. zynqmp_disp_layer_set_live_format(layer, bus_fmt);
  1136. zynqmp_disp_layer_enable(layer);
  1137. if (layer == dp->dpsub->layers[ZYNQMP_DPSUB_LAYER_GFX])
  1138. zynqmp_disp_blend_set_global_alpha(dp->dpsub->disp, true, 255);
  1139. else
  1140. zynqmp_disp_blend_set_global_alpha(dp->dpsub->disp, false, 0);
  1141. zynqmp_disp_enable(dp->dpsub->disp);
  1142. }
  1143. static void zynqmp_dp_disp_disable(struct zynqmp_dp *dp,
  1144. struct drm_bridge_state *old_bridge_state)
  1145. {
  1146. struct zynqmp_disp_layer *layer;
  1147. layer = zynqmp_dp_disp_connected_live_layer(dp);
  1148. if (!layer)
  1149. return;
  1150. zynqmp_disp_disable(dp->dpsub->disp);
  1151. zynqmp_disp_layer_disable(layer);
  1152. }
  1153. /* -----------------------------------------------------------------------------
  1154. * DRM Bridge
  1155. */
  1156. static int zynqmp_dp_bridge_attach(struct drm_bridge *bridge,
  1157. enum drm_bridge_attach_flags flags)
  1158. {
  1159. struct zynqmp_dp *dp = bridge_to_dp(bridge);
  1160. int ret;
  1161. /* Initialize and register the AUX adapter. */
  1162. ret = zynqmp_dp_aux_init(dp);
  1163. if (ret) {
  1164. dev_err(dp->dev, "failed to initialize DP aux\n");
  1165. return ret;
  1166. }
  1167. if (dp->next_bridge) {
  1168. ret = drm_bridge_attach(bridge->encoder, dp->next_bridge,
  1169. bridge, flags);
  1170. if (ret < 0)
  1171. goto error;
  1172. }
  1173. /* Now that initialisation is complete, enable interrupts. */
  1174. zynqmp_dp_write(dp, ZYNQMP_DP_INT_EN, ZYNQMP_DP_INT_ALL);
  1175. return 0;
  1176. error:
  1177. zynqmp_dp_aux_cleanup(dp);
  1178. return ret;
  1179. }
  1180. static void zynqmp_dp_bridge_detach(struct drm_bridge *bridge)
  1181. {
  1182. struct zynqmp_dp *dp = bridge_to_dp(bridge);
  1183. zynqmp_dp_aux_cleanup(dp);
  1184. }
  1185. static enum drm_mode_status
  1186. zynqmp_dp_bridge_mode_valid(struct drm_bridge *bridge,
  1187. const struct drm_display_info *info,
  1188. const struct drm_display_mode *mode)
  1189. {
  1190. struct zynqmp_dp *dp = bridge_to_dp(bridge);
  1191. int rate;
  1192. if (mode->clock > ZYNQMP_MAX_FREQ) {
  1193. dev_dbg(dp->dev, "filtered mode %s for high pixel rate\n",
  1194. mode->name);
  1195. drm_mode_debug_printmodeline(mode);
  1196. return MODE_CLOCK_HIGH;
  1197. }
  1198. /* Check with link rate and lane count */
  1199. rate = zynqmp_dp_max_rate(dp->link_config.max_rate,
  1200. dp->link_config.max_lanes, dp->config.bpp);
  1201. if (mode->clock > rate) {
  1202. dev_dbg(dp->dev, "filtered mode %s for high pixel rate\n",
  1203. mode->name);
  1204. drm_mode_debug_printmodeline(mode);
  1205. return MODE_CLOCK_HIGH;
  1206. }
  1207. return MODE_OK;
  1208. }
  1209. static void zynqmp_dp_bridge_atomic_enable(struct drm_bridge *bridge,
  1210. struct drm_bridge_state *old_bridge_state)
  1211. {
  1212. struct zynqmp_dp *dp = bridge_to_dp(bridge);
  1213. struct drm_atomic_state *state = old_bridge_state->base.state;
  1214. const struct drm_crtc_state *crtc_state;
  1215. const struct drm_display_mode *adjusted_mode;
  1216. const struct drm_display_mode *mode;
  1217. struct drm_connector *connector;
  1218. struct drm_crtc *crtc;
  1219. unsigned int i;
  1220. int rate;
  1221. int ret;
  1222. pm_runtime_get_sync(dp->dev);
  1223. zynqmp_dp_disp_enable(dp, old_bridge_state);
  1224. /*
  1225. * Retrieve the CRTC mode and adjusted mode. This requires a little
  1226. * dance to go from the bridge to the encoder, to the connector and to
  1227. * the CRTC.
  1228. */
  1229. connector = drm_atomic_get_new_connector_for_encoder(state,
  1230. bridge->encoder);
  1231. crtc = drm_atomic_get_new_connector_state(state, connector)->crtc;
  1232. crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
  1233. adjusted_mode = &crtc_state->adjusted_mode;
  1234. mode = &crtc_state->mode;
  1235. zynqmp_dp_set_format(dp, &connector->display_info,
  1236. ZYNQMP_DPSUB_FORMAT_RGB, 8);
  1237. /* Check again as bpp or format might have been changed */
  1238. rate = zynqmp_dp_max_rate(dp->link_config.max_rate,
  1239. dp->link_config.max_lanes, dp->config.bpp);
  1240. if (mode->clock > rate) {
  1241. dev_err(dp->dev, "mode %s has too high pixel rate\n",
  1242. mode->name);
  1243. drm_mode_debug_printmodeline(mode);
  1244. }
  1245. /* Configure the mode */
  1246. ret = zynqmp_dp_mode_configure(dp, adjusted_mode->clock, 0);
  1247. if (ret < 0) {
  1248. pm_runtime_put_sync(dp->dev);
  1249. return;
  1250. }
  1251. zynqmp_dp_encoder_mode_set_transfer_unit(dp, adjusted_mode);
  1252. zynqmp_dp_encoder_mode_set_stream(dp, adjusted_mode);
  1253. /* Enable the encoder */
  1254. dp->enabled = true;
  1255. zynqmp_dp_update_misc(dp);
  1256. if (zynqmp_dpsub_audio_enabled(dp->dpsub))
  1257. zynqmp_dp_write(dp, ZYNQMP_DP_TX_AUDIO_CONTROL, 1);
  1258. zynqmp_dp_write(dp, ZYNQMP_DP_TX_PHY_POWER_DOWN, 0);
  1259. if (dp->status == connector_status_connected) {
  1260. for (i = 0; i < 3; i++) {
  1261. ret = drm_dp_dpcd_writeb(&dp->aux, DP_SET_POWER,
  1262. DP_SET_POWER_D0);
  1263. if (ret == 1)
  1264. break;
  1265. usleep_range(300, 500);
  1266. }
  1267. /* Some monitors take time to wake up properly */
  1268. msleep(zynqmp_dp_power_on_delay_ms);
  1269. }
  1270. if (ret != 1)
  1271. dev_dbg(dp->dev, "DP aux failed\n");
  1272. else
  1273. zynqmp_dp_train_loop(dp);
  1274. zynqmp_dp_write(dp, ZYNQMP_DP_SOFTWARE_RESET,
  1275. ZYNQMP_DP_SOFTWARE_RESET_ALL);
  1276. zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_ENABLE, 1);
  1277. }
  1278. static void zynqmp_dp_bridge_atomic_disable(struct drm_bridge *bridge,
  1279. struct drm_bridge_state *old_bridge_state)
  1280. {
  1281. struct zynqmp_dp *dp = bridge_to_dp(bridge);
  1282. dp->enabled = false;
  1283. cancel_work(&dp->hpd_work);
  1284. zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_ENABLE, 0);
  1285. drm_dp_dpcd_writeb(&dp->aux, DP_SET_POWER, DP_SET_POWER_D3);
  1286. zynqmp_dp_write(dp, ZYNQMP_DP_TX_PHY_POWER_DOWN,
  1287. ZYNQMP_DP_TX_PHY_POWER_DOWN_ALL);
  1288. if (zynqmp_dpsub_audio_enabled(dp->dpsub))
  1289. zynqmp_dp_write(dp, ZYNQMP_DP_TX_AUDIO_CONTROL, 0);
  1290. zynqmp_dp_disp_disable(dp, old_bridge_state);
  1291. pm_runtime_put_sync(dp->dev);
  1292. }
  1293. #define ZYNQMP_DP_MIN_H_BACKPORCH 20
  1294. static int zynqmp_dp_bridge_atomic_check(struct drm_bridge *bridge,
  1295. struct drm_bridge_state *bridge_state,
  1296. struct drm_crtc_state *crtc_state,
  1297. struct drm_connector_state *conn_state)
  1298. {
  1299. struct zynqmp_dp *dp = bridge_to_dp(bridge);
  1300. struct drm_display_mode *mode = &crtc_state->mode;
  1301. struct drm_display_mode *adjusted_mode = &crtc_state->adjusted_mode;
  1302. int diff = mode->htotal - mode->hsync_end;
  1303. /*
  1304. * ZynqMP DP requires horizontal backporch to be greater than 12.
  1305. * This limitation may not be compatible with the sink device.
  1306. */
  1307. if (diff < ZYNQMP_DP_MIN_H_BACKPORCH) {
  1308. int vrefresh = (adjusted_mode->clock * 1000) /
  1309. (adjusted_mode->vtotal * adjusted_mode->htotal);
  1310. dev_dbg(dp->dev, "hbackporch adjusted: %d to %d",
  1311. diff, ZYNQMP_DP_MIN_H_BACKPORCH - diff);
  1312. diff = ZYNQMP_DP_MIN_H_BACKPORCH - diff;
  1313. adjusted_mode->htotal += diff;
  1314. adjusted_mode->clock = adjusted_mode->vtotal *
  1315. adjusted_mode->htotal * vrefresh / 1000;
  1316. }
  1317. return 0;
  1318. }
  1319. static enum drm_connector_status zynqmp_dp_bridge_detect(struct drm_bridge *bridge)
  1320. {
  1321. struct zynqmp_dp *dp = bridge_to_dp(bridge);
  1322. struct zynqmp_dp_link_config *link_config = &dp->link_config;
  1323. u32 state, i;
  1324. int ret;
  1325. /*
  1326. * This is from heuristic. It takes some delay (ex, 100 ~ 500 msec) to
  1327. * get the HPD signal with some monitors.
  1328. */
  1329. for (i = 0; i < 10; i++) {
  1330. state = zynqmp_dp_read(dp, ZYNQMP_DP_INTERRUPT_SIGNAL_STATE);
  1331. if (state & ZYNQMP_DP_INTERRUPT_SIGNAL_STATE_HPD)
  1332. break;
  1333. msleep(100);
  1334. }
  1335. if (state & ZYNQMP_DP_INTERRUPT_SIGNAL_STATE_HPD) {
  1336. ret = drm_dp_dpcd_read(&dp->aux, 0x0, dp->dpcd,
  1337. sizeof(dp->dpcd));
  1338. if (ret < 0) {
  1339. dev_dbg(dp->dev, "DPCD read failed");
  1340. goto disconnected;
  1341. }
  1342. link_config->max_rate = min_t(int,
  1343. drm_dp_max_link_rate(dp->dpcd),
  1344. DP_HIGH_BIT_RATE2);
  1345. link_config->max_lanes = min_t(u8,
  1346. drm_dp_max_lane_count(dp->dpcd),
  1347. dp->num_lanes);
  1348. dp->status = connector_status_connected;
  1349. return connector_status_connected;
  1350. }
  1351. disconnected:
  1352. dp->status = connector_status_disconnected;
  1353. return connector_status_disconnected;
  1354. }
  1355. static const struct drm_edid *zynqmp_dp_bridge_edid_read(struct drm_bridge *bridge,
  1356. struct drm_connector *connector)
  1357. {
  1358. struct zynqmp_dp *dp = bridge_to_dp(bridge);
  1359. return drm_edid_read_ddc(connector, &dp->aux.ddc);
  1360. }
  1361. static u32 *zynqmp_dp_bridge_default_bus_fmts(unsigned int *num_input_fmts)
  1362. {
  1363. u32 *formats = kzalloc(sizeof(*formats), GFP_KERNEL);
  1364. if (formats)
  1365. *formats = MEDIA_BUS_FMT_FIXED;
  1366. *num_input_fmts = !!formats;
  1367. return formats;
  1368. }
  1369. static u32 *
  1370. zynqmp_dp_bridge_get_input_bus_fmts(struct drm_bridge *bridge,
  1371. struct drm_bridge_state *bridge_state,
  1372. struct drm_crtc_state *crtc_state,
  1373. struct drm_connector_state *conn_state,
  1374. u32 output_fmt,
  1375. unsigned int *num_input_fmts)
  1376. {
  1377. struct zynqmp_dp *dp = bridge_to_dp(bridge);
  1378. struct zynqmp_disp_layer *layer;
  1379. layer = zynqmp_dp_disp_connected_live_layer(dp);
  1380. if (layer)
  1381. return zynqmp_disp_live_layer_formats(layer, num_input_fmts);
  1382. else
  1383. return zynqmp_dp_bridge_default_bus_fmts(num_input_fmts);
  1384. }
  1385. static const struct drm_bridge_funcs zynqmp_dp_bridge_funcs = {
  1386. .attach = zynqmp_dp_bridge_attach,
  1387. .detach = zynqmp_dp_bridge_detach,
  1388. .mode_valid = zynqmp_dp_bridge_mode_valid,
  1389. .atomic_enable = zynqmp_dp_bridge_atomic_enable,
  1390. .atomic_disable = zynqmp_dp_bridge_atomic_disable,
  1391. .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
  1392. .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
  1393. .atomic_reset = drm_atomic_helper_bridge_reset,
  1394. .atomic_check = zynqmp_dp_bridge_atomic_check,
  1395. .detect = zynqmp_dp_bridge_detect,
  1396. .edid_read = zynqmp_dp_bridge_edid_read,
  1397. .atomic_get_input_bus_fmts = zynqmp_dp_bridge_get_input_bus_fmts,
  1398. };
  1399. /* -----------------------------------------------------------------------------
  1400. * Interrupt Handling
  1401. */
  1402. /**
  1403. * zynqmp_dp_enable_vblank - Enable vblank
  1404. * @dp: DisplayPort IP core structure
  1405. *
  1406. * Enable vblank interrupt
  1407. */
  1408. void zynqmp_dp_enable_vblank(struct zynqmp_dp *dp)
  1409. {
  1410. zynqmp_dp_write(dp, ZYNQMP_DP_INT_EN, ZYNQMP_DP_INT_VBLANK_START);
  1411. }
  1412. /**
  1413. * zynqmp_dp_disable_vblank - Disable vblank
  1414. * @dp: DisplayPort IP core structure
  1415. *
  1416. * Disable vblank interrupt
  1417. */
  1418. void zynqmp_dp_disable_vblank(struct zynqmp_dp *dp)
  1419. {
  1420. zynqmp_dp_write(dp, ZYNQMP_DP_INT_DS, ZYNQMP_DP_INT_VBLANK_START);
  1421. }
  1422. static void zynqmp_dp_hpd_work_func(struct work_struct *work)
  1423. {
  1424. struct zynqmp_dp *dp = container_of(work, struct zynqmp_dp, hpd_work);
  1425. enum drm_connector_status status;
  1426. status = zynqmp_dp_bridge_detect(&dp->bridge);
  1427. drm_bridge_hpd_notify(&dp->bridge, status);
  1428. }
  1429. static irqreturn_t zynqmp_dp_irq_handler(int irq, void *data)
  1430. {
  1431. struct zynqmp_dp *dp = (struct zynqmp_dp *)data;
  1432. u32 status, mask;
  1433. status = zynqmp_dp_read(dp, ZYNQMP_DP_INT_STATUS);
  1434. /* clear status register as soon as we read it */
  1435. zynqmp_dp_write(dp, ZYNQMP_DP_INT_STATUS, status);
  1436. mask = zynqmp_dp_read(dp, ZYNQMP_DP_INT_MASK);
  1437. /*
  1438. * Status register may report some events, which corresponding interrupts
  1439. * have been disabled. Filter out those events against interrupts' mask.
  1440. */
  1441. status &= ~mask;
  1442. if (!status)
  1443. return IRQ_NONE;
  1444. /* dbg for diagnostic, but not much that the driver can do */
  1445. if (status & ZYNQMP_DP_INT_CHBUF_UNDERFLW_MASK)
  1446. dev_dbg_ratelimited(dp->dev, "underflow interrupt\n");
  1447. if (status & ZYNQMP_DP_INT_CHBUF_OVERFLW_MASK)
  1448. dev_dbg_ratelimited(dp->dev, "overflow interrupt\n");
  1449. if (status & ZYNQMP_DP_INT_VBLANK_START)
  1450. zynqmp_dpsub_drm_handle_vblank(dp->dpsub);
  1451. if (status & ZYNQMP_DP_INT_HPD_EVENT)
  1452. schedule_work(&dp->hpd_work);
  1453. if (status & ZYNQMP_DP_INT_HPD_IRQ) {
  1454. int ret;
  1455. u8 status[DP_LINK_STATUS_SIZE + 2];
  1456. ret = drm_dp_dpcd_read(&dp->aux, DP_SINK_COUNT, status,
  1457. DP_LINK_STATUS_SIZE + 2);
  1458. if (ret < 0)
  1459. goto handled;
  1460. if (status[4] & DP_LINK_STATUS_UPDATED ||
  1461. !drm_dp_clock_recovery_ok(&status[2], dp->mode.lane_cnt) ||
  1462. !drm_dp_channel_eq_ok(&status[2], dp->mode.lane_cnt)) {
  1463. zynqmp_dp_train_loop(dp);
  1464. }
  1465. }
  1466. handled:
  1467. return IRQ_HANDLED;
  1468. }
  1469. /* -----------------------------------------------------------------------------
  1470. * Initialization & Cleanup
  1471. */
  1472. int zynqmp_dp_probe(struct zynqmp_dpsub *dpsub)
  1473. {
  1474. struct platform_device *pdev = to_platform_device(dpsub->dev);
  1475. struct drm_bridge *bridge;
  1476. struct zynqmp_dp *dp;
  1477. struct resource *res;
  1478. int ret;
  1479. dp = kzalloc(sizeof(*dp), GFP_KERNEL);
  1480. if (!dp)
  1481. return -ENOMEM;
  1482. dp->dev = &pdev->dev;
  1483. dp->dpsub = dpsub;
  1484. dp->status = connector_status_disconnected;
  1485. INIT_WORK(&dp->hpd_work, zynqmp_dp_hpd_work_func);
  1486. /* Acquire all resources (IOMEM, IRQ and PHYs). */
  1487. res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dp");
  1488. dp->iomem = devm_ioremap_resource(dp->dev, res);
  1489. if (IS_ERR(dp->iomem)) {
  1490. ret = PTR_ERR(dp->iomem);
  1491. goto err_free;
  1492. }
  1493. dp->irq = platform_get_irq(pdev, 0);
  1494. if (dp->irq < 0) {
  1495. ret = dp->irq;
  1496. goto err_free;
  1497. }
  1498. dp->reset = devm_reset_control_get(dp->dev, NULL);
  1499. if (IS_ERR(dp->reset)) {
  1500. if (PTR_ERR(dp->reset) != -EPROBE_DEFER)
  1501. dev_err(dp->dev, "failed to get reset: %ld\n",
  1502. PTR_ERR(dp->reset));
  1503. ret = PTR_ERR(dp->reset);
  1504. goto err_free;
  1505. }
  1506. ret = zynqmp_dp_reset(dp, true);
  1507. if (ret < 0)
  1508. goto err_free;
  1509. ret = zynqmp_dp_reset(dp, false);
  1510. if (ret < 0)
  1511. goto err_free;
  1512. ret = zynqmp_dp_phy_probe(dp);
  1513. if (ret)
  1514. goto err_reset;
  1515. /* Initialize the bridge. */
  1516. bridge = &dp->bridge;
  1517. bridge->funcs = &zynqmp_dp_bridge_funcs;
  1518. bridge->ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID
  1519. | DRM_BRIDGE_OP_HPD;
  1520. bridge->type = DRM_MODE_CONNECTOR_DisplayPort;
  1521. bridge->of_node = dp->dev->of_node;
  1522. dpsub->bridge = bridge;
  1523. /*
  1524. * Acquire the next bridge in the chain. Ignore errors caused by port@5
  1525. * not being connected for backward-compatibility with older DTs.
  1526. */
  1527. ret = drm_of_find_panel_or_bridge(dp->dev->of_node, 5, 0, NULL,
  1528. &dp->next_bridge);
  1529. if (ret < 0 && ret != -ENODEV)
  1530. goto err_reset;
  1531. /* Initialize the hardware. */
  1532. dp->config.misc0 &= ~ZYNQMP_DP_MAIN_STREAM_MISC0_SYNC_LOCK;
  1533. zynqmp_dp_set_format(dp, NULL, ZYNQMP_DPSUB_FORMAT_RGB, 8);
  1534. zynqmp_dp_write(dp, ZYNQMP_DP_TX_PHY_POWER_DOWN,
  1535. ZYNQMP_DP_TX_PHY_POWER_DOWN_ALL);
  1536. zynqmp_dp_set(dp, ZYNQMP_DP_PHY_RESET, ZYNQMP_DP_PHY_RESET_ALL_RESET);
  1537. zynqmp_dp_write(dp, ZYNQMP_DP_FORCE_SCRAMBLER_RESET, 1);
  1538. zynqmp_dp_write(dp, ZYNQMP_DP_TRANSMITTER_ENABLE, 0);
  1539. zynqmp_dp_write(dp, ZYNQMP_DP_INT_DS, 0xffffffff);
  1540. ret = zynqmp_dp_phy_init(dp);
  1541. if (ret)
  1542. goto err_reset;
  1543. zynqmp_dp_write(dp, ZYNQMP_DP_TRANSMITTER_ENABLE, 1);
  1544. /*
  1545. * Now that the hardware is initialized and won't generate spurious
  1546. * interrupts, request the IRQ.
  1547. */
  1548. ret = devm_request_threaded_irq(dp->dev, dp->irq, NULL,
  1549. zynqmp_dp_irq_handler, IRQF_ONESHOT,
  1550. dev_name(dp->dev), dp);
  1551. if (ret < 0)
  1552. goto err_phy_exit;
  1553. dpsub->dp = dp;
  1554. dev_dbg(dp->dev, "ZynqMP DisplayPort Tx probed with %u lanes\n",
  1555. dp->num_lanes);
  1556. return 0;
  1557. err_phy_exit:
  1558. zynqmp_dp_phy_exit(dp);
  1559. err_reset:
  1560. zynqmp_dp_reset(dp, true);
  1561. err_free:
  1562. kfree(dp);
  1563. return ret;
  1564. }
  1565. void zynqmp_dp_remove(struct zynqmp_dpsub *dpsub)
  1566. {
  1567. struct zynqmp_dp *dp = dpsub->dp;
  1568. zynqmp_dp_write(dp, ZYNQMP_DP_INT_DS, ZYNQMP_DP_INT_ALL);
  1569. disable_irq(dp->irq);
  1570. cancel_work_sync(&dp->hpd_work);
  1571. zynqmp_dp_write(dp, ZYNQMP_DP_TRANSMITTER_ENABLE, 0);
  1572. zynqmp_dp_write(dp, ZYNQMP_DP_INT_DS, 0xffffffff);
  1573. zynqmp_dp_phy_exit(dp);
  1574. zynqmp_dp_reset(dp, true);
  1575. }