| /* SPDX-License-Identifier: GPL-2.0 */ |
| /* |
| * Copyright IBM Corp. 2006 |
| * |
| * Author(s): Melissa Howland <melissah@us.ibm.com> |
| */ |
| |
| #ifndef _ASM_S390_APPLDATA_H |
| #define _ASM_S390_APPLDATA_H |
| |
| #include <linux/io.h> |
| #include <asm/diag.h> |
| |
| #define APPLDATA_START_INTERVAL_REC 0x80 |
| #define APPLDATA_STOP_REC 0x81 |
| #define APPLDATA_GEN_EVENT_REC 0x82 |
| #define APPLDATA_START_CONFIG_REC 0x83 |
| |
| /* |
| * Parameter list for DIAGNOSE X'DC' |
| */ |
| struct appldata_parameter_list { |
| u16 diag; |
| u8 function; |
| u8 parlist_length; |
| u32 unused01; |
| u16 reserved; |
| u16 buffer_length; |
| u32 unused02; |
| u64 product_id_addr; |
| u64 buffer_addr; |
| } __attribute__ ((packed)); |
| |
| struct appldata_product_id { |
| char prod_nr[7]; /* product number */ |
| u16 prod_fn; /* product function */ |
| u8 record_nr; /* record number */ |
| u16 version_nr; /* version */ |
| u16 release_nr; /* release */ |
| u16 mod_lvl; /* modification level */ |
| } __attribute__ ((packed)); |
| |
| |
| static inline int appldata_asm(struct appldata_parameter_list *parm_list, |
| struct appldata_product_id *id, |
| unsigned short fn, void *buffer, |
| unsigned short length) |
| { |
| int ry; |
| |
| if (!MACHINE_IS_VM) |
| return -EOPNOTSUPP; |
| parm_list->diag = 0xdc; |
| parm_list->function = fn; |
| parm_list->parlist_length = sizeof(*parm_list); |
| parm_list->buffer_length = length; |
| parm_list->product_id_addr = virt_to_phys(id); |
| parm_list->buffer_addr = virt_to_phys(buffer); |
| diag_stat_inc(DIAG_STAT_X0DC); |
| asm volatile( |
| " diag %1,%0,0xdc" |
| : "=d" (ry) |
| : "d" (virt_to_phys(parm_list)), "m" (*parm_list), "m" (*id) |
| : "cc"); |
| return ry; |
| } |
| |
| #endif /* _ASM_S390_APPLDATA_H */ |