mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-04 09:34:12 +08:00
s390/zcrypt: externalize AP config info query
KVM has a need to fetch the crypto configuration information as it is returned by the PQAP(QCI) instruction. This patch introduces a new API ap_query_configuration() which provides this info in a handy way for the caller. Signed-off-by: Harald Freudenberger <freude@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
e7fc5146cf
commit
050349b5b7
@ -61,4 +61,30 @@ struct ap_queue_status ap_test_queue(ap_qid_t qid,
|
|||||||
int tbit,
|
int tbit,
|
||||||
unsigned long *info);
|
unsigned long *info);
|
||||||
|
|
||||||
|
struct ap_config_info {
|
||||||
|
unsigned int apsc : 1; /* S bit */
|
||||||
|
unsigned int apxa : 1; /* N bit */
|
||||||
|
unsigned int qact : 1; /* C bit */
|
||||||
|
unsigned int rc8a : 1; /* R bit */
|
||||||
|
unsigned char _reserved1 : 4;
|
||||||
|
unsigned char _reserved2[3];
|
||||||
|
unsigned char Na; /* max # of APs - 1 */
|
||||||
|
unsigned char Nd; /* max # of Domains - 1 */
|
||||||
|
unsigned char _reserved3[10];
|
||||||
|
unsigned int apm[8]; /* AP ID mask */
|
||||||
|
unsigned int aqm[8]; /* AP queue mask */
|
||||||
|
unsigned int adm[8]; /* AP domain mask */
|
||||||
|
unsigned char _reserved4[16];
|
||||||
|
} __aligned(8);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ap_query_configuration(): Fetch cryptographic config info
|
||||||
|
*
|
||||||
|
* Returns the ap configuration info fetched via PQAP(QCI).
|
||||||
|
* On success 0 is returned, on failure a negative errno
|
||||||
|
* is returned, e.g. if the PQAP(QCI) instruction is not
|
||||||
|
* available, the return value will be -EOPNOTSUPP.
|
||||||
|
*/
|
||||||
|
int ap_query_configuration(struct ap_config_info *info);
|
||||||
|
|
||||||
#endif /* _ASM_S390_AP_H_ */
|
#endif /* _ASM_S390_AP_H_ */
|
||||||
|
@ -194,12 +194,23 @@ struct ap_queue_status ap_test_queue(ap_qid_t qid,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ap_test_queue);
|
EXPORT_SYMBOL(ap_test_queue);
|
||||||
|
|
||||||
static inline int ap_query_configuration(void)
|
/*
|
||||||
|
* ap_query_configuration(): Fetch cryptographic config info
|
||||||
|
*
|
||||||
|
* Returns the ap configuration info fetched via PQAP(QCI).
|
||||||
|
* On success 0 is returned, on failure a negative errno
|
||||||
|
* is returned, e.g. if the PQAP(QCI) instruction is not
|
||||||
|
* available, the return value will be -EOPNOTSUPP.
|
||||||
|
*/
|
||||||
|
int ap_query_configuration(struct ap_config_info *info)
|
||||||
{
|
{
|
||||||
if (!ap_configuration)
|
if (!ap_configuration_available())
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
return ap_qci(ap_configuration);
|
if (!info)
|
||||||
|
return -EINVAL;
|
||||||
|
return ap_qci(info);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(ap_query_configuration);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ap_init_configuration(): Allocate and query configuration array.
|
* ap_init_configuration(): Allocate and query configuration array.
|
||||||
@ -212,7 +223,7 @@ static void ap_init_configuration(void)
|
|||||||
ap_configuration = kzalloc(sizeof(*ap_configuration), GFP_KERNEL);
|
ap_configuration = kzalloc(sizeof(*ap_configuration), GFP_KERNEL);
|
||||||
if (!ap_configuration)
|
if (!ap_configuration)
|
||||||
return;
|
return;
|
||||||
if (ap_query_configuration() != 0) {
|
if (ap_query_configuration(ap_configuration) != 0) {
|
||||||
kfree(ap_configuration);
|
kfree(ap_configuration);
|
||||||
ap_configuration = NULL;
|
ap_configuration = NULL;
|
||||||
return;
|
return;
|
||||||
@ -1009,7 +1020,7 @@ static void ap_scan_bus(struct work_struct *unused)
|
|||||||
|
|
||||||
AP_DBF(DBF_DEBUG, "ap_scan_bus running\n");
|
AP_DBF(DBF_DEBUG, "ap_scan_bus running\n");
|
||||||
|
|
||||||
ap_query_configuration();
|
ap_query_configuration(ap_configuration);
|
||||||
if (ap_select_domain() != 0)
|
if (ap_select_domain() != 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
@ -204,17 +204,6 @@ struct ap_message {
|
|||||||
struct ap_message *);
|
struct ap_message *);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ap_config_info {
|
|
||||||
unsigned int special_command:1;
|
|
||||||
unsigned int ap_extended:1;
|
|
||||||
unsigned char reserved1:6;
|
|
||||||
unsigned char reserved2[15];
|
|
||||||
unsigned int apm[8]; /* AP ID mask */
|
|
||||||
unsigned int aqm[8]; /* AP queue mask */
|
|
||||||
unsigned int adm[8]; /* AP domain mask */
|
|
||||||
unsigned char reserved4[16];
|
|
||||||
} __packed;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ap_init_message() - Initialize ap_message.
|
* ap_init_message() - Initialize ap_message.
|
||||||
* Initialize a message before using. Otherwise this might result in
|
* Initialize a message before using. Otherwise this might result in
|
||||||
|
Loading…
Reference in New Issue
Block a user