summaryrefslogtreecommitdiff
path: root/nva
diff options
context:
space:
mode:
authorRoy Spliet <nouveau@spliet.org>2016-08-21 22:03:57 +0100
committerRoy Spliet <nouveau@spliet.org>2016-08-21 22:04:46 +0100
commitd707a9716484ae31789d35d99a2a322d08b3c0d8 (patch)
tree4c098cc3b9974a68f2392b4c2b500ec7be41ec7b /nva
parent22a2836689fd3f1bce259d24a8309783d8a9f4b1 (diff)
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>
Diffstat (limited to 'nva')
-rw-r--r--nva/nvagetpmu.c83
1 files changed, 55 insertions, 28 deletions
diff --git a/nva/nvagetpmu.c b/nva/nvagetpmu.c
index 739e1a6b..f0523e43 100644
--- a/nva/nvagetpmu.c
+++ b/nva/nvagetpmu.c
@@ -28,11 +28,13 @@
#include <string.h>
#include <inttypes.h>
-void help() {
+void help()
+{
printf("Retreives PMU from the GPU.\nJust run, and pipe output to file.\n");
}
-int32_t peek(int32_t reg) {
+int32_t peek(int32_t reg)
+{
if ((reg < 0x400300 || reg >= 0x400400) ||
(nva_rd32(0,0)&0x0e000000) != 0x02000000) {
return nva_rd32(0,reg);
@@ -41,20 +43,59 @@ int32_t peek(int32_t reg) {
}
}
-void poke(uint32_t reg, uint32_t value) {
+void poke(uint32_t reg, uint32_t value)
+{
nva_wr32(0,reg,value);
}
+int g80_pte_from_pde(uint64_t chan_ptr, uint64_t *pte, int *hostmem)
+{
+ uint32_t hi, lo;
+ uint32_t pde;
+
+ hi = (chan_ptr >> 16) & 0xffffff;
+ lo = (chan_ptr & 0x0000ffff);
+
+ poke(0x1700, hi | 0x2000000);
+ pde = peek(0x700000+lo+0x208);
+ if ((pde & 0xff3) != 0x63) {
+ fprintf(stderr,"Page directory entry invalid\n");
+ return -1;
+ }
+
+ switch ((pde & 0xc) >> 2) {
+ case 0:
+ *hostmem = 0;
+ break;
+ case 3:
+ *hostmem = 1;
+ break;
+ default:
+ fprintf(stderr, "Page table in unknown memory\n");
+ return -1;
+ break;
+ }
+
+ hi = peek(0x700000+lo+0x20c);
+ hi &= 0x000000ff;
+ *pte = ((uint64_t)hi << 32ull) | (pde & 0xfffff000);
+
+ return 0;
+}
+
/*
* XXX: Take card number as parameter
* XXX: Does this generalise to other falcon engines too?
*/
-int main(int argc, char **argv){
+int main(int argc, char **argv)
+{
int i = 0, j = 0;
- uint32_t tmp_reg, tmp_mask;
- int64_t tmp_memaddr = 0;
+ uint32_t tmp_reg, tmp_mask = 0;
uint32_t boot0;
+ uint64_t chan_ptr, pte;
+ int hostmem;
+ int ret;
uint32_t hi = 0,lo = 0;
int32_t ptable[256];
@@ -95,30 +136,16 @@ int main(int argc, char **argv){
}
// Find the pagetable based on this info
- tmp_memaddr = ((tmp_reg & 0x0fffffff) << 12) & 0x000000ffffffffff; // XXX: Mask?
- hi = (tmp_memaddr >> 16) & 0xffffff;
- lo = (tmp_memaddr & 0x0000ffff);
-
- poke(0x1700, hi | 0x2000000);
- tmp_reg = peek(0x700000+lo+0x208);
- if ((tmp_reg & 0xff3) != 0x63) {
- fprintf(stderr,"Page table entry invalid\n");
- return -1;
- }
+ chan_ptr = ((tmp_reg & 0x0fffffff) << 12) & 0x000000ffffffffff; // XXX: Mask?
+ ret = g80_pte_from_pde(chan_ptr, &pte, &hostmem);
+ if (ret)
+ return ret;
- // Mask off lower 12 bits
- tmp_reg = tmp_reg & 0xfffffff000;
- hi = (tmp_reg & 0xffff0000) >> 16;
- lo = tmp_reg & 0x0000ffff;
-
- if ((tmp_reg & 0xc) == 0xc) {
+ if (hostmem)
tmp_mask = 0x2000000;
- } else if ((tmp_reg & 0xc) == 0x0) {
- tmp_mask = 0;
- } else {
- fprintf(stderr,"Page table entry points to unsupported memory\n");
- return -1;
- }
+
+ hi = (pte & 0xffffff0000ull) >> 16;
+ lo = (pte & 0xffff);
// Lets go and read this pt
poke(0x1700, hi | tmp_mask);