Автор Тема: ATI Radeon HD 6310  (Прочитано 7387 раз)

Оффлайн keremet

  • Global Moderator
  • ROOT
  • *****
  • Сообщений: 463
  • Репутация: +237/-0
    • Просмотр профиля
    • OpenSolaris
ATI Radeon HD 6310
« : Декабрь 14, 2014, 08:10:05 pm »
Требуется установить разрешение экрана 1366x768 вместо устанавливаемого по умолчанию 1024x768
Похоже, что любая видеокарта позволяет выставить любое разрешение
http://frolov-lib.ru/books/bsp/v21/ch4_8.htm
http://pcabc.ru/to/to23.html
https://ru.wikipedia.org/wiki/WXGA

http://src.illumos.org/source/xref/illumos-gate/usr/src/uts/common/io/vgasubr.c
http://src.illumos.org/source/xref/illumos-gate/usr/src/uts/intel/io/vgatext/vgatext.c



После сообщения "Searching for matching VESA mode(s):" вызывается в драйвере Xorg vesa
функция VBEGetModePool


http://www.macbreaker.com/2012/06/how-to-set-your-hackintosh-bootscreen.html

Как задать требуемую ширину экрана:
http://freespace.virgin.net/hugo.elias/graphics/x_vapp05.htm

В vesa:
/* Set a graphics mode */
static Bool
VESASetMode(ScrnInfoPtr pScrn, DisplayModePtr pMode){
....
    if (data->data->XResolution != pScrn->displayWidth)
   VBESetLogicalScanline(pVesa->pVbe, pScrn->displayWidth);

}


keremet@openindiana:~$ cvt 1366 768
# 1368x768 59.88 Hz (CVT) hsync: 47.79 kHz; pclk: 85.25 MHz
Modeline "1368x768_60.00"   85.25  1368 1440 1576 1784  768 771 781 798 -hsync +vsync

Последняя команда завершилась ошибкой "xrandr: Configure crtc 0 failed"
xrandr --newmode "1368x768_60.00"   85.25  1368 1440 1576 1784  768 771 781 798 -hsync +vsync
xrandr --addmode default 1368x768_60.00
xrandr --output default --mode 1368x768_60.00

http://myit-solutions.blogspot.ru/2010/09/how-to-add-and-set-custom-display.html



Драйвер vgatext отвечает исключительно за текстовый режим. Графический режим по всей видимости устанавливается в xorg.
  0  -> vgatext_ioctl                         
  0    -> do_gfx_ioctl                       
  0      -> vgatext_kdsetmode                 
  0        -> vgatext_kdsetgraphics           
  0          -> vgatext_progressbar_stop     
  0          <- vgatext_progressbar_stop     
  0          -> vgatext_save_text             
  0          <- vgatext_save_text             
  0        <- vgatext_kdsetgraphics           
  0      <- vgatext_kdsetmode                 
  0    <- do_gfx_ioctl                       
  0  <- vgatext_ioctl                         
  0  -> vgatext_open                         
  0  <- vgatext_open                         
  0  -> vgatext_ioctl                         
  0    -> do_gfx_ioctl                       
  0    <- do_gfx_ioctl                       
  0  <- vgatext_ioctl

Из пользовательного режима запускаю
   movw   $0x03D4, %dx
   movb   $4, %al
   outb   (%dx) //Тут  коредамп


