[PATCH r128 2/3] Reorganize panel BIOS code
Alex Deucher
alexdeucher at gmail.com
Fri Aug 8 11:15:36 PDT 2014
On Fri, Aug 8, 2014 at 1:09 PM, Connor Behan <connor.behan at gmail.com> wrote:
> Panel values should be stored instead of read and applied in one go.
> This allows us to use the mode_fixup hook for laptop LCDs as well.
>
> Signed-off-by: Connor Behan <connor.behan at gmail.com>
For the LVDS panel, just grab the timings out of the vbios and store
them in a xorg mode struct. Then just use that directly rather than
converting between all these intermediate forms.
Alex
> ---
> src/r128_driver.c | 64 ++++++++++++++++++++++---------------------------------
> 1 file changed, 26 insertions(+), 38 deletions(-)
>
> diff --git a/src/r128_driver.c b/src/r128_driver.c
> index 2cbfc81..974e24d 100644
> --- a/src/r128_driver.c
> +++ b/src/r128_driver.c
> @@ -477,7 +477,7 @@ void R128GetPanelInfoFromBIOS(xf86OutputPtr output)
> R128InfoPtr info = R128PTR(pScrn);
> R128OutputPrivatePtr r128_output = output->driver_private;
> int FPHeader = 0;
> - int i;
> + int i, j;
>
> if (!info->VBIOS) return;
> info->FPBIOSstart = 0;
> @@ -503,7 +503,7 @@ void R128GetPanelInfoFromBIOS(xf86OutputPtr output)
> if (!FPHeader) return;
>
> /* Assume that only one panel is attached and supported */
> - for (i = FPHeader+20; i < FPHeader+84; i += 2) {
> + for (i = FPHeader + 20; i < FPHeader + 84; i += 2) {
> if (R128_BIOS16(i) != 0) {
> info->FPBIOSstart = R128_BIOS16(i);
> break;
> @@ -521,10 +521,32 @@ void R128GetPanelInfoFromBIOS(xf86OutputPtr output)
> xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Panel size: %dx%d\n",
> r128_output->PanelXRes, r128_output->PanelYRes);
>
> + for (i = info->FPBIOSstart + 64; R128_BIOS16(i) != 0; i += 2) {
> + j = R128_BIOS16(i);
> + if (R128_BIOS16(j) != r128_output->PanelXRes) continue;
> + if (R128_BIOS16(j + 2) != r128_output->PanelYRes) continue;
> +
> + /* Assume we are using expanded mode */
> + if (R128_BIOS16(j + 5)) j = R128_BIOS16(j + 5);
> + else j += 9;
> +
> + r128_output->HBlank = ((R128_BIOS16(j + 8) & 0x01ff) - (R128_BIOS16(j + 10) & 0x01ff)) * 8;
> + r128_output->HOverPlus = ((R128_BIOS16(j + 12) & 0x01ff) - (R128_BIOS16(j + 10) & 0x01ff)) * 8;
> + r128_output->HSyncWidth = R128_BIOS8 (j + 14) & 0x1f;
> +
> + r128_output->VBlank = (R128_BIOS16(j + 15) & 0x07ff) - (R128_BIOS16(j + 17) & 0x07ff);
> + r128_output->VOverPlus = (R128_BIOS16(j + 19) & 0x07ff) - (R128_BIOS16(j + 17) & 0x07ff);
> + r128_output->VSyncWidth = (R128_BIOS16(j + 19) >> 11) & 0x1f;
> +
> + r128_output->DotClock = R128_BIOS16(j) * 10;
> + r128_output->Flags = 0;
> + }
> +
> r128_output->PanelPwrDly = R128_BIOS8(info->FPBIOSstart + 56);
>
> if (!r128_output->PanelXRes || !r128_output->PanelYRes) {
> info->HasPanelRegs = FALSE;
> + r128_output->DotClock = 0;
> xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
> "Can't determine panel dimensions, and none specified.\n"
> "\tDisabling programming of FP registers.\n");
> @@ -3431,48 +3453,14 @@ ModeStatus R128DoValidMode(xf86OutputPtr output, DisplayModePtr mode, int flags)
> if (mode->Flags & V_DBLSCAN) return MODE_NO_DBLESCAN;
> }
>
> - if (r128_output->MonType == MT_LCD && info->VBIOS) {
> + if (r128_output->MonType == MT_LCD && info->VBIOS && (flags & MODECHECK_FINAL)) {
> int i;
> for (i = info->FPBIOSstart + 64; R128_BIOS16(i) != 0; i += 2) {
> int j = R128_BIOS16(i);
>
> if (mode->CrtcHDisplay == R128_BIOS16(j) &&
> - mode->CrtcVDisplay == R128_BIOS16(j + 2)) {
> - if ((flags & MODECHECK_FINAL) == MODECHECK_FINAL) {
> - xf86DrvMsg(pScrn->scrnIndex, X_INFO,
> - "Modifying mode according to VBIOS: %ix%i [pclk %.1f MHz] for FP to: ",
> - mode->CrtcHDisplay, mode->CrtcVDisplay,
> - (float)mode->Clock / 1000);
> -
> - /* Assume we are using expanded mode */
> - if (R128_BIOS16(j+5)) j = R128_BIOS16(j+5);
> - else j += 9;
> -
> - mode->Clock = (uint32_t)R128_BIOS16(j) * 10;
> -
> - mode->HDisplay = mode->CrtcHDisplay =
> - ((R128_BIOS16(j + 10) & 0x01ff) + 1) * 8;
> - mode->HSyncStart = mode->CrtcHSyncStart =
> - ((R128_BIOS16(j + 12) & 0x01ff) + 1) * 8;
> - mode->HSyncEnd = mode->CrtcHSyncEnd =
> - mode->CrtcHSyncStart + (R128_BIOS8(j + 14) & 0x1f);
> - mode->HTotal = mode->CrtcHTotal =
> - ((R128_BIOS16(j + 8) & 0x01ff) + 1) * 8;
> -
> - mode->VDisplay = mode->CrtcVDisplay =
> - (R128_BIOS16(j + 17) & 0x07ff) + 1;
> - mode->VSyncStart = mode->CrtcVSyncStart =
> - (R128_BIOS16(j + 19) & 0x07ff) + 1;
> - mode->VSyncEnd = mode->CrtcVSyncEnd =
> - mode->CrtcVSyncStart + ((R128_BIOS16(j + 19) >> 11) & 0x1f);
> - mode->VTotal = mode->CrtcVTotal =
> - (R128_BIOS16(j + 15) & 0x07ff) + 1;
> - xf86ErrorF("%ix%i [pclk %.1f MHz]\n",
> - mode->CrtcHDisplay,mode->CrtcVDisplay,
> - (float)mode->Clock/ 1000);
> - }
> + mode->CrtcVDisplay == R128_BIOS16(j + 2))
> return MODE_OK;
> - }
> }
> xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 5,
> "Mode rejected for FP %ix%i [pclk: %.1f] "
> --
> 2.0.2
>
> _______________________________________________
> xorg-driver-ati mailing list
> xorg-driver-ati at lists.x.org
> http://lists.x.org/mailman/listinfo/xorg-driver-ati
More information about the xorg-driver-ati
mailing list