get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/1.0/patches/2175684/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2175684,
    "url": "http://patchwork.ozlabs.org/api/1.0/patches/2175684/?format=api",
    "project": {
        "id": 3,
        "url": "http://patchwork.ozlabs.org/api/1.0/projects/3/?format=api",
        "name": "Linux MTD development",
        "link_name": "linux-mtd",
        "list_id": "linux-mtd.lists.infradead.org",
        "list_email": "linux-mtd@lists.infradead.org",
        "web_url": null,
        "scm_url": null,
        "webscm_url": null
    },
    "msgid": "<155C9F219E5A9219+20251218180205.930961-2-bigfoot@radxa.com>",
    "date": "2025-12-18T18:02:04",
    "name": "[1/2] firmware: qcom: scm: Add SCM storage interface support",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "c80ec7a2f06221affb30592eed06963e6015e549",
    "submitter": {
        "id": 92293,
        "url": "http://patchwork.ozlabs.org/api/1.0/people/92293/?format=api",
        "name": "Junhao Xie",
        "email": "bigfoot@radxa.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/linux-mtd/patch/155C9F219E5A9219+20251218180205.930961-2-bigfoot@radxa.com/mbox/",
    "series": [
        {
            "id": 485894,
            "url": "http://patchwork.ozlabs.org/api/1.0/series/485894/?format=api",
            "date": "2025-12-18T18:02:03",
            "name": "mtd: devices: Qualcomm SCM storage support",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/485894/mbox/"
        }
    ],
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2175684/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "\n <linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n secure) header.d=lists.infradead.org header.i=@lists.infradead.org\n header.a=rsa-sha256 header.s=bombadil.20210309 header.b=vwKdKcfg;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=none (no SPF record) smtp.mailfrom=lists.infradead.org\n (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org;\n envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org;\n receiver=patchwork.ozlabs.org)"
        ],
        "Received": [
            "from bombadil.infradead.org (bombadil.infradead.org\n [IPv6:2607:7c80:54:3::133])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4dXJTQ17WSz1y3k\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 19 Dec 2025 05:04:23 +1100 (AEDT)",
            "from localhost ([::1] helo=bombadil.infradead.org)\n\tby bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1vWIM7-00000008yFX-1j4W;\n\tThu, 18 Dec 2025 18:04:03 +0000",
            "from smtpbgeu1.qq.com ([52.59.177.22])\n\tby bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1vWIM0-00000008yDQ-3byz\n\tfor linux-mtd@lists.infradead.org;\n\tThu, 18 Dec 2025 18:04:01 +0000",
            "from bigfoot-server-arm-node1.classf ( [183.250.239.212])\n\tby bizesmtp.qq.com (ESMTP) with\n\tid ; Fri, 19 Dec 2025 02:02:35 +0800 (CST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;\n\td=lists.infradead.org; s=bombadil.20210309; h=Sender:\n\tContent-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post:\n\tList-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:\n\tMessage-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description:\n\tResent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:\n\tList-Owner; bh=A4cbPezQIgdqvxNfec+VfkyKNkx5AtEc4VFkHWX8bNk=; b=vwKdKcfg4HWW1u\n\tPlSdkPaGLxw9xmuUt5B0cwqClyKncw0u+paMpqheEBHr0drzXWHs0TmYaaYg809zLblEZFz3NyMu2\n\ti4Qmo8kaB0diRa7UiU1ARhVAzA0lJDX+0gfJkQCd00AGWLN1suT4K8DcVM6PN1HqvvRojJguM7JX9\n\tEb+9h852RP5JbjgUPErrMXjRWlMNxBR7kvATC3CIaWzHCe9VhudykAPM3K8lqQK9FW33je0kH/FB5\n\tXIBmH7EGUeRARkH+6zaLTVVqi7kw5qF88swBywZ1sFHbEncPy4OFp6g85eLTolCgIU6GUPHqnOgLP\n\tPDdZ8kRNR/mAzKn+uzzQ==;",
        "X-QQ-mid": "esmtpgz12t1766080957t6cdf7b4c",
        "X-QQ-Originating-IP": "1O3gaj4ACK8WXXkB2Iw1cUX0B1+/aacB837MLA5+Y80=",
        "X-QQ-SSF": "0000000000000000000000000000000",
        "X-QQ-GoodBg": "0",
        "X-BIZMAIL-ID": "8351619728533894091",
        "EX-QQ-RecipientCnt": "16",
        "From": "Junhao Xie <bigfoot@radxa.com>",
        "To": "Bjorn Andersson <andersson@kernel.org>,\n\tKonrad Dybcio <konradybcio@kernel.org>",
        "Cc": "Junhao Xie <bigfoot@radxa.com>,\n\tXilin Wu <sophon@radxa.com>,\n\tMiquel Raynal <miquel.raynal@bootlin.com>,\n\tRichard Weinberger <richard@nod.at>,\n\tVignesh Raghavendra <vigneshr@ti.com>,\n\tRodrigo Vivi <rodrigo.vivi@intel.com>,\n\tTomas Winkler <tomasw@gmail.com>,\n\tRaag Jadav <raag.jadav@intel.com>,\n\tKrzysztof Kozlowski <krzk@kernel.org>,\n\tGeert Uytterhoeven <geert+renesas@glider.be>,\n\tAlexander Usyskin <alexander.usyskin@intel.com>,\n\tlinux-kernel@vger.kernel.org,\n\tlinux-arm-msm@vger.kernel.org,\n\tlinux-mtd@lists.infradead.org",
        "Subject": "[PATCH 1/2] firmware: qcom: scm: Add SCM storage interface support",
        "Date": "Fri, 19 Dec 2025 02:02:04 +0800",
        "Message-ID": "<155C9F219E5A9219+20251218180205.930961-2-bigfoot@radxa.com>",
        "X-Mailer": "git-send-email 2.51.2",
        "In-Reply-To": "<20251218180205.930961-1-bigfoot@radxa.com>",
        "References": "<20251218180205.930961-1-bigfoot@radxa.com>",
        "MIME-Version": "1.0",
        "X-QQ-SENDSIZE": "520",
        "Feedback-ID": "esmtpgz:radxa.com:qybglogicsvrsz:qybglogicsvrsz4b-0",
        "X-QQ-XMAILINFO": "Odky5wNUcHo/kOzkVQRNW20E7NDyuZtl8jOE5lEMB+QzAJFE6wPm44IT\n\th9aHIQEyjYZdg2G57UOoeYt4erzJaxtms5uXeqoJ5ViCZanScGENJD4eR9hUbwxZE/hESwY\n\tkxv1OoJj5L0eMG7KnFwwRLKbaRzCJAsKRPvtCKFbr4Q+ZPHgbCvLchsi+Nmj3xiyhtEeV3t\n\tWRz4uaY1zHExooYdi+xBmi0J85ewrOajmhPUVU3fIV0RinK+ZjfWsXGntdaXhef2pt2lJ8k\n\tPP+zja1nNF8YVxsrbbcb1UHi3s0zahYgbP0J5kqxjVx401PTkHjqr4E4CUmC3mXkDP65VIq\n\tljQKNJGbDQ/Gz4RZQTH2XHf5et8OfD4s96jYm7F0azkBq5DeZwAp0TBEJZIwXEukOYRbQM9\n\tK+36zg+qub8oLJtAiPi76Ait9h+236dkZHPK9D+klvrw5rR8DnOfEnwMgdJBDfFnt40YxIs\n\tPN0TKs47mlVJPt64eq7dC93ZCP2cncD3wQ2Mr9iN3+x7KPNa/42OkGMem5l971vC3+jtqxl\n\tqM1l5i9ul2q3P0KCJtho8ewNPmnxkgn4eM4U8am3KQhQ4xxDYONvi+lh3p4UQVApwtquPCP\n\tm8cR7HUHgjdA9HG5Xd2Tqry89ili/VYO38UdEyXIzmBbWirMmBX3eYO9DmKabQf0scVd60M\n\tl/kotFmw0bB/86s9tbf/PJ62zdnTxSiDzKVl+72s/GD4F0NUh8ppCcOa/vnHiIQrNJOAJol\n\tEhoebyAYvG7Zlx8ewX5yVOXT/kR2IGZGsGQ28Vkr+UG5K1dxpbec+xgMVfZ9ca+mT6txq8G\n\t4EUQNJnzUQQ5IV7def2/0u0WcspIFhTCpNbwr0Rx+ZsmEDtK/sfLfOGB8EvDYUNLbtuuf+W\n\t63nGkmZz8brmCkNKgYTfuuFD88WN7LeeENs2fkpcxxCDTr1/ng75sUocZETID3IXl9WtQ4V\n\tcO5BlbZMZJOxcCNUw5DNSoydfD/KuZKbZleVqcPm+hLlkGt40LEt6X+x/wIktasnzj+E=",
        "X-QQ-XMRINFO": "NI4Ajvh11aEj8Xl/2s1/T8w=",
        "X-QQ-RECHKSPAM": "0",
        "X-CRM114-Version": "20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 ",
        "X-CRM114-CacheID": "sfid-20251218_100357_360234_B1F7EEDD ",
        "X-CRM114-Status": "GOOD (  18.13  )",
        "X-Spam-Score": "-1.9 (-)",
        "X-Spam-Report": "Spam detection software,\n running on the system \"bombadil.infradead.org\",\n has NOT identified this incoming email as spam.  The original\n message has been attached to this so you can view it or label\n similar future email.  If you have any questions, see\n the administrator of that system for details.\n Content preview:  Add infrastructure to support accessing TrustZone-protected\n    storage devices through SCM (Secure Channel Manager) calls. Some Qualcomm\n    platforms protect their firmware storage (typically SPI NOR flash) [...]\n Content analysis details:   (-1.9 points, 5.0 required)\n  pts rule name              description\n ---- ----------------------\n --------------------------------------------------\n -0.0 RCVD_IN_DNSWL_NONE     RBL: Sender listed at https://www.dnswl.org/, no\n                             trust\n                             [52.59.177.22 listed in list.dnswl.org]\n  0.0 RCVD_IN_VALIDITY_CERTIFIED_BLOCKED RBL: ADMINISTRATOR NOTICE: The\n                             query to Validity was blocked.  See\n                             https://knowledge.validity.com/hc/en-us/articles/20961730681243\n                              for more information.\n                           [52.59.177.22 listed in\n sa-trusted.bondedsender.org]\n  0.0 RCVD_IN_VALIDITY_SAFE_BLOCKED RBL: ADMINISTRATOR NOTICE: The query to\n                              Validity was blocked.  See\n                             https://knowledge.validity.com/hc/en-us/articles/20961730681243\n                              for more information.\n                             [52.59.177.22 listed in sa-accredit.habeas.com]\n -0.0 SPF_PASS               SPF: sender matches SPF record\n  0.0 RCVD_IN_MSPIKE_H3      RBL: Good reputation (+3)\n                             [52.59.177.22 listed in wl.mailspike.net]\n  0.0 RCVD_IN_VALIDITY_RPBL_BLOCKED RBL: ADMINISTRATOR NOTICE: The query to\n                              Validity was blocked.  See\n                             https://knowledge.validity.com/hc/en-us/articles/20961730681243\n                              for more information.\n                             [52.59.177.22 listed in bl.score.senderscore.com]\n  0.0 T_SPF_HELO_TEMPERROR   SPF: test of HELO record failed (temperror)\n  0.0 RCVD_IN_MSPIKE_WL      Mailspike good senders\n -1.9 BAYES_00               BODY: Bayes spam probability is 0 to 1%\n                             [score: 0.0000]",
        "X-BeenThere": "linux-mtd@lists.infradead.org",
        "X-Mailman-Version": "2.1.34",
        "Precedence": "list",
        "List-Id": "Linux MTD discussion mailing list <linux-mtd.lists.infradead.org>",
        "List-Unsubscribe": "<http://lists.infradead.org/mailman/options/linux-mtd>,\n <mailto:linux-mtd-request@lists.infradead.org?subject=unsubscribe>",
        "List-Archive": "<http://lists.infradead.org/pipermail/linux-mtd/>",
        "List-Post": "<mailto:linux-mtd@lists.infradead.org>",
        "List-Help": "<mailto:linux-mtd-request@lists.infradead.org?subject=help>",
        "List-Subscribe": "<http://lists.infradead.org/mailman/listinfo/linux-mtd>,\n <mailto:linux-mtd-request@lists.infradead.org?subject=subscribe>",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Sender": "\"linux-mtd\" <linux-mtd-bounces@lists.infradead.org>",
        "Errors-To": "linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org"
    },
    "content": "Add infrastructure to support accessing TrustZone-protected storage\ndevices through SCM (Secure Channel Manager) calls. Some Qualcomm\nplatforms protect their firmware storage (typically SPI NOR flash)\nvia TrustZone, making it inaccessible from the non-secure world.\n\nCurrently allowlisted for Radxa Dragon Q6A (QCS6490) where it has been\nvalidated. Additional platforms can be added as they are tested.\n\nSigned-off-by: Junhao Xie <bigfoot@radxa.com>\nTested-by: Xilin Wu <sophon@radxa.com>\n---\n drivers/firmware/qcom/qcom_scm.c       | 183 +++++++++++++++++++++++++\n drivers/firmware/qcom/qcom_scm.h       |   3 +\n include/linux/firmware/qcom/qcom_scm.h |  47 +++++++\n 3 files changed, 233 insertions(+)",
    "diff": "diff --git a/drivers/firmware/qcom/qcom_scm.c b/drivers/firmware/qcom/qcom_scm.c\nindex 731074ca1ebbe..b117e1b58e363 100644\n--- a/drivers/firmware/qcom/qcom_scm.c\n+++ b/drivers/firmware/qcom/qcom_scm.c\n@@ -66,6 +66,21 @@ struct qcom_scm_mem_map_info {\n \t__le64 mem_size;\n };\n \n+struct qcom_scm_storage_cmd {\n+\t__le64 storage_type;\n+\t__le64 slot_num;\n+\t__le64 lun;\n+\t__le64 guid_ptr;\n+\t__le64 storage_cmd;\n+};\n+\n+struct qcom_scm_storage_cmd_details {\n+\t__le64 lba;\n+\t__le64 length;\n+\t__le64 data_ptr;\n+\t__le64 data_size;\n+};\n+\n /**\n  * struct qcom_scm_qseecom_resp - QSEECOM SCM call response.\n  * @result:    Result or status of the SCM call. See &enum qcom_scm_qseecom_result.\n@@ -111,6 +126,15 @@ enum qcom_scm_qseecom_tz_cmd_info {\n \tQSEECOM_TZ_CMD_INFO_VERSION\t\t= 3,\n };\n \n+enum qcom_scm_storage_result {\n+\tSTORAGE_RESULT_SUCCESS\t\t\t= 0,\n+\tSTORAGE_RESULT_NO_MEMORY\t\t= 1,\n+\tSTORAGE_RESULT_INVALID_PARAMETER\t= 2,\n+\tSTORAGE_RESULT_STORAGE_ERROR\t\t= 3,\n+\tSTORAGE_RESULT_ACCESS_DENIED\t\t= 4,\n+\tSTORAGE_RESULT_NOT_SUPPORTED\t\t= 5,\n+};\n+\n #define QSEECOM_MAX_APP_NAME_SIZE\t\t64\n #define SHMBRIDGE_RESULT_NOTSUPP\t\t4\n \n@@ -2214,6 +2238,159 @@ static void qcom_scm_qtee_init(struct qcom_scm *scm)\n \tdevm_add_action_or_reset(scm->dev, qcom_scm_qtee_free, qtee_dev);\n }\n \n+#if IS_ENABLED(CONFIG_MTD_QCOM_SCM_STORAGE)\n+\n+int qcom_scm_storage_send_cmd(enum qcom_scm_storage_type storage_type,\n+\t\t\t      enum qcom_scm_storage_cmd_id cmd_id,\n+\t\t\t      u64 lba, void *payload, size_t size)\n+{\n+\tstruct qcom_scm_res scm_res = {};\n+\tstruct qcom_scm_desc desc = {};\n+\tstruct qcom_scm_storage_cmd *cmd;\n+\tstruct qcom_scm_storage_cmd_details *details;\n+\tsize_t buf_size;\n+\tvoid *payload_buf;\n+\tint ret;\n+\n+\tbuf_size = sizeof(*cmd) + sizeof(*details);\n+\tif (payload)\n+\t\tbuf_size += size;\n+\tvoid *data __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool,\n+\t\t\t\t\t\t\t buf_size,\n+\t\t\t\t\t\t\t GFP_KERNEL);\n+\tif (!data)\n+\t\treturn -ENOMEM;\n+\tmemset(data, 0, buf_size);\n+\tif (payload) {\n+\t\tpayload_buf = data + sizeof(*cmd) + sizeof(*details);\n+\t\tmemcpy(payload_buf, payload, size);\n+\t}\n+\n+\tcmd = data;\n+\tcmd->storage_type = storage_type;\n+\tcmd->storage_cmd = cmd_id;\n+\n+\tdetails = data + sizeof(*cmd);\n+\tdetails->lba = lba;\n+\tif (payload)\n+\t\tdetails->data_ptr = qcom_tzmem_to_phys(payload_buf);\n+\tdetails->length = size;\n+\n+\tdesc.svc = QCOM_SCM_SVC_STORAGE;\n+\tdesc.cmd = QCOM_SCM_STORAGE_CMD;\n+\tdesc.arginfo = QCOM_SCM_ARGS(4, QCOM_SCM_RO, QCOM_SCM_VAL,\n+\t\t\t\t     QCOM_SCM_RW, QCOM_SCM_VAL);\n+\tdesc.args[0] = qcom_tzmem_to_phys(cmd);\n+\tdesc.args[1] = sizeof(*cmd);\n+\tdesc.args[2] = qcom_tzmem_to_phys(details);\n+\tdesc.args[3] = sizeof(*details);\n+\tdesc.owner = ARM_SMCCC_OWNER_SIP;\n+\n+\tret = qcom_scm_call(__scm->dev, &desc, &scm_res);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tif (payload)\n+\t\tmemcpy(payload, payload_buf, size);\n+\n+\tswitch (scm_res.result[0]) {\n+\tcase STORAGE_RESULT_SUCCESS:\n+\t\treturn 0;\n+\tcase STORAGE_RESULT_NO_MEMORY:\n+\t\treturn -ENOMEM;\n+\tcase STORAGE_RESULT_INVALID_PARAMETER:\n+\t\treturn -EINVAL;\n+\tcase STORAGE_RESULT_STORAGE_ERROR:\n+\t\treturn -EIO;\n+\tcase STORAGE_RESULT_ACCESS_DENIED:\n+\t\treturn -EACCES;\n+\tcase STORAGE_RESULT_NOT_SUPPORTED:\n+\t\treturn -EOPNOTSUPP;\n+\tdefault:\n+\t\treturn -EIO;\n+\t}\n+}\n+EXPORT_SYMBOL_GPL(qcom_scm_storage_send_cmd);\n+\n+/*\n+ * Allowlist of platforms known to support and have tested SCM storage interface.\n+ * This is a safety mechanism to prevent exposing potentially dangerous firmware\n+ * access on untested platforms. New platforms should be added here after validation.\n+ */\n+static const struct of_device_id qcom_scm_storage_allowlist[] = {\n+\t{ .compatible = \"radxa,dragon-q6a\" },\n+\t{ }\n+};\n+\n+static bool qcom_scm_storage_machine_is_allowed(void)\n+{\n+\tstruct device_node *np;\n+\tbool match;\n+\n+\tnp = of_find_node_by_path(\"/\");\n+\tif (!np)\n+\t\treturn false;\n+\n+\tmatch = of_match_node(qcom_scm_storage_allowlist, np);\n+\tof_node_put(np);\n+\n+\treturn match;\n+}\n+\n+static void qcom_scm_storage_free(void *data)\n+{\n+\tstruct platform_device *storage_dev = data;\n+\n+\tplatform_device_unregister(storage_dev);\n+}\n+\n+static int qcom_scm_storage_init(struct qcom_scm *scm)\n+{\n+\tstruct qcom_scm_storage_info info;\n+\tstruct platform_device *storage_dev;\n+\tint ret;\n+\n+\tret = qcom_scm_storage_send_cmd(QCOM_SCM_STORAGE_SPINOR,\n+\t\t\t\t\tQCOM_SCM_STORAGE_GET_INFO,\n+\t\t\t\t\t0, &info, sizeof(info));\n+\tif (ret < 0) {\n+\t\tdev_info(scm->dev, \"scm storage not available: %d\\n\", ret);\n+\t\treturn 0;\n+\t}\n+\n+\tif (!qcom_scm_storage_machine_is_allowed()) {\n+\t\tdev_info(scm->dev, \"scm storage untested, skipping\\n\");\n+\t\treturn 0;\n+\t}\n+\n+\tdev_info(scm->dev, \"scm storage size %llu bytes\\n\",\n+\t\t info.total_blocks * info.block_size);\n+\n+\tstorage_dev = platform_device_alloc(\"qcom_scm_storage\", -1);\n+\tif (!storage_dev)\n+\t\treturn -ENOMEM;\n+\n+\tstorage_dev->dev.parent = scm->dev;\n+\n+\tret = platform_device_add(storage_dev);\n+\tif (ret) {\n+\t\tplatform_device_put(storage_dev);\n+\t\treturn ret;\n+\t}\n+\n+\treturn devm_add_action_or_reset(scm->dev, qcom_scm_storage_free,\n+\t\t\t\t\tstorage_dev);\n+}\n+\n+#else /* CONFIG_MTD_QCOM_SCM_STORAGE */\n+\n+static int qcom_scm_storage_init(struct qcom_scm *scm)\n+{\n+\treturn 0;\n+}\n+\n+#endif /* CONFIG_MTD_QCOM_SCM_STORAGE */\n+\n /**\n  * qcom_scm_is_available() - Checks if SCM is available\n  */\n@@ -2449,6 +2626,12 @@ static int qcom_scm_probe(struct platform_device *pdev)\n \t/* Initialize the QTEE object interface. */\n \tqcom_scm_qtee_init(scm);\n \n+\t/*\n+\t * Initialize the SCM storage interface.\n+\t */\n+\tret = qcom_scm_storage_init(scm);\n+\tWARN(ret < 0, \"failed to initialize scm storage: %d\\n\", ret);\n+\n \treturn 0;\n }\n \ndiff --git a/drivers/firmware/qcom/qcom_scm.h b/drivers/firmware/qcom/qcom_scm.h\nindex a56c8212cc0c4..3b68b33c5ccc3 100644\n--- a/drivers/firmware/qcom/qcom_scm.h\n+++ b/drivers/firmware/qcom/qcom_scm.h\n@@ -149,6 +149,9 @@ int qcom_scm_shm_bridge_enable(struct device *scm_dev);\n #define QCOM_SCM_SMMU_CONFIG_ERRATA1\t\t0x03\n #define QCOM_SCM_SMMU_CONFIG_ERRATA1_CLIENT_ALL\t0x02\n \n+#define QCOM_SCM_SVC_STORAGE\t\t\t0x1a\n+#define QCOM_SCM_STORAGE_CMD\t\t\t0x01\n+\n #define QCOM_SCM_SVC_WAITQ\t\t\t0x24\n #define QCOM_SCM_WAITQ_RESUME\t\t\t0x02\n #define QCOM_SCM_WAITQ_GET_WQ_CTX\t\t0x03\ndiff --git a/include/linux/firmware/qcom/qcom_scm.h b/include/linux/firmware/qcom/qcom_scm.h\nindex a55ca771286bf..41f799d8de54f 100644\n--- a/include/linux/firmware/qcom/qcom_scm.h\n+++ b/include/linux/firmware/qcom/qcom_scm.h\n@@ -53,6 +53,36 @@ enum qcom_scm_ice_cipher {\n \tQCOM_SCM_ICE_CIPHER_AES_256_CBC = 4,\n };\n \n+enum qcom_scm_storage_cmd_id {\n+\tQCOM_SCM_STORAGE_INIT      = 0,\n+\tQCOM_SCM_STORAGE_READ      = 1,\n+\tQCOM_SCM_STORAGE_WRITE     = 2,\n+\tQCOM_SCM_STORAGE_ERASE     = 3,\n+\tQCOM_SCM_STORAGE_GET_INFO  = 4,\n+\tQCOM_SCM_STORAGE_DEINIT    = 5,\n+};\n+\n+enum qcom_scm_storage_type {\n+\tQCOM_SCM_STORAGE_NULL    = 0,\n+\tQCOM_SCM_STORAGE_SPINOR  = 1,\n+};\n+\n+#define QCOM_SCM_STORAGE_FW_VER_LEN\t32\n+#define QCOM_SCM_STORAGE_MEM_TYPE_LEN\t5\n+#define QCOM_SCM_STORAGE_PROD_NAME_LEN\t32\n+\n+struct qcom_scm_storage_info {\n+\tu64 total_blocks;\n+\tu32 block_size;\n+\tu32 page_size;\n+\tu32 num_physical;\n+\tu64 manufacturer_id;\n+\tu64 serial_num;\n+\tchar fw_version[QCOM_SCM_STORAGE_FW_VER_LEN];\n+\tchar memory_type[QCOM_SCM_STORAGE_MEM_TYPE_LEN];\n+\tchar product_name[QCOM_SCM_STORAGE_PROD_NAME_LEN];\n+} __packed;\n+\n #define QCOM_SCM_PERM_READ       0x4\n #define QCOM_SCM_PERM_WRITE      0x2\n #define QCOM_SCM_PERM_EXEC       0x1\n@@ -181,4 +211,21 @@ int qcom_scm_qtee_invoke_smc(phys_addr_t inbuf, size_t inbuf_size,\n int qcom_scm_qtee_callback_response(phys_addr_t buf, size_t buf_size,\n \t\t\t\t    u64 *result, u64 *response_type);\n \n+#if IS_ENABLED(CONFIG_MTD_QCOM_SCM_STORAGE)\n+\n+int qcom_scm_storage_send_cmd(enum qcom_scm_storage_type storage_type,\n+\t\t\t      enum qcom_scm_storage_cmd_id cmd_id,\n+\t\t\t      u64 lba, void *payload, size_t size);\n+\n+#else /* CONFIG_MTD_QCOM_SCM_STORAGE */\n+\n+static inline int qcom_scm_storage_send_cmd(enum qcom_scm_storage_type storage_type,\n+\t\t\t\t\t    enum qcom_scm_storage_cmd_id cmd_id,\n+\t\t\t\t\t    u64 lba, void *payload, size_t size)\n+{\n+\treturn -EOPNOTSUPP;\n+}\n+\n+#endif /* CONFIG_MTD_QCOM_SCM_STORAGE */\n+\n #endif\n",
    "prefixes": [
        "1/2"
    ]
}