Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. $Revision: 1598 $
  2.  
  3. SMBUS_PCIE_ADDR         equ     0xF00A0000      ; bdf0:20.0  = SB7xx SMBus PCI Config Registers
  4. LPC_PCIE_ADDR           equ     0xF00A3000      ; bdf0:20.3  = SB7xx LPC ISA bridge Config Registers
  5.  
  6. SB_SIO_INDEX    equ     0x2E
  7. SB_PM_INDEX     equ     0xCD6
  8.  
  9. if PLATFORM>PLATFORM_RS780
  10. include "bus/sb/hudson.inc"
  11. else
  12. include "bus/sb/sb710.inc"
  13. end if
  14.  
  15. ;---------------------------------------------------------------------
  16. align 4
  17. smbus_read_pciconfig:
  18. ; in:  dl = reg#  |  out: eax = data
  19.         mov     ebx, SMBUS_PCIE_ADDR
  20.         and     edx, 0x0FC
  21.         mov     eax, dword [ebx+edx]
  22.         ret
  23. ;------------------------------------------------
  24. align 4
  25. smbus_write_pciconfig:
  26. ; in: dl = reg#; eax = data
  27.         mov     ebx, SMBUS_PCIE_ADDR
  28.         and     edx, 0x0FC
  29.         mov     dword [ebx+edx], eax
  30.         ret
  31.  
  32. ;--------------------------------------------------------------------
  33. align 4
  34. lpc_read_pciconfig:
  35. ; in:  dl = reg#  |  out: eax = data
  36.         mov     ebx, LPC_PCIE_ADDR
  37.         and     edx, 0x0FC
  38.         mov     eax, dword [ebx+edx]
  39.         ret
  40. ;------------------------------------------------
  41. align 4
  42. lpc_write_pciconfig:
  43. ; in: dl = reg#; eax = data
  44.         mov     ebx, LPC_PCIE_ADDR
  45.         and     edx, 0x0FC
  46.         mov     dword [ebx+edx], eax
  47.         ret
  48.  
  49. ;--------------------------------------------------------------------
  50. align 4
  51. read_sio_cfg:
  52. ; in:  al = reg#  |  out: al =  data
  53.         push    edx
  54.         mov     dx,  SB_SIO_INDEX
  55.         out     dx, al
  56.         inc     dl
  57.         in      al, dx
  58.         pop     edx
  59.         ret
  60.  
  61. ;------------------------------------------------
  62. align 4
  63. write_pm_cfg:
  64. ; in:  al = reg#; ah = data
  65. ;------------------------------------------------
  66.         push    edx
  67.         mov     dx,  SB_PM_INDEX
  68.         out     dx, al
  69.         inc     dl
  70.         xchg    al, ah
  71.         out     dx, al
  72.         xchg    al, ah
  73.         pop     edx
  74.         ret
  75. ;--------------------------------------------------------------------
  76. align 4
  77. read_pm_cfg:
  78. ; in:  al = reg#  |  out: al =  data
  79.         push    edx
  80.         mov     dx,  SB_PM_INDEX
  81.         out     dx, al
  82.         inc     dl
  83.         in      al, dx
  84.         pop     edx
  85.         ret
  86.  
  87. ;------------------------------------------------
  88. align 4
  89. write_sio_cfg:
  90. ; in:  al = reg#; ah = data
  91. ;------------------------------------------------
  92.         push    edx
  93.         mov     dx,  SB_SIO_INDEX
  94.         out     dx, al
  95.         inc     dl
  96.         xchg    al, ah
  97.         out     dx, al
  98.         xchg    al, ah
  99.         pop     edx
  100.         ret
  101. ;------------------------------------------------
  102. align 4
  103. enter_sio_cfg_mode:
  104. ; the magic sequence to unlock the port
  105. ;------------------------------------------------
  106.         mov     dx, SB_SIO_INDEX
  107.         mov     eax, 0x55550187 ; low byte first
  108.         out     dx, al
  109.         shr     eax, 8
  110.         out     dx, al
  111.         shr     eax, 8
  112.         out     dx, al
  113.         shr     eax, 8
  114.         out     dx, al
  115.         ret
  116.  
  117. ;-----------------------------------------------------------------------
  118. ; ATTENTION: the functions assume that RESET# signals use pins 84 and 34
  119. ; of IT8712F SuperIO chip. These signals may be (and will be!) different
  120. ; for every particular motherboard and SIO. Please refer to your m/board
  121. ; documentation to define the correct pins and GPIO lines!
  122. ;
  123. ;   Note this example DOES NOT PRETEND to be 100% correct implementation
  124. ;   of PCIe hotplug techniques !!
  125. ;-----------------------------------------------------------------------
  126. align 4
  127. init_pcie_slot_control:
  128. ;------------------------------------------------
  129.         call    enter_sio_cfg_mode
  130.         mov     ax, 0x0707      ; LDN = 07
  131.         call    write_sio_cfg
  132.         mov     al, 0x25
  133.         call    read_sio_cfg    ; ah = reg25h (Multy-function pin selector)
  134.         or      ah, 3           ; set bits 0, 1 (GPIO)
  135.         call    write_sio_cfg
  136.         mov     al, 0x2A
  137.         call    read_sio_cfg    ; ah = reg2Ah (Extended fn pin selector)
  138.         or      ah, 3           ; set bits 0, 1 (GPIO)
  139.         call    write_sio_cfg
  140.         mov     al, 0xB8
  141.         call    read_sio_cfg    ; ah = regB8h (internal pull-up enable)
  142.         or      ah, 3           ; set bits 0, 1
  143.         call    write_sio_cfg
  144.         mov     al, 0xC0
  145.         call    read_sio_cfg    ; ah = regC0h (simple IO enable)
  146.         or      ah, 3           ; set bits 0, 1
  147.         call    write_sio_cfg
  148.         mov     ax, 0x0202      ; Lock SIO config ports
  149.         call    write_sio_cfg
  150.         ret
  151.  
  152. align 4
  153. reset_pcie_slot:
  154. ;------------------------------------------------
  155.         call    enter_sio_cfg_mode
  156.         mov     ax, 0x0707      ; LDN = 07
  157.         call    write_sio_cfg
  158.         mov     al, 0xB0
  159.         call    read_sio_cfg    ; ah = regB0h (Pin polarity)
  160.         and     ah, 0xFC        ; invert bits 0, 1
  161.         call    write_sio_cfg
  162.         or      ah, 3           ; restore bits 0, 1
  163.         call    write_sio_cfg
  164.         mov     ax, 0x0202      ; Lock SIO config ports
  165.         call    write_sio_cfg
  166.         ret
  167.  
  168.  
  169.