/** * nfp_resource_release() - Release a NFP Resource handle * @res: NFP Resource handle * * NOTE: This function implictly unlocks the resource handle
*/ void nfp_resource_release(struct nfp_resource *res)
{
nfp_cpp_mutex_unlock(res->mutex);
nfp_cpp_mutex_free(res->mutex);
kfree(res);
}
/** * nfp_resource_wait() - Wait for resource to appear * @cpp: NFP CPP handle * @name: Name of the resource * @secs: Number of seconds to wait * * Wait for resource to appear in the resource table, grab and release * its lock. The wait is jiffies-based, don't expect fine granularity. * * Return: 0 on success, errno otherwise.
*/ int nfp_resource_wait(struct nfp_cpp *cpp, constchar *name, unsignedint secs)
{ unsignedlong warn_at = jiffies + NFP_MUTEX_WAIT_FIRST_WARN * HZ; unsignedlong err_at = jiffies + secs * HZ; struct nfp_resource *res;
while (true) {
res = nfp_resource_acquire(cpp, name); if (!IS_ERR(res)) {
nfp_resource_release(res); return 0;
}
if (PTR_ERR(res) != -ENOENT) {
nfp_err(cpp, "error waiting for resource %s: %ld\n",
name, PTR_ERR(res)); return PTR_ERR(res);
} if (time_is_before_eq_jiffies(err_at)) {
nfp_err(cpp, "timeout waiting for resource %s\n", name); return -ETIMEDOUT;
} if (time_is_before_eq_jiffies(warn_at)) {
warn_at = jiffies + NFP_MUTEX_WAIT_NEXT_WARN * HZ;
nfp_info(cpp, "waiting for NFP resource %s\n", name);
} if (msleep_interruptible(10)) {
nfp_err(cpp, "wait for resource %s interrupted\n",
name); return -ERESTARTSYS;
}
}
}
/** * nfp_resource_cpp_id() - Return the cpp_id of a resource handle * @res: NFP Resource handle * * Return: NFP CPP ID
*/
u32 nfp_resource_cpp_id(struct nfp_resource *res)
{ return res->cpp_id;
}
/** * nfp_resource_name() - Return the name of a resource handle * @res: NFP Resource handle * * Return: const char pointer to the name of the resource
*/ constchar *nfp_resource_name(struct nfp_resource *res)
{ return res->name;
}
/** * nfp_resource_address() - Return the address of a resource handle * @res: NFP Resource handle * * Return: Address of the resource
*/
u64 nfp_resource_address(struct nfp_resource *res)
{ return res->addr;
}
/** * nfp_resource_size() - Return the size in bytes of a resource handle * @res: NFP Resource handle * * Return: Size of the resource in bytes
*/
u64 nfp_resource_size(struct nfp_resource *res)
{ return res->size;
}
/** * nfp_resource_table_init() - Run initial checks on the resource table * @cpp: NFP CPP handle * * Start-of-day init procedure for resource table. Must be called before * any local resource table users may exist. * * Return: 0 on success, -errno on failure
*/ int nfp_resource_table_init(struct nfp_cpp *cpp)
{ struct nfp_cpp_mutex *dev_mutex; int i, err;
err = nfp_cpp_mutex_reclaim(cpp, NFP_RESOURCE_TBL_TARGET,
NFP_RESOURCE_TBL_BASE); if (err < 0) {
nfp_err(cpp, "Error: failed to reclaim resource table mutex\n"); return err;
} if (err)
nfp_warn(cpp, "Warning: busted main resource table mutex\n");
dev_mutex = nfp_cpp_mutex_alloc(cpp, NFP_RESOURCE_TBL_TARGET,
NFP_RESOURCE_TBL_BASE,
NFP_RESOURCE_TBL_KEY); if (!dev_mutex) return -ENOMEM;
if (nfp_cpp_mutex_lock(dev_mutex)) {
nfp_err(cpp, "Error: failed to claim resource table mutex\n");
nfp_cpp_mutex_free(dev_mutex); return -EINVAL;
}
/* Resource 0 is the dev_mutex, start from 1 */ for (i = 1; i < NFP_RESOURCE_TBL_ENTRIES; i++) {
u64 addr = NFP_RESOURCE_TBL_BASE + sizeof(struct nfp_resource_entry) * i;
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.19Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.