Received: by 2002:ac0:bc90:0:0:0:0:0 with SMTP id a16csp4378251img; Tue, 26 Mar 2019 08:17:12 -0700 (PDT) X-Google-Smtp-Source: APXvYqy6JxSvxzoeyJVpbcjOlrp4l+XHIC98JElp46reen7JHPzi/qz9NBq8jPmEmZ0MoOGOcrlG X-Received: by 2002:a63:cc0a:: with SMTP id x10mr16486749pgf.179.1553613432142; Tue, 26 Mar 2019 08:17:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553613432; cv=none; d=google.com; s=arc-20160816; b=TRonkJHuwgoTZuu6oda9FAIfg/BmbGUKSfRmZcaypK9G0lmqF2+0NDrEmhDjCrvRJm AUplrGyIl2o9Tb2vKOIfVo8AYuIIJTOLqETqZhh85J+IacSgo41EAC8aS4uFdH82FHW5 qyD1yrTyta7d3QJqvtDWTF1cjivaKRiq91M5b8XMrAKwv9wXaVRzGGRl4Ied/cRvWCq2 n8JmM8Or7YFHwQEMEwyv95CVN2uO3tKeQNSRd78IMbraUSR2jTobyXsgFF3fWXSaoNE1 TXptlm5TdgRdiCV267ogW9EgODVXgObtBowPR+16w3ayk+H2SIiMZZT18N+lO4oSp8hr yrfQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:dkim-signature:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from; bh=jA1rXy4IhFHqoYDqVJTpYSEhemUpZ2dfb3d4fEitaIA=; b=DqX+4f/J1FuaFKnsW8X9pMD/rlzvEO37UF3fMO3ra2fsKhjGE0DdAQTIZk9ejuTh9k Ea8Kfz1Ans8EDNKOxokSFTihQSQZhGampQLp+YwyuWxCtMbsOC9jiNZoVb8p6R8bfydV BKKKCENOUrksTFLcx+Vfe5MceahobB1wHlHLneEgbSPin4ApgYtNd6BpiEHOs9NL4Iyo LrJ1qUB4tnJtoIpz1SSXORX3swNZiYaZfFXV9f4DHgdt0uepsUDn/IRivj2jgP/au7VK ph7bOTUpXDYeqouYoI0g4yD2hfBrJv+tDWeySiBsChsaCB3DSWfDq1RFBmu+qYHtALFY WziA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@nvidia.com header.s=n1 header.b=GaaQF+PP; 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=pass (p=NONE sp=NONE dis=NONE) header.from=nvidia.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g21si15880229pgi.448.2019.03.26.08.16.56; Tue, 26 Mar 2019 08:17:12 -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; dkim=pass header.i=@nvidia.com header.s=n1 header.b=GaaQF+PP; 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=pass (p=NONE sp=NONE dis=NONE) header.from=nvidia.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732028AbfCZPOp (ORCPT + 99 others); Tue, 26 Mar 2019 11:14:45 -0400 Received: from hqemgate16.nvidia.com ([216.228.121.65]:18276 "EHLO hqemgate16.nvidia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731715AbfCZPOo (ORCPT ); Tue, 26 Mar 2019 11:14:44 -0400 Received: from hqpgpgate102.nvidia.com (Not Verified[216.228.121.13]) by hqemgate16.nvidia.com (using TLS: TLSv1.2, DES-CBC3-SHA) id ; Tue, 26 Mar 2019 08:14:41 -0700 Received: from hqmail.nvidia.com ([172.20.161.6]) by hqpgpgate102.nvidia.com (PGP Universal service); Tue, 26 Mar 2019 08:14:42 -0700 X-PGP-Universal: processed; by hqpgpgate102.nvidia.com on Tue, 26 Mar 2019 08:14:42 -0700 Received: from HQMAIL101.nvidia.com (172.20.187.10) by HQMAIL107.nvidia.com (172.20.187.13) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Tue, 26 Mar 2019 15:14:42 +0000 Received: from hqnvemgw02.nvidia.com (172.16.227.111) by HQMAIL101.nvidia.com (172.20.187.10) with Microsoft SMTP Server (TLS) id 15.0.1473.3 via Frontend Transport; Tue, 26 Mar 2019 15:14:42 +0000 Received: from vidyas-desktop.nvidia.com (Not Verified[10.24.37.38]) by hqnvemgw02.nvidia.com with Trustwave SEG (v7,5,8,10121) id ; Tue, 26 Mar 2019 08:14:42 -0700 From: Vidya Sagar To: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , CC: , , , , , , Subject: [PATCH 03/10] PCI: dwc: Move config space capability search API Date: Tue, 26 Mar 2019 20:43:20 +0530 Message-ID: <1553613207-3988-4-git-send-email-vidyas@nvidia.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1553613207-3988-1-git-send-email-vidyas@nvidia.com> References: <1553613207-3988-1-git-send-email-vidyas@nvidia.com> X-NVConfidentiality: public MIME-Version: 1.0 Content-Type: text/plain DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nvidia.com; s=n1; t=1553613281; bh=jA1rXy4IhFHqoYDqVJTpYSEhemUpZ2dfb3d4fEitaIA=; h=X-PGP-Universal:From:To:CC:Subject:Date:Message-ID:X-Mailer: In-Reply-To:References:X-NVConfidentiality:MIME-Version: Content-Type; b=GaaQF+PPXfz2jaBMZkT6N7uOPocjgSHXdWgaK54euV50DRNX1qYoVRyKtFCL/vHjy Gs1fvT7wsR1L3oSqb4B0WK1VrlHfR+mOpSpU6vUvzKnx6oqIik4CwG3LAQxOTYD5Xt dqO++f4CNiXRQ+jmEo9mTG7duIO5KwyRkeWhz/hDPC6KU/JILbrr74GFhknU9F0nch 1yzRgvomI30tufrr45K4m4Is9VluamMA/tvfZZG7mhab3Ot26yrOt8s3EtEYhnH+6f U/cU37u6wAR8U3g75jDmcvl5ICjDFI5fgQDyUEhLg4042BC2W4uhWk7mHj6cJkjlu3 yjyer3gxrbGjg== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org move PCIe config space capability search API to common designware file as this can be used by both host and ep mode codes. It also adds extended capability search APIs. Signed-off-by: Vidya Sagar --- drivers/pci/controller/dwc/pcie-designware-ep.c | 37 +------------ drivers/pci/controller/dwc/pcie-designware.c | 73 +++++++++++++++++++++++++ drivers/pci/controller/dwc/pcie-designware.h | 3 + 3 files changed, 78 insertions(+), 35 deletions(-) diff --git a/drivers/pci/controller/dwc/pcie-designware-ep.c b/drivers/pci/controller/dwc/pcie-designware-ep.c index 24f5a775ad34..b9d9c9a4ba6d 100644 --- a/drivers/pci/controller/dwc/pcie-designware-ep.c +++ b/drivers/pci/controller/dwc/pcie-designware-ep.c @@ -40,39 +40,6 @@ void dw_pcie_ep_reset_bar(struct dw_pcie *pci, enum pci_barno bar) __dw_pcie_ep_reset_bar(pci, bar, 0); } -static u8 __dw_pcie_ep_find_next_cap(struct dw_pcie *pci, u8 cap_ptr, - u8 cap) -{ - u8 cap_id, next_cap_ptr; - u16 reg; - - reg = dw_pcie_readw_dbi(pci, cap_ptr); - next_cap_ptr = (reg & 0xff00) >> 8; - cap_id = (reg & 0x00ff); - - if (!next_cap_ptr || cap_id > PCI_CAP_ID_MAX) - return 0; - - if (cap_id == cap) - return cap_ptr; - - return __dw_pcie_ep_find_next_cap(pci, next_cap_ptr, cap); -} - -static u8 dw_pcie_ep_find_capability(struct dw_pcie *pci, u8 cap) -{ - u8 next_cap_ptr; - u16 reg; - - reg = dw_pcie_readw_dbi(pci, PCI_CAPABILITY_LIST); - next_cap_ptr = (reg & 0x00ff); - - if (!next_cap_ptr) - return 0; - - return __dw_pcie_ep_find_next_cap(pci, next_cap_ptr, cap); -} - static int dw_pcie_ep_write_header(struct pci_epc *epc, u8 func_no, struct pci_epf_header *hdr) { @@ -591,9 +558,9 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep) dev_err(dev, "Failed to reserve memory for MSI/MSI-X\n"); return -ENOMEM; } - ep->msi_cap = dw_pcie_ep_find_capability(pci, PCI_CAP_ID_MSI); + ep->msi_cap = dw_pcie_find_capability(pci, PCI_CAP_ID_MSI); - ep->msix_cap = dw_pcie_ep_find_capability(pci, PCI_CAP_ID_MSIX); + ep->msix_cap = dw_pcie_find_capability(pci, PCI_CAP_ID_MSIX); dw_pcie_setup(pci); diff --git a/drivers/pci/controller/dwc/pcie-designware.c b/drivers/pci/controller/dwc/pcie-designware.c index 31f6331ca46f..164a63b7688a 100644 --- a/drivers/pci/controller/dwc/pcie-designware.c +++ b/drivers/pci/controller/dwc/pcie-designware.c @@ -20,6 +20,79 @@ #define PCIE_PHY_DEBUG_R1_LINK_UP (0x1 << 4) #define PCIE_PHY_DEBUG_R1_LINK_IN_TRAINING (0x1 << 29) +static u8 __dw_pcie_find_next_cap(struct dw_pcie *pci, u8 cap_ptr, + u8 cap) +{ + u8 cap_id, next_cap_ptr; + u16 reg; + + reg = dw_pcie_readw_dbi(pci, cap_ptr); + next_cap_ptr = (reg & 0xff00) >> 8; + cap_id = (reg & 0x00ff); + + if (!next_cap_ptr || cap_id > PCI_CAP_ID_MAX) + return 0; + + if (cap_id == cap) + return cap_ptr; + + return __dw_pcie_find_next_cap(pci, next_cap_ptr, cap); +} + +u8 dw_pcie_find_capability(struct dw_pcie *pci, u8 cap) +{ + u8 next_cap_ptr; + u16 reg; + + reg = dw_pcie_readw_dbi(pci, PCI_CAPABILITY_LIST); + next_cap_ptr = (reg & 0x00ff); + + if (!next_cap_ptr) + return 0; + + return __dw_pcie_find_next_cap(pci, next_cap_ptr, cap); +} + +static int dw_pcie_find_next_ext_capability(struct dw_pcie *pci, int start, + int cap) +{ + u32 header; + int ttl; + int pos = PCI_CFG_SPACE_SIZE; + + /* minimum 8 bytes per capability */ + ttl = (PCI_CFG_SPACE_EXP_SIZE - PCI_CFG_SPACE_SIZE) / 8; + + if (start) + pos = start; + + header = dw_pcie_readl_dbi(pci, pos); + /* + * If we have no capabilities, this is indicated by cap ID, + * cap version and next pointer all being 0. + */ + if (header == 0) + return 0; + + while (ttl-- > 0) { + if (PCI_EXT_CAP_ID(header) == cap && pos != start) + return pos; + + pos = PCI_EXT_CAP_NEXT(header); + if (pos < PCI_CFG_SPACE_SIZE) + break; + + header = dw_pcie_readl_dbi(pci, pos); + } + + return 0; +} + +int dw_pcie_find_ext_capability(struct dw_pcie *pci, int cap) +{ + return dw_pcie_find_next_ext_capability(pci, 0, cap); +} + int dw_pcie_read(void __iomem *addr, int size, u32 *val) { if (!IS_ALIGNED((uintptr_t)addr, size)) { diff --git a/drivers/pci/controller/dwc/pcie-designware.h b/drivers/pci/controller/dwc/pcie-designware.h index 70007276bc93..47996f433a57 100644 --- a/drivers/pci/controller/dwc/pcie-designware.h +++ b/drivers/pci/controller/dwc/pcie-designware.h @@ -246,6 +246,9 @@ struct dw_pcie { #define to_dw_pcie_from_ep(endpoint) \ container_of((endpoint), struct dw_pcie, ep) +u8 dw_pcie_find_capability(struct dw_pcie *pci, u8 cap); +int dw_pcie_find_ext_capability(struct dw_pcie *pci, int cap); + int dw_pcie_read(void __iomem *addr, int size, u32 *val); int dw_pcie_write(void __iomem *addr, int size, u32 val); -- 2.7.4