Subversion Repositories Kolibri OS

Rev

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

  1. ;-----------------------------------------------------------------------------
  2. ; find the IDE controller in the device list
  3. ;-----------------------------------------------------------------------------
  4.         mov     ecx, IDE_controller_1
  5.         mov     esi, pcidev_list
  6. ;--------------------------------------
  7. align 4
  8. .loop:
  9.         mov     esi, [esi+PCIDEV.fd]
  10.         cmp     esi, pcidev_list
  11.         jz      find_IDE_controller_done
  12.  
  13.         mov     eax, [esi+PCIDEV.class]
  14.         shr     eax, 4
  15.         cmp     eax, 0x01018
  16.         jnz     .loop
  17. ;--------------------------------------
  18. .found:
  19.         mov     eax, [esi+PCIDEV.class]
  20.         DEBUGF  1, 'K : IDE controller programming interface %x\n', eax
  21.         mov     [ecx+IDE_DATA.ProgrammingInterface], eax
  22.  
  23.         mov     ah, [esi+PCIDEV.bus]
  24.         mov     al, 2
  25.         mov     bh, [esi+PCIDEV.devfn]
  26. ;--------------------------------------
  27.         mov     bl, 0x10
  28.         push    eax
  29.         call    pci_read_reg
  30.         and     eax, 0xFFFC
  31.         cmp     ax, 0
  32.         je      @f
  33.  
  34.         cmp     ax, 1
  35.         jne     .show_BAR0
  36. ;--------------------------------------
  37. @@:
  38.         mov     ax, 0x1F0
  39. ;--------------------------------------
  40. .show_BAR0:
  41.         DEBUGF  1, 'K : BAR0 IDE base addr %x\n', ax
  42.         mov     [StandardATABases], ax
  43.         mov     [ecx+IDE_DATA.BAR0_val], ax
  44.         pop     eax
  45. ;--------------------------------------
  46.         mov     bl, 0x14
  47.         push    eax
  48.         call    pci_read_reg
  49.         and     eax, 0xFFFC
  50.         cmp     ax, 0
  51.         je      @f
  52.  
  53.         cmp     ax, 1
  54.         jne     .show_BAR1
  55. ;--------------------------------------
  56. @@:
  57.         mov     ax, 0x3F4
  58. ;--------------------------------------
  59. .show_BAR1:
  60.         DEBUGF  1, 'K : BAR1 IDE base addr %x\n', ax
  61.         mov     [ecx+IDE_DATA.BAR1_val], ax
  62.         pop     eax
  63. ;--------------------------------------
  64.         mov     bl, 0x18
  65.         push    eax
  66.         call    pci_read_reg
  67.         and     eax, 0xFFFC
  68.         cmp     ax, 0
  69.         je      @f
  70.  
  71.         cmp     ax, 1
  72.         jne     .show_BAR2
  73. ;--------------------------------------
  74. @@:
  75.         mov     ax, 0x170
  76. ;--------------------------------------
  77. .show_BAR2:
  78.         DEBUGF  1, 'K : BAR2 IDE base addr %x\n', ax
  79.         mov     [StandardATABases+2], ax
  80.         mov     [ecx+IDE_DATA.BAR2_val], ax
  81.         pop     eax
  82. ;--------------------------------------
  83.         mov     bl, 0x1C
  84.         push    eax
  85.         call    pci_read_reg
  86.         and     eax, 0xFFFC
  87.         cmp     ax, 0
  88.         je      @f
  89.  
  90.         cmp     ax, 1
  91.         jne     .show_BAR3
  92. ;--------------------------------------
  93. @@:
  94.         mov     ax, 0x374
  95. ;--------------------------------------
  96. .show_BAR3:
  97.         DEBUGF  1, 'K : BAR3 IDE base addr %x\n', ax
  98.         mov     [ecx+IDE_DATA.BAR3_val], ax
  99.         pop     eax
  100. ;--------------------------------------
  101.         mov     bl, 0x20
  102.         push    eax
  103.         call    pci_read_reg
  104.         and     eax, 0xFFFC
  105.         DEBUGF  1, 'K : BAR4 IDE controller register base addr %x\n', ax
  106.         mov     [ecx+IDE_DATA.RegsBaseAddres], ax
  107.         pop     eax
  108. ;--------------------------------------
  109.         mov     bl, 0x3C
  110.         push    eax
  111.         call    pci_read_reg
  112.         and     eax, 0xFF
  113.         DEBUGF  1, 'K : IDE Interrupt %x\n', al
  114.         mov     [ecx+IDE_DATA.Interrupt], ax
  115.         pop     eax
  116.  
  117.         add     ecx, sizeof.IDE_DATA
  118. ;--------------------------------------
  119.         jmp     .loop
  120. ;-----------------------------------------------------------------------------
  121. uglobal
  122. align 4
  123. ;--------------------------------------
  124. IDE_controller_pointer dd ?
  125. ;--------------------------------------
  126. IDE_controller_1 IDE_DATA
  127. IDE_controller_2 IDE_DATA
  128. IDE_controller_3 IDE_DATA
  129. ;--------------------------------------
  130. cache_ide0  IDE_CACHE
  131. cache_ide1  IDE_CACHE
  132. cache_ide2  IDE_CACHE
  133. cache_ide3  IDE_CACHE
  134. cache_ide4  IDE_CACHE
  135. cache_ide5  IDE_CACHE
  136. cache_ide6  IDE_CACHE
  137. cache_ide7  IDE_CACHE
  138. cache_ide8  IDE_CACHE
  139. cache_ide9  IDE_CACHE
  140. cache_ide10 IDE_CACHE
  141. cache_ide11 IDE_CACHE
  142. ;--------------------------------------
  143. endg
  144. ;-----------------------------------------------------------------------------
  145. ; START of initialisation IDE ATA code
  146. ;-----------------------------------------------------------------------------
  147. Init_IDE_ATA_controller:
  148.         cmp     [ecx+IDE_DATA.ProgrammingInterface], 0
  149.         je      set_interrupts_for_IDE_controllers.continue
  150.  
  151.         mov     esi, boot_disabling_ide
  152.         call    boot_log
  153. ;--------------------------------------
  154. ; Disable IDE interrupts, because the search
  155. ; for IDE partitions is in the PIO mode.
  156. ;--------------------------------------
  157. .disable_IDE_interrupt:
  158. ; Disable interrupts in IDE controller for PIO
  159.         mov     al, 2
  160.         mov     dx, [ecx+IDE_DATA.BAR1_val] ;0x3F4
  161.         add     dx, 2 ;0x3F6
  162.         out     dx, al
  163.         mov     dx, [ecx+IDE_DATA.BAR3_val] ;0x374
  164.         add     dx, 2 ;0x376
  165.         out     dx, al
  166. ;-----------------------------------------------------------------------------
  167. ; set current ata bases
  168. @@:
  169.         mov     ax, [ecx+IDE_DATA.BAR0_val]
  170.         mov     [StandardATABases], ax
  171.         mov     ax, [ecx+IDE_DATA.BAR2_val]
  172.         mov     [StandardATABases+2], ax
  173.  
  174.         mov     esi, boot_detecthdcd
  175.         call    boot_log
  176. include 'dev_hdcd.inc'
  177. ;-----------------------------------------------------------------------------
  178.         mov     dx, [ecx+IDE_DATA.RegsBaseAddres]
  179. ; test whether it is our interrupt?
  180.         add     dx, 2
  181.         in      al, dx
  182.         test    al, 100b
  183.         jz      @f
  184. ; clear Bus Master IDE Status register
  185. ; clear Interrupt bit
  186.         out     dx, al
  187. ;--------------------------------------
  188. @@:
  189.         add     dx, 8
  190. ; test whether it is our interrupt?
  191.         in      al, dx
  192.         test    al, 100b
  193.         jz      @f
  194. ; clear Bus Master IDE Status register
  195. ; clear Interrupt bit
  196.         out     dx, al
  197. ;--------------------------------------
  198. @@:
  199. ; read status register and remove the interrupt request
  200.         mov     dx, [ecx+IDE_DATA.BAR0_val] ;0x1F0
  201.         add     dx, 0x7 ;0x1F7
  202.         in      al, dx
  203.         mov     dx, [ecx+IDE_DATA.BAR2_val] ;0x170
  204.         add     dx, 0x7 ;0x177
  205.         in      al, dx
  206. ;-----------------------------------------------------------------------------
  207.         push    eax edx
  208.         mov     dx, [ecx+IDE_DATA.RegsBaseAddres]
  209.         xor     eax, eax
  210.         add     dx, 2
  211.         in      al, dx
  212. ;        DEBUGF  1, "K : Primary Bus Master IDE Status Register %x\n", eax
  213.  
  214.         add     dx, 8
  215.         in      al, dx
  216. ;        DEBUGF  1, "K : Secondary Bus Master IDE Status Register %x\n", eax
  217.         pop     edx eax
  218.  
  219.         cmp     [ecx+IDE_DATA.RegsBaseAddres], 0
  220.         setnz   [ecx+IDE_DATA.dma_hdd]
  221. ;-----------------------------------------------------------------------------
  222. ; set interrupts for IDE Controller
  223. ;-----------------------------------------------------------------------------
  224.         mov     esi, boot_set_int_IDE
  225.         call    boot_log
  226. set_interrupts_for_IDE_controllers:
  227.         mov     eax, [ecx+IDE_DATA.ProgrammingInterface]
  228.         cmp     ax, 0x0180
  229.         je      .pata_ide
  230.  
  231.         cmp     ax, 0x018a
  232.         jne     .sata_ide
  233. ;--------------------------------------
  234. .pata_ide:
  235.         cmp     [ecx+IDE_DATA.RegsBaseAddres], 0
  236.         je      .end_set_interrupts
  237.  
  238.         push    ecx
  239.         stdcall attach_int_handler, 14, IDE_irq_14_handler, 0
  240.         DEBUGF  1, "K : Set IDE IRQ14 return code %x\n", eax
  241.         stdcall attach_int_handler, 15, IDE_irq_15_handler, 0
  242.         DEBUGF  1, "K : Set IDE IRQ15 return code %x\n", eax
  243.         pop     ecx
  244.  
  245.         jmp     .enable_IDE_interrupt
  246. ;--------------------------------------
  247. .sata_ide:
  248.         cmp     ax, 0x0185
  249.         je      .sata_ide_1
  250.  
  251.         cmp     ax, 0x018f
  252.         jne     .end_set_interrupts
  253. ;--------------------------------------
  254. .sata_ide_1:
  255.         cmp     [ecx+IDE_DATA.RegsBaseAddres], 0
  256.         je      .end_set_interrupts
  257.  
  258.         mov     ax, [ecx+IDE_DATA.Interrupt]
  259.         movzx   eax, al
  260.         push    ecx
  261.         stdcall attach_int_handler, eax, IDE_common_irq_handler, 0
  262.         pop     ecx
  263.         DEBUGF  1, "K : Set IDE IRQ%d return code %x\n", [ecx+IDE_DATA.Interrupt]:1, eax
  264. ;--------------------------------------
  265. .enable_IDE_interrupt:
  266.         mov     esi, boot_enabling_ide
  267.         call    boot_log
  268. ; Enable interrupts in IDE controller for DMA
  269.         xor     ebx, ebx
  270.         cmp     ecx, IDE_controller_2
  271.         jne     @f
  272.  
  273.         add     ebx, 5
  274.         jmp     .check_DRIVE_DATA
  275. ;--------------------------------------
  276. @@:
  277.         cmp     ecx, IDE_controller_3
  278.         jne     .check_DRIVE_DATA
  279.  
  280.         add     ebx, 10
  281. ;--------------------------------------
  282. .check_DRIVE_DATA:
  283.         mov     al, 0
  284.         mov     ah, [ebx+DRIVE_DATA+1]
  285.         test    ah, 10100000b
  286.         jz      @f
  287.  
  288.         DEBUGF  1, "K : IDE CH1 PIO, because ATAPI drive present\n"
  289.         jmp     .ch2_check
  290. ;--------------------------------------
  291. @@:
  292.         mov     dx, [ecx+IDE_DATA.BAR1_val] ;0x3F4
  293.         add     dx, 2 ;0x3F6
  294.         out     dx, al
  295.         DEBUGF  1, "K : IDE CH1 DMA enabled\n"
  296. ;--------------------------------------
  297. .ch2_check:
  298.         test    ah, 1010b
  299.         jz      @f
  300.  
  301.         DEBUGF  1, "K : IDE CH2 PIO, because ATAPI drive present\n"
  302.         jmp     .end_set_interrupts
  303. ;--------------------------------------
  304. @@:
  305.         mov     dx, [ecx+IDE_DATA.BAR3_val] ;0x374
  306.         add     dx, 2 ;0x376
  307.         out     dx, al
  308.         DEBUGF  1, "K : IDE CH2 DMA enabled\n"
  309. ;--------------------------------------
  310. .end_set_interrupts:
  311. ;-----------------------------------------------------------------------------
  312.         cmp     [ecx+IDE_DATA.dma_hdd], 0
  313.         je      .print_pio
  314. ;--------------------------------------
  315. .print_dma:
  316.         DEBUGF  1, "K : IDE DMA mode\n"
  317.         jmp     .continue
  318. ;--------------------------------------
  319. .print_pio:
  320.         DEBUGF  1, "K : IDE PIO mode\n"
  321. .continue:
  322.         ret
  323. ;-----------------------------------------------------------------------------
  324. ; END of initialisation IDE ATA code
  325. ;-----------------------------------------------------------------------------
  326. find_IDE_controller_done:
  327.         mov     ecx, IDE_controller_1
  328.         mov     [IDE_controller_pointer], ecx
  329.         call    Init_IDE_ATA_controller
  330.         mov     ecx, IDE_controller_2
  331.         mov     [IDE_controller_pointer], ecx
  332.         call    Init_IDE_ATA_controller
  333.         mov     ecx, IDE_controller_3
  334.         mov     [IDE_controller_pointer], ecx
  335.         call    Init_IDE_ATA_controller
  336. ;-----------------------------------------------------------------------------
  337.         mov     esi, boot_getcache
  338.         call    boot_log
  339. include 'getcache.inc'
  340. ;-----------------------------------------------------------------------------
  341.         mov     esi, boot_detectpart
  342.         call    boot_log
  343. include 'sear_par.inc'
  344. ;-----------------------------------------------------------------------------
  345.