diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu.h')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 346 | 
1 files changed, 140 insertions, 206 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 833c3c16501a..103635ab784c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -36,16 +36,18 @@  #include <linux/hashtable.h>  #include <linux/dma-fence.h> -#include <ttm/ttm_bo_api.h> -#include <ttm/ttm_bo_driver.h> -#include <ttm/ttm_placement.h> -#include <ttm/ttm_module.h> -#include <ttm/ttm_execbuf_util.h> +#include <drm/ttm/ttm_bo_api.h> +#include <drm/ttm/ttm_bo_driver.h> +#include <drm/ttm/ttm_placement.h> +#include <drm/ttm/ttm_module.h> +#include <drm/ttm/ttm_execbuf_util.h>  #include <drm/drmP.h>  #include <drm/drm_gem.h>  #include <drm/amdgpu_drm.h> +#include <kgd_kfd_interface.h> +  #include "amd_shared.h"  #include "amdgpu_mode.h"  #include "amdgpu_ih.h" @@ -62,16 +64,20 @@  #include "amdgpu_acp.h"  #include "amdgpu_uvd.h"  #include "amdgpu_vce.h" +#include "amdgpu_vcn.h"  #include "gpu_scheduler.h"  #include "amdgpu_virt.h" +#include "amdgpu_gart.h"  /*   * Modules parameters.   */  extern int amdgpu_modeset;  extern int amdgpu_vram_limit; +extern int amdgpu_vis_vram_limit;  extern int amdgpu_gart_size; +extern int amdgpu_gtt_size;  extern int amdgpu_moverate;  extern int amdgpu_benchmarking;  extern int amdgpu_testing; @@ -90,8 +96,10 @@ extern int amdgpu_bapm;  extern int amdgpu_deep_color;  extern int amdgpu_vm_size;  extern int amdgpu_vm_block_size; +extern int amdgpu_vm_fragment_size;  extern int amdgpu_vm_fault_stop;  extern int amdgpu_vm_debug; +extern int amdgpu_vm_update_mode;  extern int amdgpu_sched_jobs;  extern int amdgpu_sched_hw_submission;  extern int amdgpu_no_evict; @@ -100,6 +108,7 @@ extern unsigned amdgpu_pcie_gen_cap;  extern unsigned amdgpu_pcie_lane_cap;  extern unsigned amdgpu_cg_mask;  extern unsigned amdgpu_pg_mask; +extern unsigned amdgpu_sdma_phase_quantum;  extern char *amdgpu_disable_cu;  extern char *amdgpu_virtual_display;  extern unsigned amdgpu_pp_feature_mask; @@ -109,6 +118,15 @@ extern int amdgpu_prim_buf_per_se;  extern int amdgpu_pos_buf_per_se;  extern int amdgpu_cntl_sb_buf_per_se;  extern int amdgpu_param_buf_per_se; +extern int amdgpu_job_hang_limit; +extern int amdgpu_lbpw; + +#ifdef CONFIG_DRM_AMDGPU_SI +extern int amdgpu_si_support; +#endif +#ifdef CONFIG_DRM_AMDGPU_CIK +extern int amdgpu_cik_support; +#endif  #define AMDGPU_DEFAULT_GTT_SIZE_MB		3072ULL /* 3GB by default */  #define AMDGPU_WAIT_IDLE_TIMEOUT_IN_MS	        3000 @@ -305,8 +323,8 @@ struct amdgpu_gart_funcs {  	/* set pte flags based per asic */  	uint64_t (*get_vm_pte_flags)(struct amdgpu_device *adev,  				     uint32_t flags); -	/* adjust mc addr in fb for APU case */ -	u64 (*adjust_mc_addr)(struct amdgpu_device *adev, u64 addr); +	/* get the pde for a given mc addr */ +	u64 (*get_vm_pde)(struct amdgpu_device *adev, u64 addr);  	uint32_t (*get_invalidate_req)(unsigned int vm_id);  }; @@ -356,78 +374,10 @@ struct amdgpu_clock {  };  /* - * BO. + * GEM.   */ -struct amdgpu_bo_list_entry { -	struct amdgpu_bo		*robj; -	struct ttm_validate_buffer	tv; -	struct amdgpu_bo_va		*bo_va; -	uint32_t			priority; -	struct page			**user_pages; -	int				user_invalidated; -}; - -struct amdgpu_bo_va_mapping { -	struct list_head		list; -	struct rb_node			rb; -	uint64_t			start; -	uint64_t			last; -	uint64_t			__subtree_last; -	uint64_t			offset; -	uint64_t			flags; -}; - -/* bo virtual addresses in a specific vm */ -struct amdgpu_bo_va { -	/* protected by bo being reserved */ -	struct list_head		bo_list; -	struct dma_fence	        *last_pt_update; -	unsigned			ref_count; - -	/* protected by vm mutex and spinlock */ -	struct list_head		vm_status; - -	/* mappings for this bo_va */ -	struct list_head		invalids; -	struct list_head		valids; - -	/* constant after initialization */ -	struct amdgpu_vm		*vm; -	struct amdgpu_bo		*bo; -};  #define AMDGPU_GEM_DOMAIN_MAX		0x3 - -struct amdgpu_bo { -	/* Protected by tbo.reserved */ -	u32				prefered_domains; -	u32				allowed_domains; -	struct ttm_place		placements[AMDGPU_GEM_DOMAIN_MAX + 1]; -	struct ttm_placement		placement; -	struct ttm_buffer_object	tbo; -	struct ttm_bo_kmap_obj		kmap; -	u64				flags; -	unsigned			pin_count; -	void				*kptr; -	u64				tiling_flags; -	u64				metadata_flags; -	void				*metadata; -	u32				metadata_size; -	unsigned			prime_shared_count; -	/* list of all virtual address to which this bo -	 * is associated to -	 */ -	struct list_head		va; -	/* Constant after initialization */ -	struct drm_gem_object		gem_base; -	struct amdgpu_bo		*parent; -	struct amdgpu_bo		*shadow; - -	struct ttm_bo_kmap_obj		dma_buf_vmap; -	struct amdgpu_mn		*mn; -	struct list_head		mn_list; -	struct list_head		shadow_list; -};  #define gem_to_amdgpu_bo(gobj) container_of((gobj), struct amdgpu_bo, gem_base)  void amdgpu_gem_object_free(struct drm_gem_object *obj); @@ -519,49 +469,6 @@ int amdgpu_fence_slab_init(void);  void amdgpu_fence_slab_fini(void);  /* - * GART structures, functions & helpers - */ -struct amdgpu_mc; - -#define AMDGPU_GPU_PAGE_SIZE 4096 -#define AMDGPU_GPU_PAGE_MASK (AMDGPU_GPU_PAGE_SIZE - 1) -#define AMDGPU_GPU_PAGE_SHIFT 12 -#define AMDGPU_GPU_PAGE_ALIGN(a) (((a) + AMDGPU_GPU_PAGE_MASK) & ~AMDGPU_GPU_PAGE_MASK) - -struct amdgpu_gart { -	dma_addr_t			table_addr; -	struct amdgpu_bo		*robj; -	void				*ptr; -	unsigned			num_gpu_pages; -	unsigned			num_cpu_pages; -	unsigned			table_size; -#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS -	struct page			**pages; -#endif -	bool				ready; - -	/* Asic default pte flags */ -	uint64_t			gart_pte_flags; - -	const struct amdgpu_gart_funcs *gart_funcs; -}; - -int amdgpu_gart_table_ram_alloc(struct amdgpu_device *adev); -void amdgpu_gart_table_ram_free(struct amdgpu_device *adev); -int amdgpu_gart_table_vram_alloc(struct amdgpu_device *adev); -void amdgpu_gart_table_vram_free(struct amdgpu_device *adev); -int amdgpu_gart_table_vram_pin(struct amdgpu_device *adev); -void amdgpu_gart_table_vram_unpin(struct amdgpu_device *adev); -int amdgpu_gart_init(struct amdgpu_device *adev); -void amdgpu_gart_fini(struct amdgpu_device *adev); -void amdgpu_gart_unbind(struct amdgpu_device *adev, uint64_t offset, -			int pages); -int amdgpu_gart_bind(struct amdgpu_device *adev, uint64_t offset, -		     int pages, struct page **pagelist, -		     dma_addr_t *dma_addr, uint64_t flags); -int amdgpu_ttm_recover_gart(struct amdgpu_device *adev); - -/*   * VMHUB structures, functions & helpers   */  struct amdgpu_vmhub { @@ -585,23 +492,22 @@ struct amdgpu_mc {  	 * about vram size near mc fb location */  	u64			mc_vram_size;  	u64			visible_vram_size; -	u64			gtt_size; -	u64			gtt_start; -	u64			gtt_end; +	u64			gart_size; +	u64			gart_start; +	u64			gart_end;  	u64			vram_start;  	u64			vram_end;  	unsigned		vram_width;  	u64			real_vram_size;  	int			vram_mtrr; -	u64                     gtt_base_align;  	u64                     mc_mask;  	const struct firmware   *fw;	/* MC firmware */  	uint32_t                fw_version;  	struct amdgpu_irq_src	vm_fault;  	uint32_t		vram_type;  	uint32_t                srbm_soft_reset; -	struct amdgpu_mode_mc_save save;  	bool			prt_warning; +	uint64_t		stolen_size;  	/* apertures */  	u64					shared_aperture_start;  	u64					shared_aperture_end; @@ -705,15 +611,15 @@ typedef enum _AMDGPU_DOORBELL64_ASSIGNMENT  	/* overlap the doorbell assignment with VCN as they are  mutually exclusive  	 * VCE engine's doorbell is 32 bit and two VCE ring share one QWORD  	 */ -	AMDGPU_DOORBELL64_RING0_1                 = 0xF8, -	AMDGPU_DOORBELL64_RING2_3                 = 0xF9, -	AMDGPU_DOORBELL64_RING4_5                 = 0xFA, -	AMDGPU_DOORBELL64_RING6_7                 = 0xFB, +	AMDGPU_DOORBELL64_UVD_RING0_1             = 0xF8, +	AMDGPU_DOORBELL64_UVD_RING2_3             = 0xF9, +	AMDGPU_DOORBELL64_UVD_RING4_5             = 0xFA, +	AMDGPU_DOORBELL64_UVD_RING6_7             = 0xFB, -	AMDGPU_DOORBELL64_UVD_RING0_1             = 0xFC, -	AMDGPU_DOORBELL64_UVD_RING2_3             = 0xFD, -	AMDGPU_DOORBELL64_UVD_RING4_5             = 0xFE, -	AMDGPU_DOORBELL64_UVD_RING6_7             = 0xFF, +	AMDGPU_DOORBELL64_VCE_RING0_1             = 0xFC, +	AMDGPU_DOORBELL64_VCE_RING2_3             = 0xFD, +	AMDGPU_DOORBELL64_VCE_RING4_5             = 0xFE, +	AMDGPU_DOORBELL64_VCE_RING6_7             = 0xFF,  	AMDGPU_DOORBELL64_MAX_ASSIGNMENT          = 0xFF,  	AMDGPU_DOORBELL64_INVALID                 = 0xFFFF @@ -772,6 +678,29 @@ int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring,  		      struct dma_fence **f);  /* + * Queue manager + */ +struct amdgpu_queue_mapper { +	int 		hw_ip; +	struct mutex	lock; +	/* protected by lock */ +	struct amdgpu_ring *queue_map[AMDGPU_MAX_RINGS]; +}; + +struct amdgpu_queue_mgr { +	struct amdgpu_queue_mapper mapper[AMDGPU_MAX_IP_NUM]; +}; + +int amdgpu_queue_mgr_init(struct amdgpu_device *adev, +			  struct amdgpu_queue_mgr *mgr); +int amdgpu_queue_mgr_fini(struct amdgpu_device *adev, +			  struct amdgpu_queue_mgr *mgr); +int amdgpu_queue_mgr_map(struct amdgpu_device *adev, +			 struct amdgpu_queue_mgr *mgr, +			 int hw_ip, int instance, int ring, +			 struct amdgpu_ring **out_ring); + +/*   * context related structures   */ @@ -784,6 +713,7 @@ struct amdgpu_ctx_ring {  struct amdgpu_ctx {  	struct kref		refcount;  	struct amdgpu_device    *adev; +	struct amdgpu_queue_mgr queue_mgr;  	unsigned		reset_counter;  	spinlock_t		ring_lock;  	struct dma_fence	**fences; @@ -819,17 +749,29 @@ void amdgpu_ctx_mgr_fini(struct amdgpu_ctx_mgr *mgr);  struct amdgpu_fpriv {  	struct amdgpu_vm	vm;  	struct amdgpu_bo_va	*prt_va; +	struct amdgpu_bo_va	*csa_va;  	struct mutex		bo_list_lock;  	struct idr		bo_list_handles;  	struct amdgpu_ctx_mgr	ctx_mgr; +	u32			vram_lost_counter;  };  /*   * residency list   */ +struct amdgpu_bo_list_entry { +	struct amdgpu_bo		*robj; +	struct ttm_validate_buffer	tv; +	struct amdgpu_bo_va		*bo_va; +	uint32_t			priority; +	struct page			**user_pages; +	int				user_invalidated; +};  struct amdgpu_bo_list {  	struct mutex lock; +	struct rcu_head rhead; +	struct kref refcount;  	struct amdgpu_bo *gds_obj;  	struct amdgpu_bo *gws_obj;  	struct amdgpu_bo *oa_obj; @@ -893,20 +835,26 @@ struct amdgpu_rlc {  	u32 *register_restore;  }; +#define AMDGPU_MAX_COMPUTE_QUEUES KGD_MAX_QUEUES +  struct amdgpu_mec {  	struct amdgpu_bo	*hpd_eop_obj;  	u64			hpd_eop_gpu_addr;  	struct amdgpu_bo	*mec_fw_obj;  	u64			mec_fw_gpu_addr; -	u32 num_pipe;  	u32 num_mec; -	u32 num_queue; +	u32 num_pipe_per_mec; +	u32 num_queue_per_pipe;  	void			*mqd_backup[AMDGPU_MAX_COMPUTE_RINGS + 1]; + +	/* These are the resources for which amdgpu takes ownership */ +	DECLARE_BITMAP(queue_bitmap, AMDGPU_MAX_COMPUTE_QUEUES);  };  struct amdgpu_kiq {  	u64			eop_gpu_addr;  	struct amdgpu_bo	*eop_obj; +	struct mutex		ring_mutex;  	struct amdgpu_ring	ring;  	struct amdgpu_irq_src	irq;  }; @@ -981,9 +929,15 @@ struct amdgpu_gfx_config {  };  struct amdgpu_cu_info { -	uint32_t number; /* total active CU number */ -	uint32_t ao_cu_mask; +	uint32_t max_waves_per_simd;  	uint32_t wave_front_size; +	uint32_t max_scratch_slots_per_cu; +	uint32_t lds_size; + +	/* total active CU number */ +	uint32_t number; +	uint32_t ao_cu_mask; +	uint32_t ao_cu_bitmap[4][4];  	uint32_t bitmap[4][4];  }; @@ -1061,6 +1015,8 @@ struct amdgpu_gfx {  	uint32_t                        grbm_soft_reset;  	uint32_t                        srbm_soft_reset;  	bool                            in_reset; +	/* s3/s4 mask */ +	bool                            in_suspend;  	/* NGG */  	struct amdgpu_ngg		ngg;  }; @@ -1104,17 +1060,21 @@ struct amdgpu_cs_parser {  	struct list_head		validated;  	struct dma_fence		*fence;  	uint64_t			bytes_moved_threshold; +	uint64_t			bytes_moved_vis_threshold;  	uint64_t			bytes_moved; +	uint64_t			bytes_moved_vis;  	struct amdgpu_bo_list_entry	*evictable;  	/* user fence */  	struct amdgpu_bo_list_entry	uf_entry; + +	unsigned num_post_dep_syncobjs; +	struct drm_syncobj **post_dep_syncobjs;  };  #define AMDGPU_PREAMBLE_IB_PRESENT          (1 << 0) /* bit set means command submit involves a preamble IB */  #define AMDGPU_PREAMBLE_IB_PRESENT_FIRST    (1 << 1) /* bit set means preamble IB is first presented in belonging context */  #define AMDGPU_HAVE_CTX_SWITCH              (1 << 2) /* bit set means context switch occured */ -#define AMDGPU_VM_DOMAIN                    (1 << 3) /* bit set means in virtual memory context */  struct amdgpu_job {  	struct amd_sched_job    base; @@ -1122,6 +1082,8 @@ struct amdgpu_job {  	struct amdgpu_vm	*vm;  	struct amdgpu_ring	*ring;  	struct amdgpu_sync	sync; +	struct amdgpu_sync	dep_sync; +	struct amdgpu_sync	sched_sync;  	struct amdgpu_ib	*ibs;  	struct dma_fence	*fence; /* the hw fence */  	uint32_t		preamble_status; @@ -1129,7 +1091,6 @@ struct amdgpu_job {  	void			*owner;  	uint64_t		fence_ctx; /* the fence_context this job uses */  	bool                    vm_needs_flush; -	bool			need_pipeline_sync;  	unsigned		vm_id;  	uint64_t		vm_pd_addr;  	uint32_t		gds_base, gds_size; @@ -1172,8 +1133,6 @@ struct amdgpu_wb {  int amdgpu_wb_get(struct amdgpu_device *adev, u32 *wb);  void amdgpu_wb_free(struct amdgpu_device *adev, u32 wb); -int amdgpu_wb_get_64bit(struct amdgpu_device *adev, u32 *wb); -void amdgpu_wb_free_64bit(struct amdgpu_device *adev, u32 wb);  void amdgpu_get_pcie_info(struct amdgpu_device *adev); @@ -1221,6 +1180,9 @@ struct amdgpu_firmware {  	const struct amdgpu_psp_funcs *funcs;  	struct amdgpu_bo *rbuf;  	struct mutex mutex; + +	/* gpu info firmware data pointer */ +	const struct firmware *gpu_info_fw;  };  /* @@ -1296,7 +1258,6 @@ struct amdgpu_smumgr {   */  struct amdgpu_allowed_register_entry {  	uint32_t reg_offset; -	bool untouched;  	bool grbm_indexed;  }; @@ -1424,6 +1385,7 @@ typedef void (*amdgpu_wreg_t)(struct amdgpu_device*, uint32_t, uint32_t);  typedef uint32_t (*amdgpu_block_rreg_t)(struct amdgpu_device*, uint32_t, uint32_t);  typedef void (*amdgpu_block_wreg_t)(struct amdgpu_device*, uint32_t, uint32_t, uint32_t); +#define AMDGPU_RESET_MAGIC_NUM 64  struct amdgpu_device {  	struct device			*dev;  	struct drm_device		*ddev; @@ -1464,7 +1426,7 @@ struct amdgpu_device {  	bool				is_atom_fw;  	uint8_t				*bios;  	uint32_t			bios_size; -	struct amdgpu_bo		*stollen_vga_memory; +	struct amdgpu_bo		*stolen_vga_memory;  	uint32_t			bios_scratch_reg_offset;  	uint32_t			bios_scratch[AMDGPU_BIOS_NUM_SCRATCH]; @@ -1496,6 +1458,10 @@ struct amdgpu_device {  	spinlock_t gc_cac_idx_lock;  	amdgpu_rreg_t			gc_cac_rreg;  	amdgpu_wreg_t			gc_cac_wreg; +	/* protects concurrent se_cac register access */ +	spinlock_t se_cac_idx_lock; +	amdgpu_rreg_t			se_cac_rreg; +	amdgpu_wreg_t			se_cac_wreg;  	/* protects concurrent ENDPOINT (audio) register access */  	spinlock_t audio_endpt_idx_lock;  	amdgpu_block_rreg_t		audio_endpt_rreg; @@ -1518,18 +1484,18 @@ struct amdgpu_device {  	struct amdgpu_mman		mman;  	struct amdgpu_vram_scratch	vram_scratch;  	struct amdgpu_wb		wb; -	atomic64_t			vram_usage; -	atomic64_t			vram_vis_usage; -	atomic64_t			gtt_usage;  	atomic64_t			num_bytes_moved;  	atomic64_t			num_evictions; +	atomic64_t			num_vram_cpu_page_faults;  	atomic_t			gpu_reset_counter; +	atomic_t			vram_lost_counter;  	/* data for buffer migration throttling */  	struct {  		spinlock_t		lock;  		s64			last_update_us;  		s64			accum_us; /* accumulated microseconds */ +		s64			accum_us_vis; /* for visible VRAM */  		u32			log2_max_MBps;  	} mm_stats; @@ -1570,11 +1536,18 @@ struct amdgpu_device {  	/* sdma */  	struct amdgpu_sdma		sdma; -	/* uvd */ -	struct amdgpu_uvd		uvd; +	union { +		struct { +			/* uvd */ +			struct amdgpu_uvd		uvd; + +			/* vce */ +			struct amdgpu_vce		vce; +		}; -	/* vce */ -	struct amdgpu_vce		vce; +		/* vcn */ +		struct amdgpu_vcn		vcn; +	};  	/* firmwares */  	struct amdgpu_firmware		firmware; @@ -1598,6 +1571,9 @@ struct amdgpu_device {  	/* amdkfd interface */  	struct kfd_dev          *kfd; +	/* delayed work_func for deferring clockgating during resume */ +	struct delayed_work     late_init_work; +  	struct amdgpu_virt	virt;  	/* link all shadow bo */ @@ -1606,10 +1582,16 @@ struct amdgpu_device {  	/* link all gtt */  	spinlock_t			gtt_list_lock;  	struct list_head                gtt_list; +	/* keep an lru list of rings by HW IP */ +	struct list_head		ring_lru_list; +	spinlock_t			ring_lru_list_lock;  	/* record hw reset is performed */  	bool has_hw_reset; +	u8				reset_magic[AMDGPU_RESET_MAGIC_NUM]; +	/* record last mm index being written through WREG32*/ +	unsigned long last_mm_index;  };  static inline struct amdgpu_device *amdgpu_ttm_adev(struct ttm_bo_device *bdev) @@ -1617,7 +1599,6 @@ static inline struct amdgpu_device *amdgpu_ttm_adev(struct ttm_bo_device *bdev)  	return container_of(bdev, struct amdgpu_device, mman.bdev);  } -bool amdgpu_device_is_px(struct drm_device *dev);  int amdgpu_device_init(struct amdgpu_device *adev,  		       struct drm_device *ddev,  		       struct pci_dev *pdev, @@ -1666,6 +1647,8 @@ void amdgpu_mm_wdoorbell64(struct amdgpu_device *adev, u32 index, u64 v);  #define WREG32_DIDT(reg, v) adev->didt_wreg(adev, (reg), (v))  #define RREG32_GC_CAC(reg) adev->gc_cac_rreg(adev, (reg))  #define WREG32_GC_CAC(reg, v) adev->gc_cac_wreg(adev, (reg), (v)) +#define RREG32_SE_CAC(reg) adev->se_cac_rreg(adev, (reg)) +#define WREG32_SE_CAC(reg, v) adev->se_cac_wreg(adev, (reg), (v))  #define RREG32_AUDIO_ENDPT(block, reg) adev->audio_endpt_rreg(adev, (block), (reg))  #define WREG32_AUDIO_ENDPT(block, reg, v) adev->audio_endpt_wreg(adev, (block), (reg), (v))  #define WREG32_P(reg, val, mask)				\ @@ -1716,49 +1699,6 @@ void amdgpu_mm_wdoorbell64(struct amdgpu_device *adev, u32 index, u64 v);  #define RBIOS16(i) (RBIOS8(i) | (RBIOS8((i)+1) << 8))  #define RBIOS32(i) ((RBIOS16(i)) | (RBIOS16((i)+2) << 16)) -/* - * RING helpers. - */ -static inline void amdgpu_ring_write(struct amdgpu_ring *ring, uint32_t v) -{ -	if (ring->count_dw <= 0) -		DRM_ERROR("amdgpu: writing more dwords to the ring than expected!\n"); -	ring->ring[ring->wptr++ & ring->buf_mask] = v; -	ring->wptr &= ring->ptr_mask; -	ring->count_dw--; -} - -static inline void amdgpu_ring_write_multiple(struct amdgpu_ring *ring, void *src, int count_dw) -{ -	unsigned occupied, chunk1, chunk2; -	void *dst; - -	if (ring->count_dw < count_dw) { -		DRM_ERROR("amdgpu: writing more dwords to the ring than expected!\n"); -	} else { -		occupied = ring->wptr & ring->buf_mask; -		dst = (void *)&ring->ring[occupied]; -		chunk1 = ring->buf_mask + 1 - occupied; -		chunk1 = (chunk1 >= count_dw) ? count_dw: chunk1; -		chunk2 = count_dw - chunk1; -		chunk1 <<= 2; -		chunk2 <<= 2; - -		if (chunk1) -			memcpy(dst, src, chunk1); - -		if (chunk2) { -			src += chunk1; -			dst = (void *)ring->ring; -			memcpy(dst, src, chunk2); -		} - -		ring->wptr += count_dw; -		ring->wptr &= ring->ptr_mask; -		ring->count_dw -= count_dw; -	} -} -  static inline struct amdgpu_sdma_instance *  amdgpu_get_sdma_instance(struct amdgpu_ring *ring)  { @@ -1792,6 +1732,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)  #define amdgpu_asic_get_config_memsize(adev) (adev)->asic_funcs->get_config_memsize((adev))  #define amdgpu_gart_flush_gpu_tlb(adev, vmid) (adev)->gart.gart_funcs->flush_gpu_tlb((adev), (vmid))  #define amdgpu_gart_set_pte_pde(adev, pt, idx, addr, flags) (adev)->gart.gart_funcs->set_pte_pde((adev), (pt), (idx), (addr), (flags)) +#define amdgpu_gart_get_vm_pde(adev, addr) (adev)->gart.gart_funcs->get_vm_pde((adev), (addr))  #define amdgpu_vm_copy_pte(adev, ib, pe, src, count) ((adev)->vm_manager.vm_pte_funcs->copy_pte((ib), (pe), (src), (count)))  #define amdgpu_vm_write_pte(adev, ib, pe, value, count, incr) ((adev)->vm_manager.vm_pte_funcs->write_pte((ib), (pe), (value), (count), (incr)))  #define amdgpu_vm_set_pte_pde(adev, ib, pe, addr, count, incr, flags) ((adev)->vm_manager.vm_pte_funcs->set_pte_pde((ib), (pe), (addr), (count), (incr), (flags))) @@ -1813,13 +1754,13 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)  #define amdgpu_ring_emit_cntxcntl(r, d) (r)->funcs->emit_cntxcntl((r), (d))  #define amdgpu_ring_emit_rreg(r, d) (r)->funcs->emit_rreg((r), (d))  #define amdgpu_ring_emit_wreg(r, d, v) (r)->funcs->emit_wreg((r), (d), (v)) +#define amdgpu_ring_emit_tmz(r, b) (r)->funcs->emit_tmz((r), (b))  #define amdgpu_ring_pad_ib(r, ib) ((r)->funcs->pad_ib((r), (ib)))  #define amdgpu_ring_init_cond_exec(r) (r)->funcs->init_cond_exec((r))  #define amdgpu_ring_patch_cond_exec(r,o) (r)->funcs->patch_cond_exec((r),(o))  #define amdgpu_ih_get_wptr(adev) (adev)->irq.ih_funcs->get_wptr((adev))  #define amdgpu_ih_decode_iv(adev, iv) (adev)->irq.ih_funcs->decode_iv((adev), (iv))  #define amdgpu_ih_set_rptr(adev) (adev)->irq.ih_funcs->set_rptr((adev)) -#define amdgpu_display_set_vga_render_state(adev, r) (adev)->mode_info.funcs->set_vga_render_state((adev), (r))  #define amdgpu_display_vblank_get_counter(adev, crtc) (adev)->mode_info.funcs->vblank_get_counter((adev), (crtc))  #define amdgpu_display_vblank_wait(adev, crtc) (adev)->mode_info.funcs->vblank_wait((adev), (crtc))  #define amdgpu_display_backlight_set_level(adev, e, l) (adev)->mode_info.funcs->backlight_set_level((e), (l)) @@ -1832,8 +1773,6 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)  #define amdgpu_display_page_flip_get_scanoutpos(adev, crtc, vbl, pos) (adev)->mode_info.funcs->page_flip_get_scanoutpos((adev), (crtc), (vbl), (pos))  #define amdgpu_display_add_encoder(adev, e, s, c) (adev)->mode_info.funcs->add_encoder((adev), (e), (s), (c))  #define amdgpu_display_add_connector(adev, ci, sd, ct, ib, coi, h, r) (adev)->mode_info.funcs->add_connector((adev), (ci), (sd), (ct), (ib), (coi), (h), (r)) -#define amdgpu_display_stop_mc_access(adev, s) (adev)->mode_info.funcs->stop_mc_access((adev), (s)) -#define amdgpu_display_resume_mc_access(adev, s) (adev)->mode_info.funcs->resume_mc_access((adev), (s))  #define amdgpu_emit_copy_buffer(adev, ib, s, d, b) (adev)->mman.buffer_funcs->emit_copy_buffer((ib),  (s), (d), (b))  #define amdgpu_emit_fill_buffer(adev, ib, s, d, b) (adev)->mman.buffer_funcs->emit_fill_buffer((ib), (s), (d), (b))  #define amdgpu_gfx_get_gpu_clock_counter(adev) (adev)->gfx.funcs->get_gpu_clock_counter((adev)) @@ -1848,11 +1787,8 @@ void amdgpu_pci_config_reset(struct amdgpu_device *adev);  bool amdgpu_need_post(struct amdgpu_device *adev);  void amdgpu_update_display_priority(struct amdgpu_device *adev); -int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data); -int amdgpu_cs_get_ring(struct amdgpu_device *adev, u32 ip_type, -		       u32 ip_instance, u32 ring, -		       struct amdgpu_ring **out_ring); -void amdgpu_cs_report_moved_bytes(struct amdgpu_device *adev, u64 num_bytes); +void amdgpu_cs_report_moved_bytes(struct amdgpu_device *adev, u64 num_bytes, +				  u64 num_vis_bytes);  void amdgpu_ttm_placement_from_domain(struct amdgpu_bo *abo, u32 domain);  bool amdgpu_ttm_bo_is_amdgpu_bo(struct ttm_buffer_object *bo);  int amdgpu_ttm_tt_get_user_pages(struct ttm_tt *ttm, struct page **pages); @@ -1868,7 +1804,7 @@ bool amdgpu_ttm_tt_is_readonly(struct ttm_tt *ttm);  uint64_t amdgpu_ttm_tt_pte_flags(struct amdgpu_device *adev, struct ttm_tt *ttm,  				 struct ttm_mem_reg *mem);  void amdgpu_vram_location(struct amdgpu_device *adev, struct amdgpu_mc *mc, u64 base); -void amdgpu_gtt_location(struct amdgpu_device *adev, struct amdgpu_mc *mc); +void amdgpu_gart_location(struct amdgpu_device *adev, struct amdgpu_mc *mc);  void amdgpu_ttm_set_active_vram_size(struct amdgpu_device *adev, u64 size);  int amdgpu_ttm_init(struct amdgpu_device *adev);  void amdgpu_ttm_fini(struct amdgpu_device *adev); @@ -1900,6 +1836,8 @@ static inline bool amdgpu_has_atpx(void) { return false; }  extern const struct drm_ioctl_desc amdgpu_ioctls_kms[];  extern const int amdgpu_max_kms_ioctl; +bool amdgpu_kms_vram_lost(struct amdgpu_device *adev, +			  struct amdgpu_fpriv *fpriv);  int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags);  void amdgpu_driver_unload_kms(struct drm_device *dev);  void amdgpu_driver_lastclose_kms(struct drm_device *dev); @@ -1912,10 +1850,6 @@ int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon);  u32 amdgpu_get_vblank_counter_kms(struct drm_device *dev, unsigned int pipe);  int amdgpu_enable_vblank_kms(struct drm_device *dev, unsigned int pipe);  void amdgpu_disable_vblank_kms(struct drm_device *dev, unsigned int pipe); -int amdgpu_get_vblank_timestamp_kms(struct drm_device *dev, unsigned int pipe, -				    int *max_error, -				    struct timeval *vblank_time, -				    unsigned flags);  long amdgpu_kms_compat_ioctl(struct file *filp, unsigned int cmd,  			     unsigned long arg); |