Commit 7bd845b1 authored by Zhao Qunqin's avatar Zhao Qunqin Committed by Hongchen Zhang
Browse files

LoongArch: Update the flush cache policy

LoongArch inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/IBQ4JL


CVE: NA

--------------------------------

Otherwise, it may cause S3 wake-up failure in Loongson
3A6000 laptop.

Signed-off-by: default avatarZhao Qunqin <zhaoqunqin@loongson.cn>
Change-Id: I91684a1f58792480e9a71612ad8c522ae909e19c
parent 305d3014
Loading
Loading
Loading
Loading
+23 −1
Original line number Diff line number Diff line
@@ -63,6 +63,28 @@ static void flush_cache_leaf(unsigned int leaf)
	} while (--nr_nodes > 0);
}

static void flush_cache_last_level(unsigned int leaf)
{
	u64 addr;
	int i, j, nr_nodes, way_size;
	struct cache_desc *cdesc = current_cpu_data.cache_leaves + leaf;

	nr_nodes = loongson_sysconf.nr_nodes;

	addr = CSR_DMW1_BASE;
	iocsr_write8(0x1, 0x280);
	way_size = cdesc->sets * cdesc->linesz;
	do {
		for (i = 0; i < (cdesc->ways * 3); i++) {
			for (j = 0; j < (cdesc->sets); j++) {
				READ_ONCE(*(u32 *)addr);
				addr += cdesc->linesz;
			}
		}
		addr += 0x100000000000;
	} while (--nr_nodes > 0);
}

asmlinkage __visible void __flush_cache_all(void)
{
	int leaf;
@@ -71,7 +93,7 @@ asmlinkage __visible void __flush_cache_all(void)

	leaf = cache_present - 1;
	if (cache_inclusive(cdesc + leaf)) {
		flush_cache_leaf(leaf);
		flush_cache_last_level(leaf);
		return;
	}