xref: /openbmc/linux/arch/s390/include/asm/appldata.h (revision 2612e3bbc0386368a850140a6c9b990cd496a5ec)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2c6557e7fSMartin Schwidefsky /*
3a53c8fabSHeiko Carstens  * Copyright IBM Corp. 2006
4c6557e7fSMartin Schwidefsky  *
5c6557e7fSMartin Schwidefsky  * Author(s): Melissa Howland <melissah@us.ibm.com>
6c6557e7fSMartin Schwidefsky  */
7c6557e7fSMartin Schwidefsky 
8c6557e7fSMartin Schwidefsky #ifndef _ASM_S390_APPLDATA_H
9c6557e7fSMartin Schwidefsky #define _ASM_S390_APPLDATA_H
10c6557e7fSMartin Schwidefsky 
11*b378a982SHeiko Carstens #include <linux/io.h>
121ec2772eSMartin Schwidefsky #include <asm/diag.h>
13c6557e7fSMartin Schwidefsky 
14c6557e7fSMartin Schwidefsky #define APPLDATA_START_INTERVAL_REC	0x80
15c6557e7fSMartin Schwidefsky #define APPLDATA_STOP_REC		0x81
16c6557e7fSMartin Schwidefsky #define APPLDATA_GEN_EVENT_REC		0x82
17c6557e7fSMartin Schwidefsky #define APPLDATA_START_CONFIG_REC	0x83
18c6557e7fSMartin Schwidefsky 
19c6557e7fSMartin Schwidefsky /*
20c6557e7fSMartin Schwidefsky  * Parameter list for DIAGNOSE X'DC'
21c6557e7fSMartin Schwidefsky  */
22c6557e7fSMartin Schwidefsky struct appldata_parameter_list {
23c6557e7fSMartin Schwidefsky 	u16 diag;
24c6557e7fSMartin Schwidefsky 	u8  function;
25c6557e7fSMartin Schwidefsky 	u8  parlist_length;
26c6557e7fSMartin Schwidefsky 	u32 unused01;
27c6557e7fSMartin Schwidefsky 	u16 reserved;
28c6557e7fSMartin Schwidefsky 	u16 buffer_length;
29c6557e7fSMartin Schwidefsky 	u32 unused02;
30c6557e7fSMartin Schwidefsky 	u64 product_id_addr;
31c6557e7fSMartin Schwidefsky 	u64 buffer_addr;
32c6557e7fSMartin Schwidefsky } __attribute__ ((packed));
33c6557e7fSMartin Schwidefsky 
34c6557e7fSMartin Schwidefsky struct appldata_product_id {
35c6557e7fSMartin Schwidefsky 	char prod_nr[7];	/* product number */
36c6557e7fSMartin Schwidefsky 	u16  prod_fn;		/* product function */
37c6557e7fSMartin Schwidefsky 	u8   record_nr; 	/* record number */
38c6557e7fSMartin Schwidefsky 	u16  version_nr;	/* version */
39c6557e7fSMartin Schwidefsky 	u16  release_nr;	/* release */
40c6557e7fSMartin Schwidefsky 	u16  mod_lvl;		/* modification level */
41c6557e7fSMartin Schwidefsky } __attribute__ ((packed));
42c6557e7fSMartin Schwidefsky 
43f689789aSMartin Schwidefsky 
appldata_asm(struct appldata_parameter_list * parm_list,struct appldata_product_id * id,unsigned short fn,void * buffer,unsigned short length)44f689789aSMartin Schwidefsky static inline int appldata_asm(struct appldata_parameter_list *parm_list,
45f689789aSMartin Schwidefsky 			       struct appldata_product_id *id,
46c6557e7fSMartin Schwidefsky 			       unsigned short fn, void *buffer,
47c6557e7fSMartin Schwidefsky 			       unsigned short length)
48c6557e7fSMartin Schwidefsky {
49c6557e7fSMartin Schwidefsky 	int ry;
50c6557e7fSMartin Schwidefsky 
51c6557e7fSMartin Schwidefsky 	if (!MACHINE_IS_VM)
52a11b2ef7SHeiko Carstens 		return -EOPNOTSUPP;
53f689789aSMartin Schwidefsky 	parm_list->diag = 0xdc;
54f689789aSMartin Schwidefsky 	parm_list->function = fn;
55f689789aSMartin Schwidefsky 	parm_list->parlist_length = sizeof(*parm_list);
56f689789aSMartin Schwidefsky 	parm_list->buffer_length = length;
57f689789aSMartin Schwidefsky 	parm_list->product_id_addr = (unsigned long) id;
58f689789aSMartin Schwidefsky 	parm_list->buffer_addr = virt_to_phys(buffer);
591ec2772eSMartin Schwidefsky 	diag_stat_inc(DIAG_STAT_X0DC);
60c6557e7fSMartin Schwidefsky 	asm volatile(
61c6557e7fSMartin Schwidefsky 		"	diag	%1,%0,0xdc"
62c6557e7fSMartin Schwidefsky 		: "=d" (ry)
63f689789aSMartin Schwidefsky 		: "d" (parm_list), "m" (*parm_list), "m" (*id)
64c6557e7fSMartin Schwidefsky 		: "cc");
65c6557e7fSMartin Schwidefsky 	return ry;
66c6557e7fSMartin Schwidefsky }
67c6557e7fSMartin Schwidefsky 
68c6557e7fSMartin Schwidefsky #endif /* _ASM_S390_APPLDATA_H */
69