M7350/kernel/drivers/gud/mobicore_driver/mem.h
2024-09-09 08:52:07 +00:00

129 lines
3.8 KiB
C

/*
* MobiCore driver module.(interface to the secure world SWD)
*
* <-- Copyright Giesecke & Devrient GmbH 2009-2012 -->
* <-- Copyright Trustonic Limited 2013 -->
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#ifndef _MC_MEM_H_
#define _MC_MEM_H_
#define FREE_FROM_SWD 1
#define FREE_FROM_NWD 0
#define LOCKED_BY_APP (1U << 0)
#define LOCKED_BY_MC (1U << 1)
/*
* MobiCore specific page tables for world shared memory.
* Linux uses shadow page tables, see arch/arm/include/asm/pgtable-2level.
* MobiCore uses the default ARM format.
*
* Number of page table entries in one L2 table. This is ARM specific, an
* L2 table covers 1 MiB by using 256 entry referring to 4KiB pages each.
*/
#define MC_ARM_L2_TABLE_ENTRIES 256
/* ARM level 2 (L2) table with 256 entries. Size: 1k */
struct l2table {
pte_t table_entries[MC_ARM_L2_TABLE_ENTRIES];
};
/* Number of pages for L2 tables. There are 4 table in each page. */
#define L2_TABLES_PER_PAGE 4
/* Store for four L2 tables in one 4kb page*/
struct mc_l2_table_store {
struct l2table table[L2_TABLES_PER_PAGE];
};
/* Usage and maintenance information about mc_l2_table_store */
struct mc_l2_tables_set {
struct list_head list;
/* kernel virtual address */
struct mc_l2_table_store *kernel_virt;
/* physical address */
struct mc_l2_table_store *phys;
/* pointer to page struct */
struct page *page;
/* How many pages from this set are used */
atomic_t used_tables;
};
/*
* L2 table allocated to the Daemon or a TLC describing a world shared buffer.
* When users map a malloc()ed area into SWd, a L2 table is allocated.
* In addition, the area of maximum 1MB virtual address space is mapped into
* the L2 table and a handle for this table is returned to the user.
*/
struct mc_l2_table {
struct list_head list;
/* Table lock */
struct mutex lock;
/* handle as communicated to user mode */
unsigned int handle;
/* Number of references kept to this l2 table */
atomic_t usage;
/* owner of this L2 table */
struct mc_instance *owner;
/* set describing where our L2 table is stored */
struct mc_l2_tables_set *set;
/* index into L2 table set */
unsigned int idx;
/* size of buffer */
unsigned int pages;
/* virtual address*/
void *virt;
unsigned long phys;
};
/* MobiCore Driver Memory context data. */
struct mc_mem_context {
struct mc_instance *daemon_inst;
/* Backing store for L2 tables */
struct list_head l2_tables_sets;
/* Bookkeeping for used L2 tables */
struct list_head l2_tables;
/* Bookkeeping for free L2 tables */
struct list_head free_l2_tables;
/* semaphore to synchronize access to above lists */
struct mutex table_lock;
};
/*
* Allocate L2 table and map buffer into it.
* That is, create respective table entries.
*/
struct mc_l2_table *mc_alloc_l2_table(struct mc_instance *instance,
struct task_struct *task, void *wsm_buffer, unsigned int wsm_len);
/* Delete all the l2 tables associated with an instance */
void mc_clear_l2_tables(struct mc_instance *instance);
/* Release all orphaned L2 tables */
void mc_clean_l2_tables(void);
/* Delete a used l2 table. */
int mc_free_l2_table(struct mc_instance *instance, uint32_t handle);
/*
* Lock a l2 table - the daemon adds +1 to refcount of the L2 table
* marking it in use by SWD so it doesn't get released when the TLC dies.
*/
int mc_lock_l2_table(struct mc_instance *instance, uint32_t handle);
/* Unlock l2 table. */
int mc_unlock_l2_table(struct mc_instance *instance, uint32_t handle);
/* Return the phys address of l2 table. */
uint32_t mc_find_l2_table(uint32_t handle, int32_t fd);
/* Release all used l2 tables to Linux memory space */
void mc_release_l2_tables(void);
/* Initialize all l2 tables structure */
int mc_init_l2_tables(void);
#endif /* _MC_MEM_H_ */