[Intel-gfx] [PATCH] drm/i915: Parsing VBT if size of VBT exceeds 6KB
Jani Nikula
jani.nikula at intel.com
Mon Dec 14 02:56:46 PST 2015
On Mon, 14 Dec 2015, Chris Wilson <chris at chris-wilson.co.uk> wrote:
> On Mon, Dec 14, 2015 at 05:46:41PM +0530, Deepak M wrote:
>> Currently the iomap for VBT works only if the size of the
>> VBT is less than 6KB, but if the size of the VBT exceeds
>> 6KB than the physical address and the size of the VBT to
>> be iomapped is specified in the mailbox3 and is iomapped
>> accordingly.
>>
>> v3: -Splitted the patch into small ones
>> -Handeled memory unmap in intel_opregion_fini
>> -removed the new file created for opregion macro`s
>> v4: Moving the vbt assignment after the opregion fields are assigned
>>
>> Cc: Mika Kahola <mika.kahola at intel.com>
>> Cc: Jani Nikula <jani.nikula at intel.com>
>> Signed-off-by: Deepak M <m.deepak at intel.com>
>> ---
>>
>> drivers/gpu/drm/i915/intel_opregion.c | 47 +++++++++++++++++++++++++----------
>> 1 file changed, 34 insertions(+), 13 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
>> index 7908a1d..5116690 100644
>> --- a/drivers/gpu/drm/i915/intel_opregion.c
>> +++ b/drivers/gpu/drm/i915/intel_opregion.c
>> @@ -856,6 +856,8 @@ void intel_opregion_fini(struct drm_device *dev)
>> }
>>
>> /* just clear all opregion memory pointers now */
>> + if (opregion->header->opregion_ver >= 2 && opregion->asle->rvda)
>> + memunmap(opregion->vbt);
>> memunmap(opregion->header);
>> opregion->header = NULL;
>> opregion->acpi = NULL;
>> @@ -933,7 +935,8 @@ int intel_opregion_setup(struct drm_device *dev)
>> char buf[sizeof(OPREGION_SIGNATURE)];
>> const struct vbt_header *vbt = NULL;
>> int err = 0;
>> - void *base;
>> + void *base, *vbt_base;
>> + size_t size;
>>
>> BUILD_BUG_ON(sizeof(struct opregion_header) != 0x100);
>> BUILD_BUG_ON(sizeof(struct opregion_acpi) != 0x100);
>> @@ -963,19 +966,7 @@ int intel_opregion_setup(struct drm_device *dev)
>> goto err_out;
>> }
>>
>> - vbt = validate_vbt(base + OPREGION_VBT_OFFSET,
>> - MAILBOX_4_SIZE, "OpRegion");
>> -
>> - if (vbt == NULL) {
>> - err = -EINVAL;
>> - goto err_out;
>> - }
>> -
>> - vbt = (const struct vbt_header *)(base + OPREGION_VBT_OFFSET);
>> - dev_priv->opregion.vbt_size = vbt->vbt_size;
>> -
>> opregion->header = base;
>> - opregion->vbt = base + OPREGION_VBT_OFFSET;
>>
>> opregion->lid_state = base + ACPI_CLID;
>> opregion->asle_ext = base + OPREGION_ASLE_EXT_OFFSET;
>> @@ -998,6 +989,36 @@ int intel_opregion_setup(struct drm_device *dev)
>> opregion->asle->ardy = ASLE_ARDY_NOT_READY;
>> }
>>
>> + /*
>> + * Non-zero value in rvda field is an indication to driver that a
>> + * valid Raw VBT is stored in that address and driver should not refer
>> + * to mailbox4 for getting VBT.
>> + */
>> + if (opregion->header->opregion_ver >= 2 && opregion->asle->rvda) {
>> + size = opregion->asle->rvds;
>> + vbt_base = memremap(opregion->asle->rvda,
>> + size, MEMREMAP_WB);
>> + } else {
>> + size = MAILBOX_4_SIZE;
>> + vbt_base = base + OPREGION_VBT_OFFSET;
>> + }
>> +
>> + vbt = validate_vbt(vbt_base, size, "OpRegion");
>> +
>> + if (vbt == NULL) {
>> + err = -EINVAL;
>> + goto err_out;
>> + }
>> +
>> + /* Assigning the vbt_size based on the VBT location */
>> + if (opregion->header->opregion_ver >= 2 && opregion->asle->rvda)
>> + dev_priv->opregion.vbt_size = opregion->asle->rvds;
>> + else {
>> + vbt = (const struct vbt_header *)(base + OPREGION_VBT_OFFSET);
> i.e. vbt = vbt_base;
>
> which is already done by vbt = validate_vbt;
>
>> + dev_priv->opregion.vbt_size = vbt->vbt_size;
>> + }
>
> So this reduces down to:
>
> /* Explanation why the new method cannot store the size in vbt->vbt_size */
> if (vbt != opregion->asle->rvda)
> size = vbt->vbt_size;
> dev_priv->opregion.vbt_size = size;
> opregrion->vbt = vbt;
>
> And the vbt_base variable is redundant.
>
> Cut out the tautology and reduce the apparent complex
> interdependence between paths.
I rewrote patches 2-6 in this series into a new VBT/opregion refactoring
series [1] that should clean this up.
BR,
Jani.
[1] http://mid.gmane.org/cover.1450089383.git.jani.nikula@intel.com
--
Jani Nikula, Intel Open Source Technology Center
More information about the Intel-gfx
mailing list