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 18enum avb_boot_state { 19 AVB_GREEN, 20 AVB_YELLOW, 21 AVB_ORANGE, 22 AVB_RED, 23}; 24 25struct 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 35struct mmc_part { 36 int dev_num; 37 struct mmc *mmc; 38 struct blk_desc *mmc_blk; 39 struct disk_partition info; 40}; 41 42enum mmc_io_type { 43 IO_READ, 44 IO_WRITE 45}; 46 47AvbOps *avb_ops_alloc(int boot_device); 48void avb_ops_free(AvbOps *ops); 49 50char *avb_set_state(AvbOps *ops, enum avb_boot_state boot_state); 51char *avb_set_enforce_verity(const char *cmdline); 52char *avb_set_ignore_corruption(const char *cmdline); 53 54char *append_cmd_line(char *cmdline_orig, char *cmdline_new); 55const char *str_avb_io_error(AvbIOResult res); 56const char *str_avb_slot_error(AvbSlotVerifyResult res); 57/** 58 * ============================================================================ 59 * I/O helper inline functions 60 * ============================================================================ 61 */ 62static 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 72static inline size_t get_sector_buf_size(void) 73{ 74 return (size_t)CONFIG_AVB_BUF_SIZE; 75} 76 77static inline void *get_sector_buf(void) 78{ 79 return map_sysmem(CONFIG_AVB_BUF_ADDR, CONFIG_AVB_BUF_SIZE); 80} 81 82static inline bool is_buf_unaligned(void *buffer) 83{ 84 return (bool)((uintptr_t)buffer % ALLOWED_BUF_ALIGN); 85} 86 87static 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