📄 hcp_if.c
字号:
ist, /* r5 */ 0, 0, 0, 0, 0); if (ret != H_SUCCESS && ret != H_BUSY) ehca_gen_err("Could not query interrupt state."); return ret;}u64 hipz_h_register_rpage_cq(const struct ipz_adapter_handle adapter_handle, const struct ipz_cq_handle cq_handle, struct ehca_pfcq *pfcq, const u8 pagesize, const u8 queue_type, const u64 logical_address_of_page, const u64 count, const struct h_galpa gal){ if (count != 1) { ehca_gen_err("Page counter=%lx", count); return H_PARAMETER; } return hipz_h_register_rpage(adapter_handle, pagesize, queue_type, cq_handle.handle, logical_address_of_page, count);}u64 hipz_h_register_rpage_qp(const struct ipz_adapter_handle adapter_handle, const struct ipz_qp_handle qp_handle, struct ehca_pfqp *pfqp, const u8 pagesize, const u8 queue_type, const u64 logical_address_of_page, const u64 count, const struct h_galpa galpa){ if (count > 1) { ehca_gen_err("Page counter=%lx", count); return H_PARAMETER; } return hipz_h_register_rpage(adapter_handle, pagesize, queue_type, qp_handle.handle, logical_address_of_page, count);}u64 hipz_h_disable_and_get_wqe(const struct ipz_adapter_handle adapter_handle, const struct ipz_qp_handle qp_handle, struct ehca_pfqp *pfqp, void **log_addr_next_sq_wqe2processed, void **log_addr_next_rq_wqe2processed, int dis_and_get_function_code){ 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, const struct ipz_qp_handle qp_handle, struct ehca_pfqp *pfqp, const u64 update_mask, struct hcp_modify_qp_control_block *mqpcb, struct h_galpa gal){ u64 ret; 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=%li", ret); return ret;}u64 hipz_h_query_qp(const struct ipz_adapter_handle adapter_handle, const struct ipz_qp_handle qp_handle, struct ehca_pfqp *pfqp, struct hcp_modify_qp_control_block *qqpcb, struct h_galpa gal){ 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 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_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=%li", ret); 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=%li", ret); return ret;}u64 hipz_h_define_aqp0(const struct ipz_adapter_handle adapter_handle, const struct ipz_qp_handle qp_handle, struct h_galpa gal, u32 port){ 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, const struct ipz_qp_handle qp_handle, struct h_galpa gal, u32 port, u32 * pma_qp_nr, u32 * bma_qp_nr){ u64 ret; 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=%li", ret); return ret;}u64 hipz_h_attach_mcqp(const struct ipz_adapter_handle adapter_handle, const struct ipz_qp_handle qp_handle, struct h_galpa gal, u16 mcg_dlid, u64 subnet_prefix, u64 interface_id){ u64 ret; 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=%li", ret); return ret;}u64 hipz_h_detach_mcqp(const struct ipz_adapter_handle adapter_handle, const struct ipz_qp_handle qp_handle, struct h_galpa gal, u16 mcg_dlid, u64 subnet_prefix, u64 interface_id){ 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, struct ehca_cq *cq, u8 force_flag){ u64 ret; ret = hcp_galpas_dtor(&cq->galpas); if (ret) { ehca_gen_err("Could not destruct cp->galpas"); return H_RESOURCE; } 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=%li ", ret); return ret;}u64 hipz_h_destroy_eq(const struct ipz_adapter_handle adapter_handle, struct ehca_eq *eq){ u64 ret; ret = hcp_galpas_dtor(&eq->galpas); if (ret) { ehca_gen_err("Could not destruct eq->galpas"); return H_RESOURCE; } 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=%li ", ret); return ret;}u64 hipz_h_alloc_resource_mr(const struct ipz_adapter_handle adapter_handle, const struct ehca_mr *mr, const u64 vaddr, const u64 length, const u32 access_ctrl, const struct ipz_pd pd, struct ehca_mr_hipzout_parms *outparms){ u64 ret; u64 outs[PLPAR_HCALL9_BUFSIZE]; ehca_gen_dbg("kernel PAGE_SIZE=%x access_ctrl=%016x " "vaddr=%lx length=%lx", (u32)PAGE_SIZE, access_ctrl, vaddr, length); 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;}u64 hipz_h_register_rpage_mr(const struct ipz_adapter_handle adapter_handle, const struct ehca_mr *mr, const u8 pagesize, const u8 queue_type, const u64 logical_address_of_page, const u64 count){ u64 ret; if (unlikely(ehca_debug_level >= 2)) { if (count > 1) { u64 *kpage; int i; kpage = (u64 *)abs_to_virt(logical_address_of_page); for (i = 0; i < count; i++) ehca_gen_dbg("kpage[%d]=%p", i, (void *)kpage[i]); } else ehca_gen_dbg("kpage=%p", (void *)logical_address_of_page); } if ((count > 1) && (logical_address_of_page & (EHCA_PAGESIZE-1))) { ehca_gen_err("logical_address_of_page not on a 4k boundary " "adapter_handle=%lx mr=%p mr_handle=%lx " "pagesize=%x queue_type=%x " "logical_address_of_page=%lx count=%lx", adapter_handle.handle, mr, mr->ipz_mr_handle.handle, pagesize, queue_type, logical_address_of_page, count); ret = H_PARAMETER; } else ret = hipz_h_register_rpage(adapter_handle, pagesize, queue_type, mr->ipz_mr_handle.handle, logical_address_of_page, count); return ret;}u64 hipz_h_query_mr(const struct ipz_adapter_handle adapter_handle, const struct ehca_mr *mr, struct ehca_mr_hipzout_parms *outparms){ u64 ret; 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;}u64 hipz_h_free_resource_mr(const struct ipz_adapter_handle adapter_handle, const struct ehca_mr *mr){ 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, const struct ehca_mr *mr, const u64 vaddr_in, const u64 length, const u32 access_ctrl, const struct ipz_pd pd, const u64 mr_addr_cb, struct ehca_mr_hipzout_parms *outparms){ u64 ret; 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;}u64 hipz_h_register_smr(const struct ipz_adapter_handle adapter_handle, const struct ehca_mr *mr, const struct ehca_mr *orig_mr, const u64 vaddr_in, const u32 access_ctrl, const struct ipz_pd pd, struct ehca_mr_hipzout_parms *outparms){ u64 ret; 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;}u64 hipz_h_alloc_resource_mw(const struct ipz_adapter_handle adapter_handle, const struct ehca_mw *mw, const struct ipz_pd pd, struct ehca_mw_hipzout_parms *outparms){ u64 ret; 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;}u64 hipz_h_query_mw(const struct ipz_adapter_handle adapter_handle, const struct ehca_mw *mw, struct ehca_mw_hipzout_parms *outparms){ u64 ret; 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;}u64 hipz_h_free_resource_mw(const struct ipz_adapter_handle adapter_handle, const struct ehca_mw *mw){ 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, const u64 ressource_handle, void *rblock, unsigned long *byte_count){ u64 r_cb = virt_to_abs(rblock); if (r_cb & (EHCA_PAGESIZE-1)) { ehca_gen_err("rblock not page aligned."); return H_PARAMETER; } return ehca_plpar_hcall_norets(H_ERROR_DATA, adapter_handle.handle, ressource_handle, r_cb, 0, 0, 0, 0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -