1 /* 2 * Copyright (C) 2014 LunarG, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included 12 * in all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 19 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 20 * DEALINGS IN THE SOFTWARE. 21 */ 22 23 #ifndef GENHW_H 24 #define GENHW_H 25 26 #include <stdbool.h> 27 #include <stdint.h> 28 #include <assert.h> 29 30 #include "gen_regs.xml.h" 31 #include "gen_mi.xml.h" 32 #include "gen_blitter.xml.h" 33 #include "gen_render.xml.h" 34 #include "gen_render_surface.xml.h" 35 #include "gen_render_dynamic.xml.h" 36 #include "gen_render_3d.xml.h" 37 #include "gen_render_media.xml.h" 38 #include "gen_eu_isa.xml.h" 39 #include "gen_eu_message.xml.h" 40 41 #define GEN_MI_CMD(gen, op) (GEN6_MI_TYPE_MI | gen ## _MI_OPCODE_ ## op) 42 #define GEN6_MI_CMD(op) GEN_MI_CMD(GEN6, op) 43 #define GEN7_MI_CMD(op) GEN_MI_CMD(GEN7, op) 44 45 #define GEN_BLITTER_CMD(gen, op) \ 46 (GEN6_BLITTER_TYPE_BLITTER | gen ## _BLITTER_OPCODE_ ## op) 47 #define GEN6_BLITTER_CMD(op) GEN_BLITTER_CMD(GEN6, op) 48 49 #define GEN_RENDER_CMD(subtype, gen, op) \ 50 (GEN6_RENDER_TYPE_RENDER | \ 51 GEN6_RENDER_SUBTYPE_ ## subtype | \ 52 gen ## _RENDER_OPCODE_ ## op) 53 #define GEN6_RENDER_CMD(subtype, op) GEN_RENDER_CMD(subtype, GEN6, op) 54 #define GEN7_RENDER_CMD(subtype, op) GEN_RENDER_CMD(subtype, GEN7, op) 55 #define GEN75_RENDER_CMD(subtype, op) GEN_RENDER_CMD(subtype, GEN75, op) 56 #define GEN8_RENDER_CMD(subtype, op) GEN_RENDER_CMD(subtype, GEN8, op) 57 58 #define GEN_EXTRACT(bits, field) (((bits) & field ## __MASK) >> field ## __SHIFT) 59 #define GEN_SHIFT32(bits, field) gen_shift32(bits, field ## __MASK, field ## __SHIFT) 60 61 static inline uint32_t 62 gen_shift32(uint32_t bits, uint32_t mask, int shift) 63 { 64 bits <<= shift; 65 66 assert((bits & mask) == bits); 67 return bits & mask; 68 } 69 70 static inline bool 71 gen_is_snb(int devid) 72 { 73 return (devid == 0x0102 || /* GT1 desktop */ 74 devid == 0x0112 || /* GT2 desktop */ 75 devid == 0x0122 || /* GT2_PLUS desktop */ 76 devid == 0x0106 || /* GT1 mobile */ 77 devid == 0x0116 || /* GT2 mobile */ 78 devid == 0x0126 || /* GT2_PLUS mobile */ 79 devid == 0x010a); /* GT1 server */ 80 } 81 82 static inline int 83 gen_get_snb_gt(int devid) 84 { 85 assert(gen_is_snb(devid)); 86 return (devid & 0x30) ? 2 : 1; 87 } 88 89 static inline bool 90 gen_is_ivb(int devid) 91 { 92 return (devid == 0x0152 || /* GT1 desktop */ 93 devid == 0x0162 || /* GT2 desktop */ 94 devid == 0x0156 || /* GT1 mobile */ 95 devid == 0x0166 || /* GT2 mobile */ 96 devid == 0x015a || /* GT1 server */ 97 devid == 0x016a); /* GT2 server */ 98 } 99 100 static inline int 101 gen_get_ivb_gt(int devid) 102 { 103 assert(gen_is_ivb(devid)); 104 return (devid & 0x30) >> 4; 105 } 106 107 static inline bool 108 gen_is_hsw(int devid) 109 { 110 return (devid == 0x0402 || /* GT1 desktop */ 111 devid == 0x0412 || /* GT2 desktop */ 112 devid == 0x0422 || /* GT3 desktop */ 113 devid == 0x0406 || /* GT1 mobile */ 114 devid == 0x0416 || /* GT2 mobile */ 115 devid == 0x0426 || /* GT2 mobile */ 116 devid == 0x040a || /* GT1 server */ 117 devid == 0x041a || /* GT2 server */ 118 devid == 0x042a || /* GT3 server */ 119 devid == 0x040b || /* GT1 reserved */ 120 devid == 0x041b || /* GT2 reserved */ 121 devid == 0x042b || /* GT3 reserved */ 122 devid == 0x040e || /* GT1 reserved */ 123 devid == 0x041e || /* GT2 reserved */ 124 devid == 0x042e || /* GT3 reserved */ 125 devid == 0x0c02 || /* SDV */ 126 devid == 0x0c12 || 127 devid == 0x0c22 || 128 devid == 0x0c06 || 129 devid == 0x0c16 || 130 devid == 0x0c26 || 131 devid == 0x0c0a || 132 devid == 0x0c1a || 133 devid == 0x0c2a || 134 devid == 0x0c0b || 135 devid == 0x0c1b || 136 devid == 0x0c2b || 137 devid == 0x0c0e || 138 devid == 0x0c1e || 139 devid == 0x0c2e || 140 devid == 0x0a02 || /* ULT */ 141 devid == 0x0a12 || 142 devid == 0x0a22 || 143 devid == 0x0a06 || 144 devid == 0x0a16 || 145 devid == 0x0a26 || 146 devid == 0x0a0a || 147 devid == 0x0a1a || 148 devid == 0x0a2a || 149 devid == 0x0a0b || 150 devid == 0x0a1b || 151 devid == 0x0a2b || 152 devid == 0x0a0e || 153 devid == 0x0a1e || 154 devid == 0x0a2e || 155 devid == 0x0d02 || /* CRW */ 156 devid == 0x0d12 || 157 devid == 0x0d22 || 158 devid == 0x0d06 || 159 devid == 0x0d16 || 160 devid == 0x0d26 || 161 devid == 0x0d0a || 162 devid == 0x0d1a || 163 devid == 0x0d2a || 164 devid == 0x0d0b || 165 devid == 0x0d1b || 166 devid == 0x0d2b || 167 devid == 0x0d0e || 168 devid == 0x0d1e || 169 devid == 0x0d2e); 170 } 171 172 static inline int 173 gen_get_hsw_gt(int devid) 174 { 175 assert(gen_is_hsw(devid)); 176 return ((devid & 0x30) >> 4) + 1; 177 } 178 179 static inline bool 180 gen_is_bdw(int devid) 181 { 182 return (devid == 0x1602 || /* GT1 ULT */ 183 devid == 0x1606 || /* GT1 ULT */ 184 devid == 0x160a || /* GT1 server */ 185 devid == 0x160b || /* GT1 Iris */ 186 devid == 0x160d || /* GT1 workstation */ 187 devid == 0x160e || /* GT1 ULX */ 188 devid == 0x1612 || /* GT2 */ 189 devid == 0x1616 || 190 devid == 0x161a || 191 devid == 0x161b || 192 devid == 0x161d || 193 devid == 0x161e || 194 devid == 0x1622 || /* GT3 */ 195 devid == 0x1626 || 196 devid == 0x162a || 197 devid == 0x162b || 198 devid == 0x162d || 199 devid == 0x162e); 200 } 201 202 static inline int 203 gen_get_bdw_gt(int devid) 204 { 205 assert(gen_is_bdw(devid)); 206 return ((devid & 0x30) >> 4) + 1; 207 } 208 209 static inline bool 210 gen_is_vlv(int devid) 211 { 212 return (devid == 0x0f30 || 213 devid == 0x0f31 || 214 devid == 0x0f32 || 215 devid == 0x0f33 || 216 devid == 0x0157 || 217 devid == 0x0155); 218 } 219 220 static inline bool 221 gen_is_chv(int devid) 222 { 223 return (devid == 0x22b0 || 224 devid == 0x22b1 || 225 devid == 0x22b2 || 226 devid == 0x22b3); 227 } 228 229 static inline bool 230 gen_is_atom(int devid) 231 { 232 return (gen_is_vlv(devid) || 233 gen_is_chv(devid)); 234 } 235 236 static inline bool 237 gen_is_desktop(int devid) 238 { 239 assert(!gen_is_atom(devid)); 240 return ((devid & 0xf) == 0x2); 241 } 242 243 static inline bool 244 gen_is_mobile(int devid) 245 { 246 assert(!gen_is_atom(devid)); 247 return ((devid & 0xf) == 0x6); 248 } 249 250 static inline bool 251 gen_is_server(int devid) 252 { 253 assert(!gen_is_atom(devid)); 254 return ((devid & 0xf) == 0xa); 255 } 256 257 #endif /* GENHW_H */ 258