1 // SPDX-License-Identifier: MIT
2 /*
3 * Copyright © 2021 Intel Corporation
4 */
5
6 #include <linux/kernel.h>
7 #include <linux/pwm.h>
8
9 #include "intel_backlight.h"
10 #include "intel_connector.h"
11 #include "intel_de.h"
12 #include "intel_display_types.h"
13 #include "intel_dp_aux_backlight.h"
14 #include "intel_dsi_dcs_backlight.h"
15 #include "intel_panel.h"
16
17 /**
18 * scale - scale values from one range to another
19 * @source_val: value in range [@source_min..@source_max]
20 * @source_min: minimum legal value for @source_val
21 * @source_max: maximum legal value for @source_val
22 * @target_min: corresponding target value for @source_min
23 * @target_max: corresponding target value for @source_max
24 *
25 * Return @source_val in range [@source_min..@source_max] scaled to range
26 * [@target_min..@target_max].
27 */
scale(u32 source_val,u32 source_min,u32 source_max,u32 target_min,u32 target_max)28 static u32 scale(u32 source_val,
29 u32 source_min, u32 source_max,
30 u32 target_min, u32 target_max)
31 {
32 u64 target_val;
33
34 WARN_ON(source_min > source_max);
35 WARN_ON(target_min > target_max);
36
37 /* defensive */
38 source_val = clamp(source_val, source_min, source_max);
39
40 /* avoid overflows */
41 target_val = mul_u32_u32(source_val - source_min,
42 target_max - target_min);
43 target_val = DIV_ROUND_CLOSEST_ULL(target_val, source_max - source_min);
44 target_val += target_min;
45
46 return target_val;
47 }
48
49 /*
50 * Scale user_level in range [0..user_max] to [0..hw_max], clamping the result
51 * to [hw_min..hw_max].
52 */
clamp_user_to_hw(struct intel_connector * connector,u32 user_level,u32 user_max)53 static u32 clamp_user_to_hw(struct intel_connector *connector,
54 u32 user_level, u32 user_max)
55 {
56 struct intel_panel *panel = &connector->panel;
57 u32 hw_level;
58
59 hw_level = scale(user_level, 0, user_max, 0, panel->backlight.max);
60 hw_level = clamp(hw_level, panel->backlight.min, panel->backlight.max);
61
62 return hw_level;
63 }
64
65 /* Scale hw_level in range [hw_min..hw_max] to [0..user_max]. */
scale_hw_to_user(struct intel_connector * connector,u32 hw_level,u32 user_max)66 static u32 scale_hw_to_user(struct intel_connector *connector,
67 u32 hw_level, u32 user_max)
68 {
69 struct intel_panel *panel = &connector->panel;
70
71 return scale(hw_level, panel->backlight.min, panel->backlight.max,
72 0, user_max);
73 }
74
intel_panel_invert_pwm_level(struct intel_connector * connector,u32 val)75 u32 intel_panel_invert_pwm_level(struct intel_connector *connector, u32 val)
76 {
77 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
78 struct intel_panel *panel = &connector->panel;
79
80 drm_WARN_ON(&dev_priv->drm, panel->backlight.pwm_level_max == 0);
81
82 if (dev_priv->params.invert_brightness < 0)
83 return val;
84
85 if (dev_priv->params.invert_brightness > 0 ||
86 dev_priv->quirks & QUIRK_INVERT_BRIGHTNESS) {
87 return panel->backlight.pwm_level_max - val + panel->backlight.pwm_level_min;
88 }
89
90 return val;
91 }
92
intel_panel_set_pwm_level(const struct drm_connector_state * conn_state,u32 val)93 void intel_panel_set_pwm_level(const struct drm_connector_state *conn_state, u32 val)
94 {
95 struct intel_connector *connector = to_intel_connector(conn_state->connector);
96 struct drm_i915_private *i915 = to_i915(connector->base.dev);
97 struct intel_panel *panel = &connector->panel;
98
99 drm_dbg_kms(&i915->drm, "set backlight PWM = %d\n", val);
100 panel->backlight.pwm_funcs->set(conn_state, val);
101 }
102
intel_panel_backlight_level_to_pwm(struct intel_connector * connector,u32 val)103 u32 intel_panel_backlight_level_to_pwm(struct intel_connector *connector, u32 val)
104 {
105 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
106 struct intel_panel *panel = &connector->panel;
107
108 drm_WARN_ON_ONCE(&dev_priv->drm,
109 panel->backlight.max == 0 || panel->backlight.pwm_level_max == 0);
110
111 val = scale(val, panel->backlight.min, panel->backlight.max,
112 panel->backlight.pwm_level_min, panel->backlight.pwm_level_max);
113
114 return intel_panel_invert_pwm_level(connector, val);
115 }
116
intel_panel_backlight_level_from_pwm(struct intel_connector * connector,u32 val)117 u32 intel_panel_backlight_level_from_pwm(struct intel_connector *connector, u32 val)
118 {
119 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
120 struct intel_panel *panel = &connector->panel;
121
122 drm_WARN_ON_ONCE(&dev_priv->drm,
123 panel->backlight.max == 0 || panel->backlight.pwm_level_max == 0);
124
125 if (dev_priv->params.invert_brightness > 0 ||
126 (dev_priv->params.invert_brightness == 0 && dev_priv->quirks & QUIRK_INVERT_BRIGHTNESS))
127 val = panel->backlight.pwm_level_max - (val - panel->backlight.pwm_level_min);
128
129 return scale(val, panel->backlight.pwm_level_min, panel->backlight.pwm_level_max,
130 panel->backlight.min, panel->backlight.max);
131 }
132
lpt_get_backlight(struct intel_connector * connector,enum pipe unused)133 static u32 lpt_get_backlight(struct intel_connector *connector, enum pipe unused)
134 {
135 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
136
137 return intel_de_read(dev_priv, BLC_PWM_PCH_CTL2) & BACKLIGHT_DUTY_CYCLE_MASK;
138 }
139
pch_get_backlight(struct intel_connector * connector,enum pipe unused)140 static u32 pch_get_backlight(struct intel_connector *connector, enum pipe unused)
141 {
142 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
143
144 return intel_de_read(dev_priv, BLC_PWM_CPU_CTL) & BACKLIGHT_DUTY_CYCLE_MASK;
145 }
146
i9xx_get_backlight(struct intel_connector * connector,enum pipe unused)147 static u32 i9xx_get_backlight(struct intel_connector *connector, enum pipe unused)
148 {
149 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
150 struct intel_panel *panel = &connector->panel;
151 u32 val;
152
153 val = intel_de_read(dev_priv, BLC_PWM_CTL) & BACKLIGHT_DUTY_CYCLE_MASK;
154 if (DISPLAY_VER(dev_priv) < 4)
155 val >>= 1;
156
157 if (panel->backlight.combination_mode) {
158 u8 lbpc;
159
160 pci_read_config_byte(to_pci_dev(dev_priv->drm.dev), LBPC, &lbpc);
161 val *= lbpc;
162 }
163
164 return val;
165 }
166
vlv_get_backlight(struct intel_connector * connector,enum pipe pipe)167 static u32 vlv_get_backlight(struct intel_connector *connector, enum pipe pipe)
168 {
169 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
170
171 if (drm_WARN_ON(&dev_priv->drm, pipe != PIPE_A && pipe != PIPE_B))
172 return 0;
173
174 return intel_de_read(dev_priv, VLV_BLC_PWM_CTL(pipe)) & BACKLIGHT_DUTY_CYCLE_MASK;
175 }
176
bxt_get_backlight(struct intel_connector * connector,enum pipe unused)177 static u32 bxt_get_backlight(struct intel_connector *connector, enum pipe unused)
178 {
179 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
180 struct intel_panel *panel = &connector->panel;
181
182 return intel_de_read(dev_priv,
183 BXT_BLC_PWM_DUTY(panel->backlight.controller));
184 }
185
ext_pwm_get_backlight(struct intel_connector * connector,enum pipe unused)186 static u32 ext_pwm_get_backlight(struct intel_connector *connector, enum pipe unused)
187 {
188 struct intel_panel *panel = &connector->panel;
189 struct pwm_state state;
190
191 pwm_get_state(panel->backlight.pwm, &state);
192 return pwm_get_relative_duty_cycle(&state, 100);
193 }
194
lpt_set_backlight(const struct drm_connector_state * conn_state,u32 level)195 static void lpt_set_backlight(const struct drm_connector_state *conn_state, u32 level)
196 {
197 struct intel_connector *connector = to_intel_connector(conn_state->connector);
198 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
199
200 u32 val = intel_de_read(dev_priv, BLC_PWM_PCH_CTL2) & ~BACKLIGHT_DUTY_CYCLE_MASK;
201 intel_de_write(dev_priv, BLC_PWM_PCH_CTL2, val | level);
202 }
203
pch_set_backlight(const struct drm_connector_state * conn_state,u32 level)204 static void pch_set_backlight(const struct drm_connector_state *conn_state, u32 level)
205 {
206 struct intel_connector *connector = to_intel_connector(conn_state->connector);
207 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
208 u32 tmp;
209
210 tmp = intel_de_read(dev_priv, BLC_PWM_CPU_CTL) & ~BACKLIGHT_DUTY_CYCLE_MASK;
211 intel_de_write(dev_priv, BLC_PWM_CPU_CTL, tmp | level);
212 }
213
i9xx_set_backlight(const struct drm_connector_state * conn_state,u32 level)214 static void i9xx_set_backlight(const struct drm_connector_state *conn_state, u32 level)
215 {
216 struct intel_connector *connector = to_intel_connector(conn_state->connector);
217 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
218 struct intel_panel *panel = &connector->panel;
219 u32 tmp, mask;
220
221 drm_WARN_ON(&dev_priv->drm, panel->backlight.pwm_level_max == 0);
222
223 if (panel->backlight.combination_mode) {
224 u8 lbpc;
225
226 lbpc = level * 0xfe / panel->backlight.pwm_level_max + 1;
227 level /= lbpc;
228 pci_write_config_byte(to_pci_dev(dev_priv->drm.dev), LBPC, lbpc);
229 }
230
231 if (DISPLAY_VER(dev_priv) == 4) {
232 mask = BACKLIGHT_DUTY_CYCLE_MASK;
233 } else {
234 level <<= 1;
235 mask = BACKLIGHT_DUTY_CYCLE_MASK_PNV;
236 }
237
238 tmp = intel_de_read(dev_priv, BLC_PWM_CTL) & ~mask;
239 intel_de_write(dev_priv, BLC_PWM_CTL, tmp | level);
240 }
241
vlv_set_backlight(const struct drm_connector_state * conn_state,u32 level)242 static void vlv_set_backlight(const struct drm_connector_state *conn_state, u32 level)
243 {
244 struct intel_connector *connector = to_intel_connector(conn_state->connector);
245 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
246 enum pipe pipe = to_intel_crtc(conn_state->crtc)->pipe;
247 u32 tmp;
248
249 tmp = intel_de_read(dev_priv, VLV_BLC_PWM_CTL(pipe)) & ~BACKLIGHT_DUTY_CYCLE_MASK;
250 intel_de_write(dev_priv, VLV_BLC_PWM_CTL(pipe), tmp | level);
251 }
252
bxt_set_backlight(const struct drm_connector_state * conn_state,u32 level)253 static void bxt_set_backlight(const struct drm_connector_state *conn_state, u32 level)
254 {
255 struct intel_connector *connector = to_intel_connector(conn_state->connector);
256 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
257 struct intel_panel *panel = &connector->panel;
258
259 intel_de_write(dev_priv,
260 BXT_BLC_PWM_DUTY(panel->backlight.controller), level);
261 }
262
ext_pwm_set_backlight(const struct drm_connector_state * conn_state,u32 level)263 static void ext_pwm_set_backlight(const struct drm_connector_state *conn_state, u32 level)
264 {
265 struct intel_panel *panel = &to_intel_connector(conn_state->connector)->panel;
266
267 pwm_set_relative_duty_cycle(&panel->backlight.pwm_state, level, 100);
268 pwm_apply_state(panel->backlight.pwm, &panel->backlight.pwm_state);
269 }
270
271 static void
intel_panel_actually_set_backlight(const struct drm_connector_state * conn_state,u32 level)272 intel_panel_actually_set_backlight(const struct drm_connector_state *conn_state, u32 level)
273 {
274 struct intel_connector *connector = to_intel_connector(conn_state->connector);
275 struct drm_i915_private *i915 = to_i915(connector->base.dev);
276 struct intel_panel *panel = &connector->panel;
277
278 drm_dbg_kms(&i915->drm, "set backlight level = %d\n", level);
279
280 panel->backlight.funcs->set(conn_state, level);
281 }
282
283 /* set backlight brightness to level in range [0..max], assuming hw min is
284 * respected.
285 */
intel_panel_set_backlight_acpi(const struct drm_connector_state * conn_state,u32 user_level,u32 user_max)286 void intel_panel_set_backlight_acpi(const struct drm_connector_state *conn_state,
287 u32 user_level, u32 user_max)
288 {
289 struct intel_connector *connector = to_intel_connector(conn_state->connector);
290 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
291 struct intel_panel *panel = &connector->panel;
292 u32 hw_level;
293
294 /*
295 * Lack of crtc may occur during driver init because
296 * connection_mutex isn't held across the entire backlight
297 * setup + modeset readout, and the BIOS can issue the
298 * requests at any time.
299 */
300 if (!panel->backlight.present || !conn_state->crtc)
301 return;
302
303 mutex_lock(&dev_priv->backlight_lock);
304
305 drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0);
306
307 hw_level = clamp_user_to_hw(connector, user_level, user_max);
308 panel->backlight.level = hw_level;
309
310 if (panel->backlight.device)
311 panel->backlight.device->props.brightness =
312 scale_hw_to_user(connector,
313 panel->backlight.level,
314 panel->backlight.device->props.max_brightness);
315
316 if (panel->backlight.enabled)
317 intel_panel_actually_set_backlight(conn_state, hw_level);
318
319 mutex_unlock(&dev_priv->backlight_lock);
320 }
321
lpt_disable_backlight(const struct drm_connector_state * old_conn_state,u32 level)322 static void lpt_disable_backlight(const struct drm_connector_state *old_conn_state, u32 level)
323 {
324 struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
325 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
326 u32 tmp;
327
328 intel_panel_set_pwm_level(old_conn_state, level);
329
330 /*
331 * Although we don't support or enable CPU PWM with LPT/SPT based
332 * systems, it may have been enabled prior to loading the
333 * driver. Disable to avoid warnings on LCPLL disable.
334 *
335 * This needs rework if we need to add support for CPU PWM on PCH split
336 * platforms.
337 */
338 tmp = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
339 if (tmp & BLM_PWM_ENABLE) {
340 drm_dbg_kms(&dev_priv->drm,
341 "cpu backlight was enabled, disabling\n");
342 intel_de_write(dev_priv, BLC_PWM_CPU_CTL2,
343 tmp & ~BLM_PWM_ENABLE);
344 }
345
346 tmp = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
347 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, tmp & ~BLM_PCH_PWM_ENABLE);
348 }
349
pch_disable_backlight(const struct drm_connector_state * old_conn_state,u32 val)350 static void pch_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
351 {
352 struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
353 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
354 u32 tmp;
355
356 intel_panel_set_pwm_level(old_conn_state, val);
357
358 tmp = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
359 intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, tmp & ~BLM_PWM_ENABLE);
360
361 tmp = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
362 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, tmp & ~BLM_PCH_PWM_ENABLE);
363 }
364
i9xx_disable_backlight(const struct drm_connector_state * old_conn_state,u32 val)365 static void i9xx_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
366 {
367 intel_panel_set_pwm_level(old_conn_state, val);
368 }
369
i965_disable_backlight(const struct drm_connector_state * old_conn_state,u32 val)370 static void i965_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
371 {
372 struct drm_i915_private *dev_priv = to_i915(old_conn_state->connector->dev);
373 u32 tmp;
374
375 intel_panel_set_pwm_level(old_conn_state, val);
376
377 tmp = intel_de_read(dev_priv, BLC_PWM_CTL2);
378 intel_de_write(dev_priv, BLC_PWM_CTL2, tmp & ~BLM_PWM_ENABLE);
379 }
380
vlv_disable_backlight(const struct drm_connector_state * old_conn_state,u32 val)381 static void vlv_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
382 {
383 struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
384 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
385 enum pipe pipe = to_intel_crtc(old_conn_state->crtc)->pipe;
386 u32 tmp;
387
388 intel_panel_set_pwm_level(old_conn_state, val);
389
390 tmp = intel_de_read(dev_priv, VLV_BLC_PWM_CTL2(pipe));
391 intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe),
392 tmp & ~BLM_PWM_ENABLE);
393 }
394
bxt_disable_backlight(const struct drm_connector_state * old_conn_state,u32 val)395 static void bxt_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
396 {
397 struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
398 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
399 struct intel_panel *panel = &connector->panel;
400 u32 tmp;
401
402 intel_panel_set_pwm_level(old_conn_state, val);
403
404 tmp = intel_de_read(dev_priv,
405 BXT_BLC_PWM_CTL(panel->backlight.controller));
406 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
407 tmp & ~BXT_BLC_PWM_ENABLE);
408
409 if (panel->backlight.controller == 1) {
410 val = intel_de_read(dev_priv, UTIL_PIN_CTL);
411 val &= ~UTIL_PIN_ENABLE;
412 intel_de_write(dev_priv, UTIL_PIN_CTL, val);
413 }
414 }
415
cnp_disable_backlight(const struct drm_connector_state * old_conn_state,u32 val)416 static void cnp_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
417 {
418 struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
419 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
420 struct intel_panel *panel = &connector->panel;
421 u32 tmp;
422
423 intel_panel_set_pwm_level(old_conn_state, val);
424
425 tmp = intel_de_read(dev_priv,
426 BXT_BLC_PWM_CTL(panel->backlight.controller));
427 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
428 tmp & ~BXT_BLC_PWM_ENABLE);
429 }
430
ext_pwm_disable_backlight(const struct drm_connector_state * old_conn_state,u32 level)431 static void ext_pwm_disable_backlight(const struct drm_connector_state *old_conn_state, u32 level)
432 {
433 struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
434 struct intel_panel *panel = &connector->panel;
435
436 panel->backlight.pwm_state.enabled = false;
437 pwm_apply_state(panel->backlight.pwm, &panel->backlight.pwm_state);
438 }
439
intel_panel_disable_backlight(const struct drm_connector_state * old_conn_state)440 void intel_panel_disable_backlight(const struct drm_connector_state *old_conn_state)
441 {
442 struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
443 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
444 struct intel_panel *panel = &connector->panel;
445
446 if (!panel->backlight.present)
447 return;
448
449 /*
450 * Do not disable backlight on the vga_switcheroo path. When switching
451 * away from i915, the other client may depend on i915 to handle the
452 * backlight. This will leave the backlight on unnecessarily when
453 * another client is not activated.
454 */
455 if (dev_priv->drm.switch_power_state == DRM_SWITCH_POWER_CHANGING) {
456 drm_dbg_kms(&dev_priv->drm,
457 "Skipping backlight disable on vga switch\n");
458 return;
459 }
460
461 mutex_lock(&dev_priv->backlight_lock);
462
463 if (panel->backlight.device)
464 panel->backlight.device->props.power = FB_BLANK_POWERDOWN;
465 panel->backlight.enabled = false;
466 panel->backlight.funcs->disable(old_conn_state, 0);
467
468 mutex_unlock(&dev_priv->backlight_lock);
469 }
470
lpt_enable_backlight(const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state,u32 level)471 static void lpt_enable_backlight(const struct intel_crtc_state *crtc_state,
472 const struct drm_connector_state *conn_state, u32 level)
473 {
474 struct intel_connector *connector = to_intel_connector(conn_state->connector);
475 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
476 struct intel_panel *panel = &connector->panel;
477 u32 pch_ctl1, pch_ctl2, schicken;
478
479 pch_ctl1 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
480 if (pch_ctl1 & BLM_PCH_PWM_ENABLE) {
481 drm_dbg_kms(&dev_priv->drm, "pch backlight already enabled\n");
482 pch_ctl1 &= ~BLM_PCH_PWM_ENABLE;
483 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, pch_ctl1);
484 }
485
486 if (HAS_PCH_LPT(dev_priv)) {
487 schicken = intel_de_read(dev_priv, SOUTH_CHICKEN2);
488 if (panel->backlight.alternate_pwm_increment)
489 schicken |= LPT_PWM_GRANULARITY;
490 else
491 schicken &= ~LPT_PWM_GRANULARITY;
492 intel_de_write(dev_priv, SOUTH_CHICKEN2, schicken);
493 } else {
494 schicken = intel_de_read(dev_priv, SOUTH_CHICKEN1);
495 if (panel->backlight.alternate_pwm_increment)
496 schicken |= SPT_PWM_GRANULARITY;
497 else
498 schicken &= ~SPT_PWM_GRANULARITY;
499 intel_de_write(dev_priv, SOUTH_CHICKEN1, schicken);
500 }
501
502 pch_ctl2 = panel->backlight.pwm_level_max << 16;
503 intel_de_write(dev_priv, BLC_PWM_PCH_CTL2, pch_ctl2);
504
505 pch_ctl1 = 0;
506 if (panel->backlight.active_low_pwm)
507 pch_ctl1 |= BLM_PCH_POLARITY;
508
509 /* After LPT, override is the default. */
510 if (HAS_PCH_LPT(dev_priv))
511 pch_ctl1 |= BLM_PCH_OVERRIDE_ENABLE;
512
513 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, pch_ctl1);
514 intel_de_posting_read(dev_priv, BLC_PWM_PCH_CTL1);
515 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1,
516 pch_ctl1 | BLM_PCH_PWM_ENABLE);
517
518 /* This won't stick until the above enable. */
519 intel_panel_set_pwm_level(conn_state, level);
520 }
521
pch_enable_backlight(const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state,u32 level)522 static void pch_enable_backlight(const struct intel_crtc_state *crtc_state,
523 const struct drm_connector_state *conn_state, u32 level)
524 {
525 struct intel_connector *connector = to_intel_connector(conn_state->connector);
526 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
527 struct intel_panel *panel = &connector->panel;
528 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
529 u32 cpu_ctl2, pch_ctl1, pch_ctl2;
530
531 cpu_ctl2 = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
532 if (cpu_ctl2 & BLM_PWM_ENABLE) {
533 drm_dbg_kms(&dev_priv->drm, "cpu backlight already enabled\n");
534 cpu_ctl2 &= ~BLM_PWM_ENABLE;
535 intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, cpu_ctl2);
536 }
537
538 pch_ctl1 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
539 if (pch_ctl1 & BLM_PCH_PWM_ENABLE) {
540 drm_dbg_kms(&dev_priv->drm, "pch backlight already enabled\n");
541 pch_ctl1 &= ~BLM_PCH_PWM_ENABLE;
542 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, pch_ctl1);
543 }
544
545 if (cpu_transcoder == TRANSCODER_EDP)
546 cpu_ctl2 = BLM_TRANSCODER_EDP;
547 else
548 cpu_ctl2 = BLM_PIPE(cpu_transcoder);
549 intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, cpu_ctl2);
550 intel_de_posting_read(dev_priv, BLC_PWM_CPU_CTL2);
551 intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, cpu_ctl2 | BLM_PWM_ENABLE);
552
553 /* This won't stick until the above enable. */
554 intel_panel_set_pwm_level(conn_state, level);
555
556 pch_ctl2 = panel->backlight.pwm_level_max << 16;
557 intel_de_write(dev_priv, BLC_PWM_PCH_CTL2, pch_ctl2);
558
559 pch_ctl1 = 0;
560 if (panel->backlight.active_low_pwm)
561 pch_ctl1 |= BLM_PCH_POLARITY;
562
563 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, pch_ctl1);
564 intel_de_posting_read(dev_priv, BLC_PWM_PCH_CTL1);
565 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1,
566 pch_ctl1 | BLM_PCH_PWM_ENABLE);
567 }
568
i9xx_enable_backlight(const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state,u32 level)569 static void i9xx_enable_backlight(const struct intel_crtc_state *crtc_state,
570 const struct drm_connector_state *conn_state, u32 level)
571 {
572 struct intel_connector *connector = to_intel_connector(conn_state->connector);
573 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
574 struct intel_panel *panel = &connector->panel;
575 u32 ctl, freq;
576
577 ctl = intel_de_read(dev_priv, BLC_PWM_CTL);
578 if (ctl & BACKLIGHT_DUTY_CYCLE_MASK_PNV) {
579 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
580 intel_de_write(dev_priv, BLC_PWM_CTL, 0);
581 }
582
583 freq = panel->backlight.pwm_level_max;
584 if (panel->backlight.combination_mode)
585 freq /= 0xff;
586
587 ctl = freq << 17;
588 if (panel->backlight.combination_mode)
589 ctl |= BLM_LEGACY_MODE;
590 if (IS_PINEVIEW(dev_priv) && panel->backlight.active_low_pwm)
591 ctl |= BLM_POLARITY_PNV;
592
593 intel_de_write(dev_priv, BLC_PWM_CTL, ctl);
594 intel_de_posting_read(dev_priv, BLC_PWM_CTL);
595
596 /* XXX: combine this into above write? */
597 intel_panel_set_pwm_level(conn_state, level);
598
599 /*
600 * Needed to enable backlight on some 855gm models. BLC_HIST_CTL is
601 * 855gm only, but checking for gen2 is safe, as 855gm is the only gen2
602 * that has backlight.
603 */
604 if (DISPLAY_VER(dev_priv) == 2)
605 intel_de_write(dev_priv, BLC_HIST_CTL, BLM_HISTOGRAM_ENABLE);
606 }
607
i965_enable_backlight(const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state,u32 level)608 static void i965_enable_backlight(const struct intel_crtc_state *crtc_state,
609 const struct drm_connector_state *conn_state, u32 level)
610 {
611 struct intel_connector *connector = to_intel_connector(conn_state->connector);
612 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
613 struct intel_panel *panel = &connector->panel;
614 enum pipe pipe = to_intel_crtc(conn_state->crtc)->pipe;
615 u32 ctl, ctl2, freq;
616
617 ctl2 = intel_de_read(dev_priv, BLC_PWM_CTL2);
618 if (ctl2 & BLM_PWM_ENABLE) {
619 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
620 ctl2 &= ~BLM_PWM_ENABLE;
621 intel_de_write(dev_priv, BLC_PWM_CTL2, ctl2);
622 }
623
624 freq = panel->backlight.pwm_level_max;
625 if (panel->backlight.combination_mode)
626 freq /= 0xff;
627
628 ctl = freq << 16;
629 intel_de_write(dev_priv, BLC_PWM_CTL, ctl);
630
631 ctl2 = BLM_PIPE(pipe);
632 if (panel->backlight.combination_mode)
633 ctl2 |= BLM_COMBINATION_MODE;
634 if (panel->backlight.active_low_pwm)
635 ctl2 |= BLM_POLARITY_I965;
636 intel_de_write(dev_priv, BLC_PWM_CTL2, ctl2);
637 intel_de_posting_read(dev_priv, BLC_PWM_CTL2);
638 intel_de_write(dev_priv, BLC_PWM_CTL2, ctl2 | BLM_PWM_ENABLE);
639
640 intel_panel_set_pwm_level(conn_state, level);
641 }
642
vlv_enable_backlight(const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state,u32 level)643 static void vlv_enable_backlight(const struct intel_crtc_state *crtc_state,
644 const struct drm_connector_state *conn_state, u32 level)
645 {
646 struct intel_connector *connector = to_intel_connector(conn_state->connector);
647 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
648 struct intel_panel *panel = &connector->panel;
649 enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe;
650 u32 ctl, ctl2;
651
652 ctl2 = intel_de_read(dev_priv, VLV_BLC_PWM_CTL2(pipe));
653 if (ctl2 & BLM_PWM_ENABLE) {
654 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
655 ctl2 &= ~BLM_PWM_ENABLE;
656 intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe), ctl2);
657 }
658
659 ctl = panel->backlight.pwm_level_max << 16;
660 intel_de_write(dev_priv, VLV_BLC_PWM_CTL(pipe), ctl);
661
662 /* XXX: combine this into above write? */
663 intel_panel_set_pwm_level(conn_state, level);
664
665 ctl2 = 0;
666 if (panel->backlight.active_low_pwm)
667 ctl2 |= BLM_POLARITY_I965;
668 intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe), ctl2);
669 intel_de_posting_read(dev_priv, VLV_BLC_PWM_CTL2(pipe));
670 intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe),
671 ctl2 | BLM_PWM_ENABLE);
672 }
673
bxt_enable_backlight(const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state,u32 level)674 static void bxt_enable_backlight(const struct intel_crtc_state *crtc_state,
675 const struct drm_connector_state *conn_state, u32 level)
676 {
677 struct intel_connector *connector = to_intel_connector(conn_state->connector);
678 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
679 struct intel_panel *panel = &connector->panel;
680 enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe;
681 u32 pwm_ctl, val;
682
683 /* Controller 1 uses the utility pin. */
684 if (panel->backlight.controller == 1) {
685 val = intel_de_read(dev_priv, UTIL_PIN_CTL);
686 if (val & UTIL_PIN_ENABLE) {
687 drm_dbg_kms(&dev_priv->drm,
688 "util pin already enabled\n");
689 val &= ~UTIL_PIN_ENABLE;
690 intel_de_write(dev_priv, UTIL_PIN_CTL, val);
691 }
692
693 val = 0;
694 if (panel->backlight.util_pin_active_low)
695 val |= UTIL_PIN_POLARITY;
696 intel_de_write(dev_priv, UTIL_PIN_CTL,
697 val | UTIL_PIN_PIPE(pipe) | UTIL_PIN_MODE_PWM | UTIL_PIN_ENABLE);
698 }
699
700 pwm_ctl = intel_de_read(dev_priv,
701 BXT_BLC_PWM_CTL(panel->backlight.controller));
702 if (pwm_ctl & BXT_BLC_PWM_ENABLE) {
703 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
704 pwm_ctl &= ~BXT_BLC_PWM_ENABLE;
705 intel_de_write(dev_priv,
706 BXT_BLC_PWM_CTL(panel->backlight.controller),
707 pwm_ctl);
708 }
709
710 intel_de_write(dev_priv,
711 BXT_BLC_PWM_FREQ(panel->backlight.controller),
712 panel->backlight.pwm_level_max);
713
714 intel_panel_set_pwm_level(conn_state, level);
715
716 pwm_ctl = 0;
717 if (panel->backlight.active_low_pwm)
718 pwm_ctl |= BXT_BLC_PWM_POLARITY;
719
720 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
721 pwm_ctl);
722 intel_de_posting_read(dev_priv,
723 BXT_BLC_PWM_CTL(panel->backlight.controller));
724 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
725 pwm_ctl | BXT_BLC_PWM_ENABLE);
726 }
727
cnp_enable_backlight(const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state,u32 level)728 static void cnp_enable_backlight(const struct intel_crtc_state *crtc_state,
729 const struct drm_connector_state *conn_state, u32 level)
730 {
731 struct intel_connector *connector = to_intel_connector(conn_state->connector);
732 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
733 struct intel_panel *panel = &connector->panel;
734 u32 pwm_ctl;
735
736 pwm_ctl = intel_de_read(dev_priv,
737 BXT_BLC_PWM_CTL(panel->backlight.controller));
738 if (pwm_ctl & BXT_BLC_PWM_ENABLE) {
739 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
740 pwm_ctl &= ~BXT_BLC_PWM_ENABLE;
741 intel_de_write(dev_priv,
742 BXT_BLC_PWM_CTL(panel->backlight.controller),
743 pwm_ctl);
744 }
745
746 intel_de_write(dev_priv,
747 BXT_BLC_PWM_FREQ(panel->backlight.controller),
748 panel->backlight.pwm_level_max);
749
750 intel_panel_set_pwm_level(conn_state, level);
751
752 pwm_ctl = 0;
753 if (panel->backlight.active_low_pwm)
754 pwm_ctl |= BXT_BLC_PWM_POLARITY;
755
756 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
757 pwm_ctl);
758 intel_de_posting_read(dev_priv,
759 BXT_BLC_PWM_CTL(panel->backlight.controller));
760 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
761 pwm_ctl | BXT_BLC_PWM_ENABLE);
762 }
763
ext_pwm_enable_backlight(const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state,u32 level)764 static void ext_pwm_enable_backlight(const struct intel_crtc_state *crtc_state,
765 const struct drm_connector_state *conn_state, u32 level)
766 {
767 struct intel_connector *connector = to_intel_connector(conn_state->connector);
768 struct intel_panel *panel = &connector->panel;
769
770 pwm_set_relative_duty_cycle(&panel->backlight.pwm_state, level, 100);
771 panel->backlight.pwm_state.enabled = true;
772 pwm_apply_state(panel->backlight.pwm, &panel->backlight.pwm_state);
773 }
774
__intel_panel_enable_backlight(const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state)775 static void __intel_panel_enable_backlight(const struct intel_crtc_state *crtc_state,
776 const struct drm_connector_state *conn_state)
777 {
778 struct intel_connector *connector = to_intel_connector(conn_state->connector);
779 struct intel_panel *panel = &connector->panel;
780
781 WARN_ON(panel->backlight.max == 0);
782
783 if (panel->backlight.level <= panel->backlight.min) {
784 panel->backlight.level = panel->backlight.max;
785 if (panel->backlight.device)
786 panel->backlight.device->props.brightness =
787 scale_hw_to_user(connector,
788 panel->backlight.level,
789 panel->backlight.device->props.max_brightness);
790 }
791
792 panel->backlight.funcs->enable(crtc_state, conn_state, panel->backlight.level);
793 panel->backlight.enabled = true;
794 if (panel->backlight.device)
795 panel->backlight.device->props.power = FB_BLANK_UNBLANK;
796 }
797
intel_panel_enable_backlight(const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state)798 void intel_panel_enable_backlight(const struct intel_crtc_state *crtc_state,
799 const struct drm_connector_state *conn_state)
800 {
801 struct intel_connector *connector = to_intel_connector(conn_state->connector);
802 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
803 struct intel_panel *panel = &connector->panel;
804 enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe;
805
806 if (!panel->backlight.present)
807 return;
808
809 drm_dbg_kms(&dev_priv->drm, "pipe %c\n", pipe_name(pipe));
810
811 mutex_lock(&dev_priv->backlight_lock);
812
813 __intel_panel_enable_backlight(crtc_state, conn_state);
814
815 mutex_unlock(&dev_priv->backlight_lock);
816 }
817
818 #if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE)
intel_panel_get_backlight(struct intel_connector * connector)819 static u32 intel_panel_get_backlight(struct intel_connector *connector)
820 {
821 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
822 struct intel_panel *panel = &connector->panel;
823 u32 val = 0;
824
825 mutex_lock(&dev_priv->backlight_lock);
826
827 if (panel->backlight.enabled)
828 val = panel->backlight.funcs->get(connector, intel_connector_get_pipe(connector));
829
830 mutex_unlock(&dev_priv->backlight_lock);
831
832 drm_dbg_kms(&dev_priv->drm, "get backlight PWM = %d\n", val);
833 return val;
834 }
835
836 /* Scale user_level in range [0..user_max] to [hw_min..hw_max]. */
scale_user_to_hw(struct intel_connector * connector,u32 user_level,u32 user_max)837 static u32 scale_user_to_hw(struct intel_connector *connector,
838 u32 user_level, u32 user_max)
839 {
840 struct intel_panel *panel = &connector->panel;
841
842 return scale(user_level, 0, user_max,
843 panel->backlight.min, panel->backlight.max);
844 }
845
846 /* set backlight brightness to level in range [0..max], scaling wrt hw min */
intel_panel_set_backlight(const struct drm_connector_state * conn_state,u32 user_level,u32 user_max)847 static void intel_panel_set_backlight(const struct drm_connector_state *conn_state,
848 u32 user_level, u32 user_max)
849 {
850 struct intel_connector *connector = to_intel_connector(conn_state->connector);
851 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
852 struct intel_panel *panel = &connector->panel;
853 u32 hw_level;
854
855 if (!panel->backlight.present)
856 return;
857
858 mutex_lock(&dev_priv->backlight_lock);
859
860 drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0);
861
862 hw_level = scale_user_to_hw(connector, user_level, user_max);
863 panel->backlight.level = hw_level;
864
865 if (panel->backlight.enabled)
866 intel_panel_actually_set_backlight(conn_state, hw_level);
867
868 mutex_unlock(&dev_priv->backlight_lock);
869 }
870
intel_backlight_device_update_status(struct backlight_device * bd)871 static int intel_backlight_device_update_status(struct backlight_device *bd)
872 {
873 struct intel_connector *connector = bl_get_data(bd);
874 struct intel_panel *panel = &connector->panel;
875 struct drm_device *dev = connector->base.dev;
876
877 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
878 DRM_DEBUG_KMS("updating intel_backlight, brightness=%d/%d\n",
879 bd->props.brightness, bd->props.max_brightness);
880 intel_panel_set_backlight(connector->base.state, bd->props.brightness,
881 bd->props.max_brightness);
882
883 /*
884 * Allow flipping bl_power as a sub-state of enabled. Sadly the
885 * backlight class device does not make it easy to differentiate
886 * between callbacks for brightness and bl_power, so our backlight_power
887 * callback needs to take this into account.
888 */
889 if (panel->backlight.enabled) {
890 if (panel->backlight.power) {
891 bool enable = bd->props.power == FB_BLANK_UNBLANK &&
892 bd->props.brightness != 0;
893 panel->backlight.power(connector, enable);
894 }
895 } else {
896 bd->props.power = FB_BLANK_POWERDOWN;
897 }
898
899 drm_modeset_unlock(&dev->mode_config.connection_mutex);
900 return 0;
901 }
902
intel_backlight_device_get_brightness(struct backlight_device * bd)903 static int intel_backlight_device_get_brightness(struct backlight_device *bd)
904 {
905 struct intel_connector *connector = bl_get_data(bd);
906 struct drm_device *dev = connector->base.dev;
907 struct drm_i915_private *dev_priv = to_i915(dev);
908 intel_wakeref_t wakeref;
909 int ret = 0;
910
911 with_intel_runtime_pm(&dev_priv->runtime_pm, wakeref) {
912 u32 hw_level;
913
914 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
915
916 hw_level = intel_panel_get_backlight(connector);
917 ret = scale_hw_to_user(connector,
918 hw_level, bd->props.max_brightness);
919
920 drm_modeset_unlock(&dev->mode_config.connection_mutex);
921 }
922
923 return ret;
924 }
925
926 static const struct backlight_ops intel_backlight_device_ops = {
927 .update_status = intel_backlight_device_update_status,
928 .get_brightness = intel_backlight_device_get_brightness,
929 };
930
intel_backlight_device_register(struct intel_connector * connector)931 int intel_backlight_device_register(struct intel_connector *connector)
932 {
933 struct drm_i915_private *i915 = to_i915(connector->base.dev);
934 struct intel_panel *panel = &connector->panel;
935 struct backlight_properties props;
936 struct backlight_device *bd;
937 const char *name;
938 int ret = 0;
939
940 if (WARN_ON(panel->backlight.device))
941 return -ENODEV;
942
943 if (!panel->backlight.present)
944 return 0;
945
946 WARN_ON(panel->backlight.max == 0);
947
948 memset(&props, 0, sizeof(props));
949 props.type = BACKLIGHT_RAW;
950
951 /*
952 * Note: Everything should work even if the backlight device max
953 * presented to the userspace is arbitrarily chosen.
954 */
955 props.max_brightness = panel->backlight.max;
956 props.brightness = scale_hw_to_user(connector,
957 panel->backlight.level,
958 props.max_brightness);
959
960 if (panel->backlight.enabled)
961 props.power = FB_BLANK_UNBLANK;
962 else
963 props.power = FB_BLANK_POWERDOWN;
964
965 name = kstrdup("intel_backlight", GFP_KERNEL);
966 if (!name)
967 return -ENOMEM;
968
969 bd = backlight_device_get_by_name(name);
970 if (bd) {
971 put_device(&bd->dev);
972 /*
973 * Using the same name independent of the drm device or connector
974 * prevents registration of multiple backlight devices in the
975 * driver. However, we need to use the default name for backward
976 * compatibility. Use unique names for subsequent backlight devices as a
977 * fallback when the default name already exists.
978 */
979 kfree(name);
980 name = kasprintf(GFP_KERNEL, "card%d-%s-backlight",
981 i915->drm.primary->index, connector->base.name);
982 if (!name)
983 return -ENOMEM;
984 }
985 bd = backlight_device_register(name, connector->base.kdev, connector,
986 &intel_backlight_device_ops, &props);
987
988 if (IS_ERR(bd)) {
989 drm_err(&i915->drm,
990 "[CONNECTOR:%d:%s] backlight device %s register failed: %ld\n",
991 connector->base.base.id, connector->base.name, name, PTR_ERR(bd));
992 ret = PTR_ERR(bd);
993 goto out;
994 }
995
996 panel->backlight.device = bd;
997
998 drm_dbg_kms(&i915->drm,
999 "[CONNECTOR:%d:%s] backlight device %s registered\n",
1000 connector->base.base.id, connector->base.name, name);
1001
1002 out:
1003 kfree(name);
1004
1005 return ret;
1006 }
1007
intel_backlight_device_unregister(struct intel_connector * connector)1008 void intel_backlight_device_unregister(struct intel_connector *connector)
1009 {
1010 struct intel_panel *panel = &connector->panel;
1011
1012 if (panel->backlight.device) {
1013 backlight_device_unregister(panel->backlight.device);
1014 panel->backlight.device = NULL;
1015 }
1016 }
1017 #endif /* CONFIG_BACKLIGHT_CLASS_DEVICE */
1018
1019 /*
1020 * CNP: PWM clock frequency is 19.2 MHz or 24 MHz.
1021 * PWM increment = 1
1022 */
cnp_hz_to_pwm(struct intel_connector * connector,u32 pwm_freq_hz)1023 static u32 cnp_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1024 {
1025 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1026
1027 return DIV_ROUND_CLOSEST(KHz(RUNTIME_INFO(dev_priv)->rawclk_freq),
1028 pwm_freq_hz);
1029 }
1030
1031 /*
1032 * BXT: PWM clock frequency = 19.2 MHz.
1033 */
bxt_hz_to_pwm(struct intel_connector * connector,u32 pwm_freq_hz)1034 static u32 bxt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1035 {
1036 return DIV_ROUND_CLOSEST(KHz(19200), pwm_freq_hz);
1037 }
1038
1039 /*
1040 * SPT: This value represents the period of the PWM stream in clock periods
1041 * multiplied by 16 (default increment) or 128 (alternate increment selected in
1042 * SCHICKEN_1 bit 0). PWM clock is 24 MHz.
1043 */
spt_hz_to_pwm(struct intel_connector * connector,u32 pwm_freq_hz)1044 static u32 spt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1045 {
1046 struct intel_panel *panel = &connector->panel;
1047 u32 mul;
1048
1049 if (panel->backlight.alternate_pwm_increment)
1050 mul = 128;
1051 else
1052 mul = 16;
1053
1054 return DIV_ROUND_CLOSEST(MHz(24), pwm_freq_hz * mul);
1055 }
1056
1057 /*
1058 * LPT: This value represents the period of the PWM stream in clock periods
1059 * multiplied by 128 (default increment) or 16 (alternate increment, selected in
1060 * LPT SOUTH_CHICKEN2 register bit 5).
1061 */
lpt_hz_to_pwm(struct intel_connector * connector,u32 pwm_freq_hz)1062 static u32 lpt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1063 {
1064 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1065 struct intel_panel *panel = &connector->panel;
1066 u32 mul, clock;
1067
1068 if (panel->backlight.alternate_pwm_increment)
1069 mul = 16;
1070 else
1071 mul = 128;
1072
1073 if (HAS_PCH_LPT_H(dev_priv))
1074 clock = MHz(135); /* LPT:H */
1075 else
1076 clock = MHz(24); /* LPT:LP */
1077
1078 return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * mul);
1079 }
1080
1081 /*
1082 * ILK/SNB/IVB: This value represents the period of the PWM stream in PCH
1083 * display raw clocks multiplied by 128.
1084 */
pch_hz_to_pwm(struct intel_connector * connector,u32 pwm_freq_hz)1085 static u32 pch_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1086 {
1087 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1088
1089 return DIV_ROUND_CLOSEST(KHz(RUNTIME_INFO(dev_priv)->rawclk_freq),
1090 pwm_freq_hz * 128);
1091 }
1092
1093 /*
1094 * Gen2: This field determines the number of time base events (display core
1095 * clock frequency/32) in total for a complete cycle of modulated backlight
1096 * control.
1097 *
1098 * Gen3: A time base event equals the display core clock ([DevPNV] HRAW clock)
1099 * divided by 32.
1100 */
i9xx_hz_to_pwm(struct intel_connector * connector,u32 pwm_freq_hz)1101 static u32 i9xx_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1102 {
1103 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1104 int clock;
1105
1106 if (IS_PINEVIEW(dev_priv))
1107 clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq);
1108 else
1109 clock = KHz(dev_priv->cdclk.hw.cdclk);
1110
1111 return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * 32);
1112 }
1113
1114 /*
1115 * Gen4: This value represents the period of the PWM stream in display core
1116 * clocks ([DevCTG] HRAW clocks) multiplied by 128.
1117 *
1118 */
i965_hz_to_pwm(struct intel_connector * connector,u32 pwm_freq_hz)1119 static u32 i965_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1120 {
1121 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1122 int clock;
1123
1124 if (IS_G4X(dev_priv))
1125 clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq);
1126 else
1127 clock = KHz(dev_priv->cdclk.hw.cdclk);
1128
1129 return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * 128);
1130 }
1131
1132 /*
1133 * VLV: This value represents the period of the PWM stream in display core
1134 * clocks ([DevCTG] 200MHz HRAW clocks) multiplied by 128 or 25MHz S0IX clocks
1135 * multiplied by 16. CHV uses a 19.2MHz S0IX clock.
1136 */
vlv_hz_to_pwm(struct intel_connector * connector,u32 pwm_freq_hz)1137 static u32 vlv_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1138 {
1139 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1140 int mul, clock;
1141
1142 if ((intel_de_read(dev_priv, CBR1_VLV) & CBR_PWM_CLOCK_MUX_SELECT) == 0) {
1143 if (IS_CHERRYVIEW(dev_priv))
1144 clock = KHz(19200);
1145 else
1146 clock = MHz(25);
1147 mul = 16;
1148 } else {
1149 clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq);
1150 mul = 128;
1151 }
1152
1153 return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * mul);
1154 }
1155
get_vbt_pwm_freq(struct drm_i915_private * dev_priv)1156 static u16 get_vbt_pwm_freq(struct drm_i915_private *dev_priv)
1157 {
1158 u16 pwm_freq_hz = dev_priv->vbt.backlight.pwm_freq_hz;
1159
1160 if (pwm_freq_hz) {
1161 drm_dbg_kms(&dev_priv->drm,
1162 "VBT defined backlight frequency %u Hz\n",
1163 pwm_freq_hz);
1164 } else {
1165 pwm_freq_hz = 200;
1166 drm_dbg_kms(&dev_priv->drm,
1167 "default backlight frequency %u Hz\n",
1168 pwm_freq_hz);
1169 }
1170
1171 return pwm_freq_hz;
1172 }
1173
get_backlight_max_vbt(struct intel_connector * connector)1174 static u32 get_backlight_max_vbt(struct intel_connector *connector)
1175 {
1176 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1177 struct intel_panel *panel = &connector->panel;
1178 u16 pwm_freq_hz = get_vbt_pwm_freq(dev_priv);
1179 u32 pwm;
1180
1181 if (!panel->backlight.pwm_funcs->hz_to_pwm) {
1182 drm_dbg_kms(&dev_priv->drm,
1183 "backlight frequency conversion not supported\n");
1184 return 0;
1185 }
1186
1187 pwm = panel->backlight.pwm_funcs->hz_to_pwm(connector, pwm_freq_hz);
1188 if (!pwm) {
1189 drm_dbg_kms(&dev_priv->drm,
1190 "backlight frequency conversion failed\n");
1191 return 0;
1192 }
1193
1194 return pwm;
1195 }
1196
1197 /*
1198 * Note: The setup hooks can't assume pipe is set!
1199 */
get_backlight_min_vbt(struct intel_connector * connector)1200 static u32 get_backlight_min_vbt(struct intel_connector *connector)
1201 {
1202 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1203 struct intel_panel *panel = &connector->panel;
1204 int min;
1205
1206 drm_WARN_ON(&dev_priv->drm, panel->backlight.pwm_level_max == 0);
1207
1208 /*
1209 * XXX: If the vbt value is 255, it makes min equal to max, which leads
1210 * to problems. There are such machines out there. Either our
1211 * interpretation is wrong or the vbt has bogus data. Or both. Safeguard
1212 * against this by letting the minimum be at most (arbitrarily chosen)
1213 * 25% of the max.
1214 */
1215 min = clamp_t(int, dev_priv->vbt.backlight.min_brightness, 0, 64);
1216 if (min != dev_priv->vbt.backlight.min_brightness) {
1217 drm_dbg_kms(&dev_priv->drm,
1218 "clamping VBT min backlight %d/255 to %d/255\n",
1219 dev_priv->vbt.backlight.min_brightness, min);
1220 }
1221
1222 /* vbt value is a coefficient in range [0..255] */
1223 return scale(min, 0, 255, 0, panel->backlight.pwm_level_max);
1224 }
1225
lpt_setup_backlight(struct intel_connector * connector,enum pipe unused)1226 static int lpt_setup_backlight(struct intel_connector *connector, enum pipe unused)
1227 {
1228 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1229 struct intel_panel *panel = &connector->panel;
1230 u32 cpu_ctl2, pch_ctl1, pch_ctl2, val;
1231 bool alt, cpu_mode;
1232
1233 if (HAS_PCH_LPT(dev_priv))
1234 alt = intel_de_read(dev_priv, SOUTH_CHICKEN2) & LPT_PWM_GRANULARITY;
1235 else
1236 alt = intel_de_read(dev_priv, SOUTH_CHICKEN1) & SPT_PWM_GRANULARITY;
1237 panel->backlight.alternate_pwm_increment = alt;
1238
1239 pch_ctl1 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
1240 panel->backlight.active_low_pwm = pch_ctl1 & BLM_PCH_POLARITY;
1241
1242 pch_ctl2 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL2);
1243 panel->backlight.pwm_level_max = pch_ctl2 >> 16;
1244
1245 cpu_ctl2 = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
1246
1247 if (!panel->backlight.pwm_level_max)
1248 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
1249
1250 if (!panel->backlight.pwm_level_max)
1251 return -ENODEV;
1252
1253 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1254
1255 panel->backlight.pwm_enabled = pch_ctl1 & BLM_PCH_PWM_ENABLE;
1256
1257 cpu_mode = panel->backlight.pwm_enabled && HAS_PCH_LPT(dev_priv) &&
1258 !(pch_ctl1 & BLM_PCH_OVERRIDE_ENABLE) &&
1259 (cpu_ctl2 & BLM_PWM_ENABLE);
1260
1261 if (cpu_mode) {
1262 val = pch_get_backlight(connector, unused);
1263
1264 drm_dbg_kms(&dev_priv->drm,
1265 "CPU backlight register was enabled, switching to PCH override\n");
1266
1267 /* Write converted CPU PWM value to PCH override register */
1268 lpt_set_backlight(connector->base.state, val);
1269 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1,
1270 pch_ctl1 | BLM_PCH_OVERRIDE_ENABLE);
1271
1272 intel_de_write(dev_priv, BLC_PWM_CPU_CTL2,
1273 cpu_ctl2 & ~BLM_PWM_ENABLE);
1274 }
1275
1276 return 0;
1277 }
1278
pch_setup_backlight(struct intel_connector * connector,enum pipe unused)1279 static int pch_setup_backlight(struct intel_connector *connector, enum pipe unused)
1280 {
1281 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1282 struct intel_panel *panel = &connector->panel;
1283 u32 cpu_ctl2, pch_ctl1, pch_ctl2;
1284
1285 pch_ctl1 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
1286 panel->backlight.active_low_pwm = pch_ctl1 & BLM_PCH_POLARITY;
1287
1288 pch_ctl2 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL2);
1289 panel->backlight.pwm_level_max = pch_ctl2 >> 16;
1290
1291 if (!panel->backlight.pwm_level_max)
1292 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
1293
1294 if (!panel->backlight.pwm_level_max)
1295 return -ENODEV;
1296
1297 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1298
1299 cpu_ctl2 = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
1300 panel->backlight.pwm_enabled = (cpu_ctl2 & BLM_PWM_ENABLE) &&
1301 (pch_ctl1 & BLM_PCH_PWM_ENABLE);
1302
1303 return 0;
1304 }
1305
i9xx_setup_backlight(struct intel_connector * connector,enum pipe unused)1306 static int i9xx_setup_backlight(struct intel_connector *connector, enum pipe unused)
1307 {
1308 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1309 struct intel_panel *panel = &connector->panel;
1310 u32 ctl, val;
1311
1312 ctl = intel_de_read(dev_priv, BLC_PWM_CTL);
1313
1314 if (DISPLAY_VER(dev_priv) == 2 || IS_I915GM(dev_priv) || IS_I945GM(dev_priv))
1315 panel->backlight.combination_mode = ctl & BLM_LEGACY_MODE;
1316
1317 if (IS_PINEVIEW(dev_priv))
1318 panel->backlight.active_low_pwm = ctl & BLM_POLARITY_PNV;
1319
1320 panel->backlight.pwm_level_max = ctl >> 17;
1321
1322 if (!panel->backlight.pwm_level_max) {
1323 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
1324 panel->backlight.pwm_level_max >>= 1;
1325 }
1326
1327 if (!panel->backlight.pwm_level_max)
1328 return -ENODEV;
1329
1330 if (panel->backlight.combination_mode)
1331 panel->backlight.pwm_level_max *= 0xff;
1332
1333 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1334
1335 val = i9xx_get_backlight(connector, unused);
1336 val = intel_panel_invert_pwm_level(connector, val);
1337 val = clamp(val, panel->backlight.pwm_level_min, panel->backlight.pwm_level_max);
1338
1339 panel->backlight.pwm_enabled = val != 0;
1340
1341 return 0;
1342 }
1343
i965_setup_backlight(struct intel_connector * connector,enum pipe unused)1344 static int i965_setup_backlight(struct intel_connector *connector, enum pipe unused)
1345 {
1346 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1347 struct intel_panel *panel = &connector->panel;
1348 u32 ctl, ctl2;
1349
1350 ctl2 = intel_de_read(dev_priv, BLC_PWM_CTL2);
1351 panel->backlight.combination_mode = ctl2 & BLM_COMBINATION_MODE;
1352 panel->backlight.active_low_pwm = ctl2 & BLM_POLARITY_I965;
1353
1354 ctl = intel_de_read(dev_priv, BLC_PWM_CTL);
1355 panel->backlight.pwm_level_max = ctl >> 16;
1356
1357 if (!panel->backlight.pwm_level_max)
1358 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
1359
1360 if (!panel->backlight.pwm_level_max)
1361 return -ENODEV;
1362
1363 if (panel->backlight.combination_mode)
1364 panel->backlight.pwm_level_max *= 0xff;
1365
1366 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1367
1368 panel->backlight.pwm_enabled = ctl2 & BLM_PWM_ENABLE;
1369
1370 return 0;
1371 }
1372
vlv_setup_backlight(struct intel_connector * connector,enum pipe pipe)1373 static int vlv_setup_backlight(struct intel_connector *connector, enum pipe pipe)
1374 {
1375 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1376 struct intel_panel *panel = &connector->panel;
1377 u32 ctl, ctl2;
1378
1379 if (drm_WARN_ON(&dev_priv->drm, pipe != PIPE_A && pipe != PIPE_B))
1380 return -ENODEV;
1381
1382 ctl2 = intel_de_read(dev_priv, VLV_BLC_PWM_CTL2(pipe));
1383 panel->backlight.active_low_pwm = ctl2 & BLM_POLARITY_I965;
1384
1385 ctl = intel_de_read(dev_priv, VLV_BLC_PWM_CTL(pipe));
1386 panel->backlight.pwm_level_max = ctl >> 16;
1387
1388 if (!panel->backlight.pwm_level_max)
1389 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
1390
1391 if (!panel->backlight.pwm_level_max)
1392 return -ENODEV;
1393
1394 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1395
1396 panel->backlight.pwm_enabled = ctl2 & BLM_PWM_ENABLE;
1397
1398 return 0;
1399 }
1400
1401 static int
bxt_setup_backlight(struct intel_connector * connector,enum pipe unused)1402 bxt_setup_backlight(struct intel_connector *connector, enum pipe unused)
1403 {
1404 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1405 struct intel_panel *panel = &connector->panel;
1406 u32 pwm_ctl, val;
1407
1408 panel->backlight.controller = dev_priv->vbt.backlight.controller;
1409
1410 pwm_ctl = intel_de_read(dev_priv,
1411 BXT_BLC_PWM_CTL(panel->backlight.controller));
1412
1413 /* Controller 1 uses the utility pin. */
1414 if (panel->backlight.controller == 1) {
1415 val = intel_de_read(dev_priv, UTIL_PIN_CTL);
1416 panel->backlight.util_pin_active_low =
1417 val & UTIL_PIN_POLARITY;
1418 }
1419
1420 panel->backlight.active_low_pwm = pwm_ctl & BXT_BLC_PWM_POLARITY;
1421 panel->backlight.pwm_level_max =
1422 intel_de_read(dev_priv, BXT_BLC_PWM_FREQ(panel->backlight.controller));
1423
1424 if (!panel->backlight.pwm_level_max)
1425 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
1426
1427 if (!panel->backlight.pwm_level_max)
1428 return -ENODEV;
1429
1430 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1431
1432 panel->backlight.pwm_enabled = pwm_ctl & BXT_BLC_PWM_ENABLE;
1433
1434 return 0;
1435 }
1436
1437 static int
cnp_setup_backlight(struct intel_connector * connector,enum pipe unused)1438 cnp_setup_backlight(struct intel_connector *connector, enum pipe unused)
1439 {
1440 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1441 struct intel_panel *panel = &connector->panel;
1442 u32 pwm_ctl;
1443
1444 /*
1445 * CNP has the BXT implementation of backlight, but with only one
1446 * controller. TODO: ICP has multiple controllers but we only use
1447 * controller 0 for now.
1448 */
1449 panel->backlight.controller = 0;
1450
1451 pwm_ctl = intel_de_read(dev_priv,
1452 BXT_BLC_PWM_CTL(panel->backlight.controller));
1453
1454 panel->backlight.active_low_pwm = pwm_ctl & BXT_BLC_PWM_POLARITY;
1455 panel->backlight.pwm_level_max =
1456 intel_de_read(dev_priv, BXT_BLC_PWM_FREQ(panel->backlight.controller));
1457
1458 if (!panel->backlight.pwm_level_max)
1459 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
1460
1461 if (!panel->backlight.pwm_level_max)
1462 return -ENODEV;
1463
1464 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1465
1466 panel->backlight.pwm_enabled = pwm_ctl & BXT_BLC_PWM_ENABLE;
1467
1468 return 0;
1469 }
1470
ext_pwm_setup_backlight(struct intel_connector * connector,enum pipe pipe)1471 static int ext_pwm_setup_backlight(struct intel_connector *connector,
1472 enum pipe pipe)
1473 {
1474 struct drm_device *dev = connector->base.dev;
1475 struct drm_i915_private *dev_priv = to_i915(dev);
1476 struct intel_panel *panel = &connector->panel;
1477 const char *desc;
1478 u32 level;
1479
1480 /* Get the right PWM chip for DSI backlight according to VBT */
1481 if (dev_priv->vbt.dsi.config->pwm_blc == PPS_BLC_PMIC) {
1482 panel->backlight.pwm = pwm_get(dev->dev, "pwm_pmic_backlight");
1483 desc = "PMIC";
1484 } else {
1485 panel->backlight.pwm = pwm_get(dev->dev, "pwm_soc_backlight");
1486 desc = "SoC";
1487 }
1488
1489 if (IS_ERR(panel->backlight.pwm)) {
1490 drm_err(&dev_priv->drm, "Failed to get the %s PWM chip\n",
1491 desc);
1492 panel->backlight.pwm = NULL;
1493 return -ENODEV;
1494 }
1495
1496 panel->backlight.pwm_level_max = 100; /* 100% */
1497 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1498
1499 if (pwm_is_enabled(panel->backlight.pwm)) {
1500 /* PWM is already enabled, use existing settings */
1501 pwm_get_state(panel->backlight.pwm, &panel->backlight.pwm_state);
1502
1503 level = pwm_get_relative_duty_cycle(&panel->backlight.pwm_state,
1504 100);
1505 level = intel_panel_invert_pwm_level(connector, level);
1506 panel->backlight.pwm_enabled = true;
1507
1508 drm_dbg_kms(&dev_priv->drm, "PWM already enabled at freq %ld, VBT freq %d, level %d\n",
1509 NSEC_PER_SEC / (unsigned long)panel->backlight.pwm_state.period,
1510 get_vbt_pwm_freq(dev_priv), level);
1511 } else {
1512 /* Set period from VBT frequency, leave other settings at 0. */
1513 panel->backlight.pwm_state.period =
1514 NSEC_PER_SEC / get_vbt_pwm_freq(dev_priv);
1515 }
1516
1517 drm_info(&dev_priv->drm, "Using %s PWM for LCD backlight control\n",
1518 desc);
1519 return 0;
1520 }
1521
intel_pwm_set_backlight(const struct drm_connector_state * conn_state,u32 level)1522 static void intel_pwm_set_backlight(const struct drm_connector_state *conn_state, u32 level)
1523 {
1524 struct intel_connector *connector = to_intel_connector(conn_state->connector);
1525 struct intel_panel *panel = &connector->panel;
1526
1527 panel->backlight.pwm_funcs->set(conn_state,
1528 intel_panel_invert_pwm_level(connector, level));
1529 }
1530
intel_pwm_get_backlight(struct intel_connector * connector,enum pipe pipe)1531 static u32 intel_pwm_get_backlight(struct intel_connector *connector, enum pipe pipe)
1532 {
1533 struct intel_panel *panel = &connector->panel;
1534
1535 return intel_panel_invert_pwm_level(connector,
1536 panel->backlight.pwm_funcs->get(connector, pipe));
1537 }
1538
intel_pwm_enable_backlight(const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state,u32 level)1539 static void intel_pwm_enable_backlight(const struct intel_crtc_state *crtc_state,
1540 const struct drm_connector_state *conn_state, u32 level)
1541 {
1542 struct intel_connector *connector = to_intel_connector(conn_state->connector);
1543 struct intel_panel *panel = &connector->panel;
1544
1545 panel->backlight.pwm_funcs->enable(crtc_state, conn_state,
1546 intel_panel_invert_pwm_level(connector, level));
1547 }
1548
intel_pwm_disable_backlight(const struct drm_connector_state * conn_state,u32 level)1549 static void intel_pwm_disable_backlight(const struct drm_connector_state *conn_state, u32 level)
1550 {
1551 struct intel_connector *connector = to_intel_connector(conn_state->connector);
1552 struct intel_panel *panel = &connector->panel;
1553
1554 panel->backlight.pwm_funcs->disable(conn_state,
1555 intel_panel_invert_pwm_level(connector, level));
1556 }
1557
intel_pwm_setup_backlight(struct intel_connector * connector,enum pipe pipe)1558 static int intel_pwm_setup_backlight(struct intel_connector *connector, enum pipe pipe)
1559 {
1560 struct intel_panel *panel = &connector->panel;
1561 int ret = panel->backlight.pwm_funcs->setup(connector, pipe);
1562
1563 if (ret < 0)
1564 return ret;
1565
1566 panel->backlight.min = panel->backlight.pwm_level_min;
1567 panel->backlight.max = panel->backlight.pwm_level_max;
1568 panel->backlight.level = intel_pwm_get_backlight(connector, pipe);
1569 panel->backlight.enabled = panel->backlight.pwm_enabled;
1570
1571 return 0;
1572 }
1573
intel_panel_update_backlight(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state)1574 void intel_panel_update_backlight(struct intel_atomic_state *state,
1575 struct intel_encoder *encoder,
1576 const struct intel_crtc_state *crtc_state,
1577 const struct drm_connector_state *conn_state)
1578 {
1579 struct intel_connector *connector = to_intel_connector(conn_state->connector);
1580 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1581 struct intel_panel *panel = &connector->panel;
1582
1583 if (!panel->backlight.present)
1584 return;
1585
1586 mutex_lock(&dev_priv->backlight_lock);
1587 if (!panel->backlight.enabled)
1588 __intel_panel_enable_backlight(crtc_state, conn_state);
1589
1590 mutex_unlock(&dev_priv->backlight_lock);
1591 }
1592
intel_panel_setup_backlight(struct drm_connector * connector,enum pipe pipe)1593 int intel_panel_setup_backlight(struct drm_connector *connector, enum pipe pipe)
1594 {
1595 struct drm_i915_private *dev_priv = to_i915(connector->dev);
1596 struct intel_connector *intel_connector = to_intel_connector(connector);
1597 struct intel_panel *panel = &intel_connector->panel;
1598 int ret;
1599
1600 if (!dev_priv->vbt.backlight.present) {
1601 if (dev_priv->quirks & QUIRK_BACKLIGHT_PRESENT) {
1602 drm_dbg_kms(&dev_priv->drm,
1603 "no backlight present per VBT, but present per quirk\n");
1604 } else {
1605 drm_dbg_kms(&dev_priv->drm,
1606 "no backlight present per VBT\n");
1607 return 0;
1608 }
1609 }
1610
1611 /* ensure intel_panel has been initialized first */
1612 if (drm_WARN_ON(&dev_priv->drm, !panel->backlight.funcs))
1613 return -ENODEV;
1614
1615 /* set level and max in panel struct */
1616 mutex_lock(&dev_priv->backlight_lock);
1617 ret = panel->backlight.funcs->setup(intel_connector, pipe);
1618 mutex_unlock(&dev_priv->backlight_lock);
1619
1620 if (ret) {
1621 drm_dbg_kms(&dev_priv->drm,
1622 "failed to setup backlight for connector %s\n",
1623 connector->name);
1624 return ret;
1625 }
1626
1627 panel->backlight.present = true;
1628
1629 drm_dbg_kms(&dev_priv->drm,
1630 "Connector %s backlight initialized, %s, brightness %u/%u\n",
1631 connector->name,
1632 enableddisabled(panel->backlight.enabled),
1633 panel->backlight.level, panel->backlight.max);
1634
1635 return 0;
1636 }
1637
intel_panel_destroy_backlight(struct intel_panel * panel)1638 void intel_panel_destroy_backlight(struct intel_panel *panel)
1639 {
1640 /* dispose of the pwm */
1641 if (panel->backlight.pwm)
1642 pwm_put(panel->backlight.pwm);
1643
1644 panel->backlight.present = false;
1645 }
1646
1647 static const struct intel_panel_bl_funcs bxt_pwm_funcs = {
1648 .setup = bxt_setup_backlight,
1649 .enable = bxt_enable_backlight,
1650 .disable = bxt_disable_backlight,
1651 .set = bxt_set_backlight,
1652 .get = bxt_get_backlight,
1653 .hz_to_pwm = bxt_hz_to_pwm,
1654 };
1655
1656 static const struct intel_panel_bl_funcs cnp_pwm_funcs = {
1657 .setup = cnp_setup_backlight,
1658 .enable = cnp_enable_backlight,
1659 .disable = cnp_disable_backlight,
1660 .set = bxt_set_backlight,
1661 .get = bxt_get_backlight,
1662 .hz_to_pwm = cnp_hz_to_pwm,
1663 };
1664
1665 static const struct intel_panel_bl_funcs lpt_pwm_funcs = {
1666 .setup = lpt_setup_backlight,
1667 .enable = lpt_enable_backlight,
1668 .disable = lpt_disable_backlight,
1669 .set = lpt_set_backlight,
1670 .get = lpt_get_backlight,
1671 .hz_to_pwm = lpt_hz_to_pwm,
1672 };
1673
1674 static const struct intel_panel_bl_funcs spt_pwm_funcs = {
1675 .setup = lpt_setup_backlight,
1676 .enable = lpt_enable_backlight,
1677 .disable = lpt_disable_backlight,
1678 .set = lpt_set_backlight,
1679 .get = lpt_get_backlight,
1680 .hz_to_pwm = spt_hz_to_pwm,
1681 };
1682
1683 static const struct intel_panel_bl_funcs pch_pwm_funcs = {
1684 .setup = pch_setup_backlight,
1685 .enable = pch_enable_backlight,
1686 .disable = pch_disable_backlight,
1687 .set = pch_set_backlight,
1688 .get = pch_get_backlight,
1689 .hz_to_pwm = pch_hz_to_pwm,
1690 };
1691
1692 static const struct intel_panel_bl_funcs ext_pwm_funcs = {
1693 .setup = ext_pwm_setup_backlight,
1694 .enable = ext_pwm_enable_backlight,
1695 .disable = ext_pwm_disable_backlight,
1696 .set = ext_pwm_set_backlight,
1697 .get = ext_pwm_get_backlight,
1698 };
1699
1700 static const struct intel_panel_bl_funcs vlv_pwm_funcs = {
1701 .setup = vlv_setup_backlight,
1702 .enable = vlv_enable_backlight,
1703 .disable = vlv_disable_backlight,
1704 .set = vlv_set_backlight,
1705 .get = vlv_get_backlight,
1706 .hz_to_pwm = vlv_hz_to_pwm,
1707 };
1708
1709 static const struct intel_panel_bl_funcs i965_pwm_funcs = {
1710 .setup = i965_setup_backlight,
1711 .enable = i965_enable_backlight,
1712 .disable = i965_disable_backlight,
1713 .set = i9xx_set_backlight,
1714 .get = i9xx_get_backlight,
1715 .hz_to_pwm = i965_hz_to_pwm,
1716 };
1717
1718 static const struct intel_panel_bl_funcs i9xx_pwm_funcs = {
1719 .setup = i9xx_setup_backlight,
1720 .enable = i9xx_enable_backlight,
1721 .disable = i9xx_disable_backlight,
1722 .set = i9xx_set_backlight,
1723 .get = i9xx_get_backlight,
1724 .hz_to_pwm = i9xx_hz_to_pwm,
1725 };
1726
1727 static const struct intel_panel_bl_funcs pwm_bl_funcs = {
1728 .setup = intel_pwm_setup_backlight,
1729 .enable = intel_pwm_enable_backlight,
1730 .disable = intel_pwm_disable_backlight,
1731 .set = intel_pwm_set_backlight,
1732 .get = intel_pwm_get_backlight,
1733 };
1734
1735 /* Set up chip specific backlight functions */
1736 void
intel_panel_init_backlight_funcs(struct intel_panel * panel)1737 intel_panel_init_backlight_funcs(struct intel_panel *panel)
1738 {
1739 struct intel_connector *connector =
1740 container_of(panel, struct intel_connector, panel);
1741 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1742
1743 if (connector->base.connector_type == DRM_MODE_CONNECTOR_DSI &&
1744 intel_dsi_dcs_init_backlight_funcs(connector) == 0)
1745 return;
1746
1747 if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) {
1748 panel->backlight.pwm_funcs = &bxt_pwm_funcs;
1749 } else if (INTEL_PCH_TYPE(dev_priv) >= PCH_CNP) {
1750 panel->backlight.pwm_funcs = &cnp_pwm_funcs;
1751 } else if (INTEL_PCH_TYPE(dev_priv) >= PCH_LPT) {
1752 if (HAS_PCH_LPT(dev_priv))
1753 panel->backlight.pwm_funcs = &lpt_pwm_funcs;
1754 else
1755 panel->backlight.pwm_funcs = &spt_pwm_funcs;
1756 } else if (HAS_PCH_SPLIT(dev_priv)) {
1757 panel->backlight.pwm_funcs = &pch_pwm_funcs;
1758 } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
1759 if (connector->base.connector_type == DRM_MODE_CONNECTOR_DSI) {
1760 panel->backlight.pwm_funcs = &ext_pwm_funcs;
1761 } else {
1762 panel->backlight.pwm_funcs = &vlv_pwm_funcs;
1763 }
1764 } else if (DISPLAY_VER(dev_priv) == 4) {
1765 panel->backlight.pwm_funcs = &i965_pwm_funcs;
1766 } else {
1767 panel->backlight.pwm_funcs = &i9xx_pwm_funcs;
1768 }
1769
1770 if (connector->base.connector_type == DRM_MODE_CONNECTOR_eDP &&
1771 intel_dp_aux_init_backlight_funcs(connector) == 0)
1772 return;
1773
1774 /* We're using a standard PWM backlight interface */
1775 panel->backlight.funcs = &pwm_bl_funcs;
1776 }
1777