exynos-linux-stable/include/linux/rkp.h

218 lines
5 KiB
C
Raw Permalink Normal View History

#ifndef _RKP_H
#define _RKP_H
#ifndef __ASSEMBLY__
/* uH_RKP Command ID */
enum __RKP_CMD_ID {
RKP_START = 1,
RKP_DEFERRED_START,
RKP_WRITE_PGT1,
RKP_WRITE_PGT2,
RKP_WRITE_PGT3,
RKP_EMULT_TTBR0,
RKP_EMULT_TTBR1,
RKP_EMULT_DORESUME,
RKP_FREE_PGD,
RKP_NEW_PGD,
RKP_KASLR_MEM,
RKP_FIMC_VERIFY, /* CFP cmds */
RKP_JOPP_INIT,
RKP_ROPP_INIT,
RKP_ROPP_SAVE,
RKP_ROPP_RELOAD,
/* and KDT cmds */
RKP_NOSHIP,
#ifdef CONFIG_RKP_TEST
CMD_ID_TEST_GET_PAR = 0x81,
CMD_ID_TEST_GET_RO = 0x83,
CMD_ID_TEST_GET_VA_XN,
CMD_ID_TEST_GET_VMM_INFO,
#endif
RKP_MAX
};
#define RKP_PREFIX UL(0x83800000)
#ifdef CONFIG_RKP_TEST
#define RKP_INIT_MAGIC 0x5afe0002
#else
#define RKP_INIT_MAGIC 0x5afe0001
#endif
#define RKP_VMM_BUFFER 0x600000
#define RKP_RO_BUFFER UL(0x800000)
#define RKP_FIMC_FAIL 0x10
#define RKP_FIMC_SUCCESS 0xa5
/* For 8G RAM */
#ifdef CONFIG_UH_RKP_8G
#define RKP_EXTRA_MEM_START (0xAF600000)
#define RKP_PGT_BITMAP_LEN (0x40000)
#define RKP_ROBUF_SIZE (18ULL << 20)
#else
#define RKP_EXTRA_MEM_START (0xAF800000)
#define RKP_PGT_BITMAP_LEN (0x30000)
#define RKP_ROBUF_SIZE (16ULL << 20)
#endif
#define RKP_EXTRA_MEM_SIZE (0x600000)
#define RKP_ROBUF_START (0xB0800000)
#define RKP_REGION_START (RKP_EXTRA_MEM_START)
#define RKP_REGION_SIZE (RKP_REGION_START - RKP_ROBUF_START + RKP_ROBUF_SIZE)
#define RKP_RBUF_VA (phys_to_virt(RKP_ROBUF_START))
#define RO_PAGES (RKP_ROBUF_SIZE >> PAGE_SHIFT) // (RKP_ROBUF_SIZE/PAGE_SIZE)
#define CRED_JAR_RO "cred_jar_ro"
#define TSEC_JAR "tsec_jar"
#define VFSMNT_JAR "vfsmnt_cache"
#ifdef CONFIG_KNOX_KAP
extern int boot_mode_security;
#endif
extern u8 rkp_pgt_bitmap[];
extern u8 rkp_map_bitmap[];
extern u8 __rkp_start_prot_page[];
extern u8 __rkp_end_prot_page[];
typedef struct rkp_init rkp_init_t;
extern u8 rkp_started;
void *rkp_ro_alloc(void);
void rkp_ro_free(void *free_addr);
unsigned int is_rkp_ro_page(u64 addr);
struct rkp_init { //copy from uh (app/rkp/rkp.h)
u32 magic;
u64 vmalloc_start;
u64 vmalloc_end;
u64 init_mm_pgd;
u64 id_map_pgd;
u64 zero_pg_addr;
u64 rkp_pgt_bitmap;
u64 rkp_dbl_bitmap;
u32 rkp_bitmap_size;
u32 rkp_prot_page_size;
u32 fimc_type;
u64 fimc_phys_addr;
u64 _text;
u64 _etext;
u64 extra_memory_addr;
u32 extra_memory_size;
u64 physmap_addr; //not used. what is this for?
u64 _srodata;
u64 _erodata;
u32 large_memory;
u64 tramp_pgd;
u64 tramp_valias;
};
#ifdef CONFIG_RKP_KDP
typedef struct kdp_init_struct {
u32 credSize;
u32 sp_size;
u32 pgd_mm;
u32 uid_cred;
u32 euid_cred;
u32 gid_cred;
u32 egid_cred;
u32 bp_pgd_cred;
u32 bp_task_cred;
u32 type_cred;
u32 security_cred;
u32 usage_cred;
u32 cred_task;
u32 mm_task;
u32 pid_task;
u32 rp_task;
u32 comm_task;
u32 bp_cred_secptr;
u64 verifiedbootstate;
} kdp_init_t;
#endif /* CONFIG_RKP_KDP */
#ifdef CONFIG_RKP_NS_PROT
typedef struct ns_param {
u32 ns_buff_size;
u32 ns_size;
u32 bp_offset;
u32 sb_offset;
u32 flag_offset;
u32 data_offset;
}ns_param_t;
#define rkp_ns_fill_params(nsparam,buff_size,size,bp,sb,flag,data) \
do { \
nsparam.ns_buff_size = (u64)buff_size; \
nsparam.ns_size = (u64)size; \
nsparam.bp_offset = (u64)bp; \
nsparam.sb_offset = (u64)sb; \
nsparam.flag_offset = (u64)flag; \
nsparam.data_offset = (u64)data; \
} while(0)
#endif
#define rkp_is_pg_protected(va) rkp_is_protected(va, __pa(va), (u64 *)rkp_pgt_bitmap, 1)
#define rkp_is_pg_dbl_mapped(pa) rkp_is_protected((u64)__va(pa), pa, (u64 *)rkp_map_bitmap, 0)
#define RKP_PHYS_ADDR_MASK ((1ULL << 40)-1)
/*
* The following all assume PHYS_OFFSET is fix addr
*/
#define PHYS_PFN_OFFSET_MIN_DRAM1 (0x80000ULL)
#define PHYS_PFN_OFFSET_MAX_DRAM1 (0x100000ULL)
#define PHYS_PFN_OFFSET_MIN_DRAM2 (0x880000ULL)
#ifdef CONFIG_UH_RKP_8G
#define PHYS_PFN_OFFSET_MAX_DRAM2 (0xA00000ULL)
#else
#define PHYS_PFN_OFFSET_MAX_DRAM2 (0x980000ULL)
#endif
#define DRAM_PFN_GAP (PHYS_PFN_OFFSET_MIN_DRAM2 - PHYS_PFN_OFFSET_MAX_DRAM1)
#define FIMC_LIB_OFFSET_VA (VMALLOC_START + 0xF6000000 - 0x8000000)
#define FIMC_LIB_START_VA (FIMC_LIB_OFFSET_VA + 0x04000000)
#define FIMC_VRA_LIB_SIZE (0x80000)
#define FIMC_DDK_LIB_SIZE (0x400000)
#define FIMC_RTA_LIB_SIZE (0x300000)
#define FIMC_LIB_SIZE (FIMC_VRA_LIB_SIZE + FIMC_DDK_LIB_SIZE + FIMC_RTA_LIB_SIZE)
static inline u64 rkp_get_sys_index(u64 pfn)
{
if (pfn >= PHYS_PFN_OFFSET_MIN_DRAM1
&& pfn < PHYS_PFN_OFFSET_MAX_DRAM1) {
return ((pfn) - PHYS_PFN_OFFSET);
}
if (pfn >= PHYS_PFN_OFFSET_MIN_DRAM2
&& pfn < PHYS_PFN_OFFSET_MAX_DRAM2) {
return ((pfn) - PHYS_PFN_OFFSET - DRAM_PFN_GAP);
}
return (~0ULL);
}
static inline u8 rkp_is_protected(u64 va, u64 pa, u64 *base_addr, u64 type)
{
u64 phys_addr = pa & (RKP_PHYS_ADDR_MASK);
u64 *p = base_addr;
u64 rindex;
u8 val;
u64 index = rkp_get_sys_index((phys_addr>>PAGE_SHIFT));
if (index == (~0ULL))
return 0;
p += (index>>6);
rindex = index % 64;
val = (((*p) & (1ULL<<rindex))?1:0);
return val;
}
#endif //__ASSEMBLY__
#endif //_RKP_H