linux/drivers/gpu/drm/nouveau/dispnv50/wndw.h
<<
>>
Prefs
   1#ifndef __NV50_KMS_WNDW_H__
   2#define __NV50_KMS_WNDW_H__
   3#define nv50_wndw(p) container_of((p), struct nv50_wndw, plane)
   4#include "disp.h"
   5#include "atom.h"
   6#include "lut.h"
   7
   8#include <nvif/notify.h>
   9
  10struct nv50_wndw_ctxdma {
  11        struct list_head head;
  12        struct nvif_object object;
  13};
  14
  15struct nv50_wndw {
  16        const struct nv50_wndw_func *func;
  17        const struct nv50_wimm_func *immd;
  18        int id;
  19        struct nv50_disp_interlock interlock;
  20
  21        struct {
  22                struct nvif_object *parent;
  23                struct list_head list;
  24        } ctxdma;
  25
  26        struct drm_plane plane;
  27
  28        struct nv50_lut ilut;
  29
  30        struct nv50_dmac wndw;
  31        struct nv50_dmac wimm;
  32
  33        struct nvif_notify notify;
  34        u16 ntfy;
  35        u16 sema;
  36        u32 data;
  37};
  38
  39int nv50_wndw_new_(const struct nv50_wndw_func *, struct drm_device *,
  40                   enum drm_plane_type, const char *name, int index,
  41                   const u32 *format, enum nv50_disp_interlock_type,
  42                   u32 interlock_data, u32 heads, struct nv50_wndw **);
  43void nv50_wndw_init(struct nv50_wndw *);
  44void nv50_wndw_fini(struct nv50_wndw *);
  45void nv50_wndw_flush_set(struct nv50_wndw *, u32 *interlock,
  46                         struct nv50_wndw_atom *);
  47void nv50_wndw_flush_clr(struct nv50_wndw *, u32 *interlock, bool flush,
  48                         struct nv50_wndw_atom *);
  49void nv50_wndw_ntfy_enable(struct nv50_wndw *, struct nv50_wndw_atom *);
  50int nv50_wndw_wait_armed(struct nv50_wndw *, struct nv50_wndw_atom *);
  51
  52struct nv50_wndw_func {
  53        int (*acquire)(struct nv50_wndw *, struct nv50_wndw_atom *asyw,
  54                       struct nv50_head_atom *asyh);
  55        void (*release)(struct nv50_wndw *, struct nv50_wndw_atom *asyw,
  56                        struct nv50_head_atom *asyh);
  57        void (*prepare)(struct nv50_wndw *, struct nv50_head_atom *asyh,
  58                        struct nv50_wndw_atom *asyw);
  59
  60        int (*sema_set)(struct nv50_wndw *, struct nv50_wndw_atom *);
  61        int (*sema_clr)(struct nv50_wndw *);
  62        void (*ntfy_reset)(struct nouveau_bo *, u32 offset);
  63        int (*ntfy_set)(struct nv50_wndw *, struct nv50_wndw_atom *);
  64        int (*ntfy_clr)(struct nv50_wndw *);
  65        int (*ntfy_wait_begun)(struct nouveau_bo *, u32 offset,
  66                               struct nvif_device *);
  67        bool (*ilut)(struct nv50_wndw *, struct nv50_wndw_atom *, int);
  68        void (*csc)(struct nv50_wndw *, struct nv50_wndw_atom *,
  69                    const struct drm_color_ctm *);
  70        int (*csc_set)(struct nv50_wndw *, struct nv50_wndw_atom *);
  71        int (*csc_clr)(struct nv50_wndw *);
  72        bool ilut_identity;
  73        int  ilut_size;
  74        bool olut_core;
  75        int (*xlut_set)(struct nv50_wndw *, struct nv50_wndw_atom *);
  76        int (*xlut_clr)(struct nv50_wndw *);
  77        int (*image_set)(struct nv50_wndw *, struct nv50_wndw_atom *);
  78        int (*image_clr)(struct nv50_wndw *);
  79        int (*scale_set)(struct nv50_wndw *, struct nv50_wndw_atom *);
  80        int (*blend_set)(struct nv50_wndw *, struct nv50_wndw_atom *);
  81
  82        int (*update)(struct nv50_wndw *, u32 *interlock);
  83};
  84
  85extern const struct drm_plane_funcs nv50_wndw;
  86
  87void base507c_ntfy_reset(struct nouveau_bo *, u32);
  88int base507c_ntfy_set(struct nv50_wndw *, struct nv50_wndw_atom *);
  89int base507c_ntfy_clr(struct nv50_wndw *);
  90int base507c_ntfy_wait_begun(struct nouveau_bo *, u32, struct nvif_device *);
  91int base507c_image_clr(struct nv50_wndw *);
  92int base507c_update(struct nv50_wndw *, u32 *);
  93
  94void base907c_csc(struct nv50_wndw *, struct nv50_wndw_atom *,
  95                  const struct drm_color_ctm *);
  96
  97struct nv50_wimm_func {
  98        int (*point)(struct nv50_wndw *, struct nv50_wndw_atom *);
  99
 100        int (*update)(struct nv50_wndw *, u32 *interlock);
 101};
 102
 103extern const struct nv50_wimm_func curs507a;
 104bool curs507a_space(struct nv50_wndw *);
 105
 106static inline __must_check int
 107nvif_chan_wait(struct nv50_dmac *dmac, u32 size)
 108{
 109        struct nv50_wndw *wndw = container_of(dmac, typeof(*wndw), wimm);
 110        return curs507a_space(wndw) ? 0 : -ETIMEDOUT;
 111}
 112
 113int wndwc37e_new(struct nouveau_drm *, enum drm_plane_type, int, s32,
 114                 struct nv50_wndw **);
 115int wndwc37e_new_(const struct nv50_wndw_func *, struct nouveau_drm *,
 116                  enum drm_plane_type type, int index, s32 oclass, u32 heads,
 117                  struct nv50_wndw **);
 118int wndwc37e_acquire(struct nv50_wndw *, struct nv50_wndw_atom *,
 119                     struct nv50_head_atom *);
 120void wndwc37e_release(struct nv50_wndw *, struct nv50_wndw_atom *,
 121                      struct nv50_head_atom *);
 122int wndwc37e_sema_set(struct nv50_wndw *, struct nv50_wndw_atom *);
 123int wndwc37e_sema_clr(struct nv50_wndw *);
 124int wndwc37e_ntfy_set(struct nv50_wndw *, struct nv50_wndw_atom *);
 125int wndwc37e_ntfy_clr(struct nv50_wndw *);
 126int wndwc37e_image_clr(struct nv50_wndw *);
 127int wndwc37e_blend_set(struct nv50_wndw *, struct nv50_wndw_atom *);
 128int wndwc37e_update(struct nv50_wndw *, u32 *);
 129
 130int wndwc57e_new(struct nouveau_drm *, enum drm_plane_type, int, s32,
 131                 struct nv50_wndw **);
 132bool wndwc57e_ilut(struct nv50_wndw *, struct nv50_wndw_atom *, int);
 133int wndwc57e_ilut_set(struct nv50_wndw *, struct nv50_wndw_atom *);
 134int wndwc57e_ilut_clr(struct nv50_wndw *);
 135int wndwc57e_csc_set(struct nv50_wndw *, struct nv50_wndw_atom *);
 136int wndwc57e_csc_clr(struct nv50_wndw *);
 137
 138int wndwc67e_new(struct nouveau_drm *, enum drm_plane_type, int, s32,
 139                 struct nv50_wndw **);
 140
 141int nv50_wndw_new(struct nouveau_drm *, enum drm_plane_type, int index,
 142                  struct nv50_wndw **);
 143#endif
 144