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