<html>
    <head>
      <base href="https://bugs.freedesktop.org/" />
    </head>
    <body>
      <p>
        <div>
            <b><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - Segfault in xf86DestroyI2CDevRec"
   href="https://bugs.freedesktop.org/show_bug.cgi?id=93675#c8">Comment # 8</a>
              on <a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - Segfault in xf86DestroyI2CDevRec"
   href="https://bugs.freedesktop.org/show_bug.cgi?id=93675">bug 93675</a>
              from <span class="vcard"><a class="email" href="mailto:kevinbrace@gmx.com" title="Kevin Brace <kevinbrace@gmx.com>"> <span class="fn">Kevin Brace</span></a>
</span></b>
        <pre>(In reply to Kyle Guinn from <a href="show_bug.cgi?id=93675#c7">comment #7</a>)

Hi Kyle,

<span class="quote">> It is the CN700 chipset.  No DVI connector.

> In particular, it's this board here:
> <a href="http://www.jetwaycomputer.com/J7F4.html">http://www.jetwaycomputer.com/J7F4.html</a></span >

I actually own that same board, but I have not really tested it with OpenChrome
yet.
    There is a reason why you saw the crash you saw.
This is because the code will check "only for" P4M800 Pro, VN800, and CN700
chipsets when it goes into activating VT1632A external TMDS transmitter
initialization code.

_____________________________________________________________________________
void
ViaOutputsDetect(ScrnInfoPtr pScrn)
{
    VIAPtr pVia = VIAPTR(pScrn);
    VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;

    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaOutputsDetect\n"));

    pBIOSInfo->analog = NULL;

    /* LVDS */
    via_lvds_init(pScrn);

    /* VGA */
    via_analog_init(pScrn);

    /*
     * FIXME: xf86I2CProbeAddress(pVia->pI2CBus3, 0x40)
     * disables the panel on P4M900
     */
    /* TV encoder */
    if ((pVia->Chipset != VIA_P4M900) || (pVia->ActiveDevice & VIA_DEVICE_TV))
        via_tv_init(pScrn);

    if (pVia->Chipset == VIA_VM800) {
        via_dvi_init(pScrn);
    }

    if (pVia->ActiveDevice & VIA_DEVICE_DFP) {
        switch (pVia->Chipset) {
        case VIA_CX700:
        case VIA_VX800:
        case VIA_VX855:
        case VIA_VX900:
            via_dp_init(pScrn);
            break;
        }
    }
}
_____________________________________________________________________________

See the line that checks for VIA_VM800 (the PCI Device ID for P4M800 Pro,
VN800, and CN700 integrated graphics).
If that line is true, then via_dvi_init function is called.
Here is the via_dvi_init function.
_____________________________________________________________________________
void
via_dvi_init(ScrnInfoPtr pScrn)
{
    VIAPtr pVia = VIAPTR(pScrn);
    xf86OutputPtr output = NULL;
    struct ViaVT1632PrivateData *private_data = NULL;
    I2CBusPtr pBus = NULL;
    I2CDevPtr pDev = NULL;

    if (!pVia->pI2CBus2 || !pVia->pI2CBus3) {
        return;
    }

    pDev = xf86CreateI2CDevRec();
    if (!pDev) {
        return;
    }

    pDev->DevName = "VT1632";
    pDev->SlaveAddr = 0x10;

    if (xf86I2CProbeAddress(pVia->pI2CBus3, pDev->SlaveAddr)) {
        pDev->pI2CBus = pVia->pI2CBus3;
    } else if (xf86I2CProbeAddress(pVia->pI2CBus2, pDev->SlaveAddr)) {
        pDev->pI2CBus = pVia->pI2CBus2;
    } else {
        xf86DestroyI2CDevRec(pDev, TRUE);
        return;
    }

    if (!xf86I2CDevInit(pDev)) {
        xf86DestroyI2CDevRec(pDev, TRUE);
        return;
    }

    if (!via_vt1632_probe(pScrn, pDev)) {
        xf86DestroyI2CDevRec(pDev, TRUE);
        return;
    }

    private_data = via_vt1632_init(pScrn, pDev);
    if (!private_data) {
        xf86DestroyI2CDevRec(pDev, TRUE);
        return;
    }

    output = xf86OutputCreate(pScrn, &via_dvi_funcs, "DVI-1");
    if (output) {
        output->driver_private = private_data;
        output->possible_crtcs = 0x2;
        output->possible_clones = 0;
        output->interlaceAllowed = FALSE;
        output->doubleScanAllowed = FALSE;
    }
}
_____________________________________________________________________________


If you take out xf86DestroyI2CDevRec API call after 2 calls to
xf86I2CProbeAddress API call, the problem seems to go away (I am not sure if
this is okay. If it is not, let me know.).

_____________________________________________________________________________

    if (xf86I2CProbeAddress(pVia->pI2CBus3, pDev->SlaveAddr)) {
        pDev->pI2CBus = pVia->pI2CBus3;
    } else if (xf86I2CProbeAddress(pVia->pI2CBus2, pDev->SlaveAddr)) {
        pDev->pI2CBus = pVia->pI2CBus2;
    } else {
//      xf86DestroyI2CDevRec(pDev, TRUE);
        return;
    }

_____________________________________________________________________________



This is the patch (fairly large patch) that added the VT1632A detection code in
early 2015.
I think the problem with the code was that it was not really tested widely
prior to being merged into the master branch

<a href="http://cgit.freedesktop.org/openchrome/xf86-video-openchrome/commit/?id=a8c2f04e2ef21e64f2e91dd6f3e237f80e8c80c6">http://cgit.freedesktop.org/openchrome/xf86-video-openchrome/commit/?id=a8c2f04e2ef21e64f2e91dd6f3e237f80e8c80c6</a>

The sole main developer seems to have disappeared from the project, and as a
result, very little development activity has occurred in the last 12 months.
I am currently trying to assume the role of main developer in the near future,
so that we can fix several bugs and do new commits.
    The reason why I know all of this is because I struggled to figure out why
via_dvi_init function was crashing for a week in early January 2016.
Internally within OpenChrome, there is a large predefined display output table.
I was trying to reduce the use of this, but in the process, I was having issues
with via_dvi_init function crashing.
VT1632A external TMDS transmitter is used by other VIA Technologies chipsets,
so I did not like the way the current version of OpenChrome was limit the use
with P4M800 Pro, VN800, and CN700 chipsets.
    Once I gain Git repository commit rights, I will definitely fix this bug in
a new commit.
I hope the answers I gave you were satisfactory.

Regards,

Kevin Brace</pre>
        </div>
      </p>
      <hr>
      <span>You are receiving this mail because:</span>
      
      <ul>
          <li>You are the assignee for the bug.</li>
      </ul>
    </body>
</html>