All of lore.kernel.org
 help / color / mirror / Atom feed
From: Johannes Berg <johannes@sipsolutions.net>
To: linuxppc-dev@ozlabs.org
Cc: linux-pm@lists.osdl.org, Torrance <torrance123@gmail.com>
Subject: [RFC 06/10] powerpc: MPIC sys_device & suspend/resume
Date: Mon, 05 Feb 2007 19:30:33 +0100	[thread overview]
Message-ID: <20070205185837.244398000@sipsolutions.net> (raw)
In-Reply-To: 20070205183026.989209000@sipsolutions.net

[-- Attachment #1: mpic-suspend.patch --]
[-- Type: text/plain, Size: 3684 bytes --]

This adds mpic to the system devices and implements suspend
and resume for them. This is necessary to get interrupts for
modules back to where they were before a suspend to disk.

Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>

---
The first hunk is just a tiny whitespace cleanup.

Without this patch, i2sbus (built as a module) for example
doesn't work properly across a suspend-to-disk/resume cycle,
with this patch it works fine.

I'm not entirely sure if there should be some wait logic
after I restore the MPIC registers, it works as-is for me.

--- mb-wireless.orig/arch/powerpc/sysdev/mpic.c	2007-02-05 14:24:05.734526864 +0100
+++ mb-wireless/arch/powerpc/sysdev/mpic.c	2007-02-05 14:24:39.464526864 +0100
@@ -1123,7 +1123,7 @@ void __init mpic_init(struct mpic *mpic)
 	/* Do the HT PIC fixups on U3 broken mpic */
 	DBG("MPIC flags: %x\n", mpic->flags);
 	if ((mpic->flags & MPIC_BROKEN_U3) && (mpic->flags & MPIC_PRIMARY))
- 		mpic_scan_ht_pics(mpic);
+		mpic_scan_ht_pics(mpic);
 
 	for (i = 0; i < mpic->num_sources; i++) {
 		/* start with vector = source number, and masked */
@@ -1147,6 +1147,12 @@ void __init mpic_init(struct mpic *mpic)
 
 	/* Set current processor priority to 0 */
 	mpic_cpu_write(MPIC_INFO(CPU_CURRENT_TASK_PRI), 0);
+
+#ifdef CONFIG_PM
+	/* allocate memory to save mpic state */
+	mpic->save_data = alloc_bootmem(mpic->num_sources * sizeof(struct mpic_irq_save));
+	BUG_ON(mpic->save_data == NULL);
+#endif
 }
 
 void __init mpic_set_clk_ratio(struct mpic *mpic, u32 clock_ratio)
@@ -1376,3 +1382,61 @@ void smp_mpic_message_pass(int target, i
 	}
 }
 #endif /* CONFIG_SMP */
+
+#ifdef CONFIG_PM
+static int mpic_suspend(struct sys_device *dev, pm_message_t state)
+{
+	struct mpic *mpic = container_of(dev, struct mpic, sysdev);
+	int i;
+
+	for (i = 0; i < mpic->num_sources; i++) {
+		mpic->save_data[i].vecprio =
+			mpic_irq_read(i, MPIC_INFO(IRQ_VECTOR_PRI));
+		mpic->save_data[i].dest =
+			mpic_irq_read(i, MPIC_INFO(IRQ_DESTINATION));
+	}
+
+	return 0;
+}
+
+static int mpic_resume(struct sys_device *dev)
+{
+	struct mpic *mpic = container_of(dev, struct mpic, sysdev);
+	int i;
+
+	for (i = 0; i < mpic->num_sources; i++) {
+		mpic_irq_write(i, MPIC_INFO(IRQ_VECTOR_PRI),
+			       mpic->save_data[i].vecprio);
+		mpic_irq_write(i, MPIC_INFO(IRQ_DESTINATION),
+			       mpic->save_data[i].dest);
+	}
+
+	return 0;
+}
+#endif
+
+static struct sysdev_class mpic_sysclass = {
+#ifdef CONFIG_PM
+	.resume = mpic_resume,
+	.suspend = mpic_suspend,
+#endif
+	set_kset_name("mpic"),
+};
+
+static int mpic_init_sys(void)
+{
+	struct mpic *mpic = mpics;
+	int error, id = 0;
+
+	error = sysdev_class_register(&mpic_sysclass);
+
+	while (mpic && !error) {
+		mpic->sysdev.cls = &mpic_sysclass;
+		mpic->sysdev.id = id++;
+		error = sysdev_register(&mpic->sysdev);
+		mpic = mpic->next;
+	}
+	return error;
+}
+
+device_initcall(mpic_init_sys);
--- mb-wireless.orig/include/asm-powerpc/mpic.h	2007-02-05 14:24:05.784526864 +0100
+++ mb-wireless/include/asm-powerpc/mpic.h	2007-02-05 14:24:39.464526864 +0100
@@ -3,6 +3,7 @@
 #ifdef __KERNEL__
 
 #include <linux/irq.h>
