ehea_phyp.c
来自「linux 内核源代码」· C语言 代码 · 共 627 行 · 第 1/2 页
C
627 行
u64 outs[PLPAR_HCALL9_BUFSIZE]; hret = ehea_plpar_hcall9(H_ALLOC_HEA_RESOURCE, outs, adapter_handle, /* R4 */ H_ALL_RES_TYPE_CQ, /* R5 */ cq_attr->eq_handle, /* R6 */ cq_attr->cq_token, /* R7 */ cq_attr->max_nr_of_cqes, /* R8 */ 0, 0, 0, 0); /* R9-R12 */ *cq_handle = outs[0]; cq_attr->act_nr_of_cqes = outs[3]; cq_attr->nr_pages = outs[4]; if (!hret) hcp_epas_ctor(epas, outs[5], outs[6]); return hret;}/* Defines for H_CALL H_ALLOC_RESOURCE */#define H_ALL_RES_TYPE_QP 1#define H_ALL_RES_TYPE_CQ 2#define H_ALL_RES_TYPE_EQ 3#define H_ALL_RES_TYPE_MR 5#define H_ALL_RES_TYPE_MW 6/* input param R5 */#define H_ALL_RES_EQ_NEQ EHEA_BMASK_IBM(0, 0)#define H_ALL_RES_EQ_NON_NEQ_ISN EHEA_BMASK_IBM(6, 7)#define H_ALL_RES_EQ_INH_EQE_GEN EHEA_BMASK_IBM(16, 16)#define H_ALL_RES_EQ_RES_TYPE EHEA_BMASK_IBM(56, 63)/* input param R6 */#define H_ALL_RES_EQ_MAX_EQE EHEA_BMASK_IBM(32, 63)/* output param R6 */#define H_ALL_RES_EQ_LIOBN EHEA_BMASK_IBM(32, 63)/* output param R7 */#define H_ALL_RES_EQ_ACT_EQE EHEA_BMASK_IBM(32, 63)/* output param R8 */#define H_ALL_RES_EQ_ACT_PS EHEA_BMASK_IBM(32, 63)/* output param R9 */#define H_ALL_RES_EQ_ACT_EQ_IST_C EHEA_BMASK_IBM(30, 31)#define H_ALL_RES_EQ_ACT_EQ_IST_1 EHEA_BMASK_IBM(40, 63)/* output param R10 */#define H_ALL_RES_EQ_ACT_EQ_IST_2 EHEA_BMASK_IBM(40, 63)/* output param R11 */#define H_ALL_RES_EQ_ACT_EQ_IST_3 EHEA_BMASK_IBM(40, 63)/* output param R12 */#define H_ALL_RES_EQ_ACT_EQ_IST_4 EHEA_BMASK_IBM(40, 63)u64 ehea_h_alloc_resource_eq(const u64 adapter_handle, struct ehea_eq_attr *eq_attr, u64 *eq_handle){ u64 hret, allocate_controls; u64 outs[PLPAR_HCALL9_BUFSIZE]; /* resource type */ allocate_controls = EHEA_BMASK_SET(H_ALL_RES_EQ_RES_TYPE, H_ALL_RES_TYPE_EQ) | EHEA_BMASK_SET(H_ALL_RES_EQ_NEQ, eq_attr->type ? 1 : 0) | EHEA_BMASK_SET(H_ALL_RES_EQ_INH_EQE_GEN, !eq_attr->eqe_gen) | EHEA_BMASK_SET(H_ALL_RES_EQ_NON_NEQ_ISN, 1); hret = ehea_plpar_hcall9(H_ALLOC_HEA_RESOURCE, outs, adapter_handle, /* R4 */ allocate_controls, /* R5 */ eq_attr->max_nr_of_eqes, /* R6 */ 0, 0, 0, 0, 0, 0); /* R7-R10 */ *eq_handle = outs[0]; eq_attr->act_nr_of_eqes = outs[3]; eq_attr->nr_pages = outs[4]; eq_attr->ist1 = outs[5]; eq_attr->ist2 = outs[6]; eq_attr->ist3 = outs[7]; eq_attr->ist4 = outs[8]; return hret;}u64 ehea_h_modify_ehea_qp(const u64 adapter_handle, const u8 cat, const u64 qp_handle, const u64 sel_mask, void *cb_addr, u64 *inv_attr_id, u64 *proc_mask, u16 *out_swr, u16 *out_rwr){ u64 hret; u64 outs[PLPAR_HCALL9_BUFSIZE]; hret = ehea_plpar_hcall9(H_MODIFY_HEA_QP, outs, adapter_handle, /* R4 */ (u64) cat, /* R5 */ qp_handle, /* R6 */ sel_mask, /* R7 */ virt_to_abs(cb_addr), /* R8 */ 0, 0, 0, 0); /* R9-R12 */ *inv_attr_id = outs[0]; *out_swr = outs[3]; *out_rwr = outs[4]; *proc_mask = outs[5]; return hret;}u64 ehea_h_register_rpage(const u64 adapter_handle, const u8 pagesize, const u8 queue_type, const u64 resource_handle, const u64 log_pageaddr, u64 count){ u64 reg_control; reg_control = EHEA_BMASK_SET(H_REG_RPAGE_PAGE_SIZE, pagesize) | EHEA_BMASK_SET(H_REG_RPAGE_QT, queue_type); return ehea_plpar_hcall_norets(H_REGISTER_HEA_RPAGES, adapter_handle, /* R4 */ reg_control, /* R5 */ resource_handle, /* R6 */ log_pageaddr, /* R7 */ count, /* R8 */ 0, 0); /* R9-R10 */}u64 ehea_h_register_smr(const u64 adapter_handle, const u64 orig_mr_handle, const u64 vaddr_in, const u32 access_ctrl, const u32 pd, struct ehea_mr *mr){ u64 hret; u64 outs[PLPAR_HCALL9_BUFSIZE]; hret = ehea_plpar_hcall9(H_REGISTER_SMR, outs, adapter_handle , /* R4 */ orig_mr_handle, /* R5 */ vaddr_in, /* R6 */ (((u64)access_ctrl) << 32ULL), /* R7 */ pd, /* R8 */ 0, 0, 0, 0); /* R9-R12 */ mr->handle = outs[0]; mr->lkey = (u32)outs[2]; return hret;}u64 ehea_h_disable_and_get_hea(const u64 adapter_handle, const u64 qp_handle){ u64 outs[PLPAR_HCALL9_BUFSIZE]; return ehea_plpar_hcall9(H_DISABLE_AND_GET_HEA, outs, adapter_handle, /* R4 */ H_DISABLE_GET_EHEA_WQE_P, /* R5 */ qp_handle, /* R6 */ 0, 0, 0, 0, 0, 0); /* R7-R12 */}u64 ehea_h_free_resource(const u64 adapter_handle, const u64 res_handle, u64 force_bit){ return ehea_plpar_hcall_norets(H_FREE_RESOURCE, adapter_handle, /* R4 */ res_handle, /* R5 */ force_bit, 0, 0, 0, 0); /* R7-R10 */}u64 ehea_h_alloc_resource_mr(const u64 adapter_handle, const u64 vaddr, const u64 length, const u32 access_ctrl, const u32 pd, u64 *mr_handle, u32 *lkey){ u64 hret; u64 outs[PLPAR_HCALL9_BUFSIZE]; hret = ehea_plpar_hcall9(H_ALLOC_HEA_RESOURCE, outs, adapter_handle, /* R4 */ 5, /* R5 */ vaddr, /* R6 */ length, /* R7 */ (((u64) access_ctrl) << 32ULL), /* R8 */ pd, /* R9 */ 0, 0, 0); /* R10-R12 */ *mr_handle = outs[0]; *lkey = (u32)outs[2]; return hret;}u64 ehea_h_register_rpage_mr(const u64 adapter_handle, const u64 mr_handle, const u8 pagesize, const u8 queue_type, const u64 log_pageaddr, const u64 count){ if ((count > 1) && (log_pageaddr & ~PAGE_MASK)) { ehea_error("not on pageboundary"); return H_PARAMETER; } return ehea_h_register_rpage(adapter_handle, pagesize, queue_type, mr_handle, log_pageaddr, count);}u64 ehea_h_query_ehea(const u64 adapter_handle, void *cb_addr){ u64 hret, cb_logaddr; cb_logaddr = virt_to_abs(cb_addr); hret = ehea_plpar_hcall_norets(H_QUERY_HEA, adapter_handle, /* R4 */ cb_logaddr, /* R5 */ 0, 0, 0, 0, 0); /* R6-R10 */#ifdef DEBUG ehea_dmp(cb_addr, sizeof(struct hcp_query_ehea), "hcp_query_ehea");#endif return hret;}u64 ehea_h_query_ehea_port(const u64 adapter_handle, const u16 port_num, const u8 cb_cat, const u64 select_mask, void *cb_addr){ u64 port_info; u64 cb_logaddr = virt_to_abs(cb_addr); u64 arr_index = 0; port_info = EHEA_BMASK_SET(H_MEHEAPORT_CAT, cb_cat) | EHEA_BMASK_SET(H_MEHEAPORT_PN, port_num); return ehea_plpar_hcall_norets(H_QUERY_HEA_PORT, adapter_handle, /* R4 */ port_info, /* R5 */ select_mask, /* R6 */ arr_index, /* R7 */ cb_logaddr, /* R8 */ 0, 0); /* R9-R10 */}u64 ehea_h_modify_ehea_port(const u64 adapter_handle, const u16 port_num, const u8 cb_cat, const u64 select_mask, void *cb_addr){ u64 outs[PLPAR_HCALL9_BUFSIZE]; u64 port_info; u64 arr_index = 0; u64 cb_logaddr = virt_to_abs(cb_addr); port_info = EHEA_BMASK_SET(H_MEHEAPORT_CAT, cb_cat) | EHEA_BMASK_SET(H_MEHEAPORT_PN, port_num);#ifdef DEBUG ehea_dump(cb_addr, sizeof(struct hcp_ehea_port_cb0), "Before HCALL");#endif return ehea_plpar_hcall9(H_MODIFY_HEA_PORT, outs, adapter_handle, /* R4 */ port_info, /* R5 */ select_mask, /* R6 */ arr_index, /* R7 */ cb_logaddr, /* R8 */ 0, 0, 0, 0); /* R9-R12 */}u64 ehea_h_reg_dereg_bcmc(const u64 adapter_handle, const u16 port_num, const u8 reg_type, const u64 mc_mac_addr, const u16 vlan_id, const u32 hcall_id){ u64 r5_port_num, r6_reg_type, r7_mc_mac_addr, r8_vlan_id; u64 mac_addr = mc_mac_addr >> 16; r5_port_num = EHEA_BMASK_SET(H_REGBCMC_PN, port_num); r6_reg_type = EHEA_BMASK_SET(H_REGBCMC_REGTYPE, reg_type); r7_mc_mac_addr = EHEA_BMASK_SET(H_REGBCMC_MACADDR, mac_addr); r8_vlan_id = EHEA_BMASK_SET(H_REGBCMC_VLANID, vlan_id); return ehea_plpar_hcall_norets(hcall_id, adapter_handle, /* R4 */ r5_port_num, /* R5 */ r6_reg_type, /* R6 */ r7_mc_mac_addr, /* R7 */ r8_vlan_id, /* R8 */ 0, 0); /* R9-R12 */}u64 ehea_h_reset_events(const u64 adapter_handle, const u64 neq_handle, const u64 event_mask){ return ehea_plpar_hcall_norets(H_RESET_EVENTS, adapter_handle, /* R4 */ neq_handle, /* R5 */ event_mask, /* R6 */ 0, 0, 0, 0); /* R7-R12 */}u64 ehea_h_error_data(const u64 adapter_handle, const u64 ressource_handle, void *rblock){ return ehea_plpar_hcall_norets(H_ERROR_DATA, adapter_handle, /* R4 */ ressource_handle, /* R5 */ virt_to_abs(rblock), /* R6 */ 0, 0, 0, 0); /* R7-R12 */}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?