Skip to content

Commit ce7d8a3

Browse files
beanhuoUlf Hansson
authored andcommitted
mmc: core: Improve RPMB frame handling code
Introduce RPMB_FRAME_SIZE, CHECK_SIZE_NEQ(), and CHECK_SIZE_ALIGNED() macros to replace repetitive sizeof(struct rpmb_frame) checks in mmc_route_rpmb_frames(). Signed-off-by: Bean Huo <[email protected]> Reviewed-by: Avri Altman <[email protected]> Signed-off-by: Ulf Hansson <[email protected]>
1 parent 072755c commit ce7d8a3

1 file changed

Lines changed: 14 additions & 16 deletions

File tree

drivers/mmc/core/block.c

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,10 @@ struct rpmb_frame {
121121
#define RPMB_READ_DATA 0x4 /* Read data from RPMB partition */
122122
#define RPMB_RESULT_READ 0x5 /* Read result request (Internal) */
123123

124+
#define RPMB_FRAME_SIZE sizeof(struct rpmb_frame)
125+
#define CHECK_SIZE_NEQ(val) ((val) != sizeof(struct rpmb_frame))
126+
#define CHECK_SIZE_ALIGNED(val) IS_ALIGNED((val), sizeof(struct rpmb_frame))
127+
124128
static DEFINE_MUTEX(block_mutex);
125129

126130
/*
@@ -2858,12 +2862,12 @@ static void set_idata(struct mmc_blk_ioc_data *idata, u32 opcode,
28582862
* The size of an RPMB frame must match what's expected by the
28592863
* hardware.
28602864
*/
2861-
BUILD_BUG_ON(sizeof(struct rpmb_frame) != 512);
2865+
static_assert(!CHECK_SIZE_NEQ(512), "RPMB frame size must be 512 bytes");
28622866

28632867
idata->ic.opcode = opcode;
28642868
idata->ic.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
28652869
idata->ic.write_flag = write_flag;
2866-
idata->ic.blksz = sizeof(struct rpmb_frame);
2870+
idata->ic.blksz = RPMB_FRAME_SIZE;
28672871
idata->ic.blocks = buf_bytes / idata->ic.blksz;
28682872
idata->buf = buf;
28692873
idata->buf_bytes = buf_bytes;
@@ -2887,43 +2891,37 @@ static int mmc_route_rpmb_frames(struct device *dev, u8 *req,
28872891
if (IS_ERR(md->queue.card))
28882892
return PTR_ERR(md->queue.card);
28892893

2890-
if (req_len < sizeof(*frm))
2894+
if (req_len < RPMB_FRAME_SIZE)
28912895
return -EINVAL;
28922896

28932897
req_type = be16_to_cpu(frm->req_resp);
28942898
switch (req_type) {
28952899
case RPMB_PROGRAM_KEY:
2896-
if (req_len != sizeof(struct rpmb_frame) ||
2897-
resp_len != sizeof(struct rpmb_frame))
2900+
if (CHECK_SIZE_NEQ(req_len) || CHECK_SIZE_NEQ(resp_len))
28982901
return -EINVAL;
28992902
write = true;
29002903
break;
29012904
case RPMB_GET_WRITE_COUNTER:
2902-
if (req_len != sizeof(struct rpmb_frame) ||
2903-
resp_len != sizeof(struct rpmb_frame))
2905+
if (CHECK_SIZE_NEQ(req_len) || CHECK_SIZE_NEQ(resp_len))
29042906
return -EINVAL;
29052907
write = false;
29062908
break;
29072909
case RPMB_WRITE_DATA:
2908-
if (req_len % sizeof(struct rpmb_frame) ||
2909-
resp_len != sizeof(struct rpmb_frame))
2910+
if (!CHECK_SIZE_ALIGNED(req_len) || CHECK_SIZE_NEQ(resp_len))
29102911
return -EINVAL;
29112912
write = true;
29122913
break;
29132914
case RPMB_READ_DATA:
2914-
if (req_len != sizeof(struct rpmb_frame) ||
2915-
resp_len % sizeof(struct rpmb_frame))
2915+
if (CHECK_SIZE_NEQ(req_len) || !CHECK_SIZE_ALIGNED(resp_len))
29162916
return -EINVAL;
29172917
write = false;
29182918
break;
29192919
default:
29202920
return -EINVAL;
29212921
}
29222922

2923-
if (write)
2924-
cmd_count = 3;
2925-
else
2926-
cmd_count = 2;
2923+
/* Write operations require 3 commands, read operations require 2 */
2924+
cmd_count = write ? 3 : 2;
29272925

29282926
idata = alloc_idata(rpmb, cmd_count);
29292927
if (!idata)
@@ -2937,7 +2935,7 @@ static int mmc_route_rpmb_frames(struct device *dev, u8 *req,
29372935
1 | MMC_CMD23_ARG_REL_WR, req, req_len);
29382936

29392937
/* Send result request frame */
2940-
memset(resp_frm, 0, sizeof(*resp_frm));
2938+
memset(resp_frm, 0, RPMB_FRAME_SIZE);
29412939
resp_frm->req_resp = cpu_to_be16(RPMB_RESULT_READ);
29422940
set_idata(idata[1], MMC_WRITE_MULTIPLE_BLOCK, 1, resp,
29432941
resp_len);

0 commit comments

Comments
 (0)