Skip to content

Commit d707a97

Browse files
committed
nva/nvagetpmu: Move pde parsing into separate function
Hopefully paving the way to support Fermi and newer. Signed-off-by: Roy Spliet <nouveau@spliet.org>
1 parent 22a2836 commit d707a97

File tree

1 file changed

+55
-28
lines changed

1 file changed

+55
-28
lines changed

nva/nvagetpmu.c

Lines changed: 55 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,13 @@
2828
#include <string.h>
2929
#include <inttypes.h>
3030

31-
void help() {
31+
void help()
32+
{
3233
printf("Retreives PMU from the GPU.\nJust run, and pipe output to file.\n");
3334
}
3435

35-
int32_t peek(int32_t reg) {
36+
int32_t peek(int32_t reg)
37+
{
3638
if ((reg < 0x400300 || reg >= 0x400400) ||
3739
(nva_rd32(0,0)&0x0e000000) != 0x02000000) {
3840
return nva_rd32(0,reg);
@@ -41,20 +43,59 @@ int32_t peek(int32_t reg) {
4143
}
4244
}
4345

44-
void poke(uint32_t reg, uint32_t value) {
46+
void poke(uint32_t reg, uint32_t value)
47+
{
4548
nva_wr32(0,reg,value);
4649
}
4750

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+
4886
/*
4987
* XXX: Take card number as parameter
5088
* XXX: Does this generalise to other falcon engines too?
5189
*/
5290

53-
int main(int argc, char **argv){
91+
int main(int argc, char **argv)
92+
{
5493
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;
5795
uint32_t boot0;
96+
uint64_t chan_ptr, pte;
97+
int hostmem;
98+
int ret;
5899

59100
uint32_t hi = 0,lo = 0;
60101
int32_t ptable[256];
@@ -95,30 +136,16 @@ int main(int argc, char **argv){
95136
}
96137

97138
// 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;
108143

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)
115145
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);
122149

123150
// Lets go and read this pt
124151
poke(0x1700, hi | tmp_mask);

0 commit comments

Comments
 (0)