Merge tag 'm68knommu-for-v5.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / display / intel_panel.c
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
31 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
32
33 #include <linux/kernel.h>
34 #include <linux/moduleparam.h>
35 #include <linux/pwm.h>
36
37 #include "intel_connector.h"
38 #include "intel_display_types.h"
39 #include "intel_dp_aux_backlight.h"
40 #include "intel_dsi_dcs_backlight.h"
41 #include "intel_panel.h"
42
43 #define CRC_PMIC_PWM_PERIOD_NS  21333
44
45 void
46 intel_fixed_panel_mode(const struct drm_display_mode *fixed_mode,
47                        struct drm_display_mode *adjusted_mode)
48 {
49         drm_mode_copy(adjusted_mode, fixed_mode);
50
51         drm_mode_set_crtcinfo(adjusted_mode, 0);
52 }
53
54 static bool is_downclock_mode(const struct drm_display_mode *downclock_mode,
55                               const struct drm_display_mode *fixed_mode)
56 {
57         return drm_mode_match(downclock_mode, fixed_mode,
58                               DRM_MODE_MATCH_TIMINGS |
59                               DRM_MODE_MATCH_FLAGS |
60                               DRM_MODE_MATCH_3D_FLAGS) &&
61                 downclock_mode->clock < fixed_mode->clock;
62 }
63
64 struct drm_display_mode *
65 intel_panel_edid_downclock_mode(struct intel_connector *connector,
66                                 const struct drm_display_mode *fixed_mode)
67 {
68         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
69         const struct drm_display_mode *scan, *best_mode = NULL;
70         struct drm_display_mode *downclock_mode;
71         int best_clock = fixed_mode->clock;
72
73         list_for_each_entry(scan, &connector->base.probed_modes, head) {
74                 /*
75                  * If one mode has the same resolution with the fixed_panel
76                  * mode while they have the different refresh rate, it means
77                  * that the reduced downclock is found. In such
78                  * case we can set the different FPx0/1 to dynamically select
79                  * between low and high frequency.
80                  */
81                 if (is_downclock_mode(scan, fixed_mode) &&
82                     scan->clock < best_clock) {
83                         /*
84                          * The downclock is already found. But we
85                          * expect to find the lower downclock.
86                          */
87                         best_clock = scan->clock;
88                         best_mode = scan;
89                 }
90         }
91
92         if (!best_mode)
93                 return NULL;
94
95         downclock_mode = drm_mode_duplicate(&dev_priv->drm, best_mode);
96         if (!downclock_mode)
97                 return NULL;
98
99         drm_dbg_kms(&dev_priv->drm,
100                     "[CONNECTOR:%d:%s] using downclock mode from EDID: ",
101                     connector->base.base.id, connector->base.name);
102         drm_mode_debug_printmodeline(downclock_mode);
103
104         return downclock_mode;
105 }
106
107 struct drm_display_mode *
108 intel_panel_edid_fixed_mode(struct intel_connector *connector)
109 {
110         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
111         const struct drm_display_mode *scan;
112         struct drm_display_mode *fixed_mode;
113
114         if (list_empty(&connector->base.probed_modes))
115                 return NULL;
116
117         /* prefer fixed mode from EDID if available */
118         list_for_each_entry(scan, &connector->base.probed_modes, head) {
119                 if ((scan->type & DRM_MODE_TYPE_PREFERRED) == 0)
120                         continue;
121
122                 fixed_mode = drm_mode_duplicate(&dev_priv->drm, scan);
123                 if (!fixed_mode)
124                         return NULL;
125
126                 drm_dbg_kms(&dev_priv->drm,
127                             "[CONNECTOR:%d:%s] using preferred mode from EDID: ",
128                             connector->base.base.id, connector->base.name);
129                 drm_mode_debug_printmodeline(fixed_mode);
130
131                 return fixed_mode;
132         }
133
134         scan = list_first_entry(&connector->base.probed_modes,
135                                 typeof(*scan), head);
136
137         fixed_mode = drm_mode_duplicate(&dev_priv->drm, scan);
138         if (!fixed_mode)
139                 return NULL;
140
141         fixed_mode->type |= DRM_MODE_TYPE_PREFERRED;
142
143         drm_dbg_kms(&dev_priv->drm,
144                     "[CONNECTOR:%d:%s] using first mode from EDID: ",
145                     connector->base.base.id, connector->base.name);
146         drm_mode_debug_printmodeline(fixed_mode);
147
148         return fixed_mode;
149 }
150
151 struct drm_display_mode *
152 intel_panel_vbt_fixed_mode(struct intel_connector *connector)
153 {
154         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
155         struct drm_display_info *info = &connector->base.display_info;
156         struct drm_display_mode *fixed_mode;
157
158         if (!dev_priv->vbt.lfp_lvds_vbt_mode)
159                 return NULL;
160
161         fixed_mode = drm_mode_duplicate(&dev_priv->drm,
162                                         dev_priv->vbt.lfp_lvds_vbt_mode);
163         if (!fixed_mode)
164                 return NULL;
165
166         fixed_mode->type |= DRM_MODE_TYPE_PREFERRED;
167
168         drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s] using mode from VBT: ",
169                     connector->base.base.id, connector->base.name);
170         drm_mode_debug_printmodeline(fixed_mode);
171
172         info->width_mm = fixed_mode->width_mm;
173         info->height_mm = fixed_mode->height_mm;
174
175         return fixed_mode;
176 }
177
178 /* adjusted_mode has been preset to be the panel's fixed mode */
179 int intel_pch_panel_fitting(struct intel_crtc_state *crtc_state,
180                             const struct drm_connector_state *conn_state)
181 {
182         const struct drm_display_mode *adjusted_mode =
183                 &crtc_state->hw.adjusted_mode;
184         int x, y, width, height;
185
186         /* Native modes don't need fitting */
187         if (adjusted_mode->crtc_hdisplay == crtc_state->pipe_src_w &&
188             adjusted_mode->crtc_vdisplay == crtc_state->pipe_src_h &&
189             crtc_state->output_format != INTEL_OUTPUT_FORMAT_YCBCR420)
190                 return 0;
191
192         switch (conn_state->scaling_mode) {
193         case DRM_MODE_SCALE_CENTER:
194                 width = crtc_state->pipe_src_w;
195                 height = crtc_state->pipe_src_h;
196                 x = (adjusted_mode->crtc_hdisplay - width + 1)/2;
197                 y = (adjusted_mode->crtc_vdisplay - height + 1)/2;
198                 break;
199
200         case DRM_MODE_SCALE_ASPECT:
201                 /* Scale but preserve the aspect ratio */
202                 {
203                         u32 scaled_width = adjusted_mode->crtc_hdisplay
204                                 * crtc_state->pipe_src_h;
205                         u32 scaled_height = crtc_state->pipe_src_w
206                                 * adjusted_mode->crtc_vdisplay;
207                         if (scaled_width > scaled_height) { /* pillar */
208                                 width = scaled_height / crtc_state->pipe_src_h;
209                                 if (width & 1)
210                                         width++;
211                                 x = (adjusted_mode->crtc_hdisplay - width + 1) / 2;
212                                 y = 0;
213                                 height = adjusted_mode->crtc_vdisplay;
214                         } else if (scaled_width < scaled_height) { /* letter */
215                                 height = scaled_width / crtc_state->pipe_src_w;
216                                 if (height & 1)
217                                     height++;
218                                 y = (adjusted_mode->crtc_vdisplay - height + 1) / 2;
219                                 x = 0;
220                                 width = adjusted_mode->crtc_hdisplay;
221                         } else {
222                                 x = y = 0;
223                                 width = adjusted_mode->crtc_hdisplay;
224                                 height = adjusted_mode->crtc_vdisplay;
225                         }
226                 }
227                 break;
228
229         case DRM_MODE_SCALE_NONE:
230                 WARN_ON(adjusted_mode->crtc_hdisplay != crtc_state->pipe_src_w);
231                 WARN_ON(adjusted_mode->crtc_vdisplay != crtc_state->pipe_src_h);
232                 fallthrough;
233         case DRM_MODE_SCALE_FULLSCREEN:
234                 x = y = 0;
235                 width = adjusted_mode->crtc_hdisplay;
236                 height = adjusted_mode->crtc_vdisplay;
237                 break;
238
239         default:
240                 MISSING_CASE(conn_state->scaling_mode);
241                 return -EINVAL;
242         }
243
244         drm_rect_init(&crtc_state->pch_pfit.dst,
245                       x, y, width, height);
246         crtc_state->pch_pfit.enabled = true;
247
248         return 0;
249 }
250
251 static void
252 centre_horizontally(struct drm_display_mode *adjusted_mode,
253                     int width)
254 {
255         u32 border, sync_pos, blank_width, sync_width;
256
257         /* keep the hsync and hblank widths constant */
258         sync_width = adjusted_mode->crtc_hsync_end - adjusted_mode->crtc_hsync_start;
259         blank_width = adjusted_mode->crtc_hblank_end - adjusted_mode->crtc_hblank_start;
260         sync_pos = (blank_width - sync_width + 1) / 2;
261
262         border = (adjusted_mode->crtc_hdisplay - width + 1) / 2;
263         border += border & 1; /* make the border even */
264
265         adjusted_mode->crtc_hdisplay = width;
266         adjusted_mode->crtc_hblank_start = width + border;
267         adjusted_mode->crtc_hblank_end = adjusted_mode->crtc_hblank_start + blank_width;
268
269         adjusted_mode->crtc_hsync_start = adjusted_mode->crtc_hblank_start + sync_pos;
270         adjusted_mode->crtc_hsync_end = adjusted_mode->crtc_hsync_start + sync_width;
271 }
272
273 static void
274 centre_vertically(struct drm_display_mode *adjusted_mode,
275                   int height)
276 {
277         u32 border, sync_pos, blank_width, sync_width;
278
279         /* keep the vsync and vblank widths constant */
280         sync_width = adjusted_mode->crtc_vsync_end - adjusted_mode->crtc_vsync_start;
281         blank_width = adjusted_mode->crtc_vblank_end - adjusted_mode->crtc_vblank_start;
282         sync_pos = (blank_width - sync_width + 1) / 2;
283
284         border = (adjusted_mode->crtc_vdisplay - height + 1) / 2;
285
286         adjusted_mode->crtc_vdisplay = height;
287         adjusted_mode->crtc_vblank_start = height + border;
288         adjusted_mode->crtc_vblank_end = adjusted_mode->crtc_vblank_start + blank_width;
289
290         adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vblank_start + sync_pos;
291         adjusted_mode->crtc_vsync_end = adjusted_mode->crtc_vsync_start + sync_width;
292 }
293
294 static u32 panel_fitter_scaling(u32 source, u32 target)
295 {
296         /*
297          * Floating point operation is not supported. So the FACTOR
298          * is defined, which can avoid the floating point computation
299          * when calculating the panel ratio.
300          */
301 #define ACCURACY 12
302 #define FACTOR (1 << ACCURACY)
303         u32 ratio = source * FACTOR / target;
304         return (FACTOR * ratio + FACTOR/2) / FACTOR;
305 }
306
307 static void i965_scale_aspect(struct intel_crtc_state *crtc_state,
308                               u32 *pfit_control)
309 {
310         const struct drm_display_mode *adjusted_mode =
311                 &crtc_state->hw.adjusted_mode;
312         u32 scaled_width = adjusted_mode->crtc_hdisplay *
313                 crtc_state->pipe_src_h;
314         u32 scaled_height = crtc_state->pipe_src_w *
315                 adjusted_mode->crtc_vdisplay;
316
317         /* 965+ is easy, it does everything in hw */
318         if (scaled_width > scaled_height)
319                 *pfit_control |= PFIT_ENABLE |
320                         PFIT_SCALING_PILLAR;
321         else if (scaled_width < scaled_height)
322                 *pfit_control |= PFIT_ENABLE |
323                         PFIT_SCALING_LETTER;
324         else if (adjusted_mode->crtc_hdisplay != crtc_state->pipe_src_w)
325                 *pfit_control |= PFIT_ENABLE | PFIT_SCALING_AUTO;
326 }
327
328 static void i9xx_scale_aspect(struct intel_crtc_state *crtc_state,
329                               u32 *pfit_control, u32 *pfit_pgm_ratios,
330                               u32 *border)
331 {
332         struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode;
333         u32 scaled_width = adjusted_mode->crtc_hdisplay *
334                 crtc_state->pipe_src_h;
335         u32 scaled_height = crtc_state->pipe_src_w *
336                 adjusted_mode->crtc_vdisplay;
337         u32 bits;
338
339         /*
340          * For earlier chips we have to calculate the scaling
341          * ratio by hand and program it into the
342          * PFIT_PGM_RATIO register
343          */
344         if (scaled_width > scaled_height) { /* pillar */
345                 centre_horizontally(adjusted_mode,
346                                     scaled_height /
347                                     crtc_state->pipe_src_h);
348
349                 *border = LVDS_BORDER_ENABLE;
350                 if (crtc_state->pipe_src_h != adjusted_mode->crtc_vdisplay) {
351                         bits = panel_fitter_scaling(crtc_state->pipe_src_h,
352                                                     adjusted_mode->crtc_vdisplay);
353
354                         *pfit_pgm_ratios |= (bits << PFIT_HORIZ_SCALE_SHIFT |
355                                              bits << PFIT_VERT_SCALE_SHIFT);
356                         *pfit_control |= (PFIT_ENABLE |
357                                           VERT_INTERP_BILINEAR |
358                                           HORIZ_INTERP_BILINEAR);
359                 }
360         } else if (scaled_width < scaled_height) { /* letter */
361                 centre_vertically(adjusted_mode,
362                                   scaled_width /
363                                   crtc_state->pipe_src_w);
364
365                 *border = LVDS_BORDER_ENABLE;
366                 if (crtc_state->pipe_src_w != adjusted_mode->crtc_hdisplay) {
367                         bits = panel_fitter_scaling(crtc_state->pipe_src_w,
368                                                     adjusted_mode->crtc_hdisplay);
369
370                         *pfit_pgm_ratios |= (bits << PFIT_HORIZ_SCALE_SHIFT |
371                                              bits << PFIT_VERT_SCALE_SHIFT);
372                         *pfit_control |= (PFIT_ENABLE |
373                                           VERT_INTERP_BILINEAR |
374                                           HORIZ_INTERP_BILINEAR);
375                 }
376         } else {
377                 /* Aspects match, Let hw scale both directions */
378                 *pfit_control |= (PFIT_ENABLE |
379                                   VERT_AUTO_SCALE | HORIZ_AUTO_SCALE |
380                                   VERT_INTERP_BILINEAR |
381                                   HORIZ_INTERP_BILINEAR);
382         }
383 }
384
385 int intel_gmch_panel_fitting(struct intel_crtc_state *crtc_state,
386                              const struct drm_connector_state *conn_state)
387 {
388         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
389         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
390         u32 pfit_control = 0, pfit_pgm_ratios = 0, border = 0;
391         struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode;
392
393         /* Native modes don't need fitting */
394         if (adjusted_mode->crtc_hdisplay == crtc_state->pipe_src_w &&
395             adjusted_mode->crtc_vdisplay == crtc_state->pipe_src_h)
396                 goto out;
397
398         switch (conn_state->scaling_mode) {
399         case DRM_MODE_SCALE_CENTER:
400                 /*
401                  * For centered modes, we have to calculate border widths &
402                  * heights and modify the values programmed into the CRTC.
403                  */
404                 centre_horizontally(adjusted_mode, crtc_state->pipe_src_w);
405                 centre_vertically(adjusted_mode, crtc_state->pipe_src_h);
406                 border = LVDS_BORDER_ENABLE;
407                 break;
408         case DRM_MODE_SCALE_ASPECT:
409                 /* Scale but preserve the aspect ratio */
410                 if (INTEL_GEN(dev_priv) >= 4)
411                         i965_scale_aspect(crtc_state, &pfit_control);
412                 else
413                         i9xx_scale_aspect(crtc_state, &pfit_control,
414                                           &pfit_pgm_ratios, &border);
415                 break;
416         case DRM_MODE_SCALE_FULLSCREEN:
417                 /*
418                  * Full scaling, even if it changes the aspect ratio.
419                  * Fortunately this is all done for us in hw.
420                  */
421                 if (crtc_state->pipe_src_h != adjusted_mode->crtc_vdisplay ||
422                     crtc_state->pipe_src_w != adjusted_mode->crtc_hdisplay) {
423                         pfit_control |= PFIT_ENABLE;
424                         if (INTEL_GEN(dev_priv) >= 4)
425                                 pfit_control |= PFIT_SCALING_AUTO;
426                         else
427                                 pfit_control |= (VERT_AUTO_SCALE |
428                                                  VERT_INTERP_BILINEAR |
429                                                  HORIZ_AUTO_SCALE |
430                                                  HORIZ_INTERP_BILINEAR);
431                 }
432                 break;
433         default:
434                 MISSING_CASE(conn_state->scaling_mode);
435                 return -EINVAL;
436         }
437
438         /* 965+ wants fuzzy fitting */
439         /* FIXME: handle multiple panels by failing gracefully */
440         if (INTEL_GEN(dev_priv) >= 4)
441                 pfit_control |= PFIT_PIPE(crtc->pipe) | PFIT_FILTER_FUZZY;
442
443 out:
444         if ((pfit_control & PFIT_ENABLE) == 0) {
445                 pfit_control = 0;
446                 pfit_pgm_ratios = 0;
447         }
448
449         /* Make sure pre-965 set dither correctly for 18bpp panels. */
450         if (INTEL_GEN(dev_priv) < 4 && crtc_state->pipe_bpp == 18)
451                 pfit_control |= PANEL_8TO6_DITHER_ENABLE;
452
453         crtc_state->gmch_pfit.control = pfit_control;
454         crtc_state->gmch_pfit.pgm_ratios = pfit_pgm_ratios;
455         crtc_state->gmch_pfit.lvds_border_bits = border;
456
457         return 0;
458 }
459
460 /**
461  * scale - scale values from one range to another
462  * @source_val: value in range [@source_min..@source_max]
463  * @source_min: minimum legal value for @source_val
464  * @source_max: maximum legal value for @source_val
465  * @target_min: corresponding target value for @source_min
466  * @target_max: corresponding target value for @source_max
467  *
468  * Return @source_val in range [@source_min..@source_max] scaled to range
469  * [@target_min..@target_max].
470  */
471 static u32 scale(u32 source_val,
472                  u32 source_min, u32 source_max,
473                  u32 target_min, u32 target_max)
474 {
475         u64 target_val;
476
477         WARN_ON(source_min > source_max);
478         WARN_ON(target_min > target_max);
479
480         /* defensive */
481         source_val = clamp(source_val, source_min, source_max);
482
483         /* avoid overflows */
484         target_val = mul_u32_u32(source_val - source_min,
485                                  target_max - target_min);
486         target_val = DIV_ROUND_CLOSEST_ULL(target_val, source_max - source_min);
487         target_val += target_min;
488
489         return target_val;
490 }
491
492 /* Scale user_level in range [0..user_max] to [0..hw_max], clamping the result
493  * to [hw_min..hw_max]. */
494 static u32 clamp_user_to_hw(struct intel_connector *connector,
495                             u32 user_level, u32 user_max)
496 {
497         struct intel_panel *panel = &connector->panel;
498         u32 hw_level;
499
500         hw_level = scale(user_level, 0, user_max, 0, panel->backlight.max);
501         hw_level = clamp(hw_level, panel->backlight.min, panel->backlight.max);
502
503         return hw_level;
504 }
505
506 /* Scale hw_level in range [hw_min..hw_max] to [0..user_max]. */
507 static u32 scale_hw_to_user(struct intel_connector *connector,
508                             u32 hw_level, u32 user_max)
509 {
510         struct intel_panel *panel = &connector->panel;
511
512         return scale(hw_level, panel->backlight.min, panel->backlight.max,
513                      0, user_max);
514 }
515
516 static u32 intel_panel_compute_brightness(struct intel_connector *connector,
517                                           u32 val)
518 {
519         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
520         struct intel_panel *panel = &connector->panel;
521
522         drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0);
523
524         if (dev_priv->params.invert_brightness < 0)
525                 return val;
526
527         if (dev_priv->params.invert_brightness > 0 ||
528             dev_priv->quirks & QUIRK_INVERT_BRIGHTNESS) {
529                 return panel->backlight.max - val + panel->backlight.min;
530         }
531
532         return val;
533 }
534
535 static u32 lpt_get_backlight(struct intel_connector *connector)
536 {
537         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
538
539         return intel_de_read(dev_priv, BLC_PWM_PCH_CTL2) & BACKLIGHT_DUTY_CYCLE_MASK;
540 }
541
542 static u32 pch_get_backlight(struct intel_connector *connector)
543 {
544         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
545
546         return intel_de_read(dev_priv, BLC_PWM_CPU_CTL) & BACKLIGHT_DUTY_CYCLE_MASK;
547 }
548
549 static u32 i9xx_get_backlight(struct intel_connector *connector)
550 {
551         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
552         struct intel_panel *panel = &connector->panel;
553         u32 val;
554
555         val = intel_de_read(dev_priv, BLC_PWM_CTL) & BACKLIGHT_DUTY_CYCLE_MASK;
556         if (INTEL_GEN(dev_priv) < 4)
557                 val >>= 1;
558
559         if (panel->backlight.combination_mode) {
560                 u8 lbpc;
561
562                 pci_read_config_byte(dev_priv->drm.pdev, LBPC, &lbpc);
563                 val *= lbpc;
564         }
565
566         return val;
567 }
568
569 static u32 _vlv_get_backlight(struct drm_i915_private *dev_priv, enum pipe pipe)
570 {
571         if (drm_WARN_ON(&dev_priv->drm, pipe != PIPE_A && pipe != PIPE_B))
572                 return 0;
573
574         return intel_de_read(dev_priv, VLV_BLC_PWM_CTL(pipe)) & BACKLIGHT_DUTY_CYCLE_MASK;
575 }
576
577 static u32 vlv_get_backlight(struct intel_connector *connector)
578 {
579         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
580         enum pipe pipe = intel_connector_get_pipe(connector);
581
582         return _vlv_get_backlight(dev_priv, pipe);
583 }
584
585 static u32 bxt_get_backlight(struct intel_connector *connector)
586 {
587         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
588         struct intel_panel *panel = &connector->panel;
589
590         return intel_de_read(dev_priv,
591                              BXT_BLC_PWM_DUTY(panel->backlight.controller));
592 }
593
594 static u32 pwm_get_backlight(struct intel_connector *connector)
595 {
596         struct intel_panel *panel = &connector->panel;
597         int duty_ns;
598
599         duty_ns = pwm_get_duty_cycle(panel->backlight.pwm);
600         return DIV_ROUND_UP(duty_ns * 100, CRC_PMIC_PWM_PERIOD_NS);
601 }
602
603 static void lpt_set_backlight(const struct drm_connector_state *conn_state, u32 level)
604 {
605         struct intel_connector *connector = to_intel_connector(conn_state->connector);
606         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
607
608         u32 val = intel_de_read(dev_priv, BLC_PWM_PCH_CTL2) & ~BACKLIGHT_DUTY_CYCLE_MASK;
609         intel_de_write(dev_priv, BLC_PWM_PCH_CTL2, val | level);
610 }
611
612 static void pch_set_backlight(const struct drm_connector_state *conn_state, u32 level)
613 {
614         struct intel_connector *connector = to_intel_connector(conn_state->connector);
615         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
616         u32 tmp;
617
618         tmp = intel_de_read(dev_priv, BLC_PWM_CPU_CTL) & ~BACKLIGHT_DUTY_CYCLE_MASK;
619         intel_de_write(dev_priv, BLC_PWM_CPU_CTL, tmp | level);
620 }
621
622 static void i9xx_set_backlight(const struct drm_connector_state *conn_state, u32 level)
623 {
624         struct intel_connector *connector = to_intel_connector(conn_state->connector);
625         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
626         struct intel_panel *panel = &connector->panel;
627         u32 tmp, mask;
628
629         drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0);
630
631         if (panel->backlight.combination_mode) {
632                 u8 lbpc;
633
634                 lbpc = level * 0xfe / panel->backlight.max + 1;
635                 level /= lbpc;
636                 pci_write_config_byte(dev_priv->drm.pdev, LBPC, lbpc);
637         }
638
639         if (IS_GEN(dev_priv, 4)) {
640                 mask = BACKLIGHT_DUTY_CYCLE_MASK;
641         } else {
642                 level <<= 1;
643                 mask = BACKLIGHT_DUTY_CYCLE_MASK_PNV;
644         }
645
646         tmp = intel_de_read(dev_priv, BLC_PWM_CTL) & ~mask;
647         intel_de_write(dev_priv, BLC_PWM_CTL, tmp | level);
648 }
649
650 static void vlv_set_backlight(const struct drm_connector_state *conn_state, u32 level)
651 {
652         struct intel_connector *connector = to_intel_connector(conn_state->connector);
653         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
654         enum pipe pipe = to_intel_crtc(conn_state->crtc)->pipe;
655         u32 tmp;
656
657         tmp = intel_de_read(dev_priv, VLV_BLC_PWM_CTL(pipe)) & ~BACKLIGHT_DUTY_CYCLE_MASK;
658         intel_de_write(dev_priv, VLV_BLC_PWM_CTL(pipe), tmp | level);
659 }
660
661 static void bxt_set_backlight(const struct drm_connector_state *conn_state, u32 level)
662 {
663         struct intel_connector *connector = to_intel_connector(conn_state->connector);
664         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
665         struct intel_panel *panel = &connector->panel;
666
667         intel_de_write(dev_priv,
668                        BXT_BLC_PWM_DUTY(panel->backlight.controller), level);
669 }
670
671 static void pwm_set_backlight(const struct drm_connector_state *conn_state, u32 level)
672 {
673         struct intel_panel *panel = &to_intel_connector(conn_state->connector)->panel;
674         int duty_ns = DIV_ROUND_UP(level * CRC_PMIC_PWM_PERIOD_NS, 100);
675
676         pwm_config(panel->backlight.pwm, duty_ns, CRC_PMIC_PWM_PERIOD_NS);
677 }
678
679 static void
680 intel_panel_actually_set_backlight(const struct drm_connector_state *conn_state, u32 level)
681 {
682         struct intel_connector *connector = to_intel_connector(conn_state->connector);
683         struct drm_i915_private *i915 = to_i915(connector->base.dev);
684         struct intel_panel *panel = &connector->panel;
685
686         drm_dbg_kms(&i915->drm, "set backlight PWM = %d\n", level);
687
688         level = intel_panel_compute_brightness(connector, level);
689         panel->backlight.set(conn_state, level);
690 }
691
692 /* set backlight brightness to level in range [0..max], assuming hw min is
693  * respected.
694  */
695 void intel_panel_set_backlight_acpi(const struct drm_connector_state *conn_state,
696                                     u32 user_level, u32 user_max)
697 {
698         struct intel_connector *connector = to_intel_connector(conn_state->connector);
699         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
700         struct intel_panel *panel = &connector->panel;
701         u32 hw_level;
702
703         /*
704          * Lack of crtc may occur during driver init because
705          * connection_mutex isn't held across the entire backlight
706          * setup + modeset readout, and the BIOS can issue the
707          * requests at any time.
708          */
709         if (!panel->backlight.present || !conn_state->crtc)
710                 return;
711
712         mutex_lock(&dev_priv->backlight_lock);
713
714         drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0);
715
716         hw_level = clamp_user_to_hw(connector, user_level, user_max);
717         panel->backlight.level = hw_level;
718
719         if (panel->backlight.device)
720                 panel->backlight.device->props.brightness =
721                         scale_hw_to_user(connector,
722                                          panel->backlight.level,
723                                          panel->backlight.device->props.max_brightness);
724
725         if (panel->backlight.enabled)
726                 intel_panel_actually_set_backlight(conn_state, hw_level);
727
728         mutex_unlock(&dev_priv->backlight_lock);
729 }
730
731 static void lpt_disable_backlight(const struct drm_connector_state *old_conn_state)
732 {
733         struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
734         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
735         u32 tmp;
736
737         intel_panel_actually_set_backlight(old_conn_state, 0);
738
739         /*
740          * Although we don't support or enable CPU PWM with LPT/SPT based
741          * systems, it may have been enabled prior to loading the
742          * driver. Disable to avoid warnings on LCPLL disable.
743          *
744          * This needs rework if we need to add support for CPU PWM on PCH split
745          * platforms.
746          */
747         tmp = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
748         if (tmp & BLM_PWM_ENABLE) {
749                 drm_dbg_kms(&dev_priv->drm,
750                             "cpu backlight was enabled, disabling\n");
751                 intel_de_write(dev_priv, BLC_PWM_CPU_CTL2,
752                                tmp & ~BLM_PWM_ENABLE);
753         }
754
755         tmp = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
756         intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, tmp & ~BLM_PCH_PWM_ENABLE);
757 }
758
759 static void pch_disable_backlight(const struct drm_connector_state *old_conn_state)
760 {
761         struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
762         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
763         u32 tmp;
764
765         intel_panel_actually_set_backlight(old_conn_state, 0);
766
767         tmp = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
768         intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, tmp & ~BLM_PWM_ENABLE);
769
770         tmp = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
771         intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, tmp & ~BLM_PCH_PWM_ENABLE);
772 }
773
774 static void i9xx_disable_backlight(const struct drm_connector_state *old_conn_state)
775 {
776         intel_panel_actually_set_backlight(old_conn_state, 0);
777 }
778
779 static void i965_disable_backlight(const struct drm_connector_state *old_conn_state)
780 {
781         struct drm_i915_private *dev_priv = to_i915(old_conn_state->connector->dev);
782         u32 tmp;
783
784         intel_panel_actually_set_backlight(old_conn_state, 0);
785
786         tmp = intel_de_read(dev_priv, BLC_PWM_CTL2);
787         intel_de_write(dev_priv, BLC_PWM_CTL2, tmp & ~BLM_PWM_ENABLE);
788 }
789
790 static void vlv_disable_backlight(const struct drm_connector_state *old_conn_state)
791 {
792         struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
793         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
794         enum pipe pipe = to_intel_crtc(old_conn_state->crtc)->pipe;
795         u32 tmp;
796
797         intel_panel_actually_set_backlight(old_conn_state, 0);
798
799         tmp = intel_de_read(dev_priv, VLV_BLC_PWM_CTL2(pipe));
800         intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe),
801                        tmp & ~BLM_PWM_ENABLE);
802 }
803
804 static void bxt_disable_backlight(const struct drm_connector_state *old_conn_state)
805 {
806         struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
807         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
808         struct intel_panel *panel = &connector->panel;
809         u32 tmp, val;
810
811         intel_panel_actually_set_backlight(old_conn_state, 0);
812
813         tmp = intel_de_read(dev_priv,
814                             BXT_BLC_PWM_CTL(panel->backlight.controller));
815         intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
816                        tmp & ~BXT_BLC_PWM_ENABLE);
817
818         if (panel->backlight.controller == 1) {
819                 val = intel_de_read(dev_priv, UTIL_PIN_CTL);
820                 val &= ~UTIL_PIN_ENABLE;
821                 intel_de_write(dev_priv, UTIL_PIN_CTL, val);
822         }
823 }
824
825 static void cnp_disable_backlight(const struct drm_connector_state *old_conn_state)
826 {
827         struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
828         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
829         struct intel_panel *panel = &connector->panel;
830         u32 tmp;
831
832         intel_panel_actually_set_backlight(old_conn_state, 0);
833
834         tmp = intel_de_read(dev_priv,
835                             BXT_BLC_PWM_CTL(panel->backlight.controller));
836         intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
837                        tmp & ~BXT_BLC_PWM_ENABLE);
838 }
839
840 static void pwm_disable_backlight(const struct drm_connector_state *old_conn_state)
841 {
842         struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
843         struct intel_panel *panel = &connector->panel;
844
845         /* Disable the backlight */
846         intel_panel_actually_set_backlight(old_conn_state, 0);
847         usleep_range(2000, 3000);
848         pwm_disable(panel->backlight.pwm);
849 }
850
851 void intel_panel_disable_backlight(const struct drm_connector_state *old_conn_state)
852 {
853         struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
854         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
855         struct intel_panel *panel = &connector->panel;
856
857         if (!panel->backlight.present)
858                 return;
859
860         /*
861          * Do not disable backlight on the vga_switcheroo path. When switching
862          * away from i915, the other client may depend on i915 to handle the
863          * backlight. This will leave the backlight on unnecessarily when
864          * another client is not activated.
865          */
866         if (dev_priv->drm.switch_power_state == DRM_SWITCH_POWER_CHANGING) {
867                 drm_dbg_kms(&dev_priv->drm,
868                             "Skipping backlight disable on vga switch\n");
869                 return;
870         }
871
872         mutex_lock(&dev_priv->backlight_lock);
873
874         if (panel->backlight.device)
875                 panel->backlight.device->props.power = FB_BLANK_POWERDOWN;
876         panel->backlight.enabled = false;
877         panel->backlight.disable(old_conn_state);
878
879         mutex_unlock(&dev_priv->backlight_lock);
880 }
881
882 static void lpt_enable_backlight(const struct intel_crtc_state *crtc_state,
883                                  const struct drm_connector_state *conn_state)
884 {
885         struct intel_connector *connector = to_intel_connector(conn_state->connector);
886         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
887         struct intel_panel *panel = &connector->panel;
888         u32 pch_ctl1, pch_ctl2, schicken;
889
890         pch_ctl1 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
891         if (pch_ctl1 & BLM_PCH_PWM_ENABLE) {
892                 drm_dbg_kms(&dev_priv->drm, "pch backlight already enabled\n");
893                 pch_ctl1 &= ~BLM_PCH_PWM_ENABLE;
894                 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, pch_ctl1);
895         }
896
897         if (HAS_PCH_LPT(dev_priv)) {
898                 schicken = intel_de_read(dev_priv, SOUTH_CHICKEN2);
899                 if (panel->backlight.alternate_pwm_increment)
900                         schicken |= LPT_PWM_GRANULARITY;
901                 else
902                         schicken &= ~LPT_PWM_GRANULARITY;
903                 intel_de_write(dev_priv, SOUTH_CHICKEN2, schicken);
904         } else {
905                 schicken = intel_de_read(dev_priv, SOUTH_CHICKEN1);
906                 if (panel->backlight.alternate_pwm_increment)
907                         schicken |= SPT_PWM_GRANULARITY;
908                 else
909                         schicken &= ~SPT_PWM_GRANULARITY;
910                 intel_de_write(dev_priv, SOUTH_CHICKEN1, schicken);
911         }
912
913         pch_ctl2 = panel->backlight.max << 16;
914         intel_de_write(dev_priv, BLC_PWM_PCH_CTL2, pch_ctl2);
915
916         pch_ctl1 = 0;
917         if (panel->backlight.active_low_pwm)
918                 pch_ctl1 |= BLM_PCH_POLARITY;
919
920         /* After LPT, override is the default. */
921         if (HAS_PCH_LPT(dev_priv))
922                 pch_ctl1 |= BLM_PCH_OVERRIDE_ENABLE;
923
924         intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, pch_ctl1);
925         intel_de_posting_read(dev_priv, BLC_PWM_PCH_CTL1);
926         intel_de_write(dev_priv, BLC_PWM_PCH_CTL1,
927                        pch_ctl1 | BLM_PCH_PWM_ENABLE);
928
929         /* This won't stick until the above enable. */
930         intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
931 }
932
933 static void pch_enable_backlight(const struct intel_crtc_state *crtc_state,
934                                  const struct drm_connector_state *conn_state)
935 {
936         struct intel_connector *connector = to_intel_connector(conn_state->connector);
937         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
938         struct intel_panel *panel = &connector->panel;
939         enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
940         u32 cpu_ctl2, pch_ctl1, pch_ctl2;
941
942         cpu_ctl2 = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
943         if (cpu_ctl2 & BLM_PWM_ENABLE) {
944                 drm_dbg_kms(&dev_priv->drm, "cpu backlight already enabled\n");
945                 cpu_ctl2 &= ~BLM_PWM_ENABLE;
946                 intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, cpu_ctl2);
947         }
948
949         pch_ctl1 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
950         if (pch_ctl1 & BLM_PCH_PWM_ENABLE) {
951                 drm_dbg_kms(&dev_priv->drm, "pch backlight already enabled\n");
952                 pch_ctl1 &= ~BLM_PCH_PWM_ENABLE;
953                 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, pch_ctl1);
954         }
955
956         if (cpu_transcoder == TRANSCODER_EDP)
957                 cpu_ctl2 = BLM_TRANSCODER_EDP;
958         else
959                 cpu_ctl2 = BLM_PIPE(cpu_transcoder);
960         intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, cpu_ctl2);
961         intel_de_posting_read(dev_priv, BLC_PWM_CPU_CTL2);
962         intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, cpu_ctl2 | BLM_PWM_ENABLE);
963
964         /* This won't stick until the above enable. */
965         intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
966
967         pch_ctl2 = panel->backlight.max << 16;
968         intel_de_write(dev_priv, BLC_PWM_PCH_CTL2, pch_ctl2);
969
970         pch_ctl1 = 0;
971         if (panel->backlight.active_low_pwm)
972                 pch_ctl1 |= BLM_PCH_POLARITY;
973
974         intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, pch_ctl1);
975         intel_de_posting_read(dev_priv, BLC_PWM_PCH_CTL1);
976         intel_de_write(dev_priv, BLC_PWM_PCH_CTL1,
977                        pch_ctl1 | BLM_PCH_PWM_ENABLE);
978 }
979
980 static void i9xx_enable_backlight(const struct intel_crtc_state *crtc_state,
981                                   const struct drm_connector_state *conn_state)
982 {
983         struct intel_connector *connector = to_intel_connector(conn_state->connector);
984         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
985         struct intel_panel *panel = &connector->panel;
986         u32 ctl, freq;
987
988         ctl = intel_de_read(dev_priv, BLC_PWM_CTL);
989         if (ctl & BACKLIGHT_DUTY_CYCLE_MASK_PNV) {
990                 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
991                 intel_de_write(dev_priv, BLC_PWM_CTL, 0);
992         }
993
994         freq = panel->backlight.max;
995         if (panel->backlight.combination_mode)
996                 freq /= 0xff;
997
998         ctl = freq << 17;
999         if (panel->backlight.combination_mode)
1000                 ctl |= BLM_LEGACY_MODE;
1001         if (IS_PINEVIEW(dev_priv) && panel->backlight.active_low_pwm)
1002                 ctl |= BLM_POLARITY_PNV;
1003
1004         intel_de_write(dev_priv, BLC_PWM_CTL, ctl);
1005         intel_de_posting_read(dev_priv, BLC_PWM_CTL);
1006
1007         /* XXX: combine this into above write? */
1008         intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
1009
1010         /*
1011          * Needed to enable backlight on some 855gm models. BLC_HIST_CTL is
1012          * 855gm only, but checking for gen2 is safe, as 855gm is the only gen2
1013          * that has backlight.
1014          */
1015         if (IS_GEN(dev_priv, 2))
1016                 intel_de_write(dev_priv, BLC_HIST_CTL, BLM_HISTOGRAM_ENABLE);
1017 }
1018
1019 static void i965_enable_backlight(const struct intel_crtc_state *crtc_state,
1020                                   const struct drm_connector_state *conn_state)
1021 {
1022         struct intel_connector *connector = to_intel_connector(conn_state->connector);
1023         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1024         struct intel_panel *panel = &connector->panel;
1025         enum pipe pipe = to_intel_crtc(conn_state->crtc)->pipe;
1026         u32 ctl, ctl2, freq;
1027
1028         ctl2 = intel_de_read(dev_priv, BLC_PWM_CTL2);
1029         if (ctl2 & BLM_PWM_ENABLE) {
1030                 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
1031                 ctl2 &= ~BLM_PWM_ENABLE;
1032                 intel_de_write(dev_priv, BLC_PWM_CTL2, ctl2);
1033         }
1034
1035         freq = panel->backlight.max;
1036         if (panel->backlight.combination_mode)
1037                 freq /= 0xff;
1038
1039         ctl = freq << 16;
1040         intel_de_write(dev_priv, BLC_PWM_CTL, ctl);
1041
1042         ctl2 = BLM_PIPE(pipe);
1043         if (panel->backlight.combination_mode)
1044                 ctl2 |= BLM_COMBINATION_MODE;
1045         if (panel->backlight.active_low_pwm)
1046                 ctl2 |= BLM_POLARITY_I965;
1047         intel_de_write(dev_priv, BLC_PWM_CTL2, ctl2);
1048         intel_de_posting_read(dev_priv, BLC_PWM_CTL2);
1049         intel_de_write(dev_priv, BLC_PWM_CTL2, ctl2 | BLM_PWM_ENABLE);
1050
1051         intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
1052 }
1053
1054 static void vlv_enable_backlight(const struct intel_crtc_state *crtc_state,
1055                                  const struct drm_connector_state *conn_state)
1056 {
1057         struct intel_connector *connector = to_intel_connector(conn_state->connector);
1058         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1059         struct intel_panel *panel = &connector->panel;
1060         enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe;
1061         u32 ctl, ctl2;
1062
1063         ctl2 = intel_de_read(dev_priv, VLV_BLC_PWM_CTL2(pipe));
1064         if (ctl2 & BLM_PWM_ENABLE) {
1065                 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
1066                 ctl2 &= ~BLM_PWM_ENABLE;
1067                 intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe), ctl2);
1068         }
1069
1070         ctl = panel->backlight.max << 16;
1071         intel_de_write(dev_priv, VLV_BLC_PWM_CTL(pipe), ctl);
1072
1073         /* XXX: combine this into above write? */
1074         intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
1075
1076         ctl2 = 0;
1077         if (panel->backlight.active_low_pwm)
1078                 ctl2 |= BLM_POLARITY_I965;
1079         intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe), ctl2);
1080         intel_de_posting_read(dev_priv, VLV_BLC_PWM_CTL2(pipe));
1081         intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe),
1082                        ctl2 | BLM_PWM_ENABLE);
1083 }
1084
1085 static void bxt_enable_backlight(const struct intel_crtc_state *crtc_state,
1086                                  const struct drm_connector_state *conn_state)
1087 {
1088         struct intel_connector *connector = to_intel_connector(conn_state->connector);
1089         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1090         struct intel_panel *panel = &connector->panel;
1091         enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe;
1092         u32 pwm_ctl, val;
1093
1094         /* Controller 1 uses the utility pin. */
1095         if (panel->backlight.controller == 1) {
1096                 val = intel_de_read(dev_priv, UTIL_PIN_CTL);
1097                 if (val & UTIL_PIN_ENABLE) {
1098                         drm_dbg_kms(&dev_priv->drm,
1099                                     "util pin already enabled\n");
1100                         val &= ~UTIL_PIN_ENABLE;
1101                         intel_de_write(dev_priv, UTIL_PIN_CTL, val);
1102                 }
1103
1104                 val = 0;
1105                 if (panel->backlight.util_pin_active_low)
1106                         val |= UTIL_PIN_POLARITY;
1107                 intel_de_write(dev_priv, UTIL_PIN_CTL,
1108                                val | UTIL_PIN_PIPE(pipe) | UTIL_PIN_MODE_PWM | UTIL_PIN_ENABLE);
1109         }
1110
1111         pwm_ctl = intel_de_read(dev_priv,
1112                                 BXT_BLC_PWM_CTL(panel->backlight.controller));
1113         if (pwm_ctl & BXT_BLC_PWM_ENABLE) {
1114                 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
1115                 pwm_ctl &= ~BXT_BLC_PWM_ENABLE;
1116                 intel_de_write(dev_priv,
1117                                BXT_BLC_PWM_CTL(panel->backlight.controller),
1118                                pwm_ctl);
1119         }
1120
1121         intel_de_write(dev_priv,
1122                        BXT_BLC_PWM_FREQ(panel->backlight.controller),
1123                        panel->backlight.max);
1124
1125         intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
1126
1127         pwm_ctl = 0;
1128         if (panel->backlight.active_low_pwm)
1129                 pwm_ctl |= BXT_BLC_PWM_POLARITY;
1130
1131         intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
1132                        pwm_ctl);
1133         intel_de_posting_read(dev_priv,
1134                               BXT_BLC_PWM_CTL(panel->backlight.controller));
1135         intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
1136                        pwm_ctl | BXT_BLC_PWM_ENABLE);
1137 }
1138
1139 static void cnp_enable_backlight(const struct intel_crtc_state *crtc_state,
1140                                  const struct drm_connector_state *conn_state)
1141 {
1142         struct intel_connector *connector = to_intel_connector(conn_state->connector);
1143         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1144         struct intel_panel *panel = &connector->panel;
1145         u32 pwm_ctl;
1146
1147         pwm_ctl = intel_de_read(dev_priv,
1148                                 BXT_BLC_PWM_CTL(panel->backlight.controller));
1149         if (pwm_ctl & BXT_BLC_PWM_ENABLE) {
1150                 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
1151                 pwm_ctl &= ~BXT_BLC_PWM_ENABLE;
1152                 intel_de_write(dev_priv,
1153                                BXT_BLC_PWM_CTL(panel->backlight.controller),
1154                                pwm_ctl);
1155         }
1156
1157         intel_de_write(dev_priv,
1158                        BXT_BLC_PWM_FREQ(panel->backlight.controller),
1159                        panel->backlight.max);
1160
1161         intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
1162
1163         pwm_ctl = 0;
1164         if (panel->backlight.active_low_pwm)
1165                 pwm_ctl |= BXT_BLC_PWM_POLARITY;
1166
1167         intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
1168                        pwm_ctl);
1169         intel_de_posting_read(dev_priv,
1170                               BXT_BLC_PWM_CTL(panel->backlight.controller));
1171         intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
1172                        pwm_ctl | BXT_BLC_PWM_ENABLE);
1173 }
1174
1175 static void pwm_enable_backlight(const struct intel_crtc_state *crtc_state,
1176                                  const struct drm_connector_state *conn_state)
1177 {
1178         struct intel_connector *connector = to_intel_connector(conn_state->connector);
1179         struct intel_panel *panel = &connector->panel;
1180
1181         pwm_enable(panel->backlight.pwm);
1182         intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
1183 }
1184
1185 static void __intel_panel_enable_backlight(const struct intel_crtc_state *crtc_state,
1186                                            const struct drm_connector_state *conn_state)
1187 {
1188         struct intel_connector *connector = to_intel_connector(conn_state->connector);
1189         struct intel_panel *panel = &connector->panel;
1190
1191         WARN_ON(panel->backlight.max == 0);
1192
1193         if (panel->backlight.level <= panel->backlight.min) {
1194                 panel->backlight.level = panel->backlight.max;
1195                 if (panel->backlight.device)
1196                         panel->backlight.device->props.brightness =
1197                                 scale_hw_to_user(connector,
1198                                                  panel->backlight.level,
1199                                                  panel->backlight.device->props.max_brightness);
1200         }
1201
1202         panel->backlight.enable(crtc_state, conn_state);
1203         panel->backlight.enabled = true;
1204         if (panel->backlight.device)
1205                 panel->backlight.device->props.power = FB_BLANK_UNBLANK;
1206 }
1207
1208 void intel_panel_enable_backlight(const struct intel_crtc_state *crtc_state,
1209                                   const struct drm_connector_state *conn_state)
1210 {
1211         struct intel_connector *connector = to_intel_connector(conn_state->connector);
1212         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1213         struct intel_panel *panel = &connector->panel;
1214         enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe;
1215
1216         if (!panel->backlight.present)
1217                 return;
1218
1219         drm_dbg_kms(&dev_priv->drm, "pipe %c\n", pipe_name(pipe));
1220
1221         mutex_lock(&dev_priv->backlight_lock);
1222
1223         __intel_panel_enable_backlight(crtc_state, conn_state);
1224
1225         mutex_unlock(&dev_priv->backlight_lock);
1226 }
1227
1228 #if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE)
1229 static u32 intel_panel_get_backlight(struct intel_connector *connector)
1230 {
1231         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1232         struct intel_panel *panel = &connector->panel;
1233         u32 val = 0;
1234
1235         mutex_lock(&dev_priv->backlight_lock);
1236
1237         if (panel->backlight.enabled) {
1238                 val = panel->backlight.get(connector);
1239                 val = intel_panel_compute_brightness(connector, val);
1240         }
1241
1242         mutex_unlock(&dev_priv->backlight_lock);
1243
1244         drm_dbg_kms(&dev_priv->drm, "get backlight PWM = %d\n", val);
1245         return val;
1246 }
1247
1248 /* Scale user_level in range [0..user_max] to [hw_min..hw_max]. */
1249 static u32 scale_user_to_hw(struct intel_connector *connector,
1250                             u32 user_level, u32 user_max)
1251 {
1252         struct intel_panel *panel = &connector->panel;
1253
1254         return scale(user_level, 0, user_max,
1255                      panel->backlight.min, panel->backlight.max);
1256 }
1257
1258 /* set backlight brightness to level in range [0..max], scaling wrt hw min */
1259 static void intel_panel_set_backlight(const struct drm_connector_state *conn_state,
1260                                       u32 user_level, u32 user_max)
1261 {
1262         struct intel_connector *connector = to_intel_connector(conn_state->connector);
1263         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1264         struct intel_panel *panel = &connector->panel;
1265         u32 hw_level;
1266
1267         if (!panel->backlight.present)
1268                 return;
1269
1270         mutex_lock(&dev_priv->backlight_lock);
1271
1272         drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0);
1273
1274         hw_level = scale_user_to_hw(connector, user_level, user_max);
1275         panel->backlight.level = hw_level;
1276
1277         if (panel->backlight.enabled)
1278                 intel_panel_actually_set_backlight(conn_state, hw_level);
1279
1280         mutex_unlock(&dev_priv->backlight_lock);
1281 }
1282
1283 static int intel_backlight_device_update_status(struct backlight_device *bd)
1284 {
1285         struct intel_connector *connector = bl_get_data(bd);
1286         struct intel_panel *panel = &connector->panel;
1287         struct drm_device *dev = connector->base.dev;
1288
1289         drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
1290         DRM_DEBUG_KMS("updating intel_backlight, brightness=%d/%d\n",
1291                       bd->props.brightness, bd->props.max_brightness);
1292         intel_panel_set_backlight(connector->base.state, bd->props.brightness,
1293                                   bd->props.max_brightness);
1294
1295         /*
1296          * Allow flipping bl_power as a sub-state of enabled. Sadly the
1297          * backlight class device does not make it easy to to differentiate
1298          * between callbacks for brightness and bl_power, so our backlight_power
1299          * callback needs to take this into account.
1300          */
1301         if (panel->backlight.enabled) {
1302                 if (panel->backlight.power) {
1303                         bool enable = bd->props.power == FB_BLANK_UNBLANK &&
1304                                 bd->props.brightness != 0;
1305                         panel->backlight.power(connector, enable);
1306                 }
1307         } else {
1308                 bd->props.power = FB_BLANK_POWERDOWN;
1309         }
1310
1311         drm_modeset_unlock(&dev->mode_config.connection_mutex);
1312         return 0;
1313 }
1314
1315 static int intel_backlight_device_get_brightness(struct backlight_device *bd)
1316 {
1317         struct intel_connector *connector = bl_get_data(bd);
1318         struct drm_device *dev = connector->base.dev;
1319         struct drm_i915_private *dev_priv = to_i915(dev);
1320         intel_wakeref_t wakeref;
1321         int ret = 0;
1322
1323         with_intel_runtime_pm(&dev_priv->runtime_pm, wakeref) {
1324                 u32 hw_level;
1325
1326                 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
1327
1328                 hw_level = intel_panel_get_backlight(connector);
1329                 ret = scale_hw_to_user(connector,
1330                                        hw_level, bd->props.max_brightness);
1331
1332                 drm_modeset_unlock(&dev->mode_config.connection_mutex);
1333         }
1334
1335         return ret;
1336 }
1337
1338 static const struct backlight_ops intel_backlight_device_ops = {
1339         .update_status = intel_backlight_device_update_status,
1340         .get_brightness = intel_backlight_device_get_brightness,
1341 };
1342
1343 int intel_backlight_device_register(struct intel_connector *connector)
1344 {
1345         struct drm_i915_private *i915 = to_i915(connector->base.dev);
1346         struct intel_panel *panel = &connector->panel;
1347         struct backlight_properties props;
1348
1349         if (WARN_ON(panel->backlight.device))
1350                 return -ENODEV;
1351
1352         if (!panel->backlight.present)
1353                 return 0;
1354
1355         WARN_ON(panel->backlight.max == 0);
1356
1357         memset(&props, 0, sizeof(props));
1358         props.type = BACKLIGHT_RAW;
1359
1360         /*
1361          * Note: Everything should work even if the backlight device max
1362          * presented to the userspace is arbitrarily chosen.
1363          */
1364         props.max_brightness = panel->backlight.max;
1365         props.brightness = scale_hw_to_user(connector,
1366                                             panel->backlight.level,
1367                                             props.max_brightness);
1368
1369         if (panel->backlight.enabled)
1370                 props.power = FB_BLANK_UNBLANK;
1371         else
1372                 props.power = FB_BLANK_POWERDOWN;
1373
1374         /*
1375          * Note: using the same name independent of the connector prevents
1376          * registration of multiple backlight devices in the driver.
1377          */
1378         panel->backlight.device =
1379                 backlight_device_register("intel_backlight",
1380                                           connector->base.kdev,
1381                                           connector,
1382                                           &intel_backlight_device_ops, &props);
1383
1384         if (IS_ERR(panel->backlight.device)) {
1385                 drm_err(&i915->drm, "Failed to register backlight: %ld\n",
1386                         PTR_ERR(panel->backlight.device));
1387                 panel->backlight.device = NULL;
1388                 return -ENODEV;
1389         }
1390
1391         drm_dbg_kms(&i915->drm,
1392                     "Connector %s backlight sysfs interface registered\n",
1393                     connector->base.name);
1394
1395         return 0;
1396 }
1397
1398 void intel_backlight_device_unregister(struct intel_connector *connector)
1399 {
1400         struct intel_panel *panel = &connector->panel;
1401
1402         if (panel->backlight.device) {
1403                 backlight_device_unregister(panel->backlight.device);
1404                 panel->backlight.device = NULL;
1405         }
1406 }
1407 #endif /* CONFIG_BACKLIGHT_CLASS_DEVICE */
1408
1409 /*
1410  * CNP: PWM clock frequency is 19.2 MHz or 24 MHz.
1411  *      PWM increment = 1
1412  */
1413 static u32 cnp_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1414 {
1415         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1416
1417         return DIV_ROUND_CLOSEST(KHz(RUNTIME_INFO(dev_priv)->rawclk_freq),
1418                                  pwm_freq_hz);
1419 }
1420
1421 /*
1422  * BXT: PWM clock frequency = 19.2 MHz.
1423  */
1424 static u32 bxt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1425 {
1426         return DIV_ROUND_CLOSEST(KHz(19200), pwm_freq_hz);
1427 }
1428
1429 /*
1430  * SPT: This value represents the period of the PWM stream in clock periods
1431  * multiplied by 16 (default increment) or 128 (alternate increment selected in
1432  * SCHICKEN_1 bit 0). PWM clock is 24 MHz.
1433  */
1434 static u32 spt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1435 {
1436         struct intel_panel *panel = &connector->panel;
1437         u32 mul;
1438
1439         if (panel->backlight.alternate_pwm_increment)
1440                 mul = 128;
1441         else
1442                 mul = 16;
1443
1444         return DIV_ROUND_CLOSEST(MHz(24), pwm_freq_hz * mul);
1445 }
1446
1447 /*
1448  * LPT: This value represents the period of the PWM stream in clock periods
1449  * multiplied by 128 (default increment) or 16 (alternate increment, selected in
1450  * LPT SOUTH_CHICKEN2 register bit 5).
1451  */
1452 static u32 lpt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1453 {
1454         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1455         struct intel_panel *panel = &connector->panel;
1456         u32 mul, clock;
1457
1458         if (panel->backlight.alternate_pwm_increment)
1459                 mul = 16;
1460         else
1461                 mul = 128;
1462
1463         if (HAS_PCH_LPT_H(dev_priv))
1464                 clock = MHz(135); /* LPT:H */
1465         else
1466                 clock = MHz(24); /* LPT:LP */
1467
1468         return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * mul);
1469 }
1470
1471 /*
1472  * ILK/SNB/IVB: This value represents the period of the PWM stream in PCH
1473  * display raw clocks multiplied by 128.
1474  */
1475 static u32 pch_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1476 {
1477         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1478
1479         return DIV_ROUND_CLOSEST(KHz(RUNTIME_INFO(dev_priv)->rawclk_freq),
1480                                  pwm_freq_hz * 128);
1481 }
1482
1483 /*
1484  * Gen2: This field determines the number of time base events (display core
1485  * clock frequency/32) in total for a complete cycle of modulated backlight
1486  * control.
1487  *
1488  * Gen3: A time base event equals the display core clock ([DevPNV] HRAW clock)
1489  * divided by 32.
1490  */
1491 static u32 i9xx_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1492 {
1493         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1494         int clock;
1495
1496         if (IS_PINEVIEW(dev_priv))
1497                 clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq);
1498         else
1499                 clock = KHz(dev_priv->cdclk.hw.cdclk);
1500
1501         return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * 32);
1502 }
1503
1504 /*
1505  * Gen4: This value represents the period of the PWM stream in display core
1506  * clocks ([DevCTG] HRAW clocks) multiplied by 128.
1507  *
1508  */
1509 static u32 i965_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1510 {
1511         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1512         int clock;
1513
1514         if (IS_G4X(dev_priv))
1515                 clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq);
1516         else
1517                 clock = KHz(dev_priv->cdclk.hw.cdclk);
1518
1519         return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * 128);
1520 }
1521
1522 /*
1523  * VLV: This value represents the period of the PWM stream in display core
1524  * clocks ([DevCTG] 200MHz HRAW clocks) multiplied by 128 or 25MHz S0IX clocks
1525  * multiplied by 16. CHV uses a 19.2MHz S0IX clock.
1526  */
1527 static u32 vlv_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1528 {
1529         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1530         int mul, clock;
1531
1532         if ((intel_de_read(dev_priv, CBR1_VLV) & CBR_PWM_CLOCK_MUX_SELECT) == 0) {
1533                 if (IS_CHERRYVIEW(dev_priv))
1534                         clock = KHz(19200);
1535                 else
1536                         clock = MHz(25);
1537                 mul = 16;
1538         } else {
1539                 clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq);
1540                 mul = 128;
1541         }
1542
1543         return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * mul);
1544 }
1545
1546 static u32 get_backlight_max_vbt(struct intel_connector *connector)
1547 {
1548         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1549         struct intel_panel *panel = &connector->panel;
1550         u16 pwm_freq_hz = dev_priv->vbt.backlight.pwm_freq_hz;
1551         u32 pwm;
1552
1553         if (!panel->backlight.hz_to_pwm) {
1554                 drm_dbg_kms(&dev_priv->drm,
1555                             "backlight frequency conversion not supported\n");
1556                 return 0;
1557         }
1558
1559         if (pwm_freq_hz) {
1560                 drm_dbg_kms(&dev_priv->drm,
1561                             "VBT defined backlight frequency %u Hz\n",
1562                             pwm_freq_hz);
1563         } else {
1564                 pwm_freq_hz = 200;
1565                 drm_dbg_kms(&dev_priv->drm,
1566                             "default backlight frequency %u Hz\n",
1567                             pwm_freq_hz);
1568         }
1569
1570         pwm = panel->backlight.hz_to_pwm(connector, pwm_freq_hz);
1571         if (!pwm) {
1572                 drm_dbg_kms(&dev_priv->drm,
1573                             "backlight frequency conversion failed\n");
1574                 return 0;
1575         }
1576
1577         return pwm;
1578 }
1579
1580 /*
1581  * Note: The setup hooks can't assume pipe is set!
1582  */
1583 static u32 get_backlight_min_vbt(struct intel_connector *connector)
1584 {
1585         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1586         struct intel_panel *panel = &connector->panel;
1587         int min;
1588
1589         drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0);
1590
1591         /*
1592          * XXX: If the vbt value is 255, it makes min equal to max, which leads
1593          * to problems. There are such machines out there. Either our
1594          * interpretation is wrong or the vbt has bogus data. Or both. Safeguard
1595          * against this by letting the minimum be at most (arbitrarily chosen)
1596          * 25% of the max.
1597          */
1598         min = clamp_t(int, dev_priv->vbt.backlight.min_brightness, 0, 64);
1599         if (min != dev_priv->vbt.backlight.min_brightness) {
1600                 drm_dbg_kms(&dev_priv->drm,
1601                             "clamping VBT min backlight %d/255 to %d/255\n",
1602                             dev_priv->vbt.backlight.min_brightness, min);
1603         }
1604
1605         /* vbt value is a coefficient in range [0..255] */
1606         return scale(min, 0, 255, 0, panel->backlight.max);
1607 }
1608
1609 static int lpt_setup_backlight(struct intel_connector *connector, enum pipe unused)
1610 {
1611         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1612         struct intel_panel *panel = &connector->panel;
1613         u32 cpu_ctl2, pch_ctl1, pch_ctl2, val;
1614         bool alt, cpu_mode;
1615
1616         if (HAS_PCH_LPT(dev_priv))
1617                 alt = intel_de_read(dev_priv, SOUTH_CHICKEN2) & LPT_PWM_GRANULARITY;
1618         else
1619                 alt = intel_de_read(dev_priv, SOUTH_CHICKEN1) & SPT_PWM_GRANULARITY;
1620         panel->backlight.alternate_pwm_increment = alt;
1621
1622         pch_ctl1 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
1623         panel->backlight.active_low_pwm = pch_ctl1 & BLM_PCH_POLARITY;
1624
1625         pch_ctl2 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL2);
1626         panel->backlight.max = pch_ctl2 >> 16;
1627
1628         cpu_ctl2 = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
1629
1630         if (!panel->backlight.max)
1631                 panel->backlight.max = get_backlight_max_vbt(connector);
1632
1633         if (!panel->backlight.max)
1634                 return -ENODEV;
1635
1636         panel->backlight.min = get_backlight_min_vbt(connector);
1637
1638         panel->backlight.enabled = pch_ctl1 & BLM_PCH_PWM_ENABLE;
1639
1640         cpu_mode = panel->backlight.enabled && HAS_PCH_LPT(dev_priv) &&
1641                    !(pch_ctl1 & BLM_PCH_OVERRIDE_ENABLE) &&
1642                    (cpu_ctl2 & BLM_PWM_ENABLE);
1643         if (cpu_mode)
1644                 val = pch_get_backlight(connector);
1645         else
1646                 val = lpt_get_backlight(connector);
1647         val = intel_panel_compute_brightness(connector, val);
1648         panel->backlight.level = clamp(val, panel->backlight.min,
1649                                        panel->backlight.max);
1650
1651         if (cpu_mode) {
1652                 drm_dbg_kms(&dev_priv->drm,
1653                             "CPU backlight register was enabled, switching to PCH override\n");
1654
1655                 /* Write converted CPU PWM value to PCH override register */
1656                 lpt_set_backlight(connector->base.state, panel->backlight.level);
1657                 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1,
1658                                pch_ctl1 | BLM_PCH_OVERRIDE_ENABLE);
1659
1660                 intel_de_write(dev_priv, BLC_PWM_CPU_CTL2,
1661                                cpu_ctl2 & ~BLM_PWM_ENABLE);
1662         }
1663
1664         return 0;
1665 }
1666
1667 static int pch_setup_backlight(struct intel_connector *connector, enum pipe unused)
1668 {
1669         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1670         struct intel_panel *panel = &connector->panel;
1671         u32 cpu_ctl2, pch_ctl1, pch_ctl2, val;
1672
1673         pch_ctl1 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
1674         panel->backlight.active_low_pwm = pch_ctl1 & BLM_PCH_POLARITY;
1675
1676         pch_ctl2 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL2);
1677         panel->backlight.max = pch_ctl2 >> 16;
1678
1679         if (!panel->backlight.max)
1680                 panel->backlight.max = get_backlight_max_vbt(connector);
1681
1682         if (!panel->backlight.max)
1683                 return -ENODEV;
1684
1685         panel->backlight.min = get_backlight_min_vbt(connector);
1686
1687         val = pch_get_backlight(connector);
1688         val = intel_panel_compute_brightness(connector, val);
1689         panel->backlight.level = clamp(val, panel->backlight.min,
1690                                        panel->backlight.max);
1691
1692         cpu_ctl2 = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
1693         panel->backlight.enabled = (cpu_ctl2 & BLM_PWM_ENABLE) &&
1694                 (pch_ctl1 & BLM_PCH_PWM_ENABLE);
1695
1696         return 0;
1697 }
1698
1699 static int i9xx_setup_backlight(struct intel_connector *connector, enum pipe unused)
1700 {
1701         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1702         struct intel_panel *panel = &connector->panel;
1703         u32 ctl, val;
1704
1705         ctl = intel_de_read(dev_priv, BLC_PWM_CTL);
1706
1707         if (IS_GEN(dev_priv, 2) || IS_I915GM(dev_priv) || IS_I945GM(dev_priv))
1708                 panel->backlight.combination_mode = ctl & BLM_LEGACY_MODE;
1709
1710         if (IS_PINEVIEW(dev_priv))
1711                 panel->backlight.active_low_pwm = ctl & BLM_POLARITY_PNV;
1712
1713         panel->backlight.max = ctl >> 17;
1714
1715         if (!panel->backlight.max) {
1716                 panel->backlight.max = get_backlight_max_vbt(connector);
1717                 panel->backlight.max >>= 1;
1718         }
1719
1720         if (!panel->backlight.max)
1721                 return -ENODEV;
1722
1723         if (panel->backlight.combination_mode)
1724                 panel->backlight.max *= 0xff;
1725
1726         panel->backlight.min = get_backlight_min_vbt(connector);
1727
1728         val = i9xx_get_backlight(connector);
1729         val = intel_panel_compute_brightness(connector, val);
1730         panel->backlight.level = clamp(val, panel->backlight.min,
1731                                        panel->backlight.max);
1732
1733         panel->backlight.enabled = val != 0;
1734
1735         return 0;
1736 }
1737
1738 static int i965_setup_backlight(struct intel_connector *connector, enum pipe unused)
1739 {
1740         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1741         struct intel_panel *panel = &connector->panel;
1742         u32 ctl, ctl2, val;
1743
1744         ctl2 = intel_de_read(dev_priv, BLC_PWM_CTL2);
1745         panel->backlight.combination_mode = ctl2 & BLM_COMBINATION_MODE;
1746         panel->backlight.active_low_pwm = ctl2 & BLM_POLARITY_I965;
1747
1748         ctl = intel_de_read(dev_priv, BLC_PWM_CTL);
1749         panel->backlight.max = ctl >> 16;
1750
1751         if (!panel->backlight.max)
1752                 panel->backlight.max = get_backlight_max_vbt(connector);
1753
1754         if (!panel->backlight.max)
1755                 return -ENODEV;
1756
1757         if (panel->backlight.combination_mode)
1758                 panel->backlight.max *= 0xff;
1759
1760         panel->backlight.min = get_backlight_min_vbt(connector);
1761
1762         val = i9xx_get_backlight(connector);
1763         val = intel_panel_compute_brightness(connector, val);
1764         panel->backlight.level = clamp(val, panel->backlight.min,
1765                                        panel->backlight.max);
1766
1767         panel->backlight.enabled = ctl2 & BLM_PWM_ENABLE;
1768
1769         return 0;
1770 }
1771
1772 static int vlv_setup_backlight(struct intel_connector *connector, enum pipe pipe)
1773 {
1774         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1775         struct intel_panel *panel = &connector->panel;
1776         u32 ctl, ctl2, val;
1777
1778         if (drm_WARN_ON(&dev_priv->drm, pipe != PIPE_A && pipe != PIPE_B))
1779                 return -ENODEV;
1780
1781         ctl2 = intel_de_read(dev_priv, VLV_BLC_PWM_CTL2(pipe));
1782         panel->backlight.active_low_pwm = ctl2 & BLM_POLARITY_I965;
1783
1784         ctl = intel_de_read(dev_priv, VLV_BLC_PWM_CTL(pipe));
1785         panel->backlight.max = ctl >> 16;
1786
1787         if (!panel->backlight.max)
1788                 panel->backlight.max = get_backlight_max_vbt(connector);
1789
1790         if (!panel->backlight.max)
1791                 return -ENODEV;
1792
1793         panel->backlight.min = get_backlight_min_vbt(connector);
1794
1795         val = _vlv_get_backlight(dev_priv, pipe);
1796         val = intel_panel_compute_brightness(connector, val);
1797         panel->backlight.level = clamp(val, panel->backlight.min,
1798                                        panel->backlight.max);
1799
1800         panel->backlight.enabled = ctl2 & BLM_PWM_ENABLE;
1801
1802         return 0;
1803 }
1804
1805 static int
1806 bxt_setup_backlight(struct intel_connector *connector, enum pipe unused)
1807 {
1808         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1809         struct intel_panel *panel = &connector->panel;
1810         u32 pwm_ctl, val;
1811
1812         panel->backlight.controller = dev_priv->vbt.backlight.controller;
1813
1814         pwm_ctl = intel_de_read(dev_priv,
1815                                 BXT_BLC_PWM_CTL(panel->backlight.controller));
1816
1817         /* Controller 1 uses the utility pin. */
1818         if (panel->backlight.controller == 1) {
1819                 val = intel_de_read(dev_priv, UTIL_PIN_CTL);
1820                 panel->backlight.util_pin_active_low =
1821                                         val & UTIL_PIN_POLARITY;
1822         }
1823
1824         panel->backlight.active_low_pwm = pwm_ctl & BXT_BLC_PWM_POLARITY;
1825         panel->backlight.max =
1826                 intel_de_read(dev_priv,
1827                               BXT_BLC_PWM_FREQ(panel->backlight.controller));
1828
1829         if (!panel->backlight.max)
1830                 panel->backlight.max = get_backlight_max_vbt(connector);
1831
1832         if (!panel->backlight.max)
1833                 return -ENODEV;
1834
1835         panel->backlight.min = get_backlight_min_vbt(connector);
1836
1837         val = bxt_get_backlight(connector);
1838         val = intel_panel_compute_brightness(connector, val);
1839         panel->backlight.level = clamp(val, panel->backlight.min,
1840                                        panel->backlight.max);
1841
1842         panel->backlight.enabled = pwm_ctl & BXT_BLC_PWM_ENABLE;
1843
1844         return 0;
1845 }
1846
1847 static int
1848 cnp_setup_backlight(struct intel_connector *connector, enum pipe unused)
1849 {
1850         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1851         struct intel_panel *panel = &connector->panel;
1852         u32 pwm_ctl, val;
1853
1854         /*
1855          * CNP has the BXT implementation of backlight, but with only one
1856          * controller. TODO: ICP has multiple controllers but we only use
1857          * controller 0 for now.
1858          */
1859         panel->backlight.controller = 0;
1860
1861         pwm_ctl = intel_de_read(dev_priv,
1862                                 BXT_BLC_PWM_CTL(panel->backlight.controller));
1863
1864         panel->backlight.active_low_pwm = pwm_ctl & BXT_BLC_PWM_POLARITY;
1865         panel->backlight.max =
1866                 intel_de_read(dev_priv,
1867                               BXT_BLC_PWM_FREQ(panel->backlight.controller));
1868
1869         if (!panel->backlight.max)
1870                 panel->backlight.max = get_backlight_max_vbt(connector);
1871
1872         if (!panel->backlight.max)
1873                 return -ENODEV;
1874
1875         panel->backlight.min = get_backlight_min_vbt(connector);
1876
1877         val = bxt_get_backlight(connector);
1878         val = intel_panel_compute_brightness(connector, val);
1879         panel->backlight.level = clamp(val, panel->backlight.min,
1880                                        panel->backlight.max);
1881
1882         panel->backlight.enabled = pwm_ctl & BXT_BLC_PWM_ENABLE;
1883
1884         return 0;
1885 }
1886
1887 static int pwm_setup_backlight(struct intel_connector *connector,
1888                                enum pipe pipe)
1889 {
1890         struct drm_device *dev = connector->base.dev;
1891         struct drm_i915_private *dev_priv = to_i915(dev);
1892         struct intel_panel *panel = &connector->panel;
1893         const char *desc;
1894         u32 level, ns;
1895         int retval;
1896
1897         /* Get the right PWM chip for DSI backlight according to VBT */
1898         if (dev_priv->vbt.dsi.config->pwm_blc == PPS_BLC_PMIC) {
1899                 panel->backlight.pwm = pwm_get(dev->dev, "pwm_pmic_backlight");
1900                 desc = "PMIC";
1901         } else {
1902                 panel->backlight.pwm = pwm_get(dev->dev, "pwm_soc_backlight");
1903                 desc = "SoC";
1904         }
1905
1906         if (IS_ERR(panel->backlight.pwm)) {
1907                 drm_err(&dev_priv->drm, "Failed to get the %s PWM chip\n",
1908                         desc);
1909                 panel->backlight.pwm = NULL;
1910                 return -ENODEV;
1911         }
1912
1913         /*
1914          * FIXME: pwm_apply_args() should be removed when switching to
1915          * the atomic PWM API.
1916          */
1917         pwm_apply_args(panel->backlight.pwm);
1918
1919         panel->backlight.min = 0; /* 0% */
1920         panel->backlight.max = 100; /* 100% */
1921         level = intel_panel_compute_brightness(connector, 100);
1922         ns = DIV_ROUND_UP(level * CRC_PMIC_PWM_PERIOD_NS, 100);
1923
1924         retval = pwm_config(panel->backlight.pwm, ns, CRC_PMIC_PWM_PERIOD_NS);
1925         if (retval < 0) {
1926                 drm_err(&dev_priv->drm, "Failed to configure the pwm chip\n");
1927                 pwm_put(panel->backlight.pwm);
1928                 panel->backlight.pwm = NULL;
1929                 return retval;
1930         }
1931
1932         level = DIV_ROUND_UP_ULL(pwm_get_duty_cycle(panel->backlight.pwm) * 100,
1933                              CRC_PMIC_PWM_PERIOD_NS);
1934         panel->backlight.level =
1935                 intel_panel_compute_brightness(connector, level);
1936         panel->backlight.enabled = panel->backlight.level != 0;
1937
1938         drm_info(&dev_priv->drm, "Using %s PWM for LCD backlight control\n",
1939                  desc);
1940         return 0;
1941 }
1942
1943 void intel_panel_update_backlight(struct intel_atomic_state *state,
1944                                   struct intel_encoder *encoder,
1945                                   const struct intel_crtc_state *crtc_state,
1946                                   const struct drm_connector_state *conn_state)
1947 {
1948         struct intel_connector *connector = to_intel_connector(conn_state->connector);
1949         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1950         struct intel_panel *panel = &connector->panel;
1951
1952         if (!panel->backlight.present)
1953                 return;
1954
1955         mutex_lock(&dev_priv->backlight_lock);
1956         if (!panel->backlight.enabled)
1957                 __intel_panel_enable_backlight(crtc_state, conn_state);
1958
1959         mutex_unlock(&dev_priv->backlight_lock);
1960 }
1961
1962 int intel_panel_setup_backlight(struct drm_connector *connector, enum pipe pipe)
1963 {
1964         struct drm_i915_private *dev_priv = to_i915(connector->dev);
1965         struct intel_connector *intel_connector = to_intel_connector(connector);
1966         struct intel_panel *panel = &intel_connector->panel;
1967         int ret;
1968
1969         if (!dev_priv->vbt.backlight.present) {
1970                 if (dev_priv->quirks & QUIRK_BACKLIGHT_PRESENT) {
1971                         drm_dbg_kms(&dev_priv->drm,
1972                                     "no backlight present per VBT, but present per quirk\n");
1973                 } else {
1974                         drm_dbg_kms(&dev_priv->drm,
1975                                     "no backlight present per VBT\n");
1976                         return 0;
1977                 }
1978         }
1979
1980         /* ensure intel_panel has been initialized first */
1981         if (drm_WARN_ON(&dev_priv->drm, !panel->backlight.setup))
1982                 return -ENODEV;
1983
1984         /* set level and max in panel struct */
1985         mutex_lock(&dev_priv->backlight_lock);
1986         ret = panel->backlight.setup(intel_connector, pipe);
1987         mutex_unlock(&dev_priv->backlight_lock);
1988
1989         if (ret) {
1990                 drm_dbg_kms(&dev_priv->drm,
1991                             "failed to setup backlight for connector %s\n",
1992                             connector->name);
1993                 return ret;
1994         }
1995
1996         panel->backlight.present = true;
1997
1998         drm_dbg_kms(&dev_priv->drm,
1999                     "Connector %s backlight initialized, %s, brightness %u/%u\n",
2000                     connector->name,
2001                     enableddisabled(panel->backlight.enabled),
2002                     panel->backlight.level, panel->backlight.max);
2003
2004         return 0;
2005 }
2006
2007 static void intel_panel_destroy_backlight(struct intel_panel *panel)
2008 {
2009         /* dispose of the pwm */
2010         if (panel->backlight.pwm)
2011                 pwm_put(panel->backlight.pwm);
2012
2013         panel->backlight.present = false;
2014 }
2015
2016 /* Set up chip specific backlight functions */
2017 static void
2018 intel_panel_init_backlight_funcs(struct intel_panel *panel)
2019 {
2020         struct intel_connector *connector =
2021                 container_of(panel, struct intel_connector, panel);
2022         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
2023
2024         if (connector->base.connector_type == DRM_MODE_CONNECTOR_eDP &&
2025             intel_dp_aux_init_backlight_funcs(connector) == 0)
2026                 return;
2027
2028         if (connector->base.connector_type == DRM_MODE_CONNECTOR_DSI &&
2029             intel_dsi_dcs_init_backlight_funcs(connector) == 0)
2030                 return;
2031
2032         if (IS_GEN9_LP(dev_priv)) {
2033                 panel->backlight.setup = bxt_setup_backlight;
2034                 panel->backlight.enable = bxt_enable_backlight;
2035                 panel->backlight.disable = bxt_disable_backlight;
2036                 panel->backlight.set = bxt_set_backlight;
2037                 panel->backlight.get = bxt_get_backlight;
2038                 panel->backlight.hz_to_pwm = bxt_hz_to_pwm;
2039         } else if (INTEL_PCH_TYPE(dev_priv) >= PCH_CNP) {
2040                 panel->backlight.setup = cnp_setup_backlight;
2041                 panel->backlight.enable = cnp_enable_backlight;
2042                 panel->backlight.disable = cnp_disable_backlight;
2043                 panel->backlight.set = bxt_set_backlight;
2044                 panel->backlight.get = bxt_get_backlight;
2045                 panel->backlight.hz_to_pwm = cnp_hz_to_pwm;
2046         } else if (INTEL_PCH_TYPE(dev_priv) >= PCH_LPT) {
2047                 panel->backlight.setup = lpt_setup_backlight;
2048                 panel->backlight.enable = lpt_enable_backlight;
2049                 panel->backlight.disable = lpt_disable_backlight;
2050                 panel->backlight.set = lpt_set_backlight;
2051                 panel->backlight.get = lpt_get_backlight;
2052                 if (HAS_PCH_LPT(dev_priv))
2053                         panel->backlight.hz_to_pwm = lpt_hz_to_pwm;
2054                 else
2055                         panel->backlight.hz_to_pwm = spt_hz_to_pwm;
2056         } else if (HAS_PCH_SPLIT(dev_priv)) {
2057                 panel->backlight.setup = pch_setup_backlight;
2058                 panel->backlight.enable = pch_enable_backlight;
2059                 panel->backlight.disable = pch_disable_backlight;
2060                 panel->backlight.set = pch_set_backlight;
2061                 panel->backlight.get = pch_get_backlight;
2062                 panel->backlight.hz_to_pwm = pch_hz_to_pwm;
2063         } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
2064                 if (connector->base.connector_type == DRM_MODE_CONNECTOR_DSI) {
2065                         panel->backlight.setup = pwm_setup_backlight;
2066                         panel->backlight.enable = pwm_enable_backlight;
2067                         panel->backlight.disable = pwm_disable_backlight;
2068                         panel->backlight.set = pwm_set_backlight;
2069                         panel->backlight.get = pwm_get_backlight;
2070                 } else {
2071                         panel->backlight.setup = vlv_setup_backlight;
2072                         panel->backlight.enable = vlv_enable_backlight;
2073                         panel->backlight.disable = vlv_disable_backlight;
2074                         panel->backlight.set = vlv_set_backlight;
2075                         panel->backlight.get = vlv_get_backlight;
2076                         panel->backlight.hz_to_pwm = vlv_hz_to_pwm;
2077                 }
2078         } else if (IS_GEN(dev_priv, 4)) {
2079                 panel->backlight.setup = i965_setup_backlight;
2080                 panel->backlight.enable = i965_enable_backlight;
2081                 panel->backlight.disable = i965_disable_backlight;
2082                 panel->backlight.set = i9xx_set_backlight;
2083                 panel->backlight.get = i9xx_get_backlight;
2084                 panel->backlight.hz_to_pwm = i965_hz_to_pwm;
2085         } else {
2086                 panel->backlight.setup = i9xx_setup_backlight;
2087                 panel->backlight.enable = i9xx_enable_backlight;
2088                 panel->backlight.disable = i9xx_disable_backlight;
2089                 panel->backlight.set = i9xx_set_backlight;
2090                 panel->backlight.get = i9xx_get_backlight;
2091                 panel->backlight.hz_to_pwm = i9xx_hz_to_pwm;
2092         }
2093 }
2094
2095 int intel_panel_init(struct intel_panel *panel,
2096                      struct drm_display_mode *fixed_mode,
2097                      struct drm_display_mode *downclock_mode)
2098 {
2099         intel_panel_init_backlight_funcs(panel);
2100
2101         panel->fixed_mode = fixed_mode;
2102         panel->downclock_mode = downclock_mode;
2103
2104         return 0;
2105 }
2106
2107 void intel_panel_fini(struct intel_panel *panel)
2108 {
2109         struct intel_connector *intel_connector =
2110                 container_of(panel, struct intel_connector, panel);
2111
2112         intel_panel_destroy_backlight(panel);
2113
2114         if (panel->fixed_mode)
2115                 drm_mode_destroy(intel_connector->base.dev, panel->fixed_mode);
2116
2117         if (panel->downclock_mode)
2118                 drm_mode_destroy(intel_connector->base.dev,
2119                                 panel->downclock_mode);
2120 }