|  | /* | 
|  | * include/asm-s390/appldata.h | 
|  | * | 
|  | * Copyright (C) IBM Corp. 2006 | 
|  | * | 
|  | * Author(s): Melissa Howland <melissah@us.ibm.com> | 
|  | */ | 
|  |  | 
|  | #ifndef _ASM_S390_APPLDATA_H | 
|  | #define _ASM_S390_APPLDATA_H | 
|  |  | 
|  | #include <asm/io.h> | 
|  |  | 
|  | #ifndef CONFIG_64BIT | 
|  |  | 
|  | #define APPLDATA_START_INTERVAL_REC	0x00	/* Function codes for */ | 
|  | #define APPLDATA_STOP_REC		0x01	/* DIAG 0xDC	      */ | 
|  | #define APPLDATA_GEN_EVENT_REC		0x02 | 
|  | #define APPLDATA_START_CONFIG_REC	0x03 | 
|  |  | 
|  | /* | 
|  | * Parameter list for DIAGNOSE X'DC' | 
|  | */ | 
|  | struct appldata_parameter_list { | 
|  | u16 diag;		/* The DIAGNOSE code X'00DC'	      */ | 
|  | u8  function;		/* The function code for the DIAGNOSE */ | 
|  | u8  parlist_length;	/* Length of the parameter list       */ | 
|  | u32 product_id_addr;	/* Address of the 16-byte product ID  */ | 
|  | u16 reserved; | 
|  | u16 buffer_length;	/* Length of the application data buffer  */ | 
|  | u32 buffer_addr;	/* Address of the application data buffer */ | 
|  | } __attribute__ ((packed)); | 
|  |  | 
|  | #else /* CONFIG_64BIT */ | 
|  |  | 
|  | #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)); | 
|  |  | 
|  | #endif /* CONFIG_64BIT */ | 
|  |  | 
|  | 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_product_id *id, | 
|  | unsigned short fn, void *buffer, | 
|  | unsigned short length) | 
|  | { | 
|  | struct appldata_parameter_list parm_list; | 
|  | int ry; | 
|  |  | 
|  | if (!MACHINE_IS_VM) | 
|  | return -ENOSYS; | 
|  | 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 = (unsigned long) id; | 
|  | parm_list.buffer_addr = virt_to_phys(buffer); | 
|  | asm volatile( | 
|  | "	diag	%1,%0,0xdc" | 
|  | : "=d" (ry) | 
|  | : "d" (&parm_list), "m" (parm_list), "m" (*id) | 
|  | : "cc"); | 
|  | return ry; | 
|  | } | 
|  |  | 
|  | #endif /* _ASM_S390_APPLDATA_H */ |