Re: [PATCH] ia64: avoid broken SAL_CACHE_FLUSH implementations

Ian Wienand
2006-05-01T07:20:55Z

[-- Attachment #1: Type: text/plain, Size: 1484 bytes --]

On Mon, Jan 30, 2006 at 03:11:57PM -0700, Bjorn Helgaas wrote:
> +static void __init
> +check_sal_cache_flush (void)
> +{
> + /*
> + * Schedule a timer interrupt, wait until it's reported, and see if
> + * SAL_CACHE_FLUSH drops it.
> + */
> + itv = ia64_get_itv();
> + BUG_ON((itv & (1 << 16)) == 0);
> +
> + ia64_set_itv(IA64_TIMER_VECTOR);
... [stuff] ...
> + ia64_set_itv(itv);

Sorry I didn't notice earlier, but that BUG_ON triggers for me on the
simulator. AFAICS the mask for itv is set in cpu_init(), which comes
after sal_init(). Consequently on the simulator the itv still has its
start value of zero. I've probably missed something, but I wonder why
at this stage of the boot you even need to save and restore the itv?

-i

Signed-Off-By: Ian Wienand <ianw@gelato.unsw.edu.au>

--- linux-2.6.17-rc3-lvhpt/arch/ia64/kernel/sal.c 2006-03-20 16:53:29.000000000 +1100
+++ linux-2.6.17-rc3/arch/ia64/kernel/sal.c 2006-05-01 17:20:11.000000000 +1000
@@ -227,7 +227,7 @@
static void __init
check_sal_cache_flush (void)
{
- unsigned long flags, itv;
+ unsigned long flags;
int cpu;
u64 vector;

@@ -238,9 +238,6 @@
* Schedule a timer interrupt, wait until it's reported, and see if
* SAL_CACHE_FLUSH drops it.
*/
- itv = ia64_get_itv();
- BUG_ON((itv & (1 << 16)) == 0);
-
ia64_set_itv(IA64_TIMER_VECTOR);
ia64_set_itm(ia64_get_itc() + 1000);

@@ -260,7 +257,6 @@
ia64_eoi();
}

- ia64_set_itv(itv);
local_irq_restore(flags);
put_cpu();
}

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 191 bytes --]