Commit 25407e00 authored by Yizhen Fan's avatar Yizhen Fan Committed by fanyizhen1995
Browse files

ub: ubcore add register/unregister seg api.



driver inclusion
category: feature
bugzilla: NA
CVE: NA

--------------------------------

Ubcore add register/unregister seg api, which will finally call hw driver's
registered method register/unregister seg.

register_seg:
The UB Core invokes the UBN driver to register the segment and key.
Input parameter:
dev: UB device that registers the segment.
cfg: basic information about the segment to be registered.
udata: contains the pointer of the URMA context and the address of the
private data exchanged between the UBN user-mode driver and
kernel-mode driver.
Output parameter:
None.
Return value:
If the registration is successful, the segment structure pointer is
returned. The returned information includes the segment key ID.
The registration fails and NULL is returned.

unregister_seg:
The UB Core invokes the UBN driver to deregister the segment and ukey.
Input parameter:
tseg: pointer to the target segment to be deregistered
Return value:
The value 0 indicates that the deregistration is successful,
and other values indicate that the deregistration fails.

Signed-off-by: default avatarGuoxin Qian <qianguoxin@huawei.com>
Signed-off-by: default avatarYizhen Fan <fanyizhen@huawei.com>
parent 7e21c7d3
Loading
Loading
Loading
Loading
+60 −0
Original line number Diff line number Diff line
@@ -62,3 +62,63 @@ int ubcore_free_key_id(struct ubcore_key_id *key)
	return dev->ops->free_key_id(key);
}
EXPORT_SYMBOL(ubcore_free_key_id);

struct ubcore_target_seg *ubcore_register_seg(struct ubcore_device *dev,
					      const struct ubcore_seg_cfg *cfg,
					      struct ubcore_udata *udata)
{
	struct ubcore_target_seg *tseg;

	if (dev == NULL || cfg == NULL || dev->ops->register_seg == NULL ||
	    dev->ops->unregister_seg == NULL) {
		ubcore_log_err("invalid parameter.\n");
		return NULL;
	}

	if ((cfg->flag.bs.access & (UBCORE_ACCESS_REMOTE_WRITE | UBCORE_ACCESS_REMOTE_ATOMIC)) &&
	    !(cfg->flag.bs.access & UBCORE_ACCESS_LOCAL_WRITE)) {
		ubcore_log_err(
			"Local write must be set when either remote write or remote atomic is declared.\n");
		return NULL;
	}

	tseg = dev->ops->register_seg(dev, cfg, udata);
	if (tseg == NULL) {
		ubcore_log_err("UBEP failed to register segment with va:%llu\n", cfg->va);
		return NULL;
	}

	tseg->ub_dev = dev;
	tseg->uctx = ubcore_get_uctx(udata);
	tseg->seg.len = cfg->len;
	tseg->seg.ubva.va = cfg->va;
	tseg->keyid = cfg->keyid;

	(void)memcpy(tseg->seg.ubva.eid.raw, dev->attr.eid.raw, UBCORE_EID_SIZE);
	(void)memcpy(&tseg->seg.attr, &cfg->flag, sizeof(union ubcore_reg_seg_flag));
	atomic_set(&tseg->use_cnt, 0);
	if (tseg->keyid != NULL)
		atomic_inc(&tseg->keyid->use_cnt);

	return tseg;
}
EXPORT_SYMBOL(ubcore_register_seg);

int ubcore_unregister_seg(struct ubcore_target_seg *tseg)
{
	struct ubcore_device *dev;
	int ret;

	if (tseg == NULL || tseg->ub_dev == NULL || tseg->ub_dev->ops->unregister_seg == NULL) {
		ubcore_log_err("invalid parameter.\n");
		return -1;
	}
	dev = tseg->ub_dev;

	if (tseg->keyid != NULL)
		atomic_dec(&tseg->keyid->use_cnt);

	ret = dev->ops->unregister_seg(tseg);
	return ret;
}
EXPORT_SYMBOL(ubcore_unregister_seg);
+16 −0
Original line number Diff line number Diff line
@@ -149,6 +149,22 @@ struct ubcore_key_id *ubcore_alloc_key_id(struct ubcore_device *dev, struct ubco
 * @return: 0 on success, other value on error
 */
int ubcore_free_key_id(struct ubcore_key_id *key);
/**
 * register segment to ubcore device
 * @param[in] dev: the ubcore device handle;
 * @param[in] cfg: segment configurations
 * @param[in] udata (optional): ucontext and user space driver data
 * @return: target segment pointer on success, NULL on error
 */
struct ubcore_target_seg *ubcore_register_seg(struct ubcore_device *dev,
					      const struct ubcore_seg_cfg *cfg,
					      struct ubcore_udata *udata);
/**
 * unregister segment from ubcore device
 * @param[in] tseg: the segment registered before;
 * @return: 0 on success, other value on error
 */
int ubcore_unregister_seg(struct ubcore_target_seg *tseg);
/**
 * create jfc with ubcore device.
 * @param[in] dev: the ubcore device handle;