cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

wndw.h (5047B)


      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	void (*ilut)(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyh, int size);
     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 **);
    132void 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