Commit 7166cc3a authored by Lucas De Marchi's avatar Lucas De Marchi
Browse files

drm/xe/configfs: Extract function to parse engine



Move the part that copies the engine to a local buffer so it can be
shared in future for other configfs attributes parsing an engine.

Reviewed-by: default avatarRaag Jadav <raag.jadav@intel.com>
Link: https://lore.kernel.org/r/20250916-wa-bb-cmds-v5-1-306bddbc15da@intel.com


Signed-off-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
parent efa29317
Loading
Loading
Loading
Loading
+21 −11
Original line number Diff line number Diff line
@@ -283,24 +283,34 @@ static bool lookup_engine_mask(const char *pattern, u64 *mask)
	return false;
}

static int parse_engine(const char *s, const char *end_chars, u64 *mask)
{
	char buf[MAX_ENGINE_CLASS_CHARS + MAX_ENGINE_INSTANCE_CHARS + 1];
	size_t len;

	len = strcspn(s, end_chars);
	if (len >= sizeof(buf))
		return -EINVAL;

	memcpy(buf, s, len);
	buf[len] = '\0';

	if (!lookup_engine_mask(buf, mask))
		return -ENOENT;

	return len;
}

static ssize_t engines_allowed_store(struct config_item *item, const char *page,
				     size_t len)
{
	struct xe_config_group_device *dev = to_xe_config_group_device(item);
	size_t patternlen, p;
	ssize_t patternlen, p;
	u64 mask, val = 0;

	for (p = 0; p < len; p += patternlen + 1) {
		char buf[MAX_ENGINE_CLASS_CHARS + MAX_ENGINE_INSTANCE_CHARS + 1];

		patternlen = strcspn(page + p, ",\n");
		if (patternlen >= sizeof(buf))
			return -EINVAL;

		memcpy(buf, page + p, patternlen);
		buf[patternlen] = '\0';

		if (!lookup_engine_mask(buf, &mask))
		patternlen = parse_engine(page + p, ",\n", &mask);
		if (patternlen < 0)
			return -EINVAL;

		val |= mask;