1783a015bSLeonardo Bras /* SPDX-License-Identifier: GPL-2.0-or-later */
2783a015bSLeonardo Bras #ifndef _ASM_POWERPC_RTAS_TYPES_H
3783a015bSLeonardo Bras #define _ASM_POWERPC_RTAS_TYPES_H
4783a015bSLeonardo Bras 
5783a015bSLeonardo Bras #include <linux/spinlock_types.h>
6783a015bSLeonardo Bras 
7783a015bSLeonardo Bras typedef __be32 rtas_arg_t;
8783a015bSLeonardo Bras 
9783a015bSLeonardo Bras struct rtas_args {
10783a015bSLeonardo Bras 	__be32 token;
11783a015bSLeonardo Bras 	__be32 nargs;
12783a015bSLeonardo Bras 	__be32 nret;
13783a015bSLeonardo Bras 	rtas_arg_t args[16];
14783a015bSLeonardo Bras 	rtas_arg_t *rets;     /* Pointer to return values in args[]. */
15783a015bSLeonardo Bras };
16783a015bSLeonardo Bras 
17783a015bSLeonardo Bras struct rtas_t {
18783a015bSLeonardo Bras 	unsigned long entry;		/* physical address pointer */
19783a015bSLeonardo Bras 	unsigned long base;		/* physical address pointer */
20783a015bSLeonardo Bras 	unsigned long size;
21783a015bSLeonardo Bras 	arch_spinlock_t lock;
22783a015bSLeonardo Bras 	struct rtas_args args;
23783a015bSLeonardo Bras 	struct device_node *dev;	/* virtual address pointer */
24783a015bSLeonardo Bras };
25783a015bSLeonardo Bras 
26783a015bSLeonardo Bras struct rtas_suspend_me_data {
27783a015bSLeonardo Bras 	atomic_t working; /* number of cpus accessing this struct */
28783a015bSLeonardo Bras 	atomic_t done;
29783a015bSLeonardo Bras 	int token; /* ibm,suspend-me */
30783a015bSLeonardo Bras 	atomic_t error;
31783a015bSLeonardo Bras 	struct completion *complete; /* wait on this until working == 0 */
32783a015bSLeonardo Bras };
33783a015bSLeonardo Bras 
34783a015bSLeonardo Bras struct rtas_error_log {
35783a015bSLeonardo Bras 	/* Byte 0 */
36783a015bSLeonardo Bras 	u8		byte0;			/* Architectural version */
37783a015bSLeonardo Bras 
38783a015bSLeonardo Bras 	/* Byte 1 */
39783a015bSLeonardo Bras 	u8		byte1;
40783a015bSLeonardo Bras 	/* XXXXXXXX
41783a015bSLeonardo Bras 	 * XXX		3: Severity level of error
42783a015bSLeonardo Bras 	 *    XX	2: Degree of recovery
43783a015bSLeonardo Bras 	 *      X	1: Extended log present?
44783a015bSLeonardo Bras 	 *       XX	2: Reserved
45783a015bSLeonardo Bras 	 */
46783a015bSLeonardo Bras 
47783a015bSLeonardo Bras 	/* Byte 2 */
48783a015bSLeonardo Bras 	u8		byte2;
49783a015bSLeonardo Bras 	/* XXXXXXXX
50783a015bSLeonardo Bras 	 * XXXX		4: Initiator of event
51783a015bSLeonardo Bras 	 *     XXXX	4: Target of failed operation
52783a015bSLeonardo Bras 	 */
53783a015bSLeonardo Bras 	u8		byte3;			/* General event or error*/
54783a015bSLeonardo Bras 	__be32		extended_log_length;	/* length in bytes */
55783a015bSLeonardo Bras 	unsigned char	buffer[1];		/* Start of extended log */
56783a015bSLeonardo Bras 						/* Variable length.      */
57783a015bSLeonardo Bras };
58783a015bSLeonardo Bras 
59783a015bSLeonardo Bras /* RTAS general extended event log, Version 6. The extended log starts
60783a015bSLeonardo Bras  * from "buffer" field of struct rtas_error_log defined above.
61783a015bSLeonardo Bras  */
62783a015bSLeonardo Bras struct rtas_ext_event_log_v6 {
63783a015bSLeonardo Bras 	/* Byte 0 */
64783a015bSLeonardo Bras 	u8 byte0;
65783a015bSLeonardo Bras 	/* XXXXXXXX
66783a015bSLeonardo Bras 	 * X		1: Log valid
67783a015bSLeonardo Bras 	 *  X		1: Unrecoverable error
68783a015bSLeonardo Bras 	 *   X		1: Recoverable (correctable or successfully retried)
69783a015bSLeonardo Bras 	 *    X		1: Bypassed unrecoverable error (degraded operation)
70783a015bSLeonardo Bras 	 *     X	1: Predictive error
71783a015bSLeonardo Bras 	 *      X	1: "New" log (always 1 for data returned from RTAS)
72783a015bSLeonardo Bras 	 *       X	1: Big Endian
73783a015bSLeonardo Bras 	 *        X	1: Reserved
74783a015bSLeonardo Bras 	 */
75783a015bSLeonardo Bras 
76783a015bSLeonardo Bras 	/* Byte 1 */
77783a015bSLeonardo Bras 	u8 byte1;			/* reserved */
78783a015bSLeonardo Bras 
79783a015bSLeonardo Bras 	/* Byte 2 */
80783a015bSLeonardo Bras 	u8 byte2;
81783a015bSLeonardo Bras 	/* XXXXXXXX
82783a015bSLeonardo Bras 	 * X		1: Set to 1 (indicating log is in PowerPC format)
83783a015bSLeonardo Bras 	 *  XXX		3: Reserved
84783a015bSLeonardo Bras 	 *     XXXX	4: Log format used for bytes 12-2047
85783a015bSLeonardo Bras 	 */
86783a015bSLeonardo Bras 
87783a015bSLeonardo Bras 	/* Byte 3 */
88783a015bSLeonardo Bras 	u8 byte3;			/* reserved */
89783a015bSLeonardo Bras 	/* Byte 4-11 */
90783a015bSLeonardo Bras 	u8 reserved[8];			/* reserved */
91783a015bSLeonardo Bras 	/* Byte 12-15 */
92783a015bSLeonardo Bras 	__be32  company_id;		/* Company ID of the company	*/
93783a015bSLeonardo Bras 					/* that defines the format for	*/
94783a015bSLeonardo Bras 					/* the vendor specific log type	*/
95783a015bSLeonardo Bras 	/* Byte 16-end of log */
96783a015bSLeonardo Bras 	u8 vendor_log[1];		/* Start of vendor specific log	*/
97783a015bSLeonardo Bras 					/* Variable length.		*/
98783a015bSLeonardo Bras };
99783a015bSLeonardo Bras 
100783a015bSLeonardo Bras /* Vendor specific Platform Event Log Format, Version 6, section header */
101783a015bSLeonardo Bras struct pseries_errorlog {
102783a015bSLeonardo Bras 	__be16 id;			/* 0x00 2-byte ASCII section ID	*/
103783a015bSLeonardo Bras 	__be16 length;			/* 0x02 Section length in bytes	*/
104783a015bSLeonardo Bras 	u8 version;			/* 0x04 Section version		*/
105783a015bSLeonardo Bras 	u8 subtype;			/* 0x05 Section subtype		*/
106783a015bSLeonardo Bras 	__be16 creator_component;	/* 0x06 Creator component ID	*/
107783a015bSLeonardo Bras 	u8 data[];			/* 0x08 Start of section data	*/
108783a015bSLeonardo Bras };
109783a015bSLeonardo Bras 
110783a015bSLeonardo Bras /* RTAS pseries hotplug errorlog section */
111783a015bSLeonardo Bras struct pseries_hp_errorlog {
112783a015bSLeonardo Bras 	u8	resource;
113783a015bSLeonardo Bras 	u8	action;
114783a015bSLeonardo Bras 	u8	id_type;
115783a015bSLeonardo Bras 	u8	reserved;
116783a015bSLeonardo Bras 	union {
117783a015bSLeonardo Bras 		__be32	drc_index;
118783a015bSLeonardo Bras 		__be32	drc_count;
119783a015bSLeonardo Bras 		struct { __be32 count, index; } ic;
120783a015bSLeonardo Bras 		char	drc_name[1];
121783a015bSLeonardo Bras 	} _drc_u;
122783a015bSLeonardo Bras };
123783a015bSLeonardo Bras 
124783a015bSLeonardo Bras #endif /* _ASM_POWERPC_RTAS_TYPES_H */
125