162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Copyright 2008 Advanced Micro Devices, Inc. 362306a36Sopenharmony_ci * Copyright 2008 Red Hat Inc. 462306a36Sopenharmony_ci * Copyright 2009 Jerome Glisse. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 762306a36Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 862306a36Sopenharmony_ci * to deal in the Software without restriction, including without limitation 962306a36Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1062306a36Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 1162306a36Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 1262306a36Sopenharmony_ci * 1362306a36Sopenharmony_ci * The above copyright notice and this permission notice shall be included in 1462306a36Sopenharmony_ci * all copies or substantial portions of the Software. 1562306a36Sopenharmony_ci * 1662306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1762306a36Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1862306a36Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1962306a36Sopenharmony_ci * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 2062306a36Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 2162306a36Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 2262306a36Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE. 2362306a36Sopenharmony_ci * 2462306a36Sopenharmony_ci * Authors: Dave Airlie 2562306a36Sopenharmony_ci * Alex Deucher 2662306a36Sopenharmony_ci * Jerome Glisse 2762306a36Sopenharmony_ci */ 2862306a36Sopenharmony_ci#ifndef __AMDGPU_H__ 2962306a36Sopenharmony_ci#define __AMDGPU_H__ 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#ifdef pr_fmt 3262306a36Sopenharmony_ci#undef pr_fmt 3362306a36Sopenharmony_ci#endif 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#define pr_fmt(fmt) "amdgpu: " fmt 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#ifdef dev_fmt 3862306a36Sopenharmony_ci#undef dev_fmt 3962306a36Sopenharmony_ci#endif 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci#define dev_fmt(fmt) "amdgpu: " fmt 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci#include "amdgpu_ctx.h" 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#include <linux/atomic.h> 4662306a36Sopenharmony_ci#include <linux/wait.h> 4762306a36Sopenharmony_ci#include <linux/list.h> 4862306a36Sopenharmony_ci#include <linux/kref.h> 4962306a36Sopenharmony_ci#include <linux/rbtree.h> 5062306a36Sopenharmony_ci#include <linux/hashtable.h> 5162306a36Sopenharmony_ci#include <linux/dma-fence.h> 5262306a36Sopenharmony_ci#include <linux/pci.h> 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci#include <drm/ttm/ttm_bo.h> 5562306a36Sopenharmony_ci#include <drm/ttm/ttm_placement.h> 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci#include <drm/amdgpu_drm.h> 5862306a36Sopenharmony_ci#include <drm/drm_gem.h> 5962306a36Sopenharmony_ci#include <drm/drm_ioctl.h> 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci#include <kgd_kfd_interface.h> 6262306a36Sopenharmony_ci#include "dm_pp_interface.h" 6362306a36Sopenharmony_ci#include "kgd_pp_interface.h" 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci#include "amd_shared.h" 6662306a36Sopenharmony_ci#include "amdgpu_mode.h" 6762306a36Sopenharmony_ci#include "amdgpu_ih.h" 6862306a36Sopenharmony_ci#include "amdgpu_irq.h" 6962306a36Sopenharmony_ci#include "amdgpu_ucode.h" 7062306a36Sopenharmony_ci#include "amdgpu_ttm.h" 7162306a36Sopenharmony_ci#include "amdgpu_psp.h" 7262306a36Sopenharmony_ci#include "amdgpu_gds.h" 7362306a36Sopenharmony_ci#include "amdgpu_sync.h" 7462306a36Sopenharmony_ci#include "amdgpu_ring.h" 7562306a36Sopenharmony_ci#include "amdgpu_vm.h" 7662306a36Sopenharmony_ci#include "amdgpu_dpm.h" 7762306a36Sopenharmony_ci#include "amdgpu_acp.h" 7862306a36Sopenharmony_ci#include "amdgpu_uvd.h" 7962306a36Sopenharmony_ci#include "amdgpu_vce.h" 8062306a36Sopenharmony_ci#include "amdgpu_vcn.h" 8162306a36Sopenharmony_ci#include "amdgpu_jpeg.h" 8262306a36Sopenharmony_ci#include "amdgpu_gmc.h" 8362306a36Sopenharmony_ci#include "amdgpu_gfx.h" 8462306a36Sopenharmony_ci#include "amdgpu_sdma.h" 8562306a36Sopenharmony_ci#include "amdgpu_lsdma.h" 8662306a36Sopenharmony_ci#include "amdgpu_nbio.h" 8762306a36Sopenharmony_ci#include "amdgpu_hdp.h" 8862306a36Sopenharmony_ci#include "amdgpu_dm.h" 8962306a36Sopenharmony_ci#include "amdgpu_virt.h" 9062306a36Sopenharmony_ci#include "amdgpu_csa.h" 9162306a36Sopenharmony_ci#include "amdgpu_mes_ctx.h" 9262306a36Sopenharmony_ci#include "amdgpu_gart.h" 9362306a36Sopenharmony_ci#include "amdgpu_debugfs.h" 9462306a36Sopenharmony_ci#include "amdgpu_job.h" 9562306a36Sopenharmony_ci#include "amdgpu_bo_list.h" 9662306a36Sopenharmony_ci#include "amdgpu_gem.h" 9762306a36Sopenharmony_ci#include "amdgpu_doorbell.h" 9862306a36Sopenharmony_ci#include "amdgpu_amdkfd.h" 9962306a36Sopenharmony_ci#include "amdgpu_discovery.h" 10062306a36Sopenharmony_ci#include "amdgpu_mes.h" 10162306a36Sopenharmony_ci#include "amdgpu_umc.h" 10262306a36Sopenharmony_ci#include "amdgpu_mmhub.h" 10362306a36Sopenharmony_ci#include "amdgpu_gfxhub.h" 10462306a36Sopenharmony_ci#include "amdgpu_df.h" 10562306a36Sopenharmony_ci#include "amdgpu_smuio.h" 10662306a36Sopenharmony_ci#include "amdgpu_fdinfo.h" 10762306a36Sopenharmony_ci#include "amdgpu_mca.h" 10862306a36Sopenharmony_ci#include "amdgpu_ras.h" 10962306a36Sopenharmony_ci#include "amdgpu_xcp.h" 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci#define MAX_GPU_INSTANCE 64 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_cistruct amdgpu_gpu_instance 11462306a36Sopenharmony_ci{ 11562306a36Sopenharmony_ci struct amdgpu_device *adev; 11662306a36Sopenharmony_ci int mgpu_fan_enabled; 11762306a36Sopenharmony_ci}; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_cistruct amdgpu_mgpu_info 12062306a36Sopenharmony_ci{ 12162306a36Sopenharmony_ci struct amdgpu_gpu_instance gpu_ins[MAX_GPU_INSTANCE]; 12262306a36Sopenharmony_ci struct mutex mutex; 12362306a36Sopenharmony_ci uint32_t num_gpu; 12462306a36Sopenharmony_ci uint32_t num_dgpu; 12562306a36Sopenharmony_ci uint32_t num_apu; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci /* delayed reset_func for XGMI configuration if necessary */ 12862306a36Sopenharmony_ci struct delayed_work delayed_reset_work; 12962306a36Sopenharmony_ci bool pending_reset; 13062306a36Sopenharmony_ci}; 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_cienum amdgpu_ss { 13362306a36Sopenharmony_ci AMDGPU_SS_DRV_LOAD, 13462306a36Sopenharmony_ci AMDGPU_SS_DEV_D0, 13562306a36Sopenharmony_ci AMDGPU_SS_DEV_D3, 13662306a36Sopenharmony_ci AMDGPU_SS_DRV_UNLOAD 13762306a36Sopenharmony_ci}; 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_cistruct amdgpu_watchdog_timer 14062306a36Sopenharmony_ci{ 14162306a36Sopenharmony_ci bool timeout_fatal_disable; 14262306a36Sopenharmony_ci uint32_t period; /* maxCycles = (1 << period), the number of cycles before a timeout */ 14362306a36Sopenharmony_ci}; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci#define AMDGPU_MAX_TIMEOUT_PARAM_LENGTH 256 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci/* 14862306a36Sopenharmony_ci * Modules parameters. 14962306a36Sopenharmony_ci */ 15062306a36Sopenharmony_ciextern int amdgpu_modeset; 15162306a36Sopenharmony_ciextern unsigned int amdgpu_vram_limit; 15262306a36Sopenharmony_ciextern int amdgpu_vis_vram_limit; 15362306a36Sopenharmony_ciextern int amdgpu_gart_size; 15462306a36Sopenharmony_ciextern int amdgpu_gtt_size; 15562306a36Sopenharmony_ciextern int amdgpu_moverate; 15662306a36Sopenharmony_ciextern int amdgpu_audio; 15762306a36Sopenharmony_ciextern int amdgpu_disp_priority; 15862306a36Sopenharmony_ciextern int amdgpu_hw_i2c; 15962306a36Sopenharmony_ciextern int amdgpu_pcie_gen2; 16062306a36Sopenharmony_ciextern int amdgpu_msi; 16162306a36Sopenharmony_ciextern char amdgpu_lockup_timeout[AMDGPU_MAX_TIMEOUT_PARAM_LENGTH]; 16262306a36Sopenharmony_ciextern int amdgpu_dpm; 16362306a36Sopenharmony_ciextern int amdgpu_fw_load_type; 16462306a36Sopenharmony_ciextern int amdgpu_aspm; 16562306a36Sopenharmony_ciextern int amdgpu_runtime_pm; 16662306a36Sopenharmony_ciextern uint amdgpu_ip_block_mask; 16762306a36Sopenharmony_ciextern int amdgpu_bapm; 16862306a36Sopenharmony_ciextern int amdgpu_deep_color; 16962306a36Sopenharmony_ciextern int amdgpu_vm_size; 17062306a36Sopenharmony_ciextern int amdgpu_vm_block_size; 17162306a36Sopenharmony_ciextern int amdgpu_vm_fragment_size; 17262306a36Sopenharmony_ciextern int amdgpu_vm_fault_stop; 17362306a36Sopenharmony_ciextern int amdgpu_vm_debug; 17462306a36Sopenharmony_ciextern int amdgpu_vm_update_mode; 17562306a36Sopenharmony_ciextern int amdgpu_exp_hw_support; 17662306a36Sopenharmony_ciextern int amdgpu_dc; 17762306a36Sopenharmony_ciextern int amdgpu_sched_jobs; 17862306a36Sopenharmony_ciextern int amdgpu_sched_hw_submission; 17962306a36Sopenharmony_ciextern uint amdgpu_pcie_gen_cap; 18062306a36Sopenharmony_ciextern uint amdgpu_pcie_lane_cap; 18162306a36Sopenharmony_ciextern u64 amdgpu_cg_mask; 18262306a36Sopenharmony_ciextern uint amdgpu_pg_mask; 18362306a36Sopenharmony_ciextern uint amdgpu_sdma_phase_quantum; 18462306a36Sopenharmony_ciextern char *amdgpu_disable_cu; 18562306a36Sopenharmony_ciextern char *amdgpu_virtual_display; 18662306a36Sopenharmony_ciextern uint amdgpu_pp_feature_mask; 18762306a36Sopenharmony_ciextern uint amdgpu_force_long_training; 18862306a36Sopenharmony_ciextern int amdgpu_lbpw; 18962306a36Sopenharmony_ciextern int amdgpu_compute_multipipe; 19062306a36Sopenharmony_ciextern int amdgpu_gpu_recovery; 19162306a36Sopenharmony_ciextern int amdgpu_emu_mode; 19262306a36Sopenharmony_ciextern uint amdgpu_smu_memory_pool_size; 19362306a36Sopenharmony_ciextern int amdgpu_smu_pptable_id; 19462306a36Sopenharmony_ciextern uint amdgpu_dc_feature_mask; 19562306a36Sopenharmony_ciextern uint amdgpu_dc_debug_mask; 19662306a36Sopenharmony_ciextern uint amdgpu_dc_visual_confirm; 19762306a36Sopenharmony_ciextern uint amdgpu_dm_abm_level; 19862306a36Sopenharmony_ciextern int amdgpu_backlight; 19962306a36Sopenharmony_ciextern struct amdgpu_mgpu_info mgpu_info; 20062306a36Sopenharmony_ciextern int amdgpu_ras_enable; 20162306a36Sopenharmony_ciextern uint amdgpu_ras_mask; 20262306a36Sopenharmony_ciextern int amdgpu_bad_page_threshold; 20362306a36Sopenharmony_ciextern bool amdgpu_ignore_bad_page_threshold; 20462306a36Sopenharmony_ciextern struct amdgpu_watchdog_timer amdgpu_watchdog_timer; 20562306a36Sopenharmony_ciextern int amdgpu_async_gfx_ring; 20662306a36Sopenharmony_ciextern int amdgpu_mcbp; 20762306a36Sopenharmony_ciextern int amdgpu_discovery; 20862306a36Sopenharmony_ciextern int amdgpu_mes; 20962306a36Sopenharmony_ciextern int amdgpu_mes_kiq; 21062306a36Sopenharmony_ciextern int amdgpu_noretry; 21162306a36Sopenharmony_ciextern int amdgpu_force_asic_type; 21262306a36Sopenharmony_ciextern int amdgpu_smartshift_bias; 21362306a36Sopenharmony_ciextern int amdgpu_use_xgmi_p2p; 21462306a36Sopenharmony_ciextern int amdgpu_mtype_local; 21562306a36Sopenharmony_ciextern bool enforce_isolation; 21662306a36Sopenharmony_ci#ifdef CONFIG_HSA_AMD 21762306a36Sopenharmony_ciextern int sched_policy; 21862306a36Sopenharmony_ciextern bool debug_evictions; 21962306a36Sopenharmony_ciextern bool no_system_mem_limit; 22062306a36Sopenharmony_ciextern int halt_if_hws_hang; 22162306a36Sopenharmony_ci#else 22262306a36Sopenharmony_cistatic const int __maybe_unused sched_policy = KFD_SCHED_POLICY_HWS; 22362306a36Sopenharmony_cistatic const bool __maybe_unused debug_evictions; /* = false */ 22462306a36Sopenharmony_cistatic const bool __maybe_unused no_system_mem_limit; 22562306a36Sopenharmony_cistatic const int __maybe_unused halt_if_hws_hang; 22662306a36Sopenharmony_ci#endif 22762306a36Sopenharmony_ci#ifdef CONFIG_HSA_AMD_P2P 22862306a36Sopenharmony_ciextern bool pcie_p2p; 22962306a36Sopenharmony_ci#endif 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ciextern int amdgpu_tmz; 23262306a36Sopenharmony_ciextern int amdgpu_reset_method; 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci#ifdef CONFIG_DRM_AMDGPU_SI 23562306a36Sopenharmony_ciextern int amdgpu_si_support; 23662306a36Sopenharmony_ci#endif 23762306a36Sopenharmony_ci#ifdef CONFIG_DRM_AMDGPU_CIK 23862306a36Sopenharmony_ciextern int amdgpu_cik_support; 23962306a36Sopenharmony_ci#endif 24062306a36Sopenharmony_ciextern int amdgpu_num_kcq; 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci#define AMDGPU_VCNFW_LOG_SIZE (32 * 1024) 24362306a36Sopenharmony_ciextern int amdgpu_vcnfw_log; 24462306a36Sopenharmony_ciextern int amdgpu_sg_display; 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ciextern int amdgpu_user_partt_mode; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci#define AMDGPU_VM_MAX_NUM_CTX 4096 24962306a36Sopenharmony_ci#define AMDGPU_SG_THRESHOLD (256*1024*1024) 25062306a36Sopenharmony_ci#define AMDGPU_WAIT_IDLE_TIMEOUT_IN_MS 3000 25162306a36Sopenharmony_ci#define AMDGPU_MAX_USEC_TIMEOUT 100000 /* 100 ms */ 25262306a36Sopenharmony_ci#define AMDGPU_FENCE_JIFFIES_TIMEOUT (HZ / 2) 25362306a36Sopenharmony_ci#define AMDGPU_DEBUGFS_MAX_COMPONENTS 32 25462306a36Sopenharmony_ci#define AMDGPUFB_CONN_LIMIT 4 25562306a36Sopenharmony_ci#define AMDGPU_BIOS_NUM_SCRATCH 16 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci#define AMDGPU_VBIOS_VGA_ALLOCATION (9 * 1024 * 1024) /* reserve 8MB for vga emulator and 1 MB for FB */ 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci/* hard reset data */ 26062306a36Sopenharmony_ci#define AMDGPU_ASIC_RESET_DATA 0x39d5e86b 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci/* reset flags */ 26362306a36Sopenharmony_ci#define AMDGPU_RESET_GFX (1 << 0) 26462306a36Sopenharmony_ci#define AMDGPU_RESET_COMPUTE (1 << 1) 26562306a36Sopenharmony_ci#define AMDGPU_RESET_DMA (1 << 2) 26662306a36Sopenharmony_ci#define AMDGPU_RESET_CP (1 << 3) 26762306a36Sopenharmony_ci#define AMDGPU_RESET_GRBM (1 << 4) 26862306a36Sopenharmony_ci#define AMDGPU_RESET_DMA1 (1 << 5) 26962306a36Sopenharmony_ci#define AMDGPU_RESET_RLC (1 << 6) 27062306a36Sopenharmony_ci#define AMDGPU_RESET_SEM (1 << 7) 27162306a36Sopenharmony_ci#define AMDGPU_RESET_IH (1 << 8) 27262306a36Sopenharmony_ci#define AMDGPU_RESET_VMC (1 << 9) 27362306a36Sopenharmony_ci#define AMDGPU_RESET_MC (1 << 10) 27462306a36Sopenharmony_ci#define AMDGPU_RESET_DISPLAY (1 << 11) 27562306a36Sopenharmony_ci#define AMDGPU_RESET_UVD (1 << 12) 27662306a36Sopenharmony_ci#define AMDGPU_RESET_VCE (1 << 13) 27762306a36Sopenharmony_ci#define AMDGPU_RESET_VCE1 (1 << 14) 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci/* max cursor sizes (in pixels) */ 28062306a36Sopenharmony_ci#define CIK_CURSOR_WIDTH 128 28162306a36Sopenharmony_ci#define CIK_CURSOR_HEIGHT 128 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci/* smart shift bias level limits */ 28462306a36Sopenharmony_ci#define AMDGPU_SMARTSHIFT_MAX_BIAS (100) 28562306a36Sopenharmony_ci#define AMDGPU_SMARTSHIFT_MIN_BIAS (-100) 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_ci/* Extra time delay(in ms) to eliminate the influence of temperature momentary fluctuation */ 28862306a36Sopenharmony_ci#define AMDGPU_SWCTF_EXTRA_DELAY 50 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_cistruct amdgpu_xcp_mgr; 29162306a36Sopenharmony_cistruct amdgpu_device; 29262306a36Sopenharmony_cistruct amdgpu_irq_src; 29362306a36Sopenharmony_cistruct amdgpu_fpriv; 29462306a36Sopenharmony_cistruct amdgpu_bo_va_mapping; 29562306a36Sopenharmony_cistruct kfd_vm_fault_info; 29662306a36Sopenharmony_cistruct amdgpu_hive_info; 29762306a36Sopenharmony_cistruct amdgpu_reset_context; 29862306a36Sopenharmony_cistruct amdgpu_reset_control; 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_cienum amdgpu_cp_irq { 30162306a36Sopenharmony_ci AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP = 0, 30262306a36Sopenharmony_ci AMDGPU_CP_IRQ_GFX_ME0_PIPE1_EOP, 30362306a36Sopenharmony_ci AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP, 30462306a36Sopenharmony_ci AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE1_EOP, 30562306a36Sopenharmony_ci AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE2_EOP, 30662306a36Sopenharmony_ci AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE3_EOP, 30762306a36Sopenharmony_ci AMDGPU_CP_IRQ_COMPUTE_MEC2_PIPE0_EOP, 30862306a36Sopenharmony_ci AMDGPU_CP_IRQ_COMPUTE_MEC2_PIPE1_EOP, 30962306a36Sopenharmony_ci AMDGPU_CP_IRQ_COMPUTE_MEC2_PIPE2_EOP, 31062306a36Sopenharmony_ci AMDGPU_CP_IRQ_COMPUTE_MEC2_PIPE3_EOP, 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_ci AMDGPU_CP_IRQ_LAST 31362306a36Sopenharmony_ci}; 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_cienum amdgpu_thermal_irq { 31662306a36Sopenharmony_ci AMDGPU_THERMAL_IRQ_LOW_TO_HIGH = 0, 31762306a36Sopenharmony_ci AMDGPU_THERMAL_IRQ_HIGH_TO_LOW, 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci AMDGPU_THERMAL_IRQ_LAST 32062306a36Sopenharmony_ci}; 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_cienum amdgpu_kiq_irq { 32362306a36Sopenharmony_ci AMDGPU_CP_KIQ_IRQ_DRIVER0 = 0, 32462306a36Sopenharmony_ci AMDGPU_CP_KIQ_IRQ_LAST 32562306a36Sopenharmony_ci}; 32662306a36Sopenharmony_ci#define SRIOV_USEC_TIMEOUT 1200000 /* wait 12 * 100ms for SRIOV */ 32762306a36Sopenharmony_ci#define MAX_KIQ_REG_WAIT 5000 /* in usecs, 5ms */ 32862306a36Sopenharmony_ci#define MAX_KIQ_REG_BAILOUT_INTERVAL 5 /* in msecs, 5ms */ 32962306a36Sopenharmony_ci#define MAX_KIQ_REG_TRY 1000 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ciint amdgpu_device_ip_set_clockgating_state(void *dev, 33262306a36Sopenharmony_ci enum amd_ip_block_type block_type, 33362306a36Sopenharmony_ci enum amd_clockgating_state state); 33462306a36Sopenharmony_ciint amdgpu_device_ip_set_powergating_state(void *dev, 33562306a36Sopenharmony_ci enum amd_ip_block_type block_type, 33662306a36Sopenharmony_ci enum amd_powergating_state state); 33762306a36Sopenharmony_civoid amdgpu_device_ip_get_clockgating_state(struct amdgpu_device *adev, 33862306a36Sopenharmony_ci u64 *flags); 33962306a36Sopenharmony_ciint amdgpu_device_ip_wait_for_idle(struct amdgpu_device *adev, 34062306a36Sopenharmony_ci enum amd_ip_block_type block_type); 34162306a36Sopenharmony_cibool amdgpu_device_ip_is_idle(struct amdgpu_device *adev, 34262306a36Sopenharmony_ci enum amd_ip_block_type block_type); 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci#define AMDGPU_MAX_IP_NUM 16 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_cistruct amdgpu_ip_block_status { 34762306a36Sopenharmony_ci bool valid; 34862306a36Sopenharmony_ci bool sw; 34962306a36Sopenharmony_ci bool hw; 35062306a36Sopenharmony_ci bool late_initialized; 35162306a36Sopenharmony_ci bool hang; 35262306a36Sopenharmony_ci}; 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_cistruct amdgpu_ip_block_version { 35562306a36Sopenharmony_ci const enum amd_ip_block_type type; 35662306a36Sopenharmony_ci const u32 major; 35762306a36Sopenharmony_ci const u32 minor; 35862306a36Sopenharmony_ci const u32 rev; 35962306a36Sopenharmony_ci const struct amd_ip_funcs *funcs; 36062306a36Sopenharmony_ci}; 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ci#define HW_REV(_Major, _Minor, _Rev) \ 36362306a36Sopenharmony_ci ((((uint32_t) (_Major)) << 16) | ((uint32_t) (_Minor) << 8) | ((uint32_t) (_Rev))) 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_cistruct amdgpu_ip_block { 36662306a36Sopenharmony_ci struct amdgpu_ip_block_status status; 36762306a36Sopenharmony_ci const struct amdgpu_ip_block_version *version; 36862306a36Sopenharmony_ci}; 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ciint amdgpu_device_ip_block_version_cmp(struct amdgpu_device *adev, 37162306a36Sopenharmony_ci enum amd_ip_block_type type, 37262306a36Sopenharmony_ci u32 major, u32 minor); 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_cistruct amdgpu_ip_block * 37562306a36Sopenharmony_ciamdgpu_device_ip_get_ip_block(struct amdgpu_device *adev, 37662306a36Sopenharmony_ci enum amd_ip_block_type type); 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_ciint amdgpu_device_ip_block_add(struct amdgpu_device *adev, 37962306a36Sopenharmony_ci const struct amdgpu_ip_block_version *ip_block_version); 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci/* 38262306a36Sopenharmony_ci * BIOS. 38362306a36Sopenharmony_ci */ 38462306a36Sopenharmony_cibool amdgpu_get_bios(struct amdgpu_device *adev); 38562306a36Sopenharmony_cibool amdgpu_read_bios(struct amdgpu_device *adev); 38662306a36Sopenharmony_cibool amdgpu_soc15_read_bios_from_rom(struct amdgpu_device *adev, 38762306a36Sopenharmony_ci u8 *bios, u32 length_bytes); 38862306a36Sopenharmony_ci/* 38962306a36Sopenharmony_ci * Clocks 39062306a36Sopenharmony_ci */ 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ci#define AMDGPU_MAX_PPLL 3 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_cistruct amdgpu_clock { 39562306a36Sopenharmony_ci struct amdgpu_pll ppll[AMDGPU_MAX_PPLL]; 39662306a36Sopenharmony_ci struct amdgpu_pll spll; 39762306a36Sopenharmony_ci struct amdgpu_pll mpll; 39862306a36Sopenharmony_ci /* 10 Khz units */ 39962306a36Sopenharmony_ci uint32_t default_mclk; 40062306a36Sopenharmony_ci uint32_t default_sclk; 40162306a36Sopenharmony_ci uint32_t default_dispclk; 40262306a36Sopenharmony_ci uint32_t current_dispclk; 40362306a36Sopenharmony_ci uint32_t dp_extclk; 40462306a36Sopenharmony_ci uint32_t max_pixel_clock; 40562306a36Sopenharmony_ci}; 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci/* sub-allocation manager, it has to be protected by another lock. 40862306a36Sopenharmony_ci * By conception this is an helper for other part of the driver 40962306a36Sopenharmony_ci * like the indirect buffer or semaphore, which both have their 41062306a36Sopenharmony_ci * locking. 41162306a36Sopenharmony_ci * 41262306a36Sopenharmony_ci * Principe is simple, we keep a list of sub allocation in offset 41362306a36Sopenharmony_ci * order (first entry has offset == 0, last entry has the highest 41462306a36Sopenharmony_ci * offset). 41562306a36Sopenharmony_ci * 41662306a36Sopenharmony_ci * When allocating new object we first check if there is room at 41762306a36Sopenharmony_ci * the end total_size - (last_object_offset + last_object_size) >= 41862306a36Sopenharmony_ci * alloc_size. If so we allocate new object there. 41962306a36Sopenharmony_ci * 42062306a36Sopenharmony_ci * When there is not enough room at the end, we start waiting for 42162306a36Sopenharmony_ci * each sub object until we reach object_offset+object_size >= 42262306a36Sopenharmony_ci * alloc_size, this object then become the sub object we return. 42362306a36Sopenharmony_ci * 42462306a36Sopenharmony_ci * Alignment can't be bigger than page size. 42562306a36Sopenharmony_ci * 42662306a36Sopenharmony_ci * Hole are not considered for allocation to keep things simple. 42762306a36Sopenharmony_ci * Assumption is that there won't be hole (all object on same 42862306a36Sopenharmony_ci * alignment). 42962306a36Sopenharmony_ci */ 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_cistruct amdgpu_sa_manager { 43262306a36Sopenharmony_ci struct drm_suballoc_manager base; 43362306a36Sopenharmony_ci struct amdgpu_bo *bo; 43462306a36Sopenharmony_ci uint64_t gpu_addr; 43562306a36Sopenharmony_ci void *cpu_ptr; 43662306a36Sopenharmony_ci}; 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_ciint amdgpu_fence_slab_init(void); 43962306a36Sopenharmony_civoid amdgpu_fence_slab_fini(void); 44062306a36Sopenharmony_ci 44162306a36Sopenharmony_ci/* 44262306a36Sopenharmony_ci * IRQS. 44362306a36Sopenharmony_ci */ 44462306a36Sopenharmony_ci 44562306a36Sopenharmony_cistruct amdgpu_flip_work { 44662306a36Sopenharmony_ci struct delayed_work flip_work; 44762306a36Sopenharmony_ci struct work_struct unpin_work; 44862306a36Sopenharmony_ci struct amdgpu_device *adev; 44962306a36Sopenharmony_ci int crtc_id; 45062306a36Sopenharmony_ci u32 target_vblank; 45162306a36Sopenharmony_ci uint64_t base; 45262306a36Sopenharmony_ci struct drm_pending_vblank_event *event; 45362306a36Sopenharmony_ci struct amdgpu_bo *old_abo; 45462306a36Sopenharmony_ci unsigned shared_count; 45562306a36Sopenharmony_ci struct dma_fence **shared; 45662306a36Sopenharmony_ci struct dma_fence_cb cb; 45762306a36Sopenharmony_ci bool async; 45862306a36Sopenharmony_ci}; 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ci/* 46262306a36Sopenharmony_ci * file private structure 46362306a36Sopenharmony_ci */ 46462306a36Sopenharmony_ci 46562306a36Sopenharmony_cistruct amdgpu_fpriv { 46662306a36Sopenharmony_ci struct amdgpu_vm vm; 46762306a36Sopenharmony_ci struct amdgpu_bo_va *prt_va; 46862306a36Sopenharmony_ci struct amdgpu_bo_va *csa_va; 46962306a36Sopenharmony_ci struct mutex bo_list_lock; 47062306a36Sopenharmony_ci struct idr bo_list_handles; 47162306a36Sopenharmony_ci struct amdgpu_ctx_mgr ctx_mgr; 47262306a36Sopenharmony_ci /** GPU partition selection */ 47362306a36Sopenharmony_ci uint32_t xcp_id; 47462306a36Sopenharmony_ci}; 47562306a36Sopenharmony_ci 47662306a36Sopenharmony_ciint amdgpu_file_to_fpriv(struct file *filp, struct amdgpu_fpriv **fpriv); 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ci/* 47962306a36Sopenharmony_ci * Writeback 48062306a36Sopenharmony_ci */ 48162306a36Sopenharmony_ci#define AMDGPU_MAX_WB 1024 /* Reserve at most 1024 WB slots for amdgpu-owned rings. */ 48262306a36Sopenharmony_ci 48362306a36Sopenharmony_cistruct amdgpu_wb { 48462306a36Sopenharmony_ci struct amdgpu_bo *wb_obj; 48562306a36Sopenharmony_ci volatile uint32_t *wb; 48662306a36Sopenharmony_ci uint64_t gpu_addr; 48762306a36Sopenharmony_ci u32 num_wb; /* Number of wb slots actually reserved for amdgpu. */ 48862306a36Sopenharmony_ci unsigned long used[DIV_ROUND_UP(AMDGPU_MAX_WB, BITS_PER_LONG)]; 48962306a36Sopenharmony_ci}; 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_ciint amdgpu_device_wb_get(struct amdgpu_device *adev, u32 *wb); 49262306a36Sopenharmony_civoid amdgpu_device_wb_free(struct amdgpu_device *adev, u32 wb); 49362306a36Sopenharmony_ci 49462306a36Sopenharmony_ci/* 49562306a36Sopenharmony_ci * Benchmarking 49662306a36Sopenharmony_ci */ 49762306a36Sopenharmony_ciint amdgpu_benchmark(struct amdgpu_device *adev, int test_number); 49862306a36Sopenharmony_ci 49962306a36Sopenharmony_ci/* 50062306a36Sopenharmony_ci * ASIC specific register table accessible by UMD 50162306a36Sopenharmony_ci */ 50262306a36Sopenharmony_cistruct amdgpu_allowed_register_entry { 50362306a36Sopenharmony_ci uint32_t reg_offset; 50462306a36Sopenharmony_ci bool grbm_indexed; 50562306a36Sopenharmony_ci}; 50662306a36Sopenharmony_ci 50762306a36Sopenharmony_cienum amd_reset_method { 50862306a36Sopenharmony_ci AMD_RESET_METHOD_NONE = -1, 50962306a36Sopenharmony_ci AMD_RESET_METHOD_LEGACY = 0, 51062306a36Sopenharmony_ci AMD_RESET_METHOD_MODE0, 51162306a36Sopenharmony_ci AMD_RESET_METHOD_MODE1, 51262306a36Sopenharmony_ci AMD_RESET_METHOD_MODE2, 51362306a36Sopenharmony_ci AMD_RESET_METHOD_BACO, 51462306a36Sopenharmony_ci AMD_RESET_METHOD_PCI, 51562306a36Sopenharmony_ci}; 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_cistruct amdgpu_video_codec_info { 51862306a36Sopenharmony_ci u32 codec_type; 51962306a36Sopenharmony_ci u32 max_width; 52062306a36Sopenharmony_ci u32 max_height; 52162306a36Sopenharmony_ci u32 max_pixels_per_frame; 52262306a36Sopenharmony_ci u32 max_level; 52362306a36Sopenharmony_ci}; 52462306a36Sopenharmony_ci 52562306a36Sopenharmony_ci#define codec_info_build(type, width, height, level) \ 52662306a36Sopenharmony_ci .codec_type = type,\ 52762306a36Sopenharmony_ci .max_width = width,\ 52862306a36Sopenharmony_ci .max_height = height,\ 52962306a36Sopenharmony_ci .max_pixels_per_frame = height * width,\ 53062306a36Sopenharmony_ci .max_level = level, 53162306a36Sopenharmony_ci 53262306a36Sopenharmony_cistruct amdgpu_video_codecs { 53362306a36Sopenharmony_ci const u32 codec_count; 53462306a36Sopenharmony_ci const struct amdgpu_video_codec_info *codec_array; 53562306a36Sopenharmony_ci}; 53662306a36Sopenharmony_ci 53762306a36Sopenharmony_ci/* 53862306a36Sopenharmony_ci * ASIC specific functions. 53962306a36Sopenharmony_ci */ 54062306a36Sopenharmony_cistruct amdgpu_asic_funcs { 54162306a36Sopenharmony_ci bool (*read_disabled_bios)(struct amdgpu_device *adev); 54262306a36Sopenharmony_ci bool (*read_bios_from_rom)(struct amdgpu_device *adev, 54362306a36Sopenharmony_ci u8 *bios, u32 length_bytes); 54462306a36Sopenharmony_ci int (*read_register)(struct amdgpu_device *adev, u32 se_num, 54562306a36Sopenharmony_ci u32 sh_num, u32 reg_offset, u32 *value); 54662306a36Sopenharmony_ci void (*set_vga_state)(struct amdgpu_device *adev, bool state); 54762306a36Sopenharmony_ci int (*reset)(struct amdgpu_device *adev); 54862306a36Sopenharmony_ci enum amd_reset_method (*reset_method)(struct amdgpu_device *adev); 54962306a36Sopenharmony_ci /* get the reference clock */ 55062306a36Sopenharmony_ci u32 (*get_xclk)(struct amdgpu_device *adev); 55162306a36Sopenharmony_ci /* MM block clocks */ 55262306a36Sopenharmony_ci int (*set_uvd_clocks)(struct amdgpu_device *adev, u32 vclk, u32 dclk); 55362306a36Sopenharmony_ci int (*set_vce_clocks)(struct amdgpu_device *adev, u32 evclk, u32 ecclk); 55462306a36Sopenharmony_ci /* static power management */ 55562306a36Sopenharmony_ci int (*get_pcie_lanes)(struct amdgpu_device *adev); 55662306a36Sopenharmony_ci void (*set_pcie_lanes)(struct amdgpu_device *adev, int lanes); 55762306a36Sopenharmony_ci /* get config memsize register */ 55862306a36Sopenharmony_ci u32 (*get_config_memsize)(struct amdgpu_device *adev); 55962306a36Sopenharmony_ci /* flush hdp write queue */ 56062306a36Sopenharmony_ci void (*flush_hdp)(struct amdgpu_device *adev, struct amdgpu_ring *ring); 56162306a36Sopenharmony_ci /* invalidate hdp read cache */ 56262306a36Sopenharmony_ci void (*invalidate_hdp)(struct amdgpu_device *adev, 56362306a36Sopenharmony_ci struct amdgpu_ring *ring); 56462306a36Sopenharmony_ci /* check if the asic needs a full reset of if soft reset will work */ 56562306a36Sopenharmony_ci bool (*need_full_reset)(struct amdgpu_device *adev); 56662306a36Sopenharmony_ci /* initialize doorbell layout for specific asic*/ 56762306a36Sopenharmony_ci void (*init_doorbell_index)(struct amdgpu_device *adev); 56862306a36Sopenharmony_ci /* PCIe bandwidth usage */ 56962306a36Sopenharmony_ci void (*get_pcie_usage)(struct amdgpu_device *adev, uint64_t *count0, 57062306a36Sopenharmony_ci uint64_t *count1); 57162306a36Sopenharmony_ci /* do we need to reset the asic at init time (e.g., kexec) */ 57262306a36Sopenharmony_ci bool (*need_reset_on_init)(struct amdgpu_device *adev); 57362306a36Sopenharmony_ci /* PCIe replay counter */ 57462306a36Sopenharmony_ci uint64_t (*get_pcie_replay_count)(struct amdgpu_device *adev); 57562306a36Sopenharmony_ci /* device supports BACO */ 57662306a36Sopenharmony_ci bool (*supports_baco)(struct amdgpu_device *adev); 57762306a36Sopenharmony_ci /* pre asic_init quirks */ 57862306a36Sopenharmony_ci void (*pre_asic_init)(struct amdgpu_device *adev); 57962306a36Sopenharmony_ci /* enter/exit umd stable pstate */ 58062306a36Sopenharmony_ci int (*update_umd_stable_pstate)(struct amdgpu_device *adev, bool enter); 58162306a36Sopenharmony_ci /* query video codecs */ 58262306a36Sopenharmony_ci int (*query_video_codecs)(struct amdgpu_device *adev, bool encode, 58362306a36Sopenharmony_ci const struct amdgpu_video_codecs **codecs); 58462306a36Sopenharmony_ci /* encode "> 32bits" smn addressing */ 58562306a36Sopenharmony_ci u64 (*encode_ext_smn_addressing)(int ext_id); 58662306a36Sopenharmony_ci}; 58762306a36Sopenharmony_ci 58862306a36Sopenharmony_ci/* 58962306a36Sopenharmony_ci * IOCTL. 59062306a36Sopenharmony_ci */ 59162306a36Sopenharmony_ciint amdgpu_bo_list_ioctl(struct drm_device *dev, void *data, 59262306a36Sopenharmony_ci struct drm_file *filp); 59362306a36Sopenharmony_ci 59462306a36Sopenharmony_ciint amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp); 59562306a36Sopenharmony_ciint amdgpu_cs_fence_to_handle_ioctl(struct drm_device *dev, void *data, 59662306a36Sopenharmony_ci struct drm_file *filp); 59762306a36Sopenharmony_ciint amdgpu_cs_wait_ioctl(struct drm_device *dev, void *data, struct drm_file *filp); 59862306a36Sopenharmony_ciint amdgpu_cs_wait_fences_ioctl(struct drm_device *dev, void *data, 59962306a36Sopenharmony_ci struct drm_file *filp); 60062306a36Sopenharmony_ci 60162306a36Sopenharmony_ci/* VRAM scratch page for HDP bug, default vram page */ 60262306a36Sopenharmony_cistruct amdgpu_mem_scratch { 60362306a36Sopenharmony_ci struct amdgpu_bo *robj; 60462306a36Sopenharmony_ci volatile uint32_t *ptr; 60562306a36Sopenharmony_ci u64 gpu_addr; 60662306a36Sopenharmony_ci}; 60762306a36Sopenharmony_ci 60862306a36Sopenharmony_ci/* 60962306a36Sopenharmony_ci * CGS 61062306a36Sopenharmony_ci */ 61162306a36Sopenharmony_cistruct cgs_device *amdgpu_cgs_create_device(struct amdgpu_device *adev); 61262306a36Sopenharmony_civoid amdgpu_cgs_destroy_device(struct cgs_device *cgs_device); 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_ci/* 61562306a36Sopenharmony_ci * Core structure, functions and helpers. 61662306a36Sopenharmony_ci */ 61762306a36Sopenharmony_citypedef uint32_t (*amdgpu_rreg_t)(struct amdgpu_device*, uint32_t); 61862306a36Sopenharmony_citypedef void (*amdgpu_wreg_t)(struct amdgpu_device*, uint32_t, uint32_t); 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_citypedef uint32_t (*amdgpu_rreg_ext_t)(struct amdgpu_device*, uint64_t); 62162306a36Sopenharmony_citypedef void (*amdgpu_wreg_ext_t)(struct amdgpu_device*, uint64_t, uint32_t); 62262306a36Sopenharmony_ci 62362306a36Sopenharmony_citypedef uint64_t (*amdgpu_rreg64_t)(struct amdgpu_device*, uint32_t); 62462306a36Sopenharmony_citypedef void (*amdgpu_wreg64_t)(struct amdgpu_device*, uint32_t, uint64_t); 62562306a36Sopenharmony_ci 62662306a36Sopenharmony_citypedef uint32_t (*amdgpu_block_rreg_t)(struct amdgpu_device*, uint32_t, uint32_t); 62762306a36Sopenharmony_citypedef void (*amdgpu_block_wreg_t)(struct amdgpu_device*, uint32_t, uint32_t, uint32_t); 62862306a36Sopenharmony_ci 62962306a36Sopenharmony_cistruct amdgpu_mmio_remap { 63062306a36Sopenharmony_ci u32 reg_offset; 63162306a36Sopenharmony_ci resource_size_t bus_addr; 63262306a36Sopenharmony_ci}; 63362306a36Sopenharmony_ci 63462306a36Sopenharmony_ci/* Define the HW IP blocks will be used in driver , add more if necessary */ 63562306a36Sopenharmony_cienum amd_hw_ip_block_type { 63662306a36Sopenharmony_ci GC_HWIP = 1, 63762306a36Sopenharmony_ci HDP_HWIP, 63862306a36Sopenharmony_ci SDMA0_HWIP, 63962306a36Sopenharmony_ci SDMA1_HWIP, 64062306a36Sopenharmony_ci SDMA2_HWIP, 64162306a36Sopenharmony_ci SDMA3_HWIP, 64262306a36Sopenharmony_ci SDMA4_HWIP, 64362306a36Sopenharmony_ci SDMA5_HWIP, 64462306a36Sopenharmony_ci SDMA6_HWIP, 64562306a36Sopenharmony_ci SDMA7_HWIP, 64662306a36Sopenharmony_ci LSDMA_HWIP, 64762306a36Sopenharmony_ci MMHUB_HWIP, 64862306a36Sopenharmony_ci ATHUB_HWIP, 64962306a36Sopenharmony_ci NBIO_HWIP, 65062306a36Sopenharmony_ci MP0_HWIP, 65162306a36Sopenharmony_ci MP1_HWIP, 65262306a36Sopenharmony_ci UVD_HWIP, 65362306a36Sopenharmony_ci VCN_HWIP = UVD_HWIP, 65462306a36Sopenharmony_ci JPEG_HWIP = VCN_HWIP, 65562306a36Sopenharmony_ci VCN1_HWIP, 65662306a36Sopenharmony_ci VCE_HWIP, 65762306a36Sopenharmony_ci DF_HWIP, 65862306a36Sopenharmony_ci DCE_HWIP, 65962306a36Sopenharmony_ci OSSSYS_HWIP, 66062306a36Sopenharmony_ci SMUIO_HWIP, 66162306a36Sopenharmony_ci PWR_HWIP, 66262306a36Sopenharmony_ci NBIF_HWIP, 66362306a36Sopenharmony_ci THM_HWIP, 66462306a36Sopenharmony_ci CLK_HWIP, 66562306a36Sopenharmony_ci UMC_HWIP, 66662306a36Sopenharmony_ci RSMU_HWIP, 66762306a36Sopenharmony_ci XGMI_HWIP, 66862306a36Sopenharmony_ci DCI_HWIP, 66962306a36Sopenharmony_ci PCIE_HWIP, 67062306a36Sopenharmony_ci MAX_HWIP 67162306a36Sopenharmony_ci}; 67262306a36Sopenharmony_ci 67362306a36Sopenharmony_ci#define HWIP_MAX_INSTANCE 44 67462306a36Sopenharmony_ci 67562306a36Sopenharmony_ci#define HW_ID_MAX 300 67662306a36Sopenharmony_ci#define IP_VERSION(mj, mn, rv) (((mj) << 16) | ((mn) << 8) | (rv)) 67762306a36Sopenharmony_ci#define IP_VERSION_MAJ(ver) ((ver) >> 16) 67862306a36Sopenharmony_ci#define IP_VERSION_MIN(ver) (((ver) >> 8) & 0xFF) 67962306a36Sopenharmony_ci#define IP_VERSION_REV(ver) ((ver) & 0xFF) 68062306a36Sopenharmony_ci 68162306a36Sopenharmony_cistruct amdgpu_ip_map_info { 68262306a36Sopenharmony_ci /* Map of logical to actual dev instances/mask */ 68362306a36Sopenharmony_ci uint32_t dev_inst[MAX_HWIP][HWIP_MAX_INSTANCE]; 68462306a36Sopenharmony_ci int8_t (*logical_to_dev_inst)(struct amdgpu_device *adev, 68562306a36Sopenharmony_ci enum amd_hw_ip_block_type block, 68662306a36Sopenharmony_ci int8_t inst); 68762306a36Sopenharmony_ci uint32_t (*logical_to_dev_mask)(struct amdgpu_device *adev, 68862306a36Sopenharmony_ci enum amd_hw_ip_block_type block, 68962306a36Sopenharmony_ci uint32_t mask); 69062306a36Sopenharmony_ci}; 69162306a36Sopenharmony_ci 69262306a36Sopenharmony_cistruct amd_powerplay { 69362306a36Sopenharmony_ci void *pp_handle; 69462306a36Sopenharmony_ci const struct amd_pm_funcs *pp_funcs; 69562306a36Sopenharmony_ci}; 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_cistruct ip_discovery_top; 69862306a36Sopenharmony_ci 69962306a36Sopenharmony_ci/* polaris10 kickers */ 70062306a36Sopenharmony_ci#define ASICID_IS_P20(did, rid) (((did == 0x67DF) && \ 70162306a36Sopenharmony_ci ((rid == 0xE3) || \ 70262306a36Sopenharmony_ci (rid == 0xE4) || \ 70362306a36Sopenharmony_ci (rid == 0xE5) || \ 70462306a36Sopenharmony_ci (rid == 0xE7) || \ 70562306a36Sopenharmony_ci (rid == 0xEF))) || \ 70662306a36Sopenharmony_ci ((did == 0x6FDF) && \ 70762306a36Sopenharmony_ci ((rid == 0xE7) || \ 70862306a36Sopenharmony_ci (rid == 0xEF) || \ 70962306a36Sopenharmony_ci (rid == 0xFF)))) 71062306a36Sopenharmony_ci 71162306a36Sopenharmony_ci#define ASICID_IS_P30(did, rid) ((did == 0x67DF) && \ 71262306a36Sopenharmony_ci ((rid == 0xE1) || \ 71362306a36Sopenharmony_ci (rid == 0xF7))) 71462306a36Sopenharmony_ci 71562306a36Sopenharmony_ci/* polaris11 kickers */ 71662306a36Sopenharmony_ci#define ASICID_IS_P21(did, rid) (((did == 0x67EF) && \ 71762306a36Sopenharmony_ci ((rid == 0xE0) || \ 71862306a36Sopenharmony_ci (rid == 0xE5))) || \ 71962306a36Sopenharmony_ci ((did == 0x67FF) && \ 72062306a36Sopenharmony_ci ((rid == 0xCF) || \ 72162306a36Sopenharmony_ci (rid == 0xEF) || \ 72262306a36Sopenharmony_ci (rid == 0xFF)))) 72362306a36Sopenharmony_ci 72462306a36Sopenharmony_ci#define ASICID_IS_P31(did, rid) ((did == 0x67EF) && \ 72562306a36Sopenharmony_ci ((rid == 0xE2))) 72662306a36Sopenharmony_ci 72762306a36Sopenharmony_ci/* polaris12 kickers */ 72862306a36Sopenharmony_ci#define ASICID_IS_P23(did, rid) (((did == 0x6987) && \ 72962306a36Sopenharmony_ci ((rid == 0xC0) || \ 73062306a36Sopenharmony_ci (rid == 0xC1) || \ 73162306a36Sopenharmony_ci (rid == 0xC3) || \ 73262306a36Sopenharmony_ci (rid == 0xC7))) || \ 73362306a36Sopenharmony_ci ((did == 0x6981) && \ 73462306a36Sopenharmony_ci ((rid == 0x00) || \ 73562306a36Sopenharmony_ci (rid == 0x01) || \ 73662306a36Sopenharmony_ci (rid == 0x10)))) 73762306a36Sopenharmony_ci 73862306a36Sopenharmony_cistruct amdgpu_mqd_prop { 73962306a36Sopenharmony_ci uint64_t mqd_gpu_addr; 74062306a36Sopenharmony_ci uint64_t hqd_base_gpu_addr; 74162306a36Sopenharmony_ci uint64_t rptr_gpu_addr; 74262306a36Sopenharmony_ci uint64_t wptr_gpu_addr; 74362306a36Sopenharmony_ci uint32_t queue_size; 74462306a36Sopenharmony_ci bool use_doorbell; 74562306a36Sopenharmony_ci uint32_t doorbell_index; 74662306a36Sopenharmony_ci uint64_t eop_gpu_addr; 74762306a36Sopenharmony_ci uint32_t hqd_pipe_priority; 74862306a36Sopenharmony_ci uint32_t hqd_queue_priority; 74962306a36Sopenharmony_ci bool hqd_active; 75062306a36Sopenharmony_ci}; 75162306a36Sopenharmony_ci 75262306a36Sopenharmony_cistruct amdgpu_mqd { 75362306a36Sopenharmony_ci unsigned mqd_size; 75462306a36Sopenharmony_ci int (*init_mqd)(struct amdgpu_device *adev, void *mqd, 75562306a36Sopenharmony_ci struct amdgpu_mqd_prop *p); 75662306a36Sopenharmony_ci}; 75762306a36Sopenharmony_ci 75862306a36Sopenharmony_ci#define AMDGPU_RESET_MAGIC_NUM 64 75962306a36Sopenharmony_ci#define AMDGPU_MAX_DF_PERFMONS 4 76062306a36Sopenharmony_ci#define AMDGPU_PRODUCT_NAME_LEN 64 76162306a36Sopenharmony_cistruct amdgpu_reset_domain; 76262306a36Sopenharmony_ci 76362306a36Sopenharmony_ci/* 76462306a36Sopenharmony_ci * Non-zero (true) if the GPU has VRAM. Zero (false) otherwise. 76562306a36Sopenharmony_ci */ 76662306a36Sopenharmony_ci#define AMDGPU_HAS_VRAM(_adev) ((_adev)->gmc.real_vram_size) 76762306a36Sopenharmony_ci 76862306a36Sopenharmony_cistruct amdgpu_device { 76962306a36Sopenharmony_ci struct device *dev; 77062306a36Sopenharmony_ci struct pci_dev *pdev; 77162306a36Sopenharmony_ci struct drm_device ddev; 77262306a36Sopenharmony_ci 77362306a36Sopenharmony_ci#ifdef CONFIG_DRM_AMD_ACP 77462306a36Sopenharmony_ci struct amdgpu_acp acp; 77562306a36Sopenharmony_ci#endif 77662306a36Sopenharmony_ci struct amdgpu_hive_info *hive; 77762306a36Sopenharmony_ci struct amdgpu_xcp_mgr *xcp_mgr; 77862306a36Sopenharmony_ci /* ASIC */ 77962306a36Sopenharmony_ci enum amd_asic_type asic_type; 78062306a36Sopenharmony_ci uint32_t family; 78162306a36Sopenharmony_ci uint32_t rev_id; 78262306a36Sopenharmony_ci uint32_t external_rev_id; 78362306a36Sopenharmony_ci unsigned long flags; 78462306a36Sopenharmony_ci unsigned long apu_flags; 78562306a36Sopenharmony_ci int usec_timeout; 78662306a36Sopenharmony_ci const struct amdgpu_asic_funcs *asic_funcs; 78762306a36Sopenharmony_ci bool shutdown; 78862306a36Sopenharmony_ci bool need_swiotlb; 78962306a36Sopenharmony_ci bool accel_working; 79062306a36Sopenharmony_ci struct notifier_block acpi_nb; 79162306a36Sopenharmony_ci struct amdgpu_i2c_chan *i2c_bus[AMDGPU_MAX_I2C_BUS]; 79262306a36Sopenharmony_ci struct debugfs_blob_wrapper debugfs_vbios_blob; 79362306a36Sopenharmony_ci struct debugfs_blob_wrapper debugfs_discovery_blob; 79462306a36Sopenharmony_ci struct mutex srbm_mutex; 79562306a36Sopenharmony_ci /* GRBM index mutex. Protects concurrent access to GRBM index */ 79662306a36Sopenharmony_ci struct mutex grbm_idx_mutex; 79762306a36Sopenharmony_ci struct dev_pm_domain vga_pm_domain; 79862306a36Sopenharmony_ci bool have_disp_power_ref; 79962306a36Sopenharmony_ci bool have_atomics_support; 80062306a36Sopenharmony_ci 80162306a36Sopenharmony_ci /* BIOS */ 80262306a36Sopenharmony_ci bool is_atom_fw; 80362306a36Sopenharmony_ci uint8_t *bios; 80462306a36Sopenharmony_ci uint32_t bios_size; 80562306a36Sopenharmony_ci uint32_t bios_scratch_reg_offset; 80662306a36Sopenharmony_ci uint32_t bios_scratch[AMDGPU_BIOS_NUM_SCRATCH]; 80762306a36Sopenharmony_ci 80862306a36Sopenharmony_ci /* Register/doorbell mmio */ 80962306a36Sopenharmony_ci resource_size_t rmmio_base; 81062306a36Sopenharmony_ci resource_size_t rmmio_size; 81162306a36Sopenharmony_ci void __iomem *rmmio; 81262306a36Sopenharmony_ci /* protects concurrent MM_INDEX/DATA based register access */ 81362306a36Sopenharmony_ci spinlock_t mmio_idx_lock; 81462306a36Sopenharmony_ci struct amdgpu_mmio_remap rmmio_remap; 81562306a36Sopenharmony_ci /* protects concurrent SMC based register access */ 81662306a36Sopenharmony_ci spinlock_t smc_idx_lock; 81762306a36Sopenharmony_ci amdgpu_rreg_t smc_rreg; 81862306a36Sopenharmony_ci amdgpu_wreg_t smc_wreg; 81962306a36Sopenharmony_ci /* protects concurrent PCIE register access */ 82062306a36Sopenharmony_ci spinlock_t pcie_idx_lock; 82162306a36Sopenharmony_ci amdgpu_rreg_t pcie_rreg; 82262306a36Sopenharmony_ci amdgpu_wreg_t pcie_wreg; 82362306a36Sopenharmony_ci amdgpu_rreg_t pciep_rreg; 82462306a36Sopenharmony_ci amdgpu_wreg_t pciep_wreg; 82562306a36Sopenharmony_ci amdgpu_rreg_ext_t pcie_rreg_ext; 82662306a36Sopenharmony_ci amdgpu_wreg_ext_t pcie_wreg_ext; 82762306a36Sopenharmony_ci amdgpu_rreg64_t pcie_rreg64; 82862306a36Sopenharmony_ci amdgpu_wreg64_t pcie_wreg64; 82962306a36Sopenharmony_ci /* protects concurrent UVD register access */ 83062306a36Sopenharmony_ci spinlock_t uvd_ctx_idx_lock; 83162306a36Sopenharmony_ci amdgpu_rreg_t uvd_ctx_rreg; 83262306a36Sopenharmony_ci amdgpu_wreg_t uvd_ctx_wreg; 83362306a36Sopenharmony_ci /* protects concurrent DIDT register access */ 83462306a36Sopenharmony_ci spinlock_t didt_idx_lock; 83562306a36Sopenharmony_ci amdgpu_rreg_t didt_rreg; 83662306a36Sopenharmony_ci amdgpu_wreg_t didt_wreg; 83762306a36Sopenharmony_ci /* protects concurrent gc_cac register access */ 83862306a36Sopenharmony_ci spinlock_t gc_cac_idx_lock; 83962306a36Sopenharmony_ci amdgpu_rreg_t gc_cac_rreg; 84062306a36Sopenharmony_ci amdgpu_wreg_t gc_cac_wreg; 84162306a36Sopenharmony_ci /* protects concurrent se_cac register access */ 84262306a36Sopenharmony_ci spinlock_t se_cac_idx_lock; 84362306a36Sopenharmony_ci amdgpu_rreg_t se_cac_rreg; 84462306a36Sopenharmony_ci amdgpu_wreg_t se_cac_wreg; 84562306a36Sopenharmony_ci /* protects concurrent ENDPOINT (audio) register access */ 84662306a36Sopenharmony_ci spinlock_t audio_endpt_idx_lock; 84762306a36Sopenharmony_ci amdgpu_block_rreg_t audio_endpt_rreg; 84862306a36Sopenharmony_ci amdgpu_block_wreg_t audio_endpt_wreg; 84962306a36Sopenharmony_ci struct amdgpu_doorbell doorbell; 85062306a36Sopenharmony_ci 85162306a36Sopenharmony_ci /* clock/pll info */ 85262306a36Sopenharmony_ci struct amdgpu_clock clock; 85362306a36Sopenharmony_ci 85462306a36Sopenharmony_ci /* MC */ 85562306a36Sopenharmony_ci struct amdgpu_gmc gmc; 85662306a36Sopenharmony_ci struct amdgpu_gart gart; 85762306a36Sopenharmony_ci dma_addr_t dummy_page_addr; 85862306a36Sopenharmony_ci struct amdgpu_vm_manager vm_manager; 85962306a36Sopenharmony_ci struct amdgpu_vmhub vmhub[AMDGPU_MAX_VMHUBS]; 86062306a36Sopenharmony_ci DECLARE_BITMAP(vmhubs_mask, AMDGPU_MAX_VMHUBS); 86162306a36Sopenharmony_ci 86262306a36Sopenharmony_ci /* memory management */ 86362306a36Sopenharmony_ci struct amdgpu_mman mman; 86462306a36Sopenharmony_ci struct amdgpu_mem_scratch mem_scratch; 86562306a36Sopenharmony_ci struct amdgpu_wb wb; 86662306a36Sopenharmony_ci atomic64_t num_bytes_moved; 86762306a36Sopenharmony_ci atomic64_t num_evictions; 86862306a36Sopenharmony_ci atomic64_t num_vram_cpu_page_faults; 86962306a36Sopenharmony_ci atomic_t gpu_reset_counter; 87062306a36Sopenharmony_ci atomic_t vram_lost_counter; 87162306a36Sopenharmony_ci 87262306a36Sopenharmony_ci /* data for buffer migration throttling */ 87362306a36Sopenharmony_ci struct { 87462306a36Sopenharmony_ci spinlock_t lock; 87562306a36Sopenharmony_ci s64 last_update_us; 87662306a36Sopenharmony_ci s64 accum_us; /* accumulated microseconds */ 87762306a36Sopenharmony_ci s64 accum_us_vis; /* for visible VRAM */ 87862306a36Sopenharmony_ci u32 log2_max_MBps; 87962306a36Sopenharmony_ci } mm_stats; 88062306a36Sopenharmony_ci 88162306a36Sopenharmony_ci /* display */ 88262306a36Sopenharmony_ci bool enable_virtual_display; 88362306a36Sopenharmony_ci struct amdgpu_vkms_output *amdgpu_vkms_output; 88462306a36Sopenharmony_ci struct amdgpu_mode_info mode_info; 88562306a36Sopenharmony_ci /* For pre-DCE11. DCE11 and later are in "struct amdgpu_device->dm" */ 88662306a36Sopenharmony_ci struct delayed_work hotplug_work; 88762306a36Sopenharmony_ci struct amdgpu_irq_src crtc_irq; 88862306a36Sopenharmony_ci struct amdgpu_irq_src vline0_irq; 88962306a36Sopenharmony_ci struct amdgpu_irq_src vupdate_irq; 89062306a36Sopenharmony_ci struct amdgpu_irq_src pageflip_irq; 89162306a36Sopenharmony_ci struct amdgpu_irq_src hpd_irq; 89262306a36Sopenharmony_ci struct amdgpu_irq_src dmub_trace_irq; 89362306a36Sopenharmony_ci struct amdgpu_irq_src dmub_outbox_irq; 89462306a36Sopenharmony_ci 89562306a36Sopenharmony_ci /* rings */ 89662306a36Sopenharmony_ci u64 fence_context; 89762306a36Sopenharmony_ci unsigned num_rings; 89862306a36Sopenharmony_ci struct amdgpu_ring *rings[AMDGPU_MAX_RINGS]; 89962306a36Sopenharmony_ci struct dma_fence __rcu *gang_submit; 90062306a36Sopenharmony_ci bool ib_pool_ready; 90162306a36Sopenharmony_ci struct amdgpu_sa_manager ib_pools[AMDGPU_IB_POOL_MAX]; 90262306a36Sopenharmony_ci struct amdgpu_sched gpu_sched[AMDGPU_HW_IP_NUM][AMDGPU_RING_PRIO_MAX]; 90362306a36Sopenharmony_ci 90462306a36Sopenharmony_ci /* interrupts */ 90562306a36Sopenharmony_ci struct amdgpu_irq irq; 90662306a36Sopenharmony_ci 90762306a36Sopenharmony_ci /* powerplay */ 90862306a36Sopenharmony_ci struct amd_powerplay powerplay; 90962306a36Sopenharmony_ci struct amdgpu_pm pm; 91062306a36Sopenharmony_ci u64 cg_flags; 91162306a36Sopenharmony_ci u32 pg_flags; 91262306a36Sopenharmony_ci 91362306a36Sopenharmony_ci /* nbio */ 91462306a36Sopenharmony_ci struct amdgpu_nbio nbio; 91562306a36Sopenharmony_ci 91662306a36Sopenharmony_ci /* hdp */ 91762306a36Sopenharmony_ci struct amdgpu_hdp hdp; 91862306a36Sopenharmony_ci 91962306a36Sopenharmony_ci /* smuio */ 92062306a36Sopenharmony_ci struct amdgpu_smuio smuio; 92162306a36Sopenharmony_ci 92262306a36Sopenharmony_ci /* mmhub */ 92362306a36Sopenharmony_ci struct amdgpu_mmhub mmhub; 92462306a36Sopenharmony_ci 92562306a36Sopenharmony_ci /* gfxhub */ 92662306a36Sopenharmony_ci struct amdgpu_gfxhub gfxhub; 92762306a36Sopenharmony_ci 92862306a36Sopenharmony_ci /* gfx */ 92962306a36Sopenharmony_ci struct amdgpu_gfx gfx; 93062306a36Sopenharmony_ci 93162306a36Sopenharmony_ci /* sdma */ 93262306a36Sopenharmony_ci struct amdgpu_sdma sdma; 93362306a36Sopenharmony_ci 93462306a36Sopenharmony_ci /* lsdma */ 93562306a36Sopenharmony_ci struct amdgpu_lsdma lsdma; 93662306a36Sopenharmony_ci 93762306a36Sopenharmony_ci /* uvd */ 93862306a36Sopenharmony_ci struct amdgpu_uvd uvd; 93962306a36Sopenharmony_ci 94062306a36Sopenharmony_ci /* vce */ 94162306a36Sopenharmony_ci struct amdgpu_vce vce; 94262306a36Sopenharmony_ci 94362306a36Sopenharmony_ci /* vcn */ 94462306a36Sopenharmony_ci struct amdgpu_vcn vcn; 94562306a36Sopenharmony_ci 94662306a36Sopenharmony_ci /* jpeg */ 94762306a36Sopenharmony_ci struct amdgpu_jpeg jpeg; 94862306a36Sopenharmony_ci 94962306a36Sopenharmony_ci /* firmwares */ 95062306a36Sopenharmony_ci struct amdgpu_firmware firmware; 95162306a36Sopenharmony_ci 95262306a36Sopenharmony_ci /* PSP */ 95362306a36Sopenharmony_ci struct psp_context psp; 95462306a36Sopenharmony_ci 95562306a36Sopenharmony_ci /* GDS */ 95662306a36Sopenharmony_ci struct amdgpu_gds gds; 95762306a36Sopenharmony_ci 95862306a36Sopenharmony_ci /* KFD */ 95962306a36Sopenharmony_ci struct amdgpu_kfd_dev kfd; 96062306a36Sopenharmony_ci 96162306a36Sopenharmony_ci /* UMC */ 96262306a36Sopenharmony_ci struct amdgpu_umc umc; 96362306a36Sopenharmony_ci 96462306a36Sopenharmony_ci /* display related functionality */ 96562306a36Sopenharmony_ci struct amdgpu_display_manager dm; 96662306a36Sopenharmony_ci 96762306a36Sopenharmony_ci /* mes */ 96862306a36Sopenharmony_ci bool enable_mes; 96962306a36Sopenharmony_ci bool enable_mes_kiq; 97062306a36Sopenharmony_ci struct amdgpu_mes mes; 97162306a36Sopenharmony_ci struct amdgpu_mqd mqds[AMDGPU_HW_IP_NUM]; 97262306a36Sopenharmony_ci 97362306a36Sopenharmony_ci /* df */ 97462306a36Sopenharmony_ci struct amdgpu_df df; 97562306a36Sopenharmony_ci 97662306a36Sopenharmony_ci /* MCA */ 97762306a36Sopenharmony_ci struct amdgpu_mca mca; 97862306a36Sopenharmony_ci 97962306a36Sopenharmony_ci struct amdgpu_ip_block ip_blocks[AMDGPU_MAX_IP_NUM]; 98062306a36Sopenharmony_ci uint32_t harvest_ip_mask; 98162306a36Sopenharmony_ci int num_ip_blocks; 98262306a36Sopenharmony_ci struct mutex mn_lock; 98362306a36Sopenharmony_ci DECLARE_HASHTABLE(mn_hash, 7); 98462306a36Sopenharmony_ci 98562306a36Sopenharmony_ci /* tracking pinned memory */ 98662306a36Sopenharmony_ci atomic64_t vram_pin_size; 98762306a36Sopenharmony_ci atomic64_t visible_pin_size; 98862306a36Sopenharmony_ci atomic64_t gart_pin_size; 98962306a36Sopenharmony_ci 99062306a36Sopenharmony_ci /* soc15 register offset based on ip, instance and segment */ 99162306a36Sopenharmony_ci uint32_t *reg_offset[MAX_HWIP][HWIP_MAX_INSTANCE]; 99262306a36Sopenharmony_ci struct amdgpu_ip_map_info ip_map; 99362306a36Sopenharmony_ci 99462306a36Sopenharmony_ci /* delayed work_func for deferring clockgating during resume */ 99562306a36Sopenharmony_ci struct delayed_work delayed_init_work; 99662306a36Sopenharmony_ci 99762306a36Sopenharmony_ci struct amdgpu_virt virt; 99862306a36Sopenharmony_ci 99962306a36Sopenharmony_ci /* link all shadow bo */ 100062306a36Sopenharmony_ci struct list_head shadow_list; 100162306a36Sopenharmony_ci struct mutex shadow_list_lock; 100262306a36Sopenharmony_ci 100362306a36Sopenharmony_ci /* record hw reset is performed */ 100462306a36Sopenharmony_ci bool has_hw_reset; 100562306a36Sopenharmony_ci u8 reset_magic[AMDGPU_RESET_MAGIC_NUM]; 100662306a36Sopenharmony_ci 100762306a36Sopenharmony_ci /* s3/s4 mask */ 100862306a36Sopenharmony_ci bool in_suspend; 100962306a36Sopenharmony_ci bool in_s3; 101062306a36Sopenharmony_ci bool in_s4; 101162306a36Sopenharmony_ci bool in_s0ix; 101262306a36Sopenharmony_ci /* indicate amdgpu suspension status */ 101362306a36Sopenharmony_ci bool suspend_complete; 101462306a36Sopenharmony_ci 101562306a36Sopenharmony_ci enum pp_mp1_state mp1_state; 101662306a36Sopenharmony_ci struct amdgpu_doorbell_index doorbell_index; 101762306a36Sopenharmony_ci 101862306a36Sopenharmony_ci struct mutex notifier_lock; 101962306a36Sopenharmony_ci 102062306a36Sopenharmony_ci int asic_reset_res; 102162306a36Sopenharmony_ci struct work_struct xgmi_reset_work; 102262306a36Sopenharmony_ci struct list_head reset_list; 102362306a36Sopenharmony_ci 102462306a36Sopenharmony_ci long gfx_timeout; 102562306a36Sopenharmony_ci long sdma_timeout; 102662306a36Sopenharmony_ci long video_timeout; 102762306a36Sopenharmony_ci long compute_timeout; 102862306a36Sopenharmony_ci 102962306a36Sopenharmony_ci uint64_t unique_id; 103062306a36Sopenharmony_ci uint64_t df_perfmon_config_assign_mask[AMDGPU_MAX_DF_PERFMONS]; 103162306a36Sopenharmony_ci 103262306a36Sopenharmony_ci /* enable runtime pm on the device */ 103362306a36Sopenharmony_ci bool in_runpm; 103462306a36Sopenharmony_ci bool has_pr3; 103562306a36Sopenharmony_ci 103662306a36Sopenharmony_ci bool ucode_sysfs_en; 103762306a36Sopenharmony_ci 103862306a36Sopenharmony_ci /* Chip product information */ 103962306a36Sopenharmony_ci char product_number[20]; 104062306a36Sopenharmony_ci char product_name[AMDGPU_PRODUCT_NAME_LEN]; 104162306a36Sopenharmony_ci char serial[20]; 104262306a36Sopenharmony_ci 104362306a36Sopenharmony_ci atomic_t throttling_logging_enabled; 104462306a36Sopenharmony_ci struct ratelimit_state throttling_logging_rs; 104562306a36Sopenharmony_ci uint32_t ras_hw_enabled; 104662306a36Sopenharmony_ci uint32_t ras_enabled; 104762306a36Sopenharmony_ci 104862306a36Sopenharmony_ci bool no_hw_access; 104962306a36Sopenharmony_ci struct pci_saved_state *pci_state; 105062306a36Sopenharmony_ci pci_channel_state_t pci_channel_state; 105162306a36Sopenharmony_ci 105262306a36Sopenharmony_ci /* Track auto wait count on s_barrier settings */ 105362306a36Sopenharmony_ci bool barrier_has_auto_waitcnt; 105462306a36Sopenharmony_ci 105562306a36Sopenharmony_ci struct amdgpu_reset_control *reset_cntl; 105662306a36Sopenharmony_ci uint32_t ip_versions[MAX_HWIP][HWIP_MAX_INSTANCE]; 105762306a36Sopenharmony_ci 105862306a36Sopenharmony_ci bool ram_is_direct_mapped; 105962306a36Sopenharmony_ci 106062306a36Sopenharmony_ci struct list_head ras_list; 106162306a36Sopenharmony_ci 106262306a36Sopenharmony_ci struct ip_discovery_top *ip_top; 106362306a36Sopenharmony_ci 106462306a36Sopenharmony_ci struct amdgpu_reset_domain *reset_domain; 106562306a36Sopenharmony_ci 106662306a36Sopenharmony_ci struct mutex benchmark_mutex; 106762306a36Sopenharmony_ci 106862306a36Sopenharmony_ci /* reset dump register */ 106962306a36Sopenharmony_ci uint32_t *reset_dump_reg_list; 107062306a36Sopenharmony_ci uint32_t *reset_dump_reg_value; 107162306a36Sopenharmony_ci int num_regs; 107262306a36Sopenharmony_ci#ifdef CONFIG_DEV_COREDUMP 107362306a36Sopenharmony_ci struct amdgpu_task_info reset_task_info; 107462306a36Sopenharmony_ci bool reset_vram_lost; 107562306a36Sopenharmony_ci struct timespec64 reset_time; 107662306a36Sopenharmony_ci#endif 107762306a36Sopenharmony_ci 107862306a36Sopenharmony_ci bool scpm_enabled; 107962306a36Sopenharmony_ci uint32_t scpm_status; 108062306a36Sopenharmony_ci 108162306a36Sopenharmony_ci struct work_struct reset_work; 108262306a36Sopenharmony_ci 108362306a36Sopenharmony_ci bool job_hang; 108462306a36Sopenharmony_ci bool dc_enabled; 108562306a36Sopenharmony_ci /* Mask of active clusters */ 108662306a36Sopenharmony_ci uint32_t aid_mask; 108762306a36Sopenharmony_ci}; 108862306a36Sopenharmony_ci 108962306a36Sopenharmony_cistatic inline struct amdgpu_device *drm_to_adev(struct drm_device *ddev) 109062306a36Sopenharmony_ci{ 109162306a36Sopenharmony_ci return container_of(ddev, struct amdgpu_device, ddev); 109262306a36Sopenharmony_ci} 109362306a36Sopenharmony_ci 109462306a36Sopenharmony_cistatic inline struct drm_device *adev_to_drm(struct amdgpu_device *adev) 109562306a36Sopenharmony_ci{ 109662306a36Sopenharmony_ci return &adev->ddev; 109762306a36Sopenharmony_ci} 109862306a36Sopenharmony_ci 109962306a36Sopenharmony_cistatic inline struct amdgpu_device *amdgpu_ttm_adev(struct ttm_device *bdev) 110062306a36Sopenharmony_ci{ 110162306a36Sopenharmony_ci return container_of(bdev, struct amdgpu_device, mman.bdev); 110262306a36Sopenharmony_ci} 110362306a36Sopenharmony_ci 110462306a36Sopenharmony_ciint amdgpu_device_init(struct amdgpu_device *adev, 110562306a36Sopenharmony_ci uint32_t flags); 110662306a36Sopenharmony_civoid amdgpu_device_fini_hw(struct amdgpu_device *adev); 110762306a36Sopenharmony_civoid amdgpu_device_fini_sw(struct amdgpu_device *adev); 110862306a36Sopenharmony_ci 110962306a36Sopenharmony_ciint amdgpu_gpu_wait_for_idle(struct amdgpu_device *adev); 111062306a36Sopenharmony_ci 111162306a36Sopenharmony_civoid amdgpu_device_mm_access(struct amdgpu_device *adev, loff_t pos, 111262306a36Sopenharmony_ci void *buf, size_t size, bool write); 111362306a36Sopenharmony_cisize_t amdgpu_device_aper_access(struct amdgpu_device *adev, loff_t pos, 111462306a36Sopenharmony_ci void *buf, size_t size, bool write); 111562306a36Sopenharmony_ci 111662306a36Sopenharmony_civoid amdgpu_device_vram_access(struct amdgpu_device *adev, loff_t pos, 111762306a36Sopenharmony_ci void *buf, size_t size, bool write); 111862306a36Sopenharmony_ciuint32_t amdgpu_device_wait_on_rreg(struct amdgpu_device *adev, 111962306a36Sopenharmony_ci uint32_t inst, uint32_t reg_addr, char reg_name[], 112062306a36Sopenharmony_ci uint32_t expected_value, uint32_t mask); 112162306a36Sopenharmony_ciuint32_t amdgpu_device_rreg(struct amdgpu_device *adev, 112262306a36Sopenharmony_ci uint32_t reg, uint32_t acc_flags); 112362306a36Sopenharmony_ciu32 amdgpu_device_indirect_rreg_ext(struct amdgpu_device *adev, 112462306a36Sopenharmony_ci u64 reg_addr); 112562306a36Sopenharmony_civoid amdgpu_device_wreg(struct amdgpu_device *adev, 112662306a36Sopenharmony_ci uint32_t reg, uint32_t v, 112762306a36Sopenharmony_ci uint32_t acc_flags); 112862306a36Sopenharmony_civoid amdgpu_device_indirect_wreg_ext(struct amdgpu_device *adev, 112962306a36Sopenharmony_ci u64 reg_addr, u32 reg_data); 113062306a36Sopenharmony_civoid amdgpu_mm_wreg_mmio_rlc(struct amdgpu_device *adev, 113162306a36Sopenharmony_ci uint32_t reg, uint32_t v, uint32_t xcc_id); 113262306a36Sopenharmony_civoid amdgpu_mm_wreg8(struct amdgpu_device *adev, uint32_t offset, uint8_t value); 113362306a36Sopenharmony_ciuint8_t amdgpu_mm_rreg8(struct amdgpu_device *adev, uint32_t offset); 113462306a36Sopenharmony_ci 113562306a36Sopenharmony_ciu32 amdgpu_device_indirect_rreg(struct amdgpu_device *adev, 113662306a36Sopenharmony_ci u32 reg_addr); 113762306a36Sopenharmony_ciu64 amdgpu_device_indirect_rreg64(struct amdgpu_device *adev, 113862306a36Sopenharmony_ci u32 reg_addr); 113962306a36Sopenharmony_civoid amdgpu_device_indirect_wreg(struct amdgpu_device *adev, 114062306a36Sopenharmony_ci u32 reg_addr, u32 reg_data); 114162306a36Sopenharmony_civoid amdgpu_device_indirect_wreg64(struct amdgpu_device *adev, 114262306a36Sopenharmony_ci u32 reg_addr, u64 reg_data); 114362306a36Sopenharmony_ciu32 amdgpu_device_get_rev_id(struct amdgpu_device *adev); 114462306a36Sopenharmony_cibool amdgpu_device_asic_has_dc_support(enum amd_asic_type asic_type); 114562306a36Sopenharmony_cibool amdgpu_device_has_dc_support(struct amdgpu_device *adev); 114662306a36Sopenharmony_ci 114762306a36Sopenharmony_civoid amdgpu_device_set_sriov_virtual_display(struct amdgpu_device *adev); 114862306a36Sopenharmony_ci 114962306a36Sopenharmony_ciint amdgpu_device_pre_asic_reset(struct amdgpu_device *adev, 115062306a36Sopenharmony_ci struct amdgpu_reset_context *reset_context); 115162306a36Sopenharmony_ci 115262306a36Sopenharmony_ciint amdgpu_do_asic_reset(struct list_head *device_list_handle, 115362306a36Sopenharmony_ci struct amdgpu_reset_context *reset_context); 115462306a36Sopenharmony_ci 115562306a36Sopenharmony_ciint emu_soc_asic_init(struct amdgpu_device *adev); 115662306a36Sopenharmony_ci 115762306a36Sopenharmony_ci/* 115862306a36Sopenharmony_ci * Registers read & write functions. 115962306a36Sopenharmony_ci */ 116062306a36Sopenharmony_ci#define AMDGPU_REGS_NO_KIQ (1<<1) 116162306a36Sopenharmony_ci#define AMDGPU_REGS_RLC (1<<2) 116262306a36Sopenharmony_ci 116362306a36Sopenharmony_ci#define RREG32_NO_KIQ(reg) amdgpu_device_rreg(adev, (reg), AMDGPU_REGS_NO_KIQ) 116462306a36Sopenharmony_ci#define WREG32_NO_KIQ(reg, v) amdgpu_device_wreg(adev, (reg), (v), AMDGPU_REGS_NO_KIQ) 116562306a36Sopenharmony_ci 116662306a36Sopenharmony_ci#define RREG32_KIQ(reg) amdgpu_kiq_rreg(adev, (reg)) 116762306a36Sopenharmony_ci#define WREG32_KIQ(reg, v) amdgpu_kiq_wreg(adev, (reg), (v)) 116862306a36Sopenharmony_ci 116962306a36Sopenharmony_ci#define RREG8(reg) amdgpu_mm_rreg8(adev, (reg)) 117062306a36Sopenharmony_ci#define WREG8(reg, v) amdgpu_mm_wreg8(adev, (reg), (v)) 117162306a36Sopenharmony_ci 117262306a36Sopenharmony_ci#define RREG32(reg) amdgpu_device_rreg(adev, (reg), 0) 117362306a36Sopenharmony_ci#define DREG32(reg) printk(KERN_INFO "REGISTER: " #reg " : 0x%08X\n", amdgpu_device_rreg(adev, (reg), 0)) 117462306a36Sopenharmony_ci#define WREG32(reg, v) amdgpu_device_wreg(adev, (reg), (v), 0) 117562306a36Sopenharmony_ci#define REG_SET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK) 117662306a36Sopenharmony_ci#define REG_GET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK) 117762306a36Sopenharmony_ci#define RREG32_PCIE(reg) adev->pcie_rreg(adev, (reg)) 117862306a36Sopenharmony_ci#define WREG32_PCIE(reg, v) adev->pcie_wreg(adev, (reg), (v)) 117962306a36Sopenharmony_ci#define RREG32_PCIE_PORT(reg) adev->pciep_rreg(adev, (reg)) 118062306a36Sopenharmony_ci#define WREG32_PCIE_PORT(reg, v) adev->pciep_wreg(adev, (reg), (v)) 118162306a36Sopenharmony_ci#define RREG32_PCIE_EXT(reg) adev->pcie_rreg_ext(adev, (reg)) 118262306a36Sopenharmony_ci#define WREG32_PCIE_EXT(reg, v) adev->pcie_wreg_ext(adev, (reg), (v)) 118362306a36Sopenharmony_ci#define RREG64_PCIE(reg) adev->pcie_rreg64(adev, (reg)) 118462306a36Sopenharmony_ci#define WREG64_PCIE(reg, v) adev->pcie_wreg64(adev, (reg), (v)) 118562306a36Sopenharmony_ci#define RREG32_SMC(reg) adev->smc_rreg(adev, (reg)) 118662306a36Sopenharmony_ci#define WREG32_SMC(reg, v) adev->smc_wreg(adev, (reg), (v)) 118762306a36Sopenharmony_ci#define RREG32_UVD_CTX(reg) adev->uvd_ctx_rreg(adev, (reg)) 118862306a36Sopenharmony_ci#define WREG32_UVD_CTX(reg, v) adev->uvd_ctx_wreg(adev, (reg), (v)) 118962306a36Sopenharmony_ci#define RREG32_DIDT(reg) adev->didt_rreg(adev, (reg)) 119062306a36Sopenharmony_ci#define WREG32_DIDT(reg, v) adev->didt_wreg(adev, (reg), (v)) 119162306a36Sopenharmony_ci#define RREG32_GC_CAC(reg) adev->gc_cac_rreg(adev, (reg)) 119262306a36Sopenharmony_ci#define WREG32_GC_CAC(reg, v) adev->gc_cac_wreg(adev, (reg), (v)) 119362306a36Sopenharmony_ci#define RREG32_SE_CAC(reg) adev->se_cac_rreg(adev, (reg)) 119462306a36Sopenharmony_ci#define WREG32_SE_CAC(reg, v) adev->se_cac_wreg(adev, (reg), (v)) 119562306a36Sopenharmony_ci#define RREG32_AUDIO_ENDPT(block, reg) adev->audio_endpt_rreg(adev, (block), (reg)) 119662306a36Sopenharmony_ci#define WREG32_AUDIO_ENDPT(block, reg, v) adev->audio_endpt_wreg(adev, (block), (reg), (v)) 119762306a36Sopenharmony_ci#define WREG32_P(reg, val, mask) \ 119862306a36Sopenharmony_ci do { \ 119962306a36Sopenharmony_ci uint32_t tmp_ = RREG32(reg); \ 120062306a36Sopenharmony_ci tmp_ &= (mask); \ 120162306a36Sopenharmony_ci tmp_ |= ((val) & ~(mask)); \ 120262306a36Sopenharmony_ci WREG32(reg, tmp_); \ 120362306a36Sopenharmony_ci } while (0) 120462306a36Sopenharmony_ci#define WREG32_AND(reg, and) WREG32_P(reg, 0, and) 120562306a36Sopenharmony_ci#define WREG32_OR(reg, or) WREG32_P(reg, or, ~(or)) 120662306a36Sopenharmony_ci#define WREG32_PLL_P(reg, val, mask) \ 120762306a36Sopenharmony_ci do { \ 120862306a36Sopenharmony_ci uint32_t tmp_ = RREG32_PLL(reg); \ 120962306a36Sopenharmony_ci tmp_ &= (mask); \ 121062306a36Sopenharmony_ci tmp_ |= ((val) & ~(mask)); \ 121162306a36Sopenharmony_ci WREG32_PLL(reg, tmp_); \ 121262306a36Sopenharmony_ci } while (0) 121362306a36Sopenharmony_ci 121462306a36Sopenharmony_ci#define WREG32_SMC_P(_Reg, _Val, _Mask) \ 121562306a36Sopenharmony_ci do { \ 121662306a36Sopenharmony_ci u32 tmp = RREG32_SMC(_Reg); \ 121762306a36Sopenharmony_ci tmp &= (_Mask); \ 121862306a36Sopenharmony_ci tmp |= ((_Val) & ~(_Mask)); \ 121962306a36Sopenharmony_ci WREG32_SMC(_Reg, tmp); \ 122062306a36Sopenharmony_ci } while (0) 122162306a36Sopenharmony_ci 122262306a36Sopenharmony_ci#define DREG32_SYS(sqf, adev, reg) seq_printf((sqf), #reg " : 0x%08X\n", amdgpu_device_rreg((adev), (reg), false)) 122362306a36Sopenharmony_ci 122462306a36Sopenharmony_ci#define REG_FIELD_SHIFT(reg, field) reg##__##field##__SHIFT 122562306a36Sopenharmony_ci#define REG_FIELD_MASK(reg, field) reg##__##field##_MASK 122662306a36Sopenharmony_ci 122762306a36Sopenharmony_ci#define REG_SET_FIELD(orig_val, reg, field, field_val) \ 122862306a36Sopenharmony_ci (((orig_val) & ~REG_FIELD_MASK(reg, field)) | \ 122962306a36Sopenharmony_ci (REG_FIELD_MASK(reg, field) & ((field_val) << REG_FIELD_SHIFT(reg, field)))) 123062306a36Sopenharmony_ci 123162306a36Sopenharmony_ci#define REG_GET_FIELD(value, reg, field) \ 123262306a36Sopenharmony_ci (((value) & REG_FIELD_MASK(reg, field)) >> REG_FIELD_SHIFT(reg, field)) 123362306a36Sopenharmony_ci 123462306a36Sopenharmony_ci#define WREG32_FIELD(reg, field, val) \ 123562306a36Sopenharmony_ci WREG32(mm##reg, (RREG32(mm##reg) & ~REG_FIELD_MASK(reg, field)) | (val) << REG_FIELD_SHIFT(reg, field)) 123662306a36Sopenharmony_ci 123762306a36Sopenharmony_ci#define WREG32_FIELD_OFFSET(reg, offset, field, val) \ 123862306a36Sopenharmony_ci WREG32(mm##reg + offset, (RREG32(mm##reg + offset) & ~REG_FIELD_MASK(reg, field)) | (val) << REG_FIELD_SHIFT(reg, field)) 123962306a36Sopenharmony_ci 124062306a36Sopenharmony_ci/* 124162306a36Sopenharmony_ci * BIOS helpers. 124262306a36Sopenharmony_ci */ 124362306a36Sopenharmony_ci#define RBIOS8(i) (adev->bios[i]) 124462306a36Sopenharmony_ci#define RBIOS16(i) (RBIOS8(i) | (RBIOS8((i)+1) << 8)) 124562306a36Sopenharmony_ci#define RBIOS32(i) ((RBIOS16(i)) | (RBIOS16((i)+2) << 16)) 124662306a36Sopenharmony_ci 124762306a36Sopenharmony_ci/* 124862306a36Sopenharmony_ci * ASICs macro. 124962306a36Sopenharmony_ci */ 125062306a36Sopenharmony_ci#define amdgpu_asic_set_vga_state(adev, state) \ 125162306a36Sopenharmony_ci ((adev)->asic_funcs->set_vga_state ? (adev)->asic_funcs->set_vga_state((adev), (state)) : 0) 125262306a36Sopenharmony_ci#define amdgpu_asic_reset(adev) (adev)->asic_funcs->reset((adev)) 125362306a36Sopenharmony_ci#define amdgpu_asic_reset_method(adev) (adev)->asic_funcs->reset_method((adev)) 125462306a36Sopenharmony_ci#define amdgpu_asic_get_xclk(adev) (adev)->asic_funcs->get_xclk((adev)) 125562306a36Sopenharmony_ci#define amdgpu_asic_set_uvd_clocks(adev, v, d) (adev)->asic_funcs->set_uvd_clocks((adev), (v), (d)) 125662306a36Sopenharmony_ci#define amdgpu_asic_set_vce_clocks(adev, ev, ec) (adev)->asic_funcs->set_vce_clocks((adev), (ev), (ec)) 125762306a36Sopenharmony_ci#define amdgpu_get_pcie_lanes(adev) (adev)->asic_funcs->get_pcie_lanes((adev)) 125862306a36Sopenharmony_ci#define amdgpu_set_pcie_lanes(adev, l) (adev)->asic_funcs->set_pcie_lanes((adev), (l)) 125962306a36Sopenharmony_ci#define amdgpu_asic_get_gpu_clock_counter(adev) (adev)->asic_funcs->get_gpu_clock_counter((adev)) 126062306a36Sopenharmony_ci#define amdgpu_asic_read_disabled_bios(adev) (adev)->asic_funcs->read_disabled_bios((adev)) 126162306a36Sopenharmony_ci#define amdgpu_asic_read_bios_from_rom(adev, b, l) (adev)->asic_funcs->read_bios_from_rom((adev), (b), (l)) 126262306a36Sopenharmony_ci#define amdgpu_asic_read_register(adev, se, sh, offset, v)((adev)->asic_funcs->read_register((adev), (se), (sh), (offset), (v))) 126362306a36Sopenharmony_ci#define amdgpu_asic_get_config_memsize(adev) (adev)->asic_funcs->get_config_memsize((adev)) 126462306a36Sopenharmony_ci#define amdgpu_asic_flush_hdp(adev, r) \ 126562306a36Sopenharmony_ci ((adev)->asic_funcs->flush_hdp ? (adev)->asic_funcs->flush_hdp((adev), (r)) : (adev)->hdp.funcs->flush_hdp((adev), (r))) 126662306a36Sopenharmony_ci#define amdgpu_asic_invalidate_hdp(adev, r) \ 126762306a36Sopenharmony_ci ((adev)->asic_funcs->invalidate_hdp ? (adev)->asic_funcs->invalidate_hdp((adev), (r)) : \ 126862306a36Sopenharmony_ci ((adev)->hdp.funcs->invalidate_hdp ? (adev)->hdp.funcs->invalidate_hdp((adev), (r)) : (void)0)) 126962306a36Sopenharmony_ci#define amdgpu_asic_need_full_reset(adev) (adev)->asic_funcs->need_full_reset((adev)) 127062306a36Sopenharmony_ci#define amdgpu_asic_init_doorbell_index(adev) (adev)->asic_funcs->init_doorbell_index((adev)) 127162306a36Sopenharmony_ci#define amdgpu_asic_get_pcie_usage(adev, cnt0, cnt1) ((adev)->asic_funcs->get_pcie_usage((adev), (cnt0), (cnt1))) 127262306a36Sopenharmony_ci#define amdgpu_asic_need_reset_on_init(adev) (adev)->asic_funcs->need_reset_on_init((adev)) 127362306a36Sopenharmony_ci#define amdgpu_asic_get_pcie_replay_count(adev) ((adev)->asic_funcs->get_pcie_replay_count((adev))) 127462306a36Sopenharmony_ci#define amdgpu_asic_supports_baco(adev) (adev)->asic_funcs->supports_baco((adev)) 127562306a36Sopenharmony_ci#define amdgpu_asic_pre_asic_init(adev) (adev)->asic_funcs->pre_asic_init((adev)) 127662306a36Sopenharmony_ci#define amdgpu_asic_update_umd_stable_pstate(adev, enter) \ 127762306a36Sopenharmony_ci ((adev)->asic_funcs->update_umd_stable_pstate ? (adev)->asic_funcs->update_umd_stable_pstate((adev), (enter)) : 0) 127862306a36Sopenharmony_ci#define amdgpu_asic_query_video_codecs(adev, e, c) (adev)->asic_funcs->query_video_codecs((adev), (e), (c)) 127962306a36Sopenharmony_ci 128062306a36Sopenharmony_ci#define amdgpu_inc_vram_lost(adev) atomic_inc(&((adev)->vram_lost_counter)); 128162306a36Sopenharmony_ci 128262306a36Sopenharmony_ci#define BIT_MASK_UPPER(i) ((i) >= BITS_PER_LONG ? 0 : ~0UL << (i)) 128362306a36Sopenharmony_ci#define for_each_inst(i, inst_mask) \ 128462306a36Sopenharmony_ci for (i = ffs(inst_mask); i-- != 0; \ 128562306a36Sopenharmony_ci i = ffs(inst_mask & BIT_MASK_UPPER(i + 1))) 128662306a36Sopenharmony_ci 128762306a36Sopenharmony_ci#define MIN(X, Y) ((X) < (Y) ? (X) : (Y)) 128862306a36Sopenharmony_ci 128962306a36Sopenharmony_ci/* Common functions */ 129062306a36Sopenharmony_cibool amdgpu_device_has_job_running(struct amdgpu_device *adev); 129162306a36Sopenharmony_cibool amdgpu_device_should_recover_gpu(struct amdgpu_device *adev); 129262306a36Sopenharmony_ciint amdgpu_device_gpu_recover(struct amdgpu_device *adev, 129362306a36Sopenharmony_ci struct amdgpu_job *job, 129462306a36Sopenharmony_ci struct amdgpu_reset_context *reset_context); 129562306a36Sopenharmony_civoid amdgpu_device_pci_config_reset(struct amdgpu_device *adev); 129662306a36Sopenharmony_ciint amdgpu_device_pci_reset(struct amdgpu_device *adev); 129762306a36Sopenharmony_cibool amdgpu_device_need_post(struct amdgpu_device *adev); 129862306a36Sopenharmony_cibool amdgpu_device_pcie_dynamic_switching_supported(void); 129962306a36Sopenharmony_cibool amdgpu_device_should_use_aspm(struct amdgpu_device *adev); 130062306a36Sopenharmony_cibool amdgpu_device_aspm_support_quirk(void); 130162306a36Sopenharmony_ci 130262306a36Sopenharmony_civoid amdgpu_cs_report_moved_bytes(struct amdgpu_device *adev, u64 num_bytes, 130362306a36Sopenharmony_ci u64 num_vis_bytes); 130462306a36Sopenharmony_ciint amdgpu_device_resize_fb_bar(struct amdgpu_device *adev); 130562306a36Sopenharmony_civoid amdgpu_device_program_register_sequence(struct amdgpu_device *adev, 130662306a36Sopenharmony_ci const u32 *registers, 130762306a36Sopenharmony_ci const u32 array_size); 130862306a36Sopenharmony_ci 130962306a36Sopenharmony_ciint amdgpu_device_mode1_reset(struct amdgpu_device *adev); 131062306a36Sopenharmony_cibool amdgpu_device_supports_atpx(struct drm_device *dev); 131162306a36Sopenharmony_cibool amdgpu_device_supports_px(struct drm_device *dev); 131262306a36Sopenharmony_cibool amdgpu_device_supports_boco(struct drm_device *dev); 131362306a36Sopenharmony_cibool amdgpu_device_supports_smart_shift(struct drm_device *dev); 131462306a36Sopenharmony_cibool amdgpu_device_supports_baco(struct drm_device *dev); 131562306a36Sopenharmony_cibool amdgpu_device_is_peer_accessible(struct amdgpu_device *adev, 131662306a36Sopenharmony_ci struct amdgpu_device *peer_adev); 131762306a36Sopenharmony_ciint amdgpu_device_baco_enter(struct drm_device *dev); 131862306a36Sopenharmony_ciint amdgpu_device_baco_exit(struct drm_device *dev); 131962306a36Sopenharmony_ci 132062306a36Sopenharmony_civoid amdgpu_device_flush_hdp(struct amdgpu_device *adev, 132162306a36Sopenharmony_ci struct amdgpu_ring *ring); 132262306a36Sopenharmony_civoid amdgpu_device_invalidate_hdp(struct amdgpu_device *adev, 132362306a36Sopenharmony_ci struct amdgpu_ring *ring); 132462306a36Sopenharmony_ci 132562306a36Sopenharmony_civoid amdgpu_device_halt(struct amdgpu_device *adev); 132662306a36Sopenharmony_ciu32 amdgpu_device_pcie_port_rreg(struct amdgpu_device *adev, 132762306a36Sopenharmony_ci u32 reg); 132862306a36Sopenharmony_civoid amdgpu_device_pcie_port_wreg(struct amdgpu_device *adev, 132962306a36Sopenharmony_ci u32 reg, u32 v); 133062306a36Sopenharmony_cistruct dma_fence *amdgpu_device_switch_gang(struct amdgpu_device *adev, 133162306a36Sopenharmony_ci struct dma_fence *gang); 133262306a36Sopenharmony_cibool amdgpu_device_has_display_hardware(struct amdgpu_device *adev); 133362306a36Sopenharmony_ci 133462306a36Sopenharmony_ci/* atpx handler */ 133562306a36Sopenharmony_ci#if defined(CONFIG_VGA_SWITCHEROO) 133662306a36Sopenharmony_civoid amdgpu_register_atpx_handler(void); 133762306a36Sopenharmony_civoid amdgpu_unregister_atpx_handler(void); 133862306a36Sopenharmony_cibool amdgpu_has_atpx_dgpu_power_cntl(void); 133962306a36Sopenharmony_cibool amdgpu_is_atpx_hybrid(void); 134062306a36Sopenharmony_cibool amdgpu_atpx_dgpu_req_power_for_displays(void); 134162306a36Sopenharmony_cibool amdgpu_has_atpx(void); 134262306a36Sopenharmony_ci#else 134362306a36Sopenharmony_cistatic inline void amdgpu_register_atpx_handler(void) {} 134462306a36Sopenharmony_cistatic inline void amdgpu_unregister_atpx_handler(void) {} 134562306a36Sopenharmony_cistatic inline bool amdgpu_has_atpx_dgpu_power_cntl(void) { return false; } 134662306a36Sopenharmony_cistatic inline bool amdgpu_is_atpx_hybrid(void) { return false; } 134762306a36Sopenharmony_cistatic inline bool amdgpu_atpx_dgpu_req_power_for_displays(void) { return false; } 134862306a36Sopenharmony_cistatic inline bool amdgpu_has_atpx(void) { return false; } 134962306a36Sopenharmony_ci#endif 135062306a36Sopenharmony_ci 135162306a36Sopenharmony_ci#if defined(CONFIG_VGA_SWITCHEROO) && defined(CONFIG_ACPI) 135262306a36Sopenharmony_civoid *amdgpu_atpx_get_dhandle(void); 135362306a36Sopenharmony_ci#else 135462306a36Sopenharmony_cistatic inline void *amdgpu_atpx_get_dhandle(void) { return NULL; } 135562306a36Sopenharmony_ci#endif 135662306a36Sopenharmony_ci 135762306a36Sopenharmony_ci/* 135862306a36Sopenharmony_ci * KMS 135962306a36Sopenharmony_ci */ 136062306a36Sopenharmony_ciextern const struct drm_ioctl_desc amdgpu_ioctls_kms[]; 136162306a36Sopenharmony_ciextern const int amdgpu_max_kms_ioctl; 136262306a36Sopenharmony_ci 136362306a36Sopenharmony_ciint amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags); 136462306a36Sopenharmony_civoid amdgpu_driver_unload_kms(struct drm_device *dev); 136562306a36Sopenharmony_civoid amdgpu_driver_lastclose_kms(struct drm_device *dev); 136662306a36Sopenharmony_ciint amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv); 136762306a36Sopenharmony_civoid amdgpu_driver_postclose_kms(struct drm_device *dev, 136862306a36Sopenharmony_ci struct drm_file *file_priv); 136962306a36Sopenharmony_civoid amdgpu_driver_release_kms(struct drm_device *dev); 137062306a36Sopenharmony_ci 137162306a36Sopenharmony_ciint amdgpu_device_ip_suspend(struct amdgpu_device *adev); 137262306a36Sopenharmony_ciint amdgpu_device_suspend(struct drm_device *dev, bool fbcon); 137362306a36Sopenharmony_ciint amdgpu_device_resume(struct drm_device *dev, bool fbcon); 137462306a36Sopenharmony_ciu32 amdgpu_get_vblank_counter_kms(struct drm_crtc *crtc); 137562306a36Sopenharmony_ciint amdgpu_enable_vblank_kms(struct drm_crtc *crtc); 137662306a36Sopenharmony_civoid amdgpu_disable_vblank_kms(struct drm_crtc *crtc); 137762306a36Sopenharmony_ciint amdgpu_info_ioctl(struct drm_device *dev, void *data, 137862306a36Sopenharmony_ci struct drm_file *filp); 137962306a36Sopenharmony_ci 138062306a36Sopenharmony_ci/* 138162306a36Sopenharmony_ci * functions used by amdgpu_encoder.c 138262306a36Sopenharmony_ci */ 138362306a36Sopenharmony_cistruct amdgpu_afmt_acr { 138462306a36Sopenharmony_ci u32 clock; 138562306a36Sopenharmony_ci 138662306a36Sopenharmony_ci int n_32khz; 138762306a36Sopenharmony_ci int cts_32khz; 138862306a36Sopenharmony_ci 138962306a36Sopenharmony_ci int n_44_1khz; 139062306a36Sopenharmony_ci int cts_44_1khz; 139162306a36Sopenharmony_ci 139262306a36Sopenharmony_ci int n_48khz; 139362306a36Sopenharmony_ci int cts_48khz; 139462306a36Sopenharmony_ci 139562306a36Sopenharmony_ci}; 139662306a36Sopenharmony_ci 139762306a36Sopenharmony_cistruct amdgpu_afmt_acr amdgpu_afmt_acr(uint32_t clock); 139862306a36Sopenharmony_ci 139962306a36Sopenharmony_ci/* amdgpu_acpi.c */ 140062306a36Sopenharmony_ci 140162306a36Sopenharmony_cistruct amdgpu_numa_info { 140262306a36Sopenharmony_ci uint64_t size; 140362306a36Sopenharmony_ci int pxm; 140462306a36Sopenharmony_ci int nid; 140562306a36Sopenharmony_ci}; 140662306a36Sopenharmony_ci 140762306a36Sopenharmony_ci/* ATCS Device/Driver State */ 140862306a36Sopenharmony_ci#define AMDGPU_ATCS_PSC_DEV_STATE_D0 0 140962306a36Sopenharmony_ci#define AMDGPU_ATCS_PSC_DEV_STATE_D3_HOT 3 141062306a36Sopenharmony_ci#define AMDGPU_ATCS_PSC_DRV_STATE_OPR 0 141162306a36Sopenharmony_ci#define AMDGPU_ATCS_PSC_DRV_STATE_NOT_OPR 1 141262306a36Sopenharmony_ci 141362306a36Sopenharmony_ci#if defined(CONFIG_ACPI) 141462306a36Sopenharmony_ciint amdgpu_acpi_init(struct amdgpu_device *adev); 141562306a36Sopenharmony_civoid amdgpu_acpi_fini(struct amdgpu_device *adev); 141662306a36Sopenharmony_cibool amdgpu_acpi_is_pcie_performance_request_supported(struct amdgpu_device *adev); 141762306a36Sopenharmony_cibool amdgpu_acpi_is_power_shift_control_supported(void); 141862306a36Sopenharmony_ciint amdgpu_acpi_pcie_performance_request(struct amdgpu_device *adev, 141962306a36Sopenharmony_ci u8 perf_req, bool advertise); 142062306a36Sopenharmony_ciint amdgpu_acpi_power_shift_control(struct amdgpu_device *adev, 142162306a36Sopenharmony_ci u8 dev_state, bool drv_state); 142262306a36Sopenharmony_ciint amdgpu_acpi_smart_shift_update(struct drm_device *dev, enum amdgpu_ss ss_state); 142362306a36Sopenharmony_ciint amdgpu_acpi_pcie_notify_device_ready(struct amdgpu_device *adev); 142462306a36Sopenharmony_ciint amdgpu_acpi_get_tmr_info(struct amdgpu_device *adev, u64 *tmr_offset, 142562306a36Sopenharmony_ci u64 *tmr_size); 142662306a36Sopenharmony_ciint amdgpu_acpi_get_mem_info(struct amdgpu_device *adev, int xcc_id, 142762306a36Sopenharmony_ci struct amdgpu_numa_info *numa_info); 142862306a36Sopenharmony_ci 142962306a36Sopenharmony_civoid amdgpu_acpi_get_backlight_caps(struct amdgpu_dm_backlight_caps *caps); 143062306a36Sopenharmony_cibool amdgpu_acpi_should_gpu_reset(struct amdgpu_device *adev); 143162306a36Sopenharmony_civoid amdgpu_acpi_detect(void); 143262306a36Sopenharmony_civoid amdgpu_acpi_release(void); 143362306a36Sopenharmony_ci#else 143462306a36Sopenharmony_cistatic inline int amdgpu_acpi_init(struct amdgpu_device *adev) { return 0; } 143562306a36Sopenharmony_cistatic inline int amdgpu_acpi_get_tmr_info(struct amdgpu_device *adev, 143662306a36Sopenharmony_ci u64 *tmr_offset, u64 *tmr_size) 143762306a36Sopenharmony_ci{ 143862306a36Sopenharmony_ci return -EINVAL; 143962306a36Sopenharmony_ci} 144062306a36Sopenharmony_cistatic inline int amdgpu_acpi_get_mem_info(struct amdgpu_device *adev, 144162306a36Sopenharmony_ci int xcc_id, 144262306a36Sopenharmony_ci struct amdgpu_numa_info *numa_info) 144362306a36Sopenharmony_ci{ 144462306a36Sopenharmony_ci return -EINVAL; 144562306a36Sopenharmony_ci} 144662306a36Sopenharmony_cistatic inline void amdgpu_acpi_fini(struct amdgpu_device *adev) { } 144762306a36Sopenharmony_cistatic inline bool amdgpu_acpi_should_gpu_reset(struct amdgpu_device *adev) { return false; } 144862306a36Sopenharmony_cistatic inline void amdgpu_acpi_detect(void) { } 144962306a36Sopenharmony_cistatic inline void amdgpu_acpi_release(void) { } 145062306a36Sopenharmony_cistatic inline bool amdgpu_acpi_is_power_shift_control_supported(void) { return false; } 145162306a36Sopenharmony_cistatic inline int amdgpu_acpi_power_shift_control(struct amdgpu_device *adev, 145262306a36Sopenharmony_ci u8 dev_state, bool drv_state) { return 0; } 145362306a36Sopenharmony_cistatic inline int amdgpu_acpi_smart_shift_update(struct drm_device *dev, 145462306a36Sopenharmony_ci enum amdgpu_ss ss_state) { return 0; } 145562306a36Sopenharmony_ci#endif 145662306a36Sopenharmony_ci 145762306a36Sopenharmony_ci#if defined(CONFIG_ACPI) && defined(CONFIG_SUSPEND) 145862306a36Sopenharmony_cibool amdgpu_acpi_is_s3_active(struct amdgpu_device *adev); 145962306a36Sopenharmony_cibool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev); 146062306a36Sopenharmony_ci#else 146162306a36Sopenharmony_cistatic inline bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev) { return false; } 146262306a36Sopenharmony_cistatic inline bool amdgpu_acpi_is_s3_active(struct amdgpu_device *adev) { return false; } 146362306a36Sopenharmony_ci#endif 146462306a36Sopenharmony_ci 146562306a36Sopenharmony_ci#if defined(CONFIG_DRM_AMD_DC) 146662306a36Sopenharmony_ciint amdgpu_dm_display_resume(struct amdgpu_device *adev ); 146762306a36Sopenharmony_ci#else 146862306a36Sopenharmony_cistatic inline int amdgpu_dm_display_resume(struct amdgpu_device *adev) { return 0; } 146962306a36Sopenharmony_ci#endif 147062306a36Sopenharmony_ci 147162306a36Sopenharmony_ci 147262306a36Sopenharmony_civoid amdgpu_register_gpu_instance(struct amdgpu_device *adev); 147362306a36Sopenharmony_civoid amdgpu_unregister_gpu_instance(struct amdgpu_device *adev); 147462306a36Sopenharmony_ci 147562306a36Sopenharmony_cipci_ers_result_t amdgpu_pci_error_detected(struct pci_dev *pdev, 147662306a36Sopenharmony_ci pci_channel_state_t state); 147762306a36Sopenharmony_cipci_ers_result_t amdgpu_pci_mmio_enabled(struct pci_dev *pdev); 147862306a36Sopenharmony_cipci_ers_result_t amdgpu_pci_slot_reset(struct pci_dev *pdev); 147962306a36Sopenharmony_civoid amdgpu_pci_resume(struct pci_dev *pdev); 148062306a36Sopenharmony_ci 148162306a36Sopenharmony_cibool amdgpu_device_cache_pci_state(struct pci_dev *pdev); 148262306a36Sopenharmony_cibool amdgpu_device_load_pci_state(struct pci_dev *pdev); 148362306a36Sopenharmony_ci 148462306a36Sopenharmony_cibool amdgpu_device_skip_hw_access(struct amdgpu_device *adev); 148562306a36Sopenharmony_ci 148662306a36Sopenharmony_ciint amdgpu_device_set_cg_state(struct amdgpu_device *adev, 148762306a36Sopenharmony_ci enum amd_clockgating_state state); 148862306a36Sopenharmony_ciint amdgpu_device_set_pg_state(struct amdgpu_device *adev, 148962306a36Sopenharmony_ci enum amd_powergating_state state); 149062306a36Sopenharmony_ci 149162306a36Sopenharmony_cistatic inline bool amdgpu_device_has_timeouts_enabled(struct amdgpu_device *adev) 149262306a36Sopenharmony_ci{ 149362306a36Sopenharmony_ci return amdgpu_gpu_recovery != 0 && 149462306a36Sopenharmony_ci adev->gfx_timeout != MAX_SCHEDULE_TIMEOUT && 149562306a36Sopenharmony_ci adev->compute_timeout != MAX_SCHEDULE_TIMEOUT && 149662306a36Sopenharmony_ci adev->sdma_timeout != MAX_SCHEDULE_TIMEOUT && 149762306a36Sopenharmony_ci adev->video_timeout != MAX_SCHEDULE_TIMEOUT; 149862306a36Sopenharmony_ci} 149962306a36Sopenharmony_ci 150062306a36Sopenharmony_ci#include "amdgpu_object.h" 150162306a36Sopenharmony_ci 150262306a36Sopenharmony_cistatic inline bool amdgpu_is_tmz(struct amdgpu_device *adev) 150362306a36Sopenharmony_ci{ 150462306a36Sopenharmony_ci return adev->gmc.tmz_enabled; 150562306a36Sopenharmony_ci} 150662306a36Sopenharmony_ci 150762306a36Sopenharmony_ciint amdgpu_in_reset(struct amdgpu_device *adev); 150862306a36Sopenharmony_ci 150962306a36Sopenharmony_ciextern const struct attribute_group amdgpu_vram_mgr_attr_group; 151062306a36Sopenharmony_ciextern const struct attribute_group amdgpu_gtt_mgr_attr_group; 151162306a36Sopenharmony_ciextern const struct attribute_group amdgpu_flash_attr_group; 151262306a36Sopenharmony_ci 151362306a36Sopenharmony_ci#endif 1514