crypto: ccp - Add support for extended PSP mailbox commands
authorMario Limonciello <mario.limonciello@amd.com>
Thu, 7 Sep 2023 18:48:43 +0000 (13:48 -0500)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 15 Sep 2023 10:29:45 +0000 (18:29 +0800)
The PSP mailbox supports a number of extended sub-commands.  These
subcommands are placed in the header of the buffer sent to the mailbox.

Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/ccp/psp-dev.c
drivers/crypto/ccp/psp-dev.h

index 3258c4612e1444cd8ac28aceb61a8d09871cfe3c..f9f3b3404f87bedccd48b8ce5a12c73dd2c7f02f 100644 (file)
@@ -78,6 +78,30 @@ unlock:
        return ret;
 }
 
+int psp_extended_mailbox_cmd(struct psp_device *psp, unsigned int timeout_msecs,
+                            struct psp_ext_request *req)
+{
+       unsigned int reg;
+       int ret;
+
+       print_hex_dump_debug("->psp ", DUMP_PREFIX_OFFSET, 16, 2, req,
+                            req->header.payload_size, false);
+
+       ret = psp_mailbox_command(psp, PSP_CMD_TEE_EXTENDED_CMD, (void *)req,
+                                 timeout_msecs, &reg);
+       if (ret) {
+               return ret;
+       } else if (FIELD_GET(PSP_CMDRESP_STS, reg)) {
+               req->header.status = FIELD_GET(PSP_CMDRESP_STS, reg);
+               return -EIO;
+       }
+
+       print_hex_dump_debug("<-psp ", DUMP_PREFIX_OFFSET, 16, 2, req,
+                            req->header.payload_size, false);
+
+       return 0;
+}
+
 static struct psp_device *psp_alloc_struct(struct sp_device *sp)
 {
        struct device *dev = sp->dev;
index d917657c6085ad25346741eff01537ac49050039..396a80d846c077e0c81f1c37ce2d1c1cf91da3ab 100644 (file)
@@ -78,15 +78,36 @@ struct psp_device *psp_get_master_device(void);
  * enum psp_cmd - PSP mailbox commands
  * @PSP_CMD_TEE_RING_INIT:     Initialize TEE ring buffer
  * @PSP_CMD_TEE_RING_DESTROY:  Destroy TEE ring buffer
+ * @PSP_CMD_TEE_EXTENDED_CMD:  Extended command
  * @PSP_CMD_MAX:               Maximum command id
  */
 enum psp_cmd {
        PSP_CMD_TEE_RING_INIT           = 1,
        PSP_CMD_TEE_RING_DESTROY        = 2,
+       PSP_CMD_TEE_EXTENDED_CMD        = 14,
        PSP_CMD_MAX                     = 15,
 };
 
 int psp_mailbox_command(struct psp_device *psp, enum psp_cmd cmd, void *cmdbuff,
                        unsigned int timeout_msecs, unsigned int *cmdresp);
 
+/**
+ * struct psp_ext_req_buffer_hdr - Structure of the extended command header
+ * @payload_size: total payload size
+ * @sub_cmd_id: extended command ID
+ * @status: status of command execution (out)
+ */
+struct psp_ext_req_buffer_hdr {
+       u32 payload_size;
+       u32 sub_cmd_id;
+       u32 status;
+} __packed;
+
+struct psp_ext_request {
+       struct psp_ext_req_buffer_hdr header;
+       void *buf;
+} __packed;
+
+int psp_extended_mailbox_cmd(struct psp_device *psp, unsigned int timeout_msecs,
+                            struct psp_ext_request *req);
 #endif /* __PSP_DEV_H */