diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu.h')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 182 | 
1 files changed, 142 insertions, 40 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 6dc950c1b689..b3b84647207e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -53,7 +53,6 @@  #include <drm/ttm/ttm_bo.h>  #include <drm/ttm/ttm_placement.h> -#include <drm/ttm/ttm_execbuf_util.h>  #include <drm/amdgpu_drm.h>  #include <drm/drm_gem.h> @@ -80,6 +79,8 @@  #include "amdgpu_vce.h"  #include "amdgpu_vcn.h"  #include "amdgpu_jpeg.h" +#include "amdgpu_vpe.h" +#include "amdgpu_umsch_mm.h"  #include "amdgpu_gmc.h"  #include "amdgpu_gfx.h"  #include "amdgpu_sdma.h" @@ -106,19 +107,20 @@  #include "amdgpu_smuio.h"  #include "amdgpu_fdinfo.h"  #include "amdgpu_mca.h" +#include "amdgpu_aca.h"  #include "amdgpu_ras.h"  #include "amdgpu_xcp.h" +#include "amdgpu_seq64.h" +#include "amdgpu_reg_state.h"  #define MAX_GPU_INSTANCE		64 -struct amdgpu_gpu_instance -{ +struct amdgpu_gpu_instance {  	struct amdgpu_device		*adev;  	int				mgpu_fan_enabled;  }; -struct amdgpu_mgpu_info -{ +struct amdgpu_mgpu_info {  	struct amdgpu_gpu_instance	gpu_ins[MAX_GPU_INSTANCE];  	struct mutex			mutex;  	uint32_t			num_gpu; @@ -137,8 +139,7 @@ enum amdgpu_ss {  	AMDGPU_SS_DRV_UNLOAD  }; -struct amdgpu_watchdog_timer -{ +struct amdgpu_watchdog_timer {  	bool timeout_fatal_disable;  	uint32_t period; /* maxCycles = (1 << period), the number of cycles before a timeout */  }; @@ -196,8 +197,9 @@ extern uint amdgpu_dc_feature_mask;  extern uint amdgpu_freesync_vid_mode;  extern uint amdgpu_dc_debug_mask;  extern uint amdgpu_dc_visual_confirm; -extern uint amdgpu_dm_abm_level; +extern int amdgpu_dm_abm_level;  extern int amdgpu_backlight; +extern int amdgpu_damage_clips;  extern struct amdgpu_mgpu_info mgpu_info;  extern int amdgpu_ras_enable;  extern uint amdgpu_ras_mask; @@ -208,6 +210,7 @@ extern int amdgpu_async_gfx_ring;  extern int amdgpu_mcbp;  extern int amdgpu_discovery;  extern int amdgpu_mes; +extern int amdgpu_mes_log_enable;  extern int amdgpu_mes_kiq;  extern int amdgpu_noretry;  extern int amdgpu_force_asic_type; @@ -244,8 +247,13 @@ extern int amdgpu_num_kcq;  #define AMDGPU_VCNFW_LOG_SIZE (32 * 1024)  extern int amdgpu_vcnfw_log;  extern int amdgpu_sg_display; +extern int amdgpu_umsch_mm; +extern int amdgpu_seamless;  extern int amdgpu_user_partt_mode; +extern int amdgpu_agp; + +extern int amdgpu_wbrf;  #define AMDGPU_VM_MAX_NUM_CTX			4096  #define AMDGPU_SG_THRESHOLD			(256*1024*1024) @@ -361,9 +369,6 @@ struct amdgpu_ip_block_version {  	const struct amd_ip_funcs *funcs;  }; -#define HW_REV(_Major, _Minor, _Rev) \ -	((((uint32_t) (_Major)) << 16) | ((uint32_t) (_Minor) << 8) | ((uint32_t) (_Rev))) -  struct amdgpu_ip_block {  	struct amdgpu_ip_block_status status;  	const struct amdgpu_ip_block_version *version; @@ -468,6 +473,7 @@ struct amdgpu_fpriv {  	struct amdgpu_vm	vm;  	struct amdgpu_bo_va	*prt_va;  	struct amdgpu_bo_va	*csa_va; +	struct amdgpu_bo_va	*seq64_va;  	struct mutex		bo_list_lock;  	struct idr		bo_list_handles;  	struct amdgpu_ctx_mgr	ctx_mgr; @@ -506,6 +512,31 @@ struct amdgpu_allowed_register_entry {  	bool grbm_indexed;  }; +/** + * enum amd_reset_method - Methods for resetting AMD GPU devices + * + * @AMD_RESET_METHOD_NONE: The device will not be reset. + * @AMD_RESET_LEGACY: Method reserved for SI, CIK and VI ASICs. + * @AMD_RESET_MODE0: Reset the entire ASIC. Not currently available for the + *                   any device. + * @AMD_RESET_MODE1: Resets all IP blocks on the ASIC (SDMA, GFX, VCN, etc.) + *                   individually. Suitable only for some discrete GPU, not + *                   available for all ASICs. + * @AMD_RESET_MODE2: Resets a lesser level of IPs compared to MODE1. Which IPs + *                   are reset depends on the ASIC. Notably doesn't reset IPs + *                   shared with the CPU on APUs or the memory controllers (so + *                   VRAM is not lost). Not available on all ASICs. + * @AMD_RESET_BACO: BACO (Bus Alive, Chip Off) method powers off and on the card + *                  but without powering off the PCI bus. Suitable only for + *                  discrete GPUs. + * @AMD_RESET_PCI: Does a full bus reset using core Linux subsystem PCI reset + *                 and does a secondary bus reset or FLR, depending on what the + *                 underlying hardware supports. + * + * Methods available for AMD GPU driver for resetting the device. Not all + * methods are suitable for every device. User can override the method using + * module parameter `reset_method`. + */  enum amd_reset_method {  	AMD_RESET_METHOD_NONE = -1,  	AMD_RESET_METHOD_LEGACY = 0, @@ -585,6 +616,10 @@ struct amdgpu_asic_funcs {  				  const struct amdgpu_video_codecs **codecs);  	/* encode "> 32bits" smn addressing */  	u64 (*encode_ext_smn_addressing)(int ext_id); + +	ssize_t (*get_reg_state)(struct amdgpu_device *adev, +				 enum amdgpu_reg_state reg_state, void *buf, +				 size_t max_size);  };  /* @@ -625,6 +660,9 @@ typedef void (*amdgpu_wreg_ext_t)(struct amdgpu_device*, uint64_t, uint32_t);  typedef uint64_t (*amdgpu_rreg64_t)(struct amdgpu_device*, uint32_t);  typedef void (*amdgpu_wreg64_t)(struct amdgpu_device*, uint32_t, uint64_t); +typedef uint64_t (*amdgpu_rreg64_ext_t)(struct amdgpu_device*, uint64_t); +typedef void (*amdgpu_wreg64_ext_t)(struct amdgpu_device*, uint64_t, uint64_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); @@ -656,6 +694,7 @@ enum amd_hw_ip_block_type {  	JPEG_HWIP = VCN_HWIP,  	VCN1_HWIP,  	VCE_HWIP, +	VPE_HWIP,  	DF_HWIP,  	DCE_HWIP,  	OSSSYS_HWIP, @@ -675,10 +714,15 @@ enum amd_hw_ip_block_type {  #define HWIP_MAX_INSTANCE	44  #define HW_ID_MAX		300 -#define IP_VERSION(mj, mn, rv) (((mj) << 16) | ((mn) << 8) | (rv)) -#define IP_VERSION_MAJ(ver) ((ver) >> 16) -#define IP_VERSION_MIN(ver) (((ver) >> 8) & 0xFF) -#define IP_VERSION_REV(ver) ((ver) & 0xFF) +#define IP_VERSION_FULL(mj, mn, rv, var, srev) \ +	(((mj) << 24) | ((mn) << 16) | ((rv) << 8) | ((var) << 4) | (srev)) +#define IP_VERSION(mj, mn, rv)		IP_VERSION_FULL(mj, mn, rv, 0, 0) +#define IP_VERSION_MAJ(ver)		((ver) >> 24) +#define IP_VERSION_MIN(ver)		(((ver) >> 16) & 0xFF) +#define IP_VERSION_REV(ver)		(((ver) >> 8) & 0xFF) +#define IP_VERSION_VARIANT(ver)		(((ver) >> 4) & 0xF) +#define IP_VERSION_SUBREV(ver)		((ver) & 0xF) +#define IP_VERSION_MAJ_MIN_REV(ver)	((ver) >> 8)  struct amdgpu_ip_map_info {  	/* Map of logical to actual dev instances/mask */ @@ -748,6 +792,7 @@ struct amdgpu_mqd_prop {  	uint64_t eop_gpu_addr;  	uint32_t hqd_pipe_priority;  	uint32_t hqd_queue_priority; +	bool allow_tunneling;  	bool hqd_active;  }; @@ -759,8 +804,19 @@ struct amdgpu_mqd {  #define AMDGPU_RESET_MAGIC_NUM 64  #define AMDGPU_MAX_DF_PERFMONS 4 -#define AMDGPU_PRODUCT_NAME_LEN 64  struct amdgpu_reset_domain; +struct amdgpu_fru_info; + +struct amdgpu_reset_info { +	/* reset dump register */ +	u32 *reset_dump_reg_list; +	u32 *reset_dump_reg_value; +	int num_regs; + +#ifdef CONFIG_DEV_COREDUMP +	struct amdgpu_coredump_info *coredump_info; +#endif +};  /*   * Non-zero (true) if the GPU has VRAM. Zero (false) otherwise. @@ -828,6 +884,8 @@ struct amdgpu_device {  	amdgpu_wreg_ext_t		pcie_wreg_ext;  	amdgpu_rreg64_t			pcie_rreg64;  	amdgpu_wreg64_t			pcie_wreg64; +	amdgpu_rreg64_ext_t			pcie_rreg64_ext; +	amdgpu_wreg64_ext_t			pcie_wreg64_ext;  	/* protects concurrent UVD register access */  	spinlock_t uvd_ctx_idx_lock;  	amdgpu_rreg_t			uvd_ctx_rreg; @@ -948,6 +1006,13 @@ struct amdgpu_device {  	/* jpeg */  	struct amdgpu_jpeg		jpeg; +	/* vpe */ +	struct amdgpu_vpe		vpe; + +	/* umsch */ +	struct amdgpu_umsch_mm		umsch_mm; +	bool				enable_umsch_mm; +  	/* firmwares */  	struct amdgpu_firmware		firmware; @@ -957,6 +1022,9 @@ struct amdgpu_device {  	/* GDS */  	struct amdgpu_gds		gds; +	/* for userq and VM fences */ +	struct amdgpu_seq64		seq64; +  	/* KFD */  	struct amdgpu_kfd_dev		kfd; @@ -978,6 +1046,9 @@ struct amdgpu_device {  	/* MCA */  	struct amdgpu_mca               mca; +	/* ACA */ +	struct amdgpu_aca		aca; +  	struct amdgpu_ip_block          ip_blocks[AMDGPU_MAX_IP_NUM];  	uint32_t		        harvest_ip_mask;  	int				num_ip_blocks; @@ -1011,6 +1082,8 @@ struct amdgpu_device {  	bool				in_s3;  	bool				in_s4;  	bool				in_s0ix; +	/* indicate amdgpu suspension status */ +	bool				suspend_complete;  	enum pp_mp1_state               mp1_state;  	struct amdgpu_doorbell_index doorbell_index; @@ -1025,6 +1098,7 @@ struct amdgpu_device {  	long				sdma_timeout;  	long				video_timeout;  	long				compute_timeout; +	long				psp_timeout;  	uint64_t			unique_id;  	uint64_t	df_perfmon_config_assign_mask[AMDGPU_MAX_DF_PERFMONS]; @@ -1034,13 +1108,8 @@ struct amdgpu_device {  	bool                            has_pr3;  	bool                            ucode_sysfs_en; -	bool                            psp_sysfs_en; - -	/* Chip product information */ -	char				product_number[20]; -	char				product_name[AMDGPU_PRODUCT_NAME_LEN]; -	char				serial[20]; +	struct amdgpu_fru_info		*fru_info;  	atomic_t			throttling_logging_enabled;  	struct ratelimit_state		throttling_logging_rs;  	uint32_t                        ras_hw_enabled; @@ -1066,15 +1135,7 @@ struct amdgpu_device {  	struct mutex			benchmark_mutex; -	/* reset dump register */ -	uint32_t                        *reset_dump_reg_list; -	uint32_t			*reset_dump_reg_value; -	int                             num_regs; -#ifdef CONFIG_DEV_COREDUMP -	struct amdgpu_task_info         reset_task_info; -	bool                            reset_vram_lost; -	struct timespec64               reset_time; -#endif +	struct amdgpu_reset_info	reset_info;  	bool                            scpm_enabled;  	uint32_t                        scpm_status; @@ -1085,8 +1146,30 @@ struct amdgpu_device {  	bool                            dc_enabled;  	/* Mask of active clusters */  	uint32_t			aid_mask; + +	/* Debug */ +	bool                            debug_vm; +	bool                            debug_largebar; +	bool                            debug_disable_soft_recovery; +	bool                            debug_use_vram_fw_buf;  }; +static inline uint32_t amdgpu_ip_version(const struct amdgpu_device *adev, +					 uint8_t ip, uint8_t inst) +{ +	/* This considers only major/minor/rev and ignores +	 * subrevision/variant fields. +	 */ +	return adev->ip_versions[ip][inst] & ~0xFFU; +} + +static inline uint32_t amdgpu_ip_version_full(const struct amdgpu_device *adev, +					      uint8_t ip, uint8_t inst) +{ +	/* This returns full version - major/minor/rev/variant/subrevision */ +	return adev->ip_versions[ip][inst]; +} +  static inline struct amdgpu_device *drm_to_adev(struct drm_device *ddev)  {  	return container_of(ddev, struct amdgpu_device, ddev); @@ -1123,13 +1206,20 @@ uint32_t amdgpu_device_rreg(struct amdgpu_device *adev,  			    uint32_t reg, uint32_t acc_flags);  u32 amdgpu_device_indirect_rreg_ext(struct amdgpu_device *adev,  				    u64 reg_addr); +uint32_t amdgpu_device_xcc_rreg(struct amdgpu_device *adev, +				uint32_t reg, uint32_t acc_flags, +				uint32_t xcc_id);  void amdgpu_device_wreg(struct amdgpu_device *adev,  			uint32_t reg, uint32_t v,  			uint32_t acc_flags);  void amdgpu_device_indirect_wreg_ext(struct amdgpu_device *adev,  				     u64 reg_addr, u32 reg_data); +void amdgpu_device_xcc_wreg(struct amdgpu_device *adev, +			    uint32_t reg, uint32_t v, +			    uint32_t acc_flags, +			    uint32_t xcc_id);  void amdgpu_mm_wreg_mmio_rlc(struct amdgpu_device *adev, -			     uint32_t reg, uint32_t v); +			     uint32_t reg, uint32_t v, uint32_t xcc_id);  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); @@ -1137,10 +1227,14 @@ u32 amdgpu_device_indirect_rreg(struct amdgpu_device *adev,  				u32 reg_addr);  u64 amdgpu_device_indirect_rreg64(struct amdgpu_device *adev,  				  u32 reg_addr); +u64 amdgpu_device_indirect_rreg64_ext(struct amdgpu_device *adev, +				  u64 reg_addr);  void amdgpu_device_indirect_wreg(struct amdgpu_device *adev,  				 u32 reg_addr, u32 reg_data);  void amdgpu_device_indirect_wreg64(struct amdgpu_device *adev,  				   u32 reg_addr, u64 reg_data); +void amdgpu_device_indirect_wreg64_ext(struct amdgpu_device *adev, +				   u64 reg_addr, u64 reg_data);  u32 amdgpu_device_get_rev_id(struct amdgpu_device *adev);  bool amdgpu_device_asic_has_dc_support(enum amd_asic_type asic_type);  bool amdgpu_device_has_dc_support(struct amdgpu_device *adev); @@ -1164,8 +1258,8 @@ int emu_soc_asic_init(struct amdgpu_device *adev);  #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)) +#define RREG32_KIQ(reg) amdgpu_kiq_rreg(adev, (reg), 0) +#define WREG32_KIQ(reg, v) amdgpu_kiq_wreg(adev, (reg), (v), 0)  #define RREG8(reg) amdgpu_mm_rreg8(adev, (reg))  #define WREG8(reg, v) amdgpu_mm_wreg8(adev, (reg), (v)) @@ -1175,6 +1269,8 @@ int emu_soc_asic_init(struct amdgpu_device *adev);  #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_XCC(reg, inst) amdgpu_device_xcc_rreg(adev, (reg), 0, inst) +#define WREG32_XCC(reg, v, inst) amdgpu_device_xcc_wreg(adev, (reg), (v), 0, inst)  #define RREG32_PCIE(reg) adev->pcie_rreg(adev, (reg))  #define WREG32_PCIE(reg, v) adev->pcie_wreg(adev, (reg), (v))  #define RREG32_PCIE_PORT(reg) adev->pciep_rreg(adev, (reg)) @@ -1183,6 +1279,8 @@ int emu_soc_asic_init(struct amdgpu_device *adev);  #define WREG32_PCIE_EXT(reg, v) adev->pcie_wreg_ext(adev, (reg), (v))  #define RREG64_PCIE(reg) adev->pcie_rreg64(adev, (reg))  #define WREG64_PCIE(reg, v) adev->pcie_wreg64(adev, (reg), (v)) +#define RREG64_PCIE_EXT(reg) adev->pcie_rreg64_ext(adev, (reg)) +#define WREG64_PCIE_EXT(reg, v) adev->pcie_wreg64_ext(adev, (reg), (v))  #define RREG32_SMC(reg) adev->smc_rreg(adev, (reg))  #define WREG32_SMC(reg, v) adev->smc_wreg(adev, (reg), (v))  #define RREG32_UVD_CTX(reg) adev->uvd_ctx_rreg(adev, (reg)) @@ -1238,6 +1336,7 @@ int emu_soc_asic_init(struct amdgpu_device *adev);  #define WREG32_FIELD_OFFSET(reg, offset, field, val)	\  	WREG32(mm##reg + offset, (RREG32(mm##reg + offset) & ~REG_FIELD_MASK(reg, field)) | (val) << REG_FIELD_SHIFT(reg, field)) +#define AMDGPU_GET_REG_FIELD(x, h, l) (((x) & GENMASK_ULL(h, l)) >> (l))  /*   * BIOS helpers.   */ @@ -1278,15 +1377,13 @@ int emu_soc_asic_init(struct amdgpu_device *adev);  	((adev)->asic_funcs->update_umd_stable_pstate ? (adev)->asic_funcs->update_umd_stable_pstate((adev), (enter)) : 0)  #define amdgpu_asic_query_video_codecs(adev, e, c) (adev)->asic_funcs->query_video_codecs((adev), (e), (c)) -#define amdgpu_inc_vram_lost(adev) atomic_inc(&((adev)->vram_lost_counter)); +#define amdgpu_inc_vram_lost(adev) atomic_inc(&((adev)->vram_lost_counter))  #define BIT_MASK_UPPER(i) ((i) >= BITS_PER_LONG ? 0 : ~0UL << (i))  #define for_each_inst(i, inst_mask)        \  	for (i = ffs(inst_mask); i-- != 0; \  	     i = ffs(inst_mask & BIT_MASK_UPPER(i + 1))) -#define MIN(X, Y) ((X) < (Y) ? (X) : (Y)) -  /* Common functions */  bool amdgpu_device_has_job_running(struct amdgpu_device *adev);  bool amdgpu_device_should_recover_gpu(struct amdgpu_device *adev); @@ -1296,10 +1393,8 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,  void amdgpu_device_pci_config_reset(struct amdgpu_device *adev);  int amdgpu_device_pci_reset(struct amdgpu_device *adev);  bool amdgpu_device_need_post(struct amdgpu_device *adev); -bool amdgpu_sg_display_supported(struct amdgpu_device *adev); -bool amdgpu_device_pcie_dynamic_switching_supported(void); +bool amdgpu_device_seamless_boot_supported(struct amdgpu_device *adev);  bool amdgpu_device_should_use_aspm(struct amdgpu_device *adev); -bool amdgpu_device_aspm_support_quirk(void);  void amdgpu_cs_report_moved_bytes(struct amdgpu_device *adev, u64 num_bytes,  				  u64 num_vis_bytes); @@ -1371,6 +1466,7 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,  void amdgpu_driver_release_kms(struct drm_device *dev);  int amdgpu_device_ip_suspend(struct amdgpu_device *adev); +int amdgpu_device_prepare(struct drm_device *dev);  int amdgpu_device_suspend(struct drm_device *dev, bool fbcon);  int amdgpu_device_resume(struct drm_device *dev, bool fbcon);  u32 amdgpu_get_vblank_counter_kms(struct drm_crtc *crtc); @@ -1459,9 +1555,11 @@ static inline int amdgpu_acpi_smart_shift_update(struct drm_device *dev,  #if defined(CONFIG_ACPI) && defined(CONFIG_SUSPEND)  bool amdgpu_acpi_is_s3_active(struct amdgpu_device *adev);  bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev); +void amdgpu_choose_low_power_state(struct amdgpu_device *adev);  #else  static inline bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev) { return false; }  static inline bool amdgpu_acpi_is_s3_active(struct amdgpu_device *adev) { return false; } +static inline void amdgpu_choose_low_power_state(struct amdgpu_device *adev) { }  #endif  #if defined(CONFIG_DRM_AMD_DC) @@ -1508,4 +1606,8 @@ static inline bool amdgpu_is_tmz(struct amdgpu_device *adev)  int amdgpu_in_reset(struct amdgpu_device *adev); +extern const struct attribute_group amdgpu_vram_mgr_attr_group; +extern const struct attribute_group amdgpu_gtt_mgr_attr_group; +extern const struct attribute_group amdgpu_flash_attr_group; +  #endif |