Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/961280/?format=api
{ "id": 961280, "url": "http://patchwork.ozlabs.org/api/patches/961280/?format=api", "web_url": "http://patchwork.ozlabs.org/project/uboot/patch/20180823104334.16083-5-jens.wiklander@linaro.org/", "project": { "id": 18, "url": "http://patchwork.ozlabs.org/api/projects/18/?format=api", "name": "U-Boot", "link_name": "uboot", "list_id": "u-boot.lists.denx.de", "list_email": "u-boot@lists.denx.de", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20180823104334.16083-5-jens.wiklander@linaro.org>", "list_archive_url": null, "date": "2018-08-23T10:43:23", "name": "[U-Boot,v2,04/15] mmc: rpmb: add mmc_rpmb_route_frames()", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "cc8aa73c25c25a4c3e208df1929717e6a41de604", "submitter": { "id": 66201, "url": "http://patchwork.ozlabs.org/api/people/66201/?format=api", "name": "Jens Wiklander", "email": "jens.wiklander@linaro.org" }, "delegate": { "id": 3651, "url": "http://patchwork.ozlabs.org/api/users/3651/?format=api", "username": "trini", "first_name": "Tom", "last_name": "Rini", "email": "trini@ti.com" }, "mbox": "http://patchwork.ozlabs.org/project/uboot/patch/20180823104334.16083-5-jens.wiklander@linaro.org/mbox/", "series": [ { "id": 62144, "url": "http://patchwork.ozlabs.org/api/series/62144/?format=api", "web_url": "http://patchwork.ozlabs.org/project/uboot/list/?series=62144", "date": "2018-08-23T10:43:19", "name": "AVB using OP-TEE", "version": 2, "mbox": "http://patchwork.ozlabs.org/series/62144/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/961280/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/961280/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<u-boot-bounces@lists.denx.de>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org", "Authentication-Results": [ "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=lists.denx.de\n\t(client-ip=81.169.180.215; helo=lists.denx.de;\n\tenvelope-from=u-boot-bounces@lists.denx.de;\n\treceiver=<UNKNOWN>)", "ozlabs.org;\n\tdmarc=fail (p=none dis=none) header.from=linaro.org", "ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=linaro.org header.i=@linaro.org\n\theader.b=\"BwhKy0tM\"; dkim-atps=neutral" ], "Received": [ "from lists.denx.de (dione.denx.de [81.169.180.215])\n\tby ozlabs.org (Postfix) with ESMTP id 41x1Lz3XLbz9s3C\n\tfor <incoming@patchwork.ozlabs.org>;\n\tThu, 23 Aug 2018 20:47:07 +1000 (AEST)", "by lists.denx.de (Postfix, from userid 105)\n\tid 2F95AC21EEB; Thu, 23 Aug 2018 10:45:32 +0000 (UTC)", "from lists.denx.de (localhost [IPv6:::1])\n\tby lists.denx.de (Postfix) with ESMTP id 9ABB6C21EBB;\n\tThu, 23 Aug 2018 10:43:56 +0000 (UTC)", "by lists.denx.de (Postfix, from userid 105)\n\tid C1CD9C21DCA; Thu, 23 Aug 2018 10:43:52 +0000 (UTC)", "from mail-lj1-f177.google.com (mail-lj1-f177.google.com\n\t[209.85.208.177])\n\tby lists.denx.de (Postfix) with ESMTPS id 8B473C21F04\n\tfor <u-boot@lists.denx.de>; Thu, 23 Aug 2018 10:43:46 +0000 (UTC)", "by mail-lj1-f177.google.com with SMTP id s12-v6so3790192ljj.0\n\tfor <u-boot@lists.denx.de>; Thu, 23 Aug 2018 03:43:46 -0700 (PDT)", "from jax.ideon.se ([85.235.10.227])\n\tby smtp.gmail.com with ESMTPSA id\n\ty5-v6sm679771ljj.75.2018.08.23.03.43.44\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tThu, 23 Aug 2018 03:43:45 -0700 (PDT)" ], "X-Spam-Checker-Version": "SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de", "X-Spam-Level": "", "X-Spam-Status": "No, score=0.0 required=5.0 tests=T_DKIM_INVALID\n\tautolearn=unavailable autolearn_force=no version=3.4.0", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=u/0UF/7NtCAZYvPhEOE+mzk3+7xY9MuJlAagyF0alyw=;\n\tb=BwhKy0tMrM5Qh3X4opq6oKN95AG9G+E7n8eqQwsYK0oMnmeQitTKams1uv2PV/jdCK\n\t14ELJIxfUh60vS0fHDL4B8saBqGOBMisqS9taHq1Npe3tB3VIkmLgr+lL/5xpzZ238WC\n\t9v6EJR3mQaX04qMKw/ngUzgDIAHAh+wgwzFJo=", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=u/0UF/7NtCAZYvPhEOE+mzk3+7xY9MuJlAagyF0alyw=;\n\tb=s7Z55qK1zdpi6jyZzAqfz/M5PfNq5LrexD+qpLuU7hMdTU6DVcTYf9QzP+WoA1UVNc\n\t3oyVb97hYU03ygspyDqwZrl7Uv4ZZFxSvlVt9U2VWXNiawqXc8jWoZt6sn5iYRxt0iB4\n\tPvpnc+HeYxDxjH0c+ybu3qzqQKE0hZKK0x5ADrTETH7Kp92TnVFGmcgtUzP4PKGiHUJN\n\tXZRycBuQYFUCC6mxxKbT9rBRS5XhlC3lX17Sf3SOHlYOgFfV3irj/yiiPsAAwXzo5Mpv\n\tsW2S+BvNbaPtXC504wZICJSrtuaCg6Po+RFoS8tTZSd4z6nIROlkHUQkQP8sEPVkGaev\n\tEByA==", "X-Gm-Message-State": "AOUpUlHnk4LYoMzjgyKpqRD5DnCvWPNRZ+lCQw29ipelM/QRcd2LhT88\n\tKfPxWgo2b5WjP8qc5bbqrv/pR+4++x0=", "X-Google-Smtp-Source": "AA+uWPz8kQYQGrOjHv7PRDxZmghr1V1Yl2iBT8Fm3IStd6Ej9aHrgHxOD0QoNDGyOqIkDYSLsOzoFg==", "X-Received": "by 2002:a2e:9e55:: with SMTP id\n\tg21-v6mr24629197ljk.116.1535021025719; \n\tThu, 23 Aug 2018 03:43:45 -0700 (PDT)", "From": "Jens Wiklander <jens.wiklander@linaro.org>", "To": "u-boot@lists.denx.de", "Date": "Thu, 23 Aug 2018 12:43:23 +0200", "Message-Id": "<20180823104334.16083-5-jens.wiklander@linaro.org>", "X-Mailer": "git-send-email 2.17.1", "In-Reply-To": "<20180823104334.16083-1-jens.wiklander@linaro.org>", "References": "<20180823104334.16083-1-jens.wiklander@linaro.org>", "Cc": "Tom Rini <trini@konsulko.com>, Pierre Aubert <p.aubert@staubli.com>", "Subject": "[U-Boot] [PATCH v2 04/15] mmc: rpmb: add mmc_rpmb_route_frames()", "X-BeenThere": "u-boot@lists.denx.de", "X-Mailman-Version": "2.1.18", "Precedence": "list", "List-Id": "U-Boot discussion <u-boot.lists.denx.de>", "List-Unsubscribe": "<https://lists.denx.de/options/u-boot>,\n\t<mailto:u-boot-request@lists.denx.de?subject=unsubscribe>", "List-Archive": "<http://lists.denx.de/pipermail/u-boot/>", "List-Post": "<mailto:u-boot@lists.denx.de>", "List-Help": "<mailto:u-boot-request@lists.denx.de?subject=help>", "List-Subscribe": "<https://lists.denx.de/listinfo/u-boot>,\n\t<mailto:u-boot-request@lists.denx.de?subject=subscribe>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "base64", "Errors-To": "u-boot-bounces@lists.denx.de", "Sender": "\"U-Boot\" <u-boot-bounces@lists.denx.de>" }, "content": "Adds mmc_rpmb_route_frames() to route RPMB data frames from/to an\nexternal entity.\n\nTested-by: Igor Opaniuk <igor.opaniuk@linaro.org>\nSigned-off-by: Jens Wiklander <jens.wiklander@linaro.org>\n---\n drivers/mmc/rpmb.c | 160 +++++++++++++++++++++++++++++++++++++++++++++\n include/mmc.h | 2 +\n 2 files changed, 162 insertions(+)", "diff": "diff --git a/drivers/mmc/rpmb.c b/drivers/mmc/rpmb.c\nindex dfbdb0deb107..908f19208955 100644\n--- a/drivers/mmc/rpmb.c\n+++ b/drivers/mmc/rpmb.c\n@@ -321,3 +321,163 @@ int mmc_rpmb_write(struct mmc *mmc, void *addr, unsigned short blk,\n \t}\n \treturn i;\n }\n+\n+static int send_write_mult_block(struct mmc *mmc, const struct s_rpmb *frm,\n+\t\t\t\t unsigned short cnt)\n+{\n+\tstruct mmc_cmd cmd = {\n+\t\t.cmdidx = MMC_CMD_WRITE_MULTIPLE_BLOCK,\n+\t\t.resp_type = MMC_RSP_R1b,\n+\t};\n+\tstruct mmc_data data = {\n+\t\t.src = (const void *)frm,\n+\t\t.blocks = cnt,\n+\t\t.blocksize = sizeof(*frm),\n+\t\t.flags = MMC_DATA_WRITE,\n+\t};\n+\n+\treturn mmc_send_cmd(mmc, &cmd, &data);\n+}\n+\n+static int send_read_mult_block(struct mmc *mmc, struct s_rpmb *frm,\n+\t\t\t\tunsigned short cnt)\n+{\n+\tstruct mmc_cmd cmd = {\n+\t\t.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK,\n+\t\t.resp_type = MMC_RSP_R1,\n+\t};\n+\tstruct mmc_data data = {\n+\t\t.dest = (void *)frm,\n+\t\t.blocks = cnt,\n+\t\t.blocksize = sizeof(*frm),\n+\t\t.flags = MMC_DATA_READ,\n+\t};\n+\n+\treturn mmc_send_cmd(mmc, &cmd, &data);\n+}\n+\n+static int rpmb_route_write_req(struct mmc *mmc, struct s_rpmb *req,\n+\t\t\t\tunsigned short req_cnt, struct s_rpmb *rsp,\n+\t\t\t\tunsigned short rsp_cnt)\n+{\n+\tint ret;\n+\n+\t/*\n+\t * Send the write request.\n+\t */\n+\tret = mmc_set_blockcount(mmc, req_cnt, true);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tret = send_write_mult_block(mmc, req, req_cnt);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\t/*\n+\t * Read the result of the request.\n+\t */\n+\tret = mmc_set_blockcount(mmc, 1, false);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tmemset(rsp, 0, sizeof(*rsp));\n+\trsp->request = cpu_to_be16(RPMB_REQ_STATUS);\n+\tret = send_write_mult_block(mmc, rsp, 1);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tret = mmc_set_blockcount(mmc, 1, false);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\treturn send_read_mult_block(mmc, rsp, 1);\n+}\n+\n+static int rpmb_route_read_req(struct mmc *mmc, struct s_rpmb *req,\n+\t\t\t unsigned short req_cnt, struct s_rpmb *rsp,\n+\t\t\t unsigned short rsp_cnt)\n+{\n+\tint ret;\n+\n+\t/*\n+\t * Send the read request.\n+\t */\n+\tret = mmc_set_blockcount(mmc, 1, false);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tret = send_write_mult_block(mmc, req, 1);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\t/*\n+\t * Read the result of the request.\n+\t */\n+\n+\tret = mmc_set_blockcount(mmc, rsp_cnt, false);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\treturn send_read_mult_block(mmc, rsp, rsp_cnt);\n+}\n+\n+static int rpmb_route_frames(struct mmc *mmc, struct s_rpmb *req,\n+\t\t\t unsigned short req_cnt, struct s_rpmb *rsp,\n+\t\t\t unsigned short rsp_cnt)\n+{\n+\tunsigned short n;\n+\n+\t/*\n+\t * If multiple request frames are provided, make sure that all are\n+\t * of the same type.\n+\t */\n+\tfor (n = 1; n < req_cnt; n++)\n+\t\tif (req[n].request != req->request)\n+\t\t\treturn -EINVAL;\n+\n+\tswitch (be16_to_cpu(req->request)) {\n+\tcase RPMB_REQ_KEY:\n+\t\tif (req_cnt != 1 || rsp_cnt != 1)\n+\t\t\treturn -EINVAL;\n+\t\treturn rpmb_route_write_req(mmc, req, req_cnt, rsp, rsp_cnt);\n+\n+\tcase RPMB_REQ_WRITE_DATA:\n+\t\tif (!req_cnt || rsp_cnt != 1)\n+\t\t\treturn -EINVAL;\n+\t\treturn rpmb_route_write_req(mmc, req, req_cnt, rsp, rsp_cnt);\n+\n+\tcase RPMB_REQ_WCOUNTER:\n+\t\tif (req_cnt != 1 || rsp_cnt != 1)\n+\t\t\treturn -EINVAL;\n+\t\treturn rpmb_route_read_req(mmc, req, req_cnt, rsp, rsp_cnt);\n+\n+\tcase RPMB_REQ_READ_DATA:\n+\t\tif (req_cnt != 1 || !req_cnt)\n+\t\t\treturn -EINVAL;\n+\t\treturn rpmb_route_read_req(mmc, req, req_cnt, rsp, rsp_cnt);\n+\n+\tdefault:\n+\t\tdebug(\"Unsupported message type: %d\\n\",\n+\t\t be16_to_cpu(req->request));\n+\t\treturn -EINVAL;\n+\t}\n+}\n+\n+int mmc_rpmb_route_frames(struct mmc *mmc, void *req, unsigned long reqlen,\n+\t\t\t void *rsp, unsigned long rsplen)\n+{\n+\t/*\n+\t * Whoever crafted the data supplied to this function knows how to\n+\t * format the PRMB frames and which response is expected. If\n+\t * there's some unexpected mismatch it's more helpful to report an\n+\t * error immediately than trying to guess what was the intention\n+\t * and possibly just delay an eventual error which will be harder\n+\t * to track down.\n+\t */\n+\n+\tif (reqlen % sizeof(struct s_rpmb) || rsplen % sizeof(struct s_rpmb))\n+\t\treturn -EINVAL;\n+\n+\treturn rpmb_route_frames(mmc, req, reqlen / sizeof(struct s_rpmb),\n+\t\t\t\t rsp, rsplen / sizeof(struct s_rpmb));\n+}\ndiff --git a/include/mmc.h b/include/mmc.h\nindex df4255b828a7..d6e02af4edea 100644\n--- a/include/mmc.h\n+++ b/include/mmc.h\n@@ -748,6 +748,8 @@ int mmc_rpmb_read(struct mmc *mmc, void *addr, unsigned short blk,\n \t\t unsigned short cnt, unsigned char *key);\n int mmc_rpmb_write(struct mmc *mmc, void *addr, unsigned short blk,\n \t\t unsigned short cnt, unsigned char *key);\n+int mmc_rpmb_route_frames(struct mmc *mmc, void *req, unsigned long reqlen,\n+\t\t\t void *rsp, unsigned long rsplen);\n #ifdef CONFIG_CMD_BKOPS_ENABLE\n int mmc_set_bkops_enable(struct mmc *mmc);\n #endif\n", "prefixes": [ "U-Boot", "v2", "04/15" ] }