m-chrzan.xyz
aboutsummaryrefslogtreecommitdiff
path: root/harddoomdev.c
diff options
context:
space:
mode:
authorMarcin Chrzanowski <marcin.j.chrzanowski@gmail.com>2018-05-05 10:50:12 +0200
committerMarcin Chrzanowski <marcin.j.chrzanowski@gmail.com>2018-05-05 10:50:12 +0200
commitfa5bb24685b585521ba7eb52c5d63da43f3e2436 (patch)
tree4a9eb5217531b785a6eba97842c63e24b69d110a /harddoomdev.c
parent0200874bc49dcd1f0a38b938dccc9c49a80b8daf (diff)
Start and shutdown harddoom device
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);
+}