@@ -1983,9 +1983,14 @@ EXPORT_SYMBOL_GPL(qcom_scm_qseecom_app_send);
static unsigned long qcom_qseecom_ro_uefi = QCOM_QSEECOM_QUIRK_RO_UEFIVARS;
+static char *qseecom = "auto";
+MODULE_PARM_DESC(qseecom, "Enable QSEECOM interface (force | roefivars | off | auto)");
+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.
+ * any potential issues with this, only allow validated machines for now. Users
+ * still can manually enable or disable it via the qcom_scm.qseecom modparam.
*/
static const struct of_device_id qcom_scm_qseecom_allowlist[] __maybe_unused = {
{ .compatible = "asus,vivobook-s15" },
@@ -2013,11 +2018,27 @@ static const struct of_device_id qcom_scm_qseecom_allowlist[] __maybe_unused = {
{ }
};
-static bool qcom_scm_qseecom_machine_is_allowed(unsigned long *quirks)
+static bool qcom_scm_qseecom_machine_is_allowed(struct device *scm_dev,
+ unsigned long *quirks)
{
const struct of_device_id *match;
struct device_node *np;
+ if (!strcmp(qseecom, "off")) {
+ dev_info(scm_dev, "qseecom: disabled by modparam\n");
+ return false;
+ } else if (!strcmp(qseecom, "force")) {
+ dev_info(scm_dev, "qseecom: forcibly enabled\n");
+ *quirks = 0;
+ return true;
+ } else if (!strcmp(qseecom, "roefivars")) {
+ dev_info(scm_dev, "qseecom: enabling with R/O UEFI variables\n");
+ *quirks = QCOM_QSEECOM_QUIRK_RO_UEFIVARS;
+ return true;
+ } else if (strcmp(qseecom, "auto")) {
+ dev_warn(scm_dev, "qseecom: invalid value for the modparam, ignoring\n");
+ }
+
np = of_find_node_by_path("/");
if (!np)
return false;
@@ -2065,7 +2086,7 @@ 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(&quirks)) {
+ if (!qcom_scm_qseecom_machine_is_allowed(scm->dev, &quirks)) {
dev_info(scm->dev, "qseecom: untested machine, skipping\n");
return 0;
}