From patchwork Mon Jul 30 17:23:49 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Douglas X-Patchwork-Id: 951237 X-Patchwork-Delegate: lorenzo.pieralisi@arm.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-pci-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=cadence.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cadence.com header.i=@cadence.com header.b="qlPsY2rS"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41fRJ64wnnz9rxx for ; Tue, 31 Jul 2018 03:24:06 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726876AbeG3TAE (ORCPT ); Mon, 30 Jul 2018 15:00:04 -0400 Received: from mail-eopbgr730089.outbound.protection.outlook.com ([40.107.73.89]:10814 "EHLO NAM05-DM3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726800AbeG3TAD (ORCPT ); Mon, 30 Jul 2018 15:00:03 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cadence.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=iBBVM0IknKtIBOCBMQcQi/zJsPYHNtq1ggaR4K9nID8=; b=qlPsY2rS8QUCOzJxpzGp4YCaXavq3bEG/0eztgPo0ios6sWCHa8yKnanAUs/bzW5+D3EknvkbHNBjwzWKySK33/uzL+OG9JIk3QPZzBoW/0ydwKX0KFE8I9APZ+Y0crncaJ7Jei9YvTUhkc4tV+rs/crPUxo2h76MBOaaJXgIsc= Received: from DM5PR07CA0068.namprd07.prod.outlook.com (2603:10b6:4:ad::33) by CY1PR0701MB1338.namprd07.prod.outlook.com (2a01:111:e400:4c1b::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.995.20; Mon, 30 Jul 2018 17:24:00 +0000 Received: from BY2NAM05FT044.eop-nam05.prod.protection.outlook.com (2a01:111:f400:7e52::205) by DM5PR07CA0068.outlook.office365.com (2603:10b6:4:ad::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.995.17 via Frontend Transport; Mon, 30 Jul 2018 17:24:00 +0000 Received-SPF: SoftFail (protection.outlook.com: domain of transitioning cadence.com discourages use of 158.140.1.28 as permitted sender) Received: from sjmaillnx1.cadence.com (158.140.1.28) by BY2NAM05FT044.mail.protection.outlook.com (10.152.100.181) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.20.1038.3 via Frontend Transport; Mon, 30 Jul 2018 17:23:57 +0000 Received: from maileu3.global.cadence.com (maileu3.cadence.com [10.160.88.99]) by sjmaillnx1.cadence.com (8.14.4/8.14.4) with ESMTP id w6UHNsbX017618 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=FAIL); Mon, 30 Jul 2018 10:23:56 -0700 X-CrossPremisesHeadersFilteredBySendConnector: maileu3.global.cadence.com Received: from maileu3.global.cadence.com (10.160.88.99) by maileu3.global.cadence.com (10.160.88.99) with Microsoft SMTP Server (TLS) id 15.0.1367.3; Mon, 30 Jul 2018 19:24:08 +0200 Received: from lvloginb.cadence.com (10.165.177.11) by maileu3.global.cadence.com (10.160.88.99) with Microsoft SMTP Server id 15.0.1367.3 via Frontend Transport; Mon, 30 Jul 2018 19:24:08 +0200 Received: from lvloginb.cadence.com (localhost [127.0.0.1]) by lvloginb.cadence.com (8.14.4/8.14.4) with ESMTP id w6UHNsJO010170; Mon, 30 Jul 2018 18:23:54 +0100 Received: (from adouglas@localhost) by lvloginb.cadence.com (8.14.4/8.14.4/Submit) id w6UHNrmY010151; Mon, 30 Jul 2018 18:23:53 +0100 From: Alan Douglas To: CC: , , , , , , Alan Douglas Subject: [PATCH 5/5] PCI: cadence: Add MSI-X capability to EP driver Date: Mon, 30 Jul 2018 18:23:49 +0100 Message-ID: <1532971429-10002-1-git-send-email-adouglas@cadence.com> X-Mailer: git-send-email 2.2.2 MIME-Version: 1.0 X-OrganizationHeadersPreserved: maileu3.global.cadence.com X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:158.140.1.28; IPV:CAL; SCL:-1; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(39860400002)(396003)(376002)(346002)(136003)(2980300002)(3190300001)(36092001)(189003)(199004)(50226002)(106466001)(36756003)(105596002)(6916009)(2616005)(14444005)(6666003)(48376002)(476003)(50466002)(486006)(47776003)(126002)(8936002)(305945005)(7636002)(2351001)(51416003)(356003)(107886003)(4326008)(316002)(16586007)(42186006)(2906002)(54906003)(6346003)(26005)(426003)(336012)(8676002)(246002)(5660300001)(86362001)(186003)(478600001)(87636003)(26826003); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR0701MB1338; H:sjmaillnx1.cadence.com; FPR:; SPF:SoftFail; LANG:en; PTR:corp.cadence.com; MX:1; A:1; X-Microsoft-Exchange-Diagnostics: 1; BY2NAM05FT044; 1:WjsTn1DdoxJF+YFvbTvLfxm55qfAReyA1Q048KSQrhzcQzf6THexN9dmt/v03mDQLWwzvQI6X2sjxETqJCAC6h4bw6N5PbeeMWKNLm9D24dvdX08ehzhFARPq2WlkS8Z X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: a0ec3afc-b61b-4f40-16eb-08d5f6413cd0 X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989117)(5600074)(711020)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(2017052603328)(7153060); SRVR:CY1PR0701MB1338; X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB1338; 3:T7UfE9x+3YYOgKqOga6X0Tot2dctLTemnv6d3JJcn8V50tQyrBCVgWsiShDMQx3q/1wg1/BQKFtye4Io2GFTqFYWbJGzWbM6vYSuCyO6BXitdawewPQBFQhZoAFgfZfkEPDlK3EA/XC0KAxT7pHZS3zFYyawe4JCqKxAM6Nmjd2of6JB+fK2DG8nXywgOo6egrLrD/MpnABUw8JtgF2QL6bKfPpP9KjuotTIuJ7dix/itNTVb18tnOBnTMZ6p9JCNqPkUZHOj6AsAxiw5g5rsaubq9gyDxzk8o1PYHpZxmGzOJ6hDUffIGa1rHVjHC+X1cxFk1GSj2aoPZqrmVOBpG0lxPpibjIxdlOfnC6JaoQ=; 25:/WAwzyL6iq2FpoLrYluNaBex/k2QZPb+It5bRWUI3mP1Pw+VeY6xk2BM3xN73h2mjVOF/a0PLTKwAcqNQhTKjSgOlWyu+LjXnhFzJfxz35N/Z4SaRoRgLnizVYmXzbnICXi1if0lmkE4Xer8onDMwezjURUb4HRX+G8oknqy0ZBwJp3NO/JW6rbAlTHKQSRufYEiWFUMMHG1rstOm7SqHMO6WBpxYBpOIvf9WySha2eyXga85+hBJLXIbKV5GsFVP0pvADDyhkuZucQ3jJkTu4aYUAZhi80fwfHFh5s8gIWXwY2FzmSKtago9Z7VAF20lepURJ/ExMbxQYtkE8RVrw== X-MS-TrafficTypeDiagnostic: CY1PR0701MB1338: X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB1338; 31:2GTs6UTVd2Gn9vnRnjPLoFqMFKL+grSKbVEybiEAEyjsuucVPTNOQdTpjrOvXqzejkYCTzoULQnwh+tP6uEOYEw8RdwinWucuvsSfrUgJdf1d+QRDTRsHL5d8meyaLHjrZoCEdTJm2x+iez9QqfZuSccMPKnAkXtMFEKvBBsQBB8eiuE8U3jD8uU9EBdrrx//SWaTPRtoehOMwTeMoYnpR5CwHag69ovwQ632TRkMJ0=; 20:vTfxwk8H1VSwCf5WF13BZ7i+eZJl3a2Qh5M+er1kXYe8YRi48BbkebOa8fxzPw88Lyv31PO0B8hCflGlBJ6Nv/28Evvx/ewTbg6LDhzBVFr8/AI/AML/GdZhQ6Y2yBrKhhYEWPDDWoAZNIdnt9CzPpodMZ78vcQPz65uIT7Ur1c/UBnFERfeBuIjJW0RjXfSGSVkFI1pzlK8/zz/2c8dxlsR58BuGvlK1fZU3O3ERES/7uKBrMyoo4SGcw0k0HZx7tazFU4LJK9anUKo1y+WXLPYmI3VwWvoLyL3GHEC30XHKHCCNcBrKRfve7oVQtIJbEzB+9x4iRgire+DZrQ57+58mU0bTjk+IUdxKcUDoRew3oCE7rRZybrSEy6qITaJ/+5WfVWeqGfU90bwDhrUsXw23zHd/147b4zg2w+HUOzCuiV43xbB/WaG/9auCoG/FJwFBuwvge12x2Q9ZO5kXqS7+oxLB1/qjSeiKgKEKj13t4T56ZHyw7o/OWwcH0k9 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(72806322054110); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(93006095)(93003095)(3231311)(944501410)(52105095)(3002001)(10201501046)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123558120)(20161123562045)(20161123564045)(6072148)(201708071742011)(7699016); SRVR:CY1PR0701MB1338; BCL:0; PCL:0; RULEID:; SRVR:CY1PR0701MB1338; X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB1338; 4:gW3mu6xH8MTurMG0cerDrMy/zxeSsGdCYS7NId8dlag2t2tk2gNbbyL6WxSLnBiLCQRlGTwaMolIrD+DXwDb0Lx5IOlRHt7ukwgppAxoymu0pfEAc/rP13dQyYNya6cf7U3+0wpN9Qs1b36S7qySlgEUezE1BYXQQaOFiYI5U8sB14u+iOAdt0riWb7hHQ/gMJRj4wYIIjCMmWrnrpFJxIA13OjwumfF1tr5QpUIALnG3Zv239xjemX2C5UK96ivHxMVb+YfMKK+dFUyzXJ2ypBWe5VVymsUtpl5ouBw6wx/4EYmofU0Tu/0wS0OCnUq X-Forefront-PRVS: 0749DC2CE6 X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB1338; 23:dXLExNm946QES+ljWB2vORuGswL3UbX5wTtJI5g/UaW6dp0Bh2DabNk+KjuoyL2fsTTyW1fjcDSiiyLUmXF1EOqmMqJ09xzvHzqq6MFv2xHNSx4zkrhwTPRlj9pg361lYt1MuRPYDEUVAqeRuvRdnFogNrp0HWjWO2yRRRBZZpMCqewvvsK5B9/9V23tUhZ2PoXHGpOyp0thqbbdrxqkcXDc2Bd1nocBkmoFXZLJHhjziAGqWvAO3ijJ+MvUj0ndSTsfWafeCwspYVGRTJQMoqDDjY8axDtx0502GMOhsAFaNhCsck2lSE6XBMblfx4ahExvXAQ4Cscz6MbzMbacwni2JB+tz768YVVOw0Wpw2L3OkAoaf53wOFLWlI+AOgLcN35AfCYjGZe3M5stvSuZqgDSsxRVGla+TGZRRORDXsijGKmC0/W1DZ6Q7Voihmi+y/ZLhKZM+WsCSJhwQ96b/X2rR85lrLwOQF5CWpVYeGuY6LEtt+ycvqGkqnm/9Qsnnxmz0inclj9MF7p3gUK+tNG6EtRrkEoZLfjPolrmx7ZYoDPZaTsAl2l6QuLYWkqt+eQO6BrKRtllOE1twxn38POr3gZXTuFf7QQCWbkQt0wKTpitp5YnBlcxUoglZT4VpgZBow4pRaRk/JSpNP1hTcBU+R4EUeTFS6fycIgtc+TAKBdegrQoGODsSZnKhqP5dBCv5AMhxhtpZ3JIayf0JDWxoMBCfU7+5yXgls2SPC3yHqmPqHsd97UaSXRRv08454LRuTqDzCfNpKP4aLRYBq6/0CfTE25yW9eDXkliDSqB/U229rvvnP8QuSxB3L0K97dyI9RfhhbJOOxWzrO3QCsQDJCcm3VQCbzBn+iLJteceT180N76Tl5yP9tFqpjR3eLF/qsnEzHVb2FrSIYIODuUO7gKPkjCcbh6N8ViEbMxrbMBS8BL+HIksEkNYFgrQ1MRsvd4/vQlveSp1wpHymgTuTuWVmSxfs77wj3JqWqzrk3/2zJmKDU2rBnXD2QgJJ94blN+w6JzjJUEM/WwkdO1TYUvPPIn73tZ0/N83gvbVmnpvzmYQpxfbAPWJKdV8aiMhZ1hpxeuQCD3XiGiw== X-Microsoft-Antispam-Message-Info: pdmhTiLylXLV2jr9xpG19azQP85Xqp/7TEVsOIogfV15lLGC8KHfYTU4o3iH5krBYZUmZnYZnfHX0ZuUvDgdHp5FWx6cvCAMlM5MxUZRz/LlbVVgLJgzHEtel5r3quXWcCjN2xaJ8CnVjxZZ1QRBAsNl8h7pdWqmlw/8/IiTTWw4uQ4rpjj1W7OpXe8I3qIL6qEdAv99ofg/K8kretGRFC8g3kqUn+BfvKZK7TjlbhMAXiidJKWC4HoHsEUpC6aumJ61rxjYY6K2/i5c8rfc5w88rXZcWGcNG2fSHuyK2GHaGIb8dokZVkFhSjpcIArptSFCbUtiJvNFUkeB2G6k/w/rqywIvpMc705kvTapcKnbcq+pQSd5CV/VXYs8zgCWmIhpVWdJ0Ai2+dP4R8dYRg== X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB1338; 6:Zrml7yZPe9EdKransheBE9x7buW1DHYA4Tho5hVEvoUqvbyjHrGGgOjRk/7TPgIPUCnpq6SBybVKxaj6icCWR3diV4/cXdZ2z8RIY6+k/Imh5c31TpdIjSwDQMZPviOYYKrTx7eHHYdkhFtN4mnjv8oZgzMU+MwdcG1x1YMvZjKC5j+njTRfMkzT96oD+6siKSWN27PJoD/DJNqMcMthGbJ7FSxW0G8e96JiqzBtg3IaLkF+hDJNO/gzHWa1woAejclQJDnnQskCvg2lkG9y3B6b1pSNYlvBv4nic1pzUgd+7PuXDDQg+7gF3x9v/AdmD/8Sy07kk+EwCHffl2LoT9yOcVPR8GOSKr34hSjzUkkwactkZZxfHixeK0V9INTzSM9GO+rY98gJJjIzBEOD7lcFIrANYlVA1AsA0ceajjLGNZo7SHs4gdOjckp5+FJdbNBUQAKckL3cC9bpQihiSg==; 5:nlPro/f6wZvjzRsV0qsM1IjwmXf3aJ71GzOuEzQVWYUIMC8P0q8hBYu2ilaB7seT6lWUiULuqiBhrTVNGv2Nb7iesrNTMBdGaBsaj2NO52AvbrYxeCIohYIOZkStF/+8UleINJqKrQ3AFGocX5hUIZ4z0jeqUXwY4RfgvXdXNBg=; 7:fjALOMj72/T+Kr0uIfSrqmuHe/7k80oFvZGpoIryhMtilZuD9mURYuHMEEP6HTqkw+xRwsYNcOHuq22HQ+J9JcbCA2hQuzRuyTu0MpJAJfqCEvlivp1nUbZPWkZspmKxtnTnXztdtUCjy/wa82EWotJz/j7EQoVd8fLwUVvgVh4daAD65pXZt3Ob8dB/soiBZChyb5wKYcyOVeuezJ0pnHlXkflPr59f1lTQRHEk9+16YSQXF5s7JHl22r9FjCzk SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB1338; 20:+lE5Zgq+WYjMyFwFJ26vt0e6B7u5ht9V0XLgaFFvL4X5bNjGDCfB/z8DW9J23CZoOU6sJ+0WnYFWDo5I9iQBHNalNHr6gYf+suz6AcdktQCBjWSX5xwRokl+3N7ETf1uMnCHYn/VK2QeddA9UHeYB6X+e5Vd3vPw4wEKJspurvFVc4vknk/gRNrTrsZ5MO9h0Bx+/E1pNYxXNeOx0KpQzhfZY/lgfAOWtofBchZzIhbZY4rUluUhUk+kvH6LAYeI X-OriginatorOrg: cadence.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jul 2018 17:23:57.4807 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a0ec3afc-b61b-4f40-16eb-08d5f6413cd0 X-MS-Exchange-CrossTenant-Id: d36035c5-6ce6-4662-a3dc-e762e61ae4c9 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=d36035c5-6ce6-4662-a3dc-e762e61ae4c9; Ip=[158.140.1.28]; Helo=[sjmaillnx1.cadence.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR0701MB1338 Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org Add set_msix and get_msix functions to driver, and handle PCI_EPC_IRQ_MSIX request in raise_irq. BAR5 is used for the MSI-X vectors. Signed-off-by: Alan Douglas --- drivers/pci/controller/pcie-cadence-ep.c | 105 ++++++++++++++++++++++++++++++ drivers/pci/controller/pcie-cadence.h | 1 + 2 files changed, 106 insertions(+), 0 deletions(-) diff --git a/drivers/pci/controller/pcie-cadence-ep.c b/drivers/pci/controller/pcie-cadence-ep.c index 33e30dd..e9a8f8b 100644 --- a/drivers/pci/controller/pcie-cadence-ep.c +++ b/drivers/pci/controller/pcie-cadence-ep.c @@ -16,6 +16,7 @@ #define CDNS_PCIE_EP_MIN_APERTURE 128 /* 128 bytes */ #define CDNS_PCIE_EP_IRQ_PCI_ADDR_NONE 0x1 #define CDNS_PCIE_EP_IRQ_PCI_ADDR_LEGACY 0x3 +#define CDNS_PCIE_EP_MSIX_BAR 0x5 /** * struct cdns_pcie_ep - private data for this PCIe endpoint controller driver @@ -254,6 +255,44 @@ static int cdns_pcie_ep_get_msi(struct pci_epc *epc, u8 fn) return mme; } +static int cdns_pcie_ep_get_msix(struct pci_epc *epc, u8 func_no) +{ + struct cdns_pcie_ep *ep = epc_get_drvdata(epc); + struct cdns_pcie *pcie = &ep->pcie; + u32 cap = CDNS_PCIE_EP_FUNC_MSIX_CAP_OFFSET; + u32 val, reg; + + reg = cap + PCI_MSIX_FLAGS; + val = cdns_pcie_ep_fn_readw(pcie, func_no, reg); + if (!(val & PCI_MSIX_FLAGS_ENABLE)) + return -EINVAL; + + val &= PCI_MSIX_FLAGS_QSIZE; + + return val; +} + + +static int cdns_pcie_ep_set_msix(struct pci_epc *epc, u8 fn, u16 interrupts) +{ + struct cdns_pcie_ep *ep = epc_get_drvdata(epc); + struct cdns_pcie *pcie = &ep->pcie; + u32 cap = CDNS_PCIE_EP_FUNC_MSIX_CAP_OFFSET; + u32 val, reg; + + reg = cap + PCI_MSIX_FLAGS; + val = cdns_pcie_ep_fn_readw(pcie, fn, reg); + val &= ~PCI_MSIX_FLAGS_QSIZE; + val |= interrupts; + cdns_pcie_ep_fn_writew(pcie, fn, reg, val); + /* Set MSIX BAR and offset */ + cdns_pcie_ep_fn_writel(pcie, fn, 0xb4, CDNS_PCIE_EP_MSIX_BAR); + /* Set PBA BAR and offset. BAR must match MSIX BAR */ + cdns_pcie_ep_fn_writel(pcie, fn, 0xb8, 0x10000|CDNS_PCIE_EP_MSIX_BAR); + + return 0; +} + static void cdns_pcie_ep_assert_intx(struct cdns_pcie_ep *ep, u8 fn, u8 intx, bool is_asserted) { @@ -365,6 +404,66 @@ static int cdns_pcie_ep_send_msi_irq(struct cdns_pcie_ep *ep, u8 fn, return 0; } +static int cdns_pcie_ep_send_msix_irq(struct cdns_pcie_ep *ep, u8 fn, + u16 interrupt_num) +{ + struct cdns_pcie *pcie = &ep->pcie; + u32 cap = CDNS_PCIE_EP_FUNC_MSIX_CAP_OFFSET; + u16 flags; + u64 pci_addr_mask = 0xff; + u16 tbl_offset = 0; + u32 bar_addr_upper, bar_addr_lower; + u32 msg_addr_upper, msg_addr_lower; + u32 msg_data; + u64 tbl_addr, msg_addr; + void __iomem *msix_tbl; + + /* Check whether the MSI-X feature has been enabled by the PCI host. */ + flags = cdns_pcie_ep_fn_readw(pcie, fn, cap + PCI_MSIX_FLAGS); + if (!(flags & PCI_MSIX_FLAGS_ENABLE)) + return -EINVAL; + /* We want local address, not address on host. Table is at offset 0 */ + bar_addr_lower = cdns_pcie_readl(pcie, + CDNS_PCIE_AT_IB_EP_FUNC_BAR_ADDR0(fn, CDNS_PCIE_EP_MSIX_BAR)); + bar_addr_upper = cdns_pcie_readl(pcie, + CDNS_PCIE_AT_IB_EP_FUNC_BAR_ADDR1(fn, CDNS_PCIE_EP_MSIX_BAR)); + + tbl_addr = ((u64) bar_addr_upper) << 32 | bar_addr_lower; + tbl_addr += (tbl_offset + ((interrupt_num - 1) * PCI_MSIX_ENTRY_SIZE)); + tbl_addr &= PCI_BASE_ADDRESS_MEM_MASK; + msix_tbl = phys_to_virt(tbl_addr); + if (!msix_tbl) + return -EINVAL; + + msg_addr_lower = readl(msix_tbl + PCI_MSIX_ENTRY_LOWER_ADDR); + msg_addr_upper = readl(msix_tbl + PCI_MSIX_ENTRY_UPPER_ADDR); + msg_addr = ((u64) msg_addr_upper) << 32 | msg_addr_lower; + + msg_data = readl(msix_tbl + PCI_MSIX_ENTRY_VECTOR_CTRL); + if (msg_data & 0x1) + return -EINVAL; + + msg_data = readl(msix_tbl + PCI_MSIX_ENTRY_DATA); + + iounmap(msix_tbl); + + /* Set the outbound region if needed. */ + if (unlikely(ep->irq_pci_addr != (msg_addr & ~pci_addr_mask) || + ep->irq_pci_fn != fn)) { + /* First region was reserved for IRQ writes. */ + cdns_pcie_set_outbound_region(pcie, fn, 0, + false, + ep->irq_phys_addr, + msg_addr & ~pci_addr_mask, + pci_addr_mask + 1); + ep->irq_pci_addr = (msg_addr & ~pci_addr_mask); + ep->irq_pci_fn = fn; + } + writel(msg_data, ep->irq_cpu_addr + (msg_addr & pci_addr_mask)); + + return 0; +} + static int cdns_pcie_ep_raise_irq(struct pci_epc *epc, u8 fn, enum pci_epc_irq_type type, u16 interrupt_num) @@ -384,6 +483,9 @@ static int cdns_pcie_ep_raise_irq(struct pci_epc *epc, u8 fn, case PCI_EPC_IRQ_MSI: return cdns_pcie_ep_send_msi_irq(ep, fn, interrupt_num); + case PCI_EPC_IRQ_MSIX: + return cdns_pcie_ep_send_msix_irq(ep, fn, interrupt_num); + default: break; } @@ -430,6 +532,8 @@ static int cdns_pcie_ep_start(struct pci_epc *epc) .unmap_addr = cdns_pcie_ep_unmap_addr, .set_msi = cdns_pcie_ep_set_msi, .get_msi = cdns_pcie_ep_get_msi, + .set_msix = cdns_pcie_ep_set_msix, + .get_msix = cdns_pcie_ep_get_msix, .raise_irq = cdns_pcie_ep_raise_irq, .start = cdns_pcie_ep_start, }; @@ -508,6 +612,7 @@ static int cdns_pcie_ep_probe(struct platform_device *pdev) } epc_set_drvdata(epc, ep); + epc->features |= EPC_FEATURE_MSIX_AVAILABLE; if (of_property_read_u8(np, "max-functions", &epc->max_functions) < 0) epc->max_functions = 1; diff --git a/drivers/pci/controller/pcie-cadence.h b/drivers/pci/controller/pcie-cadence.h index ae6bf2a..71fe6f4 100644 --- a/drivers/pci/controller/pcie-cadence.h +++ b/drivers/pci/controller/pcie-cadence.h @@ -94,6 +94,7 @@ #define CDNS_PCIE_EP_FUNC_BASE(fn) (((fn) << 12) & GENMASK(19, 12)) #define CDNS_PCIE_EP_FUNC_MSI_CAP_OFFSET 0x90 +#define CDNS_PCIE_EP_FUNC_MSIX_CAP_OFFSET 0xb0 /* * Root Port Registers (PCI configuration space for the root port function)