Проверить: в VBEGetModePool (вызывается в vesa_drv) ищутся только стандартные или еще и нестандартные режимы (см. Зубков с 158)
xorg-server-1.7.7$ ggrep -Rn --color VBEGetModePool ./
./hw/xfree86/vbe/vbeModes.h:72:extern _X_EXPORT DisplayModePtr VBEGetModePool(ScrnInfoPtr pScrn, vbeInfoPtr pVbe,
./hw/xfree86/vbe/vbeModes.c:273:VBEGetModePool(ScrnInfoPtr pScrn, vbeInfoPtr pVbe, VbeInfoBlock *vbe,


#!/usr/sbin/dtrace -s
#pragma D option flowindent
pid$target:::entry,
pid$target:::return
/probemod=="libvbe.so"/
{
}

./X.sh -c X

CPU FUNCTION                                 
  0  -> vbeSetup                             
  0  <- vbeSetup                             
  0  -> VBEExtendedInit                       
  0  <- VBEExtendedInit                       
  0  -> VBEGetVBEInfo                         
  0  <- VBEGetVBEInfo                         
  0  -> VBEFindSupportedDepths               
  0    -> GetDepthFlag                       
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- GetDepthFlag                       
....                   
  1    -> GetDepthFlag                       
  1      -> VBEGetModeInfo                   
  1      <- VBEGetModeInfo                   
  1      -> VBEFreeModeInfo                   
  1      <- VBEFreeModeInfo                   
  1    <- GetDepthFlag                       
  1  <- VBEFindSupportedDepths               
  1  -> vbeDoEDID                             
  1    -> vbeReadEDID                         
  0    <- vbeReadEDID                         
  0  <- vbeDoEDID                             
  0  -> VBEGetModePool                       
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  1      <- VBEGetModeInfo                   
  1      -> VBEFreeModeInfo                   
  1      <- VBEFreeModeInfo                   
  1    <- CheckMode                           
  1    -> CheckMode                           
  1      -> VBEGetModeInfo                   
  1      <- VBEGetModeInfo                   
  1      -> VBEFreeModeInfo                   
  1      <- VBEFreeModeInfo                   
  1    <- CheckMode                           
....
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  1      <- VBEGetModeInfo                   
  1    <- CheckMode                           
  1    -> CheckMode                           
  1      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
......                       
  0    -> CheckMode                           
  0      -> VBEGetModeInfo                   
  0      <- VBEGetModeInfo                   
  0      -> VBEFreeModeInfo                   
  0      <- VBEFreeModeInfo                   
  0    <- CheckMode                           
  0  <- VBEGetModePool                       
  0  -> VBESetModeNames                       
  0  <- VBESetModeNames                       
  0  -> VBEValidateModes                     
  0  <- VBEValidateModes                     
  0  -> VBEValidateModes                     
  0  <- VBEValidateModes                     
  0  -> VBEPrintModes                         
  0  <- VBEPrintModes                         
  0  -> VBESetModeParameters                 
  0  <- VBESetModeParameters                 
  0  -> vbeFree                               
  0  <- vbeFree                               
  0  -> VBEExtendedInit                       
  0  <- VBEExtendedInit                       
  0  -> VBEGetVBEMode                         
  1  <- VBEGetVBEMode                         
  1  -> VBESaveRestore                       
  0  <- VBESaveRestore                       
  0  -> VBESaveRestore                       
  0  <- VBESaveRestore                       
  0  -> VBESetGetPaletteData                 
  0  <- VBESetGetPaletteData                 
  0  -> VBESetVBEMode                         
  1  <- VBESetVBEMode                         
  1  -> VBESetDisplayStart                   
  1  <- VBESetDisplayStart                   



В VbeInfoBlock * VBEGetVBEInfo(vbeInfoPtr pVbe) происходит обращение к биос за списком режимов, в предыдущей функции этот список просто используется. Посмотрим в отладчике, выдается ли список нестандартных режимов.

root@openindiana:/home/keremet# mdb /usr/bin/Xorg
Loading modules: [ Xorg ]
> :c
mdb: execve detected: (f)ollow new program or (s)top? f
mdb: lost control of PID 1972 due to exec of 64-bit executable
mdb: restarting debugger to follow PID 1972 ...
mdb: target performed exec of /usr/bin/amd64/Xorg
Loading modules: [ Xorg ld.so.1 ]
> ::bp libvbe.so`VBEGetVBEInfo
> :c

X.Org X Server 1.7.7
Release Date: 2010-05-04
X Protocol Version 11, Revision 0
Build Operating System: SunOS 5.11 i86pc
Current Operating System: SunOS openindiana 5.11 oi_151a8 i86pc
Build Date: 18 February 2013  09:58:49PM
Solaris ABI: 64-bit
Current version of pixman: 0.18.4
        Before reporting problems, check http://openindiana.org/consolidation/xnv
        to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
        (++) from command line, (!!) notice, (II) informational,
        (WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(==) Log file: "/var/log/Xorg.0.log", Time: Wed Dec 31 18:13:22 2014
(==) Using default built-in configuration (30 lines)
(EE) Failed to load module "xtsol" (module does not exist, 0)
(EE) Failed to load module "fbdev" (module does not exist, 0)
(II) [KMS] drm report modesetting isn't supported.
mdb: stop at libvbe.so`VBEGetVBEInfo
mdb: target stopped at:
libvbe.so`VBEGetVBEInfo:pushq  %rbp
mdb: You've got symbols!
Loading modules: [ libc.so.1 ]
> :e
...
> :e
mdb: target stopped at:
libvbe.so`VBEGetVBEInfo+0x129:  call   -0xae6   <PLT:strdup>
> ::regs
%rax = 0x00000000006d6dd0
...
> 0x00000000006d6dd0 ::dump
         \/ 1 2 3  4 5 6 7  8 9 a b  c d e f  v123456789abcdef
6d6dd0:  414d4420 41544f4d 42494f53 00000000  AMD ATOMBIOS....


> :e
mdb: target stopped at:
libvbe.so`VBEGetVBEInfo+0x18b:  call   -0xc08   <PLT=libint10.so`xf86int10Addr>

Функция возвращает 0x00000000006f8684. Смотрим что по этому адресу:

> 0x00000000006f8684 ::dump -g 2 -w 2
          0 1  2 3 \/ 5  6 7  8 9  a b  c d  e f  0 1  2 3  4 5  6 7  8 9  a b  c d  e f  0123v56789abcdef0123456789abcdef
6f8680:  0000 0000 0001 0101 0301 0501 0701 1001 1101 1301 1401 1601 1701 1901 1a01 0d01  ................................
> 0x00000000006f8684 ::dump -g 2 -w 2 -r
    0 1  2 3  4 5  6 7  8 9  a b  c d  e f  0 1  2 3  4 5  6 7  8 9  a b  c d  e f  0123456789abcdef0123456789abcdef
0:  0001 0101 0301 0501 0701 1001 1101 1301 1401 1601 1701 1901 1a01 0d01 0e01 2001  .............................. .
> 0x00000000006f8684 ::dump -g 2  -r
    0 1  2 3  4 5  6 7  8 9  a b  c d  e f  0123456789abcdef
0:  0001 0101 0301 0501 0701 1001 1101 1301  ................
> 0x00000000006f86ee ::dump -g 2  -r
    0 1  2 3  4 5  6 7  8 9  a b  c d  e f  0123456789abcdef
0:  ffff 0000 0000 0000 0000 0000 0000 0000  ................
> 0x00000000006f86e0 ::dump -g 2  -r
    0 1  2 3  4 5  6 7  8 9  a b  c d  e f  0123456789abcdef
0:  8601 d301 d501 d601 e301 e501 e601 ffff  ................


Действительно номера режимов - сравним с
grep "Mode:" Xorg.0.log

После ffff идут нули - значит номера нестандарных режимов не передаются сюда

vesa.c:
static void
VESASetModeParameters(vbeInfoPtr pVbe, DisplayModePtr vbemode,
            DisplayModePtr ddcmode)
Тут заполняется структура VbeCRTCInfoBlock, которую можно передавать в функцию установки режима. Через mdb выявлено, что сейчас структура не передается.
http://www.arachnoid.com/modelines/

Оффлайн keremet

  • Global Moderator
  • ROOT
  • *****
  • Сообщений: 463
  • Репутация: +237/-0
    • Просмотр профиля
    • OpenSolaris
Re: ATI Radeon HD 6310
« Ответ #1 : Январь 06, 2015, 03:52:51 pm »
scanpci
pci bus 0x0000 cardnum 0x01 function 0x00: vendor 0x1002 device 0x9802
 Advanced Micro Devices, Inc. [AMD/ATI] Wrestler [Radeon HD 6310]


Прописал в /etc/X11/xorg.conf драйвер ati.
В /usr/lib/xorg/modules/drivers/amd64/ati_drv.so определяется, какой драйвер соответствует видеокарте. В нашем случае radeon_drv.so

Вызовы функций в radeon_drv.so
  1  -> RADEONSetup                           
  1  <- RADEONSetup                           
  1  -> RADEONIdentify                       
  1  <- RADEONIdentify                       
  1  -> RADEONDriverFunc                     
  1  <- RADEONDriverFunc                     
  1  -> RADEONDriverFunc                     
  1  <- RADEONDriverFunc                     
  1  -> radeon_pci_probe                     
  1  <- radeon_pci_probe

Выполнение прерывается на этой функции (radeon_probe.c)
static Bool radeon_kernel_mode_enabled(ScrnInfoPtr pScrn, struct pci_device *pci_dev)
{
    char *busIdString;
    int ret;

    if (!xf86LoaderCheckSymbol("DRICreatePCIBusID")) {
      xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0,
         "[KMS] No DRICreatePCIBusID symbol, no kernel modesetting.\n");
   return FALSE;
    }

    busIdString = DRICreatePCIBusID(pci_dev);//"pci:0000:00:01.0"
    ret = drmCheckModesettingSupported(busIdString); //%rax = 0x00000000ffffffa7
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
    if (ret) {
      if (xf86LoadKernelModule("radeonkms"))   //Может быть портировать этот модуль?
        ret = drmCheckModesettingSupported(busIdString);
    }
#endif
    free(busIdString);
    if (ret) {
      xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0,
         "[KMS] drm report modesetting isn't supported.\n"); //Это сообщение выводится
   return FALSE;   //Выход тут
    }

    xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0,
         "[KMS] Kernel modesetting enabled.\n");
    return TRUE;
}

