2
* Copyright 2000 through 2004 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org
4
* Permission to use, copy, modify, distribute, and sell this software and its
5
* documentation for any purpose is hereby granted without fee, provided that
6
* the above copyright notice appear in all copies and that both that copyright
7
* notice and this permission notice appear in supporting documentation, and
8
* that the name of Marc Aurele La France not be used in advertising or
9
* publicity pertaining to distribution of the software without specific,
10
* written prior permission. Marc Aurele La France makes no representations
11
* about the suitability of this software for any purpose. It is provided
12
* "as-is" without express or implied warranty.
14
* MARC AURELE LA FRANCE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
16
* EVENT SHALL MARC AURELE LA FRANCE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20
* PERFORMANCE OF THIS SOFTWARE.
23
* Leif Delgass <ldelgass@retinalburn.net>
34
#include "aticursor.h"
35
#include "atioption.h"
36
#include "atistruct.h"
38
#include "mach64_common.h"
43
* List of supported TV standard names
45
const char *ATITVStandardNames[ATI_TV_STDS_MAX_VALID+1] = {
63
* Recognised XF86Config options.
65
static const OptionInfoRec ATIPublicOptions[] =
68
ATI_OPTION_PROBE_SPARSE,
82
ATI_OPTION_CRT_DISPLAY,
134
ATI_OPTION_LOCAL_TEXTURES,
141
ATI_OPTION_BUFFER_SIZE,
148
#endif /* XF86DRI_DEVEL */
169
ATI_OPTION_MMIO_CACHE,
178
ATI_OPTION_TEST_MMIO_CACHE,
185
ATI_OPTION_PANEL_DISPLAY,
192
ATI_OPTION_REFERENCE_CLOCK,
199
ATI_OPTION_SHADOW_FB,
213
ATI_OPTION_ACCELMETHOD,
220
ATI_OPTION_RENDER_ACCEL,
235
static const unsigned long ATIPublicOptionSize = SizeOf(ATIPublicOptions);
237
const OptionInfoRec *
238
ATIOptionsWeak(void) { return ATIPublicOptions; }
241
* Non-publicised XF86Config options.
245
ATI_OPTION_BIOS_DISPLAY, /* Allow BIOS interference */
246
ATI_OPTION_CRT_SCREEN, /* Legacy negation of "PanelDisplay" */
247
ATI_OPTION_DEVEL, /* Intentionally undocumented */
248
ATI_OPTION_BLEND, /* Force horizontal blending of small modes */
249
ATI_OPTION_LCDSYNC /* Use XF86Config panel mode porches */
250
} ATIPrivateOptionType;
253
* ATIProcessOptions --
255
* This function extracts options from what was parsed out of the XF86Config
261
ScrnInfoPtr pScreenInfo,
265
OptionInfoPtr PublicOption = xnfalloc(ATIPublicOptionSize);
266
OptionInfoRec PrivateOption[] =
268
{ /* ON: Let BIOS change display(s) */
269
ATI_OPTION_BIOS_DISPLAY, /* OFF: Don't */
275
{ /* Negation of "PanelDisplay" public option */
276
ATI_OPTION_CRT_SCREEN,
282
{ /* ON: Ease exploration of loose ends */
283
ATI_OPTION_DEVEL, /* OFF: Fit for public consumption */
289
{ /* ON: Horizontally blend most modes */
290
ATI_OPTION_BLEND, /* OFF: Use pixel replication more often */
296
{ /* ON: Use XF86Config porch timings */
297
ATI_OPTION_LCDSYNC, /* OFF: Use porches from mode on entry */
312
(void)memcpy(PublicOption, ATIPublicOptions, ATIPublicOptionSize);
314
# define ProbeSparse PublicOption[ATI_OPTION_PROBE_SPARSE].value.bool
315
# define Accel PublicOption[ATI_OPTION_ACCEL].value.bool
316
# define BIOSDisplay PrivateOption[ATI_OPTION_BIOS_DISPLAY].value.bool
317
# define Blend PrivateOption[ATI_OPTION_BLEND].value.bool
318
# define CRTDisplay PublicOption[ATI_OPTION_CRT_DISPLAY].value.bool
319
# define CRTScreen PrivateOption[ATI_OPTION_CRT_SCREEN].value.bool
320
# define CSync PublicOption[ATI_OPTION_CSYNC].value.bool
321
# define Devel PrivateOption[ATI_OPTION_DEVEL].value.bool
322
# define HWCursor PublicOption[ATI_OPTION_HWCURSOR].value.bool
326
# define IsPCI PublicOption[ATI_OPTION_IS_PCI].value.bool
327
# define DMAMode PublicOption[ATI_OPTION_DMA_MODE].value.str
328
# define AGPMode PublicOption[ATI_OPTION_AGP_MODE].value.num
329
# define AGPSize PublicOption[ATI_OPTION_AGP_SIZE].value.num
330
# define LocalTex PublicOption[ATI_OPTION_LOCAL_TEXTURES].value.bool
331
# define BufferSize PublicOption[ATI_OPTION_BUFFER_SIZE].value.num
333
#endif /* XF86DRI_DEVEL */
337
# define TvOut PublicOption[ATI_OPTION_TV_OUT].value.bool
338
# define TvStd PublicOption[ATI_OPTION_TV_STD].value.str
342
# define CacheMMIO PublicOption[ATI_OPTION_MMIO_CACHE].value.bool
343
# define TestCacheMMIO PublicOption[ATI_OPTION_TEST_MMIO_CACHE].value.bool
344
# define PanelDisplay PublicOption[ATI_OPTION_PANEL_DISPLAY].value.bool
345
# define ShadowFB PublicOption[ATI_OPTION_SHADOW_FB].value.bool
346
# define SWCursor PublicOption[ATI_OPTION_SWCURSOR].value.bool
347
# define AccelMethod PublicOption[ATI_OPTION_ACCELMETHOD].value.str
348
# define RenderAccel PublicOption[ATI_OPTION_RENDER_ACCEL].value.bool
349
# define LCDSync PrivateOption[ATI_OPTION_LCDSYNC].value.bool
351
# define ReferenceClock \
352
PublicOption[ATI_OPTION_REFERENCE_CLOCK].value.freq.freq
354
/* Pick up XF86Config options */
355
xf86CollectOptions(pScreenInfo, NULL);
357
/* Set non-zero defaults */
358
Accel = CacheMMIO = HWCursor = TRUE;
360
ReferenceClock = ((double)157500000.0) / ((double)11.0);
364
Blend = PanelDisplay = TRUE;
375
TvStd = "None"; /* No tv standard change requested */
378
xf86ProcessOptions(pScreenInfo->scrnIndex, pScreenInfo->options,
380
xf86ProcessOptions(pScreenInfo->scrnIndex, pScreenInfo->options,
383
/* Move option values into driver private structure */
384
pATI->OptionProbeSparse = ProbeSparse;
385
pATI->OptionAccel = Accel;
386
pATI->OptionBIOSDisplay = BIOSDisplay;
387
pATI->OptionBlend = Blend;
388
pATI->OptionCRTDisplay = CRTDisplay;
389
pATI->OptionCSync = CSync;
390
pATI->OptionDevel = Devel;
394
if (TvOut && pATI->Chip < ATI_CHIP_264GT) {
395
/* Only allow this for 3D Rage (I) or greater chip ID
396
* AFAIK, no chips before this supported TV-Out
397
* mach64VT has support for TV tuner, but no TV-Out
399
xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING,
400
"TV Out not supported for this chip.\n");
403
pATI->OptionTvOut = TvOut;
404
pATI->OptionTvStd = ATI_TV_STD_INVALID;
405
for (std = 0; std < ATI_TV_STDS_MAX_VALID; std++) {
406
if (std != ATI_TV_STD_RESERVED1 && std != ATI_TV_STD_RESERVED2) {
407
if (strncasecmp(TvStd, ATITVStandardNames[std], ATI_TV_STDS_NAME_MAXLEN)==0) {
408
pATI->OptionTvStd = std;
417
pATI->OptionMMIOCache = CacheMMIO;
418
pATI->OptionTestMMIOCache = TestCacheMMIO;
419
pATI->OptionShadowFB = ShadowFB;
420
pATI->OptionLCDSync = LCDSync;
422
/* "CRTScreen" is now "NoPanelDisplay" */
423
if ((PanelDisplay != CRTScreen) ||
424
PublicOption[ATI_OPTION_PANEL_DISPLAY].found)
425
pATI->OptionPanelDisplay = PanelDisplay;
427
pATI->OptionPanelDisplay = !CRTScreen;
431
pATI->OptionIsPCI = IsPCI;
432
pATI->OptionAGPMode = AGPMode;
433
pATI->OptionAGPSize = AGPSize;
434
pATI->OptionLocalTextures = LocalTex;
435
pATI->OptionBufferSize = BufferSize;
437
if (strcasecmp(DMAMode, "async")==0)
438
pATI->OptionDMAMode = MACH64_MODE_DMA_ASYNC;
439
else if (strcasecmp(DMAMode, "sync")==0)
440
pATI->OptionDMAMode = MACH64_MODE_DMA_SYNC;
441
else if (strcasecmp(DMAMode, "mmio")==0 )
442
pATI->OptionDMAMode = MACH64_MODE_MMIO;
444
xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING,
445
"Unkown dma_mode: '%s'\n", DMAMode);
446
xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING,
447
"Valid dma_mode options are: 'async','sync','mmio'\n");
448
xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING,
449
"Defaulting to async DMA mode\n");
450
pATI->OptionDMAMode = MACH64_MODE_DMA_ASYNC;
453
#endif /* XF86DRI_DEVEL */
455
/* Validate and set cursor options */
456
pATI->Cursor = ATI_CURSOR_SOFTWARE;
457
if (SWCursor || !HWCursor)
459
if (HWCursor && PublicOption[ATI_OPTION_HWCURSOR].found)
460
xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING,
461
"Option \"sw_cursor\" overrides Option \"hw_cursor\".\n");
463
else if (pATI->Chip < ATI_CHIP_264CT)
465
if (HWCursor && PublicOption[ATI_OPTION_HWCURSOR].found)
466
xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING,
467
"Option \"hw_cursor\" not supported in this configuration.\n");
471
pATI->Cursor = ATI_CURSOR_HARDWARE;
474
pATI->refclk = (int)ReferenceClock;
476
pATI->useEXA = FALSE;
477
if (pATI->OptionAccel)
479
MessageType from = X_DEFAULT;
482
if (AccelMethod != NULL)
485
if (xf86NameCmp(AccelMethod, "EXA") == 0)
490
#endif /* !USE_XAA */
492
xf86DrvMsg(pScreenInfo->scrnIndex, from,
493
"Using %s acceleration architecture\n",
494
pATI->useEXA ? "EXA" : "XAA");
497
if (pATI->useEXA && pATI->Chip >= ATI_CHIP_264GTPRO)
498
pATI->RenderAccelEnabled = TRUE;
500
if (pATI->useEXA && !RenderAccel)
501
pATI->RenderAccelEnabled = FALSE;