diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu.h')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 110 | 
1 files changed, 74 insertions, 36 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 327a0daf4a1d..87f095dc385c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -49,6 +49,8 @@  #include <linux/rbtree.h>  #include <linux/hashtable.h>  #include <linux/dma-fence.h> +#include <linux/pci.h> +#include <linux/aer.h>  #include <drm/ttm/ttm_bo_api.h>  #include <drm/ttm/ttm_bo_driver.h> @@ -102,6 +104,7 @@  #include "amdgpu_mes.h"  #include "amdgpu_umc.h"  #include "amdgpu_mmhub.h" +#include "amdgpu_gfxhub.h"  #include "amdgpu_df.h"  #define MAX_GPU_INSTANCE		16 @@ -178,6 +181,7 @@ extern uint amdgpu_dm_abm_level;  extern struct amdgpu_mgpu_info mgpu_info;  extern int amdgpu_ras_enable;  extern uint amdgpu_ras_mask; +extern int amdgpu_bad_page_threshold;  extern int amdgpu_async_gfx_ring;  extern int amdgpu_mcbp;  extern int amdgpu_discovery; @@ -187,9 +191,11 @@ extern int amdgpu_force_asic_type;  #ifdef CONFIG_HSA_AMD  extern int sched_policy;  extern bool debug_evictions; +extern bool no_system_mem_limit;  #else  static const int sched_policy = KFD_SCHED_POLICY_HWS;  static const bool debug_evictions; /* = false */ +static const bool no_system_mem_limit;  #endif  extern int amdgpu_tmz; @@ -201,6 +207,7 @@ extern int amdgpu_si_support;  #ifdef CONFIG_DRM_AMDGPU_CIK  extern int amdgpu_cik_support;  #endif +extern int amdgpu_num_kcq;  #define AMDGPU_VM_MAX_NUM_CTX			4096  #define AMDGPU_SG_THRESHOLD			(256*1024*1024) @@ -212,6 +219,8 @@ extern int amdgpu_cik_support;  #define AMDGPUFB_CONN_LIMIT			4  #define AMDGPU_BIOS_NUM_SCRATCH			16 +#define AMDGPU_VBIOS_VGA_ALLOCATION		(9 * 1024 * 1024) /* reserve 8MB for vga emulator and 1 MB for FB */ +  /* hard reset data */  #define AMDGPU_ASIC_RESET_DATA                  0x39d5e86b @@ -245,6 +254,7 @@ struct amdgpu_fpriv;  struct amdgpu_bo_va_mapping;  struct amdgpu_atif;  struct kfd_vm_fault_info; +struct amdgpu_hive_info;  enum amdgpu_cp_irq {  	AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP = 0, @@ -611,6 +621,8 @@ struct amdgpu_asic_funcs {  	uint64_t (*get_pcie_replay_count)(struct amdgpu_device *adev);  	/* device supports BACO */  	bool (*supports_baco)(struct amdgpu_device *adev); +	/* pre asic_init quirks */ +	void (*pre_asic_init)(struct amdgpu_device *adev);  };  /* @@ -648,16 +660,6 @@ struct amdgpu_atcs {  };  /* - * Firmware VRAM reservation - */ -struct amdgpu_fw_vram_usage { -	u64 start_offset; -	u64 size; -	struct amdgpu_bo *reserved_bo; -	void *va; -}; - -/*   * CGS   */  struct cgs_device *amdgpu_cgs_create_device(struct amdgpu_device *adev); @@ -725,13 +727,13 @@ struct amd_powerplay {  #define AMDGPU_MAX_DF_PERFMONS 4  struct amdgpu_device {  	struct device			*dev; -	struct drm_device		*ddev;  	struct pci_dev			*pdev; +	struct drm_device		ddev;  #ifdef CONFIG_DRM_AMD_ACP  	struct amdgpu_acp		acp;  #endif - +	struct amdgpu_hive_info *hive;  	/* ASIC */  	enum amd_asic_type		asic_type;  	uint32_t			family; @@ -765,7 +767,6 @@ struct amdgpu_device {  	bool				is_atom_fw;  	uint8_t				*bios;  	uint32_t			bios_size; -	struct amdgpu_bo		*stolen_vga_memory;  	uint32_t			bios_scratch_reg_offset;  	uint32_t			bios_scratch[AMDGPU_BIOS_NUM_SCRATCH]; @@ -881,6 +882,9 @@ struct amdgpu_device {  	/* mmhub */  	struct amdgpu_mmhub		mmhub; +	/* gfxhub */ +	struct amdgpu_gfxhub		gfxhub; +  	/* gfx */  	struct amdgpu_gfx		gfx; @@ -917,11 +921,6 @@ struct amdgpu_device {  	/* display related functionality */  	struct amdgpu_display_manager dm; -	/* discovery */ -	uint8_t				*discovery_bin; -	uint32_t			discovery_tmr_size; -	struct amdgpu_bo		*discovery_memory; -  	/* mes */  	bool                            enable_mes;  	struct amdgpu_mes               mes; @@ -946,8 +945,6 @@ struct amdgpu_device {  	struct delayed_work     delayed_init_work;  	struct amdgpu_virt	virt; -	/* firmware VRAM reservation */ -	struct amdgpu_fw_vram_usage fw_vram_usage;  	/* link all shadow bo */  	struct list_head                shadow_list; @@ -961,9 +958,9 @@ struct amdgpu_device {  	bool                            in_suspend;  	bool				in_hibernate; -	bool                            in_gpu_reset; +	atomic_t 			in_gpu_reset;  	enum pp_mp1_state               mp1_state; -	struct mutex  lock_reset; +	struct rw_semaphore reset_sem;  	struct amdgpu_doorbell_index doorbell_index;  	struct mutex			notifier_lock; @@ -995,34 +992,60 @@ struct amdgpu_device {  	atomic_t			throttling_logging_enabled;  	struct ratelimit_state		throttling_logging_rs; +	uint32_t			ras_features; + +	bool                            in_pci_err_recovery; +	struct pci_saved_state          *pci_state;  }; +static inline struct amdgpu_device *drm_to_adev(struct drm_device *ddev) +{ +	return container_of(ddev, struct amdgpu_device, ddev); +} + +static inline struct drm_device *adev_to_drm(struct amdgpu_device *adev) +{ +	return &adev->ddev; +} +  static inline struct amdgpu_device *amdgpu_ttm_adev(struct ttm_bo_device *bdev)  {  	return container_of(bdev, struct amdgpu_device, mman.bdev);  }  int amdgpu_device_init(struct amdgpu_device *adev, -		       struct drm_device *ddev, -		       struct pci_dev *pdev,  		       uint32_t flags);  void amdgpu_device_fini(struct amdgpu_device *adev);  int amdgpu_gpu_wait_for_idle(struct amdgpu_device *adev);  void amdgpu_device_vram_access(struct amdgpu_device *adev, loff_t pos,  			       uint32_t *buf, size_t size, bool write); -uint32_t amdgpu_mm_rreg(struct amdgpu_device *adev, uint32_t reg, +uint32_t amdgpu_device_rreg(struct amdgpu_device *adev, +			    uint32_t reg, uint32_t acc_flags); +void amdgpu_device_wreg(struct amdgpu_device *adev, +			uint32_t reg, uint32_t v,  			uint32_t acc_flags); -void amdgpu_mm_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v, -		    uint32_t acc_flags); -void amdgpu_mm_wreg_mmio_rlc(struct amdgpu_device *adev, uint32_t reg, uint32_t v, -		    uint32_t acc_flags); +void amdgpu_mm_wreg_mmio_rlc(struct amdgpu_device *adev, +			     uint32_t reg, uint32_t v);  void amdgpu_mm_wreg8(struct amdgpu_device *adev, uint32_t offset, uint8_t value);  uint8_t amdgpu_mm_rreg8(struct amdgpu_device *adev, uint32_t offset);  u32 amdgpu_io_rreg(struct amdgpu_device *adev, u32 reg);  void amdgpu_io_wreg(struct amdgpu_device *adev, u32 reg, u32 v); +u32 amdgpu_device_indirect_rreg(struct amdgpu_device *adev, +				u32 pcie_index, u32 pcie_data, +				u32 reg_addr); +u64 amdgpu_device_indirect_rreg64(struct amdgpu_device *adev, +				  u32 pcie_index, u32 pcie_data, +				  u32 reg_addr); +void amdgpu_device_indirect_wreg(struct amdgpu_device *adev, +				 u32 pcie_index, u32 pcie_data, +				 u32 reg_addr, u32 reg_data); +void amdgpu_device_indirect_wreg64(struct amdgpu_device *adev, +				   u32 pcie_index, u32 pcie_data, +				   u32 reg_addr, u64 reg_data); +  bool amdgpu_device_asic_has_dc_support(enum amd_asic_type asic_type);  bool amdgpu_device_has_dc_support(struct amdgpu_device *adev); @@ -1033,8 +1056,8 @@ int emu_soc_asic_init(struct amdgpu_device *adev);   */  #define AMDGPU_REGS_NO_KIQ    (1<<1) -#define RREG32_NO_KIQ(reg) amdgpu_mm_rreg(adev, (reg), AMDGPU_REGS_NO_KIQ) -#define WREG32_NO_KIQ(reg, v) amdgpu_mm_wreg(adev, (reg), (v), AMDGPU_REGS_NO_KIQ) +#define RREG32_NO_KIQ(reg) amdgpu_device_rreg(adev, (reg), AMDGPU_REGS_NO_KIQ) +#define WREG32_NO_KIQ(reg, v) amdgpu_device_wreg(adev, (reg), (v), AMDGPU_REGS_NO_KIQ)  #define RREG32_KIQ(reg) amdgpu_kiq_rreg(adev, (reg))  #define WREG32_KIQ(reg, v) amdgpu_kiq_wreg(adev, (reg), (v)) @@ -1042,9 +1065,9 @@ int emu_soc_asic_init(struct amdgpu_device *adev);  #define RREG8(reg) amdgpu_mm_rreg8(adev, (reg))  #define WREG8(reg, v) amdgpu_mm_wreg8(adev, (reg), (v)) -#define RREG32(reg) amdgpu_mm_rreg(adev, (reg), 0) -#define DREG32(reg) printk(KERN_INFO "REGISTER: " #reg " : 0x%08X\n", amdgpu_mm_rreg(adev, (reg), 0)) -#define WREG32(reg, v) amdgpu_mm_wreg(adev, (reg), (v), 0) +#define RREG32(reg) amdgpu_device_rreg(adev, (reg), 0) +#define DREG32(reg) printk(KERN_INFO "REGISTER: " #reg " : 0x%08X\n", amdgpu_device_rreg(adev, (reg), 0)) +#define WREG32(reg, v) amdgpu_device_wreg(adev, (reg), (v), 0)  #define REG_SET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK)  #define REG_GET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK)  #define RREG32_PCIE(reg) adev->pcie_rreg(adev, (reg)) @@ -1090,7 +1113,7 @@ int emu_soc_asic_init(struct amdgpu_device *adev);  		WREG32_SMC(_Reg, tmp);                          \  	} while (0) -#define DREG32_SYS(sqf, adev, reg) seq_printf((sqf), #reg " : 0x%08X\n", amdgpu_mm_rreg((adev), (reg), false)) +#define DREG32_SYS(sqf, adev, reg) seq_printf((sqf), #reg " : 0x%08X\n", amdgpu_device_rreg((adev), (reg), false))  #define RREG32_IO(reg) amdgpu_io_rreg(adev, (reg))  #define WREG32_IO(reg, v) amdgpu_io_wreg(adev, (reg), (v)) @@ -1141,10 +1164,12 @@ int emu_soc_asic_init(struct amdgpu_device *adev);  #define amdgpu_asic_need_reset_on_init(adev) (adev)->asic_funcs->need_reset_on_init((adev))  #define amdgpu_asic_get_pcie_replay_count(adev) ((adev)->asic_funcs->get_pcie_replay_count((adev)))  #define amdgpu_asic_supports_baco(adev) (adev)->asic_funcs->supports_baco((adev)) +#define amdgpu_asic_pre_asic_init(adev) (adev)->asic_funcs->pre_asic_init((adev))  #define amdgpu_inc_vram_lost(adev) atomic_inc(&((adev)->vram_lost_counter));  /* Common functions */ +bool amdgpu_device_has_job_running(struct amdgpu_device *adev);  bool amdgpu_device_should_recover_gpu(struct amdgpu_device *adev);  int amdgpu_device_gpu_recover(struct amdgpu_device *adev,  			      struct amdgpu_job* job); @@ -1194,7 +1219,7 @@ static inline void *amdgpu_atpx_get_dhandle(void) { return NULL; }  extern const struct drm_ioctl_desc amdgpu_ioctls_kms[];  extern const int amdgpu_max_kms_ioctl; -int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags); +int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags);  void amdgpu_driver_unload_kms(struct drm_device *dev);  void amdgpu_driver_lastclose_kms(struct drm_device *dev);  int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv); @@ -1258,6 +1283,15 @@ static inline int amdgpu_dm_display_resume(struct amdgpu_device *adev) { return  void amdgpu_register_gpu_instance(struct amdgpu_device *adev);  void amdgpu_unregister_gpu_instance(struct amdgpu_device *adev); +pci_ers_result_t amdgpu_pci_error_detected(struct pci_dev *pdev, +					   pci_channel_state_t state); +pci_ers_result_t amdgpu_pci_mmio_enabled(struct pci_dev *pdev); +pci_ers_result_t amdgpu_pci_slot_reset(struct pci_dev *pdev); +void amdgpu_pci_resume(struct pci_dev *pdev); + +bool amdgpu_device_cache_pci_state(struct pci_dev *pdev); +bool amdgpu_device_load_pci_state(struct pci_dev *pdev); +  #include "amdgpu_object.h"  /* used by df_v3_6.c and amdgpu_pmu.c */ @@ -1278,4 +1312,8 @@ static inline bool amdgpu_is_tmz(struct amdgpu_device *adev)         return adev->gmc.tmz_enabled;  } +static inline int amdgpu_in_reset(struct amdgpu_device *adev) +{ +	return atomic_read(&adev->in_gpu_reset); +}  #endif  |