+#include <linux/sysdev.h>
 #include <asm/dcr.h>
 
 /*
@@ -243,6 +244,11 @@ struct mpic_reg_bank {
 #endif /* CONFIG_PPC_DCR */
 };
 
+struct mpic_irq_save {
+	u32		vecprio,
+			dest;
+};
+
 /* The instance data of a given MPIC */
 struct mpic
 {
@@ -302,6 +308,12 @@ struct mpic
 
 	/* link */
 	struct mpic		*next;
+
+	struct sys_device	sysdev;
+
+#ifdef CONFIG_PM
+	struct mpic_irq_save	*save_data;
+#endif
 };
 
 /*

--

WARNING: multiple messages have this Message-ID (diff)
From: Johannes Berg <johannes@sipsolutions.net>
To: linuxppc-dev@ozlabs.org
Cc: linux-pm@lists.osdl.org, Torrance <torrance123@gmail.com>
Subject: [RFC 06/10] powerpc: MPIC sys_device & suspend/resume
Date: Mon, 05 Feb 2007 19:30:33 +0100	[thread overview]
Message-ID: <20070205185837.244398000@sipsolutions.net> (raw)
In-Reply-To: 20070205183026.989209000@sipsolutions.net

This adds mpic to the system devices and implements suspend
and resume for them. This is necessary to get interrupts for
modules back to where they were before a suspend to disk.

Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>

---
The first hunk is just a tiny whitespace cleanup.

Without this patch, i2sbus (built as a module) for example
doesn't work properly across a suspend-to-disk/resume cycle,
with this patch it works fine.

I'm not entirely sure if there should be some wait logic
after I restore the MPIC registers, it works as-is for me.

--- mb-wireless.orig/arch/powerpc/sysdev/mpic.c	2007-02-05 14:24:05.734526864 +0100
+++ mb-wireless/arch/powerpc/sysdev/mpic.c	2007-02-05 14:24:39.464526864 +0100
@@ -1123,7 +1123,7 @@ void __init mpic_init(struct mpic *mpic)
 	/* Do the HT PIC fixups on U3 broken mpic */
 	DBG("MPIC flags: %x\n", mpic->flags);
 	if ((mpic->flags & MPIC_BROKEN_U3) && (mpic->flags & MPIC_PRIMARY))
- 		mpic_scan_ht_pics(mpic);
+		mpic_scan_ht_pics(mpic);
 
 	for (i = 0; i < mpic->num_sources; i++) {
 		/* start with vector = source number, and masked */
@@ -1147,6 +1147,12 @@ void __init mpic_init(struct mpic *mpic)
 
 	/* Set current processor priority to 0 */
 	mpic_cpu_write(MPIC_INFO(CPU_CURRENT_TASK_PRI), 0);
+
+#ifdef CONFIG_PM
+	/* allocate memory to save mpic state */
+	mpic->save_data = alloc_bootmem(mpic->num_sources * sizeof(struct mpic_irq_save));
+	BUG_ON(mpic->save_data == NULL);
+#endif
 }
 
 void __init mpic_set_clk_ratio(struct mpic *mpic, u32 clock_ratio)
