summaryrefslogtreecommitdiff
path: root/arch/powerpc/platforms/pseries/papr-rtas-common.h
blob: 4ceabcaf4905e2f4148dd32bd3ec730790cc69f0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef _ASM_POWERPC_PAPR_RTAS_COMMON_H
#define _ASM_POWERPC_PAPR_RTAS_COMMON_H

#include <linux/types.h>

/*
 * Return codes for sequence based RTAS calls.
 * Not listed under PAPR+ v2.13 7.2.8: "Return Codes".
 * But defined in the specific section of each RTAS call.
 */
#define RTAS_SEQ_COMPLETE	0 /* All data has been retrieved. */
#define RTAS_SEQ_MORE_DATA	1 /* More data is available */
#define RTAS_SEQ_START_OVER	-4 /* Data changed, restart call sequence. */

/*
 * Internal "blob" APIs for accumulating RTAS call results into
 * an immutable buffer to be attached to a file descriptor.
 */
struct papr_rtas_blob {
	const char *data;
	size_t len;
};

/**
 * struct papr_sequence - State for managing a sequence of RTAS calls.
 * @error:  Shall be zero as long as the sequence has not encountered an error,
 *          -ve errno otherwise. Use papr_rtas_sequence_set_err() to update.
 * @params: Parameter block to pass to rtas_*() calls.
 * @begin: Work area allocation and initialize the needed parameter
 *         values passed to RTAS call
 * @end: Free the allocated work area
 * @work: Obtain data with RTAS call and invoke it until the sequence is
 *        completed.
 *
 */
struct papr_rtas_sequence {
	int error;
	void *params;
	void (*begin)(struct papr_rtas_sequence *seq);
	void (*end)(struct papr_rtas_sequence *seq);
	const char *(*work)(struct papr_rtas_sequence *seq, size_t *len);
};

extern bool papr_rtas_blob_has_data(const struct papr_rtas_blob *blob);
extern void papr_rtas_blob_free(const struct papr_rtas_blob *blob);
extern int papr_rtas_sequence_set_err(struct papr_rtas_sequence *seq,
		int err);
extern const struct papr_rtas_blob *papr_rtas_retrieve(struct papr_rtas_sequence *seq);
extern long papr_rtas_setup_file_interface(struct papr_rtas_sequence *seq,
			const struct file_operations *fops, char *name);
extern bool papr_rtas_sequence_should_stop(const struct papr_rtas_sequence *seq,
				s32 status, bool init_state);
extern ssize_t papr_rtas_common_handle_read(struct file *file,
			char __user *buf, size_t size, loff_t *off);
extern int papr_rtas_common_handle_release(struct inode *inode,
					struct file *file);
extern loff_t papr_rtas_common_handle_seek(struct file *file, loff_t off,
					int whence);
#endif /* _ASM_POWERPC_PAPR_RTAS_COMMON_H */