diff mbox

[11/11] drm/i915/opregion: handle VBT sizes bigger than 6 KB

Message ID b9542427dbacc6ed183a81b45ffe51e66ef8cbde.1450089383.git.jani.nikula@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jani Nikula Dec. 14, 2015, 10:50 a.m. UTC
The RVDA and RVDS (raw VBT data address and size) fields of the ASLE
mailbox may specify an alternate location for VBT instead of mailbox #4.
Use the alternate location if available and valid, falling back to
mailbox #4 otherwise.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h       |  1 +
 drivers/gpu/drm/i915/intel_opregion.c | 25 +++++++++++++++++++++++--
 2 files changed, 24 insertions(+), 2 deletions(-)

Comments

Ville Syrjala Dec. 14, 2015, 2:19 p.m. UTC | #1
On Mon, Dec 14, 2015 at 12:50:55PM +0200, Jani Nikula wrote:
> The RVDA and RVDS (raw VBT data address and size) fields of the ASLE
> mailbox may specify an alternate location for VBT instead of mailbox #4.
> Use the alternate location if available and valid, falling back to
> mailbox #4 otherwise.
> 
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>  drivers/gpu/drm/i915/i915_drv.h       |  1 +
>  drivers/gpu/drm/i915/intel_opregion.c | 25 +++++++++++++++++++++++--
>  2 files changed, 24 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index ca8c2a64bc6d..8cfac7398568 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -457,6 +457,7 @@ struct intel_opregion {
>  	u32 swsci_gbda_sub_functions;
>  	u32 swsci_sbcb_sub_functions;
>  	struct opregion_asle *asle;
> +	void *rvda;
>  	const void *vbt;
>  	u32 vbt_size;
>  	u32 *lid_state;
> diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
> index e89ee2383fe1..a139889dd45b 100644
> --- a/drivers/gpu/drm/i915/intel_opregion.c
> +++ b/drivers/gpu/drm/i915/intel_opregion.c
> @@ -837,6 +837,10 @@ void intel_opregion_fini(struct drm_device *dev)
>  
>  	/* just clear all opregion memory pointers now */
>  	memunmap(opregion->header);
> +	if (opregion->rvda) {
> +		memunmap(opregion->rvda);
> +		opregion->rvda = NULL;
> +	}
>  	opregion->header = NULL;
>  	opregion->acpi = NULL;
>  	opregion->swsci = NULL;
> @@ -987,12 +991,29 @@ int intel_opregion_setup(struct drm_device *dev)
>  	`	DRM_DEBUG_DRIVER("ASLE extension supported\n");
>  
>  	if (!dmi_check_system(intel_no_opregion_vbt)) {
> -		const void *vbt = base + OPREGION_VBT_OFFSET;
> -		u32 vbt_size = OPREGION_ASLE_EXT_OFFSET - OPREGION_VBT_OFFSET;
> +		const void *vbt = NULL;
> +		u32 vbt_size = 0;
> +
> +		if (opregion->header->opregion_ver >= 2 && opregion->asle &&
> +		    opregion->asle->rvda && opregion->asle->rvds) {

Either I'm blind or you didn't actually add rvda/rvds to struct opregion_asle.

Also the spec seems confused as usual. Some parts if it refer to this
as RVDA others as RVBT. Although RVBT also seems to be what the mbox #4
contents are called in another place, and to add insult to injury that
place also has the offset and size all wrong. Sigh.

Anyway, apart from the missing rvda/rvds definititions the rest looks OK.

> +			opregion->rvda = memremap(opregion->asle->rvda,
> +						  opregion->asle->rvds,
> +						  MEMREMAP_WB);
> +			vbt = opregion->rvda;
> +			vbt_size = opregion->asle->rvds;
> +		}
>  
>  		if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
>  			opregion->vbt = vbt;
>  			opregion->vbt_size = vbt_size;
> +			DRM_DEBUG_DRIVER("VBT from RVDA\n");
> +		} else {
> +			vbt = base + OPREGION_VBT_OFFSET;
> +			vbt_size = OPREGION_ASLE_EXT_OFFSET - OPREGION_VBT_OFFSET;
> +			if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
> +				opregion->vbt = vbt;
> +				opregion->vbt_size = vbt_size;
> +			}
>  		}
>  	}
>  
> -- 
> 2.1.4
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Ville Syrjala Dec. 14, 2015, 2:34 p.m. UTC | #2
On Mon, Dec 14, 2015 at 04:19:50PM +0200, Ville Syrjälä wrote:
> On Mon, Dec 14, 2015 at 12:50:55PM +0200, Jani Nikula wrote:
> > The RVDA and RVDS (raw VBT data address and size) fields of the ASLE
> > mailbox may specify an alternate location for VBT instead of mailbox #4.
> > Use the alternate location if available and valid, falling back to
> > mailbox #4 otherwise.
> > 
> > Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> > ---
> >  drivers/gpu/drm/i915/i915_drv.h       |  1 +
> >  drivers/gpu/drm/i915/intel_opregion.c | 25 +++++++++++++++++++++++--
> >  2 files changed, 24 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> > index ca8c2a64bc6d..8cfac7398568 100644
> > --- a/drivers/gpu/drm/i915/i915_drv.h
> > +++ b/drivers/gpu/drm/i915/i915_drv.h
> > @@ -457,6 +457,7 @@ struct intel_opregion {
> >  	u32 swsci_gbda_sub_functions;
> >  	u32 swsci_sbcb_sub_functions;
> >  	struct opregion_asle *asle;
> > +	void *rvda;
> >  	const void *vbt;
> >  	u32 vbt_size;
> >  	u32 *lid_state;
> > diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
> > index e89ee2383fe1..a139889dd45b 100644
> > --- a/drivers/gpu/drm/i915/intel_opregion.c
> > +++ b/drivers/gpu/drm/i915/intel_opregion.c
> > @@ -837,6 +837,10 @@ void intel_opregion_fini(struct drm_device *dev)
> >  
> >  	/* just clear all opregion memory pointers now */
> >  	memunmap(opregion->header);
> > +	if (opregion->rvda) {
> > +		memunmap(opregion->rvda);
> > +		opregion->rvda = NULL;
> > +	}
> >  	opregion->header = NULL;
> >  	opregion->acpi = NULL;
> >  	opregion->swsci = NULL;
> > @@ -987,12 +991,29 @@ int intel_opregion_setup(struct drm_device *dev)
> >  	`	DRM_DEBUG_DRIVER("ASLE extension supported\n");
> >  
> >  	if (!dmi_check_system(intel_no_opregion_vbt)) {
> > -		const void *vbt = base + OPREGION_VBT_OFFSET;
> > -		u32 vbt_size = OPREGION_ASLE_EXT_OFFSET - OPREGION_VBT_OFFSET;
> > +		const void *vbt = NULL;
> > +		u32 vbt_size = 0;
> > +
> > +		if (opregion->header->opregion_ver >= 2 && opregion->asle &&
> > +		    opregion->asle->rvda && opregion->asle->rvds) {
> 
> Either I'm blind or you didn't actually add rvda/rvds to struct opregion_asle.

Oh I se they went in seprately as
c85f6c91ec42 ("drm/i915: add VBT address and size fields to ASLE mailbox struct")

OK, so apart from the few minor bikesheds I listed it all looks good to
me. For the series
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

> 
> Also the spec seems confused as usual. Some parts if it refer to this
> as RVDA others as RVBT. Although RVBT also seems to be what the mbox #4
> contents are called in another place, and to add insult to injury that
> place also has the offset and size all wrong. Sigh.
> 
> Anyway, apart from the missing rvda/rvds definititions the rest looks OK.
> 
> > +			opregion->rvda = memremap(opregion->asle->rvda,
> > +						  opregion->asle->rvds,
> > +						  MEMREMAP_WB);
> > +			vbt = opregion->rvda;
> > +			vbt_size = opregion->asle->rvds;
> > +		}
> >  
> >  		if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
> >  			opregion->vbt = vbt;
> >  			opregion->vbt_size = vbt_size;
> > +			DRM_DEBUG_DRIVER("VBT from RVDA\n");
> > +		} else {
> > +			vbt = base + OPREGION_VBT_OFFSET;
> > +			vbt_size = OPREGION_ASLE_EXT_OFFSET - OPREGION_VBT_OFFSET;
> > +			if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
> > +				opregion->vbt = vbt;
> > +				opregion->vbt_size = vbt_size;
> > +			}
> >  		}
> >  	}
> >  
> > -- 
> > 2.1.4
> > 
> > _______________________________________________
> > Intel-gfx mailing list
> > Intel-gfx@lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
> 
> -- 
> Ville Syrjälä
> Intel OTC
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Jani Nikula Dec. 14, 2015, 2:40 p.m. UTC | #3
On Mon, 14 Dec 2015, Ville Syrjälä <ville.syrjala@linux.intel.com> wrote:
> On Mon, Dec 14, 2015 at 12:50:55PM +0200, Jani Nikula wrote:
>> The RVDA and RVDS (raw VBT data address and size) fields of the ASLE
>> mailbox may specify an alternate location for VBT instead of mailbox #4.
>> Use the alternate location if available and valid, falling back to
>> mailbox #4 otherwise.
>> 
>> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
>> ---
>>  drivers/gpu/drm/i915/i915_drv.h       |  1 +
>>  drivers/gpu/drm/i915/intel_opregion.c | 25 +++++++++++++++++++++++--
>>  2 files changed, 24 insertions(+), 2 deletions(-)
>> 
>> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
>> index ca8c2a64bc6d..8cfac7398568 100644
>> --- a/drivers/gpu/drm/i915/i915_drv.h
>> +++ b/drivers/gpu/drm/i915/i915_drv.h
>> @@ -457,6 +457,7 @@ struct intel_opregion {
>>  	u32 swsci_gbda_sub_functions;
>>  	u32 swsci_sbcb_sub_functions;
>>  	struct opregion_asle *asle;
>> +	void *rvda;
>>  	const void *vbt;
>>  	u32 vbt_size;
>>  	u32 *lid_state;
>> diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
>> index e89ee2383fe1..a139889dd45b 100644
>> --- a/drivers/gpu/drm/i915/intel_opregion.c
>> +++ b/drivers/gpu/drm/i915/intel_opregion.c
>> @@ -837,6 +837,10 @@ void intel_opregion_fini(struct drm_device *dev)
>>  
>>  	/* just clear all opregion memory pointers now */
>>  	memunmap(opregion->header);
>> +	if (opregion->rvda) {
>> +		memunmap(opregion->rvda);
>> +		opregion->rvda = NULL;
>> +	}
>>  	opregion->header = NULL;
>>  	opregion->acpi = NULL;
>>  	opregion->swsci = NULL;
>> @@ -987,12 +991,29 @@ int intel_opregion_setup(struct drm_device *dev)
>>  	`	DRM_DEBUG_DRIVER("ASLE extension supported\n");
>>  
>>  	if (!dmi_check_system(intel_no_opregion_vbt)) {
>> -		const void *vbt = base + OPREGION_VBT_OFFSET;
>> -		u32 vbt_size = OPREGION_ASLE_EXT_OFFSET - OPREGION_VBT_OFFSET;
>> +		const void *vbt = NULL;
>> +		u32 vbt_size = 0;
>> +
>> +		if (opregion->header->opregion_ver >= 2 && opregion->asle &&
>> +		    opregion->asle->rvda && opregion->asle->rvds) {
>
> Either I'm blind or you didn't actually add rvda/rvds to struct opregion_asle.
>
> Also the spec seems confused as usual. Some parts if it refer to this
> as RVDA others as RVBT. Although RVBT also seems to be what the mbox #4
> contents are called in another place, and to add insult to injury that
> place also has the offset and size all wrong. Sigh.
>
> Anyway, apart from the missing rvda/rvds definititions the rest looks OK.

Those are in Deepak's commit I pushed last week:

commit c85f6c91ec4218487a29a7d1f918f7f6f0424c75
Author: Deepak M <m.deepak@intel.com>
Date:   Tue Dec 1 04:17:05 2015 +0530

    drm/i915: add VBT address and size fields to ASLE mailbox struct

I did build this, and even booted it. ;)


BR,
Jani.


>
>> +			opregion->rvda = memremap(opregion->asle->rvda,
>> +						  opregion->asle->rvds,
>> +						  MEMREMAP_WB);
>> +			vbt = opregion->rvda;
>> +			vbt_size = opregion->asle->rvds;
>> +		}
>>  
>>  		if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
>>  			opregion->vbt = vbt;
>>  			opregion->vbt_size = vbt_size;
>> +			DRM_DEBUG_DRIVER("VBT from RVDA\n");
>> +		} else {
>> +			vbt = base + OPREGION_VBT_OFFSET;
>> +			vbt_size = OPREGION_ASLE_EXT_OFFSET - OPREGION_VBT_OFFSET;
>> +			if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
>> +				opregion->vbt = vbt;
>> +				opregion->vbt_size = vbt_size;
>> +			}
>>  		}
>>  	}
>>  
>> -- 
>> 2.1.4
>> 
>> _______________________________________________
>> Intel-gfx mailing list
>> Intel-gfx@lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Ville Syrjala Dec. 15, 2015, 2:02 p.m. UTC | #4
On Mon, Dec 14, 2015 at 04:34:34PM +0200, Ville Syrjälä wrote:
> On Mon, Dec 14, 2015 at 04:19:50PM +0200, Ville Syrjälä wrote:
> > On Mon, Dec 14, 2015 at 12:50:55PM +0200, Jani Nikula wrote:
> > > The RVDA and RVDS (raw VBT data address and size) fields of the ASLE
> > > mailbox may specify an alternate location for VBT instead of mailbox #4.
> > > Use the alternate location if available and valid, falling back to
> > > mailbox #4 otherwise.
> > > 
> > > Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> > > ---
> > >  drivers/gpu/drm/i915/i915_drv.h       |  1 +
> > >  drivers/gpu/drm/i915/intel_opregion.c | 25 +++++++++++++++++++++++--
> > >  2 files changed, 24 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> > > index ca8c2a64bc6d..8cfac7398568 100644
> > > --- a/drivers/gpu/drm/i915/i915_drv.h
> > > +++ b/drivers/gpu/drm/i915/i915_drv.h
> > > @@ -457,6 +457,7 @@ struct intel_opregion {
> > >  	u32 swsci_gbda_sub_functions;
> > >  	u32 swsci_sbcb_sub_functions;
> > >  	struct opregion_asle *asle;
> > > +	void *rvda;
> > >  	const void *vbt;
> > >  	u32 vbt_size;
> > >  	u32 *lid_state;
> > > diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
> > > index e89ee2383fe1..a139889dd45b 100644
> > > --- a/drivers/gpu/drm/i915/intel_opregion.c
> > > +++ b/drivers/gpu/drm/i915/intel_opregion.c
> > > @@ -837,6 +837,10 @@ void intel_opregion_fini(struct drm_device *dev)
> > >  
> > >  	/* just clear all opregion memory pointers now */
> > >  	memunmap(opregion->header);
> > > +	if (opregion->rvda) {
> > > +		memunmap(opregion->rvda);
> > > +		opregion->rvda = NULL;
> > > +	}
> > >  	opregion->header = NULL;
> > >  	opregion->acpi = NULL;
> > >  	opregion->swsci = NULL;
> > > @@ -987,12 +991,29 @@ int intel_opregion_setup(struct drm_device *dev)
> > >  	`	DRM_DEBUG_DRIVER("ASLE extension supported\n");
> > >  
> > >  	if (!dmi_check_system(intel_no_opregion_vbt)) {
> > > -		const void *vbt = base + OPREGION_VBT_OFFSET;
> > > -		u32 vbt_size = OPREGION_ASLE_EXT_OFFSET - OPREGION_VBT_OFFSET;
> > > +		const void *vbt = NULL;
> > > +		u32 vbt_size = 0;
> > > +
> > > +		if (opregion->header->opregion_ver >= 2 && opregion->asle &&
> > > +		    opregion->asle->rvda && opregion->asle->rvds) {
> > 
> > Either I'm blind or you didn't actually add rvda/rvds to struct opregion_asle.
> 
> Oh I se they went in seprately as
> c85f6c91ec42 ("drm/i915: add VBT address and size fields to ASLE mailbox struct")
> 
> OK, so apart from the few minor bikesheds I listed it all looks good to
> me. For the series
> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

r-b still holds for the patches with the revised debug prints.

> 
> > 
> > Also the spec seems confused as usual. Some parts if it refer to this
> > as RVDA others as RVBT. Although RVBT also seems to be what the mbox #4
> > contents are called in another place, and to add insult to injury that
> > place also has the offset and size all wrong. Sigh.
> > 
> > Anyway, apart from the missing rvda/rvds definititions the rest looks OK.
> > 
> > > +			opregion->rvda = memremap(opregion->asle->rvda,
> > > +						  opregion->asle->rvds,
> > > +						  MEMREMAP_WB);
> > > +			vbt = opregion->rvda;
> > > +			vbt_size = opregion->asle->rvds;
> > > +		}
> > >  
> > >  		if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
> > >  			opregion->vbt = vbt;
> > >  			opregion->vbt_size = vbt_size;
> > > +			DRM_DEBUG_DRIVER("VBT from RVDA\n");
> > > +		} else {
> > > +			vbt = base + OPREGION_VBT_OFFSET;
> > > +			vbt_size = OPREGION_ASLE_EXT_OFFSET - OPREGION_VBT_OFFSET;
> > > +			if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
> > > +				opregion->vbt = vbt;
> > > +				opregion->vbt_size = vbt_size;
> > > +			}
> > >  		}
> > >  	}
> > >  
> > > -- 
> > > 2.1.4
> > > 
> > > _______________________________________________
> > > Intel-gfx mailing list
> > > Intel-gfx@lists.freedesktop.org
> > > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
> > 
> > -- 
> > Ville Syrjälä
> > Intel OTC
> > _______________________________________________
> > Intel-gfx mailing list
> > Intel-gfx@lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
> 
> -- 
> Ville Syrjälä
> Intel OTC
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Jani Nikula Dec. 16, 2015, 9:37 a.m. UTC | #5
On Tue, 15 Dec 2015, Ville Syrjälä <ville.syrjala@linux.intel.com> wrote:
> On Mon, Dec 14, 2015 at 04:34:34PM +0200, Ville Syrjälä wrote:
>> On Mon, Dec 14, 2015 at 04:19:50PM +0200, Ville Syrjälä wrote:
>> > On Mon, Dec 14, 2015 at 12:50:55PM +0200, Jani Nikula wrote:
>> > Either I'm blind or you didn't actually add rvda/rvds to struct opregion_asle.
>> 
>> Oh I se they went in seprately as
>> c85f6c91ec42 ("drm/i915: add VBT address and size fields to ASLE mailbox struct")
>> 
>> OK, so apart from the few minor bikesheds I listed it all looks good to
>> me. For the series
>> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> r-b still holds for the patches with the revised debug prints.

