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 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 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 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 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 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