Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ARM: 9007/1: l2c: fix prefetch bits init in L2X0_AUX_CTRL using DT values

The L310_PREFETCH_CTRL register bits 28 and 29 to enable data and
instruction prefetch respectively can also be accessed via the
L2X0_AUX_CTRL register. They appear to be actually wired together in
hardware between the registers. Changing them in the prefetch
register only will get undone when restoring the aux control register
later on. For this reason, set these bits in both registers during
initialisation according to the devicetree property values.

Link: https://lore.kernel.org/lkml/76f2f3ad5e77e356e0a5b99ceee1e774a2842c25.1597061474.git.guillaume.tucker@collabora.com/

Fixes: ec3bd0e68a67 ("ARM: 8391/1: l2c: add options to overwrite prefetching behavior")
Signed-off-by: Guillaume Tucker <guillaume.tucker@collabora.com>
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>

authored by

Guillaume Tucker and committed by
Russell King
8e007b36 c03e4147

+12 -4
+12 -4
arch/arm/mm/cache-l2x0.c
··· 1249 1249 1250 1250 ret = of_property_read_u32(np, "prefetch-data", &val); 1251 1251 if (ret == 0) { 1252 - if (val) 1252 + if (val) { 1253 1253 prefetch |= L310_PREFETCH_CTRL_DATA_PREFETCH; 1254 - else 1254 + *aux_val |= L310_PREFETCH_CTRL_DATA_PREFETCH; 1255 + } else { 1255 1256 prefetch &= ~L310_PREFETCH_CTRL_DATA_PREFETCH; 1257 + *aux_val &= ~L310_PREFETCH_CTRL_DATA_PREFETCH; 1258 + } 1259 + *aux_mask &= ~L310_PREFETCH_CTRL_DATA_PREFETCH; 1256 1260 } else if (ret != -EINVAL) { 1257 1261 pr_err("L2C-310 OF prefetch-data property value is missing\n"); 1258 1262 } 1259 1263 1260 1264 ret = of_property_read_u32(np, "prefetch-instr", &val); 1261 1265 if (ret == 0) { 1262 - if (val) 1266 + if (val) { 1263 1267 prefetch |= L310_PREFETCH_CTRL_INSTR_PREFETCH; 1264 - else 1268 + *aux_val |= L310_PREFETCH_CTRL_INSTR_PREFETCH; 1269 + } else { 1265 1270 prefetch &= ~L310_PREFETCH_CTRL_INSTR_PREFETCH; 1271 + *aux_val &= ~L310_PREFETCH_CTRL_INSTR_PREFETCH; 1272 + } 1273 + *aux_mask &= ~L310_PREFETCH_CTRL_INSTR_PREFETCH; 1266 1274 } else if (ret != -EINVAL) { 1267 1275 pr_err("L2C-310 OF prefetch-instr property value is missing\n"); 1268 1276 }