1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright 2014 Advanced Micro Devices, Inc. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Permission is hereby granted, free of charge, to any person obtaining a 5*4882a593Smuzhiyun * copy of this software and associated documentation files (the "Software"), 6*4882a593Smuzhiyun * to deal in the Software without restriction, including without limitation 7*4882a593Smuzhiyun * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*4882a593Smuzhiyun * and/or sell copies of the Software, and to permit persons to whom the 9*4882a593Smuzhiyun * Software is furnished to do so, subject to the following conditions: 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * The above copyright notice and this permission notice shall be included in 12*4882a593Smuzhiyun * all copies or substantial portions of the Software. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15*4882a593Smuzhiyun * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17*4882a593Smuzhiyun * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18*4882a593Smuzhiyun * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19*4882a593Smuzhiyun * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20*4882a593Smuzhiyun * OTHER DEALINGS IN THE SOFTWARE. 21*4882a593Smuzhiyun */ 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #ifndef KFD_DBGDEV_H_ 24*4882a593Smuzhiyun #define KFD_DBGDEV_H_ 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun enum { 27*4882a593Smuzhiyun SQ_CMD_VMID_OFFSET = 28, 28*4882a593Smuzhiyun ADDRESS_WATCH_CNTL_OFFSET = 24 29*4882a593Smuzhiyun }; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun enum { 32*4882a593Smuzhiyun PRIV_QUEUE_SYNC_TIME_MS = 200 33*4882a593Smuzhiyun }; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun /* CONTEXT reg space definition */ 36*4882a593Smuzhiyun enum { 37*4882a593Smuzhiyun CONTEXT_REG_BASE = 0xA000, 38*4882a593Smuzhiyun CONTEXT_REG_END = 0xA400, 39*4882a593Smuzhiyun CONTEXT_REG_SIZE = CONTEXT_REG_END - CONTEXT_REG_BASE 40*4882a593Smuzhiyun }; 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun /* USER CONFIG reg space definition */ 43*4882a593Smuzhiyun enum { 44*4882a593Smuzhiyun USERCONFIG_REG_BASE = 0xC000, 45*4882a593Smuzhiyun USERCONFIG_REG_END = 0x10000, 46*4882a593Smuzhiyun USERCONFIG_REG_SIZE = USERCONFIG_REG_END - USERCONFIG_REG_BASE 47*4882a593Smuzhiyun }; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun /* CONFIG reg space definition */ 50*4882a593Smuzhiyun enum { 51*4882a593Smuzhiyun AMD_CONFIG_REG_BASE = 0x2000, /* in dwords */ 52*4882a593Smuzhiyun AMD_CONFIG_REG_END = 0x2B00, 53*4882a593Smuzhiyun AMD_CONFIG_REG_SIZE = AMD_CONFIG_REG_END - AMD_CONFIG_REG_BASE 54*4882a593Smuzhiyun }; 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun /* SH reg space definition */ 57*4882a593Smuzhiyun enum { 58*4882a593Smuzhiyun SH_REG_BASE = 0x2C00, 59*4882a593Smuzhiyun SH_REG_END = 0x3000, 60*4882a593Smuzhiyun SH_REG_SIZE = SH_REG_END - SH_REG_BASE 61*4882a593Smuzhiyun }; 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /* SQ_CMD definitions */ 64*4882a593Smuzhiyun #define SQ_CMD 0x8DEC 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun enum SQ_IND_CMD_CMD { 67*4882a593Smuzhiyun SQ_IND_CMD_CMD_NULL = 0x00000000, 68*4882a593Smuzhiyun SQ_IND_CMD_CMD_HALT = 0x00000001, 69*4882a593Smuzhiyun SQ_IND_CMD_CMD_RESUME = 0x00000002, 70*4882a593Smuzhiyun SQ_IND_CMD_CMD_KILL = 0x00000003, 71*4882a593Smuzhiyun SQ_IND_CMD_CMD_DEBUG = 0x00000004, 72*4882a593Smuzhiyun SQ_IND_CMD_CMD_TRAP = 0x00000005, 73*4882a593Smuzhiyun }; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun enum SQ_IND_CMD_MODE { 76*4882a593Smuzhiyun SQ_IND_CMD_MODE_SINGLE = 0x00000000, 77*4882a593Smuzhiyun SQ_IND_CMD_MODE_BROADCAST = 0x00000001, 78*4882a593Smuzhiyun SQ_IND_CMD_MODE_BROADCAST_QUEUE = 0x00000002, 79*4882a593Smuzhiyun SQ_IND_CMD_MODE_BROADCAST_PIPE = 0x00000003, 80*4882a593Smuzhiyun SQ_IND_CMD_MODE_BROADCAST_ME = 0x00000004, 81*4882a593Smuzhiyun }; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun union SQ_IND_INDEX_BITS { 84*4882a593Smuzhiyun struct { 85*4882a593Smuzhiyun uint32_t wave_id:4; 86*4882a593Smuzhiyun uint32_t simd_id:2; 87*4882a593Smuzhiyun uint32_t thread_id:6; 88*4882a593Smuzhiyun uint32_t:1; 89*4882a593Smuzhiyun uint32_t force_read:1; 90*4882a593Smuzhiyun uint32_t read_timeout:1; 91*4882a593Smuzhiyun uint32_t unindexed:1; 92*4882a593Smuzhiyun uint32_t index:16; 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun } bitfields, bits; 95*4882a593Smuzhiyun uint32_t u32All; 96*4882a593Smuzhiyun signed int i32All; 97*4882a593Smuzhiyun float f32All; 98*4882a593Smuzhiyun }; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun union SQ_IND_CMD_BITS { 101*4882a593Smuzhiyun struct { 102*4882a593Smuzhiyun uint32_t data:32; 103*4882a593Smuzhiyun } bitfields, bits; 104*4882a593Smuzhiyun uint32_t u32All; 105*4882a593Smuzhiyun signed int i32All; 106*4882a593Smuzhiyun float f32All; 107*4882a593Smuzhiyun }; 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun union SQ_CMD_BITS { 110*4882a593Smuzhiyun struct { 111*4882a593Smuzhiyun uint32_t cmd:3; 112*4882a593Smuzhiyun uint32_t:1; 113*4882a593Smuzhiyun uint32_t mode:3; 114*4882a593Smuzhiyun uint32_t check_vmid:1; 115*4882a593Smuzhiyun uint32_t trap_id:3; 116*4882a593Smuzhiyun uint32_t:5; 117*4882a593Smuzhiyun uint32_t wave_id:4; 118*4882a593Smuzhiyun uint32_t simd_id:2; 119*4882a593Smuzhiyun uint32_t:2; 120*4882a593Smuzhiyun uint32_t queue_id:3; 121*4882a593Smuzhiyun uint32_t:1; 122*4882a593Smuzhiyun uint32_t vm_id:4; 123*4882a593Smuzhiyun } bitfields, bits; 124*4882a593Smuzhiyun uint32_t u32All; 125*4882a593Smuzhiyun signed int i32All; 126*4882a593Smuzhiyun float f32All; 127*4882a593Smuzhiyun }; 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun union SQ_IND_DATA_BITS { 130*4882a593Smuzhiyun struct { 131*4882a593Smuzhiyun uint32_t data:32; 132*4882a593Smuzhiyun } bitfields, bits; 133*4882a593Smuzhiyun uint32_t u32All; 134*4882a593Smuzhiyun signed int i32All; 135*4882a593Smuzhiyun float f32All; 136*4882a593Smuzhiyun }; 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun union GRBM_GFX_INDEX_BITS { 139*4882a593Smuzhiyun struct { 140*4882a593Smuzhiyun uint32_t instance_index:8; 141*4882a593Smuzhiyun uint32_t sh_index:8; 142*4882a593Smuzhiyun uint32_t se_index:8; 143*4882a593Smuzhiyun uint32_t:5; 144*4882a593Smuzhiyun uint32_t sh_broadcast_writes:1; 145*4882a593Smuzhiyun uint32_t instance_broadcast_writes:1; 146*4882a593Smuzhiyun uint32_t se_broadcast_writes:1; 147*4882a593Smuzhiyun } bitfields, bits; 148*4882a593Smuzhiyun uint32_t u32All; 149*4882a593Smuzhiyun signed int i32All; 150*4882a593Smuzhiyun float f32All; 151*4882a593Smuzhiyun }; 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun union TCP_WATCH_ADDR_H_BITS { 154*4882a593Smuzhiyun struct { 155*4882a593Smuzhiyun uint32_t addr:16; 156*4882a593Smuzhiyun uint32_t:16; 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun } bitfields, bits; 159*4882a593Smuzhiyun uint32_t u32All; 160*4882a593Smuzhiyun signed int i32All; 161*4882a593Smuzhiyun float f32All; 162*4882a593Smuzhiyun }; 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun union TCP_WATCH_ADDR_L_BITS { 165*4882a593Smuzhiyun struct { 166*4882a593Smuzhiyun uint32_t:6; 167*4882a593Smuzhiyun uint32_t addr:26; 168*4882a593Smuzhiyun } bitfields, bits; 169*4882a593Smuzhiyun uint32_t u32All; 170*4882a593Smuzhiyun signed int i32All; 171*4882a593Smuzhiyun float f32All; 172*4882a593Smuzhiyun }; 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun enum { 175*4882a593Smuzhiyun QUEUESTATE__INVALID = 0, /* so by default we'll get invalid state */ 176*4882a593Smuzhiyun QUEUESTATE__ACTIVE_COMPLETION_PENDING, 177*4882a593Smuzhiyun QUEUESTATE__ACTIVE 178*4882a593Smuzhiyun }; 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun union ULARGE_INTEGER { 181*4882a593Smuzhiyun struct { 182*4882a593Smuzhiyun uint32_t low_part; 183*4882a593Smuzhiyun uint32_t high_part; 184*4882a593Smuzhiyun } u; 185*4882a593Smuzhiyun unsigned long long quad_part; 186*4882a593Smuzhiyun }; 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun #define KFD_CIK_VMID_START_OFFSET (8) 190*4882a593Smuzhiyun #define KFD_CIK_VMID_END_OFFSET (KFD_CIK_VMID_START_OFFSET + (8)) 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun void kfd_dbgdev_init(struct kfd_dbgdev *pdbgdev, struct kfd_dev *pdev, 194*4882a593Smuzhiyun enum DBGDEV_TYPE type); 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun union TCP_WATCH_CNTL_BITS { 197*4882a593Smuzhiyun struct { 198*4882a593Smuzhiyun uint32_t mask:24; 199*4882a593Smuzhiyun uint32_t vmid:4; 200*4882a593Smuzhiyun uint32_t atc:1; 201*4882a593Smuzhiyun uint32_t mode:2; 202*4882a593Smuzhiyun uint32_t valid:1; 203*4882a593Smuzhiyun } bitfields, bits; 204*4882a593Smuzhiyun uint32_t u32All; 205*4882a593Smuzhiyun signed int i32All; 206*4882a593Smuzhiyun float f32All; 207*4882a593Smuzhiyun }; 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun enum { 210*4882a593Smuzhiyun ADDRESS_WATCH_REG_CNTL_ATC_BIT = 0x10000000UL, 211*4882a593Smuzhiyun ADDRESS_WATCH_REG_CNTL_DEFAULT_MASK = 0x00FFFFFF, 212*4882a593Smuzhiyun ADDRESS_WATCH_REG_ADDLOW_MASK_EXTENSION = 0x03000000, 213*4882a593Smuzhiyun /* extend the mask to 26 bits in order to match the low address field */ 214*4882a593Smuzhiyun ADDRESS_WATCH_REG_ADDLOW_SHIFT = 6, 215*4882a593Smuzhiyun ADDRESS_WATCH_REG_ADDHIGH_MASK = 0xFFFF 216*4882a593Smuzhiyun }; 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun enum { 219*4882a593Smuzhiyun MAX_TRAPID = 8, /* 3 bits in the bitfield. */ 220*4882a593Smuzhiyun MAX_WATCH_ADDRESSES = 4 221*4882a593Smuzhiyun }; 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun enum { 224*4882a593Smuzhiyun ADDRESS_WATCH_REG_ADDR_HI = 0, 225*4882a593Smuzhiyun ADDRESS_WATCH_REG_ADDR_LO, 226*4882a593Smuzhiyun ADDRESS_WATCH_REG_CNTL, 227*4882a593Smuzhiyun ADDRESS_WATCH_REG_MAX 228*4882a593Smuzhiyun }; 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun #endif /* KFD_DBGDEV_H_ */ 231