From patchwork Wed Jan 9 12:41:20 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pierre Morel X-Patchwork-Id: 10754065 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 1D8A691E for ; Wed, 9 Jan 2019 12:55:42 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0BBE928E08 for ; Wed, 9 Jan 2019 12:55:42 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0000C28E2F; Wed, 9 Jan 2019 12:55:41 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 66B4C28E08 for ; Wed, 9 Jan 2019 12:55:41 +0000 (UTC) Received: from localhost ([127.0.0.1]:58031 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ghDOW-0004J0-LC for patchwork-qemu-devel@patchwork.kernel.org; Wed, 09 Jan 2019 07:55:40 -0500 Received: from eggs.gnu.org ([209.51.188.92]:42034) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ghDKl-0000tI-OH for qemu-devel@nongnu.org; Wed, 09 Jan 2019 07:51:48 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ghDAs-0004CE-5c for qemu-devel@nongnu.org; Wed, 09 Jan 2019 07:41:36 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:52858 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ghDAq-0004BI-F2 for qemu-devel@nongnu.org; Wed, 09 Jan 2019 07:41:33 -0500 Received: from pps.filterd (m0098420.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id x09CYHFq121897 for ; Wed, 9 Jan 2019 07:41:31 -0500 Received: from e06smtp07.uk.ibm.com (e06smtp07.uk.ibm.com [195.75.94.103]) by mx0b-001b2d01.pphosted.com with ESMTP id 2pwejsy26k-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 09 Jan 2019 07:41:31 -0500 Received: from localhost by e06smtp07.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 9 Jan 2019 12:41:29 -0000 Received: from b06cxnps4075.portsmouth.uk.ibm.com (9.149.109.197) by e06smtp07.uk.ibm.com (192.168.101.137) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Wed, 9 Jan 2019 12:41:27 -0000 Received: from d06av22.portsmouth.uk.ibm.com (d06av22.portsmouth.uk.ibm.com [9.149.105.58]) by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id x09CfPdv197040 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 9 Jan 2019 12:41:25 GMT Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7BC194C05A; Wed, 9 Jan 2019 12:41:25 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3CDC14C04A; Wed, 9 Jan 2019 12:41:25 +0000 (GMT) Received: from morel-ThinkPad-W530.boeblingen.de.ibm.com (unknown [9.152.224.140]) by d06av22.portsmouth.uk.ibm.com (Postfix) with ESMTP; Wed, 9 Jan 2019 12:41:25 +0000 (GMT) From: Pierre Morel To: walling@linux.ibm.com Date: Wed, 9 Jan 2019 13:41:20 +0100 X-Mailer: git-send-email 2.7.4 In-Reply-To: <1547037680-21458-1-git-send-email-pmorel@linux.ibm.com> References: <1547037680-21458-1-git-send-email-pmorel@linux.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 19010912-0028-0000-0000-000003367CC5 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 19010912-0029-0000-0000-000023F38D86 Message-Id: <1547037680-21458-4-git-send-email-pmorel@linux.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:, , definitions=2019-01-09_07:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=1 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000 definitions=main-1901090106 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy] X-Received-From: 148.163.158.5 Subject: [Qemu-devel] [PATCH v1 3/3] s390x/pci: Reporting the host aperture to the guest X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, david@redhat.com, cohuck@redhat.com, qemu-devel@nongnu.org, pasic@linux.ibm.com, borntraeger@de.ibm.com, qemu-s390x@nongnu.org, rth@twiddle.net Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP The S390 PCI driver in the guest needs to know the IOMMU aperture associated with the zPCI real device in the host through Start DMA and End DMA value in the response to the Get Function Group information query. Let's report these SDMA and EDMA using the value we got from the host through the real IOMMU associated with the VFIO container. Signed-off-by: Pierre Morel --- hw/s390x/s390-pci-bus.c | 2 +- hw/s390x/s390-pci-bus.h | 3 +++ hw/s390x/s390-pci-inst.c | 20 +++++++++++++++++--- hw/vfio/common.c | 4 +++- include/hw/vfio/vfio-common.h | 3 +++ 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c index 27963b2..29177ac 100644 --- a/hw/s390x/s390-pci-bus.c +++ b/hw/s390x/s390-pci-bus.c @@ -551,7 +551,7 @@ static void s390_pci_iommu_replay(IOMMUMemoryRegion *iommu, return; } -static S390PCIIOMMU *s390_pci_get_iommu(S390pciState *s, PCIBus *bus, +S390PCIIOMMU *s390_pci_get_iommu(S390pciState *s, PCIBus *bus, int devfn) { uint64_t key = (uintptr_t)bus; diff --git a/hw/s390x/s390-pci-bus.h b/hw/s390x/s390-pci-bus.h index 1f7f9b5..951a3d8 100644 --- a/hw/s390x/s390-pci-bus.h +++ b/hw/s390x/s390-pci-bus.h @@ -276,6 +276,8 @@ typedef struct S390PCIIOMMU { IOMMUMemoryRegion iommu_mr; bool enabled; uint64_t g_iota; + uint64_t sdma; + uint64_t edma; uint64_t pba; uint64_t pal; GHashTable *iotlb; @@ -344,5 +346,6 @@ S390PCIBusDevice *s390_pci_find_dev_by_target(S390pciState *s, const char *target); S390PCIBusDevice *s390_pci_find_next_avail_dev(S390pciState *s, S390PCIBusDevice *pbdev); +S390PCIIOMMU *s390_pci_get_iommu(S390pciState *s, PCIBus *bus, int devfn); #endif diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c index 7b61367..5125c1b 100644 --- a/hw/s390x/s390-pci-inst.c +++ b/hw/s390x/s390-pci-inst.c @@ -19,6 +19,7 @@ #include "exec/memory-internal.h" #include "qemu/error-report.h" #include "sysemu/hw_accel.h" +#include "hw/vfio/vfio-common.h" #ifndef DEBUG_S390PCI_INST #define DEBUG_S390PCI_INST 0 @@ -31,6 +32,16 @@ } \ } while (0) +void vfio_s390_iommu_setup(VFIOContainer *container, uint64_t min, + uint64_t max, uint64_t pgsize) +{ + S390PCIIOMMU *iommu; + + iommu = container_of(container->space->as, S390PCIIOMMU, as); + iommu->sdma = min; + iommu->edma = max; +} + static void s390_set_status_code(CPUS390XState *env, uint8_t r, uint64_t status_code) { @@ -153,6 +164,7 @@ int clp_service_call(S390CPU *cpu, uint8_t r2, uintptr_t ra) uint8_t cc = 0; CPUS390XState *env = &cpu->env; S390pciState *s = s390_get_phb(); + S390PCIIOMMU *iommu; int i; if (env->psw.mask & PSW_MASK_PSTATE) { @@ -279,8 +291,10 @@ int clp_service_call(S390CPU *cpu, uint8_t r2, uintptr_t ra) resquery->bar_size[i]); } - stq_p(&resquery->sdma, ZPCI_SDMA_ADDR); - stq_p(&resquery->edma, ZPCI_EDMA_ADDR); + iommu = s390_pci_get_iommu(s, pci_get_bus(pbdev->pdev), + PCI_FUNC(pbdev->pdev->devfn)); + stq_p(&resquery->sdma, iommu->sdma); + stq_p(&resquery->edma, iommu->edma); stl_p(&resquery->fid, pbdev->fid); stw_p(&resquery->pchid, 0); stw_p(&resquery->ug, 1); @@ -860,7 +874,7 @@ static int reg_ioat(CPUS390XState *env, S390PCIIOMMU *iommu, ZpciFib fib, pba &= ~0xfff; pal |= 0xfff; - if (pba > pal || pba < ZPCI_SDMA_ADDR || pal > ZPCI_EDMA_ADDR) { + if (pba > pal || pba < iommu->sdma || pal > iommu->edma) { s390_program_interrupt(env, PGM_OPERAND, 6, ra); return -EINVAL; } diff --git a/hw/vfio/common.c b/hw/vfio/common.c index fd7e991..906b208 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -1045,7 +1045,6 @@ static void vfio_iommu_type1_get_info(int fd, VFIOContainer *container) int ret = 0; info = g_malloc0(argsz); - retry: info->argsz = argsz; info->flags = VFIO_IOMMU_INFO_CAPABILITIES; @@ -1079,6 +1078,8 @@ retry: dma_info->dma_end - dma_info->dma_start, info->iova_pgsizes); container->pgsizes = info->iova_pgsizes; + vfio_s390_iommu_setup(container, dma_info->dma_start, + dma_info->dma_end, info->iova_pgsizes); return; } hdr = (struct vfio_info_cap_header *)((unsigned char *) dma_info + @@ -1088,6 +1089,7 @@ out: /* Assume 4k IOVA page size */ vfio_host_win_add(container, 0, (hwaddr)-1, 4096); container->pgsizes = 4096; + vfio_s390_iommu_setup(container, 0, (hwaddr)-1, 4096); return; } diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h index 1b434d0..2c8bea8 100644 --- a/include/hw/vfio/vfio-common.h +++ b/include/hw/vfio/vfio-common.h @@ -198,4 +198,7 @@ int vfio_spapr_create_window(VFIOContainer *container, int vfio_spapr_remove_window(VFIOContainer *container, hwaddr offset_within_address_space); +void vfio_s390_iommu_setup(VFIOContainer *container, uint64_t min, + uint64_t max, uint64_t pgsize); + #endif /* HW_VFIO_VFIO_COMMON_H */