Lines Matching refs:data
118 static void __uniphier_cache_sync(struct uniphier_cache_data *data) in __uniphier_cache_sync() argument
122 data->op_base + UNIPHIER_SSCOPE); in __uniphier_cache_sync()
124 readl_relaxed(data->op_base + UNIPHIER_SSCOPE); in __uniphier_cache_sync()
135 static void __uniphier_cache_maint_common(struct uniphier_cache_data *data, in __uniphier_cache_maint_common() argument
168 writel_relaxed(UNIPHIER_SSCOLPQS_EF, data->op_base + UNIPHIER_SSCOLPQS); in __uniphier_cache_maint_common()
173 data->op_base + UNIPHIER_SSCOQM); in __uniphier_cache_maint_common()
177 writel_relaxed(start, data->op_base + UNIPHIER_SSCOQAD); in __uniphier_cache_maint_common()
178 writel_relaxed(size, data->op_base + UNIPHIER_SSCOQSZ); in __uniphier_cache_maint_common()
183 writel_relaxed(data->way_locked_mask, in __uniphier_cache_maint_common()
184 data->op_base + UNIPHIER_SSCOQWN); in __uniphier_cache_maint_common()
185 } while (unlikely(readl_relaxed(data->op_base + UNIPHIER_SSCOPPQSEF) & in __uniphier_cache_maint_common()
189 while (likely(readl_relaxed(data->op_base + UNIPHIER_SSCOLPQS) != in __uniphier_cache_maint_common()
196 static void __uniphier_cache_maint_all(struct uniphier_cache_data *data, in __uniphier_cache_maint_all() argument
199 __uniphier_cache_maint_common(data, 0, 0, in __uniphier_cache_maint_all()
202 __uniphier_cache_sync(data); in __uniphier_cache_maint_all()
205 static void __uniphier_cache_maint_range(struct uniphier_cache_data *data, in __uniphier_cache_maint_range() argument
215 start = start & ~(data->line_size - 1); in __uniphier_cache_maint_range()
219 if (unlikely(size >= (unsigned long)(-data->line_size))) { in __uniphier_cache_maint_range()
221 __uniphier_cache_maint_all(data, operation); in __uniphier_cache_maint_range()
229 size = ALIGN(size, data->line_size); in __uniphier_cache_maint_range()
233 data->range_op_max_size); in __uniphier_cache_maint_range()
235 __uniphier_cache_maint_common(data, start, chunk_size, in __uniphier_cache_maint_range()
242 __uniphier_cache_sync(data); in __uniphier_cache_maint_range()
245 static void __uniphier_cache_enable(struct uniphier_cache_data *data, bool on) in __uniphier_cache_enable() argument
252 writel_relaxed(val, data->ctrl_base + UNIPHIER_SSCC); in __uniphier_cache_enable()
256 struct uniphier_cache_data *data, in __uniphier_cache_set_locked_ways() argument
259 data->way_locked_mask = way_mask & data->way_present_mask; in __uniphier_cache_set_locked_ways()
261 writel_relaxed(~data->way_locked_mask & data->way_present_mask, in __uniphier_cache_set_locked_ways()
262 data->ctrl_base + UNIPHIER_SSCLPDAWCR); in __uniphier_cache_set_locked_ways()
268 struct uniphier_cache_data *data; in uniphier_cache_maint_range() local
270 list_for_each_entry(data, &uniphier_cache_list, list) in uniphier_cache_maint_range()
271 __uniphier_cache_maint_range(data, start, end, operation); in uniphier_cache_maint_range()
276 struct uniphier_cache_data *data; in uniphier_cache_maint_all() local
278 list_for_each_entry(data, &uniphier_cache_list, list) in uniphier_cache_maint_all()
279 __uniphier_cache_maint_all(data, operation); in uniphier_cache_maint_all()
309 struct uniphier_cache_data *data; in uniphier_cache_disable() local
311 list_for_each_entry_reverse(data, &uniphier_cache_list, list) in uniphier_cache_disable()
312 __uniphier_cache_enable(data, false); in uniphier_cache_disable()
319 struct uniphier_cache_data *data; in uniphier_cache_enable() local
323 list_for_each_entry(data, &uniphier_cache_list, list) { in uniphier_cache_enable()
324 __uniphier_cache_enable(data, true); in uniphier_cache_enable()
325 __uniphier_cache_set_locked_ways(data, 0); in uniphier_cache_enable()
331 struct uniphier_cache_data *data; in uniphier_cache_sync() local
333 list_for_each_entry(data, &uniphier_cache_list, list) in uniphier_cache_sync()
334 __uniphier_cache_sync(data); in uniphier_cache_sync()
339 struct uniphier_cache_data *data; in uniphier_cache_l2_is_enabled() local
341 data = list_first_entry_or_null(&uniphier_cache_list, in uniphier_cache_l2_is_enabled()
343 if (!data) in uniphier_cache_l2_is_enabled()
346 return !!(readl_relaxed(data->ctrl_base + UNIPHIER_SSCC) & in uniphier_cache_l2_is_enabled()
353 struct uniphier_cache_data *data; in uniphier_cache_l2_touch_range() local
355 data = list_first_entry_or_null(&uniphier_cache_list, in uniphier_cache_l2_touch_range()
357 if (data) in uniphier_cache_l2_touch_range()
358 __uniphier_cache_maint_range(data, start, end, in uniphier_cache_l2_touch_range()
365 struct uniphier_cache_data *data; in uniphier_cache_l2_set_locked_ways() local
367 data = list_first_entry_or_null(&uniphier_cache_list, in uniphier_cache_l2_set_locked_ways()
369 if (data) in uniphier_cache_l2_set_locked_ways()
370 __uniphier_cache_set_locked_ways(data, way_mask); in uniphier_cache_l2_set_locked_ways()
394 struct uniphier_cache_data *data; in __uniphier_cache_init() local
421 data = kzalloc(sizeof(*data), GFP_KERNEL); in __uniphier_cache_init()
422 if (!data) in __uniphier_cache_init()
425 if (of_property_read_u32(np, "cache-line-size", &data->line_size) || in __uniphier_cache_init()
426 !is_power_of_2(data->line_size)) { in __uniphier_cache_init()
433 if (of_property_read_u32(np, "cache-sets", &data->nsets) || in __uniphier_cache_init()
434 !is_power_of_2(data->nsets)) { in __uniphier_cache_init()
442 cache_size == 0 || cache_size % (data->nsets * data->line_size)) { in __uniphier_cache_init()
449 data->way_present_mask = in __uniphier_cache_init()
450 ((u32)1 << cache_size / data->nsets / data->line_size) - 1; in __uniphier_cache_init()
452 data->ctrl_base = of_iomap(np, 0); in __uniphier_cache_init()
453 if (!data->ctrl_base) { in __uniphier_cache_init()
459 data->rev_base = of_iomap(np, 1); in __uniphier_cache_init()
460 if (!data->rev_base) { in __uniphier_cache_init()
466 data->op_base = of_iomap(np, 2); in __uniphier_cache_init()
467 if (!data->op_base) { in __uniphier_cache_init()
474 u32 revision = readl(data->rev_base + UNIPHIER_SSCID); in __uniphier_cache_init()
480 data->range_op_max_size = (u32)1 << 22; in __uniphier_cache_init()
483 data->range_op_max_size -= data->line_size; in __uniphier_cache_init()
485 INIT_LIST_HEAD(&data->list); in __uniphier_cache_init()
486 list_add_tail(&data->list, &uniphier_cache_list); /* no mutex */ in __uniphier_cache_init()
503 iounmap(data->op_base); in __uniphier_cache_init()
504 iounmap(data->rev_base); in __uniphier_cache_init()
505 iounmap(data->ctrl_base); in __uniphier_cache_init()
506 kfree(data); in __uniphier_cache_init()