blob: 563b652a4afdb0448eae804d87e8b6276074b814 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
[IFDEF] CONFIG_DRIVER_PCI
: pci-addr-encode ( addr.lo addr.mi addr.hi )
rot >r swap >r
encode-int
r> encode-int encode+
r> encode-int encode+
;
: pci-len-encode ( len.lo len.hi )
encode-int
rot encode-int encode+
;
\ Get region offset for BAR reg
: pci-bar-offset@ ( bar-reg -- off.lo off.hi -1 | 0 )
" reg" active-package get-package-property 0= if
begin
decode-phys \ ( reg prop prop-len phys.lo phys.mid phys.hi )
ff and 5 pick = if
>r >r 3drop r> r>
-1 exit
else
2drop
then
\ Drop the size as we don't need it
decode-int drop decode-int drop
dup 0=
until
3drop
0 exit
else
0
then
;
\ Get region size for BAR reg
: pci-bar-size@ ( bar-reg -- size )
" reg" active-package get-package-property 0= if
begin
decode-phys \ ( reg prop prop-len phys.lo phys.mid phys.hi )
ff and 5 pick = if
2drop decode-int drop
decode-int
>r 3drop r>
exit
else
2drop decode-int drop
decode-int drop
then
dup 0=
until
3drop
0 \ default size of 0 if BAR not found
then
;
\ Get base address for configured BAR reg
: pci-bar-base@ ( bar-reg -- addr.lo addr.hi -1 | 0 )
" assigned-addresses" active-package get-package-property 0= if
begin
decode-phys \ ( reg prop prop-len phys.lo phys.mid phys.hi )
ff and 5 pick = if
>r >r 3drop r> r>
-1 exit
else
2drop
then
\ Drop the size as we don't need it
decode-int drop decode-int drop
dup 0=
until
3drop
0 exit
else
0
then
;
\ Get PCI bus address and size for configured BAR reg
: pci-bar>pci-region ( bar-reg -- addr.lo addr.hi size )
dup
>r pci-bar-offset@ if
swap r@ pci-bar-base@ if
swap d+
then
swap r@ pci-bar-size@
then
r> drop
;
[THEN]
|