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

Commit 9ad70d6d authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

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

parents ca41d72d 3b271916
Loading
Loading
Loading
Loading
+26 −7
Original line number Original line Diff line number Diff line
@@ -39,8 +39,6 @@
#define dcc_readl(drvdata, off)						\
#define dcc_readl(drvdata, off)						\
	__raw_readl(drvdata->base + 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)					\
#define dcc_sram_readl(drvdata, off)					\
	__raw_readl(drvdata->ram_base + off)
	__raw_readl(drvdata->ram_base + off)


@@ -129,6 +127,16 @@ struct dcc_drvdata {
	uint64_t		xpu_addr;
	uint64_t		xpu_addr;
	uint32_t		xpu_unlock_count;
	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)
static int dcc_cfg_xpu(struct dcc_drvdata *drvdata, bool enable)
{
{
@@ -277,12 +285,17 @@ static int __dcc_ll_cfg(struct dcc_drvdata *drvdata)
		if (!prev_addr || prev_addr != addr || prev_off > off) {
		if (!prev_addr || prev_addr != addr || prev_off > off) {
			/* Check if we need to write link of prev entry */
			/* Check if we need to write link of prev entry */
			if (link) {
			if (link) {
				dcc_sram_writel(drvdata, link, sram_offset);
				ret = dcc_sram_writel(drvdata,
							link, sram_offset);
				if (ret)
					goto overstep;
				sram_offset += 4;
				sram_offset += 4;
			}
			}


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


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


		if (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;
			sram_offset += 4;
			link = 0;
			link = 0;
		}
		}
@@ -332,12 +347,16 @@ static int __dcc_ll_cfg(struct dcc_drvdata *drvdata)
	}
	}


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


	/* Setting zero to indicate end of the list */
	/* 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;
	sram_offset += 4;


	/* check if the data will overstep */
	/* check if the data will overstep */