diff options
Diffstat (limited to 'litmus/lockdown.c')
-rw-r--r-- | litmus/lockdown.c | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/litmus/lockdown.c b/litmus/lockdown.c index 8e10bc66b86..a718ffc9c9b 100644 --- a/litmus/lockdown.c +++ b/litmus/lockdown.c | |||
@@ -79,6 +79,7 @@ void litmus_setup_lockdown(void __iomem *base, u32 id) | |||
79 | extern void v7_flush_kern_dcache_area(void *, size_t); | 79 | extern void v7_flush_kern_dcache_area(void *, size_t); |
80 | 80 | ||
81 | static void __iomem *cache_base; | 81 | static void __iomem *cache_base; |
82 | |||
82 | static void __iomem *lockreg_d; | 83 | static void __iomem *lockreg_d; |
83 | static void __iomem *lockreg_i; | 84 | static void __iomem *lockreg_i; |
84 | static raw_spinlock_t prefetch_lock; | 85 | static raw_spinlock_t prefetch_lock; |
@@ -115,7 +116,11 @@ u32 color_read_in_mem(u32 lock_val, u32 unlock_val, void *start, void *end) | |||
115 | : [addr] "+r" (start), | 116 | : [addr] "+r" (start), |
116 | [val] "+r" (v) | 117 | [val] "+r" (v) |
117 | : [end] "r" (end), | 118 | : [end] "r" (end), |
119 | #ifdef CONFIG_CACHE_PL310 | ||
120 | [cachereg] "r" (ld_d_reg(raw_smp_processor_id())), | ||
121 | #else | ||
118 | [cachereg] "r" (lockreg_d), | 122 | [cachereg] "r" (lockreg_d), |
123 | #endif | ||
119 | [lockval] "r" (lock_val) | 124 | [lockval] "r" (lock_val) |
120 | : "cc"); | 125 | : "cc"); |
121 | 126 | ||
@@ -139,7 +144,10 @@ u32 color_read_in_mem_lock(u32 lock_val, u32 unlock_val, void *start, void *end) | |||
139 | unsigned long flags; | 144 | unsigned long flags; |
140 | u32 v = 0; | 145 | u32 v = 0; |
141 | 146 | ||
147 | #ifndef CONFIG_CACHE_PL310 | ||
142 | raw_spin_lock_irqsave(&prefetch_lock, flags); | 148 | raw_spin_lock_irqsave(&prefetch_lock, flags); |
149 | #endif | ||
150 | |||
143 | __asm__ __volatile__ ( | 151 | __asm__ __volatile__ ( |
144 | " .align 5\n" | 152 | " .align 5\n" |
145 | " str %[lockval], [%[cachereg]]\n" | 153 | " str %[lockval], [%[cachereg]]\n" |
@@ -150,11 +158,18 @@ u32 color_read_in_mem_lock(u32 lock_val, u32 unlock_val, void *start, void *end) | |||
150 | : [addr] "+r" (start), | 158 | : [addr] "+r" (start), |
151 | [val] "+r" (v) | 159 | [val] "+r" (v) |
152 | : [end] "r" (end), | 160 | : [end] "r" (end), |
161 | #ifdef CONFIG_CACHE_PL310 | ||
162 | [cachereg] "r" (ld_d_reg(raw_smp_processor_id())), | ||
163 | #else | ||
153 | [cachereg] "r" (lockreg_d), | 164 | [cachereg] "r" (lockreg_d), |
165 | #endif | ||
154 | [lockval] "r" (lock_val), | 166 | [lockval] "r" (lock_val), |
155 | [unlockval] "r" (unlock_val) | 167 | [unlockval] "r" (unlock_val) |
156 | : "cc"); | 168 | : "cc"); |
169 | |||
170 | #ifndef CONFIG_CACHE_PL310 | ||
157 | raw_spin_unlock_irqrestore(&prefetch_lock, flags); | 171 | raw_spin_unlock_irqrestore(&prefetch_lock, flags); |
172 | #endif | ||
158 | 173 | ||
159 | return v; | 174 | return v; |
160 | } | 175 | } |
@@ -334,9 +349,16 @@ int litmus_lockdown_proc_handler(struct ctl_table *table, int write, | |||
334 | 349 | ||
335 | #define TRIALS 1000 | 350 | #define TRIALS 1000 |
336 | 351 | ||
352 | static void sleep_ns(int ns) | ||
353 | { | ||
354 | int i; | ||
355 | lt_t start = litmus_clock(); | ||
356 | for (i = 0; litmus_clock() - start < ns;i++); | ||
357 | } | ||
358 | |||
337 | static int test_get_cycles_overhead(void) | 359 | static int test_get_cycles_overhead(void) |
338 | { | 360 | { |
339 | u64 sum = 0, min = (u64)-1, max = 0; | 361 | u64 avg = 0, min = (u64)-1, max = 0; |
340 | unsigned long flags; | 362 | unsigned long flags; |
341 | cycles_t a, b; | 363 | cycles_t a, b; |
342 | int i; | 364 | int i; |
@@ -346,6 +368,7 @@ static int test_get_cycles_overhead(void) | |||
346 | local_irq_save(flags); | 368 | local_irq_save(flags); |
347 | preempt_disable(); | 369 | preempt_disable(); |
348 | a = litmus_get_cycles(); | 370 | a = litmus_get_cycles(); |
371 | sleep_ns(15000); | ||
349 | b = litmus_get_cycles(); | 372 | b = litmus_get_cycles(); |
350 | preempt_enable(); | 373 | preempt_enable(); |
351 | local_irq_restore(flags); | 374 | local_irq_restore(flags); |
@@ -354,10 +377,11 @@ static int test_get_cycles_overhead(void) | |||
354 | max = diff; | 377 | max = diff; |
355 | if (diff < min) | 378 | if (diff < min) |
356 | min = diff; | 379 | min = diff; |
357 | sum += diff; | 380 | avg += div64_u64(diff, TRIALS); |
358 | } | 381 | } |
359 | printk("cycle test: avg: %llu min: %llu max: %llu\n", | 382 | printk("cycle test 15us: avg: %llu min: %llu max: %llu\n", |
360 | div64_u64(sum, TRIALS), min, max); | 383 | avg, min, max); |
384 | |||
361 | return 0; | 385 | return 0; |
362 | } | 386 | } |
363 | 387 | ||
@@ -665,7 +689,7 @@ int litmus_test_prefetch_proc_handler(struct ctl_table *table, int write, | |||
665 | 689 | ||
666 | free_page((unsigned long)vaddr); | 690 | free_page((unsigned long)vaddr); |
667 | 691 | ||
668 | //test_get_cycles_overhead(); | 692 | test_get_cycles_overhead(); |
669 | test_read_in(); | 693 | test_read_in(); |
670 | 694 | ||
671 | return 0; | 695 | return 0; |