Received: by 2002:a25:824b:0:0:0:0:0 with SMTP id d11csp1392536ybn; Wed, 25 Sep 2019 17:39:42 -0700 (PDT) X-Google-Smtp-Source: APXvYqyCqs5M9BkDl7O6aoIKyMXmXG++3mEbkVfsuQ+o96EUyyl25FIvVBOJHBQl/GS+Ho+MIVqS X-Received: by 2002:a05:6402:2cb:: with SMTP id b11mr791029edx.285.1569458382246; Wed, 25 Sep 2019 17:39:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1569458382; cv=none; d=google.com; s=arc-20160816; b=h85YOkEbjpEI107KM7sv5aKmJWsoDjULsdZwRMaJoez4WA+iGV3VUh6BGGVF1QNOMW 60KAjmVztqSERDwUaBo63sRQYgH4+mf6I1b7pcjwHdxmBI/8mQipRoKszw+MJvYCNVeR N7e/R922JbSnz0IeKCGQxxy933Nh7kBaxF/ELYYI5aqxsnel+NqBLnH9ZS28AQDHB4PR A0TL15oeB7IZMbVtZlzdgXOjls37wqLRROmGQXpPfspKDJyPAc3PH82BU16M9OBrzkeM ffsGC78NLaHWsSVcaex1yeXcwzaDhpiF+BoatBgZu3uxEgD6b7ElkJdsUbYJfKJD3vcz W3Cg== 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=V11hdZdx+2OS3YZ4Z1vUZIqqlt4wmPMlHHZhFzsXtTE=; b=bq8E4/qMYxBZgju+gFciUAMqf9P9911aYa2C7jDgPJ7on1xk0mP4XtP9BC+vdeOhSX LFngdjmxWWVGmdqdKCRBgYSD43O7mPBbp+RE/awsRjap8QbxxIOg0iVLNPf5GDZgnSCZ q6gLiXXwk6DEO7+sv1IiDX00LGCZ/T/KlbsWB87ZfCrazlq7ARRgnmHkr0gOo/SGksm4 uu8Wld9HVnn3UAe4dNysFrLrWTzTnUxCOgy/h4zoeIEYxNU/keX2n6wE6zo6PAFTzxBt EJtsRhmJLcZfB1YXZFWjL6d1pYWGX0Tz7TmAoDXntIZe5RaRHi6GHa5FjRW4ckscMj8S vkzQ== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=nxp.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y23si389758edb.208.2019.09.25.17.39.18; Wed, 25 Sep 2019 17:39:42 -0700 (PDT) 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=nxp.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2408685AbfIXC3w (ORCPT + 99 others); Mon, 23 Sep 2019 22:29:52 -0400 Received: from inva021.nxp.com ([92.121.34.21]:57908 "EHLO inva021.nxp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2408640AbfIXC3t (ORCPT ); Mon, 23 Sep 2019 22:29:49 -0400 Received: from inva021.nxp.com (localhost [127.0.0.1]) by inva021.eu-rdc02.nxp.com (Postfix) with ESMTP id 55678200386; Tue, 24 Sep 2019 04:29:46 +0200 (CEST) Received: from invc005.ap-rdc01.nxp.com (invc005.ap-rdc01.nxp.com [165.114.16.14]) by inva021.eu-rdc02.nxp.com (Postfix) with ESMTP id 544F520037D; Tue, 24 Sep 2019 04:29:38 +0200 (CEST) Received: from titan.ap.freescale.net (TITAN.ap.freescale.net [10.192.208.233]) by invc005.ap-rdc01.nxp.com (Postfix) with ESMTP id 36B9540323; Tue, 24 Sep 2019 10:29:24 +0800 (SGT) From: Xiaowei Bao To: robh+dt@kernel.org, mark.rutland@arm.com, shawnguo@kernel.org, leoyang.li@nxp.com, kishon@ti.com, lorenzo.pieralisi@arm.com, minghuan.Lian@nxp.com, mingkai.hu@nxp.com, roy.zang@nxp.com, jingoohan1@gmail.com, gustavo.pimentel@synopsys.com, andrew.murray@arm.com, linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org Cc: Xiaowei Bao Subject: [PATCH v4 07/11] PCI: layerscape: Modify the way of getting capability with different PEX Date: Tue, 24 Sep 2019 10:18:45 +0800 Message-Id: <20190924021849.3185-8-xiaowei.bao@nxp.com> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20190924021849.3185-1-xiaowei.bao@nxp.com> References: <20190924021849.3185-1-xiaowei.bao@nxp.com> X-Virus-Scanned: ClamAV using ClamSMTP Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The different PCIe controller in one board may be have different capability of MSI or MSIX, so change the way of getting the MSI capability, make it more flexible. Signed-off-by: Xiaowei Bao --- v2: - Remove the repeated assignment code. v3: - Use ep_func msi_cap and msix_cap to decide the msi_capable and msix_capable of pci_epc_features struct. v4: - No change. drivers/pci/controller/dwc/pci-layerscape-ep.c | 31 +++++++++++++++++++------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/drivers/pci/controller/dwc/pci-layerscape-ep.c b/drivers/pci/controller/dwc/pci-layerscape-ep.c index a9c552e..1e07287 100644 --- a/drivers/pci/controller/dwc/pci-layerscape-ep.c +++ b/drivers/pci/controller/dwc/pci-layerscape-ep.c @@ -22,6 +22,7 @@ struct ls_pcie_ep { struct dw_pcie *pci; + struct pci_epc_features *ls_epc; }; #define to_ls_pcie_ep(x) dev_get_drvdata((x)->dev) @@ -40,26 +41,31 @@ static const struct of_device_id ls_pcie_ep_of_match[] = { { }, }; -static const struct pci_epc_features ls_pcie_epc_features = { - .linkup_notifier = false, - .msi_capable = true, - .msix_capable = false, - .bar_fixed_64bit = (1 << BAR_2) | (1 << BAR_4), -}; - static const struct pci_epc_features* ls_pcie_ep_get_features(struct dw_pcie_ep *ep) { - return &ls_pcie_epc_features; + struct dw_pcie *pci = to_dw_pcie_from_ep(ep); + struct ls_pcie_ep *pcie = to_ls_pcie_ep(pci); + + return pcie->ls_epc; } static void ls_pcie_ep_init(struct dw_pcie_ep *ep) { struct dw_pcie *pci = to_dw_pcie_from_ep(ep); + struct ls_pcie_ep *pcie = to_ls_pcie_ep(pci); + struct dw_pcie_ep_func *ep_func; enum pci_barno bar; + ep_func = dw_pcie_ep_get_func_from_ep(ep, 0); + if (!ep_func) + return; + for (bar = BAR_0; bar <= BAR_5; bar++) dw_pcie_ep_reset_bar(pci, bar); + + pcie->ls_epc->msi_capable = ep_func->msi_cap ? true : false; + pcie->ls_epc->msix_capable = ep_func->msix_cap ? true : false; } static int ls_pcie_ep_raise_irq(struct dw_pcie_ep *ep, u8 func_no, @@ -119,6 +125,7 @@ static int __init ls_pcie_ep_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct dw_pcie *pci; struct ls_pcie_ep *pcie; + struct pci_epc_features *ls_epc; struct resource *dbi_base; int ret; @@ -130,6 +137,10 @@ static int __init ls_pcie_ep_probe(struct platform_device *pdev) if (!pci) return -ENOMEM; + ls_epc = devm_kzalloc(dev, sizeof(*ls_epc), GFP_KERNEL); + if (!ls_epc) + return -ENOMEM; + dbi_base = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs"); pci->dbi_base = devm_pci_remap_cfg_resource(dev, dbi_base); if (IS_ERR(pci->dbi_base)) @@ -140,6 +151,10 @@ static int __init ls_pcie_ep_probe(struct platform_device *pdev) pci->ops = &ls_pcie_ep_ops; pcie->pci = pci; + ls_epc->bar_fixed_64bit = (1 << BAR_2) | (1 << BAR_4), + + pcie->ls_epc = ls_epc; + platform_set_drvdata(pdev, pcie); ret = ls_add_pcie_ep(pcie, pdev); -- 2.9.5