intel_panel.c 59 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952
  1. /*
  2. * Copyright © 2006-2010 Intel Corporation
  3. * Copyright (c) 2006 Dave Airlie <airlied@linux.ie>
  4. *
  5. * Permission is hereby granted, free of charge, to any person obtaining a
  6. * copy of this software and associated documentation files (the "Software"),
  7. * to deal in the Software without restriction, including without limitation
  8. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  9. * and/or sell copies of the Software, and to permit persons to whom the
  10. * Software is furnished to do so, subject to the following conditions:
  11. *
  12. * The above copyright notice and this permission notice (including the next
  13. * paragraph) shall be included in all copies or substantial portions of the
  14. * Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  21. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  22. * DEALINGS IN THE SOFTWARE.
  23. *
  24. * Authors:
  25. * Eric Anholt <eric@anholt.net>
  26. * Dave Airlie <airlied@linux.ie>
  27. * Jesse Barnes <jesse.barnes@intel.com>
  28. * Chris Wilson <chris@chris-wilson.co.uk>
  29. */
  30. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  31. #include <linux/kernel.h>
  32. #include <linux/moduleparam.h>
  33. #include <linux/pwm.h>
  34. #include "intel_drv.h"
  35. #define CRC_PMIC_PWM_PERIOD_NS 21333
  36. void
  37. intel_fixed_panel_mode(const struct drm_display_mode *fixed_mode,
  38. struct drm_display_mode *adjusted_mode)
  39. {
  40. drm_mode_copy(adjusted_mode, fixed_mode);
  41. drm_mode_set_crtcinfo(adjusted_mode, 0);
  42. }
  43. /**
  44. * intel_find_panel_downclock - find the reduced downclock for LVDS in EDID
  45. * @dev_priv: i915 device instance
  46. * @fixed_mode : panel native mode
  47. * @connector: LVDS/eDP connector
  48. *
  49. * Return downclock_avail
  50. * Find the reduced downclock for LVDS/eDP in EDID.
  51. */
  52. struct drm_display_mode *
  53. intel_find_panel_downclock(struct drm_i915_private *dev_priv,
  54. struct drm_display_mode *fixed_mode,
  55. struct drm_connector *connector)
  56. {
  57. struct drm_display_mode *scan, *tmp_mode;
  58. int temp_downclock;
  59. temp_downclock = fixed_mode->clock;
  60. tmp_mode = NULL;
  61. list_for_each_entry(scan, &connector->probed_modes, head) {
  62. /*
  63. * If one mode has the same resolution with the fixed_panel
  64. * mode while they have the different refresh rate, it means
  65. * that the reduced downclock is found. In such
  66. * case we can set the different FPx0/1 to dynamically select
  67. * between low and high frequency.
  68. */
  69. if (scan->hdisplay == fixed_mode->hdisplay &&
  70. scan->hsync_start == fixed_mode->hsync_start &&
  71. scan->hsync_end == fixed_mode->hsync_end &&
  72. scan->htotal == fixed_mode->htotal &&
  73. scan->vdisplay == fixed_mode->vdisplay &&
  74. scan->vsync_start == fixed_mode->vsync_start &&
  75. scan->vsync_end == fixed_mode->vsync_end &&
  76. scan->vtotal == fixed_mode->vtotal) {
  77. if (scan->clock < temp_downclock) {
  78. /*
  79. * The downclock is already found. But we
  80. * expect to find the lower downclock.
  81. */
  82. temp_downclock = scan->clock;
  83. tmp_mode = scan;
  84. }
  85. }
  86. }
  87. if (temp_downclock < fixed_mode->clock)
  88. return drm_mode_duplicate(&dev_priv->drm, tmp_mode);
  89. else
  90. return NULL;
  91. }
  92. /* adjusted_mode has been preset to be the panel's fixed mode */
  93. void
  94. intel_pch_panel_fitting(struct intel_crtc *intel_crtc,
  95. struct intel_crtc_state *pipe_config,
  96. int fitting_mode)
  97. {
  98. const struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
  99. int x = 0, y = 0, width = 0, height = 0;
  100. /* Native modes don't need fitting */
  101. if (adjusted_mode->crtc_hdisplay == pipe_config->pipe_src_w &&
  102. adjusted_mode->crtc_vdisplay == pipe_config->pipe_src_h &&
  103. !pipe_config->ycbcr420)
  104. goto done;
  105. switch (fitting_mode) {
  106. case DRM_MODE_SCALE_CENTER:
  107. width = pipe_config->pipe_src_w;
  108. height = pipe_config->pipe_src_h;
  109. x = (adjusted_mode->crtc_hdisplay - width + 1)/2;
  110. y = (adjusted_mode->crtc_vdisplay - height + 1)/2;
  111. break;
  112. case DRM_MODE_SCALE_ASPECT:
  113. /* Scale but preserve the aspect ratio */
  114. {
  115. u32 scaled_width = adjusted_mode->crtc_hdisplay
  116. * pipe_config->pipe_src_h;
  117. u32 scaled_height = pipe_config->pipe_src_w
  118. * adjusted_mode->crtc_vdisplay;
  119. if (scaled_width > scaled_height) { /* pillar */
  120. width = scaled_height / pipe_config->pipe_src_h;
  121. if (width & 1)
  122. width++;
  123. x = (adjusted_mode->crtc_hdisplay - width + 1) / 2;
  124. y = 0;
  125. height = adjusted_mode->crtc_vdisplay;
  126. } else if (scaled_width < scaled_height) { /* letter */
  127. height = scaled_width / pipe_config->pipe_src_w;
  128. if (height & 1)
  129. height++;
  130. y = (adjusted_mode->crtc_vdisplay - height + 1) / 2;
  131. x = 0;
  132. width = adjusted_mode->crtc_hdisplay;
  133. } else {
  134. x = y = 0;
  135. width = adjusted_mode->crtc_hdisplay;
  136. height = adjusted_mode->crtc_vdisplay;
  137. }
  138. }
  139. break;
  140. case DRM_MODE_SCALE_FULLSCREEN:
  141. x = y = 0;
  142. width = adjusted_mode->crtc_hdisplay;
  143. height = adjusted_mode->crtc_vdisplay;
  144. break;
  145. default:
  146. WARN(1, "bad panel fit mode: %d\n", fitting_mode);
  147. return;
  148. }
  149. done:
  150. pipe_config->pch_pfit.pos = (x << 16) | y;
  151. pipe_config->pch_pfit.size = (width << 16) | height;
  152. pipe_config->pch_pfit.enabled = pipe_config->pch_pfit.size != 0;
  153. }
  154. static void
  155. centre_horizontally(struct drm_display_mode *adjusted_mode,
  156. int width)
  157. {
  158. u32 border, sync_pos, blank_width, sync_width;
  159. /* keep the hsync and hblank widths constant */
  160. sync_width = adjusted_mode->crtc_hsync_end - adjusted_mode->crtc_hsync_start;
  161. blank_width = adjusted_mode->crtc_hblank_end - adjusted_mode->crtc_hblank_start;
  162. sync_pos = (blank_width - sync_width + 1) / 2;
  163. border = (adjusted_mode->crtc_hdisplay - width + 1) / 2;
  164. border += border & 1; /* make the border even */
  165. adjusted_mode->crtc_hdisplay = width;
  166. adjusted_mode->crtc_hblank_start = width + border;
  167. adjusted_mode->crtc_hblank_end = adjusted_mode->crtc_hblank_start + blank_width;
  168. adjusted_mode->crtc_hsync_start = adjusted_mode->crtc_hblank_start + sync_pos;
  169. adjusted_mode->crtc_hsync_end = adjusted_mode->crtc_hsync_start + sync_width;
  170. }
  171. static void
  172. centre_vertically(struct drm_display_mode *adjusted_mode,
  173. int height)
  174. {
  175. u32 border, sync_pos, blank_width, sync_width;
  176. /* keep the vsync and vblank widths constant */
  177. sync_width = adjusted_mode->crtc_vsync_end - adjusted_mode->crtc_vsync_start;
  178. blank_width = adjusted_mode->crtc_vblank_end - adjusted_mode->crtc_vblank_start;
  179. sync_pos = (blank_width - sync_width + 1) / 2;
  180. border = (adjusted_mode->crtc_vdisplay - height + 1) / 2;
  181. adjusted_mode->crtc_vdisplay = height;
  182. adjusted_mode->crtc_vblank_start = height + border;
  183. adjusted_mode->crtc_vblank_end = adjusted_mode->crtc_vblank_start + blank_width;
  184. adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vblank_start + sync_pos;
  185. adjusted_mode->crtc_vsync_end = adjusted_mode->crtc_vsync_start + sync_width;
  186. }
  187. static inline u32 panel_fitter_scaling(u32 source, u32 target)
  188. {
  189. /*
  190. * Floating point operation is not supported. So the FACTOR
  191. * is defined, which can avoid the floating point computation
  192. * when calculating the panel ratio.
  193. */
  194. #define ACCURACY 12
  195. #define FACTOR (1 << ACCURACY)
  196. u32 ratio = source * FACTOR / target;
  197. return (FACTOR * ratio + FACTOR/2) / FACTOR;
  198. }
  199. static void i965_scale_aspect(struct intel_crtc_state *pipe_config,
  200. u32 *pfit_control)
  201. {
  202. const struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
  203. u32 scaled_width = adjusted_mode->crtc_hdisplay *
  204. pipe_config->pipe_src_h;
  205. u32 scaled_height = pipe_config->pipe_src_w *
  206. adjusted_mode->crtc_vdisplay;
  207. /* 965+ is easy, it does everything in hw */
  208. if (scaled_width > scaled_height)
  209. *pfit_control |= PFIT_ENABLE |
  210. PFIT_SCALING_PILLAR;
  211. else if (scaled_width < scaled_height)
  212. *pfit_control |= PFIT_ENABLE |
  213. PFIT_SCALING_LETTER;
  214. else if (adjusted_mode->crtc_hdisplay != pipe_config->pipe_src_w)
  215. *pfit_control |= PFIT_ENABLE | PFIT_SCALING_AUTO;
  216. }
  217. static void i9xx_scale_aspect(struct intel_crtc_state *pipe_config,
  218. u32 *pfit_control, u32 *pfit_pgm_ratios,
  219. u32 *border)
  220. {
  221. struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
  222. u32 scaled_width = adjusted_mode->crtc_hdisplay *
  223. pipe_config->pipe_src_h;
  224. u32 scaled_height = pipe_config->pipe_src_w *
  225. adjusted_mode->crtc_vdisplay;
  226. u32 bits;
  227. /*
  228. * For earlier chips we have to calculate the scaling
  229. * ratio by hand and program it into the
  230. * PFIT_PGM_RATIO register
  231. */
  232. if (scaled_width > scaled_height) { /* pillar */
  233. centre_horizontally(adjusted_mode,
  234. scaled_height /
  235. pipe_config->pipe_src_h);
  236. *border = LVDS_BORDER_ENABLE;
  237. if (pipe_config->pipe_src_h != adjusted_mode->crtc_vdisplay) {
  238. bits = panel_fitter_scaling(pipe_config->pipe_src_h,
  239. adjusted_mode->crtc_vdisplay);
  240. *pfit_pgm_ratios |= (bits << PFIT_HORIZ_SCALE_SHIFT |
  241. bits << PFIT_VERT_SCALE_SHIFT);
  242. *pfit_control |= (PFIT_ENABLE |
  243. VERT_INTERP_BILINEAR |
  244. HORIZ_INTERP_BILINEAR);
  245. }
  246. } else if (scaled_width < scaled_height) { /* letter */
  247. centre_vertically(adjusted_mode,
  248. scaled_width /
  249. pipe_config->pipe_src_w);
  250. *border = LVDS_BORDER_ENABLE;
  251. if (pipe_config->pipe_src_w != adjusted_mode->crtc_hdisplay) {
  252. bits = panel_fitter_scaling(pipe_config->pipe_src_w,
  253. adjusted_mode->crtc_hdisplay);
  254. *pfit_pgm_ratios |= (bits << PFIT_HORIZ_SCALE_SHIFT |
  255. bits << PFIT_VERT_SCALE_SHIFT);
  256. *pfit_control |= (PFIT_ENABLE |
  257. VERT_INTERP_BILINEAR |
  258. HORIZ_INTERP_BILINEAR);
  259. }
  260. } else {
  261. /* Aspects match, Let hw scale both directions */
  262. *pfit_control |= (PFIT_ENABLE |
  263. VERT_AUTO_SCALE | HORIZ_AUTO_SCALE |
  264. VERT_INTERP_BILINEAR |
  265. HORIZ_INTERP_BILINEAR);
  266. }
  267. }
  268. void intel_gmch_panel_fitting(struct intel_crtc *intel_crtc,
  269. struct intel_crtc_state *pipe_config,
  270. int fitting_mode)
  271. {
  272. struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev);
  273. u32 pfit_control = 0, pfit_pgm_ratios = 0, border = 0;
  274. struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
  275. /* Native modes don't need fitting */
  276. if (adjusted_mode->crtc_hdisplay == pipe_config->pipe_src_w &&
  277. adjusted_mode->crtc_vdisplay == pipe_config->pipe_src_h)
  278. goto out;
  279. switch (fitting_mode) {
  280. case DRM_MODE_SCALE_CENTER:
  281. /*
  282. * For centered modes, we have to calculate border widths &
  283. * heights and modify the values programmed into the CRTC.
  284. */
  285. centre_horizontally(adjusted_mode, pipe_config->pipe_src_w);
  286. centre_vertically(adjusted_mode, pipe_config->pipe_src_h);
  287. border = LVDS_BORDER_ENABLE;
  288. break;
  289. case DRM_MODE_SCALE_ASPECT:
  290. /* Scale but preserve the aspect ratio */
  291. if (INTEL_GEN(dev_priv) >= 4)
  292. i965_scale_aspect(pipe_config, &pfit_control);
  293. else
  294. i9xx_scale_aspect(pipe_config, &pfit_control,
  295. &pfit_pgm_ratios, &border);
  296. break;
  297. case DRM_MODE_SCALE_FULLSCREEN:
  298. /*
  299. * Full scaling, even if it changes the aspect ratio.
  300. * Fortunately this is all done for us in hw.
  301. */
  302. if (pipe_config->pipe_src_h != adjusted_mode->crtc_vdisplay ||
  303. pipe_config->pipe_src_w != adjusted_mode->crtc_hdisplay) {
  304. pfit_control |= PFIT_ENABLE;
  305. if (INTEL_GEN(dev_priv) >= 4)
  306. pfit_control |= PFIT_SCALING_AUTO;
  307. else
  308. pfit_control |= (VERT_AUTO_SCALE |
  309. VERT_INTERP_BILINEAR |
  310. HORIZ_AUTO_SCALE |
  311. HORIZ_INTERP_BILINEAR);
  312. }
  313. break;
  314. default:
  315. WARN(1, "bad panel fit mode: %d\n", fitting_mode);
  316. return;
  317. }
  318. /* 965+ wants fuzzy fitting */
  319. /* FIXME: handle multiple panels by failing gracefully */
  320. if (INTEL_GEN(dev_priv) >= 4)
  321. pfit_control |= ((intel_crtc->pipe << PFIT_PIPE_SHIFT) |
  322. PFIT_FILTER_FUZZY);
  323. out:
  324. if ((pfit_control & PFIT_ENABLE) == 0) {
  325. pfit_control = 0;
  326. pfit_pgm_ratios = 0;
  327. }
  328. /* Make sure pre-965 set dither correctly for 18bpp panels. */
  329. if (INTEL_GEN(dev_priv) < 4 && pipe_config->pipe_bpp == 18)
  330. pfit_control |= PANEL_8TO6_DITHER_ENABLE;
  331. pipe_config->gmch_pfit.control = pfit_control;
  332. pipe_config->gmch_pfit.pgm_ratios = pfit_pgm_ratios;
  333. pipe_config->gmch_pfit.lvds_border_bits = border;
  334. }
  335. enum drm_connector_status
  336. intel_panel_detect(struct drm_i915_private *dev_priv)
  337. {
  338. /* Assume that the BIOS does not lie through the OpRegion... */
  339. if (!i915_modparams.panel_ignore_lid && dev_priv->opregion.lid_state) {
  340. return *dev_priv->opregion.lid_state & 0x1 ?
  341. connector_status_connected :
  342. connector_status_disconnected;
  343. }
  344. switch (i915_modparams.panel_ignore_lid) {
  345. case -2:
  346. return connector_status_connected;
  347. case -1:
  348. return connector_status_disconnected;
  349. default:
  350. return connector_status_unknown;
  351. }
  352. }
  353. /**
  354. * scale - scale values from one range to another
  355. * @source_val: value in range [@source_min..@source_max]
  356. * @source_min: minimum legal value for @source_val
  357. * @source_max: maximum legal value for @source_val
  358. * @target_min: corresponding target value for @source_min
  359. * @target_max: corresponding target value for @source_max
  360. *
  361. * Return @source_val in range [@source_min..@source_max] scaled to range
  362. * [@target_min..@target_max].
  363. */
  364. static uint32_t scale(uint32_t source_val,
  365. uint32_t source_min, uint32_t source_max,
  366. uint32_t target_min, uint32_t target_max)
  367. {
  368. uint64_t target_val;
  369. WARN_ON(source_min > source_max);
  370. WARN_ON(target_min > target_max);
  371. /* defensive */
  372. source_val = clamp(source_val, source_min, source_max);
  373. /* avoid overflows */
  374. target_val = mul_u32_u32(source_val - source_min,
  375. target_max - target_min);
  376. target_val = DIV_ROUND_CLOSEST_ULL(target_val, source_max - source_min);
  377. target_val += target_min;
  378. return target_val;
  379. }
  380. /* Scale user_level in range [0..user_max] to [hw_min..hw_max]. */
  381. static inline u32 scale_user_to_hw(struct intel_connector *connector,
  382. u32 user_level, u32 user_max)
  383. {
  384. struct intel_panel *panel = &connector->panel;
  385. return scale(user_level, 0, user_max,
  386. panel->backlight.min, panel->backlight.max);
  387. }
  388. /* Scale user_level in range [0..user_max] to [0..hw_max], clamping the result
  389. * to [hw_min..hw_max]. */
  390. static inline u32 clamp_user_to_hw(struct intel_connector *connector,
  391. u32 user_level, u32 user_max)
  392. {
  393. struct intel_panel *panel = &connector->panel;
  394. u32 hw_level;
  395. hw_level = scale(user_level, 0, user_max, 0, panel->backlight.max);
  396. hw_level = clamp(hw_level, panel->backlight.min, panel->backlight.max);
  397. return hw_level;
  398. }
  399. /* Scale hw_level in range [hw_min..hw_max] to [0..user_max]. */
  400. static inline u32 scale_hw_to_user(struct intel_connector *connector,
  401. u32 hw_level, u32 user_max)
  402. {
  403. struct intel_panel *panel = &connector->panel;
  404. return scale(hw_level, panel->backlight.min, panel->backlight.max,
  405. 0, user_max);
  406. }
  407. static u32 intel_panel_compute_brightness(struct intel_connector *connector,
  408. u32 val)
  409. {
  410. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  411. struct intel_panel *panel = &connector->panel;
  412. WARN_ON(panel->backlight.max == 0);
  413. if (i915_modparams.invert_brightness < 0)
  414. return val;
  415. if (i915_modparams.invert_brightness > 0 ||
  416. dev_priv->quirks & QUIRK_INVERT_BRIGHTNESS) {
  417. return panel->backlight.max - val + panel->backlight.min;
  418. }
  419. return val;
  420. }
  421. static u32 lpt_get_backlight(struct intel_connector *connector)
  422. {
  423. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  424. return I915_READ(BLC_PWM_PCH_CTL2) & BACKLIGHT_DUTY_CYCLE_MASK;
  425. }
  426. static u32 pch_get_backlight(struct intel_connector *connector)
  427. {
  428. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  429. return I915_READ(BLC_PWM_CPU_CTL) & BACKLIGHT_DUTY_CYCLE_MASK;
  430. }
  431. static u32 i9xx_get_backlight(struct intel_connector *connector)
  432. {
  433. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  434. struct intel_panel *panel = &connector->panel;
  435. u32 val;
  436. val = I915_READ(BLC_PWM_CTL) & BACKLIGHT_DUTY_CYCLE_MASK;
  437. if (INTEL_GEN(dev_priv) < 4)
  438. val >>= 1;
  439. if (panel->backlight.combination_mode) {
  440. u8 lbpc;
  441. pci_read_config_byte(dev_priv->drm.pdev, LBPC, &lbpc);
  442. val *= lbpc;
  443. }
  444. return val;
  445. }
  446. static u32 _vlv_get_backlight(struct drm_i915_private *dev_priv, enum pipe pipe)
  447. {
  448. if (WARN_ON(pipe != PIPE_A && pipe != PIPE_B))
  449. return 0;
  450. return I915_READ(VLV_BLC_PWM_CTL(pipe)) & BACKLIGHT_DUTY_CYCLE_MASK;
  451. }
  452. static u32 vlv_get_backlight(struct intel_connector *connector)
  453. {
  454. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  455. enum pipe pipe = intel_get_pipe_from_connector(connector);
  456. return _vlv_get_backlight(dev_priv, pipe);
  457. }
  458. static u32 bxt_get_backlight(struct intel_connector *connector)
  459. {
  460. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  461. struct intel_panel *panel = &connector->panel;
  462. return I915_READ(BXT_BLC_PWM_DUTY(panel->backlight.controller));
  463. }
  464. static u32 pwm_get_backlight(struct intel_connector *connector)
  465. {
  466. struct intel_panel *panel = &connector->panel;
  467. int duty_ns;
  468. duty_ns = pwm_get_duty_cycle(panel->backlight.pwm);
  469. return DIV_ROUND_UP(duty_ns * 100, CRC_PMIC_PWM_PERIOD_NS);
  470. }
  471. static void lpt_set_backlight(const struct drm_connector_state *conn_state, u32 level)
  472. {
  473. struct intel_connector *connector = to_intel_connector(conn_state->connector);
  474. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  475. u32 val = I915_READ(BLC_PWM_PCH_CTL2) & ~BACKLIGHT_DUTY_CYCLE_MASK;
  476. I915_WRITE(BLC_PWM_PCH_CTL2, val | level);
  477. }
  478. static void pch_set_backlight(const struct drm_connector_state *conn_state, u32 level)
  479. {
  480. struct intel_connector *connector = to_intel_connector(conn_state->connector);
  481. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  482. u32 tmp;
  483. tmp = I915_READ(BLC_PWM_CPU_CTL) & ~BACKLIGHT_DUTY_CYCLE_MASK;
  484. I915_WRITE(BLC_PWM_CPU_CTL, tmp | level);
  485. }
  486. static void i9xx_set_backlight(const struct drm_connector_state *conn_state, u32 level)
  487. {
  488. struct intel_connector *connector = to_intel_connector(conn_state->connector);
  489. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  490. struct intel_panel *panel = &connector->panel;
  491. u32 tmp, mask;
  492. WARN_ON(panel->backlight.max == 0);
  493. if (panel->backlight.combination_mode) {
  494. u8 lbpc;
  495. lbpc = level * 0xfe / panel->backlight.max + 1;
  496. level /= lbpc;
  497. pci_write_config_byte(dev_priv->drm.pdev, LBPC, lbpc);
  498. }
  499. if (IS_GEN4(dev_priv)) {
  500. mask = BACKLIGHT_DUTY_CYCLE_MASK;
  501. } else {
  502. level <<= 1;
  503. mask = BACKLIGHT_DUTY_CYCLE_MASK_PNV;
  504. }
  505. tmp = I915_READ(BLC_PWM_CTL) & ~mask;
  506. I915_WRITE(BLC_PWM_CTL, tmp | level);
  507. }
  508. static void vlv_set_backlight(const struct drm_connector_state *conn_state, u32 level)
  509. {
  510. struct intel_connector *connector = to_intel_connector(conn_state->connector);
  511. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  512. enum pipe pipe = to_intel_crtc(conn_state->crtc)->pipe;
  513. u32 tmp;
  514. tmp = I915_READ(VLV_BLC_PWM_CTL(pipe)) & ~BACKLIGHT_DUTY_CYCLE_MASK;
  515. I915_WRITE(VLV_BLC_PWM_CTL(pipe), tmp | level);
  516. }
  517. static void bxt_set_backlight(const struct drm_connector_state *conn_state, u32 level)
  518. {
  519. struct intel_connector *connector = to_intel_connector(conn_state->connector);
  520. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  521. struct intel_panel *panel = &connector->panel;
  522. I915_WRITE(BXT_BLC_PWM_DUTY(panel->backlight.controller), level);
  523. }
  524. static void pwm_set_backlight(const struct drm_connector_state *conn_state, u32 level)
  525. {
  526. struct intel_panel *panel = &to_intel_connector(conn_state->connector)->panel;
  527. int duty_ns = DIV_ROUND_UP(level * CRC_PMIC_PWM_PERIOD_NS, 100);
  528. pwm_config(panel->backlight.pwm, duty_ns, CRC_PMIC_PWM_PERIOD_NS);
  529. }
  530. static void
  531. intel_panel_actually_set_backlight(const struct drm_connector_state *conn_state, u32 level)
  532. {
  533. struct intel_connector *connector = to_intel_connector(conn_state->connector);
  534. struct intel_panel *panel = &connector->panel;
  535. DRM_DEBUG_DRIVER("set backlight PWM = %d\n", level);
  536. level = intel_panel_compute_brightness(connector, level);
  537. panel->backlight.set(conn_state, level);
  538. }
  539. /* set backlight brightness to level in range [0..max], assuming hw min is
  540. * respected.
  541. */
  542. void intel_panel_set_backlight_acpi(const struct drm_connector_state *conn_state,
  543. u32 user_level, u32 user_max)
  544. {
  545. struct intel_connector *connector = to_intel_connector(conn_state->connector);
  546. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  547. struct intel_panel *panel = &connector->panel;
  548. u32 hw_level;
  549. /*
  550. * Lack of crtc may occur during driver init because
  551. * connection_mutex isn't held across the entire backlight
  552. * setup + modeset readout, and the BIOS can issue the
  553. * requests at any time.
  554. */
  555. if (!panel->backlight.present || !conn_state->crtc)
  556. return;
  557. mutex_lock(&dev_priv->backlight_lock);
  558. WARN_ON(panel->backlight.max == 0);
  559. hw_level = clamp_user_to_hw(connector, user_level, user_max);
  560. panel->backlight.level = hw_level;
  561. if (panel->backlight.device)
  562. panel->backlight.device->props.brightness =
  563. scale_hw_to_user(connector,
  564. panel->backlight.level,
  565. panel->backlight.device->props.max_brightness);
  566. if (panel->backlight.enabled)
  567. intel_panel_actually_set_backlight(conn_state, hw_level);
  568. mutex_unlock(&dev_priv->backlight_lock);
  569. }
  570. static void lpt_disable_backlight(const struct drm_connector_state *old_conn_state)
  571. {
  572. struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
  573. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  574. u32 tmp;
  575. intel_panel_actually_set_backlight(old_conn_state, 0);
  576. /*
  577. * Although we don't support or enable CPU PWM with LPT/SPT based
  578. * systems, it may have been enabled prior to loading the
  579. * driver. Disable to avoid warnings on LCPLL disable.
  580. *
  581. * This needs rework if we need to add support for CPU PWM on PCH split
  582. * platforms.
  583. */
  584. tmp = I915_READ(BLC_PWM_CPU_CTL2);
  585. if (tmp & BLM_PWM_ENABLE) {
  586. DRM_DEBUG_KMS("cpu backlight was enabled, disabling\n");
  587. I915_WRITE(BLC_PWM_CPU_CTL2, tmp & ~BLM_PWM_ENABLE);
  588. }
  589. tmp = I915_READ(BLC_PWM_PCH_CTL1);
  590. I915_WRITE(BLC_PWM_PCH_CTL1, tmp & ~BLM_PCH_PWM_ENABLE);
  591. }
  592. static void pch_disable_backlight(const struct drm_connector_state *old_conn_state)
  593. {
  594. struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
  595. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  596. u32 tmp;
  597. intel_panel_actually_set_backlight(old_conn_state, 0);
  598. tmp = I915_READ(BLC_PWM_CPU_CTL2);
  599. I915_WRITE(BLC_PWM_CPU_CTL2, tmp & ~BLM_PWM_ENABLE);
  600. tmp = I915_READ(BLC_PWM_PCH_CTL1);
  601. I915_WRITE(BLC_PWM_PCH_CTL1, tmp & ~BLM_PCH_PWM_ENABLE);
  602. }
  603. static void i9xx_disable_backlight(const struct drm_connector_state *old_conn_state)
  604. {
  605. intel_panel_actually_set_backlight(old_conn_state, 0);
  606. }
  607. static void i965_disable_backlight(const struct drm_connector_state *old_conn_state)
  608. {
  609. struct drm_i915_private *dev_priv = to_i915(old_conn_state->connector->dev);
  610. u32 tmp;
  611. intel_panel_actually_set_backlight(old_conn_state, 0);
  612. tmp = I915_READ(BLC_PWM_CTL2);
  613. I915_WRITE(BLC_PWM_CTL2, tmp & ~BLM_PWM_ENABLE);
  614. }
  615. static void vlv_disable_backlight(const struct drm_connector_state *old_conn_state)
  616. {
  617. struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
  618. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  619. enum pipe pipe = to_intel_crtc(old_conn_state->crtc)->pipe;
  620. u32 tmp;
  621. intel_panel_actually_set_backlight(old_conn_state, 0);
  622. tmp = I915_READ(VLV_BLC_PWM_CTL2(pipe));
  623. I915_WRITE(VLV_BLC_PWM_CTL2(pipe), tmp & ~BLM_PWM_ENABLE);
  624. }
  625. static void bxt_disable_backlight(const struct drm_connector_state *old_conn_state)
  626. {
  627. struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
  628. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  629. struct intel_panel *panel = &connector->panel;
  630. u32 tmp, val;
  631. intel_panel_actually_set_backlight(old_conn_state, 0);
  632. tmp = I915_READ(BXT_BLC_PWM_CTL(panel->backlight.controller));
  633. I915_WRITE(BXT_BLC_PWM_CTL(panel->backlight.controller),
  634. tmp & ~BXT_BLC_PWM_ENABLE);
  635. if (panel->backlight.controller == 1) {
  636. val = I915_READ(UTIL_PIN_CTL);
  637. val &= ~UTIL_PIN_ENABLE;
  638. I915_WRITE(UTIL_PIN_CTL, val);
  639. }
  640. }
  641. static void cnp_disable_backlight(const struct drm_connector_state *old_conn_state)
  642. {
  643. struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
  644. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  645. struct intel_panel *panel = &connector->panel;
  646. u32 tmp;
  647. intel_panel_actually_set_backlight(old_conn_state, 0);
  648. tmp = I915_READ(BXT_BLC_PWM_CTL(panel->backlight.controller));
  649. I915_WRITE(BXT_BLC_PWM_CTL(panel->backlight.controller),
  650. tmp & ~BXT_BLC_PWM_ENABLE);
  651. }
  652. static void pwm_disable_backlight(const struct drm_connector_state *old_conn_state)
  653. {
  654. struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
  655. struct intel_panel *panel = &connector->panel;
  656. /* Disable the backlight */
  657. pwm_config(panel->backlight.pwm, 0, CRC_PMIC_PWM_PERIOD_NS);
  658. usleep_range(2000, 3000);
  659. pwm_disable(panel->backlight.pwm);
  660. }
  661. void intel_panel_disable_backlight(const struct drm_connector_state *old_conn_state)
  662. {
  663. struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
  664. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  665. struct intel_panel *panel = &connector->panel;
  666. if (!panel->backlight.present)
  667. return;
  668. /*
  669. * Do not disable backlight on the vga_switcheroo path. When switching
  670. * away from i915, the other client may depend on i915 to handle the
  671. * backlight. This will leave the backlight on unnecessarily when
  672. * another client is not activated.
  673. */
  674. if (dev_priv->drm.switch_power_state == DRM_SWITCH_POWER_CHANGING) {
  675. DRM_DEBUG_DRIVER("Skipping backlight disable on vga switch\n");
  676. return;
  677. }
  678. mutex_lock(&dev_priv->backlight_lock);
  679. if (panel->backlight.device)
  680. panel->backlight.device->props.power = FB_BLANK_POWERDOWN;
  681. panel->backlight.enabled = false;
  682. panel->backlight.disable(old_conn_state);
  683. mutex_unlock(&dev_priv->backlight_lock);
  684. }
  685. static void lpt_enable_backlight(const struct intel_crtc_state *crtc_state,
  686. const struct drm_connector_state *conn_state)
  687. {
  688. struct intel_connector *connector = to_intel_connector(conn_state->connector);
  689. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  690. struct intel_panel *panel = &connector->panel;
  691. u32 pch_ctl1, pch_ctl2, schicken;
  692. pch_ctl1 = I915_READ(BLC_PWM_PCH_CTL1);
  693. if (pch_ctl1 & BLM_PCH_PWM_ENABLE) {
  694. DRM_DEBUG_KMS("pch backlight already enabled\n");
  695. pch_ctl1 &= ~BLM_PCH_PWM_ENABLE;
  696. I915_WRITE(BLC_PWM_PCH_CTL1, pch_ctl1);
  697. }
  698. if (HAS_PCH_LPT(dev_priv)) {
  699. schicken = I915_READ(SOUTH_CHICKEN2);
  700. if (panel->backlight.alternate_pwm_increment)
  701. schicken |= LPT_PWM_GRANULARITY;
  702. else
  703. schicken &= ~LPT_PWM_GRANULARITY;
  704. I915_WRITE(SOUTH_CHICKEN2, schicken);
  705. } else {
  706. schicken = I915_READ(SOUTH_CHICKEN1);
  707. if (panel->backlight.alternate_pwm_increment)
  708. schicken |= SPT_PWM_GRANULARITY;
  709. else
  710. schicken &= ~SPT_PWM_GRANULARITY;
  711. I915_WRITE(SOUTH_CHICKEN1, schicken);
  712. }
  713. pch_ctl2 = panel->backlight.max << 16;
  714. I915_WRITE(BLC_PWM_PCH_CTL2, pch_ctl2);
  715. pch_ctl1 = 0;
  716. if (panel->backlight.active_low_pwm)
  717. pch_ctl1 |= BLM_PCH_POLARITY;
  718. /* After LPT, override is the default. */
  719. if (HAS_PCH_LPT(dev_priv))
  720. pch_ctl1 |= BLM_PCH_OVERRIDE_ENABLE;
  721. I915_WRITE(BLC_PWM_PCH_CTL1, pch_ctl1);
  722. POSTING_READ(BLC_PWM_PCH_CTL1);
  723. I915_WRITE(BLC_PWM_PCH_CTL1, pch_ctl1 | BLM_PCH_PWM_ENABLE);
  724. /* This won't stick until the above enable. */
  725. intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
  726. }
  727. static void pch_enable_backlight(const struct intel_crtc_state *crtc_state,
  728. const struct drm_connector_state *conn_state)
  729. {
  730. struct intel_connector *connector = to_intel_connector(conn_state->connector);
  731. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  732. struct intel_panel *panel = &connector->panel;
  733. enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
  734. u32 cpu_ctl2, pch_ctl1, pch_ctl2;
  735. cpu_ctl2 = I915_READ(BLC_PWM_CPU_CTL2);
  736. if (cpu_ctl2 & BLM_PWM_ENABLE) {
  737. DRM_DEBUG_KMS("cpu backlight already enabled\n");
  738. cpu_ctl2 &= ~BLM_PWM_ENABLE;
  739. I915_WRITE(BLC_PWM_CPU_CTL2, cpu_ctl2);
  740. }
  741. pch_ctl1 = I915_READ(BLC_PWM_PCH_CTL1);
  742. if (pch_ctl1 & BLM_PCH_PWM_ENABLE) {
  743. DRM_DEBUG_KMS("pch backlight already enabled\n");
  744. pch_ctl1 &= ~BLM_PCH_PWM_ENABLE;
  745. I915_WRITE(BLC_PWM_PCH_CTL1, pch_ctl1);
  746. }
  747. if (cpu_transcoder == TRANSCODER_EDP)
  748. cpu_ctl2 = BLM_TRANSCODER_EDP;
  749. else
  750. cpu_ctl2 = BLM_PIPE(cpu_transcoder);
  751. I915_WRITE(BLC_PWM_CPU_CTL2, cpu_ctl2);
  752. POSTING_READ(BLC_PWM_CPU_CTL2);
  753. I915_WRITE(BLC_PWM_CPU_CTL2, cpu_ctl2 | BLM_PWM_ENABLE);
  754. /* This won't stick until the above enable. */
  755. intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
  756. pch_ctl2 = panel->backlight.max << 16;
  757. I915_WRITE(BLC_PWM_PCH_CTL2, pch_ctl2);
  758. pch_ctl1 = 0;
  759. if (panel->backlight.active_low_pwm)
  760. pch_ctl1 |= BLM_PCH_POLARITY;
  761. I915_WRITE(BLC_PWM_PCH_CTL1, pch_ctl1);
  762. POSTING_READ(BLC_PWM_PCH_CTL1);
  763. I915_WRITE(BLC_PWM_PCH_CTL1, pch_ctl1 | BLM_PCH_PWM_ENABLE);
  764. }
  765. static void i9xx_enable_backlight(const struct intel_crtc_state *crtc_state,
  766. const struct drm_connector_state *conn_state)
  767. {
  768. struct intel_connector *connector = to_intel_connector(conn_state->connector);
  769. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  770. struct intel_panel *panel = &connector->panel;
  771. u32 ctl, freq;
  772. ctl = I915_READ(BLC_PWM_CTL);
  773. if (ctl & BACKLIGHT_DUTY_CYCLE_MASK_PNV) {
  774. DRM_DEBUG_KMS("backlight already enabled\n");
  775. I915_WRITE(BLC_PWM_CTL, 0);
  776. }
  777. freq = panel->backlight.max;
  778. if (panel->backlight.combination_mode)
  779. freq /= 0xff;
  780. ctl = freq << 17;
  781. if (panel->backlight.combination_mode)
  782. ctl |= BLM_LEGACY_MODE;
  783. if (IS_PINEVIEW(dev_priv) && panel->backlight.active_low_pwm)
  784. ctl |= BLM_POLARITY_PNV;
  785. I915_WRITE(BLC_PWM_CTL, ctl);
  786. POSTING_READ(BLC_PWM_CTL);
  787. /* XXX: combine this into above write? */
  788. intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
  789. /*
  790. * Needed to enable backlight on some 855gm models. BLC_HIST_CTL is
  791. * 855gm only, but checking for gen2 is safe, as 855gm is the only gen2
  792. * that has backlight.
  793. */
  794. if (IS_GEN2(dev_priv))
  795. I915_WRITE(BLC_HIST_CTL, BLM_HISTOGRAM_ENABLE);
  796. }
  797. static void i965_enable_backlight(const struct intel_crtc_state *crtc_state,
  798. const struct drm_connector_state *conn_state)
  799. {
  800. struct intel_connector *connector = to_intel_connector(conn_state->connector);
  801. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  802. struct intel_panel *panel = &connector->panel;
  803. enum pipe pipe = to_intel_crtc(conn_state->crtc)->pipe;
  804. u32 ctl, ctl2, freq;
  805. ctl2 = I915_READ(BLC_PWM_CTL2);
  806. if (ctl2 & BLM_PWM_ENABLE) {
  807. DRM_DEBUG_KMS("backlight already enabled\n");
  808. ctl2 &= ~BLM_PWM_ENABLE;
  809. I915_WRITE(BLC_PWM_CTL2, ctl2);
  810. }
  811. freq = panel->backlight.max;
  812. if (panel->backlight.combination_mode)
  813. freq /= 0xff;
  814. ctl = freq << 16;
  815. I915_WRITE(BLC_PWM_CTL, ctl);
  816. ctl2 = BLM_PIPE(pipe);
  817. if (panel->backlight.combination_mode)
  818. ctl2 |= BLM_COMBINATION_MODE;
  819. if (panel->backlight.active_low_pwm)
  820. ctl2 |= BLM_POLARITY_I965;
  821. I915_WRITE(BLC_PWM_CTL2, ctl2);
  822. POSTING_READ(BLC_PWM_CTL2);
  823. I915_WRITE(BLC_PWM_CTL2, ctl2 | BLM_PWM_ENABLE);
  824. intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
  825. }
  826. static void vlv_enable_backlight(const struct intel_crtc_state *crtc_state,
  827. const struct drm_connector_state *conn_state)
  828. {
  829. struct intel_connector *connector = to_intel_connector(conn_state->connector);
  830. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  831. struct intel_panel *panel = &connector->panel;
  832. enum pipe pipe = to_intel_crtc(crtc_state->base.crtc)->pipe;
  833. u32 ctl, ctl2;
  834. ctl2 = I915_READ(VLV_BLC_PWM_CTL2(pipe));
  835. if (ctl2 & BLM_PWM_ENABLE) {
  836. DRM_DEBUG_KMS("backlight already enabled\n");
  837. ctl2 &= ~BLM_PWM_ENABLE;
  838. I915_WRITE(VLV_BLC_PWM_CTL2(pipe), ctl2);
  839. }
  840. ctl = panel->backlight.max << 16;
  841. I915_WRITE(VLV_BLC_PWM_CTL(pipe), ctl);
  842. /* XXX: combine this into above write? */
  843. intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
  844. ctl2 = 0;
  845. if (panel->backlight.active_low_pwm)
  846. ctl2 |= BLM_POLARITY_I965;
  847. I915_WRITE(VLV_BLC_PWM_CTL2(pipe), ctl2);
  848. POSTING_READ(VLV_BLC_PWM_CTL2(pipe));
  849. I915_WRITE(VLV_BLC_PWM_CTL2(pipe), ctl2 | BLM_PWM_ENABLE);
  850. }
  851. static void bxt_enable_backlight(const struct intel_crtc_state *crtc_state,
  852. const struct drm_connector_state *conn_state)
  853. {
  854. struct intel_connector *connector = to_intel_connector(conn_state->connector);
  855. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  856. struct intel_panel *panel = &connector->panel;
  857. enum pipe pipe = to_intel_crtc(crtc_state->base.crtc)->pipe;
  858. u32 pwm_ctl, val;
  859. /* Controller 1 uses the utility pin. */
  860. if (panel->backlight.controller == 1) {
  861. val = I915_READ(UTIL_PIN_CTL);
  862. if (val & UTIL_PIN_ENABLE) {
  863. DRM_DEBUG_KMS("util pin already enabled\n");
  864. val &= ~UTIL_PIN_ENABLE;
  865. I915_WRITE(UTIL_PIN_CTL, val);
  866. }
  867. val = 0;
  868. if (panel->backlight.util_pin_active_low)
  869. val |= UTIL_PIN_POLARITY;
  870. I915_WRITE(UTIL_PIN_CTL, val | UTIL_PIN_PIPE(pipe) |
  871. UTIL_PIN_MODE_PWM | UTIL_PIN_ENABLE);
  872. }
  873. pwm_ctl = I915_READ(BXT_BLC_PWM_CTL(panel->backlight.controller));
  874. if (pwm_ctl & BXT_BLC_PWM_ENABLE) {
  875. DRM_DEBUG_KMS("backlight already enabled\n");
  876. pwm_ctl &= ~BXT_BLC_PWM_ENABLE;
  877. I915_WRITE(BXT_BLC_PWM_CTL(panel->backlight.controller),
  878. pwm_ctl);
  879. }
  880. I915_WRITE(BXT_BLC_PWM_FREQ(panel->backlight.controller),
  881. panel->backlight.max);
  882. intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
  883. pwm_ctl = 0;
  884. if (panel->backlight.active_low_pwm)
  885. pwm_ctl |= BXT_BLC_PWM_POLARITY;
  886. I915_WRITE(BXT_BLC_PWM_CTL(panel->backlight.controller), pwm_ctl);
  887. POSTING_READ(BXT_BLC_PWM_CTL(panel->backlight.controller));
  888. I915_WRITE(BXT_BLC_PWM_CTL(panel->backlight.controller),
  889. pwm_ctl | BXT_BLC_PWM_ENABLE);
  890. }
  891. static void cnp_enable_backlight(const struct intel_crtc_state *crtc_state,
  892. const struct drm_connector_state *conn_state)
  893. {
  894. struct intel_connector *connector = to_intel_connector(conn_state->connector);
  895. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  896. struct intel_panel *panel = &connector->panel;
  897. u32 pwm_ctl;
  898. pwm_ctl = I915_READ(BXT_BLC_PWM_CTL(panel->backlight.controller));
  899. if (pwm_ctl & BXT_BLC_PWM_ENABLE) {
  900. DRM_DEBUG_KMS("backlight already enabled\n");
  901. pwm_ctl &= ~BXT_BLC_PWM_ENABLE;
  902. I915_WRITE(BXT_BLC_PWM_CTL(panel->backlight.controller),
  903. pwm_ctl);
  904. }
  905. I915_WRITE(BXT_BLC_PWM_FREQ(panel->backlight.controller),
  906. panel->backlight.max);
  907. intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
  908. pwm_ctl = 0;
  909. if (panel->backlight.active_low_pwm)
  910. pwm_ctl |= BXT_BLC_PWM_POLARITY;
  911. I915_WRITE(BXT_BLC_PWM_CTL(panel->backlight.controller), pwm_ctl);
  912. POSTING_READ(BXT_BLC_PWM_CTL(panel->backlight.controller));
  913. I915_WRITE(BXT_BLC_PWM_CTL(panel->backlight.controller),
  914. pwm_ctl | BXT_BLC_PWM_ENABLE);
  915. }
  916. static void pwm_enable_backlight(const struct intel_crtc_state *crtc_state,
  917. const struct drm_connector_state *conn_state)
  918. {
  919. struct intel_connector *connector = to_intel_connector(conn_state->connector);
  920. struct intel_panel *panel = &connector->panel;
  921. pwm_enable(panel->backlight.pwm);
  922. intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
  923. }
  924. void intel_panel_enable_backlight(const struct intel_crtc_state *crtc_state,
  925. const struct drm_connector_state *conn_state)
  926. {
  927. struct intel_connector *connector = to_intel_connector(conn_state->connector);
  928. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  929. struct intel_panel *panel = &connector->panel;
  930. enum pipe pipe = to_intel_crtc(crtc_state->base.crtc)->pipe;
  931. if (!panel->backlight.present)
  932. return;
  933. DRM_DEBUG_KMS("pipe %c\n", pipe_name(pipe));
  934. mutex_lock(&dev_priv->backlight_lock);
  935. WARN_ON(panel->backlight.max == 0);
  936. if (panel->backlight.level <= panel->backlight.min) {
  937. panel->backlight.level = panel->backlight.max;
  938. if (panel->backlight.device)
  939. panel->backlight.device->props.brightness =
  940. scale_hw_to_user(connector,
  941. panel->backlight.level,
  942. panel->backlight.device->props.max_brightness);
  943. }
  944. panel->backlight.enable(crtc_state, conn_state);
  945. panel->backlight.enabled = true;
  946. if (panel->backlight.device)
  947. panel->backlight.device->props.power = FB_BLANK_UNBLANK;
  948. mutex_unlock(&dev_priv->backlight_lock);
  949. }
  950. #if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE)
  951. static u32 intel_panel_get_backlight(struct intel_connector *connector)
  952. {
  953. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  954. struct intel_panel *panel = &connector->panel;
  955. u32 val = 0;
  956. mutex_lock(&dev_priv->backlight_lock);
  957. if (panel->backlight.enabled) {
  958. val = panel->backlight.get(connector);
  959. val = intel_panel_compute_brightness(connector, val);
  960. }
  961. mutex_unlock(&dev_priv->backlight_lock);
  962. DRM_DEBUG_DRIVER("get backlight PWM = %d\n", val);
  963. return val;
  964. }
  965. /* set backlight brightness to level in range [0..max], scaling wrt hw min */
  966. static void intel_panel_set_backlight(const struct drm_connector_state *conn_state,
  967. u32 user_level, u32 user_max)
  968. {
  969. struct intel_connector *connector = to_intel_connector(conn_state->connector);
  970. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  971. struct intel_panel *panel = &connector->panel;
  972. u32 hw_level;
  973. if (!panel->backlight.present)
  974. return;
  975. mutex_lock(&dev_priv->backlight_lock);
  976. WARN_ON(panel->backlight.max == 0);
  977. hw_level = scale_user_to_hw(connector, user_level, user_max);
  978. panel->backlight.level = hw_level;
  979. if (panel->backlight.enabled)
  980. intel_panel_actually_set_backlight(conn_state, hw_level);
  981. mutex_unlock(&dev_priv->backlight_lock);
  982. }
  983. static int intel_backlight_device_update_status(struct backlight_device *bd)
  984. {
  985. struct intel_connector *connector = bl_get_data(bd);
  986. struct intel_panel *panel = &connector->panel;
  987. struct drm_device *dev = connector->base.dev;
  988. drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
  989. DRM_DEBUG_KMS("updating intel_backlight, brightness=%d/%d\n",
  990. bd->props.brightness, bd->props.max_brightness);
  991. intel_panel_set_backlight(connector->base.state, bd->props.brightness,
  992. bd->props.max_brightness);
  993. /*
  994. * Allow flipping bl_power as a sub-state of enabled. Sadly the
  995. * backlight class device does not make it easy to to differentiate
  996. * between callbacks for brightness and bl_power, so our backlight_power
  997. * callback needs to take this into account.
  998. */
  999. if (panel->backlight.enabled) {
  1000. if (panel->backlight.power) {
  1001. bool enable = bd->props.power == FB_BLANK_UNBLANK &&
  1002. bd->props.brightness != 0;
  1003. panel->backlight.power(connector, enable);
  1004. }
  1005. } else {
  1006. bd->props.power = FB_BLANK_POWERDOWN;
  1007. }
  1008. drm_modeset_unlock(&dev->mode_config.connection_mutex);
  1009. return 0;
  1010. }
  1011. static int intel_backlight_device_get_brightness(struct backlight_device *bd)
  1012. {
  1013. struct intel_connector *connector = bl_get_data(bd);
  1014. struct drm_device *dev = connector->base.dev;
  1015. struct drm_i915_private *dev_priv = to_i915(dev);
  1016. u32 hw_level;
  1017. int ret;
  1018. intel_runtime_pm_get(dev_priv);
  1019. drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
  1020. hw_level = intel_panel_get_backlight(connector);
  1021. ret = scale_hw_to_user(connector, hw_level, bd->props.max_brightness);
  1022. drm_modeset_unlock(&dev->mode_config.connection_mutex);
  1023. intel_runtime_pm_put(dev_priv);
  1024. return ret;
  1025. }
  1026. static const struct backlight_ops intel_backlight_device_ops = {
  1027. .update_status = intel_backlight_device_update_status,
  1028. .get_brightness = intel_backlight_device_get_brightness,
  1029. };
  1030. int intel_backlight_device_register(struct intel_connector *connector)
  1031. {
  1032. struct intel_panel *panel = &connector->panel;
  1033. struct backlight_properties props;
  1034. if (WARN_ON(panel->backlight.device))
  1035. return -ENODEV;
  1036. if (!panel->backlight.present)
  1037. return 0;
  1038. WARN_ON(panel->backlight.max == 0);
  1039. memset(&props, 0, sizeof(props));
  1040. props.type = BACKLIGHT_RAW;
  1041. /*
  1042. * Note: Everything should work even if the backlight device max
  1043. * presented to the userspace is arbitrarily chosen.
  1044. */
  1045. props.max_brightness = panel->backlight.max;
  1046. props.brightness = scale_hw_to_user(connector,
  1047. panel->backlight.level,
  1048. props.max_brightness);
  1049. if (panel->backlight.enabled)
  1050. props.power = FB_BLANK_UNBLANK;
  1051. else
  1052. props.power = FB_BLANK_POWERDOWN;
  1053. /*
  1054. * Note: using the same name independent of the connector prevents
  1055. * registration of multiple backlight devices in the driver.
  1056. */
  1057. panel->backlight.device =
  1058. backlight_device_register("intel_backlight",
  1059. connector->base.kdev,
  1060. connector,
  1061. &intel_backlight_device_ops, &props);
  1062. if (IS_ERR(panel->backlight.device)) {
  1063. DRM_ERROR("Failed to register backlight: %ld\n",
  1064. PTR_ERR(panel->backlight.device));
  1065. panel->backlight.device = NULL;
  1066. return -ENODEV;
  1067. }
  1068. DRM_DEBUG_KMS("Connector %s backlight sysfs interface registered\n",
  1069. connector->base.name);
  1070. return 0;
  1071. }
  1072. void intel_backlight_device_unregister(struct intel_connector *connector)
  1073. {
  1074. struct intel_panel *panel = &connector->panel;
  1075. if (panel->backlight.device) {
  1076. backlight_device_unregister(panel->backlight.device);
  1077. panel->backlight.device = NULL;
  1078. }
  1079. }
  1080. #endif /* CONFIG_BACKLIGHT_CLASS_DEVICE */
  1081. /*
  1082. * CNP: PWM clock frequency is 19.2 MHz or 24 MHz.
  1083. * PWM increment = 1
  1084. */
  1085. static u32 cnp_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
  1086. {
  1087. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  1088. return DIV_ROUND_CLOSEST(KHz(dev_priv->rawclk_freq), pwm_freq_hz);
  1089. }
  1090. /*
  1091. * BXT: PWM clock frequency = 19.2 MHz.
  1092. */
  1093. static u32 bxt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
  1094. {
  1095. return DIV_ROUND_CLOSEST(KHz(19200), pwm_freq_hz);
  1096. }
  1097. /*
  1098. * SPT: This value represents the period of the PWM stream in clock periods
  1099. * multiplied by 16 (default increment) or 128 (alternate increment selected in
  1100. * SCHICKEN_1 bit 0). PWM clock is 24 MHz.
  1101. */
  1102. static u32 spt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
  1103. {
  1104. struct intel_panel *panel = &connector->panel;
  1105. u32 mul;
  1106. if (panel->backlight.alternate_pwm_increment)
  1107. mul = 128;
  1108. else
  1109. mul = 16;
  1110. return DIV_ROUND_CLOSEST(MHz(24), pwm_freq_hz * mul);
  1111. }
  1112. /*
  1113. * LPT: This value represents the period of the PWM stream in clock periods
  1114. * multiplied by 128 (default increment) or 16 (alternate increment, selected in
  1115. * LPT SOUTH_CHICKEN2 register bit 5).
  1116. */
  1117. static u32 lpt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
  1118. {
  1119. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  1120. struct intel_panel *panel = &connector->panel;
  1121. u32 mul, clock;
  1122. if (panel->backlight.alternate_pwm_increment)
  1123. mul = 16;
  1124. else
  1125. mul = 128;
  1126. if (HAS_PCH_LPT_H(dev_priv))
  1127. clock = MHz(135); /* LPT:H */
  1128. else
  1129. clock = MHz(24); /* LPT:LP */
  1130. return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * mul);
  1131. }
  1132. /*
  1133. * ILK/SNB/IVB: This value represents the period of the PWM stream in PCH
  1134. * display raw clocks multiplied by 128.
  1135. */
  1136. static u32 pch_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
  1137. {
  1138. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  1139. return DIV_ROUND_CLOSEST(KHz(dev_priv->rawclk_freq), pwm_freq_hz * 128);
  1140. }
  1141. /*
  1142. * Gen2: This field determines the number of time base events (display core
  1143. * clock frequency/32) in total for a complete cycle of modulated backlight
  1144. * control.
  1145. *
  1146. * Gen3: A time base event equals the display core clock ([DevPNV] HRAW clock)
  1147. * divided by 32.
  1148. */
  1149. static u32 i9xx_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
  1150. {
  1151. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  1152. int clock;
  1153. if (IS_PINEVIEW(dev_priv))
  1154. clock = KHz(dev_priv->rawclk_freq);
  1155. else
  1156. clock = KHz(dev_priv->cdclk.hw.cdclk);
  1157. return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * 32);
  1158. }
  1159. /*
  1160. * Gen4: This value represents the period of the PWM stream in display core
  1161. * clocks ([DevCTG] HRAW clocks) multiplied by 128.
  1162. *
  1163. */
  1164. static u32 i965_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
  1165. {
  1166. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  1167. int clock;
  1168. if (IS_G4X(dev_priv))
  1169. clock = KHz(dev_priv->rawclk_freq);
  1170. else
  1171. clock = KHz(dev_priv->cdclk.hw.cdclk);
  1172. return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * 128);
  1173. }
  1174. /*
  1175. * VLV: This value represents the period of the PWM stream in display core
  1176. * clocks ([DevCTG] 200MHz HRAW clocks) multiplied by 128 or 25MHz S0IX clocks
  1177. * multiplied by 16. CHV uses a 19.2MHz S0IX clock.
  1178. */
  1179. static u32 vlv_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
  1180. {
  1181. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  1182. int mul, clock;
  1183. if ((I915_READ(CBR1_VLV) & CBR_PWM_CLOCK_MUX_SELECT) == 0) {
  1184. if (IS_CHERRYVIEW(dev_priv))
  1185. clock = KHz(19200);
  1186. else
  1187. clock = MHz(25);
  1188. mul = 16;
  1189. } else {
  1190. clock = KHz(dev_priv->rawclk_freq);
  1191. mul = 128;
  1192. }
  1193. return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * mul);
  1194. }
  1195. static u32 get_backlight_max_vbt(struct intel_connector *connector)
  1196. {
  1197. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  1198. struct intel_panel *panel = &connector->panel;
  1199. u16 pwm_freq_hz = dev_priv->vbt.backlight.pwm_freq_hz;
  1200. u32 pwm;
  1201. if (!panel->backlight.hz_to_pwm) {
  1202. DRM_DEBUG_KMS("backlight frequency conversion not supported\n");
  1203. return 0;
  1204. }
  1205. if (pwm_freq_hz) {
  1206. DRM_DEBUG_KMS("VBT defined backlight frequency %u Hz\n",
  1207. pwm_freq_hz);
  1208. } else {
  1209. pwm_freq_hz = 200;
  1210. DRM_DEBUG_KMS("default backlight frequency %u Hz\n",
  1211. pwm_freq_hz);
  1212. }
  1213. pwm = panel->backlight.hz_to_pwm(connector, pwm_freq_hz);
  1214. if (!pwm) {
  1215. DRM_DEBUG_KMS("backlight frequency conversion failed\n");
  1216. return 0;
  1217. }
  1218. return pwm;
  1219. }
  1220. /*
  1221. * Note: The setup hooks can't assume pipe is set!
  1222. */
  1223. static u32 get_backlight_min_vbt(struct intel_connector *connector)
  1224. {
  1225. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  1226. struct intel_panel *panel = &connector->panel;
  1227. int min;
  1228. WARN_ON(panel->backlight.max == 0);
  1229. /*
  1230. * XXX: If the vbt value is 255, it makes min equal to max, which leads
  1231. * to problems. There are such machines out there. Either our
  1232. * interpretation is wrong or the vbt has bogus data. Or both. Safeguard
  1233. * against this by letting the minimum be at most (arbitrarily chosen)
  1234. * 25% of the max.
  1235. */
  1236. min = clamp_t(int, dev_priv->vbt.backlight.min_brightness, 0, 64);
  1237. if (min != dev_priv->vbt.backlight.min_brightness) {
  1238. DRM_DEBUG_KMS("clamping VBT min backlight %d/255 to %d/255\n",
  1239. dev_priv->vbt.backlight.min_brightness, min);
  1240. }
  1241. /* vbt value is a coefficient in range [0..255] */
  1242. return scale(min, 0, 255, 0, panel->backlight.max);
  1243. }
  1244. static int lpt_setup_backlight(struct intel_connector *connector, enum pipe unused)
  1245. {
  1246. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  1247. struct intel_panel *panel = &connector->panel;
  1248. u32 pch_ctl1, pch_ctl2, val;
  1249. bool alt;
  1250. if (HAS_PCH_LPT(dev_priv))
  1251. alt = I915_READ(SOUTH_CHICKEN2) & LPT_PWM_GRANULARITY;
  1252. else
  1253. alt = I915_READ(SOUTH_CHICKEN1) & SPT_PWM_GRANULARITY;
  1254. panel->backlight.alternate_pwm_increment = alt;
  1255. pch_ctl1 = I915_READ(BLC_PWM_PCH_CTL1);
  1256. panel->backlight.active_low_pwm = pch_ctl1 & BLM_PCH_POLARITY;
  1257. pch_ctl2 = I915_READ(BLC_PWM_PCH_CTL2);
  1258. panel->backlight.max = pch_ctl2 >> 16;
  1259. if (!panel->backlight.max)
  1260. panel->backlight.max = get_backlight_max_vbt(connector);
  1261. if (!panel->backlight.max)
  1262. return -ENODEV;
  1263. panel->backlight.min = get_backlight_min_vbt(connector);
  1264. val = lpt_get_backlight(connector);
  1265. val = intel_panel_compute_brightness(connector, val);
  1266. panel->backlight.level = clamp(val, panel->backlight.min,
  1267. panel->backlight.max);
  1268. panel->backlight.enabled = pch_ctl1 & BLM_PCH_PWM_ENABLE;
  1269. return 0;
  1270. }
  1271. static int pch_setup_backlight(struct intel_connector *connector, enum pipe unused)
  1272. {
  1273. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  1274. struct intel_panel *panel = &connector->panel;
  1275. u32 cpu_ctl2, pch_ctl1, pch_ctl2, val;
  1276. pch_ctl1 = I915_READ(BLC_PWM_PCH_CTL1);
  1277. panel->backlight.active_low_pwm = pch_ctl1 & BLM_PCH_POLARITY;
  1278. pch_ctl2 = I915_READ(BLC_PWM_PCH_CTL2);
  1279. panel->backlight.max = pch_ctl2 >> 16;
  1280. if (!panel->backlight.max)
  1281. panel->backlight.max = get_backlight_max_vbt(connector);
  1282. if (!panel->backlight.max)
  1283. return -ENODEV;
  1284. panel->backlight.min = get_backlight_min_vbt(connector);
  1285. val = pch_get_backlight(connector);
  1286. val = intel_panel_compute_brightness(connector, val);
  1287. panel->backlight.level = clamp(val, panel->backlight.min,
  1288. panel->backlight.max);
  1289. cpu_ctl2 = I915_READ(BLC_PWM_CPU_CTL2);
  1290. panel->backlight.enabled = (cpu_ctl2 & BLM_PWM_ENABLE) &&
  1291. (pch_ctl1 & BLM_PCH_PWM_ENABLE);
  1292. return 0;
  1293. }
  1294. static int i9xx_setup_backlight(struct intel_connector *connector, enum pipe unused)
  1295. {
  1296. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  1297. struct intel_panel *panel = &connector->panel;
  1298. u32 ctl, val;
  1299. ctl = I915_READ(BLC_PWM_CTL);
  1300. if (IS_GEN2(dev_priv) || IS_I915GM(dev_priv) || IS_I945GM(dev_priv))
  1301. panel->backlight.combination_mode = ctl & BLM_LEGACY_MODE;
  1302. if (IS_PINEVIEW(dev_priv))
  1303. panel->backlight.active_low_pwm = ctl & BLM_POLARITY_PNV;
  1304. panel->backlight.max = ctl >> 17;
  1305. if (!panel->backlight.max) {
  1306. panel->backlight.max = get_backlight_max_vbt(connector);
  1307. panel->backlight.max >>= 1;
  1308. }
  1309. if (!panel->backlight.max)
  1310. return -ENODEV;
  1311. if (panel->backlight.combination_mode)
  1312. panel->backlight.max *= 0xff;
  1313. panel->backlight.min = get_backlight_min_vbt(connector);
  1314. val = i9xx_get_backlight(connector);
  1315. val = intel_panel_compute_brightness(connector, val);
  1316. panel->backlight.level = clamp(val, panel->backlight.min,
  1317. panel->backlight.max);
  1318. panel->backlight.enabled = val != 0;
  1319. return 0;
  1320. }
  1321. static int i965_setup_backlight(struct intel_connector *connector, enum pipe unused)
  1322. {
  1323. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  1324. struct intel_panel *panel = &connector->panel;
  1325. u32 ctl, ctl2, val;
  1326. ctl2 = I915_READ(BLC_PWM_CTL2);
  1327. panel->backlight.combination_mode = ctl2 & BLM_COMBINATION_MODE;
  1328. panel->backlight.active_low_pwm = ctl2 & BLM_POLARITY_I965;
  1329. ctl = I915_READ(BLC_PWM_CTL);
  1330. panel->backlight.max = ctl >> 16;
  1331. if (!panel->backlight.max)
  1332. panel->backlight.max = get_backlight_max_vbt(connector);
  1333. if (!panel->backlight.max)
  1334. return -ENODEV;
  1335. if (panel->backlight.combination_mode)
  1336. panel->backlight.max *= 0xff;
  1337. panel->backlight.min = get_backlight_min_vbt(connector);
  1338. val = i9xx_get_backlight(connector);
  1339. val = intel_panel_compute_brightness(connector, val);
  1340. panel->backlight.level = clamp(val, panel->backlight.min,
  1341. panel->backlight.max);
  1342. panel->backlight.enabled = ctl2 & BLM_PWM_ENABLE;
  1343. return 0;
  1344. }
  1345. static int vlv_setup_backlight(struct intel_connector *connector, enum pipe pipe)
  1346. {
  1347. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  1348. struct intel_panel *panel = &connector->panel;
  1349. u32 ctl, ctl2, val;
  1350. if (WARN_ON(pipe != PIPE_A && pipe != PIPE_B))
  1351. return -ENODEV;
  1352. ctl2 = I915_READ(VLV_BLC_PWM_CTL2(pipe));
  1353. panel->backlight.active_low_pwm = ctl2 & BLM_POLARITY_I965;
  1354. ctl = I915_READ(VLV_BLC_PWM_CTL(pipe));
  1355. panel->backlight.max = ctl >> 16;
  1356. if (!panel->backlight.max)
  1357. panel->backlight.max = get_backlight_max_vbt(connector);
  1358. if (!panel->backlight.max)
  1359. return -ENODEV;
  1360. panel->backlight.min = get_backlight_min_vbt(connector);
  1361. val = _vlv_get_backlight(dev_priv, pipe);
  1362. val = intel_panel_compute_brightness(connector, val);
  1363. panel->backlight.level = clamp(val, panel->backlight.min,
  1364. panel->backlight.max);
  1365. panel->backlight.enabled = ctl2 & BLM_PWM_ENABLE;
  1366. return 0;
  1367. }
  1368. static int
  1369. bxt_setup_backlight(struct intel_connector *connector, enum pipe unused)
  1370. {
  1371. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  1372. struct intel_panel *panel = &connector->panel;
  1373. u32 pwm_ctl, val;
  1374. panel->backlight.controller = dev_priv->vbt.backlight.controller;
  1375. pwm_ctl = I915_READ(BXT_BLC_PWM_CTL(panel->backlight.controller));
  1376. /* Controller 1 uses the utility pin. */
  1377. if (panel->backlight.controller == 1) {
  1378. val = I915_READ(UTIL_PIN_CTL);
  1379. panel->backlight.util_pin_active_low =
  1380. val & UTIL_PIN_POLARITY;
  1381. }
  1382. panel->backlight.active_low_pwm = pwm_ctl & BXT_BLC_PWM_POLARITY;
  1383. panel->backlight.max =
  1384. I915_READ(BXT_BLC_PWM_FREQ(panel->backlight.controller));
  1385. if (!panel->backlight.max)
  1386. panel->backlight.max = get_backlight_max_vbt(connector);
  1387. if (!panel->backlight.max)
  1388. return -ENODEV;
  1389. panel->backlight.min = get_backlight_min_vbt(connector);
  1390. val = bxt_get_backlight(connector);
  1391. val = intel_panel_compute_brightness(connector, val);
  1392. panel->backlight.level = clamp(val, panel->backlight.min,
  1393. panel->backlight.max);
  1394. panel->backlight.enabled = pwm_ctl & BXT_BLC_PWM_ENABLE;
  1395. return 0;
  1396. }
  1397. static int
  1398. cnp_setup_backlight(struct intel_connector *connector, enum pipe unused)
  1399. {
  1400. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  1401. struct intel_panel *panel = &connector->panel;
  1402. u32 pwm_ctl, val;
  1403. /*
  1404. * CNP has the BXT implementation of backlight, but with only one
  1405. * controller. TODO: ICP has multiple controllers but we only use
  1406. * controller 0 for now.
  1407. */
  1408. panel->backlight.controller = 0;
  1409. pwm_ctl = I915_READ(BXT_BLC_PWM_CTL(panel->backlight.controller));
  1410. panel->backlight.active_low_pwm = pwm_ctl & BXT_BLC_PWM_POLARITY;
  1411. panel->backlight.max =
  1412. I915_READ(BXT_BLC_PWM_FREQ(panel->backlight.controller));
  1413. if (!panel->backlight.max)
  1414. panel->backlight.max = get_backlight_max_vbt(connector);
  1415. if (!panel->backlight.max)
  1416. return -ENODEV;
  1417. panel->backlight.min = get_backlight_min_vbt(connector);
  1418. val = bxt_get_backlight(connector);
  1419. val = intel_panel_compute_brightness(connector, val);
  1420. panel->backlight.level = clamp(val, panel->backlight.min,
  1421. panel->backlight.max);
  1422. panel->backlight.enabled = pwm_ctl & BXT_BLC_PWM_ENABLE;
  1423. return 0;
  1424. }
  1425. static int pwm_setup_backlight(struct intel_connector *connector,
  1426. enum pipe pipe)
  1427. {
  1428. struct drm_device *dev = connector->base.dev;
  1429. struct intel_panel *panel = &connector->panel;
  1430. int retval;
  1431. /* Get the PWM chip for backlight control */
  1432. panel->backlight.pwm = pwm_get(dev->dev, "pwm_backlight");
  1433. if (IS_ERR(panel->backlight.pwm)) {
  1434. DRM_ERROR("Failed to own the pwm chip\n");
  1435. panel->backlight.pwm = NULL;
  1436. return -ENODEV;
  1437. }
  1438. /*
  1439. * FIXME: pwm_apply_args() should be removed when switching to
  1440. * the atomic PWM API.
  1441. */
  1442. pwm_apply_args(panel->backlight.pwm);
  1443. retval = pwm_config(panel->backlight.pwm, CRC_PMIC_PWM_PERIOD_NS,
  1444. CRC_PMIC_PWM_PERIOD_NS);
  1445. if (retval < 0) {
  1446. DRM_ERROR("Failed to configure the pwm chip\n");
  1447. pwm_put(panel->backlight.pwm);
  1448. panel->backlight.pwm = NULL;
  1449. return retval;
  1450. }
  1451. panel->backlight.min = 0; /* 0% */
  1452. panel->backlight.max = 100; /* 100% */
  1453. panel->backlight.level = DIV_ROUND_UP(
  1454. pwm_get_duty_cycle(panel->backlight.pwm) * 100,
  1455. CRC_PMIC_PWM_PERIOD_NS);
  1456. panel->backlight.enabled = panel->backlight.level != 0;
  1457. return 0;
  1458. }
  1459. int intel_panel_setup_backlight(struct drm_connector *connector, enum pipe pipe)
  1460. {
  1461. struct drm_i915_private *dev_priv = to_i915(connector->dev);
  1462. struct intel_connector *intel_connector = to_intel_connector(connector);
  1463. struct intel_panel *panel = &intel_connector->panel;
  1464. int ret;
  1465. if (!dev_priv->vbt.backlight.present) {
  1466. if (dev_priv->quirks & QUIRK_BACKLIGHT_PRESENT) {
  1467. DRM_DEBUG_KMS("no backlight present per VBT, but present per quirk\n");
  1468. } else {
  1469. DRM_DEBUG_KMS("no backlight present per VBT\n");
  1470. return 0;
  1471. }
  1472. }
  1473. /* ensure intel_panel has been initialized first */
  1474. if (WARN_ON(!panel->backlight.setup))
  1475. return -ENODEV;
  1476. /* set level and max in panel struct */
  1477. mutex_lock(&dev_priv->backlight_lock);
  1478. ret = panel->backlight.setup(intel_connector, pipe);
  1479. mutex_unlock(&dev_priv->backlight_lock);
  1480. if (ret) {
  1481. DRM_DEBUG_KMS("failed to setup backlight for connector %s\n",
  1482. connector->name);
  1483. return ret;
  1484. }
  1485. panel->backlight.present = true;
  1486. DRM_DEBUG_KMS("Connector %s backlight initialized, %s, brightness %u/%u\n",
  1487. connector->name,
  1488. enableddisabled(panel->backlight.enabled),
  1489. panel->backlight.level, panel->backlight.max);
  1490. return 0;
  1491. }
  1492. void intel_panel_destroy_backlight(struct drm_connector *connector)
  1493. {
  1494. struct intel_connector *intel_connector = to_intel_connector(connector);
  1495. struct intel_panel *panel = &intel_connector->panel;
  1496. /* dispose of the pwm */
  1497. if (panel->backlight.pwm)
  1498. pwm_put(panel->backlight.pwm);
  1499. panel->backlight.present = false;
  1500. }
  1501. /* Set up chip specific backlight functions */
  1502. static void
  1503. intel_panel_init_backlight_funcs(struct intel_panel *panel)
  1504. {
  1505. struct intel_connector *connector =
  1506. container_of(panel, struct intel_connector, panel);
  1507. struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
  1508. if (connector->base.connector_type == DRM_MODE_CONNECTOR_eDP &&
  1509. intel_dp_aux_init_backlight_funcs(connector) == 0)
  1510. return;
  1511. if (connector->base.connector_type == DRM_MODE_CONNECTOR_DSI &&
  1512. intel_dsi_dcs_init_backlight_funcs(connector) == 0)
  1513. return;
  1514. if (IS_GEN9_LP(dev_priv)) {
  1515. panel->backlight.setup = bxt_setup_backlight;
  1516. panel->backlight.enable = bxt_enable_backlight;
  1517. panel->backlight.disable = bxt_disable_backlight;
  1518. panel->backlight.set = bxt_set_backlight;
  1519. panel->backlight.get = bxt_get_backlight;
  1520. panel->backlight.hz_to_pwm = bxt_hz_to_pwm;
  1521. } else if (HAS_PCH_CNP(dev_priv) || HAS_PCH_ICP(dev_priv)) {
  1522. panel->backlight.setup = cnp_setup_backlight;
  1523. panel->backlight.enable = cnp_enable_backlight;
  1524. panel->backlight.disable = cnp_disable_backlight;
  1525. panel->backlight.set = bxt_set_backlight;
  1526. panel->backlight.get = bxt_get_backlight;
  1527. panel->backlight.hz_to_pwm = cnp_hz_to_pwm;
  1528. } else if (HAS_PCH_LPT(dev_priv) || HAS_PCH_SPT(dev_priv) ||
  1529. HAS_PCH_KBP(dev_priv)) {
  1530. panel->backlight.setup = lpt_setup_backlight;
  1531. panel->backlight.enable = lpt_enable_backlight;
  1532. panel->backlight.disable = lpt_disable_backlight;
  1533. panel->backlight.set = lpt_set_backlight;
  1534. panel->backlight.get = lpt_get_backlight;
  1535. if (HAS_PCH_LPT(dev_priv))
  1536. panel->backlight.hz_to_pwm = lpt_hz_to_pwm;
  1537. else
  1538. panel->backlight.hz_to_pwm = spt_hz_to_pwm;
  1539. } else if (HAS_PCH_SPLIT(dev_priv)) {
  1540. panel->backlight.setup = pch_setup_backlight;
  1541. panel->backlight.enable = pch_enable_backlight;
  1542. panel->backlight.disable = pch_disable_backlight;
  1543. panel->backlight.set = pch_set_backlight;
  1544. panel->backlight.get = pch_get_backlight;
  1545. panel->backlight.hz_to_pwm = pch_hz_to_pwm;
  1546. } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
  1547. if (connector->base.connector_type == DRM_MODE_CONNECTOR_DSI) {
  1548. panel->backlight.setup = pwm_setup_backlight;
  1549. panel->backlight.enable = pwm_enable_backlight;
  1550. panel->backlight.disable = pwm_disable_backlight;
  1551. panel->backlight.set = pwm_set_backlight;
  1552. panel->backlight.get = pwm_get_backlight;
  1553. } else {
  1554. panel->backlight.setup = vlv_setup_backlight;
  1555. panel->backlight.enable = vlv_enable_backlight;
  1556. panel->backlight.disable = vlv_disable_backlight;
  1557. panel->backlight.set = vlv_set_backlight;
  1558. panel->backlight.get = vlv_get_backlight;
  1559. panel->backlight.hz_to_pwm = vlv_hz_to_pwm;
  1560. }
  1561. } else if (IS_GEN4(dev_priv)) {
  1562. panel->backlight.setup = i965_setup_backlight;
  1563. panel->backlight.enable = i965_enable_backlight;
  1564. panel->backlight.disable = i965_disable_backlight;
  1565. panel->backlight.set = i9xx_set_backlight;
  1566. panel->backlight.get = i9xx_get_backlight;
  1567. panel->backlight.hz_to_pwm = i965_hz_to_pwm;
  1568. } else {
  1569. panel->backlight.setup = i9xx_setup_backlight;
  1570. panel->backlight.enable = i9xx_enable_backlight;
  1571. panel->backlight.disable = i9xx_disable_backlight;
  1572. panel->backlight.set = i9xx_set_backlight;
  1573. panel->backlight.get = i9xx_get_backlight;
  1574. panel->backlight.hz_to_pwm = i9xx_hz_to_pwm;
  1575. }
  1576. }
  1577. int intel_panel_init(struct intel_panel *panel,
  1578. struct drm_display_mode *fixed_mode,
  1579. struct drm_display_mode *downclock_mode)
  1580. {
  1581. intel_panel_init_backlight_funcs(panel);
  1582. panel->fixed_mode = fixed_mode;
  1583. panel->downclock_mode = downclock_mode;
  1584. return 0;
  1585. }
  1586. void intel_panel_fini(struct intel_panel *panel)
  1587. {
  1588. struct intel_connector *intel_connector =
  1589. container_of(panel, struct intel_connector, panel);
  1590. if (panel->fixed_mode)
  1591. drm_mode_destroy(intel_connector->base.dev, panel->fixed_mode);
  1592. if (panel->downclock_mode)
  1593. drm_mode_destroy(intel_connector->base.dev,
  1594. panel->downclock_mode);
  1595. }