Unverified Commit e7af416a authored by Richard Fitzgerald's avatar Richard Fitzgerald Committed by Mark Brown
Browse files

firmware: cs_dsp: Remove unused struct list_head from cs_dsp_coeff_ctl



Remove two unused pointers from struct cs_dsp_coeff_ctl by taking the
struct list_head out of struct cs_dsp_alg_region. On a x86_64 build
this saves 16 bytes per control.

Each cs_dsp_coeff_ctl instance needs to keep information about the
algorithm region it refers to. This is done by embedding an instance
of struct cs_dsp_alg_region. But cs_dsp_alg_region was also used to
store entries in a list of algorithm regions, and so had a struct
list_head object for that purpose. This list_head object is not used
with the embedded object in struct cs_dsp_alg_region so was just
wasted bytes.

A new struct cs_dsp_alg_region_list_item has been defined for creating
the list of algorithm regions. It contains a struct cs_dsp_alg_region
and a struct list_head.

Signed-off-by: default avatarRichard Fitzgerald <rf@opensource.cirrus.com>
Link: https://patch.msgid.link/20250616103052.66537-1-rf@opensource.cirrus.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 000d8b94
Loading
Loading
Loading
Loading
+25 −20
Original line number Diff line number Diff line
@@ -311,6 +311,11 @@ static const struct cs_dsp_ops cs_dsp_adsp2_ops[];
static const struct cs_dsp_ops cs_dsp_halo_ops;
static const struct cs_dsp_ops cs_dsp_halo_ao_ops;

struct cs_dsp_alg_region_list_item {
	struct list_head list;
	struct cs_dsp_alg_region alg_region;
};

struct cs_dsp_buf {
	struct list_head list;
	void *buf;
@@ -1752,13 +1757,13 @@ static void *cs_dsp_read_algs(struct cs_dsp *dsp, size_t n_algs,
struct cs_dsp_alg_region *cs_dsp_find_alg_region(struct cs_dsp *dsp,
						 int type, unsigned int id)
{
	struct cs_dsp_alg_region *alg_region;
	struct cs_dsp_alg_region_list_item *item;

	lockdep_assert_held(&dsp->pwr_lock);

	list_for_each_entry(alg_region, &dsp->alg_regions, list) {
		if (id == alg_region->alg && type == alg_region->type)
			return alg_region;
	list_for_each_entry(item, &dsp->alg_regions, list) {
		if (id == item->alg_region.alg && type == item->alg_region.type)
			return &item->alg_region;
	}

	return NULL;
@@ -1769,35 +1774,35 @@ static struct cs_dsp_alg_region *cs_dsp_create_region(struct cs_dsp *dsp,
						      int type, __be32 id,
						      __be32 ver, __be32 base)
{
	struct cs_dsp_alg_region *alg_region;
	struct cs_dsp_alg_region_list_item *item;

	alg_region = kzalloc(sizeof(*alg_region), GFP_KERNEL);
	if (!alg_region)
	item = kzalloc(sizeof(*item), GFP_KERNEL);
	if (!item)
		return ERR_PTR(-ENOMEM);

	alg_region->type = type;
	alg_region->alg = be32_to_cpu(id);
	alg_region->ver = be32_to_cpu(ver);
	alg_region->base = be32_to_cpu(base);
	item->alg_region.type = type;
	item->alg_region.alg = be32_to_cpu(id);
	item->alg_region.ver = be32_to_cpu(ver);
	item->alg_region.base = be32_to_cpu(base);

	list_add_tail(&alg_region->list, &dsp->alg_regions);
	list_add_tail(&item->list, &dsp->alg_regions);

	if (dsp->wmfw_ver > 0)
		cs_dsp_ctl_fixup_base(dsp, alg_region);
		cs_dsp_ctl_fixup_base(dsp, &item->alg_region);

	return alg_region;
	return &item->alg_region;
}

static void cs_dsp_free_alg_regions(struct cs_dsp *dsp)
{
	struct cs_dsp_alg_region *alg_region;
	struct cs_dsp_alg_region_list_item *item;

	while (!list_empty(&dsp->alg_regions)) {
		alg_region = list_first_entry(&dsp->alg_regions,
					      struct cs_dsp_alg_region,
		item = list_first_entry(&dsp->alg_regions,
					struct cs_dsp_alg_region_list_item,
					list);
		list_del(&alg_region->list);
		kfree(alg_region);
		list_del(&item->list);
		kfree(item);
	}
}

+0 −2
Original line number Diff line number Diff line
@@ -64,14 +64,12 @@ struct cs_dsp_region {

/**
 * struct cs_dsp_alg_region - Describes a logical algorithm region in DSP address space
 * @list:	List node for internal use
 * @alg:	Algorithm id
 * @ver:	Expected algorithm version
 * @type:	Memory region type
 * @base:	Address of region
 */
struct cs_dsp_alg_region {
	struct list_head list;
	unsigned int alg;
	unsigned int ver;
	int type;