28
28
#include <string.h>
29
29
#include <inttypes.h>
30
30
31
- void help () {
31
+ void help ()
32
+ {
32
33
printf ("Retreives PMU from the GPU.\nJust run, and pipe output to file.\n" );
33
34
}
34
35
35
- int32_t peek (int32_t reg ) {
36
+ int32_t peek (int32_t reg )
37
+ {
36
38
if ((reg < 0x400300 || reg >= 0x400400 ) ||
37
39
(nva_rd32 (0 ,0 )& 0x0e000000 ) != 0x02000000 ) {
38
40
return nva_rd32 (0 ,reg );
@@ -41,20 +43,59 @@ int32_t peek(int32_t reg) {
41
43
}
42
44
}
43
45
44
- void poke (uint32_t reg , uint32_t value ) {
46
+ void poke (uint32_t reg , uint32_t value )
47
+ {
45
48
nva_wr32 (0 ,reg ,value );
46
49
}
47
50
51
+ int g80_pte_from_pde (uint64_t chan_ptr , uint64_t * pte , int * hostmem )
52
+ {
53
+ uint32_t hi , lo ;
54
+ uint32_t pde ;
55
+
56
+ hi = (chan_ptr >> 16 ) & 0xffffff ;
57
+ lo = (chan_ptr & 0x0000ffff );
58
+
59
+ poke (0x1700 , hi | 0x2000000 );
60
+ pde = peek (0x700000 + lo + 0x208 );
61
+ if ((pde & 0xff3 ) != 0x63 ) {
62
+ fprintf (stderr ,"Page directory entry invalid\n" );
63
+ return -1 ;
64
+ }
65
+
66
+ switch ((pde & 0xc ) >> 2 ) {
67
+ case 0 :
68
+ * hostmem = 0 ;
69
+ break ;
70
+ case 3 :
71
+ * hostmem = 1 ;
72
+ break ;
73
+ default :
74
+ fprintf (stderr , "Page table in unknown memory\n" );
75
+ return -1 ;
76
+ break ;
77
+ }
78
+
79
+ hi = peek (0x700000 + lo + 0x20c );
80
+ hi &= 0x000000ff ;
81
+ * pte = ((uint64_t )hi << 32ull ) | (pde & 0xfffff000 );
82
+
83
+ return 0 ;
84
+ }
85
+
48
86
/*
49
87
* XXX: Take card number as parameter
50
88
* XXX: Does this generalise to other falcon engines too?
51
89
*/
52
90
53
- int main (int argc , char * * argv ){
91
+ int main (int argc , char * * argv )
92
+ {
54
93
int i = 0 , j = 0 ;
55
- uint32_t tmp_reg , tmp_mask ;
56
- int64_t tmp_memaddr = 0 ;
94
+ uint32_t tmp_reg , tmp_mask = 0 ;
57
95
uint32_t boot0 ;
96
+ uint64_t chan_ptr , pte ;
97
+ int hostmem ;
98
+ int ret ;
58
99
59
100
uint32_t hi = 0 ,lo = 0 ;
60
101
int32_t ptable [256 ];
@@ -95,30 +136,16 @@ int main(int argc, char **argv){
95
136
}
96
137
97
138
// Find the pagetable based on this info
98
- tmp_memaddr = ((tmp_reg & 0x0fffffff ) << 12 ) & 0x000000ffffffffff ; // XXX: Mask?
99
- hi = (tmp_memaddr >> 16 ) & 0xffffff ;
100
- lo = (tmp_memaddr & 0x0000ffff );
101
-
102
- poke (0x1700 , hi | 0x2000000 );
103
- tmp_reg = peek (0x700000 + lo + 0x208 );
104
- if ((tmp_reg & 0xff3 ) != 0x63 ) {
105
- fprintf (stderr ,"Page table entry invalid\n" );
106
- return -1 ;
107
- }
139
+ chan_ptr = ((tmp_reg & 0x0fffffff ) << 12 ) & 0x000000ffffffffff ; // XXX: Mask?
140
+ ret = g80_pte_from_pde (chan_ptr , & pte , & hostmem );
141
+ if (ret )
142
+ return ret ;
108
143
109
- // Mask off lower 12 bits
110
- tmp_reg = tmp_reg & 0xfffffff000 ;
111
- hi = (tmp_reg & 0xffff0000 ) >> 16 ;
112
- lo = tmp_reg & 0x0000ffff ;
113
-
114
- if ((tmp_reg & 0xc ) == 0xc ) {
144
+ if (hostmem )
115
145
tmp_mask = 0x2000000 ;
116
- } else if ((tmp_reg & 0xc ) == 0x0 ) {
117
- tmp_mask = 0 ;
118
- } else {
119
- fprintf (stderr ,"Page table entry points to unsupported memory\n" );
120
- return -1 ;
121
- }
146
+
147
+ hi = (pte & 0xffffff0000ull ) >> 16 ;
148
+ lo = (pte & 0xffff );
122
149
123
150
// Lets go and read this pt
124
151
poke (0x1700 , hi | tmp_mask );
0 commit comments