From patchwork Wed Aug 17 20:03:32 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 12946386 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 039BFC32772 for ; Wed, 17 Aug 2022 20:03:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=80sEQVT5TxeJ/vIL+UdKhA5vhpjBpxY4VMoHGYobL2g=; b=EUdfD3QSHrqeKX oSabbzbN4jTzzVJ435LddtZXFUrkp5wARVAh1Qad5qY/URnlf5tx6Vx1dFq6FjpM5bORbvjKi6YBx XnxK4HETIldTjDWMUJGbfOkb+49Nzo8h0R16Rx791EWGpCjF3DcrcMW6b1/IJM4IKk8c+dJM7anns 5uVFWiPTZZ4Uk7blbisV6nGhK9Y/opq0lrCt3/MaDteH2D99tnFKusj8lJ87D6tMmleUnCj2mLtBB uJ5/0K3asOdKdiE4Jx+o+HEGcNVioA5eF8JPNiZuR3YV5t/wAOZE5LQpgellggnIRwDL70UUpMbrZ QCXitcyVc/knxdb/22+g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oOPGX-0065Mk-CL; Wed, 17 Aug 2022 20:03:49 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oOPGU-0065KR-3S for linux-phy@lists.infradead.org; Wed, 17 Aug 2022 20:03:47 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id D4CD56151B; Wed, 17 Aug 2022 20:03:43 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id CBB2FC4347C; Wed, 17 Aug 2022 20:03:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1660766623; bh=wv0Zebl3/M8/sl1p7uqmjBF5ITW2e0LsrTBPWFRbNuA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=IybX3rRa0kAATdNa9CEutWHHd6nJNB/y5T4vkHUm4SCBxsG8J6o2lnKb5ITB9GZwT WOunqvHZDReF98jHFUrT4omATeTvB3UCsg/rZDPxcxrrDrtzAcum1B8j4gTkqj0NLe en9O7rOnvqqyggowmKPE4BeGmXuDlKMcTntGHaJ3PwQamtksLtjybpR/aPxmhpwVMg pA2qJizPk36y4j50+h95mxHjC0e9BVblhawKMwatNS0D4RpoUMf6u6kUMoXnrzZfTH 6NXMp7SKRpNPotFkq14UcIQPtJFT6KTkDsDWLgb0zPPUVkbS/L4c+4E5yToxy65t3j CT26aaydcxB2A== From: =?utf-8?q?Marek_Beh=C3=BAn?= To: Vinod Koul , Kishon Vijay Abraham I , Linux Phy , Kees Cook , Andy Shevchenko Cc: Daniel Scally , Gregory Clement , Heikki Krogerus , Sakari Ailus , linux-kernel@vger.kernel.org, pali@kernel.org, josef.schlehofer@nic.cz, =?utf-8?q?Marek_Beh=C3=BAn?= Subject: [PATCH linux-phy v2 1/4] string.h: Add str_has_proper_prefix() Date: Wed, 17 Aug 2022 22:03:32 +0200 Message-Id: <20220817200335.911-2-kabel@kernel.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220817200335.911-1-kabel@kernel.org> References: <20220817200335.911-1-kabel@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220817_130346_212180_3C664522 X-CRM114-Status: GOOD ( 11.56 ) X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-phy" Errors-To: linux-phy-bounces+linux-phy=archiver.kernel.org@lists.infradead.org Add str_has_proper_prefix(), similar to str_has_prefix(), but requires that the prefix is proper: the string itself must be longer than the prefix. Signed-off-by: Marek Behún --- Andy, Kees, could you ack this if it is ok? --- include/linux/string.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/include/linux/string.h b/include/linux/string.h index 61ec7e4f6311..375f51b9182c 100644 --- a/include/linux/string.h +++ b/include/linux/string.h @@ -316,4 +316,22 @@ static __always_inline size_t str_has_prefix(const char *str, const char *prefix return strncmp(str, prefix, len) == 0 ? len : 0; } +/** + * str_has_proper_prefix - Test if a string has a proper prefix + * @str: The string to test + * @prefix: The string to see if @str starts with + * + * This is like str_has_prefix(), but fails if the strings are equal. + * + * Returns: + * * strlen(@prefix) if @str starts with @prefix and they aren't equal + * * 0 otherwise + */ +static __always_inline size_t str_has_proper_prefix(const char *str, + const char *prefix) +{ + size_t len = strlen(prefix); + return strncmp(str, prefix, len) == 0 && len != strlen(str) ? len : 0; +} + #endif /* _LINUX_STRING_H_ */ From patchwork Wed Aug 17 20:03:33 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 12946388 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id DBEABC32773 for ; Wed, 17 Aug 2022 20:04:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=FGqRP5PyGi/ZNbo8r5SkCO/nw9HXGJK5mlKmo1AjXWw=; b=wLnMcY0P0mZVkA a4Vspo1nz997dhCIcbZN2M5MI4P8obC06u7z1H2M0T88L/FX49KTnrs921x88XENy+SdOBZQcjZsF bDmW0ngr7SCHd1MUO8qjXjgu/Gj2QdS/dwm+qcoExMFtQYr57OtXlP3apkkFk2uKCeIL+eC1It3SI QM8dB4jt8wb0UmMTOSdGPQfyG78aFwjvHj9NPvhHiY2vQ+0a9YZzCKrCVtfzI4489z4Xh8RLLXYMG QlnhtvbgDVT5AhiSaQgA3gISPTHoiYGBbHZLrroFz0aCDnHX3iOCsGXj7ILxNv/qRJkj7+2KQcszk gNlBk3f1RKQ3WbS05QPQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oOPGi-0065Ru-7O; Wed, 17 Aug 2022 20:04:00 +0000 Received: from ams.source.kernel.org ([2604:1380:4601:e00::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oOPGe-0065MV-Ig for linux-phy@lists.infradead.org; Wed, 17 Aug 2022 20:03:59 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 59434B81F5D; Wed, 17 Aug 2022 20:03:47 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A8820C43470; Wed, 17 Aug 2022 20:03:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1660766626; bh=xoSj1JpELAuTG/WCX3GOaVx+5vM2XwQeuT06KHfLqk8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Y2XewTojGKRqC7pumHvuCgCJUMC1tOuAq2KQOSSO4uALMisMqEEZhGqGfA0rKk2wc OZyjqQOXqLFPcYUaXUXnE0pOm6ifAz+HWXj8qKgqapeM83eOL+lr3C4YGeHdo2Xuc3 aGwjf7IHbKtxIGbwwzRbVWgQiG8BR2kuCgT862+B56pkYVakQk4r8ismVoqWmte7YG kVcWOeV678nbduRAkHOZYvJDKmxcM5obtfNXk5nrynAv5sUi4W/FaQQMGJo9BXdbEl qGAfsnO+ccXb9eFu+9XTYOVl3knpWy3rTYrZ4fMqzNgaoKBUfF+SoTERUZYj/arV3U NUKjjzcY4KYiQ== From: =?utf-8?q?Marek_Beh=C3=BAn?= To: Vinod Koul , Kishon Vijay Abraham I , Linux Phy , Andy Shevchenko , Daniel Scally , Heikki Krogerus , Sakari Ailus Cc: Gregory Clement , Kees Cook , linux-kernel@vger.kernel.org, pali@kernel.org, josef.schlehofer@nic.cz, =?utf-8?q?Marek_Beh=C3=BAn?= Subject: [PATCH linux-phy v2 2/4] device property: Add {fwnode/device}_get_tx_p2p_amplitude() Date: Wed, 17 Aug 2022 22:03:33 +0200 Message-Id: <20220817200335.911-3-kabel@kernel.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220817200335.911-1-kabel@kernel.org> References: <20220817200335.911-1-kabel@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220817_130356_982869_D3B1B57B X-CRM114-Status: GOOD ( 21.48 ) X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-phy" Errors-To: linux-phy-bounces+linux-phy=archiver.kernel.org@lists.infradead.org Add functions fwnode_get_tx_p2p_amplitude() and device_get_tx_p2p_amplitude() that parse the 'tx-p2p-microvolt' and 'tx-p2p-microvolt-names' properties and return peak to peak transmit amplitude in microvolts for given PHY mode. The functions search for mode name in 'tx-p2p-microvolt-names' property, and return amplitude at the corresponding index in the 'tx-p2p-microvolt' property. If given mode is not matched in 'tx-p2p-microvolt-names' array, the mode name is generalized (for example "pcie3" -> "pcie" -> "default", or "usb-ss" -> "usb" -> "default"). If the 'tx-p2p-microvolt-names' is not present, the 'tx-p2p-microvolt' property is expected to contain only one value, which is considered default, and will be returned for any mode. Signed-off-by: Marek Behún --- Andy et al. can I get Ack for this if this is okay? --- drivers/base/property.c | 130 +++++++++++++++++++++++++++++++++++++++ include/linux/property.h | 5 ++ 2 files changed, 135 insertions(+) diff --git a/drivers/base/property.c b/drivers/base/property.c index ed6f449f8e5c..34b763436c30 100644 --- a/drivers/base/property.c +++ b/drivers/base/property.c @@ -921,6 +921,136 @@ int device_get_phy_mode(struct device *dev) } EXPORT_SYMBOL_GPL(device_get_phy_mode); +/** + * fwnode_get_tx_p2p_amplitude - Get peak to peak transmit amplitude for given + * PHY mode + * @fwnode: Pointer to the given node + * @mode: Name of the PHY mode, or "default" / NULL + * @amplitude: Pointer where to store the amplitude + * + * Gets the peak to peak transmit amplitude in microvolts for a given PHY mode + * by parsing the 'tx-p2p-microvolt' and 'tx-p2p-microvolt-names' properties. + * If amplitude is not specified for @mode exactly, tries a more generic mode, + * and if that isn't specified, tries "default". + * + * For example if @mode is "pcie3", we first try searching for value + * corresponding to "pcie3", then to "pcie", and finally to "default". + * + * Return: %0 if the amplitude was read (success), + * %-EINVAL if given arguments are not valid, + * %-ENODATA if the required properties do not have a value, + * %-EPROTO if the property is not an array of strings, + * %-ENXIO if no suitable firmware interface is present, + * %-ENOMEM if out of memory. + */ +int fwnode_get_tx_p2p_amplitude(struct fwnode_handle *fwnode, const char *mode, + u32 *amplitude) +{ + static const char *names_prop = "tx-p2p-microvolt-names", + *vals_prop = "tx-p2p-microvolt"; + const char **names; + int cnt, idx, ret; + u32 *vals; + + cnt = fwnode_property_string_array_count(fwnode, names_prop); + if (!cnt || cnt == -EINVAL) + /* + * If the names property does not exist or is empty, we expect + * the values property to contain only one, default value. + */ + return fwnode_property_read_u32(fwnode, vals_prop, amplitude); + else if (cnt < 0) + return cnt; + + names = kcalloc(cnt, sizeof(*names), GFP_KERNEL); + if (!names) + return -ENOMEM; + + ret = fwnode_property_read_string_array(fwnode, names_prop, names, cnt); + if (ret < 0) { + kfree(names); + return ret; + } + + if (!mode) + mode = "default"; + + do { + static const char * const gen_table[] = { + "pcie", "usb", "ufs-hs", "dp", "mipi-dphy", + }; + size_t i; + + idx = match_string(names, cnt, mode); + if (idx >= 0) + break; + + /* If mode was not matched, try more generic mode */ + for (i = 0; i < ARRAY_SIZE(gen_table); ++i) { + if (str_has_proper_prefix(mode, gen_table[i])) { + mode = gen_table[i]; + break; + } + } + + /* Or "default" */ + if (i == ARRAY_SIZE(gen_table)) { + if (strcmp(mode, "default")) + mode = "default"; + else + mode = NULL; + } + } while (mode); + + kfree(names); + + if (idx < 0) + return -ENODATA; + + vals = kcalloc(cnt, sizeof(*vals), GFP_KERNEL); + if (!vals) + return -ENOMEM; + + ret = fwnode_property_read_u32_array(fwnode, vals_prop, vals, cnt); + if (ret) + goto out; + + *amplitude = vals[idx]; +out: + kfree(vals); + return ret; +} +EXPORT_SYMBOL_GPL(fwnode_get_tx_p2p_amplitude); + +/** + * device_get_tx_p2p_amplitude - Get peak to peak transmit amplitude for given + * PHY mode + * @dev: Pointer to the given device + * @mode: Name of the PHY mode, or "default" / NULL + * @amplitude: Pointer where to store the amplitude + * + * Gets the peak to peak transmit amplitude in microvolts for a given PHY mode + * by parsing the 'tx-p2p-microvolt' and 'tx-p2p-microvolt-names' properties. + * If amplitude is not specified for @mode exactly, tries a more generic mode, + * and if that isn't specified, tries "default". + * + * For example if @mode is "pcie3", we first try searching for value + * corresponding to "pcie3", then to "pcie", and finally to "default". + * + * Return: %0 if the amplitude was read (success), + * %-EINVAL if given arguments are not valid, + * %-ENODATA if the required properties do not have a value, + * %-EPROTO if the property is not an array of strings, + * %-ENXIO if no suitable firmware interface is present, + * %-ENOMEM if out of memory. + */ +int device_get_tx_p2p_amplitude(struct device *dev, const char *mode, + u32 *amplitude) +{ + return fwnode_get_tx_p2p_amplitude(dev_fwnode(dev), mode, amplitude); +} +EXPORT_SYMBOL_GPL(device_get_tx_p2p_amplitude); + /** * fwnode_iomap - Maps the memory mapped IO for a given fwnode * @fwnode: Pointer to the firmware node diff --git a/include/linux/property.h b/include/linux/property.h index a5b429d623f6..91b12a79e245 100644 --- a/include/linux/property.h +++ b/include/linux/property.h @@ -392,6 +392,11 @@ const void *device_get_match_data(struct device *dev); int device_get_phy_mode(struct device *dev); int fwnode_get_phy_mode(struct fwnode_handle *fwnode); +int fwnode_get_tx_p2p_amplitude(struct fwnode_handle *fwnode, const char *mode, + u32 *amplitude); +int device_get_tx_p2p_amplitude(struct device *dev, const char *mode, + u32 *amplitude); + void __iomem *fwnode_iomap(struct fwnode_handle *fwnode, int index); struct fwnode_handle *fwnode_graph_get_next_endpoint( From patchwork Wed Aug 17 20:03:34 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 12946389 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id B1ECBC2BB41 for ; Wed, 17 Aug 2022 20:04:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=GvxPzdsvY/TFQWx9fzHRZzLacyCxayGyxZM+zqmD+wM=; b=iaj6ZPBLpY+Y6g FTVnmaRMTuMyjUuyDjmMnmK7b0FUbx9Ij4lG9ulg+U1H6D8vhvxi4NpRGxBPMB0g9QN4B2F1f5L0B XEFOMKrg29/2Y8+j46Z999uGcuLBa3Mu0/7qx5XhF5yehQkC/ysWJNd2Q5c4xCHSDBsDyINYHQE3g kMoQUPjO+T5CCf4rSOu0jtF6PDTLNhERV0pN86D366nxvCTmh0sA3rBntYGO5YcL3q9WjDjifiNtT kXzNPoFKq0dQZQfBd0Z/9tTJy745EbBz1FhmrW8qVOSByHbh8TuuiMuFF6HxCOyeZ7PAXpZxZoV0O 8LP+GOJw7DBVwJLXH1rA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oOPGi-0065Ro-3p; Wed, 17 Aug 2022 20:04:00 +0000 Received: from ams.source.kernel.org ([2604:1380:4601:e00::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oOPGe-0065NF-Ih for linux-phy@lists.infradead.org; Wed, 17 Aug 2022 20:03:58 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 362CFB81F13; Wed, 17 Aug 2022 20:03:50 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 87076C43143; Wed, 17 Aug 2022 20:03:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1660766629; bh=Q+R9USyKy7p7mEYIj9z8Lowa0yqJDDTBygy/2GjV1T8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ppqaUYsbIJC8pN4ebTEfrBqnmX1EqQbKaLHcDoFsD0ave51ycO5RZ2ZJGwA0/hAOe BiydbR8W48AoFyOB4jBNOL30/5ye16yXz/i5oSHGgVm6eNGOtQ410ytJYubDF2d5Ah sTUPCNbtSdsND5LmM0x1oMl6Nsm+GLoS066hwdmfX8vFD1MqEuUgJR0xA52B0e0HH8 p4RLl4fDH/apj+Wgjy0AwMkP50+iHjbQZk9q7flVHwkfcfZoTUPB7OX2jXZdtDBJTF Bndx3F+WEJiRViHZ6Bq9y8ugzbGSpZXIRMGnfGIwXVbUlX713u7fZO7+fdp2lsFlZS Ppp5vxbyoqsPw== From: =?utf-8?q?Marek_Beh=C3=BAn?= To: Vinod Koul , Kishon Vijay Abraham I , Linux Phy Cc: Andy Shevchenko , Daniel Scally , Gregory Clement , Heikki Krogerus , Kees Cook , Sakari Ailus , linux-kernel@vger.kernel.org, pali@kernel.org, josef.schlehofer@nic.cz, =?utf-8?q?Marek_Beh=C3=BAn?= Subject: [PATCH linux-phy v2 3/4] phy: marvell: phy-mvebu-a3700-comphy: Support changing tx amplitude for ethernet Date: Wed, 17 Aug 2022 22:03:34 +0200 Message-Id: <20220817200335.911-4-kabel@kernel.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220817200335.911-1-kabel@kernel.org> References: <20220817200335.911-1-kabel@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220817_130356_985799_30486B00 X-CRM114-Status: GOOD ( 18.16 ) X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-phy" Errors-To: linux-phy-bounces+linux-phy=archiver.kernel.org@lists.infradead.org Add support to set SerDes transmit amplitude if specified via the 'tx-p2p-microvolt' and 'tx-p2p-microvolt-names' device-tree properties. This support is currently only for ethernet mode. Signed-off-by: Marek Behún --- drivers/phy/marvell/phy-mvebu-a3700-comphy.c | 109 ++++++++++++++++++- 1 file changed, 108 insertions(+), 1 deletion(-) diff --git a/drivers/phy/marvell/phy-mvebu-a3700-comphy.c b/drivers/phy/marvell/phy-mvebu-a3700-comphy.c index a4d7d9bd100d..7fabd959ae0f 100644 --- a/drivers/phy/marvell/phy-mvebu-a3700-comphy.c +++ b/drivers/phy/marvell/phy-mvebu-a3700-comphy.c @@ -68,6 +68,16 @@ #define SPEED_PLL_MASK GENMASK(7, 2) #define SPEED_PLL_VALUE_16 FIELD_PREP(SPEED_PLL_MASK, 0x10) +#define COMPHY_GEN1_SET0 0x0d +#define COMPHY_GEN2_SET0 0x0f +#define COMPHY_GEN3_SET0 0x11 +#define COMPHY_GEN4_SET0 0x13 +#define COMPHY_GENx_SET0(x) (0x0d + (((x) & 3) - 1) * 2) +#define Gx_TX_AMP_MASK GENMASK(5, 1) +#define Gx_TX_AMP_VALUE(x) FIELD_PREP(Gx_TX_AMP_MASK, x) +#define Gx_TX_AMP_ADJ BIT(6) +#define Gx_TX_AMP_1025MV (Gx_TX_AMP_VALUE(0x12) | Gx_TX_AMP_ADJ) + #define COMPHY_DIG_LOOPBACK_EN 0x23 #define SEL_DATA_WIDTH_MASK GENMASK(11, 10) #define DATA_WIDTH_10BIT FIELD_PREP(SEL_DATA_WIDTH_MASK, 0x0) @@ -269,6 +279,7 @@ struct mvebu_a3700_comphy_priv { struct mvebu_a3700_comphy_lane { struct mvebu_a3700_comphy_priv *priv; struct device *dev; + struct phy *phy; unsigned int id; enum phy_mode mode; int submode; @@ -385,6 +396,15 @@ static inline void comphy_reg_set16(void __iomem *addr, u16 data, u16 mask) } /* Used for accessing lane 2 registers (SATA/USB3 PHY) */ +static u16 comphy_get_indirect(struct mvebu_a3700_comphy_priv *priv, u32 offset) +{ + writel(offset, + priv->lane2_phy_indirect + COMPHY_LANE2_INDIR_ADDR); + + /* We need to read the register with 32-bit read */ + return readl(priv->lane2_phy_indirect + COMPHY_LANE2_INDIR_DATA); +} + static void comphy_set_indirect(struct mvebu_a3700_comphy_priv *priv, u32 offset, u16 data, u16 mask) { @@ -394,6 +414,21 @@ static void comphy_set_indirect(struct mvebu_a3700_comphy_priv *priv, data, mask); } +static u16 comphy_lane_reg_get(struct mvebu_a3700_comphy_lane *lane, u16 reg) +{ + if (lane->id == 2) { + /* lane 2 PHY registers are accessed indirectly */ + return comphy_get_indirect(lane->priv, + reg + COMPHY_LANE2_REGS_BASE); + } else { + void __iomem *base = lane->id == 1 ? + lane->priv->lane1_phy_regs : + lane->priv->lane0_phy_regs; + + return readw(base + COMPHY_LANE_REG_DIRECT(reg)); + } +} + static void comphy_lane_reg_set(struct mvebu_a3700_comphy_lane *lane, u16 reg, u16 data, u16 mask) { @@ -624,10 +659,53 @@ static void comphy_gbe_phy_init(struct mvebu_a3700_comphy_lane *lane, } } +static u8 comphy_find_best_tx_amp(bool full_swing, u32 amp, u32 *true_amp) +{ + static const u32 half_swing_table[32] = { + 250, 270, 290, 310, 330, 345, 365, 380, + 400, 420, 435, 455, 470, 490, 505, 525, + 485, 520, 555, 590, 625, 660, 695, 730, + 765, 800, 830, 865, 900, 930, 965, 1000, + }; + static const u32 full_swing_table[22] = { + 470, 505, 540, 575, 610, 645, 680, 715, + 750, 785, 820, 850, 885, 915, 950, 980, + 900, 965, 1025, 1095, 1160, 1220, + }; + u32 diff, min_diff; + const u32 *table; + size_t len; + u8 res; + + if (full_swing) { + table = full_swing_table; + len = ARRAY_SIZE(full_swing_table); + } else { + table = half_swing_table; + len = ARRAY_SIZE(half_swing_table); + } + + res = 0; + min_diff = abs(amp - table[0]); + + for (size_t i = 1; i < len; ++i) { + diff = abs(amp - table[i]); + if (diff < min_diff) { + min_diff = diff; + res = i; + } + } + + if (true_amp) + *true_amp = table[res]; + + return res; +} + static int mvebu_a3700_comphy_ethernet_power_on(struct mvebu_a3700_comphy_lane *lane) { - u32 mask, data, speed_sel; + u32 mask, data, speed_sel, tx_amp_uv; int ret; /* Set selector */ @@ -746,6 +824,34 @@ mvebu_a3700_comphy_ethernet_power_on(struct mvebu_a3700_comphy_lane *lane) comphy_gbe_phy_init(lane, lane->submode != PHY_INTERFACE_MODE_2500BASEX); + /* + * Change transmit amplitude if specified in device-tree. + */ + if (!device_get_tx_p2p_amplitude(&lane->phy->dev, + phy_modes(lane->submode), + &tx_amp_uv)) { + u32 tx_amp_mv, true_tx_amp_mv; + bool full_swing; + u8 tx_amp; + u16 reg; + + reg = COMPHY_GENx_SET0(speed_sel + 1); + + data = comphy_lane_reg_get(lane, reg); + full_swing = data & Gx_TX_AMP_ADJ; + tx_amp_mv = DIV_ROUND_CLOSEST(tx_amp_uv, 1000); + tx_amp = comphy_find_best_tx_amp(full_swing, tx_amp_mv, + &true_tx_amp_mv); + + data = Gx_TX_AMP_VALUE(tx_amp); + mask = Gx_TX_AMP_MASK; + comphy_lane_reg_set(lane, reg, data, mask); + + dev_dbg(lane->dev, + "changed tx amplitude to %u mV (requested %u mV) on lane %d\n", + true_tx_amp_mv, tx_amp_mv, lane->id); + } + /* * 14. Check the PHY Polarity invert bit */ @@ -1382,6 +1488,7 @@ static int mvebu_a3700_comphy_probe(struct platform_device *pdev) lane->priv = priv; lane->dev = &pdev->dev; + lane->phy = phy; lane->mode = PHY_MODE_INVALID; lane->submode = PHY_INTERFACE_MODE_NA; lane->id = lane_id; From patchwork Wed Aug 17 20:03:35 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 12946387 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 6F961C32772 for ; Wed, 17 Aug 2022 20:03:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=yhpRKXTYm6izrDe0g5H3qXluCtX/7WdRGuWEdQ3d64s=; b=hzO5+/qzjt1AH2 /O7ldo9Ehe3l3rYtQx5AB9yUTyS55Ya57Lxxu8qEP8yfRFBIvYNOJ+SfTCuonPiKGg0N2gG4EvER0 q1JNtNVubiOtqqC6mD0pv8BecRfPU9dXAWU2mrEojAzLgzA78ACKWUlf82V76SzqzrFzs1z44e9ip g8c7jkxaynstFui+ZjaABe9oRBikbIXqbE8CHKaxCiOz+5Ayf6y3zDH9Xfp9UpyffP8YLDJXr5v7p w+k2uDxtMnUUuzjUUD3eXLCvhIVPZtiErbQWqBBzldxWBpCM+GvWA2I+yRLCCBxpJYdjEwzJrt72x BTd/XvqMRJXa0DL/pILw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oOPGc-0065Po-Rn; Wed, 17 Aug 2022 20:03:54 +0000 Received: from dfw.source.kernel.org ([139.178.84.217]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oOPGa-0065NZ-Ey for linux-phy@lists.infradead.org; Wed, 17 Aug 2022 20:03:53 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 0848A614EE; Wed, 17 Aug 2022 20:03:52 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6340CC43470; Wed, 17 Aug 2022 20:03:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1660766631; bh=SNZ70vt4bNjbtH48RRhcFsT0HkyKYDhAfV/NNF8Sj9I=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=taN9Qch78MvSeXbDyWhIPR+suwZFNPzyZmAzLyaR8NSXf4mh7CdyLT7HVxlXTnPNq T/i1I8SetYLuOCZkc2llJ3tcbeIPqTr0ehmxYsJOjjVvF0c8+a7ajJ3QjE+b/9e+7f r9k6dPFiBV9QJP6TypHRyedePbioXwEtckP3Qdz+fIShsVIIW2fr3W2CxSGN7stVLq 5BRjY4Te5NT9sd8GO5i4YGbKHiZc/pOGu19BP1yEHJMFNT1LcwPOX82Or3HscGafKt bbMEGjFAPBlHqKea0D5eQu6L5hWRWQ1D1nfxltwTKwJPmDm9xuV6BlO/ijoCjxnYzR mRB3pVzkAtsrw== From: =?utf-8?q?Marek_Beh=C3=BAn?= To: Vinod Koul , Kishon Vijay Abraham I , Linux Phy , Gregory Clement Cc: Andy Shevchenko , Daniel Scally , Heikki Krogerus , Kees Cook , Sakari Ailus , linux-kernel@vger.kernel.org, pali@kernel.org, josef.schlehofer@nic.cz, =?utf-8?q?Marek_Beh=C3=BAn?= Subject: [PATCH linux-phy v2 4/4] arm64: dts: armada-3720-turris-mox: Change comphy tx amplitude for 2500base-x mode Date: Wed, 17 Aug 2022 22:03:35 +0200 Message-Id: <20220817200335.911-5-kabel@kernel.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220817200335.911-1-kabel@kernel.org> References: <20220817200335.911-1-kabel@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220817_130352_588190_F1E0D2EC X-CRM114-Status: GOOD ( 12.22 ) X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-phy" Errors-To: linux-phy-bounces+linux-phy=archiver.kernel.org@lists.infradead.org Change comphy transmit amplitude to 1025 mV for 2500base-x mode on comphy connected to Topaz. This fixes issue wherein if the 8b/10b encoded packet contains a long enough alternating sequence of bits (010101... or 101010...), which happens if the packet contains a sequence of 'J' or '\xb5' bytes, the packet may be lost when sent from A3720 to Topaz due to FCS error. The probability of loss grows with the number of 'J's with default transmit amplitude setting - with 114 'J's the probability is about 50%, with 125 'J's almost 100% of packets are lost. Fixes: 7109d817db2e ("arm64: dts: marvell: add DTS for Turris Mox") Signed-off-by: Marek Behún --- arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts b/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts index ada164d423f3..74a7ac1f8ecb 100644 --- a/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts +++ b/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts @@ -181,6 +181,16 @@ ð1 { phys = <&comphy0 1>; }; +&comphy0 { + /* + * Set peak to peak transmit amplitude to 1025 mV to fix issue wherein + * a packet may be lost if it contains a long enough sequence of 'J' + * or '\xb5' bytes. + */ + tx-p2p-microvolt = <1025000>; + tx-p2p-microvolt-names = "2500base-x"; +}; + &sdhci0 { wp-inverted; bus-width = <4>;