1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * (C) Copyright 2018, Linaro Limited
4  */
5 
6 #ifndef	_AVB_VERIFY_H
7 #define _AVB_VERIFY_H
8 
9 #include <../lib/libavb/libavb.h>
10 #include <mapmem.h>
11 #include <mmc.h>
12 
13 #define AVB_MAX_ARGS			1024
14 #define VERITY_TABLE_OPT_RESTART	"restart_on_corruption"
15 #define VERITY_TABLE_OPT_LOGGING	"ignore_corruption"
16 #define ALLOWED_BUF_ALIGN		8
17 
18 enum avb_boot_state {
19 	AVB_GREEN,
20 	AVB_YELLOW,
21 	AVB_ORANGE,
22 	AVB_RED,
23 };
24 
25 struct AvbOpsData {
26 	struct AvbOps ops;
27 	int mmc_dev;
28 	enum avb_boot_state boot_state;
29 #ifdef CONFIG_OPTEE_TA_AVB
30 	struct udevice *tee;
31 	u32 session;
32 #endif
33 };
34 
35 struct mmc_part {
36 	int dev_num;
37 	struct mmc *mmc;
38 	struct blk_desc *mmc_blk;
39 	struct disk_partition info;
40 };
41 
42 enum mmc_io_type {
43 	IO_READ,
44 	IO_WRITE
45 };
46 
47 AvbOps *avb_ops_alloc(int boot_device);
48 void avb_ops_free(AvbOps *ops);
49 
50 char *avb_set_state(AvbOps *ops, enum avb_boot_state boot_state);
51 char *avb_set_enforce_verity(const char *cmdline);
52 char *avb_set_ignore_corruption(const char *cmdline);
53 
54 char *append_cmd_line(char *cmdline_orig, char *cmdline_new);
55 const char *str_avb_io_error(AvbIOResult res);
56 const char *str_avb_slot_error(AvbSlotVerifyResult res);
57 /**
58  * ============================================================================
59  * I/O helper inline functions
60  * ============================================================================
61  */
calc_offset(struct mmc_part * part,int64_t offset)62 static inline uint64_t calc_offset(struct mmc_part *part, int64_t offset)
63 {
64 	u64 part_size = part->info.size * part->info.blksz;
65 
66 	if (offset < 0)
67 		return part_size + offset;
68 
69 	return offset;
70 }
71 
get_sector_buf_size(void)72 static inline size_t get_sector_buf_size(void)
73 {
74 	return (size_t)CONFIG_AVB_BUF_SIZE;
75 }
76 
get_sector_buf(void)77 static inline void *get_sector_buf(void)
78 {
79 	return map_sysmem(CONFIG_AVB_BUF_ADDR, CONFIG_AVB_BUF_SIZE);
80 }
81 
is_buf_unaligned(void * buffer)82 static inline bool is_buf_unaligned(void *buffer)
83 {
84 	return (bool)((uintptr_t)buffer % ALLOWED_BUF_ALIGN);
85 }
86 
get_boot_device(AvbOps * ops)87 static inline int get_boot_device(AvbOps *ops)
88 {
89 	struct AvbOpsData *data;
90 
91 	if (ops) {
92 		data = ops->user_data;
93 		if (data)
94 			return data->mmc_dev;
95 	}
96 
97 	return -1;
98 }
99 
100 #endif /* _AVB_VERIFY_H */
101