• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
2 /*
3  * Copyright (c) 2019 Amlogic, Inc. All rights reserved.
4  */
5 
6 #ifndef __EMMC_KEY_H__
7 #define __EMMC_KEY_H__
8 
9 #include <linux/mmc/host.h>
10 #include <linux/mmc/card.h>
11 #include <linux/mmc/mmc.h>
12 #include <linux/mmc/core.h>
13 
14 #define EMMC_KEY_AREA_SIGNAL "emmckeys"
15 #define EMMC_KEY_AREA_SIGNAL_LEN 16
16 
17 #define EMMC_KEYAREA_SIZE (256 * 1024)
18 #define EMMC_KEYAREA_COUNT 2
19 
20 /* we store partition table in the previous 16KB space */
21 #define EMMCKEY_RESERVE_OFFSET 0x4000
22 #define EMMCKEY_AREA_PHY_SIZE (EMMC_KEYAREA_COUNT * EMMC_KEYAREA_SIZE)
23 
24 struct emmckey_valid_node_t {
25     u64 phy_addr;
26     u64 phy_size;
27     struct emmckey_valid_node_t *next;
28 };
29 
30 struct aml_emmckey_info_t {
31     struct emmckey_valid_node_t *key_valid_node;
32     u64 keyarea_phy_addr;
33     u64 keyarea_phy_size;
34     u64 lba_start;
35     u64 lba_end;
36     u32 blk_size;
37     u32 blk_shift;
38     u8 key_init;
39     u8 key_valid;
40     u8 key_part_count;
41 };
42 
43 struct aml_key_info {
44     u64 checksum;
45     u32 stamp;
46     u32 magic;
47 };
48 
49 #define EMMCKEY_DATA_VALID_LEN (EMMC_KEYAREA_SIZE - EMMC_KEY_AREA_SIGNAL_LEN - 4 - 4 - 4)
50 struct emmckey_data_t {
51     u8 keyarea_mark[EMMC_KEY_AREA_SIGNAL_LEN];
52     u32 keyarea_mark_checksum;
53     u32 checksum;
54     u32 reserve;
55     u8 data[EMMCKEY_DATA_VALID_LEN];
56 };
57 
58 int emmc_key_init(struct mmc_card *card);
59 
60 int32_t emmc_key_read(u8 *buffer, u32 length, u32 *actual_length);
61 int32_t emmc_key_write(u8 *buffer, u32 length, u32 *actual_length);
62 
63 #endif
64