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