Пропытка обмануть драйвер, что KMS есть.


root@openindiana:/home/keremet# mdb /usr/bin/amd64/Xorg
Loading modules: [ Xorg ]
> ::bp radeon_drv.so`radeon_pci_probe
> :c

X.Org X Server 1.7.7
Release Date: 2010-05-04
X Protocol Version 11, Revision 0
Build Operating System: SunOS 5.11 i86pc
Current Operating System: SunOS openindiana 5.11 oi_151a8 i86pc
Build Date: 18 February 2013  09:58:49PM
Solaris ABI: 64-bit
Current version of pixman: 0.18.4
        Before reporting problems, check http://openindiana.org/consolidation/xnv
        to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
        (++) from command line, (!!) notice, (II) informational,
        (WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(==) Log file: "/var/log/Xorg.0.log", Time: Tue Jan  6 13:44:28 2015
(==) Using config file: "/etc/X11/xorg.conf"
(EE) Failed to load module "xtsol" (module does not exist, 0)
mdb: stop at radeon_drv.so`radeon_pci_probe
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe: pushq  %rbp
mdb: You've got symbols!
Loading modules: [ ld.so.1 libc.so.1 ]
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+1:       leaq   +0x570b8(%rip),%rcx      <radeon_drv.so`RADEONPciChipsets>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+8:       xorl   %r9d,%r9d
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xb:     xorl   %r8d,%r8d
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xe:     xorl   %edi,%edi
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x10:    movq   %rsp,%rbp
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x13:    movq   %rbx,-0x20(%rbp)
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x17:    movq   %r13,-0x10(%rbp)
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x1b:    movq   %rdx,%rbx
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x1e:    movq   %r14,-0x8(%rbp)
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x22:    movq   %r12,-0x18(%rbp)
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x26:    subq   $0x40,%rsp
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x2a:    movl   %esi,%edx
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x2c:    movl   %esi,%r14d
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x2f:    movq   $0x0,0x10(%rsp)
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x38:    xorl   %esi,%esi
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x3a:    movq   $0x0,0x8(%rsp)
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x43:    movq   $0x0,(%rsp)
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x4b:    call   -0x4958  <PLT:xf86ConfigPciEntity>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x50:    movq   %rax,%r13
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x53:    xorl   %eax,%eax
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x55:    testq  %r13,%r13
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x58:    je     +0x32    <radeon_drv.so`radeon_pci_probe+0x8c>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x5a:    testq  %rbx,%rbx
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x5d:    je     +0x96    <radeon_drv.so`radeon_pci_probe+0xf9>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x63:    leaq   +0x45c9d(%rip),%rdi      <0xfffffd7ffe88c4e7>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x6a:    call   -0x4967  <PLT:xf86LoaderCheckSymbol>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x6f:    testl  %eax,%eax
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x71:    jne    +0x2d    <radeon_drv.so`radeon_pci_probe+0xa0>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xa0:    movq   %rbx,%rdi
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xa3:    call   -0x4980  <PLT:DRICreatePCIBusID>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xa8:    movq   %rax,%rbx
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xab:    movq   %rax,%rdi
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xae:    call   -0x497b  <PLT:drmCheckModesettingSupported>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xb3:    movq   %rbx,%rdi
> ::regs
%rax = 0x00000000ffffffa7       %r8  = 0x000000007fffffff
%rbx = 0x00000000006e4130       %r9  = 0x0000000000000030
%rcx = 0x00000000006e4140       %r10 = 0x00000000000005c8
%rdx = 0xfffffd7fffdfeb95       %r11 = 0x0000000000000258
%rsi = 0xfffffd7fffdfeb94       %r12 = 0x0000000000000000
%rdi = 0x00000000006e4130       %r13 = 0x00000000006cfe50
                                %r14 = 0x0000000000000000
                                %r15 = 0x0000000000009802

