drivers: optee: rpmb: fix returning CID to TEE
authorJorge Ramirez-Ortiz <jorge@foundries.io>
Tue, 26 Nov 2019 16:19:34 +0000 (17:19 +0100)
committerTom Rini <trini@konsulko.com>
Thu, 5 Dec 2019 15:28:38 +0000 (10:28 -0500)
The mmc CID value is one of the input parameters used to provision the
RPMB key. The trusted execution environment expects this value to be
specified in big endian format.

Before this fix, on little endian systems, the value returned by the
linux kernel mmc driver differed from the one returned by u-boot.
This meant that if linux provisioned the RPMB key, u-boot would not
have access to the partition (and the other way around).

Signed-off-by: Jorge Ramirez-Ortiz <jorge@foundries.io>
Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org>
drivers/tee/optee/rpmb.c

index 955155b3f8b1212b9b9fe3dcb6afba36e177b8f3..cf1ce77e6e19e68ea5fb2300fcfb48d4d32675e9 100644 (file)
@@ -98,6 +98,7 @@ static struct mmc *get_mmc(struct optee_private *priv, int dev_id)
 static u32 rpmb_get_dev_info(u16 dev_id, struct rpmb_dev_info *info)
 {
        struct mmc *mmc = find_mmc_device(dev_id);
+       int i;
 
        if (!mmc)
                return TEE_ERROR_ITEM_NOT_FOUND;
@@ -105,7 +106,9 @@ static u32 rpmb_get_dev_info(u16 dev_id, struct rpmb_dev_info *info)
        if (!mmc->ext_csd)
                return TEE_ERROR_GENERIC;
 
-       memcpy(info->cid, mmc->cid, sizeof(info->cid));
+       for (i = 0; i < ARRAY_SIZE(mmc->cid); i++)
+               ((u32 *) info->cid)[i] = cpu_to_be32(mmc->cid[i]);
+
        info->rel_wr_sec_c = mmc->ext_csd[222];
        info->rpmb_size_mult = mmc->ext_csd[168];
        info->ret_code = RPMB_CMD_GET_DEV_INFO_RET_OK;