1 | // SPDX-License-Identifier: GPL-2.0-only |
---|---|
2 | /* |
3 | * VFIO platform driver specialized for Calxeda xgmac reset |
4 | * reset code is inherited from calxeda xgmac native driver |
5 | * |
6 | * Copyright 2010-2011 Calxeda, Inc. |
7 | * Copyright (c) 2015 Linaro Ltd. |
8 | * www.linaro.org |
9 | */ |
10 | |
11 | #include <linux/module.h> |
12 | #include <linux/kernel.h> |
13 | #include <linux/init.h> |
14 | #include <linux/io.h> |
15 | |
16 | #include "../vfio_platform_private.h" |
17 | |
18 | #define DRIVER_VERSION "0.1" |
19 | #define DRIVER_AUTHOR "Eric Auger <eric.auger@linaro.org>" |
20 | #define DRIVER_DESC "Reset support for Calxeda xgmac vfio platform device" |
21 | |
22 | /* XGMAC Register definitions */ |
23 | #define XGMAC_CONTROL 0x00000000 /* MAC Configuration */ |
24 | |
25 | /* DMA Control and Status Registers */ |
26 | #define XGMAC_DMA_CONTROL 0x00000f18 /* Ctrl (Operational Mode) */ |
27 | #define XGMAC_DMA_INTR_ENA 0x00000f1c /* Interrupt Enable */ |
28 | |
29 | /* DMA Control register defines */ |
30 | #define DMA_CONTROL_ST 0x00002000 /* Start/Stop Transmission */ |
31 | #define DMA_CONTROL_SR 0x00000002 /* Start/Stop Receive */ |
32 | |
33 | /* Common MAC defines */ |
34 | #define MAC_ENABLE_TX 0x00000008 /* Transmitter Enable */ |
35 | #define MAC_ENABLE_RX 0x00000004 /* Receiver Enable */ |
36 | |
37 | static inline void xgmac_mac_disable(void __iomem *ioaddr) |
38 | { |
39 | u32 value = readl(addr: ioaddr + XGMAC_DMA_CONTROL); |
40 | |
41 | value &= ~(DMA_CONTROL_ST | DMA_CONTROL_SR); |
42 | writel(val: value, addr: ioaddr + XGMAC_DMA_CONTROL); |
43 | |
44 | value = readl(addr: ioaddr + XGMAC_CONTROL); |
45 | value &= ~(MAC_ENABLE_TX | MAC_ENABLE_RX); |
46 | writel(val: value, addr: ioaddr + XGMAC_CONTROL); |
47 | } |
48 | |
49 | static int vfio_platform_calxedaxgmac_reset(struct vfio_platform_device *vdev) |
50 | { |
51 | struct vfio_platform_region *reg = &vdev->regions[0]; |
52 | |
53 | if (!reg->ioaddr) { |
54 | reg->ioaddr = |
55 | ioremap(offset: reg->addr, size: reg->size); |
56 | if (!reg->ioaddr) |
57 | return -ENOMEM; |
58 | } |
59 | |
60 | /* disable IRQ */ |
61 | writel(val: 0, addr: reg->ioaddr + XGMAC_DMA_INTR_ENA); |
62 | |
63 | /* Disable the MAC core */ |
64 | xgmac_mac_disable(ioaddr: reg->ioaddr); |
65 | |
66 | return 0; |
67 | } |
68 | |
69 | module_vfio_reset_handler("calxeda,hb-xgmac", vfio_platform_calxedaxgmac_reset); |
70 | |
71 | MODULE_VERSION(DRIVER_VERSION); |
72 | MODULE_LICENSE("GPL v2"); |
73 | MODULE_AUTHOR(DRIVER_AUTHOR); |
74 | MODULE_DESCRIPTION(DRIVER_DESC); |
75 |