From patchwork Wed Jul 22 04:00:30 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Brian Woods X-Patchwork-Id: 11677233 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id BAA53913 for ; Wed, 22 Jul 2020 04:02:40 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 883D520792 for ; Wed, 22 Jul 2020 04:02:40 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=xilinx.onmicrosoft.com header.i=@xilinx.onmicrosoft.com header.b="rCAXgyTp" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 883D520792 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=xilinx.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1jy5wB-0001kO-Pn; Wed, 22 Jul 2020 04:00:59 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1jy5wA-0001kB-Sv for xen-devel@lists.xenproject.org; Wed, 22 Jul 2020 04:00:58 +0000 X-Inumbo-ID: f23470a4-cbcf-11ea-8613-bc764e2007e4 Received: from NAM10-MW2-obe.outbound.protection.outlook.com (unknown [40.107.94.67]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id f23470a4-cbcf-11ea-8613-bc764e2007e4; Wed, 22 Jul 2020 04:00:57 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Ce2MugMj5Gi+e++p25NcYhkNyz+cJiWkYQhiEJx8Wkw3JKYLCCvIIROAxGF6wuMbcJ66UmDEiaSzoDClw3M5WAgk8W/1r6w+MAfuof/43qayzw4M/aPn+pWdtqlNxIpfJsX9woXS1chU0lf208qJN4a3tm+hf722J9/T84mgNcOkXhDmjpIrwRwjhWuzoWWh97OwJfP2g9C9fXeOLtF0DdcVDGJts3Z/uHePfgKe2oIXSKHcZc7qFjpNWC8pB8bXHBqyWbajEXHjqfA8f5m/kzOwXBSTmdBPkjr0m14pYi/UNjnN4VgyuT5dJYjCMLZCGsyOy3Xoy/+6ptZxrjzpIg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=lu6/sGI2fQO/GKysq+3npebONed5SiclapckpPkFhvQ=; b=UGqr855hhUf8FB47Rlkuhwm6DRwGcWrlfTajdO9gB/8RtrnP64ENiVFpj3do2ITz5hQqSuxF000LQmI//x8Q7tGj1F7xqHW1zP0BLCWenHxF1UqeD+hy0E9HPAHBnbAvK9ZJbimk8yW5nRk1+qSbnvjtb8r84YYHYdoXs8q89fv0th7ORtQbkMn8fxEtItbi9AqPoeIccjiKs2J4/hFHmvBjuxZjBxBkeIe2JDhUNVqNUOufwo0wE+GkM/OFc7PhLDyBbLUvVAhaZxyJg0ROmbuwY4zE3DMN3+nrMdTBo3AmqbFWMy6LMmpUP0mnFVXPMaGqx06I4N13sLOPFuCjCw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 149.199.60.83) smtp.rcpttodomain=epam.com smtp.mailfrom=xilinx.com; dmarc=bestguesspass action=none header.from=xilinx.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector2-xilinx-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=lu6/sGI2fQO/GKysq+3npebONed5SiclapckpPkFhvQ=; b=rCAXgyTpl084xUzdaV54SjN/pHqGBHb/s53ZRHMS3bgkt/lt7dG8NbfyI5KEvobO3aSQk03zxOkXU4cQLTuhWtVQOoGSkoSEmYplcay8uHqunthpZ4cXoO/xo9Y1PrT1r9VKm1PPNcV4h/4DheqsclmUCX+PXtMYRKokLa0Naks= Received: from CY4PR03CA0023.namprd03.prod.outlook.com (2603:10b6:903:33::33) by BYAPR02MB5717.namprd02.prod.outlook.com (2603:10b6:a03:122::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3174.20; Wed, 22 Jul 2020 04:00:54 +0000 Received: from CY1NAM02FT038.eop-nam02.prod.protection.outlook.com (2603:10b6:903:33:cafe::8a) by CY4PR03CA0023.outlook.office365.com (2603:10b6:903:33::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3216.22 via Frontend Transport; Wed, 22 Jul 2020 04:00:54 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; epam.com; dkim=none (message not signed) header.d=none;epam.com; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by CY1NAM02FT038.mail.protection.outlook.com (10.152.74.217) with Microsoft SMTP Server id 15.20.3216.10 via Frontend Transport; Wed, 22 Jul 2020 04:00:54 +0000 Received: from [149.199.38.66] (port=50304 helo=smtp.xilinx.com) by xsj-pvapsmtpgw01 with esmtp (Exim 4.90) (envelope-from ) id 1jy5uH-0007kk-Rs; Tue, 21 Jul 2020 20:59:01 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1jy5w5-0002zS-RT; Tue, 21 Jul 2020 21:00:53 -0700 Received: from xsj-pvapsmtp01 (mailhub.xilinx.com [149.199.38.66]) by xsj-smtp-dlp1.xlnx.xilinx.com (8.13.8/8.13.1) with ESMTP id 06M40jFj012848; Tue, 21 Jul 2020 21:00:45 -0700 Received: from [172.19.2.62] (helo=xsjwoods50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1jy5vx-0002u2-CN; Tue, 21 Jul 2020 21:00:45 -0700 From: Brian Woods To: xen-devel Subject: [RFC v2 1/2] arm,smmu: switch to using iommu_fwspec functions Date: Tue, 21 Jul 2020 21:00:30 -0700 Message-Id: <1595390431-24805-2-git-send-email-brian.woods@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1595390431-24805-1-git-send-email-brian.woods@xilinx.com> References: <1595390431-24805-1-git-send-email-brian.woods@xilinx.com> X-RCIS-Action: ALLOW X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.83; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:xsj-pvapsmtpgw01; PTR:unknown-60-83.xilinx.com; CAT:NONE; SFTY:; SFS:(376002)(39850400004)(136003)(346002)(396003)(46966005)(8936002)(83380400001)(356005)(336012)(9786002)(70206006)(81166007)(8676002)(86362001)(7696005)(70586007)(54906003)(186003)(2906002)(82740400003)(316002)(82310400002)(107886003)(44832011)(36756003)(5660300002)(426003)(47076004)(4326008)(6916009)(6666004)(26005)(2616005)(478600001)(142933001); DIR:OUT; SFP:1101; X-MS-PublicTrafficType: Email MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 8eb859d8-7d45-41d4-6a7a-08d82df3d4a4 X-MS-TrafficTypeDiagnostic: BYAPR02MB5717: X-Microsoft-Antispam-PRVS: X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-MS-Oob-TLC-OOBClassifiers: OLM:773; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: UfJ+Z5jvDffqDkebW77K0D8lMwezIGgAwMF0Gf1X1vwe2qkGXqrxzFJOAsAhi5Unx+oR3f1tNLpDDkBO8ck8Tjn/6NNyPtuQeS4mB8lDRPEqeKM7XvjOWtoEBhvOP+rqak/UuBmxPbarF9B/5I+yrcKTPLMKXJh4BE+3Ls8gK/XCJxo73ELjgGtFTpGsAWRv8yIv3EJvwllqjqsUGXqu8yISO2GyytqyFbeqzUKNe2c8VIVxqbkU45JNcFtv+XpgkihHTasjBtRaHiRVhnTA/fZ+n+8PTrr2RqMYg9HPjgdUwfXPmcHw9DbwNIFiofTmO40doWi57MPsSvQ5nplFjqQi06RjeMcVKEoljB8FO6eb8JAwQGwEedXbJDrA3N84swoWxBUHJhJD/FbxQJR2CGnsxF0uiSbllUADOJOp+gc= X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jul 2020 04:00:54.0703 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 8eb859d8-7d45-41d4-6a7a-08d82df3d4a4 X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c; Ip=[149.199.60.83]; Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-AuthSource: CY1NAM02FT038.eop-nam02.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BYAPR02MB5717 X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Volodymyr Babchuk , Stefano Stabellini , Julien Grall , Brian Woods Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" Modify the smmu driver so that it uses the iommu_fwspec helper functions. This means both ARM IOMMU drivers will both use the iommu_fwspec helper functions. Signed-off-by: Brian Woods --- Interested in if combining the legacy and generic bindings paths are worth or if Xen plans to depreicate legacy bindings at some point. v1 -> v2 - removed MAX_MASTER_STREAMIDS - removed unneeded curly brackets xen/drivers/passthrough/arm/smmu.c | 81 +++++++++++++++++++---------------- xen/drivers/passthrough/device_tree.c | 3 ++ 2 files changed, 47 insertions(+), 37 deletions(-) diff --git a/xen/drivers/passthrough/arm/smmu.c b/xen/drivers/passthrough/arm/smmu.c index 94662a8..7a5c6cd 100644 --- a/xen/drivers/passthrough/arm/smmu.c +++ b/xen/drivers/passthrough/arm/smmu.c @@ -49,6 +49,7 @@ #include #include #include +#include #include /* Xen: The below defines are redefined within the file. Undef it */ @@ -302,9 +303,6 @@ static struct iommu_group *iommu_group_get(struct device *dev) /***** Start of Linux SMMU code *****/ -/* Maximum number of stream IDs assigned to a single device */ -#define MAX_MASTER_STREAMIDS MAX_PHANDLE_ARGS - /* Maximum number of context banks per SMMU */ #define ARM_SMMU_MAX_CBS 128 @@ -597,8 +595,7 @@ struct arm_smmu_smr { }; struct arm_smmu_master_cfg { - int num_streamids; - u16 streamids[MAX_MASTER_STREAMIDS]; + struct iommu_fwspec *fwspec; struct arm_smmu_smr *smrs; }; @@ -779,7 +776,7 @@ static int register_smmu_master(struct arm_smmu_device *smmu, struct device *dev, struct of_phandle_args *masterspec) { - int i; + int i, ret = 0; struct arm_smmu_master *master; master = find_smmu_master(smmu, masterspec->np); @@ -790,34 +787,37 @@ static int register_smmu_master(struct arm_smmu_device *smmu, return -EBUSY; } - if (masterspec->args_count > MAX_MASTER_STREAMIDS) { - dev_err(dev, - "reached maximum number (%d) of stream IDs for master device %s\n", - MAX_MASTER_STREAMIDS, masterspec->np->name); - return -ENOSPC; - } - master = devm_kzalloc(dev, sizeof(*master), GFP_KERNEL); if (!master) return -ENOMEM; + master->of_node = masterspec->np; - master->of_node = masterspec->np; - master->cfg.num_streamids = masterspec->args_count; + ret = iommu_fwspec_init(&master->of_node->dev, smmu->dev); + if (ret) { + kfree(master); + return ret; + } + master->cfg.fwspec = dev_iommu_fwspec_get(&master->of_node->dev); + + /* adding the ids here */ + ret = iommu_fwspec_add_ids(&masterspec->np->dev, + masterspec->args, + masterspec->args_count); + if (ret) + return ret; /* Xen: Let Xen know that the device is protected by an SMMU */ dt_device_set_protected(masterspec->np); - for (i = 0; i < master->cfg.num_streamids; ++i) { - u16 streamid = masterspec->args[i]; - - if (!(smmu->features & ARM_SMMU_FEAT_STREAM_MATCH) && - (streamid >= smmu->num_mapping_groups)) { - dev_err(dev, - "stream ID for master device %s greater than maximum allowed (%d)\n", - masterspec->np->name, smmu->num_mapping_groups); - return -ERANGE; + if (!(smmu->features & ARM_SMMU_FEAT_STREAM_MATCH)) { + for (i = 0; i < master->cfg.fwspec->num_ids; ++i) { + if (masterspec->args[i] >= smmu->num_mapping_groups) { + dev_err(dev, + "stream ID for master device %s greater than maximum allowed (%d)\n", + masterspec->np->name, smmu->num_mapping_groups); + return -ERANGE; + } } - master->cfg.streamids[i] = streamid; } return insert_smmu_master(smmu, master); } @@ -1397,15 +1397,15 @@ static int arm_smmu_master_configure_smrs(struct arm_smmu_device *smmu, if (cfg->smrs) return -EEXIST; - smrs = kmalloc_array(cfg->num_streamids, sizeof(*smrs), GFP_KERNEL); + smrs = kmalloc_array(cfg->fwspec->num_ids, sizeof(*smrs), GFP_KERNEL); if (!smrs) { dev_err(smmu->dev, "failed to allocate %d SMRs\n", - cfg->num_streamids); + cfg->fwspec->num_ids); return -ENOMEM; } /* Allocate the SMRs on the SMMU */ - for (i = 0; i < cfg->num_streamids; ++i) { + for (i = 0; i < cfg->fwspec->num_ids; ++i) { int idx = __arm_smmu_alloc_bitmap(smmu->smr_map, 0, smmu->num_mapping_groups); if (IS_ERR_VALUE(idx)) { @@ -1416,12 +1416,12 @@ static int arm_smmu_master_configure_smrs(struct arm_smmu_device *smmu, smrs[i] = (struct arm_smmu_smr) { .idx = idx, .mask = 0, /* We don't currently share SMRs */ - .id = cfg->streamids[i], + .id = cfg->fwspec->ids[i], }; } /* It worked! Now, poke the actual hardware */ - for (i = 0; i < cfg->num_streamids; ++i) { + for (i = 0; i < cfg->fwspec->num_ids; ++i) { u32 reg = SMR_VALID | smrs[i].id << SMR_ID_SHIFT | smrs[i].mask << SMR_MASK_SHIFT; writel_relaxed(reg, gr0_base + ARM_SMMU_GR0_SMR(smrs[i].idx)); @@ -1448,7 +1448,7 @@ static void arm_smmu_master_free_smrs(struct arm_smmu_device *smmu, return; /* Invalidate the SMRs before freeing back to the allocator */ - for (i = 0; i < cfg->num_streamids; ++i) { + for (i = 0; i < cfg->fwspec->num_ids; ++i) { u8 idx = smrs[i].idx; writel_relaxed(~SMR_VALID, gr0_base + ARM_SMMU_GR0_SMR(idx)); @@ -1471,10 +1471,10 @@ static int arm_smmu_domain_add_master(struct arm_smmu_domain *smmu_domain, if (ret) return ret == -EEXIST ? 0 : ret; - for (i = 0; i < cfg->num_streamids; ++i) { + for (i = 0; i < cfg->fwspec->num_ids; ++i) { u32 idx, s2cr; - idx = cfg->smrs ? cfg->smrs[i].idx : cfg->streamids[i]; + idx = cfg->smrs ? cfg->smrs[i].idx : cfg->fwspec->ids[i]; s2cr = S2CR_TYPE_TRANS | (smmu_domain->cfg.cbndx << S2CR_CBNDX_SHIFT); writel_relaxed(s2cr, gr0_base + ARM_SMMU_GR0_S2CR(idx)); @@ -1499,8 +1499,8 @@ static void arm_smmu_domain_remove_master(struct arm_smmu_domain *smmu_domain, * that it can be re-allocated immediately. * Xen: Unlike Linux, any access to non-configured stream will fault. */ - for (i = 0; i < cfg->num_streamids; ++i) { - u32 idx = cfg->smrs ? cfg->smrs[i].idx : cfg->streamids[i]; + for (i = 0; i < cfg->fwspec->num_ids; ++i) { + u32 idx = cfg->smrs ? cfg->smrs[i].idx : cfg->fwspec->ids[i]; writel_relaxed(S2CR_TYPE_FAULT, gr0_base + ARM_SMMU_GR0_S2CR(idx)); @@ -1924,14 +1924,21 @@ static int arm_smmu_add_device(struct device *dev) ret = -ENOMEM; goto out_put_group; } + cfg->fwspec = kzalloc(sizeof(struct iommu_fwspec), GFP_KERNEL); + if (!cfg->fwspec) { + kfree(cfg); + ret = -ENOMEM; + goto out_put_group; + } + iommu_fwspec_init(dev, smmu->dev); - cfg->num_streamids = 1; + cfg->fwspec->num_ids = 1; /* * Assume Stream ID == Requester ID for now. * We need a way to describe the ID mappings in FDT. */ pci_for_each_dma_alias(pdev, __arm_smmu_get_pci_sid, - &cfg->streamids[0]); + &cfg->fwspec->ids[0]); releasefn = __arm_smmu_release_pci_iommudata; } else { struct arm_smmu_master *master; diff --git a/xen/drivers/passthrough/device_tree.c b/xen/drivers/passthrough/device_tree.c index 999b831..acf6b62 100644 --- a/xen/drivers/passthrough/device_tree.c +++ b/xen/drivers/passthrough/device_tree.c @@ -140,6 +140,9 @@ int iommu_add_dt_device(struct dt_device_node *np) if ( !ops ) return -EINVAL; + if ( dt_device_is_protected(np) ) + return 0; + if ( dev_iommu_fwspec_get(dev) ) return -EEXIST; From patchwork Wed Jul 22 04:00:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Brian Woods X-Patchwork-Id: 11677235 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E2063912 for ; Wed, 22 Jul 2020 04:02:42 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id B0AB220792 for ; Wed, 22 Jul 2020 04:02:42 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=xilinx.onmicrosoft.com header.i=@xilinx.onmicrosoft.com header.b="JlacmhF3" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B0AB220792 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=xilinx.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1jy5wB-0001kG-Gy; Wed, 22 Jul 2020 04:00:59 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1jy5wA-0001k6-BC for xen-devel@lists.xenproject.org; Wed, 22 Jul 2020 04:00:58 +0000 X-Inumbo-ID: f1ee473c-cbcf-11ea-a17c-12813bfff9fa Received: from NAM11-CO1-obe.outbound.protection.outlook.com (unknown [40.107.220.63]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id f1ee473c-cbcf-11ea-a17c-12813bfff9fa; Wed, 22 Jul 2020 04:00:57 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=h2f08OYIqR80XD+kfUIXmKKDiMxbomLiJJUOuvbBF6qLawwVhEEfkHdxGKzT2HiUfPEzBjxE/TPuZAitRKhepZX5mKJzHCa4t33a+ngOPtCZ2otRbOe/6/FDTHrVNziqDrdrBXWZDUV9iiIKBnjpLXtwn5dZzOd8J+T71wUORFWYgvWY0fOczoyRsmLGz6TJJY2oQd5alvsf613bfDm6E1AlMCB03hjbMuHnA/lzyzXzA3tDG4Qoln1fCPC0Xht4AUZ2gQnzDsyMHUvUuIVgVPsN3/eKHcR8h1n530rJKcKCiSCOiNGEqUwuqN5XsUZXRKtglm9HHRNi4ZzXyUSGVQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=EVUvECXV5L4nQYMNSDz3dm1kjTIFTD5CSE0XcToz2fQ=; b=mp6iMU4TdD/zV4vIBq8NtOTK7UIyadv2mPTRr7XQmv0+KN7afW63Wo83r8AHCjT/g3trQ1RGdDv9QpoGGB0zSP3T0DYDJnhzPlaVM8asARGXHaxg96hbouT5QxzVuH2oVyIjt7ckjvsScNEWctlZTn8LRfDtZ36zsyIdloAtckkkiLINj3sa6cBV1XdU8QPAAV2xaAkxbnYZiwIYP+H9mQDDVlhMwPbmqS2q93SEJ+Wmlb6Rrzrsaniye9zJfBGJ6efiFN92RFNuNQz1DkAaD1HtFSAqkZsB2DMI190wFwdWV84POqXlg6AMopsMw+xNy8egO6MYWmQopPHSjTiUdA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 149.199.60.83) smtp.rcpttodomain=epam.com smtp.mailfrom=xilinx.com; dmarc=bestguesspass action=none header.from=xilinx.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector2-xilinx-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=EVUvECXV5L4nQYMNSDz3dm1kjTIFTD5CSE0XcToz2fQ=; b=JlacmhF3T1R0x7sfklGmGj73mtkaorE1OsKaiZR95Qi/8qk8rakFSvU2N4KMtmz9NuFwQKXqYEGA0FFsZAXgj4+CHqL022Dq3z1FeKlMyGtemGYQGt5HToJmcXuu+XZ7IfoRkGOnULb2HjOnAbSMgSHynpixe61gAZzSkkV7Y+o= Received: from CY4PR20CA0042.namprd20.prod.outlook.com (2603:10b6:903:cb::28) by DM6PR02MB5849.namprd02.prod.outlook.com (2603:10b6:5:156::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3195.17; Wed, 22 Jul 2020 04:00:54 +0000 Received: from CY1NAM02FT030.eop-nam02.prod.protection.outlook.com (2603:10b6:903:cb:cafe::73) by CY4PR20CA0042.outlook.office365.com (2603:10b6:903:cb::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3216.21 via Frontend Transport; Wed, 22 Jul 2020 04:00:54 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; epam.com; dkim=none (message not signed) header.d=none;epam.com; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by CY1NAM02FT030.mail.protection.outlook.com (10.152.75.163) with Microsoft SMTP Server id 15.20.3216.10 via Frontend Transport; Wed, 22 Jul 2020 04:00:54 +0000 Received: from [149.199.38.66] (port=50306 helo=smtp.xilinx.com) by xsj-pvapsmtpgw01 with esmtp (Exim 4.90) (envelope-from ) id 1jy5uH-0007kn-TK; Tue, 21 Jul 2020 20:59:01 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1jy5w5-0002zS-T1; Tue, 21 Jul 2020 21:00:53 -0700 Received: from xsj-pvapsmtp01 (smtp-fallback.xilinx.com [149.199.38.66] (may be forged)) by xsj-smtp-dlp1.xlnx.xilinx.com (8.13.8/8.13.1) with ESMTP id 06M40lJX012872; Tue, 21 Jul 2020 21:00:47 -0700 Received: from [172.19.2.62] (helo=xsjwoods50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1jy5vz-0002u2-Mf; Tue, 21 Jul 2020 21:00:47 -0700 From: Brian Woods To: xen-devel Subject: [RFC v2 2/2] arm,smmu: add support for generic DT bindings Date: Tue, 21 Jul 2020 21:00:31 -0700 Message-Id: <1595390431-24805-3-git-send-email-brian.woods@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1595390431-24805-1-git-send-email-brian.woods@xilinx.com> References: <1595390431-24805-1-git-send-email-brian.woods@xilinx.com> X-RCIS-Action: ALLOW X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.83; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:xsj-pvapsmtpgw01; PTR:unknown-60-83.xilinx.com; CAT:NONE; SFTY:; SFS:(376002)(346002)(39850400004)(396003)(136003)(46966005)(7696005)(316002)(426003)(9786002)(4326008)(107886003)(83380400001)(186003)(44832011)(336012)(47076004)(54906003)(2616005)(8676002)(5660300002)(70206006)(26005)(6916009)(36756003)(478600001)(2906002)(8936002)(86362001)(82740400003)(82310400002)(81166007)(6666004)(70586007)(356005)(41533002)(142933001)(42866002)(21314003); DIR:OUT; SFP:1101; X-MS-PublicTrafficType: Email MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 100c8d46-da75-4a23-5ae1-08d82df3d4ab X-MS-TrafficTypeDiagnostic: DM6PR02MB5849: X-Microsoft-Antispam-PRVS: X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-MS-Oob-TLC-OOBClassifiers: OLM:1091; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: azwg7/hIzbt5KF3sK4i/FARUUAtfxD7R27j2LBDdT7GqIzgwuP3hzgD3QDzjm2rb+zSWmEA0QPwBC1b57/olVZi1GKMI9Ejjrad1UbF8O+fqgcPE0o+U6xEf3LALZFZ77zGp+pjFcy2yUTvPUXadrHlKB9vyZjNDGcQCyP/vqc4fPae3WUa+X2GM1Bg5S9zLK3anZn/4fEBjJ6oWlCn4ET1MhSozJgoj2cm3oNtHR+J0n+d4y6La4ZkQzdkUAIQoLWYD0xoaSJQAyi+VngPVkYIOAhTuH/QZUChzPTTi9ZPP+Jgm5829iNYRIwILRsGrni/25PeWD/msqhM7WcdHwl0N1T4lSq0/5JCM3gODrjdh966eQzGppQZWO9mqWksZizh99CdnIduL8LlGVnZaagflmXx4PC4JJ1z486dn2RZP1kCiUkjgHCfVkLOOf+XH3GBZlPxopbjdT87lSpPe/BEJdcYMeZ2HppShkuei7FZksx/HdOUONo7NNO5QIDu/ X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jul 2020 04:00:54.1157 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 100c8d46-da75-4a23-5ae1-08d82df3d4ab X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c; Ip=[149.199.60.83]; Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-AuthSource: CY1NAM02FT030.eop-nam02.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR02MB5849 X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Volodymyr Babchuk , Stefano Stabellini , Julien Grall , Brian Woods Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" Restructure some of the code and add supporting functions for adding generic device tree (DT) binding support. This will allow for using current Linux device trees with just modifying the chosen field to enable Xen. Signed-off-by: Brian Woods --- Just realized that I'm fairly sure I need to do some work on the SMRs. Other than that though, I think things should be okayish. v1 -> v2 - Corrected how reading of DT is done with generic bindings xen/drivers/passthrough/arm/smmu.c | 102 +++++++++++++++++++++++++--------- xen/drivers/passthrough/device_tree.c | 17 +----- 2 files changed, 78 insertions(+), 41 deletions(-) diff --git a/xen/drivers/passthrough/arm/smmu.c b/xen/drivers/passthrough/arm/smmu.c index 7a5c6cd..25c090a 100644 --- a/xen/drivers/passthrough/arm/smmu.c +++ b/xen/drivers/passthrough/arm/smmu.c @@ -251,6 +251,8 @@ struct iommu_group atomic_t ref; }; +static const struct arm_smmu_device *find_smmu(const struct device *dev); + static struct iommu_group *iommu_group_alloc(void) { struct iommu_group *group = xzalloc(struct iommu_group); @@ -772,56 +774,104 @@ static int insert_smmu_master(struct arm_smmu_device *smmu, return 0; } -static int register_smmu_master(struct arm_smmu_device *smmu, - struct device *dev, - struct of_phandle_args *masterspec) +static int arm_smmu_dt_add_device_legacy(struct arm_smmu_device *smmu, + struct device *dev, + struct iommu_fwspec *fwspec) { - int i, ret = 0; + int i; struct arm_smmu_master *master; + struct device_node *dev_node = dev_get_dev_node(dev); - master = find_smmu_master(smmu, masterspec->np); + master = find_smmu_master(smmu, dev_node); if (master) { dev_err(dev, "rejecting multiple registrations for master device %s\n", - masterspec->np->name); + dev_node->name); return -EBUSY; } master = devm_kzalloc(dev, sizeof(*master), GFP_KERNEL); if (!master) return -ENOMEM; - master->of_node = masterspec->np; - ret = iommu_fwspec_init(&master->of_node->dev, smmu->dev); - if (ret) { - kfree(master); - return ret; - } - master->cfg.fwspec = dev_iommu_fwspec_get(&master->of_node->dev); - - /* adding the ids here */ - ret = iommu_fwspec_add_ids(&masterspec->np->dev, - masterspec->args, - masterspec->args_count); - if (ret) - return ret; + master->of_node = dev_node; + master->cfg.fwspec = fwspec; /* Xen: Let Xen know that the device is protected by an SMMU */ - dt_device_set_protected(masterspec->np); + dt_device_set_protected(dev_node); if (!(smmu->features & ARM_SMMU_FEAT_STREAM_MATCH)) { - for (i = 0; i < master->cfg.fwspec->num_ids; ++i) { - if (masterspec->args[i] >= smmu->num_mapping_groups) { + for (i = 0; i < fwspec->num_ids; ++i) { + if (fwspec->ids[i] >= smmu->num_mapping_groups) { dev_err(dev, "stream ID for master device %s greater than maximum allowed (%d)\n", - masterspec->np->name, smmu->num_mapping_groups); + dev_node->name, smmu->num_mapping_groups); return -ERANGE; } } } + return insert_smmu_master(smmu, master); } +static int arm_smmu_dt_add_device_generic(u8 devfn, struct device *dev) +{ + struct arm_smmu_device *smmu; + struct iommu_fwspec *fwspec; + + fwspec = dev_iommu_fwspec_get(dev); + if (fwspec == NULL) + return -ENXIO; + + smmu = (struct arm_smmu_device *) find_smmu(fwspec->iommu_dev); + if (smmu == NULL) + return -ENXIO; + + return arm_smmu_dt_add_device_legacy(smmu, dev, fwspec); +} + +static int arm_smmu_dt_xlate_generic(struct device *dev, + const struct of_phandle_args *spec) +{ + uint32_t mask, fwid = 0; + + if (spec->args_count > 0) + fwid |= ((SMR_ID_MASK << SMR_ID_SHIFT) & spec->args[0]) >> SMR_ID_SHIFT; + + if (spec->args_count > 1) + fwid |= ((SMR_MASK_MASK << SMR_MASK_SHIFT) & spec->args[1]) >> SMR_MASK_SHIFT; + else if (!of_property_read_u32(spec->np, "stream-match-mask", &mask)) + fwid |= ((SMR_MASK_MASK << SMR_MASK_SHIFT) & mask) >> SMR_MASK_SHIFT; + + return iommu_fwspec_add_ids(dev, + &fwid, + 1); +} + +static int register_smmu_master(struct arm_smmu_device *smmu, + struct device *dev, + struct of_phandle_args *masterspec) +{ + int ret = 0; + struct iommu_fwspec *fwspec; + + ret = iommu_fwspec_init(&masterspec->np->dev, smmu->dev); + if (ret) + return ret; + + fwspec = dev_iommu_fwspec_get(&masterspec->np->dev); + + ret = iommu_fwspec_add_ids(&masterspec->np->dev, + masterspec->args, + masterspec->args_count); + if (ret) + return ret; + + return arm_smmu_dt_add_device_legacy(smmu, + &masterspec->np->dev, + fwspec); +} + static struct arm_smmu_device *find_smmu_for_device(struct device *dev) { struct arm_smmu_device *smmu; @@ -2743,6 +2793,7 @@ static void arm_smmu_iommu_domain_teardown(struct domain *d) static const struct iommu_ops arm_smmu_iommu_ops = { .init = arm_smmu_iommu_domain_init, .hwdom_init = arm_smmu_iommu_hwdom_init, + .add_device = arm_smmu_dt_add_device_generic, .teardown = arm_smmu_iommu_domain_teardown, .iotlb_flush = arm_smmu_iotlb_flush, .iotlb_flush_all = arm_smmu_iotlb_flush_all, @@ -2750,9 +2801,10 @@ static const struct iommu_ops arm_smmu_iommu_ops = { .reassign_device = arm_smmu_reassign_dev, .map_page = arm_iommu_map_page, .unmap_page = arm_iommu_unmap_page, + .dt_xlate = arm_smmu_dt_xlate_generic, }; -static __init const struct arm_smmu_device *find_smmu(const struct device *dev) +static const struct arm_smmu_device *find_smmu(const struct device *dev) { struct arm_smmu_device *smmu; bool found = false; diff --git a/xen/drivers/passthrough/device_tree.c b/xen/drivers/passthrough/device_tree.c index acf6b62..dd9cf65 100644 --- a/xen/drivers/passthrough/device_tree.c +++ b/xen/drivers/passthrough/device_tree.c @@ -158,22 +158,7 @@ int iommu_add_dt_device(struct dt_device_node *np) * these callback implemented. */ if ( !ops->add_device || !ops->dt_xlate ) - { - /* - * Some Device Trees may expose both legacy SMMU and generic - * IOMMU bindings together. However, the SMMU driver is only - * supporting the former and will protect them during the - * initialization. So we need to skip them and not return - * error here. - * - * XXX: This can be dropped when the SMMU is able to deal - * with generic bindings. - */ - if ( dt_device_is_protected(np) ) - return 0; - else - return -EINVAL; - } + return -EINVAL; if ( !dt_device_is_available(iommu_spec.np) ) break;