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