Patches 1-10 pushed to drm-intel-next-queued, thanks for the review. I'm
still holding off pushing patch 11 until I get a Tested-by from Mika,
as I don't have a machine with rvda set.

BR,
Jani.
Kahola, Mika Dec. 17, 2015, 7:30 a.m. UTC | #6
On Mon, 2015-12-14 at 12:50 +0200, Jani Nikula wrote:
> The RVDA and RVDS (raw VBT data address and size) fields of the ASLE
> mailbox may specify an alternate location for VBT instead of mailbox #4.
> Use the alternate location if available and valid, falling back to
> mailbox #4 otherwise.
> 
Tested-by: Mika Kahola <mika.kahola@intel.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>  drivers/gpu/drm/i915/i915_drv.h       |  1 +
>  drivers/gpu/drm/i915/intel_opregion.c | 25 +++++++++++++++++++++++--
>  2 files changed, 24 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index ca8c2a64bc6d..8cfac7398568 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -457,6 +457,7 @@ struct intel_opregion {
>  	u32 swsci_gbda_sub_functions;
>  	u32 swsci_sbcb_sub_functions;
>  	struct opregion_asle *asle;
> +	void *rvda;
>  	const void *vbt;
>  	u32 vbt_size;
>  	u32 *lid_state;
> diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
> index e89ee2383fe1..a139889dd45b 100644
> --- a/drivers/gpu/drm/i915/intel_opregion.c
> +++ b/drivers/gpu/drm/i915/intel_opregion.c
> @@ -837,6 +837,10 @@ void intel_opregion_fini(struct drm_device *dev)
>  
>  	/* just clear all opregion memory pointers now */
>  	memunmap(opregion->header);
> +	if (opregion->rvda) {
> +		memunmap(opregion->rvda);
> +		opregion->rvda = NULL;
> +	}
>  	opregion->header = NULL;
>  	opregion->acpi = NULL;
>  	opregion->swsci = NULL;
> @@ -987,12 +991,29 @@ int intel_opregion_setup(struct drm_device *dev)
>  		DRM_DEBUG_DRIVER("ASLE extension supported\n");
>  
>  	if (!dmi_check_system(intel_no_opregion_vbt)) {
> -		const void *vbt = base + OPREGION_VBT_OFFSET;
> -		u32 vbt_size = OPREGION_ASLE_EXT_OFFSET - OPREGION_VBT_OFFSET;
> +		const void *vbt = NULL;
> +		u32 vbt_size = 0;
> +
> +		if (opregion->header->opregion_ver >= 2 && opregion->asle &&
> +		    opregion->asle->rvda && opregion->asle->rvds) {
> +			opregion->rvda = memremap(opregion->asle->rvda,
> +						  opregion->asle->rvds,
> +						  MEMREMAP_WB);
> +			vbt = opregion->rvda;
> +			vbt_size = opregion->asle->rvds;
> +		}
>  
>  		if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
>  			opregion->vbt = vbt;
>  			opregion->vbt_size = vbt_size;
> +			DRM_DEBUG_DRIVER("VBT from RVDA\n");
> +		} else {
> +			vbt = base + OPREGION_VBT_OFFSET;
> +			vbt_size = OPREGION_ASLE_EXT_OFFSET - OPREGION_VBT_OFFSET;
> +			if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
> +				opregion->vbt = vbt;
> +				opregion->vbt_size = vbt_size;
> +			}
>  		}
>  	}
>
Jani Nikula Dec. 17, 2015, 9:46 a.m. UTC | #7
On Thu, 17 Dec 2015, Mika Kahola <mika.kahola@intel.com> wrote:
> On Mon, 2015-12-14 at 12:50 +0200, Jani Nikula wrote:
>> The RVDA and RVDS (raw VBT data address and size) fields of the ASLE
>> mailbox may specify an alternate location for VBT instead of mailbox #4.
>> Use the alternate location if available and valid, falling back to
>> mailbox #4 otherwise.
>> 
> Tested-by: Mika Kahola <mika.kahola@intel.com>
>> Signed-off-by: Jani Nikula <jani.nikula@intel.com>

