Received: by 2002:ab2:6d45:0:b0:1fb:d597:ff75 with SMTP id d5csp242404lqr; Wed, 5 Jun 2024 05:01:52 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCXKyoBFzgsnMoTM9mA/rcNAu9nxRiujHMo9eCb05abPOsRX+jKGzybTJ24mEWAN0U3VnUxg09EYuzMeuU8RlJgfft6ylpXNWVEWWsQb4Q== X-Google-Smtp-Source: AGHT+IHKOdVR6aMuGL4UOFtP9SPt/DjfToqzEU/TeYhEmHA8d7sK92qwtvcFFdQtJmeaycdXWG0g X-Received: by 2002:ac8:5d89:0:b0:43a:c18e:678d with SMTP id d75a77b69052e-4402b68c2bcmr16117961cf.42.1717588911834; Wed, 05 Jun 2024 05:01:51 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1717588911; cv=pass; d=google.com; s=arc-20160816; b=NptaLeMTNrSI/NJq3IeY3MuLUBDNxN9y+TNq5SFptIwm9rKVOEi4t77Uxh0pRdfGm4 gY+mM9EJ4SWEIfzXTxdSLLsU1yFpzuJM/vGiz5cVNQcaBBcC5OTY605HF0+HklKLHJVt K4NTMWBIqHw6RyI2X5hnDnY5VfNH/EsegZ3tCpo2Q6FPzVnu+xvFCSIVm3M9TSTOKa6I 5AUOKHGLpLqMtYwXB7LEI52pcTZs+XsrHK9gda8o06fJ8kTdjbSMZeUaJiM3S6GqcWWB sh7abVc1Yz5dICOXUaJOlw9j+FFYfIikJi29BDb29cefm2MxKT2cqJBQgS3zuZYSxZPP 9AeA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=ja8Hf7MY3KFIkJVfWQPrbP+YKWShNexOJsQ1c+alIVU=; fh=xUJ7egcopxxastqIApwNy/0TOdj1XXEaSNUH3dAUla0=; b=QVu5GZNRb5VF0blgaiyGpDW+HYJB8EQY8u51HNDjBaU42TBUT5kzWTDdYafnVkREJu vV2gabFVVogCKCUcgF92PD39qUAUgBm4rGaU+DYEBWDuNxs7F8Po++6n03nFCUkVwE32 JAoM3MO4xjWYIpDc5xEBuzWCPlc4xO9aUKzjrtJmfXNjTbs9YtW58CzHtfQtn6QiBbJM Cdnq4hK7iowheDZlqEiKnDe9BMGF8WHdhBuy7Yn9O/C+7nxaKVYX56POQWAUVAu6seWe RKI1q4gOIwTP+LPmDBacEor9+Jan9swrWaVgO9CnvBHPegwCqVOFltKbTsNVKJUWNHfI SMqw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=ZYMRTwnc; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-202346-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-202346-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id d75a77b69052e-43ff259e260si125927091cf.626.2024.06.05.05.01.51 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Jun 2024 05:01:51 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-202346-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=ZYMRTwnc; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-202346-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-202346-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 8CAB41C23477 for ; Wed, 5 Jun 2024 12:01:51 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 5A82F1A0DDF; Wed, 5 Jun 2024 11:51:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ZYMRTwnc" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 562E11A0DC5; Wed, 5 Jun 2024 11:51:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717588301; cv=none; b=gy3lYim8kXL7a58sFAN0H9NacBBTOpNCBn5zAyWNSRy+2YJGCx5jDiuqDqaaeOUU7EGJWI/YIhHOfeg3pzbjrMxJHXOnh6CfZPeCZkzaPYM5/K7tkGQiBqKvmCsHB1vpeBCMY0BsSQNVmXGkL5sN5XdoNLzi9sdHbJVNMA7colY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717588301; c=relaxed/simple; bh=2kQpWXsIP9nj9LIarFplvSL9j+EnKHHxtc41OT38H2U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rXP2IsvkXEkj8jBJZxKa9OwxC6qHKqHWZsBLnZk/VRMF5lA/efKLp53JYygKQxGqSMFzMezsWC2FCYxo1hvVR/dm/Gw/grbS/kS9D219dlApm721cPMV2jRfjwou21tYnbr02XMnMmG8VhvVJWyYJAZX02wtkfHdRKlO9URCGDM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ZYMRTwnc; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 35E94C4AF09; Wed, 5 Jun 2024 11:51:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1717588301; bh=2kQpWXsIP9nj9LIarFplvSL9j+EnKHHxtc41OT38H2U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZYMRTwnc3g+IJdKBv+zUQF7MnvTYp5ldv1rOOHC19sUOZLfSPWLPzjOBcmAyQKjeG /MD8ANaycfsAt7gLR+PHts0YEKGjL5hCpPdEhWKyMhvnNjKYNzlkcZtVU0bs0sHHy7 lO0OqmzkudWsuW6RcsS7lryXfc3VozVf9sB6pVn0D2btVa2flLRGg9/7PiqmFQc06v qfE2Av5RgEeLuLwuKjEfJxyGizdB8WNrfDVtydVpKSBz9zXrqEzqC7v5Wbfm4ugDs3 2EonAyY/2xHWq9Fow9WLnzioVXA8YeCBZSuryTcHnXtjASOheV9zC8tghDVmSnVwMD JVkViqD8QAQ+A== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Krishna Kurapati , Bjorn Andersson , Thinh Nguyen , Johan Hovold , Greg Kroah-Hartman , Sasha Levin , linux-usb@vger.kernel.org Subject: [PATCH AUTOSEL 6.8 15/24] usb: dwc3: core: Access XHCI address space temporarily to read port info Date: Wed, 5 Jun 2024 07:50:25 -0400 Message-ID: <20240605115101.2962372-15-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240605115101.2962372-1-sashal@kernel.org> References: <20240605115101.2962372-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore X-stable-base: Linux 6.8.12 Content-Transfer-Encoding: 8bit From: Krishna Kurapati [ Upstream commit 921e109c6200741499ad0136e41cca9d16431c92 ] All DWC3 Multi Port controllers that exist today only support host mode. Temporarily map XHCI address space for host-only controllers and parse XHCI Extended Capabilities registers to read number of usb2 ports and usb3 ports present on multiport controller. Each USB Port is at least HS capable. The port info for usb2 and usb3 phy are identified as num_usb2_ports and num_usb3_ports and these are used as iterators for phy operations and for modifying GUSB2PHYCFG/ GUSB3PIPECTL registers accordingly. Signed-off-by: Krishna Kurapati Reviewed-by: Bjorn Andersson Acked-by: Thinh Nguyen Reviewed-by: Johan Hovold Tested-by: Johan Hovold Link: https://lore.kernel.org/r/20240420044901.884098-3-quic_kriskura@quicinc.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/usb/dwc3/core.c | 61 +++++++++++++++++++++++++++++++++++++++++ drivers/usb/dwc3/core.h | 5 ++++ 2 files changed, 66 insertions(+) diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 100041320e8dd..2a93468bdce50 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -39,6 +39,7 @@ #include "io.h" #include "debug.h" +#include "../host/xhci-ext-caps.h" #define DWC3_DEFAULT_AUTOSUSPEND_DELAY 5000 /* ms */ @@ -1867,10 +1868,56 @@ static int dwc3_get_clocks(struct dwc3 *dwc) return 0; } +static int dwc3_get_num_ports(struct dwc3 *dwc) +{ + void __iomem *base; + u8 major_revision; + u32 offset; + u32 val; + + /* + * Remap xHCI address space to access XHCI ext cap regs since it is + * needed to get information on number of ports present. + */ + base = ioremap(dwc->xhci_resources[0].start, + resource_size(&dwc->xhci_resources[0])); + if (!base) + return -ENOMEM; + + offset = 0; + do { + offset = xhci_find_next_ext_cap(base, offset, + XHCI_EXT_CAPS_PROTOCOL); + if (!offset) + break; + + val = readl(base + offset); + major_revision = XHCI_EXT_PORT_MAJOR(val); + + val = readl(base + offset + 0x08); + if (major_revision == 0x03) { + dwc->num_usb3_ports += XHCI_EXT_PORT_COUNT(val); + } else if (major_revision <= 0x02) { + dwc->num_usb2_ports += XHCI_EXT_PORT_COUNT(val); + } else { + dev_warn(dwc->dev, "unrecognized port major revision %d\n", + major_revision); + } + } while (1); + + dev_dbg(dwc->dev, "hs-ports: %u ss-ports: %u\n", + dwc->num_usb2_ports, dwc->num_usb3_ports); + + iounmap(base); + + return 0; +} + static int dwc3_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct resource *res, dwc_res; + unsigned int hw_mode; void __iomem *regs; struct dwc3 *dwc; int ret; @@ -1954,6 +2001,20 @@ static int dwc3_probe(struct platform_device *pdev) goto err_disable_clks; } + /* + * Currently only DWC3 controllers that are host-only capable + * can have more than one port. + */ + hw_mode = DWC3_GHWPARAMS0_MODE(dwc->hwparams.hwparams0); + if (hw_mode == DWC3_GHWPARAMS0_MODE_HOST) { + ret = dwc3_get_num_ports(dwc); + if (ret) + goto err_disable_clks; + } else { + dwc->num_usb2_ports = 1; + dwc->num_usb3_ports = 1; + } + spin_lock_init(&dwc->lock); mutex_init(&dwc->mutex); diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index d96a28eecbcc3..9309f3dd94fcc 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -1038,6 +1038,8 @@ struct dwc3_scratchpad_array { * @usb3_phy: pointer to USB3 PHY * @usb2_generic_phy: pointer to USB2 PHY * @usb3_generic_phy: pointer to USB3 PHY + * @num_usb2_ports: number of USB2 ports + * @num_usb3_ports: number of USB3 ports * @phys_ready: flag to indicate that PHYs are ready * @ulpi: pointer to ulpi interface * @ulpi_ready: flag to indicate that ULPI is initialized @@ -1186,6 +1188,9 @@ struct dwc3 { struct phy *usb2_generic_phy; struct phy *usb3_generic_phy; + u8 num_usb2_ports; + u8 num_usb3_ports; + bool phys_ready; struct ulpi *ulpi; -- 2.43.0