%cs = 0x0053    %fs = 0x0000    %gs = 0x0000
%ds = 0x0000    %es = 0x0000    %ss = 0x004b

%rip = 0xfffffd7ffe846893 radeon_drv.so`radeon_pci_probe+0xb3
%rbp = 0xfffffd7fffdffa00
%rsp = 0xfffffd7fffdff9c0

%rflags = 0x00000292
  id=0 vip=0 vif=0 ac=0 vm=0 rf=0 nt=0 iopl=0x0
  status=<of,df,IF,tf,SF,zf,AF,pf,cf>

%gsbase = 0x0000000000000000
%fsbase = 0xfffffd7fff162a40
%trapno = 0x3
   %err = 0x0
> 0>rax
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xb6:    movl   %eax,%r12d
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xb9:    call   -0x4a16  <PLT:free>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xbe:    testl  %r12d,%r12d
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xc1:    je     +0x1d    <radeon_drv.so`radeon_pci_probe+0xe0>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xe0:    movl   0x18(%r13),%edi
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xe4:    leaq   +0x43e15(%rip),%rcx      <0xfffffd7ffe88a6e0>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xeb:    xorl   %edx,%edx
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xed:    movl   $0x7,%esi
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xf2:    xorl   %eax,%eax
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xf4:    call   -0x49e1  <PLT:xf86DrvMsgVerb>
> ::step over
(II) [KMS] Kernel modesetting enabled.
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xf9:    movq   +0x564e0(%rip),%r10      <0xfffffd7ffe89cdc0>
> :c
(EE) RADEON(0): [drm] Failed to open DRM device for pci:0000:00:01.0: No such device or address
(EE) RADEON(0): Kernel modesetting setup failed
(EE) Screen(s) found, but none have a usable configuration.

