From: Jens Wiklander <jens.wiklander@linaro.org>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 03/10] mmc: rpmb: add mmc_rpmb_route_frames()
Date: Mon, 13 Aug 2018 17:53:40 +0200 [thread overview]
Message-ID: <20180813155347.13844-4-jens.wiklander@linaro.org> (raw)
In-Reply-To: <20180813155347.13844-1-jens.wiklander@linaro.org>
Adds mmc_rpmb_route_frames() to route RPMB data frames from/to an
external entity.
Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
---
drivers/mmc/rpmb.c | 160 +++++++++++++++++++++++++++++++++++++++++++++
include/mmc.h | 2 +
2 files changed, 162 insertions(+)
diff --git a/drivers/mmc/rpmb.c b/drivers/mmc/rpmb.c
index dfbdb0deb107..908f19208955 100644
--- a/drivers/mmc/rpmb.c
+++ b/drivers/mmc/rpmb.c
@@ -321,3 +321,163 @@ int mmc_rpmb_write(struct mmc *mmc, void *addr, unsigned short blk,
}
return i;
}
+
+static int send_write_mult_block(struct mmc *mmc, const struct s_rpmb *frm,
+ unsigned short cnt)
+{
+ struct mmc_cmd cmd = {
+ .cmdidx = MMC_CMD_WRITE_MULTIPLE_BLOCK,
+ .resp_type = MMC_RSP_R1b,
+ };
+ struct mmc_data data = {
+ .src = (const void *)frm,
+ .blocks = cnt,
+ .blocksize = sizeof(*frm),
+ .flags = MMC_DATA_WRITE,
+ };
+
+ return mmc_send_cmd(mmc, &cmd, &data);
+}
+
+static int send_read_mult_block(struct mmc *mmc, struct s_rpmb *frm,
+ unsigned short cnt)
+{
+ struct mmc_cmd cmd = {
+ .cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK,
+ .resp_type = MMC_RSP_R1,
+ };
+ struct mmc_data data = {
+ .dest = (void *)frm,
+ .blocks = cnt,
+ .blocksize = sizeof(*frm),
+ .flags = MMC_DATA_READ,
+ };
+
+ return mmc_send_cmd(mmc, &cmd, &data);
+}
+
+static int rpmb_route_write_req(struct mmc *mmc, struct s_rpmb *req,
+ unsigned short req_cnt, struct s_rpmb *rsp,
+ unsigned short rsp_cnt)
+{
+ int ret;
+
+ /*
+ * Send the write request.
+ */
+ ret = mmc_set_blockcount(mmc, req_cnt, true);
+ if (ret)
+ return ret;
+
+ ret = send_write_mult_block(mmc, req, req_cnt);
+ if (ret)
+ return ret;
+
+ /*
+ * Read the result of the request.
+ */
+ ret = mmc_set_blockcount(mmc, 1, false);
+ if (ret)
+ return ret;
+
+ memset(rsp, 0, sizeof(*rsp));
+ rsp->request = cpu_to_be16(RPMB_REQ_STATUS);
+ ret = send_write_mult_block(mmc, rsp, 1);
+ if (ret)
+ return ret;
+
+ ret = mmc_set_blockcount(mmc, 1, false);
+ if (ret)
+ return ret;
+
+ return send_read_mult_block(mmc, rsp, 1);
+}
+
+static int rpmb_route_read_req(struct mmc *mmc, struct s_rpmb *req,
+ unsigned short req_cnt, struct s_rpmb *rsp,
+ unsigned short rsp_cnt)
+{
+ int ret;
+
+ /*
+ * Send the read request.
+ */
+ ret = mmc_set_blockcount(mmc, 1, false);
+ if (ret)
+ return ret;
+
+ ret = send_write_mult_block(mmc, req, 1);
+ if (ret)
+ return ret;
+
+ /*
+ * Read the result of the request.
+ */
+
+ ret = mmc_set_blockcount(mmc, rsp_cnt, false);
+ if (ret)
+ return ret;
+
+ return send_read_mult_block(mmc, rsp, rsp_cnt);
+}
+
+static int rpmb_route_frames(struct mmc *mmc, struct s_rpmb *req,
+ unsigned short req_cnt, struct s_rpmb *rsp,
+ unsigned short rsp_cnt)
+{
+ unsigned short n;
+
+ /*
+ * If multiple request frames are provided, make sure that all are
+ * of the same type.
+ */
+ for (n = 1; n < req_cnt; n++)
+ if (req[n].request != req->request)
+ return -EINVAL;
+
+ switch (be16_to_cpu(req->request)) {
+ case RPMB_REQ_KEY:
+ if (req_cnt != 1 || rsp_cnt != 1)
+ return -EINVAL;
+ return rpmb_route_write_req(mmc, req, req_cnt, rsp, rsp_cnt);
+
+ case RPMB_REQ_WRITE_DATA:
+ if (!req_cnt || rsp_cnt != 1)
+ return -EINVAL;
+ return rpmb_route_write_req(mmc, req, req_cnt, rsp, rsp_cnt);
+
+ case RPMB_REQ_WCOUNTER:
+ if (req_cnt != 1 || rsp_cnt != 1)
+ return -EINVAL;
+ return rpmb_route_read_req(mmc, req, req_cnt, rsp, rsp_cnt);
+
+ case RPMB_REQ_READ_DATA:
+ if (req_cnt != 1 || !req_cnt)
+ return -EINVAL;
+ return rpmb_route_read_req(mmc, req, req_cnt, rsp, rsp_cnt);
+
+ default:
+ debug("Unsupported message type: %d\n",
+ be16_to_cpu(req->request));
+ return -EINVAL;
+ }
+}
+
+int mmc_rpmb_route_frames(struct mmc *mmc, void *req, unsigned long reqlen,
+ void *rsp, unsigned long rsplen)
+{
+ /*
+ * Whoever crafted the data supplied to this function knows how to
+ * format the PRMB frames and which response is expected. If
+ * there's some unexpected mismatch it's more helpful to report an
+ * error immediately than trying to guess what was the intention
+ * and possibly just delay an eventual error which will be harder
+ * to track down.
+ */
+
+ if (reqlen % sizeof(struct s_rpmb) || rsplen % sizeof(struct s_rpmb))
+ return -EINVAL;
+
+ return rpmb_route_frames(mmc, req, reqlen / sizeof(struct s_rpmb),
+ rsp, rsplen / sizeof(struct s_rpmb));
+}
diff --git a/include/mmc.h b/include/mmc.h
index df4255b828a7..d6e02af4edea 100644
--- a/include/mmc.h
+++ b/include/mmc.h
@@ -748,6 +748,8 @@ int mmc_rpmb_read(struct mmc *mmc, void *addr, unsigned short blk,
unsigned short cnt, unsigned char *key);
int mmc_rpmb_write(struct mmc *mmc, void *addr, unsigned short blk,
unsigned short cnt, unsigned char *key);
+int mmc_rpmb_route_frames(struct mmc *mmc, void *req, unsigned long reqlen,
+ void *rsp, unsigned long rsplen);
#ifdef CONFIG_CMD_BKOPS_ENABLE
int mmc_set_bkops_enable(struct mmc *mmc);
#endif
--
2.17.1
next prev parent reply other threads:[~2018-08-13 15:53 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-13 15:53 [U-Boot] [PATCH 00/10] AVB using OP-TEE Jens Wiklander
2018-08-13 15:53 ` [U-Boot] [PATCH 01/10] dm: fdt: scan for devices under /firmware too Jens Wiklander
2018-08-15 14:17 ` Tom Rini
2018-08-15 14:30 ` Michal Simek
2018-08-15 14:34 ` Tom Rini
2018-08-15 14:50 ` Michal Simek
2018-08-15 15:31 ` Rob Herring
2018-08-15 15:43 ` Tom Rini
2018-08-13 15:53 ` [U-Boot] [PATCH 02/10] cmd: avb read_rb: print rb_idx in hexadecimal Jens Wiklander
2018-08-14 11:34 ` Igor Opaniuk
2018-08-13 15:53 ` Jens Wiklander [this message]
2018-08-16 12:13 ` [U-Boot] [PATCH 03/10] mmc: rpmb: add mmc_rpmb_route_frames() Igor Opaniuk
2018-08-22 13:52 ` Jens Wiklander
2018-08-13 15:53 ` [U-Boot] [PATCH 04/10] Add UCLASS_TEE for Trusted Execution Environment Jens Wiklander
2018-08-16 12:14 ` Igor Opaniuk
2018-08-17 12:48 ` Simon Glass
2018-08-21 9:20 ` Jens Wiklander
2018-08-23 10:45 ` Simon Glass
2018-08-23 11:11 ` Jens Wiklander
2018-08-23 16:31 ` Simon Glass
2018-08-13 15:53 ` [U-Boot] [PATCH 05/10] dt/bindings: add bindings for optee Jens Wiklander
2018-08-13 15:53 ` [U-Boot] [PATCH 06/10] tee: add OP-TEE driver Jens Wiklander
2018-08-16 12:17 ` Igor Opaniuk
2018-08-13 15:53 ` [U-Boot] [PATCH 07/10] arm: dt: hikey: Add optee node Jens Wiklander
2018-08-13 15:53 ` [U-Boot] [PATCH 08/10] optee: support routing of rpmb data frames to mmc Jens Wiklander
2018-08-16 12:23 ` Igor Opaniuk
2018-08-13 15:53 ` [U-Boot] [PATCH 09/10] tee: optee: support AVB trusted application Jens Wiklander
2018-08-16 12:22 ` Igor Opaniuk
2018-08-19 12:42 ` Igor Opaniuk
2018-08-13 15:53 ` [U-Boot] [PATCH 10/10] avb_verify: support using OP-TEE TA AVB Jens Wiklander
2018-08-14 11:20 ` Igor Opaniuk
2018-08-16 12:17 ` Igor Opaniuk
2018-08-23 10:45 ` [U-Boot] [PATCH 00/10] AVB using OP-TEE Simon Glass
2018-08-23 11:23 ` Jens Wiklander
2018-08-23 12:15 ` Igor Opaniuk
2018-08-23 16:31 ` Simon Glass
2018-08-28 6:11 ` Jens Wiklander
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180813155347.13844-4-jens.wiklander@linaro.org \
--to=jens.wiklander@linaro.org \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox