1 /* SPDX-License-Identifier: MIT */
2 /*
3  * Copyright © 2022 Intel Corporation
4  */
5 
6 #ifndef _XE_RTP_TYPES_
7 #define _XE_RTP_TYPES_
8 
9 #include <linux/types.h>
10 
11 #include "regs/xe_reg_defs.h"
12 
13 struct xe_hw_engine;
14 struct xe_gt;
15 
16 /**
17  * struct xe_rtp_action - action to take for any matching rule
18  *
19  * This struct records what action should be taken in a register that has a
20  * matching rule. Example of actions: set/clear bits.
21  */
22 struct xe_rtp_action {
23 	/** @reg: Register */
24 	struct xe_reg		reg;
25 	/**
26 	 * @clr_bits: bits to clear when updating register. It's always a
27 	 * superset of bits being modified
28 	 */
29 	u32			clr_bits;
30 	/** @set_bits: bits to set when updating register */
31 	u32			set_bits;
32 #define XE_RTP_NOCHECK		.read_mask = 0
33 	/** @read_mask: mask for bits to consider when reading value back */
34 	u32			read_mask;
35 #define XE_RTP_ACTION_FLAG_ENGINE_BASE		BIT(0)
36 	/** @flags: flags to apply on rule evaluation or action */
37 	u8			flags;
38 };
39 
40 enum {
41 	XE_RTP_MATCH_PLATFORM,
42 	XE_RTP_MATCH_SUBPLATFORM,
43 	XE_RTP_MATCH_GRAPHICS_VERSION,
44 	XE_RTP_MATCH_GRAPHICS_VERSION_RANGE,
45 	XE_RTP_MATCH_GRAPHICS_STEP,
46 	XE_RTP_MATCH_MEDIA_VERSION,
47 	XE_RTP_MATCH_MEDIA_VERSION_RANGE,
48 	XE_RTP_MATCH_MEDIA_STEP,
49 	XE_RTP_MATCH_INTEGRATED,
50 	XE_RTP_MATCH_DISCRETE,
51 	XE_RTP_MATCH_ENGINE_CLASS,
52 	XE_RTP_MATCH_NOT_ENGINE_CLASS,
53 	XE_RTP_MATCH_FUNC,
54 };
55 
56 /** struct xe_rtp_rule - match rule for processing entry */
57 struct xe_rtp_rule {
58 	u8 match_type;
59 
60 	/* match filters */
61 	union {
62 		/* MATCH_PLATFORM / MATCH_SUBPLATFORM */
63 		struct {
64 			u8 platform;
65 			u8 subplatform;
66 		};
67 		/*
68 		 * MATCH_GRAPHICS_VERSION / XE_RTP_MATCH_GRAPHICS_VERSION_RANGE /
69 		 * MATCH_MEDIA_VERSION  / XE_RTP_MATCH_MEDIA_VERSION_RANGE
70 		 */
71 		struct {
72 			u32 ver_start;
73 #define XE_RTP_END_VERSION_UNDEFINED	U32_MAX
74 			u32 ver_end;
75 		};
76 		/* MATCH_STEP */
77 		struct {
78 			u8 step_start;
79 			u8 step_end;
80 		};
81 		/* MATCH_ENGINE_CLASS / MATCH_NOT_ENGINE_CLASS */
82 		struct {
83 			u8 engine_class;
84 		};
85 		/* MATCH_FUNC */
86 		bool (*match_func)(const struct xe_gt *gt,
87 				   const struct xe_hw_engine *hwe);
88 	};
89 };
90 
91 /** struct xe_rtp_entry_sr - Entry in an rtp table */
92 struct xe_rtp_entry_sr {
93 	const char *name;
94 	const struct xe_rtp_action *actions;
95 	const struct xe_rtp_rule *rules;
96 	u8 n_rules;
97 	u8 n_actions;
98 #define XE_RTP_ENTRY_FLAG_FOREACH_ENGINE	BIT(0)
99 	u8 flags;
100 };
101 
102 /** struct xe_rtp_entry - Entry in an rtp table, with no action associated */
103 struct xe_rtp_entry {
104 	const char *name;
105 	const struct xe_rtp_rule *rules;
106 	u8 n_rules;
107 };
108 
109 enum xe_rtp_process_type {
110 	XE_RTP_PROCESS_TYPE_GT,
111 	XE_RTP_PROCESS_TYPE_ENGINE,
112 };
113 
114 struct xe_rtp_process_ctx {
115 	union {
116 		struct xe_gt *gt;
117 		struct xe_hw_engine *hwe;
118 	};
119 	enum xe_rtp_process_type type;
120 	unsigned long *active_entries;
121 	size_t n_entries;
122 };
123 
124 #endif
125