Pushed to drm-intel-next-queued, thanks for the review and testing.

BR,
Jani.


>> ---
>>  drivers/gpu/drm/i915/i915_drv.h       |  1 +
>>  drivers/gpu/drm/i915/intel_opregion.c | 25 +++++++++++++++++++++++--
>>  2 files changed, 24 insertions(+), 2 deletions(-)
>> 
>> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
>> index ca8c2a64bc6d..8cfac7398568 100644
>> --- a/drivers/gpu/drm/i915/i915_drv.h
>> +++ b/drivers/gpu/drm/i915/i915_drv.h
>> @@ -457,6 +457,7 @@ struct intel_opregion {
>>  	u32 swsci_gbda_sub_functions;
>>  	u32 swsci_sbcb_sub_functions;
>>  	struct opregion_asle *asle;
>> +	void *rvda;
>>  	const void *vbt;
>>  	u32 vbt_size;
>>  	u32 *lid_state;
>> diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
>> index e89ee2383fe1..a139889dd45b 100644
>> --- a/drivers/gpu/drm/i915/intel_opregion.c
>> +++ b/drivers/gpu/drm/i915/intel_opregion.c
>> @@ -837,6 +837,10 @@ void intel_opregion_fini(struct drm_device *dev)
>>  
>>  	/* just clear all opregion memory pointers now */
>>  	memunmap(opregion->header);
>> +	if (opregion->rvda) {
>> +		memunmap(opregion->rvda);
>> +		opregion->rvda = NULL;
>> +	}
>>  	opregion->header = NULL;
>>  	opregion->acpi = NULL;
>>  	opregion->swsci = NULL;
>> @@ -987,12 +991,29 @@ int intel_opregion_setup(struct drm_device *dev)
>>  		DRM_DEBUG_DRIVER("ASLE extension supported\n");
>>  
>>  	if (!dmi_check_system(intel_no_opregion_vbt)) {
>> -		const void *vbt = base + OPREGION_VBT_OFFSET;
>> -		u32 vbt_size = OPREGION_ASLE_EXT_OFFSET - OPREGION_VBT_OFFSET;
>> +		const void *vbt = NULL;
>> +		u32 vbt_size = 0;
>> +
>> +		if (opregion->header->opregion_ver >= 2 && opregion->asle &&
>> +		    opregion->asle->rvda && opregion->asle->rvds) {
>> +			opregion->rvda = memremap(opregion->asle->rvda,
>> +						  opregion->asle->rvds,
>> +						  MEMREMAP_WB);
>> +			vbt = opregion->rvda;
>> +			vbt_size = opregion->asle->rvds;
>> +		}
>>  
>>  		if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
>>  			opregion->vbt = vbt;
>>  			opregion->vbt_size = vbt_size;
>> +			DRM_DEBUG_DRIVER("VBT from RVDA\n");
>> +		} else {
>> +			vbt = base + OPREGION_VBT_OFFSET;
>> +			vbt_size = OPREGION_ASLE_EXT_OFFSET - OPREGION_VBT_OFFSET;
>> +			if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
>> +				opregion->vbt = vbt;
>> +				opregion->vbt_size = vbt_size;
>> +			}
>>  		}
>>  	}
>>  
>
>
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index ca8c2a64bc6d..8cfac7398568 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -457,6 +457,7 @@  struct intel_opregion {
 	u32 swsci_gbda_sub_functions;
 	u32 swsci_sbcb_sub_functions;
 	struct opregion_asle *asle;
+	void *rvda;
 	const void *vbt;
 	u32 vbt_size;
 	u32 *lid_state;
diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
index e89ee2383fe1..a139889dd45b 100644
--- a/drivers/gpu/drm/i915/intel_opregion.c
+++ b/drivers/gpu/drm/i915/intel_opregion.c
@@ -837,6 +837,10 @@  void intel_opregion_fini(struct drm_device *dev)
 
 	/* just clear all opregion memory pointers now */
 	memunmap(opregion->header);
+	if (opregion->rvda) {
+		memunmap(opregion->rvda);
+		opregion->rvda = NULL;
+	}
 	opregion->header = NULL;
 	opregion->acpi = NULL;
 	opregion->swsci = NULL;
@@ -987,12 +991,29 @@  int intel_opregion_setup(struct drm_device *dev)
 		DRM_DEBUG_DRIVER("ASLE extension supported\n");
 
 	if (!dmi_check_system(intel_no_opregion_vbt)) {
-		const void *vbt = base + OPREGION_VBT_OFFSET;
-		u32 vbt_size = OPREGION_ASLE_EXT_OFFSET - OPREGION_VBT_OFFSET;
+		const void *vbt = NULL;
+		u32 vbt_size = 0;
+
+		if (opregion->header->opregion_ver >= 2 && opregion->asle &&
+		    opregion->asle->rvda && opregion->asle->rvds) {
+			opregion->rvda = memremap(opregion->asle->rvda,
+						  opregion->asle->rvds,
+						  MEMREMAP_WB);
+			vbt = opregion->rvda;
+			vbt_size = opregion->asle->rvds;
+		}
 
 		if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
 			opregion->vbt = vbt;
 			opregion->vbt_size = vbt_size;
+			DRM_DEBUG_DRIVER("VBT from RVDA\n");
+		} else {
+			vbt = base + OPREGION_VBT_OFFSET;
+			vbt_size = OPREGION_ASLE_EXT_OFFSET - OPREGION_VBT_OFFSET;
+			if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
+				opregion->vbt = vbt;
+				opregion->vbt_size = vbt_size;
+			}
 		}
 	}