blob: 1e787ba666872a200c97053f8ef723460bc21a2a [file] [log] [blame]
Igor Opaniukbb4aac42018-06-03 21:56:38 +03001
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>
Jens Wiklander179c1d82018-09-25 16:40:22 +020012#include <mapmem.h>
Igor Opaniukbb4aac42018-06-03 21:56:38 +030013#include <mmc.h>
14
Igor Opaniukf0f3bfe2018-06-03 21:56:40 +030015#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
20enum avb_boot_state {
21 AVB_GREEN,
22 AVB_YELLOW,
23 AVB_ORANGE,
24 AVB_RED,
25};
Igor Opaniukbb4aac42018-06-03 21:56:38 +030026
27struct AvbOpsData {
28 struct AvbOps ops;
29 int mmc_dev;
Igor Opaniukf0f3bfe2018-06-03 21:56:40 +030030 enum avb_boot_state boot_state;
Jens Wiklander838c70c2018-09-25 16:40:20 +020031#ifdef CONFIG_OPTEE_TA_AVB
32 struct udevice *tee;
33 u32 session;
34#endif
Igor Opaniukbb4aac42018-06-03 21:56:38 +030035};
36
37struct mmc_part {
38 int dev_num;
39 struct mmc *mmc;
40 struct blk_desc *mmc_blk;
Simon Glassc1c4a8f2020-05-10 11:39:57 -060041 struct disk_partition info;
Igor Opaniukbb4aac42018-06-03 21:56:38 +030042};
43
44enum mmc_io_type {
45 IO_READ,
46 IO_WRITE
47};
48
49AvbOps *avb_ops_alloc(int boot_device);
50void avb_ops_free(AvbOps *ops);
51
Igor Opaniukf0f3bfe2018-06-03 21:56:40 +030052char *avb_set_state(AvbOps *ops, enum avb_boot_state boot_state);
53char *avb_set_enforce_verity(const char *cmdline);
54char *avb_set_ignore_corruption(const char *cmdline);
55
56char *append_cmd_line(char *cmdline_orig, char *cmdline_new);
57
Igor Opaniukbb4aac42018-06-03 21:56:38 +030058/**
59 * ============================================================================
60 * I/O helper inline functions
61 * ============================================================================
62 */
63static 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
73static inline size_t get_sector_buf_size(void)
74{
Usama Arifdf348b02020-08-11 15:46:03 +010075 return (size_t)CONFIG_AVB_BUF_SIZE;
Igor Opaniukbb4aac42018-06-03 21:56:38 +030076}
77
78static inline void *get_sector_buf(void)
79{
Usama Arifdf348b02020-08-11 15:46:03 +010080 return map_sysmem(CONFIG_AVB_BUF_ADDR, CONFIG_AVB_BUF_SIZE);
Igor Opaniukbb4aac42018-06-03 21:56:38 +030081}
82
83static inline bool is_buf_unaligned(void *buffer)
84{
85 return (bool)((uintptr_t)buffer % ALLOWED_BUF_ALIGN);
86}
87
88static 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 */