Subject: Re: ext_intr thoughts
To: Tim Rightnour <root@garbled.net>
From: Michael Lorenz <macallan@netbsd.org>
List: port-powerpc
Date: 04/27/2007 09:29:14
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hello,

On Apr 27, 2007, at 03:04, Tim Rightnour wrote:

> Looking at all the ext_intr() routines, they all seem to be more or 
> less
> indentical, except:
>
> each one needs a struct intrsource that has all the interrupt 
> sources/handlers
> each one needs an int imen;
> each one needs a get_irq(), mask_irq() and eoi_irq() function.
>
> Based on this.. I think we could write just one, but we need to do two 
> things:
>
> 1) for the openpic+ISA case, we want to register the ext_intr routine 
> with isa
> irq bits as the handler for irq 0.
>
> 2) when we initially install the ext_intr handler, we want to specify 
> which set
> of routines to use.
>
> What I'm not sure of, is how we can make just one routine, and have it 
> do the
> right thing.  Any ideas here?  (ie, register it once as the primary 
> external
> interrupt handler, and then register it again, but this time as the 
> isa handler
> for the cascaded openpic interrupt)

I think we should have something like this:
struct pic_ops {
	int pic_irq_base;	/* first IRQ number this PIC deals with */
	int pic_num_irqs;	/* ho many IRQs does it handle */
	void *pic_cookie;	/* pointer to the hardware? */
	int (*pic_init)(void *);	/* initialize the PIC */
	void (*pic_extint)(void *);	/* take an interrupt or more */
	void *(*pic_establish)(...);	/* establish a handler on this PIC */
	void (*pic_disestablish)();	/* get rid of a handler */
};

Each method takes a (struct pic_ops *) as first parameter.

The extintr() we register globally would be the 'master' pic ( 1st 
ohare or heathrow, OpenPIC etc. ), then we register any secondary PIC's 
extintr() ( 8259, another ohare or heathrow ) with its parent as 
ordinary interrupt handler.
The global (dis)establish() functions would have to walk a (short) 
table to figure out which global IRQ number corresponds to what number 
on what PIC - unproblematic I think since we don't switch around 
handlers very often.
What we'd still need globally is do_pending_intrs(), mapping hw IRQ 
numbers to something do_pending_intrs() understands, spl stuff, etc.
Not sure if we'd need mask/unmask functions - on macppc they're never 
called from outside extintr.c IIRC, each PIC handles masking/unmasking 
of pending or blocked IRQs on its own, as in an IRQ is masked if it 
fires and found to be blocked by spl - then we just mark it pending 
instead of calling any handler.

Did I miss anything?

have fun
Michael
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (Darwin)

iQEVAwUBRjH6qspnzkX8Yg2nAQK2PwgAif2s9axm9bC2ES7MHFRVk8tu6yUJAMKW
lWDvMNL0aZtwv3Hr/8SzgBA9q2yVITevfBmCwRK8aXP4p6tZKWeAXv0Zw+WuYIgN
KRKhvcIS2lhg5vrOPh9n8nYlOQdgGKQ2ck5Rmkqa+1DzXGQVKEZpMGs9QR3uoDP7
+icQYUIJoF1gvHAdAkUp31H/CjoLHTzGe2OrCQYM5Nh9D7ibJs+QCJhTPeCPzIh5
czZpIMYrJ9/ohXZ23Y1ZPFXGAHNMKkqby8Lj/zfsuOJsTcNugTF9Wvj9n282jJKO
ZoBL8nn9dCxKjIodolZFscv2DM8prqSSreFtTAhja+sU3WI0aV2Pog==
=r1hP
-----END PGP SIGNATURE-----