Hi, On Tue, 18 Mar 2008 13:27:09 +0000 Ralf Baechle <ralf@xxxxxxxxxxxxxx> wrote: > On Tue, Mar 18, 2008 at 01:47:20PM +0900, Yoichi Yuasa wrote: > > > On Mon, 17 Mar 2008 16:16:35 +0000 > > Ralf Baechle <ralf@xxxxxxxxxxxxxx> wrote: > > > > > On Mon, Mar 17, 2008 at 11:47:40PM +0900, Yoichi Yuasa wrote: > > > > > > > VR41xx, CP0 hazard is necessary between read_c0_count() and write_c0_compare(). > > > > > > Interesting. I wonder why you need this patch but nobody else? > > > > Three NOP are necessary on the TB0287(VR4131 board). > > That much was obvious from your patch. I was more wondering about this > change: > > - write_c0_compare(read_c0_count()); > + c0_timer_ack(); > > c0_timer_ack is defined as > > static void c0_timer_ack(void) > { > write_c0_compare(read_c0_compare()); > } > > so your patch does a functional change there - even though it should not > actually matter. So I was wondering if for some reason you need that > change. OK, update my patch. Two patches have been brought together in one. How about this? VR41xx, CP0 hazard is necessary between read_c0_count() and write_c0_compare() (or read_c0_cause()). Signed-off-by: Yoichi Yuasa <yoichi_yuasa@xxxxxxxxxxxxxx> diff -pruN -X /home/yuasa/Memo/dontdiff linux-orig/arch/mips/kernel/cevt-r4k.c linux/arch/mips/kernel/cevt-r4k.c --- linux-orig/arch/mips/kernel/cevt-r4k.c 2008-03-19 11:35:53.017749179 +0900 +++ linux/arch/mips/kernel/cevt-r4k.c 2008-03-19 16:31:29.617938142 +0900 @@ -186,7 +186,9 @@ static int c0_compare_int_usable(void) * IP7 already pending? Try to clear it by acking the timer. */ if (c0_compare_int_pending()) { - write_c0_compare(read_c0_count()); + cnt = read_c0_count(); + back_to_back_c0_hazard(); + write_c0_compare(cnt); irq_disable_hazard(); if (c0_compare_int_pending()) return 0; @@ -205,10 +207,13 @@ static int c0_compare_int_usable(void) while ((int)(read_c0_count() - cnt) <= 0) ; /* Wait for expiry */ + back_to_back_c0_hazard(); if (!c0_compare_int_pending()) return 0; - write_c0_compare(read_c0_count()); + cnt = read_c0_count(); + back_to_back_c0_hazard(); + write_c0_compare(cnt); irq_disable_hazard(); if (c0_compare_int_pending()) return 0;