m-chrzan.xyz
aboutsummaryrefslogtreecommitdiff
path: root/harddoomdev.c
diff options
context:
space:
mode:
Diffstat (limited to 'harddoomdev.c')
-rw-r--r--harddoomdev.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/harddoomdev.c b/harddoomdev.c
new file mode 100644
index 0000000..f903b10
--- /dev/null
+++ b/harddoomdev.c
@@ -0,0 +1,58 @@
+#include "harddoomdev.h"
+
+#include "harddoom.h"
+#include "doomcode.h"
+#include "pci.h"
+
+void doomdev_write(void __iomem *iomem, size_t addr, uint32_t data)
+{
+ iowrite32(data, iomem + addr);
+}
+
+uint32_t doomdev_read(void __iomem *iomem, size_t addr)
+{
+ return ioread32(iomem + addr);
+}
+
+uint32_t doomdev_read_stat(void __iomem *iomem, size_t stat)
+{
+ return doomdev_read(iomem, HARDDOOM_STATS(stat));
+}
+
+void load_microcode(void __iomem *iomem)
+{
+ int i;
+
+ doomdev_write(iomem, HARDDOOM_FE_CODE_ADDR, 0);
+ for (i = 0; i < ARRAY_SIZE(doomcode); i++) {
+ doomdev_write(iomem, HARDDOOM_FE_CODE_WINDOW, doomcode[i]);
+ }
+}
+
+void start_dev(struct pci_dev *dev)
+{
+ struct doom_data *data;
+ void __iomem *iomem;
+
+ data = pci_get_drvdata(dev);
+ iomem = data->iomem;
+
+ load_microcode(iomem);
+ doomdev_write(iomem, HARDDOOM_RESET, 0xffffffe);
+ doomdev_write(iomem, HARDDOOM_INTR, 0x3ff);
+ doomdev_write(iomem, HARDDOOM_ENABLE,
+ HARDDOOM_ENABLE_ALL ^ HARDDOOM_ENABLE_FETCH_CMD);
+}
+
+void shutdown_dev(struct pci_dev *dev)
+{
+ struct doom_data *data;
+ void __iomem *iomem;
+
+ data = pci_get_drvdata(dev);
+ iomem = data->iomem;
+
+ doomdev_write(iomem, HARDDOOM_ENABLE, 0);
+ doomdev_write(iomem, HARDDOOM_INTR_ENABLE, 0);
+ doomdev_read(iomem, 0);
+}