aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2008-02-06 22:29:43 -0500
committerPaul Mackerras <paulus@samba.org>2008-02-08 03:52:35 -0500
commit592a607bbc053bc6f614a0e619326009f4b3829e (patch)
treef6deedbe40c525c8fe088e08f620cd76cb865591 /arch/powerpc
parenta4ffc0a0b240a29cbe489f6db9dae112a49ef1c1 (diff)
[POWERPC] Disable G5 NAP mode during SMU commands on U3
It appears that with the U3 northbridge, if the processor is in NAP mode the whole time while waiting for an SMU command to complete, then the SMU will fail. It could be related to the weird backward mechanism the SMU uses to get to system memory via i2c to the northbridge that doesn't operate properly when the said bridge is in napping along with the CPU. That is on U3 at least, U4 doesn't seem to be affected. This didn't show before NO_HZ as the timer wakeup was enough to make it work it seems, but that is no longer the case. This fixes it by disabling NAP mode on those machines while an SMU command is in flight. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc')
-rw-r--r--arch/powerpc/platforms/powermac/feature.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/arch/powerpc/platforms/powermac/feature.c b/arch/powerpc/platforms/powermac/feature.c
index ba931be2175c..5169ecc37123 100644
--- a/arch/powerpc/platforms/powermac/feature.c
+++ b/arch/powerpc/platforms/powermac/feature.c
@@ -2565,6 +2565,8 @@ static void __init probe_uninorth(void)
2565 2565
2566 /* Locate core99 Uni-N */ 2566 /* Locate core99 Uni-N */
2567 uninorth_node = of_find_node_by_name(NULL, "uni-n"); 2567 uninorth_node = of_find_node_by_name(NULL, "uni-n");
2568 uninorth_maj = 1;
2569
2568 /* Locate G5 u3 */ 2570 /* Locate G5 u3 */
2569 if (uninorth_node == NULL) { 2571 if (uninorth_node == NULL) {
2570 uninorth_node = of_find_node_by_name(NULL, "u3"); 2572 uninorth_node = of_find_node_by_name(NULL, "u3");
@@ -2575,8 +2577,10 @@ static void __init probe_uninorth(void)
2575 uninorth_node = of_find_node_by_name(NULL, "u4"); 2577 uninorth_node = of_find_node_by_name(NULL, "u4");
2576 uninorth_maj = 4; 2578 uninorth_maj = 4;
2577 } 2579 }
2578 if (uninorth_node == NULL) 2580 if (uninorth_node == NULL) {
2581 uninorth_maj = 0;
2579 return; 2582 return;
2583 }
2580 2584
2581 addrp = of_get_property(uninorth_node, "reg", NULL); 2585 addrp = of_get_property(uninorth_node, "reg", NULL);
2582 if (addrp == NULL) 2586 if (addrp == NULL)
@@ -3029,3 +3033,8 @@ void pmac_resume_agp_for_card(struct pci_dev *dev)
3029 pmac_agp_resume(pmac_agp_bridge); 3033 pmac_agp_resume(pmac_agp_bridge);
3030} 3034}
3031EXPORT_SYMBOL(pmac_resume_agp_for_card); 3035EXPORT_SYMBOL(pmac_resume_agp_for_card);
3036
3037int pmac_get_uninorth_variant(void)
3038{
3039 return uninorth_maj;
3040}