@@ -1376,3 +1382,61 @@ void smp_mpic_message_pass(int target, i
 	}
 }
 #endif /* CONFIG_SMP */
+
+#ifdef CONFIG_PM
+static int mpic_suspend(struct sys_device *dev, pm_message_t state)
+{
+	struct mpic *mpic = container_of(dev, struct mpic, sysdev);
+	int i;
+
+	for (i = 0; i < mpic->num_sources; i++) {
+		mpic->save_data[i].vecprio =
+			mpic_irq_read(i, MPIC_INFO(IRQ_VECTOR_PRI));
+		mpic->save_data[i].dest =
+			mpic_irq_read(i, MPIC_INFO(IRQ_DESTINATION));
+	}
+
+	return 0;
+}
+
+static int mpic_resume(struct sys_device *dev)
+{
+	struct mpic *mpic = container_of(dev, struct mpic, sysdev);
+	int i;
+
+	for (i = 0; i < mpic->num_sources; i++) {
+		mpic_irq_write(i, MPIC_INFO(IRQ_VECTOR_PRI),
+			       mpic->save_data[i].vecprio);
+		mpic_irq_write(i, MPIC_INFO(IRQ_DESTINATION),
+			       mpic->save_data[i].dest);
+	}
+
+	return 0;
+}
+#endif
+
+static struct sysdev_class mpic_sysclass = {
+#ifdef CONFIG_PM
+	.resume = mpic_resume,
+	.suspend = mpic_suspend,
+#endif
+	set_kset_name("mpic"),
+};
+
+static int mpic_init_sys(void)
+{
+	struct mpic *mpic = mpics;
+	int error, id = 0;
+
+	error = sysdev_class_register(&mpic_sysclass);
+
+	while (mpic && !error) {
+		mpic->sysdev.cls = &mpic_sysclass;
+		mpic->sysdev.id = id++;
+		error = sysdev_register(&mpic->sysdev);
+		mpic = mpic->next;
+	}
+	return error;
+}
+
+device_initcall(mpic_init_sys);
--- mb-wireless.orig/include/asm-powerpc/mpic.h	2007-02-05 14:24:05.784526864 +0100
+++ mb-wireless/include/asm-powerpc/mpic.h	2007-02-05 14:24:39.464526864 +0100
@@ -3,6 +3,7 @@
 #ifdef __KERNEL__
 
 #include <linux/irq.h>
+#include <linux/sysdev.h>
 #include <asm/dcr.h>
 
 /*
@@ -243,6 +244,11 @@ struct mpic_reg_bank {
 #endif /* CONFIG_PPC_DCR */
 };
 
