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 #ifndef CONFIG_64BIT 13 14 #define APPLDATA_START_INTERVAL_REC 0x00 /* Function codes for */ 15 #define APPLDATA_STOP_REC 0x01 /* DIAG 0xDC */ 16 #define APPLDATA_GEN_EVENT_REC 0x02 17 #define APPLDATA_START_CONFIG_REC 0x03 18 19 /* 20 * Parameter list for DIAGNOSE X'DC' 21 */ 22 struct appldata_parameter_list { 23 u16 diag; /* The DIAGNOSE code X'00DC' */ 24 u8 function; /* The function code for the DIAGNOSE */ 25 u8 parlist_length; /* Length of the parameter list */ 26 u32 product_id_addr; /* Address of the 16-byte product ID */ 27 u16 reserved; 28 u16 buffer_length; /* Length of the application data buffer */ 29 u32 buffer_addr; /* Address of the application data buffer */ 30 } __attribute__ ((packed)); 31 32 #else /* CONFIG_64BIT */ 33 34 #define APPLDATA_START_INTERVAL_REC 0x80 35 #define APPLDATA_STOP_REC 0x81 36 #define APPLDATA_GEN_EVENT_REC 0x82 37 #define APPLDATA_START_CONFIG_REC 0x83 38 39 /* 40 * Parameter list for DIAGNOSE X'DC' 41 */ 42 struct appldata_parameter_list { 43 u16 diag; 44 u8 function; 45 u8 parlist_length; 46 u32 unused01; 47 u16 reserved; 48 u16 buffer_length; 49 u32 unused02; 50 u64 product_id_addr; 51 u64 buffer_addr; 52 } __attribute__ ((packed)); 53 54 #endif /* CONFIG_64BIT */ 55 56 struct appldata_product_id { 57 char prod_nr[7]; /* product number */ 58 u16 prod_fn; /* product function */ 59 u8 record_nr; /* record number */ 60 u16 version_nr; /* version */ 61 u16 release_nr; /* release */ 62 u16 mod_lvl; /* modification level */ 63 } __attribute__ ((packed)); 64 65 static inline int appldata_asm(struct appldata_product_id *id, 66 unsigned short fn, void *buffer, 67 unsigned short length) 68 { 69 struct appldata_parameter_list parm_list; 70 int ry; 71 72 if (!MACHINE_IS_VM) 73 return -EOPNOTSUPP; 74 parm_list.diag = 0xdc; 75 parm_list.function = fn; 76 parm_list.parlist_length = sizeof(parm_list); 77 parm_list.buffer_length = length; 78 parm_list.product_id_addr = (unsigned long) id; 79 parm_list.buffer_addr = virt_to_phys(buffer); 80 asm volatile( 81 " diag %1,%0,0xdc" 82 : "=d" (ry) 83 : "d" (&parm_list), "m" (parm_list), "m" (*id) 84 : "cc"); 85 return ry; 86 } 87 88 #endif /* _ASM_S390_APPLDATA_H */ 89