mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2025-11-24 06:15:46 +00:00
Until now the papr_sysparm APIs have been kernel-internal. But user space needs access to PAPR system parameters too. The only method available to user space today to get or set system parameters is using sys_rtas() and /dev/mem to pass RTAS-addressable buffers between user space and firmware. This is incompatible with lockdown and should be deprecated. So provide an alternative ABI to user space in the form of a /dev/papr-sysparm character device with just two ioctl commands (get and set). The data payloads involved are small enough to fit in the ioctl argument buffer, making the code relatively simple. Exposing the system parameters through sysfs has been considered but it would be too awkward: * The kernel currently does not have to contain an exhaustive list of defined system parameters. This is a convenient property to maintain because we don't have to update the kernel whenever a new parameter is added to PAPR. Exporting a named attribute in sysfs for each parameter would negate this. * Some system parameters are text-based and some are not. * Retrieval of at least one system parameter requires input data, which a simple read-oriented interface can't support. Signed-off-by: Nathan Lynch <nathanl@linux.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://msgid.link/20231212-papr-sys_rtas-vs-lockdown-v6-11-e9eafd0c8c6c@linux.ibm.com
44 lines
1.5 KiB
C
44 lines
1.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
#ifndef _ASM_POWERPC_PAPR_SYSPARM_H
|
|
#define _ASM_POWERPC_PAPR_SYSPARM_H
|
|
|
|
#include <uapi/asm/papr-sysparm.h>
|
|
|
|
typedef struct {
|
|
u32 token;
|
|
} papr_sysparm_t;
|
|
|
|
#define mk_papr_sysparm(x_) ((papr_sysparm_t){ .token = x_, })
|
|
|
|
/*
|
|
* Derived from the "Defined Parameters" table in PAPR 7.3.16 System
|
|
* Parameters Option. Where the spec says "characteristics", we use
|
|
* "attrs" in the symbolic names to keep them from getting too
|
|
* unwieldy.
|
|
*/
|
|
#define PAPR_SYSPARM_SHARED_PROC_LPAR_ATTRS mk_papr_sysparm(20)
|
|
#define PAPR_SYSPARM_PROC_MODULE_INFO mk_papr_sysparm(43)
|
|
#define PAPR_SYSPARM_COOP_MEM_OVERCOMMIT_ATTRS mk_papr_sysparm(44)
|
|
#define PAPR_SYSPARM_TLB_BLOCK_INVALIDATE_ATTRS mk_papr_sysparm(50)
|
|
#define PAPR_SYSPARM_LPAR_NAME mk_papr_sysparm(55)
|
|
|
|
/**
|
|
* struct papr_sysparm_buf - RTAS work area layout for system parameter functions.
|
|
*
|
|
* This is the memory layout of the buffers passed to/from
|
|
* ibm,get-system-parameter and ibm,set-system-parameter. It is
|
|
* distinct from the papr_sysparm_io_block structure that is passed
|
|
* between user space and the kernel.
|
|
*/
|
|
struct papr_sysparm_buf {
|
|
__be16 len;
|
|
char val[PAPR_SYSPARM_MAX_OUTPUT];
|
|
};
|
|
|
|
struct papr_sysparm_buf *papr_sysparm_buf_alloc(void);
|
|
void papr_sysparm_buf_free(struct papr_sysparm_buf *buf);
|
|
int papr_sysparm_set(papr_sysparm_t param, const struct papr_sysparm_buf *buf);
|
|
int papr_sysparm_get(papr_sysparm_t param, struct papr_sysparm_buf *buf);
|
|
|
|
#endif /* _ASM_POWERPC_PAPR_SYSPARM_H */
|