]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
firmware: arm_scmi: quirk: Fix CLOCK_DESCRIBE_RATES triplet
authorCristian Marussi <cristian.marussi@arm.com>
Tue, 29 Apr 2025 14:11:08 +0000 (15:11 +0100)
committerSudeep Holla <sudeep.holla@arm.com>
Tue, 6 May 2025 10:12:30 +0000 (11:12 +0100)
Convert an existing quirk in CLOCK_DESCRIBE_RATES parsing to the new quirk
framework. This is a sort of a peculiar quirk since it matches any platform
and any firmware.

Signed-off-by: Cristian Marussi <cristian.marussi@arm.com>
Message-Id: <20250429141108.406045-4-cristian.marussi@arm.com>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
drivers/firmware/arm_scmi/clock.c
drivers/firmware/arm_scmi/quirks.c
drivers/firmware/arm_scmi/quirks.h

index 2ed2279388f02eff63c9ef977571eb048d42ad81..afa7981efe82dc57a9b851da03253f453ed06593 100644 (file)
@@ -11,6 +11,7 @@
 
 #include "protocols.h"
 #include "notify.h"
+#include "quirks.h"
 
 /* Updated only after ALL the mandatory features for that version are merged */
 #define SCMI_PROTOCOL_SUPPORTED_VERSION                0x30000
@@ -429,6 +430,23 @@ static void iter_clk_describe_prepare_message(void *message,
        msg->rate_index = cpu_to_le32(desc_index);
 }
 
+#define QUIRK_OUT_OF_SPEC_TRIPLET                                             \
+       ({                                                                     \
+               /*                                                             \
+                * A known quirk: a triplet is returned but num_returned != 3  \
+                * Check for a safe payload size and fix.                      \
+                */                                                            \
+               if (st->num_returned != 3 && st->num_remaining == 0 &&         \
+                   st->rx_len == sizeof(*r) + sizeof(__le32) * 2 * 3) {       \
+                       st->num_returned = 3;                                  \
+                       st->num_remaining = 0;                                 \
+               } else {                                                       \
+                       dev_err(p->dev,                                        \
+                               "Cannot fix out-of-spec reply !\n");           \
+                       return -EPROTO;                                        \
+               }                                                              \
+       })
+
 static int
 iter_clk_describe_update_state(struct scmi_iterator_state *st,
                               const void *response, void *priv)
@@ -450,19 +468,8 @@ iter_clk_describe_update_state(struct scmi_iterator_state *st,
                         p->clk->name, st->num_returned, st->num_remaining,
                         st->rx_len);
 
-               /*
-                * A known quirk: a triplet is returned but num_returned != 3
-                * Check for a safe payload size and fix.
-                */
-               if (st->num_returned != 3 && st->num_remaining == 0 &&
-                   st->rx_len == sizeof(*r) + sizeof(__le32) * 2 * 3) {
-                       st->num_returned = 3;
-                       st->num_remaining = 0;
-               } else {
-                       dev_err(p->dev,
-                               "Cannot fix out-of-spec reply !\n");
-                       return -EPROTO;
-               }
+               SCMI_QUIRK(clock_rates_triplet_out_of_spec,
+                          QUIRK_OUT_OF_SPEC_TRIPLET);
        }
 
        return 0;
index d6e58754a28da5ba93ad53ca6517f528cab5503f..a425cd8ea9844bfbd3f346a4993b949a542dc95f 100644 (file)
@@ -169,6 +169,7 @@ struct scmi_quirk {
        __DEFINE_SCMI_QUIRK_ENTRY(_qn, _ven, _sub, _impl, ##__VA_ARGS__)
 
 /* Global Quirks Definitions */
+DEFINE_SCMI_QUIRK(clock_rates_triplet_out_of_spec, NULL, NULL, NULL);
 
 /*
  * Quirks Pointers Array
@@ -177,6 +178,7 @@ struct scmi_quirk {
  * defined quirks descriptors.
  */
 static struct scmi_quirk *scmi_quirks_table[] = {
+       __DECLARE_SCMI_QUIRK_ENTRY(clock_rates_triplet_out_of_spec),
        NULL
 };
 
index 28829b4f0646f112660ab4df9eb1973d57574a53..7fdc496c94c7c370d155643918ff93f5e2bcb649 100644 (file)
@@ -45,4 +45,7 @@ static inline void scmi_quirks_enable(struct device *dev, const char *vend,
 
 #endif /* CONFIG_ARM_SCMI_QUIRKS */
 
+/* Quirk delarations */
+DECLARE_SCMI_QUIRK(clock_rates_triplet_out_of_spec);
+
 #endif /* _SCMI_QUIRKS_H */