Intel video driver question - cards second function

Jesse Barnes jbarnes at virtuousgeek.org
Mon Sep 17 17:00:52 PDT 2007


On Saturday, September 15, 2007 10:21:39 am Jedrzej Solecki wrote:
> Hello,
> I am reading the xfree86 video Intel driver source code and I have one
> question (maybe stupid - I'm just a newbie:)).
> I am asking about this piece of code (src/i810_driver.c:I810Probe()):
>
>  /*
>   * Mobile platforms may have both function 0 and 1 active, but they
>   * are handled as a single entity.  To make sure that the function 1
>   * entity isn't assigned to a screen, check for and claim it here
>   * first.
>   *
>   * XXX If function 1's resources are ever needed, they'll need to be
>   * added to the screen and marked active.
>   */
>  for (ppPci = VideoInfo; ppPci != NULL && *ppPci != NULL; ppPci++) {
>     if ((*ppPci)->vendor == PCI_VENDOR_INTEL &&
>         (*ppPci)->func == 1) {
>        for (id = I810PciChipsets; id->PCIid != -1; id++) {
>           if (id->PCIid == (*ppPci)->chipType) {
>              /* Claim slot */
>              if (xf86CheckPciSlot((*ppPci)->bus, (*ppPci)->device,
>                                   (*ppPci)->func)) {
>                 xf86ClaimPciSlot((*ppPci)->bus, (*ppPci)->device,
>                                  (*ppPci)->func, drv, id->PCIid,
>                                  NULL, FALSE);
>              }
>              break;
>           }
>        }
>     }
>  }
>
> I have a notebook with the 945GM controller with active functions 0
> and 1. I would like to ask if this code:
>
>              /* Claim slot */
>              if (xf86CheckPciSlot((*ppPci)->bus, (*ppPci)->device,
>                                   (*ppPci)->func)) {
>                 xf86ClaimPciSlot((*ppPci)->bus, (*ppPci)->device,
>                                  (*ppPci)->func, drv, id->PCIid,
>                                  NULL, FALSE);
>
> should be executed in this case.
> If yes then something is wrong because it doesn't:)
> With the first function (PCI:0:2:0) this condition:
> (*ppPci)->func == 1)
> is not met and that's OK.
> For the second funtion (1) this condition:
> if (id->PCIid == (*ppPci)->chipType)
> is never met because I810PciChipsets does not contain the
> "(*ppPci)->chipType" value. There is only "PCI_CHIP_I945_GM
> 0x27A2" defined in the common.h .
> But the second function's (PCI:0:2:1) chipType value is 0x27A6 which
> is not defined in the common.h.
> I would like to ask if this is not there on purpose and I
> misunderstood this part of code or if there is something wrong:)
>
> lspci -n:
> 00:02.0 0300: 8086:27a2 (rev 03)
> 00:02.1 0380: 8086:27a6 (rev 03)

Your analysis correct, and the code is broken. :)  But the bug is harmless:  
the second device is a vestige of dual head Windows support, and isn't really 
useful.  Eventually we'll probably remove the above code and the 
corresponding warning messages about subfunctions not being claimed...

Jesse



More information about the xorg mailing list