Re: [PATCH 2/2] drm/i915: check for more ASLC interrupts

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 17 Sep 2013, Paulo Zanoni <przanoni@xxxxxxxxx> wrote:
> From: Paulo Zanoni <paulo.r.zanoni@xxxxxxxxx>
>
> Sometimes I see the "non asle set request??" message on my Haswell
> machine, so I decided to get the spec and see if some bits are missing
> from the mask. We do have some bits missing from the mask, so this
> patch adds them, and the corresponding code to print "unsupported"
> messages just like we do with the other bits we don't support.
>
> But I still see the "non asle set request??" message on my machine :(
>
> Also use the proper ASLC name to indicate the registers we're talking
> about.
>
> v2: - Properly set the new FAILED bits
>     - Rename the old FAILED bits
>     - Print everything we don't support

Reviewed-by: Jani Nikula <jani.nikula@xxxxxxxxx>

> Signed-off-by: Paulo Zanoni <paulo.r.zanoni@xxxxxxxxx>
> ---
>  drivers/gpu/drm/i915/intel_opregion.c | 153 +++++++++++++++++++++++++++-------
>  1 file changed, 121 insertions(+), 32 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
> index c4fb2ae..b627202 100644
> --- a/drivers/gpu/drm/i915/intel_opregion.c
> +++ b/drivers/gpu/drm/i915/intel_opregion.c
> @@ -110,25 +110,38 @@ struct opregion_asle {
>  	u32 epfm;       /* enabled panel fitting modes */
>  	u8 plut[74];    /* panel LUT and identifier */
>  	u32 pfmb;       /* PWM freq and min brightness */
> -	u8 rsvd[102];
> +	u32 cddv;       /* color correction default values */
> +	u32 pcft;       /* power conservation features */
> +	u32 srot;       /* supported rotation angles */
> +	u32 iuer;       /* IUER events */
> +	u8 rsvd[86];
>  } __attribute__((packed));
>  
>  /* Driver readiness indicator */
>  #define ASLE_ARDY_READY		(1 << 0)
>  #define ASLE_ARDY_NOT_READY	(0 << 0)
>  
> -/* ASLE irq request bits */
> -#define ASLE_SET_ALS_ILLUM     (1 << 0)
> -#define ASLE_SET_BACKLIGHT     (1 << 1)
> -#define ASLE_SET_PFIT          (1 << 2)
> -#define ASLE_SET_PWM_FREQ      (1 << 3)
> -#define ASLE_REQ_MSK           0xf
> -
> -/* response bits of ASLE irq request */
> -#define ASLE_ALS_ILLUM_FAILED	(1<<10)
> -#define ASLE_BACKLIGHT_FAILED	(1<<12)
> -#define ASLE_PFIT_FAILED	(1<<14)
> -#define ASLE_PWM_FREQ_FAILED	(1<<16)
> +/* ASLE Interrupt Command (ASLC) bits */
> +#define ASLC_SET_ALS_ILLUM		(1 << 0)
> +#define ASLC_SET_BACKLIGHT		(1 << 1)
> +#define ASLC_SET_PFIT			(1 << 2)
> +#define ASLC_SET_PWM_FREQ		(1 << 3)
> +#define ASLC_SUPPORTED_ROTATION_ANGLES	(1 << 4)
> +#define ASLC_BUTTON_ARRAY		(1 << 5)
> +#define ASLC_CONVERTIBLE_INDICATOR	(1 << 6)
> +#define ASLC_DOCKING_INDICATOR		(1 << 7)
> +#define ASLC_ISCT_STATE_CHANGE		(1 << 8)
> +#define ASLC_REQ_MSK			0x1ff
> +/* response bits */
> +#define ASLC_ALS_ILLUM_FAILED		(1 << 10)
> +#define ASLC_BACKLIGHT_FAILED		(1 << 12)
> +#define ASLC_PFIT_FAILED		(1 << 14)
> +#define ASLC_PWM_FREQ_FAILED		(1 << 16)
> +#define ASLC_ROTATION_ANGLES_FAILED	(1 << 18)
> +#define ASLC_BUTTON_ARRAY_FAILED	(1 << 20)
> +#define ASLC_CONVERTIBLE_FAILED		(1 << 22)
> +#define ASLC_DOCKING_FAILED		(1 << 24)
> +#define ASLC_ISCT_STATE_FAILED		(1 << 26)
>  
>  /* Technology enabled indicator */
>  #define ASLE_TCHE_ALS_EN	(1 << 0)
> @@ -154,6 +167,15 @@ struct opregion_asle {
>  
>  #define ASLE_CBLV_VALID         (1<<31)
>  
> +/* IUER */
> +#define ASLE_IUER_DOCKING		(1 << 7)
> +#define ASLE_IUER_CONVERTIBLE		(1 << 6)
> +#define ASLE_IUER_ROTATION_LOCK_BTN	(1 << 4)
> +#define ASLE_IUER_VOLUME_DOWN_BTN	(1 << 3)
> +#define ASLE_IUER_VOLUME_UP_BTN		(1 << 2)
> +#define ASLE_IUER_WINDOWS_BTN		(1 << 1)
> +#define ASLE_IUER_POWER_BTN		(1 << 0)
> +
>  /* Software System Control Interrupt (SWSCI) */
>  #define SWSCI_SCIC_INDICATOR		(1 << 0)
>  #define SWSCI_SCIC_MAIN_FUNCTION_SHIFT	1
> @@ -377,11 +399,11 @@ static u32 asle_set_backlight(struct drm_device *dev, u32 bclp)
>  	DRM_DEBUG_DRIVER("bclp = 0x%08x\n", bclp);
>  
>  	if (!(bclp & ASLE_BCLP_VALID))
> -		return ASLE_BACKLIGHT_FAILED;
> +		return ASLC_BACKLIGHT_FAILED;
>  
>  	bclp &= ASLE_BCLP_MSK;
>  	if (bclp > 255)
> -		return ASLE_BACKLIGHT_FAILED;
> +		return ASLC_BACKLIGHT_FAILED;
>  
>  	intel_panel_set_backlight(dev, bclp, 255);
>  	iowrite32(DIV_ROUND_UP(bclp * 100, 255) | ASLE_CBLV_VALID, &asle->cblv);
> @@ -394,13 +416,13 @@ static u32 asle_set_als_illum(struct drm_device *dev, u32 alsi)
>  	/* alsi is the current ALS reading in lux. 0 indicates below sensor
>  	   range, 0xffff indicates above sensor range. 1-0xfffe are valid */
>  	DRM_DEBUG_DRIVER("Illum is not supported\n");
> -	return ASLE_ALS_ILLUM_FAILED;
> +	return ASLC_ALS_ILLUM_FAILED;
>  }
>  
>  static u32 asle_set_pwm_freq(struct drm_device *dev, u32 pfmb)
>  {
>  	DRM_DEBUG_DRIVER("PWM freq is not supported\n");
> -	return ASLE_PWM_FREQ_FAILED;
> +	return ASLC_PWM_FREQ_FAILED;
>  }
>  
>  static u32 asle_set_pfit(struct drm_device *dev, u32 pfit)
> @@ -408,39 +430,106 @@ static u32 asle_set_pfit(struct drm_device *dev, u32 pfit)
>  	/* Panel fitting is currently controlled by the X code, so this is a
>  	   noop until modesetting support works fully */
>  	DRM_DEBUG_DRIVER("Pfit is not supported\n");
> -	return ASLE_PFIT_FAILED;
> +	return ASLC_PFIT_FAILED;
> +}
> +
> +static u32 asle_set_supported_rotation_angles(struct drm_device *dev, u32 srot)
> +{
> +	DRM_DEBUG_DRIVER("SROT is not supported\n");
> +	return ASLC_ROTATION_ANGLES_FAILED;
> +}
> +
> +static u32 asle_set_button_array(struct drm_device *dev, u32 iuer)
> +{
> +	if (!iuer)
> +		DRM_DEBUG_DRIVER("Button array event is not supported (nothing)\n");
> +	if (iuer & ASLE_IUER_ROTATION_LOCK_BTN)
> +		DRM_DEBUG_DRIVER("Button array event is not supported (rotation lock)\n");
> +	if (iuer & ASLE_IUER_VOLUME_DOWN_BTN)
> +		DRM_DEBUG_DRIVER("Button array event is not supported (volume down)\n");
> +	if (iuer & ASLE_IUER_VOLUME_UP_BTN)
> +		DRM_DEBUG_DRIVER("Button array event is not supported (volume up)\n");
> +	if (iuer & ASLE_IUER_WINDOWS_BTN)
> +		DRM_DEBUG_DRIVER("Button array event is not supported (windows)\n");
> +	if (iuer & ASLE_IUER_POWER_BTN)
> +		DRM_DEBUG_DRIVER("Button array event is not supported (power)\n");
> +
> +	return ASLC_BUTTON_ARRAY_FAILED;
> +}
> +
> +static u32 asle_set_convertible(struct drm_device *dev, u32 iuer)
> +{
> +	if (iuer & ASLE_IUER_CONVERTIBLE)
> +		DRM_DEBUG_DRIVER("Convertible is not supported (clamshell)\n");
> +	else
> +		DRM_DEBUG_DRIVER("Convertible is not supported (slate)\n");
> +
> +	return ASLC_CONVERTIBLE_FAILED;
> +}
> +
> +static u32 asle_set_docking(struct drm_device *dev, u32 iuer)
> +{
> +	if (iuer & ASLE_IUER_DOCKING)
> +		DRM_DEBUG_DRIVER("Docking is not supported (docked)\n");
> +	else
> +		DRM_DEBUG_DRIVER("Docking is not supported (undocked)\n");
> +
> +	return ASLC_DOCKING_FAILED;
> +}
> +
> +static u32 asle_isct_state(struct drm_device *dev)
> +{
> +	DRM_DEBUG_DRIVER("ISCT is not supported\n");
> +	return ASLC_ISCT_STATE_FAILED;
>  }
>  
>  void intel_opregion_asle_intr(struct drm_device *dev)
>  {
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	struct opregion_asle __iomem *asle = dev_priv->opregion.asle;
> -	u32 asle_stat = 0;
> -	u32 asle_req;
> +	u32 aslc_stat = 0;
> +	u32 aslc_req;
>  
>  	if (!asle)
>  		return;
>  
> -	asle_req = ioread32(&asle->aslc) & ASLE_REQ_MSK;
> +	aslc_req = ioread32(&asle->aslc);
>  
> -	if (!asle_req) {
> -		DRM_DEBUG_DRIVER("non asle set request??\n");
> +	if (!(aslc_req & ASLC_REQ_MSK)) {
> +		DRM_DEBUG_DRIVER("No request on ASLC interrupt 0x%08x\n",
> +				 aslc_req);
>  		return;
>  	}
>  
> -	if (asle_req & ASLE_SET_ALS_ILLUM)
> -		asle_stat |= asle_set_als_illum(dev, ioread32(&asle->alsi));
> +	if (aslc_req & ASLC_SET_ALS_ILLUM)
> +		aslc_stat |= asle_set_als_illum(dev, ioread32(&asle->alsi));
> +
> +	if (aslc_req & ASLC_SET_BACKLIGHT)
> +		aslc_stat |= asle_set_backlight(dev, ioread32(&asle->bclp));
> +
> +	if (aslc_req & ASLC_SET_PFIT)
> +		aslc_stat |= asle_set_pfit(dev, ioread32(&asle->pfit));
> +
> +	if (aslc_req & ASLC_SET_PWM_FREQ)
> +		aslc_stat |= asle_set_pwm_freq(dev, ioread32(&asle->pfmb));
> +
> +	if (aslc_req & ASLC_SUPPORTED_ROTATION_ANGLES)
> +		aslc_stat |= asle_set_supported_rotation_angles(dev,
> +							ioread32(&asle->srot));
> +
> +	if (aslc_req & ASLC_BUTTON_ARRAY)
> +		aslc_stat |= asle_set_button_array(dev, ioread32(&asle->iuer));
>  
> -	if (asle_req & ASLE_SET_BACKLIGHT)
> -		asle_stat |= asle_set_backlight(dev, ioread32(&asle->bclp));
> +	if (aslc_req & ASLC_CONVERTIBLE_INDICATOR)
> +		aslc_stat |= asle_set_convertible(dev, ioread32(&asle->iuer));
>  
> -	if (asle_req & ASLE_SET_PFIT)
> -		asle_stat |= asle_set_pfit(dev, ioread32(&asle->pfit));
> +	if (aslc_req & ASLC_DOCKING_INDICATOR)
> +		aslc_stat |= asle_set_docking(dev, ioread32(&asle->iuer));
>  
> -	if (asle_req & ASLE_SET_PWM_FREQ)
> -		asle_stat |= asle_set_pwm_freq(dev, ioread32(&asle->pfmb));
> +	if (aslc_req & ASLC_ISCT_STATE_CHANGE)
> +		aslc_stat |= asle_isct_state(dev);
>  
> -	iowrite32(asle_stat, &asle->aslc);
> +	iowrite32(aslc_stat, &asle->aslc);
>  }
>  
>  #define ACPI_EV_DISPLAY_SWITCH (1<<0)
> -- 
> 1.8.3.1
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux