summaryrefslogtreecommitdiff
path: root/arch/powerpc/platforms/pseries/vas.h
blob: 7115043ec488307658e9a9a8fdb9b653848abaad (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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Copyright 2020-21 IBM Corp.
 */

#ifndef _VAS_H
#define _VAS_H
#include <asm/vas.h>
#include <linux/mutex.h>
#include <linux/stringify.h>

/*
 * VAS window modify flags
 */
#define VAS_MOD_WIN_CLOSE	PPC_BIT(0)
#define VAS_MOD_WIN_JOBS_KILL	PPC_BIT(1)
#define VAS_MOD_WIN_DR		PPC_BIT(3)
#define VAS_MOD_WIN_PR		PPC_BIT(4)
#define VAS_MOD_WIN_SF		PPC_BIT(5)
#define VAS_MOD_WIN_TA		PPC_BIT(6)
#define VAS_MOD_WIN_FLAGS	(VAS_MOD_WIN_JOBS_KILL | VAS_MOD_WIN_DR | \
				VAS_MOD_WIN_PR | VAS_MOD_WIN_SF)

#define VAS_WIN_ACTIVE		0x0
#define VAS_WIN_CLOSED		0x1
#define VAS_WIN_INACTIVE	0x2	/* Inactive due to HW failure */
/* Process of being modified, deallocated, or quiesced */
#define VAS_WIN_MOD_IN_PROCESS	0x3

#define VAS_COPY_PASTE_USER_MODE	0x00000001
#define VAS_COP_OP_USER_MODE		0x00000010

#define VAS_GZIP_QOS_CAPABILITIES	0x56516F73477A6970
#define VAS_GZIP_DEFAULT_CAPABILITIES	0x56446566477A6970

enum vas_migrate_action {
	VAS_SUSPEND,
	VAS_RESUME,
};

/*
 * Co-processor feature - GZIP QoS windows or GZIP default windows
 */
enum vas_cop_feat_type {
	VAS_GZIP_QOS_FEAT_TYPE,
	VAS_GZIP_DEF_FEAT_TYPE,
	VAS_MAX_FEAT_TYPE,
};

/*
 * Use to get feature specific capabilities from the
 * hypervisor.
 */
struct hv_vas_cop_feat_caps {
	__be64	descriptor;
	u8	win_type;		/* Default or QoS type */
	u8	user_mode;
	__be16	max_lpar_creds;
	__be16	max_win_creds;
	union {
		__be16	reserved;
		__be16	def_lpar_creds; /* Used for default capabilities */
	};
	__be16	target_lpar_creds;
} __packed __aligned(0x1000);

/*
 * Feature specific (QoS or default) capabilities.
 */
struct vas_cop_feat_caps {
	u64		descriptor;
	u8		win_type;	/* Default or QoS type */
	u8		user_mode;	/* User mode copy/paste or COP HCALL */
	u16		max_lpar_creds;	/* Max credits available in LPAR */
	/* Max credits can be assigned per window */
	u16		max_win_creds;
	union {
		u16	reserved;	/* Used for QoS credit type */
		u16	def_lpar_creds; /* Used for default credit type */
	};
	/* Total LPAR available credits. Can be different from max LPAR */
	/* credits due to DLPAR operation */
	atomic_t	nr_total_credits;	/* Total credits assigned to LPAR */
	atomic_t	nr_used_credits;	/* Used credits so far */
};

/*
 * Feature (QoS or Default) specific to store capabilities and
 * the list of open windows.
 */
struct vas_caps {
	struct vas_cop_feat_caps caps;
	struct list_head list;	/* List of open windows */
	int nr_close_wins;	/* closed windows in the hypervisor for DLPAR */
	int nr_open_windows;	/* Number of successful open windows */
	u8 feat;		/* Feature type */
};

/*
 * To get window information from the hypervisor.
 */
struct hv_vas_win_lpar {
	__be16	version;
	u8	win_type;
	u8	status;
	__be16	credits;	/* No of credits assigned to this window */
	__be16	reserved;
	__be32	pid;		/* LPAR Process ID */
	__be32	tid;		/* LPAR Thread ID */
	__be64	win_addr;	/* Paste address */
	__be32	interrupt;	/* Interrupt when NX request completes */
	__be32	fault;		/* Interrupt when NX sees fault */
	/* Associativity Domain Identifiers as returned in */
	/* H_HOME_NODE_ASSOCIATIVITY */
	__be64	domain[6];
	__be64	win_util;	/* Number of bytes processed */
} __packed __aligned(0x1000);

struct pseries_vas_window {
	struct vas_window vas_win;
	u64 win_addr;		/* Physical paste address */
	u8 win_type;		/* QoS or Default window */
	u32 complete_irq;	/* Completion interrupt */
	u32 fault_irq;		/* Fault interrupt */
	u64 domain[6];		/* Associativity domain Ids */
				/* this window is allocated */
	u64 util;
	u32 pid;		/* PID associated with this window */

	/* List of windows opened which is used for LPM */
	struct list_head win_list;
	u64 flags;
	char *name;
	int fault_virq;
	atomic_t pending_faults; /* Number of pending faults */
};

int sysfs_add_vas_caps(struct vas_cop_feat_caps *caps);
int vas_reconfig_capabilties(u8 type, int new_nr_creds);
int __init sysfs_pseries_vas_init(struct vas_all_caps *vas_caps);

#ifdef CONFIG_PPC_VAS
int vas_migration_handler(int action);
int pseries_vas_dlpar_cpu(void);
#else
static inline int vas_migration_handler(int action)
{
	return 0;
}
static inline int pseries_vas_dlpar_cpu(void)
{
	return 0;
}
#endif
#endif /* _VAS_H */