+struct mpic_irq_save {
+	u32		vecprio,
+			dest;
+};
+
 /* The instance data of a given MPIC */
 struct mpic
 {
@@ -302,6 +308,12 @@ struct mpic
 
 	/* link */
 	struct mpic		*next;
+
+	struct sys_device	sysdev;
+
+#ifdef CONFIG_PM
+	struct mpic_irq_save	*save_data;
+#endif
 };
 
 /*

--

  parent reply	other threads:[~2007-02-05 18:30 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-02-05 18:30 [PATCH/RFC 00/10] suspend to disk for powermac G5 Johannes Berg
2007-02-05 18:30 ` [PATCH 01/10] dont copy pages that arent RAM Johannes Berg
2007-02-05 18:30   ` Johannes Berg
2007-02-05 18:30 ` [PATCH 02/10] windfarm: dont die on suspend thread signal Johannes Berg
2007-02-05 18:30   ` Johannes Berg
2007-02-05 22:43   ` Christoph Hellwig
2007-02-05 22:54     ` [PATCH revision 2] " Johannes Berg
2007-02-05 23:04       ` Benjamin Herrenschmidt
2007-02-05 23:04         ` Benjamin Herrenschmidt
2007-02-05 23:04         ` Benjamin Herrenschmidt
2007-02-05 23:04           ` Benjamin Herrenschmidt
2007-02-05 22:54   ` [PATCH 02/10] " Andrew Morton
2007-02-05 22:55     ` Johannes Berg
2007-02-05 22:55       ` Johannes Berg
2007-02-05 22:58   ` Benjamin Herrenschmidt
2007-02-05 18:30 ` [PATCH 03/10] powerpc: fix comment in kernel/irq.c Johannes Berg
2007-02-05 18:30   ` Johannes Berg
2007-02-05 22:59   ` Benjamin Herrenschmidt
2007-02-05 23:18     ` Andrew Morton
2007-02-05 23:53       ` Benjamin Herrenschmidt
2007-02-05 18:30 ` [PATCH 04/10] powermac: clean up PIC initialisation code Johannes Berg
2007-02-05 18:30   ` Johannes Berg
2007-02-08  4:41   ` Paul Mackerras
2007-02-08 13:03     ` Johannes Berg
2007-02-08 13:03       ` Johannes Berg
2007-02-05 18:30 ` [PATCH 05/10] powermac: generic time suspend/resume code Johannes Berg
2007-02-05 18:30   ` Johannes Berg
2007-02-19 10:00   ` Guennadi Liakhovetski
2007-02-19 10:00     ` [linux-pm] " Guennadi Liakhovetski
2007-02-19 23:19     ` Guennadi Liakhovetski
2007-02-19 23:19       ` [linux-pm] " Guennadi Liakhovetski
2007-02-05 18:30 ` Johannes Berg [this message]
2007-02-05 18:30   ` [RFC 06/10] powerpc: MPIC sys_device & suspend/resume Johannes Berg
2007-02-07 12:24   ` Johannes Berg
2007-02-07 12:24     ` Johannes Berg
2007-02-05 18:30 ` [RFC 07/10] powermac: support G5 CPU hotplug Johannes Berg
2007-02-05 18:30   ` Johannes Berg
2007-02-06 12:42   ` Pavel Machek
2007-02-06 12:42     ` [linux-pm] " Pavel Machek
2007-02-07 11:40     ` Johannes Berg
2007-02-07 11:40       ` Johannes Berg
2007-02-07 12:23   ` Johannes Berg
2007-02-07 12:23     ` Johannes Berg
2007-02-05 18:30 ` [RFC 08/10] powerpc: dart iommu suspend Johannes Berg
2007-02-05 18:30   ` Johannes Berg
2007-02-06  1:19   ` Olof Johansson
2007-02-06  1:26     ` Johannes Berg
2007-02-06  1:26       ` Johannes Berg
2007-02-06  1:52     ` Johannes Berg
2007-02-07 12:22       ` Johannes Berg
2007-02-07 12:22         ` Johannes Berg
2007-02-06 12:40   ` Pavel Machek
2007-02-06 12:40     ` [linux-pm] " Pavel Machek
2007-02-07 11:42     ` Johannes Berg
2007-02-07 11:42       ` [linux-pm] " Johannes Berg
2007-02-05 18:30 ` [RFC 09/10] powermac: suspend to disk on G5 Johannes Berg
2007-02-05 18:30   ` Johannes Berg
2007-02-05 18:30 ` [RFC 10/10] powermac: fix G5-cpufreq for cpu on/offline Johannes Berg
2007-02-05 18:30   ` Johannes Berg
2007-02-07 12:21   ` Johannes Berg
2007-02-07 12:21     ` Johannes Berg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070205185837.244398000@sipsolutions.net \
    --to=johannes@sipsolutions.net \
    --cc=linux-pm@lists.osdl.org \
    --cc=linuxppc-dev@ozlabs.org \
    --cc=torrance123@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.