1fb4d8502Sjsg /* 2fb4d8502Sjsg * Copyright 2016 Advanced Micro Devices, Inc. 3fb4d8502Sjsg * 4fb4d8502Sjsg * Permission is hereby granted, free of charge, to any person obtaining a 5fb4d8502Sjsg * copy of this software and associated documentation files (the "Software"), 6fb4d8502Sjsg * to deal in the Software without restriction, including without limitation 7fb4d8502Sjsg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8fb4d8502Sjsg * and/or sell copies of the Software, and to permit persons to whom the 9fb4d8502Sjsg * Software is furnished to do so, subject to the following conditions: 10fb4d8502Sjsg * 11fb4d8502Sjsg * The above copyright notice and this permission notice shall be included in 12fb4d8502Sjsg * all copies or substantial portions of the Software. 13fb4d8502Sjsg * 14fb4d8502Sjsg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15fb4d8502Sjsg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16fb4d8502Sjsg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17fb4d8502Sjsg * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18fb4d8502Sjsg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19fb4d8502Sjsg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20fb4d8502Sjsg * OTHER DEALINGS IN THE SOFTWARE. 21fb4d8502Sjsg * 22fb4d8502Sjsg * Authors: AMD 23fb4d8502Sjsg */ 24fb4d8502Sjsg 25fb4d8502Sjsg #ifndef DRIVERS_GPU_DRM_AMD_DC_DEV_DC_INC_REG_HELPER_H_ 26fb4d8502Sjsg #define DRIVERS_GPU_DRM_AMD_DC_DEV_DC_INC_REG_HELPER_H_ 27fb4d8502Sjsg 28fb4d8502Sjsg #include "dm_services.h" 29fb4d8502Sjsg 30fb4d8502Sjsg /* macro for register read/write 31fb4d8502Sjsg * user of macro need to define 32fb4d8502Sjsg * 33fb4d8502Sjsg * CTX ==> macro to ptr to dc_context 34fb4d8502Sjsg * eg. aud110->base.ctx 35fb4d8502Sjsg * 36fb4d8502Sjsg * REG ==> macro to location of register offset 37fb4d8502Sjsg * eg. aud110->regs->reg 38fb4d8502Sjsg */ 39fb4d8502Sjsg #define REG_READ(reg_name) \ 40fb4d8502Sjsg dm_read_reg(CTX, REG(reg_name)) 41fb4d8502Sjsg 42fb4d8502Sjsg #define REG_WRITE(reg_name, value) \ 43fb4d8502Sjsg dm_write_reg(CTX, REG(reg_name), value) 44fb4d8502Sjsg 45fb4d8502Sjsg #ifdef REG_SET 46fb4d8502Sjsg #undef REG_SET 47fb4d8502Sjsg #endif 48fb4d8502Sjsg 49fb4d8502Sjsg #ifdef REG_GET 50fb4d8502Sjsg #undef REG_GET 51fb4d8502Sjsg #endif 52fb4d8502Sjsg 53fb4d8502Sjsg /* macro to set register fields. */ 54fb4d8502Sjsg #define REG_SET_N(reg_name, n, initial_val, ...) \ 55c349dbc7Sjsg generic_reg_set_ex(CTX, \ 56fb4d8502Sjsg REG(reg_name), \ 57fb4d8502Sjsg initial_val, \ 58fb4d8502Sjsg n, __VA_ARGS__) 59fb4d8502Sjsg 60fb4d8502Sjsg #define FN(reg_name, field) \ 61fb4d8502Sjsg FD(reg_name##__##field) 62fb4d8502Sjsg 63fb4d8502Sjsg #define REG_SET(reg_name, initial_val, field, val) \ 64fb4d8502Sjsg REG_SET_N(reg_name, 1, initial_val, \ 65fb4d8502Sjsg FN(reg_name, field), val) 66fb4d8502Sjsg 67fb4d8502Sjsg #define REG_SET_2(reg, init_value, f1, v1, f2, v2) \ 68fb4d8502Sjsg REG_SET_N(reg, 2, init_value, \ 69fb4d8502Sjsg FN(reg, f1), v1,\ 70fb4d8502Sjsg FN(reg, f2), v2) 71fb4d8502Sjsg 72fb4d8502Sjsg #define REG_SET_3(reg, init_value, f1, v1, f2, v2, f3, v3) \ 73fb4d8502Sjsg REG_SET_N(reg, 3, init_value, \ 74fb4d8502Sjsg FN(reg, f1), v1,\ 75fb4d8502Sjsg FN(reg, f2), v2,\ 76fb4d8502Sjsg FN(reg, f3), v3) 77fb4d8502Sjsg 78fb4d8502Sjsg #define REG_SET_4(reg, init_value, f1, v1, f2, v2, f3, v3, f4, v4) \ 79fb4d8502Sjsg REG_SET_N(reg, 4, init_value, \ 80fb4d8502Sjsg FN(reg, f1), v1,\ 81fb4d8502Sjsg FN(reg, f2), v2,\ 82fb4d8502Sjsg FN(reg, f3), v3,\ 83fb4d8502Sjsg FN(reg, f4), v4) 84fb4d8502Sjsg 85fb4d8502Sjsg #define REG_SET_5(reg, init_value, f1, v1, f2, v2, f3, v3, f4, v4, \ 86fb4d8502Sjsg f5, v5) \ 87fb4d8502Sjsg REG_SET_N(reg, 5, init_value, \ 88fb4d8502Sjsg FN(reg, f1), v1,\ 89fb4d8502Sjsg FN(reg, f2), v2,\ 90fb4d8502Sjsg FN(reg, f3), v3,\ 91fb4d8502Sjsg FN(reg, f4), v4,\ 92fb4d8502Sjsg FN(reg, f5), v5) 93fb4d8502Sjsg 94fb4d8502Sjsg #define REG_SET_6(reg, init_value, f1, v1, f2, v2, f3, v3, f4, v4, \ 95fb4d8502Sjsg f5, v5, f6, v6) \ 96fb4d8502Sjsg REG_SET_N(reg, 6, init_value, \ 97fb4d8502Sjsg FN(reg, f1), v1,\ 98fb4d8502Sjsg FN(reg, f2), v2,\ 99fb4d8502Sjsg FN(reg, f3), v3,\ 100fb4d8502Sjsg FN(reg, f4), v4,\ 101fb4d8502Sjsg FN(reg, f5), v5,\ 102fb4d8502Sjsg FN(reg, f6), v6) 103fb4d8502Sjsg 104fb4d8502Sjsg #define REG_SET_7(reg, init_value, f1, v1, f2, v2, f3, v3, f4, v4, \ 105fb4d8502Sjsg f5, v5, f6, v6, f7, v7) \ 106fb4d8502Sjsg REG_SET_N(reg, 7, init_value, \ 107fb4d8502Sjsg FN(reg, f1), v1,\ 108fb4d8502Sjsg FN(reg, f2), v2,\ 109fb4d8502Sjsg FN(reg, f3), v3,\ 110fb4d8502Sjsg FN(reg, f4), v4,\ 111fb4d8502Sjsg FN(reg, f5), v5,\ 112fb4d8502Sjsg FN(reg, f6), v6,\ 113fb4d8502Sjsg FN(reg, f7), v7) 114fb4d8502Sjsg 115fb4d8502Sjsg #define REG_SET_8(reg, init_value, f1, v1, f2, v2, f3, v3, f4, v4, \ 116fb4d8502Sjsg f5, v5, f6, v6, f7, v7, f8, v8) \ 117fb4d8502Sjsg REG_SET_N(reg, 8, init_value, \ 118fb4d8502Sjsg FN(reg, f1), v1,\ 119fb4d8502Sjsg FN(reg, f2), v2,\ 120fb4d8502Sjsg FN(reg, f3), v3,\ 121fb4d8502Sjsg FN(reg, f4), v4,\ 122fb4d8502Sjsg FN(reg, f5), v5,\ 123fb4d8502Sjsg FN(reg, f6), v6,\ 124fb4d8502Sjsg FN(reg, f7), v7,\ 125fb4d8502Sjsg FN(reg, f8), v8) 126fb4d8502Sjsg 127fb4d8502Sjsg #define REG_SET_9(reg, init_value, f1, v1, f2, v2, f3, v3, f4, v4, f5, \ 128fb4d8502Sjsg v5, f6, v6, f7, v7, f8, v8, f9, v9) \ 129fb4d8502Sjsg REG_SET_N(reg, 9, init_value, \ 130fb4d8502Sjsg FN(reg, f1), v1,\ 131fb4d8502Sjsg FN(reg, f2), v2, \ 132fb4d8502Sjsg FN(reg, f3), v3, \ 133fb4d8502Sjsg FN(reg, f4), v4, \ 134fb4d8502Sjsg FN(reg, f5), v5, \ 135fb4d8502Sjsg FN(reg, f6), v6, \ 136fb4d8502Sjsg FN(reg, f7), v7, \ 137fb4d8502Sjsg FN(reg, f8), v8, \ 138fb4d8502Sjsg FN(reg, f9), v9) 139fb4d8502Sjsg 140fb4d8502Sjsg #define REG_SET_10(reg, init_value, f1, v1, f2, v2, f3, v3, f4, v4, f5, \ 141fb4d8502Sjsg v5, f6, v6, f7, v7, f8, v8, f9, v9, f10, v10) \ 142fb4d8502Sjsg REG_SET_N(reg, 10, init_value, \ 143fb4d8502Sjsg FN(reg, f1), v1,\ 144fb4d8502Sjsg FN(reg, f2), v2, \ 145fb4d8502Sjsg FN(reg, f3), v3, \ 146fb4d8502Sjsg FN(reg, f4), v4, \ 147fb4d8502Sjsg FN(reg, f5), v5, \ 148fb4d8502Sjsg FN(reg, f6), v6, \ 149fb4d8502Sjsg FN(reg, f7), v7, \ 150fb4d8502Sjsg FN(reg, f8), v8, \ 151fb4d8502Sjsg FN(reg, f9), v9, \ 152fb4d8502Sjsg FN(reg, f10), v10) 153fb4d8502Sjsg 154fb4d8502Sjsg /* macro to get register fields 155fb4d8502Sjsg * read given register and fill in field value in output parameter */ 156fb4d8502Sjsg #define REG_GET(reg_name, field, val) \ 157fb4d8502Sjsg generic_reg_get(CTX, REG(reg_name), \ 158fb4d8502Sjsg FN(reg_name, field), val) 159fb4d8502Sjsg 160fb4d8502Sjsg #define REG_GET_2(reg_name, f1, v1, f2, v2) \ 161fb4d8502Sjsg generic_reg_get2(CTX, REG(reg_name), \ 162fb4d8502Sjsg FN(reg_name, f1), v1, \ 163fb4d8502Sjsg FN(reg_name, f2), v2) 164fb4d8502Sjsg 165fb4d8502Sjsg #define REG_GET_3(reg_name, f1, v1, f2, v2, f3, v3) \ 166fb4d8502Sjsg generic_reg_get3(CTX, REG(reg_name), \ 167fb4d8502Sjsg FN(reg_name, f1), v1, \ 168fb4d8502Sjsg FN(reg_name, f2), v2, \ 169fb4d8502Sjsg FN(reg_name, f3), v3) 170fb4d8502Sjsg 171fb4d8502Sjsg #define REG_GET_4(reg_name, f1, v1, f2, v2, f3, v3, f4, v4) \ 172fb4d8502Sjsg generic_reg_get4(CTX, REG(reg_name), \ 173fb4d8502Sjsg FN(reg_name, f1), v1, \ 174fb4d8502Sjsg FN(reg_name, f2), v2, \ 175fb4d8502Sjsg FN(reg_name, f3), v3, \ 176fb4d8502Sjsg FN(reg_name, f4), v4) 177fb4d8502Sjsg 178fb4d8502Sjsg #define REG_GET_5(reg_name, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5) \ 179fb4d8502Sjsg generic_reg_get5(CTX, REG(reg_name), \ 180fb4d8502Sjsg FN(reg_name, f1), v1, \ 181fb4d8502Sjsg FN(reg_name, f2), v2, \ 182fb4d8502Sjsg FN(reg_name, f3), v3, \ 183fb4d8502Sjsg FN(reg_name, f4), v4, \ 184fb4d8502Sjsg FN(reg_name, f5), v5) 185fb4d8502Sjsg 186fb4d8502Sjsg #define REG_GET_6(reg_name, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6) \ 187fb4d8502Sjsg generic_reg_get6(CTX, REG(reg_name), \ 188fb4d8502Sjsg FN(reg_name, f1), v1, \ 189fb4d8502Sjsg FN(reg_name, f2), v2, \ 190fb4d8502Sjsg FN(reg_name, f3), v3, \ 191fb4d8502Sjsg FN(reg_name, f4), v4, \ 192fb4d8502Sjsg FN(reg_name, f5), v5, \ 193fb4d8502Sjsg FN(reg_name, f6), v6) 194fb4d8502Sjsg 195fb4d8502Sjsg #define REG_GET_7(reg_name, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7) \ 196fb4d8502Sjsg generic_reg_get7(CTX, REG(reg_name), \ 197fb4d8502Sjsg FN(reg_name, f1), v1, \ 198fb4d8502Sjsg FN(reg_name, f2), v2, \ 199fb4d8502Sjsg FN(reg_name, f3), v3, \ 200fb4d8502Sjsg FN(reg_name, f4), v4, \ 201fb4d8502Sjsg FN(reg_name, f5), v5, \ 202fb4d8502Sjsg FN(reg_name, f6), v6, \ 203fb4d8502Sjsg FN(reg_name, f7), v7) 204fb4d8502Sjsg 205fb4d8502Sjsg #define REG_GET_8(reg_name, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8) \ 206fb4d8502Sjsg generic_reg_get8(CTX, REG(reg_name), \ 207fb4d8502Sjsg FN(reg_name, f1), v1, \ 208fb4d8502Sjsg FN(reg_name, f2), v2, \ 209fb4d8502Sjsg FN(reg_name, f3), v3, \ 210fb4d8502Sjsg FN(reg_name, f4), v4, \ 211fb4d8502Sjsg FN(reg_name, f5), v5, \ 212fb4d8502Sjsg FN(reg_name, f6), v6, \ 213fb4d8502Sjsg FN(reg_name, f7), v7, \ 214fb4d8502Sjsg FN(reg_name, f8), v8) 215fb4d8502Sjsg 216fb4d8502Sjsg /* macro to poll and wait for a register field to read back given value */ 217fb4d8502Sjsg 218fb4d8502Sjsg #define REG_WAIT(reg_name, field, val, delay_between_poll_us, max_try) \ 219fb4d8502Sjsg generic_reg_wait(CTX, \ 220fb4d8502Sjsg REG(reg_name), FN(reg_name, field), val,\ 221fb4d8502Sjsg delay_between_poll_us, max_try, __func__, __LINE__) 222fb4d8502Sjsg 223fb4d8502Sjsg /* macro to update (read, modify, write) register fields 224fb4d8502Sjsg */ 225fb4d8502Sjsg #define REG_UPDATE_N(reg_name, n, ...) \ 226fb4d8502Sjsg generic_reg_update_ex(CTX, \ 227fb4d8502Sjsg REG(reg_name), \ 228fb4d8502Sjsg n, __VA_ARGS__) 229fb4d8502Sjsg 230fb4d8502Sjsg #define REG_UPDATE(reg_name, field, val) \ 231fb4d8502Sjsg REG_UPDATE_N(reg_name, 1, \ 232fb4d8502Sjsg FN(reg_name, field), val) 233fb4d8502Sjsg 234fb4d8502Sjsg #define REG_UPDATE_2(reg, f1, v1, f2, v2) \ 235fb4d8502Sjsg REG_UPDATE_N(reg, 2,\ 236fb4d8502Sjsg FN(reg, f1), v1,\ 237fb4d8502Sjsg FN(reg, f2), v2) 238fb4d8502Sjsg 239fb4d8502Sjsg #define REG_UPDATE_3(reg, f1, v1, f2, v2, f3, v3) \ 240fb4d8502Sjsg REG_UPDATE_N(reg, 3, \ 241fb4d8502Sjsg FN(reg, f1), v1,\ 242fb4d8502Sjsg FN(reg, f2), v2, \ 243fb4d8502Sjsg FN(reg, f3), v3) 244fb4d8502Sjsg 245fb4d8502Sjsg #define REG_UPDATE_4(reg, f1, v1, f2, v2, f3, v3, f4, v4) \ 246fb4d8502Sjsg REG_UPDATE_N(reg, 4, \ 247fb4d8502Sjsg FN(reg, f1), v1,\ 248fb4d8502Sjsg FN(reg, f2), v2, \ 249fb4d8502Sjsg FN(reg, f3), v3, \ 250fb4d8502Sjsg FN(reg, f4), v4) 251fb4d8502Sjsg 252fb4d8502Sjsg #define REG_UPDATE_5(reg, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5) \ 253fb4d8502Sjsg REG_UPDATE_N(reg, 5, \ 254fb4d8502Sjsg FN(reg, f1), v1,\ 255fb4d8502Sjsg FN(reg, f2), v2, \ 256fb4d8502Sjsg FN(reg, f3), v3, \ 257fb4d8502Sjsg FN(reg, f4), v4, \ 258fb4d8502Sjsg FN(reg, f5), v5) 259fb4d8502Sjsg 260fb4d8502Sjsg #define REG_UPDATE_6(reg, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6) \ 261fb4d8502Sjsg REG_UPDATE_N(reg, 6, \ 262fb4d8502Sjsg FN(reg, f1), v1,\ 263fb4d8502Sjsg FN(reg, f2), v2, \ 264fb4d8502Sjsg FN(reg, f3), v3, \ 265fb4d8502Sjsg FN(reg, f4), v4, \ 266fb4d8502Sjsg FN(reg, f5), v5, \ 267fb4d8502Sjsg FN(reg, f6), v6) 268fb4d8502Sjsg 269fb4d8502Sjsg #define REG_UPDATE_7(reg, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7) \ 270fb4d8502Sjsg REG_UPDATE_N(reg, 7, \ 271fb4d8502Sjsg FN(reg, f1), v1,\ 272fb4d8502Sjsg FN(reg, f2), v2, \ 273fb4d8502Sjsg FN(reg, f3), v3, \ 274fb4d8502Sjsg FN(reg, f4), v4, \ 275fb4d8502Sjsg FN(reg, f5), v5, \ 276fb4d8502Sjsg FN(reg, f6), v6, \ 277fb4d8502Sjsg FN(reg, f7), v7) 278fb4d8502Sjsg 279fb4d8502Sjsg #define REG_UPDATE_8(reg, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8) \ 280fb4d8502Sjsg REG_UPDATE_N(reg, 8, \ 281fb4d8502Sjsg FN(reg, f1), v1,\ 282fb4d8502Sjsg FN(reg, f2), v2, \ 283fb4d8502Sjsg FN(reg, f3), v3, \ 284fb4d8502Sjsg FN(reg, f4), v4, \ 285fb4d8502Sjsg FN(reg, f5), v5, \ 286fb4d8502Sjsg FN(reg, f6), v6, \ 287fb4d8502Sjsg FN(reg, f7), v7, \ 288fb4d8502Sjsg FN(reg, f8), v8) 289fb4d8502Sjsg 290fb4d8502Sjsg #define REG_UPDATE_9(reg, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8, f9, v9) \ 291fb4d8502Sjsg REG_UPDATE_N(reg, 9, \ 292fb4d8502Sjsg FN(reg, f1), v1,\ 293fb4d8502Sjsg FN(reg, f2), v2, \ 294fb4d8502Sjsg FN(reg, f3), v3, \ 295fb4d8502Sjsg FN(reg, f4), v4, \ 296fb4d8502Sjsg FN(reg, f5), v5, \ 297fb4d8502Sjsg FN(reg, f6), v6, \ 298fb4d8502Sjsg FN(reg, f7), v7, \ 299fb4d8502Sjsg FN(reg, f8), v8, \ 300fb4d8502Sjsg FN(reg, f9), v9) 301fb4d8502Sjsg 302fb4d8502Sjsg #define REG_UPDATE_10(reg, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8, f9, v9, f10, v10)\ 303fb4d8502Sjsg REG_UPDATE_N(reg, 10, \ 304fb4d8502Sjsg FN(reg, f1), v1,\ 305fb4d8502Sjsg FN(reg, f2), v2, \ 306fb4d8502Sjsg FN(reg, f3), v3, \ 307fb4d8502Sjsg FN(reg, f4), v4, \ 308fb4d8502Sjsg FN(reg, f5), v5, \ 309fb4d8502Sjsg FN(reg, f6), v6, \ 310fb4d8502Sjsg FN(reg, f7), v7, \ 311fb4d8502Sjsg FN(reg, f8), v8, \ 312fb4d8502Sjsg FN(reg, f9), v9, \ 313fb4d8502Sjsg FN(reg, f10), v10) 314fb4d8502Sjsg 315fb4d8502Sjsg #define REG_UPDATE_14(reg, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8, f9, v9, f10,\ 316fb4d8502Sjsg v10, f11, v11, f12, v12, f13, v13, f14, v14)\ 317fb4d8502Sjsg REG_UPDATE_N(reg, 14, \ 318fb4d8502Sjsg FN(reg, f1), v1,\ 319fb4d8502Sjsg FN(reg, f2), v2, \ 320fb4d8502Sjsg FN(reg, f3), v3, \ 321fb4d8502Sjsg FN(reg, f4), v4, \ 322fb4d8502Sjsg FN(reg, f5), v5, \ 323fb4d8502Sjsg FN(reg, f6), v6, \ 324fb4d8502Sjsg FN(reg, f7), v7, \ 325fb4d8502Sjsg FN(reg, f8), v8, \ 326fb4d8502Sjsg FN(reg, f9), v9, \ 327fb4d8502Sjsg FN(reg, f10), v10, \ 328fb4d8502Sjsg FN(reg, f11), v11, \ 329fb4d8502Sjsg FN(reg, f12), v12, \ 330fb4d8502Sjsg FN(reg, f13), v13, \ 331fb4d8502Sjsg FN(reg, f14), v14) 332fb4d8502Sjsg 333fb4d8502Sjsg #define REG_UPDATE_19(reg, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8, f9, v9, f10,\ 334fb4d8502Sjsg v10, f11, v11, f12, v12, f13, v13, f14, v14, f15, v15, f16, v16, f17, v17, f18, v18, f19, v19)\ 335fb4d8502Sjsg REG_UPDATE_N(reg, 19, \ 336fb4d8502Sjsg FN(reg, f1), v1,\ 337fb4d8502Sjsg FN(reg, f2), v2, \ 338fb4d8502Sjsg FN(reg, f3), v3, \ 339fb4d8502Sjsg FN(reg, f4), v4, \ 340fb4d8502Sjsg FN(reg, f5), v5, \ 341fb4d8502Sjsg FN(reg, f6), v6, \ 342fb4d8502Sjsg FN(reg, f7), v7, \ 343fb4d8502Sjsg FN(reg, f8), v8, \ 344fb4d8502Sjsg FN(reg, f9), v9, \ 345fb4d8502Sjsg FN(reg, f10), v10, \ 346fb4d8502Sjsg FN(reg, f11), v11, \ 347fb4d8502Sjsg FN(reg, f12), v12, \ 348fb4d8502Sjsg FN(reg, f13), v13, \ 349fb4d8502Sjsg FN(reg, f14), v14, \ 350fb4d8502Sjsg FN(reg, f15), v15, \ 351fb4d8502Sjsg FN(reg, f16), v16, \ 352fb4d8502Sjsg FN(reg, f17), v17, \ 353fb4d8502Sjsg FN(reg, f18), v18, \ 354fb4d8502Sjsg FN(reg, f19), v19) 355fb4d8502Sjsg 356fb4d8502Sjsg #define REG_UPDATE_20(reg, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8, f9, v9, f10,\ 357fb4d8502Sjsg v10, f11, v11, f12, v12, f13, v13, f14, v14, f15, v15, f16, v16, f17, v17, f18, v18, f19, v19, f20, v20)\ 358fb4d8502Sjsg REG_UPDATE_N(reg, 20, \ 359fb4d8502Sjsg FN(reg, f1), v1,\ 360fb4d8502Sjsg FN(reg, f2), v2, \ 361fb4d8502Sjsg FN(reg, f3), v3, \ 362fb4d8502Sjsg FN(reg, f4), v4, \ 363fb4d8502Sjsg FN(reg, f5), v5, \ 364fb4d8502Sjsg FN(reg, f6), v6, \ 365fb4d8502Sjsg FN(reg, f7), v7, \ 366fb4d8502Sjsg FN(reg, f8), v8, \ 367fb4d8502Sjsg FN(reg, f9), v9, \ 368fb4d8502Sjsg FN(reg, f10), v10, \ 369fb4d8502Sjsg FN(reg, f11), v11, \ 370fb4d8502Sjsg FN(reg, f12), v12, \ 371fb4d8502Sjsg FN(reg, f13), v13, \ 372fb4d8502Sjsg FN(reg, f14), v14, \ 373fb4d8502Sjsg FN(reg, f15), v15, \ 374fb4d8502Sjsg FN(reg, f16), v16, \ 375fb4d8502Sjsg FN(reg, f17), v17, \ 376fb4d8502Sjsg FN(reg, f18), v18, \ 377fb4d8502Sjsg FN(reg, f19), v19, \ 378fb4d8502Sjsg FN(reg, f20), v20) 379fb4d8502Sjsg /* macro to update a register field to specified values in given sequences. 380fb4d8502Sjsg * useful when toggling bits 381fb4d8502Sjsg */ 382c349dbc7Sjsg #define REG_UPDATE_SEQ_2(reg, f1, v1, f2, v2) \ 383fb4d8502Sjsg { uint32_t val = REG_UPDATE(reg, f1, v1); \ 384fb4d8502Sjsg REG_SET(reg, val, f2, v2); } 385fb4d8502Sjsg 386c349dbc7Sjsg #define REG_UPDATE_SEQ_3(reg, f1, v1, f2, v2, f3, v3) \ 387fb4d8502Sjsg { uint32_t val = REG_UPDATE(reg, f1, v1); \ 388fb4d8502Sjsg val = REG_SET(reg, val, f2, v2); \ 389fb4d8502Sjsg REG_SET(reg, val, f3, v3); } 390fb4d8502Sjsg 391fb4d8502Sjsg uint32_t generic_reg_get(const struct dc_context *ctx, uint32_t addr, 392fb4d8502Sjsg uint8_t shift, uint32_t mask, uint32_t *field_value); 393fb4d8502Sjsg 394fb4d8502Sjsg uint32_t generic_reg_get2(const struct dc_context *ctx, uint32_t addr, 395fb4d8502Sjsg uint8_t shift1, uint32_t mask1, uint32_t *field_value1, 396fb4d8502Sjsg uint8_t shift2, uint32_t mask2, uint32_t *field_value2); 397fb4d8502Sjsg 398fb4d8502Sjsg uint32_t generic_reg_get3(const struct dc_context *ctx, uint32_t addr, 399fb4d8502Sjsg uint8_t shift1, uint32_t mask1, uint32_t *field_value1, 400fb4d8502Sjsg uint8_t shift2, uint32_t mask2, uint32_t *field_value2, 401fb4d8502Sjsg uint8_t shift3, uint32_t mask3, uint32_t *field_value3); 402fb4d8502Sjsg 403fb4d8502Sjsg uint32_t generic_reg_get4(const struct dc_context *ctx, uint32_t addr, 404fb4d8502Sjsg uint8_t shift1, uint32_t mask1, uint32_t *field_value1, 405fb4d8502Sjsg uint8_t shift2, uint32_t mask2, uint32_t *field_value2, 406fb4d8502Sjsg uint8_t shift3, uint32_t mask3, uint32_t *field_value3, 407fb4d8502Sjsg uint8_t shift4, uint32_t mask4, uint32_t *field_value4); 408fb4d8502Sjsg 409fb4d8502Sjsg uint32_t generic_reg_get5(const struct dc_context *ctx, uint32_t addr, 410fb4d8502Sjsg uint8_t shift1, uint32_t mask1, uint32_t *field_value1, 411fb4d8502Sjsg uint8_t shift2, uint32_t mask2, uint32_t *field_value2, 412fb4d8502Sjsg uint8_t shift3, uint32_t mask3, uint32_t *field_value3, 413fb4d8502Sjsg uint8_t shift4, uint32_t mask4, uint32_t *field_value4, 414fb4d8502Sjsg uint8_t shift5, uint32_t mask5, uint32_t *field_value5); 415fb4d8502Sjsg 416fb4d8502Sjsg uint32_t generic_reg_get6(const struct dc_context *ctx, uint32_t addr, 417fb4d8502Sjsg uint8_t shift1, uint32_t mask1, uint32_t *field_value1, 418fb4d8502Sjsg uint8_t shift2, uint32_t mask2, uint32_t *field_value2, 419fb4d8502Sjsg uint8_t shift3, uint32_t mask3, uint32_t *field_value3, 420fb4d8502Sjsg uint8_t shift4, uint32_t mask4, uint32_t *field_value4, 421fb4d8502Sjsg uint8_t shift5, uint32_t mask5, uint32_t *field_value5, 422fb4d8502Sjsg uint8_t shift6, uint32_t mask6, uint32_t *field_value6); 423fb4d8502Sjsg 424fb4d8502Sjsg uint32_t generic_reg_get7(const struct dc_context *ctx, uint32_t addr, 425fb4d8502Sjsg uint8_t shift1, uint32_t mask1, uint32_t *field_value1, 426fb4d8502Sjsg uint8_t shift2, uint32_t mask2, uint32_t *field_value2, 427fb4d8502Sjsg uint8_t shift3, uint32_t mask3, uint32_t *field_value3, 428fb4d8502Sjsg uint8_t shift4, uint32_t mask4, uint32_t *field_value4, 429fb4d8502Sjsg uint8_t shift5, uint32_t mask5, uint32_t *field_value5, 430fb4d8502Sjsg uint8_t shift6, uint32_t mask6, uint32_t *field_value6, 431fb4d8502Sjsg uint8_t shift7, uint32_t mask7, uint32_t *field_value7); 432fb4d8502Sjsg 433fb4d8502Sjsg uint32_t generic_reg_get8(const struct dc_context *ctx, uint32_t addr, 434fb4d8502Sjsg uint8_t shift1, uint32_t mask1, uint32_t *field_value1, 435fb4d8502Sjsg uint8_t shift2, uint32_t mask2, uint32_t *field_value2, 436fb4d8502Sjsg uint8_t shift3, uint32_t mask3, uint32_t *field_value3, 437fb4d8502Sjsg uint8_t shift4, uint32_t mask4, uint32_t *field_value4, 438fb4d8502Sjsg uint8_t shift5, uint32_t mask5, uint32_t *field_value5, 439fb4d8502Sjsg uint8_t shift6, uint32_t mask6, uint32_t *field_value6, 440fb4d8502Sjsg uint8_t shift7, uint32_t mask7, uint32_t *field_value7, 441fb4d8502Sjsg uint8_t shift8, uint32_t mask8, uint32_t *field_value8); 442fb4d8502Sjsg 443fb4d8502Sjsg 444fb4d8502Sjsg /* indirect register access */ 445fb4d8502Sjsg 446fb4d8502Sjsg #define IX_REG_SET_N(index_reg_name, data_reg_name, index, n, initial_val, ...) \ 447fb4d8502Sjsg generic_indirect_reg_update_ex(CTX, \ 448fb4d8502Sjsg REG(index_reg_name), REG(data_reg_name), IND_REG(index), \ 449fb4d8502Sjsg initial_val, \ 450fb4d8502Sjsg n, __VA_ARGS__) 451fb4d8502Sjsg 452fb4d8502Sjsg #define IX_REG_SET_2(index_reg_name, data_reg_name, index, init_value, f1, v1, f2, v2) \ 453fb4d8502Sjsg IX_REG_SET_N(index_reg_name, data_reg_name, index, 2, init_value, \ 454fb4d8502Sjsg FN(reg, f1), v1,\ 455fb4d8502Sjsg FN(reg, f2), v2) 456fb4d8502Sjsg 457fb4d8502Sjsg 458fb4d8502Sjsg #define IX_REG_READ(index_reg_name, data_reg_name, index) \ 459fb4d8502Sjsg generic_read_indirect_reg(CTX, REG(index_reg_name), REG(data_reg_name), IND_REG(index)) 460fb4d8502Sjsg 461c349dbc7Sjsg #define IX_REG_GET_N(index_reg_name, data_reg_name, index, n, ...) \ 462c349dbc7Sjsg generic_indirect_reg_get(CTX, REG(index_reg_name), REG(data_reg_name), \ 463c349dbc7Sjsg IND_REG(index), \ 464c349dbc7Sjsg n, __VA_ARGS__) 465fb4d8502Sjsg 466c349dbc7Sjsg #define IX_REG_GET(index_reg_name, data_reg_name, index, field, val) \ 467c349dbc7Sjsg IX_REG_GET_N(index_reg_name, data_reg_name, index, 1, \ 468c349dbc7Sjsg FN(data_reg_name, field), val) 469fb4d8502Sjsg 470fb4d8502Sjsg #define IX_REG_UPDATE_N(index_reg_name, data_reg_name, index, n, ...) \ 471fb4d8502Sjsg generic_indirect_reg_update_ex(CTX, \ 472fb4d8502Sjsg REG(index_reg_name), REG(data_reg_name), IND_REG(index), \ 473fb4d8502Sjsg IX_REG_READ(index_reg_name, data_reg_name, index), \ 474fb4d8502Sjsg n, __VA_ARGS__) 475fb4d8502Sjsg 476fb4d8502Sjsg #define IX_REG_UPDATE_2(index_reg_name, data_reg_name, index, f1, v1, f2, v2) \ 477fb4d8502Sjsg IX_REG_UPDATE_N(index_reg_name, data_reg_name, index, 2,\ 478fb4d8502Sjsg FN(reg, f1), v1,\ 479fb4d8502Sjsg FN(reg, f2), v2) 480fb4d8502Sjsg 481fb4d8502Sjsg void generic_write_indirect_reg(const struct dc_context *ctx, 482fb4d8502Sjsg uint32_t addr_index, uint32_t addr_data, 483fb4d8502Sjsg uint32_t index, uint32_t data); 484fb4d8502Sjsg 485fb4d8502Sjsg uint32_t generic_read_indirect_reg(const struct dc_context *ctx, 486fb4d8502Sjsg uint32_t addr_index, uint32_t addr_data, 487fb4d8502Sjsg uint32_t index); 488fb4d8502Sjsg 489c349dbc7Sjsg uint32_t generic_indirect_reg_get(const struct dc_context *ctx, 490c349dbc7Sjsg uint32_t addr_index, uint32_t addr_data, 491c349dbc7Sjsg uint32_t index, int n, 492c349dbc7Sjsg uint8_t shift1, uint32_t mask1, uint32_t *field_value1, 493c349dbc7Sjsg ...); 494c349dbc7Sjsg 495fb4d8502Sjsg uint32_t generic_indirect_reg_update_ex(const struct dc_context *ctx, 496fb4d8502Sjsg uint32_t addr_index, uint32_t addr_data, 497fb4d8502Sjsg uint32_t index, uint32_t reg_val, int n, 498fb4d8502Sjsg uint8_t shift1, uint32_t mask1, uint32_t field_value1, 499fb4d8502Sjsg ...); 500fb4d8502Sjsg 501*1bb76ff1Sjsg /* indirect register access 502*1bb76ff1Sjsg * underlying implementation determines which index/data pair to be used 503*1bb76ff1Sjsg * in a synchronous way 504*1bb76ff1Sjsg */ 505*1bb76ff1Sjsg #define IX_REG_SET_N_SYNC(index, n, initial_val, ...) \ 506*1bb76ff1Sjsg generic_indirect_reg_update_ex_sync(CTX, \ 507*1bb76ff1Sjsg IND_REG(index), \ 508*1bb76ff1Sjsg initial_val, \ 509*1bb76ff1Sjsg n, __VA_ARGS__) 510*1bb76ff1Sjsg 511*1bb76ff1Sjsg #define IX_REG_SET_2_SYNC(index, init_value, f1, v1, f2, v2) \ 512*1bb76ff1Sjsg IX_REG_SET_N_SYNC(index, 2, init_value, \ 513*1bb76ff1Sjsg FN(reg, f1), v1,\ 514*1bb76ff1Sjsg FN(reg, f2), v2) 515*1bb76ff1Sjsg 516*1bb76ff1Sjsg #define IX_REG_GET_N_SYNC(index, n, ...) \ 517*1bb76ff1Sjsg generic_indirect_reg_get_sync(CTX, \ 518*1bb76ff1Sjsg IND_REG(index), \ 519*1bb76ff1Sjsg n, __VA_ARGS__) 520*1bb76ff1Sjsg 521*1bb76ff1Sjsg #define IX_REG_GET_SYNC(index, field, val) \ 522*1bb76ff1Sjsg IX_REG_GET_N_SYNC(index, 1, \ 523*1bb76ff1Sjsg FN(data_reg_name, field), val) 524*1bb76ff1Sjsg 525*1bb76ff1Sjsg uint32_t generic_indirect_reg_get_sync(const struct dc_context *ctx, 526*1bb76ff1Sjsg uint32_t index, int n, 527*1bb76ff1Sjsg uint8_t shift1, uint32_t mask1, uint32_t *field_value1, 528*1bb76ff1Sjsg ...); 529*1bb76ff1Sjsg 530*1bb76ff1Sjsg uint32_t generic_indirect_reg_update_ex_sync(const struct dc_context *ctx, 531*1bb76ff1Sjsg uint32_t index, uint32_t reg_val, int n, 532*1bb76ff1Sjsg uint8_t shift1, uint32_t mask1, uint32_t field_value1, 533*1bb76ff1Sjsg ...); 534*1bb76ff1Sjsg 535c349dbc7Sjsg /* register offload macros 536c349dbc7Sjsg * 537c349dbc7Sjsg * instead of MMIO to register directly, in some cases we want 538c349dbc7Sjsg * to gather register sequence and execute the register sequence 539c349dbc7Sjsg * from another thread so we optimize time required for lengthy ops 540c349dbc7Sjsg */ 541c349dbc7Sjsg 542c349dbc7Sjsg /* start gathering register sequence */ 543c349dbc7Sjsg #define REG_SEQ_START() \ 544c349dbc7Sjsg reg_sequence_start_gather(CTX) 545c349dbc7Sjsg 546c349dbc7Sjsg /* start execution of register sequence gathered since REG_SEQ_START */ 547c349dbc7Sjsg #define REG_SEQ_SUBMIT() \ 548c349dbc7Sjsg reg_sequence_start_execute(CTX) 549c349dbc7Sjsg 550c349dbc7Sjsg /* wait for the last REG_SEQ_SUBMIT to finish */ 551c349dbc7Sjsg #define REG_SEQ_WAIT_DONE() \ 552c349dbc7Sjsg reg_sequence_wait_done(CTX) 553c349dbc7Sjsg 554fb4d8502Sjsg #endif /* DRIVERS_GPU_DRM_AMD_DC_DEV_DC_INC_REG_HELPER_H_ */ 555