drm/i915: Have pfit calculations return an error code
[linux-block.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                 /* fall through */
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 [hw_min..hw_max]. */
493 static u32 scale_user_to_hw(struct intel_connector *connector,
494                             u32 user_level, u32 user_max)
495 {
496         struct intel_panel *panel = &connector->panel;
497
498         return scale(user_level, 0, user_max,
499                      panel->backlight.min, panel->backlight.max);
500 }
501
502 /* Scale user_level in range [0..user_max] to [0..hw_max], clamping the result
503  * to [hw_min..hw_max]. */
504 static u32 clamp_user_to_hw(struct intel_connector *connector,
505                             u32 user_level, u32 user_max)
506 {
507         struct intel_panel *panel = &connector->panel;
508         u32 hw_level;
509
510         hw_level = scale(user_level, 0, user_max, 0, panel->backlight.max);
511         hw_level = clamp(hw_level, panel->backlight.min, panel->backlight.max);
512
513         return hw_level;
514 }
515
516 /* Scale hw_level in range [hw_min..hw_max] to [0..user_max]. */
517 static u32 scale_hw_to_user(struct intel_connector *connector,
518                             u32 hw_level, u32 user_max)
519 {
520         struct intel_panel *panel = &connector->panel;
521
522         return scale(hw_level, panel->backlight.min, panel->backlight.max,
523                      0, user_max);
524 }
525
526 static u32 intel_panel_compute_brightness(struct intel_connector *connector,
527                                           u32 val)
528 {
529         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
530         struct intel_panel *panel = &connector->panel;
531
532         drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0);
533
534         if (i915_modparams.invert_brightness < 0)
535                 return val;
536
537         if (i915_modparams.invert_brightness > 0 ||
538             dev_priv->quirks & QUIRK_INVERT_BRIGHTNESS) {
539                 return panel->backlight.max - val + panel->backlight.min;
540         }
541
542         return val;
543 }
544
545 static u32 lpt_get_backlight(struct intel_connector *connector)
546 {
547         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
548
549         return intel_de_read(dev_priv, BLC_PWM_PCH_CTL2) & BACKLIGHT_DUTY_CYCLE_MASK;
550 }
551
552 static u32 pch_get_backlight(struct intel_connector *connector)
553 {
554         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
555
556         return intel_de_read(dev_priv, BLC_PWM_CPU_CTL) & BACKLIGHT_DUTY_CYCLE_MASK;
557 }
558
559 static u32 i9xx_get_backlight(struct intel_connector *connector)
560 {
561         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
562         struct intel_panel *panel = &connector->panel;
563         u32 val;
564
565         val = intel_de_read(dev_priv, BLC_PWM_CTL) & BACKLIGHT_DUTY_CYCLE_MASK;
566         if (INTEL_GEN(dev_priv) < 4)
567                 val >>= 1;
568
569         if (panel->backlight.combination_mode) {
570                 u8 lbpc;
571
572                 pci_read_config_byte(dev_priv->drm.pdev, LBPC, &lbpc);
573                 val *= lbpc;
574         }
575
576         return val;
577 }
578
579 static u32 _vlv_get_backlight(struct drm_i915_private *dev_priv, enum pipe pipe)
580 {
581         if (drm_WARN_ON(&dev_priv->drm, pipe != PIPE_A && pipe != PIPE_B))
582                 return 0;
583
584         return intel_de_read(dev_priv, VLV_BLC_PWM_CTL(pipe)) & BACKLIGHT_DUTY_CYCLE_MASK;
585 }
586
587 static u32 vlv_get_backlight(struct intel_connector *connector)
588 {
589         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
590         enum pipe pipe = intel_connector_get_pipe(connector);
591
592         return _vlv_get_backlight(dev_priv, pipe);
593 }
594
595 static u32 bxt_get_backlight(struct intel_connector *connector)
596 {
597         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
598         struct intel_panel *panel = &connector->panel;
599
600         return intel_de_read(dev_priv,
601                              BXT_BLC_PWM_DUTY(panel->backlight.controller));
602 }
603
604 static u32 pwm_get_backlight(struct intel_connector *connector)
605 {
606         struct intel_panel *panel = &connector->panel;
607         int duty_ns;
608
609         duty_ns = pwm_get_duty_cycle(panel->backlight.pwm);
610         return DIV_ROUND_UP(duty_ns * 100, CRC_PMIC_PWM_PERIOD_NS);
611 }
612
613 static void lpt_set_backlight(const struct drm_connector_state *conn_state, u32 level)
614 {
615         struct intel_connector *connector = to_intel_connector(conn_state->connector);
616         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
617
618         u32 val = intel_de_read(dev_priv, BLC_PWM_PCH_CTL2) & ~BACKLIGHT_DUTY_CYCLE_MASK;
619         intel_de_write(dev_priv, BLC_PWM_PCH_CTL2, val | level);
620 }
621
622 static void pch_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         u32 tmp;
627
628         tmp = intel_de_read(dev_priv, BLC_PWM_CPU_CTL) & ~BACKLIGHT_DUTY_CYCLE_MASK;
629         intel_de_write(dev_priv, BLC_PWM_CPU_CTL, tmp | level);
630 }
631
632 static void i9xx_set_backlight(const struct drm_connector_state *conn_state, u32 level)
633 {
634         struct intel_connector *connector = to_intel_connector(conn_state->connector);
635         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
636         struct intel_panel *panel = &connector->panel;
637         u32 tmp, mask;
638
639         drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0);
640
641         if (panel->backlight.combination_mode) {
642                 u8 lbpc;
643
644                 lbpc = level * 0xfe / panel->backlight.max + 1;
645                 level /= lbpc;
646                 pci_write_config_byte(dev_priv->drm.pdev, LBPC, lbpc);
647         }
648
649         if (IS_GEN(dev_priv, 4)) {
650                 mask = BACKLIGHT_DUTY_CYCLE_MASK;
651         } else {
652                 level <<= 1;
653                 mask = BACKLIGHT_DUTY_CYCLE_MASK_PNV;
654         }
655
656         tmp = intel_de_read(dev_priv, BLC_PWM_CTL) & ~mask;
657         intel_de_write(dev_priv, BLC_PWM_CTL, tmp | level);
658 }
659
660 static void vlv_set_backlight(const struct drm_connector_state *conn_state, u32 level)
661 {
662         struct intel_connector *connector = to_intel_connector(conn_state->connector);
663         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
664         enum pipe pipe = to_intel_crtc(conn_state->crtc)->pipe;
665         u32 tmp;
666
667         tmp = intel_de_read(dev_priv, VLV_BLC_PWM_CTL(pipe)) & ~BACKLIGHT_DUTY_CYCLE_MASK;
668         intel_de_write(dev_priv, VLV_BLC_PWM_CTL(pipe), tmp | level);
669 }
670
671 static void bxt_set_backlight(const struct drm_connector_state *conn_state, u32 level)
672 {
673         struct intel_connector *connector = to_intel_connector(conn_state->connector);
674         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
675         struct intel_panel *panel = &connector->panel;
676
677         intel_de_write(dev_priv,
678                        BXT_BLC_PWM_DUTY(panel->backlight.controller), level);
679 }
680
681 static void pwm_set_backlight(const struct drm_connector_state *conn_state, u32 level)
682 {
683         struct intel_panel *panel = &to_intel_connector(conn_state->connector)->panel;
684         int duty_ns = DIV_ROUND_UP(level * CRC_PMIC_PWM_PERIOD_NS, 100);
685
686         pwm_config(panel->backlight.pwm, duty_ns, CRC_PMIC_PWM_PERIOD_NS);
687 }
688
689 static void
690 intel_panel_actually_set_backlight(const struct drm_connector_state *conn_state, u32 level)
691 {
692         struct intel_connector *connector = to_intel_connector(conn_state->connector);
693         struct drm_i915_private *i915 = to_i915(connector->base.dev);
694         struct intel_panel *panel = &connector->panel;
695
696         drm_dbg_kms(&i915->drm, "set backlight PWM = %d\n", level);
697
698         level = intel_panel_compute_brightness(connector, level);
699         panel->backlight.set(conn_state, level);
700 }
701
702 /* set backlight brightness to level in range [0..max], assuming hw min is
703  * respected.
704  */
705 void intel_panel_set_backlight_acpi(const struct drm_connector_state *conn_state,
706                                     u32 user_level, u32 user_max)
707 {
708         struct intel_connector *connector = to_intel_connector(conn_state->connector);
709         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
710         struct intel_panel *panel = &connector->panel;
711         u32 hw_level;
712
713         /*
714          * Lack of crtc may occur during driver init because
715          * connection_mutex isn't held across the entire backlight
716          * setup + modeset readout, and the BIOS can issue the
717          * requests at any time.
718          */
719         if (!panel->backlight.present || !conn_state->crtc)
720                 return;
721
722         mutex_lock(&dev_priv->backlight_lock);
723
724         drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0);
725
726         hw_level = clamp_user_to_hw(connector, user_level, user_max);
727         panel->backlight.level = hw_level;
728
729         if (panel->backlight.device)
730                 panel->backlight.device->props.brightness =
731                         scale_hw_to_user(connector,
732                                          panel->backlight.level,
733                                          panel->backlight.device->props.max_brightness);
734
735         if (panel->backlight.enabled)
736                 intel_panel_actually_set_backlight(conn_state, hw_level);
737
738         mutex_unlock(&dev_priv->backlight_lock);
739 }
740
741 static void lpt_disable_backlight(const struct drm_connector_state *old_conn_state)
742 {
743         struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
744         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
745         u32 tmp;
746
747         intel_panel_actually_set_backlight(old_conn_state, 0);
748
749         /*
750          * Although we don't support or enable CPU PWM with LPT/SPT based
751          * systems, it may have been enabled prior to loading the
752          * driver. Disable to avoid warnings on LCPLL disable.
753          *
754          * This needs rework if we need to add support for CPU PWM on PCH split
755          * platforms.
756          */
757         tmp = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
758         if (tmp & BLM_PWM_ENABLE) {
759                 drm_dbg_kms(&dev_priv->drm,
760                             "cpu backlight was enabled, disabling\n");
761                 intel_de_write(dev_priv, BLC_PWM_CPU_CTL2,
762                                tmp & ~BLM_PWM_ENABLE);
763         }
764
765         tmp = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
766         intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, tmp & ~BLM_PCH_PWM_ENABLE);
767 }
768
769 static void pch_disable_backlight(const struct drm_connector_state *old_conn_state)
770 {
771         struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
772         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
773         u32 tmp;
774
775         intel_panel_actually_set_backlight(old_conn_state, 0);
776
777         tmp = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
778         intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, tmp & ~BLM_PWM_ENABLE);
779
780         tmp = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
781         intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, tmp & ~BLM_PCH_PWM_ENABLE);
782 }
783
784 static void i9xx_disable_backlight(const struct drm_connector_state *old_conn_state)
785 {
786         intel_panel_actually_set_backlight(old_conn_state, 0);
787 }
788
789 static void i965_disable_backlight(const struct drm_connector_state *old_conn_state)
790 {
791         struct drm_i915_private *dev_priv = to_i915(old_conn_state->connector->dev);
792         u32 tmp;
793
794         intel_panel_actually_set_backlight(old_conn_state, 0);
795
796         tmp = intel_de_read(dev_priv, BLC_PWM_CTL2);
797         intel_de_write(dev_priv, BLC_PWM_CTL2, tmp & ~BLM_PWM_ENABLE);
798 }
799
800 static void vlv_disable_backlight(const struct drm_connector_state *old_conn_state)
801 {
802         struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
803         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
804         enum pipe pipe = to_intel_crtc(old_conn_state->crtc)->pipe;
805         u32 tmp;
806
807         intel_panel_actually_set_backlight(old_conn_state, 0);
808
809         tmp = intel_de_read(dev_priv, VLV_BLC_PWM_CTL2(pipe));
810         intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe),
811                        tmp & ~BLM_PWM_ENABLE);
812 }
813
814 static void bxt_disable_backlight(const struct drm_connector_state *old_conn_state)
815 {
816         struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
817         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
818         struct intel_panel *panel = &connector->panel;
819         u32 tmp, val;
820
821         intel_panel_actually_set_backlight(old_conn_state, 0);
822
823         tmp = intel_de_read(dev_priv,
824                             BXT_BLC_PWM_CTL(panel->backlight.controller));
825         intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
826                        tmp & ~BXT_BLC_PWM_ENABLE);
827
828         if (panel->backlight.controller == 1) {
829                 val = intel_de_read(dev_priv, UTIL_PIN_CTL);
830                 val &= ~UTIL_PIN_ENABLE;
831                 intel_de_write(dev_priv, UTIL_PIN_CTL, val);
832         }
833 }
834
835 static void cnp_disable_backlight(const struct drm_connector_state *old_conn_state)
836 {
837         struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
838         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
839         struct intel_panel *panel = &connector->panel;
840         u32 tmp;
841
842         intel_panel_actually_set_backlight(old_conn_state, 0);
843
844         tmp = intel_de_read(dev_priv,
845                             BXT_BLC_PWM_CTL(panel->backlight.controller));
846         intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
847                        tmp & ~BXT_BLC_PWM_ENABLE);
848 }
849
850 static void pwm_disable_backlight(const struct drm_connector_state *old_conn_state)
851 {
852         struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
853         struct intel_panel *panel = &connector->panel;
854
855         /* Disable the backlight */
856         intel_panel_actually_set_backlight(old_conn_state, 0);
857         usleep_range(2000, 3000);
858         pwm_disable(panel->backlight.pwm);
859 }
860
861 void intel_panel_disable_backlight(const struct drm_connector_state *old_conn_state)
862 {
863         struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
864         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
865         struct intel_panel *panel = &connector->panel;
866
867         if (!panel->backlight.present)
868                 return;
869
870         /*
871          * Do not disable backlight on the vga_switcheroo path. When switching
872          * away from i915, the other client may depend on i915 to handle the
873          * backlight. This will leave the backlight on unnecessarily when
874          * another client is not activated.
875          */
876         if (dev_priv->drm.switch_power_state == DRM_SWITCH_POWER_CHANGING) {
877                 drm_dbg_kms(&dev_priv->drm,
878                             "Skipping backlight disable on vga switch\n");
879                 return;
880         }
881
882         mutex_lock(&dev_priv->backlight_lock);
883
884         if (panel->backlight.device)
885                 panel->backlight.device->props.power = FB_BLANK_POWERDOWN;
886         panel->backlight.enabled = false;
887         panel->backlight.disable(old_conn_state);
888
889         mutex_unlock(&dev_priv->backlight_lock);
890 }
891
892 static void lpt_enable_backlight(const struct intel_crtc_state *crtc_state,
893                                  const struct drm_connector_state *conn_state)
894 {
895         struct intel_connector *connector = to_intel_connector(conn_state->connector);
896         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
897         struct intel_panel *panel = &connector->panel;
898         u32 pch_ctl1, pch_ctl2, schicken;
899
900         pch_ctl1 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
901         if (pch_ctl1 & BLM_PCH_PWM_ENABLE) {
902                 drm_dbg_kms(&dev_priv->drm, "pch backlight already enabled\n");
903                 pch_ctl1 &= ~BLM_PCH_PWM_ENABLE;
904                 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, pch_ctl1);
905         }
906
907         if (HAS_PCH_LPT(dev_priv)) {
908                 schicken = intel_de_read(dev_priv, SOUTH_CHICKEN2);
909                 if (panel->backlight.alternate_pwm_increment)
910                         schicken |= LPT_PWM_GRANULARITY;
911                 else
912                         schicken &= ~LPT_PWM_GRANULARITY;
913                 intel_de_write(dev_priv, SOUTH_CHICKEN2, schicken);
914         } else {
915                 schicken = intel_de_read(dev_priv, SOUTH_CHICKEN1);
916                 if (panel->backlight.alternate_pwm_increment)
917                         schicken |= SPT_PWM_GRANULARITY;
918                 else
919                         schicken &= ~SPT_PWM_GRANULARITY;
920                 intel_de_write(dev_priv, SOUTH_CHICKEN1, schicken);
921         }
922
923         pch_ctl2 = panel->backlight.max << 16;
924         intel_de_write(dev_priv, BLC_PWM_PCH_CTL2, pch_ctl2);
925
926         pch_ctl1 = 0;
927         if (panel->backlight.active_low_pwm)
928                 pch_ctl1 |= BLM_PCH_POLARITY;
929
930         /* After LPT, override is the default. */
931         if (HAS_PCH_LPT(dev_priv))
932                 pch_ctl1 |= BLM_PCH_OVERRIDE_ENABLE;
933
934         intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, pch_ctl1);
935         intel_de_posting_read(dev_priv, BLC_PWM_PCH_CTL1);
936         intel_de_write(dev_priv, BLC_PWM_PCH_CTL1,
937                        pch_ctl1 | BLM_PCH_PWM_ENABLE);
938
939         /* This won't stick until the above enable. */
940         intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
941 }
942
943 static void pch_enable_backlight(const struct intel_crtc_state *crtc_state,
944                                  const struct drm_connector_state *conn_state)
945 {
946         struct intel_connector *connector = to_intel_connector(conn_state->connector);
947         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
948         struct intel_panel *panel = &connector->panel;
949         enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
950         u32 cpu_ctl2, pch_ctl1, pch_ctl2;
951
952         cpu_ctl2 = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
953         if (cpu_ctl2 & BLM_PWM_ENABLE) {
954                 drm_dbg_kms(&dev_priv->drm, "cpu backlight already enabled\n");
955                 cpu_ctl2 &= ~BLM_PWM_ENABLE;
956                 intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, cpu_ctl2);
957         }
958
959         pch_ctl1 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
960         if (pch_ctl1 & BLM_PCH_PWM_ENABLE) {
961                 drm_dbg_kms(&dev_priv->drm, "pch backlight already enabled\n");
962                 pch_ctl1 &= ~BLM_PCH_PWM_ENABLE;
963                 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, pch_ctl1);
964         }
965
966         if (cpu_transcoder == TRANSCODER_EDP)
967                 cpu_ctl2 = BLM_TRANSCODER_EDP;
968         else
969                 cpu_ctl2 = BLM_PIPE(cpu_transcoder);
970         intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, cpu_ctl2);
971         intel_de_posting_read(dev_priv, BLC_PWM_CPU_CTL2);
972         intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, cpu_ctl2 | BLM_PWM_ENABLE);
973
974         /* This won't stick until the above enable. */
975         intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
976
977         pch_ctl2 = panel->backlight.max << 16;
978         intel_de_write(dev_priv, BLC_PWM_PCH_CTL2, pch_ctl2);
979
980         pch_ctl1 = 0;
981         if (panel->backlight.active_low_pwm)
982                 pch_ctl1 |= BLM_PCH_POLARITY;
983
984         intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, pch_ctl1);
985         intel_de_posting_read(dev_priv, BLC_PWM_PCH_CTL1);
986         intel_de_write(dev_priv, BLC_PWM_PCH_CTL1,
987                        pch_ctl1 | BLM_PCH_PWM_ENABLE);
988 }
989
990 static void i9xx_enable_backlight(const struct intel_crtc_state *crtc_state,
991                                   const struct drm_connector_state *conn_state)
992 {
993         struct intel_connector *connector = to_intel_connector(conn_state->connector);
994         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
995         struct intel_panel *panel = &connector->panel;
996         u32 ctl, freq;
997
998         ctl = intel_de_read(dev_priv, BLC_PWM_CTL);
999         if (ctl & BACKLIGHT_DUTY_CYCLE_MASK_PNV) {
1000                 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
1001                 intel_de_write(dev_priv, BLC_PWM_CTL, 0);
1002         }
1003
1004         freq = panel->backlight.max;
1005         if (panel->backlight.combination_mode)
1006                 freq /= 0xff;
1007
1008         ctl = freq << 17;
1009         if (panel->backlight.combination_mode)
1010                 ctl |= BLM_LEGACY_MODE;
1011         if (IS_PINEVIEW(dev_priv) && panel->backlight.active_low_pwm)
1012                 ctl |= BLM_POLARITY_PNV;
1013
1014         intel_de_write(dev_priv, BLC_PWM_CTL, ctl);
1015         intel_de_posting_read(dev_priv, BLC_PWM_CTL);
1016
1017         /* XXX: combine this into above write? */
1018         intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
1019
1020         /*
1021          * Needed to enable backlight on some 855gm models. BLC_HIST_CTL is
1022          * 855gm only, but checking for gen2 is safe, as 855gm is the only gen2
1023          * that has backlight.
1024          */
1025         if (IS_GEN(dev_priv, 2))
1026                 intel_de_write(dev_priv, BLC_HIST_CTL, BLM_HISTOGRAM_ENABLE);
1027 }
1028
1029 static void i965_enable_backlight(const struct intel_crtc_state *crtc_state,
1030                                   const struct drm_connector_state *conn_state)
1031 {
1032         struct intel_connector *connector = to_intel_connector(conn_state->connector);
1033         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1034         struct intel_panel *panel = &connector->panel;
1035         enum pipe pipe = to_intel_crtc(conn_state->crtc)->pipe;
1036         u32 ctl, ctl2, freq;
1037
1038         ctl2 = intel_de_read(dev_priv, BLC_PWM_CTL2);
1039         if (ctl2 & BLM_PWM_ENABLE) {
1040                 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
1041                 ctl2 &= ~BLM_PWM_ENABLE;
1042                 intel_de_write(dev_priv, BLC_PWM_CTL2, ctl2);
1043         }
1044
1045         freq = panel->backlight.max;
1046         if (panel->backlight.combination_mode)
1047                 freq /= 0xff;
1048
1049         ctl = freq << 16;
1050         intel_de_write(dev_priv, BLC_PWM_CTL, ctl);
1051
1052         ctl2 = BLM_PIPE(pipe);
1053         if (panel->backlight.combination_mode)
1054                 ctl2 |= BLM_COMBINATION_MODE;
1055         if (panel->backlight.active_low_pwm)
1056                 ctl2 |= BLM_POLARITY_I965;
1057         intel_de_write(dev_priv, BLC_PWM_CTL2, ctl2);
1058         intel_de_posting_read(dev_priv, BLC_PWM_CTL2);
1059         intel_de_write(dev_priv, BLC_PWM_CTL2, ctl2 | BLM_PWM_ENABLE);
1060
1061         intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
1062 }
1063
1064 static void vlv_enable_backlight(const struct intel_crtc_state *crtc_state,
1065                                  const struct drm_connector_state *conn_state)
1066 {
1067         struct intel_connector *connector = to_intel_connector(conn_state->connector);
1068         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1069         struct intel_panel *panel = &connector->panel;
1070         enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe;
1071         u32 ctl, ctl2;
1072
1073         ctl2 = intel_de_read(dev_priv, VLV_BLC_PWM_CTL2(pipe));
1074         if (ctl2 & BLM_PWM_ENABLE) {
1075                 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
1076                 ctl2 &= ~BLM_PWM_ENABLE;
1077                 intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe), ctl2);
1078         }
1079
1080         ctl = panel->backlight.max << 16;
1081         intel_de_write(dev_priv, VLV_BLC_PWM_CTL(pipe), ctl);
1082
1083         /* XXX: combine this into above write? */
1084         intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
1085
1086         ctl2 = 0;
1087         if (panel->backlight.active_low_pwm)
1088                 ctl2 |= BLM_POLARITY_I965;
1089         intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe), ctl2);
1090         intel_de_posting_read(dev_priv, VLV_BLC_PWM_CTL2(pipe));
1091         intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe),
1092                        ctl2 | BLM_PWM_ENABLE);
1093 }
1094
1095 static void bxt_enable_backlight(const struct intel_crtc_state *crtc_state,
1096                                  const struct drm_connector_state *conn_state)
1097 {
1098         struct intel_connector *connector = to_intel_connector(conn_state->connector);
1099         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1100         struct intel_panel *panel = &connector->panel;
1101         enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe;
1102         u32 pwm_ctl, val;
1103
1104         /* Controller 1 uses the utility pin. */
1105         if (panel->backlight.controller == 1) {
1106                 val = intel_de_read(dev_priv, UTIL_PIN_CTL);
1107                 if (val & UTIL_PIN_ENABLE) {
1108                         drm_dbg_kms(&dev_priv->drm,
1109                                     "util pin already enabled\n");
1110                         val &= ~UTIL_PIN_ENABLE;
1111                         intel_de_write(dev_priv, UTIL_PIN_CTL, val);
1112                 }
1113
1114                 val = 0;
1115                 if (panel->backlight.util_pin_active_low)
1116                         val |= UTIL_PIN_POLARITY;
1117                 intel_de_write(dev_priv, UTIL_PIN_CTL,
1118                                val | UTIL_PIN_PIPE(pipe) | UTIL_PIN_MODE_PWM | UTIL_PIN_ENABLE);
1119         }
1120
1121         pwm_ctl = intel_de_read(dev_priv,
1122                                 BXT_BLC_PWM_CTL(panel->backlight.controller));
1123         if (pwm_ctl & BXT_BLC_PWM_ENABLE) {
1124                 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
1125                 pwm_ctl &= ~BXT_BLC_PWM_ENABLE;
1126                 intel_de_write(dev_priv,
1127                                BXT_BLC_PWM_CTL(panel->backlight.controller),
1128                                pwm_ctl);
1129         }
1130
1131         intel_de_write(dev_priv,
1132                        BXT_BLC_PWM_FREQ(panel->backlight.controller),
1133                        panel->backlight.max);
1134
1135         intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
1136
1137         pwm_ctl = 0;
1138         if (panel->backlight.active_low_pwm)
1139                 pwm_ctl |= BXT_BLC_PWM_POLARITY;
1140
1141         intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
1142                        pwm_ctl);
1143         intel_de_posting_read(dev_priv,
1144                               BXT_BLC_PWM_CTL(panel->backlight.controller));
1145         intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
1146                        pwm_ctl | BXT_BLC_PWM_ENABLE);
1147 }
1148
1149 static void cnp_enable_backlight(const struct intel_crtc_state *crtc_state,
1150                                  const struct drm_connector_state *conn_state)
1151 {
1152         struct intel_connector *connector = to_intel_connector(conn_state->connector);
1153         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1154         struct intel_panel *panel = &connector->panel;
1155         u32 pwm_ctl;
1156
1157         pwm_ctl = intel_de_read(dev_priv,
1158                                 BXT_BLC_PWM_CTL(panel->backlight.controller));
1159         if (pwm_ctl & BXT_BLC_PWM_ENABLE) {
1160                 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
1161                 pwm_ctl &= ~BXT_BLC_PWM_ENABLE;
1162                 intel_de_write(dev_priv,
1163                                BXT_BLC_PWM_CTL(panel->backlight.controller),
1164                                pwm_ctl);
1165         }
1166
1167         intel_de_write(dev_priv,
1168                        BXT_BLC_PWM_FREQ(panel->backlight.controller),
1169                        panel->backlight.max);
1170
1171         intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
1172
1173         pwm_ctl = 0;
1174         if (panel->backlight.active_low_pwm)
1175                 pwm_ctl |= BXT_BLC_PWM_POLARITY;
1176
1177         intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
1178                        pwm_ctl);
1179         intel_de_posting_read(dev_priv,
1180                               BXT_BLC_PWM_CTL(panel->backlight.controller));
1181         intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
1182                        pwm_ctl | BXT_BLC_PWM_ENABLE);
1183 }
1184
1185 static void pwm_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         pwm_enable(panel->backlight.pwm);
1192         intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
1193 }
1194
1195 static void __intel_panel_enable_backlight(const struct intel_crtc_state *crtc_state,
1196                                            const struct drm_connector_state *conn_state)
1197 {
1198         struct intel_connector *connector = to_intel_connector(conn_state->connector);
1199         struct intel_panel *panel = &connector->panel;
1200
1201         WARN_ON(panel->backlight.max == 0);
1202
1203         if (panel->backlight.level <= panel->backlight.min) {
1204                 panel->backlight.level = panel->backlight.max;
1205                 if (panel->backlight.device)
1206                         panel->backlight.device->props.brightness =
1207                                 scale_hw_to_user(connector,
1208                                                  panel->backlight.level,
1209                                                  panel->backlight.device->props.max_brightness);
1210         }
1211
1212         panel->backlight.enable(crtc_state, conn_state);
1213         panel->backlight.enabled = true;
1214         if (panel->backlight.device)
1215                 panel->backlight.device->props.power = FB_BLANK_UNBLANK;
1216 }
1217
1218 void intel_panel_enable_backlight(const struct intel_crtc_state *crtc_state,
1219                                   const struct drm_connector_state *conn_state)
1220 {
1221         struct intel_connector *connector = to_intel_connector(conn_state->connector);
1222         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1223         struct intel_panel *panel = &connector->panel;
1224         enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe;
1225
1226         if (!panel->backlight.present)
1227                 return;
1228
1229         drm_dbg_kms(&dev_priv->drm, "pipe %c\n", pipe_name(pipe));
1230
1231         mutex_lock(&dev_priv->backlight_lock);
1232
1233         __intel_panel_enable_backlight(crtc_state, conn_state);
1234
1235         mutex_unlock(&dev_priv->backlight_lock);
1236 }
1237
1238 #if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE)
1239 static u32 intel_panel_get_backlight(struct intel_connector *connector)
1240 {
1241         struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1242         struct intel_panel *panel = &connector->panel;
1243         u32 val = 0;
1244
1245         mutex_lock(&dev_priv->backlight_lock);
1246
1247         if (panel->backlight.enabled) {
1248                 val = panel->backlight.get(connector);
1249                 val = intel_panel_compute_brightness(connector, val);
1250         }
1251
1252         mutex_unlock(&dev_priv->backlight_lock);
1253
1254         drm_dbg_kms(&dev_priv->drm, "get backlight PWM = %d\n", val);
1255         return val;
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(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 }