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 + -
显示快捷键?