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

crc.h (3926B)


      1/* SPDX-License-Identifier: MIT */
      2#ifndef __NV50_CRC_H__
      3#define __NV50_CRC_H__
      4
      5#include <linux/mutex.h>
      6#include <drm/drm_crtc.h>
      7#include <drm/drm_vblank_work.h>
      8
      9#include <nvif/mem.h>
     10#include <nvkm/subdev/bios.h>
     11#include "nouveau_encoder.h"
     12
     13struct nv50_atom;
     14struct nv50_disp;
     15struct nv50_head;
     16
     17#if IS_ENABLED(CONFIG_DEBUG_FS)
     18enum nv50_crc_source {
     19	NV50_CRC_SOURCE_NONE = 0,
     20	NV50_CRC_SOURCE_AUTO,
     21	NV50_CRC_SOURCE_RG,
     22	NV50_CRC_SOURCE_OUTP_ACTIVE,
     23	NV50_CRC_SOURCE_OUTP_COMPLETE,
     24	NV50_CRC_SOURCE_OUTP_INACTIVE,
     25};
     26
     27/* RG -> SF (DP only)
     28 *    -> SOR
     29 *    -> PIOR
     30 *    -> DAC
     31 */
     32enum nv50_crc_source_type {
     33	NV50_CRC_SOURCE_TYPE_NONE = 0,
     34	NV50_CRC_SOURCE_TYPE_SOR,
     35	NV50_CRC_SOURCE_TYPE_PIOR,
     36	NV50_CRC_SOURCE_TYPE_DAC,
     37	NV50_CRC_SOURCE_TYPE_RG,
     38	NV50_CRC_SOURCE_TYPE_SF,
     39};
     40
     41struct nv50_crc_notifier_ctx {
     42	struct nvif_mem mem;
     43	struct nvif_object ntfy;
     44};
     45
     46struct nv50_crc_atom {
     47	enum nv50_crc_source src;
     48};
     49
     50struct nv50_crc_func {
     51	int (*set_src)(struct nv50_head *, int or, enum nv50_crc_source_type type,
     52		       struct nv50_crc_notifier_ctx *ctx);
     53	int (*set_ctx)(struct nv50_head *, struct nv50_crc_notifier_ctx *);
     54	u32 (*get_entry)(struct nv50_head *, struct nv50_crc_notifier_ctx *,
     55			 enum nv50_crc_source, int idx);
     56	bool (*ctx_finished)(struct nv50_head *,
     57			     struct nv50_crc_notifier_ctx *);
     58	short flip_threshold;
     59	short num_entries;
     60	size_t notifier_len;
     61};
     62
     63struct nv50_crc {
     64	spinlock_t lock;
     65	struct nv50_crc_notifier_ctx ctx[2];
     66	struct drm_vblank_work flip_work;
     67	enum nv50_crc_source src;
     68
     69	u64 frame;
     70	short entry_idx;
     71	short flip_threshold;
     72	u8 ctx_idx : 1;
     73	bool ctx_changed : 1;
     74};
     75
     76void nv50_crc_init(struct drm_device *dev);
     77int nv50_head_crc_late_register(struct nv50_head *);
     78void nv50_crc_handle_vblank(struct nv50_head *head);
     79
     80int nv50_crc_verify_source(struct drm_crtc *, const char *, size_t *);
     81const char *const *nv50_crc_get_sources(struct drm_crtc *, size_t *);
     82int nv50_crc_set_source(struct drm_crtc *, const char *);
     83
     84int nv50_crc_atomic_check_head(struct nv50_head *, struct nv50_head_atom *,
     85			       struct nv50_head_atom *);
     86void nv50_crc_atomic_check_outp(struct nv50_atom *atom);
     87void nv50_crc_atomic_stop_reporting(struct drm_atomic_state *);
     88void nv50_crc_atomic_init_notifier_contexts(struct drm_atomic_state *);
     89void nv50_crc_atomic_release_notifier_contexts(struct drm_atomic_state *);
     90void nv50_crc_atomic_start_reporting(struct drm_atomic_state *);
     91void nv50_crc_atomic_set(struct nv50_head *, struct nv50_head_atom *);
     92void nv50_crc_atomic_clr(struct nv50_head *);
     93
     94extern const struct nv50_crc_func crc907d;
     95extern const struct nv50_crc_func crcc37d;
     96extern const struct nv50_crc_func crcc57d;
     97
     98#else /* IS_ENABLED(CONFIG_DEBUG_FS) */
     99struct nv50_crc {};
    100struct nv50_crc_func {};
    101struct nv50_crc_atom {};
    102
    103#define nv50_crc_verify_source NULL
    104#define nv50_crc_get_sources NULL
    105#define nv50_crc_set_source NULL
    106
    107static inline void nv50_crc_init(struct drm_device *dev) {}
    108static inline int
    109nv50_head_crc_late_register(struct nv50_head *head) { return 0; }
    110static inline void nv50_crc_handle_vblank(struct nv50_head *head) {}
    111
    112static inline int
    113nv50_crc_atomic_check_head(struct nv50_head *head,
    114			   struct nv50_head_atom *asyh,
    115			   struct nv50_head_atom *armh) { return 0; }
    116static inline void nv50_crc_atomic_check_outp(struct nv50_atom *atom) {}
    117static inline void
    118nv50_crc_atomic_stop_reporting(struct drm_atomic_state *state) {}
    119static inline void
    120nv50_crc_atomic_init_notifier_contexts(struct drm_atomic_state *state) {}
    121static inline void
    122nv50_crc_atomic_release_notifier_contexts(struct drm_atomic_state *state) {}
    123static inline void
    124nv50_crc_atomic_start_reporting(struct drm_atomic_state *state) {}
    125static inline void
    126nv50_crc_atomic_set(struct nv50_head *head, struct nv50_head_atom *state) {}
    127static inline void
    128nv50_crc_atomic_clr(struct nv50_head *head) {}
    129
    130#endif /* IS_ENABLED(CONFIG_DEBUG_FS) */
    131#endif /* !__NV50_CRC_H__ */