1 /* SPDX-License-Identifier: MIT */
2 #ifndef __NVKM_INTR_H__
3 #define __NVKM_INTR_H__
4 #include <core/os.h>
5 struct nvkm_device;
6 struct nvkm_subdev;
7 
8 enum nvkm_intr_prio {
9 	NVKM_INTR_PRIO_VBLANK = 0,
10 	NVKM_INTR_PRIO_NORMAL,
11 	NVKM_INTR_PRIO_NR
12 };
13 
14 enum nvkm_intr_type {
15 	NVKM_INTR_SUBDEV   = -1, /* lookup vector by requesting subdev, in mapping table. */
16 	NVKM_INTR_VECTOR_0 = 0,
17 };
18 
19 struct nvkm_intr {
20 	const struct nvkm_intr_func {
21 		bool (*pending)(struct nvkm_intr *);
22 		void (*unarm)(struct nvkm_intr *);
23 		void (*rearm)(struct nvkm_intr *);
24 		void (*block)(struct nvkm_intr *, int leaf, u32 mask);
25 		void (*allow)(struct nvkm_intr *, int leaf, u32 mask);
26 		void (*reset)(struct nvkm_intr *, int leaf, u32 mask);
27 	} *func;
28 	const struct nvkm_intr_data {
29 		int type; /* enum nvkm_subdev_type (+ve), enum nvkm_intr_type (-ve) */
30 		int inst;
31 		int leaf;
32 		u32 mask; /* 0-terminated. */
33 		bool legacy; /* auto-create "legacy" nvkm_subdev_intr() handler */
34 	} *data;
35 
36 	struct nvkm_subdev *subdev;
37 	int leaves;
38 	u32 *stat;
39 	u32 *mask;
40 
41 	struct list_head head;
42 };
43 
44 void nvkm_intr_ctor(struct nvkm_device *);
45 void nvkm_intr_dtor(struct nvkm_device *);
46 int nvkm_intr_install(struct nvkm_device *);
47 void nvkm_intr_unarm(struct nvkm_device *);
48 void nvkm_intr_rearm(struct nvkm_device *);
49 
50 int nvkm_intr_add(const struct nvkm_intr_func *, const struct nvkm_intr_data *,
51 		  struct nvkm_subdev *, int leaves, struct nvkm_intr *);
52 void nvkm_intr_block(struct nvkm_subdev *, enum nvkm_intr_type);
53 void nvkm_intr_allow(struct nvkm_subdev *, enum nvkm_intr_type);
54 
55 struct nvkm_inth;
56 typedef irqreturn_t (*nvkm_inth_func)(struct nvkm_inth *);
57 
58 struct nvkm_inth {
59 	struct nvkm_intr *intr;
60 	int leaf;
61 	u32 mask;
62 	nvkm_inth_func func;
63 
64 	atomic_t allowed;
65 
66 	struct list_head head;
67 };
68 
69 int nvkm_inth_add(struct nvkm_intr *, enum nvkm_intr_type, enum nvkm_intr_prio,
70 		  struct nvkm_subdev *, nvkm_inth_func, struct nvkm_inth *);
71 void nvkm_inth_allow(struct nvkm_inth *);
72 void nvkm_inth_block(struct nvkm_inth *);
73 #endif
74