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 */ 22struct 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 */ 42struct 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 56struct 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 65static 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