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