@@ -1904,6 +1904,13 @@ struct scmi_msg_resp_desc_fc {
__le32 db_preserve_hmask;
};
+#define QUIRK_PERF_FC_FORCE \
+ ({ \
+ if (pi->proto->id == SCMI_PROTOCOL_PERF || \
+ message_id == 0x5 /* PERF_LEVEL_GET */) \
+ attributes |= BIT(0); \
+ })
+
static void
scmi_common_fastchannel_init(const struct scmi_protocol_handle *ph,
u8 describe_id, u32 message_id, u32 valid_size,
@@ -1924,6 +1931,7 @@ scmi_common_fastchannel_init(const struct scmi_protocol_handle *ph,
/* Check if the MSG_ID supports fastchannel */
ret = scmi_protocol_msg_check(ph, message_id, &attributes);
+ SCMI_QUIRK(perf_level_get_fc_force, QUIRK_PERF_FC_FORCE);
if (ret || !MSG_SUPPORTS_FASTCHANNEL(attributes)) {
dev_dbg(ph->dev,
"Skip FC init for 0x%02X/%d domain:%d - ret:%d\n",
@@ -70,6 +70,8 @@ struct scmi_quirk {
__DEFINE_SCMI_QUIRK_ENTRY(_qn, _comp, _ven, _sub, _impl)
/* Global Quirks Definitions */
+DEFINE_SCMI_QUIRK(perf_level_get_fc_force,
+ "your-bad-compatible", NULL, NULL, 0x0);
/*
* Quirks Pointers Array
@@ -78,6 +80,7 @@ struct scmi_quirk {
* defined quirks descriptors.
*/
static struct scmi_quirk *scmi_quirks_table[] = {
+ __DECLARE_SCMI_QUIRK_ENTRY(perf_level_get_fc_force),
NULL
};
@@ -37,4 +37,7 @@ static inline void scmi_quirks_enable(struct device *dev, const char *compat,
#endif /* CONFIG_ARM_SCMI_QUIRKS */
+/* Quirk delarations */
+DECLARE_SCMI_QUIRK(perf_level_get_fc_force);
+
#endif /* _SCMI_QUIRKS_H */
Some platform misreported the support of FastChannel when queried: ignore that bit on selected platforms. Signed-off-by: Cristian Marussi <cristian.marussi@arm.com> --- Match features has to be set-up properly before upstreaming this. Ideally the out-of-spec firmware should be matched with a quirk matching pattern based on Vendor/SubVendor/ImplVersion....but it is NOT clear if the platform at hand will ship with future fixed firmwares where the ImplVersion field is properly handled. If we cannot be sure about that, we should fallback to a compatible match. --- drivers/firmware/arm_scmi/driver.c | 8 ++++++++ drivers/firmware/arm_scmi/quirks.c | 3 +++ drivers/firmware/arm_scmi/quirks.h | 3 +++ 3 files changed, 14 insertions(+)