1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright (C) 2021 Collabora Ltd.
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker *
11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker * Software.
14*61046927SAndroid Build Coastguard Worker *
15*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20*61046927SAndroid Build Coastguard Worker * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21*61046927SAndroid Build Coastguard Worker * SOFTWARE.
22*61046927SAndroid Build Coastguard Worker *
23*61046927SAndroid Build Coastguard Worker * Authors (Collabora):
24*61046927SAndroid Build Coastguard Worker * Alyssa Rosenzweig <[email protected]>
25*61046927SAndroid Build Coastguard Worker */
26*61046927SAndroid Build Coastguard Worker
27*61046927SAndroid Build Coastguard Worker #ifndef __VALHALL_H
28*61046927SAndroid Build Coastguard Worker #define __VALHALL_H
29*61046927SAndroid Build Coastguard Worker
30*61046927SAndroid Build Coastguard Worker #include <stdint.h>
31*61046927SAndroid Build Coastguard Worker #include "bi_opcodes.h"
32*61046927SAndroid Build Coastguard Worker #include "valhall_enums.h"
33*61046927SAndroid Build Coastguard Worker
34*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
35*61046927SAndroid Build Coastguard Worker extern "C" {
36*61046927SAndroid Build Coastguard Worker #endif
37*61046927SAndroid Build Coastguard Worker
38*61046927SAndroid Build Coastguard Worker #define VA_NUM_GENERAL_SLOTS 3
39*61046927SAndroid Build Coastguard Worker
40*61046927SAndroid Build Coastguard Worker extern const uint32_t valhall_immediates[32];
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Worker enum va_size {
43*61046927SAndroid Build Coastguard Worker VA_SIZE_8 = 0,
44*61046927SAndroid Build Coastguard Worker VA_SIZE_16 = 1,
45*61046927SAndroid Build Coastguard Worker VA_SIZE_32 = 2,
46*61046927SAndroid Build Coastguard Worker VA_SIZE_64 = 3,
47*61046927SAndroid Build Coastguard Worker };
48*61046927SAndroid Build Coastguard Worker
49*61046927SAndroid Build Coastguard Worker enum va_unit {
50*61046927SAndroid Build Coastguard Worker /** Fused floating-point multiply-add */
51*61046927SAndroid Build Coastguard Worker VA_UNIT_FMA = 0,
52*61046927SAndroid Build Coastguard Worker
53*61046927SAndroid Build Coastguard Worker /** Type conversion and basic arithmetic */
54*61046927SAndroid Build Coastguard Worker VA_UNIT_CVT = 1,
55*61046927SAndroid Build Coastguard Worker
56*61046927SAndroid Build Coastguard Worker /** Special function unit */
57*61046927SAndroid Build Coastguard Worker VA_UNIT_SFU = 2,
58*61046927SAndroid Build Coastguard Worker
59*61046927SAndroid Build Coastguard Worker /** Varying */
60*61046927SAndroid Build Coastguard Worker VA_UNIT_V = 3,
61*61046927SAndroid Build Coastguard Worker
62*61046927SAndroid Build Coastguard Worker /** General load/store */
63*61046927SAndroid Build Coastguard Worker VA_UNIT_LS = 4,
64*61046927SAndroid Build Coastguard Worker
65*61046927SAndroid Build Coastguard Worker /** Texture */
66*61046927SAndroid Build Coastguard Worker VA_UNIT_T = 5,
67*61046927SAndroid Build Coastguard Worker
68*61046927SAndroid Build Coastguard Worker /** Fused varying and texture */
69*61046927SAndroid Build Coastguard Worker VA_UNIT_VT = 6,
70*61046927SAndroid Build Coastguard Worker
71*61046927SAndroid Build Coastguard Worker /** Produces a message for a unit not otherwise specified */
72*61046927SAndroid Build Coastguard Worker VA_UNIT_NONE = 7
73*61046927SAndroid Build Coastguard Worker };
74*61046927SAndroid Build Coastguard Worker
75*61046927SAndroid Build Coastguard Worker struct va_src_info {
76*61046927SAndroid Build Coastguard Worker bool absneg : 1;
77*61046927SAndroid Build Coastguard Worker bool swizzle : 1;
78*61046927SAndroid Build Coastguard Worker bool notted : 1;
79*61046927SAndroid Build Coastguard Worker bool lane : 1;
80*61046927SAndroid Build Coastguard Worker bool lanes : 1;
81*61046927SAndroid Build Coastguard Worker bool halfswizzle : 1;
82*61046927SAndroid Build Coastguard Worker bool widen : 1;
83*61046927SAndroid Build Coastguard Worker bool combine : 1;
84*61046927SAndroid Build Coastguard Worker enum va_size size : 2;
85*61046927SAndroid Build Coastguard Worker } __attribute__((packed));
86*61046927SAndroid Build Coastguard Worker
87*61046927SAndroid Build Coastguard Worker struct va_opcode_info {
88*61046927SAndroid Build Coastguard Worker uint64_t exact;
89*61046927SAndroid Build Coastguard Worker struct va_src_info srcs[4];
90*61046927SAndroid Build Coastguard Worker uint8_t type_size : 8;
91*61046927SAndroid Build Coastguard Worker enum va_unit unit : 3;
92*61046927SAndroid Build Coastguard Worker unsigned nr_srcs : 3;
93*61046927SAndroid Build Coastguard Worker unsigned nr_staging_srcs : 2;
94*61046927SAndroid Build Coastguard Worker unsigned nr_staging_dests : 2;
95*61046927SAndroid Build Coastguard Worker bool has_dest : 1;
96*61046927SAndroid Build Coastguard Worker bool is_signed : 1;
97*61046927SAndroid Build Coastguard Worker bool clamp : 1;
98*61046927SAndroid Build Coastguard Worker bool saturate : 1;
99*61046927SAndroid Build Coastguard Worker bool rhadd : 1;
100*61046927SAndroid Build Coastguard Worker bool round_mode : 1;
101*61046927SAndroid Build Coastguard Worker bool condition : 1;
102*61046927SAndroid Build Coastguard Worker bool result_type : 1;
103*61046927SAndroid Build Coastguard Worker bool vecsize : 1;
104*61046927SAndroid Build Coastguard Worker bool register_format : 1;
105*61046927SAndroid Build Coastguard Worker bool slot : 1;
106*61046927SAndroid Build Coastguard Worker bool sr_count : 1;
107*61046927SAndroid Build Coastguard Worker bool sr_write_count : 1;
108*61046927SAndroid Build Coastguard Worker unsigned sr_control : 2;
109*61046927SAndroid Build Coastguard Worker };
110*61046927SAndroid Build Coastguard Worker
111*61046927SAndroid Build Coastguard Worker extern const struct va_opcode_info valhall_opcodes[BI_NUM_OPCODES];
112*61046927SAndroid Build Coastguard Worker
113*61046927SAndroid Build Coastguard Worker /* Bifrost specifies the source of bitwise operations as (A, B, shift), but
114*61046927SAndroid Build Coastguard Worker * Valhall specifies (A, shift, B). We follow Bifrost conventions in the
115*61046927SAndroid Build Coastguard Worker * compiler, so normalize.
116*61046927SAndroid Build Coastguard Worker *
117*61046927SAndroid Build Coastguard Worker * Bifrost specifies BLEND as staging + (coverage, blend descriptor), but
118*61046927SAndroid Build Coastguard Worker * Valhall specifies staging + (blend descriptor, coverage). Given we put
119*61046927SAndroid Build Coastguard Worker * staging sources first, this works out to the same swap as bitwise ops.
120*61046927SAndroid Build Coastguard Worker */
121*61046927SAndroid Build Coastguard Worker
122*61046927SAndroid Build Coastguard Worker static inline bool
va_swap_12(enum bi_opcode op)123*61046927SAndroid Build Coastguard Worker va_swap_12(enum bi_opcode op)
124*61046927SAndroid Build Coastguard Worker {
125*61046927SAndroid Build Coastguard Worker switch (op) {
126*61046927SAndroid Build Coastguard Worker case BI_OPCODE_BLEND:
127*61046927SAndroid Build Coastguard Worker case BI_OPCODE_LSHIFT_AND_I32:
128*61046927SAndroid Build Coastguard Worker case BI_OPCODE_LSHIFT_AND_V2I16:
129*61046927SAndroid Build Coastguard Worker case BI_OPCODE_LSHIFT_AND_V4I8:
130*61046927SAndroid Build Coastguard Worker case BI_OPCODE_LSHIFT_OR_I32:
131*61046927SAndroid Build Coastguard Worker case BI_OPCODE_LSHIFT_OR_V2I16:
132*61046927SAndroid Build Coastguard Worker case BI_OPCODE_LSHIFT_OR_V4I8:
133*61046927SAndroid Build Coastguard Worker case BI_OPCODE_LSHIFT_XOR_I32:
134*61046927SAndroid Build Coastguard Worker case BI_OPCODE_LSHIFT_XOR_V2I16:
135*61046927SAndroid Build Coastguard Worker case BI_OPCODE_LSHIFT_XOR_V4I8:
136*61046927SAndroid Build Coastguard Worker case BI_OPCODE_RSHIFT_AND_I32:
137*61046927SAndroid Build Coastguard Worker case BI_OPCODE_RSHIFT_AND_V2I16:
138*61046927SAndroid Build Coastguard Worker case BI_OPCODE_RSHIFT_AND_V4I8:
139*61046927SAndroid Build Coastguard Worker case BI_OPCODE_RSHIFT_OR_I32:
140*61046927SAndroid Build Coastguard Worker case BI_OPCODE_RSHIFT_OR_V2I16:
141*61046927SAndroid Build Coastguard Worker case BI_OPCODE_RSHIFT_OR_V4I8:
142*61046927SAndroid Build Coastguard Worker case BI_OPCODE_RSHIFT_XOR_I32:
143*61046927SAndroid Build Coastguard Worker case BI_OPCODE_RSHIFT_XOR_V2I16:
144*61046927SAndroid Build Coastguard Worker case BI_OPCODE_RSHIFT_XOR_V4I8:
145*61046927SAndroid Build Coastguard Worker return true;
146*61046927SAndroid Build Coastguard Worker default:
147*61046927SAndroid Build Coastguard Worker return false;
148*61046927SAndroid Build Coastguard Worker }
149*61046927SAndroid Build Coastguard Worker }
150*61046927SAndroid Build Coastguard Worker
151*61046927SAndroid Build Coastguard Worker static inline struct va_src_info
va_src_info(enum bi_opcode op,unsigned src)152*61046927SAndroid Build Coastguard Worker va_src_info(enum bi_opcode op, unsigned src)
153*61046927SAndroid Build Coastguard Worker {
154*61046927SAndroid Build Coastguard Worker unsigned idx = (va_swap_12(op) && (src == 1 || src == 2)) ? (3 - src) : src;
155*61046927SAndroid Build Coastguard Worker return valhall_opcodes[op].srcs[idx];
156*61046927SAndroid Build Coastguard Worker }
157*61046927SAndroid Build Coastguard Worker
158*61046927SAndroid Build Coastguard Worker static inline bool
va_flow_is_wait_or_none(enum va_flow flow)159*61046927SAndroid Build Coastguard Worker va_flow_is_wait_or_none(enum va_flow flow)
160*61046927SAndroid Build Coastguard Worker {
161*61046927SAndroid Build Coastguard Worker return (flow <= VA_FLOW_WAIT);
162*61046927SAndroid Build Coastguard Worker }
163*61046927SAndroid Build Coastguard Worker
164*61046927SAndroid Build Coastguard Worker static inline bool
va_is_valid_const_table(unsigned table)165*61046927SAndroid Build Coastguard Worker va_is_valid_const_table(unsigned table)
166*61046927SAndroid Build Coastguard Worker {
167*61046927SAndroid Build Coastguard Worker return (table >= 0 && table <= 11) || (table >= 60 && table <= 63);
168*61046927SAndroid Build Coastguard Worker }
169*61046927SAndroid Build Coastguard Worker
170*61046927SAndroid Build Coastguard Worker static inline uint32_t
va_res_fold_table_idx(uint32_t table)171*61046927SAndroid Build Coastguard Worker va_res_fold_table_idx(uint32_t table)
172*61046927SAndroid Build Coastguard Worker {
173*61046927SAndroid Build Coastguard Worker switch (table) {
174*61046927SAndroid Build Coastguard Worker case 0 ... 11:
175*61046927SAndroid Build Coastguard Worker return table;
176*61046927SAndroid Build Coastguard Worker case 60 ... 63:
177*61046927SAndroid Build Coastguard Worker return table + 12 - 60;
178*61046927SAndroid Build Coastguard Worker default:
179*61046927SAndroid Build Coastguard Worker assert(!"Can't pack table");
180*61046927SAndroid Build Coastguard Worker return 0;
181*61046927SAndroid Build Coastguard Worker }
182*61046927SAndroid Build Coastguard Worker }
183*61046927SAndroid Build Coastguard Worker
184*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
185*61046927SAndroid Build Coastguard Worker } /* extern C */
186*61046927SAndroid Build Coastguard Worker #endif
187*61046927SAndroid Build Coastguard Worker
188*61046927SAndroid Build Coastguard Worker #endif
189