⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hcp_if.c

📁 linux内核源码
💻 C
📖 第 1 页 / 共 2 页
字号:
				      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 + -