Re: PCI PM: Restore standard config registers of all devices early

Linus Torvalds
2009-02-03T23:14:21Z

On Tue, 3 Feb 2009, Rafael J. Wysocki wrote:
> >
> > struct irq_desc *desc;
> > int irq;
> >
> > for_each_irq_desc(i, desc) {
> > ...
> > }
> >
> > should do the trick.
>
> So, what do I do in the loop to disable irqs for all devices on the IOAPIC
> level. Would disable_irq(irq) be sufficient?

Yes. It literally should be something as simple as

void disable_device_irqs(void)
{
struct irq_desc *desc;
int i;

for_each_irq_desc(i, desc)
disable_irq(i);
}

void enable_device_irqs(void)
{
struct irq_desc *desc;
int i;

for_each_irq_desc(i, desc)
enable_irq(i);
}

although we might do something smarter eventually (ie start adding tests
for specific flags etc - at that point we'll also need to mark which
interrupts we've disabled so that we get the disable/enable nesting
right).

And it probably makes sense to do this inside kernel/irq/manage.c or
similar, since any extensions are going to be very aware of irq internals.
For example, the thing might well end up taking the desc->lock and peek
inside the descriptor to see if it's really a "device" interrupt or a
"system" interrupt etc.

Linus