linux-stable/drivers/dma/idxd/defaults.c

54 lines
1.2 KiB
C
Raw Normal View History

dmaengine: idxd: Add support for device/wq defaults Add a load_device_defaults() function pointer to struct idxd_driver_data, which if defined, will be called when an idxd device is probed and will allow the idxd device to be configured with default values. The load_device_defaults() function is passed an idxd device to work with to set specific device attributes. Also add a load_device_defaults() implementation IAA devices; future patches would add default functions for other device types such as DSA. The way idxd device probing works, if the device configuration is valid at that point e.g. at least one workqueue and engine is properly configured then the device will be enabled and ready to go. The IAA implementation, idxd_load_iaa_device_defaults(), configures a single workqueue (wq0) for each device with the following default values: mode "dedicated" threshold 0 size Total WQ Size from WQCAP priority 10 type IDXD_WQT_KERNEL group 0 name "iaa_crypto" driver_name "crypto" Note that this now adds another configuration step for any users that want to configure their own devices/workqueus with something different in that they'll first need to disable (in the case of IAA) wq0 and the device itself before they can set their own attributes and re-enable, since they've been already been auto-enabled. Note also that in order for the new configuration to be applied to the deflate-iaa crypto algorithm the iaa_crypto module needs to unregister the old version, which is accomplished by removing the iaa_crypto module, and re-registering it with the new configuration by reinserting the iaa_crypto module. Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com> Reviewed-by: Dave Jiang <dave.jiang@intel.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2023-12-05 21:25:30 +00:00
// SPDX-License-Identifier: GPL-2.0
/* Copyright(c) 2023 Intel Corporation. All rights rsvd. */
#include <linux/kernel.h>
#include "idxd.h"
int idxd_load_iaa_device_defaults(struct idxd_device *idxd)
{
struct idxd_engine *engine;
struct idxd_group *group;
struct idxd_wq *wq;
if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
return 0;
wq = idxd->wqs[0];
if (wq->state != IDXD_WQ_DISABLED)
return -EPERM;
/* set mode to "dedicated" */
set_bit(WQ_FLAG_DEDICATED, &wq->flags);
wq->threshold = 0;
/* only setting up 1 wq, so give it all the wq space */
wq->size = idxd->max_wq_size;
/* set priority to 10 */
wq->priority = 10;
/* set type to "kernel" */
wq->type = IDXD_WQT_KERNEL;
/* set wq group to 0 */
group = idxd->groups[0];
wq->group = group;
group->num_wqs++;
/* set name to "iaa_crypto" */
memset(wq->name, 0, WQ_NAME_SIZE + 1);
strscpy(wq->name, "iaa_crypto", WQ_NAME_SIZE + 1);
/* set driver_name to "crypto" */
memset(wq->driver_name, 0, DRIVER_NAME_SIZE + 1);
strscpy(wq->driver_name, "crypto", DRIVER_NAME_SIZE + 1);
engine = idxd->engines[0];
/* set engine group to 0 */
engine->group = idxd->groups[0];
engine->group->num_engines++;
return 0;
}