diff options
author | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2013-08-16 17:04:20 +0000 |
---|---|---|
committer | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2013-08-16 17:04:20 +0000 |
commit | 5c3b2da17ee7dd4535c55d97ec4389537af53ca4 (patch) | |
tree | 525cd8520b6f21c27084275e925d9bc86341b90e /driver/xf86-video-ati/src/radeon_modes.c | |
parent | 170a34b77c6fd4d1ad432bb98ff30eedc444dbae (diff) |
Update to xf86-video-ati 7.2.0, requested by jsg@
It fixes an endianess problem with kms and the in tree x86-video-ati
among other things.
It has been tested on various i386/amd64/sparc64/macppc machines
on a range of hardware from r100->northern islands.
Diffstat (limited to 'driver/xf86-video-ati/src/radeon_modes.c')
-rw-r--r-- | driver/xf86-video-ati/src/radeon_modes.c | 542 |
1 files changed, 0 insertions, 542 deletions
diff --git a/driver/xf86-video-ati/src/radeon_modes.c b/driver/xf86-video-ati/src/radeon_modes.c deleted file mode 100644 index 215cde318..000000000 --- a/driver/xf86-video-ati/src/radeon_modes.c +++ /dev/null @@ -1,542 +0,0 @@ -/* - * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and - * VA Linux Systems Inc., Fremont, California. - * - * All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation on the rights to use, copy, modify, merge, - * publish, distribute, sublicense, and/or sell copies of the Software, - * and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NON-INFRINGEMENT. IN NO EVENT SHALL ATI, VA LINUX SYSTEMS AND/OR - * THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -/* - * Authors: - * Kevin E. Martin <martin@xfree86.org> - * Rickard E. Faith <faith@valinux.com> - * Alan Hourihane <alanh@fairlite.demon.co.uk> - */ - -#include <string.h> -#include <stdio.h> - -#include "xf86.h" - /* Driver data structures */ -#include "randrstr.h" -#include "radeon_probe.h" -#include "radeon.h" -#include "radeon_reg.h" -#include "radeon_macros.h" -#include "radeon_version.h" -#include "radeon_atombios.h" - -#include "xf86Modes.h" - /* DDC support */ -#include "xf86DDC.h" -#include <randrstr.h> - -void RADEONSetPitch (ScrnInfoPtr pScrn) -{ - int dummy = pScrn->virtualX; - RADEONInfoPtr info = RADEONPTR(pScrn); - int pitch_mask = 0; - int align_large; - - align_large = info->allowColorTiling || IS_AVIVO_VARIANT; - - /* FIXME: May need to validate line pitch here */ - if (info->ChipFamily < CHIP_FAMILY_R600) { - switch (pScrn->depth / 8) { - case 1: pitch_mask = align_large ? 256 : 128; - break; - case 2: pitch_mask = align_large ? 128 : 32; - break; - case 3: - case 4: pitch_mask = align_large ? 64 : 16; - break; - } - } else - pitch_mask = 256; /* r6xx/r7xx need 256B alignment for accel */ - - dummy = RADEON_ALIGN(pScrn->virtualX, pitch_mask); - pScrn->displayWidth = dummy; - info->CurrentLayout.displayWidth = pScrn->displayWidth; - -} - -static DisplayModePtr -RADEONTVModes(xf86OutputPtr output) -{ - DisplayModePtr new = NULL; - - /* just a place holder */ - new = xf86CVTMode(800, 600, 60.00, FALSE, FALSE); - new->type = M_T_DRIVER | M_T_PREFERRED; - - return new; -} - -static DisplayModePtr -RADEONATOMTVModes(xf86OutputPtr output) -{ - DisplayModePtr last = NULL; - DisplayModePtr new = NULL; - DisplayModePtr first = NULL; - int i; - /* Add some common sizes */ - int widths[5] = {640, 720, 800, 848, 1024}; - int heights[5] = {480, 480, 600, 480, 768}; - - for (i = 0; i < 5; i++) { - new = xf86CVTMode(widths[i], heights[i], 60.0, FALSE, FALSE); - - new->type = M_T_DRIVER; - - new->next = NULL; - new->prev = last; - - if (last) last->next = new; - last = new; - if (!first) first = new; - } - - if (last) { - last->next = NULL; //first; - first->prev = NULL; //last; - } - - return first; -} - -/* This is used only when no mode is specified for FP and no ddc is - * available. We force it to native mode, if possible. - */ -static DisplayModePtr RADEONFPNativeMode(xf86OutputPtr output) -{ - ScrnInfoPtr pScrn = output->scrn; - RADEONOutputPrivatePtr radeon_output = output->driver_private; - radeon_native_mode_ptr native_mode = &radeon_output->native_mode; - DisplayModePtr new = NULL; - char stmp[32]; - - if (native_mode->PanelXRes != 0 && - native_mode->PanelYRes != 0 && - native_mode->DotClock != 0) { - - new = xnfcalloc(1, sizeof (DisplayModeRec)); - sprintf(stmp, "%dx%d", native_mode->PanelXRes, native_mode->PanelYRes); - new->name = xnfalloc(strlen(stmp) + 1); - strcpy(new->name, stmp); - new->HDisplay = native_mode->PanelXRes; - new->VDisplay = native_mode->PanelYRes; - - new->HTotal = new->HDisplay + native_mode->HBlank; - new->HSyncStart = new->HDisplay + native_mode->HOverPlus; - new->HSyncEnd = new->HSyncStart + native_mode->HSyncWidth; - new->VTotal = new->VDisplay + native_mode->VBlank; - new->VSyncStart = new->VDisplay + native_mode->VOverPlus; - new->VSyncEnd = new->VSyncStart + native_mode->VSyncWidth; - - new->Clock = native_mode->DotClock; - new->Flags = native_mode->Flags; - - if (new) { - new->type = M_T_DRIVER | M_T_PREFERRED; - - new->next = NULL; - new->prev = NULL; - } - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Added native panel mode: %dx%d\n", - native_mode->PanelXRes, native_mode->PanelYRes); - } else if (native_mode->PanelXRes != 0 && - native_mode->PanelYRes != 0) { - - new = xf86CVTMode(native_mode->PanelXRes, native_mode->PanelYRes, 60.0, TRUE, FALSE); - - if (new) { - new->type = M_T_DRIVER | M_T_PREFERRED; - - new->next = NULL; - new->prev = NULL; - } - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Added native panel mode using CVT: %dx%d\n", - native_mode->PanelXRes, native_mode->PanelYRes); - } - - return new; -} - -#if defined(__powerpc__) -/* Apple eMacs need special modes for the internal CRT, e.g., - * Modeline "640x480" 62.12 640 680 752 864 480 481 484 521 +HSync +Vsync - * Modeline "800x600" 76.84 800 848 936 1072 600 601 604 640 +HSync +Vsync - * Modeline "1024x768" 99.07 1024 1088 1200 1376 768 769 772 809 +HSync +Vsync - * Modeline "1152x864" 112.36 1152 1224 1352 1552 864 865 868 905 +HSync +Vsync - * Modeline "1280x960" 124.54 1280 1368 1504 1728 960 961 964 1001 +HSync +Vsync - */ -static DisplayModePtr RADEONeMacModes(xf86OutputPtr output) -{ - ScrnInfoPtr pScrn = output->scrn; - DisplayModePtr last=NULL, new=NULL, first=NULL; - int i, *modep; - static const char *modenames[5] = { - "640x480", "800x600", "1024x768", "1152x864", "1280x960" - }; - static int modes[9*5] = { - 62120, 640, 680, 752, 864, 480, 481, 484, 521, - 76840, 800, 848, 936, 1072, 600, 601, 604, 640, - 99070, 1024, 1088, 1200, 1376, 768, 769, 772, 809, - 112360, 1152, 1224, 1352, 1552, 864, 865, 868, 905, - 124540, 1280, 1368, 1504, 1728, 960, 961, 964, 1001 - }; - modep = modes; - - for (i=0; i<5; i++) { - new = xnfcalloc(1, sizeof (DisplayModeRec)); - if (new) { - new->name = xnfalloc(strlen(modenames[i]) + 1); - strcpy(new->name, modenames[i]); - new->Clock = *modep++; - - new->HDisplay = *modep++; - new->HSyncStart = *modep++; - new->HSyncEnd = *modep++; - new->HTotal = *modep++; - - new->VDisplay = *modep++; - new->VSyncStart = *modep++; - new->VSyncEnd = *modep++; - new->VTotal = *modep++; - - new->Flags = 0; - new->type = M_T_DRIVER; - if (i==2) - new->type |= M_T_PREFERRED; - new->next = NULL; - new->prev = last; - if (last) last->next = new; - last = new; - if (!first) first = new; - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Added eMac mode %s\n", modenames[i]); - } - } - - return first; -} -#endif - -/* this function is basically a hack to add the screen modes */ -static void RADEONAddScreenModes(xf86OutputPtr output, DisplayModePtr *modeList) -{ - ScrnInfoPtr pScrn = output->scrn; - RADEONOutputPrivatePtr radeon_output = output->driver_private; - radeon_native_mode_ptr native_mode = &radeon_output->native_mode; - DisplayModePtr last = NULL; - DisplayModePtr new = NULL; - DisplayModePtr first = NULL; - int count = 0; - int i, width, height; - char **ppModeName = pScrn->display->modes; - - first = last = *modeList; - - /* We have a flat panel connected to the primary display, and we - * don't have any DDC info. - */ - for (i = 0; ppModeName[i] != NULL; i++) { - - if (sscanf(ppModeName[i], "%dx%d", &width, &height) != 2) continue; - - if (radeon_output->active_device & (ATOM_DEVICE_LCD_SUPPORT)) { - /* already added the native mode */ - if (width == native_mode->PanelXRes && height == native_mode->PanelYRes) - continue; - - /* Note: We allow all non-standard modes as long as they do not - * exceed the native resolution of the panel. Since these modes - * need the internal RMX unit in the video chips (and there is - * only one per card), this will only apply to the primary head. - */ - if (width < 320 || width > native_mode->PanelXRes || - height < 200 || height > native_mode->PanelYRes) { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, - "Mode %s is out of range.\n", ppModeName[i]); - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, - "Valid FP modes must be between 320x200-%dx%d\n", - native_mode->PanelXRes, native_mode->PanelYRes); - continue; - } - } - - new = xf86CVTMode(width, height, 60.0, FALSE, FALSE); - - new->type |= M_T_USERDEF; - - new->next = NULL; - new->prev = last; - - if (last) last->next = new; - last = new; - if (!first) first = new; - - count++; - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Adding Screen mode: %s\n", new->name); - } - - - /* Close the doubly-linked mode list, if we found any usable modes */ - if (last) { - last->next = NULL; //first; - first->prev = NULL; //last; - *modeList = first; - } - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Total number of valid Screen mode(s) added: %d\n", count); - -} - -/* BIOS may not have right panel size, we search through all supported - * DDC modes looking for the maximum panel size. - */ -static void -RADEONUpdatePanelSize(xf86OutputPtr output) -{ - ScrnInfoPtr pScrn = output->scrn; - RADEONInfoPtr info = RADEONPTR(pScrn); - RADEONOutputPrivatePtr radeon_output = output->driver_private; - radeon_native_mode_ptr native_mode = &radeon_output->native_mode; - int j; - xf86MonPtr ddc = output->MonInfo; - DisplayModePtr p; - - // update output's native mode - if (radeon_output->active_device & (ATOM_DEVICE_LCD_SUPPORT)) { - radeon_encoder_ptr radeon_encoder = radeon_get_encoder(output); - if (radeon_encoder) { - radeon_lvds_ptr lvds = (radeon_lvds_ptr)radeon_encoder->dev_priv; - if (lvds) - radeon_output->native_mode = lvds->native_mode; - } - } - - // crtc should handle? - if ((info->UseBiosDividers && native_mode->DotClock != 0) || (ddc == NULL)) - return; - - /* Go thru detailed timing table first */ - for (j = 0; j < 4; j++) { - if (ddc->det_mon[j].type == 0) { - struct detailed_timings *d_timings = - &ddc->det_mon[j].section.d_timings; - int match = 0; - - /* If we didn't get a panel clock or guessed one, try to match the - * mode with the panel size. We do that because we _need_ a panel - * clock, or ValidateFPModes will fail, even when UseBiosDividers - * is set. - */ - if (native_mode->DotClock == 0 && - native_mode->PanelXRes == d_timings->h_active && - native_mode->PanelYRes == d_timings->v_active) - match = 1; - - /* If we don't have a BIOS provided panel data with fixed dividers, - * check for a larger panel size - */ - if (native_mode->PanelXRes < d_timings->h_active && - native_mode->PanelYRes < d_timings->v_active && - !info->UseBiosDividers) - match = 1; - - if (match) { - native_mode->PanelXRes = d_timings->h_active; - native_mode->PanelYRes = d_timings->v_active; - native_mode->DotClock = d_timings->clock / 1000; - native_mode->HOverPlus = d_timings->h_sync_off; - native_mode->HSyncWidth = d_timings->h_sync_width; - native_mode->HBlank = d_timings->h_blanking; - native_mode->VOverPlus = d_timings->v_sync_off; - native_mode->VSyncWidth = d_timings->v_sync_width; - native_mode->VBlank = d_timings->v_blanking; - native_mode->Flags = (d_timings->interlaced ? V_INTERLACE : 0); - switch (d_timings->misc) { - case 0: native_mode->Flags |= V_NHSYNC | V_NVSYNC; break; - case 1: native_mode->Flags |= V_PHSYNC | V_NVSYNC; break; - case 2: native_mode->Flags |= V_NHSYNC | V_PVSYNC; break; - case 3: native_mode->Flags |= V_PHSYNC | V_PVSYNC; break; - } - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Panel infos found from DDC detailed: %dx%d\n", - native_mode->PanelXRes, native_mode->PanelYRes); - } - } - } - - if (info->UseBiosDividers && native_mode->DotClock != 0) - return; - - /* Search thru standard VESA modes from EDID */ - for (j = 0; j < 8; j++) { - if ((native_mode->PanelXRes < ddc->timings2[j].hsize) && - (native_mode->PanelYRes < ddc->timings2[j].vsize)) { - for (p = pScrn->monitor->Modes; p; p = p->next) { - if ((ddc->timings2[j].hsize == p->HDisplay) && - (ddc->timings2[j].vsize == p->VDisplay)) { - float refresh = - (float)p->Clock * 1000.0 / p->HTotal / p->VTotal; - - if (abs((float)ddc->timings2[j].refresh - refresh) < 1.0) { - /* Is this good enough? */ - native_mode->PanelXRes = ddc->timings2[j].hsize; - native_mode->PanelYRes = ddc->timings2[j].vsize; - native_mode->HBlank = p->HTotal - p->HDisplay; - native_mode->HOverPlus = p->HSyncStart - p->HDisplay; - native_mode->HSyncWidth = p->HSyncEnd - p->HSyncStart; - native_mode->VBlank = p->VTotal - p->VDisplay; - native_mode->VOverPlus = p->VSyncStart - p->VDisplay; - native_mode->VSyncWidth = p->VSyncEnd - p->VSyncStart; - native_mode->DotClock = p->Clock; - native_mode->Flags = p->Flags; - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Panel infos found from DDC VESA/EDID: %dx%d\n", - native_mode->PanelXRes, native_mode->PanelYRes); - } - } - } - } - } -} - -static void -radeon_add_common_modes(xf86OutputPtr output, DisplayModePtr modes) -{ - RADEONOutputPrivatePtr radeon_output = output->driver_private; - radeon_native_mode_ptr native_mode = &radeon_output->native_mode; - DisplayModePtr last = NULL; - DisplayModePtr new = NULL; - DisplayModePtr first = NULL; - int i; - /* Add some common sizes */ - int widths[15] = {640, 800, 1024, 1152, 1280, 1280, 1280, 1280, 1280, 1440, 1400, 1680, 1600, 1920, 1920}; - int heights[15] = {480, 600, 768, 768, 720, 800, 854, 960, 1024, 900, 1050, 1050, 1200, 1080, 1200}; - - for (i = 0; i < 15; i++) { - if (radeon_output->active_device & (ATOM_DEVICE_LCD_SUPPORT)) { - /* already added the native mode */ - if (widths[i] == native_mode->PanelXRes && heights[i] == native_mode->PanelYRes) - continue; - - /* Note: We allow all non-standard modes as long as they do not - * exceed the native resolution of the panel. Since these modes - * need the internal RMX unit in the video chips (and there is - * only one per card), this will only apply to the primary head. - */ - if (widths[i] < 320 || widths[i] > native_mode->PanelXRes || - heights[i] < 200 || heights[i] > native_mode->PanelYRes) - continue; - } - - new = xf86CVTMode(widths[i], heights[i], 60.0, FALSE, FALSE); - - new->type = M_T_DRIVER; - - new->next = NULL; - new->prev = last; - - if (last) last->next = new; - last = new; - if (!first) first = new; - } - - if (last) { - last->next = NULL; //first; - first->prev = NULL; //last; - } - - xf86ModesAdd(modes, first); - -} - -DisplayModePtr -RADEONProbeOutputModes(xf86OutputPtr output) -{ - RADEONOutputPrivatePtr radeon_output = output->driver_private; - ScrnInfoPtr pScrn = output->scrn; - RADEONInfoPtr info = RADEONPTR(pScrn); - DisplayModePtr modes = NULL; - AtomBiosArgRec atomBiosArg; - AtomBiosResult atomBiosResult; - - if (output->status == XF86OutputStatusConnected) { - if (radeon_output->active_device & (ATOM_DEVICE_TV_SUPPORT)) { - if (IS_AVIVO_VARIANT) - modes = RADEONATOMTVModes(output); - else - modes = RADEONTVModes(output); - } else if (radeon_output->active_device & (ATOM_DEVICE_CV_SUPPORT)) { - atomBiosResult = RHDAtomBiosFunc(pScrn, info->atomBIOS, - ATOMBIOS_GET_CV_MODES, &atomBiosArg); - if (atomBiosResult == ATOM_SUCCESS) { - modes = atomBiosArg.modes; - } - } else { - if (radeon_output->active_device & (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) - RADEONUpdatePanelSize(output); - if (output->MonInfo) - modes = xf86OutputGetEDIDModes (output); -#if defined(__powerpc__) - if ((info->MacModel == RADEON_MAC_EMAC) && - (radeon_output->active_device & ATOM_DEVICE_CRT1_SUPPORT) && - (modes == NULL)) - modes = RADEONeMacModes(output); -#endif - if (modes == NULL) { - if ((radeon_output->active_device & (ATOM_DEVICE_LCD_SUPPORT)) && info->IsAtomBios) { - atomBiosResult = RHDAtomBiosFunc(pScrn, - info->atomBIOS, - ATOMBIOS_GET_PANEL_EDID, &atomBiosArg); - if (atomBiosResult == ATOM_SUCCESS) { - output->MonInfo = xf86InterpretEDID(pScrn->scrnIndex, - atomBiosArg.EDIDBlock); - modes = xf86OutputGetEDIDModes(output); - } - } - if (modes == NULL) { - if (radeon_output->active_device & (ATOM_DEVICE_LCD_SUPPORT)) - modes = RADEONFPNativeMode(output); - /* add the screen modes */ - if (modes == NULL) - RADEONAddScreenModes(output, &modes); - } - } - } - } - - if (radeon_output->active_device & (ATOM_DEVICE_LCD_SUPPORT)) - radeon_add_common_modes(output, modes); - - return modes; -} - |