Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp521796imu; Thu, 20 Dec 2018 00:32:08 -0800 (PST) X-Google-Smtp-Source: AFSGD/Xza3+fXjZoap8Lqa1ASr2hnzopBFS3HBVJE/hZ+P5NFBOEpZuOKaG0rpQNeeBIjOh1R3BH X-Received: by 2002:a62:fc52:: with SMTP id e79mr23775409pfh.8.1545294728046; Thu, 20 Dec 2018 00:32:08 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1545294728; cv=none; d=google.com; s=arc-20160816; b=FaJQXTgBh1llZ2df4uqrl1+rMWb+XcSwkRJzijceOJbV1XvoZbZgLqBosBxgFj1J3B omqjxDIKVH0UTaWMaHd46O1bhA1IJ2sBBfPaliwwaNoHUytr0hOTPi2ZjV7HzrLi/fGo uPGhsjeQVll9/87BiEO54suNz3/aRwkdXTeVTPUsd/HnC+xmZ6DQ912vA0n+N8LoNfyp /bl2GVh9KgTjyhGz8AVkObbEyGv+MdCEVV9p9lOx3XlinEY99Rs1Ua2K8IAkK6+WmGNk 3N79Xvz2c28tq8RgP2fVE9mmpiLnXVYZ/vjGANq2W9TOuOWAm5q9CXhJT4GxhX2se1Hd Tb9A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=6PCap8ivlmxwfh79Lcv8nSBGrHKcGnePK1RuQVCh+1Q=; b=lEWAOJgRrUIVWwlKZQojwswv+3m8lzz5rT4ONNTO8XHsrswIbj8xdT5szvALtJlOxT 3kscYTanL7YtzVE2Z8P/PAuuUhUxBzWoMaaYMrT5HcbZlKz21ep1/aJ5FZEubKztQOLk JeKd2A0cWuDt+3RVPP0Xg4jxhiVaS9FwN1QPM/EQaQmtRP2cRlAIXDPauG8clBd9TO5B AN0/dfvpm+9oeqpmp9eKKerqNI6yWI2IW3UvYwUS4PWay/EZ9b6/UQSJmHagvNUfU5JF EVgadm3NCaaoCOViq5kTl4oHKdume5edOQU9Qrw48szUfMisnRnODPB7iMtBwzJjJBvH s2og== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q73si14432938pfi.205.2018.12.20.00.31.52; Thu, 20 Dec 2018 00:32:08 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731063AbeLTIYy (ORCPT + 99 others); Thu, 20 Dec 2018 03:24:54 -0500 Received: from ozlabs.ru ([107.173.13.209]:54711 "EHLO ozlabs.ru" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730982AbeLTIYv (ORCPT ); Thu, 20 Dec 2018 03:24:51 -0500 Received: from fstn1-p1.ozlabs.ibm.com (localhost [IPv6:::1]) by ozlabs.ru (Postfix) with ESMTP id B15F9AE8035E; Thu, 20 Dec 2018 03:24:47 -0500 (EST) From: Alexey Kardashevskiy To: linuxppc-dev@lists.ozlabs.org Cc: Alexey Kardashevskiy , David Gibson , kvm-ppc@vger.kernel.org, kvm@vger.kernel.org, Alistair Popple , Reza Arbab , Sam Bobroff , Piotr Jaroszynski , =?UTF-8?q?Leonardo=20Augusto=20Guimar=C3=A3es=20Garcia?= , Jose Ricardo Ziviani , Daniel Henrique Barboza , Alex Williamson , Paul Mackerras , linux-kernel@vger.kernel.org, Christoph Hellwig Subject: [PATCH kernel v7 15/20] powerpc/powernv/npu: Add release_ownership hook Date: Thu, 20 Dec 2018 19:23:45 +1100 Message-Id: <20181220082350.58113-16-aik@ozlabs.ru> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181220082350.58113-1-aik@ozlabs.ru> References: <20181220082350.58113-1-aik@ozlabs.ru> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In order to make ATS work and translate addresses for arbitrary LPID and PID, we need to program an NPU with LPID and allow PID wildcard matching with a specific MSR mask. This implements a helper to assign a GPU to LPAR and program the NPU with a wildcard for PID and a helper to do clean-up. The helper takes MSR (only DR/HV/PR/SF bits are allowed) to program them into NPU2 for ATS checkout requests support. This exports pnv_npu2_unmap_lpar_dev() as following patches will use it from the VFIO driver. Signed-off-by: Alexey Kardashevskiy --- Changes: v5: * removed opal_purge_cache as it is a part of reset in skiboot now --- arch/powerpc/platforms/powernv/npu-dma.c | 51 ++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/arch/powerpc/platforms/powernv/npu-dma.c b/arch/powerpc/platforms/powernv/npu-dma.c index d93a2cd..e06043b 100644 --- a/arch/powerpc/platforms/powernv/npu-dma.c +++ b/arch/powerpc/platforms/powernv/npu-dma.c @@ -300,6 +300,7 @@ static void pnv_npu_take_ownership(struct iommu_table_group *table_group) table_group); struct pnv_phb *phb = npe->phb; int64_t rc; + struct pci_dev *gpdev = NULL; /* * Note: NPU has just a single TVE in the hardware which means that @@ -321,12 +322,28 @@ static void pnv_npu_take_ownership(struct iommu_table_group *table_group) return; } pnv_pci_ioda2_tce_invalidate_entire(npe->phb, false); + + get_gpu_pci_dev_and_pe(npe, &gpdev); + if (gpdev) + pnv_npu2_unmap_lpar_dev(gpdev); +} + +static void pnv_npu_release_ownership(struct iommu_table_group *table_group) +{ + struct pnv_ioda_pe *npe = container_of(table_group, struct pnv_ioda_pe, + table_group); + struct pci_dev *gpdev = NULL; + + get_gpu_pci_dev_and_pe(npe, &gpdev); + if (gpdev) + pnv_npu2_map_lpar_dev(gpdev, 0, MSR_DR | MSR_PR | MSR_HV); } static struct iommu_table_group_ops pnv_pci_npu_ops = { .set_window = pnv_npu_set_window, .unset_window = pnv_npu_unset_window, .take_ownership = pnv_npu_take_ownership, + .release_ownership = pnv_npu_release_ownership, }; #endif /* !CONFIG_IOMMU_API */ @@ -1237,3 +1254,37 @@ void pnv_npu2_map_lpar(struct pnv_ioda_pe *gpe, unsigned long msr) list_for_each_entry(gpdev, &gpe->pbus->devices, bus_list) pnv_npu2_map_lpar_dev(gpdev, 0, msr); } + +int pnv_npu2_unmap_lpar_dev(struct pci_dev *gpdev) +{ + int ret; + struct pci_dev *npdev = pnv_pci_get_npu_dev(gpdev, 0); + struct pci_controller *hose; + struct pnv_phb *nphb; + + if (!npdev) + return -ENODEV; + + hose = pci_bus_to_host(npdev->bus); + nphb = hose->private_data; + + dev_dbg(&gpdev->dev, "destroy context opalid=%llu\n", + nphb->opal_id); + ret = opal_npu_destroy_context(nphb->opal_id, 0/*__unused*/, + PCI_DEVID(gpdev->bus->number, gpdev->devfn)); + if (ret < 0) { + dev_err(&gpdev->dev, "Failed to destroy context: %d\n", ret); + return ret; + } + + /* Set LPID to 0 anyway, just to be safe */ + dev_dbg(&gpdev->dev, "Map LPAR opalid=%llu lparid=0\n", nphb->opal_id); + ret = opal_npu_map_lpar(nphb->opal_id, + PCI_DEVID(gpdev->bus->number, gpdev->devfn), 0 /*LPID*/, + 0 /* LPCR bits */); + if (ret) + dev_err(&gpdev->dev, "Error %d mapping device to LPAR\n", ret); + + return ret; +} +EXPORT_SYMBOL_GPL(pnv_npu2_unmap_lpar_dev); -- 2.17.1