Blame view

kernel/linux-imx6_3.14.28/drivers/crypto/caam/sm.h 4.48 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
  
  /*
   * CAAM Secure Memory/Keywrap API Definitions
   * Copyright (C) 2008-2015 Freescale Semiconductor, Inc.
   */
  
  #ifndef SM_H
  #define SM_H
  
  
  /* Storage access permissions */
  #define SM_PERM_READ 0x01
  #define SM_PERM_WRITE 0x02
  #define SM_PERM_BLOB 0x03
  
  /* Define treatment of secure memory vs. general memory blobs */
  #define SM_SECMEM 0
  #define SM_GENMEM 1
  
  /* Define treatment of red/black keys */
  #define RED_KEY 0
  #define BLACK_KEY 1
  
  /* Define key encryption/covering options */
  #define KEY_COVER_ECB 0	/* cover key in AES-ECB */
  #define KEY_COVER_CCM 1 /* cover key with AES-CCM */
  
  /*
   * Round a key size up to an AES blocksize boundary so to allow for
   * padding out to a full block
   */
  #define AES_BLOCK_PAD(x) ((x % 16) ? ((x >> 4) + 1) << 4 : x)
  
  /* Define space required for BKEK + MAC tag storage in any blob */
  #define BLOB_OVERHEAD (32 + 16)
  
  /* Keystore maintenance functions */
  void sm_init_keystore(struct device *dev);
  u32 sm_detect_keystore_units(struct device *dev);
  int sm_establish_keystore(struct device *dev, u32 unit);
  void sm_release_keystore(struct device *dev, u32 unit);
  void caam_sm_shutdown(struct platform_device *pdev);
  int caam_sm_example_init(struct platform_device *pdev);
  
  /* Keystore accessor functions */
  extern int sm_keystore_slot_alloc(struct device *dev, u32 unit, u32 size,
  				  u32 *slot);
  extern int sm_keystore_slot_dealloc(struct device *dev, u32 unit, u32 slot);
  extern int sm_keystore_slot_load(struct device *dev, u32 unit, u32 slot,
  				 const u8 *key_data, u32 key_length);
  extern int sm_keystore_slot_read(struct device *dev, u32 unit, u32 slot,
  				 u32 key_length, u8 *key_data);
  extern int sm_keystore_cover_key(struct device *dev, u32 unit, u32 slot,
  				 u16 key_length, u8 keyauth);
  extern int sm_keystore_slot_export(struct device *dev, u32 unit, u32 slot,
  				   u8 keycolor, u8 keyauth, u8 *outbuf,
  				   u16 keylen, u8 *keymod);
  extern int sm_keystore_slot_import(struct device *dev, u32 unit, u32 slot,
  				   u8 keycolor, u8 keyauth, u8 *inbuf,
  				   u16 keylen, u8 *keymod);
  
  /* Prior functions from legacy API, deprecated */
  extern int sm_keystore_slot_encapsulate(struct device *dev, u32 unit,
  					u32 inslot, u32 outslot, u16 secretlen,
  					u8 *keymod, u16 keymodlen);
  extern int sm_keystore_slot_decapsulate(struct device *dev, u32 unit,
  					u32 inslot, u32 outslot, u16 secretlen,
  					u8 *keymod, u16 keymodlen);
  
  /* Data structure to hold per-slot information */
  struct keystore_data_slot_info {
  	u8	allocated;	/* Track slot assignments */
  	u32	key_length;	/* Size of the key */
  };
  
  /* Data structure to hold keystore information */
  struct keystore_data {
  	void	*base_address;	/* Virtual base of secure memory pages */
  	void	*phys_address;	/* Physical base of secure memory pages */
  	u32	slot_count;	/* Number of slots in the keystore */
  	struct keystore_data_slot_info *slot; /* Per-slot information */
  };
  
  /* store the detected attributes of a secure memory page */
  struct sm_page_descriptor {
  	u16 phys_pagenum;	/* may be discontiguous */
  	u16 own_part;		/* Owning partition */
  	void *pg_base;		/* Calculated virtual address */
  	void *pg_phys;		/* Calculated physical address */
  	struct keystore_data *ksdata;
  };
  
  struct caam_drv_private_sm {
  	struct device *parentdev;	/* this ends up as the controller */
  	struct device *smringdev;	/* ring that owns this instance */
  	struct platform_device *sm_pdev;  /* Secure Memory platform device */
  	spinlock_t kslock ____cacheline_aligned;
  
  	/* Default parameters for geometry */
  	u32 max_pages;		/* maximum pages this instance can support */
  	u32 top_partition;	/* highest partition number in this instance */
  	u32 top_page;		/* highest page number in this instance */
  	u32 page_size;		/* page size */
  	u32 slot_size;		/* selected size of each storage block */
  
  	/* Partition/Page Allocation Map */
  	u32 localpages;		/* Number of pages we can access */
  	struct sm_page_descriptor *pagedesc;	/* Allocated per-page */
  
  	/* Installed handlers for keystore access */
  	int (*data_init)(struct device *dev, u32 unit);
  	void (*data_cleanup)(struct device *dev, u32 unit);
  	int (*slot_alloc)(struct device *dev, u32 unit, u32 size, u32 *slot);
  	int (*slot_dealloc)(struct device *dev, u32 unit, u32 slot);
  	void *(*slot_get_address)(struct device *dev, u32 unit, u32 handle);
  	void *(*slot_get_physical)(struct device *dev, u32 unit, u32 handle);
  	u32 (*slot_get_base)(struct device *dev, u32 unit, u32 handle);
  	u32 (*slot_get_offset)(struct device *dev, u32 unit, u32 handle);
  	u32 (*slot_get_slot_size)(struct device *dev, u32 unit, u32 handle);
  };
  
  #endif /* SM_H */