diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c index 159b0be..2380994 100644 --- a/drivers/infiniband/hw/ehca/ehca_main.c +++ b/drivers/infiniband/hw/ehca/ehca_main.c @@ -5,6 +5,7 @@ * * Authors: Heiko J Schick * Hoang-Nam Nguyen + * Joachim Fenkes * * Copyright (c) 2005 IBM Corporation * @@ -48,7 +49,7 @@ #include "hcp_if.h" MODULE_LICENSE("Dual BSD/GPL"); MODULE_AUTHOR("Christoph Raisch "); MODULE_DESCRIPTION("IBM eServer HCA InfiniBand Device Driver"); -MODULE_VERSION("SVNEHCA_0015"); +MODULE_VERSION("SVNEHCA_0016"); int ehca_open_aqp1 = 0; int ehca_debug_level = 0; @@ -749,7 +750,7 @@ int __init ehca_module_init(void) int ret; printk(KERN_INFO "eHCA Infiniband Device Driver " - "(Rel.: SVNEHCA_0015)\n"); + "(Rel.: SVNEHCA_0016)\n"); idr_init(&ehca_qp_idr); idr_init(&ehca_cq_idr); spin_lock_init(&ehca_qp_idr_lock); diff --git a/drivers/infiniband/hw/ehca/hcp_if.c b/drivers/infiniband/hw/ehca/hcp_if.c index 260e82a..3fb46e6 100644 --- a/drivers/infiniband/hw/ehca/hcp_if.c +++ b/drivers/infiniband/hw/ehca/hcp_if.c @@ -48,27 +48,27 @@ #include "hcp_phyp.h" #include "hipz_fns.h" #include "ipz_pt_fn.h" -#define H_ALL_RES_QP_ENHANCED_OPS EHCA_BMASK_IBM(9,11) -#define H_ALL_RES_QP_PTE_PIN EHCA_BMASK_IBM(12,12) -#define H_ALL_RES_QP_SERVICE_TYPE EHCA_BMASK_IBM(13,15) -#define H_ALL_RES_QP_LL_RQ_CQE_POSTING EHCA_BMASK_IBM(18,18) -#define H_ALL_RES_QP_LL_SQ_CQE_POSTING EHCA_BMASK_IBM(19,21) -#define H_ALL_RES_QP_SIGNALING_TYPE EHCA_BMASK_IBM(22,23) -#define H_ALL_RES_QP_UD_AV_LKEY_CTRL EHCA_BMASK_IBM(31,31) -#define H_ALL_RES_QP_RESOURCE_TYPE EHCA_BMASK_IBM(56,63) - -#define H_ALL_RES_QP_MAX_OUTST_SEND_WR EHCA_BMASK_IBM(0,15) -#define H_ALL_RES_QP_MAX_OUTST_RECV_WR EHCA_BMASK_IBM(16,31) -#define H_ALL_RES_QP_MAX_SEND_SGE EHCA_BMASK_IBM(32,39) -#define H_ALL_RES_QP_MAX_RECV_SGE EHCA_BMASK_IBM(40,47) - -#define H_ALL_RES_QP_ACT_OUTST_SEND_WR EHCA_BMASK_IBM(16,31) -#define H_ALL_RES_QP_ACT_OUTST_RECV_WR EHCA_BMASK_IBM(48,63) -#define H_ALL_RES_QP_ACT_SEND_SGE EHCA_BMASK_IBM(8,15) -#define H_ALL_RES_QP_ACT_RECV_SGE EHCA_BMASK_IBM(24,31) - -#define H_ALL_RES_QP_SQUEUE_SIZE_PAGES EHCA_BMASK_IBM(0,31) -#define H_ALL_RES_QP_RQUEUE_SIZE_PAGES EHCA_BMASK_IBM(32,63) +#define H_ALL_RES_QP_ENHANCED_OPS EHCA_BMASK_IBM(9, 11) +#define H_ALL_RES_QP_PTE_PIN EHCA_BMASK_IBM(12, 12) +#define H_ALL_RES_QP_SERVICE_TYPE EHCA_BMASK_IBM(13, 15) +#define H_ALL_RES_QP_LL_RQ_CQE_POSTING EHCA_BMASK_IBM(18, 18) +#define H_ALL_RES_QP_LL_SQ_CQE_POSTING EHCA_BMASK_IBM(19, 21) +#define H_ALL_RES_QP_SIGNALING_TYPE EHCA_BMASK_IBM(22, 23) +#define H_ALL_RES_QP_UD_AV_LKEY_CTRL EHCA_BMASK_IBM(31, 31) +#define H_ALL_RES_QP_RESOURCE_TYPE EHCA_BMASK_IBM(56, 63) + +#define H_ALL_RES_QP_MAX_OUTST_SEND_WR EHCA_BMASK_IBM(0, 15) +#define H_ALL_RES_QP_MAX_OUTST_RECV_WR EHCA_BMASK_IBM(16, 31) +#define H_ALL_RES_QP_MAX_SEND_SGE EHCA_BMASK_IBM(32, 39) +#define H_ALL_RES_QP_MAX_RECV_SGE EHCA_BMASK_IBM(40, 47) + +#define H_ALL_RES_QP_ACT_OUTST_SEND_WR EHCA_BMASK_IBM(16, 31) +#define H_ALL_RES_QP_ACT_OUTST_RECV_WR EHCA_BMASK_IBM(48, 63) +#define H_ALL_RES_QP_ACT_SEND_SGE EHCA_BMASK_IBM(8, 15) +#define H_ALL_RES_QP_ACT_RECV_SGE EHCA_BMASK_IBM(24, 31) + +#define H_ALL_RES_QP_SQUEUE_SIZE_PAGES EHCA_BMASK_IBM(0, 31) +#define H_ALL_RES_QP_RQUEUE_SIZE_PAGES EHCA_BMASK_IBM(32, 63) /* direct access qp controls */ #define DAQP_CTRL_ENABLE 0x01 @@ -95,35 +95,25 @@ static u32 get_longbusy_msecs(int longbu } } -static long ehca_hcall_7arg_7ret(unsigned long opcode, - unsigned long arg1, - unsigned long arg2, - unsigned long arg3, - unsigned long arg4, - unsigned long arg5, - unsigned long arg6, - unsigned long arg7, - unsigned long *out1, - unsigned long *out2, - unsigned long *out3, - unsigned long *out4, - unsigned long *out5, - unsigned long *out6, - unsigned long *out7) +static long ehca_plpar_hcall_norets(unsigned long opcode, + unsigned long arg1, + unsigned long arg2, + unsigned long arg3, + unsigned long arg4, + unsigned long arg5, + unsigned long arg6, + unsigned long arg7) { long ret; int i, sleep_msecs; - ehca_gen_dbg("opcode=%lx arg1=%lx arg2=%lx arg3=%lx arg4=%lx arg5=%lx " - "arg6=%lx arg7=%lx", opcode, arg1, arg2, arg3, arg4, arg5, - arg6, arg7); + ehca_gen_dbg("opcode=%lx arg1=%lx arg2=%lx arg3=%lx arg4=%lx " + "arg5=%lx arg6=%lx arg7=%lx", + opcode, arg1, arg2, arg3, arg4, arg5, arg6, arg7); for (i = 0; i < 5; i++) { - ret = plpar_hcall_7arg_7ret(opcode, - arg1, arg2, arg3, arg4, - arg5, arg6, arg7, - out1, out2, out3, out4, - out5, out6,out7); + ret = plpar_hcall_norets(opcode, arg1, arg2, arg3, arg4, + arg5, arg6, arg7); if (H_IS_LONG_BUSY(ret)) { sleep_msecs = get_longbusy_msecs(ret); @@ -134,44 +124,30 @@ static long ehca_hcall_7arg_7ret(unsigne if (ret < H_SUCCESS) ehca_gen_err("opcode=%lx ret=%lx" " arg1=%lx arg2=%lx arg3=%lx arg4=%lx" - " arg5=%lx arg6=%lx arg7=%lx" - " out1=%lx out2=%lx out3=%lx out4=%lx" - " out5=%lx out6=%lx out7=%lx", + " arg5=%lx arg6=%lx arg7=%lx ", opcode, ret, - arg1, arg2, arg3, arg4, - arg5, arg6, arg7, - *out1, *out2, *out3, *out4, - *out5, *out6, *out7); + arg1, arg2, arg3, arg4, arg5, + arg6, arg7); - ehca_gen_dbg("opcode=%lx ret=%lx out1=%lx out2=%lx out3=%lx " - "out4=%lx out5=%lx out6=%lx out7=%lx", - opcode, ret, *out1, *out2, *out3, *out4, *out5, - *out6, *out7); + ehca_gen_dbg("opcode=%lx ret=%lx", opcode, ret); return ret; + } return H_BUSY; } -static long ehca_hcall_9arg_9ret(unsigned long opcode, - unsigned long arg1, - unsigned long arg2, - unsigned long arg3, - unsigned long arg4, - unsigned long arg5, - unsigned long arg6, - unsigned long arg7, - unsigned long arg8, - unsigned long arg9, - unsigned long *out1, - unsigned long *out2, - unsigned long *out3, - unsigned long *out4, - unsigned long *out5, - unsigned long *out6, - unsigned long *out7, - unsigned long *out8, - unsigned long *out9) +static long ehca_plpar_hcall9(unsigned long opcode, + unsigned long *outs, /* array of 9 outputs */ + unsigned long arg1, + unsigned long arg2, + unsigned long arg3, + unsigned long arg4, + unsigned long arg5, + unsigned long arg6, + unsigned long arg7, + unsigned long arg8, + unsigned long arg9) { long ret; int i, sleep_msecs; @@ -182,13 +158,9 @@ static long ehca_hcall_9arg_9ret(unsigne arg8, arg9); for (i = 0; i < 5; i++) { - ret = plpar_hcall_9arg_9ret(opcode, - arg1, arg2, arg3, arg4, - arg5, arg6, arg7, arg8, - arg9, - out1, out2, out3, out4, - out5, out6, out7, out8, - out9); + ret = plpar_hcall9(opcode, outs, + arg1, arg2, arg3, arg4, arg5, + arg6, arg7, arg8, arg9); if (H_IS_LONG_BUSY(ret)) { sleep_msecs = get_longbusy_msecs(ret); @@ -205,37 +177,35 @@ static long ehca_hcall_9arg_9ret(unsigne " out5=%lx out6=%lx out7=%lx out8=%lx" " out9=%lx", opcode, ret, - arg1, arg2, arg3, arg4, - arg5, arg6, arg7, arg8, - arg9, - *out1, *out2, *out3, *out4, - *out5, *out6, *out7, *out8, - *out9); + arg1, arg2, arg3, arg4, arg5, + arg6, arg7, arg8, arg9, + outs[0], outs[1], outs[2], outs[3], + outs[4], outs[5], outs[6], outs[7], + outs[8]); ehca_gen_dbg("opcode=%lx ret=%lx out1=%lx out2=%lx out3=%lx " "out4=%lx out5=%lx out6=%lx out7=%lx out8=%lx " - "out9=%lx", opcode, ret,*out1, *out2, *out3, *out4, - *out5, *out6, *out7, *out8, *out9); + "out9=%lx", + opcode, ret, outs[0], outs[1], outs[2], outs[3], + outs[4], outs[5], outs[6], outs[7], outs[8]); return ret; } return H_BUSY; } - u64 hipz_h_alloc_resource_eq(const struct ipz_adapter_handle adapter_handle, struct ehca_pfeq *pfeq, const u32 neq_control, const u32 number_of_entries, struct ipz_eq_handle *eq_handle, - u32 * act_nr_of_entries, - u32 * act_pages, - u32 * eq_ist) + u32 *act_nr_of_entries, + u32 *act_pages, + u32 *eq_ist) { u64 ret; - u64 dummy; + u64 outs[PLPAR_HCALL9_BUFSIZE]; u64 allocate_controls; - u64 act_nr_of_entries_out, act_pages_out, eq_ist_out; /* resource type */ allocate_controls = 3ULL; @@ -246,22 +216,15 @@ u64 hipz_h_alloc_resource_eq(const struc else /* notification event queue */ allocate_controls = (1ULL << 63) | allocate_controls; - ret = ehca_hcall_7arg_7ret(H_ALLOC_RESOURCE, - adapter_handle.handle, /* r4 */ - allocate_controls, /* r5 */ - number_of_entries, /* r6 */ - 0, 0, 0, 0, - &eq_handle->handle, /* r4 */ - &dummy, /* r5 */ - &dummy, /* r6 */ - &act_nr_of_entries_out, /* r7 */ - &act_pages_out, /* r8 */ - &eq_ist_out, /* r8 */ - &dummy); - - *act_nr_of_entries = (u32)act_nr_of_entries_out; - *act_pages = (u32)act_pages_out; - *eq_ist = (u32)eq_ist_out; + ret = ehca_plpar_hcall9(H_ALLOC_RESOURCE, outs, + adapter_handle.handle, /* r4 */ + allocate_controls, /* r5 */ + number_of_entries, /* r6 */ + 0, 0, 0, 0, 0, 0); + eq_handle->handle = outs[0]; + *act_nr_of_entries = (u32)outs[3]; + *act_pages = (u32)outs[4]; + *eq_ist = (u32)outs[5]; if (ret == H_NOT_ENOUGH_RESOURCES) ehca_gen_err("Not enough resource - ret=%lx ", ret); @@ -273,20 +236,11 @@ u64 hipz_h_reset_event(const struct ipz_ struct ipz_eq_handle eq_handle, const u64 event_mask) { - u64 dummy; - - return ehca_hcall_7arg_7ret(H_RESET_EVENTS, - adapter_handle.handle, /* r4 */ - eq_handle.handle, /* r5 */ - event_mask, /* r6 */ - 0, 0, 0, 0, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy); + return ehca_plpar_hcall_norets(H_RESET_EVENTS, + adapter_handle.handle, /* r4 */ + eq_handle.handle, /* r5 */ + event_mask, /* r6 */ + 0, 0, 0, 0); } u64 hipz_h_alloc_resource_cq(const struct ipz_adapter_handle adapter_handle, @@ -294,30 +248,21 @@ u64 hipz_h_alloc_resource_cq(const struc struct ehca_alloc_cq_parms *param) { u64 ret; - u64 dummy; - u64 act_nr_of_entries_out, act_pages_out; - u64 g_la_privileged_out, g_la_user_out; - - ret = ehca_hcall_7arg_7ret(H_ALLOC_RESOURCE, - adapter_handle.handle, /* r4 */ - 2, /* r5 */ - param->eq_handle.handle, /* r6 */ - cq->token, /* r7 */ - param->nr_cqe, /* r8 */ - 0, 0, - &cq->ipz_cq_handle.handle, /* r4 */ - &dummy, /* r5 */ - &dummy, /* r6 */ - &act_nr_of_entries_out, /* r7 */ - &act_pages_out, /* r8 */ - &g_la_privileged_out, /* r9 */ - &g_la_user_out); /* r10 */ - - param->act_nr_of_entries = (u32)act_nr_of_entries_out; - param->act_pages = (u32)act_pages_out; + u64 outs[PLPAR_HCALL9_BUFSIZE]; + + ret = ehca_plpar_hcall9(H_ALLOC_RESOURCE, outs, + adapter_handle.handle, /* r4 */ + 2, /* r5 */ + param->eq_handle.handle, /* r6 */ + cq->token, /* r7 */ + param->nr_cqe, /* r8 */ + 0, 0, 0, 0); + cq->ipz_cq_handle.handle = outs[0]; + param->act_nr_of_entries = (u32)outs[3]; + param->act_pages = (u32)outs[4]; if (ret == H_SUCCESS) - hcp_galpas_ctor(&cq->galpas, g_la_privileged_out, g_la_user_out); + hcp_galpas_ctor(&cq->galpas, outs[5], outs[6]); if (ret == H_NOT_ENOUGH_RESOURCES) ehca_gen_err("Not enough resources. ret=%lx", ret); @@ -330,8 +275,9 @@ u64 hipz_h_alloc_resource_qp(const struc struct ehca_alloc_qp_parms *parms) { u64 ret; - u64 dummy, allocate_controls, max_r10_reg; - u64 qp_nr_out, r6_out, r7_out, r8_out, g_la_user_out, r11_out; + u64 allocate_controls; + u64 max_r10_reg; + u64 outs[PLPAR_HCALL9_BUFSIZE]; u16 max_nr_receive_wqes = qp->init_attr.cap.max_recv_wr + 1; u16 max_nr_send_wqes = qp->init_attr.cap.max_send_wr + 1; int daqp_ctrl = parms->daqp_ctrl; @@ -360,48 +306,36 @@ u64 hipz_h_alloc_resource_qp(const struc | EHCA_BMASK_SET(H_ALL_RES_QP_MAX_RECV_SGE, parms->max_recv_sge); - - ret = ehca_hcall_9arg_9ret(H_ALLOC_RESOURCE, - adapter_handle.handle, /* r4 */ - allocate_controls, /* r5 */ - qp->send_cq->ipz_cq_handle.handle, - qp->recv_cq->ipz_cq_handle.handle, - parms->ipz_eq_handle.handle, - ((u64)qp->token << 32) | parms->pd.value, - max_r10_reg, /* r10 */ - parms->ud_av_l_key_ctl, /* r11 */ - 0, - &qp->ipz_qp_handle.handle, - &qp_nr_out, /* r5 */ - &r6_out, /* r6 */ - &r7_out, /* r7 */ - &r8_out, /* r8 */ - &dummy, /* r9 */ - &g_la_user_out, /* r10 */ - &r11_out, - &dummy); - - /* extract outputs */ - qp->real_qp_num = (u32)qp_nr_out; - + ret = ehca_plpar_hcall9(H_ALLOC_RESOURCE, outs, + adapter_handle.handle, /* r4 */ + allocate_controls, /* r5 */ + qp->send_cq->ipz_cq_handle.handle, + qp->recv_cq->ipz_cq_handle.handle, + parms->ipz_eq_handle.handle, + ((u64)qp->token << 32) | parms->pd.value, + max_r10_reg, /* r10 */ + parms->ud_av_l_key_ctl, /* r11 */ + 0); + qp->ipz_qp_handle.handle = outs[0]; + qp->real_qp_num = (u32)outs[1]; parms->act_nr_send_sges = - (u16)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_OUTST_SEND_WR, r6_out); + (u16)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_OUTST_SEND_WR, outs[2]); parms->act_nr_recv_wqes = - (u16)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_OUTST_RECV_WR, r6_out); + (u16)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_OUTST_RECV_WR, outs[2]); parms->act_nr_send_sges = - (u8)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_SEND_SGE, r7_out); + (u8)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_SEND_SGE, outs[3]); parms->act_nr_recv_sges = - (u8)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_RECV_SGE, r7_out); + (u8)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_RECV_SGE, outs[3]); parms->nr_sq_pages = - (u32)EHCA_BMASK_GET(H_ALL_RES_QP_SQUEUE_SIZE_PAGES, r8_out); + (u32)EHCA_BMASK_GET(H_ALL_RES_QP_SQUEUE_SIZE_PAGES, outs[4]); parms->nr_rq_pages = - (u32)EHCA_BMASK_GET(H_ALL_RES_QP_RQUEUE_SIZE_PAGES, r8_out); + (u32)EHCA_BMASK_GET(H_ALL_RES_QP_RQUEUE_SIZE_PAGES, outs[4]); if (ret == H_SUCCESS) - hcp_galpas_ctor(&qp->galpas, g_la_user_out, g_la_user_out); + hcp_galpas_ctor(&qp->galpas, outs[6], outs[6]); if (ret == H_NOT_ENOUGH_RESOURCES) - ehca_gen_err("Not enough resources. ret=%lx",ret); + ehca_gen_err("Not enough resources. ret=%lx", ret); return ret; } @@ -411,7 +345,6 @@ u64 hipz_h_query_port(const struct ipz_a struct hipz_query_port *query_port_response_block) { u64 ret; - u64 dummy; u64 r_cb = virt_to_abs(query_port_response_block); if (r_cb & (EHCA_PAGESIZE-1)) { @@ -419,18 +352,11 @@ u64 hipz_h_query_port(const struct ipz_a return H_PARAMETER; } - ret = ehca_hcall_7arg_7ret(H_QUERY_PORT, - adapter_handle.handle, /* r4 */ - port_id, /* r5 */ - r_cb, /* r6 */ - 0, 0, 0, 0, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy); + ret = ehca_plpar_hcall_norets(H_QUERY_PORT, + adapter_handle.handle, /* r4 */ + port_id, /* r5 */ + r_cb, /* r6 */ + 0, 0, 0, 0); if (ehca_debug_level) ehca_dmp(query_port_response_block, 64, "response_block"); @@ -441,7 +367,6 @@ u64 hipz_h_query_port(const struct ipz_a u64 hipz_h_query_hca(const struct ipz_adapter_handle adapter_handle, struct hipz_query_hca *query_hca_rblock) { - u64 dummy; u64 r_cb = virt_to_abs(query_hca_rblock); if (r_cb & (EHCA_PAGESIZE-1)) { @@ -450,17 +375,10 @@ u64 hipz_h_query_hca(const struct ipz_ad return H_PARAMETER; } - return ehca_hcall_7arg_7ret(H_QUERY_HCA, - adapter_handle.handle, /* r4 */ - r_cb, /* r5 */ - 0, 0, 0, 0, 0, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy); + return ehca_plpar_hcall_norets(H_QUERY_HCA, + adapter_handle.handle, /* r4 */ + r_cb, /* r5 */ + 0, 0, 0, 0, 0); } u64 hipz_h_register_rpage(const struct ipz_adapter_handle adapter_handle, @@ -470,22 +388,13 @@ u64 hipz_h_register_rpage(const struct i const u64 logical_address_of_page, u64 count) { - u64 dummy; - - return ehca_hcall_7arg_7ret(H_REGISTER_RPAGES, - adapter_handle.handle, /* r4 */ - queue_type | pagesize << 8, /* r5 */ - resource_handle, /* r6 */ - logical_address_of_page, /* r7 */ - count, /* r8 */ - 0, 0, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy); + return ehca_plpar_hcall_norets(H_REGISTER_RPAGES, + adapter_handle.handle, /* r4 */ + queue_type | pagesize << 8, /* r5 */ + resource_handle, /* r6 */ + logical_address_of_page, /* r7 */ + count, /* r8 */ + 0, 0); } u64 hipz_h_register_rpage_eq(const struct ipz_adapter_handle adapter_handle, @@ -507,23 +416,14 @@ u64 hipz_h_register_rpage_eq(const struc logical_address_of_page, count); } -u32 hipz_h_query_int_state(const struct ipz_adapter_handle adapter_handle, +u64 hipz_h_query_int_state(const struct ipz_adapter_handle adapter_handle, u32 ist) { - u32 ret; - u64 dummy; - - ret = ehca_hcall_7arg_7ret(H_QUERY_INT_STATE, - adapter_handle.handle, /* r4 */ - ist, /* r5 */ - 0, 0, 0, 0, 0, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy); + u64 ret; + ret = ehca_plpar_hcall_norets(H_QUERY_INT_STATE, + adapter_handle.handle, /* r4 */ + ist, /* r5 */ + 0, 0, 0, 0, 0); if (ret != H_SUCCESS && ret != H_BUSY) ehca_gen_err("Could not query interrupt state."); @@ -576,25 +476,20 @@ u64 hipz_h_disable_and_get_wqe(const str void **log_addr_next_rq_wqe2processed, int dis_and_get_function_code) { - u64 dummy, dummy1, dummy2; - - if (!log_addr_next_sq_wqe2processed) - log_addr_next_sq_wqe2processed = (void**)&dummy1; - if (!log_addr_next_rq_wqe2processed) - log_addr_next_rq_wqe2processed = (void**)&dummy2; - - return ehca_hcall_7arg_7ret(H_DISABLE_AND_GETC, - adapter_handle.handle, /* r4 */ - dis_and_get_function_code, /* r5 */ - qp_handle.handle, /* r6 */ - 0, 0, 0, 0, - (void*)log_addr_next_sq_wqe2processed, - (void*)log_addr_next_rq_wqe2processed, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy); + u64 ret; + u64 outs[PLPAR_HCALL9_BUFSIZE]; + + ret = ehca_plpar_hcall9(H_DISABLE_AND_GETC, outs, + adapter_handle.handle, /* r4 */ + dis_and_get_function_code, /* r5 */ + qp_handle.handle, /* r6 */ + 0, 0, 0, 0, 0, 0); + if (log_addr_next_sq_wqe2processed) + *log_addr_next_sq_wqe2processed = (void*)outs[0]; + if (log_addr_next_rq_wqe2processed) + *log_addr_next_rq_wqe2processed = (void*)outs[1]; + + return ret; } u64 hipz_h_modify_qp(const struct ipz_adapter_handle adapter_handle, @@ -605,22 +500,13 @@ u64 hipz_h_modify_qp(const struct ipz_ad struct h_galpa gal) { u64 ret; - u64 dummy; - u64 invalid_attribute_identifier, rc_attrib_mask; - - ret = ehca_hcall_7arg_7ret(H_MODIFY_QP, - adapter_handle.handle, /* r4 */ - qp_handle.handle, /* r5 */ - update_mask, /* r6 */ - virt_to_abs(mqpcb), /* r7 */ - 0, 0, 0, - &invalid_attribute_identifier, /* r4 */ - &dummy, /* r5 */ - &dummy, /* r6 */ - &dummy, /* r7 */ - &dummy, /* r8 */ - &rc_attrib_mask, /* r9 */ - &dummy); + u64 outs[PLPAR_HCALL9_BUFSIZE]; + ret = ehca_plpar_hcall9(H_MODIFY_QP, outs, + adapter_handle.handle, /* r4 */ + qp_handle.handle, /* r5 */ + update_mask, /* r6 */ + virt_to_abs(mqpcb), /* r7 */ + 0, 0, 0, 0, 0); if (ret == H_NOT_ENOUGH_RESOURCES) ehca_gen_err("Insufficient resources ret=%lx", ret); @@ -634,61 +520,37 @@ u64 hipz_h_query_qp(const struct ipz_ada struct hcp_modify_qp_control_block *qqpcb, struct h_galpa gal) { - u64 dummy; - - return ehca_hcall_7arg_7ret(H_QUERY_QP, - adapter_handle.handle, /* r4 */ - qp_handle.handle, /* r5 */ - virt_to_abs(qqpcb), /* r6 */ - 0, 0, 0, 0, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy); + return ehca_plpar_hcall_norets(H_QUERY_QP, + adapter_handle.handle, /* r4 */ + qp_handle.handle, /* r5 */ + virt_to_abs(qqpcb), /* r6 */ + 0, 0, 0, 0); } u64 hipz_h_destroy_qp(const struct ipz_adapter_handle adapter_handle, struct ehca_qp *qp) { u64 ret; - u64 dummy; - u64 ladr_next_sq_wqe_out, ladr_next_rq_wqe_out; + u64 outs[PLPAR_HCALL9_BUFSIZE]; ret = hcp_galpas_dtor(&qp->galpas); if (ret) { ehca_gen_err("Could not destruct qp->galpas"); return H_RESOURCE; } - ret = ehca_hcall_7arg_7ret(H_DISABLE_AND_GETC, - adapter_handle.handle, /* r4 */ - /* function code */ - 1, /* r5 */ - qp->ipz_qp_handle.handle, /* r6 */ - 0, 0, 0, 0, - &ladr_next_sq_wqe_out, /* r4 */ - &ladr_next_rq_wqe_out, /* r5 */ - &dummy, - &dummy, - &dummy, - &dummy, - &dummy); + ret = ehca_plpar_hcall9(H_DISABLE_AND_GETC, outs, + adapter_handle.handle, /* r4 */ + /* function code */ + 1, /* r5 */ + qp->ipz_qp_handle.handle, /* r6 */ + 0, 0, 0, 0, 0, 0); if (ret == H_HARDWARE) ehca_gen_err("HCA not operational. ret=%lx", ret); - ret = ehca_hcall_7arg_7ret(H_FREE_RESOURCE, - adapter_handle.handle, /* r4 */ - qp->ipz_qp_handle.handle, /* r5 */ - 0, 0, 0, 0, 0, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy); + ret = ehca_plpar_hcall_norets(H_FREE_RESOURCE, + adapter_handle.handle, /* r4 */ + qp->ipz_qp_handle.handle, /* r5 */ + 0, 0, 0, 0, 0); if (ret == H_RESOURCE) ehca_gen_err("Resource still in use. ret=%lx", ret); @@ -701,20 +563,11 @@ u64 hipz_h_define_aqp0(const struct ipz_ struct h_galpa gal, u32 port) { - u64 dummy; - - return ehca_hcall_7arg_7ret(H_DEFINE_AQP0, - adapter_handle.handle, /* r4 */ - qp_handle.handle, /* r5 */ - port, /* r6 */ - 0, 0, 0, 0, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy); + return ehca_plpar_hcall_norets(H_DEFINE_AQP0, + adapter_handle.handle, /* r4 */ + qp_handle.handle, /* r5 */ + port, /* r6 */ + 0, 0, 0, 0); } u64 hipz_h_define_aqp1(const struct ipz_adapter_handle adapter_handle, @@ -724,24 +577,15 @@ u64 hipz_h_define_aqp1(const struct ipz_ u32 * bma_qp_nr) { u64 ret; - u64 dummy; - u64 pma_qp_nr_out, bma_qp_nr_out; - - ret = ehca_hcall_7arg_7ret(H_DEFINE_AQP1, - adapter_handle.handle, /* r4 */ - qp_handle.handle, /* r5 */ - port, /* r6 */ - 0, 0, 0, 0, - &pma_qp_nr_out, /* r4 */ - &bma_qp_nr_out, /* r5 */ - &dummy, - &dummy, - &dummy, - &dummy, - &dummy); - - *pma_qp_nr = (u32)pma_qp_nr_out; - *bma_qp_nr = (u32)bma_qp_nr_out; + u64 outs[PLPAR_HCALL9_BUFSIZE]; + + ret = ehca_plpar_hcall9(H_DEFINE_AQP1, outs, + adapter_handle.handle, /* r4 */ + qp_handle.handle, /* r5 */ + port, /* r6 */ + 0, 0, 0, 0, 0, 0); + *pma_qp_nr = (u32)outs[0]; + *bma_qp_nr = (u32)outs[1]; if (ret == H_ALIAS_EXIST) ehca_gen_err("AQP1 already exists. ret=%lx", ret); @@ -756,22 +600,14 @@ u64 hipz_h_attach_mcqp(const struct ipz_ u64 subnet_prefix, u64 interface_id) { u64 ret; - u64 dummy; - - ret = ehca_hcall_7arg_7ret(H_ATTACH_MCQP, - adapter_handle.handle, /* r4 */ - qp_handle.handle, /* r5 */ - mcg_dlid, /* r6 */ - interface_id, /* r7 */ - subnet_prefix, /* r8 */ - 0, 0, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy); + + ret = ehca_plpar_hcall_norets(H_ATTACH_MCQP, + adapter_handle.handle, /* r4 */ + qp_handle.handle, /* r5 */ + mcg_dlid, /* r6 */ + interface_id, /* r7 */ + subnet_prefix, /* r8 */ + 0, 0); if (ret == H_NOT_ENOUGH_RESOURCES) ehca_gen_err("Not enough resources. ret=%lx", ret); @@ -785,22 +621,13 @@ u64 hipz_h_detach_mcqp(const struct ipz_ u16 mcg_dlid, u64 subnet_prefix, u64 interface_id) { - u64 dummy; - - return ehca_hcall_7arg_7ret(H_DETACH_MCQP, - adapter_handle.handle, /* r4 */ - qp_handle.handle, /* r5 */ - mcg_dlid, /* r6 */ - interface_id, /* r7 */ - subnet_prefix, /* r8 */ - 0, 0, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy); + return ehca_plpar_hcall_norets(H_DETACH_MCQP, + adapter_handle.handle, /* r4 */ + qp_handle.handle, /* r5 */ + mcg_dlid, /* r6 */ + interface_id, /* r7 */ + subnet_prefix, /* r8 */ + 0, 0); } u64 hipz_h_destroy_cq(const struct ipz_adapter_handle adapter_handle, @@ -808,7 +635,6 @@ u64 hipz_h_destroy_cq(const struct ipz_a u8 force_flag) { u64 ret; - u64 dummy; ret = hcp_galpas_dtor(&cq->galpas); if (ret) { @@ -816,18 +642,11 @@ u64 hipz_h_destroy_cq(const struct ipz_a return H_RESOURCE; } - ret = ehca_hcall_7arg_7ret(H_FREE_RESOURCE, - adapter_handle.handle, /* r4 */ - cq->ipz_cq_handle.handle, /* r5 */ - force_flag != 0 ? 1L : 0L, /* r6 */ - 0, 0, 0, 0, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy); + ret = ehca_plpar_hcall_norets(H_FREE_RESOURCE, + adapter_handle.handle, /* r4 */ + cq->ipz_cq_handle.handle, /* r5 */ + force_flag != 0 ? 1L : 0L, /* r6 */ + 0, 0, 0, 0); if (ret == H_RESOURCE) ehca_gen_err("H_FREE_RESOURCE failed ret=%lx ", ret); @@ -839,7 +658,6 @@ u64 hipz_h_destroy_eq(const struct ipz_a struct ehca_eq *eq) { u64 ret; - u64 dummy; ret = hcp_galpas_dtor(&eq->galpas); if (ret) { @@ -847,18 +665,10 @@ u64 hipz_h_destroy_eq(const struct ipz_a return H_RESOURCE; } - ret = ehca_hcall_7arg_7ret(H_FREE_RESOURCE, - adapter_handle.handle, /* r4 */ - eq->ipz_eq_handle.handle, /* r5 */ - 0, 0, 0, 0, 0, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy); - + ret = ehca_plpar_hcall_norets(H_FREE_RESOURCE, + adapter_handle.handle, /* r4 */ + eq->ipz_eq_handle.handle, /* r5 */ + 0, 0, 0, 0, 0); if (ret == H_RESOURCE) ehca_gen_err("Resource in use. ret=%lx ", ret); @@ -875,27 +685,19 @@ u64 hipz_h_alloc_resource_mr(const struc struct ehca_mr_hipzout_parms *outparms) { u64 ret; - u64 dummy; - u64 lkey_out; - u64 rkey_out; - - ret = ehca_hcall_7arg_7ret(H_ALLOC_RESOURCE, - adapter_handle.handle, /* r4 */ - 5, /* r5 */ - vaddr, /* r6 */ - length, /* r7 */ - (((u64)access_ctrl) << 32ULL), /* r8 */ - pd.value, /* r9 */ - 0, - &(outparms->handle.handle), /* r4 */ - &dummy, /* r5 */ - &lkey_out, /* r6 */ - &rkey_out, /* r7 */ - &dummy, - &dummy, - &dummy); - outparms->lkey = (u32)lkey_out; - outparms->rkey = (u32)rkey_out; + u64 outs[PLPAR_HCALL9_BUFSIZE]; + + ret = ehca_plpar_hcall9(H_ALLOC_RESOURCE, outs, + adapter_handle.handle, /* r4 */ + 5, /* r5 */ + vaddr, /* r6 */ + length, /* r7 */ + (((u64)access_ctrl) << 32ULL), /* r8 */ + pd.value, /* r9 */ + 0, 0, 0); + outparms->handle.handle = outs[0]; + outparms->lkey = (u32)outs[2]; + outparms->rkey = (u32)outs[3]; return ret; } @@ -923,7 +725,6 @@ u64 hipz_h_register_rpage_mr(const struc queue_type, mr->ipz_mr_handle.handle, logical_address_of_page, count); - return ret; } @@ -932,24 +733,17 @@ u64 hipz_h_query_mr(const struct ipz_ada struct ehca_mr_hipzout_parms *outparms) { u64 ret; - u64 dummy; - u64 remote_len_out, remote_vaddr_out, acc_ctrl_pd_out, r9_out; - - ret = ehca_hcall_7arg_7ret(H_QUERY_MR, - adapter_handle.handle, /* r4 */ - mr->ipz_mr_handle.handle, /* r5 */ - 0, 0, 0, 0, 0, - &outparms->len, /* r4 */ - &outparms->vaddr, /* r5 */ - &remote_len_out, /* r6 */ - &remote_vaddr_out, /* r7 */ - &acc_ctrl_pd_out, /* r8 */ - &r9_out, - &dummy); - - outparms->acl = acc_ctrl_pd_out >> 32; - outparms->lkey = (u32)(r9_out >> 32); - outparms->rkey = (u32)(r9_out & (0xffffffff)); + u64 outs[PLPAR_HCALL9_BUFSIZE]; + + ret = ehca_plpar_hcall9(H_QUERY_MR, outs, + adapter_handle.handle, /* r4 */ + mr->ipz_mr_handle.handle, /* r5 */ + 0, 0, 0, 0, 0, 0, 0); + outparms->len = outs[0]; + outparms->vaddr = outs[1]; + outparms->acl = outs[4] >> 32; + outparms->lkey = (u32)(outs[5] >> 32); + outparms->rkey = (u32)(outs[5] & (0xffffffff)); return ret; } @@ -957,19 +751,10 @@ u64 hipz_h_query_mr(const struct ipz_ada u64 hipz_h_free_resource_mr(const struct ipz_adapter_handle adapter_handle, const struct ehca_mr *mr) { - u64 dummy; - - return ehca_hcall_7arg_7ret(H_FREE_RESOURCE, - adapter_handle.handle, /* r4 */ - mr->ipz_mr_handle.handle, /* r5 */ - 0, 0, 0, 0, 0, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy); + return ehca_plpar_hcall_norets(H_FREE_RESOURCE, + adapter_handle.handle, /* r4 */ + mr->ipz_mr_handle.handle, /* r5 */ + 0, 0, 0, 0, 0); } u64 hipz_h_reregister_pmr(const struct ipz_adapter_handle adapter_handle, @@ -982,28 +767,20 @@ u64 hipz_h_reregister_pmr(const struct i struct ehca_mr_hipzout_parms *outparms) { u64 ret; - u64 dummy; - u64 lkey_out, rkey_out; - - ret = ehca_hcall_7arg_7ret(H_REREGISTER_PMR, - adapter_handle.handle, /* r4 */ - mr->ipz_mr_handle.handle, /* r5 */ - vaddr_in, /* r6 */ - length, /* r7 */ - /* r8 */ - ((((u64)access_ctrl) << 32ULL) | pd.value), - mr_addr_cb, /* r9 */ - 0, - &dummy, /* r4 */ - &outparms->vaddr, /* r5 */ - &lkey_out, /* r6 */ - &rkey_out, /* r7 */ - &dummy, - &dummy, - &dummy); - - outparms->lkey = (u32)lkey_out; - outparms->rkey = (u32)rkey_out; + u64 outs[PLPAR_HCALL9_BUFSIZE]; + + ret = ehca_plpar_hcall9(H_REREGISTER_PMR, outs, + adapter_handle.handle, /* r4 */ + mr->ipz_mr_handle.handle, /* r5 */ + vaddr_in, /* r6 */ + length, /* r7 */ + /* r8 */ + ((((u64)access_ctrl) << 32ULL) | pd.value), + mr_addr_cb, /* r9 */ + 0, 0, 0); + outparms->vaddr = outs[1]; + outparms->lkey = (u32)outs[2]; + outparms->rkey = (u32)outs[3]; return ret; } @@ -1017,25 +794,18 @@ u64 hipz_h_register_smr(const struct ipz struct ehca_mr_hipzout_parms *outparms) { u64 ret; - u64 dummy; - u64 lkey_out, rkey_out; - - ret = ehca_hcall_7arg_7ret(H_REGISTER_SMR, - adapter_handle.handle, /* r4 */ - orig_mr->ipz_mr_handle.handle, /* r5 */ - vaddr_in, /* r6 */ - (((u64)access_ctrl) << 32ULL), /* r7 */ - pd.value, /* r8 */ - 0, 0, - &(outparms->handle.handle), /* r4 */ - &dummy, /* r5 */ - &lkey_out, /* r6 */ - &rkey_out, /* r7 */ - &dummy, - &dummy, - &dummy); - outparms->lkey = (u32)lkey_out; - outparms->rkey = (u32)rkey_out; + u64 outs[PLPAR_HCALL9_BUFSIZE]; + + ret = ehca_plpar_hcall9(H_REGISTER_SMR, outs, + adapter_handle.handle, /* r4 */ + orig_mr->ipz_mr_handle.handle, /* r5 */ + vaddr_in, /* r6 */ + (((u64)access_ctrl) << 32ULL), /* r7 */ + pd.value, /* r8 */ + 0, 0, 0, 0); + outparms->handle.handle = outs[0]; + outparms->lkey = (u32)outs[2]; + outparms->rkey = (u32)outs[3]; return ret; } @@ -1046,23 +816,15 @@ u64 hipz_h_alloc_resource_mw(const struc struct ehca_mw_hipzout_parms *outparms) { u64 ret; - u64 dummy; - u64 rkey_out; - - ret = ehca_hcall_7arg_7ret(H_ALLOC_RESOURCE, - adapter_handle.handle, /* r4 */ - 6, /* r5 */ - pd.value, /* r6 */ - 0, 0, 0, 0, - &(outparms->handle.handle), /* r4 */ - &dummy, /* r5 */ - &dummy, /* r6 */ - &rkey_out, /* r7 */ - &dummy, - &dummy, - &dummy); - - outparms->rkey = (u32)rkey_out; + u64 outs[PLPAR_HCALL9_BUFSIZE]; + + ret = ehca_plpar_hcall9(H_ALLOC_RESOURCE, outs, + adapter_handle.handle, /* r4 */ + 6, /* r5 */ + pd.value, /* r6 */ + 0, 0, 0, 0, 0, 0); + outparms->handle.handle = outs[0]; + outparms->rkey = (u32)outs[3]; return ret; } @@ -1072,21 +834,13 @@ u64 hipz_h_query_mw(const struct ipz_ada struct ehca_mw_hipzout_parms *outparms) { u64 ret; - u64 dummy; - u64 pd_out, rkey_out; - - ret = ehca_hcall_7arg_7ret(H_QUERY_MW, - adapter_handle.handle, /* r4 */ - mw->ipz_mw_handle.handle, /* r5 */ - 0, 0, 0, 0, 0, - &dummy, /* r4 */ - &dummy, /* r5 */ - &dummy, /* r6 */ - &rkey_out, /* r7 */ - &pd_out, /* r8 */ - &dummy, - &dummy); - outparms->rkey = (u32)rkey_out; + u64 outs[PLPAR_HCALL9_BUFSIZE]; + + ret = ehca_plpar_hcall9(H_QUERY_MW, outs, + adapter_handle.handle, /* r4 */ + mw->ipz_mw_handle.handle, /* r5 */ + 0, 0, 0, 0, 0, 0, 0); + outparms->rkey = (u32)outs[3]; return ret; } @@ -1094,19 +848,10 @@ u64 hipz_h_query_mw(const struct ipz_ada u64 hipz_h_free_resource_mw(const struct ipz_adapter_handle adapter_handle, const struct ehca_mw *mw) { - u64 dummy; - - return ehca_hcall_7arg_7ret(H_FREE_RESOURCE, - adapter_handle.handle, /* r4 */ - mw->ipz_mw_handle.handle, /* r5 */ - 0, 0, 0, 0, 0, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy); + return ehca_plpar_hcall_norets(H_FREE_RESOURCE, + adapter_handle.handle, /* r4 */ + mw->ipz_mw_handle.handle, /* r5 */ + 0, 0, 0, 0, 0); } u64 hipz_h_error_data(const struct ipz_adapter_handle adapter_handle, @@ -1114,7 +859,6 @@ u64 hipz_h_error_data(const struct ipz_a void *rblock, unsigned long *byte_count) { - u64 dummy; u64 r_cb = virt_to_abs(rblock); if (r_cb & (EHCA_PAGESIZE-1)) { @@ -1122,16 +866,9 @@ u64 hipz_h_error_data(const struct ipz_a return H_PARAMETER; } - return ehca_hcall_7arg_7ret(H_ERROR_DATA, - adapter_handle.handle, - ressource_handle, - r_cb, - 0, 0, 0, 0, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy, - &dummy); + return ehca_plpar_hcall_norets(H_ERROR_DATA, + adapter_handle.handle, + ressource_handle, + r_cb, + 0, 0, 0, 0); } diff --git a/drivers/infiniband/hw/ehca/hcp_if.h b/drivers/infiniband/hw/ehca/hcp_if.h index 39956d8..587ebd4 100644 --- a/drivers/infiniband/hw/ehca/hcp_if.h +++ b/drivers/infiniband/hw/ehca/hcp_if.h @@ -107,7 +107,7 @@ u64 hipz_h_register_rpage_eq(const struc const u64 logical_address_of_page, const u64 count); -u32 hipz_h_query_int_state(const struct ipz_adapter_handle +u64 hipz_h_query_int_state(const struct ipz_adapter_handle hcp_adapter_handle, u32 ist); diff --git a/drivers/infiniband/hw/ehca/hipz_hw.h b/drivers/infiniband/hw/ehca/hipz_hw.h index f5f4871..3fc92b0 100644 --- a/drivers/infiniband/hw/ehca/hipz_hw.h +++ b/drivers/infiniband/hw/ehca/hipz_hw.h @@ -184,8 +184,6 @@ struct hipz_mrmwmm { }; -#define MRX_HCR_LPARID_VALID EHCA_BMASK_IBM(0,0) - #define MRMWMM_OFFSET(x) offsetof(struct hipz_mrmwmm,x) struct hipz_qpedmm { diff --git a/drivers/infiniband/hw/ehca/ipz_pt_fn.h b/drivers/infiniband/hw/ehca/ipz_pt_fn.h index 7e55a31..2f13509 100644 --- a/drivers/infiniband/hw/ehca/ipz_pt_fn.h +++ b/drivers/infiniband/hw/ehca/ipz_pt_fn.h @@ -226,10 +226,9 @@ static inline void *ipz_eqit_eq_get_inc_ { void *ret = ipz_qeit_get(queue); u32 qe = *(u8 *) ret; - if ((qe >> 7) == (queue->toggle_state & 1)) - ipz_qeit_eq_get_inc(queue); /* this is a good one */ - else - ret = NULL; + if ((qe >> 7) != (queue->toggle_state & 1)) + return NULL; + ipz_qeit_eq_get_inc(queue); /* this is a good one */ return ret; }