@@ -1981,6 +1981,7 @@ int qcom_scm_qseecom_app_send(u32 app_id, void *req, size_t req_size,
}
EXPORT_SYMBOL_GPL(qcom_scm_qseecom_app_send);
+static unsigned long qcom_qseecom_disable = QCOM_QSEECOM_QUIRK_DISABLE;
static unsigned long qcom_qseecom_ro_uefi = QCOM_QSEECOM_QUIRK_RO_UEFIVARS;
static char *qseecom = "auto";
@@ -1989,32 +1990,20 @@ module_param(qseecom, charp, 0);
/*
* We do not yet support re-entrant calls via the qseecom interface. To prevent
- * any potential issues with this, only allow validated machines for now. Users
+ * any potential issues with this, only allow validated platforms for now. Users
* still can manually enable or disable it via the qcom_scm.qseecom modparam.
+ *
+ * To disable QSEECOM for a particular machine, add compatible entry and set
+ * data to &qcom_qseecom_disable.
*/
static const struct of_device_id qcom_scm_qseecom_allowlist[] __maybe_unused = {
- { .compatible = "asus,vivobook-s15" },
- { .compatible = "asus,zenbook-a14-ux3407qa" },
- { .compatible = "asus,zenbook-a14-ux3407ra" },
- { .compatible = "dell,xps13-9345" },
- { .compatible = "hp,elitebook-ultra-g1q" },
- { .compatible = "hp,omnibook-x14" },
- { .compatible = "huawei,gaokun3" },
- { .compatible = "lenovo,flex-5g" },
- { .compatible = "lenovo,thinkpad-t14s" },
- { .compatible = "lenovo,thinkpad-x13s", },
{ .compatible = "lenovo,yoga-c630", .data = &qcom_qseecom_ro_uefi, },
- { .compatible = "lenovo,yoga-slim7x" },
- { .compatible = "microsoft,arcata", },
- { .compatible = "microsoft,blackrock" },
- { .compatible = "microsoft,romulus13", },
- { .compatible = "microsoft,romulus15", },
- { .compatible = "qcom,sc8180x-primus" },
+ { .compatible = "qcom,sc8180x", },
+ { .compatible = "qcom,sc8280xp", },
{ .compatible = "qcom,sc8280xp-crd", .data = &qcom_qseecom_ro_uefi, },
- { .compatible = "qcom,x1e001de-devkit" },
- { .compatible = "qcom,x1e80100-crd" },
- { .compatible = "qcom,x1e80100-qcp" },
- { .compatible = "qcom,x1p42100-crd" },
+ { .compatible = "qcom,sdm845", .data = &qcom_qseecom_disable, },
+ { .compatible = "qcom,x1e80100", },
+ { .compatible = "qcom,x1p42100", },
{ }
};
@@ -2046,12 +2035,22 @@ static bool qcom_scm_qseecom_machine_is_allowed(struct device *scm_dev,
match = of_match_node(qcom_scm_qseecom_allowlist, np);
of_node_put(np);
- if (match && match->data)
+ if (!match) {
+ dev_info(scm_dev, "qseecom: untested machine, skipping\n");
+ return false;
+ }
+
+ if (match->data)
*quirks = *(unsigned long *)(match->data);
else
*quirks = 0;
- return match;
+ if (*quirks & QCOM_QSEECOM_QUIRK_DISABLE) {
+ dev_info(scm_dev, "qseecom: disabled by the quirk\n");
+ return false;
+ }
+
+ return true;
}
static void qcom_scm_qseecom_free(void *data)
@@ -2086,10 +2085,8 @@ static int qcom_scm_qseecom_init(struct qcom_scm *scm)
dev_info(scm->dev, "qseecom: found qseecom with version 0x%x\n", version);
- if (!qcom_scm_qseecom_machine_is_allowed(scm->dev, &quirks)) {
- dev_info(scm->dev, "qseecom: untested machine, skipping\n");
+ if (!qcom_scm_qseecom_machine_is_allowed(scm->dev, &quirks))
return 0;
- }
/*
* Set up QSEECOM interface device. All application clients will be
@@ -52,5 +52,6 @@ static inline int qcom_qseecom_app_send(struct qseecom_client *client,
}
#define QCOM_QSEECOM_QUIRK_RO_UEFIVARS BIT(0)
+#define QCOM_QSEECOM_QUIRK_DISABLE BIT(1)
#endif /* __QCOM_QSEECOM_H */