forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
powerpc/pseries/papr-sysparm: expose chardev API to user space
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 <[email protected]>
- Loading branch information
1 parent
36a5129
commit 27c13dc
Showing
4 changed files
with
229 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -351,6 +351,8 @@ Code Seq# Include File Comments | |
<mailto:[email protected]> | ||
0xB2 00 arch/powerpc/include/uapi/asm/papr-vpd.h powerpc/pseries VPD API | ||
<mailto:linuxppc-dev> | ||
0xB2 01-02 arch/powerpc/include/uapi/asm/papr-sysparm.h powerpc/pseries system parameter API | ||
<mailto:linuxppc-dev> | ||
0xB3 00 linux/mmc/ioctl.h | ||
0xB4 00-0F linux/gpio.h <mailto:[email protected]> | ||
0xB5 00-0F uapi/linux/rpmsg.h <mailto:[email protected]> | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ | ||
#ifndef _UAPI_PAPR_SYSPARM_H_ | ||
#define _UAPI_PAPR_SYSPARM_H_ | ||
|
||
#include <linux/types.h> | ||
#include <asm/ioctl.h> | ||
#include <asm/papr-miscdev.h> | ||
|
||
enum { | ||
PAPR_SYSPARM_MAX_INPUT = 1024, | ||
PAPR_SYSPARM_MAX_OUTPUT = 4000, | ||
}; | ||
|
||
struct papr_sysparm_io_block { | ||
__u32 parameter; | ||
__u16 length; | ||
char data[PAPR_SYSPARM_MAX_OUTPUT]; | ||
}; | ||
|
||
/** | ||
* PAPR_SYSPARM_IOC_GET - Retrieve the value of a PAPR system parameter. | ||
* | ||
* Uses _IOWR because of one corner case: Retrieving the value of the | ||
* "OS Service Entitlement Status" parameter (60) requires the caller | ||
* to supply input data (a date string) in the buffer passed to | ||
* firmware. So the @length and @data of the incoming | ||
* papr_sysparm_io_block are always used to initialize the work area | ||
* supplied to ibm,get-system-parameter. No other parameters are known | ||
* to parameterize the result this way, and callers are encouraged | ||
* (but not required) to zero-initialize @length and @data in the | ||
* common case. | ||
* | ||
* On error the contents of the ioblock are indeterminate. | ||
* | ||
* Return: | ||
* 0: Success; @length is the length of valid data in @data, not to exceed @PAPR_SYSPARM_MAX_OUTPUT. | ||
* -EIO: Platform error. (-1) | ||
* -EINVAL: Incorrect data length or format. (-9999) | ||
* -EPERM: The calling partition is not allowed to access this parameter. (-9002) | ||
* -EOPNOTSUPP: Parameter not supported on this platform (-3) | ||
*/ | ||
#define PAPR_SYSPARM_IOC_GET _IOWR(PAPR_MISCDEV_IOC_ID, 1, struct papr_sysparm_io_block) | ||
|
||
/** | ||
* PAPR_SYSPARM_IOC_SET - Update the value of a PAPR system parameter. | ||
* | ||
* The contents of the ioblock are unchanged regardless of success. | ||
* | ||
* Return: | ||
* 0: Success; the parameter has been updated. | ||
* -EIO: Platform error. (-1) | ||
* -EINVAL: Incorrect data length or format. (-9999) | ||
* -EPERM: The calling partition is not allowed to access this parameter. (-9002) | ||
* -EOPNOTSUPP: Parameter not supported on this platform (-3) | ||
*/ | ||
#define PAPR_SYSPARM_IOC_SET _IOW(PAPR_MISCDEV_IOC_ID, 2, struct papr_sysparm_io_block) | ||
|
||
#endif /* _UAPI_PAPR_SYSPARM_H_ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters