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

nouveau_bo.h (5723B)


      1/* SPDX-License-Identifier: MIT */
      2#ifndef __NOUVEAU_BO_H__
      3#define __NOUVEAU_BO_H__
      4#include <drm/ttm/ttm_bo_driver.h>
      5#include <drm/drm_gem.h>
      6
      7struct nouveau_channel;
      8struct nouveau_cli;
      9struct nouveau_drm;
     10struct nouveau_fence;
     11
     12struct nouveau_bo {
     13	struct ttm_buffer_object bo;
     14	struct ttm_placement placement;
     15	u32 valid_domains;
     16	struct ttm_place placements[3];
     17	struct ttm_place busy_placements[3];
     18	bool force_coherent;
     19	struct ttm_bo_kmap_obj kmap;
     20	struct list_head head;
     21	struct list_head io_reserve_lru;
     22
     23	/* protected by ttm_bo_reserve() */
     24	struct drm_file *reserved_by;
     25	struct list_head entry;
     26	int pbbo_index;
     27	bool validate_mapped;
     28
     29	/* GPU address space is independent of CPU word size */
     30	uint64_t offset;
     31
     32	struct list_head vma_list;
     33
     34	unsigned contig:1;
     35	unsigned page:5;
     36	unsigned kind:8;
     37	unsigned comp:3;
     38	unsigned zeta:3;
     39	unsigned mode;
     40
     41	struct nouveau_drm_tile *tile;
     42};
     43
     44static inline struct nouveau_bo *
     45nouveau_bo(struct ttm_buffer_object *bo)
     46{
     47	return container_of(bo, struct nouveau_bo, bo);
     48}
     49
     50static inline int
     51nouveau_bo_ref(struct nouveau_bo *ref, struct nouveau_bo **pnvbo)
     52{
     53	struct nouveau_bo *prev;
     54
     55	if (!pnvbo)
     56		return -EINVAL;
     57	prev = *pnvbo;
     58
     59	if (ref) {
     60		ttm_bo_get(&ref->bo);
     61		*pnvbo = nouveau_bo(&ref->bo);
     62	} else {
     63		*pnvbo = NULL;
     64	}
     65	if (prev)
     66		ttm_bo_put(&prev->bo);
     67
     68	return 0;
     69}
     70
     71extern struct ttm_device_funcs nouveau_bo_driver;
     72
     73void nouveau_bo_move_init(struct nouveau_drm *);
     74struct nouveau_bo *nouveau_bo_alloc(struct nouveau_cli *, u64 *size, int *align,
     75				    u32 domain, u32 tile_mode, u32 tile_flags);
     76int  nouveau_bo_init(struct nouveau_bo *, u64 size, int align, u32 domain,
     77		     struct sg_table *sg, struct dma_resv *robj);
     78int  nouveau_bo_new(struct nouveau_cli *, u64 size, int align, u32 domain,
     79		    u32 tile_mode, u32 tile_flags, struct sg_table *sg,
     80		    struct dma_resv *robj,
     81		    struct nouveau_bo **);
     82int  nouveau_bo_pin(struct nouveau_bo *, u32 flags, bool contig);
     83int  nouveau_bo_unpin(struct nouveau_bo *);
     84int  nouveau_bo_map(struct nouveau_bo *);
     85void nouveau_bo_unmap(struct nouveau_bo *);
     86void nouveau_bo_placement_set(struct nouveau_bo *, u32 type, u32 busy);
     87void nouveau_bo_wr16(struct nouveau_bo *, unsigned index, u16 val);
     88u32  nouveau_bo_rd32(struct nouveau_bo *, unsigned index);
     89void nouveau_bo_wr32(struct nouveau_bo *, unsigned index, u32 val);
     90vm_fault_t nouveau_ttm_fault_reserve_notify(struct ttm_buffer_object *bo);
     91void nouveau_bo_fence(struct nouveau_bo *, struct nouveau_fence *, bool exclusive);
     92int  nouveau_bo_validate(struct nouveau_bo *, bool interruptible,
     93			 bool no_wait_gpu);
     94void nouveau_bo_sync_for_device(struct nouveau_bo *nvbo);
     95void nouveau_bo_sync_for_cpu(struct nouveau_bo *nvbo);
     96void nouveau_bo_add_io_reserve_lru(struct ttm_buffer_object *bo);
     97void nouveau_bo_del_io_reserve_lru(struct ttm_buffer_object *bo);
     98
     99/* TODO: submit equivalent to TTM generic API upstream? */
    100static inline void __iomem *
    101nvbo_kmap_obj_iovirtual(struct nouveau_bo *nvbo)
    102{
    103	bool is_iomem;
    104	void __iomem *ioptr = (void __force __iomem *)ttm_kmap_obj_virtual(
    105						&nvbo->kmap, &is_iomem);
    106	WARN_ON_ONCE(ioptr && !is_iomem);
    107	return ioptr;
    108}
    109
    110static inline void
    111nouveau_bo_unmap_unpin_unref(struct nouveau_bo **pnvbo)
    112{
    113	if (*pnvbo) {
    114		nouveau_bo_unmap(*pnvbo);
    115		nouveau_bo_unpin(*pnvbo);
    116		nouveau_bo_ref(NULL, pnvbo);
    117	}
    118}
    119
    120static inline int
    121nouveau_bo_new_pin_map(struct nouveau_cli *cli, u64 size, int align, u32 domain,
    122		       struct nouveau_bo **pnvbo)
    123{
    124	int ret = nouveau_bo_new(cli, size, align, domain,
    125				 0, 0, NULL, NULL, pnvbo);
    126	if (ret == 0) {
    127		ret = nouveau_bo_pin(*pnvbo, domain, true);
    128		if (ret == 0) {
    129			ret = nouveau_bo_map(*pnvbo);
    130			if (ret == 0)
    131				return ret;
    132			nouveau_bo_unpin(*pnvbo);
    133		}
    134		nouveau_bo_ref(NULL, pnvbo);
    135	}
    136	return ret;
    137}
    138
    139int nv04_bo_move_init(struct nouveau_channel *, u32);
    140int nv04_bo_move_m2mf(struct nouveau_channel *, struct ttm_buffer_object *,
    141		      struct ttm_resource *, struct ttm_resource *);
    142
    143int nv50_bo_move_init(struct nouveau_channel *, u32);
    144int nv50_bo_move_m2mf(struct nouveau_channel *, struct ttm_buffer_object *,
    145		      struct ttm_resource *, struct ttm_resource *);
    146
    147int nv84_bo_move_exec(struct nouveau_channel *, struct ttm_buffer_object *,
    148		      struct ttm_resource *, struct ttm_resource *);
    149
    150int nva3_bo_move_copy(struct nouveau_channel *, struct ttm_buffer_object *,
    151		      struct ttm_resource *, struct ttm_resource *);
    152
    153int nvc0_bo_move_init(struct nouveau_channel *, u32);
    154int nvc0_bo_move_m2mf(struct nouveau_channel *, struct ttm_buffer_object *,
    155		      struct ttm_resource *, struct ttm_resource *);
    156
    157int nvc0_bo_move_copy(struct nouveau_channel *, struct ttm_buffer_object *,
    158		      struct ttm_resource *, struct ttm_resource *);
    159
    160int nve0_bo_move_init(struct nouveau_channel *, u32);
    161int nve0_bo_move_copy(struct nouveau_channel *, struct ttm_buffer_object *,
    162		      struct ttm_resource *, struct ttm_resource *);
    163
    164#define NVBO_WR32_(b,o,dr,f) nouveau_bo_wr32((b), (o)/4 + (dr), (f))
    165#define NVBO_RD32_(b,o,dr)   nouveau_bo_rd32((b), (o)/4 + (dr))
    166#define NVBO_RD32(A...) DRF_RD(NVBO_RD32_,                  ##A)
    167#define NVBO_RV32(A...) DRF_RV(NVBO_RD32_,                  ##A)
    168#define NVBO_TV32(A...) DRF_TV(NVBO_RD32_,                  ##A)
    169#define NVBO_TD32(A...) DRF_TD(NVBO_RD32_,                  ##A)
    170#define NVBO_WR32(A...) DRF_WR(            NVBO_WR32_,      ##A)
    171#define NVBO_WV32(A...) DRF_WV(            NVBO_WR32_,      ##A)
    172#define NVBO_WD32(A...) DRF_WD(            NVBO_WR32_,      ##A)
    173#define NVBO_MR32(A...) DRF_MR(NVBO_RD32_, NVBO_WR32_, u32, ##A)
    174#define NVBO_MV32(A...) DRF_MV(NVBO_RD32_, NVBO_WR32_, u32, ##A)
    175#define NVBO_MD32(A...) DRF_MD(NVBO_RD32_, NVBO_WR32_, u32, ##A)
    176#endif