1d38ceaf9SAlex Deucher /*
2d38ceaf9SAlex Deucher * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
3d38ceaf9SAlex Deucher * All Rights Reserved.
4d38ceaf9SAlex Deucher *
5d38ceaf9SAlex Deucher * Permission is hereby granted, free of charge, to any person obtaining a
6d38ceaf9SAlex Deucher * copy of this software and associated documentation files (the "Software"),
7d38ceaf9SAlex Deucher * to deal in the Software without restriction, including without limitation
8d38ceaf9SAlex Deucher * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9d38ceaf9SAlex Deucher * and/or sell copies of the Software, and to permit persons to whom the
10d38ceaf9SAlex Deucher * Software is furnished to do so, subject to the following conditions:
11d38ceaf9SAlex Deucher *
12d38ceaf9SAlex Deucher * The above copyright notice and this permission notice (including the next
13d38ceaf9SAlex Deucher * paragraph) shall be included in all copies or substantial portions of the
14d38ceaf9SAlex Deucher * Software.
15d38ceaf9SAlex Deucher *
16d38ceaf9SAlex Deucher * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17d38ceaf9SAlex Deucher * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18d38ceaf9SAlex Deucher * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19d38ceaf9SAlex Deucher * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20d38ceaf9SAlex Deucher * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21d38ceaf9SAlex Deucher * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22d38ceaf9SAlex Deucher * OTHER DEALINGS IN THE SOFTWARE.
23d38ceaf9SAlex Deucher */
24d38ceaf9SAlex Deucher
25d38ceaf9SAlex Deucher #include <drm/amdgpu_drm.h>
26b86711c6SThomas Zimmermann #include <drm/clients/drm_client_setup.h>
27fdf2f6c5SSam Ravnborg #include <drm/drm_drv.h>
28aae4682eSThomas Zimmermann #include <drm/drm_fbdev_ttm.h>
29d38ceaf9SAlex Deucher #include <drm/drm_gem.h>
308aba21b7SLuben Tuikov #include <drm/drm_managed.h>
31d38ceaf9SAlex Deucher #include <drm/drm_pciids.h>
32fcd70cd3SDaniel Vetter #include <drm/drm_probe_helper.h>
33e2e42edfSSrinivasan Shanmugam #include <drm/drm_vblank.h>
34e2e42edfSSrinivasan Shanmugam
35e9d1d2bbSTom Lendacky #include <linux/cc_platform.h>
36f158936bSJim Cromie #include <linux/dynamic_debug.h>
37e2e42edfSSrinivasan Shanmugam #include <linux/module.h>
38e2e42edfSSrinivasan Shanmugam #include <linux/mmu_notifier.h>
39e2e42edfSSrinivasan Shanmugam #include <linux/pm_runtime.h>
40e2e42edfSSrinivasan Shanmugam #include <linux/suspend.h>
41e2e42edfSSrinivasan Shanmugam #include <linux/vga_switcheroo.h>
42d38ceaf9SAlex Deucher
43d38ceaf9SAlex Deucher #include "amdgpu.h"
44130e0371SOded Gabbay #include "amdgpu_amdkfd.h"
45e2e42edfSSrinivasan Shanmugam #include "amdgpu_dma_buf.h"
46e2e42edfSSrinivasan Shanmugam #include "amdgpu_drv.h"
47e2e42edfSSrinivasan Shanmugam #include "amdgpu_fdinfo.h"
48e2e42edfSSrinivasan Shanmugam #include "amdgpu_irq.h"
494e2abc19SSrinivasan Shanmugam #include "amdgpu_psp.h"
507c6e68c7SAndrey Grodzovsky #include "amdgpu_ras.h"
5104442bf7SLijo Lazar #include "amdgpu_reset.h"
52e2e42edfSSrinivasan Shanmugam #include "amdgpu_sched.h"
53e2e42edfSSrinivasan Shanmugam #include "amdgpu_xgmi.h"
549938333aSJames Zhu #include "../amdxcp/amdgpu_xcp_drv.h"
557c6e68c7SAndrey Grodzovsky
56d38ceaf9SAlex Deucher /*
57d38ceaf9SAlex Deucher * KMS wrapper.
58d38ceaf9SAlex Deucher * - 3.0.0 - initial driver
596055f37aSMarek Olšák * - 3.1.0 - allow reading more status registers (GRBM, SRBM, SDMA, CP)
60f84e63f2SMarek Olšák * - 3.2.0 - GFX8: Uses EOP_TC_WB_ACTION_EN, so UMDs don't have to do the same
61f84e63f2SMarek Olšák * at the end of IBs.
62d347ce66SChristian König * - 3.3.0 - Add VM support for UVD on supported hardware.
6383a59b63SMarek Olšák * - 3.4.0 - Add AMDGPU_INFO_NUM_EVICTIONS.
648dd31d74SAlex Deucher * - 3.5.0 - Add support for new UVD_NO_OP register.
65753ad49cSMonk Liu * - 3.6.0 - kmd involves use CONTEXT_CONTROL in ring buffer.
669cee3c1fSAlex Deucher * - 3.7.0 - Add support for VCE clock list packet
67b62b5931SAlex Deucher * - 3.8.0 - Add support raster config init in the kernel
68ef704318SJunwei Zhang * - 3.9.0 - Add support for memory query info about VRAM and GTT.
69a5b11dacSAlex Deucher * - 3.10.0 - Add support for new fences ioctl, new gem ioctl flags
705ebbac4bSAlex Deucher * - 3.11.0 - Add support for sensor query info (clocks, temp, etc).
71dfe38bd8SAlex Deucher * - 3.12.0 - Add query for double offchip LDS buffers
728eafd505SAlex Deucher * - 3.13.0 - Add PRT support
73203eb0cbSAlex Deucher * - 3.14.0 - Fix race in amdgpu_ctx_get_fence() and note new functionality
7444eb8c1bSJunwei Zhang * - 3.15.0 - Export more gpu info for gfx9
75b98b8dbcSChunming Zhou * - 3.16.0 - Add reserved vmid support
7668e2c5ffSMarek Olšák * - 3.17.0 - Add AMDGPU_NUM_VRAM_CPU_PAGE_FAULTS.
77dbfe85eaSFlora Cui * - 3.18.0 - Export gpu always on cu bitmap
7833476319SLeo Liu * - 3.19.0 - Add support for UVD MJPEG decode
79fd8bf087SChristian König * - 3.20.0 - Add support for local BOs
807ca24cf2SMarek Olšák * - 3.21.0 - Add DRM_AMDGPU_FENCE_TO_HANDLE ioctl
81b285f1dbSAlex Deucher * - 3.22.0 - Add DRM_AMDGPU_SCHED ioctl
82c057c114SAlex Deucher * - 3.23.0 - Add query for VRAM lost counter
83f8e3e0eeSAndres Rodriguez * - 3.24.0 - Add high priority compute support for gfx9
847b158d16SRex Zhu * - 3.25.0 - Add support for sensor query info (stable pstate sclk/mclk).
85d240cd9eSMarek Olšák * - 3.26.0 - GFX9: Process AMDGPU_IB_FLAG_TC_WB_NOT_INVALIDATE.
86c19a23faSJason Wang * - 3.27.0 - Add new chunk to AMDGPU_CS to enable BO_LIST creation.
8767dd1a36SAndrey Grodzovsky * - 3.28.0 - Add AMDGPU_CHUNK_ID_SCHEDULED_DEPENDENCIES
8841cca166SMarek Olšák * - 3.29.0 - Add AMDGPU_IB_FLAG_RESET_GDS_MAX_WAVE_ID
89767e06a9SBas Nieuwenhuizen * - 3.30.0 - Add AMDGPU_SCHED_OP_CONTEXT_PRIORITY_OVERRIDE.
90df8368beSNicholas Kazlauskas * - 3.31.0 - Add support for per-flip tiling attribute changes with DC
911afeb314SChunming Zhou * - 3.32.0 - Add syncobj timeline support to AMDGPU_CS.
92635e2c5fSMarek Olšák * - 3.33.0 - Fixes for GDS ENOMEM failures in AMDGPU_CS.
93965ebe3dSMichel Dänzer * - 3.34.0 - Non-DC can flip correctly between buffers with different pitches
94815fb4c9SMarek Olšák * - 3.35.0 - Add drm_amdgpu_info_device::tcc_disabled_mask
95664fe85aSMarek Olšák * - 3.36.0 - Allow reading more status registers on si/cik
96ff532461SMarek Olšák * - 3.37.0 - L2 is invalidated before SDMA IBs, needed for correctness
9743c8546bSAndrey Grodzovsky * - 3.38.0 - Add AMDGPU_IB_FLAG_EMIT_MEM_SYNC
98174b328bSChristian König * - 3.39.0 - DMABUF implicit sync does a full pipeline sync
9916c642ecSPierre-Eric Pelloux-Prayer * - 3.40.0 - Add AMDGPU_IDS_FLAGS_TMZ
100b50368daSAlex Deucher * - 3.41.0 - Add video codec query
101915821a7SAlex Deucher * - 3.42.0 - Add 16bpc fixed point display support
1025c67ff3aSAndrey Grodzovsky * - 3.43.0 - Add device hot plug/unplug support
103f2e7d856SMarek Olšák * - 3.44.0 - DCN3 supports DCC independent block settings: !64B && 128B, 64B && 128B
104ded81d5bSAlex Deucher * - 3.45.0 - Add context ioctl stable pstate interface
10508cffb3eSChristian König * - 3.46.0 - To enable hot plug amdgpu tests in libdrm
106465576caSAlex Deucher * - 3.47.0 - Add AMDGPU_GEM_CREATE_DISCARDABLE and AMDGPU_VM_NOALLOC flags
107465576caSAlex Deucher * - 3.48.0 - Add IP discovery version info to HW INFO
108cf5cf349SEvan Quan * - 3.49.0 - Add gang submit into CS IOCTL
109cf5cf349SEvan Quan * - 3.50.0 - Update AMDGPU_INFO_DEV_INFO IOCTL for minimum engine and memory clock
110cf5cf349SEvan Quan * Update AMDGPU_INFO_SENSOR IOCTL for PEAK_PSTATE engine and memory clock
111e3e84b0aSMarek Olšák * 3.51.0 - Return the PCIe gen and lanes from the INFO ioctl
112b299221fSMarek Olšák * 3.52.0 - Add AMDGPU_IDS_FLAGS_CONFORMANT_TRUNC_COORD, add device_info fields:
113b299221fSMarek Olšák * tcp_cache_size, num_sqc_per_wgp, sqc_data_cache_size, sqc_inst_cache_size,
114b299221fSMarek Olšák * gl1c_cache_size, gl2c_cache_size, mall_size, enabled_rb_pipes_mask_hi
1158a93c691SAlex Deucher * 3.53.0 - Support for GFX11 CP GFX shadowing
116489763afSPierre-Eric Pelloux-Prayer * 3.54.0 - Add AMDGPU_CTX_QUERY2_FLAGS_RESET_IN_PROGRESS support
1177a41ed8bSAlex Deucher * - 3.55.0 - Add AMDGPU_INFO_GPUVM_FAULT query
1186cb8e3eeSBoyuan Zhang * - 3.56.0 - Update IB start address and size alignment for decode and encode
11991963397SFriedrich Vock * - 3.57.0 - Compute tunneling on GFX10+
12028814be8SAurabindo Pillai * - 3.58.0 - Add GFX12 DCC support
12134ad56a4SAlex Deucher * - 3.59.0 - Cleared VRAM
1222255b40cSMarek Olšák * - 3.60.0 - Add AMDGPU_TILING_GFX12_DCC_WRITE_COMPRESS_DISABLE (Vulkan requirement)
12355ed2b1bSAlex Deucher * - 3.61.0 - Contains fix for RV/PCO compute queues
124aafe181fSAsad Kamal * - 3.62.0 - Add AMDGPU_IDS_FLAGS_MODE_PF, AMDGPU_IDS_FLAGS_MODE_VF & AMDGPU_IDS_FLAGS_MODE_PT
1253855f1d9SMarek Olšák * - 3.63.0 - GFX12 display DCC supports 256B max compressed block size
126d38ceaf9SAlex Deucher */
127d38ceaf9SAlex Deucher #define KMS_DRIVER_MAJOR 3
1283855f1d9SMarek Olšák #define KMS_DRIVER_MINOR 63
129d38ceaf9SAlex Deucher #define KMS_DRIVER_PATCHLEVEL 0
130d38ceaf9SAlex Deucher
131887db1e4SAndré Almeida /*
132887db1e4SAndré Almeida * amdgpu.debug module options. Are all disabled by default
133887db1e4SAndré Almeida */
134887db1e4SAndré Almeida enum AMDGPU_DEBUG_MASK {
135887db1e4SAndré Almeida AMDGPU_DEBUG_VM = BIT(0),
136887db1e4SAndré Almeida AMDGPU_DEBUG_LARGEBAR = BIT(1),
137ffde7210SAndré Almeida AMDGPU_DEBUG_DISABLE_GPU_SOFT_RECOVERY = BIT(2),
138d20e1aecSLe Ma AMDGPU_DEBUG_USE_VRAM_FW_BUF = BIT(3),
139b2aa3d4bSYang Wang AMDGPU_DEBUG_ENABLE_RAS_ACA = BIT(4),
140a9b67c03SAlex Deucher AMDGPU_DEBUG_ENABLE_EXP_RESETS = BIT(5),
1419c696cc5SAndré Almeida AMDGPU_DEBUG_DISABLE_GPU_RING_RESET = BIT(6),
142ab689340SLijo Lazar AMDGPU_DEBUG_SMU_POOL = BIT(7),
143887db1e4SAndré Almeida };
144887db1e4SAndré Almeida
1450b04ea39SChristian König unsigned int amdgpu_vram_limit = UINT_MAX;
14687fb7833SDeepak R Varma int amdgpu_vis_vram_limit;
14783e74db6SAlex Deucher int amdgpu_gart_size = -1; /* auto */
14836d38372SChristian König int amdgpu_gtt_size = -1; /* auto */
14995844d20SMarek Olšák int amdgpu_moverate = -1; /* auto */
150d38ceaf9SAlex Deucher int amdgpu_audio = -1;
15187fb7833SDeepak R Varma int amdgpu_disp_priority;
15287fb7833SDeepak R Varma int amdgpu_hw_i2c;
153d38ceaf9SAlex Deucher int amdgpu_pcie_gen2 = -1;
154d38ceaf9SAlex Deucher int amdgpu_msi = -1;
155f440ff44SWambui Karuga char amdgpu_lockup_timeout[AMDGPU_MAX_TIMEOUT_PARAM_LENGTH];
156d38ceaf9SAlex Deucher int amdgpu_dpm = -1;
157e635ee07SHuang Rui int amdgpu_fw_load_type = -1;
158d38ceaf9SAlex Deucher int amdgpu_aspm = -1;
159d38ceaf9SAlex Deucher int amdgpu_runtime_pm = -1;
1600b693f0bSRex Zhu uint amdgpu_ip_block_mask = 0xffffffff;
161d38ceaf9SAlex Deucher int amdgpu_bapm = -1;
16287fb7833SDeepak R Varma int amdgpu_deep_color;
163bab4fee7SJunwei Zhang int amdgpu_vm_size = -1;
164d07f14beSRoger He int amdgpu_vm_fragment_size = -1;
165d38ceaf9SAlex Deucher int amdgpu_vm_block_size = -1;
16687fb7833SDeepak R Varma int amdgpu_vm_fault_stop;
1679a4b7d4cSHarish Kasiviswanathan int amdgpu_vm_update_mode = -1;
16887fb7833SDeepak R Varma int amdgpu_exp_hw_support;
1694562236bSHarry Wentland int amdgpu_dc = -1;
170b70f014dSChunming Zhou int amdgpu_sched_jobs = 32;
1714afcb303SJammy Zhou int amdgpu_sched_hw_submission = 2;
17287fb7833SDeepak R Varma uint amdgpu_pcie_gen_cap;
17387fb7833SDeepak R Varma uint amdgpu_pcie_lane_cap;
17425faeddcSEvan Quan u64 amdgpu_cg_mask = 0xffffffffffffffff;
1750b693f0bSRex Zhu uint amdgpu_pg_mask = 0xffffffff;
1760b693f0bSRex Zhu uint amdgpu_sdma_phase_quantum = 32;
177e86c30e9SSrinivasan Shanmugam char *amdgpu_disable_cu;
178e86c30e9SSrinivasan Shanmugam char *amdgpu_virtual_display;
17980e709eeSChong Li bool enforce_isolation;
180e00e5c22SAlex Deucher int amdgpu_modeset = -1;
18101be2b62SRamesh Errabolu
18201be2b62SRamesh Errabolu /* Specifies the default granularity for SVM, used in buffer
18301be2b62SRamesh Errabolu * migration and restoration of backing memory when handling
18401be2b62SRamesh Errabolu * recoverable page faults.
18501be2b62SRamesh Errabolu *
18601be2b62SRamesh Errabolu * The value is given as log(numPages(buffer)); for a 2 MiB
18701be2b62SRamesh Errabolu * buffer it computes to be 9
18801be2b62SRamesh Errabolu */
18901be2b62SRamesh Errabolu uint amdgpu_svm_default_granularity = 9;
19001be2b62SRamesh Errabolu
191680602d6SKenneth Feng /*
192680602d6SKenneth Feng * OverDrive(bit 14) disabled by default
193680602d6SKenneth Feng * GFX DCS(bit 19) disabled by default
194680602d6SKenneth Feng */
195680602d6SKenneth Feng uint amdgpu_pp_feature_mask = 0xfff7bfff;
19687fb7833SDeepak R Varma uint amdgpu_force_long_training;
197e8835e0eSHawking Zhang int amdgpu_lbpw = -1;
1984a75aefeSAndres Rodriguez int amdgpu_compute_multipipe = -1;
199dcebf026SAndrey Grodzovsky int amdgpu_gpu_recovery = -1; /* auto */
20087fb7833SDeepak R Varma int amdgpu_emu_mode;
20187fb7833SDeepak R Varma uint amdgpu_smu_memory_pool_size;
2028738a82bSLijo Lazar int amdgpu_smu_pptable_id = -1;
203191a3c04SEvan Quan /*
204191a3c04SEvan Quan * FBC (bit 0) disabled by default
205191a3c04SEvan Quan * MULTI_MON_PP_MCLK_SWITCH (bit 1) enabled by default
206191a3c04SEvan Quan * - With this, for multiple monitors in sync(e.g. with the same model),
207191a3c04SEvan Quan * mclk switching will be allowed. And the mclk will be not foced to the
208191a3c04SEvan Quan * highest. That helps saving some idle power.
209191a3c04SEvan Quan * DISABLE_FRACTIONAL_PWM (bit 2) disabled by default
210191a3c04SEvan Quan * PSR (bit 3) disabled by default
211a5148245SZhan Liu * EDP NO POWER SEQUENCING (bit 4) disabled by default
212191a3c04SEvan Quan */
213191a3c04SEvan Quan uint amdgpu_dc_feature_mask = 2;
21487fb7833SDeepak R Varma uint amdgpu_dc_debug_mask;
215792a0cddSLeo Li uint amdgpu_dc_visual_confirm;
2165bfca069SJack Xiao int amdgpu_async_gfx_ring = 1;
21750a7c876SAlex Deucher int amdgpu_mcbp = -1;
21863e2fef6SAlex Deucher int amdgpu_discovery = -1;
21987fb7833SDeepak R Varma int amdgpu_mes;
220e58acb76Sshaoyunl int amdgpu_mes_log_enable = 0;
221928fe236SJack Xiao int amdgpu_mes_kiq;
2227be73af5SLikun Gao int amdgpu_uni_mes = 1;
223d5cc02d9SAlex Deucher int amdgpu_noretry = -1;
2244e66d7d2SYong Zhao int amdgpu_force_asic_type = -1;
22558aa7790SAlex Deucher int amdgpu_tmz = -1; /* auto */
226959143daSAlex Deucher uint amdgpu_freesync_vid_mode;
227273da6ffSWenhui Sheng int amdgpu_reset_method = -1; /* auto */
228a300de40SMonk Liu int amdgpu_num_kcq = -1;
22930d95a37SSathishkumar S int amdgpu_smartshift_bias;
230158a05a0SAlex Sierra int amdgpu_use_xgmi_p2p = 1;
23111eb648dSRuijing Dong int amdgpu_vcnfw_log;
232bf0207e1SAlex Deucher int amdgpu_sg_display = -1; /* auto */
233570de94bSLijo Lazar int amdgpu_user_partt_mode = AMDGPU_AUTO_COMPUTE_PARTITION_MODE;
234eebb06d1SLang Yu int amdgpu_umsch_mm;
2355dc270d3SMario Limonciello int amdgpu_seamless = -1; /* auto */
236887db1e4SAndré Almeida uint amdgpu_debug_mask;
2376ba5b613SAlex Deucher int amdgpu_agp = -1; /* auto */
238b8b39de6SEvan Quan int amdgpu_wbrf = -1;
239fc184dbeSHamza Mahfooz int amdgpu_damage_clips = -1; /* auto */
24098a2e3a0SSaleemkhan Jamadar int amdgpu_umsch_mm_fwlog;
2417875a226SAlex Deucher
242f158936bSJim Cromie DECLARE_DYNDBG_CLASSMAP(drm_debug_classes, DD_CLASS_TYPE_DISJOINT_BITS, 0,
243f158936bSJim Cromie "DRM_UT_CORE",
244f158936bSJim Cromie "DRM_UT_DRIVER",
245f158936bSJim Cromie "DRM_UT_KMS",
246f158936bSJim Cromie "DRM_UT_PRIME",
247f158936bSJim Cromie "DRM_UT_ATOMIC",
248f158936bSJim Cromie "DRM_UT_VBL",
249f158936bSJim Cromie "DRM_UT_STATE",
250f158936bSJim Cromie "DRM_UT_LEASE",
251f158936bSJim Cromie "DRM_UT_DP",
252f158936bSJim Cromie "DRM_UT_DRMRES");
253f158936bSJim Cromie
25462d73fbcSEvan Quan struct amdgpu_mgpu_info mgpu_info = {
25562d73fbcSEvan Quan .mutex = __MUTEX_INITIALIZER(mgpu_info.mutex),
25662d73fbcSEvan Quan };
2571218252fSxinhui pan int amdgpu_ras_enable = -1;
258e53aec7eSGuchun Chen uint amdgpu_ras_mask = 0xffffffff;
259acc0204cSGuchun Chen int amdgpu_bad_page_threshold = -1;
26088f8575bSDennis Li struct amdgpu_watchdog_timer amdgpu_watchdog_timer = {
26188f8575bSDennis Li .timeout_fatal_disable = false,
26228a5d7a5SHawking Zhang .period = 0x0, /* default to 0x0 (timeout disable) */
26388f8575bSDennis Li };
264d38ceaf9SAlex Deucher
2658405cf39SSonny Jiang /**
2668405cf39SSonny Jiang * DOC: vramlimit (int)
2678405cf39SSonny Jiang * Restrict the total amount of VRAM in MiB for testing. The default is 0 (Use full VRAM).
2688405cf39SSonny Jiang */
269d38ceaf9SAlex Deucher MODULE_PARM_DESC(vramlimit, "Restrict VRAM for testing, in megabytes");
270d38ceaf9SAlex Deucher module_param_named(vramlimit, amdgpu_vram_limit, int, 0600);
271d38ceaf9SAlex Deucher
2728405cf39SSonny Jiang /**
2738405cf39SSonny Jiang * DOC: vis_vramlimit (int)
2748405cf39SSonny Jiang * Restrict the amount of CPU visible VRAM in MiB for testing. The default is 0 (Use full CPU visible VRAM).
2758405cf39SSonny Jiang */
276218b5dcdSJohn Brooks MODULE_PARM_DESC(vis_vramlimit, "Restrict visible VRAM for testing, in megabytes");
277218b5dcdSJohn Brooks module_param_named(vis_vramlimit, amdgpu_vis_vram_limit, int, 0444);
278218b5dcdSJohn Brooks
2798405cf39SSonny Jiang /**
2808405cf39SSonny Jiang * DOC: gartsize (uint)
281570513baSPeter Maucher * Restrict the size of GART (for kernel use) in Mib (32, 64, etc.) for testing.
282570513baSPeter Maucher * The default is -1 (The size depends on asic).
2838405cf39SSonny Jiang */
284570513baSPeter Maucher MODULE_PARM_DESC(gartsize, "Size of kernel GART to setup in megabytes (32, 64, etc., -1=auto)");
285f9321cc4SChristian König module_param_named(gartsize, amdgpu_gart_size, uint, 0600);
286d38ceaf9SAlex Deucher
2878405cf39SSonny Jiang /**
2888405cf39SSonny Jiang * DOC: gttsize (int)
289570513baSPeter Maucher * Restrict the size of GTT domain (for userspace use) in MiB for testing.
2907e4cb7deSMario Limonciello * The default is -1 (Use value specified by TTM).
29150e30e3aSMario Limonciello * This parameter is deprecated and will be removed in the future.
2928405cf39SSonny Jiang */
293570513baSPeter Maucher MODULE_PARM_DESC(gttsize, "Size of the GTT userspace domain in megabytes (-1 = auto)");
29436d38372SChristian König module_param_named(gttsize, amdgpu_gtt_size, int, 0600);
295d38ceaf9SAlex Deucher
2968405cf39SSonny Jiang /**
2978405cf39SSonny Jiang * DOC: moverate (int)
2988405cf39SSonny Jiang * Set maximum buffer migration rate in MB/s. The default is -1 (8 MB/s).
2998405cf39SSonny Jiang */
30095844d20SMarek Olšák MODULE_PARM_DESC(moverate, "Maximum buffer migration rate in MB/s. (32, 64, etc., -1=auto, 0=1=disabled)");
30195844d20SMarek Olšák module_param_named(moverate, amdgpu_moverate, int, 0600);
30295844d20SMarek Olšák
3038405cf39SSonny Jiang /**
3048405cf39SSonny Jiang * DOC: audio (int)
3058405cf39SSonny Jiang * Set HDMI/DPAudio. Only affects non-DC display handling. The default is -1 (Enabled), set 0 to disabled it.
3068405cf39SSonny Jiang */
307d38ceaf9SAlex Deucher MODULE_PARM_DESC(audio, "Audio enable (-1 = auto, 0 = disable, 1 = enable)");
308d38ceaf9SAlex Deucher module_param_named(audio, amdgpu_audio, int, 0444);
309d38ceaf9SAlex Deucher
3108405cf39SSonny Jiang /**
3118405cf39SSonny Jiang * DOC: disp_priority (int)
3128405cf39SSonny Jiang * Set display Priority (1 = normal, 2 = high). Only affects non-DC display handling. The default is 0 (auto).
3138405cf39SSonny Jiang */
314d38ceaf9SAlex Deucher MODULE_PARM_DESC(disp_priority, "Display Priority (0 = auto, 1 = normal, 2 = high)");
315d38ceaf9SAlex Deucher module_param_named(disp_priority, amdgpu_disp_priority, int, 0444);
316d38ceaf9SAlex Deucher
3178405cf39SSonny Jiang /**
3188405cf39SSonny Jiang * DOC: hw_i2c (int)
3198405cf39SSonny Jiang * To enable hw i2c engine. Only affects non-DC display handling. The default is 0 (Disabled).
3208405cf39SSonny Jiang */
321d38ceaf9SAlex Deucher MODULE_PARM_DESC(hw_i2c, "hw i2c engine enable (0 = disable)");
322d38ceaf9SAlex Deucher module_param_named(hw_i2c, amdgpu_hw_i2c, int, 0444);
323d38ceaf9SAlex Deucher
3248405cf39SSonny Jiang /**
3258405cf39SSonny Jiang * DOC: pcie_gen2 (int)
3268405cf39SSonny Jiang * To disable PCIE Gen2/3 mode (0 = disable, 1 = enable). The default is -1 (auto, enabled).
3278405cf39SSonny Jiang */
328d38ceaf9SAlex Deucher MODULE_PARM_DESC(pcie_gen2, "PCIE Gen2 mode (-1 = auto, 0 = disable, 1 = enable)");
329d38ceaf9SAlex Deucher module_param_named(pcie_gen2, amdgpu_pcie_gen2, int, 0444);
330d38ceaf9SAlex Deucher
3318405cf39SSonny Jiang /**
3328405cf39SSonny Jiang * DOC: msi (int)
3338405cf39SSonny Jiang * To disable Message Signaled Interrupts (MSI) functionality (1 = enable, 0 = disable). The default is -1 (auto, enabled).
3348405cf39SSonny Jiang */
335d38ceaf9SAlex Deucher MODULE_PARM_DESC(msi, "MSI support (1 = enable, 0 = disable, -1 = auto)");
336d38ceaf9SAlex Deucher module_param_named(msi, amdgpu_msi, int, 0444);
337d38ceaf9SAlex Deucher
3388405cf39SSonny Jiang /**
33901be2b62SRamesh Errabolu * DOC: svm_default_granularity (uint)
34001be2b62SRamesh Errabolu * Used in buffer migration and handling of recoverable page faults
34101be2b62SRamesh Errabolu */
34201be2b62SRamesh Errabolu MODULE_PARM_DESC(svm_default_granularity, "SVM's default granularity in log(2^Pages), default 9 = 2^9 = 2 MiB");
34301be2b62SRamesh Errabolu module_param_named(svm_default_granularity, amdgpu_svm_default_granularity, uint, 0644);
34401be2b62SRamesh Errabolu
34501be2b62SRamesh Errabolu /**
346912dfc84SEvan Quan * DOC: lockup_timeout (string)
347912dfc84SEvan Quan * Set GPU scheduler timeout value in ms.
348912dfc84SEvan Quan *
349912dfc84SEvan Quan * The format can be [Non-Compute] or [GFX,Compute,SDMA,Video]. That is there can be one or
350912dfc84SEvan Quan * multiple values specified. 0 and negative values are invalidated. They will be adjusted
351879e723dSAdam Zerella * to the default timeout.
352879e723dSAdam Zerella *
353912dfc84SEvan Quan * - With one value specified, the setting will apply to all non-compute jobs.
354879e723dSAdam Zerella * - With multiple values specified, the first one will be for GFX.
355879e723dSAdam Zerella * The second one is for Compute. The third and fourth ones are
356879e723dSAdam Zerella * for SDMA and Video.
357879e723dSAdam Zerella *
358912dfc84SEvan Quan * By default(with no lockup_timeout settings), the timeout for all non-compute(GFX, SDMA and Video)
35967387dfeSAlex Deucher * jobs is 10000. The timeout for compute is 60000.
3608405cf39SSonny Jiang */
36167387dfeSAlex Deucher MODULE_PARM_DESC(lockup_timeout, "GPU lockup timeout in ms (default: for bare metal 10000 for non-compute jobs and 60000 for compute jobs; "
362f9acfafcSSrinivasan Shanmugam "for passthrough or sriov, 10000 for all jobs. 0: keep default value. negative: infinity timeout), format: for bare metal [Non-Compute] or [GFX,Compute,SDMA,Video]; "
363bcccee89SEmily Deng "for passthrough or sriov [all jobs] or [GFX,Compute,SDMA,Video].");
364912dfc84SEvan Quan module_param_string(lockup_timeout, amdgpu_lockup_timeout, sizeof(amdgpu_lockup_timeout), 0444);
365d38ceaf9SAlex Deucher
3668405cf39SSonny Jiang /**
3678405cf39SSonny Jiang * DOC: dpm (int)
36854b998caSHawking Zhang * Override for dynamic power management setting
3695c9a6272SKevin Wang * (0 = disable, 1 = enable)
37054b998caSHawking Zhang * The default is -1 (auto).
3718405cf39SSonny Jiang */
372d38ceaf9SAlex Deucher MODULE_PARM_DESC(dpm, "DPM support (1 = enable, 0 = disable, -1 = auto)");
373d38ceaf9SAlex Deucher module_param_named(dpm, amdgpu_dpm, int, 0444);
374d38ceaf9SAlex Deucher
3758405cf39SSonny Jiang /**
3768405cf39SSonny Jiang * DOC: fw_load_type (int)
377ddb267b6SYann Dirson * Set different firmware loading type for debugging, if supported.
378ddb267b6SYann Dirson * Set to 0 to force direct loading if supported by the ASIC. Set
379ddb267b6SYann Dirson * to -1 to select the default loading mode for the ASIC, as defined
380ddb267b6SYann Dirson * by the driver. The default is -1 (auto).
3818405cf39SSonny Jiang */
382a76be7bbSChengming Gui MODULE_PARM_DESC(fw_load_type, "firmware loading type (3 = rlc backdoor autoload if supported, 2 = smu load if supported, 1 = psp load, 0 = force direct if supported, -1 = auto)");
383e635ee07SHuang Rui module_param_named(fw_load_type, amdgpu_fw_load_type, int, 0444);
384d38ceaf9SAlex Deucher
3858405cf39SSonny Jiang /**
3868405cf39SSonny Jiang * DOC: aspm (int)
3878405cf39SSonny Jiang * To disable ASPM (1 = enable, 0 = disable). The default is -1 (auto, enabled).
3888405cf39SSonny Jiang */
389d38ceaf9SAlex Deucher MODULE_PARM_DESC(aspm, "ASPM support (1 = enable, 0 = disable, -1 = auto)");
390d38ceaf9SAlex Deucher module_param_named(aspm, amdgpu_aspm, int, 0444);
391d38ceaf9SAlex Deucher
3928405cf39SSonny Jiang /**
3938405cf39SSonny Jiang * DOC: runpm (int)
3944d625a97SAlex Deucher * Override for runtime power management control for dGPUs. The amdgpu driver can dynamically power down
3954d625a97SAlex Deucher * the dGPUs when they are idle if supported. The default is -1 (auto enable).
3964d625a97SAlex Deucher * Setting the value to 0 disables this functionality.
3974d6fc55aSAlex Deucher * Setting the value to -2 is auto enabled with power down when displays are attached.
3988405cf39SSonny Jiang */
3994d6fc55aSAlex Deucher MODULE_PARM_DESC(runpm, "PX runtime pm (2 = force enable with BAMACO, 1 = force enable with BACO, 0 = disable, -1 = auto, -2 = auto with displays)");
400d38ceaf9SAlex Deucher module_param_named(runpm, amdgpu_runtime_pm, int, 0444);
401d38ceaf9SAlex Deucher
4028405cf39SSonny Jiang /**
4038405cf39SSonny Jiang * DOC: ip_block_mask (uint)
4048405cf39SSonny Jiang * Override what IP blocks are enabled on the GPU. Each GPU is a collection of IP blocks (gfx, display, video, etc.).
4058405cf39SSonny Jiang * Use this parameter to disable specific blocks. Note that the IP blocks do not have a fixed index. Some asics may not have
4068405cf39SSonny Jiang * some IPs or may include multiple instances of an IP so the ordering various from asic to asic. See the driver output in
4078405cf39SSonny Jiang * the kernel log for the list of IPs on the asic. The default is 0xffffffff (enable all blocks on a device).
4088405cf39SSonny Jiang */
409d38ceaf9SAlex Deucher MODULE_PARM_DESC(ip_block_mask, "IP Block Mask (all blocks enabled (default))");
410177b76a8SChristian König module_param_named_unsafe(ip_block_mask, amdgpu_ip_block_mask, uint, 0444);
411d38ceaf9SAlex Deucher
4128405cf39SSonny Jiang /**
4138405cf39SSonny Jiang * DOC: bapm (int)
4148405cf39SSonny Jiang * Bidirectional Application Power Management (BAPM) used to dynamically share TDP between CPU and GPU. Set value 0 to disable it.
4158405cf39SSonny Jiang * The default -1 (auto, enabled)
4168405cf39SSonny Jiang */
417d38ceaf9SAlex Deucher MODULE_PARM_DESC(bapm, "BAPM support (1 = enable, 0 = disable, -1 = auto)");
418d38ceaf9SAlex Deucher module_param_named(bapm, amdgpu_bapm, int, 0444);
419d38ceaf9SAlex Deucher
4208405cf39SSonny Jiang /**
4218405cf39SSonny Jiang * DOC: deep_color (int)
4228405cf39SSonny Jiang * Set 1 to enable Deep Color support. Only affects non-DC display handling. The default is 0 (disabled).
4238405cf39SSonny Jiang */
424d38ceaf9SAlex Deucher MODULE_PARM_DESC(deep_color, "Deep Color support (1 = enable, 0 = disable (default))");
425d38ceaf9SAlex Deucher module_param_named(deep_color, amdgpu_deep_color, int, 0444);
426d38ceaf9SAlex Deucher
4278405cf39SSonny Jiang /**
4288405cf39SSonny Jiang * DOC: vm_size (int)
4298405cf39SSonny Jiang * Override the size of the GPU's per client virtual address space in GiB. The default is -1 (automatic for each asic).
4308405cf39SSonny Jiang */
431ed885b21SChristian König MODULE_PARM_DESC(vm_size, "VM address space size in gigabytes (default 64GB)");
432d38ceaf9SAlex Deucher module_param_named(vm_size, amdgpu_vm_size, int, 0444);
433d38ceaf9SAlex Deucher
4348405cf39SSonny Jiang /**
4358405cf39SSonny Jiang * DOC: vm_fragment_size (int)
4368405cf39SSonny Jiang * Override VM fragment size in bits (4, 5, etc. 4 = 64K, 9 = 2M). The default is -1 (automatic for each asic).
4378405cf39SSonny Jiang */
438d07f14beSRoger He MODULE_PARM_DESC(vm_fragment_size, "VM fragment size in bits (4, 5, etc. 4 = 64K (default), Max 9 = 2M)");
439d07f14beSRoger He module_param_named(vm_fragment_size, amdgpu_vm_fragment_size, int, 0444);
440d07f14beSRoger He
4418405cf39SSonny Jiang /**
4428405cf39SSonny Jiang * DOC: vm_block_size (int)
4438405cf39SSonny Jiang * Override VM page table size in bits (default depending on vm_size and hw setup). The default is -1 (automatic for each asic).
4448405cf39SSonny Jiang */
445d38ceaf9SAlex Deucher MODULE_PARM_DESC(vm_block_size, "VM page table size in bits (default depending on vm_size)");
446d38ceaf9SAlex Deucher module_param_named(vm_block_size, amdgpu_vm_block_size, int, 0444);
447d38ceaf9SAlex Deucher
4488405cf39SSonny Jiang /**
4498405cf39SSonny Jiang * DOC: vm_fault_stop (int)
4508405cf39SSonny Jiang * Stop on VM fault for debugging (0 = never, 1 = print first, 2 = always). The default is 0 (No stop).
4518405cf39SSonny Jiang */
452d9c13156SChristian König MODULE_PARM_DESC(vm_fault_stop, "Stop on VM fault (0 = never (default), 1 = print first, 2 = always)");
453d9c13156SChristian König module_param_named(vm_fault_stop, amdgpu_vm_fault_stop, int, 0444);
454d9c13156SChristian König
4558405cf39SSonny Jiang /**
4568405cf39SSonny Jiang * DOC: vm_update_mode (int)
4578405cf39SSonny Jiang * Override VM update mode. VM updated by using CPU (0 = never, 1 = Graphics only, 2 = Compute only, 3 = Both). The default
4588405cf39SSonny Jiang * is -1 (Only in large BAR(LB) systems Compute VM tables will be updated by CPU, otherwise 0, never).
4598405cf39SSonny Jiang */
4609a4b7d4cSHarish Kasiviswanathan MODULE_PARM_DESC(vm_update_mode, "VM update using CPU (0 = never (default except for large BAR(LB)), 1 = Graphics only, 2 = Compute only (default for LB), 3 = Both");
4619a4b7d4cSHarish Kasiviswanathan module_param_named(vm_update_mode, amdgpu_vm_update_mode, int, 0444);
4629a4b7d4cSHarish Kasiviswanathan
4638405cf39SSonny Jiang /**
4648405cf39SSonny Jiang * DOC: exp_hw_support (int)
4658405cf39SSonny Jiang * Enable experimental hw support (1 = enable). The default is 0 (disabled).
4668405cf39SSonny Jiang */
467d38ceaf9SAlex Deucher MODULE_PARM_DESC(exp_hw_support, "experimental hw support (1 = enable, 0 = disable (default))");
468177b76a8SChristian König module_param_named_unsafe(exp_hw_support, amdgpu_exp_hw_support, int, 0444);
469d38ceaf9SAlex Deucher
4708405cf39SSonny Jiang /**
4718405cf39SSonny Jiang * DOC: dc (int)
4728405cf39SSonny Jiang * Disable/Enable Display Core driver for debugging (1 = enable, 0 = disable). The default is -1 (automatic for each asic).
4738405cf39SSonny Jiang */
4744562236bSHarry Wentland MODULE_PARM_DESC(dc, "Display Core driver (1 = enable, 0 = disable, -1 = auto (default))");
4754562236bSHarry Wentland module_param_named(dc, amdgpu_dc, int, 0444);
4764562236bSHarry Wentland
4778405cf39SSonny Jiang /**
4788405cf39SSonny Jiang * DOC: sched_jobs (int)
4798405cf39SSonny Jiang * Override the max number of jobs supported in the sw queue. The default is 32.
4808405cf39SSonny Jiang */
481b70f014dSChunming Zhou MODULE_PARM_DESC(sched_jobs, "the max number of jobs supported in the sw queue (default 32)");
4821333f723SJammy Zhou module_param_named(sched_jobs, amdgpu_sched_jobs, int, 0444);
4831333f723SJammy Zhou
4848405cf39SSonny Jiang /**
4858405cf39SSonny Jiang * DOC: sched_hw_submission (int)
4868405cf39SSonny Jiang * Override the max number of HW submissions. The default is 2.
4878405cf39SSonny Jiang */
4884afcb303SJammy Zhou MODULE_PARM_DESC(sched_hw_submission, "the max number of HW submissions (default 2)");
4894afcb303SJammy Zhou module_param_named(sched_hw_submission, amdgpu_sched_hw_submission, int, 0444);
4904afcb303SJammy Zhou
4918405cf39SSonny Jiang /**
4927427a7a0SPaul Menzel * DOC: ppfeaturemask (hexint)
4938405cf39SSonny Jiang * Override power features enabled. See enum PP_FEATURE_MASK in drivers/gpu/drm/amd/include/amd_shared.h.
4948405cf39SSonny Jiang * The default is the current set of stable power features.
4958405cf39SSonny Jiang */
4965141e9d2SRex Zhu MODULE_PARM_DESC(ppfeaturemask, "all power features enabled (default))");
4977427a7a0SPaul Menzel module_param_named(ppfeaturemask, amdgpu_pp_feature_mask, hexint, 0444);
4983a74f6f2SJammy Zhou
4998405cf39SSonny Jiang /**
500367039bfSTianci.Yin * DOC: forcelongtraining (uint)
501367039bfSTianci.Yin * Force long memory training in resume.
502367039bfSTianci.Yin * The default is zero, indicates short training in resume.
503367039bfSTianci.Yin */
504367039bfSTianci.Yin MODULE_PARM_DESC(forcelongtraining, "force memory long training");
505367039bfSTianci.Yin module_param_named(forcelongtraining, amdgpu_force_long_training, uint, 0444);
506367039bfSTianci.Yin
507367039bfSTianci.Yin /**
5088405cf39SSonny Jiang * DOC: pcie_gen_cap (uint)
5098405cf39SSonny Jiang * Override PCIE gen speed capabilities. See the CAIL flags in drivers/gpu/drm/amd/include/amd_pcie.h.
5108405cf39SSonny Jiang * The default is 0 (automatic for each asic).
5118405cf39SSonny Jiang */
512cd474ba0SAlex Deucher MODULE_PARM_DESC(pcie_gen_cap, "PCIE Gen Caps (0: autodetect (default))");
513cd474ba0SAlex Deucher module_param_named(pcie_gen_cap, amdgpu_pcie_gen_cap, uint, 0444);
514cd474ba0SAlex Deucher
5158405cf39SSonny Jiang /**
5168405cf39SSonny Jiang * DOC: pcie_lane_cap (uint)
5178405cf39SSonny Jiang * Override PCIE lanes capabilities. See the CAIL flags in drivers/gpu/drm/amd/include/amd_pcie.h.
5188405cf39SSonny Jiang * The default is 0 (automatic for each asic).
5198405cf39SSonny Jiang */
520cd474ba0SAlex Deucher MODULE_PARM_DESC(pcie_lane_cap, "PCIE Lane Caps (0: autodetect (default))");
521cd474ba0SAlex Deucher module_param_named(pcie_lane_cap, amdgpu_pcie_lane_cap, uint, 0444);
522cd474ba0SAlex Deucher
5238405cf39SSonny Jiang /**
52425faeddcSEvan Quan * DOC: cg_mask (ullong)
5258405cf39SSonny Jiang * Override Clockgating features enabled on GPU (0 = disable clock gating). See the AMD_CG_SUPPORT flags in
52625faeddcSEvan Quan * drivers/gpu/drm/amd/include/amd_shared.h. The default is 0xffffffffffffffff (all enabled).
5278405cf39SSonny Jiang */
528395d1fb9SNicolai Hähnle MODULE_PARM_DESC(cg_mask, "Clockgating flags mask (0 = disable clock gating)");
52925faeddcSEvan Quan module_param_named(cg_mask, amdgpu_cg_mask, ullong, 0444);
530395d1fb9SNicolai Hähnle
5318405cf39SSonny Jiang /**
5328405cf39SSonny Jiang * DOC: pg_mask (uint)
5338405cf39SSonny Jiang * Override Powergating features enabled on GPU (0 = disable power gating). See the AMD_PG_SUPPORT flags in
5348405cf39SSonny Jiang * drivers/gpu/drm/amd/include/amd_shared.h. The default is 0xffffffff (all enabled).
5358405cf39SSonny Jiang */
536395d1fb9SNicolai Hähnle MODULE_PARM_DESC(pg_mask, "Powergating flags mask (0 = disable power gating)");
537395d1fb9SNicolai Hähnle module_param_named(pg_mask, amdgpu_pg_mask, uint, 0444);
538395d1fb9SNicolai Hähnle
5398405cf39SSonny Jiang /**
5408405cf39SSonny Jiang * DOC: sdma_phase_quantum (uint)
5418405cf39SSonny Jiang * Override SDMA context switch phase quantum (x 1K GPU clock cycles, 0 = no change). The default is 32.
5428405cf39SSonny Jiang */
543a667386cSFelix Kuehling MODULE_PARM_DESC(sdma_phase_quantum, "SDMA context switch phase quantum (x 1K GPU clock cycles, 0 = no change (default 32))");
544a667386cSFelix Kuehling module_param_named(sdma_phase_quantum, amdgpu_sdma_phase_quantum, uint, 0444);
545a667386cSFelix Kuehling
5468405cf39SSonny Jiang /**
5478405cf39SSonny Jiang * DOC: disable_cu (charp)
5488405cf39SSonny Jiang * Set to disable CUs (It's set like se.sh.cu,...). The default is NULL.
5498405cf39SSonny Jiang */
5506f8941a2SNicolai Hähnle MODULE_PARM_DESC(disable_cu, "Disable CUs (se.sh.cu,...)");
5516f8941a2SNicolai Hähnle module_param_named(disable_cu, amdgpu_disable_cu, charp, 0444);
5526f8941a2SNicolai Hähnle
5538405cf39SSonny Jiang /**
5548405cf39SSonny Jiang * DOC: virtual_display (charp)
5558405cf39SSonny Jiang * Set to enable virtual display feature. This feature provides a virtual display hardware on headless boards
5568405cf39SSonny Jiang * or in virtualized environments. It will be set like xxxx:xx:xx.x,x;xxxx:xx:xx.x,x. It's the pci address of
5578405cf39SSonny Jiang * the device, plus the number of crtcs to expose. E.g., 0000:26:00.0,4 would enable 4 virtual crtcs on the pci
5588405cf39SSonny Jiang * device at 26:00.0. The default is NULL.
5598405cf39SSonny Jiang */
5600f66356dSEmily Deng MODULE_PARM_DESC(virtual_display,
5610f66356dSEmily Deng "Enable virtual display feature (the virtual_display will be set like xxxx:xx:xx.x,x;xxxx:xx:xx.x,x)");
5629accf2fdSEmily Deng module_param_named(virtual_display, amdgpu_virtual_display, charp, 0444);
563e443059dSEmily Deng
5648405cf39SSonny Jiang /**
5658405cf39SSonny Jiang * DOC: lbpw (int)
5668405cf39SSonny Jiang * Override Load Balancing Per Watt (LBPW) support (1 = enable, 0 = disable). The default is -1 (auto, enabled).
5678405cf39SSonny Jiang */
568e8835e0eSHawking Zhang MODULE_PARM_DESC(lbpw, "Load Balancing Per Watt (LBPW) support (1 = enable, 0 = disable, -1 = auto)");
569e8835e0eSHawking Zhang module_param_named(lbpw, amdgpu_lbpw, int, 0444);
570bce23e00SAlex Deucher
5714a75aefeSAndres Rodriguez MODULE_PARM_DESC(compute_multipipe, "Force compute queues to be spread across pipes (1 = enable, 0 = disable, -1 = auto)");
5724a75aefeSAndres Rodriguez module_param_named(compute_multipipe, amdgpu_compute_multipipe, int, 0444);
5734a75aefeSAndres Rodriguez
5748405cf39SSonny Jiang /**
5758405cf39SSonny Jiang * DOC: gpu_recovery (int)
5768405cf39SSonny Jiang * Set to enable GPU recovery mechanism (1 = enable, 0 = disable). The default is -1 (auto, disabled except SRIOV).
5778405cf39SSonny Jiang */
57806a2d7ccSChristian König MODULE_PARM_DESC(gpu_recovery, "Enable GPU recovery mechanism, (1 = enable, 0 = disable, -1 = auto)");
579177b76a8SChristian König module_param_named_unsafe(gpu_recovery, amdgpu_gpu_recovery, int, 0444);
580dcebf026SAndrey Grodzovsky
5818405cf39SSonny Jiang /**
5828405cf39SSonny Jiang * DOC: emu_mode (int)
5838405cf39SSonny Jiang * Set value 1 to enable emulation mode. This is only needed when running on an emulator. The default is 0 (disabled).
5848405cf39SSonny Jiang */
585d869ae09SAlex Deucher MODULE_PARM_DESC(emu_mode, "Emulation mode, (1 = enable, 0 = disable)");
586177b76a8SChristian König module_param_named_unsafe(emu_mode, amdgpu_emu_mode, int, 0444);
587bfca0289SShaoyun Liu
5888405cf39SSonny Jiang /**
5892f3940e9SEvan Quan * DOC: ras_enable (int)
5901218252fSxinhui pan * Enable RAS features on the GPU (0 = disable, 1 = enable, -1 = auto (default))
5911218252fSxinhui pan */
5922f3940e9SEvan Quan MODULE_PARM_DESC(ras_enable, "Enable RAS features on the GPU (0 = disable, 1 = enable, -1 = auto (default))");
5931218252fSxinhui pan module_param_named(ras_enable, amdgpu_ras_enable, int, 0444);
5941218252fSxinhui pan
5951218252fSxinhui pan /**
5962f3940e9SEvan Quan * DOC: ras_mask (uint)
5971218252fSxinhui pan * Mask of RAS features to enable (default 0xffffffff), only valid when ras_enable == 1
5981218252fSxinhui pan * See the flags in drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h
5991218252fSxinhui pan */
6002f3940e9SEvan Quan MODULE_PARM_DESC(ras_mask, "Mask of RAS features to enable (default 0xffffffff), only valid when ras_enable == 1");
6011218252fSxinhui pan module_param_named(ras_mask, amdgpu_ras_mask, uint, 0444);
6021218252fSxinhui pan
6031218252fSxinhui pan /**
60488f8575bSDennis Li * DOC: timeout_fatal_disable (bool)
60588f8575bSDennis Li * Disable Watchdog timeout fatal error event
60688f8575bSDennis Li */
60788f8575bSDennis Li MODULE_PARM_DESC(timeout_fatal_disable, "disable watchdog timeout fatal error (false = default)");
60888f8575bSDennis Li module_param_named(timeout_fatal_disable, amdgpu_watchdog_timer.timeout_fatal_disable, bool, 0644);
60988f8575bSDennis Li
61088f8575bSDennis Li /**
61188f8575bSDennis Li * DOC: timeout_period (uint)
61288f8575bSDennis Li * Modify the watchdog timeout max_cycles as (1 << period)
61388f8575bSDennis Li */
61428a5d7a5SHawking Zhang MODULE_PARM_DESC(timeout_period, "watchdog timeout period (0 = timeout disabled, 1 ~ 0x23 = timeout maxcycles = (1 << period)");
61588f8575bSDennis Li module_param_named(timeout_period, amdgpu_watchdog_timer.period, uint, 0644);
61688f8575bSDennis Li
61788f8575bSDennis Li /**
6188405cf39SSonny Jiang * DOC: si_support (int)
6198405cf39SSonny Jiang * Set SI support driver. This parameter works after set config CONFIG_DRM_AMDGPU_SI. For SI asic, when radeon driver is enabled,
6208405cf39SSonny Jiang * set value 0 to use radeon driver, while set value 1 to use amdgpu driver. The default is using radeon driver when it available,
6218405cf39SSonny Jiang * otherwise using amdgpu driver.
6228405cf39SSonny Jiang */
6236dd13096SFelix Kuehling #ifdef CONFIG_DRM_AMDGPU_SI
62453efaf56SMichel Dänzer
625b25b3599SSrinivasan Shanmugam #if IS_ENABLED(CONFIG_DRM_RADEON) || IS_ENABLED(CONFIG_DRM_RADEON_MODULE)
626b679566bSchenxuebing int amdgpu_si_support;
6276dd13096SFelix Kuehling MODULE_PARM_DESC(si_support, "SI support (1 = enabled, 0 = disabled (default))");
62853efaf56SMichel Dänzer #else
62953efaf56SMichel Dänzer int amdgpu_si_support = 1;
63053efaf56SMichel Dänzer MODULE_PARM_DESC(si_support, "SI support (1 = enabled (default), 0 = disabled)");
63153efaf56SMichel Dänzer #endif
63253efaf56SMichel Dänzer
6336dd13096SFelix Kuehling module_param_named(si_support, amdgpu_si_support, int, 0444);
6346dd13096SFelix Kuehling #endif
6356dd13096SFelix Kuehling
6368405cf39SSonny Jiang /**
6378405cf39SSonny Jiang * DOC: cik_support (int)
6388405cf39SSonny Jiang * Set CIK support driver. This parameter works after set config CONFIG_DRM_AMDGPU_CIK. For CIK asic, when radeon driver is enabled,
6398405cf39SSonny Jiang * set value 0 to use radeon driver, while set value 1 to use amdgpu driver. The default is using radeon driver when it available,
6408405cf39SSonny Jiang * otherwise using amdgpu driver.
6418405cf39SSonny Jiang */
6427df28986SFelix Kuehling #ifdef CONFIG_DRM_AMDGPU_CIK
64353efaf56SMichel Dänzer
644b25b3599SSrinivasan Shanmugam #if IS_ENABLED(CONFIG_DRM_RADEON) || IS_ENABLED(CONFIG_DRM_RADEON_MODULE)
645b679566bSchenxuebing int amdgpu_cik_support;
6462b059658SMichel Dänzer MODULE_PARM_DESC(cik_support, "CIK support (1 = enabled, 0 = disabled (default))");
64753efaf56SMichel Dänzer #else
64853efaf56SMichel Dänzer int amdgpu_cik_support = 1;
64953efaf56SMichel Dänzer MODULE_PARM_DESC(cik_support, "CIK support (1 = enabled (default), 0 = disabled)");
65053efaf56SMichel Dänzer #endif
65153efaf56SMichel Dänzer
6527df28986SFelix Kuehling module_param_named(cik_support, amdgpu_cik_support, int, 0444);
6537df28986SFelix Kuehling #endif
6547df28986SFelix Kuehling
6558405cf39SSonny Jiang /**
6568405cf39SSonny Jiang * DOC: smu_memory_pool_size (uint)
6578405cf39SSonny Jiang * It is used to reserve gtt for smu debug usage, setting value 0 to disable it. The actual size is value * 256MiB.
6588405cf39SSonny Jiang * E.g. 0x1 = 256Mbyte, 0x2 = 512Mbyte, 0x4 = 1 Gbyte, 0x8 = 2GByte. The default is 0 (disabled).
6598405cf39SSonny Jiang */
6607951e376SRex Zhu MODULE_PARM_DESC(smu_memory_pool_size,
661f9acfafcSSrinivasan Shanmugam "reserve gtt for smu debug usage, 0 = disable,0x1 = 256Mbyte, 0x2 = 512Mbyte, 0x4 = 1 Gbyte, 0x8 = 2GByte");
6627951e376SRex Zhu module_param_named(smu_memory_pool_size, amdgpu_smu_memory_pool_size, uint, 0444);
6637951e376SRex Zhu
66451bcce46SHawking Zhang /**
66551bcce46SHawking Zhang * DOC: async_gfx_ring (int)
66651bcce46SHawking Zhang * It is used to enable gfx rings that could be configured with different prioritites or equal priorities
66751bcce46SHawking Zhang */
66851bcce46SHawking Zhang MODULE_PARM_DESC(async_gfx_ring,
6695bfca069SJack Xiao "Asynchronous GFX rings that could be configured with either different priorities (HP3D ring and LP3D ring), or equal priorities (0 = disabled, 1 = enabled (default))");
67051bcce46SHawking Zhang module_param_named(async_gfx_ring, amdgpu_async_gfx_ring, int, 0444);
67151bcce46SHawking Zhang
67240562787SAlex Deucher /**
67340562787SAlex Deucher * DOC: mcbp (int)
67450a7c876SAlex Deucher * It is used to enable mid command buffer preemption. (0 = disabled, 1 = enabled, -1 auto (default))
67540562787SAlex Deucher */
676b239c017SJack Xiao MODULE_PARM_DESC(mcbp,
67750a7c876SAlex Deucher "Enable Mid-command buffer preemption (0 = disabled, 1 = enabled), -1 = auto (default)");
678b239c017SJack Xiao module_param_named(mcbp, amdgpu_mcbp, int, 0444);
679b239c017SJack Xiao
68040562787SAlex Deucher /**
68140562787SAlex Deucher * DOC: discovery (int)
68240562787SAlex Deucher * Allow driver to discover hardware IP information from IP Discovery table at the top of VRAM.
683a79d3709SAlex Deucher * (-1 = auto (default), 0 = disabled, 1 = enabled, 2 = use ip_discovery table from file)
68440562787SAlex Deucher */
685a190d1c7SXiaojie Yuan MODULE_PARM_DESC(discovery,
686a190d1c7SXiaojie Yuan "Allow driver to discover hardware IPs from IP Discovery table at the top of VRAM");
687a190d1c7SXiaojie Yuan module_param_named(discovery, amdgpu_discovery, int, 0444);
688a190d1c7SXiaojie Yuan
68940562787SAlex Deucher /**
69040562787SAlex Deucher * DOC: mes (int)
69140562787SAlex Deucher * Enable Micro Engine Scheduler. This is a new hw scheduling engine for gfx, sdma, and compute.
69240562787SAlex Deucher * (0 = disabled (default), 1 = enabled)
69340562787SAlex Deucher */
69438487284SJack Xiao MODULE_PARM_DESC(mes,
69538487284SJack Xiao "Enable Micro Engine Scheduler (0 = disabled (default), 1 = enabled)");
69638487284SJack Xiao module_param_named(mes, amdgpu_mes, int, 0444);
69738487284SJack Xiao
698d5cc02d9SAlex Deucher /**
699e58acb76Sshaoyunl * DOC: mes_log_enable (int)
700e58acb76Sshaoyunl * Enable Micro Engine Scheduler log. This is used to enable/disable MES internal log.
701e58acb76Sshaoyunl * (0 = disabled (default), 1 = enabled)
702e58acb76Sshaoyunl */
703e58acb76Sshaoyunl MODULE_PARM_DESC(mes_log_enable,
704e58acb76Sshaoyunl "Enable Micro Engine Scheduler log (0 = disabled (default), 1 = enabled)");
705e58acb76Sshaoyunl module_param_named(mes_log_enable, amdgpu_mes_log_enable, int, 0444);
706e58acb76Sshaoyunl
707e58acb76Sshaoyunl /**
708928fe236SJack Xiao * DOC: mes_kiq (int)
709928fe236SJack Xiao * Enable Micro Engine Scheduler KIQ. This is a new engine pipe for kiq.
710928fe236SJack Xiao * (0 = disabled (default), 1 = enabled)
711928fe236SJack Xiao */
712928fe236SJack Xiao MODULE_PARM_DESC(mes_kiq,
713928fe236SJack Xiao "Enable Micro Engine Scheduler KIQ (0 = disabled (default), 1 = enabled)");
714928fe236SJack Xiao module_param_named(mes_kiq, amdgpu_mes_kiq, int, 0444);
715928fe236SJack Xiao
716928fe236SJack Xiao /**
7173dc434adSJack Xiao * DOC: uni_mes (int)
7183dc434adSJack Xiao * Enable Unified Micro Engine Scheduler. This is a new engine pipe for unified scheduler.
7193dc434adSJack Xiao * (0 = disabled (default), 1 = enabled)
7203dc434adSJack Xiao */
7213dc434adSJack Xiao MODULE_PARM_DESC(uni_mes,
7227be73af5SLikun Gao "Enable Unified Micro Engine Scheduler (0 = disabled, 1 = enabled(default)");
7233dc434adSJack Xiao module_param_named(uni_mes, amdgpu_uni_mes, int, 0444);
7243dc434adSJack Xiao
7253dc434adSJack Xiao /**
726d5cc02d9SAlex Deucher * DOC: noretry (int)
7279705c85fSFelix Kuehling * Disable XNACK retry in the SQ by default on GFXv9 hardware. On ASICs that
7289705c85fSFelix Kuehling * do not support per-process XNACK this also disables retry page faults.
729d5cc02d9SAlex Deucher * (0 = retry enabled, 1 = retry disabled, -1 auto (default))
730d5cc02d9SAlex Deucher */
73175ee6487SFelix Kuehling MODULE_PARM_DESC(noretry,
732d5cc02d9SAlex Deucher "Disable retry faults (0 = retry enabled, 1 = retry disabled, -1 auto (default))");
73375ee6487SFelix Kuehling module_param_named(noretry, amdgpu_noretry, int, 0644);
73475ee6487SFelix Kuehling
7354e66d7d2SYong Zhao /**
7364e66d7d2SYong Zhao * DOC: force_asic_type (int)
7374e66d7d2SYong Zhao * A non negative value used to specify the asic type for all supported GPUs.
7384e66d7d2SYong Zhao */
7394e66d7d2SYong Zhao MODULE_PARM_DESC(force_asic_type,
7404e66d7d2SYong Zhao "A non negative value used to specify the asic type for all supported GPUs");
741177b76a8SChristian König module_param_named_unsafe(force_asic_type, amdgpu_force_asic_type, int, 0444);
7424e66d7d2SYong Zhao
743158a05a0SAlex Sierra /**
744158a05a0SAlex Sierra * DOC: use_xgmi_p2p (int)
745158a05a0SAlex Sierra * Enables/disables XGMI P2P interface (0 = disable, 1 = enable).
746158a05a0SAlex Sierra */
747158a05a0SAlex Sierra MODULE_PARM_DESC(use_xgmi_p2p,
748158a05a0SAlex Sierra "Enable XGMI P2P interface (0 = disable; 1 = enable (default))");
749158a05a0SAlex Sierra module_param_named(use_xgmi_p2p, amdgpu_use_xgmi_p2p, int, 0444);
7504e66d7d2SYong Zhao
7514e66d7d2SYong Zhao
7522690262eSAmber Lin #ifdef CONFIG_HSA_AMD
753521fb7d0SAmber Lin /**
754521fb7d0SAmber Lin * DOC: sched_policy (int)
755521fb7d0SAmber Lin * Set scheduling policy. Default is HWS(hardware scheduling) with over-subscription.
756521fb7d0SAmber Lin * Setting 1 disables over-subscription. Setting 2 disables HWS and statically
757521fb7d0SAmber Lin * assigns queues to HQDs.
758521fb7d0SAmber Lin */
7592690262eSAmber Lin int sched_policy = KFD_SCHED_POLICY_HWS;
760f2935a30SKent Russell module_param_unsafe(sched_policy, int, 0444);
761521fb7d0SAmber Lin MODULE_PARM_DESC(sched_policy,
762521fb7d0SAmber Lin "Scheduling policy (0 = HWS (Default), 1 = HWS without over-subscription, 2 = Non-HWS (Used for debugging only)");
763521fb7d0SAmber Lin
764521fb7d0SAmber Lin /**
765521fb7d0SAmber Lin * DOC: hws_max_conc_proc (int)
766521fb7d0SAmber Lin * Maximum number of processes that HWS can schedule concurrently. The maximum is the
767521fb7d0SAmber Lin * number of VMIDs assigned to the HWS, which is also the default.
768521fb7d0SAmber Lin */
769b7dfbd2eSTushar Patel int hws_max_conc_proc = -1;
770521fb7d0SAmber Lin module_param(hws_max_conc_proc, int, 0444);
771521fb7d0SAmber Lin MODULE_PARM_DESC(hws_max_conc_proc,
772521fb7d0SAmber Lin "Max # processes HWS can execute concurrently when sched_policy=0 (0 = no concurrency, #VMIDs for KFD = Maximum(default))");
773521fb7d0SAmber Lin
774521fb7d0SAmber Lin /**
775521fb7d0SAmber Lin * DOC: cwsr_enable (int)
776521fb7d0SAmber Lin * CWSR(compute wave store and resume) allows the GPU to preempt shader execution in
777521fb7d0SAmber Lin * the middle of a compute wave. Default is 1 to enable this feature. Setting 0
778521fb7d0SAmber Lin * disables it.
779521fb7d0SAmber Lin */
7802690262eSAmber Lin int cwsr_enable = 1;
781521fb7d0SAmber Lin module_param(cwsr_enable, int, 0444);
782521fb7d0SAmber Lin MODULE_PARM_DESC(cwsr_enable, "CWSR enable (0 = Off, 1 = On (Default))");
783521fb7d0SAmber Lin
784521fb7d0SAmber Lin /**
785521fb7d0SAmber Lin * DOC: max_num_of_queues_per_device (int)
786521fb7d0SAmber Lin * Maximum number of queues per device. Valid setting is between 1 and 4096. Default
787521fb7d0SAmber Lin * is 4096.
788521fb7d0SAmber Lin */
7892690262eSAmber Lin int max_num_of_queues_per_device = KFD_MAX_NUM_OF_QUEUES_PER_DEVICE_DEFAULT;
790521fb7d0SAmber Lin module_param(max_num_of_queues_per_device, int, 0444);
791521fb7d0SAmber Lin MODULE_PARM_DESC(max_num_of_queues_per_device,
792521fb7d0SAmber Lin "Maximum number of supported queues per device (1 = Minimum, 4096 = default)");
793521fb7d0SAmber Lin
794521fb7d0SAmber Lin /**
795521fb7d0SAmber Lin * DOC: send_sigterm (int)
796521fb7d0SAmber Lin * Send sigterm to HSA process on unhandled exceptions. Default is not to send sigterm
797521fb7d0SAmber Lin * but just print errors on dmesg. Setting 1 enables sending sigterm.
798521fb7d0SAmber Lin */
7992690262eSAmber Lin int send_sigterm;
800521fb7d0SAmber Lin module_param(send_sigterm, int, 0444);
801521fb7d0SAmber Lin MODULE_PARM_DESC(send_sigterm,
802521fb7d0SAmber Lin "Send sigterm to HSA process on unhandled exception (0 = disable, 1 = enable)");
803521fb7d0SAmber Lin
804521fb7d0SAmber Lin /**
805521fb7d0SAmber Lin * DOC: halt_if_hws_hang (int)
806521fb7d0SAmber Lin * Halt if HWS hang is detected. Default value, 0, disables the halt on hang.
807521fb7d0SAmber Lin * Setting 1 enables halt on hang.
808521fb7d0SAmber Lin */
8092690262eSAmber Lin int halt_if_hws_hang;
810f2935a30SKent Russell module_param_unsafe(halt_if_hws_hang, int, 0644);
811521fb7d0SAmber Lin MODULE_PARM_DESC(halt_if_hws_hang, "Halt if HWS hang is detected (0 = off (default), 1 = on)");
81229e76462SOak Zeng
81329e76462SOak Zeng /**
81429e76462SOak Zeng * DOC: hws_gws_support(bool)
81529633d0eSJoseph Greathouse * Assume that HWS supports GWS barriers regardless of what firmware version
81629633d0eSJoseph Greathouse * check says. Default value: false (rely on MEC2 firmware version check).
81729e76462SOak Zeng */
81829e76462SOak Zeng bool hws_gws_support;
819f2935a30SKent Russell module_param_unsafe(hws_gws_support, bool, 0444);
82029633d0eSJoseph Greathouse MODULE_PARM_DESC(hws_gws_support, "Assume MEC2 FW supports GWS barriers (false = rely on FW version check (Default), true = force supported)");
82114328aa5SPhilip Cox
82214328aa5SPhilip Cox /**
82314328aa5SPhilip Cox * DOC: queue_preemption_timeout_ms (int)
82414328aa5SPhilip Cox * queue preemption timeout in ms (1 = Minimum, 9000 = default)
82514328aa5SPhilip Cox */
826f51af435SOak Zeng int queue_preemption_timeout_ms = 9000;
82714328aa5SPhilip Cox module_param(queue_preemption_timeout_ms, int, 0644);
82814328aa5SPhilip Cox MODULE_PARM_DESC(queue_preemption_timeout_ms, "queue preemption timeout in ms (1 = Minimum, 9000 = default)");
829b2057956SFelix Kuehling
830b2057956SFelix Kuehling /**
831b2057956SFelix Kuehling * DOC: debug_evictions(bool)
832b2057956SFelix Kuehling * Enable extra debug messages to help determine the cause of evictions
833b2057956SFelix Kuehling */
834b2057956SFelix Kuehling bool debug_evictions;
835b2057956SFelix Kuehling module_param(debug_evictions, bool, 0644);
836b2057956SFelix Kuehling MODULE_PARM_DESC(debug_evictions, "enable eviction debug messages (false = default)");
837b80f050fSPhilip Yang
838b80f050fSPhilip Yang /**
839b80f050fSPhilip Yang * DOC: no_system_mem_limit(bool)
840b80f050fSPhilip Yang * Disable system memory limit, to support multiple process shared memory
841b80f050fSPhilip Yang */
842b80f050fSPhilip Yang bool no_system_mem_limit;
843b80f050fSPhilip Yang module_param(no_system_mem_limit, bool, 0644);
844b80f050fSPhilip Yang MODULE_PARM_DESC(no_system_mem_limit, "disable system memory limit (false = default)");
845b80f050fSPhilip Yang
8466d909c5dSOak Zeng /**
8476d909c5dSOak Zeng * DOC: no_queue_eviction_on_vm_fault (int)
8486d909c5dSOak Zeng * If set, process queues will not be evicted on gpuvm fault. This is to keep the wavefront context for debugging (0 = queue eviction, 1 = no queue eviction). The default is 0 (queue eviction).
8496d909c5dSOak Zeng */
850120ceaf7SSrinivasan Shanmugam int amdgpu_no_queue_eviction_on_vm_fault;
8516d909c5dSOak Zeng MODULE_PARM_DESC(no_queue_eviction_on_vm_fault, "No queue eviction on VM fault (0 = queue eviction, 1 = no queue eviction)");
852f2935a30SKent Russell module_param_named_unsafe(no_queue_eviction_on_vm_fault, amdgpu_no_queue_eviction_on_vm_fault, int, 0444);
8532690262eSAmber Lin #endif
854521fb7d0SAmber Lin
8557875a226SAlex Deucher /**
85676eb9c95SDavid Francis * DOC: mtype_local (int)
857895797d9SGraham Sider */
85876eb9c95SDavid Francis int amdgpu_mtype_local;
859b9cbd510SGraham Sider MODULE_PARM_DESC(mtype_local, "MTYPE for local memory (0 = MTYPE_RW (default), 1 = MTYPE_NC, 2 = MTYPE_CC)");
860f2935a30SKent Russell module_param_named_unsafe(mtype_local, amdgpu_mtype_local, int, 0444);
861895797d9SGraham Sider
862895797d9SGraham Sider /**
86308a2fd23SRamesh Errabolu * DOC: pcie_p2p (bool)
86408a2fd23SRamesh Errabolu * Enable PCIe P2P (requires large-BAR). Default value: true (on)
86508a2fd23SRamesh Errabolu */
86608a2fd23SRamesh Errabolu #ifdef CONFIG_HSA_AMD_P2P
86708a2fd23SRamesh Errabolu bool pcie_p2p = true;
86808a2fd23SRamesh Errabolu module_param(pcie_p2p, bool, 0444);
86908a2fd23SRamesh Errabolu MODULE_PARM_DESC(pcie_p2p, "Enable PCIe P2P (requires large-BAR). (N = off, Y = on(default))");
87008a2fd23SRamesh Errabolu #endif
87108a2fd23SRamesh Errabolu
87208a2fd23SRamesh Errabolu /**
8737875a226SAlex Deucher * DOC: dcfeaturemask (uint)
8747875a226SAlex Deucher * Override display features enabled. See enum DC_FEATURE_MASK in drivers/gpu/drm/amd/include/amd_shared.h.
8757875a226SAlex Deucher * The default is the current set of stable display features.
8767875a226SAlex Deucher */
8777875a226SAlex Deucher MODULE_PARM_DESC(dcfeaturemask, "all stable DC features enabled (default))");
8787875a226SAlex Deucher module_param_named(dcfeaturemask, amdgpu_dc_feature_mask, uint, 0444);
8797875a226SAlex Deucher
880ad4de27fSNicholas Kazlauskas /**
8818a791dabSHarry Wentland * DOC: dcdebugmask (uint)
8828a791dabSHarry Wentland * Override display features enabled. See enum DC_DEBUG_MASK in drivers/gpu/drm/amd/include/amd_shared.h.
8838a791dabSHarry Wentland */
8848a791dabSHarry Wentland MODULE_PARM_DESC(dcdebugmask, "all debug options disabled (default))");
8858a791dabSHarry Wentland module_param_named(dcdebugmask, amdgpu_dc_debug_mask, uint, 0444);
8868a791dabSHarry Wentland
887792a0cddSLeo Li MODULE_PARM_DESC(visualconfirm, "Visual confirm (0 = off (default), 1 = MPO, 5 = PSR)");
888792a0cddSLeo Li module_param_named(visualconfirm, amdgpu_dc_visual_confirm, uint, 0444);
889792a0cddSLeo Li
8908a791dabSHarry Wentland /**
891ad4de27fSNicholas Kazlauskas * DOC: abmlevel (uint)
892ad4de27fSNicholas Kazlauskas * Override the default ABM (Adaptive Backlight Management) level used for DC
893ad4de27fSNicholas Kazlauskas * enabled hardware. Requires DMCU to be supported and loaded.
894ad4de27fSNicholas Kazlauskas * Valid levels are 0-4. A value of 0 indicates that ABM should be disabled by
895ad4de27fSNicholas Kazlauskas * default. Values 1-4 control the maximum allowable brightness reduction via
896ad4de27fSNicholas Kazlauskas * the ABM algorithm, with 1 being the least reduction and 4 being the most
897ad4de27fSNicholas Kazlauskas * reduction.
898ad4de27fSNicholas Kazlauskas *
8990174c079S[email protected] * Defaults to -1, or auto. Userspace can only override this level after
900040fdcdeSHamza Mahfooz * boot if it's set to auto.
901ad4de27fSNicholas Kazlauskas */
902040fdcdeSHamza Mahfooz int amdgpu_dm_abm_level = -1;
903040fdcdeSHamza Mahfooz MODULE_PARM_DESC(abmlevel,
904040fdcdeSHamza Mahfooz "ABM level (0 = off, 1-4 = backlight reduction level, -1 auto (default))");
905040fdcdeSHamza Mahfooz module_param_named(abmlevel, amdgpu_dm_abm_level, int, 0444);
906ad4de27fSNicholas Kazlauskas
9077a46f05eSTakashi Iwai int amdgpu_backlight = -1;
9087a46f05eSTakashi Iwai MODULE_PARM_DESC(backlight, "Backlight control (0 = pwm, 1 = aux, -1 auto (default))");
9097a46f05eSTakashi Iwai module_param_named(backlight, amdgpu_backlight, bint, 0444);
9107a46f05eSTakashi Iwai
911d7ccb38dSHuang Rui /**
912fc184dbeSHamza Mahfooz * DOC: damageclips (int)
913fc184dbeSHamza Mahfooz * Enable or disable damage clips support. If damage clips support is disabled,
914fc184dbeSHamza Mahfooz * we will force full frame updates, irrespective of what user space sends to
915fc184dbeSHamza Mahfooz * us.
916fc184dbeSHamza Mahfooz *
917fc184dbeSHamza Mahfooz * Defaults to -1 (where it is enabled unless a PSR-SU display is detected).
918fc184dbeSHamza Mahfooz */
919fc184dbeSHamza Mahfooz MODULE_PARM_DESC(damageclips,
920fc184dbeSHamza Mahfooz "Damage clips support (0 = disable, 1 = enable, -1 auto (default))");
921fc184dbeSHamza Mahfooz module_param_named(damageclips, amdgpu_damage_clips, int, 0444);
922fc184dbeSHamza Mahfooz
923fc184dbeSHamza Mahfooz /**
924d7ccb38dSHuang Rui * DOC: tmz (int)
925d7ccb38dSHuang Rui * Trusted Memory Zone (TMZ) is a method to protect data being written
926d7ccb38dSHuang Rui * to or read from memory.
927d7ccb38dSHuang Rui *
928d7ccb38dSHuang Rui * The default value: 0 (off). TODO: change to auto till it is completed.
929d7ccb38dSHuang Rui */
93058aa7790SAlex Deucher MODULE_PARM_DESC(tmz, "Enable TMZ feature (-1 = auto (default), 0 = off, 1 = on)");
931d7ccb38dSHuang Rui module_param_named(tmz, amdgpu_tmz, int, 0444);
932d7ccb38dSHuang Rui
933273da6ffSWenhui Sheng /**
934959143daSAlex Deucher * DOC: freesync_video (uint)
935959143daSAlex Deucher * Enable the optimization to adjust front porch timing to achieve seamless
936959143daSAlex Deucher * mode change experience when setting a freesync supported mode for which full
937959143daSAlex Deucher * modeset is not needed.
938959143daSAlex Deucher *
939959143daSAlex Deucher * The Display Core will add a set of modes derived from the base FreeSync
940959143daSAlex Deucher * video mode into the corresponding connector's mode list based on commonly
941959143daSAlex Deucher * used refresh rates and VRR range of the connected display, when users enable
942959143daSAlex Deucher * this feature. From the userspace perspective, they can see a seamless mode
943959143daSAlex Deucher * change experience when the change between different refresh rates under the
944959143daSAlex Deucher * same resolution. Additionally, userspace applications such as Video playback
945959143daSAlex Deucher * can read this modeset list and change the refresh rate based on the video
946959143daSAlex Deucher * frame rate. Finally, the userspace can also derive an appropriate mode for a
947959143daSAlex Deucher * particular refresh rate based on the FreeSync Mode and add it to the
948959143daSAlex Deucher * connector's mode list.
949959143daSAlex Deucher *
950959143daSAlex Deucher * Note: This is an experimental feature.
951959143daSAlex Deucher *
952959143daSAlex Deucher * The default value: 0 (off).
953959143daSAlex Deucher */
954959143daSAlex Deucher MODULE_PARM_DESC(
955959143daSAlex Deucher freesync_video,
956959143daSAlex Deucher "Enable freesync modesetting optimization feature (0 = off (default), 1 = on)");
957959143daSAlex Deucher module_param_named(freesync_video, amdgpu_freesync_vid_mode, uint, 0444);
958959143daSAlex Deucher
959959143daSAlex Deucher /**
960273da6ffSWenhui Sheng * DOC: reset_method (int)
9612656fd23SAndrey Grodzovsky * GPU reset method (-1 = auto (default), 0 = legacy, 1 = mode0, 2 = mode1, 3 = mode2, 4 = baco)
962273da6ffSWenhui Sheng */
9632656fd23SAndrey Grodzovsky MODULE_PARM_DESC(reset_method, "GPU reset method (-1 = auto (default), 0 = legacy, 1 = mode0, 2 = mode1, 3 = mode2, 4 = baco/bamaco)");
964177b76a8SChristian König module_param_named_unsafe(reset_method, amdgpu_reset_method, int, 0644);
965273da6ffSWenhui Sheng
966acc0204cSGuchun Chen /**
967e4e6a589SLuben Tuikov * DOC: bad_page_threshold (int) Bad page threshold is specifies the
968e4e6a589SLuben Tuikov * threshold value of faulty pages detected by RAS ECC, which may
969e4e6a589SLuben Tuikov * result in the GPU entering bad status when the number of total
970e4e6a589SLuben Tuikov * faulty pages by ECC exceeds the threshold value.
971acc0204cSGuchun Chen */
97216b85a09SHawking Zhang MODULE_PARM_DESC(bad_page_threshold, "Bad page threshold(-1 = ignore threshold (default value), 0 = disable bad page retirement, -2 = threshold determined by a formula, 0 < threshold < max records, user-defined threshold)");
973acc0204cSGuchun Chen module_param_named(bad_page_threshold, amdgpu_bad_page_threshold, int, 0444);
974acc0204cSGuchun Chen
975a300de40SMonk Liu MODULE_PARM_DESC(num_kcq, "number of kernel compute queue user want to setup (8 if set to greater than 8 or less than 0, only affect gfx 8+)");
976a300de40SMonk Liu module_param_named(num_kcq, amdgpu_num_kcq, int, 0444);
977a300de40SMonk Liu
9788738a82bSLijo Lazar /**
97911eb648dSRuijing Dong * DOC: vcnfw_log (int)
98011eb648dSRuijing Dong * Enable vcnfw log output for debugging, the default is disabled.
98111eb648dSRuijing Dong */
98211eb648dSRuijing Dong MODULE_PARM_DESC(vcnfw_log, "Enable vcnfw log(0 = disable (default value), 1 = enable)");
98311eb648dSRuijing Dong module_param_named(vcnfw_log, amdgpu_vcnfw_log, int, 0444);
98411eb648dSRuijing Dong
98511eb648dSRuijing Dong /**
986bf0207e1SAlex Deucher * DOC: sg_display (int)
987bf0207e1SAlex Deucher * Disable S/G (scatter/gather) display (i.e., display from system memory).
988bf0207e1SAlex Deucher * This option is only relevant on APUs. Set this option to 0 to disable
989bf0207e1SAlex Deucher * S/G display if you experience flickering or other issues under memory
990bf0207e1SAlex Deucher * pressure and report the issue.
991bf0207e1SAlex Deucher */
992bf0207e1SAlex Deucher MODULE_PARM_DESC(sg_display, "S/G Display (-1 = auto (default), 0 = disable)");
993bf0207e1SAlex Deucher module_param_named(sg_display, amdgpu_sg_display, int, 0444);
994bf0207e1SAlex Deucher
995bf0207e1SAlex Deucher /**
996eebb06d1SLang Yu * DOC: umsch_mm (int)
997eebb06d1SLang Yu * Enable Multi Media User Mode Scheduler. This is a HW scheduling engine for VCN and VPE.
998eebb06d1SLang Yu * (0 = disabled (default), 1 = enabled)
999eebb06d1SLang Yu */
1000eebb06d1SLang Yu MODULE_PARM_DESC(umsch_mm,
1001eebb06d1SLang Yu "Enable Multi Media User Mode Scheduler (0 = disabled (default), 1 = enabled)");
1002eebb06d1SLang Yu module_param_named(umsch_mm, amdgpu_umsch_mm, int, 0444);
1003eebb06d1SLang Yu
1004eebb06d1SLang Yu /**
100598a2e3a0SSaleemkhan Jamadar * DOC: umsch_mm_fwlog (int)
100698a2e3a0SSaleemkhan Jamadar * Enable umschfw log output for debugging, the default is disabled.
100798a2e3a0SSaleemkhan Jamadar */
100898a2e3a0SSaleemkhan Jamadar MODULE_PARM_DESC(umsch_mm_fwlog, "Enable umschfw log(0 = disable (default value), 1 = enable)");
100998a2e3a0SSaleemkhan Jamadar module_param_named(umsch_mm_fwlog, amdgpu_umsch_mm_fwlog, int, 0444);
101098a2e3a0SSaleemkhan Jamadar
101198a2e3a0SSaleemkhan Jamadar /**
10128738a82bSLijo Lazar * DOC: smu_pptable_id (int)
10138738a82bSLijo Lazar * Used to override pptable id. id = 0 use VBIOS pptable.
10148738a82bSLijo Lazar * id > 0 use the soft pptable with specicfied id.
10158738a82bSLijo Lazar */
10168738a82bSLijo Lazar MODULE_PARM_DESC(smu_pptable_id,
10178738a82bSLijo Lazar "specify pptable id to be used (-1 = auto(default) value, 0 = use pptable from vbios, > 0 = soft pptable id)");
10188738a82bSLijo Lazar module_param_named(smu_pptable_id, amdgpu_smu_pptable_id, int, 0444);
10198738a82bSLijo Lazar
10200fa49d10SShiwu Zhang /**
10210fa49d10SShiwu Zhang * DOC: partition_mode (int)
10220fa49d10SShiwu Zhang * Used to override the default SPX mode.
10230fa49d10SShiwu Zhang */
1024570de94bSLijo Lazar MODULE_PARM_DESC(
1025570de94bSLijo Lazar user_partt_mode,
1026570de94bSLijo Lazar "specify partition mode to be used (-2 = AMDGPU_AUTO_COMPUTE_PARTITION_MODE(default value) \
1027570de94bSLijo Lazar 0 = AMDGPU_SPX_PARTITION_MODE, \
10280fa49d10SShiwu Zhang 1 = AMDGPU_DPX_PARTITION_MODE, \
10290fa49d10SShiwu Zhang 2 = AMDGPU_TPX_PARTITION_MODE, \
10300fa49d10SShiwu Zhang 3 = AMDGPU_QPX_PARTITION_MODE, \
10310fa49d10SShiwu Zhang 4 = AMDGPU_CPX_PARTITION_MODE)");
10320fa49d10SShiwu Zhang module_param_named(user_partt_mode, amdgpu_user_partt_mode, uint, 0444);
10330fa49d10SShiwu Zhang
103480e709eeSChong Li
103580e709eeSChong Li /**
103680e709eeSChong Li * DOC: enforce_isolation (bool)
103780e709eeSChong Li * enforce process isolation between graphics and compute via using the same reserved vmid.
103880e709eeSChong Li */
103980e709eeSChong Li module_param(enforce_isolation, bool, 0444);
104080e709eeSChong Li MODULE_PARM_DESC(enforce_isolation, "enforce process isolation between graphics and compute . enforce_isolation = on");
104180e709eeSChong Li
1042887db1e4SAndré Almeida /**
1043e00e5c22SAlex Deucher * DOC: modeset (int)
1044e00e5c22SAlex Deucher * Override nomodeset (1 = override, -1 = auto). The default is -1 (auto).
1045e00e5c22SAlex Deucher */
1046e00e5c22SAlex Deucher MODULE_PARM_DESC(modeset, "Override nomodeset (1 = enable, -1 = auto)");
1047e00e5c22SAlex Deucher module_param_named(modeset, amdgpu_modeset, int, 0444);
1048e00e5c22SAlex Deucher
1049e00e5c22SAlex Deucher /**
10505dc270d3SMario Limonciello * DOC: seamless (int)
10515dc270d3SMario Limonciello * Seamless boot will keep the image on the screen during the boot process.
10525dc270d3SMario Limonciello */
10535dc270d3SMario Limonciello MODULE_PARM_DESC(seamless, "Seamless boot (-1 = auto (default), 0 = disable, 1 = enable)");
10545dc270d3SMario Limonciello module_param_named(seamless, amdgpu_seamless, int, 0444);
10555dc270d3SMario Limonciello
10565dc270d3SMario Limonciello /**
1057887db1e4SAndré Almeida * DOC: debug_mask (uint)
1058887db1e4SAndré Almeida * Debug options for amdgpu, work as a binary mask with the following options:
1059887db1e4SAndré Almeida *
1060887db1e4SAndré Almeida * - 0x1: Debug VM handling
1061887db1e4SAndré Almeida * - 0x2: Enable simulating large-bar capability on non-large bar system. This
1062887db1e4SAndré Almeida * limits the VRAM size reported to ROCm applications to the visible
1063887db1e4SAndré Almeida * size, usually 256MB.
1064ffde7210SAndré Almeida * - 0x4: Disable GPU soft recovery, always do a full reset
1065a7818b15SLijo Lazar * - 0x8: Use VRAM for firmware loading
1066a7818b15SLijo Lazar * - 0x10: Enable ACA based RAS logging
1067a7818b15SLijo Lazar * - 0x20: Enable experimental resets
1068a7818b15SLijo Lazar * - 0x40: Disable ring resets
1069a7818b15SLijo Lazar * - 0x80: Use VRAM for SMU pool
1070887db1e4SAndré Almeida */
1071887db1e4SAndré Almeida MODULE_PARM_DESC(debug_mask, "debug options for amdgpu, disabled by default");
1072177b76a8SChristian König module_param_named_unsafe(debug_mask, amdgpu_debug_mask, uint, 0444);
1073887db1e4SAndré Almeida
10746ba5b613SAlex Deucher /**
10756ba5b613SAlex Deucher * DOC: agp (int)
10766ba5b613SAlex Deucher * Enable the AGP aperture. This provides an aperture in the GPU's internal
10776ba5b613SAlex Deucher * address space for direct access to system memory. Note that these accesses
10786ba5b613SAlex Deucher * are non-snooped, so they are only used for access to uncached memory.
10796ba5b613SAlex Deucher */
10806ba5b613SAlex Deucher MODULE_PARM_DESC(agp, "AGP (-1 = auto (default), 0 = disable, 1 = enable)");
10816ba5b613SAlex Deucher module_param_named(agp, amdgpu_agp, int, 0444);
10826ba5b613SAlex Deucher
1083b8b39de6SEvan Quan /**
1084b8b39de6SEvan Quan * DOC: wbrf (int)
1085b8b39de6SEvan Quan * Enable Wifi RFI interference mitigation feature.
1086b8b39de6SEvan Quan * Due to electrical and mechanical constraints there may be likely interference of
1087b8b39de6SEvan Quan * relatively high-powered harmonics of the (G-)DDR memory clocks with local radio
1088b8b39de6SEvan Quan * module frequency bands used by Wifi 6/6e/7. To mitigate the possible RFI interference,
1089b8b39de6SEvan Quan * with this feature enabled, PMFW will use either “shadowed P-State” or “P-State” based
1090b8b39de6SEvan Quan * on active list of frequencies in-use (to be avoided) as part of initial setting or
1091b8b39de6SEvan Quan * P-state transition. However, there may be potential performance impact with this
1092b8b39de6SEvan Quan * feature enabled.
1093b8b39de6SEvan Quan * (0 = disabled, 1 = enabled, -1 = auto (default setting, will be enabled if supported))
1094b8b39de6SEvan Quan */
1095b8b39de6SEvan Quan MODULE_PARM_DESC(wbrf,
1096b8b39de6SEvan Quan "Enable Wifi RFI interference mitigation (0 = disabled, 1 = enabled, -1 = auto(default)");
1097b8b39de6SEvan Quan module_param_named(wbrf, amdgpu_wbrf, int, 0444);
1098b8b39de6SEvan Quan
1099bdbeb0ddSAlex Deucher /* These devices are not supported by amdgpu.
1100bdbeb0ddSAlex Deucher * They are supported by the mach64, r128, radeon drivers
1101bdbeb0ddSAlex Deucher */
1102bdbeb0ddSAlex Deucher static const u16 amdgpu_unsupported_pciidlist[] = {
1103bdbeb0ddSAlex Deucher /* mach64 */
1104bdbeb0ddSAlex Deucher 0x4354,
1105bdbeb0ddSAlex Deucher 0x4358,
1106bdbeb0ddSAlex Deucher 0x4554,
1107bdbeb0ddSAlex Deucher 0x4742,
1108bdbeb0ddSAlex Deucher 0x4744,
1109bdbeb0ddSAlex Deucher 0x4749,
1110bdbeb0ddSAlex Deucher 0x474C,
1111bdbeb0ddSAlex Deucher 0x474D,
1112bdbeb0ddSAlex Deucher 0x474E,
1113bdbeb0ddSAlex Deucher 0x474F,
1114bdbeb0ddSAlex Deucher 0x4750,
1115bdbeb0ddSAlex Deucher 0x4751,
1116bdbeb0ddSAlex Deucher 0x4752,
1117bdbeb0ddSAlex Deucher 0x4753,
1118bdbeb0ddSAlex Deucher 0x4754,
1119bdbeb0ddSAlex Deucher 0x4755,
1120bdbeb0ddSAlex Deucher 0x4756,
1121bdbeb0ddSAlex Deucher 0x4757,
1122bdbeb0ddSAlex Deucher 0x4758,
1123bdbeb0ddSAlex Deucher 0x4759,
1124bdbeb0ddSAlex Deucher 0x475A,
1125bdbeb0ddSAlex Deucher 0x4C42,
1126bdbeb0ddSAlex Deucher 0x4C44,
1127bdbeb0ddSAlex Deucher 0x4C47,
1128bdbeb0ddSAlex Deucher 0x4C49,
1129bdbeb0ddSAlex Deucher 0x4C4D,
1130bdbeb0ddSAlex Deucher 0x4C4E,
1131bdbeb0ddSAlex Deucher 0x4C50,
1132bdbeb0ddSAlex Deucher 0x4C51,
1133bdbeb0ddSAlex Deucher 0x4C52,
1134bdbeb0ddSAlex Deucher 0x4C53,
1135bdbeb0ddSAlex Deucher 0x5654,
1136bdbeb0ddSAlex Deucher 0x5655,
1137bdbeb0ddSAlex Deucher 0x5656,
1138bdbeb0ddSAlex Deucher /* r128 */
1139bdbeb0ddSAlex Deucher 0x4c45,
1140bdbeb0ddSAlex Deucher 0x4c46,
1141bdbeb0ddSAlex Deucher 0x4d46,
1142bdbeb0ddSAlex Deucher 0x4d4c,
1143bdbeb0ddSAlex Deucher 0x5041,
1144bdbeb0ddSAlex Deucher 0x5042,
1145bdbeb0ddSAlex Deucher 0x5043,
1146bdbeb0ddSAlex Deucher 0x5044,
1147bdbeb0ddSAlex Deucher 0x5045,
1148bdbeb0ddSAlex Deucher 0x5046,
1149bdbeb0ddSAlex Deucher 0x5047,
1150bdbeb0ddSAlex Deucher 0x5048,
1151bdbeb0ddSAlex Deucher 0x5049,
1152bdbeb0ddSAlex Deucher 0x504A,
1153bdbeb0ddSAlex Deucher 0x504B,
1154bdbeb0ddSAlex Deucher 0x504C,
1155bdbeb0ddSAlex Deucher 0x504D,
1156bdbeb0ddSAlex Deucher 0x504E,
1157bdbeb0ddSAlex Deucher 0x504F,
1158bdbeb0ddSAlex Deucher 0x5050,
1159bdbeb0ddSAlex Deucher 0x5051,
1160bdbeb0ddSAlex Deucher 0x5052,
1161bdbeb0ddSAlex Deucher 0x5053,
1162bdbeb0ddSAlex Deucher 0x5054,
1163bdbeb0ddSAlex Deucher 0x5055,
1164bdbeb0ddSAlex Deucher 0x5056,
1165bdbeb0ddSAlex Deucher 0x5057,
1166bdbeb0ddSAlex Deucher 0x5058,
1167bdbeb0ddSAlex Deucher 0x5245,
1168bdbeb0ddSAlex Deucher 0x5246,
1169bdbeb0ddSAlex Deucher 0x5247,
1170bdbeb0ddSAlex Deucher 0x524b,
1171bdbeb0ddSAlex Deucher 0x524c,
1172bdbeb0ddSAlex Deucher 0x534d,
1173bdbeb0ddSAlex Deucher 0x5446,
1174bdbeb0ddSAlex Deucher 0x544C,
1175bdbeb0ddSAlex Deucher 0x5452,
1176bdbeb0ddSAlex Deucher /* radeon */
1177bdbeb0ddSAlex Deucher 0x3150,
1178bdbeb0ddSAlex Deucher 0x3151,
1179bdbeb0ddSAlex Deucher 0x3152,
1180bdbeb0ddSAlex Deucher 0x3154,
1181bdbeb0ddSAlex Deucher 0x3155,
1182bdbeb0ddSAlex Deucher 0x3E50,
1183bdbeb0ddSAlex Deucher 0x3E54,
1184bdbeb0ddSAlex Deucher 0x4136,
1185bdbeb0ddSAlex Deucher 0x4137,
1186bdbeb0ddSAlex Deucher 0x4144,
1187bdbeb0ddSAlex Deucher 0x4145,
1188bdbeb0ddSAlex Deucher 0x4146,
1189bdbeb0ddSAlex Deucher 0x4147,
1190bdbeb0ddSAlex Deucher 0x4148,
1191bdbeb0ddSAlex Deucher 0x4149,
1192bdbeb0ddSAlex Deucher 0x414A,
1193bdbeb0ddSAlex Deucher 0x414B,
1194bdbeb0ddSAlex Deucher 0x4150,
1195bdbeb0ddSAlex Deucher 0x4151,
1196bdbeb0ddSAlex Deucher 0x4152,
1197bdbeb0ddSAlex Deucher 0x4153,
1198bdbeb0ddSAlex Deucher 0x4154,
1199bdbeb0ddSAlex Deucher 0x4155,
1200bdbeb0ddSAlex Deucher 0x4156,
1201bdbeb0ddSAlex Deucher 0x4237,
1202bdbeb0ddSAlex Deucher 0x4242,
1203bdbeb0ddSAlex Deucher 0x4336,
1204bdbeb0ddSAlex Deucher 0x4337,
1205bdbeb0ddSAlex Deucher 0x4437,
1206bdbeb0ddSAlex Deucher 0x4966,
1207bdbeb0ddSAlex Deucher 0x4967,
1208bdbeb0ddSAlex Deucher 0x4A48,
1209bdbeb0ddSAlex Deucher 0x4A49,
1210bdbeb0ddSAlex Deucher 0x4A4A,
1211bdbeb0ddSAlex Deucher 0x4A4B,
1212bdbeb0ddSAlex Deucher 0x4A4C,
1213bdbeb0ddSAlex Deucher 0x4A4D,
1214bdbeb0ddSAlex Deucher 0x4A4E,
1215bdbeb0ddSAlex Deucher 0x4A4F,
1216bdbeb0ddSAlex Deucher 0x4A50,
1217bdbeb0ddSAlex Deucher 0x4A54,
1218bdbeb0ddSAlex Deucher 0x4B48,
1219bdbeb0ddSAlex Deucher 0x4B49,
1220bdbeb0ddSAlex Deucher 0x4B4A,
1221bdbeb0ddSAlex Deucher 0x4B4B,
1222bdbeb0ddSAlex Deucher 0x4B4C,
1223bdbeb0ddSAlex Deucher 0x4C57,
1224bdbeb0ddSAlex Deucher 0x4C58,
1225bdbeb0ddSAlex Deucher 0x4C59,
1226bdbeb0ddSAlex Deucher 0x4C5A,
1227bdbeb0ddSAlex Deucher 0x4C64,
1228bdbeb0ddSAlex Deucher 0x4C66,
1229bdbeb0ddSAlex Deucher 0x4C67,
1230bdbeb0ddSAlex Deucher 0x4E44,
1231bdbeb0ddSAlex Deucher 0x4E45,
1232bdbeb0ddSAlex Deucher 0x4E46,
1233bdbeb0ddSAlex Deucher 0x4E47,
1234bdbeb0ddSAlex Deucher 0x4E48,
1235bdbeb0ddSAlex Deucher 0x4E49,
1236bdbeb0ddSAlex Deucher 0x4E4A,
1237bdbeb0ddSAlex Deucher 0x4E4B,
1238bdbeb0ddSAlex Deucher 0x4E50,
1239bdbeb0ddSAlex Deucher 0x4E51,
1240bdbeb0ddSAlex Deucher 0x4E52,
1241bdbeb0ddSAlex Deucher 0x4E53,
1242bdbeb0ddSAlex Deucher 0x4E54,
1243bdbeb0ddSAlex Deucher 0x4E56,
1244bdbeb0ddSAlex Deucher 0x5144,
1245bdbeb0ddSAlex Deucher 0x5145,
1246bdbeb0ddSAlex Deucher 0x5146,
1247bdbeb0ddSAlex Deucher 0x5147,
1248bdbeb0ddSAlex Deucher 0x5148,
1249bdbeb0ddSAlex Deucher 0x514C,
1250bdbeb0ddSAlex Deucher 0x514D,
1251bdbeb0ddSAlex Deucher 0x5157,
1252bdbeb0ddSAlex Deucher 0x5158,
1253bdbeb0ddSAlex Deucher 0x5159,
1254bdbeb0ddSAlex Deucher 0x515A,
1255bdbeb0ddSAlex Deucher 0x515E,
1256bdbeb0ddSAlex Deucher 0x5460,
1257bdbeb0ddSAlex Deucher 0x5462,
1258bdbeb0ddSAlex Deucher 0x5464,
1259bdbeb0ddSAlex Deucher 0x5548,
1260bdbeb0ddSAlex Deucher 0x5549,
1261bdbeb0ddSAlex Deucher 0x554A,
1262bdbeb0ddSAlex Deucher 0x554B,
1263bdbeb0ddSAlex Deucher 0x554C,
1264bdbeb0ddSAlex Deucher 0x554D,
1265bdbeb0ddSAlex Deucher 0x554E,
1266bdbeb0ddSAlex Deucher 0x554F,
1267bdbeb0ddSAlex Deucher 0x5550,
1268bdbeb0ddSAlex Deucher 0x5551,
1269bdbeb0ddSAlex Deucher 0x5552,
1270bdbeb0ddSAlex Deucher 0x5554,
1271bdbeb0ddSAlex Deucher 0x564A,
1272bdbeb0ddSAlex Deucher 0x564B,
1273bdbeb0ddSAlex Deucher 0x564F,
1274bdbeb0ddSAlex Deucher 0x5652,
1275bdbeb0ddSAlex Deucher 0x5653,
1276bdbeb0ddSAlex Deucher 0x5657,
1277bdbeb0ddSAlex Deucher 0x5834,
1278bdbeb0ddSAlex Deucher 0x5835,
1279bdbeb0ddSAlex Deucher 0x5954,
1280bdbeb0ddSAlex Deucher 0x5955,
1281bdbeb0ddSAlex Deucher 0x5974,
1282bdbeb0ddSAlex Deucher 0x5975,
1283bdbeb0ddSAlex Deucher 0x5960,
1284bdbeb0ddSAlex Deucher 0x5961,
1285bdbeb0ddSAlex Deucher 0x5962,
1286bdbeb0ddSAlex Deucher 0x5964,
1287bdbeb0ddSAlex Deucher 0x5965,
1288bdbeb0ddSAlex Deucher 0x5969,
1289bdbeb0ddSAlex Deucher 0x5a41,
1290bdbeb0ddSAlex Deucher 0x5a42,
1291bdbeb0ddSAlex Deucher 0x5a61,
1292bdbeb0ddSAlex Deucher 0x5a62,
1293bdbeb0ddSAlex Deucher 0x5b60,
1294bdbeb0ddSAlex Deucher 0x5b62,
1295bdbeb0ddSAlex Deucher 0x5b63,
1296bdbeb0ddSAlex Deucher 0x5b64,
1297bdbeb0ddSAlex Deucher 0x5b65,
1298bdbeb0ddSAlex Deucher 0x5c61,
1299bdbeb0ddSAlex Deucher 0x5c63,
1300bdbeb0ddSAlex Deucher 0x5d48,
1301bdbeb0ddSAlex Deucher 0x5d49,
1302bdbeb0ddSAlex Deucher 0x5d4a,
1303bdbeb0ddSAlex Deucher 0x5d4c,
1304bdbeb0ddSAlex Deucher 0x5d4d,
1305bdbeb0ddSAlex Deucher 0x5d4e,
1306bdbeb0ddSAlex Deucher 0x5d4f,
1307bdbeb0ddSAlex Deucher 0x5d50,
1308bdbeb0ddSAlex Deucher 0x5d52,
1309bdbeb0ddSAlex Deucher 0x5d57,
1310bdbeb0ddSAlex Deucher 0x5e48,
1311bdbeb0ddSAlex Deucher 0x5e4a,
1312bdbeb0ddSAlex Deucher 0x5e4b,
1313bdbeb0ddSAlex Deucher 0x5e4c,
1314bdbeb0ddSAlex Deucher 0x5e4d,
1315bdbeb0ddSAlex Deucher 0x5e4f,
1316bdbeb0ddSAlex Deucher 0x6700,
1317bdbeb0ddSAlex Deucher 0x6701,
1318bdbeb0ddSAlex Deucher 0x6702,
1319bdbeb0ddSAlex Deucher 0x6703,
1320bdbeb0ddSAlex Deucher 0x6704,
1321bdbeb0ddSAlex Deucher 0x6705,
1322bdbeb0ddSAlex Deucher 0x6706,
1323bdbeb0ddSAlex Deucher 0x6707,
1324bdbeb0ddSAlex Deucher 0x6708,
1325bdbeb0ddSAlex Deucher 0x6709,
1326bdbeb0ddSAlex Deucher 0x6718,
1327bdbeb0ddSAlex Deucher 0x6719,
1328bdbeb0ddSAlex Deucher 0x671c,
1329bdbeb0ddSAlex Deucher 0x671d,
1330bdbeb0ddSAlex Deucher 0x671f,
1331bdbeb0ddSAlex Deucher 0x6720,
1332bdbeb0ddSAlex Deucher 0x6721,
1333bdbeb0ddSAlex Deucher 0x6722,
1334bdbeb0ddSAlex Deucher 0x6723,
1335bdbeb0ddSAlex Deucher 0x6724,
1336bdbeb0ddSAlex Deucher 0x6725,
1337bdbeb0ddSAlex Deucher 0x6726,
1338bdbeb0ddSAlex Deucher 0x6727,
1339bdbeb0ddSAlex Deucher 0x6728,
1340bdbeb0ddSAlex Deucher 0x6729,
1341bdbeb0ddSAlex Deucher 0x6738,
1342bdbeb0ddSAlex Deucher 0x6739,
1343bdbeb0ddSAlex Deucher 0x673e,
1344bdbeb0ddSAlex Deucher 0x6740,
1345bdbeb0ddSAlex Deucher 0x6741,
1346bdbeb0ddSAlex Deucher 0x6742,
1347bdbeb0ddSAlex Deucher 0x6743,
1348bdbeb0ddSAlex Deucher 0x6744,
1349bdbeb0ddSAlex Deucher 0x6745,
1350bdbeb0ddSAlex Deucher 0x6746,
1351bdbeb0ddSAlex Deucher 0x6747,
1352bdbeb0ddSAlex Deucher 0x6748,
1353bdbeb0ddSAlex Deucher 0x6749,
1354bdbeb0ddSAlex Deucher 0x674A,
1355bdbeb0ddSAlex Deucher 0x6750,
1356bdbeb0ddSAlex Deucher 0x6751,
1357bdbeb0ddSAlex Deucher 0x6758,
1358bdbeb0ddSAlex Deucher 0x6759,
1359bdbeb0ddSAlex Deucher 0x675B,
1360bdbeb0ddSAlex Deucher 0x675D,
1361bdbeb0ddSAlex Deucher 0x675F,
1362bdbeb0ddSAlex Deucher 0x6760,
1363bdbeb0ddSAlex Deucher 0x6761,
1364bdbeb0ddSAlex Deucher 0x6762,
1365bdbeb0ddSAlex Deucher 0x6763,
1366bdbeb0ddSAlex Deucher 0x6764,
1367bdbeb0ddSAlex Deucher 0x6765,
1368bdbeb0ddSAlex Deucher 0x6766,
1369bdbeb0ddSAlex Deucher 0x6767,
1370bdbeb0ddSAlex Deucher 0x6768,
1371bdbeb0ddSAlex Deucher 0x6770,
1372bdbeb0ddSAlex Deucher 0x6771,
1373bdbeb0ddSAlex Deucher 0x6772,
1374bdbeb0ddSAlex Deucher 0x6778,
1375bdbeb0ddSAlex Deucher 0x6779,
1376bdbeb0ddSAlex Deucher 0x677B,
1377bdbeb0ddSAlex Deucher 0x6840,
1378bdbeb0ddSAlex Deucher 0x6841,
1379bdbeb0ddSAlex Deucher 0x6842,
1380bdbeb0ddSAlex Deucher 0x6843,
1381bdbeb0ddSAlex Deucher 0x6849,
1382bdbeb0ddSAlex Deucher 0x684C,
1383bdbeb0ddSAlex Deucher 0x6850,
1384bdbeb0ddSAlex Deucher 0x6858,
1385bdbeb0ddSAlex Deucher 0x6859,
1386bdbeb0ddSAlex Deucher 0x6880,
1387bdbeb0ddSAlex Deucher 0x6888,
1388bdbeb0ddSAlex Deucher 0x6889,
1389bdbeb0ddSAlex Deucher 0x688A,
1390bdbeb0ddSAlex Deucher 0x688C,
1391bdbeb0ddSAlex Deucher 0x688D,
1392bdbeb0ddSAlex Deucher 0x6898,
1393bdbeb0ddSAlex Deucher 0x6899,
1394bdbeb0ddSAlex Deucher 0x689b,
1395bdbeb0ddSAlex Deucher 0x689c,
1396bdbeb0ddSAlex Deucher 0x689d,
1397bdbeb0ddSAlex Deucher 0x689e,
1398bdbeb0ddSAlex Deucher 0x68a0,
1399bdbeb0ddSAlex Deucher 0x68a1,
1400bdbeb0ddSAlex Deucher 0x68a8,
1401bdbeb0ddSAlex Deucher 0x68a9,
1402bdbeb0ddSAlex Deucher 0x68b0,
1403bdbeb0ddSAlex Deucher 0x68b8,
1404bdbeb0ddSAlex Deucher 0x68b9,
1405bdbeb0ddSAlex Deucher 0x68ba,
1406bdbeb0ddSAlex Deucher 0x68be,
1407bdbeb0ddSAlex Deucher 0x68bf,
1408bdbeb0ddSAlex Deucher 0x68c0,
1409bdbeb0ddSAlex Deucher 0x68c1,
1410bdbeb0ddSAlex Deucher 0x68c7,
1411bdbeb0ddSAlex Deucher 0x68c8,
1412bdbeb0ddSAlex Deucher 0x68c9,
1413bdbeb0ddSAlex Deucher 0x68d8,
1414bdbeb0ddSAlex Deucher 0x68d9,
1415bdbeb0ddSAlex Deucher 0x68da,
1416bdbeb0ddSAlex Deucher 0x68de,
1417bdbeb0ddSAlex Deucher 0x68e0,
1418bdbeb0ddSAlex Deucher 0x68e1,
1419bdbeb0ddSAlex Deucher 0x68e4,
1420bdbeb0ddSAlex Deucher 0x68e5,
1421bdbeb0ddSAlex Deucher 0x68e8,
1422bdbeb0ddSAlex Deucher 0x68e9,
1423bdbeb0ddSAlex Deucher 0x68f1,
1424bdbeb0ddSAlex Deucher 0x68f2,
1425bdbeb0ddSAlex Deucher 0x68f8,
1426bdbeb0ddSAlex Deucher 0x68f9,
1427bdbeb0ddSAlex Deucher 0x68fa,
1428bdbeb0ddSAlex Deucher 0x68fe,
1429bdbeb0ddSAlex Deucher 0x7100,
1430bdbeb0ddSAlex Deucher 0x7101,
1431bdbeb0ddSAlex Deucher 0x7102,
1432bdbeb0ddSAlex Deucher 0x7103,
1433bdbeb0ddSAlex Deucher 0x7104,
1434bdbeb0ddSAlex Deucher 0x7105,
1435bdbeb0ddSAlex Deucher 0x7106,
1436bdbeb0ddSAlex Deucher 0x7108,
1437bdbeb0ddSAlex Deucher 0x7109,
1438bdbeb0ddSAlex Deucher 0x710A,
1439bdbeb0ddSAlex Deucher 0x710B,
1440bdbeb0ddSAlex Deucher 0x710C,
1441bdbeb0ddSAlex Deucher 0x710E,
1442bdbeb0ddSAlex Deucher 0x710F,
1443bdbeb0ddSAlex Deucher 0x7140,
1444bdbeb0ddSAlex Deucher 0x7141,
1445bdbeb0ddSAlex Deucher 0x7142,
1446bdbeb0ddSAlex Deucher 0x7143,
1447bdbeb0ddSAlex Deucher 0x7144,
1448bdbeb0ddSAlex Deucher 0x7145,
1449bdbeb0ddSAlex Deucher 0x7146,
1450bdbeb0ddSAlex Deucher 0x7147,
1451bdbeb0ddSAlex Deucher 0x7149,
1452bdbeb0ddSAlex Deucher 0x714A,
1453bdbeb0ddSAlex Deucher 0x714B,
1454bdbeb0ddSAlex Deucher 0x714C,
1455bdbeb0ddSAlex Deucher 0x714D,
1456bdbeb0ddSAlex Deucher 0x714E,
1457bdbeb0ddSAlex Deucher 0x714F,
1458bdbeb0ddSAlex Deucher 0x7151,
1459bdbeb0ddSAlex Deucher 0x7152,
1460bdbeb0ddSAlex Deucher 0x7153,
1461bdbeb0ddSAlex Deucher 0x715E,
1462bdbeb0ddSAlex Deucher 0x715F,
1463bdbeb0ddSAlex Deucher 0x7180,
1464bdbeb0ddSAlex Deucher 0x7181,
1465bdbeb0ddSAlex Deucher 0x7183,
1466bdbeb0ddSAlex Deucher 0x7186,
1467bdbeb0ddSAlex Deucher 0x7187,
1468bdbeb0ddSAlex Deucher 0x7188,
1469bdbeb0ddSAlex Deucher 0x718A,
1470bdbeb0ddSAlex Deucher 0x718B,
1471bdbeb0ddSAlex Deucher 0x718C,
1472bdbeb0ddSAlex Deucher 0x718D,
1473bdbeb0ddSAlex Deucher 0x718F,
1474bdbeb0ddSAlex Deucher 0x7193,
1475bdbeb0ddSAlex Deucher 0x7196,
1476bdbeb0ddSAlex Deucher 0x719B,
1477bdbeb0ddSAlex Deucher 0x719F,
1478bdbeb0ddSAlex Deucher 0x71C0,
1479bdbeb0ddSAlex Deucher 0x71C1,
1480bdbeb0ddSAlex Deucher 0x71C2,
1481bdbeb0ddSAlex Deucher 0x71C3,
1482bdbeb0ddSAlex Deucher 0x71C4,
1483bdbeb0ddSAlex Deucher 0x71C5,
1484bdbeb0ddSAlex Deucher 0x71C6,
1485bdbeb0ddSAlex Deucher 0x71C7,
1486bdbeb0ddSAlex Deucher 0x71CD,
1487bdbeb0ddSAlex Deucher 0x71CE,
1488bdbeb0ddSAlex Deucher 0x71D2,
1489bdbeb0ddSAlex Deucher 0x71D4,
1490bdbeb0ddSAlex Deucher 0x71D5,
1491bdbeb0ddSAlex Deucher 0x71D6,
1492bdbeb0ddSAlex Deucher 0x71DA,
1493bdbeb0ddSAlex Deucher 0x71DE,
1494bdbeb0ddSAlex Deucher 0x7200,
1495bdbeb0ddSAlex Deucher 0x7210,
1496bdbeb0ddSAlex Deucher 0x7211,
1497bdbeb0ddSAlex Deucher 0x7240,
1498bdbeb0ddSAlex Deucher 0x7243,
1499bdbeb0ddSAlex Deucher 0x7244,
1500bdbeb0ddSAlex Deucher 0x7245,
1501bdbeb0ddSAlex Deucher 0x7246,
1502bdbeb0ddSAlex Deucher 0x7247,
1503bdbeb0ddSAlex Deucher 0x7248,
1504bdbeb0ddSAlex Deucher 0x7249,
1505bdbeb0ddSAlex Deucher 0x724A,
1506bdbeb0ddSAlex Deucher 0x724B,
1507bdbeb0ddSAlex Deucher 0x724C,
1508bdbeb0ddSAlex Deucher 0x724D,
1509bdbeb0ddSAlex Deucher 0x724E,
1510bdbeb0ddSAlex Deucher 0x724F,
1511bdbeb0ddSAlex Deucher 0x7280,
1512bdbeb0ddSAlex Deucher 0x7281,
1513bdbeb0ddSAlex Deucher 0x7283,
1514bdbeb0ddSAlex Deucher 0x7284,
1515bdbeb0ddSAlex Deucher 0x7287,
1516bdbeb0ddSAlex Deucher 0x7288,
1517bdbeb0ddSAlex Deucher 0x7289,
1518bdbeb0ddSAlex Deucher 0x728B,
1519bdbeb0ddSAlex Deucher 0x728C,
1520bdbeb0ddSAlex Deucher 0x7290,
1521bdbeb0ddSAlex Deucher 0x7291,
1522bdbeb0ddSAlex Deucher 0x7293,
1523bdbeb0ddSAlex Deucher 0x7297,
1524bdbeb0ddSAlex Deucher 0x7834,
1525bdbeb0ddSAlex Deucher 0x7835,
1526bdbeb0ddSAlex Deucher 0x791e,
1527bdbeb0ddSAlex Deucher 0x791f,
1528bdbeb0ddSAlex Deucher 0x793f,
1529bdbeb0ddSAlex Deucher 0x7941,
1530bdbeb0ddSAlex Deucher 0x7942,
1531bdbeb0ddSAlex Deucher 0x796c,
1532bdbeb0ddSAlex Deucher 0x796d,
1533bdbeb0ddSAlex Deucher 0x796e,
1534bdbeb0ddSAlex Deucher 0x796f,
1535bdbeb0ddSAlex Deucher 0x9400,
1536bdbeb0ddSAlex Deucher 0x9401,
1537bdbeb0ddSAlex Deucher 0x9402,
1538bdbeb0ddSAlex Deucher 0x9403,
1539bdbeb0ddSAlex Deucher 0x9405,
1540bdbeb0ddSAlex Deucher 0x940A,
1541bdbeb0ddSAlex Deucher 0x940B,
1542bdbeb0ddSAlex Deucher 0x940F,
1543bdbeb0ddSAlex Deucher 0x94A0,
1544bdbeb0ddSAlex Deucher 0x94A1,
1545bdbeb0ddSAlex Deucher 0x94A3,
1546bdbeb0ddSAlex Deucher 0x94B1,
1547bdbeb0ddSAlex Deucher 0x94B3,
1548bdbeb0ddSAlex Deucher 0x94B4,
1549bdbeb0ddSAlex Deucher 0x94B5,
1550bdbeb0ddSAlex Deucher 0x94B9,
1551bdbeb0ddSAlex Deucher 0x9440,
1552bdbeb0ddSAlex Deucher 0x9441,
1553bdbeb0ddSAlex Deucher 0x9442,
1554bdbeb0ddSAlex Deucher 0x9443,
1555bdbeb0ddSAlex Deucher 0x9444,
1556bdbeb0ddSAlex Deucher 0x9446,
1557bdbeb0ddSAlex Deucher 0x944A,
1558bdbeb0ddSAlex Deucher 0x944B,
1559bdbeb0ddSAlex Deucher 0x944C,
1560bdbeb0ddSAlex Deucher 0x944E,
1561bdbeb0ddSAlex Deucher 0x9450,
1562bdbeb0ddSAlex Deucher 0x9452,
1563bdbeb0ddSAlex Deucher 0x9456,
1564bdbeb0ddSAlex Deucher 0x945A,
1565bdbeb0ddSAlex Deucher 0x945B,
1566bdbeb0ddSAlex Deucher 0x945E,
1567bdbeb0ddSAlex Deucher 0x9460,
1568bdbeb0ddSAlex Deucher 0x9462,
1569bdbeb0ddSAlex Deucher 0x946A,
1570bdbeb0ddSAlex Deucher 0x946B,
1571bdbeb0ddSAlex Deucher 0x947A,
1572bdbeb0ddSAlex Deucher 0x947B,
1573bdbeb0ddSAlex Deucher 0x9480,
1574bdbeb0ddSAlex Deucher 0x9487,
1575bdbeb0ddSAlex Deucher 0x9488,
1576bdbeb0ddSAlex Deucher 0x9489,
1577bdbeb0ddSAlex Deucher 0x948A,
1578bdbeb0ddSAlex Deucher 0x948F,
1579bdbeb0ddSAlex Deucher 0x9490,
1580bdbeb0ddSAlex Deucher 0x9491,
1581bdbeb0ddSAlex Deucher 0x9495,
1582bdbeb0ddSAlex Deucher 0x9498,
1583bdbeb0ddSAlex Deucher 0x949C,
1584bdbeb0ddSAlex Deucher 0x949E,
1585bdbeb0ddSAlex Deucher 0x949F,
1586bdbeb0ddSAlex Deucher 0x94C0,
1587bdbeb0ddSAlex Deucher 0x94C1,
1588bdbeb0ddSAlex Deucher 0x94C3,
1589bdbeb0ddSAlex Deucher 0x94C4,
1590bdbeb0ddSAlex Deucher 0x94C5,
1591bdbeb0ddSAlex Deucher 0x94C6,
1592bdbeb0ddSAlex Deucher 0x94C7,
1593bdbeb0ddSAlex Deucher 0x94C8,
1594bdbeb0ddSAlex Deucher 0x94C9,
1595bdbeb0ddSAlex Deucher 0x94CB,
1596bdbeb0ddSAlex Deucher 0x94CC,
1597bdbeb0ddSAlex Deucher 0x94CD,
1598bdbeb0ddSAlex Deucher 0x9500,
1599bdbeb0ddSAlex Deucher 0x9501,
1600bdbeb0ddSAlex Deucher 0x9504,
1601bdbeb0ddSAlex Deucher 0x9505,
1602bdbeb0ddSAlex Deucher 0x9506,
1603bdbeb0ddSAlex Deucher 0x9507,
1604bdbeb0ddSAlex Deucher 0x9508,
1605bdbeb0ddSAlex Deucher 0x9509,
1606bdbeb0ddSAlex Deucher 0x950F,
1607bdbeb0ddSAlex Deucher 0x9511,
1608bdbeb0ddSAlex Deucher 0x9515,
1609bdbeb0ddSAlex Deucher 0x9517,
1610bdbeb0ddSAlex Deucher 0x9519,
1611bdbeb0ddSAlex Deucher 0x9540,
1612bdbeb0ddSAlex Deucher 0x9541,
1613bdbeb0ddSAlex Deucher 0x9542,
1614bdbeb0ddSAlex Deucher 0x954E,
1615bdbeb0ddSAlex Deucher 0x954F,
1616bdbeb0ddSAlex Deucher 0x9552,
1617bdbeb0ddSAlex Deucher 0x9553,
1618bdbeb0ddSAlex Deucher 0x9555,
1619bdbeb0ddSAlex Deucher 0x9557,
1620bdbeb0ddSAlex Deucher 0x955f,
1621bdbeb0ddSAlex Deucher 0x9580,
1622bdbeb0ddSAlex Deucher 0x9581,
1623bdbeb0ddSAlex Deucher 0x9583,
1624bdbeb0ddSAlex Deucher 0x9586,
1625bdbeb0ddSAlex Deucher 0x9587,
1626bdbeb0ddSAlex Deucher 0x9588,
1627bdbeb0ddSAlex Deucher 0x9589,
1628bdbeb0ddSAlex Deucher 0x958A,
1629bdbeb0ddSAlex Deucher 0x958B,
1630bdbeb0ddSAlex Deucher 0x958C,
1631bdbeb0ddSAlex Deucher 0x958D,
1632bdbeb0ddSAlex Deucher 0x958E,
1633bdbeb0ddSAlex Deucher 0x958F,
1634bdbeb0ddSAlex Deucher 0x9590,
1635bdbeb0ddSAlex Deucher 0x9591,
1636bdbeb0ddSAlex Deucher 0x9593,
1637bdbeb0ddSAlex Deucher 0x9595,
1638bdbeb0ddSAlex Deucher 0x9596,
1639bdbeb0ddSAlex Deucher 0x9597,
1640bdbeb0ddSAlex Deucher 0x9598,
1641bdbeb0ddSAlex Deucher 0x9599,
1642bdbeb0ddSAlex Deucher 0x959B,
1643bdbeb0ddSAlex Deucher 0x95C0,
1644bdbeb0ddSAlex Deucher 0x95C2,
1645bdbeb0ddSAlex Deucher 0x95C4,
1646bdbeb0ddSAlex Deucher 0x95C5,
1647bdbeb0ddSAlex Deucher 0x95C6,
1648bdbeb0ddSAlex Deucher 0x95C7,
1649bdbeb0ddSAlex Deucher 0x95C9,
1650bdbeb0ddSAlex Deucher 0x95CC,
1651bdbeb0ddSAlex Deucher 0x95CD,
1652bdbeb0ddSAlex Deucher 0x95CE,
1653bdbeb0ddSAlex Deucher 0x95CF,
1654bdbeb0ddSAlex Deucher 0x9610,
1655bdbeb0ddSAlex Deucher 0x9611,
1656bdbeb0ddSAlex Deucher 0x9612,
1657bdbeb0ddSAlex Deucher 0x9613,
1658bdbeb0ddSAlex Deucher 0x9614,
1659bdbeb0ddSAlex Deucher 0x9615,
1660bdbeb0ddSAlex Deucher 0x9616,
1661bdbeb0ddSAlex Deucher 0x9640,
1662bdbeb0ddSAlex Deucher 0x9641,
1663bdbeb0ddSAlex Deucher 0x9642,
1664bdbeb0ddSAlex Deucher 0x9643,
1665bdbeb0ddSAlex Deucher 0x9644,
1666bdbeb0ddSAlex Deucher 0x9645,
1667bdbeb0ddSAlex Deucher 0x9647,
1668bdbeb0ddSAlex Deucher 0x9648,
1669bdbeb0ddSAlex Deucher 0x9649,
1670bdbeb0ddSAlex Deucher 0x964a,
1671bdbeb0ddSAlex Deucher 0x964b,
1672bdbeb0ddSAlex Deucher 0x964c,
1673bdbeb0ddSAlex Deucher 0x964e,
1674bdbeb0ddSAlex Deucher 0x964f,
1675bdbeb0ddSAlex Deucher 0x9710,
1676bdbeb0ddSAlex Deucher 0x9711,
1677bdbeb0ddSAlex Deucher 0x9712,
1678bdbeb0ddSAlex Deucher 0x9713,
1679bdbeb0ddSAlex Deucher 0x9714,
1680bdbeb0ddSAlex Deucher 0x9715,
1681bdbeb0ddSAlex Deucher 0x9802,
1682bdbeb0ddSAlex Deucher 0x9803,
1683bdbeb0ddSAlex Deucher 0x9804,
1684bdbeb0ddSAlex Deucher 0x9805,
1685bdbeb0ddSAlex Deucher 0x9806,
1686bdbeb0ddSAlex Deucher 0x9807,
1687bdbeb0ddSAlex Deucher 0x9808,
1688bdbeb0ddSAlex Deucher 0x9809,
1689bdbeb0ddSAlex Deucher 0x980A,
1690bdbeb0ddSAlex Deucher 0x9900,
1691bdbeb0ddSAlex Deucher 0x9901,
1692bdbeb0ddSAlex Deucher 0x9903,
1693bdbeb0ddSAlex Deucher 0x9904,
1694bdbeb0ddSAlex Deucher 0x9905,
1695bdbeb0ddSAlex Deucher 0x9906,
1696bdbeb0ddSAlex Deucher 0x9907,
1697bdbeb0ddSAlex Deucher 0x9908,
1698bdbeb0ddSAlex Deucher 0x9909,
1699bdbeb0ddSAlex Deucher 0x990A,
1700bdbeb0ddSAlex Deucher 0x990B,
1701bdbeb0ddSAlex Deucher 0x990C,
1702bdbeb0ddSAlex Deucher 0x990D,
1703bdbeb0ddSAlex Deucher 0x990E,
1704bdbeb0ddSAlex Deucher 0x990F,
1705bdbeb0ddSAlex Deucher 0x9910,
1706bdbeb0ddSAlex Deucher 0x9913,
1707bdbeb0ddSAlex Deucher 0x9917,
1708bdbeb0ddSAlex Deucher 0x9918,
1709bdbeb0ddSAlex Deucher 0x9919,
1710bdbeb0ddSAlex Deucher 0x9990,
1711bdbeb0ddSAlex Deucher 0x9991,
1712bdbeb0ddSAlex Deucher 0x9992,
1713bdbeb0ddSAlex Deucher 0x9993,
1714bdbeb0ddSAlex Deucher 0x9994,
1715bdbeb0ddSAlex Deucher 0x9995,
1716bdbeb0ddSAlex Deucher 0x9996,
1717bdbeb0ddSAlex Deucher 0x9997,
1718bdbeb0ddSAlex Deucher 0x9998,
1719bdbeb0ddSAlex Deucher 0x9999,
1720bdbeb0ddSAlex Deucher 0x999A,
1721bdbeb0ddSAlex Deucher 0x999B,
1722bdbeb0ddSAlex Deucher 0x999C,
1723bdbeb0ddSAlex Deucher 0x999D,
1724bdbeb0ddSAlex Deucher 0x99A0,
1725bdbeb0ddSAlex Deucher 0x99A2,
1726bdbeb0ddSAlex Deucher 0x99A4,
17279e5a14bcSAlex Deucher /* radeon secondary ids */
17289e5a14bcSAlex Deucher 0x3171,
17299e5a14bcSAlex Deucher 0x3e70,
17309e5a14bcSAlex Deucher 0x4164,
17319e5a14bcSAlex Deucher 0x4165,
17329e5a14bcSAlex Deucher 0x4166,
17339e5a14bcSAlex Deucher 0x4168,
17349e5a14bcSAlex Deucher 0x4170,
17359e5a14bcSAlex Deucher 0x4171,
17369e5a14bcSAlex Deucher 0x4172,
17379e5a14bcSAlex Deucher 0x4173,
17389e5a14bcSAlex Deucher 0x496e,
17399e5a14bcSAlex Deucher 0x4a69,
17409e5a14bcSAlex Deucher 0x4a6a,
17419e5a14bcSAlex Deucher 0x4a6b,
17429e5a14bcSAlex Deucher 0x4a70,
17439e5a14bcSAlex Deucher 0x4a74,
17449e5a14bcSAlex Deucher 0x4b69,
17459e5a14bcSAlex Deucher 0x4b6b,
17469e5a14bcSAlex Deucher 0x4b6c,
17479e5a14bcSAlex Deucher 0x4c6e,
17489e5a14bcSAlex Deucher 0x4e64,
17499e5a14bcSAlex Deucher 0x4e65,
17509e5a14bcSAlex Deucher 0x4e66,
17519e5a14bcSAlex Deucher 0x4e67,
17529e5a14bcSAlex Deucher 0x4e68,
17539e5a14bcSAlex Deucher 0x4e69,
17549e5a14bcSAlex Deucher 0x4e6a,
17559e5a14bcSAlex Deucher 0x4e71,
17569e5a14bcSAlex Deucher 0x4f73,
17579e5a14bcSAlex Deucher 0x5569,
17589e5a14bcSAlex Deucher 0x556b,
17599e5a14bcSAlex Deucher 0x556d,
17609e5a14bcSAlex Deucher 0x556f,
17619e5a14bcSAlex Deucher 0x5571,
17629e5a14bcSAlex Deucher 0x5854,
17639e5a14bcSAlex Deucher 0x5874,
17649e5a14bcSAlex Deucher 0x5940,
17659e5a14bcSAlex Deucher 0x5941,
1766c1ac2ea8SAlex Deucher 0x5b70,
17679e5a14bcSAlex Deucher 0x5b72,
17689e5a14bcSAlex Deucher 0x5b73,
17699e5a14bcSAlex Deucher 0x5b74,
17709e5a14bcSAlex Deucher 0x5b75,
17719e5a14bcSAlex Deucher 0x5d44,
17729e5a14bcSAlex Deucher 0x5d45,
17739e5a14bcSAlex Deucher 0x5d6d,
17749e5a14bcSAlex Deucher 0x5d6f,
17759e5a14bcSAlex Deucher 0x5d72,
17769e5a14bcSAlex Deucher 0x5d77,
17779e5a14bcSAlex Deucher 0x5e6b,
17789e5a14bcSAlex Deucher 0x5e6d,
17799e5a14bcSAlex Deucher 0x7120,
17809e5a14bcSAlex Deucher 0x7124,
17819e5a14bcSAlex Deucher 0x7129,
17829e5a14bcSAlex Deucher 0x712e,
17839e5a14bcSAlex Deucher 0x712f,
17849e5a14bcSAlex Deucher 0x7162,
17859e5a14bcSAlex Deucher 0x7163,
17869e5a14bcSAlex Deucher 0x7166,
17879e5a14bcSAlex Deucher 0x7167,
17889e5a14bcSAlex Deucher 0x7172,
17899e5a14bcSAlex Deucher 0x7173,
17909e5a14bcSAlex Deucher 0x71a0,
17919e5a14bcSAlex Deucher 0x71a1,
17929e5a14bcSAlex Deucher 0x71a3,
17939e5a14bcSAlex Deucher 0x71a7,
17949e5a14bcSAlex Deucher 0x71bb,
17959e5a14bcSAlex Deucher 0x71e0,
17969e5a14bcSAlex Deucher 0x71e1,
17979e5a14bcSAlex Deucher 0x71e2,
17989e5a14bcSAlex Deucher 0x71e6,
17999e5a14bcSAlex Deucher 0x71e7,
18009e5a14bcSAlex Deucher 0x71f2,
18019e5a14bcSAlex Deucher 0x7269,
18029e5a14bcSAlex Deucher 0x726b,
18039e5a14bcSAlex Deucher 0x726e,
18049e5a14bcSAlex Deucher 0x72a0,
18059e5a14bcSAlex Deucher 0x72a8,
18069e5a14bcSAlex Deucher 0x72b1,
18079e5a14bcSAlex Deucher 0x72b3,
18089e5a14bcSAlex Deucher 0x793f,
1809bdbeb0ddSAlex Deucher };
1810bdbeb0ddSAlex Deucher
1811f498d9edSNils Wallménius static const struct pci_device_id pciidlist[] = {
181278fbb685SKen Wang {0x1002, 0x6780, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
181378fbb685SKen Wang {0x1002, 0x6784, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
181478fbb685SKen Wang {0x1002, 0x6788, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
181578fbb685SKen Wang {0x1002, 0x678A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
181678fbb685SKen Wang {0x1002, 0x6790, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
181778fbb685SKen Wang {0x1002, 0x6791, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
181878fbb685SKen Wang {0x1002, 0x6792, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
181978fbb685SKen Wang {0x1002, 0x6798, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
182078fbb685SKen Wang {0x1002, 0x6799, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
182178fbb685SKen Wang {0x1002, 0x679A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
182278fbb685SKen Wang {0x1002, 0x679B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
182378fbb685SKen Wang {0x1002, 0x679E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
182478fbb685SKen Wang {0x1002, 0x679F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
182578fbb685SKen Wang {0x1002, 0x6800, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|AMD_IS_MOBILITY},
182678fbb685SKen Wang {0x1002, 0x6801, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|AMD_IS_MOBILITY},
182778fbb685SKen Wang {0x1002, 0x6802, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|AMD_IS_MOBILITY},
182878fbb685SKen Wang {0x1002, 0x6806, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
182978fbb685SKen Wang {0x1002, 0x6808, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
183078fbb685SKen Wang {0x1002, 0x6809, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
183178fbb685SKen Wang {0x1002, 0x6810, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
183278fbb685SKen Wang {0x1002, 0x6811, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
183378fbb685SKen Wang {0x1002, 0x6816, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
183478fbb685SKen Wang {0x1002, 0x6817, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
183578fbb685SKen Wang {0x1002, 0x6818, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
183678fbb685SKen Wang {0x1002, 0x6819, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
183778fbb685SKen Wang {0x1002, 0x6600, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
183878fbb685SKen Wang {0x1002, 0x6601, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
183978fbb685SKen Wang {0x1002, 0x6602, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
184078fbb685SKen Wang {0x1002, 0x6603, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
184178fbb685SKen Wang {0x1002, 0x6604, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
184278fbb685SKen Wang {0x1002, 0x6605, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
184378fbb685SKen Wang {0x1002, 0x6606, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
184478fbb685SKen Wang {0x1002, 0x6607, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
184578fbb685SKen Wang {0x1002, 0x6608, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND},
184678fbb685SKen Wang {0x1002, 0x6610, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND},
184778fbb685SKen Wang {0x1002, 0x6611, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND},
184878fbb685SKen Wang {0x1002, 0x6613, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND},
184978fbb685SKen Wang {0x1002, 0x6617, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
185078fbb685SKen Wang {0x1002, 0x6620, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
185178fbb685SKen Wang {0x1002, 0x6621, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
185278fbb685SKen Wang {0x1002, 0x6623, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
185378fbb685SKen Wang {0x1002, 0x6631, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND},
185478fbb685SKen Wang {0x1002, 0x6820, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
185578fbb685SKen Wang {0x1002, 0x6821, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
185678fbb685SKen Wang {0x1002, 0x6822, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
185778fbb685SKen Wang {0x1002, 0x6823, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
185878fbb685SKen Wang {0x1002, 0x6824, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
185978fbb685SKen Wang {0x1002, 0x6825, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
186078fbb685SKen Wang {0x1002, 0x6826, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
186178fbb685SKen Wang {0x1002, 0x6827, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
186278fbb685SKen Wang {0x1002, 0x6828, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
186378fbb685SKen Wang {0x1002, 0x6829, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
186478fbb685SKen Wang {0x1002, 0x682A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
186578fbb685SKen Wang {0x1002, 0x682B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
186678fbb685SKen Wang {0x1002, 0x682C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
186778fbb685SKen Wang {0x1002, 0x682D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
186878fbb685SKen Wang {0x1002, 0x682F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
186978fbb685SKen Wang {0x1002, 0x6830, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
187078fbb685SKen Wang {0x1002, 0x6831, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
187178fbb685SKen Wang {0x1002, 0x6835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
187278fbb685SKen Wang {0x1002, 0x6837, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
187378fbb685SKen Wang {0x1002, 0x6838, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
187478fbb685SKen Wang {0x1002, 0x6839, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
187578fbb685SKen Wang {0x1002, 0x683B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
187678fbb685SKen Wang {0x1002, 0x683D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
187778fbb685SKen Wang {0x1002, 0x683F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
187878fbb685SKen Wang {0x1002, 0x6660, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|AMD_IS_MOBILITY},
187978fbb685SKen Wang {0x1002, 0x6663, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|AMD_IS_MOBILITY},
188078fbb685SKen Wang {0x1002, 0x6664, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|AMD_IS_MOBILITY},
188178fbb685SKen Wang {0x1002, 0x6665, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|AMD_IS_MOBILITY},
188278fbb685SKen Wang {0x1002, 0x6667, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|AMD_IS_MOBILITY},
188378fbb685SKen Wang {0x1002, 0x666F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|AMD_IS_MOBILITY},
188489330c39SAlex Deucher /* Kaveri */
18852f7d10b3SJammy Zhou {0x1002, 0x1304, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
18862f7d10b3SJammy Zhou {0x1002, 0x1305, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
18872f7d10b3SJammy Zhou {0x1002, 0x1306, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
18882f7d10b3SJammy Zhou {0x1002, 0x1307, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
18892f7d10b3SJammy Zhou {0x1002, 0x1309, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
18902f7d10b3SJammy Zhou {0x1002, 0x130A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
18912f7d10b3SJammy Zhou {0x1002, 0x130B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
18922f7d10b3SJammy Zhou {0x1002, 0x130C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
18932f7d10b3SJammy Zhou {0x1002, 0x130D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
18942f7d10b3SJammy Zhou {0x1002, 0x130E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
18952f7d10b3SJammy Zhou {0x1002, 0x130F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
18962f7d10b3SJammy Zhou {0x1002, 0x1310, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
18972f7d10b3SJammy Zhou {0x1002, 0x1311, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
18982f7d10b3SJammy Zhou {0x1002, 0x1312, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
18992f7d10b3SJammy Zhou {0x1002, 0x1313, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
19002f7d10b3SJammy Zhou {0x1002, 0x1315, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
19012f7d10b3SJammy Zhou {0x1002, 0x1316, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
19022f7d10b3SJammy Zhou {0x1002, 0x1317, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
19032f7d10b3SJammy Zhou {0x1002, 0x1318, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
19042f7d10b3SJammy Zhou {0x1002, 0x131B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
19052f7d10b3SJammy Zhou {0x1002, 0x131C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
19062f7d10b3SJammy Zhou {0x1002, 0x131D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
190789330c39SAlex Deucher /* Bonaire */
19082f7d10b3SJammy Zhou {0x1002, 0x6640, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE|AMD_IS_MOBILITY},
19092f7d10b3SJammy Zhou {0x1002, 0x6641, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE|AMD_IS_MOBILITY},
19102f7d10b3SJammy Zhou {0x1002, 0x6646, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE|AMD_IS_MOBILITY},
19112f7d10b3SJammy Zhou {0x1002, 0x6647, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE|AMD_IS_MOBILITY},
191289330c39SAlex Deucher {0x1002, 0x6649, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE},
191389330c39SAlex Deucher {0x1002, 0x6650, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE},
191489330c39SAlex Deucher {0x1002, 0x6651, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE},
191589330c39SAlex Deucher {0x1002, 0x6658, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE},
191689330c39SAlex Deucher {0x1002, 0x665c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE},
191789330c39SAlex Deucher {0x1002, 0x665d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE},
1918fb4f1737SAlex Deucher {0x1002, 0x665f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE},
191989330c39SAlex Deucher /* Hawaii */
192089330c39SAlex Deucher {0x1002, 0x67A0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
192189330c39SAlex Deucher {0x1002, 0x67A1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
192289330c39SAlex Deucher {0x1002, 0x67A2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
192389330c39SAlex Deucher {0x1002, 0x67A8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
192489330c39SAlex Deucher {0x1002, 0x67A9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
192589330c39SAlex Deucher {0x1002, 0x67AA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
192689330c39SAlex Deucher {0x1002, 0x67B0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
192789330c39SAlex Deucher {0x1002, 0x67B1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
192889330c39SAlex Deucher {0x1002, 0x67B8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
192989330c39SAlex Deucher {0x1002, 0x67B9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
193089330c39SAlex Deucher {0x1002, 0x67BA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
193189330c39SAlex Deucher {0x1002, 0x67BE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
193289330c39SAlex Deucher /* Kabini */
19332f7d10b3SJammy Zhou {0x1002, 0x9830, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_MOBILITY|AMD_IS_APU},
19342f7d10b3SJammy Zhou {0x1002, 0x9831, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_APU},
19352f7d10b3SJammy Zhou {0x1002, 0x9832, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_MOBILITY|AMD_IS_APU},
19362f7d10b3SJammy Zhou {0x1002, 0x9833, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_APU},
19372f7d10b3SJammy Zhou {0x1002, 0x9834, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_MOBILITY|AMD_IS_APU},
19382f7d10b3SJammy Zhou {0x1002, 0x9835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_APU},
19392f7d10b3SJammy Zhou {0x1002, 0x9836, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_MOBILITY|AMD_IS_APU},
19402f7d10b3SJammy Zhou {0x1002, 0x9837, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_APU},
19412f7d10b3SJammy Zhou {0x1002, 0x9838, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_MOBILITY|AMD_IS_APU},
19422f7d10b3SJammy Zhou {0x1002, 0x9839, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_MOBILITY|AMD_IS_APU},
19432f7d10b3SJammy Zhou {0x1002, 0x983a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_APU},
19442f7d10b3SJammy Zhou {0x1002, 0x983b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_MOBILITY|AMD_IS_APU},
19452f7d10b3SJammy Zhou {0x1002, 0x983c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_APU},
19462f7d10b3SJammy Zhou {0x1002, 0x983d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_APU},
19472f7d10b3SJammy Zhou {0x1002, 0x983e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_APU},
19482f7d10b3SJammy Zhou {0x1002, 0x983f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_APU},
194989330c39SAlex Deucher /* mullins */
19502f7d10b3SJammy Zhou {0x1002, 0x9850, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
19512f7d10b3SJammy Zhou {0x1002, 0x9851, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
19522f7d10b3SJammy Zhou {0x1002, 0x9852, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
19532f7d10b3SJammy Zhou {0x1002, 0x9853, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
19542f7d10b3SJammy Zhou {0x1002, 0x9854, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
19552f7d10b3SJammy Zhou {0x1002, 0x9855, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
19562f7d10b3SJammy Zhou {0x1002, 0x9856, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
19572f7d10b3SJammy Zhou {0x1002, 0x9857, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
19582f7d10b3SJammy Zhou {0x1002, 0x9858, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
19592f7d10b3SJammy Zhou {0x1002, 0x9859, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
19602f7d10b3SJammy Zhou {0x1002, 0x985A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
19612f7d10b3SJammy Zhou {0x1002, 0x985B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
19622f7d10b3SJammy Zhou {0x1002, 0x985C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
19632f7d10b3SJammy Zhou {0x1002, 0x985D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
19642f7d10b3SJammy Zhou {0x1002, 0x985E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
19652f7d10b3SJammy Zhou {0x1002, 0x985F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
19661256a8b8SAlex Deucher /* topaz */
1967dba280b2SAlex Deucher {0x1002, 0x6900, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ},
1968dba280b2SAlex Deucher {0x1002, 0x6901, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ},
1969dba280b2SAlex Deucher {0x1002, 0x6902, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ},
1970dba280b2SAlex Deucher {0x1002, 0x6903, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ},
1971dba280b2SAlex Deucher {0x1002, 0x6907, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ},
19721256a8b8SAlex Deucher /* tonga */
19731256a8b8SAlex Deucher {0x1002, 0x6920, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA},
19741256a8b8SAlex Deucher {0x1002, 0x6921, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA},
19751256a8b8SAlex Deucher {0x1002, 0x6928, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA},
19761f8d9625SAlex Deucher {0x1002, 0x6929, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA},
19771256a8b8SAlex Deucher {0x1002, 0x692B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA},
19781256a8b8SAlex Deucher {0x1002, 0x692F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA},
19791f8d9625SAlex Deucher {0x1002, 0x6930, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA},
19801256a8b8SAlex Deucher {0x1002, 0x6938, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA},
19811256a8b8SAlex Deucher {0x1002, 0x6939, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA},
19822da78e21SDavid Zhang /* fiji */
19832da78e21SDavid Zhang {0x1002, 0x7300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_FIJI},
1984e1d99217SFrank Min {0x1002, 0x730F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_FIJI},
19851256a8b8SAlex Deucher /* carrizo */
19862f7d10b3SJammy Zhou {0x1002, 0x9870, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CARRIZO|AMD_IS_APU},
19872f7d10b3SJammy Zhou {0x1002, 0x9874, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CARRIZO|AMD_IS_APU},
19882f7d10b3SJammy Zhou {0x1002, 0x9875, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CARRIZO|AMD_IS_APU},
19892f7d10b3SJammy Zhou {0x1002, 0x9876, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CARRIZO|AMD_IS_APU},
19902f7d10b3SJammy Zhou {0x1002, 0x9877, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CARRIZO|AMD_IS_APU},
199181b1509aSSamuel Li /* stoney */
199281b1509aSSamuel Li {0x1002, 0x98E4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_STONEY|AMD_IS_APU},
19932cc0c0b5SFlora Cui /* Polaris11 */
19942cc0c0b5SFlora Cui {0x1002, 0x67E0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
199535621b80SFlora Cui {0x1002, 0x67E3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
19962cc0c0b5SFlora Cui {0x1002, 0x67E8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
19972cc0c0b5SFlora Cui {0x1002, 0x67EB, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
199835621b80SFlora Cui {0x1002, 0x67EF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
19992cc0c0b5SFlora Cui {0x1002, 0x67FF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
200035621b80SFlora Cui {0x1002, 0x67E1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
200135621b80SFlora Cui {0x1002, 0x67E7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
200235621b80SFlora Cui {0x1002, 0x67E9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
20032cc0c0b5SFlora Cui /* Polaris10 */
20042cc0c0b5SFlora Cui {0x1002, 0x67C0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
20051dcf4801SFlora Cui {0x1002, 0x67C1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
20061dcf4801SFlora Cui {0x1002, 0x67C2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
20071dcf4801SFlora Cui {0x1002, 0x67C4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
20081dcf4801SFlora Cui {0x1002, 0x67C7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
20097dae6181SJunshan Fang {0x1002, 0x67D0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
20102cc0c0b5SFlora Cui {0x1002, 0x67DF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
20111dcf4801SFlora Cui {0x1002, 0x67C8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
20121dcf4801SFlora Cui {0x1002, 0x67C9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
20131dcf4801SFlora Cui {0x1002, 0x67CA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
20141dcf4801SFlora Cui {0x1002, 0x67CC, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
20151dcf4801SFlora Cui {0x1002, 0x67CF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
201630f3984eSAlex Deucher {0x1002, 0x6FDF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
2017fc8e9c54SJunwei Zhang /* Polaris12 */
2018fc8e9c54SJunwei Zhang {0x1002, 0x6980, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12},
2019fc8e9c54SJunwei Zhang {0x1002, 0x6981, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12},
2020fc8e9c54SJunwei Zhang {0x1002, 0x6985, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12},
2021fc8e9c54SJunwei Zhang {0x1002, 0x6986, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12},
2022fc8e9c54SJunwei Zhang {0x1002, 0x6987, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12},
2023cf8c73afSEvan Quan {0x1002, 0x6995, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12},
20246e88491cSJunshan Fang {0x1002, 0x6997, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12},
2025fc8e9c54SJunwei Zhang {0x1002, 0x699F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12},
2026e9307932SLeo Liu /* VEGAM */
2027e9307932SLeo Liu {0x1002, 0x694C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGAM},
2028e9307932SLeo Liu {0x1002, 0x694E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGAM},
2029f6653a0eSAlex Deucher {0x1002, 0x694F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGAM},
2030ca2f1ccaSJunwei Zhang /* Vega 10 */
2031dfbf0c14SAlex Deucher {0x1002, 0x6860, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
2032dfbf0c14SAlex Deucher {0x1002, 0x6861, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
2033dfbf0c14SAlex Deucher {0x1002, 0x6862, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
2034dfbf0c14SAlex Deucher {0x1002, 0x6863, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
2035dfbf0c14SAlex Deucher {0x1002, 0x6864, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
2036dfbf0c14SAlex Deucher {0x1002, 0x6867, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
2037dfbf0c14SAlex Deucher {0x1002, 0x6868, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
20382244b588SAlex Deucher {0x1002, 0x6869, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
20392244b588SAlex Deucher {0x1002, 0x686a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
20402244b588SAlex Deucher {0x1002, 0x686b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
2041dfbf0c14SAlex Deucher {0x1002, 0x686c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
20422244b588SAlex Deucher {0x1002, 0x686d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
20432244b588SAlex Deucher {0x1002, 0x686e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
20442244b588SAlex Deucher {0x1002, 0x686f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
2045dfbf0c14SAlex Deucher {0x1002, 0x687f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
2046dc53d543SAlex Deucher /* Vega 12 */
2047dc53d543SAlex Deucher {0x1002, 0x69A0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA12},
2048dc53d543SAlex Deucher {0x1002, 0x69A1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA12},
2049dc53d543SAlex Deucher {0x1002, 0x69A2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA12},
2050dc53d543SAlex Deucher {0x1002, 0x69A3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA12},
2051dc53d543SAlex Deucher {0x1002, 0x69AF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA12},
20521204a26eSFeifei Xu /* Vega 20 */
20536dddaeefSAlex Deucher {0x1002, 0x66A0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20},
20546dddaeefSAlex Deucher {0x1002, 0x66A1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20},
20556dddaeefSAlex Deucher {0x1002, 0x66A2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20},
20566dddaeefSAlex Deucher {0x1002, 0x66A3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20},
2057ec5b2020SAlex Deucher {0x1002, 0x66A4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20},
20586dddaeefSAlex Deucher {0x1002, 0x66A7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20},
20596dddaeefSAlex Deucher {0x1002, 0x66AF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20},
2060df515052SChunming Zhou /* Raven */
2061acc34503SAlex Deucher {0x1002, 0x15dd, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RAVEN|AMD_IS_APU},
2062741deadeSAlex Deucher {0x1002, 0x15d8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RAVEN|AMD_IS_APU},
206348c69cdaSFeifei Xu /* Arcturus */
206412c5365eSAlex Deucher {0x1002, 0x738C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS},
206512c5365eSAlex Deucher {0x1002, 0x7388, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS},
206612c5365eSAlex Deucher {0x1002, 0x738E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS},
206712c5365eSAlex Deucher {0x1002, 0x7390, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS},
2068bd1c0fdfSAlex Deucher /* Navi10 */
2069bd1c0fdfSAlex Deucher {0x1002, 0x7310, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
2070bd1c0fdfSAlex Deucher {0x1002, 0x7312, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
2071bd1c0fdfSAlex Deucher {0x1002, 0x7318, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
20724f56d9d4Stiancyin {0x1002, 0x7319, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
2073bd1c0fdfSAlex Deucher {0x1002, 0x731A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
20744f56d9d4Stiancyin {0x1002, 0x731B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
207589428811STianci.Yin {0x1002, 0x731E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
2076bd1c0fdfSAlex Deucher {0x1002, 0x731F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
207726051720SAlex Deucher /* Navi14 */
2078b62d9554SAlex Deucher {0x1002, 0x7340, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI14},
2079b62d9554SAlex Deucher {0x1002, 0x7341, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI14},
2080b62d9554SAlex Deucher {0x1002, 0x7347, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI14},
2081b62d9554SAlex Deucher {0x1002, 0x734F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI14},
2082df515052SChunming Zhou
208361bdb39cSHuang Rui /* Renoir */
2084775da830SJinzhou Su {0x1002, 0x15E7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RENOIR|AMD_IS_APU},
208523fe1390SAlex Deucher {0x1002, 0x1636, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RENOIR|AMD_IS_APU},
20868bf08351SPrike Liang {0x1002, 0x1638, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RENOIR|AMD_IS_APU},
2087278cdb68Smengwang {0x1002, 0x164C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RENOIR|AMD_IS_APU},
208861bdb39cSHuang Rui
208910e85054STianci.Yin /* Navi12 */
2090d34c7b7bSAlex Deucher {0x1002, 0x7360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI12},
2091d34c7b7bSAlex Deucher {0x1002, 0x7362, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI12},
209210e85054STianci.Yin
209361278d14SLikun Gao /* Sienna_Cichlid */
209461278d14SLikun Gao {0x1002, 0x73A0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
2095d26bbbccSOri Messinger {0x1002, 0x73A1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
209661278d14SLikun Gao {0x1002, 0x73A2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
209761278d14SLikun Gao {0x1002, 0x73A3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
20988f0c93f4SAlex Deucher {0x1002, 0x73A5, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
20998f0c93f4SAlex Deucher {0x1002, 0x73A8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
21008f0c93f4SAlex Deucher {0x1002, 0x73A9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
210161278d14SLikun Gao {0x1002, 0x73AB, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
21028f0c93f4SAlex Deucher {0x1002, 0x73AC, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
21038f0c93f4SAlex Deucher {0x1002, 0x73AD, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
210461278d14SLikun Gao {0x1002, 0x73AE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
2105ed098aa3SAlex Deucher {0x1002, 0x73AF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
210661278d14SLikun Gao {0x1002, 0x73BF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
2107d38ceaf9SAlex Deucher
210827f5355fSAaron Liu /* Yellow Carp */
210927f5355fSAaron Liu {0x1002, 0x164D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_YELLOW_CARP|AMD_IS_APU},
211027f5355fSAaron Liu {0x1002, 0x1681, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_YELLOW_CARP|AMD_IS_APU},
211127f5355fSAaron Liu
21122c1eadddSTao Zhou /* Navy_Flounder */
21132c1eadddSTao Zhou {0x1002, 0x73C0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},
21142c1eadddSTao Zhou {0x1002, 0x73C1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},
21152c1eadddSTao Zhou {0x1002, 0x73C3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},
21168f0c93f4SAlex Deucher {0x1002, 0x73DA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},
21178f0c93f4SAlex Deucher {0x1002, 0x73DB, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},
21188f0c93f4SAlex Deucher {0x1002, 0x73DC, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},
21198f0c93f4SAlex Deucher {0x1002, 0x73DD, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},
21208f0c93f4SAlex Deucher {0x1002, 0x73DE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},
21212c1eadddSTao Zhou {0x1002, 0x73DF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},
21222c1eadddSTao Zhou
2123e7de4aeeSTao Zhou /* DIMGREY_CAVEFISH */
2124e7de4aeeSTao Zhou {0x1002, 0x73E0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
2125e7de4aeeSTao Zhou {0x1002, 0x73E1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
2126e7de4aeeSTao Zhou {0x1002, 0x73E2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
212706ac9b6cSAlex Deucher {0x1002, 0x73E3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
21288f0c93f4SAlex Deucher {0x1002, 0x73E8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
21298f0c93f4SAlex Deucher {0x1002, 0x73E9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
21308f0c93f4SAlex Deucher {0x1002, 0x73EA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
21318f0c93f4SAlex Deucher {0x1002, 0x73EB, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
21328f0c93f4SAlex Deucher {0x1002, 0x73EC, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
21338f0c93f4SAlex Deucher {0x1002, 0x73ED, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
21348f0c93f4SAlex Deucher {0x1002, 0x73EF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
2135e7de4aeeSTao Zhou {0x1002, 0x73FF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
2136e7de4aeeSTao Zhou
21374c2e5f51SFeifei Xu /* Aldebaran */
21383786a9bcSAlex Deucher {0x1002, 0x7408, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ALDEBARAN},
21393786a9bcSAlex Deucher {0x1002, 0x740C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ALDEBARAN},
21403786a9bcSAlex Deucher {0x1002, 0x740F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ALDEBARAN},
21413786a9bcSAlex Deucher {0x1002, 0x7410, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ALDEBARAN},
21424c2e5f51SFeifei Xu
2143a8f70696STao Zhou /* CYAN_SKILLFISH */
2144a8f70696STao Zhou {0x1002, 0x13FE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYAN_SKILLFISH|AMD_IS_APU},
2145dfcc3e8cSAlex Deucher {0x1002, 0x143F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYAN_SKILLFISH|AMD_IS_APU},
2146a8f70696STao Zhou
2147a2e9b166SChengming Gui /* BEIGE_GOBY */
2148a2e9b166SChengming Gui {0x1002, 0x7420, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BEIGE_GOBY},
2149a2e9b166SChengming Gui {0x1002, 0x7421, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BEIGE_GOBY},
2150a2e9b166SChengming Gui {0x1002, 0x7422, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BEIGE_GOBY},
2151a2e9b166SChengming Gui {0x1002, 0x7423, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BEIGE_GOBY},
215262e9bd20SAlex Deucher {0x1002, 0x7424, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BEIGE_GOBY},
2153a2e9b166SChengming Gui {0x1002, 0x743F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BEIGE_GOBY},
2154a2e9b166SChengming Gui
2155eb4fd29aSAlex Deucher { PCI_DEVICE(0x1002, PCI_ANY_ID),
2156eb4fd29aSAlex Deucher .class = PCI_CLASS_DISPLAY_VGA << 8,
2157eb4fd29aSAlex Deucher .class_mask = 0xffffff,
2158d0761fd2SAlex Deucher .driver_data = CHIP_IP_DISCOVERY },
2159eb4fd29aSAlex Deucher
2160eb4fd29aSAlex Deucher { PCI_DEVICE(0x1002, PCI_ANY_ID),
2161eb4fd29aSAlex Deucher .class = PCI_CLASS_DISPLAY_OTHER << 8,
2162eb4fd29aSAlex Deucher .class_mask = 0xffffff,
2163d0761fd2SAlex Deucher .driver_data = CHIP_IP_DISCOVERY },
2164eb4fd29aSAlex Deucher
21655d6cd200SShiwu Zhang { PCI_DEVICE(0x1002, PCI_ANY_ID),
21669d65b1b4SShiwu Zhang .class = PCI_CLASS_ACCELERATOR_PROCESSING << 8,
21675d6cd200SShiwu Zhang .class_mask = 0xffffff,
21685d6cd200SShiwu Zhang .driver_data = CHIP_IP_DISCOVERY },
21695d6cd200SShiwu Zhang
2170d38ceaf9SAlex Deucher {0, 0, 0}
2171d38ceaf9SAlex Deucher };
2172d38ceaf9SAlex Deucher
2173d38ceaf9SAlex Deucher MODULE_DEVICE_TABLE(pci, pciidlist);
2174d38ceaf9SAlex Deucher
2175dbab6356SMa Jun static const struct amdgpu_asic_type_quirk asic_type_quirks[] = {
2176dbab6356SMa Jun /* differentiate between P10 and P11 asics with the same DID */
2177dbab6356SMa Jun {0x67FF, 0xE3, CHIP_POLARIS10},
2178dbab6356SMa Jun {0x67FF, 0xE7, CHIP_POLARIS10},
2179dbab6356SMa Jun {0x67FF, 0xF3, CHIP_POLARIS10},
2180dbab6356SMa Jun {0x67FF, 0xF7, CHIP_POLARIS10},
2181dbab6356SMa Jun };
2182dbab6356SMa Jun
21835088d657SLuben Tuikov static const struct drm_driver amdgpu_kms_driver;
2184d38ceaf9SAlex Deucher
amdgpu_get_secondary_funcs(struct amdgpu_device * adev)2185243c719eSAlex Deucher static void amdgpu_get_secondary_funcs(struct amdgpu_device *adev)
2186d0d66b8cSAlex Deucher {
2187d0d66b8cSAlex Deucher struct pci_dev *p = NULL;
2188243c719eSAlex Deucher int i;
2189d0d66b8cSAlex Deucher
2190243c719eSAlex Deucher /* 0 - GPU
2191243c719eSAlex Deucher * 1 - audio
2192243c719eSAlex Deucher * 2 - USB
2193243c719eSAlex Deucher * 3 - UCSI
2194243c719eSAlex Deucher */
2195243c719eSAlex Deucher for (i = 1; i < 4; i++) {
2196d0d66b8cSAlex Deucher p = pci_get_domain_bus_and_slot(pci_domain_nr(adev->pdev->bus),
2197243c719eSAlex Deucher adev->pdev->bus->number, i);
2198d0d66b8cSAlex Deucher if (p) {
2199d0d66b8cSAlex Deucher pm_runtime_get_sync(&p->dev);
2200d0d66b8cSAlex Deucher pm_runtime_mark_last_busy(&p->dev);
2201d0d66b8cSAlex Deucher pm_runtime_put_autosuspend(&p->dev);
2202d0d66b8cSAlex Deucher pci_dev_put(p);
2203d0d66b8cSAlex Deucher }
2204d0d66b8cSAlex Deucher }
2205243c719eSAlex Deucher }
2206d0d66b8cSAlex Deucher
amdgpu_init_debug_options(struct amdgpu_device * adev)2207887db1e4SAndré Almeida static void amdgpu_init_debug_options(struct amdgpu_device *adev)
2208887db1e4SAndré Almeida {
2209887db1e4SAndré Almeida if (amdgpu_debug_mask & AMDGPU_DEBUG_VM) {
2210887db1e4SAndré Almeida pr_info("debug: VM handling debug enabled\n");
2211887db1e4SAndré Almeida adev->debug_vm = true;
2212887db1e4SAndré Almeida }
2213887db1e4SAndré Almeida
2214887db1e4SAndré Almeida if (amdgpu_debug_mask & AMDGPU_DEBUG_LARGEBAR) {
2215887db1e4SAndré Almeida pr_info("debug: enabled simulating large-bar capability on non-large bar system\n");
2216887db1e4SAndré Almeida adev->debug_largebar = true;
2217887db1e4SAndré Almeida }
2218ffde7210SAndré Almeida
2219ffde7210SAndré Almeida if (amdgpu_debug_mask & AMDGPU_DEBUG_DISABLE_GPU_SOFT_RECOVERY) {
2220ffde7210SAndré Almeida pr_info("debug: soft reset for GPU recovery disabled\n");
2221ffde7210SAndré Almeida adev->debug_disable_soft_recovery = true;
2222ffde7210SAndré Almeida }
2223d20e1aecSLe Ma
2224d20e1aecSLe Ma if (amdgpu_debug_mask & AMDGPU_DEBUG_USE_VRAM_FW_BUF) {
2225d20e1aecSLe Ma pr_info("debug: place fw in vram for frontdoor loading\n");
2226d20e1aecSLe Ma adev->debug_use_vram_fw_buf = true;
2227d20e1aecSLe Ma }
2228b2aa3d4bSYang Wang
2229b2aa3d4bSYang Wang if (amdgpu_debug_mask & AMDGPU_DEBUG_ENABLE_RAS_ACA) {
2230b2aa3d4bSYang Wang pr_info("debug: enable RAS ACA\n");
2231b2aa3d4bSYang Wang adev->debug_enable_ras_aca = true;
2232b2aa3d4bSYang Wang }
2233a9b67c03SAlex Deucher
2234a9b67c03SAlex Deucher if (amdgpu_debug_mask & AMDGPU_DEBUG_ENABLE_EXP_RESETS) {
2235a9b67c03SAlex Deucher pr_info("debug: enable experimental reset features\n");
2236a9b67c03SAlex Deucher adev->debug_exp_resets = true;
2237a9b67c03SAlex Deucher }
22389c696cc5SAndré Almeida
22399c696cc5SAndré Almeida if (amdgpu_debug_mask & AMDGPU_DEBUG_DISABLE_GPU_RING_RESET) {
22409c696cc5SAndré Almeida pr_info("debug: ring reset disabled\n");
22419c696cc5SAndré Almeida adev->debug_disable_gpu_ring_reset = true;
22429c696cc5SAndré Almeida }
2243ab689340SLijo Lazar if (amdgpu_debug_mask & AMDGPU_DEBUG_SMU_POOL) {
2244ab689340SLijo Lazar pr_info("debug: use vram for smu pool\n");
2245ab689340SLijo Lazar adev->pm.smu_debug_mask |= SMU_DEBUG_POOL_USE_VRAM;
2246ab689340SLijo Lazar }
2247887db1e4SAndré Almeida }
2248887db1e4SAndré Almeida
amdgpu_fix_asic_type(struct pci_dev * pdev,unsigned long flags)2249dbab6356SMa Jun static unsigned long amdgpu_fix_asic_type(struct pci_dev *pdev, unsigned long flags)
2250dbab6356SMa Jun {
2251dbab6356SMa Jun int i;
2252dbab6356SMa Jun
2253dbab6356SMa Jun for (i = 0; i < ARRAY_SIZE(asic_type_quirks); i++) {
2254dbab6356SMa Jun if (pdev->device == asic_type_quirks[i].device &&
2255dbab6356SMa Jun pdev->revision == asic_type_quirks[i].revision) {
2256dbab6356SMa Jun flags &= ~AMD_ASIC_MASK;
2257dbab6356SMa Jun flags |= asic_type_quirks[i].type;
2258dbab6356SMa Jun break;
2259dbab6356SMa Jun }
2260dbab6356SMa Jun }
2261dbab6356SMa Jun
2262dbab6356SMa Jun return flags;
2263dbab6356SMa Jun }
2264dbab6356SMa Jun
amdgpu_pci_probe(struct pci_dev * pdev,const struct pci_device_id * ent)2265d38ceaf9SAlex Deucher static int amdgpu_pci_probe(struct pci_dev *pdev,
2266d38ceaf9SAlex Deucher const struct pci_device_id *ent)
2267d38ceaf9SAlex Deucher {
22688aba21b7SLuben Tuikov struct drm_device *ddev;
2269c6385e50SAlex Deucher struct amdgpu_device *adev;
2270d38ceaf9SAlex Deucher unsigned long flags = ent->driver_data;
2271bdbeb0ddSAlex Deucher int ret, retry = 0, i;
22723fa203afSAlex Deucher bool supports_atomic = false;
22733fa203afSAlex Deucher
2274e00e5c22SAlex Deucher if ((pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA ||
2275e00e5c22SAlex Deucher (pdev->class >> 8) == PCI_CLASS_DISPLAY_OTHER) {
2276e00e5c22SAlex Deucher if (drm_firmware_drivers_only() && amdgpu_modeset == -1)
2277e00e5c22SAlex Deucher return -EINVAL;
2278e00e5c22SAlex Deucher }
2279e00e5c22SAlex Deucher
2280bdbeb0ddSAlex Deucher /* skip devices which are owned by radeon */
2281bdbeb0ddSAlex Deucher for (i = 0; i < ARRAY_SIZE(amdgpu_unsupported_pciidlist); i++) {
2282bdbeb0ddSAlex Deucher if (amdgpu_unsupported_pciidlist[i] == pdev->device)
2283bdbeb0ddSAlex Deucher return -ENODEV;
2284bdbeb0ddSAlex Deucher }
2285bdbeb0ddSAlex Deucher
22867294863aSMario Limonciello if (amdgpu_aspm == -1 && !pcie_aspm_enabled(pdev))
22877294863aSMario Limonciello amdgpu_aspm = 0;
22887294863aSMario Limonciello
228984ec374bSRyan Taylor if (amdgpu_virtual_display ||
22903fa203afSAlex Deucher amdgpu_device_asic_has_dc_support(flags & AMD_ASIC_MASK))
22913fa203afSAlex Deucher supports_atomic = true;
2292d38ceaf9SAlex Deucher
22932f7d10b3SJammy Zhou if ((flags & AMD_EXP_HW_SUPPORT) && !amdgpu_exp_hw_support) {
2294d38ceaf9SAlex Deucher DRM_INFO("This hardware requires experimental hardware support.\n"
2295d38ceaf9SAlex Deucher "See modparam exp_hw_support\n");
2296d38ceaf9SAlex Deucher return -ENODEV;
2297d38ceaf9SAlex Deucher }
2298dbab6356SMa Jun
2299dbab6356SMa Jun flags = amdgpu_fix_asic_type(pdev, flags);
2300d38ceaf9SAlex Deucher
2301ea68573dSAlex Deucher /* Due to hardware bugs, S/G Display on raven requires a 1:1 IOMMU mapping,
2302ea68573dSAlex Deucher * however, SME requires an indirect IOMMU mapping because the encryption
2303ea68573dSAlex Deucher * bit is beyond the DMA mask of the chip.
2304ea68573dSAlex Deucher */
2305e9d1d2bbSTom Lendacky if (cc_platform_has(CC_ATTR_MEM_ENCRYPT) &&
2306e9d1d2bbSTom Lendacky ((flags & AMD_ASIC_MASK) == CHIP_RAVEN)) {
2307ea68573dSAlex Deucher dev_info(&pdev->dev,
2308ea68573dSAlex Deucher "SME is not compatible with RAVEN\n");
2309ea68573dSAlex Deucher return -ENOTSUPP;
2310ea68573dSAlex Deucher }
2311ea68573dSAlex Deucher
2312984d7a92SHans de Goede switch (flags & AMD_ASIC_MASK) {
2313984d7a92SHans de Goede case CHIP_TAHITI:
2314984d7a92SHans de Goede case CHIP_PITCAIRN:
2315984d7a92SHans de Goede case CHIP_VERDE:
2316984d7a92SHans de Goede case CHIP_OLAND:
2317984d7a92SHans de Goede case CHIP_HAINAN:
23185f054ddeSMario Limonciello #ifdef CONFIG_DRM_AMDGPU_SI
23195f054ddeSMario Limonciello if (!amdgpu_si_support) {
2320984d7a92SHans de Goede dev_info(&pdev->dev,
2321984d7a92SHans de Goede "SI support provided by radeon.\n");
2322984d7a92SHans de Goede dev_info(&pdev->dev,
2323984d7a92SHans de Goede "Use radeon.si_support=0 amdgpu.si_support=1 to override.\n"
2324984d7a92SHans de Goede );
2325984d7a92SHans de Goede return -ENODEV;
2326984d7a92SHans de Goede }
23275f054ddeSMario Limonciello break;
23285f054ddeSMario Limonciello #else
23295f054ddeSMario Limonciello dev_info(&pdev->dev, "amdgpu is built without SI support.\n");
23305f054ddeSMario Limonciello return -ENODEV;
2331984d7a92SHans de Goede #endif
2332984d7a92SHans de Goede case CHIP_KAVERI:
2333984d7a92SHans de Goede case CHIP_BONAIRE:
2334984d7a92SHans de Goede case CHIP_HAWAII:
2335984d7a92SHans de Goede case CHIP_KABINI:
2336984d7a92SHans de Goede case CHIP_MULLINS:
23375f054ddeSMario Limonciello #ifdef CONFIG_DRM_AMDGPU_CIK
23385f054ddeSMario Limonciello if (!amdgpu_cik_support) {
2339984d7a92SHans de Goede dev_info(&pdev->dev,
2340984d7a92SHans de Goede "CIK support provided by radeon.\n");
2341984d7a92SHans de Goede dev_info(&pdev->dev,
2342984d7a92SHans de Goede "Use radeon.cik_support=0 amdgpu.cik_support=1 to override.\n"
2343984d7a92SHans de Goede );
2344984d7a92SHans de Goede return -ENODEV;
2345984d7a92SHans de Goede }
23465f054ddeSMario Limonciello break;
23475f054ddeSMario Limonciello #else
23485f054ddeSMario Limonciello dev_info(&pdev->dev, "amdgpu is built without CIK support.\n");
23495f054ddeSMario Limonciello return -ENODEV;
2350984d7a92SHans de Goede #endif
23515f054ddeSMario Limonciello default:
23525f054ddeSMario Limonciello break;
23535f054ddeSMario Limonciello }
2354984d7a92SHans de Goede
23555088d657SLuben Tuikov adev = devm_drm_dev_alloc(&pdev->dev, &amdgpu_kms_driver, typeof(*adev), ddev);
2356df2ce459SLuben Tuikov if (IS_ERR(adev))
2357df2ce459SLuben Tuikov return PTR_ERR(adev);
23588aba21b7SLuben Tuikov
23598aba21b7SLuben Tuikov adev->dev = &pdev->dev;
23608aba21b7SLuben Tuikov adev->pdev = pdev;
23618aba21b7SLuben Tuikov ddev = adev_to_drm(adev);
2362b58c1131SAlex Deucher
2363351c4dbeSVille Syrjälä if (!supports_atomic)
23648aba21b7SLuben Tuikov ddev->driver_features &= ~DRIVER_ATOMIC;
2365351c4dbeSVille Syrjälä
2366b58c1131SAlex Deucher ret = pci_enable_device(pdev);
2367b58c1131SAlex Deucher if (ret)
2368df2ce459SLuben Tuikov return ret;
2369b58c1131SAlex Deucher
23708aba21b7SLuben Tuikov pci_set_drvdata(pdev, ddev);
2371b58c1131SAlex Deucher
237251258acdSLe Ma amdgpu_init_debug_options(adev);
237351258acdSLe Ma
23741d4624cdSAlex Deucher ret = amdgpu_driver_load_kms(adev, flags);
23757504d3bbSLiu ChengZhe if (ret)
23767504d3bbSLiu ChengZhe goto err_pci;
2377c6385e50SAlex Deucher
23781daee8b4SPixel Ding retry_init:
23791d4624cdSAlex Deucher ret = drm_dev_register(ddev, flags);
23801daee8b4SPixel Ding if (ret == -EAGAIN && ++retry <= 3) {
23811daee8b4SPixel Ding DRM_INFO("retry init %d\n", retry);
23821daee8b4SPixel Ding /* Don't request EX mode too frequently which is attacking */
23831daee8b4SPixel Ding msleep(5000);
23841daee8b4SPixel Ding goto retry_init;
23858aba21b7SLuben Tuikov } else if (ret) {
2386b58c1131SAlex Deucher goto err_pci;
23878aba21b7SLuben Tuikov }
2388b58c1131SAlex Deucher
23892c1c7ba4SJames Zhu ret = amdgpu_xcp_dev_register(adev, ent);
23902c1c7ba4SJames Zhu if (ret)
23912c1c7ba4SJames Zhu goto err_pci;
23922c1c7ba4SJames Zhu
2393c0125b84SLe Ma ret = amdgpu_amdkfd_drm_client_create(adev);
2394c0125b84SLe Ma if (ret)
2395c0125b84SLe Ma goto err_pci;
2396c0125b84SLe Ma
2397087451f3SEvan Quan /*
2398087451f3SEvan Quan * 1. don't init fbdev on hw without DCE
2399087451f3SEvan Quan * 2. don't init fbdev if there are no connectors
2400087451f3SEvan Quan */
2401087451f3SEvan Quan if (adev->mode_info.mode_config_initialized &&
2402087451f3SEvan Quan !list_empty(&adev_to_drm(adev)->mode_config.connector_list)) {
240332acc286SThomas Zimmermann const struct drm_format_info *format;
240432acc286SThomas Zimmermann
2405087451f3SEvan Quan /* select 8 bpp console on low vram cards */
2406087451f3SEvan Quan if (adev->gmc.real_vram_size <= (32*1024*1024))
240732acc286SThomas Zimmermann format = drm_format_info(DRM_FORMAT_C8);
2408087451f3SEvan Quan else
240932acc286SThomas Zimmermann format = NULL;
241032acc286SThomas Zimmermann
241132acc286SThomas Zimmermann drm_client_setup(adev_to_drm(adev), format);
2412087451f3SEvan Quan }
2413087451f3SEvan Quan
2414c6385e50SAlex Deucher ret = amdgpu_debugfs_init(adev);
2415c6385e50SAlex Deucher if (ret)
2416c6385e50SAlex Deucher DRM_ERROR("Creating debugfs files failed (%d).\n", ret);
2417c6385e50SAlex Deucher
24189c913f38SGuchun Chen if (adev->pm.rpm_mode != AMDGPU_RUNPM_NONE) {
2419d0d66b8cSAlex Deucher /* only need to skip on ATPX */
2420d0d66b8cSAlex Deucher if (amdgpu_device_supports_px(ddev))
2421d0d66b8cSAlex Deucher dev_pm_set_driver_flags(ddev->dev, DPM_FLAG_NO_DIRECT_COMPLETE);
2422d0d66b8cSAlex Deucher /* we want direct complete for BOCO */
2423d0d66b8cSAlex Deucher if (amdgpu_device_supports_boco(ddev))
2424d0d66b8cSAlex Deucher dev_pm_set_driver_flags(ddev->dev, DPM_FLAG_SMART_PREPARE |
2425d0d66b8cSAlex Deucher DPM_FLAG_SMART_SUSPEND |
2426d0d66b8cSAlex Deucher DPM_FLAG_MAY_SKIP_RESUME);
2427d0d66b8cSAlex Deucher pm_runtime_use_autosuspend(ddev->dev);
2428d0d66b8cSAlex Deucher pm_runtime_set_autosuspend_delay(ddev->dev, 5000);
2429d0d66b8cSAlex Deucher
2430d0d66b8cSAlex Deucher pm_runtime_allow(ddev->dev);
2431d0d66b8cSAlex Deucher
2432d0d66b8cSAlex Deucher pm_runtime_mark_last_busy(ddev->dev);
2433d0d66b8cSAlex Deucher pm_runtime_put_autosuspend(ddev->dev);
2434d0d66b8cSAlex Deucher
2435bd1f6a31SMario Limonciello pci_wake_from_d3(pdev, TRUE);
2436bd1f6a31SMario Limonciello
2437d0d66b8cSAlex Deucher /*
2438d0d66b8cSAlex Deucher * For runpm implemented via BACO, PMFW will handle the
2439d0d66b8cSAlex Deucher * timing for BACO in and out:
2440d0d66b8cSAlex Deucher * - put ASIC into BACO state only when both video and
2441d0d66b8cSAlex Deucher * audio functions are in D3 state.
2442d0d66b8cSAlex Deucher * - pull ASIC out of BACO state when either video or
2443d0d66b8cSAlex Deucher * audio function is in D0 state.
2444d0d66b8cSAlex Deucher * Also, at startup, PMFW assumes both functions are in
2445d0d66b8cSAlex Deucher * D0 state.
2446d0d66b8cSAlex Deucher *
2447d0d66b8cSAlex Deucher * So if snd driver was loaded prior to amdgpu driver
2448d0d66b8cSAlex Deucher * and audio function was put into D3 state, there will
2449d0d66b8cSAlex Deucher * be no PMFW-aware D-state transition(D0->D3) on runpm
2450d0d66b8cSAlex Deucher * suspend. Thus the BACO will be not correctly kicked in.
2451d0d66b8cSAlex Deucher *
2452243c719eSAlex Deucher * Via amdgpu_get_secondary_funcs(), the audio dev is put
2453d0d66b8cSAlex Deucher * into D0 state. Then there will be a PMFW-aware D-state
2454d0d66b8cSAlex Deucher * transition(D0->D3) on runpm suspend.
2455d0d66b8cSAlex Deucher */
2456d0d66b8cSAlex Deucher if (amdgpu_device_supports_baco(ddev) &&
2457d0d66b8cSAlex Deucher !(adev->flags & AMD_IS_APU) &&
2458d0d66b8cSAlex Deucher (adev->asic_type >= CHIP_NAVI10))
2459243c719eSAlex Deucher amdgpu_get_secondary_funcs(adev);
2460d0d66b8cSAlex Deucher }
2461d0d66b8cSAlex Deucher
2462b58c1131SAlex Deucher return 0;
2463b58c1131SAlex Deucher
2464b58c1131SAlex Deucher err_pci:
2465b58c1131SAlex Deucher pci_disable_device(pdev);
2466b58c1131SAlex Deucher return ret;
2467d38ceaf9SAlex Deucher }
2468d38ceaf9SAlex Deucher
2469d38ceaf9SAlex Deucher static void
amdgpu_pci_remove(struct pci_dev * pdev)2470d38ceaf9SAlex Deucher amdgpu_pci_remove(struct pci_dev *pdev)
2471d38ceaf9SAlex Deucher {
2472d38ceaf9SAlex Deucher struct drm_device *dev = pci_get_drvdata(pdev);
2473d0d66b8cSAlex Deucher struct amdgpu_device *adev = drm_to_adev(dev);
2474d38ceaf9SAlex Deucher
24752c1c7ba4SJames Zhu amdgpu_xcp_dev_unplug(adev);
2476ee52489dSLijo Lazar amdgpu_gmc_prepare_nps_mode_change(adev);
247739934d3eSVitaly Prosyak drm_dev_unplug(dev);
247839934d3eSVitaly Prosyak
24799c913f38SGuchun Chen if (adev->pm.rpm_mode != AMDGPU_RUNPM_NONE) {
2480d0d66b8cSAlex Deucher pm_runtime_get_sync(dev->dev);
2481d0d66b8cSAlex Deucher pm_runtime_forbid(dev->dev);
2482d0d66b8cSAlex Deucher }
2483d0d66b8cSAlex Deucher
2484c6385e50SAlex Deucher amdgpu_driver_unload_kms(dev);
248572c8c97bSAndrey Grodzovsky
248698c6e6a7SAndrey Grodzovsky /*
248798c6e6a7SAndrey Grodzovsky * Flush any in flight DMA operations from device.
248898c6e6a7SAndrey Grodzovsky * Clear the Bus Master Enable bit and then wait on the PCIe Device
248998c6e6a7SAndrey Grodzovsky * StatusTransactions Pending bit.
249098c6e6a7SAndrey Grodzovsky */
2491fd4495e5SXiangliang.Yu pci_disable_device(pdev);
249298c6e6a7SAndrey Grodzovsky pci_wait_for_pending_transaction(pdev);
2493d38ceaf9SAlex Deucher }
2494d38ceaf9SAlex Deucher
249561e11306SAlex Deucher static void
amdgpu_pci_shutdown(struct pci_dev * pdev)249661e11306SAlex Deucher amdgpu_pci_shutdown(struct pci_dev *pdev)
249761e11306SAlex Deucher {
2498faefba95SAlex Deucher struct drm_device *dev = pci_get_drvdata(pdev);
24991348969aSLuben Tuikov struct amdgpu_device *adev = drm_to_adev(dev);
2500faefba95SAlex Deucher
25017c6e68c7SAndrey Grodzovsky if (amdgpu_ras_intr_triggered())
25027c6e68c7SAndrey Grodzovsky return;
25037c6e68c7SAndrey Grodzovsky
250461e11306SAlex Deucher /* if we are running in a VM, make sure the device
250500ea8cbaSAlex Deucher * torn down properly on reboot/shutdown.
250600ea8cbaSAlex Deucher * unfortunately we can't detect certain
250700ea8cbaSAlex Deucher * hypervisors so just do this all the time.
250861e11306SAlex Deucher */
250905cac1aeSNirmoy Das if (!amdgpu_passthrough(adev))
2510a3a09142SAlex Deucher adev->mp1_state = PP_MP1_STATE_UNLOAD;
2511cdd61df6SAlex Deucher amdgpu_device_ip_suspend(adev);
2512a3a09142SAlex Deucher adev->mp1_state = PP_MP1_STATE_NONE;
251361e11306SAlex Deucher }
251461e11306SAlex Deucher
amdgpu_pmops_prepare(struct device * dev)2515e25443d2SAlex Deucher static int amdgpu_pmops_prepare(struct device *dev)
2516e25443d2SAlex Deucher {
2517e25443d2SAlex Deucher struct drm_device *drm_dev = dev_get_drvdata(dev);
2518d2a197a4SMario Limonciello struct amdgpu_device *adev = drm_to_adev(drm_dev);
2519e25443d2SAlex Deucher
2520e25443d2SAlex Deucher /* Return a positive number here so
2521e25443d2SAlex Deucher * DPM_FLAG_SMART_SUSPEND works properly
2522e25443d2SAlex Deucher */
25235095d541SMario Limonciello if (amdgpu_device_supports_boco(drm_dev) &&
25245095d541SMario Limonciello pm_runtime_suspended(dev))
25255095d541SMario Limonciello return 1;
2526e25443d2SAlex Deucher
2527d2a197a4SMario Limonciello /* if we will not support s3 or s2i for the device
2528d2a197a4SMario Limonciello * then skip suspend
2529d2a197a4SMario Limonciello */
2530d2a197a4SMario Limonciello if (!amdgpu_acpi_is_s0ix_active(adev) &&
2531d2a197a4SMario Limonciello !amdgpu_acpi_is_s3_active(adev))
2532d2a197a4SMario Limonciello return 1;
2533e25443d2SAlex Deucher
25345095d541SMario Limonciello return amdgpu_device_prepare(drm_dev);
2535e25443d2SAlex Deucher }
2536e25443d2SAlex Deucher
amdgpu_pmops_complete(struct device * dev)2537e25443d2SAlex Deucher static void amdgpu_pmops_complete(struct device *dev)
2538e25443d2SAlex Deucher {
2539e25443d2SAlex Deucher /* nothing to do */
2540e25443d2SAlex Deucher }
2541e25443d2SAlex Deucher
amdgpu_pmops_suspend(struct device * dev)2542d38ceaf9SAlex Deucher static int amdgpu_pmops_suspend(struct device *dev)
2543d38ceaf9SAlex Deucher {
2544911d8b30SChuhong Yuan struct drm_device *drm_dev = dev_get_drvdata(dev);
254562498733SAlex Deucher struct amdgpu_device *adev = drm_to_adev(drm_dev);
254674b0b157Sjimqu
2547d0260f62SPratik Vishwakarma if (amdgpu_acpi_is_s0ix_active(adev))
254862498733SAlex Deucher adev->in_s0ix = true;
2549ca475186SMario Limonciello else if (amdgpu_acpi_is_s3_active(adev))
255062498733SAlex Deucher adev->in_s3 = true;
25511657793dSMario Limonciello if (!adev->in_s0ix && !adev->in_s3) {
25521657793dSMario Limonciello /* don't allow going deep first time followed by s2idle the next time */
25531657793dSMario Limonciello if (adev->last_suspend_state != PM_SUSPEND_ON &&
25541657793dSMario Limonciello adev->last_suspend_state != pm_suspend_target_state) {
25551657793dSMario Limonciello drm_err_once(drm_dev, "Unsupported suspend state %d\n",
25561657793dSMario Limonciello pm_suspend_target_state);
25571657793dSMario Limonciello return -EINVAL;
25581657793dSMario Limonciello }
2559ca475186SMario Limonciello return 0;
25601657793dSMario Limonciello }
25611657793dSMario Limonciello
25621657793dSMario Limonciello /* cache the state last used for suspend */
25631657793dSMario Limonciello adev->last_suspend_state = pm_suspend_target_state;
25641657793dSMario Limonciello
25659e051720SKai-Heng Feng return amdgpu_device_suspend(drm_dev, true);
25669e051720SKai-Heng Feng }
25679e051720SKai-Heng Feng
amdgpu_pmops_suspend_noirq(struct device * dev)25689e051720SKai-Heng Feng static int amdgpu_pmops_suspend_noirq(struct device *dev)
25699e051720SKai-Heng Feng {
25709e051720SKai-Heng Feng struct drm_device *drm_dev = dev_get_drvdata(dev);
25719e051720SKai-Heng Feng struct amdgpu_device *adev = drm_to_adev(drm_dev);
25729e051720SKai-Heng Feng
25730223e516SMario Limonciello if (amdgpu_acpi_should_gpu_reset(adev))
25749e051720SKai-Heng Feng return amdgpu_asic_reset(adev);
25759e051720SKai-Heng Feng
25769e051720SKai-Heng Feng return 0;
2577d38ceaf9SAlex Deucher }
2578d38ceaf9SAlex Deucher
amdgpu_pmops_resume(struct device * dev)2579d38ceaf9SAlex Deucher static int amdgpu_pmops_resume(struct device *dev)
2580d38ceaf9SAlex Deucher {
2581911d8b30SChuhong Yuan struct drm_device *drm_dev = dev_get_drvdata(dev);
258262498733SAlex Deucher struct amdgpu_device *adev = drm_to_adev(drm_dev);
258362498733SAlex Deucher int r;
258485e154c2SAlex Deucher
2585ca475186SMario Limonciello if (!adev->in_s0ix && !adev->in_s3)
2586ca475186SMario Limonciello return 0;
2587ca475186SMario Limonciello
2588ebe86a57SAndrey Grodzovsky /* Avoids registers access if device is physically gone */
2589ebe86a57SAndrey Grodzovsky if (!pci_device_is_present(adev->pdev))
2590ebe86a57SAndrey Grodzovsky adev->no_hw_access = true;
2591ebe86a57SAndrey Grodzovsky
259262498733SAlex Deucher r = amdgpu_device_resume(drm_dev, true);
2593d0260f62SPratik Vishwakarma if (amdgpu_acpi_is_s0ix_active(adev))
259462498733SAlex Deucher adev->in_s0ix = false;
2595eac4c54bSMario Limonciello else
2596eac4c54bSMario Limonciello adev->in_s3 = false;
259762498733SAlex Deucher return r;
2598d38ceaf9SAlex Deucher }
2599d38ceaf9SAlex Deucher
amdgpu_pmops_freeze(struct device * dev)2600d38ceaf9SAlex Deucher static int amdgpu_pmops_freeze(struct device *dev)
2601d38ceaf9SAlex Deucher {
2602911d8b30SChuhong Yuan struct drm_device *drm_dev = dev_get_drvdata(dev);
26031348969aSLuben Tuikov struct amdgpu_device *adev = drm_to_adev(drm_dev);
2604897483d8SAlex Deucher int r;
260574b0b157Sjimqu
2606de185019SAlex Deucher r = amdgpu_device_suspend(drm_dev, true);
2607897483d8SAlex Deucher if (r)
2608897483d8SAlex Deucher return r;
2609af1f2985STim Huang
2610af1f2985STim Huang if (amdgpu_acpi_should_gpu_reset(adev))
2611897483d8SAlex Deucher return amdgpu_asic_reset(adev);
2612af1f2985STim Huang return 0;
2613d38ceaf9SAlex Deucher }
2614d38ceaf9SAlex Deucher
amdgpu_pmops_thaw(struct device * dev)2615d38ceaf9SAlex Deucher static int amdgpu_pmops_thaw(struct device *dev)
2616d38ceaf9SAlex Deucher {
2617911d8b30SChuhong Yuan struct drm_device *drm_dev = dev_get_drvdata(dev);
261874b0b157Sjimqu
2619*4aaffc85SAlex Deucher return amdgpu_device_resume(drm_dev, true);
262074b0b157Sjimqu }
262174b0b157Sjimqu
amdgpu_pmops_poweroff(struct device * dev)262274b0b157Sjimqu static int amdgpu_pmops_poweroff(struct device *dev)
262374b0b157Sjimqu {
2624911d8b30SChuhong Yuan struct drm_device *drm_dev = dev_get_drvdata(dev);
262574b0b157Sjimqu
262662498733SAlex Deucher return amdgpu_device_suspend(drm_dev, true);
262774b0b157Sjimqu }
262874b0b157Sjimqu
amdgpu_pmops_restore(struct device * dev)262974b0b157Sjimqu static int amdgpu_pmops_restore(struct device *dev)
263074b0b157Sjimqu {
2631911d8b30SChuhong Yuan struct drm_device *drm_dev = dev_get_drvdata(dev);
263274b0b157Sjimqu
2633de185019SAlex Deucher return amdgpu_device_resume(drm_dev, true);
2634d38ceaf9SAlex Deucher }
2635d38ceaf9SAlex Deucher
amdgpu_runtime_idle_check_display(struct device * dev)26364020c228SAlex Deucher static int amdgpu_runtime_idle_check_display(struct device *dev)
26374020c228SAlex Deucher {
26384020c228SAlex Deucher struct pci_dev *pdev = to_pci_dev(dev);
26394020c228SAlex Deucher struct drm_device *drm_dev = pci_get_drvdata(pdev);
26404020c228SAlex Deucher struct amdgpu_device *adev = drm_to_adev(drm_dev);
26414020c228SAlex Deucher
26424020c228SAlex Deucher if (adev->mode_info.num_crtc) {
26434020c228SAlex Deucher struct drm_connector *list_connector;
26444020c228SAlex Deucher struct drm_connector_list_iter iter;
26454020c228SAlex Deucher int ret = 0;
26464020c228SAlex Deucher
26474d6fc55aSAlex Deucher if (amdgpu_runtime_pm != -2) {
26484020c228SAlex Deucher /* XXX: Return busy if any displays are connected to avoid
26494020c228SAlex Deucher * possible display wakeups after runtime resume due to
26504020c228SAlex Deucher * hotplug events in case any displays were connected while
26514020c228SAlex Deucher * the GPU was in suspend. Remove this once that is fixed.
26524020c228SAlex Deucher */
26534020c228SAlex Deucher mutex_lock(&drm_dev->mode_config.mutex);
26544020c228SAlex Deucher drm_connector_list_iter_begin(drm_dev, &iter);
26554020c228SAlex Deucher drm_for_each_connector_iter(list_connector, &iter) {
26564020c228SAlex Deucher if (list_connector->status == connector_status_connected) {
26574020c228SAlex Deucher ret = -EBUSY;
26584020c228SAlex Deucher break;
26594020c228SAlex Deucher }
26604020c228SAlex Deucher }
26614020c228SAlex Deucher drm_connector_list_iter_end(&iter);
26624020c228SAlex Deucher mutex_unlock(&drm_dev->mode_config.mutex);
26634020c228SAlex Deucher
26644020c228SAlex Deucher if (ret)
26654020c228SAlex Deucher return ret;
26664d6fc55aSAlex Deucher }
26674020c228SAlex Deucher
2668d09ef243SAlex Deucher if (adev->dc_enabled) {
26694020c228SAlex Deucher struct drm_crtc *crtc;
26704020c228SAlex Deucher
26714020c228SAlex Deucher drm_for_each_crtc(crtc, drm_dev) {
26724020c228SAlex Deucher drm_modeset_lock(&crtc->mutex, NULL);
26734020c228SAlex Deucher if (crtc->state->active)
26744020c228SAlex Deucher ret = -EBUSY;
26754020c228SAlex Deucher drm_modeset_unlock(&crtc->mutex);
26764020c228SAlex Deucher if (ret < 0)
26774020c228SAlex Deucher break;
26784020c228SAlex Deucher }
26794020c228SAlex Deucher } else {
26804020c228SAlex Deucher mutex_lock(&drm_dev->mode_config.mutex);
26814020c228SAlex Deucher drm_modeset_lock(&drm_dev->mode_config.connection_mutex, NULL);
26824020c228SAlex Deucher
26834020c228SAlex Deucher drm_connector_list_iter_begin(drm_dev, &iter);
26844020c228SAlex Deucher drm_for_each_connector_iter(list_connector, &iter) {
26854020c228SAlex Deucher if (list_connector->dpms == DRM_MODE_DPMS_ON) {
26864020c228SAlex Deucher ret = -EBUSY;
26874020c228SAlex Deucher break;
26884020c228SAlex Deucher }
26894020c228SAlex Deucher }
26904020c228SAlex Deucher
26914020c228SAlex Deucher drm_connector_list_iter_end(&iter);
26924020c228SAlex Deucher
26934020c228SAlex Deucher drm_modeset_unlock(&drm_dev->mode_config.connection_mutex);
26944020c228SAlex Deucher mutex_unlock(&drm_dev->mode_config.mutex);
26954020c228SAlex Deucher }
26964020c228SAlex Deucher if (ret)
26974020c228SAlex Deucher return ret;
26984020c228SAlex Deucher }
26994020c228SAlex Deucher
27004020c228SAlex Deucher return 0;
27014020c228SAlex Deucher }
27024020c228SAlex Deucher
amdgpu_pmops_runtime_suspend(struct device * dev)2703d38ceaf9SAlex Deucher static int amdgpu_pmops_runtime_suspend(struct device *dev)
2704d38ceaf9SAlex Deucher {
2705d38ceaf9SAlex Deucher struct pci_dev *pdev = to_pci_dev(dev);
2706d38ceaf9SAlex Deucher struct drm_device *drm_dev = pci_get_drvdata(pdev);
27071348969aSLuben Tuikov struct amdgpu_device *adev = drm_to_adev(drm_dev);
2708719423f6SAlex Deucher int ret, i;
2709d38ceaf9SAlex Deucher
27109c913f38SGuchun Chen if (adev->pm.rpm_mode == AMDGPU_RUNPM_NONE) {
2711d38ceaf9SAlex Deucher pm_runtime_forbid(dev);
2712d38ceaf9SAlex Deucher return -EBUSY;
2713d38ceaf9SAlex Deucher }
2714d38ceaf9SAlex Deucher
27154020c228SAlex Deucher ret = amdgpu_runtime_idle_check_display(dev);
27164020c228SAlex Deucher if (ret)
27174020c228SAlex Deucher return ret;
27184020c228SAlex Deucher
2719719423f6SAlex Deucher /* wait for all rings to drain before suspending */
2720719423f6SAlex Deucher for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
2721719423f6SAlex Deucher struct amdgpu_ring *ring = adev->rings[i];
2722f9acfafcSSrinivasan Shanmugam
2723719423f6SAlex Deucher if (ring && ring->sched.ready) {
2724719423f6SAlex Deucher ret = amdgpu_fence_wait_empty(ring);
2725719423f6SAlex Deucher if (ret)
2726719423f6SAlex Deucher return -EBUSY;
2727719423f6SAlex Deucher }
2728719423f6SAlex Deucher }
2729719423f6SAlex Deucher
2730f0f7ddfcSAlex Deucher adev->in_runpm = true;
273186e14a73SMa Jun if (adev->pm.rpm_mode == AMDGPU_RUNPM_PX)
2732d38ceaf9SAlex Deucher drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
2733d38ceaf9SAlex Deucher
27347be3be2bSEvan Quan /*
27357be3be2bSEvan Quan * By setting mp1_state as PP_MP1_STATE_UNLOAD, MP1 will do some
27367be3be2bSEvan Quan * proper cleanups and put itself into a state ready for PNP. That
27377be3be2bSEvan Quan * can address some random resuming failure observed on BOCO capable
27387be3be2bSEvan Quan * platforms.
27397be3be2bSEvan Quan * TODO: this may be also needed for PX capable platform.
27407be3be2bSEvan Quan */
274186e14a73SMa Jun if (adev->pm.rpm_mode == AMDGPU_RUNPM_BOCO)
27427be3be2bSEvan Quan adev->mp1_state = PP_MP1_STATE_UNLOAD;
27437be3be2bSEvan Quan
27445095d541SMario Limonciello ret = amdgpu_device_prepare(drm_dev);
27455095d541SMario Limonciello if (ret)
27465095d541SMario Limonciello return ret;
2747de185019SAlex Deucher ret = amdgpu_device_suspend(drm_dev, false);
2748cef8b03bSAlex Deucher if (ret) {
2749cef8b03bSAlex Deucher adev->in_runpm = false;
275086e14a73SMa Jun if (adev->pm.rpm_mode == AMDGPU_RUNPM_BOCO)
27517be3be2bSEvan Quan adev->mp1_state = PP_MP1_STATE_NONE;
275270bedd68SRajneesh Bhardwaj return ret;
2753cef8b03bSAlex Deucher }
275470bedd68SRajneesh Bhardwaj
275586e14a73SMa Jun if (adev->pm.rpm_mode == AMDGPU_RUNPM_BOCO)
27567be3be2bSEvan Quan adev->mp1_state = PP_MP1_STATE_NONE;
27577be3be2bSEvan Quan
275886e14a73SMa Jun if (adev->pm.rpm_mode == AMDGPU_RUNPM_PX) {
2759562b49fcSAlex Deucher /* Only need to handle PCI state in the driver for ATPX
2760562b49fcSAlex Deucher * PCI core handles it for _PR3.
2761562b49fcSAlex Deucher */
2762c1dd4aa6SAndrey Grodzovsky amdgpu_device_cache_pci_state(pdev);
2763d38ceaf9SAlex Deucher pci_disable_device(pdev);
2764d38ceaf9SAlex Deucher pci_ignore_hotplug(pdev);
276511670975SAlex Deucher pci_set_power_state(pdev, PCI_D3cold);
2766d38ceaf9SAlex Deucher drm_dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF;
276786e14a73SMa Jun } else if (adev->pm.rpm_mode == AMDGPU_RUNPM_BOCO) {
276811e612a0SAlex Deucher /* nothing to do */
2769fcc0735bSMa Jun } else if ((adev->pm.rpm_mode == AMDGPU_RUNPM_BACO) ||
2770fcc0735bSMa Jun (adev->pm.rpm_mode == AMDGPU_RUNPM_BAMACO)) {
277119134317SAlex Deucher amdgpu_device_baco_enter(drm_dev);
2772b97e9d47SAlex Deucher }
2773d38ceaf9SAlex Deucher
2774abcb2aceSGuchun Chen dev_dbg(&pdev->dev, "asic/device is runtime suspended\n");
2775f4b09c29SGuchun Chen
2776d38ceaf9SAlex Deucher return 0;
2777d38ceaf9SAlex Deucher }
2778d38ceaf9SAlex Deucher
amdgpu_pmops_runtime_resume(struct device * dev)2779d38ceaf9SAlex Deucher static int amdgpu_pmops_runtime_resume(struct device *dev)
2780d38ceaf9SAlex Deucher {
2781d38ceaf9SAlex Deucher struct pci_dev *pdev = to_pci_dev(dev);
2782d38ceaf9SAlex Deucher struct drm_device *drm_dev = pci_get_drvdata(pdev);
27831348969aSLuben Tuikov struct amdgpu_device *adev = drm_to_adev(drm_dev);
2784d38ceaf9SAlex Deucher int ret;
2785d38ceaf9SAlex Deucher
27869c913f38SGuchun Chen if (adev->pm.rpm_mode == AMDGPU_RUNPM_NONE)
2787d38ceaf9SAlex Deucher return -EINVAL;
2788d38ceaf9SAlex Deucher
2789e1543d83SAndrey Grodzovsky /* Avoids registers access if device is physically gone */
2790e1543d83SAndrey Grodzovsky if (!pci_device_is_present(adev->pdev))
2791e1543d83SAndrey Grodzovsky adev->no_hw_access = true;
2792e1543d83SAndrey Grodzovsky
279386e14a73SMa Jun if (adev->pm.rpm_mode == AMDGPU_RUNPM_PX) {
2794d38ceaf9SAlex Deucher drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
2795d38ceaf9SAlex Deucher
2796562b49fcSAlex Deucher /* Only need to handle PCI state in the driver for ATPX
2797562b49fcSAlex Deucher * PCI core handles it for _PR3.
2798562b49fcSAlex Deucher */
2799d38ceaf9SAlex Deucher pci_set_power_state(pdev, PCI_D0);
2800c1dd4aa6SAndrey Grodzovsky amdgpu_device_load_pci_state(pdev);
2801d38ceaf9SAlex Deucher ret = pci_enable_device(pdev);
2802d38ceaf9SAlex Deucher if (ret)
2803d38ceaf9SAlex Deucher return ret;
2804637bb036SAlex Deucher pci_set_master(pdev);
280586e14a73SMa Jun } else if (adev->pm.rpm_mode == AMDGPU_RUNPM_BOCO) {
2806fd496ca8SAlex Deucher /* Only need to handle PCI state in the driver for ATPX
2807fd496ca8SAlex Deucher * PCI core handles it for _PR3.
2808fd496ca8SAlex Deucher */
2809fd496ca8SAlex Deucher pci_set_master(pdev);
2810fcc0735bSMa Jun } else if ((adev->pm.rpm_mode == AMDGPU_RUNPM_BACO) ||
2811fcc0735bSMa Jun (adev->pm.rpm_mode == AMDGPU_RUNPM_BAMACO)) {
281219134317SAlex Deucher amdgpu_device_baco_exit(drm_dev);
2813b97e9d47SAlex Deucher }
2814de185019SAlex Deucher ret = amdgpu_device_resume(drm_dev, false);
28156b11af6dSYang Yingliang if (ret) {
281686e14a73SMa Jun if (adev->pm.rpm_mode == AMDGPU_RUNPM_PX)
28176b11af6dSYang Yingliang pci_disable_device(pdev);
2818b45aeb2dSPavan Kumar Ramayanam return ret;
28196b11af6dSYang Yingliang }
2820b45aeb2dSPavan Kumar Ramayanam
282186e14a73SMa Jun if (adev->pm.rpm_mode == AMDGPU_RUNPM_PX)
2822d38ceaf9SAlex Deucher drm_dev->switch_power_state = DRM_SWITCH_POWER_ON;
2823f0f7ddfcSAlex Deucher adev->in_runpm = false;
2824d38ceaf9SAlex Deucher return 0;
2825d38ceaf9SAlex Deucher }
2826d38ceaf9SAlex Deucher
amdgpu_pmops_runtime_idle(struct device * dev)2827d38ceaf9SAlex Deucher static int amdgpu_pmops_runtime_idle(struct device *dev)
2828d38ceaf9SAlex Deucher {
2829911d8b30SChuhong Yuan struct drm_device *drm_dev = dev_get_drvdata(dev);
28301348969aSLuben Tuikov struct amdgpu_device *adev = drm_to_adev(drm_dev);
2831b07395d5SBjorn Helgaas int ret;
2832d38ceaf9SAlex Deucher
28339c913f38SGuchun Chen if (adev->pm.rpm_mode == AMDGPU_RUNPM_NONE) {
2834d38ceaf9SAlex Deucher pm_runtime_forbid(dev);
2835d38ceaf9SAlex Deucher return -EBUSY;
2836d38ceaf9SAlex Deucher }
2837d38ceaf9SAlex Deucher
28384020c228SAlex Deucher ret = amdgpu_runtime_idle_check_display(dev);
283997f6a21bSAndrey Grodzovsky
2840d38ceaf9SAlex Deucher pm_runtime_mark_last_busy(dev);
2841d38ceaf9SAlex Deucher pm_runtime_autosuspend(dev);
284297f6a21bSAndrey Grodzovsky return ret;
2843d38ceaf9SAlex Deucher }
2844d38ceaf9SAlex Deucher
amdgpu_drm_ioctl(struct file * filp,unsigned int cmd,unsigned long arg)2845d38ceaf9SAlex Deucher long amdgpu_drm_ioctl(struct file *filp,
2846d38ceaf9SAlex Deucher unsigned int cmd, unsigned long arg)
2847d38ceaf9SAlex Deucher {
2848d38ceaf9SAlex Deucher struct drm_file *file_priv = filp->private_data;
2849d38ceaf9SAlex Deucher struct drm_device *dev;
2850d38ceaf9SAlex Deucher long ret;
2851f9acfafcSSrinivasan Shanmugam
2852d38ceaf9SAlex Deucher dev = file_priv->minor->dev;
2853d38ceaf9SAlex Deucher ret = pm_runtime_get_sync(dev->dev);
2854d38ceaf9SAlex Deucher if (ret < 0)
28555509ac65SNavid Emamdoost goto out;
2856d38ceaf9SAlex Deucher
2857d38ceaf9SAlex Deucher ret = drm_ioctl(filp, cmd, arg);
2858d38ceaf9SAlex Deucher
2859d38ceaf9SAlex Deucher pm_runtime_mark_last_busy(dev->dev);
28605509ac65SNavid Emamdoost out:
2861d38ceaf9SAlex Deucher pm_runtime_put_autosuspend(dev->dev);
2862d38ceaf9SAlex Deucher return ret;
2863d38ceaf9SAlex Deucher }
2864d38ceaf9SAlex Deucher
2865d38ceaf9SAlex Deucher static const struct dev_pm_ops amdgpu_pm_ops = {
2866e25443d2SAlex Deucher .prepare = amdgpu_pmops_prepare,
2867e25443d2SAlex Deucher .complete = amdgpu_pmops_complete,
2868d38ceaf9SAlex Deucher .suspend = amdgpu_pmops_suspend,
28699e051720SKai-Heng Feng .suspend_noirq = amdgpu_pmops_suspend_noirq,
2870d38ceaf9SAlex Deucher .resume = amdgpu_pmops_resume,
2871d38ceaf9SAlex Deucher .freeze = amdgpu_pmops_freeze,
2872d38ceaf9SAlex Deucher .thaw = amdgpu_pmops_thaw,
287374b0b157Sjimqu .poweroff = amdgpu_pmops_poweroff,
287474b0b157Sjimqu .restore = amdgpu_pmops_restore,
2875d38ceaf9SAlex Deucher .runtime_suspend = amdgpu_pmops_runtime_suspend,
2876d38ceaf9SAlex Deucher .runtime_resume = amdgpu_pmops_runtime_resume,
2877d38ceaf9SAlex Deucher .runtime_idle = amdgpu_pmops_runtime_idle,
2878d38ceaf9SAlex Deucher };
2879d38ceaf9SAlex Deucher
amdgpu_flush(struct file * f,fl_owner_t id)288048ad368aSAndrey Grodzovsky static int amdgpu_flush(struct file *f, fl_owner_t id)
288148ad368aSAndrey Grodzovsky {
288248ad368aSAndrey Grodzovsky struct drm_file *file_priv = f->private_data;
288348ad368aSAndrey Grodzovsky struct amdgpu_fpriv *fpriv = file_priv->driver_priv;
288456753e73SChristian König long timeout = MAX_WAIT_SCHED_ENTITY_Q_EMPTY;
288548ad368aSAndrey Grodzovsky
288656753e73SChristian König timeout = amdgpu_ctx_mgr_entity_flush(&fpriv->ctx_mgr, timeout);
288756753e73SChristian König timeout = amdgpu_vm_wait_idle(&fpriv->vm, timeout);
288848ad368aSAndrey Grodzovsky
288956753e73SChristian König return timeout >= 0 ? 0 : timeout;
289048ad368aSAndrey Grodzovsky }
289148ad368aSAndrey Grodzovsky
2892d38ceaf9SAlex Deucher static const struct file_operations amdgpu_driver_kms_fops = {
2893d38ceaf9SAlex Deucher .owner = THIS_MODULE,
2894d38ceaf9SAlex Deucher .open = drm_open,
289548ad368aSAndrey Grodzovsky .flush = amdgpu_flush,
2896d38ceaf9SAlex Deucher .release = drm_release,
2897d38ceaf9SAlex Deucher .unlocked_ioctl = amdgpu_drm_ioctl,
289871df0368SThomas Zimmermann .mmap = drm_gem_mmap,
2899d38ceaf9SAlex Deucher .poll = drm_poll,
2900d38ceaf9SAlex Deucher .read = drm_read,
2901d38ceaf9SAlex Deucher #ifdef CONFIG_COMPAT
2902d38ceaf9SAlex Deucher .compat_ioctl = amdgpu_kms_compat_ioctl,
2903d38ceaf9SAlex Deucher #endif
290487444254SRoy Sun #ifdef CONFIG_PROC_FS
2905376c25f8SRob Clark .show_fdinfo = drm_show_fdinfo,
290687444254SRoy Sun #endif
2907641bb439SChristian Brauner .fop_flags = FOP_UNSIGNED_OFFSET,
2908d38ceaf9SAlex Deucher };
2909d38ceaf9SAlex Deucher
amdgpu_file_to_fpriv(struct file * filp,struct amdgpu_fpriv ** fpriv)2910021830d2SBas Nieuwenhuizen int amdgpu_file_to_fpriv(struct file *filp, struct amdgpu_fpriv **fpriv)
2911021830d2SBas Nieuwenhuizen {
2912021830d2SBas Nieuwenhuizen struct drm_file *file;
2913021830d2SBas Nieuwenhuizen
2914021830d2SBas Nieuwenhuizen if (!filp)
2915021830d2SBas Nieuwenhuizen return -EINVAL;
2916021830d2SBas Nieuwenhuizen
2917f9acfafcSSrinivasan Shanmugam if (filp->f_op != &amdgpu_driver_kms_fops)
2918021830d2SBas Nieuwenhuizen return -EINVAL;
2919021830d2SBas Nieuwenhuizen
2920021830d2SBas Nieuwenhuizen file = filp->private_data;
2921021830d2SBas Nieuwenhuizen *fpriv = file->driver_priv;
2922021830d2SBas Nieuwenhuizen return 0;
2923021830d2SBas Nieuwenhuizen }
2924021830d2SBas Nieuwenhuizen
29255088d657SLuben Tuikov const struct drm_ioctl_desc amdgpu_ioctls_kms[] = {
29265088d657SLuben Tuikov DRM_IOCTL_DEF_DRV(AMDGPU_GEM_CREATE, amdgpu_gem_create_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
29275088d657SLuben Tuikov DRM_IOCTL_DEF_DRV(AMDGPU_CTX, amdgpu_ctx_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
29285088d657SLuben Tuikov DRM_IOCTL_DEF_DRV(AMDGPU_VM, amdgpu_vm_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
29295088d657SLuben Tuikov DRM_IOCTL_DEF_DRV(AMDGPU_SCHED, amdgpu_sched_ioctl, DRM_MASTER),
29305088d657SLuben Tuikov DRM_IOCTL_DEF_DRV(AMDGPU_BO_LIST, amdgpu_bo_list_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
29315088d657SLuben Tuikov DRM_IOCTL_DEF_DRV(AMDGPU_FENCE_TO_HANDLE, amdgpu_cs_fence_to_handle_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
29325088d657SLuben Tuikov /* KMS */
29335088d657SLuben Tuikov DRM_IOCTL_DEF_DRV(AMDGPU_GEM_MMAP, amdgpu_gem_mmap_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
29345088d657SLuben Tuikov DRM_IOCTL_DEF_DRV(AMDGPU_GEM_WAIT_IDLE, amdgpu_gem_wait_idle_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
29355088d657SLuben Tuikov DRM_IOCTL_DEF_DRV(AMDGPU_CS, amdgpu_cs_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
29365088d657SLuben Tuikov DRM_IOCTL_DEF_DRV(AMDGPU_INFO, amdgpu_info_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
29375088d657SLuben Tuikov DRM_IOCTL_DEF_DRV(AMDGPU_WAIT_CS, amdgpu_cs_wait_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
29385088d657SLuben Tuikov DRM_IOCTL_DEF_DRV(AMDGPU_WAIT_FENCES, amdgpu_cs_wait_fences_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
29395088d657SLuben Tuikov DRM_IOCTL_DEF_DRV(AMDGPU_GEM_METADATA, amdgpu_gem_metadata_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
29405088d657SLuben Tuikov DRM_IOCTL_DEF_DRV(AMDGPU_GEM_VA, amdgpu_gem_va_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
29415088d657SLuben Tuikov DRM_IOCTL_DEF_DRV(AMDGPU_GEM_OP, amdgpu_gem_op_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
29425088d657SLuben Tuikov DRM_IOCTL_DEF_DRV(AMDGPU_GEM_USERPTR, amdgpu_gem_userptr_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
29435088d657SLuben Tuikov };
29445088d657SLuben Tuikov
29455088d657SLuben Tuikov static const struct drm_driver amdgpu_kms_driver = {
2946d38ceaf9SAlex Deucher .driver_features =
2947f3ed6739SDaniel Vetter DRIVER_ATOMIC |
29481ff49481SDaniel Vetter DRIVER_GEM |
2949db4ff423SChunming Zhou DRIVER_RENDER | DRIVER_MODESET | DRIVER_SYNCOBJ |
2950db4ff423SChunming Zhou DRIVER_SYNCOBJ_TIMELINE,
2951d38ceaf9SAlex Deucher .open = amdgpu_driver_open_kms,
2952d38ceaf9SAlex Deucher .postclose = amdgpu_driver_postclose_kms,
2953d38ceaf9SAlex Deucher .ioctls = amdgpu_ioctls_kms,
29545088d657SLuben Tuikov .num_ioctls = ARRAY_SIZE(amdgpu_ioctls_kms),
2955d38ceaf9SAlex Deucher .dumb_create = amdgpu_mode_dumb_create,
2956d38ceaf9SAlex Deucher .dumb_map_offset = amdgpu_mode_dumb_mmap,
295732acc286SThomas Zimmermann DRM_FBDEV_TTM_DRIVER_OPS,
2958d38ceaf9SAlex Deucher .fops = &amdgpu_driver_kms_fops,
295972c8c97bSAndrey Grodzovsky .release = &amdgpu_driver_release_kms,
29601a56fcf0SRob Clark #ifdef CONFIG_PROC_FS
2961376c25f8SRob Clark .show_fdinfo = amdgpu_show_fdinfo,
29621a56fcf0SRob Clark #endif
2963d38ceaf9SAlex Deucher
296409052fc3SSamuel Li .gem_prime_import = amdgpu_gem_prime_import,
2965d38ceaf9SAlex Deucher
2966d38ceaf9SAlex Deucher .name = DRIVER_NAME,
2967d38ceaf9SAlex Deucher .desc = DRIVER_DESC,
2968d38ceaf9SAlex Deucher .major = KMS_DRIVER_MAJOR,
2969d38ceaf9SAlex Deucher .minor = KMS_DRIVER_MINOR,
2970d38ceaf9SAlex Deucher .patchlevel = KMS_DRIVER_PATCHLEVEL,
2971d38ceaf9SAlex Deucher };
2972d38ceaf9SAlex Deucher
29732c1c7ba4SJames Zhu const struct drm_driver amdgpu_partition_driver = {
29742c1c7ba4SJames Zhu .driver_features =
29752c1c7ba4SJames Zhu DRIVER_GEM | DRIVER_RENDER | DRIVER_SYNCOBJ |
29762c1c7ba4SJames Zhu DRIVER_SYNCOBJ_TIMELINE,
29772c1c7ba4SJames Zhu .open = amdgpu_driver_open_kms,
29782c1c7ba4SJames Zhu .postclose = amdgpu_driver_postclose_kms,
29792c1c7ba4SJames Zhu .ioctls = amdgpu_ioctls_kms,
29802c1c7ba4SJames Zhu .num_ioctls = ARRAY_SIZE(amdgpu_ioctls_kms),
29812c1c7ba4SJames Zhu .dumb_create = amdgpu_mode_dumb_create,
29822c1c7ba4SJames Zhu .dumb_map_offset = amdgpu_mode_dumb_mmap,
298332acc286SThomas Zimmermann DRM_FBDEV_TTM_DRIVER_OPS,
29842c1c7ba4SJames Zhu .fops = &amdgpu_driver_kms_fops,
29852c1c7ba4SJames Zhu .release = &amdgpu_driver_release_kms,
29862c1c7ba4SJames Zhu
29872c1c7ba4SJames Zhu .gem_prime_import = amdgpu_gem_prime_import,
29882c1c7ba4SJames Zhu
29892c1c7ba4SJames Zhu .name = DRIVER_NAME,
29902c1c7ba4SJames Zhu .desc = DRIVER_DESC,
29912c1c7ba4SJames Zhu .major = KMS_DRIVER_MAJOR,
29922c1c7ba4SJames Zhu .minor = KMS_DRIVER_MINOR,
29932c1c7ba4SJames Zhu .patchlevel = KMS_DRIVER_PATCHLEVEL,
29942c1c7ba4SJames Zhu };
29952c1c7ba4SJames Zhu
2996c9a6b82fSAndrey Grodzovsky static struct pci_error_handlers amdgpu_pci_err_handler = {
2997c9a6b82fSAndrey Grodzovsky .error_detected = amdgpu_pci_error_detected,
2998c9a6b82fSAndrey Grodzovsky .mmio_enabled = amdgpu_pci_mmio_enabled,
2999c9a6b82fSAndrey Grodzovsky .slot_reset = amdgpu_pci_slot_reset,
3000c9a6b82fSAndrey Grodzovsky .resume = amdgpu_pci_resume,
3001c9a6b82fSAndrey Grodzovsky };
3002c9a6b82fSAndrey Grodzovsky
300335bba831SAndrey Grodzovsky static const struct attribute_group *amdgpu_sysfs_groups[] = {
300435bba831SAndrey Grodzovsky &amdgpu_vram_mgr_attr_group,
300535bba831SAndrey Grodzovsky &amdgpu_gtt_mgr_attr_group,
3006521289d2SMario Limonciello &amdgpu_flash_attr_group,
300735bba831SAndrey Grodzovsky NULL,
300835bba831SAndrey Grodzovsky };
300935bba831SAndrey Grodzovsky
3010d38ceaf9SAlex Deucher static struct pci_driver amdgpu_kms_pci_driver = {
3011d38ceaf9SAlex Deucher .name = DRIVER_NAME,
3012d38ceaf9SAlex Deucher .id_table = pciidlist,
3013d38ceaf9SAlex Deucher .probe = amdgpu_pci_probe,
3014d38ceaf9SAlex Deucher .remove = amdgpu_pci_remove,
301561e11306SAlex Deucher .shutdown = amdgpu_pci_shutdown,
3016d38ceaf9SAlex Deucher .driver.pm = &amdgpu_pm_ops,
3017c9a6b82fSAndrey Grodzovsky .err_handler = &amdgpu_pci_err_handler,
301835bba831SAndrey Grodzovsky .dev_groups = amdgpu_sysfs_groups,
3019d38ceaf9SAlex Deucher };
3020d38ceaf9SAlex Deucher
amdgpu_init(void)3021d38ceaf9SAlex Deucher static int __init amdgpu_init(void)
3022d38ceaf9SAlex Deucher {
3023245ae5e9SChristian König int r;
3024245ae5e9SChristian König
3025245ae5e9SChristian König r = amdgpu_sync_init();
3026245ae5e9SChristian König if (r)
3027245ae5e9SChristian König goto error_sync;
3028245ae5e9SChristian König
3029245ae5e9SChristian König r = amdgpu_fence_slab_init();
3030245ae5e9SChristian König if (r)
3031245ae5e9SChristian König goto error_fence;
3032245ae5e9SChristian König
3033d38ceaf9SAlex Deucher DRM_INFO("amdgpu kernel modesetting enabled.\n");
3034d38ceaf9SAlex Deucher amdgpu_register_atpx_handler();
3035f9b7f370SAlex Deucher amdgpu_acpi_detect();
303603a1c08dSFelix Kuehling
303703a1c08dSFelix Kuehling /* Ignore KFD init failures. Normal when CONFIG_HSA_AMD is not set. */
303803a1c08dSFelix Kuehling amdgpu_amdkfd_init();
303903a1c08dSFelix Kuehling
3040b472b8d8SMario Limonciello if (amdgpu_pp_feature_mask & PP_OVERDRIVE_MASK) {
3041b472b8d8SMario Limonciello add_taint(TAINT_CPU_OUT_OF_SPEC, LOCKDEP_STILL_OK);
3042b472b8d8SMario Limonciello pr_crit("Overdrive is enabled, please disable it before "
3043b472b8d8SMario Limonciello "reporting any bugs unrelated to overdrive.\n");
3044b472b8d8SMario Limonciello }
3045b472b8d8SMario Limonciello
3046d38ceaf9SAlex Deucher /* let modprobe override vga console setting */
3047448d1051SRex Zhu return pci_register_driver(&amdgpu_kms_pci_driver);
3048245ae5e9SChristian König
3049245ae5e9SChristian König error_fence:
3050245ae5e9SChristian König amdgpu_sync_fini();
3051245ae5e9SChristian König
3052245ae5e9SChristian König error_sync:
3053245ae5e9SChristian König return r;
3054d38ceaf9SAlex Deucher }
3055d38ceaf9SAlex Deucher
amdgpu_exit(void)3056d38ceaf9SAlex Deucher static void __exit amdgpu_exit(void)
3057d38ceaf9SAlex Deucher {
3058130e0371SOded Gabbay amdgpu_amdkfd_fini();
3059448d1051SRex Zhu pci_unregister_driver(&amdgpu_kms_pci_driver);
3060d38ceaf9SAlex Deucher amdgpu_unregister_atpx_handler();
30614d5275abSLijo Lazar amdgpu_acpi_release();
3062257bf15aSChristian König amdgpu_sync_fini();
3063d573de2dSRex Zhu amdgpu_fence_slab_fini();
3064c7d8b782SJason Gunthorpe mmu_notifier_synchronize();
30659938333aSJames Zhu amdgpu_xcp_drv_release();
3066d38ceaf9SAlex Deucher }
3067d38ceaf9SAlex Deucher
3068d38ceaf9SAlex Deucher module_init(amdgpu_init);
3069d38ceaf9SAlex Deucher module_exit(amdgpu_exit);
3070d38ceaf9SAlex Deucher
3071d38ceaf9SAlex Deucher MODULE_AUTHOR(DRIVER_AUTHOR);
3072d38ceaf9SAlex Deucher MODULE_DESCRIPTION(DRIVER_DESC);
3073d38ceaf9SAlex Deucher MODULE_LICENSE("GPL and additional rights");
3074