ron minnich <[EMAIL PROTECTED]> writes:

> The issue is that at the amdk8 northbridge, we need to know bus/dev/fn for
> the hardware so we can set up the VGA_EN bit in the right PCIIO pair as
> well as an MMIO entry for it.

Huh?  There is a fairly definitive association between resources and
non-coherent hypertransport chains.  What do you need the device for?

> It's not enough to just set a bit in the 
> bridge on the K8 -- you have to set up routing to the right Hypertransport 
> bus. 

Right and we know that bus is the bus we set the VGA_EN bit for.

> You have to know where the device is.

Yes but you should not need to know which device it is.

> By far the easiest way to do this is to add a simple structure member to
> the bus structure:
>       struct device *vgadev;

Huh?


> so we have:
> struct bus {
>         device_t        dev;            /* This bridge device */
>         device_t        children;       /* devices behind this bridge */
>       unsigned        bridge_ctrl;    /* Bridge control register */
>       /* NEW */
>       struct device   *vgadev;        /* if bridge_ctl has 
>                                        * PCI_CB_BRIDGE_CTL_VGA set, 
>                                        * this contains pointer to 
>                                        * the device.
>                                        */
>       /* END NEW */
>         unsigned char   link;           /* The index of this link */
>         unsigned char   secondary;      /* secondary bus number */
>         unsigned char   subordinate;    /* max subordinate bus number */
>         unsigned char   cap;            /* PCi capability offset */
> };
> 
> Setting vgadev is then trivial in the allocate_vga_resource since in that
> function you already have a pointer to the vga device; or just set the
> pointer. Either way, when you are at a bridge and know that the bridge has
> vga on the bus somewhere, you can easily get the info you need to set up
> the bridge if it is a complex bridge like the K8.

Yes the simple enough it just appears to be unnecessary.
 
>         while(bus) {
>                 bus->bridge_ctrl |= PCI_BRIDGE_CTL_VGA;
>               /* NEW */
>               bus->vgadev = vga;
>               /* END NEW */
>                 bus = (bus == bus->dev->bus)? 0 : bus->dev->bus;
>         }
> 
> 
> Unless there is a huge problem with this I will try to get it done 
> tomorrow. It's a new structure member and one line of code and we're on 
> the air.
> 
> It is not totally general but ... VGA is "special". As in, really ugly.

Yes, the vga routing at least needs a special case.  It is a common
case so there is no problem with that.  The idea is to have a model
that we progressively refine into what we need.

What I don't see is what you need vgadev for.  The only case I can
think of is short cutting to the emulator.  In that case one global
would be fine.

Looking at the code though there is a bug.  When it finds a device
to give the legacy vga resources to it does not allocate any MMIO
resources.  For bridges this is a normal resource so this looks
a real bug in the generic code.  If that is why you need
the vgadev,  let's fix the generic code to handle that part properly. 

Eric
_______________________________________________
Linuxbios mailing list
[EMAIL PROTECTED]
http://www.clustermatic.org/mailman/listinfo/linuxbios

Reply via email to