Fatal server error:
no screens found

Please consult the OpenIndiana, based on X.Org Foundation & OpenSolaris sources support
         at http://openindiana.org/consolidation/xnv
 for help.
Please also check the log file at "/var/log/Xorg.0.log" for additional information.

mdb: target has terminated
>



Оффлайн keremet

  • Global Moderator
  • ROOT
  • *****
  • Сообщений: 463
  • Репутация: +237/-0
    • Просмотр профиля
    • OpenSolaris
Re: ATI Radeon HD 6310
« Ответ #3 : Январь 06, 2015, 10:34:53 pm »
keremet@openindiana:~/compilation/libdrm-2.4.58$ vi xf86drmMode.c
в функции drmCheckModesettingSupported
-#elif defined(__DragonFly__)
+#elif (defined(__sun) && defined(__SVR4)) || defined(__DragonFly__)
        return 0;
#endif

root@openindiana:~# Xorg
....
(II) [KMS] Kernel modesetting enabled.

keremet@openindiana:~/compilation$ tar xf xserver-xorg-video-modesetting_0.9.0.orig.tar.gz
keremet@openindiana:~/compilation$ cd xf86-video-modesetting-0.9.0/
keremet@openindiana:~/compilation/xf86-video-modesetting-0.9.0$ PKG_CONFIG_PATH=/home/keremet/compilation/ati_bin/lib/pkgconfig/ CFLAGS="-m64" ./configure --prefix=/home/keremet/compilation/ati_bin/
make
make install
root@openindiana:~# cp /home/keremet/compilation/ati_bin/lib/xorg/modules/drivers/modesetting_drv.so /usr/lib/xorg/modules/drivers/amd64
root@openindiana:~# vi /etc/X11/xorg.conf

