forked from Minki/linux
powerpc fixes for 4.16 #5
One notable fix to properly advertise our support for a new firmware feature, caused by two series conflicting semantically but not textually. There's a new ioctl for the new ocxl driver, which is not a fix, but needed to complete the userspace API and good to have before the driver is in a released kernel. Finally three minor selftest fixes, and a fix for intermittent build failures for some obscure platforms, caused by a missing make dependency. Thanks to: Alastair D'Silva, Bharata B Rao, Guenter Roeck. -----BEGIN PGP SIGNATURE----- iQIwBAABCAAaBQJaomOTExxtcGVAZWxsZXJtYW4uaWQuYXUACgkQUevqPMjhpYBV LQ/+MyHQH7d/lhqRLWa3BVgy9mn2QfFTkRNMi46eqIWyk6wD5Qf//gzO+vTDzcEO rzkBu3XwhuhDCpCInLtJH17X8iKVy65Uk2JQ808pZTm0WnNTBv0ag251QARDg//B S1QmCQGJkpoUJ85+IDqQzV90K2o13BPWkAOrVh40G5GASvFGZRdxuTuo4DKeIe/j 0yri2LRuL+cpcfmZqaJVco8l2tqJEi6zJRhL/ORrLr4XSy0clxF1q1MYshNWPDsB 3l4r/yKz2aMltplknVVrpdMThUTD311kknIHoQuuEYvd6GxDz52d3B1lvE5Xb8EB sNJQX6q8ydab0u79/tTsXUm/EyfmMd6HMKOeVnQim19tnEe0wW6VkaPDNWWXa66U hW0qx7rX+zMSHzEcgLF7HKirzCQi2oS5ZMqXvhHlOPBb8Iy0O5za670AtvMGgm7/ NKXKML31opgXmTcU2ZxBMrtL0S8ft3wHCKRLkB6H8GHE+6//Ps87bQaUo4v2KsOr 2T/2w6TVtAwxLrASpCVonfcmIjjjIK4WILaOKp24Yzyv0eqen6Z3/kkga37sLgj8 f11HzTfFWO5ckroHrJSVCOC48eWb+O1CWRwS4rofL1jLfucpv6VFTPK6F4G47pAj pZyIJMTem0AEgsxVBJlsw6TibGH5W6rzDE/2WpEqxb7iZh0= =ajRr -----END PGP SIGNATURE----- Merge tag 'powerpc-4.16-5' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux Pull powerpc fixes from Michael Ellerman: "One notable fix to properly advertise our support for a new firmware feature, caused by two series conflicting semantically but not textually. There's a new ioctl for the new ocxl driver, which is not a fix, but needed to complete the userspace API and good to have before the driver is in a released kernel. Finally three minor selftest fixes, and a fix for intermittent build failures for some obscure platforms, caused by a missing make dependency. Thanks to: Alastair D'Silva, Bharata B Rao, Guenter Roeck" * tag 'powerpc-4.16-5' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux: powerpc/pseries: Fix vector5 in ibm architecture vector table ocxl: Document the OCXL_IOCTL_GET_METADATA IOCTL ocxl: Add get_metadata IOCTL to share OCXL information to userspace selftests/powerpc: Skip the subpage_prot tests if the syscall is unavailable selftests/powerpc: Fix missing clean of pmu/lib.o powerpc/boot: Fix random libfdt related build errors selftests/powerpc: Skip tm-trap if transactional memory is not enabled
This commit is contained in:
commit
a525df0558
@ -152,6 +152,11 @@ OCXL_IOCTL_IRQ_SET_FD:
|
||||
Associate an event fd to an AFU interrupt so that the user process
|
||||
can be notified when the AFU sends an interrupt.
|
||||
|
||||
OCXL_IOCTL_GET_METADATA:
|
||||
|
||||
Obtains configuration information from the card, such at the size of
|
||||
MMIO areas, the AFU version, and the PASID for the current context.
|
||||
|
||||
|
||||
mmap
|
||||
----
|
||||
|
@ -101,7 +101,8 @@ $(addprefix $(obj)/,$(zlib-y)): \
|
||||
libfdt := fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c
|
||||
libfdtheader := fdt.h libfdt.h libfdt_internal.h
|
||||
|
||||
$(addprefix $(obj)/,$(libfdt) libfdt-wrapper.o simpleboot.o epapr.o opal.o): \
|
||||
$(addprefix $(obj)/,$(libfdt) libfdt-wrapper.o simpleboot.o epapr.o opal.o \
|
||||
treeboot-akebono.o treeboot-currituck.o treeboot-iss4xx.o): \
|
||||
$(addprefix $(obj)/,$(libfdtheader))
|
||||
|
||||
src-wlib-y := string.S crt0.S stdio.c decompress.c main.c \
|
||||
|
@ -874,7 +874,6 @@ struct ibm_arch_vec __cacheline_aligned ibm_architecture_vec = {
|
||||
.mmu = 0,
|
||||
.hash_ext = 0,
|
||||
.radix_ext = 0,
|
||||
.byte22 = 0,
|
||||
},
|
||||
|
||||
/* option vector 6: IBM PAPR hints */
|
||||
|
@ -102,10 +102,32 @@ static long afu_ioctl_attach(struct ocxl_context *ctx,
|
||||
return rc;
|
||||
}
|
||||
|
||||
static long afu_ioctl_get_metadata(struct ocxl_context *ctx,
|
||||
struct ocxl_ioctl_metadata __user *uarg)
|
||||
{
|
||||
struct ocxl_ioctl_metadata arg;
|
||||
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
|
||||
arg.version = 0;
|
||||
|
||||
arg.afu_version_major = ctx->afu->config.version_major;
|
||||
arg.afu_version_minor = ctx->afu->config.version_minor;
|
||||
arg.pasid = ctx->pasid;
|
||||
arg.pp_mmio_size = ctx->afu->config.pp_mmio_stride;
|
||||
arg.global_mmio_size = ctx->afu->config.global_mmio_size;
|
||||
|
||||
if (copy_to_user(uarg, &arg, sizeof(arg)))
|
||||
return -EFAULT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define CMD_STR(x) (x == OCXL_IOCTL_ATTACH ? "ATTACH" : \
|
||||
x == OCXL_IOCTL_IRQ_ALLOC ? "IRQ_ALLOC" : \
|
||||
x == OCXL_IOCTL_IRQ_FREE ? "IRQ_FREE" : \
|
||||
x == OCXL_IOCTL_IRQ_SET_FD ? "IRQ_SET_FD" : \
|
||||
x == OCXL_IOCTL_GET_METADATA ? "GET_METADATA" : \
|
||||
"UNKNOWN")
|
||||
|
||||
static long afu_ioctl(struct file *file, unsigned int cmd,
|
||||
@ -159,6 +181,11 @@ static long afu_ioctl(struct file *file, unsigned int cmd,
|
||||
irq_fd.eventfd);
|
||||
break;
|
||||
|
||||
case OCXL_IOCTL_GET_METADATA:
|
||||
rc = afu_ioctl_get_metadata(ctx,
|
||||
(struct ocxl_ioctl_metadata __user *) args);
|
||||
break;
|
||||
|
||||
default:
|
||||
rc = -EINVAL;
|
||||
}
|
||||
|
@ -32,6 +32,22 @@ struct ocxl_ioctl_attach {
|
||||
__u64 reserved3;
|
||||
};
|
||||
|
||||
struct ocxl_ioctl_metadata {
|
||||
__u16 version; // struct version, always backwards compatible
|
||||
|
||||
// Version 0 fields
|
||||
__u8 afu_version_major;
|
||||
__u8 afu_version_minor;
|
||||
__u32 pasid; // PASID assigned to the current context
|
||||
|
||||
__u64 pp_mmio_size; // Per PASID MMIO size
|
||||
__u64 global_mmio_size;
|
||||
|
||||
// End version 0 fields
|
||||
|
||||
__u64 reserved[13]; // Total of 16*u64
|
||||
};
|
||||
|
||||
struct ocxl_ioctl_irq_fd {
|
||||
__u64 irq_offset;
|
||||
__s32 eventfd;
|
||||
@ -45,5 +61,6 @@ struct ocxl_ioctl_irq_fd {
|
||||
#define OCXL_IOCTL_IRQ_ALLOC _IOR(OCXL_MAGIC, 0x11, __u64)
|
||||
#define OCXL_IOCTL_IRQ_FREE _IOW(OCXL_MAGIC, 0x12, __u64)
|
||||
#define OCXL_IOCTL_IRQ_SET_FD _IOW(OCXL_MAGIC, 0x13, struct ocxl_ioctl_irq_fd)
|
||||
#define OCXL_IOCTL_GET_METADATA _IOR(OCXL_MAGIC, 0x14, struct ocxl_ioctl_metadata)
|
||||
|
||||
#endif /* _UAPI_MISC_OCXL_H */
|
||||
|
@ -135,6 +135,16 @@ static int run_test(void *addr, unsigned long size)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int syscall_available(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
errno = 0;
|
||||
rc = syscall(__NR_subpage_prot, 0, 0, 0);
|
||||
|
||||
return rc == 0 || (errno != ENOENT && errno != ENOSYS);
|
||||
}
|
||||
|
||||
int test_anon(void)
|
||||
{
|
||||
unsigned long align;
|
||||
@ -145,6 +155,8 @@ int test_anon(void)
|
||||
void *mallocblock;
|
||||
unsigned long mallocsize;
|
||||
|
||||
SKIP_IF(!syscall_available());
|
||||
|
||||
if (getpagesize() != 0x10000) {
|
||||
fprintf(stderr, "Kernel page size must be 64K!\n");
|
||||
return 1;
|
||||
@ -180,6 +192,8 @@ int test_file(void)
|
||||
off_t filesize;
|
||||
int fd;
|
||||
|
||||
SKIP_IF(!syscall_available());
|
||||
|
||||
fd = open(file_name, O_RDWR);
|
||||
if (fd == -1) {
|
||||
perror("failed to open file");
|
||||
|
@ -16,7 +16,7 @@ $(OUTPUT)/tm-syscall: tm-syscall-asm.S
|
||||
$(OUTPUT)/tm-syscall: CFLAGS += -I../../../../../usr/include
|
||||
$(OUTPUT)/tm-tmspr: CFLAGS += -pthread
|
||||
$(OUTPUT)/tm-vmx-unavail: CFLAGS += -pthread -m64
|
||||
$(OUTPUT)/tm-resched-dscr: ../pmu/lib.o
|
||||
$(OUTPUT)/tm-resched-dscr: ../pmu/lib.c
|
||||
$(OUTPUT)/tm-unavailable: CFLAGS += -O0 -pthread -m64 -Wno-error=uninitialized -mvsx
|
||||
$(OUTPUT)/tm-trap: CFLAGS += -O0 -pthread -m64
|
||||
|
||||
|
@ -255,6 +255,8 @@ int tm_trap_test(void)
|
||||
|
||||
struct sigaction trap_sa;
|
||||
|
||||
SKIP_IF(!have_htm());
|
||||
|
||||
trap_sa.sa_flags = SA_SIGINFO;
|
||||
trap_sa.sa_sigaction = trap_signal_handler;
|
||||
sigaction(SIGTRAP, &trap_sa, NULL);
|
||||
|
Loading…
Reference in New Issue
Block a user