Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                           ;;
  3. ;;  PCI32.INC                                                ;;
  4. ;;                                                           ;;
  5. ;;  32 bit PCI driver code                                   ;;
  6. ;;                                                           ;;
  7. ;;  Version 0.2  December 21st, 2002                         ;;
  8. ;;                                                           ;;
  9. ;;  Author: Victor Prodan, victorprodan@yahoo.com            ;;
  10. ;;    Credits:                                               ;;
  11. ;;          Ralf Brown                                       ;;
  12. ;;          Mike Hibbett, mikeh@oceanfree.net                ;;
  13. ;;                                                           ;;
  14. ;;  See file COPYING for details                             ;;
  15. ;;                                                           ;;
  16. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  17.  
  18.  
  19. ;***************************************************************************
  20. ;   Function
  21. ;      pci_api:
  22. ;
  23. ;   Description
  24. ;       entry point for system PCI calls
  25. ;***************************************************************************
  26.  
  27. align 4
  28.  
  29. pci_api:
  30.  
  31.         cmp  [pci_access_enabled],1
  32.         jne  no_pci_access_for_applications
  33.  
  34.         or al,al
  35.         jnz pci_fn_1
  36.         ; PCI function 0: get pci version (AH.AL)
  37.         movzx eax,word [0x2F0000+0x9022]
  38.         ret
  39.  
  40. pci_fn_1:
  41.         cmp al,1
  42.         jnz pci_fn_2
  43.  
  44.         ; PCI function 1: get last bus in AL
  45.         mov al,[0x2F0000+0x9021]
  46.         ret
  47.  
  48. pci_fn_2:
  49.         cmp al,2
  50.         jne pci_fn_3
  51.         ; PCI function 2: get pci access mechanism
  52.         mov al,[0x2F0000+0x9020]
  53.         ret
  54. pci_fn_3:
  55.  
  56.         cmp al,4
  57.         jz pci_read_reg   ;byte
  58.         cmp al,5
  59.         jz pci_read_reg   ;word
  60.         cmp al,6
  61.         jz pci_read_reg   ;dword
  62.  
  63.         cmp al,8
  64.         jz pci_write_reg  ;byte
  65.         cmp al,9
  66.         jz pci_write_reg  ;word
  67.         cmp al,10
  68.         jz pci_write_reg  ;dword
  69.  
  70.       no_pci_access_for_applications:
  71.  
  72.         mov eax,-1
  73.  
  74.         ret
  75.  
  76. ;***************************************************************************
  77. ;   Function
  78. ;      pci_make_config_cmd
  79. ;
  80. ;   Description
  81. ;       creates a command dword  for use with the PCI bus
  82. ;       bus # in ah
  83. ;       device+func in bh (dddddfff)
  84. ;       register in bl
  85. ;
  86. ;      command dword returned in eax ( 10000000 bbbbbbbb dddddfff rrrrrr00 )
  87. ;***************************************************************************
  88.  
  89. align 4
  90.  
  91. pci_make_config_cmd:
  92.     shl     eax,8          ; move bus to bits 16-23
  93.     mov     ax,bx          ; combine all
  94.     and     eax,0xffffff
  95.     or      eax,0x80000000
  96.     ret
  97.  
  98. ;***************************************************************************
  99. ;   Function
  100. ;      pci_read_reg:
  101. ;
  102. ;   Description
  103. ;       read a register from the PCI config space into EAX/AX/AL
  104. ;       IN: ah=bus,device+func=bh,register address=bl
  105. ;           number of bytes to read (1,2,4) coded into AL, bits 0-1
  106. ;***************************************************************************
  107.  
  108. align 4
  109.  
  110. pci_read_reg:
  111.         cmp     byte [0x2F0000+0x9020],2 ;what mechanism will we use?
  112.         je      pci_read_reg_2
  113.  
  114.                 ; mechanism 1
  115.         push    esi   ; save register size into ESI
  116.         mov     esi,eax
  117.         and     esi,3
  118.  
  119.         call    pci_make_config_cmd
  120.         mov     ebx,eax
  121.                 ; get current state
  122.         mov     dx,0xcf8
  123.         in      eax, dx
  124.         push    eax
  125.                 ; set up addressing to config data
  126.         mov     eax,ebx
  127.         and     al,0xfc ; make address dword-aligned
  128.         out     dx,eax
  129.                 ; get requested DWORD of config data
  130.         mov     dl,0xfc
  131.         and     bl,3
  132.         or      dl,bl    ; add to port address first 2 bits of register address
  133.  
  134.         or      esi,esi
  135.         jz      pci_read_byte1
  136.         cmp     esi,1
  137.         jz      pci_read_word1
  138.         cmp     esi,2
  139.         jz      pci_read_dword1
  140.         jmp     pci_fin_read1
  141.  
  142. pci_read_byte1:
  143.         in      al,dx
  144.         jmp pci_fin_read1
  145. pci_read_word1:
  146.         in      ax,dx
  147.         jmp pci_fin_read1
  148. pci_read_dword1:
  149.         in      eax,dx
  150.         jmp     pci_fin_read1
  151. pci_fin_read1:
  152.                 ; restore configuration control
  153.         xchg    eax,[esp]
  154.         mov     dx,0xcf8
  155.         out     dx,eax
  156.  
  157.         pop     eax
  158.         pop     esi
  159.         ret
  160. pci_read_reg_2:
  161.  
  162.         test    bh,128  ;mech#2 only supports 16 devices per bus
  163.         jnz     pci_read_reg_err
  164.  
  165.         push esi   ; save register size into ESI
  166.         mov esi,eax
  167.         and esi,3
  168.  
  169.         push    eax
  170.                 ;store current state of config space
  171.         mov     dx,0xcf8
  172.         in      al,dx
  173.         mov     ah,al
  174.         mov     dl,0xfa
  175.         in      al,dx
  176.  
  177.         xchg    eax,[esp]
  178.                 ; out 0xcfa,bus
  179.         mov     al,ah
  180.         out     dx,al
  181.                 ; out 0xcf8,0x80
  182.         mov     dl,0xf8
  183.         mov     al,0x80
  184.         out     dx,al
  185.                 ; compute addr
  186.         shr     bh,3 ; func is ignored in mechanism 2
  187.         or      bh,0xc0
  188.         mov     dx,bx
  189.  
  190.         or      esi,esi
  191.         jz      pci_read_byte2
  192.         cmp     esi,1
  193.         jz      pci_read_word2
  194.         cmp     esi,2
  195.         jz      pci_read_dword2
  196.         jmp     pci_fin_read2
  197.  
  198. pci_read_byte2:
  199.         in      al,dx
  200.         jmp pci_fin_read2
  201. pci_read_word2:
  202.         in      ax,dx
  203.         jmp pci_fin_read2
  204. pci_read_dword2:
  205.         in      eax,dx
  206. ;       jmp pci_fin_read2
  207. pci_fin_read2:
  208.  
  209.                 ; restore configuration space
  210.         xchg    eax,[esp]
  211.         mov     dx,0xcfa
  212.         out     dx,al
  213.         mov     dl,0xf8
  214.         mov     al,ah
  215.         out     dx,al
  216.  
  217.         pop     eax
  218.         pop     esi
  219.         ret
  220.  
  221. pci_read_reg_err:
  222.         xor     eax,eax
  223.         dec     eax
  224.         ret
  225.  
  226.  
  227. ;***************************************************************************
  228. ;   Function
  229. ;      pci_write_reg:
  230. ;
  231. ;   Description
  232. ;       write a register from ECX/CX/CL into the PCI config space
  233. ;       IN: ah=bus,device+func=bh,register address (dword aligned)=bl,
  234. ;           value to write in ecx
  235. ;           number of bytes to write (1,2,4) coded into AL, bits 0-1
  236. ;***************************************************************************
  237.  
  238. align 4
  239.  
  240. pci_write_reg:
  241.         cmp byte [0x2F0000+0x9020],2 ;what mechanism will we use?
  242.         je pci_write_reg_2
  243.  
  244.                 ; mechanism 1
  245.         push    esi   ; save register size into ESI
  246.         mov     esi,eax
  247.         and     esi,3
  248.  
  249.         call    pci_make_config_cmd
  250.         mov     ebx,eax
  251.                 ; get current state into ecx
  252.         mov     dx,0xcf8
  253.         in      eax, dx
  254.         push    eax
  255.                 ; set up addressing to config data
  256.         mov     eax,ebx
  257.         and     al,0xfc ; make address dword-aligned
  258.         out     dx,eax
  259.                 ; write DWORD of config data
  260.         mov     dl,0xfc
  261.         and     bl,3
  262.         or      dl,bl
  263.         mov     eax,ecx
  264.  
  265.         or      esi,esi
  266.         jz      pci_write_byte1
  267.         cmp     esi,1
  268.         jz      pci_write_word1
  269.         cmp     esi,2
  270.         jz      pci_write_dword1
  271.         jmp     pci_fin_write1
  272.  
  273. pci_write_byte1:
  274.         out     dx,al
  275.         jmp pci_fin_write1
  276. pci_write_word1:
  277.         out     dx,ax
  278.         jmp pci_fin_write1
  279. pci_write_dword1:
  280.         out     dx,eax
  281.         jmp     pci_fin_write1
  282. pci_fin_write1:
  283.  
  284.                 ; restore configuration control
  285.         pop     eax
  286.         mov     dl,0xf8
  287.         out     dx,eax
  288.  
  289.         xor     eax,eax
  290.         pop     esi
  291.  
  292.         ret
  293. pci_write_reg_2:
  294.  
  295.         test    bh,128  ;mech#2 only supports 16 devices per bus
  296.         jnz     pci_write_reg_err
  297.  
  298.  
  299.         push esi   ; save register size into ESI
  300.         mov esi,eax
  301.         and esi,3
  302.  
  303.         push    eax
  304.                 ;store current state of config space
  305.         mov     dx,0xcf8
  306.         in      al,dx
  307.         mov     ah,al
  308.         mov     dl,0xfa
  309.         in      al,dx
  310.         xchg    eax,[esp]
  311.                 ; out 0xcfa,bus
  312.         mov     al,ah
  313.         out     dx,al
  314.                 ; out 0xcf8,0x80
  315.         mov     dl,0xf8
  316.         mov     al,0x80
  317.         out     dx,al
  318.                 ; compute addr
  319.         shr     bh,3 ; func is ignored in mechanism 2
  320.         or      bh,0xc0
  321.         mov     dx,bx
  322.                 ; write register
  323.         mov     eax,ecx
  324.  
  325.         or      esi,esi
  326.         jz      pci_write_byte2
  327.         cmp     esi,1
  328.         jz      pci_write_word2
  329.         cmp     esi,2
  330.         jz      pci_write_dword2
  331.         jmp     pci_fin_write2
  332.  
  333. pci_write_byte2:
  334.         out     dx,al
  335.         jmp pci_fin_write2
  336. pci_write_word2:
  337.         out     dx,ax
  338.         jmp pci_fin_write2
  339. pci_write_dword2:
  340.         out     dx,eax
  341.         jmp     pci_fin_write2
  342. pci_fin_write2:
  343.                 ; restore configuration space
  344.         pop     eax
  345.         mov     dx,0xcfa
  346.         out     dx,al
  347.         mov     dl,0xf8
  348.         mov     al,ah
  349.         out     dx,al
  350.  
  351.         xor     eax,eax
  352.         pop     esi
  353.         ret
  354.  
  355. pci_write_reg_err:
  356.         xor     eax,eax
  357.         dec     eax
  358.         ret
  359.