Section "Device"
        ### Available Driver options are:-
        ### Values: <i>: integer, <f>: float, <bool>: "True"/"False",
        ### <string>: "String", <freq>: "<f> Hz/kHz/MHz"
        ### [arg]: arg optional
        #Option     "ShadowFB"                  # [<bool>]
        #Option     "DefaultRefresh"            # [<bool>]
        #Option     "ModeSetClearScreen"        # [<bool>]
        Identifier  "Card0"
        Driver      "modesetting"
        VendorName  "Advanced Micro Devices, Inc. [AMD/ATI]"
        BoardName   "Wrestler [Radeon HD 6310]"
        BusID       "PCI:0:1:0"
EndSection

Трассировка modesetting_drv.so

CPU FUNCTION                                 
  0  -> Setup                                 
  0  <- Setup                                 
  0  -> Identify                             
  0  <- Identify                             
  0  -> ms_driver_func                       
  0  <- ms_driver_func                       
  0  -> ms_driver_func                       
  0  <- ms_driver_func                       
  0  -> ms_pci_probe                         
  0    -> probe_hw_pci                       
  0      -> open_hw                           
  0      <- open_hw                           
  0    <- probe_hw_pci                       
  0  <- ms_pci_probe                         
  0  -> Probe                                 
  0  <- Probe

open_hw нормально открывает /dev/dri/card0 (сейчас подгружен измененный модуль radeon, в список поддерживаемых  устройств которого добавлена моя видеокарта)
         display, instance #0 (driver name: radeon)
....
           Device Minor Nodes:
                dev=(290,0)
                    dev_path=/pci@0,0/display@1:gfx0
                        spectype=chr type=minor
                        dev_link=/dev/fbs/gfx0
                        dev_link=/dev/fb2
                        dev_link=/dev/vt00
                        dev_link=/dev/fb
                    Minor properties:
                        name='ddi-kernel-ioctl' type=boolean dev=(290,0)
                dev=(290,2)
                    dev_path=/pci@0,0/display@1:drm0
                        spectype=chr type=minor
                        dev_link=/dev/dri/card0

Падает тут:
    if (drmSetInterfaceVersion(fd, &sv)) {
        close(fd);
        return FALSE;
    }

Скриптом
$ cat radeon.d
#!/usr/sbin/dtrace -s
#pragma D option flowindent
fbt:drm::entry,
fbt:drm::return,
fbt:radeon::entry,
fbt:radeon::return
{
}

выявлено, что падает потому что drmSetInterfaceVersion запрашивает версию 1.4, а ядро отвечает отказом, потому что поддерживает только 1.2 (функция в ядре drm_setversion)

Версия 1.4 доступна в исходниках FreeBSD http://src.illumos.org/source/xref/freebsd-head/sys/dev/drm2/drm_core.h#34
Попробуем запросить версию 1.2 и определить, чего не хватает.
keremet@openindiana:~/compilation/xf86-video-modesetting-0.9.0$ vi src/driver.c

static Bool probe_hw_pci(const char *dev, struct pci_device *pdev)
{
    int ret = FALSE, fd = open_hw(dev);
    char *id, *devid;
    drmSetVersion sv;

    if (fd == -1)
   return FALSE;

    sv.drm_di_major = 1;
-    sv.drm_di_minor = 4;
+    sv.drm_di_minor = 2;


CPU FUNCTION                                 
  1  -> Setup                                 
  1  <- Setup                                 
  1  -> Identify                             
  1  <- Identify                             
  1  -> ms_driver_func                       
  1  <- ms_driver_func                       
  1  -> ms_driver_func                       
  1  <- ms_driver_func                       
  1  -> ms_pci_probe                         
  1    -> probe_hw_pci                       
  1      -> open_hw                           
  1      <- open_hw                           
  1      -> ms_DRICreatePCIBusID             
  1      <- ms_DRICreatePCIBusID             
  1      -> check_outputs                     
  1      <- check_outputs                     
  0    <- probe_hw_pci                       
  0  <- ms_pci_probe                         
  0  -> Probe                                 
  0  <- Probe                 


Оказалось, что в модуле drm не реализован DRM_IOCTL_MODE_GETRESOURCES и выполнение останавливается на check_outputs. Во FreeBSD DRM_IOCTL_MODE_GETRESOURCES реализован. Надо перенести.