GNU Linux-libre 4.19.264-gnu1
[releases.git] / drivers / s390 / crypto / zcrypt_api.h
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  *  zcrypt 2.1.0
4  *
5  *  Copyright IBM Corp. 2001, 2012
6  *  Author(s): Robert Burroughs
7  *             Eric Rossman (edrossma@us.ibm.com)
8  *             Cornelia Huck <cornelia.huck@de.ibm.com>
9  *
10  *  Hotplug & misc device support: Jochen Roehrig (roehrig@de.ibm.com)
11  *  Major cleanup & driver split: Martin Schwidefsky <schwidefsky@de.ibm.com>
12  *                                Ralph Wuerthner <rwuerthn@de.ibm.com>
13  *  MSGTYPE restruct:             Holger Dengler <hd@linux.vnet.ibm.com>
14  */
15
16 #ifndef _ZCRYPT_API_H_
17 #define _ZCRYPT_API_H_
18
19 #include <linux/atomic.h>
20 #include <asm/debug.h>
21 #include <asm/zcrypt.h>
22 #include "ap_bus.h"
23
24 /**
25  * device type for an actual device is either PCICA, PCICC, PCIXCC_MCL2,
26  * PCIXCC_MCL3, CEX2C, or CEX2A
27  *
28  * NOTE: PCIXCC_MCL3 refers to a PCIXCC with May 2004 version of Licensed
29  *       Internal Code (LIC) (EC J12220 level 29).
30  *       PCIXCC_MCL2 refers to any LIC before this level.
31  */
32 #define ZCRYPT_PCICA            1
33 #define ZCRYPT_PCICC            2
34 #define ZCRYPT_PCIXCC_MCL2      3
35 #define ZCRYPT_PCIXCC_MCL3      4
36 #define ZCRYPT_CEX2C            5
37 #define ZCRYPT_CEX2A            6
38 #define ZCRYPT_CEX3C            7
39 #define ZCRYPT_CEX3A            8
40 #define ZCRYPT_CEX4            10
41 #define ZCRYPT_CEX5            11
42 #define ZCRYPT_CEX6            12
43
44 /**
45  * Large random numbers are pulled in 4096 byte chunks from the crypto cards
46  * and stored in a page. Be careful when increasing this buffer due to size
47  * limitations for AP requests.
48  */
49 #define ZCRYPT_RNG_BUFFER_SIZE  4096
50
51 /*
52  * Identifier for Crypto Request Performance Index
53  */
54 enum crypto_ops {
55         MEX_1K,
56         MEX_2K,
57         MEX_4K,
58         CRT_1K,
59         CRT_2K,
60         CRT_4K,
61         HWRNG,
62         SECKEY,
63         NUM_OPS
64 };
65
66 struct zcrypt_queue;
67
68 struct zcrypt_ops {
69         long (*rsa_modexpo)(struct zcrypt_queue *, struct ica_rsa_modexpo *);
70         long (*rsa_modexpo_crt)(struct zcrypt_queue *,
71                                 struct ica_rsa_modexpo_crt *);
72         long (*send_cprb)(struct zcrypt_queue *, struct ica_xcRB *,
73                           struct ap_message *);
74         long (*send_ep11_cprb)(struct zcrypt_queue *, struct ep11_urb *,
75                                struct ap_message *);
76         long (*rng)(struct zcrypt_queue *, char *, struct ap_message *);
77         struct list_head list;          /* zcrypt ops list. */
78         struct module *owner;
79         int variant;
80         char name[128];
81 };
82
83 struct zcrypt_card {
84         struct list_head list;          /* Device list. */
85         struct list_head zqueues;       /* List of zcrypt queues */
86         struct kref refcount;           /* device refcounting */
87         struct ap_card *card;           /* The "real" ap card device. */
88         int online;                     /* User online/offline */
89
90         int user_space_type;            /* User space device id. */
91         char *type_string;              /* User space device name. */
92         int min_mod_size;               /* Min number of bits. */
93         int max_mod_size;               /* Max number of bits. */
94         int max_exp_bit_length;
95         int speed_rating[NUM_OPS];      /* Speed idx of crypto ops. */
96         atomic_t load;                  /* Utilization of the crypto device */
97
98         int request_count;              /* # current requests. */
99 };
100
101 struct zcrypt_queue {
102         struct list_head list;          /* Device list. */
103         struct kref refcount;           /* device refcounting */
104         struct zcrypt_card *zcard;
105         struct zcrypt_ops *ops;         /* Crypto operations. */
106         struct ap_queue *queue;         /* The "real" ap queue device. */
107         int online;                     /* User online/offline */
108
109         atomic_t load;                  /* Utilization of the crypto device */
110
111         int request_count;              /* # current requests. */
112
113         struct ap_message reply;        /* Per-device reply structure. */
114 };
115
116 /* transport layer rescanning */
117 extern atomic_t zcrypt_rescan_req;
118
119 extern spinlock_t zcrypt_list_lock;
120 extern int zcrypt_device_count;
121 extern struct list_head zcrypt_card_list;
122
123 #define for_each_zcrypt_card(_zc) \
124         list_for_each_entry(_zc, &zcrypt_card_list, list)
125
126 #define for_each_zcrypt_queue(_zq, _zc) \
127         list_for_each_entry(_zq, &(_zc)->zqueues, list)
128
129 struct zcrypt_card *zcrypt_card_alloc(void);
130 void zcrypt_card_free(struct zcrypt_card *);
131 void zcrypt_card_get(struct zcrypt_card *);
132 int zcrypt_card_put(struct zcrypt_card *);
133 int zcrypt_card_register(struct zcrypt_card *);
134 void zcrypt_card_unregister(struct zcrypt_card *);
135 struct zcrypt_card *zcrypt_card_get_best(unsigned int *,
136                                          unsigned int, unsigned int);
137 void zcrypt_card_put_best(struct zcrypt_card *, unsigned int);
138
139 struct zcrypt_queue *zcrypt_queue_alloc(size_t);
140 void zcrypt_queue_free(struct zcrypt_queue *);
141 void zcrypt_queue_get(struct zcrypt_queue *);
142 int zcrypt_queue_put(struct zcrypt_queue *);
143 int zcrypt_queue_register(struct zcrypt_queue *);
144 void zcrypt_queue_unregister(struct zcrypt_queue *);
145 void zcrypt_queue_force_online(struct zcrypt_queue *, int);
146 struct zcrypt_queue *zcrypt_queue_get_best(unsigned int, unsigned int);
147 void  zcrypt_queue_put_best(struct zcrypt_queue *, unsigned int);
148
149 int zcrypt_rng_device_add(void);
150 void zcrypt_rng_device_remove(void);
151
152 void zcrypt_msgtype_register(struct zcrypt_ops *);
153 void zcrypt_msgtype_unregister(struct zcrypt_ops *);
154 struct zcrypt_ops *zcrypt_msgtype(unsigned char *, int);
155 int zcrypt_api_init(void);
156 void zcrypt_api_exit(void);
157 long zcrypt_send_cprb(struct ica_xcRB *xcRB);
158 void zcrypt_device_status_mask_ext(struct zcrypt_device_status_ext *devstatus);
159
160 #endif /* _ZCRYPT_API_H_ */