From patchwork Mon May 11 09:52:49 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Li, Zhen-Hua" X-Patchwork-Id: 6375451 X-Patchwork-Delegate: bhelgaas@google.com Return-Path: X-Original-To: patchwork-linux-pci@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 7C88B9F1C2 for ; Mon, 11 May 2015 09:57:34 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 905DC2025B for ; Mon, 11 May 2015 09:57:33 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8C6F320222 for ; Mon, 11 May 2015 09:57:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753420AbbEKJyd (ORCPT ); Mon, 11 May 2015 05:54:33 -0400 Received: from g9t1613g.houston.hp.com ([15.240.0.71]:59100 "EHLO g9t1613g.houston.hp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753416AbbEKJy3 (ORCPT ); Mon, 11 May 2015 05:54:29 -0400 Received: from g1t5424.austin.hp.com (g1t5424.austin.hp.com [15.216.225.54]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by g9t1613g.houston.hp.com (Postfix) with ESMTPS id 5217161ED9; Mon, 11 May 2015 09:54:28 +0000 (UTC) Received: from g2t2360.austin.hp.com (g2t2360.austin.hp.com [16.197.8.247]) by g1t5424.austin.hp.com (Postfix) with ESMTP id 27A03116; Mon, 11 May 2015 09:54:26 +0000 (UTC) Received: from piepie.asiapacific.hpqcorp.net (piepie.asiapacific.hpqcorp.net [16.187.246.216]) by g2t2360.austin.hp.com (Postfix) with ESMTP id 7AAC49F; Mon, 11 May 2015 09:54:21 +0000 (UTC) From: "Li, Zhen-Hua" To: , , , , , Cc: , , , , , , , , , , , , , , , Subject: [PATCH v11 05/10] iommu/vt-d: Add functions to load and save old re Date: Mon, 11 May 2015 17:52:49 +0800 Message-Id: <1431337974-545-6-git-send-email-zhen-hual@hp.com> X-Mailer: git-send-email 2.0.0-rc0 In-Reply-To: <1431337974-545-1-git-send-email-zhen-hual@hp.com> References: <1431337974-545-1-git-send-email-zhen-hual@hp.com> Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable 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 Add functions to load root entry table from old kernel, and to save updated root entry table. Add two member in struct intel_iommu, to store the RTA in old kernel, and the mapped virt address of it. We use the old RTA in dump kernel, and when the iommu->root_entry is used as a cache in kdump kernel, its phys address will not be save to RTA register, but when its data is changed, we will save the new data to old root entry table. Li, Zhen-hua: The functions and logics. Takao Indoh: Add __iommu_flush_cache. Signed-off-by: Li, Zhen-Hua Signed-off-by: Takao Indoh --- drivers/iommu/intel-iommu.c | 54 ++++++++++++++++++++++++++++++++++++++++++++- include/linux/intel-iommu.h | 3 +++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index 0b97c15..3a5d446 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -371,6 +371,10 @@ static struct context_entry *device_to_existing_context_entry( struct intel_iommu *iommu, u8 bus, u8 devfn); +static void __iommu_load_old_root_entry(struct intel_iommu *iommu); + +static void __iommu_update_old_root_entry(struct intel_iommu *iommu, int index); + /* * A structure used to store the address allocated by ioremap(); * The we need to call iounmap() to free them out of spin_lock_irqsave/unlock; @@ -382,7 +386,6 @@ struct iommu_remapped_entry { static LIST_HEAD(__iommu_remapped_mem); static DEFINE_MUTEX(__iommu_mem_list_lock); - /* * This domain is a statically identity mapping domain. * 1. This domain creats a static 1:1 mapping to all usable memory. @@ -4935,3 +4938,52 @@ int __iommu_free_mapped_mem(void) return 0; } +/* + * Load the old root entry table to new root entry table. + */ +static void __iommu_load_old_root_entry(struct intel_iommu *iommu) +{ + if ((!iommu) + || (!iommu->root_entry) + || (!iommu->root_entry_old_virt) + || (!iommu->root_entry_old_phys)) + return; + memcpy(iommu->root_entry, iommu->root_entry_old_virt, PAGE_SIZE); + + __iommu_flush_cache(iommu, iommu->root_entry, PAGE_SIZE); +} + +/* + * When the data in new root entry table is changed, this function + * must be called to save the updated data to old root entry table. + */ +static void __iommu_update_old_root_entry(struct intel_iommu *iommu, int index) +{ + u8 start; + unsigned long size; + void __iomem *to; + void *from; + + if ((!iommu) + || (!iommu->root_entry) + || (!iommu->root_entry_old_virt) + || (!iommu->root_entry_old_phys)) + return; + + if (index < -1 || index >= ROOT_ENTRY_NR) + return; + + if (index == -1) { + start = 0; + size = ROOT_ENTRY_NR * sizeof(struct root_entry); + } else { + start = index * sizeof(struct root_entry); + size = sizeof(struct root_entry); + } + to = iommu->root_entry_old_virt; + from = iommu->root_entry; + memcpy(to + start, from + start, size); + + __iommu_flush_cache(iommu, to + start, size); +} + diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h index ced1fac..e7cac12 100644 --- a/include/linux/intel-iommu.h +++ b/include/linux/intel-iommu.h @@ -340,6 +340,9 @@ struct intel_iommu { spinlock_t lock; /* protect context, domain ids */ struct root_entry *root_entry; /* virtual address */ + void __iomem *root_entry_old_virt; /* mapped from old root entry */ + unsigned long root_entry_old_phys; /* root entry in old kernel */ + struct iommu_flush flush; #endif struct q_inval *qi; /* Queued invalidation info */