@@ -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+
124128static 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