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