Home | History | Annotate | Download | only in nv30
      1 #ifndef __NV30_WINSYS_H__
      2 #define __NV30_WINSYS_H__
      3 
      4 #include <string.h>
      5 #include "nouveau/nouveau_winsys.h"
      6 #include "nouveau/nouveau_buffer.h"
      7 
      8 /*XXX: rnn */
      9 #define NV40_3D_VTXTEX_OFFSET(i) (0x0900 + ((i) * 0x20)) // 401e80
     10 #define NV40_3D_VTXTEX_FORMAT(i) (0x0904 + ((i) * 0x20)) // 401e90
     11 #define NV40_3D_VTXTEX_WRAP(i)   (0x0908 + ((i) * 0x20)) // 401ea0
     12 #define NV40_3D_VTXTEX_ENABLE(i) (0x090c + ((i) * 0x20)) // 401eb0
     13 #define NV40_3D_VTXTEX_SWZ(i)    (0x0910 + ((i) * 0x20)) // 401ec0
     14 #define NV40_3D_VTXTEX_FILTER(i) (0x0914 + ((i) * 0x20)) // 401ed0
     15 #define NV40_3D_VTXTEX_SIZE(i)   (0x0918 + ((i) * 0x20)) // 401ee0
     16 #define NV40_3D_VTXTEX_BCOL(i)   (0x091c + ((i) * 0x20)) // 401ef0
     17 #define NV30_3D_VTX_CACHE_INVALIDATE_1710 0x1710
     18 #define NV30_3D_R1718 0x1718
     19 #define NV40_3D_PRIM_RESTART_ENABLE 0x1dac
     20 #define NV40_3D_PRIM_RESTART_INDEX  0x1db0
     21 
     22 static INLINE void
     23 PUSH_RELOC(struct nouveau_pushbuf *push, struct nouveau_bo *bo, uint32_t offset,
     24       uint32_t flags, uint32_t vor, uint32_t tor)
     25 {
     26    nouveau_pushbuf_reloc(push, bo, offset, flags, vor, tor);
     27 }
     28 
     29 static INLINE struct nouveau_bufctx *
     30 bufctx(struct nouveau_pushbuf *push)
     31 {
     32    struct nouveau_bufctx **pctx = push->user_priv;
     33    return *pctx;
     34 }
     35 
     36 static INLINE void
     37 PUSH_RESET(struct nouveau_pushbuf *push, int bin)
     38 {
     39    nouveau_bufctx_reset(bufctx(push), bin);
     40 }
     41 
     42 static INLINE void
     43 PUSH_REFN(struct nouveau_pushbuf *push, int bin,
     44      struct nouveau_bo *bo, uint32_t access)
     45 {
     46    nouveau_bufctx_refn(bufctx(push), bin, bo, access);
     47 }
     48 
     49 static INLINE void
     50 PUSH_MTHDl(struct nouveau_pushbuf *push, int subc, int mthd, int bin,
     51       struct nouveau_bo *bo, uint32_t offset, uint32_t access)
     52 {
     53    nouveau_bufctx_mthd(bufctx(push), bin, (1 << 18) | (subc << 13) | mthd,
     54                        bo, offset, access | NOUVEAU_BO_LOW, 0, 0)->priv = NULL;
     55    PUSH_DATA(push, bo->offset + offset);
     56 }
     57 
     58 static INLINE void
     59 PUSH_MTHDo(struct nouveau_pushbuf *push, int subc, int mthd, int bin,
     60       struct nouveau_bo *bo, uint32_t access, uint32_t vor, uint32_t tor)
     61 {
     62    nouveau_bufctx_mthd(bufctx(push), bin, (1 << 18) | (subc << 13) | mthd,
     63                        bo, 0, access | NOUVEAU_BO_OR, vor, tor)->priv = NULL;
     64    if (bo->flags & NOUVEAU_BO_VRAM)
     65       PUSH_DATA(push, vor);
     66    else
     67       PUSH_DATA(push, tor);
     68 }
     69 
     70 static INLINE void
     71 PUSH_MTHDs(struct nouveau_pushbuf *push, int subc, int mthd, int bin,
     72       struct nouveau_bo *bo, uint32_t data, uint32_t access,
     73       uint32_t vor, uint32_t tor)
     74 {
     75    nouveau_bufctx_mthd(bufctx(push), bin, (1 << 18) | (subc << 13) | mthd,
     76                        bo, data, access | NOUVEAU_BO_OR, vor, tor)->priv = NULL;
     77    if (bo->flags & NOUVEAU_BO_VRAM)
     78       PUSH_DATA(push, data | vor);
     79    else
     80       PUSH_DATA(push, data | tor);
     81 }
     82 
     83 static INLINE struct nouveau_bufref *
     84 PUSH_MTHD(struct nouveau_pushbuf *push, int subc, int mthd, int bin,
     85      struct nouveau_bo *bo, uint32_t data, uint32_t access,
     86      uint32_t vor, uint32_t tor)
     87 {
     88    struct nouveau_bufref *bref =
     89    nouveau_bufctx_mthd(bufctx(push), bin, (1 << 18) | (subc << 13) | mthd,
     90                        bo, data, access | NOUVEAU_BO_OR, vor, tor);
     91    if (access & NOUVEAU_BO_LOW)
     92       data += bo->offset;
     93    if (bo->flags & NOUVEAU_BO_VRAM)
     94       data |= vor;
     95    else
     96       data |= tor;
     97    PUSH_DATA(push, data);
     98    bref->priv = NULL;
     99    return bref;
    100 }
    101 
    102 static INLINE void
    103 PUSH_RESRC(struct nouveau_pushbuf *push, int subc, int mthd, int bin,
    104            struct nv04_resource *r, uint32_t data, uint32_t access,
    105            uint32_t vor, uint32_t tor)
    106 {
    107    PUSH_MTHD(push, subc, mthd, bin, r->bo, r->offset + data,
    108              r->domain | access, vor, tor)->priv = r;
    109 }
    110 
    111 static INLINE void
    112 BEGIN_NV04(struct nouveau_pushbuf *push, int subc, int mthd, int size)
    113 {
    114    PUSH_SPACE(push, size + 1);
    115    PUSH_DATA (push, 0x00000000 | (size << 18) | (subc << 13) | mthd);
    116 }
    117 
    118 static INLINE void
    119 BEGIN_NI04(struct nouveau_pushbuf *push, int subc, int mthd, int size)
    120 {
    121    PUSH_SPACE(push, size + 1);
    122    PUSH_DATA (push, 0x40000000 | (size << 18) | (subc << 13) | mthd);
    123 }
    124 
    125 /* subchannel assignment
    126  *
    127  * 0: <1.0.0 - used by kernel for m2mf
    128  *     1.0.0 - used by kernel for nvsw
    129  *
    130  * 1: <1.0.0 - used by kernel for nvsw
    131  *     1.0.0 - free for userspace
    132  *
    133  * 2-7: free for userspace on all kernel versions
    134  */
    135 
    136 #define SUBC_M2MF(mthd)  2, (mthd)
    137 #define NV03_M2MF(mthd)  SUBC_M2MF(NV03_M2MF_##mthd)
    138 
    139 #define SUBC_SF2D(mthd)  3, (mthd)
    140 #define NV04_SF2D(mthd)  SUBC_SF2D(NV04_SURFACE_2D_##mthd)
    141 
    142 #define SUBC_SSWZ(mthd)  4, (mthd)
    143 #define NV04_SSWZ(mthd)  SUBC_SSWZ(NV04_SURFACE_SWZ_##mthd)
    144 
    145 #define SUBC_SIFM(mthd)  5, (mthd)
    146 #define NV03_SIFM(mthd)  SUBC_SIFM(NV03_SIFM_##mthd)
    147 #define NV05_SIFM(mthd)  SUBC_SIFM(NV05_SIFM_##mthd)
    148 
    149 #define SUBC_3D(mthd)    7, (mthd)
    150 #define NV30_3D(mthd)    SUBC_3D(NV30_3D_##mthd)
    151 #define NV40_3D(mthd)    SUBC_3D(NV40_3D_##mthd)
    152 
    153 #define NV01_SUBC(subc, mthd) SUBC_##subc((NV01_SUBCHAN_##mthd))
    154 #define NV11_SUBC(subc, mthd) SUBC_##subc((NV11_SUBCHAN_##mthd))
    155 
    156 #define NV04_GRAPH(subc, mthd) SUBC_##subc((NV04_GRAPH_##mthd))
    157 
    158 #endif
    159