Lines Matching +full:mmc +full:-
5 * eMMC- Replay Protected Memory Block
6 * According to JEDEC Standard No. 84-A441
8 * SPDX-License-Identifier: GPL-2.0+
14 #include <mmc.h>
15 #include <u-boot/sha256.h>
57 static int mmc_set_blockcount(struct mmc *mmc, unsigned int blockcount, in mmc_set_blockcount() argument
68 return mmc_send_cmd(mmc, &cmd, NULL); in mmc_set_blockcount()
70 static int mmc_rpmb_request(struct mmc *mmc, const void *s, in mmc_rpmb_request() argument
77 ret = mmc_set_blockcount(mmc, count, is_rel_write); in mmc_rpmb_request()
80 printf("%s:mmc_set_blockcount-> %d\n", __func__, ret); in mmc_rpmb_request()
94 ret = mmc_send_cmd(mmc, &cmd, &data); in mmc_rpmb_request()
97 printf("%s:mmc_send_cmd-> %d\n", __func__, ret); in mmc_rpmb_request()
103 static int mmc_rpmb_response(struct mmc *mmc, struct s_rpmb *s, in mmc_rpmb_response() argument
110 ret = mmc_set_blockcount(mmc, cnt, false); in mmc_rpmb_response()
113 printf("%s:mmc_set_blockcount-> %d\n", __func__, ret); in mmc_rpmb_response()
115 return -1; in mmc_rpmb_response()
126 ret = mmc_send_cmd(mmc, &cmd, &data); in mmc_rpmb_response()
129 printf("%s:mmc_send_cmd-> %d\n", __func__, ret); in mmc_rpmb_response()
131 return -1; in mmc_rpmb_response()
134 if (be16_to_cpu(s->request) != expected) { in mmc_rpmb_response()
137 be16_to_cpu(s->request)); in mmc_rpmb_response()
139 return -1; in mmc_rpmb_response()
141 ret = be16_to_cpu(s->result); in mmc_rpmb_response()
151 static int mmc_rpmb_status(struct mmc *mmc, unsigned short expected) in mmc_rpmb_status() argument
156 rpmb_frame->request = cpu_to_be16(RPMB_REQ_STATUS); in mmc_rpmb_status()
157 if (mmc_rpmb_request(mmc, rpmb_frame, 1, false)) in mmc_rpmb_status()
158 return -1; in mmc_rpmb_status()
161 return mmc_rpmb_response(mmc, rpmb_frame, expected, 1); in mmc_rpmb_status()
207 int mmc_rpmb_get_counter(struct mmc *mmc, unsigned long *pcounter) in mmc_rpmb_get_counter() argument
214 rpmb_frame->request = cpu_to_be16(RPMB_REQ_WCOUNTER); in mmc_rpmb_get_counter()
215 if (mmc_rpmb_request(mmc, rpmb_frame, 1, false)) in mmc_rpmb_get_counter()
216 return -1; in mmc_rpmb_get_counter()
219 ret = mmc_rpmb_response(mmc, rpmb_frame, RPMB_RESP_WCOUNTER, 1); in mmc_rpmb_get_counter()
223 *pcounter = be32_to_cpu(rpmb_frame->write_counter); in mmc_rpmb_get_counter()
226 int mmc_rpmb_set_key(struct mmc *mmc, void *key) in mmc_rpmb_set_key() argument
231 rpmb_frame->request = cpu_to_be16(RPMB_REQ_KEY); in mmc_rpmb_set_key()
232 memcpy(rpmb_frame->mac, key, RPMB_SZ_MAC); in mmc_rpmb_set_key()
234 if (mmc_rpmb_request(mmc, rpmb_frame, 1, true)) in mmc_rpmb_set_key()
235 return -1; in mmc_rpmb_set_key()
238 return mmc_rpmb_status(mmc, RPMB_RESP_KEY); in mmc_rpmb_set_key()
240 int mmc_rpmb_read(struct mmc *mmc, void *addr, unsigned short blk, in mmc_rpmb_read() argument
256 rpmb_frame->address = cpu_to_be16(blk); in mmc_rpmb_read()
257 rpmb_frame->request = cpu_to_be16(RPMB_REQ_READ_DATA); in mmc_rpmb_read()
258 if (mmc_rpmb_request(mmc, rpmb_frame, 1, false)) { in mmc_rpmb_read()
260 return -1; in mmc_rpmb_read()
264 (mmc, in mmc_rpmb_read()
268 return -1; in mmc_rpmb_read()
279 memcpy(addr + i * RPMB_SZ_DATA, rpmb_frame->data, RPMB_SZ_DATA); in mmc_rpmb_read()
280 memcpy(rpmb_frame_vrify->data, rpmb_frame->data, 284); in mmc_rpmb_read()
288 if (memcmp(ret_hmac, rpmb_frame->mac, RPMB_SZ_MAC)) { in mmc_rpmb_read()
290 return -1; in mmc_rpmb_read()
296 int mmc_rpmb_write(struct mmc *mmc, void *addr, unsigned short blk, in mmc_rpmb_write() argument
312 temp = cnt - 1; in mmc_rpmb_write()
317 if (mmc_rpmb_get_counter(mmc, &wcount)) { in mmc_rpmb_write()
329 memcpy(rpmb_frame->data, addr + i * RPMB_SZ_DATA, RPMB_SZ_DATA); in mmc_rpmb_write()
330 memcpy(rpmb_frame_vrify->data, addr + in mmc_rpmb_write()
332 rpmb_frame->address = cpu_to_be16(blk); in mmc_rpmb_write()
333 rpmb_frame_vrify->address = cpu_to_be16(blk); in mmc_rpmb_write()
334 rpmb_frame->block_count = cpu_to_be16(cnt); in mmc_rpmb_write()
335 rpmb_frame_vrify->block_count = cpu_to_be16(cnt); in mmc_rpmb_write()
336 rpmb_frame->write_counter = cpu_to_be32(wcount); in mmc_rpmb_write()
337 rpmb_frame_vrify->write_counter = cpu_to_be32(wcount); in mmc_rpmb_write()
338 rpmb_frame->request = cpu_to_be16(RPMB_REQ_WRITE_DATA); in mmc_rpmb_write()
339 rpmb_frame_vrify->request = cpu_to_be16(RPMB_REQ_WRITE_DATA); in mmc_rpmb_write()
343 284 * cnt, rpmb_frame->mac); in mmc_rpmb_write()
346 if (mmc_rpmb_request(mmc, rpmb_frame_data, cnt, true)) in mmc_rpmb_write()
347 return -1; in mmc_rpmb_write()
349 if (mmc_rpmb_status(mmc, RPMB_RESP_WRITE_DATA)) in mmc_rpmb_write()
350 return -1; in mmc_rpmb_write()
354 int read_counter(struct mmc *mmc, struct s_rpmb *requestpackets) in read_counter() argument
356 if (mmc_rpmb_request(mmc, requestpackets, 1, false)) in read_counter()
357 return -1; in read_counter()
359 if (mmc_rpmb_response(mmc, requestpackets, RPMB_RESP_WCOUNTER, 1)) in read_counter()
360 return -1; in read_counter()
365 int program_key(struct mmc *mmc, struct s_rpmb *requestpackets) in program_key() argument
367 if (mmc_rpmb_request(mmc, requestpackets, 1, true)) in program_key()
368 return -1; in program_key()
372 requestpackets->request = cpu_to_be16(RPMB_REQ_STATUS); in program_key()
374 if (mmc_rpmb_request(mmc, requestpackets, 1, false)) in program_key()
375 return -1; in program_key()
377 return mmc_rpmb_response(mmc, requestpackets, RPMB_RESP_KEY, 1); in program_key()
380 int authenticated_read(struct mmc *mmc, in authenticated_read() argument
383 if (mmc_rpmb_request(mmc, requestpackets, 1, false)) in authenticated_read()
384 return -1; in authenticated_read()
387 (mmc, requestpackets, RPMB_RESP_READ_DATA, block_count)) in authenticated_read()
388 return -1; in authenticated_read()
393 int authenticated_write(struct mmc *mmc, struct s_rpmb *requestpackets) in authenticated_write() argument
395 if (mmc_rpmb_request(mmc, requestpackets, 1, true)) in authenticated_write()
396 return -1; in authenticated_write()
400 requestpackets->request = cpu_to_be16(RPMB_REQ_STATUS); in authenticated_write()
402 if (mmc_rpmb_request(mmc, requestpackets, 1, false)) in authenticated_write()
403 return -1; in authenticated_write()
405 return mmc_rpmb_response(mmc, requestpackets, RPMB_RESP_WRITE_DATA, 1); in authenticated_write()