From: "Marek Behún" <kabel@kernel.org>
To: devicetree@vger.kernel.org, robh+dt@kernel.org,
linux-pci@vger.kernel.org, Bjorn Helgaas <helgaas@kernel.org>
Cc: "Pali Rohár" <pali@kernel.org>, "Marek Behún" <kabel@kernel.org>
Subject: [PATCH dt + pci 2/2] PCI: Add function for parsing `slot-power-limit-milliwatt` DT property
Date: Sun, 31 Oct 2021 16:07:06 +0100 [thread overview]
Message-ID: <20211031150706.27873-2-kabel@kernel.org> (raw)
In-Reply-To: <20211031150706.27873-1-kabel@kernel.org>
From: Pali Rohár <pali@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 <pali@kernel.org>
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/pci/of.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++
drivers/pci/pci.h | 15 +++++++++++
2 files changed, 79 insertions(+)
diff --git a/drivers/pci/of.c b/drivers/pci/of.c
index d84381ce82b5..9c1a38d5dd99 100644
--- a/drivers/pci/of.c
+++ b/drivers/pci/of.c
@@ -627,3 +627,67 @@ 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;
+ u8 value, scale;
+
+ if (of_property_read_u32(node, "slot-power-limit-milliwatt",
+ &slot_power_limit))
+ slot_power_limit = 0;
+
+ /* Calculate Slot Power Limit Value and Slot Power Limit Scale */
+ if (slot_power_limit == 0) {
+ value = 0x00;
+ scale = 0;
+ } else if (slot_power_limit <= 255) {
+ value = slot_power_limit;
+ scale = 3;
+ } else if (slot_power_limit <= 255*10) {
+ value = slot_power_limit / 10;
+ scale = 2;
+ } else if (slot_power_limit <= 255*100) {
+ value = slot_power_limit / 100;
+ scale = 1;
+ } else if (slot_power_limit <= 239*1000) {
+ value = slot_power_limit / 1000;
+ scale = 0;
+ } else if (slot_power_limit <= 250*1000) {
+ value = 0xF0;
+ scale = 0;
+ } else if (slot_power_limit <= 275*1000) {
+ value = 0xF1;
+ scale = 0;
+ } else {
+ value = 0xF2;
+ scale = 0;
+ }
+
+ if (slot_power_limit_value)
+ *slot_power_limit_value = value;
+
+ if (slot_power_limit_scale)
+ *slot_power_limit_scale = scale;
+
+ return slot_power_limit;
+}
+EXPORT_SYMBOL_GPL(of_pci_get_slot_power_limit);
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index 1cce56c2aea0..9352278141be 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -665,6 +665,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);
@@ -691,6 +694,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.32.0
next prev parent reply other threads:[~2021-10-31 15:07 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-31 15:07 [PATCH dt + pci 1/2] dt-bindings: Add 'slot-power-limit-milliwatt' PCIe port property Marek Behún
2021-10-31 15:07 ` Marek Behún [this message]
2022-01-07 18:04 ` [PATCH dt + pci 2/2] PCI: Add function for parsing `slot-power-limit-milliwatt` DT property Marek Behún
2022-01-07 21:17 ` Rob Herring
2022-01-12 22:08 ` Bjorn Helgaas
2022-01-12 22:28 ` Pali Rohár
2022-01-13 0:00 ` Bjorn Helgaas
2021-11-12 15:25 ` [PATCH dt + pci 1/2] dt-bindings: Add 'slot-power-limit-milliwatt' PCIe port property Rob Herring
2021-11-12 15:32 ` Pali Rohár
2021-11-12 16:30 ` Rob Herring
2021-11-12 17:12 ` Pali Rohár
2021-11-12 17:24 ` Marek Behún
2021-11-12 20:56 ` Rob Herring
2021-11-13 11:31 ` Pali Rohár
2021-11-16 21:31 ` Pali Rohár
2022-01-05 14:14 ` Marek Behún
2022-01-05 14:27 ` Rob Herring
2022-01-05 15:14 ` Pali Rohár
2022-01-05 15:26 ` Rob Herring
2022-01-05 15:36 ` Pali Rohár
2022-01-05 17:11 ` Marek Behún
2022-02-18 11:31 ` Pali Rohár
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20211031150706.27873-2-kabel@kernel.org \
--to=kabel@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=helgaas@kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=pali@kernel.org \
--cc=robh+dt@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).