xref: /openbmc/linux/drivers/scsi/snic/vnic_intr.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
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