|
@@ -96,6 +96,7 @@ struct uniphier_cache_data {
|
|
|
void __iomem *ctrl_base;
|
|
|
void __iomem *rev_base;
|
|
|
void __iomem *op_base;
|
|
|
+ void __iomem *way_ctrl_base;
|
|
|
u32 way_present_mask;
|
|
|
u32 way_locked_mask;
|
|
|
u32 nsets;
|
|
@@ -256,10 +257,13 @@ static void __init __uniphier_cache_set_locked_ways(
|
|
|
struct uniphier_cache_data *data,
|
|
|
u32 way_mask)
|
|
|
{
|
|
|
+ unsigned int cpu;
|
|
|
+
|
|
|
data->way_locked_mask = way_mask & data->way_present_mask;
|
|
|
|
|
|
- writel_relaxed(~data->way_locked_mask & data->way_present_mask,
|
|
|
- data->ctrl_base + UNIPHIER_SSCLPDAWCR);
|
|
|
+ for_each_possible_cpu(cpu)
|
|
|
+ writel_relaxed(~data->way_locked_mask & data->way_present_mask,
|
|
|
+ data->way_ctrl_base + 4 * cpu);
|
|
|
}
|
|
|
|
|
|
static void uniphier_cache_maint_range(unsigned long start, unsigned long end,
|
|
@@ -459,6 +463,8 @@ static int __init __uniphier_cache_init(struct device_node *np,
|
|
|
goto err;
|
|
|
}
|
|
|
|
|
|
+ data->way_ctrl_base = data->ctrl_base + 0xc00;
|
|
|
+
|
|
|
if (*cache_level == 2) {
|
|
|
u32 revision = readl(data->rev_base + UNIPHIER_SSCID);
|
|
|
/*
|
|
@@ -467,6 +473,22 @@ static int __init __uniphier_cache_init(struct device_node *np,
|
|
|
*/
|
|
|
if (revision <= 0x16)
|
|
|
data->range_op_max_size = (u32)1 << 22;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Unfortunatly, the offset address of active way control base
|
|
|
+ * varies from SoC to SoC.
|
|
|
+ */
|
|
|
+ switch (revision) {
|
|
|
+ case 0x11: /* sLD3 */
|
|
|
+ data->way_ctrl_base = data->ctrl_base + 0x870;
|
|
|
+ break;
|
|
|
+ case 0x12: /* LD4 */
|
|
|
+ case 0x16: /* sld8 */
|
|
|
+ data->way_ctrl_base = data->ctrl_base + 0x840;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
data->range_op_max_size -= data->line_size;
|