Received: by 2002:a05:6a10:6d10:0:0:0:0 with SMTP id gq16csp827635pxb; Tue, 12 Apr 2022 14:35:12 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzX2czioUGfEV2PbcOOdCkNA/1ix46WpomXKBHTFRAMumhlhOoqEXNU7p1f7fPzlNBxRmBg X-Received: by 2002:a17:903:230f:b0:158:8521:1e76 with SMTP id d15-20020a170903230f00b0015885211e76mr6415539plh.84.1649799312738; Tue, 12 Apr 2022 14:35:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649799312; cv=none; d=google.com; s=arc-20160816; b=JS4MYIryApfzdG5kM7akrzvz7AMq1MEg10iQqwtJvoc6qrUaaL4TT9UC+jZk146AoS UJkh1Sj7YXjYCwryL3KZVBdPAc8okK6q8qgNOOH6MIy/Nl9tXhUIuKkID+ix0WlYoEsb nh8mn27kR/5kQ/tAxL7qzQwikRohsPUNI1TOk+pMh453H9pF4g5PgBiT1PM9PCsQrYtP J6P+OHwfp3aM9WBtAHi82N1AGii6fYw/A4I70almmA0iTYP9Linm4IMIiJsbS8XxnJMS JQa6cfzxM9T4vmNmusa3HUtADlZuuw5Klp49fzeax1cJicV3Gs1/gpDwp0TaZKvyDGPx x0uA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=ObJTIvJ0rbUtoNhNqntxZzPBS7VM+9DjiN+POaAs1Kk=; b=QdXvqRsO1GRxNWFlsMB+Xy7h1bPyKemv/hd5mL/MX3yZ/slGYlC9gGpwBoakfCX9XR JC48Xz4YPwZrtiDsvjHu5hRRrYG6bq6VIchHjh9YJUsXWyNc+nXg5Cqb7GQO63RL4m1L JNhSblboPsiF1V+n7o2/6NLy9iZnSoOKQdmBmh1Y9co7qlwCPwv31Oh+dYVs+JKSCHye e2CaELOIZwtj4PJwrYqvtayee+i6U0ie9Yh9IRM8Z0YzjQVTMzE68rpiHFF4yUjFV40Q EhmYJjqO94wzqFeUTabvwm0/VFcvU/wmTJNXLD4tBSCLdeKF+PZ01xDReu5yYY1SN2HY hIXQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=VSnnJ4oF; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [23.128.96.19]) by mx.google.com with ESMTPS id n20-20020a17090ade9400b001cba3fda35fsi5095633pjv.85.2022.04.12.14.35.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Apr 2022 14:35:12 -0700 (PDT) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=VSnnJ4oF; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (out1.vger.email [IPv6:2620:137:e000::1:20]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id F1203119877; Tue, 12 Apr 2022 13:41:28 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236374AbiDLLAa (ORCPT + 99 others); Tue, 12 Apr 2022 07:00:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45668 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377325AbiDLK4h (ORCPT ); Tue, 12 Apr 2022 06:56:37 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9154D8FE58; Tue, 12 Apr 2022 02:50:32 -0700 (PDT) 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 D0164618A8; Tue, 12 Apr 2022 09:50:31 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E2C5DC385B0; Tue, 12 Apr 2022 09:50:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1649757031; bh=VmyOGDFwXHb+w1t6LNTfW65lcqPUottzbY1nKtknM4A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VSnnJ4oFqa3jHeP0M5nJU4nexVvb9AVT95HXFNGPdLEU3iWPK/+fDAgjmJBYqQrfj GsSbb2BxPOLMEKeVy0BBSBxULv9uRFKomJDrG9VWzh3QsQ79qubIqJcsgCNB4yXDZP k86wmWeRJNKV4qs9YDwgW7SG8C9FquJolp8h4xmcvS6wFxt8gUlNXas/wtay8iNjjO ewAxL0A6geCdGYBg7aZ+oZFGdwYBO5XdEyQCEter9hjFMYVfwEJBN1mrUmDq6se7Pq bhGr3MRMqVq21Ofh6bxSCwrmRZWO/xEHo/IiETu+tCaP3igvypqdDnI3jmnGObzoQV uG94SyYY36nQA== Received: by pali.im (Postfix) id B04B02AB8; Tue, 12 Apr 2022 11:50:28 +0200 (CEST) From: =?UTF-8?q?Pali=20Roh=C3=A1r?= To: Lorenzo Pieralisi , Bjorn Helgaas , Rob Herring , Andrew Lunn , Thomas Petazzoni , =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , =?UTF-8?q?Marek=20Beh=C3=BAn?= , Russell King Cc: linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 3/4] PCI: Add function for parsing 'slot-power-limit-milliwatt' DT property Date: Tue, 12 Apr 2022 11:49:45 +0200 Message-Id: <20220412094946.27069-4-pali@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20220412094946.27069-1-pali@kernel.org> References: <20220412094946.27069-1-pali@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,MAILING_LIST_MULTI, RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add function of_pci_get_slot_power_limit(), which parses the 'slot-power-limit-milliwatt' DT property, returning the value in milliwatts and in format ready for the PCIe Slot Capabilities Register. Signed-off-by: Pali Rohár Signed-off-by: Marek Behún Reviewed-by: Rob Herring --- Changes in v4: * Set 239 W when DT slot-power-limit-milliwatt is between 239 W and 250 W * Fix returning power limit value Changes in v3: * Set 600 W when DT slot-power-limit-milliwatt > 600 W Changes in v2: * Added support for PCIe 6.0 slot power limit encodings * Round down slot power limit value --- drivers/pci/of.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++ drivers/pci/pci.h | 15 ++++++++++ 2 files changed, 85 insertions(+) diff --git a/drivers/pci/of.c b/drivers/pci/of.c index cb2e8351c2cc..6c1b81304665 100644 --- a/drivers/pci/of.c +++ b/drivers/pci/of.c @@ -633,3 +633,73 @@ int of_pci_get_max_link_speed(struct device_node *node) return max_link_speed; } EXPORT_SYMBOL_GPL(of_pci_get_max_link_speed); + +/** + * of_pci_get_slot_power_limit - Parses the "slot-power-limit-milliwatt" + * property. + * + * @node: device tree node with the slot power limit information + * @slot_power_limit_value: pointer where the value should be stored in PCIe + * Slot Capabilities Register format + * @slot_power_limit_scale: pointer where the scale should be stored in PCIe + * Slot Capabilities Register format + * + * Returns the slot power limit in milliwatts and if @slot_power_limit_value + * and @slot_power_limit_scale pointers are non-NULL, fills in the value and + * scale in format used by PCIe Slot Capabilities Register. + * + * If the property is not found or is invalid, returns 0. + */ +u32 of_pci_get_slot_power_limit(struct device_node *node, + u8 *slot_power_limit_value, + u8 *slot_power_limit_scale) +{ + u32 slot_power_limit_mw; + u8 value, scale; + + if (of_property_read_u32(node, "slot-power-limit-milliwatt", + &slot_power_limit_mw)) + slot_power_limit_mw = 0; + + /* Calculate Slot Power Limit Value and Slot Power Limit Scale */ + if (slot_power_limit_mw == 0) { + value = 0x00; + scale = 0; + } else if (slot_power_limit_mw <= 255) { + value = slot_power_limit_mw; + scale = 3; + } else if (slot_power_limit_mw <= 255*10) { + value = slot_power_limit_mw / 10; + scale = 2; + slot_power_limit_mw = slot_power_limit_mw / 10 * 10; + } else if (slot_power_limit_mw <= 255*100) { + value = slot_power_limit_mw / 100; + scale = 1; + slot_power_limit_mw = slot_power_limit_mw / 100 * 100; + } else if (slot_power_limit_mw <= 239*1000) { + value = slot_power_limit_mw / 1000; + scale = 0; + slot_power_limit_mw = slot_power_limit_mw / 1000 * 1000; + } else if (slot_power_limit_mw < 250*1000) { + value = 0xEF; + scale = 0; + slot_power_limit_mw = 239*1000; + } else if (slot_power_limit_mw <= 600*1000) { + value = 0xF0 + (slot_power_limit_mw / 1000 - 250) / 25; + scale = 0; + slot_power_limit_mw = slot_power_limit_mw / (1000*25) * (1000*25); + } else { + value = 0xFE; + scale = 0; + slot_power_limit_mw = 600*1000; + } + + if (slot_power_limit_value) + *slot_power_limit_value = value; + + if (slot_power_limit_scale) + *slot_power_limit_scale = scale; + + return slot_power_limit_mw; +} +EXPORT_SYMBOL_GPL(of_pci_get_slot_power_limit); diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 3d60cabde1a1..e10cdec6c56e 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -627,6 +627,9 @@ struct device_node; int of_pci_parse_bus_range(struct device_node *node, struct resource *res); int of_get_pci_domain_nr(struct device_node *node); int of_pci_get_max_link_speed(struct device_node *node); +u32 of_pci_get_slot_power_limit(struct device_node *node, + u8 *slot_power_limit_value, + u8 *slot_power_limit_scale); void pci_set_of_node(struct pci_dev *dev); void pci_release_of_node(struct pci_dev *dev); void pci_set_bus_of_node(struct pci_bus *bus); @@ -653,6 +656,18 @@ of_pci_get_max_link_speed(struct device_node *node) return -EINVAL; } +static inline u32 +of_pci_get_slot_power_limit(struct device_node *node, + u8 *slot_power_limit_value, + u8 *slot_power_limit_scale) +{ + if (slot_power_limit_value) + *slot_power_limit_value = 0; + if (slot_power_limit_scale) + *slot_power_limit_scale = 0; + return 0; +} + static inline void pci_set_of_node(struct pci_dev *dev) { } static inline void pci_release_of_node(struct pci_dev *dev) { } static inline void pci_set_bus_of_node(struct pci_bus *bus) { } -- 2.20.1