Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp2238376pxk; Sat, 26 Sep 2020 23:48:07 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy0FHGfNXbhosZLOF6S71JR4f8cLIEqSAWMFrj4k+wfFalVdGUdZ5LklsIdat3KSamfKFVJ X-Received: by 2002:a17:906:4e4a:: with SMTP id g10mr9929048ejw.274.1601189287604; Sat, 26 Sep 2020 23:48:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1601189287; cv=none; d=google.com; s=arc-20160816; b=EiRGmYRbzOCpF8FFvPbpndmMWbEefx/G3QQxBoaqD60dP/qMDuKHXxsDrKgUQp8trt Yz8mCYAkEik6ewBTNBRVOzUgZH51YSdXKBs0MaSwrTj/4fgcV0QjaMk1/J6EaOsnY/5W Wp7cQJJ3ZC+rPuoTt6Gib6KTSBWjQxXb4+b/RopQopYHpfmlaQ/l+geFSSAPTNM52qDR tglqyYVNngpT+HL4SWZKd8ZW+XJLVdOGvmVp9uYbE3bvA/EIvCnD4+esuii17F5Gbq9x vh4kHza+aWoOA0lE/4TsdxsCU+zz4KAMrHyDaO8Xg7Co5QKJZrC4epjEqNmby33o/Ztc b0Hg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:ironport-sdr:ironport-sdr; bh=gpqjG1c1TfC12VYSCZfM4faqMs0hToaN3BuUcYd0Sb0=; b=m9H1ugp3Ivr7/S/chKEqWt716c1+PXwJFl8c1khQgI52lnyvt+eJL5d53Xh0UySz4+ JOBWPI6yLAm8PGUv9r89OmdapXi+fCV/qVc5uL98jS6q1bjwrU90Y25+sdVH7iXSt3GD MMV0R5KN3rWeig0/6JcUeSF71ZAwWKPLonE4lmqalMmWI81pVxUwDMgYwwMJOL6xQLPl fa2PKt65PG6GrFp0kdDmfSvjWGxUg6+zj0TjGnO/xDzD5N2+gwbSZfKxhDqhEjaK4EKI aaQiC2oCstMv79WvcY7QyWIM813oC5AGV2Jidz0kRCWwJA/ncz8WOdzuuSfqBabPB/3H d38A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bw19si5127552ejb.208.2020.09.26.23.47.44; Sat, 26 Sep 2020 23:48:07 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730349AbgI0Gpx (ORCPT + 99 others); Sun, 27 Sep 2020 02:45:53 -0400 Received: from mga17.intel.com ([192.55.52.151]:36243 "EHLO mga17.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730215AbgI0Gpw (ORCPT ); Sun, 27 Sep 2020 02:45:52 -0400 IronPort-SDR: FC/p30r3Jo7b7WDzA58Ua28OQL28O6RwZjIhpye9R/Z0mLTZnIWmznzjoK3wC9gNli+Ndvk/Xa Y73ijSvpRiWg== X-IronPort-AV: E=McAfee;i="6000,8403,9756"; a="141863658" X-IronPort-AV: E=Sophos;i="5.77,309,1596524400"; d="scan'208";a="141863658" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Sep 2020 23:40:59 -0700 IronPort-SDR: yyetCEI92Vkdd2fRiKN80N6g9H2K2NQHrZbVcqIWn0izUB6WNFRqFcmOKCQXnZIiqRk8dK+FQy I+xxWqijzaiA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.77,309,1596524400"; d="scan'208";a="349457836" Received: from allen-box.sh.intel.com ([10.239.159.139]) by FMSMGA003.fm.intel.com with ESMTP; 26 Sep 2020 23:40:57 -0700 From: Lu Baolu To: Joerg Roedel , Tom Murphy , David Woodhouse , Christoph Hellwig Cc: Ashok Raj , Tvrtko Ursulin , Intel-gfx@lists.freedesktop.org, iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org, Lu Baolu Subject: [PATCH v4 4/7] iommu: Add quirk for Intel graphic devices in map_sg Date: Sun, 27 Sep 2020 14:34:34 +0800 Message-Id: <20200927063437.13988-5-baolu.lu@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200927063437.13988-1-baolu.lu@linux.intel.com> References: <20200927063437.13988-1-baolu.lu@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Combining the sg segments exposes a bug in the Intel i915 driver which causes visual artifacts and the screen to freeze. This is most likely because of how the i915 handles the returned list. It probably doesn't respect the returned value specifying the number of elements in the list and instead depends on the previous behaviour of the Intel iommu driver which would return the same number of elements in the output list as in the input list. Signed-off-by: Tom Murphy Signed-off-by: Lu Baolu --- drivers/iommu/dma-iommu.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c index 3526db774611..e7e4d758f51a 100644 --- a/drivers/iommu/dma-iommu.c +++ b/drivers/iommu/dma-iommu.c @@ -879,6 +879,33 @@ static int __finalise_sg(struct device *dev, struct scatterlist *sg, int nents, unsigned int cur_len = 0, max_len = dma_get_max_seg_size(dev); int i, count = 0; + /* + * The Intel graphic driver is used to assume that the returned + * sg list is not combound. This blocks the efforts of converting + * Intel IOMMU driver to dma-iommu api's. Add this quirk to make the + * device driver work and should be removed once it's fixed in i915 + * driver. + */ + if (IS_ENABLED(CONFIG_DRM_I915) && dev_is_pci(dev) && + to_pci_dev(dev)->vendor == PCI_VENDOR_ID_INTEL && + (to_pci_dev(dev)->class >> 16) == PCI_BASE_CLASS_DISPLAY) { + for_each_sg(sg, s, nents, i) { + unsigned int s_iova_off = sg_dma_address(s); + unsigned int s_length = sg_dma_len(s); + unsigned int s_iova_len = s->length; + + s->offset += s_iova_off; + s->length = s_length; + sg_dma_address(s) = dma_addr + s_iova_off; + sg_dma_len(s) = s_length; + dma_addr += s_iova_len; + + pr_info_once("sg combining disabled due to i915 driver\n"); + } + + return nents; + } + for_each_sg(sg, s, nents, i) { /* Restore this segment's original unaligned fields first */ unsigned int s_iova_off = sg_dma_address(s); -- 2.17.1