Skip to content

Commit 7221481

Browse files
author
CKI KWF Bot
committed
Merge: Hypervisor pipe character driver to support HVPIPE RTAS calls
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-10/-/merge_requests/1692 Description: Hypervisor pipe character driver to support HVPIPE RTAS calls JIRA: https://issues.redhat.com/browse/RHEL-101959 Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=69010179 Tested: Verified Brew build test kernel RPMs Signed-off-by: Mamatha Inamdar <minamdar@redhat.com> Approved-by: Steve Best <sbest@redhat.com> Approved-by: Tony Camuso <tcamuso@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: CKI GitLab Kmaint Pipeline Bot <26919896-cki-kmaint-pipeline-bot@users.noreply.gitlab.com>
2 parents 8e3f727 + 06c45f2 commit 7221481

File tree

10 files changed

+940
-5
lines changed

10 files changed

+940
-5
lines changed

Documentation/userspace-api/ioctl/ioctl-number.rst

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -361,15 +361,17 @@ Code Seq# Include File Comments
361361
0xB1 00-1F PPPoX
362362
<mailto:mostrows@styx.uwaterloo.ca>
363363
0xB2 00 arch/powerpc/include/uapi/asm/papr-vpd.h powerpc/pseries VPD API
364-
<mailto:linuxppc-dev>
364+
<mailto:linuxppc-dev@lists.ozlabs.org>
365365
0xB2 01-02 arch/powerpc/include/uapi/asm/papr-sysparm.h powerpc/pseries system parameter API
366-
<mailto:linuxppc-dev>
366+
<mailto:linuxppc-dev@lists.ozlabs.org>
367367
0xB2 03-05 arch/powerpc/include/uapi/asm/papr-indices.h powerpc/pseries indices API
368-
<mailto:linuxppc-dev>
368+
<mailto:linuxppc-dev@lists.ozlabs.org>
369369
0xB2 06-07 arch/powerpc/include/uapi/asm/papr-platform-dump.h powerpc/pseries Platform Dump API
370-
<mailto:linuxppc-dev>
370+
<mailto:linuxppc-dev@lists.ozlabs.org>
371371
0xB2 08 powerpc/include/uapi/asm/papr-physical-attestation.h powerpc/pseries Physical Attestation API
372-
<mailto:linuxppc-dev>
372+
<mailto:linuxppc-dev@lists.ozlabs.org>
373+
0xB2 09 arch/powerpc/include/uapi/asm/papr-hvpipe.h powerpc/pseries HVPIPE API
374+
<mailto:linuxppc-dev@lists.ozlabs.org>
373375
0xB3 00 linux/mmc/ioctl.h
374376
0xB4 00-0F linux/gpio.h <mailto:linux-gpio@vger.kernel.org>
375377
0xB5 00-0F uapi/linux/rpmsg.h <mailto:linux-remoteproc@vger.kernel.org>

