13af30e44SIgor Opaniuk
23af30e44SIgor Opaniuk /*
33af30e44SIgor Opaniuk * (C) Copyright 2018, Linaro Limited
43af30e44SIgor Opaniuk *
53af30e44SIgor Opaniuk * SPDX-License-Identifier: GPL-2.0+
63af30e44SIgor Opaniuk */
73af30e44SIgor Opaniuk
83af30e44SIgor Opaniuk #ifndef _AVB_VERIFY_H
93af30e44SIgor Opaniuk #define _AVB_VERIFY_H
103af30e44SIgor Opaniuk
113af30e44SIgor Opaniuk #include <../lib/libavb/libavb.h>
12*bbddbef9SJens Wiklander #include <mapmem.h>
133af30e44SIgor Opaniuk #include <mmc.h>
143af30e44SIgor Opaniuk
155d4fd877SIgor Opaniuk #define AVB_MAX_ARGS 1024
165d4fd877SIgor Opaniuk #define VERITY_TABLE_OPT_RESTART "restart_on_corruption"
175d4fd877SIgor Opaniuk #define VERITY_TABLE_OPT_LOGGING "ignore_corruption"
183af30e44SIgor Opaniuk #define ALLOWED_BUF_ALIGN 8
193af30e44SIgor Opaniuk
205d4fd877SIgor Opaniuk enum avb_boot_state {
215d4fd877SIgor Opaniuk AVB_GREEN,
225d4fd877SIgor Opaniuk AVB_YELLOW,
235d4fd877SIgor Opaniuk AVB_ORANGE,
245d4fd877SIgor Opaniuk AVB_RED,
255d4fd877SIgor Opaniuk };
265d4fd877SIgor Opaniuk
273af30e44SIgor Opaniuk struct AvbOpsData {
283af30e44SIgor Opaniuk struct AvbOps ops;
293af30e44SIgor Opaniuk int mmc_dev;
305d4fd877SIgor Opaniuk enum avb_boot_state boot_state;
316663e074SJens Wiklander #ifdef CONFIG_OPTEE_TA_AVB
326663e074SJens Wiklander struct udevice *tee;
336663e074SJens Wiklander u32 session;
346663e074SJens Wiklander #endif
353af30e44SIgor Opaniuk };
363af30e44SIgor Opaniuk
373af30e44SIgor Opaniuk struct mmc_part {
383af30e44SIgor Opaniuk int dev_num;
393af30e44SIgor Opaniuk struct mmc *mmc;
403af30e44SIgor Opaniuk struct blk_desc *mmc_blk;
413af30e44SIgor Opaniuk disk_partition_t info;
423af30e44SIgor Opaniuk };
433af30e44SIgor Opaniuk
443af30e44SIgor Opaniuk enum mmc_io_type {
453af30e44SIgor Opaniuk IO_READ,
463af30e44SIgor Opaniuk IO_WRITE
473af30e44SIgor Opaniuk };
483af30e44SIgor Opaniuk
493af30e44SIgor Opaniuk AvbOps *avb_ops_alloc(int boot_device);
503af30e44SIgor Opaniuk void avb_ops_free(AvbOps *ops);
513af30e44SIgor Opaniuk
525d4fd877SIgor Opaniuk char *avb_set_state(AvbOps *ops, enum avb_boot_state boot_state);
535d4fd877SIgor Opaniuk char *avb_set_enforce_verity(const char *cmdline);
545d4fd877SIgor Opaniuk char *avb_set_ignore_corruption(const char *cmdline);
555d4fd877SIgor Opaniuk
565d4fd877SIgor Opaniuk char *append_cmd_line(char *cmdline_orig, char *cmdline_new);
575d4fd877SIgor Opaniuk
583af30e44SIgor Opaniuk /**
593af30e44SIgor Opaniuk * ============================================================================
603af30e44SIgor Opaniuk * I/O helper inline functions
613af30e44SIgor Opaniuk * ============================================================================
623af30e44SIgor Opaniuk */
calc_offset(struct mmc_part * part,int64_t offset)633af30e44SIgor Opaniuk static inline uint64_t calc_offset(struct mmc_part *part, int64_t offset)
643af30e44SIgor Opaniuk {
653af30e44SIgor Opaniuk u64 part_size = part->info.size * part->info.blksz;
663af30e44SIgor Opaniuk
673af30e44SIgor Opaniuk if (offset < 0)
683af30e44SIgor Opaniuk return part_size + offset;
693af30e44SIgor Opaniuk
703af30e44SIgor Opaniuk return offset;
713af30e44SIgor Opaniuk }
723af30e44SIgor Opaniuk
get_sector_buf_size(void)733af30e44SIgor Opaniuk static inline size_t get_sector_buf_size(void)
743af30e44SIgor Opaniuk {
753af30e44SIgor Opaniuk return (size_t)CONFIG_FASTBOOT_BUF_SIZE;
763af30e44SIgor Opaniuk }
773af30e44SIgor Opaniuk
get_sector_buf(void)783af30e44SIgor Opaniuk static inline void *get_sector_buf(void)
793af30e44SIgor Opaniuk {
80*bbddbef9SJens Wiklander return map_sysmem(CONFIG_FASTBOOT_BUF_ADDR, CONFIG_FASTBOOT_BUF_SIZE);
813af30e44SIgor Opaniuk }
823af30e44SIgor Opaniuk
is_buf_unaligned(void * buffer)833af30e44SIgor Opaniuk static inline bool is_buf_unaligned(void *buffer)
843af30e44SIgor Opaniuk {
853af30e44SIgor Opaniuk return (bool)((uintptr_t)buffer % ALLOWED_BUF_ALIGN);
863af30e44SIgor Opaniuk }
873af30e44SIgor Opaniuk
get_boot_device(AvbOps * ops)883af30e44SIgor Opaniuk static inline int get_boot_device(AvbOps *ops)
893af30e44SIgor Opaniuk {
903af30e44SIgor Opaniuk struct AvbOpsData *data;
913af30e44SIgor Opaniuk
923af30e44SIgor Opaniuk if (ops) {
933af30e44SIgor Opaniuk data = ops->user_data;
943af30e44SIgor Opaniuk if (data)
953af30e44SIgor Opaniuk return data->mmc_dev;
963af30e44SIgor Opaniuk }
973af30e44SIgor Opaniuk
983af30e44SIgor Opaniuk return -1;
993af30e44SIgor Opaniuk }
1003af30e44SIgor Opaniuk
1013af30e44SIgor Opaniuk #endif /* _AVB_VERIFY_H */
102