18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright IBM Corp. 2006 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Author(s): Melissa Howland <melissah@us.ibm.com> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#ifndef _ASM_S390_APPLDATA_H 98c2ecf20Sopenharmony_ci#define _ASM_S390_APPLDATA_H 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <asm/diag.h> 128c2ecf20Sopenharmony_ci#include <asm/io.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#define APPLDATA_START_INTERVAL_REC 0x80 158c2ecf20Sopenharmony_ci#define APPLDATA_STOP_REC 0x81 168c2ecf20Sopenharmony_ci#define APPLDATA_GEN_EVENT_REC 0x82 178c2ecf20Sopenharmony_ci#define APPLDATA_START_CONFIG_REC 0x83 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci/* 208c2ecf20Sopenharmony_ci * Parameter list for DIAGNOSE X'DC' 218c2ecf20Sopenharmony_ci */ 228c2ecf20Sopenharmony_cistruct appldata_parameter_list { 238c2ecf20Sopenharmony_ci u16 diag; 248c2ecf20Sopenharmony_ci u8 function; 258c2ecf20Sopenharmony_ci u8 parlist_length; 268c2ecf20Sopenharmony_ci u32 unused01; 278c2ecf20Sopenharmony_ci u16 reserved; 288c2ecf20Sopenharmony_ci u16 buffer_length; 298c2ecf20Sopenharmony_ci u32 unused02; 308c2ecf20Sopenharmony_ci u64 product_id_addr; 318c2ecf20Sopenharmony_ci u64 buffer_addr; 328c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_cistruct appldata_product_id { 358c2ecf20Sopenharmony_ci char prod_nr[7]; /* product number */ 368c2ecf20Sopenharmony_ci u16 prod_fn; /* product function */ 378c2ecf20Sopenharmony_ci u8 record_nr; /* record number */ 388c2ecf20Sopenharmony_ci u16 version_nr; /* version */ 398c2ecf20Sopenharmony_ci u16 release_nr; /* release */ 408c2ecf20Sopenharmony_ci u16 mod_lvl; /* modification level */ 418c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_cistatic inline int appldata_asm(struct appldata_parameter_list *parm_list, 458c2ecf20Sopenharmony_ci struct appldata_product_id *id, 468c2ecf20Sopenharmony_ci unsigned short fn, void *buffer, 478c2ecf20Sopenharmony_ci unsigned short length) 488c2ecf20Sopenharmony_ci{ 498c2ecf20Sopenharmony_ci int ry; 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci if (!MACHINE_IS_VM) 528c2ecf20Sopenharmony_ci return -EOPNOTSUPP; 538c2ecf20Sopenharmony_ci parm_list->diag = 0xdc; 548c2ecf20Sopenharmony_ci parm_list->function = fn; 558c2ecf20Sopenharmony_ci parm_list->parlist_length = sizeof(*parm_list); 568c2ecf20Sopenharmony_ci parm_list->buffer_length = length; 578c2ecf20Sopenharmony_ci parm_list->product_id_addr = (unsigned long) id; 588c2ecf20Sopenharmony_ci parm_list->buffer_addr = virt_to_phys(buffer); 598c2ecf20Sopenharmony_ci diag_stat_inc(DIAG_STAT_X0DC); 608c2ecf20Sopenharmony_ci asm volatile( 618c2ecf20Sopenharmony_ci " diag %1,%0,0xdc" 628c2ecf20Sopenharmony_ci : "=d" (ry) 638c2ecf20Sopenharmony_ci : "d" (parm_list), "m" (*parm_list), "m" (*id) 648c2ecf20Sopenharmony_ci : "cc"); 658c2ecf20Sopenharmony_ci return ry; 668c2ecf20Sopenharmony_ci} 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci#endif /* _ASM_S390_APPLDATA_H */ 69