Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4522 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
3
;; Copyright (C) KolibriOS team 2004-2014. All rights reserved.    ;;
4
;; Distributed under terms of the GNU General Public License       ;;
5
;;                                                                 ;;
6
;;          GNU GENERAL PUBLIC LICENSE                             ;;
7
;;             Version 2, June 1991                                ;;
8
;;                                                                 ;;
9
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10
 
11
struct  PCI_header
12
 
13
        vendor_id       dw ?
14
        device_id       dw ?
15
        command         dw ?
16
        status          dw ?
17
        revision_id     db ?
18
        prog_if         db ?
19
        subclass        db ?
20
        class_code      db ?
21
        cache_line_size db ?
22
        latency_timer   db ?
23
        header_type     db ?
24
        bist            db ?
25
 
26
ends
27
 
28
struct  PCI_header00    PCI_header
29
 
30
        base_addr_0     dd ?
31
        base_addr_1     dd ?
32
        base_addr_2     dd ?
33
        base_addr_3     dd ?
34
        base_addr_4     dd ?
35
        base_addr_5     dd ?
36
        cardbus_cis_ptr dd ?
37
        subsys_vendor   dw ?
38
        subsys_id       dw ?
39
        exp_rom_addr    dd ?
40
        cap_ptr         db ?
41
        reserved        rb 7
42
        interrupt_line  db ?
43
        interrupt_pin   db ?
44
        min_grant       db ?
45
        max_latency     db ?
46
 
47
ends
48
 
49
; Base address bits
50
        PCI_BASE_ADDRESS_SPACE_IO       = 0x01
51
        PCI_BASE_ADDRESS_IO_MASK        = 0xFFFFFFFC
52
        PCI_BASE_ADDRESS_MEM_MASK       = 0xFFFFFFF0
53
 
54
; command bits
55
        PCI_CMD_PIO                     = 1             ; bit0: io space control
56
        PCI_CMD_MMIO                    = 2             ; bit1: memory space control
57
        PCI_CMD_MASTER                  = 4             ; bit2: device acts as a PCI master
58
 
59
 
60
if used PCI_find_io
61
proc PCI_find_io stdcall bus, dev
62
 
63
        push    esi
64
        xor     eax, eax
65
        mov     esi, PCI_BASE_ADDRESS_0
66
  .check:
67
        invoke  PciRead32, [bus], [dev], esi
68
 
69
        test    eax, PCI_BASE_ADDRESS_IO_MASK
70
        jz      .inc
71
 
72
        test    eax, PCI_BASE_ADDRESS_SPACE_IO
73
        jz      .inc
74
 
75
        and     eax, PCI_BASE_ADDRESS_IO_MASK
76
        pop     esi
77
        ret
78
 
79
  .inc:
80
        add     esi, 4
81
        cmp     esi, PCI_BASE_ADDRESS_5
82
        jbe     .check
83
        pop     esi
84
        xor     eax, eax
85
        ret
86
 
87
endp
88
end if
89
 
90
 
91
if used PCI_find_mmio32
92
proc PCI_find_mmio32 stdcall bus, dev
93
 
94
        push    esi
95
        mov     esi, PCI_header00.base_addr_0
96
  .check:
97
        invoke  PciRead32, [bus], [dev], esi
98
 
99
        test    eax, PCI_BASE_ADDRESS_SPACE_IO  ; mmio address?
100
        jnz     .inc
101
 
102
        test    eax, 100b       ; 64 bit?
103
        jnz     .inc
104
        and     eax, not 1111b
105
        pop     esi
106
        ret
107
 
108
  .inc:
109
        add     esi, 4
110
        cmp     esi, PCI_header00.base_addr_5
111
        jbe     .check
112
        xor     eax, eax
113
        pop     esi
114
        ret
115
 
116
endp
117
end if