18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * Copyright 2019 Red Hat Inc. 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 58c2ecf20Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 68c2ecf20Sopenharmony_ci * to deal in the Software without restriction, including without limitation 78c2ecf20Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 88c2ecf20Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 98c2ecf20Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 108c2ecf20Sopenharmony_ci * 118c2ecf20Sopenharmony_ci * The above copyright notice and this permission notice shall be included in 128c2ecf20Sopenharmony_ci * all copies or substantial portions of the Software. 138c2ecf20Sopenharmony_ci * 148c2ecf20Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 158c2ecf20Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 168c2ecf20Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 178c2ecf20Sopenharmony_ci * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 188c2ecf20Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 198c2ecf20Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 208c2ecf20Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE. 218c2ecf20Sopenharmony_ci */ 228c2ecf20Sopenharmony_ci#ifndef __NVIF_PUSH_H__ 238c2ecf20Sopenharmony_ci#define __NVIF_PUSH_H__ 248c2ecf20Sopenharmony_ci#include <nvif/mem.h> 258c2ecf20Sopenharmony_ci#include <nvif/printf.h> 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci#include <nvhw/drf.h> 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_cistruct nvif_push { 308c2ecf20Sopenharmony_ci int (*wait)(struct nvif_push *push, u32 size); 318c2ecf20Sopenharmony_ci void (*kick)(struct nvif_push *push); 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci struct nvif_mem mem; 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci u32 *bgn; 368c2ecf20Sopenharmony_ci u32 *cur; 378c2ecf20Sopenharmony_ci u32 *seg; 388c2ecf20Sopenharmony_ci u32 *end; 398c2ecf20Sopenharmony_ci}; 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_cistatic inline __must_check int 428c2ecf20Sopenharmony_ciPUSH_WAIT(struct nvif_push *push, u32 size) 438c2ecf20Sopenharmony_ci{ 448c2ecf20Sopenharmony_ci if (push->cur + size >= push->end) { 458c2ecf20Sopenharmony_ci int ret = push->wait(push, size); 468c2ecf20Sopenharmony_ci if (ret) 478c2ecf20Sopenharmony_ci return ret; 488c2ecf20Sopenharmony_ci } 498c2ecf20Sopenharmony_ci#ifdef CONFIG_NOUVEAU_DEBUG_PUSH 508c2ecf20Sopenharmony_ci push->seg = push->cur + size; 518c2ecf20Sopenharmony_ci#endif 528c2ecf20Sopenharmony_ci return 0; 538c2ecf20Sopenharmony_ci} 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_cistatic inline int 568c2ecf20Sopenharmony_ciPUSH_KICK(struct nvif_push *push) 578c2ecf20Sopenharmony_ci{ 588c2ecf20Sopenharmony_ci push->kick(push); 598c2ecf20Sopenharmony_ci return 0; 608c2ecf20Sopenharmony_ci} 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci#ifdef CONFIG_NOUVEAU_DEBUG_PUSH 638c2ecf20Sopenharmony_ci#define PUSH_PRINTF(p,f,a...) do { \ 648c2ecf20Sopenharmony_ci struct nvif_push *_ppp = (p); \ 658c2ecf20Sopenharmony_ci u32 __o = _ppp->cur - (u32 *)_ppp->mem.object.map.ptr; \ 668c2ecf20Sopenharmony_ci NVIF_DEBUG(&_ppp->mem.object, "%08x: "f, __o * 4, ##a); \ 678c2ecf20Sopenharmony_ci (void)__o; \ 688c2ecf20Sopenharmony_ci} while(0) 698c2ecf20Sopenharmony_ci#define PUSH_ASSERT_ON(a,b) WARN((a), b) 708c2ecf20Sopenharmony_ci#else 718c2ecf20Sopenharmony_ci#define PUSH_PRINTF(p,f,a...) 728c2ecf20Sopenharmony_ci#define PUSH_ASSERT_ON(a, b) 738c2ecf20Sopenharmony_ci#endif 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_ci#define PUSH_ASSERT(a,b) do { \ 768c2ecf20Sopenharmony_ci static_assert( \ 778c2ecf20Sopenharmony_ci __builtin_choose_expr(__builtin_constant_p(a), (a), 1), b \ 788c2ecf20Sopenharmony_ci ); \ 798c2ecf20Sopenharmony_ci PUSH_ASSERT_ON(!(a), b); \ 808c2ecf20Sopenharmony_ci} while(0) 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci#define PUSH_DATA__(p,d,f,a...) do { \ 838c2ecf20Sopenharmony_ci struct nvif_push *_p = (p); \ 848c2ecf20Sopenharmony_ci u32 _d = (d); \ 858c2ecf20Sopenharmony_ci PUSH_ASSERT(_p->cur < _p->seg, "segment overrun"); \ 868c2ecf20Sopenharmony_ci PUSH_ASSERT(_p->cur < _p->end, "pushbuf overrun"); \ 878c2ecf20Sopenharmony_ci PUSH_PRINTF(_p, "%08x"f, _d, ##a); \ 888c2ecf20Sopenharmony_ci *_p->cur++ = _d; \ 898c2ecf20Sopenharmony_ci} while(0) 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ci#define PUSH_DATA_(X,p,m,i0,i1,d,s,f,a...) PUSH_DATA__((p), (d), "-> "#m f, ##a) 928c2ecf20Sopenharmony_ci#define PUSH_DATA(p,d) PUSH_DATA__((p), (d), " data - %s", __func__) 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci//XXX: error-check this against *real* pushbuffer end? 958c2ecf20Sopenharmony_ci#define PUSH_RSVD(p,d) do { \ 968c2ecf20Sopenharmony_ci struct nvif_push *__p = (p); \ 978c2ecf20Sopenharmony_ci __p->seg++; \ 988c2ecf20Sopenharmony_ci __p->end++; \ 998c2ecf20Sopenharmony_ci d; \ 1008c2ecf20Sopenharmony_ci} while(0) 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci#ifdef CONFIG_NOUVEAU_DEBUG_PUSH 1038c2ecf20Sopenharmony_ci#define PUSH_DATAp(X,p,m,i,o,d,s,f,a...) do { \ 1048c2ecf20Sopenharmony_ci struct nvif_push *_pp = (p); \ 1058c2ecf20Sopenharmony_ci const u32 *_dd = (d); \ 1068c2ecf20Sopenharmony_ci u32 _s = (s), _i = (i?PUSH_##o##_INC); \ 1078c2ecf20Sopenharmony_ci if (_s--) { \ 1088c2ecf20Sopenharmony_ci PUSH_DATA_(X, _pp, X##m, i0, i1, *_dd++, 1, "+0x%x", 0); \ 1098c2ecf20Sopenharmony_ci while (_s--) { \ 1108c2ecf20Sopenharmony_ci PUSH_DATA_(X, _pp, X##m, i0, i1, *_dd++, 1, "+0x%x", _i); \ 1118c2ecf20Sopenharmony_ci _i += (0?PUSH_##o##_INC); \ 1128c2ecf20Sopenharmony_ci } \ 1138c2ecf20Sopenharmony_ci } \ 1148c2ecf20Sopenharmony_ci} while(0) 1158c2ecf20Sopenharmony_ci#else 1168c2ecf20Sopenharmony_ci#define PUSH_DATAp(X,p,m,i,o,d,s,f,a...) do { \ 1178c2ecf20Sopenharmony_ci struct nvif_push *_p = (p); \ 1188c2ecf20Sopenharmony_ci u32 _s = (s); \ 1198c2ecf20Sopenharmony_ci PUSH_ASSERT(_p->cur + _s <= _p->seg, "segment overrun"); \ 1208c2ecf20Sopenharmony_ci PUSH_ASSERT(_p->cur + _s <= _p->end, "pushbuf overrun"); \ 1218c2ecf20Sopenharmony_ci memcpy(_p->cur, (d), _s << 2); \ 1228c2ecf20Sopenharmony_ci _p->cur += _s; \ 1238c2ecf20Sopenharmony_ci} while(0) 1248c2ecf20Sopenharmony_ci#endif 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ci#define PUSH_1(X,f,ds,n,o,p,s,mA,dA) do { \ 1278c2ecf20Sopenharmony_ci PUSH_##o##_HDR((p), s, mA, (ds)+(n)); \ 1288c2ecf20Sopenharmony_ci PUSH_##f(X, (p), X##mA, 1, o, (dA), ds, ""); \ 1298c2ecf20Sopenharmony_ci} while(0) 1308c2ecf20Sopenharmony_ci#define PUSH_2(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \ 1318c2ecf20Sopenharmony_ci PUSH_ASSERT((mB) - (mA) == (1?PUSH_##o##_INC), "mthd1"); \ 1328c2ecf20Sopenharmony_ci PUSH_1(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \ 1338c2ecf20Sopenharmony_ci PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \ 1348c2ecf20Sopenharmony_ci} while(0) 1358c2ecf20Sopenharmony_ci#define PUSH_3(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \ 1368c2ecf20Sopenharmony_ci PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd2"); \ 1378c2ecf20Sopenharmony_ci PUSH_2(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \ 1388c2ecf20Sopenharmony_ci PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \ 1398c2ecf20Sopenharmony_ci} while(0) 1408c2ecf20Sopenharmony_ci#define PUSH_4(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \ 1418c2ecf20Sopenharmony_ci PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd3"); \ 1428c2ecf20Sopenharmony_ci PUSH_3(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \ 1438c2ecf20Sopenharmony_ci PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \ 1448c2ecf20Sopenharmony_ci} while(0) 1458c2ecf20Sopenharmony_ci#define PUSH_5(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \ 1468c2ecf20Sopenharmony_ci PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd4"); \ 1478c2ecf20Sopenharmony_ci PUSH_4(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \ 1488c2ecf20Sopenharmony_ci PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \ 1498c2ecf20Sopenharmony_ci} while(0) 1508c2ecf20Sopenharmony_ci#define PUSH_6(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \ 1518c2ecf20Sopenharmony_ci PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd5"); \ 1528c2ecf20Sopenharmony_ci PUSH_5(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \ 1538c2ecf20Sopenharmony_ci PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \ 1548c2ecf20Sopenharmony_ci} while(0) 1558c2ecf20Sopenharmony_ci#define PUSH_7(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \ 1568c2ecf20Sopenharmony_ci PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd6"); \ 1578c2ecf20Sopenharmony_ci PUSH_6(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \ 1588c2ecf20Sopenharmony_ci PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \ 1598c2ecf20Sopenharmony_ci} while(0) 1608c2ecf20Sopenharmony_ci#define PUSH_8(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \ 1618c2ecf20Sopenharmony_ci PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd7"); \ 1628c2ecf20Sopenharmony_ci PUSH_7(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \ 1638c2ecf20Sopenharmony_ci PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \ 1648c2ecf20Sopenharmony_ci} while(0) 1658c2ecf20Sopenharmony_ci#define PUSH_9(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \ 1668c2ecf20Sopenharmony_ci PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd8"); \ 1678c2ecf20Sopenharmony_ci PUSH_8(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \ 1688c2ecf20Sopenharmony_ci PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \ 1698c2ecf20Sopenharmony_ci} while(0) 1708c2ecf20Sopenharmony_ci#define PUSH_10(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \ 1718c2ecf20Sopenharmony_ci PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd9"); \ 1728c2ecf20Sopenharmony_ci PUSH_9(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \ 1738c2ecf20Sopenharmony_ci PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \ 1748c2ecf20Sopenharmony_ci} while(0) 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_ci#define PUSH_1D(X,o,p,s,mA,dA) \ 1778c2ecf20Sopenharmony_ci PUSH_1(X, DATA_, 1, 0, o, (p), s, X##mA, (dA)) 1788c2ecf20Sopenharmony_ci#define PUSH_2D(X,o,p,s,mA,dA,mB,dB) \ 1798c2ecf20Sopenharmony_ci PUSH_2(X, DATA_, 1, 0, o, (p), s, X##mB, (dB), \ 1808c2ecf20Sopenharmony_ci X##mA, (dA)) 1818c2ecf20Sopenharmony_ci#define PUSH_3D(X,o,p,s,mA,dA,mB,dB,mC,dC) \ 1828c2ecf20Sopenharmony_ci PUSH_3(X, DATA_, 1, 0, o, (p), s, X##mC, (dC), \ 1838c2ecf20Sopenharmony_ci X##mB, (dB), \ 1848c2ecf20Sopenharmony_ci X##mA, (dA)) 1858c2ecf20Sopenharmony_ci#define PUSH_4D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD) \ 1868c2ecf20Sopenharmony_ci PUSH_4(X, DATA_, 1, 0, o, (p), s, X##mD, (dD), \ 1878c2ecf20Sopenharmony_ci X##mC, (dC), \ 1888c2ecf20Sopenharmony_ci X##mB, (dB), \ 1898c2ecf20Sopenharmony_ci X##mA, (dA)) 1908c2ecf20Sopenharmony_ci#define PUSH_5D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE) \ 1918c2ecf20Sopenharmony_ci PUSH_5(X, DATA_, 1, 0, o, (p), s, X##mE, (dE), \ 1928c2ecf20Sopenharmony_ci X##mD, (dD), \ 1938c2ecf20Sopenharmony_ci X##mC, (dC), \ 1948c2ecf20Sopenharmony_ci X##mB, (dB), \ 1958c2ecf20Sopenharmony_ci X##mA, (dA)) 1968c2ecf20Sopenharmony_ci#define PUSH_6D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF) \ 1978c2ecf20Sopenharmony_ci PUSH_6(X, DATA_, 1, 0, o, (p), s, X##mF, (dF), \ 1988c2ecf20Sopenharmony_ci X##mE, (dE), \ 1998c2ecf20Sopenharmony_ci X##mD, (dD), \ 2008c2ecf20Sopenharmony_ci X##mC, (dC), \ 2018c2ecf20Sopenharmony_ci X##mB, (dB), \ 2028c2ecf20Sopenharmony_ci X##mA, (dA)) 2038c2ecf20Sopenharmony_ci#define PUSH_7D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF,mG,dG) \ 2048c2ecf20Sopenharmony_ci PUSH_7(X, DATA_, 1, 0, o, (p), s, X##mG, (dG), \ 2058c2ecf20Sopenharmony_ci X##mF, (dF), \ 2068c2ecf20Sopenharmony_ci X##mE, (dE), \ 2078c2ecf20Sopenharmony_ci X##mD, (dD), \ 2088c2ecf20Sopenharmony_ci X##mC, (dC), \ 2098c2ecf20Sopenharmony_ci X##mB, (dB), \ 2108c2ecf20Sopenharmony_ci X##mA, (dA)) 2118c2ecf20Sopenharmony_ci#define PUSH_8D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF,mG,dG,mH,dH) \ 2128c2ecf20Sopenharmony_ci PUSH_8(X, DATA_, 1, 0, o, (p), s, X##mH, (dH), \ 2138c2ecf20Sopenharmony_ci X##mG, (dG), \ 2148c2ecf20Sopenharmony_ci X##mF, (dF), \ 2158c2ecf20Sopenharmony_ci X##mE, (dE), \ 2168c2ecf20Sopenharmony_ci X##mD, (dD), \ 2178c2ecf20Sopenharmony_ci X##mC, (dC), \ 2188c2ecf20Sopenharmony_ci X##mB, (dB), \ 2198c2ecf20Sopenharmony_ci X##mA, (dA)) 2208c2ecf20Sopenharmony_ci#define PUSH_9D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF,mG,dG,mH,dH,mI,dI) \ 2218c2ecf20Sopenharmony_ci PUSH_9(X, DATA_, 1, 0, o, (p), s, X##mI, (dI), \ 2228c2ecf20Sopenharmony_ci X##mH, (dH), \ 2238c2ecf20Sopenharmony_ci X##mG, (dG), \ 2248c2ecf20Sopenharmony_ci X##mF, (dF), \ 2258c2ecf20Sopenharmony_ci X##mE, (dE), \ 2268c2ecf20Sopenharmony_ci X##mD, (dD), \ 2278c2ecf20Sopenharmony_ci X##mC, (dC), \ 2288c2ecf20Sopenharmony_ci X##mB, (dB), \ 2298c2ecf20Sopenharmony_ci X##mA, (dA)) 2308c2ecf20Sopenharmony_ci#define PUSH_10D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF,mG,dG,mH,dH,mI,dI,mJ,dJ) \ 2318c2ecf20Sopenharmony_ci PUSH_10(X, DATA_, 1, 0, o, (p), s, X##mJ, (dJ), \ 2328c2ecf20Sopenharmony_ci X##mI, (dI), \ 2338c2ecf20Sopenharmony_ci X##mH, (dH), \ 2348c2ecf20Sopenharmony_ci X##mG, (dG), \ 2358c2ecf20Sopenharmony_ci X##mF, (dF), \ 2368c2ecf20Sopenharmony_ci X##mE, (dE), \ 2378c2ecf20Sopenharmony_ci X##mD, (dD), \ 2388c2ecf20Sopenharmony_ci X##mC, (dC), \ 2398c2ecf20Sopenharmony_ci X##mB, (dB), \ 2408c2ecf20Sopenharmony_ci X##mA, (dA)) 2418c2ecf20Sopenharmony_ci 2428c2ecf20Sopenharmony_ci#define PUSH_1P(X,o,p,s,mA,dp,ds) \ 2438c2ecf20Sopenharmony_ci PUSH_1(X, DATAp, ds, 0, o, (p), s, X##mA, (dp)) 2448c2ecf20Sopenharmony_ci#define PUSH_2P(X,o,p,s,mA,dA,mB,dp,ds) \ 2458c2ecf20Sopenharmony_ci PUSH_2(X, DATAp, ds, 0, o, (p), s, X##mB, (dp), \ 2468c2ecf20Sopenharmony_ci X##mA, (dA)) 2478c2ecf20Sopenharmony_ci#define PUSH_3P(X,o,p,s,mA,dA,mB,dB,mC,dp,ds) \ 2488c2ecf20Sopenharmony_ci PUSH_3(X, DATAp, ds, 0, o, (p), s, X##mC, (dp), \ 2498c2ecf20Sopenharmony_ci X##mB, (dB), \ 2508c2ecf20Sopenharmony_ci X##mA, (dA)) 2518c2ecf20Sopenharmony_ci 2528c2ecf20Sopenharmony_ci#define PUSH_(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,IMPL,...) IMPL 2538c2ecf20Sopenharmony_ci#define PUSH(A...) PUSH_(A, PUSH_10P, PUSH_10D, \ 2548c2ecf20Sopenharmony_ci PUSH_9P , PUSH_9D, \ 2558c2ecf20Sopenharmony_ci PUSH_8P , PUSH_8D, \ 2568c2ecf20Sopenharmony_ci PUSH_7P , PUSH_7D, \ 2578c2ecf20Sopenharmony_ci PUSH_6P , PUSH_6D, \ 2588c2ecf20Sopenharmony_ci PUSH_5P , PUSH_5D, \ 2598c2ecf20Sopenharmony_ci PUSH_4P , PUSH_4D, \ 2608c2ecf20Sopenharmony_ci PUSH_3P , PUSH_3D, \ 2618c2ecf20Sopenharmony_ci PUSH_2P , PUSH_2D, \ 2628c2ecf20Sopenharmony_ci PUSH_1P , PUSH_1D)(, ##A) 2638c2ecf20Sopenharmony_ci 2648c2ecf20Sopenharmony_ci#define PUSH_NVIM(p,c,m,d) do { \ 2658c2ecf20Sopenharmony_ci struct nvif_push *__p = (p); \ 2668c2ecf20Sopenharmony_ci u32 __d = (d); \ 2678c2ecf20Sopenharmony_ci PUSH_IMMD_HDR(__p, c, m, __d); \ 2688c2ecf20Sopenharmony_ci __p->cur--; \ 2698c2ecf20Sopenharmony_ci PUSH_PRINTF(__p, "%08x-> "#m, __d); \ 2708c2ecf20Sopenharmony_ci __p->cur++; \ 2718c2ecf20Sopenharmony_ci} while(0) 2728c2ecf20Sopenharmony_ci#define PUSH_NVSQ(A...) PUSH(MTHD, ##A) 2738c2ecf20Sopenharmony_ci#define PUSH_NV1I(A...) PUSH(1INC, ##A) 2748c2ecf20Sopenharmony_ci#define PUSH_NVNI(A...) PUSH(NINC, ##A) 2758c2ecf20Sopenharmony_ci 2768c2ecf20Sopenharmony_ci 2778c2ecf20Sopenharmony_ci#define PUSH_NV_1(X,o,p,c,mA,d...) \ 2788c2ecf20Sopenharmony_ci PUSH_##o(p,c,c##_##mA,d) 2798c2ecf20Sopenharmony_ci#define PUSH_NV_2(X,o,p,c,mA,dA,mB,d...) \ 2808c2ecf20Sopenharmony_ci PUSH_##o(p,c,c##_##mA,dA, \ 2818c2ecf20Sopenharmony_ci c##_##mB,d) 2828c2ecf20Sopenharmony_ci#define PUSH_NV_3(X,o,p,c,mA,dA,mB,dB,mC,d...) \ 2838c2ecf20Sopenharmony_ci PUSH_##o(p,c,c##_##mA,dA, \ 2848c2ecf20Sopenharmony_ci c##_##mB,dB, \ 2858c2ecf20Sopenharmony_ci c##_##mC,d) 2868c2ecf20Sopenharmony_ci#define PUSH_NV_4(X,o,p,c,mA,dA,mB,dB,mC,dC,mD,d...) \ 2878c2ecf20Sopenharmony_ci PUSH_##o(p,c,c##_##mA,dA, \ 2888c2ecf20Sopenharmony_ci c##_##mB,dB, \ 2898c2ecf20Sopenharmony_ci c##_##mC,dC, \ 2908c2ecf20Sopenharmony_ci c##_##mD,d) 2918c2ecf20Sopenharmony_ci#define PUSH_NV_5(X,o,p,c,mA,dA,mB,dB,mC,dC,mD,dD,mE,d...) \ 2928c2ecf20Sopenharmony_ci PUSH_##o(p,c,c##_##mA,dA, \ 2938c2ecf20Sopenharmony_ci c##_##mB,dB, \ 2948c2ecf20Sopenharmony_ci c##_##mC,dC, \ 2958c2ecf20Sopenharmony_ci c##_##mD,dD, \ 2968c2ecf20Sopenharmony_ci c##_##mE,d) 2978c2ecf20Sopenharmony_ci#define PUSH_NV_6(X,o,p,c,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,d...) \ 2988c2ecf20Sopenharmony_ci PUSH_##o(p,c,c##_##mA,dA, \ 2998c2ecf20Sopenharmony_ci c##_##mB,dB, \ 3008c2ecf20Sopenharmony_ci c##_##mC,dC, \ 3018c2ecf20Sopenharmony_ci c##_##mD,dD, \ 3028c2ecf20Sopenharmony_ci c##_##mE,dE, \ 3038c2ecf20Sopenharmony_ci c##_##mF,d) 3048c2ecf20Sopenharmony_ci#define PUSH_NV_7(X,o,p,c,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF,mG,d...) \ 3058c2ecf20Sopenharmony_ci PUSH_##o(p,c,c##_##mA,dA, \ 3068c2ecf20Sopenharmony_ci c##_##mB,dB, \ 3078c2ecf20Sopenharmony_ci c##_##mC,dC, \ 3088c2ecf20Sopenharmony_ci c##_##mD,dD, \ 3098c2ecf20Sopenharmony_ci c##_##mE,dE, \ 3108c2ecf20Sopenharmony_ci c##_##mF,dF, \ 3118c2ecf20Sopenharmony_ci c##_##mG,d) 3128c2ecf20Sopenharmony_ci#define PUSH_NV_8(X,o,p,c,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF,mG,dG,mH,d...) \ 3138c2ecf20Sopenharmony_ci PUSH_##o(p,c,c##_##mA,dA, \ 3148c2ecf20Sopenharmony_ci c##_##mB,dB, \ 3158c2ecf20Sopenharmony_ci c##_##mC,dC, \ 3168c2ecf20Sopenharmony_ci c##_##mD,dD, \ 3178c2ecf20Sopenharmony_ci c##_##mE,dE, \ 3188c2ecf20Sopenharmony_ci c##_##mF,dF, \ 3198c2ecf20Sopenharmony_ci c##_##mG,dG, \ 3208c2ecf20Sopenharmony_ci c##_##mH,d) 3218c2ecf20Sopenharmony_ci#define PUSH_NV_9(X,o,p,c,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF,mG,dG,mH,dH,mI,d...) \ 3228c2ecf20Sopenharmony_ci PUSH_##o(p,c,c##_##mA,dA, \ 3238c2ecf20Sopenharmony_ci c##_##mB,dB, \ 3248c2ecf20Sopenharmony_ci c##_##mC,dC, \ 3258c2ecf20Sopenharmony_ci c##_##mD,dD, \ 3268c2ecf20Sopenharmony_ci c##_##mE,dE, \ 3278c2ecf20Sopenharmony_ci c##_##mF,dF, \ 3288c2ecf20Sopenharmony_ci c##_##mG,dG, \ 3298c2ecf20Sopenharmony_ci c##_##mH,dH, \ 3308c2ecf20Sopenharmony_ci c##_##mI,d) 3318c2ecf20Sopenharmony_ci#define PUSH_NV_10(X,o,p,c,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF,mG,dG,mH,dH,mI,dI,mJ,d...) \ 3328c2ecf20Sopenharmony_ci PUSH_##o(p,c,c##_##mA,dA, \ 3338c2ecf20Sopenharmony_ci c##_##mB,dB, \ 3348c2ecf20Sopenharmony_ci c##_##mC,dC, \ 3358c2ecf20Sopenharmony_ci c##_##mD,dD, \ 3368c2ecf20Sopenharmony_ci c##_##mE,dE, \ 3378c2ecf20Sopenharmony_ci c##_##mF,dF, \ 3388c2ecf20Sopenharmony_ci c##_##mG,dG, \ 3398c2ecf20Sopenharmony_ci c##_##mH,dH, \ 3408c2ecf20Sopenharmony_ci c##_##mI,dI, \ 3418c2ecf20Sopenharmony_ci c##_##mJ,d) 3428c2ecf20Sopenharmony_ci 3438c2ecf20Sopenharmony_ci#define PUSH_NV_(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,IMPL,...) IMPL 3448c2ecf20Sopenharmony_ci#define PUSH_NV(A...) PUSH_NV_(A, PUSH_NV_10, PUSH_NV_10, \ 3458c2ecf20Sopenharmony_ci PUSH_NV_9 , PUSH_NV_9, \ 3468c2ecf20Sopenharmony_ci PUSH_NV_8 , PUSH_NV_8, \ 3478c2ecf20Sopenharmony_ci PUSH_NV_7 , PUSH_NV_7, \ 3488c2ecf20Sopenharmony_ci PUSH_NV_6 , PUSH_NV_6, \ 3498c2ecf20Sopenharmony_ci PUSH_NV_5 , PUSH_NV_5, \ 3508c2ecf20Sopenharmony_ci PUSH_NV_4 , PUSH_NV_4, \ 3518c2ecf20Sopenharmony_ci PUSH_NV_3 , PUSH_NV_3, \ 3528c2ecf20Sopenharmony_ci PUSH_NV_2 , PUSH_NV_2, \ 3538c2ecf20Sopenharmony_ci PUSH_NV_1 , PUSH_NV_1)(, ##A) 3548c2ecf20Sopenharmony_ci 3558c2ecf20Sopenharmony_ci#define PUSH_IMMD(A...) PUSH_NV(NVIM, ##A) 3568c2ecf20Sopenharmony_ci#define PUSH_MTHD(A...) PUSH_NV(NVSQ, ##A) 3578c2ecf20Sopenharmony_ci#define PUSH_1INC(A...) PUSH_NV(NV1I, ##A) 3588c2ecf20Sopenharmony_ci#define PUSH_NINC(A...) PUSH_NV(NVNI, ##A) 3598c2ecf20Sopenharmony_ci#endif 360