blob: 7b177585afbf0a20396cfeb30c865f8511eb897f (
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
93
94
95
96
97
98
99
100
101
102
103
104
105
|
\ *****************************************************************************
\ * Copyright (c) 2004, 2008 IBM Corporation
\ * All rights reserved.
\ * This program and the accompanying materials
\ * are made available under the terms of the BSD License
\ * which accompanies this distribution, and is available at
\ * http://www.opensource.org/licenses/bsd-license.php
\ *
\ * Contributors:
\ * IBM Corporation - initial implementation
\ ****************************************************************************/
get-node CONSTANT my-phandle
\ get the PUID from the node above
s" my-puid" my-phandle parent $call-static CONSTANT my-puid
\ define the config reads
: config-b@ puid >r my-puid TO puid my-space + rtas-config-b@ r> TO puid ;
: config-w@ puid >r my-puid TO puid my-space + rtas-config-w@ r> TO puid ;
: config-l@ puid >r my-puid TO puid my-space + rtas-config-l@ r> TO puid ;
\ define the config writes
: config-b! puid >r my-puid TO puid my-space + rtas-config-b! r> TO puid ;
: config-w! puid >r my-puid TO puid my-space + rtas-config-w! r> TO puid ;
: config-l! puid >r my-puid TO puid my-space + rtas-config-l! r> TO puid ;
\ for Debug purposes: dumps the whole config space
: config-dump puid >r my-puid TO puid my-space pci-dump r> TO puid ;
\ prepare the device for subsequent use
\ this word should be overloaded by the device file (if present)
\ the device file can call this file before implementing
\ its own open functionality
: open
puid >r \ save the old puid
my-puid TO puid \ set up the puid to the devices Hostbridge
pci-master-enable \ And enable Bus Master, IO and MEM access again.
pci-mem-enable \ enable mem access
pci-io-enable \ enable io access
r> TO puid \ restore puid
true
;
\ close the previously opened device
\ this word should be overloaded by the device file (if present)
\ the device file can call this file after its implementation
\ of own close functionality
: close
puid >r \ save the old puid
my-puid TO puid \ set up the puid
pci-device-disable \ and disable the device
r> TO puid \ restore puid
;
s" dma-function.fs" included
\ generate the rom-fs filename from the vendor and device ID "pci-device_VENDORID_DEVICEID.fs"
: devicefile ( -- str len )
s" pci-device_"
my-space pci-vendor@ 4 int2str $cat
s" _" $cat
my-space pci-device@ 4 int2str $cat
s" .fs" $cat
;
\ generate the rom-fs filename from the base-class id "pci-class_BASECLASS.fs"
: classfile ( -- str len )
s" pci-class_"
my-space pci-class@ 10 rshift 2 int2str $cat
s" .fs" $cat
;
\ Set up the device with either default or special settings
: setup ( -- )
\ is there special handling for this device, given vendor and device id?
devicefile romfs-lookup ?dup
IF
\ give it a special treatment
evaluate
ELSE
classfile romfs-lookup ?dup
IF
\ give it a pci-class related treatment
evaluate
ELSE
\ no special handling for this device, attempt autoconfiguration
my-space pci-class-name type 2a emit cr
my-space pci-device-generic-setup
THEN
THEN
;
\ Disable Bus Master, Memory Space and I/O Space for this device
\ if Bus Master function is needed it should be enabled/disabled by open/close in the device driver code
pci-device-disable
\ Enalbe #PERR and #SERR reporting
pci-error-enable
\ Print out device information
my-space 44 pci-out \ config-addr ascii('D')
\ and set up the device
setup
|