m-chrzan.xyz
aboutsummaryrefslogtreecommitdiff
path: root/harddoomdev.c
blob: 00ef6f7c56e2aa7248fd1865582d211fced4709c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include "harddoomdev.h"

#include "harddoom.h"
#include "doomcode.h"
#include "pci.h"
#include "private_data.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);
}