aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel
diff options
context:
space:
mode:
authorDale Farnsworth <dale@farnsworth.org>2007-05-11 20:57:35 -0400
committerPaul Mackerras <paulus@samba.org>2007-05-11 21:32:50 -0400
commit06cce43cf0980d0ed3581458fd23522ca2d24e42 (patch)
tree853deee52d58559515a846a8d316adba4c7ebf58 /arch/powerpc/kernel
parente1a3107b06a9619773596cd46a9ce0574419aed4 (diff)
[POWERPC] Check cache coherency of kernel vs firmware
check_cache_coherency() verifies that the cache coherency setting of the kernel (CONFIG_NOT_COHERENT_CACHE) matches that left by the firmware, as indicated by coherency-off device tree property. Signed-off-by: Dale Farnsworth <dale@farnsworth.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/kernel')
-rw-r--r--arch/powerpc/kernel/setup-common.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c
index 370803722e47..ed07a198f8d6 100644
--- a/arch/powerpc/kernel/setup-common.c
+++ b/arch/powerpc/kernel/setup-common.c
@@ -530,3 +530,44 @@ void __init setup_panic(void)
530{ 530{
531 atomic_notifier_chain_register(&panic_notifier_list, &ppc_panic_block); 531 atomic_notifier_chain_register(&panic_notifier_list, &ppc_panic_block);
532} 532}
533
534#ifdef CONFIG_CHECK_CACHE_COHERENCY
535/*
536 * For platforms that have configurable cache-coherency. This function
537 * checks that the cache coherency setting of the kernel matches the setting
538 * left by the firmware, as indicated in the device tree. Since a mismatch
539 * will eventually result in DMA failures, we print * and error and call
540 * BUG() in that case.
541 */
542
543#ifdef CONFIG_NOT_COHERENT_CACHE
544#define KERNEL_COHERENCY 0
545#else
546#define KERNEL_COHERENCY 1
547#endif
548
549static int __init check_cache_coherency(void)
550{
551 struct device_node *np;
552 const void *prop;
553 int devtree_coherency;
554
555 np = of_find_node_by_path("/");
556 prop = of_get_property(np, "coherency-off", NULL);
557 of_node_put(np);
558
559 devtree_coherency = prop ? 0 : 1;
560
561 if (devtree_coherency != KERNEL_COHERENCY) {
562 printk(KERN_ERR
563 "kernel coherency:%s != device tree_coherency:%s\n",
564 KERNEL_COHERENCY ? "on" : "off",
565 devtree_coherency ? "on" : "off");
566 BUG();
567 }
568
569 return 0;
570}
571
572late_initcall(check_cache_coherency);
573#endif /* CONFIG_CHECK_CACHE_COHERENCY */