summaryrefslogtreecommitdiff
path: root/bin/nv_wifunc.h
diff options
context:
space:
mode:
Diffstat (limited to 'bin/nv_wifunc.h')
-rw-r--r--bin/nv_wifunc.h47
1 files changed, 47 insertions, 0 deletions
diff --git a/bin/nv_wifunc.h b/bin/nv_wifunc.h
new file mode 100644
index 000000000..8e4abb1fc
--- /dev/null
+++ b/bin/nv_wifunc.h
@@ -0,0 +1,47 @@
+#include <stdlib.h>
+
+#include <core/os.h>
+#include <core/object.h>
+#include <core/device.h>
+
+static void __iomem *map = NULL;
+static u64 map_page = ~0ULL;
+
+static void
+nv_wfb(struct nouveau_object *device, u64 offset, CAST data)
+{
+ struct pci_dev *pdev = nv_device(device)->pdev;
+ u64 page = (offset & ~(PAGE_SIZE - 1));
+ u64 addr = (offset & (PAGE_SIZE - 1));
+
+ if (nv_device(device)->card_type < NV_40 ||
+ nv_device(device)->card_type > NV_E0) {
+ printk("unsupported chipset\n");
+ exit(1);
+ }
+
+ if (map_page != page) {
+ if (map)
+ iounmap(map);
+
+ if (pci_resource_len(pdev, 2)) {
+ map = ioremap(pci_resource_start(pdev, 2) +
+ page, PAGE_SIZE);
+ } else {
+ map = ioremap(pci_resource_start(pdev, 3) +
+ page, PAGE_SIZE);
+ }
+
+ if (!map) {
+ printk("map failed\n");
+ exit(1);
+ }
+
+ map_page = page;
+ }
+
+ *(CAST *)(map + addr) = data;
+}
+
+#define WRITE(o,v) nv_wfb(device, (o), (v))
+#include "nv_wrfunc.h"