summaryrefslogtreecommitdiff
path: root/bin/nv_disp.c
diff options
context:
space:
mode:
Diffstat (limited to 'bin/nv_disp.c')
-rw-r--r--bin/nv_disp.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/bin/nv_disp.c b/bin/nv_disp.c
new file mode 100644
index 000000000..2b2011380
--- /dev/null
+++ b/bin/nv_disp.c
@@ -0,0 +1,51 @@
+#include <stdlib.h>
+
+#include <core/os.h>
+#include <core/object.h>
+#include <core/device.h>
+
+static unsigned long chan = 0;
+
+static void
+nv_disp(struct nouveau_object *device, u16 mthd, u32 data)
+{
+ if (nv_device(device)->card_type == NV_50) {
+ u32 ctrl = nv_ro32(device, 0x610300 + (chan * 8));
+ nv_wo32(device, 0x610300 + (chan * 8), ctrl | 0x00000001);
+ nv_wo32(device, 0x610304 + (chan * 8), data);
+ nv_wo32(device, 0x610300 + (chan * 8), mthd | 0x80000001);
+ while (nv_ro32(device, 0x610300 + (chan * 8)) & 0x80000000) {}
+ nv_wo32(device, 0x610300 + (chan * 8), ctrl);
+ } else
+ if (nv_device(device)->card_type >= NV_D0 &&
+ nv_device(device)->card_type <= NV_E0) {
+ u32 ctrl = nv_ro32(device, 0x610700 + (chan * 16));
+ nv_wo32(device, 0x610700 + (chan * 16), ctrl | 0x00000001);
+ nv_wo32(device, 0x610704 + (chan * 16), data);
+ nv_wo32(device, 0x610700 + (chan * 16), mthd | 0x80000001);
+ while (nv_ro32(device, 0x610700 + (chan * 16)) & 0x80000000) {}
+ nv_wo32(device, 0x610700 + (chan * 16), ctrl);
+ } else {
+ printk("unsupported chipset\n");
+ exit(1);
+ }
+}
+
+#define FMTADDR "0x%04lx"
+#define FMTDATA "0x%08x"
+#define NAME "nv_disp"
+#define CAST u32
+#define WRITE(o,v) nv_disp(device, (o), (v))
+#define MAIN main_
+#define ENABLE (NV_DEVICE_DISABLE_MMIO | NV_DEVICE_DISABLE_IDENTIFY)
+#include "nv_wrfunc.h"
+
+int
+main(int argc, char **argv)
+{
+ if (argc < 2 || ((chan = strtol(argv[1], NULL, 0)) == ULONG_MAX))
+ return 0;
+
+ argv[1] = argv[0];
+ return main_(argc - 1, argv + 1);
+}