diff options
| -rw-r--r-- | arch/powerpc/include/asm/systbl.h | 2 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/unistd.h | 2 | ||||
| -rw-r--r-- | arch/powerpc/include/uapi/asm/unistd.h | 2 | ||||
| -rw-r--r-- | drivers/misc/cxl/context.c | 7 | ||||
| -rw-r--r-- | drivers/misc/cxl/cxl.h | 2 | ||||
| -rw-r--r-- | drivers/misc/cxl/irq.c | 1 | ||||
| -rw-r--r-- | drivers/misc/cxl/native.c | 31 |
7 files changed, 45 insertions, 2 deletions
diff --git a/arch/powerpc/include/asm/systbl.h b/arch/powerpc/include/asm/systbl.h index 3fa9df70aa20..2fc5d4db503c 100644 --- a/arch/powerpc/include/asm/systbl.h +++ b/arch/powerpc/include/asm/systbl.h | |||
| @@ -384,3 +384,5 @@ SYSCALL(ni_syscall) | |||
| 384 | SYSCALL(ni_syscall) | 384 | SYSCALL(ni_syscall) |
| 385 | SYSCALL(mlock2) | 385 | SYSCALL(mlock2) |
| 386 | SYSCALL(copy_file_range) | 386 | SYSCALL(copy_file_range) |
| 387 | COMPAT_SYS_SPU(preadv2) | ||
| 388 | COMPAT_SYS_SPU(pwritev2) | ||
diff --git a/arch/powerpc/include/asm/unistd.h b/arch/powerpc/include/asm/unistd.h index 1f2594d45605..cf12c580f6b2 100644 --- a/arch/powerpc/include/asm/unistd.h +++ b/arch/powerpc/include/asm/unistd.h | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <uapi/asm/unistd.h> | 12 | #include <uapi/asm/unistd.h> |
| 13 | 13 | ||
| 14 | 14 | ||
| 15 | #define NR_syscalls 380 | 15 | #define NR_syscalls 382 |
| 16 | 16 | ||
| 17 | #define __NR__exit __NR_exit | 17 | #define __NR__exit __NR_exit |
| 18 | 18 | ||
diff --git a/arch/powerpc/include/uapi/asm/unistd.h b/arch/powerpc/include/uapi/asm/unistd.h index 940290d45b08..e9f5f41aa55a 100644 --- a/arch/powerpc/include/uapi/asm/unistd.h +++ b/arch/powerpc/include/uapi/asm/unistd.h | |||
| @@ -390,5 +390,7 @@ | |||
| 390 | #define __NR_membarrier 365 | 390 | #define __NR_membarrier 365 |
| 391 | #define __NR_mlock2 378 | 391 | #define __NR_mlock2 378 |
| 392 | #define __NR_copy_file_range 379 | 392 | #define __NR_copy_file_range 379 |
| 393 | #define __NR_preadv2 380 | ||
| 394 | #define __NR_pwritev2 381 | ||
| 393 | 395 | ||
| 394 | #endif /* _UAPI_ASM_POWERPC_UNISTD_H_ */ | 396 | #endif /* _UAPI_ASM_POWERPC_UNISTD_H_ */ |
diff --git a/drivers/misc/cxl/context.c b/drivers/misc/cxl/context.c index 10370f280500..7edea9c19199 100644 --- a/drivers/misc/cxl/context.c +++ b/drivers/misc/cxl/context.c | |||
| @@ -223,6 +223,13 @@ int __detach_context(struct cxl_context *ctx) | |||
| 223 | cxl_ops->link_ok(ctx->afu->adapter, ctx->afu)); | 223 | cxl_ops->link_ok(ctx->afu->adapter, ctx->afu)); |
| 224 | flush_work(&ctx->fault_work); /* Only needed for dedicated process */ | 224 | flush_work(&ctx->fault_work); /* Only needed for dedicated process */ |
| 225 | 225 | ||
| 226 | /* | ||
| 227 | * Wait until no further interrupts are presented by the PSL | ||
| 228 | * for this context. | ||
| 229 | */ | ||
| 230 | if (cxl_ops->irq_wait) | ||
| 231 | cxl_ops->irq_wait(ctx); | ||
| 232 | |||
| 226 | /* release the reference to the group leader and mm handling pid */ | 233 | /* release the reference to the group leader and mm handling pid */ |
| 227 | put_pid(ctx->pid); | 234 | put_pid(ctx->pid); |
| 228 | put_pid(ctx->glpid); | 235 | put_pid(ctx->glpid); |
diff --git a/drivers/misc/cxl/cxl.h b/drivers/misc/cxl/cxl.h index 38e21cf7806e..73dc2a33da74 100644 --- a/drivers/misc/cxl/cxl.h +++ b/drivers/misc/cxl/cxl.h | |||
| @@ -274,6 +274,7 @@ static const cxl_p2n_reg_t CXL_PSL_WED_An = {0x0A0}; | |||
| 274 | #define CXL_PSL_DSISR_An_PE (1ull << (63-4)) /* PSL Error (implementation specific) */ | 274 | #define CXL_PSL_DSISR_An_PE (1ull << (63-4)) /* PSL Error (implementation specific) */ |
| 275 | #define CXL_PSL_DSISR_An_AE (1ull << (63-5)) /* AFU Error */ | 275 | #define CXL_PSL_DSISR_An_AE (1ull << (63-5)) /* AFU Error */ |
| 276 | #define CXL_PSL_DSISR_An_OC (1ull << (63-6)) /* OS Context Warning */ | 276 | #define CXL_PSL_DSISR_An_OC (1ull << (63-6)) /* OS Context Warning */ |
| 277 | #define CXL_PSL_DSISR_PENDING (CXL_PSL_DSISR_TRANS | CXL_PSL_DSISR_An_PE | CXL_PSL_DSISR_An_AE | CXL_PSL_DSISR_An_OC) | ||
| 277 | /* NOTE: Bits 32:63 are undefined if DSISR[DS] = 1 */ | 278 | /* NOTE: Bits 32:63 are undefined if DSISR[DS] = 1 */ |
| 278 | #define CXL_PSL_DSISR_An_M DSISR_NOHPTE /* PTE not found */ | 279 | #define CXL_PSL_DSISR_An_M DSISR_NOHPTE /* PTE not found */ |
| 279 | #define CXL_PSL_DSISR_An_P DSISR_PROTFAULT /* Storage protection violation */ | 280 | #define CXL_PSL_DSISR_An_P DSISR_PROTFAULT /* Storage protection violation */ |
| @@ -855,6 +856,7 @@ struct cxl_backend_ops { | |||
| 855 | u64 dsisr, u64 errstat); | 856 | u64 dsisr, u64 errstat); |
| 856 | irqreturn_t (*psl_interrupt)(int irq, void *data); | 857 | irqreturn_t (*psl_interrupt)(int irq, void *data); |
| 857 | int (*ack_irq)(struct cxl_context *ctx, u64 tfc, u64 psl_reset_mask); | 858 | int (*ack_irq)(struct cxl_context *ctx, u64 tfc, u64 psl_reset_mask); |
| 859 | void (*irq_wait)(struct cxl_context *ctx); | ||
| 858 | int (*attach_process)(struct cxl_context *ctx, bool kernel, | 860 | int (*attach_process)(struct cxl_context *ctx, bool kernel, |
| 859 | u64 wed, u64 amr); | 861 | u64 wed, u64 amr); |
| 860 | int (*detach_process)(struct cxl_context *ctx); | 862 | int (*detach_process)(struct cxl_context *ctx); |
diff --git a/drivers/misc/cxl/irq.c b/drivers/misc/cxl/irq.c index be646dc41a2c..8def4553acba 100644 --- a/drivers/misc/cxl/irq.c +++ b/drivers/misc/cxl/irq.c | |||
| @@ -203,7 +203,6 @@ unsigned int cxl_map_irq(struct cxl *adapter, irq_hw_number_t hwirq, | |||
| 203 | void cxl_unmap_irq(unsigned int virq, void *cookie) | 203 | void cxl_unmap_irq(unsigned int virq, void *cookie) |
| 204 | { | 204 | { |
| 205 | free_irq(virq, cookie); | 205 | free_irq(virq, cookie); |
| 206 | irq_dispose_mapping(virq); | ||
| 207 | } | 206 | } |
| 208 | 207 | ||
| 209 | int cxl_register_one_irq(struct cxl *adapter, | 208 | int cxl_register_one_irq(struct cxl *adapter, |
diff --git a/drivers/misc/cxl/native.c b/drivers/misc/cxl/native.c index 387fcbdf9793..ecf7557cd657 100644 --- a/drivers/misc/cxl/native.c +++ b/drivers/misc/cxl/native.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include <linux/mutex.h> | 14 | #include <linux/mutex.h> |
| 15 | #include <linux/mm.h> | 15 | #include <linux/mm.h> |
| 16 | #include <linux/uaccess.h> | 16 | #include <linux/uaccess.h> |
| 17 | #include <linux/delay.h> | ||
| 17 | #include <asm/synch.h> | 18 | #include <asm/synch.h> |
| 18 | #include <misc/cxl-base.h> | 19 | #include <misc/cxl-base.h> |
| 19 | 20 | ||
| @@ -797,6 +798,35 @@ static irqreturn_t native_irq_multiplexed(int irq, void *data) | |||
| 797 | return fail_psl_irq(afu, &irq_info); | 798 | return fail_psl_irq(afu, &irq_info); |
| 798 | } | 799 | } |
| 799 | 800 | ||
| 801 | void native_irq_wait(struct cxl_context *ctx) | ||
| 802 | { | ||
| 803 | u64 dsisr; | ||
| 804 | int timeout = 1000; | ||
| 805 | int ph; | ||
| 806 | |||
| 807 | /* | ||
| 808 | * Wait until no further interrupts are presented by the PSL | ||
| 809 | * for this context. | ||
| 810 | */ | ||
| 811 | while (timeout--) { | ||
| 812 | ph = cxl_p2n_read(ctx->afu, CXL_PSL_PEHandle_An) & 0xffff; | ||
| 813 | if (ph != ctx->pe) | ||
| 814 | return; | ||
| 815 | dsisr = cxl_p2n_read(ctx->afu, CXL_PSL_DSISR_An); | ||
| 816 | if ((dsisr & CXL_PSL_DSISR_PENDING) == 0) | ||
| 817 | return; | ||
| 818 | /* | ||
| 819 | * We are waiting for the workqueue to process our | ||
| 820 | * irq, so need to let that run here. | ||
| 821 | */ | ||
| 822 | msleep(1); | ||
| 823 | } | ||
| 824 | |||
| 825 | dev_warn(&ctx->afu->dev, "WARNING: waiting on DSI for PE %i" | ||
| 826 | " DSISR %016llx!\n", ph, dsisr); | ||
| 827 | return; | ||
| 828 | } | ||
| 829 | |||
| 800 | static irqreturn_t native_slice_irq_err(int irq, void *data) | 830 | static irqreturn_t native_slice_irq_err(int irq, void *data) |
| 801 | { | 831 | { |
| 802 | struct cxl_afu *afu = data; | 832 | struct cxl_afu *afu = data; |
| @@ -1076,6 +1106,7 @@ const struct cxl_backend_ops cxl_native_ops = { | |||
| 1076 | .handle_psl_slice_error = native_handle_psl_slice_error, | 1106 | .handle_psl_slice_error = native_handle_psl_slice_error, |
| 1077 | .psl_interrupt = NULL, | 1107 | .psl_interrupt = NULL, |
| 1078 | .ack_irq = native_ack_irq, | 1108 | .ack_irq = native_ack_irq, |
| 1109 | .irq_wait = native_irq_wait, | ||
| 1079 | .attach_process = native_attach_process, | 1110 | .attach_process = native_attach_process, |
| 1080 | .detach_process = native_detach_process, | 1111 | .detach_process = native_detach_process, |
| 1081 | .support_attributes = native_support_attributes, | 1112 | .support_attributes = native_support_attributes, |
