NX expects OS to return credit for send window after processing each fault. Also credit has to be returned even for fault window.
Signed-off-by: Sukadev Bhattiprolu <suka...@linux.vnet.ibm.com> Signed-off-by: Haren Myneni <ha...@us.ibm.com> --- arch/powerpc/platforms/powernv/vas-fault.c | 9 +++++++++ arch/powerpc/platforms/powernv/vas-window.c | 17 +++++++++++++++++ arch/powerpc/platforms/powernv/vas.h | 1 + 3 files changed, 27 insertions(+) diff --git a/arch/powerpc/platforms/powernv/vas-fault.c b/arch/powerpc/platforms/powernv/vas-fault.c index ad594c8..2a3ee9f 100644 --- a/arch/powerpc/platforms/powernv/vas-fault.c +++ b/arch/powerpc/platforms/powernv/vas-fault.c @@ -244,6 +244,10 @@ static void process_fault_crbs(struct vas_instance *vinst) memset(fifo, 0, CRB_SIZE); mutex_unlock(&vinst->mutex); + /* + * Return credit for the fault window. + */ + vas_return_credit(vinst->fault_win, 0); pr_devel("VAS[%d] fault_fifo %p, fifo %p, fault_crbs %d pending %d\n", vinst->vas_id, vinst->fault_fifo, fifo, vinst->fault_crbs, @@ -270,6 +274,11 @@ static void process_fault_crbs(struct vas_instance *vinst) } update_csb(window, crb); + /* + * Return credit for send window after processing + * fault CRB. + */ + vas_return_credit(window, 1); } while (true); } diff --git a/arch/powerpc/platforms/powernv/vas-window.c b/arch/powerpc/platforms/powernv/vas-window.c index ca208a3..1c0788c 100644 --- a/arch/powerpc/platforms/powernv/vas-window.c +++ b/arch/powerpc/platforms/powernv/vas-window.c @@ -1323,6 +1323,23 @@ int vas_win_close(struct vas_window *window) EXPORT_SYMBOL_GPL(vas_win_close); /* + * Return credit for the given window. + */ +void vas_return_credit(struct vas_window *window, bool tx) +{ + uint64_t val; + + val = 0ULL; + if (tx) { /* send window */ + val = SET_FIELD(VAS_TX_WCRED, val, 1); + write_hvwc_reg(window, VREG(TX_WCRED_ADDER), val); + } else { + val = SET_FIELD(VAS_LRX_WCRED, val, 1); + write_hvwc_reg(window, VREG(LRX_WCRED_ADDER), val); + } +} + +/* * Return a system-wide unique window id for the window @win. */ u32 vas_win_id(struct vas_window *win) diff --git a/arch/powerpc/platforms/powernv/vas.h b/arch/powerpc/platforms/powernv/vas.h index 75bea1d..b8b90f3 100644 --- a/arch/powerpc/platforms/powernv/vas.h +++ b/arch/powerpc/platforms/powernv/vas.h @@ -421,6 +421,7 @@ struct vas_winctx { extern void vas_wakeup_fault_handler(int virq, void *arg); extern int vas_setup_fault_handler(struct vas_instance *vinst); extern void vas_cleanup_fault_handler(struct vas_instance *vinst); +extern void vas_return_credit(struct vas_window *window, bool tx); extern struct vas_window *vas_pswid_to_window(struct vas_instance *vinst, uint32_t pswid); -- 1.8.3.1