From patchwork Mon Nov 30 22:47:09 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Deepak M X-Patchwork-Id: 7728391 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id DB2B8BEEE1 for ; Mon, 30 Nov 2015 17:13:30 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 0E5B320515 for ; Mon, 30 Nov 2015 17:13:30 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 05FA82058E for ; Mon, 30 Nov 2015 17:13:29 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id B10DD6E621; Mon, 30 Nov 2015 09:13:27 -0800 (PST) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by gabe.freedesktop.org (Postfix) with ESMTP id E140F6E5B3 for ; Mon, 30 Nov 2015 09:13:24 -0800 (PST) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga102.jf.intel.com with ESMTP; 30 Nov 2015 09:13:23 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.20,365,1444719600"; d="scan'208";a="861391568" Received: from mdeepakubuntudesk01-desktop.iind.intel.com ([10.223.26.119]) by orsmga002.jf.intel.com with ESMTP; 30 Nov 2015 09:13:21 -0800 From: Deepak M To: intel-gfx@lists.freedesktop.org Date: Tue, 1 Dec 2015 04:17:09 +0530 Message-Id: <1448923632-16760-7-git-send-email-m.deepak@intel.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1448923632-16760-1-git-send-email-m.deepak@intel.com> References: <1448923632-16760-1-git-send-email-m.deepak@intel.com> Cc: Deepak M , Jani Nikula Subject: [Intel-gfx] [MIPI SEQ PARSING v3 06/13] drm/i915: Parsing VBT if size of VBT exceeds 6KB X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Spam-Status: No, score=-1.2 required=5.0 tests=BAYES_00, DATE_IN_FUTURE_03_06, RCVD_IN_DNSWL_MED,T_RP_MATCHES_RCVD,UNPARSEABLE_RELAY autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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 Cc: Jani Nikula Signed-off-by: Deepak M --- drivers/gpu/drm/i915/intel_opregion.c | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c index 7908a1d..b3a5709 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,37 @@ int intel_opregion_setup(struct drm_device *dev) goto err_out; } - vbt = validate_vbt(base + OPREGION_VBT_OFFSET, - MAILBOX_4_SIZE, "OpRegion"); + /* + * 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; } - vbt = (const struct vbt_header *)(base + OPREGION_VBT_OFFSET); - dev_priv->opregion.vbt_size = vbt->vbt_size; + /* 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); + dev_priv->opregion.vbt_size = vbt->vbt_size; + } opregion->header = base; - opregion->vbt = base + OPREGION_VBT_OFFSET; + opregion->vbt = vbt_base; opregion->lid_state = base + ACPI_CLID; opregion->asle_ext = base + OPREGION_ASLE_EXT_OFFSET;