Ключевые слова:linux, x, xfree86, video, tune, (найти похожие документы)
From: Шлыков Василий (AKA VaSh) <vash@id.ru>
Subject: Повышение производительности в XWindow видеокарт Matrox
Предупреждение
Данная статья распространяется КАК ЕСТЬ, в надежде оказаться
кому-нибудь полезной. Так что автор не несёт ответственность за
спаленные видеокарты, лапти, валенки или другой ущерб приченённый в
результате попытки двинуть описанные ниже идеи в жизнь.
В свою очередь я, собственно, не претендую на первенство, а хочу лишь
поделиться найденным способом с народом.
'О чём у нас там самое был разговор шёл?'
(c) Не мой.
Данная статья посвящена повышению производительности видеокарточек
Matrox в X'ах (http://www.xfree.org/ XFree86 имеются ввиду).
К сожалению утилиты типа PowerStrip для *nix нет, и поэтому приходится
расчитывать на собственные силы(у кого они есть :-) ). Если заглянуть в manы,
посвященные в частности драйверам Matrox, то можно найти несколько
любопытных ключей, отвечающих за производительность карточки. Это, во
первых, параметр `AGPMode' с помощью которого можно настроить
пропускную способнось AGP шины. Кроме этого у Matrox'овских карточек
есть параметр `OverclockMem' про который, цитирую, сказано:
Set clocks to values used by some commercial X-Servers (G100, G200
and G400 only). Default: off.
И все :-( Но! Есть исходники драйверов Matrox'a :-). Если в них
заглянуть, то окажется, что он отвечает за установку частоты работы
GPU/памяти для видеокарт следующим образом:
CAPTION: Соответствие карта/режим -> частота
`OverclockMem' G100 G200 G400/G550 G400 MAX
GPU Mem GPU Mem GPU Mem GPU Mem
true - 143/220* - 143 125 166 150 200
false - 124/203* - 124 110 166 125 166
* При наличии памяти типа SDRAM
Как видно, по умолчанию G400 работают(по идее) на частоте меньшей, чем
положено :-/ Естественно возникает желание повысить частоту работы
GPU/памяти, тем более что ни в какие спецификации лазить не
приходится, всё уже готово. Итак, для этого нужно:
1. Исходники X'ов(Я правил в 4.3.0, но это не имеет значения, по
крайней мере, для 4.x.x)
2. gcc + make + other stuff ...
Собственно править нужно файл
xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dacG.c Привожу для
удобства нужный нам кусок(с выброшенными ненужными кусками).
static Bool
MGAGInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
{
/*
* initial values of the DAC registers
*/
const static unsigned char initDAC[] = {
/* 0x00: */ 0, 0, 0, 0, 0, 0, 0x00, 0,
...
MGA_NOT_HAL(
/* Allocate the DacRegs space if not done already */
if (pReg->DacRegs == NULL) {
pReg->DacRegs = xnfcalloc(DACREGSIZE, 1);
}
for (i = 0; i < DACREGSIZE; i++) {
pReg->DacRegs[i] = initDAC[i];
}
); /* MGA_NOT_HAL */
switch(pMga->Chipset)
{
case PCI_CHIP_MGAG100:
case PCI_CHIP_MGAG100_PCI:
pReg->DacRegs[ MGAGDAC_XVREFCTRL ] = 0x03;
if(pMga->HasSDRAM) {
if(pMga->OverclockMem) {
/* 220 Mhz */
pReg->DacRegs[ MGA1064_SYS_PLL_M ] = 0x06;
pReg->DacRegs[ MGA1064_SYS_PLL_N ] = 0x38;
pReg->DacRegs[ MGA1064_SYS_PLL_P ] = 0x18;
} else {
/* 203 Mhz */
pReg->DacRegs[ MGA1064_SYS_PLL_M ] = 0x01;
pReg->DacRegs[ MGA1064_SYS_PLL_N ] = 0x0E;
pReg->DacRegs[ MGA1064_SYS_PLL_P ] = 0x18;
}
pReg->Option = 0x404991a9;
} else {
if(pMga->OverclockMem) {
/* 143 Mhz */
pReg->DacRegs[ MGA1064_SYS_PLL_M ] = 0x06;
pReg->DacRegs[ MGA1064_SYS_PLL_N ] = 0x24;
pReg->DacRegs[ MGA1064_SYS_PLL_P ] = 0x10;
} else {
/* 124 Mhz */
pReg->DacRegs[ MGA1064_SYS_PLL_M ] = 0x04;
pReg->DacRegs[ MGA1064_SYS_PLL_N ] = 0x16;
pReg->DacRegs[ MGA1064_SYS_PLL_P ] = 0x08;
}
pReg->Option = 0x4049d121;
}
pReg->Option2 = 0x0000007;
break;
case PCI_CHIP_MGAG400:
case PCI_CHIP_MGAG550:
#ifdef USEMGAHAL
MGA_HAL(break;);
#endif
if (MGAISGx50(pMga))
break;
if(pMga->Dac.maxPixelClock == 360000) { /* G400 MAX */
if(pMga->OverclockMem) {
/* 150/200 */
pReg->DacRegs[ MGA1064_SYS_PLL_M ] = 0x05; // СМОТРЕТЬ, НАПРИМЕР, СЮДА!
pReg->DacRegs[ MGA1064_SYS_PLL_N ] = 0x42; // прим. автора
pReg->DacRegs[ MGA1064_SYS_PLL_P ] = 0x18; //
pReg->Option3 = 0x019B8419; //
pReg->Option = 0x50574120; //
} else {
/* 125/166 */
pReg->DacRegs[ MGA1064_SYS_PLL_M ] = 0x02;
pReg->DacRegs[ MGA1064_SYS_PLL_N ] = 0x1B;
pReg->DacRegs[ MGA1064_SYS_PLL_P ] = 0x18;
pReg->Option3 = 0x019B8419;
pReg->Option = 0x5053C120;
}
} else {
if(pMga->OverclockMem) {
/* 125/166 */
pReg->DacRegs[ MGA1064_SYS_PLL_M ] = 0x02;
pReg->DacRegs[ MGA1064_SYS_PLL_N ] = 0x1B;
pReg->DacRegs[ MGA1064_SYS_PLL_P ] = 0x18;
pReg->Option3 = 0x019B8419;
pReg->Option = 0x5053C120;
} else {
/* 110/166 */
pReg->DacRegs[ MGA1064_SYS_PLL_M ] = 0x13;
pReg->DacRegs[ MGA1064_SYS_PLL_N ] = 0x7A;
pReg->DacRegs[ MGA1064_SYS_PLL_P ] = 0x08;
pReg->Option3 = 0x0190a421;
pReg->Option = 0x50044120;
}
}
if(pMga->HasSDRAM)
pReg->Option &= ~(1 << 14);
pReg->Option2 = 0x01003000;
break;
case PCI_CHIP_MGAG200:
case PCI_CHIP_MGAG200_PCI:
default:
}
MGA_NOT_HAL(
/* must always have the pci retries on but rely on
polling to keep them from occuring */
pReg->Option &= ~0x20000000;
...
return(TRUE);
}
Таким образом, можно задать частоты работы G400 в режиме
`OverclockMem' равными, соответсвенно 150/200 MHz. Для этого копируем
соответствующий блок установок регистров из блока для G400 MAX. И все!
Кстати, обратите внимание на макрос MGA_HAL(...) (из mga_macros.h) он
исполняет код, переданный ему в скобках. Так что, если вы хотите чтобы
этот способ работал, либо вообще не грузите mga_hal_drv.o, либо
уберите этот код ТАМ ГДЕ НУЖНО. См. также MGAISGx50(...).
Для тех, кто не очень ориентируется во всём этом :-)
* Добываете исходники X'ов(лучше из любимого дистрибутива).
* Распаковываете в /usr/src (ну или куда там вам нужно).
* Ползёте в /...там где
нужно.../xc/programs/Xserver/hw/xfree86/drivers/mga
* Правите mga_dacG.c
* Переходите обратно в xc/ и запускаете 'make World' (править
никакие конфиги не надо)
* Для тех, у кого не 2.5+GHz/1Gb: Ждать окончания компиляции не
нужно, можно оборвать процесс когда начнётся, собственно,
компиляция.
* Снова идете в /...там где
нужно.../xc/programs/Xserver/hw/xfree86/drivers/mga, и если там
ещё ничего не скомпилировано, запускаете 'make'. Можно также
поправить Makefile на предмет '-fno-strength-reduce
-fещё-туева-хуча-всего' на '-fstrength-reduce
-fomit-frame-pointer'(ВЕЗДЕ!).
* Когда образуется файл 'mga_drv.o', скопируйте его в
'/usr/X11/lib/modules/drivers'.
Теперь можно править конфиг X-ов.
...
Section "Device"
Identifier "Matrox G400"
VendorName "Matrox"
Driver "mga"
Option "AGPMode" "4" # если вам это надо (и ПОДДЕРЖИВАЕТСЯ!)
Option "OverclockMem" "true" # за что боролись! (или как у вас там)
# + Ваши параметры
EndSection
...
Что касаемо benchmark'ов, то тут широкое поле для экспериментов...
Я юзал 'glxgears': (G400, 125/166->150/200) fps подросли на ~15-20%.
Да и QIII стал пошустрее Ж:-) ...
Шлыков Василий (AKA VaSh) <vash@id.ru>