From fa5bb24685b585521ba7eb52c5d63da43f3e2436 Mon Sep 17 00:00:00 2001 From: Marcin Chrzanowski Date: Sat, 5 May 2018 10:50:12 +0200 Subject: Start and shutdown harddoom device --- harddoomdev.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 harddoomdev.c (limited to 'harddoomdev.c') 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); +} -- cgit v1.2.3