Subversion Repositories Kolibri OS

Rev

Rev 1481 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ; PCI Bus defines
  2.         PCI_HEADER_TYPE                 equ     0x0e  ;8 bit
  3.         PCI_BASE_ADDRESS_0              equ     0x10  ;32 bit
  4.         PCI_BASE_ADDRESS_5              equ     0x24  ;32 bits
  5.         PCI_BASE_ADDRESS_SPACE_IO       equ     0x01
  6.         PCI_VENDOR_ID                   equ     0x00  ;16 bit
  7.         PCI_BASE_ADDRESS_IO_MASK        equ     0xFFFFFFFC
  8.  
  9.  
  10. ; PCI programming
  11.         PCI_REG_COMMAND         equ 0x4 ; command register
  12.         PCI_REG_STATUS          equ 0x6 ; status register
  13.         PCI_REG_LATENCY         equ 0xd ; latency timer register
  14.         PCI_REG_CAP_PTR         equ 0x34 ; capabilities pointer
  15.         PCI_REG_CAPABILITY_ID   equ 0x0 ; capapility ID in pm register block
  16.         PCI_REG_PM_STATUS       equ 0x4 ; power management status register
  17.         PCI_REG_PM_CTRL         equ 0x4 ; power management control register
  18.         PCI_BIT_PIO             equ 0 ; bit0: io space control
  19.         PCI_BIT_MMIO            equ 1 ; bit1: memory space control
  20.         PCI_BIT_MASTER          equ 2 ; bit2: device acts as a PCI master
  21.  
  22.  
  23.         PAGESIZE                equ     4096
  24.  
  25.  
  26.  
  27.         LAST_IO = 0
  28.  
  29. macro set_io addr {
  30.  
  31.         if      addr = 0
  32.  
  33.         mov     edx, [device.io_addr]
  34.  
  35.         else if addr = LAST_IO
  36.  
  37.         else
  38.  
  39.         add     edx, addr - LAST_IO
  40.  
  41.         end if
  42.  
  43.         LAST_IO = addr
  44. }
  45.  
  46.  
  47.  
  48. macro allocate_and_clear dest, size, err {
  49.  
  50. ; We need to allocate at least 8 pages, if we want a continuous memory in ram
  51.     if (size < 8*4096) & (size > 4096)
  52.         stdcall KernelAlloc, 8*4096
  53.     else
  54.         stdcall KernelAlloc, size
  55.     end if
  56.         test    eax, eax
  57.         jz      err
  58.         mov     dest, eax               ; Save the address to it into the device struct
  59.         mov     edi, eax                ; look at last part of code!
  60.  
  61. ; Release the unused pages (if any)
  62.     if (size < 8*4096) & (size > 4096)
  63.         add     eax, (size/4096+1)*4096
  64.         mov     ecx, 8-(size/4096+1)
  65.         call    ReleasePages
  66.     end if
  67.  
  68. ; Clear the allocated buffer
  69.         ;mov     edi, eax
  70.         mov     ecx, size/4             ; divide by 4 because of DWORD
  71.         xor     eax, eax
  72.         rep     stosd
  73.  
  74. }
  75.  
  76.  
  77.  
  78. macro find_io bus, dev, io {
  79.  
  80.  
  81.         local   .check, .inc, .got
  82.  
  83.  
  84.         xor     eax, eax
  85.         mov     esi, PCI_BASE_ADDRESS_0
  86.         movzx   ecx, bus
  87.         movzx   edx, dev
  88.   .check:
  89.         stdcall PciRead16, ecx ,edx ,esi
  90.  
  91.         mov     io , eax
  92.         and     eax, PCI_BASE_ADDRESS_IO_MASK
  93.         test    eax, eax
  94.         jz      .inc
  95.  
  96.         mov     eax, io
  97.         and     eax, PCI_BASE_ADDRESS_SPACE_IO
  98.         test    eax, eax
  99.         jz      .inc
  100.  
  101.         mov     eax, io
  102.         and     eax, PCI_BASE_ADDRESS_IO_MASK
  103.         mov     io , eax
  104.         jmp     .got
  105.  
  106.   .inc:
  107.         add     esi, 4
  108.         cmp     esi, PCI_BASE_ADDRESS_5
  109.         jbe     .check
  110.  
  111.   .got:
  112.  
  113. }
  114.  
  115. macro find_irq bus, dev, irq {
  116.  
  117.         push    eax edx ecx
  118.         movzx   ecx, bus
  119.         movzx   edx, dev
  120.         stdcall PciRead8, ecx ,edx ,0x3c                                ; 0x3c is the offset where irq can be found
  121.         mov     irq, al
  122.         pop     ecx edx eax
  123.  
  124. }
  125.  
  126.  
  127.  
  128. macro make_bus_master bus, dev {
  129.  
  130.         movzx   ecx, bus
  131.         movzx   edx, dev
  132.         stdcall PciRead32, ecx ,edx, PCI_REG_COMMAND
  133.  
  134.         or      al, (1 shl PCI_BIT_MASTER) or (1 shl PCI_BIT_PIO)
  135.         and     al, not (1 shl PCI_BIT_MMIO)
  136.         stdcall PciWrite32, ecx, edx, PCI_REG_COMMAND, eax
  137.  
  138. }
  139.  
  140.  
  141.  
  142. struc IOCTL {
  143.       .handle           dd ?
  144.       .io_code          dd ?
  145.       .input            dd ?
  146.       .inp_size         dd ?
  147.       .output           dd ?
  148.       .out_size         dd ?
  149. }
  150.  
  151. virtual at edx
  152.   IOCTL IOCTL
  153. end virtual
  154.  
  155.  
  156.  
  157.  
  158. if used null_op
  159.  
  160. align 4
  161. null_op:
  162.         or      eax, -1
  163.         ret
  164.  
  165. end if
  166.  
  167.  
  168. macro virt_to_dma { ; input is eax
  169.  
  170.         push    ax
  171.         and     word[esp], PAGESIZE - 1
  172.         call    GetPgAddr
  173.         or      ax, word[esp]
  174.         inc     esp
  175.         inc     esp
  176.  
  177. }
  178.  
  179.  
  180. ;struc ETH_DEVICE {
  181. macro ETH_DEVICE {
  182. ; pointers to procedures
  183.       .unload           dd ?
  184.       .reset            dd ?
  185.       .transmit         dd ?
  186.       .set_MAC          dd ?
  187.       .get_MAC          dd ?
  188.       .set_mode         dd ?
  189.       .get_mode         dd ?
  190. ; status
  191.       .bytes_tx         dq ?
  192.       .bytes_rx         dq ?
  193.       .packets_tx       dd ?
  194.       .packets_rx       dd ?
  195.       .mode             dd ?
  196.       .name             dd ?
  197.       .mac              dp ?
  198. }
  199.  
  200.