Commit 6068e1a4 authored by Haren Myneni's avatar Haren Myneni Committed by Michael Ellerman

powerpc/vas: Report proper error code for address translation failure

P9 DD2 NX workbook (Table 4-36) says DMA controller uses CC=5
internally for translation fault handling. NX reserves CC=250 for
OS to notify user space when NX encounters address translation
failure on the request buffer. Not an issue in earlier releases
as NX does not get faults on kernel addresses.

This patch defines CSB_CC_FAULT_ADDRESS(250) and updates CSB.CC with
this proper error code for user space.

Fixes: c96c4436 ("powerpc/vas: Update CSB and notify process for fault CRBs")
Signed-off-by: default avatarHaren Myneni <haren@linux.ibm.com>
[mpe: Added Fixes tag and fix typo in comment]
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/019fd53e7538c6f8f332d175df74b1815ef5aa8c.camel@linux.ibm.com
parent b710d27b
...@@ -213,7 +213,7 @@ request buffers are not in memory. The operating system handles the fault by ...@@ -213,7 +213,7 @@ request buffers are not in memory. The operating system handles the fault by
updating CSB with the following data: updating CSB with the following data:
csb.flags = CSB_V; csb.flags = CSB_V;
csb.cc = CSB_CC_TRANSLATION; csb.cc = CSB_CC_FAULT_ADDRESS;
csb.ce = CSB_CE_TERMINATION; csb.ce = CSB_CE_TERMINATION;
csb.address = fault_address; csb.address = fault_address;
......
...@@ -77,6 +77,8 @@ struct coprocessor_completion_block { ...@@ -77,6 +77,8 @@ struct coprocessor_completion_block {
#define CSB_CC_CHAIN (37) #define CSB_CC_CHAIN (37)
#define CSB_CC_SEQUENCE (38) #define CSB_CC_SEQUENCE (38)
#define CSB_CC_HW (39) #define CSB_CC_HW (39)
/* P9 DD2 NX Workbook 3.2 (Table 4-36): Address translation fault */
#define CSB_CC_FAULT_ADDRESS (250)
#define CSB_SIZE (0x10) #define CSB_SIZE (0x10)
#define CSB_ALIGN CSB_SIZE #define CSB_ALIGN CSB_SIZE
......
...@@ -79,7 +79,7 @@ static void update_csb(struct vas_window *window, ...@@ -79,7 +79,7 @@ static void update_csb(struct vas_window *window,
csb_addr = (void __user *)be64_to_cpu(crb->csb_addr); csb_addr = (void __user *)be64_to_cpu(crb->csb_addr);
memset(&csb, 0, sizeof(csb)); memset(&csb, 0, sizeof(csb));
csb.cc = CSB_CC_TRANSLATION; csb.cc = CSB_CC_FAULT_ADDRESS;
csb.ce = CSB_CE_TERMINATION; csb.ce = CSB_CE_TERMINATION;
csb.cs = 0; csb.cs = 0;
csb.count = 0; csb.count = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment