Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4e518ff1 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "soc: qcom: dcc: Avoid dcc_sram_writel overflow"

parents df7800e1 1f6dc5f6
Loading
Loading
Loading
Loading
+26 −7
Original line number Diff line number Diff line
@@ -33,8 +33,6 @@
#define dcc_readl(drvdata, off)						\
	__raw_readl(drvdata->base + off)

#define dcc_sram_writel(drvdata, val, off)				\
	__raw_writel((val), drvdata->ram_base + off)
#define dcc_sram_readl(drvdata, off)					\
	__raw_readl(drvdata->ram_base + off)

@@ -123,6 +121,16 @@ struct dcc_drvdata {
	uint64_t		xpu_addr;
	uint32_t		xpu_unlock_count;
};
static int dcc_sram_writel(struct dcc_drvdata *drvdata,
					uint32_t val, uint32_t off)
{
	if (unlikely(off > (drvdata->ram_size - 4)))
		return -EINVAL;

	__raw_writel((val), drvdata->ram_base + off);

	return 0;
}

static int dcc_cfg_xpu(struct dcc_drvdata *drvdata, bool enable)
{
@@ -271,12 +279,17 @@ static int __dcc_ll_cfg(struct dcc_drvdata *drvdata)
		if (!prev_addr || prev_addr != addr || prev_off > off) {
			/* Check if we need to write link of prev entry */
			if (link) {
				dcc_sram_writel(drvdata, link, sram_offset);
				ret = dcc_sram_writel(drvdata,
							link, sram_offset);
				if (ret)
					goto overstep;
				sram_offset += 4;
			}

			/* Write address */
			dcc_sram_writel(drvdata, addr, sram_offset);
			ret = dcc_sram_writel(drvdata, addr, sram_offset);
			if (ret)
				goto overstep;
			sram_offset += 4;

			/* Reset link and prev_off */
@@ -316,7 +329,9 @@ static int __dcc_ll_cfg(struct dcc_drvdata *drvdata)
			 ((entry->len << 8) & BM(8, 14))) << pos;

		if (pos) {
			dcc_sram_writel(drvdata, link, sram_offset);
			ret = dcc_sram_writel(drvdata, link, sram_offset);
			if (ret)
				goto overstep;
			sram_offset += 4;
			link = 0;
		}
@@ -326,12 +341,16 @@ static int __dcc_ll_cfg(struct dcc_drvdata *drvdata)
	}

	if (link) {
		dcc_sram_writel(drvdata, link, sram_offset);
		ret = dcc_sram_writel(drvdata, link, sram_offset);
		if (ret)
			goto overstep;
		sram_offset += 4;
	}

	/* Setting zero to indicate end of the list */
	dcc_sram_writel(drvdata, 0, sram_offset);
	ret = dcc_sram_writel(drvdata, 0, sram_offset);
	if (ret)
		goto overstep;
	sram_offset += 4;

	/* check if the data will overstep */