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