diff options
Diffstat (limited to 'bin/nv_wifunc.h')
-rw-r--r-- | bin/nv_wifunc.h | 47 |
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" |