linux/drivers/gpu/drm/nouveau/dispnv50/disp.h
<<
>>
Prefs
   1#ifndef __NV50_KMS_H__
   2#define __NV50_KMS_H__
   3#include <nvif/mem.h>
   4
   5#include "nouveau_display.h"
   6
   7struct nv50_disp {
   8        struct nvif_disp *disp;
   9        struct nv50_core *core;
  10
  11#define NV50_DISP_SYNC(c, o)                                ((c) * 0x040 + (o))
  12#define NV50_DISP_CORE_NTFY                       NV50_DISP_SYNC(0      , 0x00)
  13#define NV50_DISP_WNDW_SEM0(c)                    NV50_DISP_SYNC(1 + (c), 0x00)
  14#define NV50_DISP_WNDW_SEM1(c)                    NV50_DISP_SYNC(1 + (c), 0x10)
  15#define NV50_DISP_WNDW_NTFY(c)                    NV50_DISP_SYNC(1 + (c), 0x20)
  16#define NV50_DISP_BASE_SEM0(c)                    NV50_DISP_WNDW_SEM0(0 + (c))
  17#define NV50_DISP_BASE_SEM1(c)                    NV50_DISP_WNDW_SEM1(0 + (c))
  18#define NV50_DISP_BASE_NTFY(c)                    NV50_DISP_WNDW_NTFY(0 + (c))
  19#define NV50_DISP_OVLY_SEM0(c)                    NV50_DISP_WNDW_SEM0(4 + (c))
  20#define NV50_DISP_OVLY_SEM1(c)                    NV50_DISP_WNDW_SEM1(4 + (c))
  21#define NV50_DISP_OVLY_NTFY(c)                    NV50_DISP_WNDW_NTFY(4 + (c))
  22        struct nouveau_bo *sync;
  23
  24        struct mutex mutex;
  25};
  26
  27static inline struct nv50_disp *
  28nv50_disp(struct drm_device *dev)
  29{
  30        return nouveau_display(dev)->priv;
  31}
  32
  33struct nv50_disp_interlock {
  34        enum nv50_disp_interlock_type {
  35                NV50_DISP_INTERLOCK_CORE = 0,
  36                NV50_DISP_INTERLOCK_CURS,
  37                NV50_DISP_INTERLOCK_BASE,
  38                NV50_DISP_INTERLOCK_OVLY,
  39                NV50_DISP_INTERLOCK_WNDW,
  40                NV50_DISP_INTERLOCK_WIMM,
  41                NV50_DISP_INTERLOCK__SIZE
  42        } type;
  43        u32 data;
  44        u32 wimm;
  45};
  46
  47void corec37d_ntfy_init(struct nouveau_bo *, u32);
  48
  49void head907d_olut_load(struct drm_color_lut *, int size, void __iomem *);
  50
  51struct nv50_chan {
  52        struct nvif_object user;
  53        struct nvif_device *device;
  54};
  55
  56struct nv50_dmac {
  57        struct nv50_chan base;
  58
  59        struct nvif_mem push;
  60        u32 *ptr;
  61
  62        struct nvif_object sync;
  63        struct nvif_object vram;
  64
  65        /* Protects against concurrent pushbuf access to this channel, lock is
  66         * grabbed by evo_wait (if the pushbuf reservation is successful) and
  67         * dropped again by evo_kick. */
  68        struct mutex lock;
  69};
  70
  71int nv50_dmac_create(struct nvif_device *device, struct nvif_object *disp,
  72                     const s32 *oclass, u8 head, void *data, u32 size,
  73                     u64 syncbuf, struct nv50_dmac *dmac);
  74void nv50_dmac_destroy(struct nv50_dmac *);
  75
  76u32 *evo_wait(struct nv50_dmac *, int nr);
  77void evo_kick(u32 *, struct nv50_dmac *);
  78
  79#define evo_mthd(p, m, s) do {                                          \
  80        const u32 _m = (m), _s = (s);                                   \
  81        if (drm_debug & DRM_UT_KMS)                                     \
  82                pr_err("%04x %d %s\n", _m, _s, __func__);               \
  83        *((p)++) = ((_s << 18) | _m);                                   \
  84} while(0)
  85
  86#define evo_data(p, d) do {                                             \
  87        const u32 _d = (d);                                             \
  88        if (drm_debug & DRM_UT_KMS)                                     \
  89                pr_err("\t%08x\n", _d);                                 \
  90        *((p)++) = _d;                                                  \
  91} while(0)
  92#endif
  93