1*dfb99b05SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2*dfb99b05SThomas Gleixner /* Copyright 2014 Cisco Systems, Inc. All rights reserved. */
3c8806b6cSNarsimhulu Musini
4c8806b6cSNarsimhulu Musini #ifndef _VNIC_INTR_H_
5c8806b6cSNarsimhulu Musini #define _VNIC_INTR_H_
6c8806b6cSNarsimhulu Musini
7c8806b6cSNarsimhulu Musini #include <linux/pci.h>
8c8806b6cSNarsimhulu Musini #include "vnic_dev.h"
9c8806b6cSNarsimhulu Musini
10c8806b6cSNarsimhulu Musini #define VNIC_INTR_TIMER_MAX 0xffff
11c8806b6cSNarsimhulu Musini
12c8806b6cSNarsimhulu Musini #define VNIC_INTR_TIMER_TYPE_ABS 0
13c8806b6cSNarsimhulu Musini #define VNIC_INTR_TIMER_TYPE_QUIET 1
14c8806b6cSNarsimhulu Musini
15c8806b6cSNarsimhulu Musini /* Interrupt control */
16c8806b6cSNarsimhulu Musini struct vnic_intr_ctrl {
17c8806b6cSNarsimhulu Musini u32 coalescing_timer; /* 0x00 */
18c8806b6cSNarsimhulu Musini u32 pad0;
19c8806b6cSNarsimhulu Musini u32 coalescing_value; /* 0x08 */
20c8806b6cSNarsimhulu Musini u32 pad1;
21c8806b6cSNarsimhulu Musini u32 coalescing_type; /* 0x10 */
22c8806b6cSNarsimhulu Musini u32 pad2;
23c8806b6cSNarsimhulu Musini u32 mask_on_assertion; /* 0x18 */
24c8806b6cSNarsimhulu Musini u32 pad3;
25c8806b6cSNarsimhulu Musini u32 mask; /* 0x20 */
26c8806b6cSNarsimhulu Musini u32 pad4;
27c8806b6cSNarsimhulu Musini u32 int_credits; /* 0x28 */
28c8806b6cSNarsimhulu Musini u32 pad5;
29c8806b6cSNarsimhulu Musini u32 int_credit_return; /* 0x30 */
30c8806b6cSNarsimhulu Musini u32 pad6;
31c8806b6cSNarsimhulu Musini };
32c8806b6cSNarsimhulu Musini
33c8806b6cSNarsimhulu Musini struct vnic_intr {
34c8806b6cSNarsimhulu Musini unsigned int index;
35c8806b6cSNarsimhulu Musini struct vnic_dev *vdev;
36c8806b6cSNarsimhulu Musini struct vnic_intr_ctrl __iomem *ctrl; /* memory-mapped */
37c8806b6cSNarsimhulu Musini };
38c8806b6cSNarsimhulu Musini
39c8806b6cSNarsimhulu Musini static inline void
svnic_intr_unmask(struct vnic_intr * intr)40c8806b6cSNarsimhulu Musini svnic_intr_unmask(struct vnic_intr *intr)
41c8806b6cSNarsimhulu Musini {
42c8806b6cSNarsimhulu Musini iowrite32(0, &intr->ctrl->mask);
43c8806b6cSNarsimhulu Musini }
44c8806b6cSNarsimhulu Musini
45c8806b6cSNarsimhulu Musini static inline void
svnic_intr_mask(struct vnic_intr * intr)46c8806b6cSNarsimhulu Musini svnic_intr_mask(struct vnic_intr *intr)
47c8806b6cSNarsimhulu Musini {
48c8806b6cSNarsimhulu Musini iowrite32(1, &intr->ctrl->mask);
49c8806b6cSNarsimhulu Musini }
50c8806b6cSNarsimhulu Musini
51c8806b6cSNarsimhulu Musini static inline void
svnic_intr_return_credits(struct vnic_intr * intr,unsigned int credits,int unmask,int reset_timer)52c8806b6cSNarsimhulu Musini svnic_intr_return_credits(struct vnic_intr *intr,
53c8806b6cSNarsimhulu Musini unsigned int credits,
54c8806b6cSNarsimhulu Musini int unmask,
55c8806b6cSNarsimhulu Musini int reset_timer)
56c8806b6cSNarsimhulu Musini {
57c8806b6cSNarsimhulu Musini #define VNIC_INTR_UNMASK_SHIFT 16
58c8806b6cSNarsimhulu Musini #define VNIC_INTR_RESET_TIMER_SHIFT 17
59c8806b6cSNarsimhulu Musini
60c8806b6cSNarsimhulu Musini u32 int_credit_return = (credits & 0xffff) |
61c8806b6cSNarsimhulu Musini (unmask ? (1 << VNIC_INTR_UNMASK_SHIFT) : 0) |
62c8806b6cSNarsimhulu Musini (reset_timer ? (1 << VNIC_INTR_RESET_TIMER_SHIFT) : 0);
63c8806b6cSNarsimhulu Musini
64c8806b6cSNarsimhulu Musini iowrite32(int_credit_return, &intr->ctrl->int_credit_return);
65c8806b6cSNarsimhulu Musini }
66c8806b6cSNarsimhulu Musini
67c8806b6cSNarsimhulu Musini static inline unsigned int
svnic_intr_credits(struct vnic_intr * intr)68c8806b6cSNarsimhulu Musini svnic_intr_credits(struct vnic_intr *intr)
69c8806b6cSNarsimhulu Musini {
70c8806b6cSNarsimhulu Musini return ioread32(&intr->ctrl->int_credits);
71c8806b6cSNarsimhulu Musini }
72c8806b6cSNarsimhulu Musini
73c8806b6cSNarsimhulu Musini static inline void
svnic_intr_return_all_credits(struct vnic_intr * intr)74c8806b6cSNarsimhulu Musini svnic_intr_return_all_credits(struct vnic_intr *intr)
75c8806b6cSNarsimhulu Musini {
76c8806b6cSNarsimhulu Musini unsigned int credits = svnic_intr_credits(intr);
77c8806b6cSNarsimhulu Musini int unmask = 1;
78c8806b6cSNarsimhulu Musini int reset_timer = 1;
79c8806b6cSNarsimhulu Musini
80c8806b6cSNarsimhulu Musini svnic_intr_return_credits(intr, credits, unmask, reset_timer);
81c8806b6cSNarsimhulu Musini }
82c8806b6cSNarsimhulu Musini
83c8806b6cSNarsimhulu Musini void svnic_intr_free(struct vnic_intr *);
84c8806b6cSNarsimhulu Musini int svnic_intr_alloc(struct vnic_dev *, struct vnic_intr *, unsigned int);
85c8806b6cSNarsimhulu Musini void svnic_intr_init(struct vnic_intr *intr,
86c8806b6cSNarsimhulu Musini unsigned int coalescing_timer,
87c8806b6cSNarsimhulu Musini unsigned int coalescing_type,
88c8806b6cSNarsimhulu Musini unsigned int mask_on_assertion);
89c8806b6cSNarsimhulu Musini void svnic_intr_clean(struct vnic_intr *);
90c8806b6cSNarsimhulu Musini
91c8806b6cSNarsimhulu Musini #endif /* _VNIC_INTR_H_ */
92