162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
362306a36Sopenharmony_ci * All Rights Reserved.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
662306a36Sopenharmony_ci * copy of this software and associated documentation files (the "Software"),
762306a36Sopenharmony_ci * to deal in the Software without restriction, including without limitation
862306a36Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense,
962306a36Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the
1062306a36Sopenharmony_ci * Software is furnished to do so, subject to the following conditions:
1162306a36Sopenharmony_ci *
1262306a36Sopenharmony_ci * The above copyright notice and this permission notice (including the next
1362306a36Sopenharmony_ci * paragraph) shall be included in all copies or substantial portions of the
1462306a36Sopenharmony_ci * Software.
1562306a36Sopenharmony_ci *
1662306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1762306a36Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1862306a36Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1962306a36Sopenharmony_ci * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
2062306a36Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
2162306a36Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2262306a36Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE.
2362306a36Sopenharmony_ci */
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci#include <drm/amdgpu_drm.h>
2662306a36Sopenharmony_ci#include <drm/drm_drv.h>
2762306a36Sopenharmony_ci#include <drm/drm_fbdev_generic.h>
2862306a36Sopenharmony_ci#include <drm/drm_gem.h>
2962306a36Sopenharmony_ci#include <drm/drm_managed.h>
3062306a36Sopenharmony_ci#include <drm/drm_pciids.h>
3162306a36Sopenharmony_ci#include <drm/drm_probe_helper.h>
3262306a36Sopenharmony_ci#include <drm/drm_vblank.h>
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#include <linux/cc_platform.h>
3562306a36Sopenharmony_ci#include <linux/dynamic_debug.h>
3662306a36Sopenharmony_ci#include <linux/module.h>
3762306a36Sopenharmony_ci#include <linux/mmu_notifier.h>
3862306a36Sopenharmony_ci#include <linux/pm_runtime.h>
3962306a36Sopenharmony_ci#include <linux/suspend.h>
4062306a36Sopenharmony_ci#include <linux/vga_switcheroo.h>
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci#include "amdgpu.h"
4362306a36Sopenharmony_ci#include "amdgpu_amdkfd.h"
4462306a36Sopenharmony_ci#include "amdgpu_dma_buf.h"
4562306a36Sopenharmony_ci#include "amdgpu_drv.h"
4662306a36Sopenharmony_ci#include "amdgpu_fdinfo.h"
4762306a36Sopenharmony_ci#include "amdgpu_irq.h"
4862306a36Sopenharmony_ci#include "amdgpu_psp.h"
4962306a36Sopenharmony_ci#include "amdgpu_ras.h"
5062306a36Sopenharmony_ci#include "amdgpu_reset.h"
5162306a36Sopenharmony_ci#include "amdgpu_sched.h"
5262306a36Sopenharmony_ci#include "amdgpu_xgmi.h"
5362306a36Sopenharmony_ci#include "../amdxcp/amdgpu_xcp_drv.h"
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci/*
5662306a36Sopenharmony_ci * KMS wrapper.
5762306a36Sopenharmony_ci * - 3.0.0 - initial driver
5862306a36Sopenharmony_ci * - 3.1.0 - allow reading more status registers (GRBM, SRBM, SDMA, CP)
5962306a36Sopenharmony_ci * - 3.2.0 - GFX8: Uses EOP_TC_WB_ACTION_EN, so UMDs don't have to do the same
6062306a36Sopenharmony_ci *           at the end of IBs.
6162306a36Sopenharmony_ci * - 3.3.0 - Add VM support for UVD on supported hardware.
6262306a36Sopenharmony_ci * - 3.4.0 - Add AMDGPU_INFO_NUM_EVICTIONS.
6362306a36Sopenharmony_ci * - 3.5.0 - Add support for new UVD_NO_OP register.
6462306a36Sopenharmony_ci * - 3.6.0 - kmd involves use CONTEXT_CONTROL in ring buffer.
6562306a36Sopenharmony_ci * - 3.7.0 - Add support for VCE clock list packet
6662306a36Sopenharmony_ci * - 3.8.0 - Add support raster config init in the kernel
6762306a36Sopenharmony_ci * - 3.9.0 - Add support for memory query info about VRAM and GTT.
6862306a36Sopenharmony_ci * - 3.10.0 - Add support for new fences ioctl, new gem ioctl flags
6962306a36Sopenharmony_ci * - 3.11.0 - Add support for sensor query info (clocks, temp, etc).
7062306a36Sopenharmony_ci * - 3.12.0 - Add query for double offchip LDS buffers
7162306a36Sopenharmony_ci * - 3.13.0 - Add PRT support
7262306a36Sopenharmony_ci * - 3.14.0 - Fix race in amdgpu_ctx_get_fence() and note new functionality
7362306a36Sopenharmony_ci * - 3.15.0 - Export more gpu info for gfx9
7462306a36Sopenharmony_ci * - 3.16.0 - Add reserved vmid support
7562306a36Sopenharmony_ci * - 3.17.0 - Add AMDGPU_NUM_VRAM_CPU_PAGE_FAULTS.
7662306a36Sopenharmony_ci * - 3.18.0 - Export gpu always on cu bitmap
7762306a36Sopenharmony_ci * - 3.19.0 - Add support for UVD MJPEG decode
7862306a36Sopenharmony_ci * - 3.20.0 - Add support for local BOs
7962306a36Sopenharmony_ci * - 3.21.0 - Add DRM_AMDGPU_FENCE_TO_HANDLE ioctl
8062306a36Sopenharmony_ci * - 3.22.0 - Add DRM_AMDGPU_SCHED ioctl
8162306a36Sopenharmony_ci * - 3.23.0 - Add query for VRAM lost counter
8262306a36Sopenharmony_ci * - 3.24.0 - Add high priority compute support for gfx9
8362306a36Sopenharmony_ci * - 3.25.0 - Add support for sensor query info (stable pstate sclk/mclk).
8462306a36Sopenharmony_ci * - 3.26.0 - GFX9: Process AMDGPU_IB_FLAG_TC_WB_NOT_INVALIDATE.
8562306a36Sopenharmony_ci * - 3.27.0 - Add new chunk to AMDGPU_CS to enable BO_LIST creation.
8662306a36Sopenharmony_ci * - 3.28.0 - Add AMDGPU_CHUNK_ID_SCHEDULED_DEPENDENCIES
8762306a36Sopenharmony_ci * - 3.29.0 - Add AMDGPU_IB_FLAG_RESET_GDS_MAX_WAVE_ID
8862306a36Sopenharmony_ci * - 3.30.0 - Add AMDGPU_SCHED_OP_CONTEXT_PRIORITY_OVERRIDE.
8962306a36Sopenharmony_ci * - 3.31.0 - Add support for per-flip tiling attribute changes with DC
9062306a36Sopenharmony_ci * - 3.32.0 - Add syncobj timeline support to AMDGPU_CS.
9162306a36Sopenharmony_ci * - 3.33.0 - Fixes for GDS ENOMEM failures in AMDGPU_CS.
9262306a36Sopenharmony_ci * - 3.34.0 - Non-DC can flip correctly between buffers with different pitches
9362306a36Sopenharmony_ci * - 3.35.0 - Add drm_amdgpu_info_device::tcc_disabled_mask
9462306a36Sopenharmony_ci * - 3.36.0 - Allow reading more status registers on si/cik
9562306a36Sopenharmony_ci * - 3.37.0 - L2 is invalidated before SDMA IBs, needed for correctness
9662306a36Sopenharmony_ci * - 3.38.0 - Add AMDGPU_IB_FLAG_EMIT_MEM_SYNC
9762306a36Sopenharmony_ci * - 3.39.0 - DMABUF implicit sync does a full pipeline sync
9862306a36Sopenharmony_ci * - 3.40.0 - Add AMDGPU_IDS_FLAGS_TMZ
9962306a36Sopenharmony_ci * - 3.41.0 - Add video codec query
10062306a36Sopenharmony_ci * - 3.42.0 - Add 16bpc fixed point display support
10162306a36Sopenharmony_ci * - 3.43.0 - Add device hot plug/unplug support
10262306a36Sopenharmony_ci * - 3.44.0 - DCN3 supports DCC independent block settings: !64B && 128B, 64B && 128B
10362306a36Sopenharmony_ci * - 3.45.0 - Add context ioctl stable pstate interface
10462306a36Sopenharmony_ci * - 3.46.0 - To enable hot plug amdgpu tests in libdrm
10562306a36Sopenharmony_ci * - 3.47.0 - Add AMDGPU_GEM_CREATE_DISCARDABLE and AMDGPU_VM_NOALLOC flags
10662306a36Sopenharmony_ci * - 3.48.0 - Add IP discovery version info to HW INFO
10762306a36Sopenharmony_ci * - 3.49.0 - Add gang submit into CS IOCTL
10862306a36Sopenharmony_ci * - 3.50.0 - Update AMDGPU_INFO_DEV_INFO IOCTL for minimum engine and memory clock
10962306a36Sopenharmony_ci *            Update AMDGPU_INFO_SENSOR IOCTL for PEAK_PSTATE engine and memory clock
11062306a36Sopenharmony_ci *   3.51.0 - Return the PCIe gen and lanes from the INFO ioctl
11162306a36Sopenharmony_ci *   3.52.0 - Add AMDGPU_IDS_FLAGS_CONFORMANT_TRUNC_COORD, add device_info fields:
11262306a36Sopenharmony_ci *            tcp_cache_size, num_sqc_per_wgp, sqc_data_cache_size, sqc_inst_cache_size,
11362306a36Sopenharmony_ci *            gl1c_cache_size, gl2c_cache_size, mall_size, enabled_rb_pipes_mask_hi
11462306a36Sopenharmony_ci *   3.53.0 - Support for GFX11 CP GFX shadowing
11562306a36Sopenharmony_ci *   3.54.0 - Add AMDGPU_CTX_QUERY2_FLAGS_RESET_IN_PROGRESS support
11662306a36Sopenharmony_ci */
11762306a36Sopenharmony_ci#define KMS_DRIVER_MAJOR	3
11862306a36Sopenharmony_ci#define KMS_DRIVER_MINOR	54
11962306a36Sopenharmony_ci#define KMS_DRIVER_PATCHLEVEL	0
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ciunsigned int amdgpu_vram_limit = UINT_MAX;
12262306a36Sopenharmony_ciint amdgpu_vis_vram_limit;
12362306a36Sopenharmony_ciint amdgpu_gart_size = -1; /* auto */
12462306a36Sopenharmony_ciint amdgpu_gtt_size = -1; /* auto */
12562306a36Sopenharmony_ciint amdgpu_moverate = -1; /* auto */
12662306a36Sopenharmony_ciint amdgpu_audio = -1;
12762306a36Sopenharmony_ciint amdgpu_disp_priority;
12862306a36Sopenharmony_ciint amdgpu_hw_i2c;
12962306a36Sopenharmony_ciint amdgpu_pcie_gen2 = -1;
13062306a36Sopenharmony_ciint amdgpu_msi = -1;
13162306a36Sopenharmony_cichar amdgpu_lockup_timeout[AMDGPU_MAX_TIMEOUT_PARAM_LENGTH];
13262306a36Sopenharmony_ciint amdgpu_dpm = -1;
13362306a36Sopenharmony_ciint amdgpu_fw_load_type = -1;
13462306a36Sopenharmony_ciint amdgpu_aspm = -1;
13562306a36Sopenharmony_ciint amdgpu_runtime_pm = -1;
13662306a36Sopenharmony_ciuint amdgpu_ip_block_mask = 0xffffffff;
13762306a36Sopenharmony_ciint amdgpu_bapm = -1;
13862306a36Sopenharmony_ciint amdgpu_deep_color;
13962306a36Sopenharmony_ciint amdgpu_vm_size = -1;
14062306a36Sopenharmony_ciint amdgpu_vm_fragment_size = -1;
14162306a36Sopenharmony_ciint amdgpu_vm_block_size = -1;
14262306a36Sopenharmony_ciint amdgpu_vm_fault_stop;
14362306a36Sopenharmony_ciint amdgpu_vm_debug;
14462306a36Sopenharmony_ciint amdgpu_vm_update_mode = -1;
14562306a36Sopenharmony_ciint amdgpu_exp_hw_support;
14662306a36Sopenharmony_ciint amdgpu_dc = -1;
14762306a36Sopenharmony_ciint amdgpu_sched_jobs = 32;
14862306a36Sopenharmony_ciint amdgpu_sched_hw_submission = 2;
14962306a36Sopenharmony_ciuint amdgpu_pcie_gen_cap;
15062306a36Sopenharmony_ciuint amdgpu_pcie_lane_cap;
15162306a36Sopenharmony_ciu64 amdgpu_cg_mask = 0xffffffffffffffff;
15262306a36Sopenharmony_ciuint amdgpu_pg_mask = 0xffffffff;
15362306a36Sopenharmony_ciuint amdgpu_sdma_phase_quantum = 32;
15462306a36Sopenharmony_cichar *amdgpu_disable_cu;
15562306a36Sopenharmony_cichar *amdgpu_virtual_display;
15662306a36Sopenharmony_cibool enforce_isolation;
15762306a36Sopenharmony_ci/*
15862306a36Sopenharmony_ci * OverDrive(bit 14) disabled by default
15962306a36Sopenharmony_ci * GFX DCS(bit 19) disabled by default
16062306a36Sopenharmony_ci */
16162306a36Sopenharmony_ciuint amdgpu_pp_feature_mask = 0xfff7bfff;
16262306a36Sopenharmony_ciuint amdgpu_force_long_training;
16362306a36Sopenharmony_ciint amdgpu_lbpw = -1;
16462306a36Sopenharmony_ciint amdgpu_compute_multipipe = -1;
16562306a36Sopenharmony_ciint amdgpu_gpu_recovery = -1; /* auto */
16662306a36Sopenharmony_ciint amdgpu_emu_mode;
16762306a36Sopenharmony_ciuint amdgpu_smu_memory_pool_size;
16862306a36Sopenharmony_ciint amdgpu_smu_pptable_id = -1;
16962306a36Sopenharmony_ci/*
17062306a36Sopenharmony_ci * FBC (bit 0) disabled by default
17162306a36Sopenharmony_ci * MULTI_MON_PP_MCLK_SWITCH (bit 1) enabled by default
17262306a36Sopenharmony_ci *   - With this, for multiple monitors in sync(e.g. with the same model),
17362306a36Sopenharmony_ci *     mclk switching will be allowed. And the mclk will be not foced to the
17462306a36Sopenharmony_ci *     highest. That helps saving some idle power.
17562306a36Sopenharmony_ci * DISABLE_FRACTIONAL_PWM (bit 2) disabled by default
17662306a36Sopenharmony_ci * PSR (bit 3) disabled by default
17762306a36Sopenharmony_ci * EDP NO POWER SEQUENCING (bit 4) disabled by default
17862306a36Sopenharmony_ci */
17962306a36Sopenharmony_ciuint amdgpu_dc_feature_mask = 2;
18062306a36Sopenharmony_ciuint amdgpu_dc_debug_mask;
18162306a36Sopenharmony_ciuint amdgpu_dc_visual_confirm;
18262306a36Sopenharmony_ciint amdgpu_async_gfx_ring = 1;
18362306a36Sopenharmony_ciint amdgpu_mcbp = -1;
18462306a36Sopenharmony_ciint amdgpu_discovery = -1;
18562306a36Sopenharmony_ciint amdgpu_mes;
18662306a36Sopenharmony_ciint amdgpu_mes_kiq;
18762306a36Sopenharmony_ciint amdgpu_noretry = -1;
18862306a36Sopenharmony_ciint amdgpu_force_asic_type = -1;
18962306a36Sopenharmony_ciint amdgpu_tmz = -1; /* auto */
19062306a36Sopenharmony_ciint amdgpu_reset_method = -1; /* auto */
19162306a36Sopenharmony_ciint amdgpu_num_kcq = -1;
19262306a36Sopenharmony_ciint amdgpu_smartshift_bias;
19362306a36Sopenharmony_ciint amdgpu_use_xgmi_p2p = 1;
19462306a36Sopenharmony_ciint amdgpu_vcnfw_log;
19562306a36Sopenharmony_ciint amdgpu_sg_display = -1; /* auto */
19662306a36Sopenharmony_ciint amdgpu_user_partt_mode = AMDGPU_AUTO_COMPUTE_PARTITION_MODE;
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_cistatic void amdgpu_drv_delayed_reset_work_handler(struct work_struct *work);
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ciDECLARE_DYNDBG_CLASSMAP(drm_debug_classes, DD_CLASS_TYPE_DISJOINT_BITS, 0,
20162306a36Sopenharmony_ci			"DRM_UT_CORE",
20262306a36Sopenharmony_ci			"DRM_UT_DRIVER",
20362306a36Sopenharmony_ci			"DRM_UT_KMS",
20462306a36Sopenharmony_ci			"DRM_UT_PRIME",
20562306a36Sopenharmony_ci			"DRM_UT_ATOMIC",
20662306a36Sopenharmony_ci			"DRM_UT_VBL",
20762306a36Sopenharmony_ci			"DRM_UT_STATE",
20862306a36Sopenharmony_ci			"DRM_UT_LEASE",
20962306a36Sopenharmony_ci			"DRM_UT_DP",
21062306a36Sopenharmony_ci			"DRM_UT_DRMRES");
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_cistruct amdgpu_mgpu_info mgpu_info = {
21362306a36Sopenharmony_ci	.mutex = __MUTEX_INITIALIZER(mgpu_info.mutex),
21462306a36Sopenharmony_ci	.delayed_reset_work = __DELAYED_WORK_INITIALIZER(
21562306a36Sopenharmony_ci			mgpu_info.delayed_reset_work,
21662306a36Sopenharmony_ci			amdgpu_drv_delayed_reset_work_handler, 0),
21762306a36Sopenharmony_ci};
21862306a36Sopenharmony_ciint amdgpu_ras_enable = -1;
21962306a36Sopenharmony_ciuint amdgpu_ras_mask = 0xffffffff;
22062306a36Sopenharmony_ciint amdgpu_bad_page_threshold = -1;
22162306a36Sopenharmony_cistruct amdgpu_watchdog_timer amdgpu_watchdog_timer = {
22262306a36Sopenharmony_ci	.timeout_fatal_disable = false,
22362306a36Sopenharmony_ci	.period = 0x0, /* default to 0x0 (timeout disable) */
22462306a36Sopenharmony_ci};
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci/**
22762306a36Sopenharmony_ci * DOC: vramlimit (int)
22862306a36Sopenharmony_ci * Restrict the total amount of VRAM in MiB for testing.  The default is 0 (Use full VRAM).
22962306a36Sopenharmony_ci */
23062306a36Sopenharmony_ciMODULE_PARM_DESC(vramlimit, "Restrict VRAM for testing, in megabytes");
23162306a36Sopenharmony_cimodule_param_named(vramlimit, amdgpu_vram_limit, int, 0600);
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci/**
23462306a36Sopenharmony_ci * DOC: vis_vramlimit (int)
23562306a36Sopenharmony_ci * Restrict the amount of CPU visible VRAM in MiB for testing.  The default is 0 (Use full CPU visible VRAM).
23662306a36Sopenharmony_ci */
23762306a36Sopenharmony_ciMODULE_PARM_DESC(vis_vramlimit, "Restrict visible VRAM for testing, in megabytes");
23862306a36Sopenharmony_cimodule_param_named(vis_vramlimit, amdgpu_vis_vram_limit, int, 0444);
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_ci/**
24162306a36Sopenharmony_ci * DOC: gartsize (uint)
24262306a36Sopenharmony_ci * Restrict the size of GART (for kernel use) in Mib (32, 64, etc.) for testing.
24362306a36Sopenharmony_ci * The default is -1 (The size depends on asic).
24462306a36Sopenharmony_ci */
24562306a36Sopenharmony_ciMODULE_PARM_DESC(gartsize, "Size of kernel GART to setup in megabytes (32, 64, etc., -1=auto)");
24662306a36Sopenharmony_cimodule_param_named(gartsize, amdgpu_gart_size, uint, 0600);
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ci/**
24962306a36Sopenharmony_ci * DOC: gttsize (int)
25062306a36Sopenharmony_ci * Restrict the size of GTT domain (for userspace use) in MiB for testing.
25162306a36Sopenharmony_ci * The default is -1 (Use 1/2 RAM, minimum value is 3GB).
25262306a36Sopenharmony_ci */
25362306a36Sopenharmony_ciMODULE_PARM_DESC(gttsize, "Size of the GTT userspace domain in megabytes (-1 = auto)");
25462306a36Sopenharmony_cimodule_param_named(gttsize, amdgpu_gtt_size, int, 0600);
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci/**
25762306a36Sopenharmony_ci * DOC: moverate (int)
25862306a36Sopenharmony_ci * Set maximum buffer migration rate in MB/s. The default is -1 (8 MB/s).
25962306a36Sopenharmony_ci */
26062306a36Sopenharmony_ciMODULE_PARM_DESC(moverate, "Maximum buffer migration rate in MB/s. (32, 64, etc., -1=auto, 0=1=disabled)");
26162306a36Sopenharmony_cimodule_param_named(moverate, amdgpu_moverate, int, 0600);
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci/**
26462306a36Sopenharmony_ci * DOC: audio (int)
26562306a36Sopenharmony_ci * Set HDMI/DPAudio. Only affects non-DC display handling. The default is -1 (Enabled), set 0 to disabled it.
26662306a36Sopenharmony_ci */
26762306a36Sopenharmony_ciMODULE_PARM_DESC(audio, "Audio enable (-1 = auto, 0 = disable, 1 = enable)");
26862306a36Sopenharmony_cimodule_param_named(audio, amdgpu_audio, int, 0444);
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_ci/**
27162306a36Sopenharmony_ci * DOC: disp_priority (int)
27262306a36Sopenharmony_ci * Set display Priority (1 = normal, 2 = high). Only affects non-DC display handling. The default is 0 (auto).
27362306a36Sopenharmony_ci */
27462306a36Sopenharmony_ciMODULE_PARM_DESC(disp_priority, "Display Priority (0 = auto, 1 = normal, 2 = high)");
27562306a36Sopenharmony_cimodule_param_named(disp_priority, amdgpu_disp_priority, int, 0444);
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_ci/**
27862306a36Sopenharmony_ci * DOC: hw_i2c (int)
27962306a36Sopenharmony_ci * To enable hw i2c engine. Only affects non-DC display handling. The default is 0 (Disabled).
28062306a36Sopenharmony_ci */
28162306a36Sopenharmony_ciMODULE_PARM_DESC(hw_i2c, "hw i2c engine enable (0 = disable)");
28262306a36Sopenharmony_cimodule_param_named(hw_i2c, amdgpu_hw_i2c, int, 0444);
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ci/**
28562306a36Sopenharmony_ci * DOC: pcie_gen2 (int)
28662306a36Sopenharmony_ci * To disable PCIE Gen2/3 mode (0 = disable, 1 = enable). The default is -1 (auto, enabled).
28762306a36Sopenharmony_ci */
28862306a36Sopenharmony_ciMODULE_PARM_DESC(pcie_gen2, "PCIE Gen2 mode (-1 = auto, 0 = disable, 1 = enable)");
28962306a36Sopenharmony_cimodule_param_named(pcie_gen2, amdgpu_pcie_gen2, int, 0444);
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci/**
29262306a36Sopenharmony_ci * DOC: msi (int)
29362306a36Sopenharmony_ci * To disable Message Signaled Interrupts (MSI) functionality (1 = enable, 0 = disable). The default is -1 (auto, enabled).
29462306a36Sopenharmony_ci */
29562306a36Sopenharmony_ciMODULE_PARM_DESC(msi, "MSI support (1 = enable, 0 = disable, -1 = auto)");
29662306a36Sopenharmony_cimodule_param_named(msi, amdgpu_msi, int, 0444);
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_ci/**
29962306a36Sopenharmony_ci * DOC: lockup_timeout (string)
30062306a36Sopenharmony_ci * Set GPU scheduler timeout value in ms.
30162306a36Sopenharmony_ci *
30262306a36Sopenharmony_ci * The format can be [Non-Compute] or [GFX,Compute,SDMA,Video]. That is there can be one or
30362306a36Sopenharmony_ci * multiple values specified. 0 and negative values are invalidated. They will be adjusted
30462306a36Sopenharmony_ci * to the default timeout.
30562306a36Sopenharmony_ci *
30662306a36Sopenharmony_ci * - With one value specified, the setting will apply to all non-compute jobs.
30762306a36Sopenharmony_ci * - With multiple values specified, the first one will be for GFX.
30862306a36Sopenharmony_ci *   The second one is for Compute. The third and fourth ones are
30962306a36Sopenharmony_ci *   for SDMA and Video.
31062306a36Sopenharmony_ci *
31162306a36Sopenharmony_ci * By default(with no lockup_timeout settings), the timeout for all non-compute(GFX, SDMA and Video)
31262306a36Sopenharmony_ci * jobs is 10000. The timeout for compute is 60000.
31362306a36Sopenharmony_ci */
31462306a36Sopenharmony_ciMODULE_PARM_DESC(lockup_timeout, "GPU lockup timeout in ms (default: for bare metal 10000 for non-compute jobs and 60000 for compute jobs; "
31562306a36Sopenharmony_ci		"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]; "
31662306a36Sopenharmony_ci		"for passthrough or sriov [all jobs] or [GFX,Compute,SDMA,Video].");
31762306a36Sopenharmony_cimodule_param_string(lockup_timeout, amdgpu_lockup_timeout, sizeof(amdgpu_lockup_timeout), 0444);
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_ci/**
32062306a36Sopenharmony_ci * DOC: dpm (int)
32162306a36Sopenharmony_ci * Override for dynamic power management setting
32262306a36Sopenharmony_ci * (0 = disable, 1 = enable)
32362306a36Sopenharmony_ci * The default is -1 (auto).
32462306a36Sopenharmony_ci */
32562306a36Sopenharmony_ciMODULE_PARM_DESC(dpm, "DPM support (1 = enable, 0 = disable, -1 = auto)");
32662306a36Sopenharmony_cimodule_param_named(dpm, amdgpu_dpm, int, 0444);
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci/**
32962306a36Sopenharmony_ci * DOC: fw_load_type (int)
33062306a36Sopenharmony_ci * Set different firmware loading type for debugging, if supported.
33162306a36Sopenharmony_ci * Set to 0 to force direct loading if supported by the ASIC.  Set
33262306a36Sopenharmony_ci * to -1 to select the default loading mode for the ASIC, as defined
33362306a36Sopenharmony_ci * by the driver.  The default is -1 (auto).
33462306a36Sopenharmony_ci */
33562306a36Sopenharmony_ciMODULE_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)");
33662306a36Sopenharmony_cimodule_param_named(fw_load_type, amdgpu_fw_load_type, int, 0444);
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_ci/**
33962306a36Sopenharmony_ci * DOC: aspm (int)
34062306a36Sopenharmony_ci * To disable ASPM (1 = enable, 0 = disable). The default is -1 (auto, enabled).
34162306a36Sopenharmony_ci */
34262306a36Sopenharmony_ciMODULE_PARM_DESC(aspm, "ASPM support (1 = enable, 0 = disable, -1 = auto)");
34362306a36Sopenharmony_cimodule_param_named(aspm, amdgpu_aspm, int, 0444);
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci/**
34662306a36Sopenharmony_ci * DOC: runpm (int)
34762306a36Sopenharmony_ci * Override for runtime power management control for dGPUs. The amdgpu driver can dynamically power down
34862306a36Sopenharmony_ci * the dGPUs when they are idle if supported. The default is -1 (auto enable).
34962306a36Sopenharmony_ci * Setting the value to 0 disables this functionality.
35062306a36Sopenharmony_ci * Setting the value to -2 is auto enabled with power down when displays are attached.
35162306a36Sopenharmony_ci */
35262306a36Sopenharmony_ciMODULE_PARM_DESC(runpm, "PX runtime pm (2 = force enable with BAMACO, 1 = force enable with BACO, 0 = disable, -1 = auto, -2 = autowith displays)");
35362306a36Sopenharmony_cimodule_param_named(runpm, amdgpu_runtime_pm, int, 0444);
35462306a36Sopenharmony_ci
35562306a36Sopenharmony_ci/**
35662306a36Sopenharmony_ci * DOC: ip_block_mask (uint)
35762306a36Sopenharmony_ci * Override what IP blocks are enabled on the GPU. Each GPU is a collection of IP blocks (gfx, display, video, etc.).
35862306a36Sopenharmony_ci * Use this parameter to disable specific blocks. Note that the IP blocks do not have a fixed index. Some asics may not have
35962306a36Sopenharmony_ci * some IPs or may include multiple instances of an IP so the ordering various from asic to asic. See the driver output in
36062306a36Sopenharmony_ci * the kernel log for the list of IPs on the asic. The default is 0xffffffff (enable all blocks on a device).
36162306a36Sopenharmony_ci */
36262306a36Sopenharmony_ciMODULE_PARM_DESC(ip_block_mask, "IP Block Mask (all blocks enabled (default))");
36362306a36Sopenharmony_cimodule_param_named(ip_block_mask, amdgpu_ip_block_mask, uint, 0444);
36462306a36Sopenharmony_ci
36562306a36Sopenharmony_ci/**
36662306a36Sopenharmony_ci * DOC: bapm (int)
36762306a36Sopenharmony_ci * Bidirectional Application Power Management (BAPM) used to dynamically share TDP between CPU and GPU. Set value 0 to disable it.
36862306a36Sopenharmony_ci * The default -1 (auto, enabled)
36962306a36Sopenharmony_ci */
37062306a36Sopenharmony_ciMODULE_PARM_DESC(bapm, "BAPM support (1 = enable, 0 = disable, -1 = auto)");
37162306a36Sopenharmony_cimodule_param_named(bapm, amdgpu_bapm, int, 0444);
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ci/**
37462306a36Sopenharmony_ci * DOC: deep_color (int)
37562306a36Sopenharmony_ci * Set 1 to enable Deep Color support. Only affects non-DC display handling. The default is 0 (disabled).
37662306a36Sopenharmony_ci */
37762306a36Sopenharmony_ciMODULE_PARM_DESC(deep_color, "Deep Color support (1 = enable, 0 = disable (default))");
37862306a36Sopenharmony_cimodule_param_named(deep_color, amdgpu_deep_color, int, 0444);
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ci/**
38162306a36Sopenharmony_ci * DOC: vm_size (int)
38262306a36Sopenharmony_ci * Override the size of the GPU's per client virtual address space in GiB.  The default is -1 (automatic for each asic).
38362306a36Sopenharmony_ci */
38462306a36Sopenharmony_ciMODULE_PARM_DESC(vm_size, "VM address space size in gigabytes (default 64GB)");
38562306a36Sopenharmony_cimodule_param_named(vm_size, amdgpu_vm_size, int, 0444);
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_ci/**
38862306a36Sopenharmony_ci * DOC: vm_fragment_size (int)
38962306a36Sopenharmony_ci * Override VM fragment size in bits (4, 5, etc. 4 = 64K, 9 = 2M). The default is -1 (automatic for each asic).
39062306a36Sopenharmony_ci */
39162306a36Sopenharmony_ciMODULE_PARM_DESC(vm_fragment_size, "VM fragment size in bits (4, 5, etc. 4 = 64K (default), Max 9 = 2M)");
39262306a36Sopenharmony_cimodule_param_named(vm_fragment_size, amdgpu_vm_fragment_size, int, 0444);
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci/**
39562306a36Sopenharmony_ci * DOC: vm_block_size (int)
39662306a36Sopenharmony_ci * Override VM page table size in bits (default depending on vm_size and hw setup). The default is -1 (automatic for each asic).
39762306a36Sopenharmony_ci */
39862306a36Sopenharmony_ciMODULE_PARM_DESC(vm_block_size, "VM page table size in bits (default depending on vm_size)");
39962306a36Sopenharmony_cimodule_param_named(vm_block_size, amdgpu_vm_block_size, int, 0444);
40062306a36Sopenharmony_ci
40162306a36Sopenharmony_ci/**
40262306a36Sopenharmony_ci * DOC: vm_fault_stop (int)
40362306a36Sopenharmony_ci * Stop on VM fault for debugging (0 = never, 1 = print first, 2 = always). The default is 0 (No stop).
40462306a36Sopenharmony_ci */
40562306a36Sopenharmony_ciMODULE_PARM_DESC(vm_fault_stop, "Stop on VM fault (0 = never (default), 1 = print first, 2 = always)");
40662306a36Sopenharmony_cimodule_param_named(vm_fault_stop, amdgpu_vm_fault_stop, int, 0444);
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_ci/**
40962306a36Sopenharmony_ci * DOC: vm_debug (int)
41062306a36Sopenharmony_ci * Debug VM handling (0 = disabled, 1 = enabled). The default is 0 (Disabled).
41162306a36Sopenharmony_ci */
41262306a36Sopenharmony_ciMODULE_PARM_DESC(vm_debug, "Debug VM handling (0 = disabled (default), 1 = enabled)");
41362306a36Sopenharmony_cimodule_param_named(vm_debug, amdgpu_vm_debug, int, 0644);
41462306a36Sopenharmony_ci
41562306a36Sopenharmony_ci/**
41662306a36Sopenharmony_ci * DOC: vm_update_mode (int)
41762306a36Sopenharmony_ci * Override VM update mode. VM updated by using CPU (0 = never, 1 = Graphics only, 2 = Compute only, 3 = Both). The default
41862306a36Sopenharmony_ci * is -1 (Only in large BAR(LB) systems Compute VM tables will be updated by CPU, otherwise 0, never).
41962306a36Sopenharmony_ci */
42062306a36Sopenharmony_ciMODULE_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");
42162306a36Sopenharmony_cimodule_param_named(vm_update_mode, amdgpu_vm_update_mode, int, 0444);
42262306a36Sopenharmony_ci
42362306a36Sopenharmony_ci/**
42462306a36Sopenharmony_ci * DOC: exp_hw_support (int)
42562306a36Sopenharmony_ci * Enable experimental hw support (1 = enable). The default is 0 (disabled).
42662306a36Sopenharmony_ci */
42762306a36Sopenharmony_ciMODULE_PARM_DESC(exp_hw_support, "experimental hw support (1 = enable, 0 = disable (default))");
42862306a36Sopenharmony_cimodule_param_named(exp_hw_support, amdgpu_exp_hw_support, int, 0444);
42962306a36Sopenharmony_ci
43062306a36Sopenharmony_ci/**
43162306a36Sopenharmony_ci * DOC: dc (int)
43262306a36Sopenharmony_ci * Disable/Enable Display Core driver for debugging (1 = enable, 0 = disable). The default is -1 (automatic for each asic).
43362306a36Sopenharmony_ci */
43462306a36Sopenharmony_ciMODULE_PARM_DESC(dc, "Display Core driver (1 = enable, 0 = disable, -1 = auto (default))");
43562306a36Sopenharmony_cimodule_param_named(dc, amdgpu_dc, int, 0444);
43662306a36Sopenharmony_ci
43762306a36Sopenharmony_ci/**
43862306a36Sopenharmony_ci * DOC: sched_jobs (int)
43962306a36Sopenharmony_ci * Override the max number of jobs supported in the sw queue. The default is 32.
44062306a36Sopenharmony_ci */
44162306a36Sopenharmony_ciMODULE_PARM_DESC(sched_jobs, "the max number of jobs supported in the sw queue (default 32)");
44262306a36Sopenharmony_cimodule_param_named(sched_jobs, amdgpu_sched_jobs, int, 0444);
44362306a36Sopenharmony_ci
44462306a36Sopenharmony_ci/**
44562306a36Sopenharmony_ci * DOC: sched_hw_submission (int)
44662306a36Sopenharmony_ci * Override the max number of HW submissions. The default is 2.
44762306a36Sopenharmony_ci */
44862306a36Sopenharmony_ciMODULE_PARM_DESC(sched_hw_submission, "the max number of HW submissions (default 2)");
44962306a36Sopenharmony_cimodule_param_named(sched_hw_submission, amdgpu_sched_hw_submission, int, 0444);
45062306a36Sopenharmony_ci
45162306a36Sopenharmony_ci/**
45262306a36Sopenharmony_ci * DOC: ppfeaturemask (hexint)
45362306a36Sopenharmony_ci * Override power features enabled. See enum PP_FEATURE_MASK in drivers/gpu/drm/amd/include/amd_shared.h.
45462306a36Sopenharmony_ci * The default is the current set of stable power features.
45562306a36Sopenharmony_ci */
45662306a36Sopenharmony_ciMODULE_PARM_DESC(ppfeaturemask, "all power features enabled (default))");
45762306a36Sopenharmony_cimodule_param_named(ppfeaturemask, amdgpu_pp_feature_mask, hexint, 0444);
45862306a36Sopenharmony_ci
45962306a36Sopenharmony_ci/**
46062306a36Sopenharmony_ci * DOC: forcelongtraining (uint)
46162306a36Sopenharmony_ci * Force long memory training in resume.
46262306a36Sopenharmony_ci * The default is zero, indicates short training in resume.
46362306a36Sopenharmony_ci */
46462306a36Sopenharmony_ciMODULE_PARM_DESC(forcelongtraining, "force memory long training");
46562306a36Sopenharmony_cimodule_param_named(forcelongtraining, amdgpu_force_long_training, uint, 0444);
46662306a36Sopenharmony_ci
46762306a36Sopenharmony_ci/**
46862306a36Sopenharmony_ci * DOC: pcie_gen_cap (uint)
46962306a36Sopenharmony_ci * Override PCIE gen speed capabilities. See the CAIL flags in drivers/gpu/drm/amd/include/amd_pcie.h.
47062306a36Sopenharmony_ci * The default is 0 (automatic for each asic).
47162306a36Sopenharmony_ci */
47262306a36Sopenharmony_ciMODULE_PARM_DESC(pcie_gen_cap, "PCIE Gen Caps (0: autodetect (default))");
47362306a36Sopenharmony_cimodule_param_named(pcie_gen_cap, amdgpu_pcie_gen_cap, uint, 0444);
47462306a36Sopenharmony_ci
47562306a36Sopenharmony_ci/**
47662306a36Sopenharmony_ci * DOC: pcie_lane_cap (uint)
47762306a36Sopenharmony_ci * Override PCIE lanes capabilities. See the CAIL flags in drivers/gpu/drm/amd/include/amd_pcie.h.
47862306a36Sopenharmony_ci * The default is 0 (automatic for each asic).
47962306a36Sopenharmony_ci */
48062306a36Sopenharmony_ciMODULE_PARM_DESC(pcie_lane_cap, "PCIE Lane Caps (0: autodetect (default))");
48162306a36Sopenharmony_cimodule_param_named(pcie_lane_cap, amdgpu_pcie_lane_cap, uint, 0444);
48262306a36Sopenharmony_ci
48362306a36Sopenharmony_ci/**
48462306a36Sopenharmony_ci * DOC: cg_mask (ullong)
48562306a36Sopenharmony_ci * Override Clockgating features enabled on GPU (0 = disable clock gating). See the AMD_CG_SUPPORT flags in
48662306a36Sopenharmony_ci * drivers/gpu/drm/amd/include/amd_shared.h. The default is 0xffffffffffffffff (all enabled).
48762306a36Sopenharmony_ci */
48862306a36Sopenharmony_ciMODULE_PARM_DESC(cg_mask, "Clockgating flags mask (0 = disable clock gating)");
48962306a36Sopenharmony_cimodule_param_named(cg_mask, amdgpu_cg_mask, ullong, 0444);
49062306a36Sopenharmony_ci
49162306a36Sopenharmony_ci/**
49262306a36Sopenharmony_ci * DOC: pg_mask (uint)
49362306a36Sopenharmony_ci * Override Powergating features enabled on GPU (0 = disable power gating). See the AMD_PG_SUPPORT flags in
49462306a36Sopenharmony_ci * drivers/gpu/drm/amd/include/amd_shared.h. The default is 0xffffffff (all enabled).
49562306a36Sopenharmony_ci */
49662306a36Sopenharmony_ciMODULE_PARM_DESC(pg_mask, "Powergating flags mask (0 = disable power gating)");
49762306a36Sopenharmony_cimodule_param_named(pg_mask, amdgpu_pg_mask, uint, 0444);
49862306a36Sopenharmony_ci
49962306a36Sopenharmony_ci/**
50062306a36Sopenharmony_ci * DOC: sdma_phase_quantum (uint)
50162306a36Sopenharmony_ci * Override SDMA context switch phase quantum (x 1K GPU clock cycles, 0 = no change). The default is 32.
50262306a36Sopenharmony_ci */
50362306a36Sopenharmony_ciMODULE_PARM_DESC(sdma_phase_quantum, "SDMA context switch phase quantum (x 1K GPU clock cycles, 0 = no change (default 32))");
50462306a36Sopenharmony_cimodule_param_named(sdma_phase_quantum, amdgpu_sdma_phase_quantum, uint, 0444);
50562306a36Sopenharmony_ci
50662306a36Sopenharmony_ci/**
50762306a36Sopenharmony_ci * DOC: disable_cu (charp)
50862306a36Sopenharmony_ci * Set to disable CUs (It's set like se.sh.cu,...). The default is NULL.
50962306a36Sopenharmony_ci */
51062306a36Sopenharmony_ciMODULE_PARM_DESC(disable_cu, "Disable CUs (se.sh.cu,...)");
51162306a36Sopenharmony_cimodule_param_named(disable_cu, amdgpu_disable_cu, charp, 0444);
51262306a36Sopenharmony_ci
51362306a36Sopenharmony_ci/**
51462306a36Sopenharmony_ci * DOC: virtual_display (charp)
51562306a36Sopenharmony_ci * Set to enable virtual display feature. This feature provides a virtual display hardware on headless boards
51662306a36Sopenharmony_ci * 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
51762306a36Sopenharmony_ci * the device, plus the number of crtcs to expose. E.g., 0000:26:00.0,4 would enable 4 virtual crtcs on the pci
51862306a36Sopenharmony_ci * device at 26:00.0. The default is NULL.
51962306a36Sopenharmony_ci */
52062306a36Sopenharmony_ciMODULE_PARM_DESC(virtual_display,
52162306a36Sopenharmony_ci		 "Enable virtual display feature (the virtual_display will be set like xxxx:xx:xx.x,x;xxxx:xx:xx.x,x)");
52262306a36Sopenharmony_cimodule_param_named(virtual_display, amdgpu_virtual_display, charp, 0444);
52362306a36Sopenharmony_ci
52462306a36Sopenharmony_ci/**
52562306a36Sopenharmony_ci * DOC: lbpw (int)
52662306a36Sopenharmony_ci * Override Load Balancing Per Watt (LBPW) support (1 = enable, 0 = disable). The default is -1 (auto, enabled).
52762306a36Sopenharmony_ci */
52862306a36Sopenharmony_ciMODULE_PARM_DESC(lbpw, "Load Balancing Per Watt (LBPW) support (1 = enable, 0 = disable, -1 = auto)");
52962306a36Sopenharmony_cimodule_param_named(lbpw, amdgpu_lbpw, int, 0444);
53062306a36Sopenharmony_ci
53162306a36Sopenharmony_ciMODULE_PARM_DESC(compute_multipipe, "Force compute queues to be spread across pipes (1 = enable, 0 = disable, -1 = auto)");
53262306a36Sopenharmony_cimodule_param_named(compute_multipipe, amdgpu_compute_multipipe, int, 0444);
53362306a36Sopenharmony_ci
53462306a36Sopenharmony_ci/**
53562306a36Sopenharmony_ci * DOC: gpu_recovery (int)
53662306a36Sopenharmony_ci * Set to enable GPU recovery mechanism (1 = enable, 0 = disable). The default is -1 (auto, disabled except SRIOV).
53762306a36Sopenharmony_ci */
53862306a36Sopenharmony_ciMODULE_PARM_DESC(gpu_recovery, "Enable GPU recovery mechanism, (1 = enable, 0 = disable, -1 = auto)");
53962306a36Sopenharmony_cimodule_param_named(gpu_recovery, amdgpu_gpu_recovery, int, 0444);
54062306a36Sopenharmony_ci
54162306a36Sopenharmony_ci/**
54262306a36Sopenharmony_ci * DOC: emu_mode (int)
54362306a36Sopenharmony_ci * Set value 1 to enable emulation mode. This is only needed when running on an emulator. The default is 0 (disabled).
54462306a36Sopenharmony_ci */
54562306a36Sopenharmony_ciMODULE_PARM_DESC(emu_mode, "Emulation mode, (1 = enable, 0 = disable)");
54662306a36Sopenharmony_cimodule_param_named(emu_mode, amdgpu_emu_mode, int, 0444);
54762306a36Sopenharmony_ci
54862306a36Sopenharmony_ci/**
54962306a36Sopenharmony_ci * DOC: ras_enable (int)
55062306a36Sopenharmony_ci * Enable RAS features on the GPU (0 = disable, 1 = enable, -1 = auto (default))
55162306a36Sopenharmony_ci */
55262306a36Sopenharmony_ciMODULE_PARM_DESC(ras_enable, "Enable RAS features on the GPU (0 = disable, 1 = enable, -1 = auto (default))");
55362306a36Sopenharmony_cimodule_param_named(ras_enable, amdgpu_ras_enable, int, 0444);
55462306a36Sopenharmony_ci
55562306a36Sopenharmony_ci/**
55662306a36Sopenharmony_ci * DOC: ras_mask (uint)
55762306a36Sopenharmony_ci * Mask of RAS features to enable (default 0xffffffff), only valid when ras_enable == 1
55862306a36Sopenharmony_ci * See the flags in drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h
55962306a36Sopenharmony_ci */
56062306a36Sopenharmony_ciMODULE_PARM_DESC(ras_mask, "Mask of RAS features to enable (default 0xffffffff), only valid when ras_enable == 1");
56162306a36Sopenharmony_cimodule_param_named(ras_mask, amdgpu_ras_mask, uint, 0444);
56262306a36Sopenharmony_ci
56362306a36Sopenharmony_ci/**
56462306a36Sopenharmony_ci * DOC: timeout_fatal_disable (bool)
56562306a36Sopenharmony_ci * Disable Watchdog timeout fatal error event
56662306a36Sopenharmony_ci */
56762306a36Sopenharmony_ciMODULE_PARM_DESC(timeout_fatal_disable, "disable watchdog timeout fatal error (false = default)");
56862306a36Sopenharmony_cimodule_param_named(timeout_fatal_disable, amdgpu_watchdog_timer.timeout_fatal_disable, bool, 0644);
56962306a36Sopenharmony_ci
57062306a36Sopenharmony_ci/**
57162306a36Sopenharmony_ci * DOC: timeout_period (uint)
57262306a36Sopenharmony_ci * Modify the watchdog timeout max_cycles as (1 << period)
57362306a36Sopenharmony_ci */
57462306a36Sopenharmony_ciMODULE_PARM_DESC(timeout_period, "watchdog timeout period (0 = timeout disabled, 1 ~ 0x23 = timeout maxcycles = (1 << period)");
57562306a36Sopenharmony_cimodule_param_named(timeout_period, amdgpu_watchdog_timer.period, uint, 0644);
57662306a36Sopenharmony_ci
57762306a36Sopenharmony_ci/**
57862306a36Sopenharmony_ci * DOC: si_support (int)
57962306a36Sopenharmony_ci * Set SI support driver. This parameter works after set config CONFIG_DRM_AMDGPU_SI. For SI asic, when radeon driver is enabled,
58062306a36Sopenharmony_ci * set value 0 to use radeon driver, while set value 1 to use amdgpu driver. The default is using radeon driver when it available,
58162306a36Sopenharmony_ci * otherwise using amdgpu driver.
58262306a36Sopenharmony_ci */
58362306a36Sopenharmony_ci#ifdef CONFIG_DRM_AMDGPU_SI
58462306a36Sopenharmony_ci
58562306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_DRM_RADEON) || IS_ENABLED(CONFIG_DRM_RADEON_MODULE)
58662306a36Sopenharmony_ciint amdgpu_si_support = 0;
58762306a36Sopenharmony_ciMODULE_PARM_DESC(si_support, "SI support (1 = enabled, 0 = disabled (default))");
58862306a36Sopenharmony_ci#else
58962306a36Sopenharmony_ciint amdgpu_si_support = 1;
59062306a36Sopenharmony_ciMODULE_PARM_DESC(si_support, "SI support (1 = enabled (default), 0 = disabled)");
59162306a36Sopenharmony_ci#endif
59262306a36Sopenharmony_ci
59362306a36Sopenharmony_cimodule_param_named(si_support, amdgpu_si_support, int, 0444);
59462306a36Sopenharmony_ci#endif
59562306a36Sopenharmony_ci
59662306a36Sopenharmony_ci/**
59762306a36Sopenharmony_ci * DOC: cik_support (int)
59862306a36Sopenharmony_ci * Set CIK support driver. This parameter works after set config CONFIG_DRM_AMDGPU_CIK. For CIK asic, when radeon driver is enabled,
59962306a36Sopenharmony_ci * set value 0 to use radeon driver, while set value 1 to use amdgpu driver. The default is using radeon driver when it available,
60062306a36Sopenharmony_ci * otherwise using amdgpu driver.
60162306a36Sopenharmony_ci */
60262306a36Sopenharmony_ci#ifdef CONFIG_DRM_AMDGPU_CIK
60362306a36Sopenharmony_ci
60462306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_DRM_RADEON) || IS_ENABLED(CONFIG_DRM_RADEON_MODULE)
60562306a36Sopenharmony_ciint amdgpu_cik_support = 0;
60662306a36Sopenharmony_ciMODULE_PARM_DESC(cik_support, "CIK support (1 = enabled, 0 = disabled (default))");
60762306a36Sopenharmony_ci#else
60862306a36Sopenharmony_ciint amdgpu_cik_support = 1;
60962306a36Sopenharmony_ciMODULE_PARM_DESC(cik_support, "CIK support (1 = enabled (default), 0 = disabled)");
61062306a36Sopenharmony_ci#endif
61162306a36Sopenharmony_ci
61262306a36Sopenharmony_cimodule_param_named(cik_support, amdgpu_cik_support, int, 0444);
61362306a36Sopenharmony_ci#endif
61462306a36Sopenharmony_ci
61562306a36Sopenharmony_ci/**
61662306a36Sopenharmony_ci * DOC: smu_memory_pool_size (uint)
61762306a36Sopenharmony_ci * It is used to reserve gtt for smu debug usage, setting value 0 to disable it. The actual size is value * 256MiB.
61862306a36Sopenharmony_ci * E.g. 0x1 = 256Mbyte, 0x2 = 512Mbyte, 0x4 = 1 Gbyte, 0x8 = 2GByte. The default is 0 (disabled).
61962306a36Sopenharmony_ci */
62062306a36Sopenharmony_ciMODULE_PARM_DESC(smu_memory_pool_size,
62162306a36Sopenharmony_ci	"reserve gtt for smu debug usage, 0 = disable,0x1 = 256Mbyte, 0x2 = 512Mbyte, 0x4 = 1 Gbyte, 0x8 = 2GByte");
62262306a36Sopenharmony_cimodule_param_named(smu_memory_pool_size, amdgpu_smu_memory_pool_size, uint, 0444);
62362306a36Sopenharmony_ci
62462306a36Sopenharmony_ci/**
62562306a36Sopenharmony_ci * DOC: async_gfx_ring (int)
62662306a36Sopenharmony_ci * It is used to enable gfx rings that could be configured with different prioritites or equal priorities
62762306a36Sopenharmony_ci */
62862306a36Sopenharmony_ciMODULE_PARM_DESC(async_gfx_ring,
62962306a36Sopenharmony_ci	"Asynchronous GFX rings that could be configured with either different priorities (HP3D ring and LP3D ring), or equal priorities (0 = disabled, 1 = enabled (default))");
63062306a36Sopenharmony_cimodule_param_named(async_gfx_ring, amdgpu_async_gfx_ring, int, 0444);
63162306a36Sopenharmony_ci
63262306a36Sopenharmony_ci/**
63362306a36Sopenharmony_ci * DOC: mcbp (int)
63462306a36Sopenharmony_ci * It is used to enable mid command buffer preemption. (0 = disabled, 1 = enabled, -1 auto (default))
63562306a36Sopenharmony_ci */
63662306a36Sopenharmony_ciMODULE_PARM_DESC(mcbp,
63762306a36Sopenharmony_ci	"Enable Mid-command buffer preemption (0 = disabled, 1 = enabled), -1 = auto (default)");
63862306a36Sopenharmony_cimodule_param_named(mcbp, amdgpu_mcbp, int, 0444);
63962306a36Sopenharmony_ci
64062306a36Sopenharmony_ci/**
64162306a36Sopenharmony_ci * DOC: discovery (int)
64262306a36Sopenharmony_ci * Allow driver to discover hardware IP information from IP Discovery table at the top of VRAM.
64362306a36Sopenharmony_ci * (-1 = auto (default), 0 = disabled, 1 = enabled, 2 = use ip_discovery table from file)
64462306a36Sopenharmony_ci */
64562306a36Sopenharmony_ciMODULE_PARM_DESC(discovery,
64662306a36Sopenharmony_ci	"Allow driver to discover hardware IPs from IP Discovery table at the top of VRAM");
64762306a36Sopenharmony_cimodule_param_named(discovery, amdgpu_discovery, int, 0444);
64862306a36Sopenharmony_ci
64962306a36Sopenharmony_ci/**
65062306a36Sopenharmony_ci * DOC: mes (int)
65162306a36Sopenharmony_ci * Enable Micro Engine Scheduler. This is a new hw scheduling engine for gfx, sdma, and compute.
65262306a36Sopenharmony_ci * (0 = disabled (default), 1 = enabled)
65362306a36Sopenharmony_ci */
65462306a36Sopenharmony_ciMODULE_PARM_DESC(mes,
65562306a36Sopenharmony_ci	"Enable Micro Engine Scheduler (0 = disabled (default), 1 = enabled)");
65662306a36Sopenharmony_cimodule_param_named(mes, amdgpu_mes, int, 0444);
65762306a36Sopenharmony_ci
65862306a36Sopenharmony_ci/**
65962306a36Sopenharmony_ci * DOC: mes_kiq (int)
66062306a36Sopenharmony_ci * Enable Micro Engine Scheduler KIQ. This is a new engine pipe for kiq.
66162306a36Sopenharmony_ci * (0 = disabled (default), 1 = enabled)
66262306a36Sopenharmony_ci */
66362306a36Sopenharmony_ciMODULE_PARM_DESC(mes_kiq,
66462306a36Sopenharmony_ci	"Enable Micro Engine Scheduler KIQ (0 = disabled (default), 1 = enabled)");
66562306a36Sopenharmony_cimodule_param_named(mes_kiq, amdgpu_mes_kiq, int, 0444);
66662306a36Sopenharmony_ci
66762306a36Sopenharmony_ci/**
66862306a36Sopenharmony_ci * DOC: noretry (int)
66962306a36Sopenharmony_ci * Disable XNACK retry in the SQ by default on GFXv9 hardware. On ASICs that
67062306a36Sopenharmony_ci * do not support per-process XNACK this also disables retry page faults.
67162306a36Sopenharmony_ci * (0 = retry enabled, 1 = retry disabled, -1 auto (default))
67262306a36Sopenharmony_ci */
67362306a36Sopenharmony_ciMODULE_PARM_DESC(noretry,
67462306a36Sopenharmony_ci	"Disable retry faults (0 = retry enabled, 1 = retry disabled, -1 auto (default))");
67562306a36Sopenharmony_cimodule_param_named(noretry, amdgpu_noretry, int, 0644);
67662306a36Sopenharmony_ci
67762306a36Sopenharmony_ci/**
67862306a36Sopenharmony_ci * DOC: force_asic_type (int)
67962306a36Sopenharmony_ci * A non negative value used to specify the asic type for all supported GPUs.
68062306a36Sopenharmony_ci */
68162306a36Sopenharmony_ciMODULE_PARM_DESC(force_asic_type,
68262306a36Sopenharmony_ci	"A non negative value used to specify the asic type for all supported GPUs");
68362306a36Sopenharmony_cimodule_param_named(force_asic_type, amdgpu_force_asic_type, int, 0444);
68462306a36Sopenharmony_ci
68562306a36Sopenharmony_ci/**
68662306a36Sopenharmony_ci * DOC: use_xgmi_p2p (int)
68762306a36Sopenharmony_ci * Enables/disables XGMI P2P interface (0 = disable, 1 = enable).
68862306a36Sopenharmony_ci */
68962306a36Sopenharmony_ciMODULE_PARM_DESC(use_xgmi_p2p,
69062306a36Sopenharmony_ci	"Enable XGMI P2P interface (0 = disable; 1 = enable (default))");
69162306a36Sopenharmony_cimodule_param_named(use_xgmi_p2p, amdgpu_use_xgmi_p2p, int, 0444);
69262306a36Sopenharmony_ci
69362306a36Sopenharmony_ci
69462306a36Sopenharmony_ci#ifdef CONFIG_HSA_AMD
69562306a36Sopenharmony_ci/**
69662306a36Sopenharmony_ci * DOC: sched_policy (int)
69762306a36Sopenharmony_ci * Set scheduling policy. Default is HWS(hardware scheduling) with over-subscription.
69862306a36Sopenharmony_ci * Setting 1 disables over-subscription. Setting 2 disables HWS and statically
69962306a36Sopenharmony_ci * assigns queues to HQDs.
70062306a36Sopenharmony_ci */
70162306a36Sopenharmony_ciint sched_policy = KFD_SCHED_POLICY_HWS;
70262306a36Sopenharmony_cimodule_param(sched_policy, int, 0444);
70362306a36Sopenharmony_ciMODULE_PARM_DESC(sched_policy,
70462306a36Sopenharmony_ci	"Scheduling policy (0 = HWS (Default), 1 = HWS without over-subscription, 2 = Non-HWS (Used for debugging only)");
70562306a36Sopenharmony_ci
70662306a36Sopenharmony_ci/**
70762306a36Sopenharmony_ci * DOC: hws_max_conc_proc (int)
70862306a36Sopenharmony_ci * Maximum number of processes that HWS can schedule concurrently. The maximum is the
70962306a36Sopenharmony_ci * number of VMIDs assigned to the HWS, which is also the default.
71062306a36Sopenharmony_ci */
71162306a36Sopenharmony_ciint hws_max_conc_proc = -1;
71262306a36Sopenharmony_cimodule_param(hws_max_conc_proc, int, 0444);
71362306a36Sopenharmony_ciMODULE_PARM_DESC(hws_max_conc_proc,
71462306a36Sopenharmony_ci	"Max # processes HWS can execute concurrently when sched_policy=0 (0 = no concurrency, #VMIDs for KFD = Maximum(default))");
71562306a36Sopenharmony_ci
71662306a36Sopenharmony_ci/**
71762306a36Sopenharmony_ci * DOC: cwsr_enable (int)
71862306a36Sopenharmony_ci * CWSR(compute wave store and resume) allows the GPU to preempt shader execution in
71962306a36Sopenharmony_ci * the middle of a compute wave. Default is 1 to enable this feature. Setting 0
72062306a36Sopenharmony_ci * disables it.
72162306a36Sopenharmony_ci */
72262306a36Sopenharmony_ciint cwsr_enable = 1;
72362306a36Sopenharmony_cimodule_param(cwsr_enable, int, 0444);
72462306a36Sopenharmony_ciMODULE_PARM_DESC(cwsr_enable, "CWSR enable (0 = Off, 1 = On (Default))");
72562306a36Sopenharmony_ci
72662306a36Sopenharmony_ci/**
72762306a36Sopenharmony_ci * DOC: max_num_of_queues_per_device (int)
72862306a36Sopenharmony_ci * Maximum number of queues per device. Valid setting is between 1 and 4096. Default
72962306a36Sopenharmony_ci * is 4096.
73062306a36Sopenharmony_ci */
73162306a36Sopenharmony_ciint max_num_of_queues_per_device = KFD_MAX_NUM_OF_QUEUES_PER_DEVICE_DEFAULT;
73262306a36Sopenharmony_cimodule_param(max_num_of_queues_per_device, int, 0444);
73362306a36Sopenharmony_ciMODULE_PARM_DESC(max_num_of_queues_per_device,
73462306a36Sopenharmony_ci	"Maximum number of supported queues per device (1 = Minimum, 4096 = default)");
73562306a36Sopenharmony_ci
73662306a36Sopenharmony_ci/**
73762306a36Sopenharmony_ci * DOC: send_sigterm (int)
73862306a36Sopenharmony_ci * Send sigterm to HSA process on unhandled exceptions. Default is not to send sigterm
73962306a36Sopenharmony_ci * but just print errors on dmesg. Setting 1 enables sending sigterm.
74062306a36Sopenharmony_ci */
74162306a36Sopenharmony_ciint send_sigterm;
74262306a36Sopenharmony_cimodule_param(send_sigterm, int, 0444);
74362306a36Sopenharmony_ciMODULE_PARM_DESC(send_sigterm,
74462306a36Sopenharmony_ci	"Send sigterm to HSA process on unhandled exception (0 = disable, 1 = enable)");
74562306a36Sopenharmony_ci
74662306a36Sopenharmony_ci/**
74762306a36Sopenharmony_ci * DOC: debug_largebar (int)
74862306a36Sopenharmony_ci * Set debug_largebar as 1 to enable simulating large-bar capability on non-large bar
74962306a36Sopenharmony_ci * system. This limits the VRAM size reported to ROCm applications to the visible
75062306a36Sopenharmony_ci * size, usually 256MB.
75162306a36Sopenharmony_ci * Default value is 0, diabled.
75262306a36Sopenharmony_ci */
75362306a36Sopenharmony_ciint debug_largebar;
75462306a36Sopenharmony_cimodule_param(debug_largebar, int, 0444);
75562306a36Sopenharmony_ciMODULE_PARM_DESC(debug_largebar,
75662306a36Sopenharmony_ci	"Debug large-bar flag used to simulate large-bar capability on non-large bar machine (0 = disable, 1 = enable)");
75762306a36Sopenharmony_ci
75862306a36Sopenharmony_ci/**
75962306a36Sopenharmony_ci * DOC: halt_if_hws_hang (int)
76062306a36Sopenharmony_ci * Halt if HWS hang is detected. Default value, 0, disables the halt on hang.
76162306a36Sopenharmony_ci * Setting 1 enables halt on hang.
76262306a36Sopenharmony_ci */
76362306a36Sopenharmony_ciint halt_if_hws_hang;
76462306a36Sopenharmony_cimodule_param(halt_if_hws_hang, int, 0644);
76562306a36Sopenharmony_ciMODULE_PARM_DESC(halt_if_hws_hang, "Halt if HWS hang is detected (0 = off (default), 1 = on)");
76662306a36Sopenharmony_ci
76762306a36Sopenharmony_ci/**
76862306a36Sopenharmony_ci * DOC: hws_gws_support(bool)
76962306a36Sopenharmony_ci * Assume that HWS supports GWS barriers regardless of what firmware version
77062306a36Sopenharmony_ci * check says. Default value: false (rely on MEC2 firmware version check).
77162306a36Sopenharmony_ci */
77262306a36Sopenharmony_cibool hws_gws_support;
77362306a36Sopenharmony_cimodule_param(hws_gws_support, bool, 0444);
77462306a36Sopenharmony_ciMODULE_PARM_DESC(hws_gws_support, "Assume MEC2 FW supports GWS barriers (false = rely on FW version check (Default), true = force supported)");
77562306a36Sopenharmony_ci
77662306a36Sopenharmony_ci/**
77762306a36Sopenharmony_ci * DOC: queue_preemption_timeout_ms (int)
77862306a36Sopenharmony_ci * queue preemption timeout in ms (1 = Minimum, 9000 = default)
77962306a36Sopenharmony_ci */
78062306a36Sopenharmony_ciint queue_preemption_timeout_ms = 9000;
78162306a36Sopenharmony_cimodule_param(queue_preemption_timeout_ms, int, 0644);
78262306a36Sopenharmony_ciMODULE_PARM_DESC(queue_preemption_timeout_ms, "queue preemption timeout in ms (1 = Minimum, 9000 = default)");
78362306a36Sopenharmony_ci
78462306a36Sopenharmony_ci/**
78562306a36Sopenharmony_ci * DOC: debug_evictions(bool)
78662306a36Sopenharmony_ci * Enable extra debug messages to help determine the cause of evictions
78762306a36Sopenharmony_ci */
78862306a36Sopenharmony_cibool debug_evictions;
78962306a36Sopenharmony_cimodule_param(debug_evictions, bool, 0644);
79062306a36Sopenharmony_ciMODULE_PARM_DESC(debug_evictions, "enable eviction debug messages (false = default)");
79162306a36Sopenharmony_ci
79262306a36Sopenharmony_ci/**
79362306a36Sopenharmony_ci * DOC: no_system_mem_limit(bool)
79462306a36Sopenharmony_ci * Disable system memory limit, to support multiple process shared memory
79562306a36Sopenharmony_ci */
79662306a36Sopenharmony_cibool no_system_mem_limit;
79762306a36Sopenharmony_cimodule_param(no_system_mem_limit, bool, 0644);
79862306a36Sopenharmony_ciMODULE_PARM_DESC(no_system_mem_limit, "disable system memory limit (false = default)");
79962306a36Sopenharmony_ci
80062306a36Sopenharmony_ci/**
80162306a36Sopenharmony_ci * DOC: no_queue_eviction_on_vm_fault (int)
80262306a36Sopenharmony_ci * 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).
80362306a36Sopenharmony_ci */
80462306a36Sopenharmony_ciint amdgpu_no_queue_eviction_on_vm_fault;
80562306a36Sopenharmony_ciMODULE_PARM_DESC(no_queue_eviction_on_vm_fault, "No queue eviction on VM fault (0 = queue eviction, 1 = no queue eviction)");
80662306a36Sopenharmony_cimodule_param_named(no_queue_eviction_on_vm_fault, amdgpu_no_queue_eviction_on_vm_fault, int, 0444);
80762306a36Sopenharmony_ci#endif
80862306a36Sopenharmony_ci
80962306a36Sopenharmony_ci/**
81062306a36Sopenharmony_ci * DOC: mtype_local (int)
81162306a36Sopenharmony_ci */
81262306a36Sopenharmony_ciint amdgpu_mtype_local;
81362306a36Sopenharmony_ciMODULE_PARM_DESC(mtype_local, "MTYPE for local memory (0 = MTYPE_RW (default), 1 = MTYPE_NC, 2 = MTYPE_CC)");
81462306a36Sopenharmony_cimodule_param_named(mtype_local, amdgpu_mtype_local, int, 0444);
81562306a36Sopenharmony_ci
81662306a36Sopenharmony_ci/**
81762306a36Sopenharmony_ci * DOC: pcie_p2p (bool)
81862306a36Sopenharmony_ci * Enable PCIe P2P (requires large-BAR). Default value: true (on)
81962306a36Sopenharmony_ci */
82062306a36Sopenharmony_ci#ifdef CONFIG_HSA_AMD_P2P
82162306a36Sopenharmony_cibool pcie_p2p = true;
82262306a36Sopenharmony_cimodule_param(pcie_p2p, bool, 0444);
82362306a36Sopenharmony_ciMODULE_PARM_DESC(pcie_p2p, "Enable PCIe P2P (requires large-BAR). (N = off, Y = on(default))");
82462306a36Sopenharmony_ci#endif
82562306a36Sopenharmony_ci
82662306a36Sopenharmony_ci/**
82762306a36Sopenharmony_ci * DOC: dcfeaturemask (uint)
82862306a36Sopenharmony_ci * Override display features enabled. See enum DC_FEATURE_MASK in drivers/gpu/drm/amd/include/amd_shared.h.
82962306a36Sopenharmony_ci * The default is the current set of stable display features.
83062306a36Sopenharmony_ci */
83162306a36Sopenharmony_ciMODULE_PARM_DESC(dcfeaturemask, "all stable DC features enabled (default))");
83262306a36Sopenharmony_cimodule_param_named(dcfeaturemask, amdgpu_dc_feature_mask, uint, 0444);
83362306a36Sopenharmony_ci
83462306a36Sopenharmony_ci/**
83562306a36Sopenharmony_ci * DOC: dcdebugmask (uint)
83662306a36Sopenharmony_ci * Override display features enabled. See enum DC_DEBUG_MASK in drivers/gpu/drm/amd/include/amd_shared.h.
83762306a36Sopenharmony_ci */
83862306a36Sopenharmony_ciMODULE_PARM_DESC(dcdebugmask, "all debug options disabled (default))");
83962306a36Sopenharmony_cimodule_param_named(dcdebugmask, amdgpu_dc_debug_mask, uint, 0444);
84062306a36Sopenharmony_ci
84162306a36Sopenharmony_ciMODULE_PARM_DESC(visualconfirm, "Visual confirm (0 = off (default), 1 = MPO, 5 = PSR)");
84262306a36Sopenharmony_cimodule_param_named(visualconfirm, amdgpu_dc_visual_confirm, uint, 0444);
84362306a36Sopenharmony_ci
84462306a36Sopenharmony_ci/**
84562306a36Sopenharmony_ci * DOC: abmlevel (uint)
84662306a36Sopenharmony_ci * Override the default ABM (Adaptive Backlight Management) level used for DC
84762306a36Sopenharmony_ci * enabled hardware. Requires DMCU to be supported and loaded.
84862306a36Sopenharmony_ci * Valid levels are 0-4. A value of 0 indicates that ABM should be disabled by
84962306a36Sopenharmony_ci * default. Values 1-4 control the maximum allowable brightness reduction via
85062306a36Sopenharmony_ci * the ABM algorithm, with 1 being the least reduction and 4 being the most
85162306a36Sopenharmony_ci * reduction.
85262306a36Sopenharmony_ci *
85362306a36Sopenharmony_ci * Defaults to 0, or disabled. Userspace can still override this level later
85462306a36Sopenharmony_ci * after boot.
85562306a36Sopenharmony_ci */
85662306a36Sopenharmony_ciuint amdgpu_dm_abm_level;
85762306a36Sopenharmony_ciMODULE_PARM_DESC(abmlevel, "ABM level (0 = off (default), 1-4 = backlight reduction level) ");
85862306a36Sopenharmony_cimodule_param_named(abmlevel, amdgpu_dm_abm_level, uint, 0444);
85962306a36Sopenharmony_ci
86062306a36Sopenharmony_ciint amdgpu_backlight = -1;
86162306a36Sopenharmony_ciMODULE_PARM_DESC(backlight, "Backlight control (0 = pwm, 1 = aux, -1 auto (default))");
86262306a36Sopenharmony_cimodule_param_named(backlight, amdgpu_backlight, bint, 0444);
86362306a36Sopenharmony_ci
86462306a36Sopenharmony_ci/**
86562306a36Sopenharmony_ci * DOC: tmz (int)
86662306a36Sopenharmony_ci * Trusted Memory Zone (TMZ) is a method to protect data being written
86762306a36Sopenharmony_ci * to or read from memory.
86862306a36Sopenharmony_ci *
86962306a36Sopenharmony_ci * The default value: 0 (off).  TODO: change to auto till it is completed.
87062306a36Sopenharmony_ci */
87162306a36Sopenharmony_ciMODULE_PARM_DESC(tmz, "Enable TMZ feature (-1 = auto (default), 0 = off, 1 = on)");
87262306a36Sopenharmony_cimodule_param_named(tmz, amdgpu_tmz, int, 0444);
87362306a36Sopenharmony_ci
87462306a36Sopenharmony_ci/**
87562306a36Sopenharmony_ci * DOC: reset_method (int)
87662306a36Sopenharmony_ci * GPU reset method (-1 = auto (default), 0 = legacy, 1 = mode0, 2 = mode1, 3 = mode2, 4 = baco)
87762306a36Sopenharmony_ci */
87862306a36Sopenharmony_ciMODULE_PARM_DESC(reset_method, "GPU reset method (-1 = auto (default), 0 = legacy, 1 = mode0, 2 = mode1, 3 = mode2, 4 = baco/bamaco)");
87962306a36Sopenharmony_cimodule_param_named(reset_method, amdgpu_reset_method, int, 0444);
88062306a36Sopenharmony_ci
88162306a36Sopenharmony_ci/**
88262306a36Sopenharmony_ci * DOC: bad_page_threshold (int) Bad page threshold is specifies the
88362306a36Sopenharmony_ci * threshold value of faulty pages detected by RAS ECC, which may
88462306a36Sopenharmony_ci * result in the GPU entering bad status when the number of total
88562306a36Sopenharmony_ci * faulty pages by ECC exceeds the threshold value.
88662306a36Sopenharmony_ci */
88762306a36Sopenharmony_ciMODULE_PARM_DESC(bad_page_threshold, "Bad page threshold(-1 = ignore threshold (default value), 0 = disable bad page retirement, -2 = driver sets threshold)");
88862306a36Sopenharmony_cimodule_param_named(bad_page_threshold, amdgpu_bad_page_threshold, int, 0444);
88962306a36Sopenharmony_ci
89062306a36Sopenharmony_ciMODULE_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+)");
89162306a36Sopenharmony_cimodule_param_named(num_kcq, amdgpu_num_kcq, int, 0444);
89262306a36Sopenharmony_ci
89362306a36Sopenharmony_ci/**
89462306a36Sopenharmony_ci * DOC: vcnfw_log (int)
89562306a36Sopenharmony_ci * Enable vcnfw log output for debugging, the default is disabled.
89662306a36Sopenharmony_ci */
89762306a36Sopenharmony_ciMODULE_PARM_DESC(vcnfw_log, "Enable vcnfw log(0 = disable (default value), 1 = enable)");
89862306a36Sopenharmony_cimodule_param_named(vcnfw_log, amdgpu_vcnfw_log, int, 0444);
89962306a36Sopenharmony_ci
90062306a36Sopenharmony_ci/**
90162306a36Sopenharmony_ci * DOC: sg_display (int)
90262306a36Sopenharmony_ci * Disable S/G (scatter/gather) display (i.e., display from system memory).
90362306a36Sopenharmony_ci * This option is only relevant on APUs.  Set this option to 0 to disable
90462306a36Sopenharmony_ci * S/G display if you experience flickering or other issues under memory
90562306a36Sopenharmony_ci * pressure and report the issue.
90662306a36Sopenharmony_ci */
90762306a36Sopenharmony_ciMODULE_PARM_DESC(sg_display, "S/G Display (-1 = auto (default), 0 = disable)");
90862306a36Sopenharmony_cimodule_param_named(sg_display, amdgpu_sg_display, int, 0444);
90962306a36Sopenharmony_ci
91062306a36Sopenharmony_ci/**
91162306a36Sopenharmony_ci * DOC: smu_pptable_id (int)
91262306a36Sopenharmony_ci * Used to override pptable id. id = 0 use VBIOS pptable.
91362306a36Sopenharmony_ci * id > 0 use the soft pptable with specicfied id.
91462306a36Sopenharmony_ci */
91562306a36Sopenharmony_ciMODULE_PARM_DESC(smu_pptable_id,
91662306a36Sopenharmony_ci	"specify pptable id to be used (-1 = auto(default) value, 0 = use pptable from vbios, > 0 = soft pptable id)");
91762306a36Sopenharmony_cimodule_param_named(smu_pptable_id, amdgpu_smu_pptable_id, int, 0444);
91862306a36Sopenharmony_ci
91962306a36Sopenharmony_ci/**
92062306a36Sopenharmony_ci * DOC: partition_mode (int)
92162306a36Sopenharmony_ci * Used to override the default SPX mode.
92262306a36Sopenharmony_ci */
92362306a36Sopenharmony_ciMODULE_PARM_DESC(
92462306a36Sopenharmony_ci	user_partt_mode,
92562306a36Sopenharmony_ci	"specify partition mode to be used (-2 = AMDGPU_AUTO_COMPUTE_PARTITION_MODE(default value) \
92662306a36Sopenharmony_ci						0 = AMDGPU_SPX_PARTITION_MODE, \
92762306a36Sopenharmony_ci						1 = AMDGPU_DPX_PARTITION_MODE, \
92862306a36Sopenharmony_ci						2 = AMDGPU_TPX_PARTITION_MODE, \
92962306a36Sopenharmony_ci						3 = AMDGPU_QPX_PARTITION_MODE, \
93062306a36Sopenharmony_ci						4 = AMDGPU_CPX_PARTITION_MODE)");
93162306a36Sopenharmony_cimodule_param_named(user_partt_mode, amdgpu_user_partt_mode, uint, 0444);
93262306a36Sopenharmony_ci
93362306a36Sopenharmony_ci
93462306a36Sopenharmony_ci/**
93562306a36Sopenharmony_ci * DOC: enforce_isolation (bool)
93662306a36Sopenharmony_ci * enforce process isolation between graphics and compute via using the same reserved vmid.
93762306a36Sopenharmony_ci */
93862306a36Sopenharmony_cimodule_param(enforce_isolation, bool, 0444);
93962306a36Sopenharmony_ciMODULE_PARM_DESC(enforce_isolation, "enforce process isolation between graphics and compute . enforce_isolation = on");
94062306a36Sopenharmony_ci
94162306a36Sopenharmony_ci/* These devices are not supported by amdgpu.
94262306a36Sopenharmony_ci * They are supported by the mach64, r128, radeon drivers
94362306a36Sopenharmony_ci */
94462306a36Sopenharmony_cistatic const u16 amdgpu_unsupported_pciidlist[] = {
94562306a36Sopenharmony_ci	/* mach64 */
94662306a36Sopenharmony_ci	0x4354,
94762306a36Sopenharmony_ci	0x4358,
94862306a36Sopenharmony_ci	0x4554,
94962306a36Sopenharmony_ci	0x4742,
95062306a36Sopenharmony_ci	0x4744,
95162306a36Sopenharmony_ci	0x4749,
95262306a36Sopenharmony_ci	0x474C,
95362306a36Sopenharmony_ci	0x474D,
95462306a36Sopenharmony_ci	0x474E,
95562306a36Sopenharmony_ci	0x474F,
95662306a36Sopenharmony_ci	0x4750,
95762306a36Sopenharmony_ci	0x4751,
95862306a36Sopenharmony_ci	0x4752,
95962306a36Sopenharmony_ci	0x4753,
96062306a36Sopenharmony_ci	0x4754,
96162306a36Sopenharmony_ci	0x4755,
96262306a36Sopenharmony_ci	0x4756,
96362306a36Sopenharmony_ci	0x4757,
96462306a36Sopenharmony_ci	0x4758,
96562306a36Sopenharmony_ci	0x4759,
96662306a36Sopenharmony_ci	0x475A,
96762306a36Sopenharmony_ci	0x4C42,
96862306a36Sopenharmony_ci	0x4C44,
96962306a36Sopenharmony_ci	0x4C47,
97062306a36Sopenharmony_ci	0x4C49,
97162306a36Sopenharmony_ci	0x4C4D,
97262306a36Sopenharmony_ci	0x4C4E,
97362306a36Sopenharmony_ci	0x4C50,
97462306a36Sopenharmony_ci	0x4C51,
97562306a36Sopenharmony_ci	0x4C52,
97662306a36Sopenharmony_ci	0x4C53,
97762306a36Sopenharmony_ci	0x5654,
97862306a36Sopenharmony_ci	0x5655,
97962306a36Sopenharmony_ci	0x5656,
98062306a36Sopenharmony_ci	/* r128 */
98162306a36Sopenharmony_ci	0x4c45,
98262306a36Sopenharmony_ci	0x4c46,
98362306a36Sopenharmony_ci	0x4d46,
98462306a36Sopenharmony_ci	0x4d4c,
98562306a36Sopenharmony_ci	0x5041,
98662306a36Sopenharmony_ci	0x5042,
98762306a36Sopenharmony_ci	0x5043,
98862306a36Sopenharmony_ci	0x5044,
98962306a36Sopenharmony_ci	0x5045,
99062306a36Sopenharmony_ci	0x5046,
99162306a36Sopenharmony_ci	0x5047,
99262306a36Sopenharmony_ci	0x5048,
99362306a36Sopenharmony_ci	0x5049,
99462306a36Sopenharmony_ci	0x504A,
99562306a36Sopenharmony_ci	0x504B,
99662306a36Sopenharmony_ci	0x504C,
99762306a36Sopenharmony_ci	0x504D,
99862306a36Sopenharmony_ci	0x504E,
99962306a36Sopenharmony_ci	0x504F,
100062306a36Sopenharmony_ci	0x5050,
100162306a36Sopenharmony_ci	0x5051,
100262306a36Sopenharmony_ci	0x5052,
100362306a36Sopenharmony_ci	0x5053,
100462306a36Sopenharmony_ci	0x5054,
100562306a36Sopenharmony_ci	0x5055,
100662306a36Sopenharmony_ci	0x5056,
100762306a36Sopenharmony_ci	0x5057,
100862306a36Sopenharmony_ci	0x5058,
100962306a36Sopenharmony_ci	0x5245,
101062306a36Sopenharmony_ci	0x5246,
101162306a36Sopenharmony_ci	0x5247,
101262306a36Sopenharmony_ci	0x524b,
101362306a36Sopenharmony_ci	0x524c,
101462306a36Sopenharmony_ci	0x534d,
101562306a36Sopenharmony_ci	0x5446,
101662306a36Sopenharmony_ci	0x544C,
101762306a36Sopenharmony_ci	0x5452,
101862306a36Sopenharmony_ci	/* radeon */
101962306a36Sopenharmony_ci	0x3150,
102062306a36Sopenharmony_ci	0x3151,
102162306a36Sopenharmony_ci	0x3152,
102262306a36Sopenharmony_ci	0x3154,
102362306a36Sopenharmony_ci	0x3155,
102462306a36Sopenharmony_ci	0x3E50,
102562306a36Sopenharmony_ci	0x3E54,
102662306a36Sopenharmony_ci	0x4136,
102762306a36Sopenharmony_ci	0x4137,
102862306a36Sopenharmony_ci	0x4144,
102962306a36Sopenharmony_ci	0x4145,
103062306a36Sopenharmony_ci	0x4146,
103162306a36Sopenharmony_ci	0x4147,
103262306a36Sopenharmony_ci	0x4148,
103362306a36Sopenharmony_ci	0x4149,
103462306a36Sopenharmony_ci	0x414A,
103562306a36Sopenharmony_ci	0x414B,
103662306a36Sopenharmony_ci	0x4150,
103762306a36Sopenharmony_ci	0x4151,
103862306a36Sopenharmony_ci	0x4152,
103962306a36Sopenharmony_ci	0x4153,
104062306a36Sopenharmony_ci	0x4154,
104162306a36Sopenharmony_ci	0x4155,
104262306a36Sopenharmony_ci	0x4156,
104362306a36Sopenharmony_ci	0x4237,
104462306a36Sopenharmony_ci	0x4242,
104562306a36Sopenharmony_ci	0x4336,
104662306a36Sopenharmony_ci	0x4337,
104762306a36Sopenharmony_ci	0x4437,
104862306a36Sopenharmony_ci	0x4966,
104962306a36Sopenharmony_ci	0x4967,
105062306a36Sopenharmony_ci	0x4A48,
105162306a36Sopenharmony_ci	0x4A49,
105262306a36Sopenharmony_ci	0x4A4A,
105362306a36Sopenharmony_ci	0x4A4B,
105462306a36Sopenharmony_ci	0x4A4C,
105562306a36Sopenharmony_ci	0x4A4D,
105662306a36Sopenharmony_ci	0x4A4E,
105762306a36Sopenharmony_ci	0x4A4F,
105862306a36Sopenharmony_ci	0x4A50,
105962306a36Sopenharmony_ci	0x4A54,
106062306a36Sopenharmony_ci	0x4B48,
106162306a36Sopenharmony_ci	0x4B49,
106262306a36Sopenharmony_ci	0x4B4A,
106362306a36Sopenharmony_ci	0x4B4B,
106462306a36Sopenharmony_ci	0x4B4C,
106562306a36Sopenharmony_ci	0x4C57,
106662306a36Sopenharmony_ci	0x4C58,
106762306a36Sopenharmony_ci	0x4C59,
106862306a36Sopenharmony_ci	0x4C5A,
106962306a36Sopenharmony_ci	0x4C64,
107062306a36Sopenharmony_ci	0x4C66,
107162306a36Sopenharmony_ci	0x4C67,
107262306a36Sopenharmony_ci	0x4E44,
107362306a36Sopenharmony_ci	0x4E45,
107462306a36Sopenharmony_ci	0x4E46,
107562306a36Sopenharmony_ci	0x4E47,
107662306a36Sopenharmony_ci	0x4E48,
107762306a36Sopenharmony_ci	0x4E49,
107862306a36Sopenharmony_ci	0x4E4A,
107962306a36Sopenharmony_ci	0x4E4B,
108062306a36Sopenharmony_ci	0x4E50,
108162306a36Sopenharmony_ci	0x4E51,
108262306a36Sopenharmony_ci	0x4E52,
108362306a36Sopenharmony_ci	0x4E53,
108462306a36Sopenharmony_ci	0x4E54,
108562306a36Sopenharmony_ci	0x4E56,
108662306a36Sopenharmony_ci	0x5144,
108762306a36Sopenharmony_ci	0x5145,
108862306a36Sopenharmony_ci	0x5146,
108962306a36Sopenharmony_ci	0x5147,
109062306a36Sopenharmony_ci	0x5148,
109162306a36Sopenharmony_ci	0x514C,
109262306a36Sopenharmony_ci	0x514D,
109362306a36Sopenharmony_ci	0x5157,
109462306a36Sopenharmony_ci	0x5158,
109562306a36Sopenharmony_ci	0x5159,
109662306a36Sopenharmony_ci	0x515A,
109762306a36Sopenharmony_ci	0x515E,
109862306a36Sopenharmony_ci	0x5460,
109962306a36Sopenharmony_ci	0x5462,
110062306a36Sopenharmony_ci	0x5464,
110162306a36Sopenharmony_ci	0x5548,
110262306a36Sopenharmony_ci	0x5549,
110362306a36Sopenharmony_ci	0x554A,
110462306a36Sopenharmony_ci	0x554B,
110562306a36Sopenharmony_ci	0x554C,
110662306a36Sopenharmony_ci	0x554D,
110762306a36Sopenharmony_ci	0x554E,
110862306a36Sopenharmony_ci	0x554F,
110962306a36Sopenharmony_ci	0x5550,
111062306a36Sopenharmony_ci	0x5551,
111162306a36Sopenharmony_ci	0x5552,
111262306a36Sopenharmony_ci	0x5554,
111362306a36Sopenharmony_ci	0x564A,
111462306a36Sopenharmony_ci	0x564B,
111562306a36Sopenharmony_ci	0x564F,
111662306a36Sopenharmony_ci	0x5652,
111762306a36Sopenharmony_ci	0x5653,
111862306a36Sopenharmony_ci	0x5657,
111962306a36Sopenharmony_ci	0x5834,
112062306a36Sopenharmony_ci	0x5835,
112162306a36Sopenharmony_ci	0x5954,
112262306a36Sopenharmony_ci	0x5955,
112362306a36Sopenharmony_ci	0x5974,
112462306a36Sopenharmony_ci	0x5975,
112562306a36Sopenharmony_ci	0x5960,
112662306a36Sopenharmony_ci	0x5961,
112762306a36Sopenharmony_ci	0x5962,
112862306a36Sopenharmony_ci	0x5964,
112962306a36Sopenharmony_ci	0x5965,
113062306a36Sopenharmony_ci	0x5969,
113162306a36Sopenharmony_ci	0x5a41,
113262306a36Sopenharmony_ci	0x5a42,
113362306a36Sopenharmony_ci	0x5a61,
113462306a36Sopenharmony_ci	0x5a62,
113562306a36Sopenharmony_ci	0x5b60,
113662306a36Sopenharmony_ci	0x5b62,
113762306a36Sopenharmony_ci	0x5b63,
113862306a36Sopenharmony_ci	0x5b64,
113962306a36Sopenharmony_ci	0x5b65,
114062306a36Sopenharmony_ci	0x5c61,
114162306a36Sopenharmony_ci	0x5c63,
114262306a36Sopenharmony_ci	0x5d48,
114362306a36Sopenharmony_ci	0x5d49,
114462306a36Sopenharmony_ci	0x5d4a,
114562306a36Sopenharmony_ci	0x5d4c,
114662306a36Sopenharmony_ci	0x5d4d,
114762306a36Sopenharmony_ci	0x5d4e,
114862306a36Sopenharmony_ci	0x5d4f,
114962306a36Sopenharmony_ci	0x5d50,
115062306a36Sopenharmony_ci	0x5d52,
115162306a36Sopenharmony_ci	0x5d57,
115262306a36Sopenharmony_ci	0x5e48,
115362306a36Sopenharmony_ci	0x5e4a,
115462306a36Sopenharmony_ci	0x5e4b,
115562306a36Sopenharmony_ci	0x5e4c,
115662306a36Sopenharmony_ci	0x5e4d,
115762306a36Sopenharmony_ci	0x5e4f,
115862306a36Sopenharmony_ci	0x6700,
115962306a36Sopenharmony_ci	0x6701,
116062306a36Sopenharmony_ci	0x6702,
116162306a36Sopenharmony_ci	0x6703,
116262306a36Sopenharmony_ci	0x6704,
116362306a36Sopenharmony_ci	0x6705,
116462306a36Sopenharmony_ci	0x6706,
116562306a36Sopenharmony_ci	0x6707,
116662306a36Sopenharmony_ci	0x6708,
116762306a36Sopenharmony_ci	0x6709,
116862306a36Sopenharmony_ci	0x6718,
116962306a36Sopenharmony_ci	0x6719,
117062306a36Sopenharmony_ci	0x671c,
117162306a36Sopenharmony_ci	0x671d,
117262306a36Sopenharmony_ci	0x671f,
117362306a36Sopenharmony_ci	0x6720,
117462306a36Sopenharmony_ci	0x6721,
117562306a36Sopenharmony_ci	0x6722,
117662306a36Sopenharmony_ci	0x6723,
117762306a36Sopenharmony_ci	0x6724,
117862306a36Sopenharmony_ci	0x6725,
117962306a36Sopenharmony_ci	0x6726,
118062306a36Sopenharmony_ci	0x6727,
118162306a36Sopenharmony_ci	0x6728,
118262306a36Sopenharmony_ci	0x6729,
118362306a36Sopenharmony_ci	0x6738,
118462306a36Sopenharmony_ci	0x6739,
118562306a36Sopenharmony_ci	0x673e,
118662306a36Sopenharmony_ci	0x6740,
118762306a36Sopenharmony_ci	0x6741,
118862306a36Sopenharmony_ci	0x6742,
118962306a36Sopenharmony_ci	0x6743,
119062306a36Sopenharmony_ci	0x6744,
119162306a36Sopenharmony_ci	0x6745,
119262306a36Sopenharmony_ci	0x6746,
119362306a36Sopenharmony_ci	0x6747,
119462306a36Sopenharmony_ci	0x6748,
119562306a36Sopenharmony_ci	0x6749,
119662306a36Sopenharmony_ci	0x674A,
119762306a36Sopenharmony_ci	0x6750,
119862306a36Sopenharmony_ci	0x6751,
119962306a36Sopenharmony_ci	0x6758,
120062306a36Sopenharmony_ci	0x6759,
120162306a36Sopenharmony_ci	0x675B,
120262306a36Sopenharmony_ci	0x675D,
120362306a36Sopenharmony_ci	0x675F,
120462306a36Sopenharmony_ci	0x6760,
120562306a36Sopenharmony_ci	0x6761,
120662306a36Sopenharmony_ci	0x6762,
120762306a36Sopenharmony_ci	0x6763,
120862306a36Sopenharmony_ci	0x6764,
120962306a36Sopenharmony_ci	0x6765,
121062306a36Sopenharmony_ci	0x6766,
121162306a36Sopenharmony_ci	0x6767,
121262306a36Sopenharmony_ci	0x6768,
121362306a36Sopenharmony_ci	0x6770,
121462306a36Sopenharmony_ci	0x6771,
121562306a36Sopenharmony_ci	0x6772,
121662306a36Sopenharmony_ci	0x6778,
121762306a36Sopenharmony_ci	0x6779,
121862306a36Sopenharmony_ci	0x677B,
121962306a36Sopenharmony_ci	0x6840,
122062306a36Sopenharmony_ci	0x6841,
122162306a36Sopenharmony_ci	0x6842,
122262306a36Sopenharmony_ci	0x6843,
122362306a36Sopenharmony_ci	0x6849,
122462306a36Sopenharmony_ci	0x684C,
122562306a36Sopenharmony_ci	0x6850,
122662306a36Sopenharmony_ci	0x6858,
122762306a36Sopenharmony_ci	0x6859,
122862306a36Sopenharmony_ci	0x6880,
122962306a36Sopenharmony_ci	0x6888,
123062306a36Sopenharmony_ci	0x6889,
123162306a36Sopenharmony_ci	0x688A,
123262306a36Sopenharmony_ci	0x688C,
123362306a36Sopenharmony_ci	0x688D,
123462306a36Sopenharmony_ci	0x6898,
123562306a36Sopenharmony_ci	0x6899,
123662306a36Sopenharmony_ci	0x689b,
123762306a36Sopenharmony_ci	0x689c,
123862306a36Sopenharmony_ci	0x689d,
123962306a36Sopenharmony_ci	0x689e,
124062306a36Sopenharmony_ci	0x68a0,
124162306a36Sopenharmony_ci	0x68a1,
124262306a36Sopenharmony_ci	0x68a8,
124362306a36Sopenharmony_ci	0x68a9,
124462306a36Sopenharmony_ci	0x68b0,
124562306a36Sopenharmony_ci	0x68b8,
124662306a36Sopenharmony_ci	0x68b9,
124762306a36Sopenharmony_ci	0x68ba,
124862306a36Sopenharmony_ci	0x68be,
124962306a36Sopenharmony_ci	0x68bf,
125062306a36Sopenharmony_ci	0x68c0,
125162306a36Sopenharmony_ci	0x68c1,
125262306a36Sopenharmony_ci	0x68c7,
125362306a36Sopenharmony_ci	0x68c8,
125462306a36Sopenharmony_ci	0x68c9,
125562306a36Sopenharmony_ci	0x68d8,
125662306a36Sopenharmony_ci	0x68d9,
125762306a36Sopenharmony_ci	0x68da,
125862306a36Sopenharmony_ci	0x68de,
125962306a36Sopenharmony_ci	0x68e0,
126062306a36Sopenharmony_ci	0x68e1,
126162306a36Sopenharmony_ci	0x68e4,
126262306a36Sopenharmony_ci	0x68e5,
126362306a36Sopenharmony_ci	0x68e8,
126462306a36Sopenharmony_ci	0x68e9,
126562306a36Sopenharmony_ci	0x68f1,
126662306a36Sopenharmony_ci	0x68f2,
126762306a36Sopenharmony_ci	0x68f8,
126862306a36Sopenharmony_ci	0x68f9,
126962306a36Sopenharmony_ci	0x68fa,
127062306a36Sopenharmony_ci	0x68fe,
127162306a36Sopenharmony_ci	0x7100,
127262306a36Sopenharmony_ci	0x7101,
127362306a36Sopenharmony_ci	0x7102,
127462306a36Sopenharmony_ci	0x7103,
127562306a36Sopenharmony_ci	0x7104,
127662306a36Sopenharmony_ci	0x7105,
127762306a36Sopenharmony_ci	0x7106,
127862306a36Sopenharmony_ci	0x7108,
127962306a36Sopenharmony_ci	0x7109,
128062306a36Sopenharmony_ci	0x710A,
128162306a36Sopenharmony_ci	0x710B,
128262306a36Sopenharmony_ci	0x710C,
128362306a36Sopenharmony_ci	0x710E,
128462306a36Sopenharmony_ci	0x710F,
128562306a36Sopenharmony_ci	0x7140,
128662306a36Sopenharmony_ci	0x7141,
128762306a36Sopenharmony_ci	0x7142,
128862306a36Sopenharmony_ci	0x7143,
128962306a36Sopenharmony_ci	0x7144,
129062306a36Sopenharmony_ci	0x7145,
129162306a36Sopenharmony_ci	0x7146,
129262306a36Sopenharmony_ci	0x7147,
129362306a36Sopenharmony_ci	0x7149,
129462306a36Sopenharmony_ci	0x714A,
129562306a36Sopenharmony_ci	0x714B,
129662306a36Sopenharmony_ci	0x714C,
129762306a36Sopenharmony_ci	0x714D,
129862306a36Sopenharmony_ci	0x714E,
129962306a36Sopenharmony_ci	0x714F,
130062306a36Sopenharmony_ci	0x7151,
130162306a36Sopenharmony_ci	0x7152,
130262306a36Sopenharmony_ci	0x7153,
130362306a36Sopenharmony_ci	0x715E,
130462306a36Sopenharmony_ci	0x715F,
130562306a36Sopenharmony_ci	0x7180,
130662306a36Sopenharmony_ci	0x7181,
130762306a36Sopenharmony_ci	0x7183,
130862306a36Sopenharmony_ci	0x7186,
130962306a36Sopenharmony_ci	0x7187,
131062306a36Sopenharmony_ci	0x7188,
131162306a36Sopenharmony_ci	0x718A,
131262306a36Sopenharmony_ci	0x718B,
131362306a36Sopenharmony_ci	0x718C,
131462306a36Sopenharmony_ci	0x718D,
131562306a36Sopenharmony_ci	0x718F,
131662306a36Sopenharmony_ci	0x7193,
131762306a36Sopenharmony_ci	0x7196,
131862306a36Sopenharmony_ci	0x719B,
131962306a36Sopenharmony_ci	0x719F,
132062306a36Sopenharmony_ci	0x71C0,
132162306a36Sopenharmony_ci	0x71C1,
132262306a36Sopenharmony_ci	0x71C2,
132362306a36Sopenharmony_ci	0x71C3,
132462306a36Sopenharmony_ci	0x71C4,
132562306a36Sopenharmony_ci	0x71C5,
132662306a36Sopenharmony_ci	0x71C6,
132762306a36Sopenharmony_ci	0x71C7,
132862306a36Sopenharmony_ci	0x71CD,
132962306a36Sopenharmony_ci	0x71CE,
133062306a36Sopenharmony_ci	0x71D2,
133162306a36Sopenharmony_ci	0x71D4,
133262306a36Sopenharmony_ci	0x71D5,
133362306a36Sopenharmony_ci	0x71D6,
133462306a36Sopenharmony_ci	0x71DA,
133562306a36Sopenharmony_ci	0x71DE,
133662306a36Sopenharmony_ci	0x7200,
133762306a36Sopenharmony_ci	0x7210,
133862306a36Sopenharmony_ci	0x7211,
133962306a36Sopenharmony_ci	0x7240,
134062306a36Sopenharmony_ci	0x7243,
134162306a36Sopenharmony_ci	0x7244,
134262306a36Sopenharmony_ci	0x7245,
134362306a36Sopenharmony_ci	0x7246,
134462306a36Sopenharmony_ci	0x7247,
134562306a36Sopenharmony_ci	0x7248,
134662306a36Sopenharmony_ci	0x7249,
134762306a36Sopenharmony_ci	0x724A,
134862306a36Sopenharmony_ci	0x724B,
134962306a36Sopenharmony_ci	0x724C,
135062306a36Sopenharmony_ci	0x724D,
135162306a36Sopenharmony_ci	0x724E,
135262306a36Sopenharmony_ci	0x724F,
135362306a36Sopenharmony_ci	0x7280,
135462306a36Sopenharmony_ci	0x7281,
135562306a36Sopenharmony_ci	0x7283,
135662306a36Sopenharmony_ci	0x7284,
135762306a36Sopenharmony_ci	0x7287,
135862306a36Sopenharmony_ci	0x7288,
135962306a36Sopenharmony_ci	0x7289,
136062306a36Sopenharmony_ci	0x728B,
136162306a36Sopenharmony_ci	0x728C,
136262306a36Sopenharmony_ci	0x7290,
136362306a36Sopenharmony_ci	0x7291,
136462306a36Sopenharmony_ci	0x7293,
136562306a36Sopenharmony_ci	0x7297,
136662306a36Sopenharmony_ci	0x7834,
136762306a36Sopenharmony_ci	0x7835,
136862306a36Sopenharmony_ci	0x791e,
136962306a36Sopenharmony_ci	0x791f,
137062306a36Sopenharmony_ci	0x793f,
137162306a36Sopenharmony_ci	0x7941,
137262306a36Sopenharmony_ci	0x7942,
137362306a36Sopenharmony_ci	0x796c,
137462306a36Sopenharmony_ci	0x796d,
137562306a36Sopenharmony_ci	0x796e,
137662306a36Sopenharmony_ci	0x796f,
137762306a36Sopenharmony_ci	0x9400,
137862306a36Sopenharmony_ci	0x9401,
137962306a36Sopenharmony_ci	0x9402,
138062306a36Sopenharmony_ci	0x9403,
138162306a36Sopenharmony_ci	0x9405,
138262306a36Sopenharmony_ci	0x940A,
138362306a36Sopenharmony_ci	0x940B,
138462306a36Sopenharmony_ci	0x940F,
138562306a36Sopenharmony_ci	0x94A0,
138662306a36Sopenharmony_ci	0x94A1,
138762306a36Sopenharmony_ci	0x94A3,
138862306a36Sopenharmony_ci	0x94B1,
138962306a36Sopenharmony_ci	0x94B3,
139062306a36Sopenharmony_ci	0x94B4,
139162306a36Sopenharmony_ci	0x94B5,
139262306a36Sopenharmony_ci	0x94B9,
139362306a36Sopenharmony_ci	0x9440,
139462306a36Sopenharmony_ci	0x9441,
139562306a36Sopenharmony_ci	0x9442,
139662306a36Sopenharmony_ci	0x9443,
139762306a36Sopenharmony_ci	0x9444,
139862306a36Sopenharmony_ci	0x9446,
139962306a36Sopenharmony_ci	0x944A,
140062306a36Sopenharmony_ci	0x944B,
140162306a36Sopenharmony_ci	0x944C,
140262306a36Sopenharmony_ci	0x944E,
140362306a36Sopenharmony_ci	0x9450,
140462306a36Sopenharmony_ci	0x9452,
140562306a36Sopenharmony_ci	0x9456,
140662306a36Sopenharmony_ci	0x945A,
140762306a36Sopenharmony_ci	0x945B,
140862306a36Sopenharmony_ci	0x945E,
140962306a36Sopenharmony_ci	0x9460,
141062306a36Sopenharmony_ci	0x9462,
141162306a36Sopenharmony_ci	0x946A,
141262306a36Sopenharmony_ci	0x946B,
141362306a36Sopenharmony_ci	0x947A,
141462306a36Sopenharmony_ci	0x947B,
141562306a36Sopenharmony_ci	0x9480,
141662306a36Sopenharmony_ci	0x9487,
141762306a36Sopenharmony_ci	0x9488,
141862306a36Sopenharmony_ci	0x9489,
141962306a36Sopenharmony_ci	0x948A,
142062306a36Sopenharmony_ci	0x948F,
142162306a36Sopenharmony_ci	0x9490,
142262306a36Sopenharmony_ci	0x9491,
142362306a36Sopenharmony_ci	0x9495,
142462306a36Sopenharmony_ci	0x9498,
142562306a36Sopenharmony_ci	0x949C,
142662306a36Sopenharmony_ci	0x949E,
142762306a36Sopenharmony_ci	0x949F,
142862306a36Sopenharmony_ci	0x94C0,
142962306a36Sopenharmony_ci	0x94C1,
143062306a36Sopenharmony_ci	0x94C3,
143162306a36Sopenharmony_ci	0x94C4,
143262306a36Sopenharmony_ci	0x94C5,
143362306a36Sopenharmony_ci	0x94C6,
143462306a36Sopenharmony_ci	0x94C7,
143562306a36Sopenharmony_ci	0x94C8,
143662306a36Sopenharmony_ci	0x94C9,
143762306a36Sopenharmony_ci	0x94CB,
143862306a36Sopenharmony_ci	0x94CC,
143962306a36Sopenharmony_ci	0x94CD,
144062306a36Sopenharmony_ci	0x9500,
144162306a36Sopenharmony_ci	0x9501,
144262306a36Sopenharmony_ci	0x9504,
144362306a36Sopenharmony_ci	0x9505,
144462306a36Sopenharmony_ci	0x9506,
144562306a36Sopenharmony_ci	0x9507,
144662306a36Sopenharmony_ci	0x9508,
144762306a36Sopenharmony_ci	0x9509,
144862306a36Sopenharmony_ci	0x950F,
144962306a36Sopenharmony_ci	0x9511,
145062306a36Sopenharmony_ci	0x9515,
145162306a36Sopenharmony_ci	0x9517,
145262306a36Sopenharmony_ci	0x9519,
145362306a36Sopenharmony_ci	0x9540,
145462306a36Sopenharmony_ci	0x9541,
145562306a36Sopenharmony_ci	0x9542,
145662306a36Sopenharmony_ci	0x954E,
145762306a36Sopenharmony_ci	0x954F,
145862306a36Sopenharmony_ci	0x9552,
145962306a36Sopenharmony_ci	0x9553,
146062306a36Sopenharmony_ci	0x9555,
146162306a36Sopenharmony_ci	0x9557,
146262306a36Sopenharmony_ci	0x955f,
146362306a36Sopenharmony_ci	0x9580,
146462306a36Sopenharmony_ci	0x9581,
146562306a36Sopenharmony_ci	0x9583,
146662306a36Sopenharmony_ci	0x9586,
146762306a36Sopenharmony_ci	0x9587,
146862306a36Sopenharmony_ci	0x9588,
146962306a36Sopenharmony_ci	0x9589,
147062306a36Sopenharmony_ci	0x958A,
147162306a36Sopenharmony_ci	0x958B,
147262306a36Sopenharmony_ci	0x958C,
147362306a36Sopenharmony_ci	0x958D,
147462306a36Sopenharmony_ci	0x958E,
147562306a36Sopenharmony_ci	0x958F,
147662306a36Sopenharmony_ci	0x9590,
147762306a36Sopenharmony_ci	0x9591,
147862306a36Sopenharmony_ci	0x9593,
147962306a36Sopenharmony_ci	0x9595,
148062306a36Sopenharmony_ci	0x9596,
148162306a36Sopenharmony_ci	0x9597,
148262306a36Sopenharmony_ci	0x9598,
148362306a36Sopenharmony_ci	0x9599,
148462306a36Sopenharmony_ci	0x959B,
148562306a36Sopenharmony_ci	0x95C0,
148662306a36Sopenharmony_ci	0x95C2,
148762306a36Sopenharmony_ci	0x95C4,
148862306a36Sopenharmony_ci	0x95C5,
148962306a36Sopenharmony_ci	0x95C6,
149062306a36Sopenharmony_ci	0x95C7,
149162306a36Sopenharmony_ci	0x95C9,
149262306a36Sopenharmony_ci	0x95CC,
149362306a36Sopenharmony_ci	0x95CD,
149462306a36Sopenharmony_ci	0x95CE,
149562306a36Sopenharmony_ci	0x95CF,
149662306a36Sopenharmony_ci	0x9610,
149762306a36Sopenharmony_ci	0x9611,
149862306a36Sopenharmony_ci	0x9612,
149962306a36Sopenharmony_ci	0x9613,
150062306a36Sopenharmony_ci	0x9614,
150162306a36Sopenharmony_ci	0x9615,
150262306a36Sopenharmony_ci	0x9616,
150362306a36Sopenharmony_ci	0x9640,
150462306a36Sopenharmony_ci	0x9641,
150562306a36Sopenharmony_ci	0x9642,
150662306a36Sopenharmony_ci	0x9643,
150762306a36Sopenharmony_ci	0x9644,
150862306a36Sopenharmony_ci	0x9645,
150962306a36Sopenharmony_ci	0x9647,
151062306a36Sopenharmony_ci	0x9648,
151162306a36Sopenharmony_ci	0x9649,
151262306a36Sopenharmony_ci	0x964a,
151362306a36Sopenharmony_ci	0x964b,
151462306a36Sopenharmony_ci	0x964c,
151562306a36Sopenharmony_ci	0x964e,
151662306a36Sopenharmony_ci	0x964f,
151762306a36Sopenharmony_ci	0x9710,
151862306a36Sopenharmony_ci	0x9711,
151962306a36Sopenharmony_ci	0x9712,
152062306a36Sopenharmony_ci	0x9713,
152162306a36Sopenharmony_ci	0x9714,
152262306a36Sopenharmony_ci	0x9715,
152362306a36Sopenharmony_ci	0x9802,
152462306a36Sopenharmony_ci	0x9803,
152562306a36Sopenharmony_ci	0x9804,
152662306a36Sopenharmony_ci	0x9805,
152762306a36Sopenharmony_ci	0x9806,
152862306a36Sopenharmony_ci	0x9807,
152962306a36Sopenharmony_ci	0x9808,
153062306a36Sopenharmony_ci	0x9809,
153162306a36Sopenharmony_ci	0x980A,
153262306a36Sopenharmony_ci	0x9900,
153362306a36Sopenharmony_ci	0x9901,
153462306a36Sopenharmony_ci	0x9903,
153562306a36Sopenharmony_ci	0x9904,
153662306a36Sopenharmony_ci	0x9905,
153762306a36Sopenharmony_ci	0x9906,
153862306a36Sopenharmony_ci	0x9907,
153962306a36Sopenharmony_ci	0x9908,
154062306a36Sopenharmony_ci	0x9909,
154162306a36Sopenharmony_ci	0x990A,
154262306a36Sopenharmony_ci	0x990B,
154362306a36Sopenharmony_ci	0x990C,
154462306a36Sopenharmony_ci	0x990D,
154562306a36Sopenharmony_ci	0x990E,
154662306a36Sopenharmony_ci	0x990F,
154762306a36Sopenharmony_ci	0x9910,
154862306a36Sopenharmony_ci	0x9913,
154962306a36Sopenharmony_ci	0x9917,
155062306a36Sopenharmony_ci	0x9918,
155162306a36Sopenharmony_ci	0x9919,
155262306a36Sopenharmony_ci	0x9990,
155362306a36Sopenharmony_ci	0x9991,
155462306a36Sopenharmony_ci	0x9992,
155562306a36Sopenharmony_ci	0x9993,
155662306a36Sopenharmony_ci	0x9994,
155762306a36Sopenharmony_ci	0x9995,
155862306a36Sopenharmony_ci	0x9996,
155962306a36Sopenharmony_ci	0x9997,
156062306a36Sopenharmony_ci	0x9998,
156162306a36Sopenharmony_ci	0x9999,
156262306a36Sopenharmony_ci	0x999A,
156362306a36Sopenharmony_ci	0x999B,
156462306a36Sopenharmony_ci	0x999C,
156562306a36Sopenharmony_ci	0x999D,
156662306a36Sopenharmony_ci	0x99A0,
156762306a36Sopenharmony_ci	0x99A2,
156862306a36Sopenharmony_ci	0x99A4,
156962306a36Sopenharmony_ci	/* radeon secondary ids */
157062306a36Sopenharmony_ci	0x3171,
157162306a36Sopenharmony_ci	0x3e70,
157262306a36Sopenharmony_ci	0x4164,
157362306a36Sopenharmony_ci	0x4165,
157462306a36Sopenharmony_ci	0x4166,
157562306a36Sopenharmony_ci	0x4168,
157662306a36Sopenharmony_ci	0x4170,
157762306a36Sopenharmony_ci	0x4171,
157862306a36Sopenharmony_ci	0x4172,
157962306a36Sopenharmony_ci	0x4173,
158062306a36Sopenharmony_ci	0x496e,
158162306a36Sopenharmony_ci	0x4a69,
158262306a36Sopenharmony_ci	0x4a6a,
158362306a36Sopenharmony_ci	0x4a6b,
158462306a36Sopenharmony_ci	0x4a70,
158562306a36Sopenharmony_ci	0x4a74,
158662306a36Sopenharmony_ci	0x4b69,
158762306a36Sopenharmony_ci	0x4b6b,
158862306a36Sopenharmony_ci	0x4b6c,
158962306a36Sopenharmony_ci	0x4c6e,
159062306a36Sopenharmony_ci	0x4e64,
159162306a36Sopenharmony_ci	0x4e65,
159262306a36Sopenharmony_ci	0x4e66,
159362306a36Sopenharmony_ci	0x4e67,
159462306a36Sopenharmony_ci	0x4e68,
159562306a36Sopenharmony_ci	0x4e69,
159662306a36Sopenharmony_ci	0x4e6a,
159762306a36Sopenharmony_ci	0x4e71,
159862306a36Sopenharmony_ci	0x4f73,
159962306a36Sopenharmony_ci	0x5569,
160062306a36Sopenharmony_ci	0x556b,
160162306a36Sopenharmony_ci	0x556d,
160262306a36Sopenharmony_ci	0x556f,
160362306a36Sopenharmony_ci	0x5571,
160462306a36Sopenharmony_ci	0x5854,
160562306a36Sopenharmony_ci	0x5874,
160662306a36Sopenharmony_ci	0x5940,
160762306a36Sopenharmony_ci	0x5941,
160862306a36Sopenharmony_ci	0x5b70,
160962306a36Sopenharmony_ci	0x5b72,
161062306a36Sopenharmony_ci	0x5b73,
161162306a36Sopenharmony_ci	0x5b74,
161262306a36Sopenharmony_ci	0x5b75,
161362306a36Sopenharmony_ci	0x5d44,
161462306a36Sopenharmony_ci	0x5d45,
161562306a36Sopenharmony_ci	0x5d6d,
161662306a36Sopenharmony_ci	0x5d6f,
161762306a36Sopenharmony_ci	0x5d72,
161862306a36Sopenharmony_ci	0x5d77,
161962306a36Sopenharmony_ci	0x5e6b,
162062306a36Sopenharmony_ci	0x5e6d,
162162306a36Sopenharmony_ci	0x7120,
162262306a36Sopenharmony_ci	0x7124,
162362306a36Sopenharmony_ci	0x7129,
162462306a36Sopenharmony_ci	0x712e,
162562306a36Sopenharmony_ci	0x712f,
162662306a36Sopenharmony_ci	0x7162,
162762306a36Sopenharmony_ci	0x7163,
162862306a36Sopenharmony_ci	0x7166,
162962306a36Sopenharmony_ci	0x7167,
163062306a36Sopenharmony_ci	0x7172,
163162306a36Sopenharmony_ci	0x7173,
163262306a36Sopenharmony_ci	0x71a0,
163362306a36Sopenharmony_ci	0x71a1,
163462306a36Sopenharmony_ci	0x71a3,
163562306a36Sopenharmony_ci	0x71a7,
163662306a36Sopenharmony_ci	0x71bb,
163762306a36Sopenharmony_ci	0x71e0,
163862306a36Sopenharmony_ci	0x71e1,
163962306a36Sopenharmony_ci	0x71e2,
164062306a36Sopenharmony_ci	0x71e6,
164162306a36Sopenharmony_ci	0x71e7,
164262306a36Sopenharmony_ci	0x71f2,
164362306a36Sopenharmony_ci	0x7269,
164462306a36Sopenharmony_ci	0x726b,
164562306a36Sopenharmony_ci	0x726e,
164662306a36Sopenharmony_ci	0x72a0,
164762306a36Sopenharmony_ci	0x72a8,
164862306a36Sopenharmony_ci	0x72b1,
164962306a36Sopenharmony_ci	0x72b3,
165062306a36Sopenharmony_ci	0x793f,
165162306a36Sopenharmony_ci};
165262306a36Sopenharmony_ci
165362306a36Sopenharmony_cistatic const struct pci_device_id pciidlist[] = {
165462306a36Sopenharmony_ci#ifdef CONFIG_DRM_AMDGPU_SI
165562306a36Sopenharmony_ci	{0x1002, 0x6780, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
165662306a36Sopenharmony_ci	{0x1002, 0x6784, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
165762306a36Sopenharmony_ci	{0x1002, 0x6788, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
165862306a36Sopenharmony_ci	{0x1002, 0x678A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
165962306a36Sopenharmony_ci	{0x1002, 0x6790, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
166062306a36Sopenharmony_ci	{0x1002, 0x6791, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
166162306a36Sopenharmony_ci	{0x1002, 0x6792, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
166262306a36Sopenharmony_ci	{0x1002, 0x6798, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
166362306a36Sopenharmony_ci	{0x1002, 0x6799, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
166462306a36Sopenharmony_ci	{0x1002, 0x679A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
166562306a36Sopenharmony_ci	{0x1002, 0x679B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
166662306a36Sopenharmony_ci	{0x1002, 0x679E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
166762306a36Sopenharmony_ci	{0x1002, 0x679F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
166862306a36Sopenharmony_ci	{0x1002, 0x6800, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|AMD_IS_MOBILITY},
166962306a36Sopenharmony_ci	{0x1002, 0x6801, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|AMD_IS_MOBILITY},
167062306a36Sopenharmony_ci	{0x1002, 0x6802, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|AMD_IS_MOBILITY},
167162306a36Sopenharmony_ci	{0x1002, 0x6806, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
167262306a36Sopenharmony_ci	{0x1002, 0x6808, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
167362306a36Sopenharmony_ci	{0x1002, 0x6809, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
167462306a36Sopenharmony_ci	{0x1002, 0x6810, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
167562306a36Sopenharmony_ci	{0x1002, 0x6811, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
167662306a36Sopenharmony_ci	{0x1002, 0x6816, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
167762306a36Sopenharmony_ci	{0x1002, 0x6817, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
167862306a36Sopenharmony_ci	{0x1002, 0x6818, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
167962306a36Sopenharmony_ci	{0x1002, 0x6819, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
168062306a36Sopenharmony_ci	{0x1002, 0x6600, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
168162306a36Sopenharmony_ci	{0x1002, 0x6601, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
168262306a36Sopenharmony_ci	{0x1002, 0x6602, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
168362306a36Sopenharmony_ci	{0x1002, 0x6603, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
168462306a36Sopenharmony_ci	{0x1002, 0x6604, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
168562306a36Sopenharmony_ci	{0x1002, 0x6605, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
168662306a36Sopenharmony_ci	{0x1002, 0x6606, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
168762306a36Sopenharmony_ci	{0x1002, 0x6607, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
168862306a36Sopenharmony_ci	{0x1002, 0x6608, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND},
168962306a36Sopenharmony_ci	{0x1002, 0x6610, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND},
169062306a36Sopenharmony_ci	{0x1002, 0x6611, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND},
169162306a36Sopenharmony_ci	{0x1002, 0x6613, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND},
169262306a36Sopenharmony_ci	{0x1002, 0x6617, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
169362306a36Sopenharmony_ci	{0x1002, 0x6620, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
169462306a36Sopenharmony_ci	{0x1002, 0x6621, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
169562306a36Sopenharmony_ci	{0x1002, 0x6623, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
169662306a36Sopenharmony_ci	{0x1002, 0x6631, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND},
169762306a36Sopenharmony_ci	{0x1002, 0x6820, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
169862306a36Sopenharmony_ci	{0x1002, 0x6821, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
169962306a36Sopenharmony_ci	{0x1002, 0x6822, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
170062306a36Sopenharmony_ci	{0x1002, 0x6823, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
170162306a36Sopenharmony_ci	{0x1002, 0x6824, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
170262306a36Sopenharmony_ci	{0x1002, 0x6825, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
170362306a36Sopenharmony_ci	{0x1002, 0x6826, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
170462306a36Sopenharmony_ci	{0x1002, 0x6827, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
170562306a36Sopenharmony_ci	{0x1002, 0x6828, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
170662306a36Sopenharmony_ci	{0x1002, 0x6829, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
170762306a36Sopenharmony_ci	{0x1002, 0x682A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
170862306a36Sopenharmony_ci	{0x1002, 0x682B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
170962306a36Sopenharmony_ci	{0x1002, 0x682C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
171062306a36Sopenharmony_ci	{0x1002, 0x682D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
171162306a36Sopenharmony_ci	{0x1002, 0x682F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
171262306a36Sopenharmony_ci	{0x1002, 0x6830, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
171362306a36Sopenharmony_ci	{0x1002, 0x6831, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
171462306a36Sopenharmony_ci	{0x1002, 0x6835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
171562306a36Sopenharmony_ci	{0x1002, 0x6837, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
171662306a36Sopenharmony_ci	{0x1002, 0x6838, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
171762306a36Sopenharmony_ci	{0x1002, 0x6839, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
171862306a36Sopenharmony_ci	{0x1002, 0x683B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
171962306a36Sopenharmony_ci	{0x1002, 0x683D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
172062306a36Sopenharmony_ci	{0x1002, 0x683F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
172162306a36Sopenharmony_ci	{0x1002, 0x6660, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|AMD_IS_MOBILITY},
172262306a36Sopenharmony_ci	{0x1002, 0x6663, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|AMD_IS_MOBILITY},
172362306a36Sopenharmony_ci	{0x1002, 0x6664, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|AMD_IS_MOBILITY},
172462306a36Sopenharmony_ci	{0x1002, 0x6665, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|AMD_IS_MOBILITY},
172562306a36Sopenharmony_ci	{0x1002, 0x6667, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|AMD_IS_MOBILITY},
172662306a36Sopenharmony_ci	{0x1002, 0x666F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|AMD_IS_MOBILITY},
172762306a36Sopenharmony_ci#endif
172862306a36Sopenharmony_ci#ifdef CONFIG_DRM_AMDGPU_CIK
172962306a36Sopenharmony_ci	/* Kaveri */
173062306a36Sopenharmony_ci	{0x1002, 0x1304, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
173162306a36Sopenharmony_ci	{0x1002, 0x1305, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
173262306a36Sopenharmony_ci	{0x1002, 0x1306, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
173362306a36Sopenharmony_ci	{0x1002, 0x1307, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
173462306a36Sopenharmony_ci	{0x1002, 0x1309, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
173562306a36Sopenharmony_ci	{0x1002, 0x130A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
173662306a36Sopenharmony_ci	{0x1002, 0x130B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
173762306a36Sopenharmony_ci	{0x1002, 0x130C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
173862306a36Sopenharmony_ci	{0x1002, 0x130D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
173962306a36Sopenharmony_ci	{0x1002, 0x130E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
174062306a36Sopenharmony_ci	{0x1002, 0x130F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
174162306a36Sopenharmony_ci	{0x1002, 0x1310, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
174262306a36Sopenharmony_ci	{0x1002, 0x1311, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
174362306a36Sopenharmony_ci	{0x1002, 0x1312, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
174462306a36Sopenharmony_ci	{0x1002, 0x1313, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
174562306a36Sopenharmony_ci	{0x1002, 0x1315, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
174662306a36Sopenharmony_ci	{0x1002, 0x1316, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
174762306a36Sopenharmony_ci	{0x1002, 0x1317, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
174862306a36Sopenharmony_ci	{0x1002, 0x1318, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
174962306a36Sopenharmony_ci	{0x1002, 0x131B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
175062306a36Sopenharmony_ci	{0x1002, 0x131C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
175162306a36Sopenharmony_ci	{0x1002, 0x131D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
175262306a36Sopenharmony_ci	/* Bonaire */
175362306a36Sopenharmony_ci	{0x1002, 0x6640, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE|AMD_IS_MOBILITY},
175462306a36Sopenharmony_ci	{0x1002, 0x6641, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE|AMD_IS_MOBILITY},
175562306a36Sopenharmony_ci	{0x1002, 0x6646, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE|AMD_IS_MOBILITY},
175662306a36Sopenharmony_ci	{0x1002, 0x6647, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE|AMD_IS_MOBILITY},
175762306a36Sopenharmony_ci	{0x1002, 0x6649, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE},
175862306a36Sopenharmony_ci	{0x1002, 0x6650, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE},
175962306a36Sopenharmony_ci	{0x1002, 0x6651, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE},
176062306a36Sopenharmony_ci	{0x1002, 0x6658, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE},
176162306a36Sopenharmony_ci	{0x1002, 0x665c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE},
176262306a36Sopenharmony_ci	{0x1002, 0x665d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE},
176362306a36Sopenharmony_ci	{0x1002, 0x665f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE},
176462306a36Sopenharmony_ci	/* Hawaii */
176562306a36Sopenharmony_ci	{0x1002, 0x67A0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
176662306a36Sopenharmony_ci	{0x1002, 0x67A1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
176762306a36Sopenharmony_ci	{0x1002, 0x67A2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
176862306a36Sopenharmony_ci	{0x1002, 0x67A8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
176962306a36Sopenharmony_ci	{0x1002, 0x67A9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
177062306a36Sopenharmony_ci	{0x1002, 0x67AA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
177162306a36Sopenharmony_ci	{0x1002, 0x67B0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
177262306a36Sopenharmony_ci	{0x1002, 0x67B1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
177362306a36Sopenharmony_ci	{0x1002, 0x67B8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
177462306a36Sopenharmony_ci	{0x1002, 0x67B9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
177562306a36Sopenharmony_ci	{0x1002, 0x67BA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
177662306a36Sopenharmony_ci	{0x1002, 0x67BE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII},
177762306a36Sopenharmony_ci	/* Kabini */
177862306a36Sopenharmony_ci	{0x1002, 0x9830, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_MOBILITY|AMD_IS_APU},
177962306a36Sopenharmony_ci	{0x1002, 0x9831, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_APU},
178062306a36Sopenharmony_ci	{0x1002, 0x9832, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_MOBILITY|AMD_IS_APU},
178162306a36Sopenharmony_ci	{0x1002, 0x9833, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_APU},
178262306a36Sopenharmony_ci	{0x1002, 0x9834, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_MOBILITY|AMD_IS_APU},
178362306a36Sopenharmony_ci	{0x1002, 0x9835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_APU},
178462306a36Sopenharmony_ci	{0x1002, 0x9836, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_MOBILITY|AMD_IS_APU},
178562306a36Sopenharmony_ci	{0x1002, 0x9837, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_APU},
178662306a36Sopenharmony_ci	{0x1002, 0x9838, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_MOBILITY|AMD_IS_APU},
178762306a36Sopenharmony_ci	{0x1002, 0x9839, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_MOBILITY|AMD_IS_APU},
178862306a36Sopenharmony_ci	{0x1002, 0x983a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_APU},
178962306a36Sopenharmony_ci	{0x1002, 0x983b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_MOBILITY|AMD_IS_APU},
179062306a36Sopenharmony_ci	{0x1002, 0x983c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_APU},
179162306a36Sopenharmony_ci	{0x1002, 0x983d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_APU},
179262306a36Sopenharmony_ci	{0x1002, 0x983e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_APU},
179362306a36Sopenharmony_ci	{0x1002, 0x983f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|AMD_IS_APU},
179462306a36Sopenharmony_ci	/* mullins */
179562306a36Sopenharmony_ci	{0x1002, 0x9850, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
179662306a36Sopenharmony_ci	{0x1002, 0x9851, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
179762306a36Sopenharmony_ci	{0x1002, 0x9852, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
179862306a36Sopenharmony_ci	{0x1002, 0x9853, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
179962306a36Sopenharmony_ci	{0x1002, 0x9854, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
180062306a36Sopenharmony_ci	{0x1002, 0x9855, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
180162306a36Sopenharmony_ci	{0x1002, 0x9856, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
180262306a36Sopenharmony_ci	{0x1002, 0x9857, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
180362306a36Sopenharmony_ci	{0x1002, 0x9858, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
180462306a36Sopenharmony_ci	{0x1002, 0x9859, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
180562306a36Sopenharmony_ci	{0x1002, 0x985A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
180662306a36Sopenharmony_ci	{0x1002, 0x985B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
180762306a36Sopenharmony_ci	{0x1002, 0x985C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
180862306a36Sopenharmony_ci	{0x1002, 0x985D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
180962306a36Sopenharmony_ci	{0x1002, 0x985E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
181062306a36Sopenharmony_ci	{0x1002, 0x985F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
181162306a36Sopenharmony_ci#endif
181262306a36Sopenharmony_ci	/* topaz */
181362306a36Sopenharmony_ci	{0x1002, 0x6900, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ},
181462306a36Sopenharmony_ci	{0x1002, 0x6901, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ},
181562306a36Sopenharmony_ci	{0x1002, 0x6902, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ},
181662306a36Sopenharmony_ci	{0x1002, 0x6903, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ},
181762306a36Sopenharmony_ci	{0x1002, 0x6907, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ},
181862306a36Sopenharmony_ci	/* tonga */
181962306a36Sopenharmony_ci	{0x1002, 0x6920, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA},
182062306a36Sopenharmony_ci	{0x1002, 0x6921, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA},
182162306a36Sopenharmony_ci	{0x1002, 0x6928, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA},
182262306a36Sopenharmony_ci	{0x1002, 0x6929, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA},
182362306a36Sopenharmony_ci	{0x1002, 0x692B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA},
182462306a36Sopenharmony_ci	{0x1002, 0x692F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA},
182562306a36Sopenharmony_ci	{0x1002, 0x6930, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA},
182662306a36Sopenharmony_ci	{0x1002, 0x6938, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA},
182762306a36Sopenharmony_ci	{0x1002, 0x6939, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA},
182862306a36Sopenharmony_ci	/* fiji */
182962306a36Sopenharmony_ci	{0x1002, 0x7300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_FIJI},
183062306a36Sopenharmony_ci	{0x1002, 0x730F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_FIJI},
183162306a36Sopenharmony_ci	/* carrizo */
183262306a36Sopenharmony_ci	{0x1002, 0x9870, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CARRIZO|AMD_IS_APU},
183362306a36Sopenharmony_ci	{0x1002, 0x9874, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CARRIZO|AMD_IS_APU},
183462306a36Sopenharmony_ci	{0x1002, 0x9875, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CARRIZO|AMD_IS_APU},
183562306a36Sopenharmony_ci	{0x1002, 0x9876, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CARRIZO|AMD_IS_APU},
183662306a36Sopenharmony_ci	{0x1002, 0x9877, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CARRIZO|AMD_IS_APU},
183762306a36Sopenharmony_ci	/* stoney */
183862306a36Sopenharmony_ci	{0x1002, 0x98E4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_STONEY|AMD_IS_APU},
183962306a36Sopenharmony_ci	/* Polaris11 */
184062306a36Sopenharmony_ci	{0x1002, 0x67E0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
184162306a36Sopenharmony_ci	{0x1002, 0x67E3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
184262306a36Sopenharmony_ci	{0x1002, 0x67E8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
184362306a36Sopenharmony_ci	{0x1002, 0x67EB, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
184462306a36Sopenharmony_ci	{0x1002, 0x67EF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
184562306a36Sopenharmony_ci	{0x1002, 0x67FF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
184662306a36Sopenharmony_ci	{0x1002, 0x67E1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
184762306a36Sopenharmony_ci	{0x1002, 0x67E7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
184862306a36Sopenharmony_ci	{0x1002, 0x67E9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
184962306a36Sopenharmony_ci	/* Polaris10 */
185062306a36Sopenharmony_ci	{0x1002, 0x67C0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
185162306a36Sopenharmony_ci	{0x1002, 0x67C1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
185262306a36Sopenharmony_ci	{0x1002, 0x67C2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
185362306a36Sopenharmony_ci	{0x1002, 0x67C4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
185462306a36Sopenharmony_ci	{0x1002, 0x67C7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
185562306a36Sopenharmony_ci	{0x1002, 0x67D0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
185662306a36Sopenharmony_ci	{0x1002, 0x67DF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
185762306a36Sopenharmony_ci	{0x1002, 0x67C8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
185862306a36Sopenharmony_ci	{0x1002, 0x67C9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
185962306a36Sopenharmony_ci	{0x1002, 0x67CA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
186062306a36Sopenharmony_ci	{0x1002, 0x67CC, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
186162306a36Sopenharmony_ci	{0x1002, 0x67CF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
186262306a36Sopenharmony_ci	{0x1002, 0x6FDF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
186362306a36Sopenharmony_ci	/* Polaris12 */
186462306a36Sopenharmony_ci	{0x1002, 0x6980, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12},
186562306a36Sopenharmony_ci	{0x1002, 0x6981, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12},
186662306a36Sopenharmony_ci	{0x1002, 0x6985, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12},
186762306a36Sopenharmony_ci	{0x1002, 0x6986, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12},
186862306a36Sopenharmony_ci	{0x1002, 0x6987, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12},
186962306a36Sopenharmony_ci	{0x1002, 0x6995, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12},
187062306a36Sopenharmony_ci	{0x1002, 0x6997, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12},
187162306a36Sopenharmony_ci	{0x1002, 0x699F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12},
187262306a36Sopenharmony_ci	/* VEGAM */
187362306a36Sopenharmony_ci	{0x1002, 0x694C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGAM},
187462306a36Sopenharmony_ci	{0x1002, 0x694E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGAM},
187562306a36Sopenharmony_ci	{0x1002, 0x694F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGAM},
187662306a36Sopenharmony_ci	/* Vega 10 */
187762306a36Sopenharmony_ci	{0x1002, 0x6860, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
187862306a36Sopenharmony_ci	{0x1002, 0x6861, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
187962306a36Sopenharmony_ci	{0x1002, 0x6862, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
188062306a36Sopenharmony_ci	{0x1002, 0x6863, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
188162306a36Sopenharmony_ci	{0x1002, 0x6864, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
188262306a36Sopenharmony_ci	{0x1002, 0x6867, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
188362306a36Sopenharmony_ci	{0x1002, 0x6868, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
188462306a36Sopenharmony_ci	{0x1002, 0x6869, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
188562306a36Sopenharmony_ci	{0x1002, 0x686a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
188662306a36Sopenharmony_ci	{0x1002, 0x686b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
188762306a36Sopenharmony_ci	{0x1002, 0x686c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
188862306a36Sopenharmony_ci	{0x1002, 0x686d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
188962306a36Sopenharmony_ci	{0x1002, 0x686e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
189062306a36Sopenharmony_ci	{0x1002, 0x686f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
189162306a36Sopenharmony_ci	{0x1002, 0x687f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
189262306a36Sopenharmony_ci	/* Vega 12 */
189362306a36Sopenharmony_ci	{0x1002, 0x69A0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA12},
189462306a36Sopenharmony_ci	{0x1002, 0x69A1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA12},
189562306a36Sopenharmony_ci	{0x1002, 0x69A2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA12},
189662306a36Sopenharmony_ci	{0x1002, 0x69A3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA12},
189762306a36Sopenharmony_ci	{0x1002, 0x69AF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA12},
189862306a36Sopenharmony_ci	/* Vega 20 */
189962306a36Sopenharmony_ci	{0x1002, 0x66A0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20},
190062306a36Sopenharmony_ci	{0x1002, 0x66A1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20},
190162306a36Sopenharmony_ci	{0x1002, 0x66A2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20},
190262306a36Sopenharmony_ci	{0x1002, 0x66A3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20},
190362306a36Sopenharmony_ci	{0x1002, 0x66A4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20},
190462306a36Sopenharmony_ci	{0x1002, 0x66A7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20},
190562306a36Sopenharmony_ci	{0x1002, 0x66AF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20},
190662306a36Sopenharmony_ci	/* Raven */
190762306a36Sopenharmony_ci	{0x1002, 0x15dd, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RAVEN|AMD_IS_APU},
190862306a36Sopenharmony_ci	{0x1002, 0x15d8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RAVEN|AMD_IS_APU},
190962306a36Sopenharmony_ci	/* Arcturus */
191062306a36Sopenharmony_ci	{0x1002, 0x738C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS},
191162306a36Sopenharmony_ci	{0x1002, 0x7388, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS},
191262306a36Sopenharmony_ci	{0x1002, 0x738E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS},
191362306a36Sopenharmony_ci	{0x1002, 0x7390, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS},
191462306a36Sopenharmony_ci	/* Navi10 */
191562306a36Sopenharmony_ci	{0x1002, 0x7310, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
191662306a36Sopenharmony_ci	{0x1002, 0x7312, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
191762306a36Sopenharmony_ci	{0x1002, 0x7318, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
191862306a36Sopenharmony_ci	{0x1002, 0x7319, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
191962306a36Sopenharmony_ci	{0x1002, 0x731A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
192062306a36Sopenharmony_ci	{0x1002, 0x731B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
192162306a36Sopenharmony_ci	{0x1002, 0x731E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
192262306a36Sopenharmony_ci	{0x1002, 0x731F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
192362306a36Sopenharmony_ci	/* Navi14 */
192462306a36Sopenharmony_ci	{0x1002, 0x7340, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI14},
192562306a36Sopenharmony_ci	{0x1002, 0x7341, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI14},
192662306a36Sopenharmony_ci	{0x1002, 0x7347, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI14},
192762306a36Sopenharmony_ci	{0x1002, 0x734F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI14},
192862306a36Sopenharmony_ci
192962306a36Sopenharmony_ci	/* Renoir */
193062306a36Sopenharmony_ci	{0x1002, 0x15E7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RENOIR|AMD_IS_APU},
193162306a36Sopenharmony_ci	{0x1002, 0x1636, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RENOIR|AMD_IS_APU},
193262306a36Sopenharmony_ci	{0x1002, 0x1638, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RENOIR|AMD_IS_APU},
193362306a36Sopenharmony_ci	{0x1002, 0x164C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RENOIR|AMD_IS_APU},
193462306a36Sopenharmony_ci
193562306a36Sopenharmony_ci	/* Navi12 */
193662306a36Sopenharmony_ci	{0x1002, 0x7360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI12},
193762306a36Sopenharmony_ci	{0x1002, 0x7362, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI12},
193862306a36Sopenharmony_ci
193962306a36Sopenharmony_ci	/* Sienna_Cichlid */
194062306a36Sopenharmony_ci	{0x1002, 0x73A0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
194162306a36Sopenharmony_ci	{0x1002, 0x73A1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
194262306a36Sopenharmony_ci	{0x1002, 0x73A2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
194362306a36Sopenharmony_ci	{0x1002, 0x73A3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
194462306a36Sopenharmony_ci	{0x1002, 0x73A5, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
194562306a36Sopenharmony_ci	{0x1002, 0x73A8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
194662306a36Sopenharmony_ci	{0x1002, 0x73A9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
194762306a36Sopenharmony_ci	{0x1002, 0x73AB, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
194862306a36Sopenharmony_ci	{0x1002, 0x73AC, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
194962306a36Sopenharmony_ci	{0x1002, 0x73AD, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
195062306a36Sopenharmony_ci	{0x1002, 0x73AE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
195162306a36Sopenharmony_ci	{0x1002, 0x73AF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
195262306a36Sopenharmony_ci	{0x1002, 0x73BF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
195362306a36Sopenharmony_ci
195462306a36Sopenharmony_ci	/* Yellow Carp */
195562306a36Sopenharmony_ci	{0x1002, 0x164D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_YELLOW_CARP|AMD_IS_APU},
195662306a36Sopenharmony_ci	{0x1002, 0x1681, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_YELLOW_CARP|AMD_IS_APU},
195762306a36Sopenharmony_ci
195862306a36Sopenharmony_ci	/* Navy_Flounder */
195962306a36Sopenharmony_ci	{0x1002, 0x73C0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},
196062306a36Sopenharmony_ci	{0x1002, 0x73C1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},
196162306a36Sopenharmony_ci	{0x1002, 0x73C3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},
196262306a36Sopenharmony_ci	{0x1002, 0x73DA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},
196362306a36Sopenharmony_ci	{0x1002, 0x73DB, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},
196462306a36Sopenharmony_ci	{0x1002, 0x73DC, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},
196562306a36Sopenharmony_ci	{0x1002, 0x73DD, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},
196662306a36Sopenharmony_ci	{0x1002, 0x73DE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},
196762306a36Sopenharmony_ci	{0x1002, 0x73DF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},
196862306a36Sopenharmony_ci
196962306a36Sopenharmony_ci	/* DIMGREY_CAVEFISH */
197062306a36Sopenharmony_ci	{0x1002, 0x73E0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
197162306a36Sopenharmony_ci	{0x1002, 0x73E1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
197262306a36Sopenharmony_ci	{0x1002, 0x73E2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
197362306a36Sopenharmony_ci	{0x1002, 0x73E3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
197462306a36Sopenharmony_ci	{0x1002, 0x73E8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
197562306a36Sopenharmony_ci	{0x1002, 0x73E9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
197662306a36Sopenharmony_ci	{0x1002, 0x73EA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
197762306a36Sopenharmony_ci	{0x1002, 0x73EB, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
197862306a36Sopenharmony_ci	{0x1002, 0x73EC, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
197962306a36Sopenharmony_ci	{0x1002, 0x73ED, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
198062306a36Sopenharmony_ci	{0x1002, 0x73EF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
198162306a36Sopenharmony_ci	{0x1002, 0x73FF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
198262306a36Sopenharmony_ci
198362306a36Sopenharmony_ci	/* Aldebaran */
198462306a36Sopenharmony_ci	{0x1002, 0x7408, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ALDEBARAN},
198562306a36Sopenharmony_ci	{0x1002, 0x740C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ALDEBARAN},
198662306a36Sopenharmony_ci	{0x1002, 0x740F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ALDEBARAN},
198762306a36Sopenharmony_ci	{0x1002, 0x7410, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ALDEBARAN},
198862306a36Sopenharmony_ci
198962306a36Sopenharmony_ci	/* CYAN_SKILLFISH */
199062306a36Sopenharmony_ci	{0x1002, 0x13FE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYAN_SKILLFISH|AMD_IS_APU},
199162306a36Sopenharmony_ci	{0x1002, 0x143F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYAN_SKILLFISH|AMD_IS_APU},
199262306a36Sopenharmony_ci
199362306a36Sopenharmony_ci	/* BEIGE_GOBY */
199462306a36Sopenharmony_ci	{0x1002, 0x7420, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BEIGE_GOBY},
199562306a36Sopenharmony_ci	{0x1002, 0x7421, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BEIGE_GOBY},
199662306a36Sopenharmony_ci	{0x1002, 0x7422, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BEIGE_GOBY},
199762306a36Sopenharmony_ci	{0x1002, 0x7423, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BEIGE_GOBY},
199862306a36Sopenharmony_ci	{0x1002, 0x7424, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BEIGE_GOBY},
199962306a36Sopenharmony_ci	{0x1002, 0x743F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BEIGE_GOBY},
200062306a36Sopenharmony_ci
200162306a36Sopenharmony_ci	{ PCI_DEVICE(0x1002, PCI_ANY_ID),
200262306a36Sopenharmony_ci	  .class = PCI_CLASS_DISPLAY_VGA << 8,
200362306a36Sopenharmony_ci	  .class_mask = 0xffffff,
200462306a36Sopenharmony_ci	  .driver_data = CHIP_IP_DISCOVERY },
200562306a36Sopenharmony_ci
200662306a36Sopenharmony_ci	{ PCI_DEVICE(0x1002, PCI_ANY_ID),
200762306a36Sopenharmony_ci	  .class = PCI_CLASS_DISPLAY_OTHER << 8,
200862306a36Sopenharmony_ci	  .class_mask = 0xffffff,
200962306a36Sopenharmony_ci	  .driver_data = CHIP_IP_DISCOVERY },
201062306a36Sopenharmony_ci
201162306a36Sopenharmony_ci	{ PCI_DEVICE(0x1002, PCI_ANY_ID),
201262306a36Sopenharmony_ci	  .class = PCI_CLASS_ACCELERATOR_PROCESSING << 8,
201362306a36Sopenharmony_ci	  .class_mask = 0xffffff,
201462306a36Sopenharmony_ci	  .driver_data = CHIP_IP_DISCOVERY },
201562306a36Sopenharmony_ci
201662306a36Sopenharmony_ci	{0, 0, 0}
201762306a36Sopenharmony_ci};
201862306a36Sopenharmony_ci
201962306a36Sopenharmony_ciMODULE_DEVICE_TABLE(pci, pciidlist);
202062306a36Sopenharmony_ci
202162306a36Sopenharmony_cistatic const struct drm_driver amdgpu_kms_driver;
202262306a36Sopenharmony_ci
202362306a36Sopenharmony_cistatic void amdgpu_get_secondary_funcs(struct amdgpu_device *adev)
202462306a36Sopenharmony_ci{
202562306a36Sopenharmony_ci	struct pci_dev *p = NULL;
202662306a36Sopenharmony_ci	int i;
202762306a36Sopenharmony_ci
202862306a36Sopenharmony_ci	/* 0 - GPU
202962306a36Sopenharmony_ci	 * 1 - audio
203062306a36Sopenharmony_ci	 * 2 - USB
203162306a36Sopenharmony_ci	 * 3 - UCSI
203262306a36Sopenharmony_ci	 */
203362306a36Sopenharmony_ci	for (i = 1; i < 4; i++) {
203462306a36Sopenharmony_ci		p = pci_get_domain_bus_and_slot(pci_domain_nr(adev->pdev->bus),
203562306a36Sopenharmony_ci						adev->pdev->bus->number, i);
203662306a36Sopenharmony_ci		if (p) {
203762306a36Sopenharmony_ci			pm_runtime_get_sync(&p->dev);
203862306a36Sopenharmony_ci			pm_runtime_mark_last_busy(&p->dev);
203962306a36Sopenharmony_ci			pm_runtime_put_autosuspend(&p->dev);
204062306a36Sopenharmony_ci			pci_dev_put(p);
204162306a36Sopenharmony_ci		}
204262306a36Sopenharmony_ci	}
204362306a36Sopenharmony_ci}
204462306a36Sopenharmony_ci
204562306a36Sopenharmony_cistatic int amdgpu_pci_probe(struct pci_dev *pdev,
204662306a36Sopenharmony_ci			    const struct pci_device_id *ent)
204762306a36Sopenharmony_ci{
204862306a36Sopenharmony_ci	struct drm_device *ddev;
204962306a36Sopenharmony_ci	struct amdgpu_device *adev;
205062306a36Sopenharmony_ci	unsigned long flags = ent->driver_data;
205162306a36Sopenharmony_ci	int ret, retry = 0, i;
205262306a36Sopenharmony_ci	bool supports_atomic = false;
205362306a36Sopenharmony_ci
205462306a36Sopenharmony_ci	/* skip devices which are owned by radeon */
205562306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(amdgpu_unsupported_pciidlist); i++) {
205662306a36Sopenharmony_ci		if (amdgpu_unsupported_pciidlist[i] == pdev->device)
205762306a36Sopenharmony_ci			return -ENODEV;
205862306a36Sopenharmony_ci	}
205962306a36Sopenharmony_ci
206062306a36Sopenharmony_ci	if (amdgpu_aspm == -1 && !pcie_aspm_enabled(pdev))
206162306a36Sopenharmony_ci		amdgpu_aspm = 0;
206262306a36Sopenharmony_ci
206362306a36Sopenharmony_ci	if (amdgpu_virtual_display ||
206462306a36Sopenharmony_ci	    amdgpu_device_asic_has_dc_support(flags & AMD_ASIC_MASK))
206562306a36Sopenharmony_ci		supports_atomic = true;
206662306a36Sopenharmony_ci
206762306a36Sopenharmony_ci	if ((flags & AMD_EXP_HW_SUPPORT) && !amdgpu_exp_hw_support) {
206862306a36Sopenharmony_ci		DRM_INFO("This hardware requires experimental hardware support.\n"
206962306a36Sopenharmony_ci			 "See modparam exp_hw_support\n");
207062306a36Sopenharmony_ci		return -ENODEV;
207162306a36Sopenharmony_ci	}
207262306a36Sopenharmony_ci	/* differentiate between P10 and P11 asics with the same DID */
207362306a36Sopenharmony_ci	if (pdev->device == 0x67FF &&
207462306a36Sopenharmony_ci	    (pdev->revision == 0xE3 ||
207562306a36Sopenharmony_ci	     pdev->revision == 0xE7 ||
207662306a36Sopenharmony_ci	     pdev->revision == 0xF3 ||
207762306a36Sopenharmony_ci	     pdev->revision == 0xF7)) {
207862306a36Sopenharmony_ci		flags &= ~AMD_ASIC_MASK;
207962306a36Sopenharmony_ci		flags |= CHIP_POLARIS10;
208062306a36Sopenharmony_ci	}
208162306a36Sopenharmony_ci
208262306a36Sopenharmony_ci	/* Due to hardware bugs, S/G Display on raven requires a 1:1 IOMMU mapping,
208362306a36Sopenharmony_ci	 * however, SME requires an indirect IOMMU mapping because the encryption
208462306a36Sopenharmony_ci	 * bit is beyond the DMA mask of the chip.
208562306a36Sopenharmony_ci	 */
208662306a36Sopenharmony_ci	if (cc_platform_has(CC_ATTR_MEM_ENCRYPT) &&
208762306a36Sopenharmony_ci	    ((flags & AMD_ASIC_MASK) == CHIP_RAVEN)) {
208862306a36Sopenharmony_ci		dev_info(&pdev->dev,
208962306a36Sopenharmony_ci			 "SME is not compatible with RAVEN\n");
209062306a36Sopenharmony_ci		return -ENOTSUPP;
209162306a36Sopenharmony_ci	}
209262306a36Sopenharmony_ci
209362306a36Sopenharmony_ci#ifdef CONFIG_DRM_AMDGPU_SI
209462306a36Sopenharmony_ci	if (!amdgpu_si_support) {
209562306a36Sopenharmony_ci		switch (flags & AMD_ASIC_MASK) {
209662306a36Sopenharmony_ci		case CHIP_TAHITI:
209762306a36Sopenharmony_ci		case CHIP_PITCAIRN:
209862306a36Sopenharmony_ci		case CHIP_VERDE:
209962306a36Sopenharmony_ci		case CHIP_OLAND:
210062306a36Sopenharmony_ci		case CHIP_HAINAN:
210162306a36Sopenharmony_ci			dev_info(&pdev->dev,
210262306a36Sopenharmony_ci				 "SI support provided by radeon.\n");
210362306a36Sopenharmony_ci			dev_info(&pdev->dev,
210462306a36Sopenharmony_ci				 "Use radeon.si_support=0 amdgpu.si_support=1 to override.\n"
210562306a36Sopenharmony_ci				);
210662306a36Sopenharmony_ci			return -ENODEV;
210762306a36Sopenharmony_ci		}
210862306a36Sopenharmony_ci	}
210962306a36Sopenharmony_ci#endif
211062306a36Sopenharmony_ci#ifdef CONFIG_DRM_AMDGPU_CIK
211162306a36Sopenharmony_ci	if (!amdgpu_cik_support) {
211262306a36Sopenharmony_ci		switch (flags & AMD_ASIC_MASK) {
211362306a36Sopenharmony_ci		case CHIP_KAVERI:
211462306a36Sopenharmony_ci		case CHIP_BONAIRE:
211562306a36Sopenharmony_ci		case CHIP_HAWAII:
211662306a36Sopenharmony_ci		case CHIP_KABINI:
211762306a36Sopenharmony_ci		case CHIP_MULLINS:
211862306a36Sopenharmony_ci			dev_info(&pdev->dev,
211962306a36Sopenharmony_ci				 "CIK support provided by radeon.\n");
212062306a36Sopenharmony_ci			dev_info(&pdev->dev,
212162306a36Sopenharmony_ci				 "Use radeon.cik_support=0 amdgpu.cik_support=1 to override.\n"
212262306a36Sopenharmony_ci				);
212362306a36Sopenharmony_ci			return -ENODEV;
212462306a36Sopenharmony_ci		}
212562306a36Sopenharmony_ci	}
212662306a36Sopenharmony_ci#endif
212762306a36Sopenharmony_ci
212862306a36Sopenharmony_ci	adev = devm_drm_dev_alloc(&pdev->dev, &amdgpu_kms_driver, typeof(*adev), ddev);
212962306a36Sopenharmony_ci	if (IS_ERR(adev))
213062306a36Sopenharmony_ci		return PTR_ERR(adev);
213162306a36Sopenharmony_ci
213262306a36Sopenharmony_ci	adev->dev  = &pdev->dev;
213362306a36Sopenharmony_ci	adev->pdev = pdev;
213462306a36Sopenharmony_ci	ddev = adev_to_drm(adev);
213562306a36Sopenharmony_ci
213662306a36Sopenharmony_ci	if (!supports_atomic)
213762306a36Sopenharmony_ci		ddev->driver_features &= ~DRIVER_ATOMIC;
213862306a36Sopenharmony_ci
213962306a36Sopenharmony_ci	ret = pci_enable_device(pdev);
214062306a36Sopenharmony_ci	if (ret)
214162306a36Sopenharmony_ci		return ret;
214262306a36Sopenharmony_ci
214362306a36Sopenharmony_ci	pci_set_drvdata(pdev, ddev);
214462306a36Sopenharmony_ci
214562306a36Sopenharmony_ci	ret = amdgpu_driver_load_kms(adev, flags);
214662306a36Sopenharmony_ci	if (ret)
214762306a36Sopenharmony_ci		goto err_pci;
214862306a36Sopenharmony_ci
214962306a36Sopenharmony_ciretry_init:
215062306a36Sopenharmony_ci	ret = drm_dev_register(ddev, flags);
215162306a36Sopenharmony_ci	if (ret == -EAGAIN && ++retry <= 3) {
215262306a36Sopenharmony_ci		DRM_INFO("retry init %d\n", retry);
215362306a36Sopenharmony_ci		/* Don't request EX mode too frequently which is attacking */
215462306a36Sopenharmony_ci		msleep(5000);
215562306a36Sopenharmony_ci		goto retry_init;
215662306a36Sopenharmony_ci	} else if (ret) {
215762306a36Sopenharmony_ci		goto err_pci;
215862306a36Sopenharmony_ci	}
215962306a36Sopenharmony_ci
216062306a36Sopenharmony_ci	ret = amdgpu_xcp_dev_register(adev, ent);
216162306a36Sopenharmony_ci	if (ret)
216262306a36Sopenharmony_ci		goto err_pci;
216362306a36Sopenharmony_ci
216462306a36Sopenharmony_ci	/*
216562306a36Sopenharmony_ci	 * 1. don't init fbdev on hw without DCE
216662306a36Sopenharmony_ci	 * 2. don't init fbdev if there are no connectors
216762306a36Sopenharmony_ci	 */
216862306a36Sopenharmony_ci	if (adev->mode_info.mode_config_initialized &&
216962306a36Sopenharmony_ci	    !list_empty(&adev_to_drm(adev)->mode_config.connector_list)) {
217062306a36Sopenharmony_ci		/* select 8 bpp console on low vram cards */
217162306a36Sopenharmony_ci		if (adev->gmc.real_vram_size <= (32*1024*1024))
217262306a36Sopenharmony_ci			drm_fbdev_generic_setup(adev_to_drm(adev), 8);
217362306a36Sopenharmony_ci		else
217462306a36Sopenharmony_ci			drm_fbdev_generic_setup(adev_to_drm(adev), 32);
217562306a36Sopenharmony_ci	}
217662306a36Sopenharmony_ci
217762306a36Sopenharmony_ci	ret = amdgpu_debugfs_init(adev);
217862306a36Sopenharmony_ci	if (ret)
217962306a36Sopenharmony_ci		DRM_ERROR("Creating debugfs files failed (%d).\n", ret);
218062306a36Sopenharmony_ci
218162306a36Sopenharmony_ci	if (adev->pm.rpm_mode != AMDGPU_RUNPM_NONE) {
218262306a36Sopenharmony_ci		/* only need to skip on ATPX */
218362306a36Sopenharmony_ci		if (amdgpu_device_supports_px(ddev))
218462306a36Sopenharmony_ci			dev_pm_set_driver_flags(ddev->dev, DPM_FLAG_NO_DIRECT_COMPLETE);
218562306a36Sopenharmony_ci		/* we want direct complete for BOCO */
218662306a36Sopenharmony_ci		if (amdgpu_device_supports_boco(ddev))
218762306a36Sopenharmony_ci			dev_pm_set_driver_flags(ddev->dev, DPM_FLAG_SMART_PREPARE |
218862306a36Sopenharmony_ci						DPM_FLAG_SMART_SUSPEND |
218962306a36Sopenharmony_ci						DPM_FLAG_MAY_SKIP_RESUME);
219062306a36Sopenharmony_ci		pm_runtime_use_autosuspend(ddev->dev);
219162306a36Sopenharmony_ci		pm_runtime_set_autosuspend_delay(ddev->dev, 5000);
219262306a36Sopenharmony_ci
219362306a36Sopenharmony_ci		pm_runtime_allow(ddev->dev);
219462306a36Sopenharmony_ci
219562306a36Sopenharmony_ci		pm_runtime_mark_last_busy(ddev->dev);
219662306a36Sopenharmony_ci		pm_runtime_put_autosuspend(ddev->dev);
219762306a36Sopenharmony_ci
219862306a36Sopenharmony_ci		pci_wake_from_d3(pdev, TRUE);
219962306a36Sopenharmony_ci
220062306a36Sopenharmony_ci		/*
220162306a36Sopenharmony_ci		 * For runpm implemented via BACO, PMFW will handle the
220262306a36Sopenharmony_ci		 * timing for BACO in and out:
220362306a36Sopenharmony_ci		 *   - put ASIC into BACO state only when both video and
220462306a36Sopenharmony_ci		 *     audio functions are in D3 state.
220562306a36Sopenharmony_ci		 *   - pull ASIC out of BACO state when either video or
220662306a36Sopenharmony_ci		 *     audio function is in D0 state.
220762306a36Sopenharmony_ci		 * Also, at startup, PMFW assumes both functions are in
220862306a36Sopenharmony_ci		 * D0 state.
220962306a36Sopenharmony_ci		 *
221062306a36Sopenharmony_ci		 * So if snd driver was loaded prior to amdgpu driver
221162306a36Sopenharmony_ci		 * and audio function was put into D3 state, there will
221262306a36Sopenharmony_ci		 * be no PMFW-aware D-state transition(D0->D3) on runpm
221362306a36Sopenharmony_ci		 * suspend. Thus the BACO will be not correctly kicked in.
221462306a36Sopenharmony_ci		 *
221562306a36Sopenharmony_ci		 * Via amdgpu_get_secondary_funcs(), the audio dev is put
221662306a36Sopenharmony_ci		 * into D0 state. Then there will be a PMFW-aware D-state
221762306a36Sopenharmony_ci		 * transition(D0->D3) on runpm suspend.
221862306a36Sopenharmony_ci		 */
221962306a36Sopenharmony_ci		if (amdgpu_device_supports_baco(ddev) &&
222062306a36Sopenharmony_ci		    !(adev->flags & AMD_IS_APU) &&
222162306a36Sopenharmony_ci		    (adev->asic_type >= CHIP_NAVI10))
222262306a36Sopenharmony_ci			amdgpu_get_secondary_funcs(adev);
222362306a36Sopenharmony_ci	}
222462306a36Sopenharmony_ci
222562306a36Sopenharmony_ci	return 0;
222662306a36Sopenharmony_ci
222762306a36Sopenharmony_cierr_pci:
222862306a36Sopenharmony_ci	pci_disable_device(pdev);
222962306a36Sopenharmony_ci	return ret;
223062306a36Sopenharmony_ci}
223162306a36Sopenharmony_ci
223262306a36Sopenharmony_cistatic void
223362306a36Sopenharmony_ciamdgpu_pci_remove(struct pci_dev *pdev)
223462306a36Sopenharmony_ci{
223562306a36Sopenharmony_ci	struct drm_device *dev = pci_get_drvdata(pdev);
223662306a36Sopenharmony_ci	struct amdgpu_device *adev = drm_to_adev(dev);
223762306a36Sopenharmony_ci
223862306a36Sopenharmony_ci	amdgpu_xcp_dev_unplug(adev);
223962306a36Sopenharmony_ci	drm_dev_unplug(dev);
224062306a36Sopenharmony_ci
224162306a36Sopenharmony_ci	if (adev->pm.rpm_mode != AMDGPU_RUNPM_NONE) {
224262306a36Sopenharmony_ci		pm_runtime_get_sync(dev->dev);
224362306a36Sopenharmony_ci		pm_runtime_forbid(dev->dev);
224462306a36Sopenharmony_ci	}
224562306a36Sopenharmony_ci
224662306a36Sopenharmony_ci	if (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(13, 0, 2) &&
224762306a36Sopenharmony_ci	    !amdgpu_sriov_vf(adev)) {
224862306a36Sopenharmony_ci		bool need_to_reset_gpu = false;
224962306a36Sopenharmony_ci
225062306a36Sopenharmony_ci		if (adev->gmc.xgmi.num_physical_nodes > 1) {
225162306a36Sopenharmony_ci			struct amdgpu_hive_info *hive;
225262306a36Sopenharmony_ci
225362306a36Sopenharmony_ci			hive = amdgpu_get_xgmi_hive(adev);
225462306a36Sopenharmony_ci			if (hive->device_remove_count == 0)
225562306a36Sopenharmony_ci				need_to_reset_gpu = true;
225662306a36Sopenharmony_ci			hive->device_remove_count++;
225762306a36Sopenharmony_ci			amdgpu_put_xgmi_hive(hive);
225862306a36Sopenharmony_ci		} else {
225962306a36Sopenharmony_ci			need_to_reset_gpu = true;
226062306a36Sopenharmony_ci		}
226162306a36Sopenharmony_ci
226262306a36Sopenharmony_ci		/* Workaround for ASICs need to reset SMU.
226362306a36Sopenharmony_ci		 * Called only when the first device is removed.
226462306a36Sopenharmony_ci		 */
226562306a36Sopenharmony_ci		if (need_to_reset_gpu) {
226662306a36Sopenharmony_ci			struct amdgpu_reset_context reset_context;
226762306a36Sopenharmony_ci
226862306a36Sopenharmony_ci			adev->shutdown = true;
226962306a36Sopenharmony_ci			memset(&reset_context, 0, sizeof(reset_context));
227062306a36Sopenharmony_ci			reset_context.method = AMD_RESET_METHOD_NONE;
227162306a36Sopenharmony_ci			reset_context.reset_req_dev = adev;
227262306a36Sopenharmony_ci			set_bit(AMDGPU_NEED_FULL_RESET, &reset_context.flags);
227362306a36Sopenharmony_ci			set_bit(AMDGPU_RESET_FOR_DEVICE_REMOVE, &reset_context.flags);
227462306a36Sopenharmony_ci			amdgpu_device_gpu_recover(adev, NULL, &reset_context);
227562306a36Sopenharmony_ci		}
227662306a36Sopenharmony_ci	}
227762306a36Sopenharmony_ci
227862306a36Sopenharmony_ci	amdgpu_driver_unload_kms(dev);
227962306a36Sopenharmony_ci
228062306a36Sopenharmony_ci	/*
228162306a36Sopenharmony_ci	 * Flush any in flight DMA operations from device.
228262306a36Sopenharmony_ci	 * Clear the Bus Master Enable bit and then wait on the PCIe Device
228362306a36Sopenharmony_ci	 * StatusTransactions Pending bit.
228462306a36Sopenharmony_ci	 */
228562306a36Sopenharmony_ci	pci_disable_device(pdev);
228662306a36Sopenharmony_ci	pci_wait_for_pending_transaction(pdev);
228762306a36Sopenharmony_ci}
228862306a36Sopenharmony_ci
228962306a36Sopenharmony_cistatic void
229062306a36Sopenharmony_ciamdgpu_pci_shutdown(struct pci_dev *pdev)
229162306a36Sopenharmony_ci{
229262306a36Sopenharmony_ci	struct drm_device *dev = pci_get_drvdata(pdev);
229362306a36Sopenharmony_ci	struct amdgpu_device *adev = drm_to_adev(dev);
229462306a36Sopenharmony_ci
229562306a36Sopenharmony_ci	if (amdgpu_ras_intr_triggered())
229662306a36Sopenharmony_ci		return;
229762306a36Sopenharmony_ci
229862306a36Sopenharmony_ci	/* if we are running in a VM, make sure the device
229962306a36Sopenharmony_ci	 * torn down properly on reboot/shutdown.
230062306a36Sopenharmony_ci	 * unfortunately we can't detect certain
230162306a36Sopenharmony_ci	 * hypervisors so just do this all the time.
230262306a36Sopenharmony_ci	 */
230362306a36Sopenharmony_ci	if (!amdgpu_passthrough(adev))
230462306a36Sopenharmony_ci		adev->mp1_state = PP_MP1_STATE_UNLOAD;
230562306a36Sopenharmony_ci	amdgpu_device_ip_suspend(adev);
230662306a36Sopenharmony_ci	adev->mp1_state = PP_MP1_STATE_NONE;
230762306a36Sopenharmony_ci}
230862306a36Sopenharmony_ci
230962306a36Sopenharmony_ci/**
231062306a36Sopenharmony_ci * amdgpu_drv_delayed_reset_work_handler - work handler for reset
231162306a36Sopenharmony_ci *
231262306a36Sopenharmony_ci * @work: work_struct.
231362306a36Sopenharmony_ci */
231462306a36Sopenharmony_cistatic void amdgpu_drv_delayed_reset_work_handler(struct work_struct *work)
231562306a36Sopenharmony_ci{
231662306a36Sopenharmony_ci	struct list_head device_list;
231762306a36Sopenharmony_ci	struct amdgpu_device *adev;
231862306a36Sopenharmony_ci	int i, r;
231962306a36Sopenharmony_ci	struct amdgpu_reset_context reset_context;
232062306a36Sopenharmony_ci
232162306a36Sopenharmony_ci	memset(&reset_context, 0, sizeof(reset_context));
232262306a36Sopenharmony_ci
232362306a36Sopenharmony_ci	mutex_lock(&mgpu_info.mutex);
232462306a36Sopenharmony_ci	if (mgpu_info.pending_reset == true) {
232562306a36Sopenharmony_ci		mutex_unlock(&mgpu_info.mutex);
232662306a36Sopenharmony_ci		return;
232762306a36Sopenharmony_ci	}
232862306a36Sopenharmony_ci	mgpu_info.pending_reset = true;
232962306a36Sopenharmony_ci	mutex_unlock(&mgpu_info.mutex);
233062306a36Sopenharmony_ci
233162306a36Sopenharmony_ci	/* Use a common context, just need to make sure full reset is done */
233262306a36Sopenharmony_ci	reset_context.method = AMD_RESET_METHOD_NONE;
233362306a36Sopenharmony_ci	set_bit(AMDGPU_NEED_FULL_RESET, &reset_context.flags);
233462306a36Sopenharmony_ci
233562306a36Sopenharmony_ci	for (i = 0; i < mgpu_info.num_dgpu; i++) {
233662306a36Sopenharmony_ci		adev = mgpu_info.gpu_ins[i].adev;
233762306a36Sopenharmony_ci		reset_context.reset_req_dev = adev;
233862306a36Sopenharmony_ci		r = amdgpu_device_pre_asic_reset(adev, &reset_context);
233962306a36Sopenharmony_ci		if (r) {
234062306a36Sopenharmony_ci			dev_err(adev->dev, "GPU pre asic reset failed with err, %d for drm dev, %s ",
234162306a36Sopenharmony_ci				r, adev_to_drm(adev)->unique);
234262306a36Sopenharmony_ci		}
234362306a36Sopenharmony_ci		if (!queue_work(system_unbound_wq, &adev->xgmi_reset_work))
234462306a36Sopenharmony_ci			r = -EALREADY;
234562306a36Sopenharmony_ci	}
234662306a36Sopenharmony_ci	for (i = 0; i < mgpu_info.num_dgpu; i++) {
234762306a36Sopenharmony_ci		adev = mgpu_info.gpu_ins[i].adev;
234862306a36Sopenharmony_ci		flush_work(&adev->xgmi_reset_work);
234962306a36Sopenharmony_ci		adev->gmc.xgmi.pending_reset = false;
235062306a36Sopenharmony_ci	}
235162306a36Sopenharmony_ci
235262306a36Sopenharmony_ci	/* reset function will rebuild the xgmi hive info , clear it now */
235362306a36Sopenharmony_ci	for (i = 0; i < mgpu_info.num_dgpu; i++)
235462306a36Sopenharmony_ci		amdgpu_xgmi_remove_device(mgpu_info.gpu_ins[i].adev);
235562306a36Sopenharmony_ci
235662306a36Sopenharmony_ci	INIT_LIST_HEAD(&device_list);
235762306a36Sopenharmony_ci
235862306a36Sopenharmony_ci	for (i = 0; i < mgpu_info.num_dgpu; i++)
235962306a36Sopenharmony_ci		list_add_tail(&mgpu_info.gpu_ins[i].adev->reset_list, &device_list);
236062306a36Sopenharmony_ci
236162306a36Sopenharmony_ci	/* unregister the GPU first, reset function will add them back */
236262306a36Sopenharmony_ci	list_for_each_entry(adev, &device_list, reset_list)
236362306a36Sopenharmony_ci		amdgpu_unregister_gpu_instance(adev);
236462306a36Sopenharmony_ci
236562306a36Sopenharmony_ci	/* Use a common context, just need to make sure full reset is done */
236662306a36Sopenharmony_ci	set_bit(AMDGPU_SKIP_HW_RESET, &reset_context.flags);
236762306a36Sopenharmony_ci	r = amdgpu_do_asic_reset(&device_list, &reset_context);
236862306a36Sopenharmony_ci
236962306a36Sopenharmony_ci	if (r) {
237062306a36Sopenharmony_ci		DRM_ERROR("reinit gpus failure");
237162306a36Sopenharmony_ci		return;
237262306a36Sopenharmony_ci	}
237362306a36Sopenharmony_ci	for (i = 0; i < mgpu_info.num_dgpu; i++) {
237462306a36Sopenharmony_ci		adev = mgpu_info.gpu_ins[i].adev;
237562306a36Sopenharmony_ci		if (!adev->kfd.init_complete)
237662306a36Sopenharmony_ci			amdgpu_amdkfd_device_init(adev);
237762306a36Sopenharmony_ci		amdgpu_ttm_set_buffer_funcs_status(adev, true);
237862306a36Sopenharmony_ci	}
237962306a36Sopenharmony_ci}
238062306a36Sopenharmony_ci
238162306a36Sopenharmony_cistatic int amdgpu_pmops_prepare(struct device *dev)
238262306a36Sopenharmony_ci{
238362306a36Sopenharmony_ci	struct drm_device *drm_dev = dev_get_drvdata(dev);
238462306a36Sopenharmony_ci	struct amdgpu_device *adev = drm_to_adev(drm_dev);
238562306a36Sopenharmony_ci
238662306a36Sopenharmony_ci	/* Return a positive number here so
238762306a36Sopenharmony_ci	 * DPM_FLAG_SMART_SUSPEND works properly
238862306a36Sopenharmony_ci	 */
238962306a36Sopenharmony_ci	if (amdgpu_device_supports_boco(drm_dev))
239062306a36Sopenharmony_ci		return pm_runtime_suspended(dev);
239162306a36Sopenharmony_ci
239262306a36Sopenharmony_ci	/* if we will not support s3 or s2i for the device
239362306a36Sopenharmony_ci	 *  then skip suspend
239462306a36Sopenharmony_ci	 */
239562306a36Sopenharmony_ci	if (!amdgpu_acpi_is_s0ix_active(adev) &&
239662306a36Sopenharmony_ci	    !amdgpu_acpi_is_s3_active(adev))
239762306a36Sopenharmony_ci		return 1;
239862306a36Sopenharmony_ci
239962306a36Sopenharmony_ci	return 0;
240062306a36Sopenharmony_ci}
240162306a36Sopenharmony_ci
240262306a36Sopenharmony_cistatic void amdgpu_pmops_complete(struct device *dev)
240362306a36Sopenharmony_ci{
240462306a36Sopenharmony_ci	/* nothing to do */
240562306a36Sopenharmony_ci}
240662306a36Sopenharmony_ci
240762306a36Sopenharmony_cistatic int amdgpu_pmops_suspend(struct device *dev)
240862306a36Sopenharmony_ci{
240962306a36Sopenharmony_ci	struct drm_device *drm_dev = dev_get_drvdata(dev);
241062306a36Sopenharmony_ci	struct amdgpu_device *adev = drm_to_adev(drm_dev);
241162306a36Sopenharmony_ci
241262306a36Sopenharmony_ci	adev->suspend_complete = false;
241362306a36Sopenharmony_ci	if (amdgpu_acpi_is_s0ix_active(adev))
241462306a36Sopenharmony_ci		adev->in_s0ix = true;
241562306a36Sopenharmony_ci	else if (amdgpu_acpi_is_s3_active(adev))
241662306a36Sopenharmony_ci		adev->in_s3 = true;
241762306a36Sopenharmony_ci	if (!adev->in_s0ix && !adev->in_s3)
241862306a36Sopenharmony_ci		return 0;
241962306a36Sopenharmony_ci	return amdgpu_device_suspend(drm_dev, true);
242062306a36Sopenharmony_ci}
242162306a36Sopenharmony_ci
242262306a36Sopenharmony_cistatic int amdgpu_pmops_suspend_noirq(struct device *dev)
242362306a36Sopenharmony_ci{
242462306a36Sopenharmony_ci	struct drm_device *drm_dev = dev_get_drvdata(dev);
242562306a36Sopenharmony_ci	struct amdgpu_device *adev = drm_to_adev(drm_dev);
242662306a36Sopenharmony_ci
242762306a36Sopenharmony_ci	adev->suspend_complete = true;
242862306a36Sopenharmony_ci	if (amdgpu_acpi_should_gpu_reset(adev))
242962306a36Sopenharmony_ci		return amdgpu_asic_reset(adev);
243062306a36Sopenharmony_ci
243162306a36Sopenharmony_ci	return 0;
243262306a36Sopenharmony_ci}
243362306a36Sopenharmony_ci
243462306a36Sopenharmony_cistatic int amdgpu_pmops_resume(struct device *dev)
243562306a36Sopenharmony_ci{
243662306a36Sopenharmony_ci	struct drm_device *drm_dev = dev_get_drvdata(dev);
243762306a36Sopenharmony_ci	struct amdgpu_device *adev = drm_to_adev(drm_dev);
243862306a36Sopenharmony_ci	int r;
243962306a36Sopenharmony_ci
244062306a36Sopenharmony_ci	if (!adev->in_s0ix && !adev->in_s3)
244162306a36Sopenharmony_ci		return 0;
244262306a36Sopenharmony_ci
244362306a36Sopenharmony_ci	/* Avoids registers access if device is physically gone */
244462306a36Sopenharmony_ci	if (!pci_device_is_present(adev->pdev))
244562306a36Sopenharmony_ci		adev->no_hw_access = true;
244662306a36Sopenharmony_ci
244762306a36Sopenharmony_ci	r = amdgpu_device_resume(drm_dev, true);
244862306a36Sopenharmony_ci	if (amdgpu_acpi_is_s0ix_active(adev))
244962306a36Sopenharmony_ci		adev->in_s0ix = false;
245062306a36Sopenharmony_ci	else
245162306a36Sopenharmony_ci		adev->in_s3 = false;
245262306a36Sopenharmony_ci	return r;
245362306a36Sopenharmony_ci}
245462306a36Sopenharmony_ci
245562306a36Sopenharmony_cistatic int amdgpu_pmops_freeze(struct device *dev)
245662306a36Sopenharmony_ci{
245762306a36Sopenharmony_ci	struct drm_device *drm_dev = dev_get_drvdata(dev);
245862306a36Sopenharmony_ci	struct amdgpu_device *adev = drm_to_adev(drm_dev);
245962306a36Sopenharmony_ci	int r;
246062306a36Sopenharmony_ci
246162306a36Sopenharmony_ci	adev->in_s4 = true;
246262306a36Sopenharmony_ci	r = amdgpu_device_suspend(drm_dev, true);
246362306a36Sopenharmony_ci	adev->in_s4 = false;
246462306a36Sopenharmony_ci	if (r)
246562306a36Sopenharmony_ci		return r;
246662306a36Sopenharmony_ci
246762306a36Sopenharmony_ci	if (amdgpu_acpi_should_gpu_reset(adev))
246862306a36Sopenharmony_ci		return amdgpu_asic_reset(adev);
246962306a36Sopenharmony_ci	return 0;
247062306a36Sopenharmony_ci}
247162306a36Sopenharmony_ci
247262306a36Sopenharmony_cistatic int amdgpu_pmops_thaw(struct device *dev)
247362306a36Sopenharmony_ci{
247462306a36Sopenharmony_ci	struct drm_device *drm_dev = dev_get_drvdata(dev);
247562306a36Sopenharmony_ci
247662306a36Sopenharmony_ci	return amdgpu_device_resume(drm_dev, true);
247762306a36Sopenharmony_ci}
247862306a36Sopenharmony_ci
247962306a36Sopenharmony_cistatic int amdgpu_pmops_poweroff(struct device *dev)
248062306a36Sopenharmony_ci{
248162306a36Sopenharmony_ci	struct drm_device *drm_dev = dev_get_drvdata(dev);
248262306a36Sopenharmony_ci
248362306a36Sopenharmony_ci	return amdgpu_device_suspend(drm_dev, true);
248462306a36Sopenharmony_ci}
248562306a36Sopenharmony_ci
248662306a36Sopenharmony_cistatic int amdgpu_pmops_restore(struct device *dev)
248762306a36Sopenharmony_ci{
248862306a36Sopenharmony_ci	struct drm_device *drm_dev = dev_get_drvdata(dev);
248962306a36Sopenharmony_ci
249062306a36Sopenharmony_ci	return amdgpu_device_resume(drm_dev, true);
249162306a36Sopenharmony_ci}
249262306a36Sopenharmony_ci
249362306a36Sopenharmony_cistatic int amdgpu_runtime_idle_check_display(struct device *dev)
249462306a36Sopenharmony_ci{
249562306a36Sopenharmony_ci	struct pci_dev *pdev = to_pci_dev(dev);
249662306a36Sopenharmony_ci	struct drm_device *drm_dev = pci_get_drvdata(pdev);
249762306a36Sopenharmony_ci	struct amdgpu_device *adev = drm_to_adev(drm_dev);
249862306a36Sopenharmony_ci
249962306a36Sopenharmony_ci	if (adev->mode_info.num_crtc) {
250062306a36Sopenharmony_ci		struct drm_connector *list_connector;
250162306a36Sopenharmony_ci		struct drm_connector_list_iter iter;
250262306a36Sopenharmony_ci		int ret = 0;
250362306a36Sopenharmony_ci
250462306a36Sopenharmony_ci		if (amdgpu_runtime_pm != -2) {
250562306a36Sopenharmony_ci			/* XXX: Return busy if any displays are connected to avoid
250662306a36Sopenharmony_ci			 * possible display wakeups after runtime resume due to
250762306a36Sopenharmony_ci			 * hotplug events in case any displays were connected while
250862306a36Sopenharmony_ci			 * the GPU was in suspend.  Remove this once that is fixed.
250962306a36Sopenharmony_ci			 */
251062306a36Sopenharmony_ci			mutex_lock(&drm_dev->mode_config.mutex);
251162306a36Sopenharmony_ci			drm_connector_list_iter_begin(drm_dev, &iter);
251262306a36Sopenharmony_ci			drm_for_each_connector_iter(list_connector, &iter) {
251362306a36Sopenharmony_ci				if (list_connector->status == connector_status_connected) {
251462306a36Sopenharmony_ci					ret = -EBUSY;
251562306a36Sopenharmony_ci					break;
251662306a36Sopenharmony_ci				}
251762306a36Sopenharmony_ci			}
251862306a36Sopenharmony_ci			drm_connector_list_iter_end(&iter);
251962306a36Sopenharmony_ci			mutex_unlock(&drm_dev->mode_config.mutex);
252062306a36Sopenharmony_ci
252162306a36Sopenharmony_ci			if (ret)
252262306a36Sopenharmony_ci				return ret;
252362306a36Sopenharmony_ci		}
252462306a36Sopenharmony_ci
252562306a36Sopenharmony_ci		if (adev->dc_enabled) {
252662306a36Sopenharmony_ci			struct drm_crtc *crtc;
252762306a36Sopenharmony_ci
252862306a36Sopenharmony_ci			drm_for_each_crtc(crtc, drm_dev) {
252962306a36Sopenharmony_ci				drm_modeset_lock(&crtc->mutex, NULL);
253062306a36Sopenharmony_ci				if (crtc->state->active)
253162306a36Sopenharmony_ci					ret = -EBUSY;
253262306a36Sopenharmony_ci				drm_modeset_unlock(&crtc->mutex);
253362306a36Sopenharmony_ci				if (ret < 0)
253462306a36Sopenharmony_ci					break;
253562306a36Sopenharmony_ci			}
253662306a36Sopenharmony_ci		} else {
253762306a36Sopenharmony_ci			mutex_lock(&drm_dev->mode_config.mutex);
253862306a36Sopenharmony_ci			drm_modeset_lock(&drm_dev->mode_config.connection_mutex, NULL);
253962306a36Sopenharmony_ci
254062306a36Sopenharmony_ci			drm_connector_list_iter_begin(drm_dev, &iter);
254162306a36Sopenharmony_ci			drm_for_each_connector_iter(list_connector, &iter) {
254262306a36Sopenharmony_ci				if (list_connector->dpms ==  DRM_MODE_DPMS_ON) {
254362306a36Sopenharmony_ci					ret = -EBUSY;
254462306a36Sopenharmony_ci					break;
254562306a36Sopenharmony_ci				}
254662306a36Sopenharmony_ci			}
254762306a36Sopenharmony_ci
254862306a36Sopenharmony_ci			drm_connector_list_iter_end(&iter);
254962306a36Sopenharmony_ci
255062306a36Sopenharmony_ci			drm_modeset_unlock(&drm_dev->mode_config.connection_mutex);
255162306a36Sopenharmony_ci			mutex_unlock(&drm_dev->mode_config.mutex);
255262306a36Sopenharmony_ci		}
255362306a36Sopenharmony_ci		if (ret)
255462306a36Sopenharmony_ci			return ret;
255562306a36Sopenharmony_ci	}
255662306a36Sopenharmony_ci
255762306a36Sopenharmony_ci	return 0;
255862306a36Sopenharmony_ci}
255962306a36Sopenharmony_ci
256062306a36Sopenharmony_cistatic int amdgpu_pmops_runtime_suspend(struct device *dev)
256162306a36Sopenharmony_ci{
256262306a36Sopenharmony_ci	struct pci_dev *pdev = to_pci_dev(dev);
256362306a36Sopenharmony_ci	struct drm_device *drm_dev = pci_get_drvdata(pdev);
256462306a36Sopenharmony_ci	struct amdgpu_device *adev = drm_to_adev(drm_dev);
256562306a36Sopenharmony_ci	int ret, i;
256662306a36Sopenharmony_ci
256762306a36Sopenharmony_ci	if (adev->pm.rpm_mode == AMDGPU_RUNPM_NONE) {
256862306a36Sopenharmony_ci		pm_runtime_forbid(dev);
256962306a36Sopenharmony_ci		return -EBUSY;
257062306a36Sopenharmony_ci	}
257162306a36Sopenharmony_ci
257262306a36Sopenharmony_ci	ret = amdgpu_runtime_idle_check_display(dev);
257362306a36Sopenharmony_ci	if (ret)
257462306a36Sopenharmony_ci		return ret;
257562306a36Sopenharmony_ci
257662306a36Sopenharmony_ci	/* wait for all rings to drain before suspending */
257762306a36Sopenharmony_ci	for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
257862306a36Sopenharmony_ci		struct amdgpu_ring *ring = adev->rings[i];
257962306a36Sopenharmony_ci
258062306a36Sopenharmony_ci		if (ring && ring->sched.ready) {
258162306a36Sopenharmony_ci			ret = amdgpu_fence_wait_empty(ring);
258262306a36Sopenharmony_ci			if (ret)
258362306a36Sopenharmony_ci				return -EBUSY;
258462306a36Sopenharmony_ci		}
258562306a36Sopenharmony_ci	}
258662306a36Sopenharmony_ci
258762306a36Sopenharmony_ci	adev->in_runpm = true;
258862306a36Sopenharmony_ci	if (amdgpu_device_supports_px(drm_dev))
258962306a36Sopenharmony_ci		drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
259062306a36Sopenharmony_ci
259162306a36Sopenharmony_ci	/*
259262306a36Sopenharmony_ci	 * By setting mp1_state as PP_MP1_STATE_UNLOAD, MP1 will do some
259362306a36Sopenharmony_ci	 * proper cleanups and put itself into a state ready for PNP. That
259462306a36Sopenharmony_ci	 * can address some random resuming failure observed on BOCO capable
259562306a36Sopenharmony_ci	 * platforms.
259662306a36Sopenharmony_ci	 * TODO: this may be also needed for PX capable platform.
259762306a36Sopenharmony_ci	 */
259862306a36Sopenharmony_ci	if (amdgpu_device_supports_boco(drm_dev))
259962306a36Sopenharmony_ci		adev->mp1_state = PP_MP1_STATE_UNLOAD;
260062306a36Sopenharmony_ci
260162306a36Sopenharmony_ci	ret = amdgpu_device_suspend(drm_dev, false);
260262306a36Sopenharmony_ci	if (ret) {
260362306a36Sopenharmony_ci		adev->in_runpm = false;
260462306a36Sopenharmony_ci		if (amdgpu_device_supports_boco(drm_dev))
260562306a36Sopenharmony_ci			adev->mp1_state = PP_MP1_STATE_NONE;
260662306a36Sopenharmony_ci		return ret;
260762306a36Sopenharmony_ci	}
260862306a36Sopenharmony_ci
260962306a36Sopenharmony_ci	if (amdgpu_device_supports_boco(drm_dev))
261062306a36Sopenharmony_ci		adev->mp1_state = PP_MP1_STATE_NONE;
261162306a36Sopenharmony_ci
261262306a36Sopenharmony_ci	if (amdgpu_device_supports_px(drm_dev)) {
261362306a36Sopenharmony_ci		/* Only need to handle PCI state in the driver for ATPX
261462306a36Sopenharmony_ci		 * PCI core handles it for _PR3.
261562306a36Sopenharmony_ci		 */
261662306a36Sopenharmony_ci		amdgpu_device_cache_pci_state(pdev);
261762306a36Sopenharmony_ci		pci_disable_device(pdev);
261862306a36Sopenharmony_ci		pci_ignore_hotplug(pdev);
261962306a36Sopenharmony_ci		pci_set_power_state(pdev, PCI_D3cold);
262062306a36Sopenharmony_ci		drm_dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF;
262162306a36Sopenharmony_ci	} else if (amdgpu_device_supports_boco(drm_dev)) {
262262306a36Sopenharmony_ci		/* nothing to do */
262362306a36Sopenharmony_ci	} else if (amdgpu_device_supports_baco(drm_dev)) {
262462306a36Sopenharmony_ci		amdgpu_device_baco_enter(drm_dev);
262562306a36Sopenharmony_ci	}
262662306a36Sopenharmony_ci
262762306a36Sopenharmony_ci	dev_dbg(&pdev->dev, "asic/device is runtime suspended\n");
262862306a36Sopenharmony_ci
262962306a36Sopenharmony_ci	return 0;
263062306a36Sopenharmony_ci}
263162306a36Sopenharmony_ci
263262306a36Sopenharmony_cistatic int amdgpu_pmops_runtime_resume(struct device *dev)
263362306a36Sopenharmony_ci{
263462306a36Sopenharmony_ci	struct pci_dev *pdev = to_pci_dev(dev);
263562306a36Sopenharmony_ci	struct drm_device *drm_dev = pci_get_drvdata(pdev);
263662306a36Sopenharmony_ci	struct amdgpu_device *adev = drm_to_adev(drm_dev);
263762306a36Sopenharmony_ci	int ret;
263862306a36Sopenharmony_ci
263962306a36Sopenharmony_ci	if (adev->pm.rpm_mode == AMDGPU_RUNPM_NONE)
264062306a36Sopenharmony_ci		return -EINVAL;
264162306a36Sopenharmony_ci
264262306a36Sopenharmony_ci	/* Avoids registers access if device is physically gone */
264362306a36Sopenharmony_ci	if (!pci_device_is_present(adev->pdev))
264462306a36Sopenharmony_ci		adev->no_hw_access = true;
264562306a36Sopenharmony_ci
264662306a36Sopenharmony_ci	if (amdgpu_device_supports_px(drm_dev)) {
264762306a36Sopenharmony_ci		drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
264862306a36Sopenharmony_ci
264962306a36Sopenharmony_ci		/* Only need to handle PCI state in the driver for ATPX
265062306a36Sopenharmony_ci		 * PCI core handles it for _PR3.
265162306a36Sopenharmony_ci		 */
265262306a36Sopenharmony_ci		pci_set_power_state(pdev, PCI_D0);
265362306a36Sopenharmony_ci		amdgpu_device_load_pci_state(pdev);
265462306a36Sopenharmony_ci		ret = pci_enable_device(pdev);
265562306a36Sopenharmony_ci		if (ret)
265662306a36Sopenharmony_ci			return ret;
265762306a36Sopenharmony_ci		pci_set_master(pdev);
265862306a36Sopenharmony_ci	} else if (amdgpu_device_supports_boco(drm_dev)) {
265962306a36Sopenharmony_ci		/* Only need to handle PCI state in the driver for ATPX
266062306a36Sopenharmony_ci		 * PCI core handles it for _PR3.
266162306a36Sopenharmony_ci		 */
266262306a36Sopenharmony_ci		pci_set_master(pdev);
266362306a36Sopenharmony_ci	} else if (amdgpu_device_supports_baco(drm_dev)) {
266462306a36Sopenharmony_ci		amdgpu_device_baco_exit(drm_dev);
266562306a36Sopenharmony_ci	}
266662306a36Sopenharmony_ci	ret = amdgpu_device_resume(drm_dev, false);
266762306a36Sopenharmony_ci	if (ret) {
266862306a36Sopenharmony_ci		if (amdgpu_device_supports_px(drm_dev))
266962306a36Sopenharmony_ci			pci_disable_device(pdev);
267062306a36Sopenharmony_ci		return ret;
267162306a36Sopenharmony_ci	}
267262306a36Sopenharmony_ci
267362306a36Sopenharmony_ci	if (amdgpu_device_supports_px(drm_dev))
267462306a36Sopenharmony_ci		drm_dev->switch_power_state = DRM_SWITCH_POWER_ON;
267562306a36Sopenharmony_ci	adev->in_runpm = false;
267662306a36Sopenharmony_ci	return 0;
267762306a36Sopenharmony_ci}
267862306a36Sopenharmony_ci
267962306a36Sopenharmony_cistatic int amdgpu_pmops_runtime_idle(struct device *dev)
268062306a36Sopenharmony_ci{
268162306a36Sopenharmony_ci	struct drm_device *drm_dev = dev_get_drvdata(dev);
268262306a36Sopenharmony_ci	struct amdgpu_device *adev = drm_to_adev(drm_dev);
268362306a36Sopenharmony_ci	/* we don't want the main rpm_idle to call suspend - we want to autosuspend */
268462306a36Sopenharmony_ci	int ret = 1;
268562306a36Sopenharmony_ci
268662306a36Sopenharmony_ci	if (adev->pm.rpm_mode == AMDGPU_RUNPM_NONE) {
268762306a36Sopenharmony_ci		pm_runtime_forbid(dev);
268862306a36Sopenharmony_ci		return -EBUSY;
268962306a36Sopenharmony_ci	}
269062306a36Sopenharmony_ci
269162306a36Sopenharmony_ci	ret = amdgpu_runtime_idle_check_display(dev);
269262306a36Sopenharmony_ci
269362306a36Sopenharmony_ci	pm_runtime_mark_last_busy(dev);
269462306a36Sopenharmony_ci	pm_runtime_autosuspend(dev);
269562306a36Sopenharmony_ci	return ret;
269662306a36Sopenharmony_ci}
269762306a36Sopenharmony_ci
269862306a36Sopenharmony_cilong amdgpu_drm_ioctl(struct file *filp,
269962306a36Sopenharmony_ci		      unsigned int cmd, unsigned long arg)
270062306a36Sopenharmony_ci{
270162306a36Sopenharmony_ci	struct drm_file *file_priv = filp->private_data;
270262306a36Sopenharmony_ci	struct drm_device *dev;
270362306a36Sopenharmony_ci	long ret;
270462306a36Sopenharmony_ci
270562306a36Sopenharmony_ci	dev = file_priv->minor->dev;
270662306a36Sopenharmony_ci	ret = pm_runtime_get_sync(dev->dev);
270762306a36Sopenharmony_ci	if (ret < 0)
270862306a36Sopenharmony_ci		goto out;
270962306a36Sopenharmony_ci
271062306a36Sopenharmony_ci	ret = drm_ioctl(filp, cmd, arg);
271162306a36Sopenharmony_ci
271262306a36Sopenharmony_ci	pm_runtime_mark_last_busy(dev->dev);
271362306a36Sopenharmony_ciout:
271462306a36Sopenharmony_ci	pm_runtime_put_autosuspend(dev->dev);
271562306a36Sopenharmony_ci	return ret;
271662306a36Sopenharmony_ci}
271762306a36Sopenharmony_ci
271862306a36Sopenharmony_cistatic const struct dev_pm_ops amdgpu_pm_ops = {
271962306a36Sopenharmony_ci	.prepare = amdgpu_pmops_prepare,
272062306a36Sopenharmony_ci	.complete = amdgpu_pmops_complete,
272162306a36Sopenharmony_ci	.suspend = amdgpu_pmops_suspend,
272262306a36Sopenharmony_ci	.suspend_noirq = amdgpu_pmops_suspend_noirq,
272362306a36Sopenharmony_ci	.resume = amdgpu_pmops_resume,
272462306a36Sopenharmony_ci	.freeze = amdgpu_pmops_freeze,
272562306a36Sopenharmony_ci	.thaw = amdgpu_pmops_thaw,
272662306a36Sopenharmony_ci	.poweroff = amdgpu_pmops_poweroff,
272762306a36Sopenharmony_ci	.restore = amdgpu_pmops_restore,
272862306a36Sopenharmony_ci	.runtime_suspend = amdgpu_pmops_runtime_suspend,
272962306a36Sopenharmony_ci	.runtime_resume = amdgpu_pmops_runtime_resume,
273062306a36Sopenharmony_ci	.runtime_idle = amdgpu_pmops_runtime_idle,
273162306a36Sopenharmony_ci};
273262306a36Sopenharmony_ci
273362306a36Sopenharmony_cistatic int amdgpu_flush(struct file *f, fl_owner_t id)
273462306a36Sopenharmony_ci{
273562306a36Sopenharmony_ci	struct drm_file *file_priv = f->private_data;
273662306a36Sopenharmony_ci	struct amdgpu_fpriv *fpriv = file_priv->driver_priv;
273762306a36Sopenharmony_ci	long timeout = MAX_WAIT_SCHED_ENTITY_Q_EMPTY;
273862306a36Sopenharmony_ci
273962306a36Sopenharmony_ci	timeout = amdgpu_ctx_mgr_entity_flush(&fpriv->ctx_mgr, timeout);
274062306a36Sopenharmony_ci	timeout = amdgpu_vm_wait_idle(&fpriv->vm, timeout);
274162306a36Sopenharmony_ci
274262306a36Sopenharmony_ci	return timeout >= 0 ? 0 : timeout;
274362306a36Sopenharmony_ci}
274462306a36Sopenharmony_ci
274562306a36Sopenharmony_cistatic const struct file_operations amdgpu_driver_kms_fops = {
274662306a36Sopenharmony_ci	.owner = THIS_MODULE,
274762306a36Sopenharmony_ci	.open = drm_open,
274862306a36Sopenharmony_ci	.flush = amdgpu_flush,
274962306a36Sopenharmony_ci	.release = drm_release,
275062306a36Sopenharmony_ci	.unlocked_ioctl = amdgpu_drm_ioctl,
275162306a36Sopenharmony_ci	.mmap = drm_gem_mmap,
275262306a36Sopenharmony_ci	.poll = drm_poll,
275362306a36Sopenharmony_ci	.read = drm_read,
275462306a36Sopenharmony_ci#ifdef CONFIG_COMPAT
275562306a36Sopenharmony_ci	.compat_ioctl = amdgpu_kms_compat_ioctl,
275662306a36Sopenharmony_ci#endif
275762306a36Sopenharmony_ci#ifdef CONFIG_PROC_FS
275862306a36Sopenharmony_ci	.show_fdinfo = drm_show_fdinfo,
275962306a36Sopenharmony_ci#endif
276062306a36Sopenharmony_ci};
276162306a36Sopenharmony_ci
276262306a36Sopenharmony_ciint amdgpu_file_to_fpriv(struct file *filp, struct amdgpu_fpriv **fpriv)
276362306a36Sopenharmony_ci{
276462306a36Sopenharmony_ci	struct drm_file *file;
276562306a36Sopenharmony_ci
276662306a36Sopenharmony_ci	if (!filp)
276762306a36Sopenharmony_ci		return -EINVAL;
276862306a36Sopenharmony_ci
276962306a36Sopenharmony_ci	if (filp->f_op != &amdgpu_driver_kms_fops)
277062306a36Sopenharmony_ci		return -EINVAL;
277162306a36Sopenharmony_ci
277262306a36Sopenharmony_ci	file = filp->private_data;
277362306a36Sopenharmony_ci	*fpriv = file->driver_priv;
277462306a36Sopenharmony_ci	return 0;
277562306a36Sopenharmony_ci}
277662306a36Sopenharmony_ci
277762306a36Sopenharmony_ciconst struct drm_ioctl_desc amdgpu_ioctls_kms[] = {
277862306a36Sopenharmony_ci	DRM_IOCTL_DEF_DRV(AMDGPU_GEM_CREATE, amdgpu_gem_create_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
277962306a36Sopenharmony_ci	DRM_IOCTL_DEF_DRV(AMDGPU_CTX, amdgpu_ctx_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
278062306a36Sopenharmony_ci	DRM_IOCTL_DEF_DRV(AMDGPU_VM, amdgpu_vm_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
278162306a36Sopenharmony_ci	DRM_IOCTL_DEF_DRV(AMDGPU_SCHED, amdgpu_sched_ioctl, DRM_MASTER),
278262306a36Sopenharmony_ci	DRM_IOCTL_DEF_DRV(AMDGPU_BO_LIST, amdgpu_bo_list_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
278362306a36Sopenharmony_ci	DRM_IOCTL_DEF_DRV(AMDGPU_FENCE_TO_HANDLE, amdgpu_cs_fence_to_handle_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
278462306a36Sopenharmony_ci	/* KMS */
278562306a36Sopenharmony_ci	DRM_IOCTL_DEF_DRV(AMDGPU_GEM_MMAP, amdgpu_gem_mmap_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
278662306a36Sopenharmony_ci	DRM_IOCTL_DEF_DRV(AMDGPU_GEM_WAIT_IDLE, amdgpu_gem_wait_idle_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
278762306a36Sopenharmony_ci	DRM_IOCTL_DEF_DRV(AMDGPU_CS, amdgpu_cs_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
278862306a36Sopenharmony_ci	DRM_IOCTL_DEF_DRV(AMDGPU_INFO, amdgpu_info_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
278962306a36Sopenharmony_ci	DRM_IOCTL_DEF_DRV(AMDGPU_WAIT_CS, amdgpu_cs_wait_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
279062306a36Sopenharmony_ci	DRM_IOCTL_DEF_DRV(AMDGPU_WAIT_FENCES, amdgpu_cs_wait_fences_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
279162306a36Sopenharmony_ci	DRM_IOCTL_DEF_DRV(AMDGPU_GEM_METADATA, amdgpu_gem_metadata_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
279262306a36Sopenharmony_ci	DRM_IOCTL_DEF_DRV(AMDGPU_GEM_VA, amdgpu_gem_va_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
279362306a36Sopenharmony_ci	DRM_IOCTL_DEF_DRV(AMDGPU_GEM_OP, amdgpu_gem_op_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
279462306a36Sopenharmony_ci	DRM_IOCTL_DEF_DRV(AMDGPU_GEM_USERPTR, amdgpu_gem_userptr_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
279562306a36Sopenharmony_ci};
279662306a36Sopenharmony_ci
279762306a36Sopenharmony_cistatic const struct drm_driver amdgpu_kms_driver = {
279862306a36Sopenharmony_ci	.driver_features =
279962306a36Sopenharmony_ci	    DRIVER_ATOMIC |
280062306a36Sopenharmony_ci	    DRIVER_GEM |
280162306a36Sopenharmony_ci	    DRIVER_RENDER | DRIVER_MODESET | DRIVER_SYNCOBJ |
280262306a36Sopenharmony_ci	    DRIVER_SYNCOBJ_TIMELINE,
280362306a36Sopenharmony_ci	.open = amdgpu_driver_open_kms,
280462306a36Sopenharmony_ci	.postclose = amdgpu_driver_postclose_kms,
280562306a36Sopenharmony_ci	.lastclose = amdgpu_driver_lastclose_kms,
280662306a36Sopenharmony_ci	.ioctls = amdgpu_ioctls_kms,
280762306a36Sopenharmony_ci	.num_ioctls = ARRAY_SIZE(amdgpu_ioctls_kms),
280862306a36Sopenharmony_ci	.dumb_create = amdgpu_mode_dumb_create,
280962306a36Sopenharmony_ci	.dumb_map_offset = amdgpu_mode_dumb_mmap,
281062306a36Sopenharmony_ci	.fops = &amdgpu_driver_kms_fops,
281162306a36Sopenharmony_ci	.release = &amdgpu_driver_release_kms,
281262306a36Sopenharmony_ci#ifdef CONFIG_PROC_FS
281362306a36Sopenharmony_ci	.show_fdinfo = amdgpu_show_fdinfo,
281462306a36Sopenharmony_ci#endif
281562306a36Sopenharmony_ci
281662306a36Sopenharmony_ci	.gem_prime_import = amdgpu_gem_prime_import,
281762306a36Sopenharmony_ci
281862306a36Sopenharmony_ci	.name = DRIVER_NAME,
281962306a36Sopenharmony_ci	.desc = DRIVER_DESC,
282062306a36Sopenharmony_ci	.date = DRIVER_DATE,
282162306a36Sopenharmony_ci	.major = KMS_DRIVER_MAJOR,
282262306a36Sopenharmony_ci	.minor = KMS_DRIVER_MINOR,
282362306a36Sopenharmony_ci	.patchlevel = KMS_DRIVER_PATCHLEVEL,
282462306a36Sopenharmony_ci};
282562306a36Sopenharmony_ci
282662306a36Sopenharmony_ciconst struct drm_driver amdgpu_partition_driver = {
282762306a36Sopenharmony_ci	.driver_features =
282862306a36Sopenharmony_ci	    DRIVER_GEM | DRIVER_RENDER | DRIVER_SYNCOBJ |
282962306a36Sopenharmony_ci	    DRIVER_SYNCOBJ_TIMELINE,
283062306a36Sopenharmony_ci	.open = amdgpu_driver_open_kms,
283162306a36Sopenharmony_ci	.postclose = amdgpu_driver_postclose_kms,
283262306a36Sopenharmony_ci	.lastclose = amdgpu_driver_lastclose_kms,
283362306a36Sopenharmony_ci	.ioctls = amdgpu_ioctls_kms,
283462306a36Sopenharmony_ci	.num_ioctls = ARRAY_SIZE(amdgpu_ioctls_kms),
283562306a36Sopenharmony_ci	.dumb_create = amdgpu_mode_dumb_create,
283662306a36Sopenharmony_ci	.dumb_map_offset = amdgpu_mode_dumb_mmap,
283762306a36Sopenharmony_ci	.fops = &amdgpu_driver_kms_fops,
283862306a36Sopenharmony_ci	.release = &amdgpu_driver_release_kms,
283962306a36Sopenharmony_ci
284062306a36Sopenharmony_ci	.gem_prime_import = amdgpu_gem_prime_import,
284162306a36Sopenharmony_ci
284262306a36Sopenharmony_ci	.name = DRIVER_NAME,
284362306a36Sopenharmony_ci	.desc = DRIVER_DESC,
284462306a36Sopenharmony_ci	.date = DRIVER_DATE,
284562306a36Sopenharmony_ci	.major = KMS_DRIVER_MAJOR,
284662306a36Sopenharmony_ci	.minor = KMS_DRIVER_MINOR,
284762306a36Sopenharmony_ci	.patchlevel = KMS_DRIVER_PATCHLEVEL,
284862306a36Sopenharmony_ci};
284962306a36Sopenharmony_ci
285062306a36Sopenharmony_cistatic struct pci_error_handlers amdgpu_pci_err_handler = {
285162306a36Sopenharmony_ci	.error_detected	= amdgpu_pci_error_detected,
285262306a36Sopenharmony_ci	.mmio_enabled	= amdgpu_pci_mmio_enabled,
285362306a36Sopenharmony_ci	.slot_reset	= amdgpu_pci_slot_reset,
285462306a36Sopenharmony_ci	.resume		= amdgpu_pci_resume,
285562306a36Sopenharmony_ci};
285662306a36Sopenharmony_ci
285762306a36Sopenharmony_cistatic const struct attribute_group *amdgpu_sysfs_groups[] = {
285862306a36Sopenharmony_ci	&amdgpu_vram_mgr_attr_group,
285962306a36Sopenharmony_ci	&amdgpu_gtt_mgr_attr_group,
286062306a36Sopenharmony_ci	&amdgpu_flash_attr_group,
286162306a36Sopenharmony_ci	NULL,
286262306a36Sopenharmony_ci};
286362306a36Sopenharmony_ci
286462306a36Sopenharmony_cistatic struct pci_driver amdgpu_kms_pci_driver = {
286562306a36Sopenharmony_ci	.name = DRIVER_NAME,
286662306a36Sopenharmony_ci	.id_table = pciidlist,
286762306a36Sopenharmony_ci	.probe = amdgpu_pci_probe,
286862306a36Sopenharmony_ci	.remove = amdgpu_pci_remove,
286962306a36Sopenharmony_ci	.shutdown = amdgpu_pci_shutdown,
287062306a36Sopenharmony_ci	.driver.pm = &amdgpu_pm_ops,
287162306a36Sopenharmony_ci	.err_handler = &amdgpu_pci_err_handler,
287262306a36Sopenharmony_ci	.dev_groups = amdgpu_sysfs_groups,
287362306a36Sopenharmony_ci};
287462306a36Sopenharmony_ci
287562306a36Sopenharmony_cistatic int __init amdgpu_init(void)
287662306a36Sopenharmony_ci{
287762306a36Sopenharmony_ci	int r;
287862306a36Sopenharmony_ci
287962306a36Sopenharmony_ci	if (drm_firmware_drivers_only())
288062306a36Sopenharmony_ci		return -EINVAL;
288162306a36Sopenharmony_ci
288262306a36Sopenharmony_ci	r = amdgpu_sync_init();
288362306a36Sopenharmony_ci	if (r)
288462306a36Sopenharmony_ci		goto error_sync;
288562306a36Sopenharmony_ci
288662306a36Sopenharmony_ci	r = amdgpu_fence_slab_init();
288762306a36Sopenharmony_ci	if (r)
288862306a36Sopenharmony_ci		goto error_fence;
288962306a36Sopenharmony_ci
289062306a36Sopenharmony_ci	DRM_INFO("amdgpu kernel modesetting enabled.\n");
289162306a36Sopenharmony_ci	amdgpu_register_atpx_handler();
289262306a36Sopenharmony_ci	amdgpu_acpi_detect();
289362306a36Sopenharmony_ci
289462306a36Sopenharmony_ci	/* Ignore KFD init failures. Normal when CONFIG_HSA_AMD is not set. */
289562306a36Sopenharmony_ci	amdgpu_amdkfd_init();
289662306a36Sopenharmony_ci
289762306a36Sopenharmony_ci	/* let modprobe override vga console setting */
289862306a36Sopenharmony_ci	return pci_register_driver(&amdgpu_kms_pci_driver);
289962306a36Sopenharmony_ci
290062306a36Sopenharmony_cierror_fence:
290162306a36Sopenharmony_ci	amdgpu_sync_fini();
290262306a36Sopenharmony_ci
290362306a36Sopenharmony_cierror_sync:
290462306a36Sopenharmony_ci	return r;
290562306a36Sopenharmony_ci}
290662306a36Sopenharmony_ci
290762306a36Sopenharmony_cistatic void __exit amdgpu_exit(void)
290862306a36Sopenharmony_ci{
290962306a36Sopenharmony_ci	amdgpu_amdkfd_fini();
291062306a36Sopenharmony_ci	pci_unregister_driver(&amdgpu_kms_pci_driver);
291162306a36Sopenharmony_ci	amdgpu_unregister_atpx_handler();
291262306a36Sopenharmony_ci	amdgpu_acpi_release();
291362306a36Sopenharmony_ci	amdgpu_sync_fini();
291462306a36Sopenharmony_ci	amdgpu_fence_slab_fini();
291562306a36Sopenharmony_ci	mmu_notifier_synchronize();
291662306a36Sopenharmony_ci	amdgpu_xcp_drv_release();
291762306a36Sopenharmony_ci}
291862306a36Sopenharmony_ci
291962306a36Sopenharmony_cimodule_init(amdgpu_init);
292062306a36Sopenharmony_cimodule_exit(amdgpu_exit);
292162306a36Sopenharmony_ci
292262306a36Sopenharmony_ciMODULE_AUTHOR(DRIVER_AUTHOR);
292362306a36Sopenharmony_ciMODULE_DESCRIPTION(DRIVER_DESC);
292462306a36Sopenharmony_ciMODULE_LICENSE("GPL and additional rights");
2925