Linux Audio

Check our new training course

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