162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Copyright 2019 Red Hat Inc. 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 562306a36Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 662306a36Sopenharmony_ci * to deal in the Software without restriction, including without limitation 762306a36Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 862306a36Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 962306a36Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * The above copyright notice and this permission notice shall be included in 1262306a36Sopenharmony_ci * all copies or substantial portions of the Software. 1362306a36Sopenharmony_ci * 1462306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1562306a36Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1662306a36Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1762306a36Sopenharmony_ci * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 1862306a36Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 1962306a36Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 2062306a36Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE. 2162306a36Sopenharmony_ci */ 2262306a36Sopenharmony_ci#ifndef __NVIF_PUSH_H__ 2362306a36Sopenharmony_ci#define __NVIF_PUSH_H__ 2462306a36Sopenharmony_ci#include <nvif/mem.h> 2562306a36Sopenharmony_ci#include <nvif/printf.h> 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#include <nvhw/drf.h> 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cistruct nvif_push { 3062306a36Sopenharmony_ci int (*wait)(struct nvif_push *push, u32 size); 3162306a36Sopenharmony_ci void (*kick)(struct nvif_push *push); 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci struct nvif_mem mem; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci u32 *bgn; 3662306a36Sopenharmony_ci u32 *cur; 3762306a36Sopenharmony_ci u32 *seg; 3862306a36Sopenharmony_ci u32 *end; 3962306a36Sopenharmony_ci}; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cistatic inline __must_check int 4262306a36Sopenharmony_ciPUSH_WAIT(struct nvif_push *push, u32 size) 4362306a36Sopenharmony_ci{ 4462306a36Sopenharmony_ci if (push->cur + size >= push->end) { 4562306a36Sopenharmony_ci int ret = push->wait(push, size); 4662306a36Sopenharmony_ci if (ret) 4762306a36Sopenharmony_ci return ret; 4862306a36Sopenharmony_ci } 4962306a36Sopenharmony_ci#ifdef CONFIG_NOUVEAU_DEBUG_PUSH 5062306a36Sopenharmony_ci push->seg = push->cur + size; 5162306a36Sopenharmony_ci#endif 5262306a36Sopenharmony_ci return 0; 5362306a36Sopenharmony_ci} 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistatic inline int 5662306a36Sopenharmony_ciPUSH_KICK(struct nvif_push *push) 5762306a36Sopenharmony_ci{ 5862306a36Sopenharmony_ci push->kick(push); 5962306a36Sopenharmony_ci return 0; 6062306a36Sopenharmony_ci} 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci#ifdef CONFIG_NOUVEAU_DEBUG_PUSH 6362306a36Sopenharmony_ci#define PUSH_PRINTF(p,f,a...) do { \ 6462306a36Sopenharmony_ci struct nvif_push *_ppp = (p); \ 6562306a36Sopenharmony_ci u32 __o = _ppp->cur - (u32 *)_ppp->mem.object.map.ptr; \ 6662306a36Sopenharmony_ci NVIF_DEBUG(&_ppp->mem.object, "%08x: "f, __o * 4, ##a); \ 6762306a36Sopenharmony_ci (void)__o; \ 6862306a36Sopenharmony_ci} while(0) 6962306a36Sopenharmony_ci#define PUSH_ASSERT_ON(a,b) WARN((a), b) 7062306a36Sopenharmony_ci#else 7162306a36Sopenharmony_ci#define PUSH_PRINTF(p,f,a...) 7262306a36Sopenharmony_ci#define PUSH_ASSERT_ON(a, b) 7362306a36Sopenharmony_ci#endif 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci#define PUSH_ASSERT(a,b) do { \ 7662306a36Sopenharmony_ci static_assert( \ 7762306a36Sopenharmony_ci __builtin_choose_expr(__builtin_constant_p(a), (a), 1), b \ 7862306a36Sopenharmony_ci ); \ 7962306a36Sopenharmony_ci PUSH_ASSERT_ON(!(a), b); \ 8062306a36Sopenharmony_ci} while(0) 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci#define PUSH_DATA__(p,d,f,a...) do { \ 8362306a36Sopenharmony_ci struct nvif_push *_p = (p); \ 8462306a36Sopenharmony_ci u32 _d = (d); \ 8562306a36Sopenharmony_ci PUSH_ASSERT(_p->cur < _p->seg, "segment overrun"); \ 8662306a36Sopenharmony_ci PUSH_ASSERT(_p->cur < _p->end, "pushbuf overrun"); \ 8762306a36Sopenharmony_ci PUSH_PRINTF(_p, "%08x"f, _d, ##a); \ 8862306a36Sopenharmony_ci *_p->cur++ = _d; \ 8962306a36Sopenharmony_ci} while(0) 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci#define PUSH_DATA_(X,p,m,i0,i1,d,s,f,a...) PUSH_DATA__((p), (d), "-> "#m f, ##a) 9262306a36Sopenharmony_ci#define PUSH_DATA(p,d) PUSH_DATA__((p), (d), " data - %s", __func__) 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci//XXX: error-check this against *real* pushbuffer end? 9562306a36Sopenharmony_ci#define PUSH_RSVD(p,d) do { \ 9662306a36Sopenharmony_ci struct nvif_push *__p = (p); \ 9762306a36Sopenharmony_ci __p->seg++; \ 9862306a36Sopenharmony_ci __p->end++; \ 9962306a36Sopenharmony_ci d; \ 10062306a36Sopenharmony_ci} while(0) 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci#ifdef CONFIG_NOUVEAU_DEBUG_PUSH 10362306a36Sopenharmony_ci#define PUSH_DATAp(X,p,m,i,o,d,s,f,a...) do { \ 10462306a36Sopenharmony_ci struct nvif_push *_pp = (p); \ 10562306a36Sopenharmony_ci const u32 *_dd = (d); \ 10662306a36Sopenharmony_ci u32 _s = (s), _i = (i?PUSH_##o##_INC); \ 10762306a36Sopenharmony_ci if (_s--) { \ 10862306a36Sopenharmony_ci PUSH_DATA_(X, _pp, X##m, i0, i1, *_dd++, 1, "+0x%x", 0); \ 10962306a36Sopenharmony_ci while (_s--) { \ 11062306a36Sopenharmony_ci PUSH_DATA_(X, _pp, X##m, i0, i1, *_dd++, 1, "+0x%x", _i); \ 11162306a36Sopenharmony_ci _i += (0?PUSH_##o##_INC); \ 11262306a36Sopenharmony_ci } \ 11362306a36Sopenharmony_ci } \ 11462306a36Sopenharmony_ci} while(0) 11562306a36Sopenharmony_ci#else 11662306a36Sopenharmony_ci#define PUSH_DATAp(X,p,m,i,o,d,s,f,a...) do { \ 11762306a36Sopenharmony_ci struct nvif_push *_p = (p); \ 11862306a36Sopenharmony_ci u32 _s = (s); \ 11962306a36Sopenharmony_ci PUSH_ASSERT(_p->cur + _s <= _p->seg, "segment overrun"); \ 12062306a36Sopenharmony_ci PUSH_ASSERT(_p->cur + _s <= _p->end, "pushbuf overrun"); \ 12162306a36Sopenharmony_ci memcpy(_p->cur, (d), _s << 2); \ 12262306a36Sopenharmony_ci _p->cur += _s; \ 12362306a36Sopenharmony_ci} while(0) 12462306a36Sopenharmony_ci#endif 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci#define PUSH_1(X,f,ds,n,o,p,s,mA,dA) do { \ 12762306a36Sopenharmony_ci PUSH_##o##_HDR((p), s, mA, (ds)+(n)); \ 12862306a36Sopenharmony_ci PUSH_##f(X, (p), X##mA, 1, o, (dA), ds, ""); \ 12962306a36Sopenharmony_ci} while(0) 13062306a36Sopenharmony_ci#define PUSH_2(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \ 13162306a36Sopenharmony_ci PUSH_ASSERT((mB) - (mA) == (1?PUSH_##o##_INC), "mthd1"); \ 13262306a36Sopenharmony_ci PUSH_1(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \ 13362306a36Sopenharmony_ci PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \ 13462306a36Sopenharmony_ci} while(0) 13562306a36Sopenharmony_ci#define PUSH_3(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \ 13662306a36Sopenharmony_ci PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd2"); \ 13762306a36Sopenharmony_ci PUSH_2(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \ 13862306a36Sopenharmony_ci PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \ 13962306a36Sopenharmony_ci} while(0) 14062306a36Sopenharmony_ci#define PUSH_4(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \ 14162306a36Sopenharmony_ci PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd3"); \ 14262306a36Sopenharmony_ci PUSH_3(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \ 14362306a36Sopenharmony_ci PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \ 14462306a36Sopenharmony_ci} while(0) 14562306a36Sopenharmony_ci#define PUSH_5(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \ 14662306a36Sopenharmony_ci PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd4"); \ 14762306a36Sopenharmony_ci PUSH_4(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \ 14862306a36Sopenharmony_ci PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \ 14962306a36Sopenharmony_ci} while(0) 15062306a36Sopenharmony_ci#define PUSH_6(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \ 15162306a36Sopenharmony_ci PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd5"); \ 15262306a36Sopenharmony_ci PUSH_5(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \ 15362306a36Sopenharmony_ci PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \ 15462306a36Sopenharmony_ci} while(0) 15562306a36Sopenharmony_ci#define PUSH_7(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \ 15662306a36Sopenharmony_ci PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd6"); \ 15762306a36Sopenharmony_ci PUSH_6(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \ 15862306a36Sopenharmony_ci PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \ 15962306a36Sopenharmony_ci} while(0) 16062306a36Sopenharmony_ci#define PUSH_8(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \ 16162306a36Sopenharmony_ci PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd7"); \ 16262306a36Sopenharmony_ci PUSH_7(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \ 16362306a36Sopenharmony_ci PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \ 16462306a36Sopenharmony_ci} while(0) 16562306a36Sopenharmony_ci#define PUSH_9(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \ 16662306a36Sopenharmony_ci PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd8"); \ 16762306a36Sopenharmony_ci PUSH_8(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \ 16862306a36Sopenharmony_ci PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \ 16962306a36Sopenharmony_ci} while(0) 17062306a36Sopenharmony_ci#define PUSH_10(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \ 17162306a36Sopenharmony_ci PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd9"); \ 17262306a36Sopenharmony_ci PUSH_9(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \ 17362306a36Sopenharmony_ci PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \ 17462306a36Sopenharmony_ci} while(0) 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci#define PUSH_1D(X,o,p,s,mA,dA) \ 17762306a36Sopenharmony_ci PUSH_1(X, DATA_, 1, 0, o, (p), s, X##mA, (dA)) 17862306a36Sopenharmony_ci#define PUSH_2D(X,o,p,s,mA,dA,mB,dB) \ 17962306a36Sopenharmony_ci PUSH_2(X, DATA_, 1, 0, o, (p), s, X##mB, (dB), \ 18062306a36Sopenharmony_ci X##mA, (dA)) 18162306a36Sopenharmony_ci#define PUSH_3D(X,o,p,s,mA,dA,mB,dB,mC,dC) \ 18262306a36Sopenharmony_ci PUSH_3(X, DATA_, 1, 0, o, (p), s, X##mC, (dC), \ 18362306a36Sopenharmony_ci X##mB, (dB), \ 18462306a36Sopenharmony_ci X##mA, (dA)) 18562306a36Sopenharmony_ci#define PUSH_4D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD) \ 18662306a36Sopenharmony_ci PUSH_4(X, DATA_, 1, 0, o, (p), s, X##mD, (dD), \ 18762306a36Sopenharmony_ci X##mC, (dC), \ 18862306a36Sopenharmony_ci X##mB, (dB), \ 18962306a36Sopenharmony_ci X##mA, (dA)) 19062306a36Sopenharmony_ci#define PUSH_5D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE) \ 19162306a36Sopenharmony_ci PUSH_5(X, DATA_, 1, 0, o, (p), s, X##mE, (dE), \ 19262306a36Sopenharmony_ci X##mD, (dD), \ 19362306a36Sopenharmony_ci X##mC, (dC), \ 19462306a36Sopenharmony_ci X##mB, (dB), \ 19562306a36Sopenharmony_ci X##mA, (dA)) 19662306a36Sopenharmony_ci#define PUSH_6D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF) \ 19762306a36Sopenharmony_ci PUSH_6(X, DATA_, 1, 0, o, (p), s, X##mF, (dF), \ 19862306a36Sopenharmony_ci X##mE, (dE), \ 19962306a36Sopenharmony_ci X##mD, (dD), \ 20062306a36Sopenharmony_ci X##mC, (dC), \ 20162306a36Sopenharmony_ci X##mB, (dB), \ 20262306a36Sopenharmony_ci X##mA, (dA)) 20362306a36Sopenharmony_ci#define PUSH_7D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF,mG,dG) \ 20462306a36Sopenharmony_ci PUSH_7(X, DATA_, 1, 0, o, (p), s, X##mG, (dG), \ 20562306a36Sopenharmony_ci X##mF, (dF), \ 20662306a36Sopenharmony_ci X##mE, (dE), \ 20762306a36Sopenharmony_ci X##mD, (dD), \ 20862306a36Sopenharmony_ci X##mC, (dC), \ 20962306a36Sopenharmony_ci X##mB, (dB), \ 21062306a36Sopenharmony_ci X##mA, (dA)) 21162306a36Sopenharmony_ci#define PUSH_8D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF,mG,dG,mH,dH) \ 21262306a36Sopenharmony_ci PUSH_8(X, DATA_, 1, 0, o, (p), s, X##mH, (dH), \ 21362306a36Sopenharmony_ci X##mG, (dG), \ 21462306a36Sopenharmony_ci X##mF, (dF), \ 21562306a36Sopenharmony_ci X##mE, (dE), \ 21662306a36Sopenharmony_ci X##mD, (dD), \ 21762306a36Sopenharmony_ci X##mC, (dC), \ 21862306a36Sopenharmony_ci X##mB, (dB), \ 21962306a36Sopenharmony_ci X##mA, (dA)) 22062306a36Sopenharmony_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) \ 22162306a36Sopenharmony_ci PUSH_9(X, DATA_, 1, 0, o, (p), s, X##mI, (dI), \ 22262306a36Sopenharmony_ci X##mH, (dH), \ 22362306a36Sopenharmony_ci X##mG, (dG), \ 22462306a36Sopenharmony_ci X##mF, (dF), \ 22562306a36Sopenharmony_ci X##mE, (dE), \ 22662306a36Sopenharmony_ci X##mD, (dD), \ 22762306a36Sopenharmony_ci X##mC, (dC), \ 22862306a36Sopenharmony_ci X##mB, (dB), \ 22962306a36Sopenharmony_ci X##mA, (dA)) 23062306a36Sopenharmony_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) \ 23162306a36Sopenharmony_ci PUSH_10(X, DATA_, 1, 0, o, (p), s, X##mJ, (dJ), \ 23262306a36Sopenharmony_ci X##mI, (dI), \ 23362306a36Sopenharmony_ci X##mH, (dH), \ 23462306a36Sopenharmony_ci X##mG, (dG), \ 23562306a36Sopenharmony_ci X##mF, (dF), \ 23662306a36Sopenharmony_ci X##mE, (dE), \ 23762306a36Sopenharmony_ci X##mD, (dD), \ 23862306a36Sopenharmony_ci X##mC, (dC), \ 23962306a36Sopenharmony_ci X##mB, (dB), \ 24062306a36Sopenharmony_ci X##mA, (dA)) 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci#define PUSH_1P(X,o,p,s,mA,dp,ds) \ 24362306a36Sopenharmony_ci PUSH_1(X, DATAp, ds, 0, o, (p), s, X##mA, (dp)) 24462306a36Sopenharmony_ci#define PUSH_2P(X,o,p,s,mA,dA,mB,dp,ds) \ 24562306a36Sopenharmony_ci PUSH_2(X, DATAp, ds, 0, o, (p), s, X##mB, (dp), \ 24662306a36Sopenharmony_ci X##mA, (dA)) 24762306a36Sopenharmony_ci#define PUSH_3P(X,o,p,s,mA,dA,mB,dB,mC,dp,ds) \ 24862306a36Sopenharmony_ci PUSH_3(X, DATAp, ds, 0, o, (p), s, X##mC, (dp), \ 24962306a36Sopenharmony_ci X##mB, (dB), \ 25062306a36Sopenharmony_ci X##mA, (dA)) 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_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 25362306a36Sopenharmony_ci#define PUSH(A...) PUSH_(A, PUSH_10P, PUSH_10D, \ 25462306a36Sopenharmony_ci PUSH_9P , PUSH_9D, \ 25562306a36Sopenharmony_ci PUSH_8P , PUSH_8D, \ 25662306a36Sopenharmony_ci PUSH_7P , PUSH_7D, \ 25762306a36Sopenharmony_ci PUSH_6P , PUSH_6D, \ 25862306a36Sopenharmony_ci PUSH_5P , PUSH_5D, \ 25962306a36Sopenharmony_ci PUSH_4P , PUSH_4D, \ 26062306a36Sopenharmony_ci PUSH_3P , PUSH_3D, \ 26162306a36Sopenharmony_ci PUSH_2P , PUSH_2D, \ 26262306a36Sopenharmony_ci PUSH_1P , PUSH_1D)(, ##A) 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci#define PUSH_NVIM(p,c,m,d) do { \ 26562306a36Sopenharmony_ci struct nvif_push *__p = (p); \ 26662306a36Sopenharmony_ci u32 __d = (d); \ 26762306a36Sopenharmony_ci PUSH_IMMD_HDR(__p, c, m, __d); \ 26862306a36Sopenharmony_ci __p->cur--; \ 26962306a36Sopenharmony_ci PUSH_PRINTF(__p, "%08x-> "#m, __d); \ 27062306a36Sopenharmony_ci __p->cur++; \ 27162306a36Sopenharmony_ci} while(0) 27262306a36Sopenharmony_ci#define PUSH_NVSQ(A...) PUSH(MTHD, ##A) 27362306a36Sopenharmony_ci#define PUSH_NV1I(A...) PUSH(1INC, ##A) 27462306a36Sopenharmony_ci#define PUSH_NVNI(A...) PUSH(NINC, ##A) 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_ci#define PUSH_NV_1(X,o,p,c,mA,d...) \ 27862306a36Sopenharmony_ci PUSH_##o(p,c,c##_##mA,d) 27962306a36Sopenharmony_ci#define PUSH_NV_2(X,o,p,c,mA,dA,mB,d...) \ 28062306a36Sopenharmony_ci PUSH_##o(p,c,c##_##mA,dA, \ 28162306a36Sopenharmony_ci c##_##mB,d) 28262306a36Sopenharmony_ci#define PUSH_NV_3(X,o,p,c,mA,dA,mB,dB,mC,d...) \ 28362306a36Sopenharmony_ci PUSH_##o(p,c,c##_##mA,dA, \ 28462306a36Sopenharmony_ci c##_##mB,dB, \ 28562306a36Sopenharmony_ci c##_##mC,d) 28662306a36Sopenharmony_ci#define PUSH_NV_4(X,o,p,c,mA,dA,mB,dB,mC,dC,mD,d...) \ 28762306a36Sopenharmony_ci PUSH_##o(p,c,c##_##mA,dA, \ 28862306a36Sopenharmony_ci c##_##mB,dB, \ 28962306a36Sopenharmony_ci c##_##mC,dC, \ 29062306a36Sopenharmony_ci c##_##mD,d) 29162306a36Sopenharmony_ci#define PUSH_NV_5(X,o,p,c,mA,dA,mB,dB,mC,dC,mD,dD,mE,d...) \ 29262306a36Sopenharmony_ci PUSH_##o(p,c,c##_##mA,dA, \ 29362306a36Sopenharmony_ci c##_##mB,dB, \ 29462306a36Sopenharmony_ci c##_##mC,dC, \ 29562306a36Sopenharmony_ci c##_##mD,dD, \ 29662306a36Sopenharmony_ci c##_##mE,d) 29762306a36Sopenharmony_ci#define PUSH_NV_6(X,o,p,c,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,d...) \ 29862306a36Sopenharmony_ci PUSH_##o(p,c,c##_##mA,dA, \ 29962306a36Sopenharmony_ci c##_##mB,dB, \ 30062306a36Sopenharmony_ci c##_##mC,dC, \ 30162306a36Sopenharmony_ci c##_##mD,dD, \ 30262306a36Sopenharmony_ci c##_##mE,dE, \ 30362306a36Sopenharmony_ci c##_##mF,d) 30462306a36Sopenharmony_ci#define PUSH_NV_7(X,o,p,c,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF,mG,d...) \ 30562306a36Sopenharmony_ci PUSH_##o(p,c,c##_##mA,dA, \ 30662306a36Sopenharmony_ci c##_##mB,dB, \ 30762306a36Sopenharmony_ci c##_##mC,dC, \ 30862306a36Sopenharmony_ci c##_##mD,dD, \ 30962306a36Sopenharmony_ci c##_##mE,dE, \ 31062306a36Sopenharmony_ci c##_##mF,dF, \ 31162306a36Sopenharmony_ci c##_##mG,d) 31262306a36Sopenharmony_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...) \ 31362306a36Sopenharmony_ci PUSH_##o(p,c,c##_##mA,dA, \ 31462306a36Sopenharmony_ci c##_##mB,dB, \ 31562306a36Sopenharmony_ci c##_##mC,dC, \ 31662306a36Sopenharmony_ci c##_##mD,dD, \ 31762306a36Sopenharmony_ci c##_##mE,dE, \ 31862306a36Sopenharmony_ci c##_##mF,dF, \ 31962306a36Sopenharmony_ci c##_##mG,dG, \ 32062306a36Sopenharmony_ci c##_##mH,d) 32162306a36Sopenharmony_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...) \ 32262306a36Sopenharmony_ci PUSH_##o(p,c,c##_##mA,dA, \ 32362306a36Sopenharmony_ci c##_##mB,dB, \ 32462306a36Sopenharmony_ci c##_##mC,dC, \ 32562306a36Sopenharmony_ci c##_##mD,dD, \ 32662306a36Sopenharmony_ci c##_##mE,dE, \ 32762306a36Sopenharmony_ci c##_##mF,dF, \ 32862306a36Sopenharmony_ci c##_##mG,dG, \ 32962306a36Sopenharmony_ci c##_##mH,dH, \ 33062306a36Sopenharmony_ci c##_##mI,d) 33162306a36Sopenharmony_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...) \ 33262306a36Sopenharmony_ci PUSH_##o(p,c,c##_##mA,dA, \ 33362306a36Sopenharmony_ci c##_##mB,dB, \ 33462306a36Sopenharmony_ci c##_##mC,dC, \ 33562306a36Sopenharmony_ci c##_##mD,dD, \ 33662306a36Sopenharmony_ci c##_##mE,dE, \ 33762306a36Sopenharmony_ci c##_##mF,dF, \ 33862306a36Sopenharmony_ci c##_##mG,dG, \ 33962306a36Sopenharmony_ci c##_##mH,dH, \ 34062306a36Sopenharmony_ci c##_##mI,dI, \ 34162306a36Sopenharmony_ci c##_##mJ,d) 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_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 34462306a36Sopenharmony_ci#define PUSH_NV(A...) PUSH_NV_(A, PUSH_NV_10, PUSH_NV_10, \ 34562306a36Sopenharmony_ci PUSH_NV_9 , PUSH_NV_9, \ 34662306a36Sopenharmony_ci PUSH_NV_8 , PUSH_NV_8, \ 34762306a36Sopenharmony_ci PUSH_NV_7 , PUSH_NV_7, \ 34862306a36Sopenharmony_ci PUSH_NV_6 , PUSH_NV_6, \ 34962306a36Sopenharmony_ci PUSH_NV_5 , PUSH_NV_5, \ 35062306a36Sopenharmony_ci PUSH_NV_4 , PUSH_NV_4, \ 35162306a36Sopenharmony_ci PUSH_NV_3 , PUSH_NV_3, \ 35262306a36Sopenharmony_ci PUSH_NV_2 , PUSH_NV_2, \ 35362306a36Sopenharmony_ci PUSH_NV_1 , PUSH_NV_1)(, ##A) 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_ci#define PUSH_IMMD(A...) PUSH_NV(NVIM, ##A) 35662306a36Sopenharmony_ci#define PUSH_MTHD(A...) PUSH_NV(NVSQ, ##A) 35762306a36Sopenharmony_ci#define PUSH_1INC(A...) PUSH_NV(NV1I, ##A) 35862306a36Sopenharmony_ci#define PUSH_NINC(A...) PUSH_NV(NVNI, ##A) 35962306a36Sopenharmony_ci#endif 360