Subversion Repositories Kolibri OS

Rev

Rev 5363 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                                 ;;
  3. ;; Copyright (C) KolibriOS team 2004-2015. All rights reserved.    ;;
  4. ;; Distributed under terms of the GNU General Public License       ;;
  5. ;;                                                                 ;;
  6. ;; simple AGP driver for KolibriOS                                 ;;
  7. ;;                                                                 ;;
  8. ;;    Written by hidnplayr@kolibrios.org                           ;;
  9. ;;                                                                 ;;
  10. ;;          GNU GENERAL PUBLIC LICENSE                             ;;
  11. ;;             Version 2, June 1991                                ;;
  12. ;;                                                                 ;;
  13. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  14.  
  15.  
  16. format PE DLL native
  17. entry START
  18.  
  19.         CURRENT_API             = 0x0200
  20.         COMPATIBLE_API          = 0x0100
  21.         API_VERSION             = (COMPATIBLE_API shl 16) + CURRENT_API
  22.  
  23.         FAST_WRITE              = 0     ; may cause problems with some motherboards
  24.  
  25. section '.flat' readable writable executable
  26.  
  27. include '../proc32.inc'
  28. include '../struct.inc'
  29. include '../macros.inc'
  30. include '../pci.inc'
  31.  
  32. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  33. ;;                        ;;
  34. ;; proc START             ;;
  35. ;;                        ;;
  36. ;; (standard driver proc) ;;
  37. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  38.  
  39. proc START c, reason:dword, cmdline:dword
  40.  
  41.         cmp     [reason], DRV_ENTRY
  42.         jne     .fail
  43.  
  44.         mov     esi, msgInit
  45.         invoke  SysMsgBoardStr
  46.         invoke  RegService, my_service, service_proc
  47.  
  48.         call    detect
  49.  
  50.         ret
  51.  
  52.   .fail:
  53.         xor     eax, eax
  54.         ret
  55.  
  56. endp
  57.  
  58. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  59. ;;                        ;;
  60. ;; proc SERVICE_PROC      ;;
  61. ;;                        ;;
  62. ;; (standard driver proc) ;;
  63. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  64.  
  65. proc service_proc stdcall, ioctl:dword
  66.  
  67.         mov     edx, [ioctl]
  68.         mov     eax, [edx + IOCTL.io_code]
  69.  
  70. ;------------------------------------------------------
  71.  
  72.         cmp     eax, 0 ;SRV_GETVERSION
  73.         jne     .fail
  74.  
  75.         cmp     [edx + IOCTL.out_size], 4
  76.         jb      .fail
  77.         mov     eax, [edx + IOCTL.output]
  78.         mov     [eax], dword API_VERSION
  79.  
  80.         xor     eax, eax
  81.         ret
  82.  
  83.   .fail:
  84.         or      eax, -1
  85.         ret
  86.  
  87. endp
  88.  
  89. align 4
  90. proc detect
  91.  
  92.         mov     esi, msgSearch
  93.         invoke  SysMsgBoardStr
  94.  
  95.         invoke  GetPCIList
  96.         mov     edx, eax
  97.  
  98.   .loop:
  99.         mov     ebx, [eax + PCIDEV.class]
  100.         cmp     bx, 0x0300      ; display controller - vga compatible controller
  101.         je      .found
  102.         cmp     bx, 0x0302      ; display controller - 3d controller
  103.         je      .found
  104.         cmp     bx, 0x0380      ; display controller - other display controller
  105.         je      .found
  106.  
  107.   .next:
  108.         mov     eax, [eax + PCIDEV.fd]
  109.         cmp     eax, edx
  110.         jne     .loop
  111.  
  112.         mov     esi, msgDone
  113.         invoke  SysMsgBoardStr
  114.  
  115.         or      eax, -1
  116.         ret
  117.  
  118.   .found:
  119.         push    eax edx
  120.         movzx   ebx, [eax + PCIDEV.bus]
  121.         mov     [bus], ebx
  122.         movzx   ebx, [eax + PCIDEV.devfn]
  123.         mov     [devfn], ebx
  124.         invoke  PciRead8, [bus], [devfn], PCI_header00.prog_if
  125.         test    al, 1 shl 4                             ; got capabilities list?
  126.         jnz     .got_capabilities_list
  127.  
  128.         ; TODO: Do it the old way: detect device and check with a list of known capabilities
  129.         ; stupid pre PCI 2.2 board....
  130.  
  131.         pop     edx eax
  132.         jmp     .next
  133.  
  134.   .got_capabilities_list:
  135.         invoke  PciRead8, [bus], [devfn], PCI_header00.cap_ptr
  136.         and     eax, 11111100b                          ; always dword aligned
  137.         mov     edi, eax
  138.  
  139.   .read_capability:
  140.         invoke  PciRead32, [bus], [devfn], edi          ; read capability
  141.         cmp     al, 0x02                                ; AGP
  142.         je      .got_agp
  143.         movzx   edi, ah                                 ; pointer to next capability
  144.         test    edi, edi
  145.         jnz     .read_capability
  146.         jmp     .next
  147.  
  148.   .got_agp:
  149.         shr     eax, 16
  150.         mov     [revision], al                          ; high nibble = major revision
  151.                                                         ; low nibble = minor revision
  152.         add     edi, 4
  153.         and     al, 0xf0
  154.         cmp     al, 0x30
  155.         je      .agp_3
  156.  
  157.   .agp_2:
  158.         mov     esi, msgAGP2
  159.         invoke  SysMsgBoardStr
  160.  
  161.         invoke  PciRead32, [bus], [devfn], edi          ; read AGP status
  162.   .agp_2_:
  163.         test    al, 100b
  164.         jnz     .100b
  165.         test    al, 10b
  166.         jnz     .010b
  167.         test    al, 1b
  168.  
  169.         pop     edx eax
  170.         jz      .next
  171.  
  172.   .001b:
  173.         mov     [cmd], 001b
  174.         mov     esi, msg1
  175.         invoke  SysMsgBoardStr
  176.         jmp     .agp_go
  177.  
  178.   .010b:
  179.         mov     [cmd], 010b
  180.         mov     esi, msg2
  181.         invoke  SysMsgBoardStr
  182.         jmp     .agp_go
  183.  
  184.   .100b:
  185.         mov     [cmd], 100b
  186.         mov     esi, msg4
  187.         invoke  SysMsgBoardStr
  188.         jmp     .agp_go
  189.  
  190.   .agp_2m:
  191.         mov     esi, msgAGP2m
  192.         invoke  SysMsgBoardStr
  193.         jmp     .agp_2_
  194.  
  195.   .agp_3:
  196.         mov     esi, msgAGP3
  197.         invoke  SysMsgBoardStr
  198.  
  199.         invoke  PciRead32, [bus], [devfn], edi          ; read AGP status
  200.         test    al, 1 shl 3
  201.         jz      .agp_2m
  202.  
  203.         test    eax, 10b
  204.         jnz     .8x
  205.         mov     [cmd], 01b
  206.         mov     esi, msg4
  207.         invoke  SysMsgBoardStr
  208.         jmp     .agp_go
  209.  
  210.   .8x:
  211.         mov     [cmd], 10b
  212.         mov     esi, msg8
  213.         invoke  SysMsgBoardStr
  214.  
  215.   .agp_go:
  216.  
  217. if FAST_WRITE
  218.         test    ax, 1 shl 4
  219.         jz      @f
  220.         or      [cmd], 1 shl 4
  221.         mov     esi, msgfast
  222.         invoke  SysMsgBoardStr
  223.   @@:
  224. end if
  225.  
  226.         test    ax, 1 shl 9     ; Side band addressing
  227.         jz      @f
  228.         or      [cmd], 1 shl 9
  229.         mov     esi, msgside
  230.         invoke  SysMsgBoardStr
  231.   @@:
  232.  
  233.         add     edi, 4
  234.         mov     eax, [cmd]
  235.         or      eax, 1 shl 8                            ; enable AGP
  236.         invoke  PciWrite32, [bus], [devfn], edi, eax    ; write AGP cmd
  237.  
  238.         mov     esi, msgOK
  239.         invoke  SysMsgBoardStr
  240.  
  241.         pop     edx eax
  242.         jmp     .next
  243.  
  244. endp
  245.  
  246.  
  247. ; End of code
  248.  
  249. data fixups
  250. end data
  251.  
  252. include '../peimport.inc'
  253.  
  254. my_service      db 'AGP', 0                             ; max 16 chars include zero
  255.  
  256. msgInit         db 'AGP driver loaded.', 13, 10, 0
  257. msgSearch       db 'Searching for AGP card...', 13, 10, 0
  258. msgDone         db 'Done', 13, 10, 0
  259. msgOK           db 'AGP device enabled', 13, 10, 0
  260. msgAGP2         db 'AGP2 device found', 13, 10, 0
  261. msgAGP3         db 'AGP3 device found', 13, 10, 0
  262. msgAGP2m        db 'Running in AGP2 mode', 13, 10, 0
  263. msg8            db '8x speed', 13, 10, 0
  264. msg4            db '4x speed', 13, 10, 0
  265. msg2            db '2x speed', 13, 10, 0
  266. msg1            db '1x speed', 13, 10, 0
  267. msgfast         db 'Fast Write', 13, 10, 0
  268. msgside         db 'Side band addressing', 13, 10, 0
  269.  
  270. ; uninitialized data
  271.  
  272. revision        db ?
  273. cmd             dd ?
  274. bus             dd ?
  275. devfn           dd ?
  276.  
  277.