arch/powerpc/include/asm/papr-sysparm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ typedef struct {
2121
#define PAPR_SYSPARM_COOP_MEM_OVERCOMMIT_ATTRS mk_papr_sysparm(44)
2222
#define PAPR_SYSPARM_TLB_BLOCK_INVALIDATE_ATTRS mk_papr_sysparm(50)
2323
#define PAPR_SYSPARM_LPAR_NAME mk_papr_sysparm(55)
24+
#define PAPR_SYSPARM_HVPIPE_ENABLE mk_papr_sysparm(64)
2425

2526
/**
2627
* struct papr_sysparm_buf - RTAS work area layout for system parameter functions.

arch/powerpc/include/asm/rtas.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,11 @@ enum rtas_function_index {
6868
RTAS_FNIDX__IBM_READ_PCI_CONFIG,
6969
RTAS_FNIDX__IBM_READ_SLOT_RESET_STATE,
7070
RTAS_FNIDX__IBM_READ_SLOT_RESET_STATE2,
71+
RTAS_FNIDX__IBM_RECEIVE_HVPIPE_MSG,
7172
RTAS_FNIDX__IBM_REMOVE_PE_DMA_WINDOW,
7273
RTAS_FNIDX__IBM_RESET_PE_DMA_WINDOW,
7374
RTAS_FNIDX__IBM_SCAN_LOG_DUMP,
75+
RTAS_FNIDX__IBM_SEND_HVPIPE_MSG,
7476
RTAS_FNIDX__IBM_SET_DYNAMIC_INDICATOR,
7577
RTAS_FNIDX__IBM_SET_EEH_OPTION,
7678
RTAS_FNIDX__IBM_SET_SLOT_RESET,
@@ -163,9 +165,11 @@ typedef struct {
163165
#define RTAS_FN_IBM_READ_PCI_CONFIG rtas_fn_handle(RTAS_FNIDX__IBM_READ_PCI_CONFIG)
164166
#define RTAS_FN_IBM_READ_SLOT_RESET_STATE rtas_fn_handle(RTAS_FNIDX__IBM_READ_SLOT_RESET_STATE)
165167
#define RTAS_FN_IBM_READ_SLOT_RESET_STATE2 rtas_fn_handle(RTAS_FNIDX__IBM_READ_SLOT_RESET_STATE2)
168+
#define RTAS_FN_IBM_RECEIVE_HVPIPE_MSG rtas_fn_handle(RTAS_FNIDX__IBM_RECEIVE_HVPIPE_MSG)
166169
#define RTAS_FN_IBM_REMOVE_PE_DMA_WINDOW rtas_fn_handle(RTAS_FNIDX__IBM_REMOVE_PE_DMA_WINDOW)
167170
#define RTAS_FN_IBM_RESET_PE_DMA_WINDOW rtas_fn_handle(RTAS_FNIDX__IBM_RESET_PE_DMA_WINDOW)
168171
#define RTAS_FN_IBM_SCAN_LOG_DUMP rtas_fn_handle(RTAS_FNIDX__IBM_SCAN_LOG_DUMP)
172+
#define RTAS_FN_IBM_SEND_HVPIPE_MSG rtas_fn_handle(RTAS_FNIDX__IBM_SEND_HVPIPE_MSG)
169173
#define RTAS_FN_IBM_SET_DYNAMIC_INDICATOR rtas_fn_handle(RTAS_FNIDX__IBM_SET_DYNAMIC_INDICATOR)
170174
#define RTAS_FN_IBM_SET_EEH_OPTION rtas_fn_handle(RTAS_FNIDX__IBM_SET_EEH_OPTION)
171175
#define RTAS_FN_IBM_SET_SLOT_RESET rtas_fn_handle(RTAS_FNIDX__IBM_SET_SLOT_RESET)
@@ -217,6 +221,7 @@ typedef struct {
217221
#define RTAS_HARDWARE_ERROR -1 /* Hardware or other unspecified error. */
218222
#define RTAS_BUSY -2 /* Retry immediately. */
219223
#define RTAS_INVALID_PARAMETER -3 /* Invalid indicator/domain/sensor etc. */
224+
#define RTAS_FUNC_NOT_SUPPORTED -5 /* Function not supported */
220225
#define RTAS_UNEXPECTED_STATE_CHANGE -7 /* Seems limited to EEH and slot reset. */
221226
#define RTAS_EXTENDED_DELAY_MIN 9900 /* Retry after delaying for ~1ms. */
222227
#define RTAS_EXTENDED_DELAY_MAX 9905 /* Retry after delaying for ~100s. */
@@ -233,6 +238,7 @@ typedef struct {
233238
#define RTAS_EPOW_WARNING 0x40000000 /* set bit 1 */
234239
#define RTAS_HOTPLUG_EVENTS 0x10000000 /* set bit 3 */
235240
#define RTAS_IO_EVENTS 0x08000000 /* set bit 4 */
241+
#define RTAS_HVPIPE_MSG_EVENTS 0x04000000 /* set bit 5 */
236242
#define RTAS_EVENT_SCAN_ALL_EVENTS 0xffffffff
237243

238244
/* RTAS event severity */
@@ -282,6 +288,7 @@ typedef struct {
282288
#define RTAS_TYPE_DEALLOC 0xE3
283289
#define RTAS_TYPE_DUMP 0xE4
284290
#define RTAS_TYPE_HOTPLUG 0xE5
291+
#define RTAS_TYPE_HVPIPE 0xE6
285292
/* I don't add PowerMGM events right now, this is a different topic */
286293
#define RTAS_TYPE_PMGM_POWER_SW_ON 0x60
287294
#define RTAS_TYPE_PMGM_POWER_SW_OFF 0x61
@@ -374,6 +381,7 @@ inline uint32_t rtas_ext_event_company_id(struct rtas_ext_event_log_v6 *ext_log)
374381
#define PSERIES_ELOG_SECT_ID_HMC_ID (('H' << 8) | 'M')
375382
#define PSERIES_ELOG_SECT_ID_EPOW (('E' << 8) | 'P')
376383
#define PSERIES_ELOG_SECT_ID_IO_EVENT (('I' << 8) | 'E')
384+
#define PSERIES_ELOG_SECT_ID_HVPIPE_EVENT (('P' << 8) | 'E')
377385
#define PSERIES_ELOG_SECT_ID_MANUFACT_INFO (('M' << 8) | 'I')
378386
#define PSERIES_ELOG_SECT_ID_CALL_HOME (('C' << 8) | 'H')
379387
#define PSERIES_ELOG_SECT_ID_USER_DEF (('U' << 8) | 'D')
@@ -519,6 +527,7 @@ extern struct mutex rtas_ibm_get_indices_lock;
519527
extern struct mutex rtas_ibm_set_dynamic_indicator_lock;
520528
extern struct mutex rtas_ibm_get_dynamic_sensor_state_lock;
521529
extern struct mutex rtas_ibm_physical_attestation_lock;
530+
extern struct mutex rtas_ibm_send_hvpipe_msg_lock;
522531

523532
#define GLOBAL_INTERRUPT_QUEUE 9005
524533

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2+
#ifndef _UAPI_PAPR_HVPIPE_H_
3+
#define _UAPI_PAPR_HVPIPE_H_
4+
5+
#include <linux/types.h>
6+
#include <asm/ioctl.h>
7+
#include <asm/papr-miscdev.h>
8+
9+
/*
10+
* This header is included in payload between OS and the user
11+
* space.
12+
* flags: OS notifies the user space whether the hvpipe is
13+
* closed or the buffer has the payload.
14+
*/
15+
struct papr_hvpipe_hdr {
16+
__u8 version;
17+
__u8 reserved[3];
18+
__u32 flags;
19+
__u8 reserved2[40];
20+
};
21+
22+
/*
23+
* ioctl for /dev/papr-hvpipe
24+
*/
25+
#define PAPR_HVPIPE_IOC_CREATE_HANDLE _IOW(PAPR_MISCDEV_IOC_ID, 9, __u32)
26+
27+
/*
28+
* hvpipe_hdr flags used for read()
29+
*/
30+
#define HVPIPE_MSG_AVAILABLE 0x01 /* Payload is available */
31+
#define HVPIPE_LOST_CONNECTION 0x02 /* Pipe connection is closed/unavailable */
32+
33+
#endif /* _UAPI_PAPR_HVPIPE_H_ */

arch/powerpc/kernel/rtas.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ DEFINE_MUTEX(rtas_ibm_get_vpd_lock);
9898
DEFINE_MUTEX(rtas_ibm_get_indices_lock);
9999
DEFINE_MUTEX(rtas_ibm_set_dynamic_indicator_lock);
100100
DEFINE_MUTEX(rtas_ibm_get_dynamic_sensor_state_lock);
101+
DEFINE_MUTEX(rtas_ibm_receive_hvpipe_msg_lock);
102+
DEFINE_MUTEX(rtas_ibm_send_hvpipe_msg_lock);
101103

102104
static struct rtas_function rtas_function_table[] __ro_after_init = {
103105
[RTAS_FNIDX__CHECK_EXCEPTION] = {
@@ -373,6 +375,17 @@ static struct rtas_function rtas_function_table[] __ro_after_init = {
373375
[RTAS_FNIDX__IBM_READ_SLOT_RESET_STATE2] = {
374376
.name = "ibm,read-slot-reset-state2",
375377
},
378+
[RTAS_FNIDX__IBM_RECEIVE_HVPIPE_MSG] {
379+
.name = "ibm,receive-hvpipe-msg",
380+
.filter = &(const struct rtas_filter) {
381+
.buf_idx1 = 0, .size_idx1 = 1,
382+
.buf_idx2 = -1, .size_idx2 = -1,
383+
},
384+
/*
385+
* PAPR+ v2.13 R1–7.3.32.1
386+
*/
387+
.lock = &rtas_ibm_receive_hvpipe_msg_lock,
388+
},
376389
[RTAS_FNIDX__IBM_REMOVE_PE_DMA_WINDOW] = {
377390
.name = "ibm,remove-pe-dma-window",
378391
},
@@ -391,6 +404,17 @@ static struct rtas_function rtas_function_table[] __ro_after_init = {
391404
.buf_idx2 = -1, .size_idx2 = -1,
392405
},
393406
},
407+
[RTAS_FNIDX__IBM_SEND_HVPIPE_MSG] {
408+
.name = "ibm,send-hvpipe-msg",
409+
.filter = &(const struct rtas_filter) {
410+
.buf_idx1 = 1, .size_idx1 = -1,
411+
.buf_idx2 = -1, .size_idx2 = -1,
412+
},
413+
/*
414+
* PAPR+ v2.13 R1–7.3.32.2
415+
*/
416+
.lock = &rtas_ibm_send_hvpipe_msg_lock,
417+
},
394418
[RTAS_FNIDX__IBM_SET_DYNAMIC_INDICATOR] = {
395419
.name = "ibm,set-dynamic-indicator",
396420
.filter = &(const struct rtas_filter) {

arch/powerpc/kernel/rtasd.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ static char *rtas_event_type(int type)
8989
return "Platform Resource Reassignment Event";
9090
case RTAS_TYPE_HOTPLUG:
9191
return "Hotplug Event";
92+
case RTAS_TYPE_HVPIPE:
93+
return "Hypervisor Pipe Notification event";
9294
}
9395

9496
return rtas_type[0];

arch/powerpc/platforms/pseries/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ obj-y := lpar.o hvCall.o nvram.o reconfig.o \
55
of_helpers.o rtas-work-area.o papr-sysparm.o \
66
papr-rtas-common.o papr-vpd.o papr-indices.o \
77
papr-platform-dump.o papr-phy-attest.o \
8+
papr-hvpipe.o \
89
setup.o iommu.o event_sources.o ras.o \
910
firmware.o power.o dlpar.o mobility.o rng.o \
1011
pci.o pci_dlpar.o eeh_pseries.o msi.o \

arch/powerpc/platforms/pseries/mobility.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include <asm/rtas.h>
2929
#include "pseries.h"
3030
#include "vas.h" /* vas_migration_handler() */
31+
#include "papr-hvpipe.h" /* hvpipe_migration_handler() */
3132
#include "../../kernel/cacheinfo.h"
3233

3334
static struct kobject *mobility_kobj;
@@ -744,6 +745,7 @@ static int pseries_migrate_partition(u64 handle)
744745
* by closing VAS windows at the beginning of this function.
745746
*/
746747
vas_migration_handler(VAS_SUSPEND);
748+
hvpipe_migration_handler(HVPIPE_SUSPEND);
747749

748750
ret = wait_for_vasi_session_suspending(handle);
749751
if (ret)
@@ -770,6 +772,7 @@ static int pseries_migrate_partition(u64 handle)
770772

771773
out:
772774
vas_migration_handler(VAS_RESUME);
775+
hvpipe_migration_handler(HVPIPE_RESUME);
773776

774777
return ret;
775778
}

0 commit comments

Comments
 (0)