drm merge window fixes part 1
cgroup: - fix Koncfig fallout from new dmem controller Driver Changes: - v3d NULL pointer regression fix in fence signalling race - virtio: uaf in dma_buf free path - xlnx: fix kerneldoc - bochs: fix double-free on driver removal - zynqmp: add missing locking to DP bridge driver - amdgpu fixes all over: documentation, display, sriov, various hw block drivers - amdgpu: use drm/sched helper - amdgpu: mark some debug module options as unsafe - amdkfd: mark some debug module options as unsafe, trap handler updates, fix partial migration handling DRM core: - client: fix fbdev Kconfig select rules, improve tiled-based display support -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEciDa6W7nX7VwIxa1EpWk/0GBDXwFAmeXhyMACgkQEpWk/0GB DXwdqA/+Nd/V0WeZingyt4MxhwF068xG9RJLl6EkcdvdJI08MPh0FbqLjGbMiBsa o8dcmQWsxecAFxODwV5CtLtQ0/igHalTav0n28lJ9hr1QxQWLdeDX4x0RN6JwX2l xp7GT6e+L5wgc0TSBh6zh7mt4Q0nRIY89GCk1nUI2vY12LUep/upG413HfTvAw56 62qS2i6UZt1IMv8Syv0RiIm5jLJvdpVuDG43nlpK/z6PpzRVtaPOWCI120kTRPKc Xp/dUohf6cqIipQBaSEPQ5f45GlMPWbY7PCoX/mKXSTpbNsXnscbH9BELQIVkR3g APh/GHyG2qq7dmhdEs8oxpOwkPJv9LLRlyh9p4M4kDdZxr0VI+6cbgb75Tm6n/Xe rRCMuY13APeXMg2WQfi/uQjauCzdC/4fhP77h6PhjXkgb8g7VTYPncExlI+QEJGX 8Ey+nZPvp5LmohXtfmFNvwoDy8O2C0JfymvLN94HxOCe6i3aDPQm1pnlrYnxbp8N hgFV8dnn0w2qoEO0CFVqr3k8q/r4S1wR4GXNA8wGKI5rUJSn8vSzQshvs5i9KD2h 1T3fqq+i/JiBHNB+MxuSBMggHb0zY9CQ2zjbWo+dz8Rx3jAff2whilWGmZltA5/u fesjOgMO/fpTzcc4kdwFQDiD0YMlGLWtoakvoYp4FFSKlqd4N94= =sfwb -----END PGP SIGNATURE----- Merge tag 'drm-next-2025-01-27' of https://gitlab.freedesktop.org/drm/kernel Pull drm fixes from Simona Vetter: "cgroup: - fix Koncfig fallout from new dmem controller Driver Changes: - v3d NULL pointer regression fix in fence signalling race - virtio: uaf in dma_buf free path - xlnx: fix kerneldoc - bochs: fix double-free on driver removal - zynqmp: add missing locking to DP bridge driver - amdgpu fixes all over: - documentation, display, sriov, various hw block drivers - use drm/sched helper - mark some debug module options as unsafe - amdkfd: mark some debug module options as unsafe, trap handler updates, fix partial migration handling DRM core: - fix fbdev Kconfig select rules, improve tiled-based display support" * tag 'drm-next-2025-01-27' of https://gitlab.freedesktop.org/drm/kernel: (40 commits) drm/amd/display: Optimize cursor position updates drm/amd/display: Add hubp cache reset when powergating drm/amd/amdgpu: Enable scratch data dump for mes 12 drm/amd: Clarify kdoc for amdgpu.gttsize drm/amd/amdgpu: Prevent null pointer dereference in GPU bandwidth calculation drm/amd/display: Fix error pointers in amdgpu_dm_crtc_mem_type_changed drm/amdgpu: fix ring timeout issue in gfx10 sr-iov environment drm/amd/pm: Fix smu v13.0.6 caps initialization drm/amd/pm: Refactor SMU 13.0.6 SDMA reset firmware version checks revert "drm/amdgpu/pm: add definition PPSMC_MSG_ResetSDMA2" revert "drm/amdgpu/pm: Implement SDMA queue reset for different asic" drm/amd/pm: Add capability flags for SMU v13.0.6 drm/amd/display: fix SUBVP DC_DEBUG_MASK documentation drm/amd/display: fix CEC DC_DEBUG_MASK documentation drm/amdgpu: fix the PCIe lanes reporting in the INFO IOCTL drm/amdgpu: cache gpu pcie link width drm/amd/display: mark static functions noinline_for_stack drm/amdkfd: Clear MODE.VSKIP in gfx9 trap handler drm/amdgpu: Refine ip detection log message drm/amdgpu: Add handler for SDMA context empty ...
This commit is contained in:
commit
7d6e5b5258
47 changed files with 1737 additions and 1388 deletions
|
@ -144,6 +144,4 @@ Internals
|
|||
|
||||
.. kernel-doc:: drivers/gpu/drm/xlnx/zynqmp_dp.c
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/xlnx/zynqmp_dpsub.c
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/xlnx/zynqmp_kms.c
|
||||
|
|
|
@ -294,6 +294,7 @@ config DRM_TTM_HELPER
|
|||
tristate
|
||||
depends on DRM
|
||||
select DRM_TTM
|
||||
select DRM_KMS_HELPER if DRM_FBDEV_EMULATION
|
||||
select FB_CORE if DRM_FBDEV_EMULATION
|
||||
select FB_SYSMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION
|
||||
help
|
||||
|
@ -302,6 +303,7 @@ config DRM_TTM_HELPER
|
|||
config DRM_GEM_DMA_HELPER
|
||||
tristate
|
||||
depends on DRM
|
||||
select DRM_KMS_HELPER if DRM_FBDEV_EMULATION
|
||||
select FB_CORE if DRM_FBDEV_EMULATION
|
||||
select FB_DMAMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION
|
||||
help
|
||||
|
@ -310,6 +312,7 @@ config DRM_GEM_DMA_HELPER
|
|||
config DRM_GEM_SHMEM_HELPER
|
||||
tristate
|
||||
depends on DRM && MMU
|
||||
select DRM_KMS_HELPER if DRM_FBDEV_EMULATION
|
||||
select FB_CORE if DRM_FBDEV_EMULATION
|
||||
select FB_SYSMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION
|
||||
help
|
||||
|
|
|
@ -2365,8 +2365,8 @@ int amdgpu_device_ip_block_add(struct amdgpu_device *adev,
|
|||
break;
|
||||
}
|
||||
|
||||
DRM_INFO("add ip block number %d <%s>\n", adev->num_ip_blocks,
|
||||
ip_block_version->funcs->name);
|
||||
dev_info(adev->dev, "detected ip block number %d <%s>\n",
|
||||
adev->num_ip_blocks, ip_block_version->funcs->name);
|
||||
|
||||
adev->ip_blocks[adev->num_ip_blocks].adev = adev;
|
||||
|
||||
|
@ -6157,6 +6157,44 @@ static void amdgpu_device_partner_bandwidth(struct amdgpu_device *adev,
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_device_gpu_bandwidth - find the bandwidth of the GPU
|
||||
*
|
||||
* @adev: amdgpu_device pointer
|
||||
* @speed: pointer to the speed of the link
|
||||
* @width: pointer to the width of the link
|
||||
*
|
||||
* Evaluate the hierarchy to find the speed and bandwidth capabilities of the
|
||||
* AMD dGPU which may be a virtual upstream bridge.
|
||||
*/
|
||||
static void amdgpu_device_gpu_bandwidth(struct amdgpu_device *adev,
|
||||
enum pci_bus_speed *speed,
|
||||
enum pcie_link_width *width)
|
||||
{
|
||||
struct pci_dev *parent = adev->pdev;
|
||||
|
||||
if (!speed || !width)
|
||||
return;
|
||||
|
||||
parent = pci_upstream_bridge(parent);
|
||||
if (parent && parent->vendor == PCI_VENDOR_ID_ATI) {
|
||||
/* use the upstream/downstream switches internal to dGPU */
|
||||
*speed = pcie_get_speed_cap(parent);
|
||||
*width = pcie_get_width_cap(parent);
|
||||
while ((parent = pci_upstream_bridge(parent))) {
|
||||
if (parent->vendor == PCI_VENDOR_ID_ATI) {
|
||||
/* use the upstream/downstream switches internal to dGPU */
|
||||
*speed = pcie_get_speed_cap(parent);
|
||||
*width = pcie_get_width_cap(parent);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* use the device itself */
|
||||
*speed = pcie_get_speed_cap(adev->pdev);
|
||||
*width = pcie_get_width_cap(adev->pdev);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_device_get_pcie_info - fence pcie info about the PCIE slot
|
||||
*
|
||||
|
@ -6168,9 +6206,8 @@ static void amdgpu_device_partner_bandwidth(struct amdgpu_device *adev,
|
|||
*/
|
||||
static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev)
|
||||
{
|
||||
struct pci_dev *pdev;
|
||||
enum pci_bus_speed speed_cap, platform_speed_cap;
|
||||
enum pcie_link_width platform_link_width;
|
||||
enum pcie_link_width platform_link_width, link_width;
|
||||
|
||||
if (amdgpu_pcie_gen_cap)
|
||||
adev->pm.pcie_gen_mask = amdgpu_pcie_gen_cap;
|
||||
|
@ -6192,11 +6229,10 @@ static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev)
|
|||
|
||||
amdgpu_device_partner_bandwidth(adev, &platform_speed_cap,
|
||||
&platform_link_width);
|
||||
amdgpu_device_gpu_bandwidth(adev, &speed_cap, &link_width);
|
||||
|
||||
if (adev->pm.pcie_gen_mask == 0) {
|
||||
/* asic caps */
|
||||
pdev = adev->pdev;
|
||||
speed_cap = pcie_get_speed_cap(pdev);
|
||||
if (speed_cap == PCI_SPEED_UNKNOWN) {
|
||||
adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
|
||||
CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |
|
||||
|
@ -6252,51 +6288,103 @@ static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev)
|
|||
}
|
||||
}
|
||||
if (adev->pm.pcie_mlw_mask == 0) {
|
||||
/* asic caps */
|
||||
if (link_width == PCIE_LNK_WIDTH_UNKNOWN) {
|
||||
adev->pm.pcie_mlw_mask |= AMDGPU_DEFAULT_ASIC_PCIE_MLW_MASK;
|
||||
} else {
|
||||
switch (link_width) {
|
||||
case PCIE_LNK_X32:
|
||||
adev->pm.pcie_mlw_mask |= (CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X32 |
|
||||
CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X16 |
|
||||
CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X12 |
|
||||
CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X8 |
|
||||
CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
||||
CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
||||
CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X1);
|
||||
break;
|
||||
case PCIE_LNK_X16:
|
||||
adev->pm.pcie_mlw_mask |= (CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X16 |
|
||||
CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X12 |
|
||||
CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X8 |
|
||||
CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
||||
CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
||||
CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X1);
|
||||
break;
|
||||
case PCIE_LNK_X12:
|
||||
adev->pm.pcie_mlw_mask |= (CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X12 |
|
||||
CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X8 |
|
||||
CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
||||
CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
||||
CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X1);
|
||||
break;
|
||||
case PCIE_LNK_X8:
|
||||
adev->pm.pcie_mlw_mask |= (CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X8 |
|
||||
CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
||||
CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
||||
CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X1);
|
||||
break;
|
||||
case PCIE_LNK_X4:
|
||||
adev->pm.pcie_mlw_mask |= (CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
||||
CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
||||
CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X1);
|
||||
break;
|
||||
case PCIE_LNK_X2:
|
||||
adev->pm.pcie_mlw_mask |= (CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
||||
CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X1);
|
||||
break;
|
||||
case PCIE_LNK_X1:
|
||||
adev->pm.pcie_mlw_mask |= CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* platform caps */
|
||||
if (platform_link_width == PCIE_LNK_WIDTH_UNKNOWN) {
|
||||
adev->pm.pcie_mlw_mask |= AMDGPU_DEFAULT_PCIE_MLW_MASK;
|
||||
} else {
|
||||
switch (platform_link_width) {
|
||||
case PCIE_LNK_X32:
|
||||
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
||||
adev->pm.pcie_mlw_mask |= (CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
||||
break;
|
||||
case PCIE_LNK_X16:
|
||||
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
||||
adev->pm.pcie_mlw_mask |= (CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
||||
break;
|
||||
case PCIE_LNK_X12:
|
||||
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
||||
adev->pm.pcie_mlw_mask |= (CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
||||
break;
|
||||
case PCIE_LNK_X8:
|
||||
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
||||
adev->pm.pcie_mlw_mask |= (CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
||||
break;
|
||||
case PCIE_LNK_X4:
|
||||
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
||||
adev->pm.pcie_mlw_mask |= (CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
||||
break;
|
||||
case PCIE_LNK_X2:
|
||||
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
||||
adev->pm.pcie_mlw_mask |= (CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
||||
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
||||
break;
|
||||
case PCIE_LNK_X1:
|
||||
adev->pm.pcie_mlw_mask = CAIL_PCIE_LINK_WIDTH_SUPPORT_X1;
|
||||
adev->pm.pcie_mlw_mask |= CAIL_PCIE_LINK_WIDTH_SUPPORT_X1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
|
@ -280,7 +280,7 @@ module_param_named(gartsize, amdgpu_gart_size, uint, 0600);
|
|||
/**
|
||||
* DOC: gttsize (int)
|
||||
* Restrict the size of GTT domain (for userspace use) in MiB for testing.
|
||||
* The default is -1 (Use 1/2 RAM, minimum value is 3GB).
|
||||
* The default is -1 (Use value specified by TTM).
|
||||
*/
|
||||
MODULE_PARM_DESC(gttsize, "Size of the GTT userspace domain in megabytes (-1 = auto)");
|
||||
module_param_named(gttsize, amdgpu_gtt_size, int, 0600);
|
||||
|
@ -399,7 +399,7 @@ module_param_named(runpm, amdgpu_runtime_pm, int, 0444);
|
|||
* the kernel log for the list of IPs on the asic. The default is 0xffffffff (enable all blocks on a device).
|
||||
*/
|
||||
MODULE_PARM_DESC(ip_block_mask, "IP Block Mask (all blocks enabled (default))");
|
||||
module_param_named(ip_block_mask, amdgpu_ip_block_mask, uint, 0444);
|
||||
module_param_named_unsafe(ip_block_mask, amdgpu_ip_block_mask, uint, 0444);
|
||||
|
||||
/**
|
||||
* DOC: bapm (int)
|
||||
|
@ -457,7 +457,7 @@ module_param_named(vm_update_mode, amdgpu_vm_update_mode, int, 0444);
|
|||
* Enable experimental hw support (1 = enable). The default is 0 (disabled).
|
||||
*/
|
||||
MODULE_PARM_DESC(exp_hw_support, "experimental hw support (1 = enable, 0 = disable (default))");
|
||||
module_param_named(exp_hw_support, amdgpu_exp_hw_support, int, 0444);
|
||||
module_param_named_unsafe(exp_hw_support, amdgpu_exp_hw_support, int, 0444);
|
||||
|
||||
/**
|
||||
* DOC: dc (int)
|
||||
|
@ -568,14 +568,14 @@ module_param_named(compute_multipipe, amdgpu_compute_multipipe, int, 0444);
|
|||
* Set to enable GPU recovery mechanism (1 = enable, 0 = disable). The default is -1 (auto, disabled except SRIOV).
|
||||
*/
|
||||
MODULE_PARM_DESC(gpu_recovery, "Enable GPU recovery mechanism, (1 = enable, 0 = disable, -1 = auto)");
|
||||
module_param_named(gpu_recovery, amdgpu_gpu_recovery, int, 0444);
|
||||
module_param_named_unsafe(gpu_recovery, amdgpu_gpu_recovery, int, 0444);
|
||||
|
||||
/**
|
||||
* DOC: emu_mode (int)
|
||||
* Set value 1 to enable emulation mode. This is only needed when running on an emulator. The default is 0 (disabled).
|
||||
*/
|
||||
MODULE_PARM_DESC(emu_mode, "Emulation mode, (1 = enable, 0 = disable)");
|
||||
module_param_named(emu_mode, amdgpu_emu_mode, int, 0444);
|
||||
module_param_named_unsafe(emu_mode, amdgpu_emu_mode, int, 0444);
|
||||
|
||||
/**
|
||||
* DOC: ras_enable (int)
|
||||
|
@ -730,7 +730,7 @@ module_param_named(noretry, amdgpu_noretry, int, 0644);
|
|||
*/
|
||||
MODULE_PARM_DESC(force_asic_type,
|
||||
"A non negative value used to specify the asic type for all supported GPUs");
|
||||
module_param_named(force_asic_type, amdgpu_force_asic_type, int, 0444);
|
||||
module_param_named_unsafe(force_asic_type, amdgpu_force_asic_type, int, 0444);
|
||||
|
||||
/**
|
||||
* DOC: use_xgmi_p2p (int)
|
||||
|
@ -749,7 +749,7 @@ module_param_named(use_xgmi_p2p, amdgpu_use_xgmi_p2p, int, 0444);
|
|||
* assigns queues to HQDs.
|
||||
*/
|
||||
int sched_policy = KFD_SCHED_POLICY_HWS;
|
||||
module_param(sched_policy, int, 0444);
|
||||
module_param_unsafe(sched_policy, int, 0444);
|
||||
MODULE_PARM_DESC(sched_policy,
|
||||
"Scheduling policy (0 = HWS (Default), 1 = HWS without over-subscription, 2 = Non-HWS (Used for debugging only)");
|
||||
|
||||
|
@ -799,7 +799,7 @@ MODULE_PARM_DESC(send_sigterm,
|
|||
* Setting 1 enables halt on hang.
|
||||
*/
|
||||
int halt_if_hws_hang;
|
||||
module_param(halt_if_hws_hang, int, 0644);
|
||||
module_param_unsafe(halt_if_hws_hang, int, 0644);
|
||||
MODULE_PARM_DESC(halt_if_hws_hang, "Halt if HWS hang is detected (0 = off (default), 1 = on)");
|
||||
|
||||
/**
|
||||
|
@ -808,7 +808,7 @@ MODULE_PARM_DESC(halt_if_hws_hang, "Halt if HWS hang is detected (0 = off (defau
|
|||
* check says. Default value: false (rely on MEC2 firmware version check).
|
||||
*/
|
||||
bool hws_gws_support;
|
||||
module_param(hws_gws_support, bool, 0444);
|
||||
module_param_unsafe(hws_gws_support, bool, 0444);
|
||||
MODULE_PARM_DESC(hws_gws_support, "Assume MEC2 FW supports GWS barriers (false = rely on FW version check (Default), true = force supported)");
|
||||
|
||||
/**
|
||||
|
@ -841,7 +841,7 @@ MODULE_PARM_DESC(no_system_mem_limit, "disable system memory limit (false = defa
|
|||
*/
|
||||
int amdgpu_no_queue_eviction_on_vm_fault;
|
||||
MODULE_PARM_DESC(no_queue_eviction_on_vm_fault, "No queue eviction on VM fault (0 = queue eviction, 1 = no queue eviction)");
|
||||
module_param_named(no_queue_eviction_on_vm_fault, amdgpu_no_queue_eviction_on_vm_fault, int, 0444);
|
||||
module_param_named_unsafe(no_queue_eviction_on_vm_fault, amdgpu_no_queue_eviction_on_vm_fault, int, 0444);
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
@ -849,7 +849,7 @@ module_param_named(no_queue_eviction_on_vm_fault, amdgpu_no_queue_eviction_on_vm
|
|||
*/
|
||||
int amdgpu_mtype_local;
|
||||
MODULE_PARM_DESC(mtype_local, "MTYPE for local memory (0 = MTYPE_RW (default), 1 = MTYPE_NC, 2 = MTYPE_CC)");
|
||||
module_param_named(mtype_local, amdgpu_mtype_local, int, 0444);
|
||||
module_param_named_unsafe(mtype_local, amdgpu_mtype_local, int, 0444);
|
||||
|
||||
/**
|
||||
* DOC: pcie_p2p (bool)
|
||||
|
@ -953,7 +953,7 @@ module_param_named(freesync_video, amdgpu_freesync_vid_mode, uint, 0444);
|
|||
* GPU reset method (-1 = auto (default), 0 = legacy, 1 = mode0, 2 = mode1, 3 = mode2, 4 = baco)
|
||||
*/
|
||||
MODULE_PARM_DESC(reset_method, "GPU reset method (-1 = auto (default), 0 = legacy, 1 = mode0, 2 = mode1, 3 = mode2, 4 = baco/bamaco)");
|
||||
module_param_named(reset_method, amdgpu_reset_method, int, 0644);
|
||||
module_param_named_unsafe(reset_method, amdgpu_reset_method, int, 0644);
|
||||
|
||||
/**
|
||||
* DOC: bad_page_threshold (int) Bad page threshold is specifies the
|
||||
|
@ -1049,7 +1049,7 @@ module_param_named(seamless, amdgpu_seamless, int, 0444);
|
|||
* - 0x4: Disable GPU soft recovery, always do a full reset
|
||||
*/
|
||||
MODULE_PARM_DESC(debug_mask, "debug options for amdgpu, disabled by default");
|
||||
module_param_named(debug_mask, amdgpu_debug_mask, uint, 0444);
|
||||
module_param_named_unsafe(debug_mask, amdgpu_debug_mask, uint, 0444);
|
||||
|
||||
/**
|
||||
* DOC: agp (int)
|
||||
|
|
|
@ -297,7 +297,7 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned int num_ibs,
|
|||
amdgpu_ring_patch_cond_exec(ring, cond_exec);
|
||||
|
||||
ring->current_ctx = fence_ctx;
|
||||
if (vm && ring->funcs->emit_switch_buffer)
|
||||
if (job && ring->funcs->emit_switch_buffer)
|
||||
amdgpu_ring_emit_switch_buffer(ring);
|
||||
|
||||
if (ring->funcs->emit_wave_limit &&
|
||||
|
|
|
@ -846,7 +846,7 @@ out:
|
|||
case AMDGPU_INFO_DEV_INFO: {
|
||||
struct drm_amdgpu_info_device *dev_info;
|
||||
uint64_t vm_size;
|
||||
uint32_t pcie_gen_mask;
|
||||
uint32_t pcie_gen_mask, pcie_width_mask;
|
||||
|
||||
dev_info = kzalloc(sizeof(*dev_info), GFP_KERNEL);
|
||||
if (!dev_info)
|
||||
|
@ -934,15 +934,18 @@ out:
|
|||
dev_info->tcc_disabled_mask = adev->gfx.config.tcc_disabled_mask;
|
||||
|
||||
/* Combine the chip gen mask with the platform (CPU/mobo) mask. */
|
||||
pcie_gen_mask = adev->pm.pcie_gen_mask & (adev->pm.pcie_gen_mask >> 16);
|
||||
pcie_gen_mask = adev->pm.pcie_gen_mask &
|
||||
(adev->pm.pcie_gen_mask >> CAIL_PCIE_LINK_SPEED_SUPPORT_SHIFT);
|
||||
pcie_width_mask = adev->pm.pcie_mlw_mask &
|
||||
(adev->pm.pcie_mlw_mask >> CAIL_PCIE_LINK_WIDTH_SUPPORT_SHIFT);
|
||||
dev_info->pcie_gen = fls(pcie_gen_mask);
|
||||
dev_info->pcie_num_lanes =
|
||||
adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 ? 32 :
|
||||
adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 ? 16 :
|
||||
adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 ? 12 :
|
||||
adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 ? 8 :
|
||||
adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 ? 4 :
|
||||
adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 ? 2 : 1;
|
||||
pcie_width_mask & CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X32 ? 32 :
|
||||
pcie_width_mask & CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X16 ? 16 :
|
||||
pcie_width_mask & CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X12 ? 12 :
|
||||
pcie_width_mask & CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X8 ? 8 :
|
||||
pcie_width_mask & CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X4 ? 4 :
|
||||
pcie_width_mask & CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X2 ? 2 : 1;
|
||||
|
||||
dev_info->tcp_cache_size = adev->gfx.config.gc_tcp_l1_size;
|
||||
dev_info->num_sqc_per_wgp = adev->gfx.config.gc_num_sqc_per_wgp;
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
#define AMDGPU_MES_VERSION_MASK 0x00000fff
|
||||
#define AMDGPU_MES_API_VERSION_MASK 0x00fff000
|
||||
#define AMDGPU_MES_FEAT_VERSION_MASK 0xff000000
|
||||
#define AMDGPU_MES_MSCRATCH_SIZE 0x8000
|
||||
#define AMDGPU_MES_MSCRATCH_SIZE 0x40000
|
||||
|
||||
enum amdgpu_mes_priority_level {
|
||||
AMDGPU_MES_PRIORITY_LEVEL_LOW = 0,
|
||||
|
|
|
@ -107,6 +107,7 @@ struct amdgpu_sdma {
|
|||
struct amdgpu_irq_src doorbell_invalid_irq;
|
||||
struct amdgpu_irq_src pool_timeout_irq;
|
||||
struct amdgpu_irq_src srbm_write_irq;
|
||||
struct amdgpu_irq_src ctxt_empty_irq;
|
||||
|
||||
int num_instances;
|
||||
uint32_t sdma_mask;
|
||||
|
|
|
@ -427,7 +427,7 @@ void amdgpu_xcp_release_sched(struct amdgpu_device *adev,
|
|||
return;
|
||||
|
||||
sched = entity->entity.rq->sched;
|
||||
if (sched->ready) {
|
||||
if (drm_sched_wqueue_ready(sched)) {
|
||||
ring = to_amdgpu_ring(entity->entity.rq->sched);
|
||||
atomic_dec(&adev->xcp_mgr->xcp[ring->xcp_id].ref_cnt);
|
||||
}
|
||||
|
|
|
@ -1352,6 +1352,14 @@ static int gfx_v12_0_sw_init(struct amdgpu_ip_block *ip_block)
|
|||
}
|
||||
|
||||
switch (amdgpu_ip_version(adev, GC_HWIP, 0)) {
|
||||
case IP_VERSION(12, 0, 0):
|
||||
case IP_VERSION(12, 0, 1):
|
||||
if (adev->gfx.me_fw_version >= 2480 &&
|
||||
adev->gfx.pfp_fw_version >= 2530 &&
|
||||
adev->gfx.mec_fw_version >= 2680 &&
|
||||
adev->mes.fw_version[0] >= 100)
|
||||
adev->gfx.enable_cleaner_shader = true;
|
||||
break;
|
||||
default:
|
||||
adev->gfx.enable_cleaner_shader = false;
|
||||
break;
|
||||
|
|
|
@ -756,7 +756,8 @@ static int mes_v12_0_set_hw_resources(struct amdgpu_mes *mes, int pipe)
|
|||
|
||||
if (amdgpu_mes_log_enable) {
|
||||
mes_set_hw_res_pkt.enable_mes_event_int_logging = 1;
|
||||
mes_set_hw_res_pkt.event_intr_history_gpu_mc_ptr = mes->event_log_gpu_addr + pipe * AMDGPU_MES_LOG_BUFFER_SIZE;
|
||||
mes_set_hw_res_pkt.event_intr_history_gpu_mc_ptr = mes->event_log_gpu_addr +
|
||||
pipe * (AMDGPU_MES_LOG_BUFFER_SIZE + AMDGPU_MES_MSCRATCH_SIZE);
|
||||
}
|
||||
|
||||
if (enforce_isolation)
|
||||
|
@ -983,29 +984,50 @@ static void mes_v12_0_enable(struct amdgpu_device *adev, bool enable)
|
|||
uint32_t pipe, data = 0;
|
||||
|
||||
if (enable) {
|
||||
data = RREG32_SOC15(GC, 0, regCP_MES_CNTL);
|
||||
data = REG_SET_FIELD(data, CP_MES_CNTL, MES_PIPE0_RESET, 1);
|
||||
data = REG_SET_FIELD(data, CP_MES_CNTL, MES_PIPE1_RESET, 1);
|
||||
WREG32_SOC15(GC, 0, regCP_MES_CNTL, data);
|
||||
|
||||
mutex_lock(&adev->srbm_mutex);
|
||||
for (pipe = 0; pipe < AMDGPU_MAX_MES_PIPES; pipe++) {
|
||||
soc21_grbm_select(adev, 3, pipe, 0, 0);
|
||||
if (amdgpu_mes_log_enable) {
|
||||
u32 log_size = AMDGPU_MES_LOG_BUFFER_SIZE + AMDGPU_MES_MSCRATCH_SIZE;
|
||||
/* In case uni mes is not enabled, only program for pipe 0 */
|
||||
if (adev->mes.event_log_size >= (pipe + 1) * log_size) {
|
||||
WREG32_SOC15(GC, 0, regCP_MES_MSCRATCH_LO,
|
||||
lower_32_bits(adev->mes.event_log_gpu_addr +
|
||||
pipe * log_size + AMDGPU_MES_LOG_BUFFER_SIZE));
|
||||
WREG32_SOC15(GC, 0, regCP_MES_MSCRATCH_HI,
|
||||
upper_32_bits(adev->mes.event_log_gpu_addr +
|
||||
pipe * log_size + AMDGPU_MES_LOG_BUFFER_SIZE));
|
||||
dev_info(adev->dev, "Setup CP MES MSCRATCH address : 0x%x. 0x%x\n",
|
||||
RREG32_SOC15(GC, 0, regCP_MES_MSCRATCH_HI),
|
||||
RREG32_SOC15(GC, 0, regCP_MES_MSCRATCH_LO));
|
||||
}
|
||||
}
|
||||
|
||||
data = RREG32_SOC15(GC, 0, regCP_MES_CNTL);
|
||||
if (pipe == 0)
|
||||
data = REG_SET_FIELD(data, CP_MES_CNTL, MES_PIPE0_RESET, 1);
|
||||
else
|
||||
data = REG_SET_FIELD(data, CP_MES_CNTL, MES_PIPE1_RESET, 1);
|
||||
WREG32_SOC15(GC, 0, regCP_MES_CNTL, data);
|
||||
|
||||
ucode_addr = adev->mes.uc_start_addr[pipe] >> 2;
|
||||
WREG32_SOC15(GC, 0, regCP_MES_PRGRM_CNTR_START,
|
||||
lower_32_bits(ucode_addr));
|
||||
WREG32_SOC15(GC, 0, regCP_MES_PRGRM_CNTR_START_HI,
|
||||
upper_32_bits(ucode_addr));
|
||||
|
||||
/* unhalt MES and activate one pipe each loop */
|
||||
data = REG_SET_FIELD(0, CP_MES_CNTL, MES_PIPE0_ACTIVE, 1);
|
||||
if (pipe)
|
||||
data = REG_SET_FIELD(data, CP_MES_CNTL, MES_PIPE1_ACTIVE, 1);
|
||||
dev_info(adev->dev, "program CP_MES_CNTL : 0x%x\n", data);
|
||||
|
||||
WREG32_SOC15(GC, 0, regCP_MES_CNTL, data);
|
||||
|
||||
}
|
||||
soc21_grbm_select(adev, 0, 0, 0, 0);
|
||||
mutex_unlock(&adev->srbm_mutex);
|
||||
|
||||
/* unhalt MES and activate pipe0 */
|
||||
data = REG_SET_FIELD(0, CP_MES_CNTL, MES_PIPE0_ACTIVE, 1);
|
||||
data = REG_SET_FIELD(data, CP_MES_CNTL, MES_PIPE1_ACTIVE, 1);
|
||||
WREG32_SOC15(GC, 0, regCP_MES_CNTL, data);
|
||||
|
||||
if (amdgpu_emu_mode)
|
||||
msleep(100);
|
||||
else if (adev->enable_uni_mes)
|
||||
|
@ -1479,8 +1501,9 @@ static int mes_v12_0_sw_init(struct amdgpu_ip_block *ip_block)
|
|||
adev->mes.kiq_hw_fini = &mes_v12_0_kiq_hw_fini;
|
||||
adev->mes.enable_legacy_queue_map = true;
|
||||
|
||||
adev->mes.event_log_size = adev->enable_uni_mes ? (AMDGPU_MAX_MES_PIPES * AMDGPU_MES_LOG_BUFFER_SIZE) : AMDGPU_MES_LOG_BUFFER_SIZE;
|
||||
|
||||
adev->mes.event_log_size = adev->enable_uni_mes ?
|
||||
(AMDGPU_MAX_MES_PIPES * (AMDGPU_MES_LOG_BUFFER_SIZE + AMDGPU_MES_MSCRATCH_SIZE)) :
|
||||
(AMDGPU_MES_LOG_BUFFER_SIZE + AMDGPU_MES_MSCRATCH_SIZE);
|
||||
r = amdgpu_mes_init(adev);
|
||||
if (r)
|
||||
return r;
|
||||
|
|
|
@ -1406,6 +1406,12 @@ static int sdma_v4_4_2_sw_init(struct amdgpu_ip_block *ip_block)
|
|||
&adev->sdma.srbm_write_irq);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
r = amdgpu_irq_add_id(adev, sdma_v4_4_2_seq_to_irq_id(i),
|
||||
SDMA0_4_0__SRCID__SDMA_CTXEMPTY,
|
||||
&adev->sdma.ctxt_empty_irq);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
|
||||
for (i = 0; i < adev->sdma.num_instances; i++) {
|
||||
|
@ -1814,6 +1820,16 @@ static int sdma_v4_4_2_process_srbm_write_irq(struct amdgpu_device *adev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int sdma_v4_4_2_process_ctxt_empty_irq(struct amdgpu_device *adev,
|
||||
struct amdgpu_irq_src *source,
|
||||
struct amdgpu_iv_entry *entry)
|
||||
{
|
||||
/* There is nothing useful to be done here, only kept for debug */
|
||||
dev_dbg_ratelimited(adev->dev, "SDMA context empty interrupt");
|
||||
sdma_v4_4_2_print_iv_entry(adev, entry);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void sdma_v4_4_2_inst_update_medium_grain_light_sleep(
|
||||
struct amdgpu_device *adev, bool enable, uint32_t inst_mask)
|
||||
{
|
||||
|
@ -2096,6 +2112,10 @@ static const struct amdgpu_irq_src_funcs sdma_v4_4_2_srbm_write_irq_funcs = {
|
|||
.process = sdma_v4_4_2_process_srbm_write_irq,
|
||||
};
|
||||
|
||||
static const struct amdgpu_irq_src_funcs sdma_v4_4_2_ctxt_empty_irq_funcs = {
|
||||
.process = sdma_v4_4_2_process_ctxt_empty_irq,
|
||||
};
|
||||
|
||||
static void sdma_v4_4_2_set_irq_funcs(struct amdgpu_device *adev)
|
||||
{
|
||||
adev->sdma.trap_irq.num_types = adev->sdma.num_instances;
|
||||
|
@ -2104,6 +2124,7 @@ static void sdma_v4_4_2_set_irq_funcs(struct amdgpu_device *adev)
|
|||
adev->sdma.doorbell_invalid_irq.num_types = adev->sdma.num_instances;
|
||||
adev->sdma.pool_timeout_irq.num_types = adev->sdma.num_instances;
|
||||
adev->sdma.srbm_write_irq.num_types = adev->sdma.num_instances;
|
||||
adev->sdma.ctxt_empty_irq.num_types = adev->sdma.num_instances;
|
||||
|
||||
adev->sdma.trap_irq.funcs = &sdma_v4_4_2_trap_irq_funcs;
|
||||
adev->sdma.illegal_inst_irq.funcs = &sdma_v4_4_2_illegal_inst_irq_funcs;
|
||||
|
@ -2112,6 +2133,7 @@ static void sdma_v4_4_2_set_irq_funcs(struct amdgpu_device *adev)
|
|||
adev->sdma.doorbell_invalid_irq.funcs = &sdma_v4_4_2_doorbell_invalid_irq_funcs;
|
||||
adev->sdma.pool_timeout_irq.funcs = &sdma_v4_4_2_pool_timeout_irq_funcs;
|
||||
adev->sdma.srbm_write_irq.funcs = &sdma_v4_4_2_srbm_write_irq_funcs;
|
||||
adev->sdma.ctxt_empty_irq.funcs = &sdma_v4_4_2_ctxt_empty_irq_funcs;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -447,7 +447,9 @@ L_SAVE:
|
|||
s_getreg_b32 s_save_m0, hwreg(HW_REG_MODE) //MODE
|
||||
write_hwreg_to_mem(s_save_m0, s_save_buf_rsrc0, s_save_mem_offset)
|
||||
|
||||
|
||||
// Clear VSKIP state now that MODE.VSKIP has been saved.
|
||||
// If user shader set it then vector instructions would be skipped.
|
||||
s_setvskip 0,0
|
||||
|
||||
/* the first wave in the threadgroup */
|
||||
s_and_b32 s_save_tmp, s_save_spi_init_hi, S_SAVE_SPI_INIT_FIRST_WAVE_MASK // extract fisrt wave bit
|
||||
|
|
|
@ -278,10 +278,11 @@ svm_migrate_copy_to_vram(struct kfd_node *node, struct svm_range *prange,
|
|||
struct migrate_vma *migrate, struct dma_fence **mfence,
|
||||
dma_addr_t *scratch, uint64_t ttm_res_offset)
|
||||
{
|
||||
uint64_t npages = migrate->cpages;
|
||||
uint64_t npages = migrate->npages;
|
||||
struct amdgpu_device *adev = node->adev;
|
||||
struct device *dev = adev->dev;
|
||||
struct amdgpu_res_cursor cursor;
|
||||
uint64_t mpages = 0;
|
||||
dma_addr_t *src;
|
||||
uint64_t *dst;
|
||||
uint64_t i, j;
|
||||
|
@ -295,14 +296,16 @@ svm_migrate_copy_to_vram(struct kfd_node *node, struct svm_range *prange,
|
|||
|
||||
amdgpu_res_first(prange->ttm_res, ttm_res_offset,
|
||||
npages << PAGE_SHIFT, &cursor);
|
||||
for (i = j = 0; i < npages; i++) {
|
||||
for (i = j = 0; (i < npages) && (mpages < migrate->cpages); i++) {
|
||||
struct page *spage;
|
||||
|
||||
dst[i] = cursor.start + (j << PAGE_SHIFT);
|
||||
migrate->dst[i] = svm_migrate_addr_to_pfn(adev, dst[i]);
|
||||
svm_migrate_get_vram_page(prange, migrate->dst[i]);
|
||||
migrate->dst[i] = migrate_pfn(migrate->dst[i]);
|
||||
|
||||
if (migrate->src[i] & MIGRATE_PFN_MIGRATE) {
|
||||
dst[i] = cursor.start + (j << PAGE_SHIFT);
|
||||
migrate->dst[i] = svm_migrate_addr_to_pfn(adev, dst[i]);
|
||||
svm_migrate_get_vram_page(prange, migrate->dst[i]);
|
||||
migrate->dst[i] = migrate_pfn(migrate->dst[i]);
|
||||
mpages++;
|
||||
}
|
||||
spage = migrate_pfn_to_page(migrate->src[i]);
|
||||
if (spage && !is_zone_device_page(spage)) {
|
||||
src[i] = dma_map_page(dev, spage, 0, PAGE_SIZE,
|
||||
|
@ -353,9 +356,12 @@ svm_migrate_copy_to_vram(struct kfd_node *node, struct svm_range *prange,
|
|||
out_free_vram_pages:
|
||||
if (r) {
|
||||
pr_debug("failed %d to copy memory to vram\n", r);
|
||||
while (i--) {
|
||||
for (i = 0; i < npages && mpages; i++) {
|
||||
if (!dst[i])
|
||||
continue;
|
||||
svm_migrate_put_vram_page(adev, dst[i]);
|
||||
migrate->dst[i] = 0;
|
||||
mpages--;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2034,6 +2034,9 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
|
|||
if (amdgpu_dc_debug_mask & DC_FORCE_SUBVP_MCLK_SWITCH)
|
||||
adev->dm.dc->debug.force_subvp_mclk_switch = true;
|
||||
|
||||
if (amdgpu_dc_debug_mask & DC_DISABLE_SUBVP)
|
||||
adev->dm.dc->debug.force_disable_subvp = true;
|
||||
|
||||
if (amdgpu_dc_debug_mask & DC_ENABLE_DML2) {
|
||||
adev->dm.dc->debug.using_dml2 = true;
|
||||
adev->dm.dc->debug.using_dml21 = true;
|
||||
|
@ -11483,6 +11486,11 @@ static bool amdgpu_dm_crtc_mem_type_changed(struct drm_device *dev,
|
|||
new_plane_state = drm_atomic_get_plane_state(state, plane);
|
||||
old_plane_state = drm_atomic_get_plane_state(state, plane);
|
||||
|
||||
if (IS_ERR(new_plane_state) || IS_ERR(old_plane_state)) {
|
||||
DRM_ERROR("Failed to get plane state for plane %s\n", plane->name);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (old_plane_state->fb && new_plane_state->fb &&
|
||||
get_mem_type(old_plane_state->fb) != get_mem_type(new_plane_state->fb))
|
||||
return true;
|
||||
|
|
|
@ -1736,7 +1736,7 @@ static void CalculateBytePerPixelAndBlockSizes(
|
|||
#endif
|
||||
} // CalculateBytePerPixelAndBlockSizes
|
||||
|
||||
static dml_float_t CalculateTWait(
|
||||
static noinline_for_stack dml_float_t CalculateTWait(
|
||||
dml_uint_t PrefetchMode,
|
||||
enum dml_use_mall_for_pstate_change_mode UseMALLForPStateChange,
|
||||
dml_bool_t SynchronizeDRRDisplaysForUCLKPStateChangeFinal,
|
||||
|
@ -4458,7 +4458,7 @@ static void CalculateSwathWidth(
|
|||
}
|
||||
} // CalculateSwathWidth
|
||||
|
||||
static dml_float_t CalculateExtraLatency(
|
||||
static noinline_for_stack dml_float_t CalculateExtraLatency(
|
||||
dml_uint_t RoundTripPingLatencyCycles,
|
||||
dml_uint_t ReorderingBytes,
|
||||
dml_float_t DCFCLK,
|
||||
|
@ -5915,7 +5915,7 @@ static dml_uint_t DSCDelayRequirement(
|
|||
return DSCDelayRequirement_val;
|
||||
}
|
||||
|
||||
static dml_bool_t CalculateVActiveBandwithSupport(dml_uint_t NumberOfActiveSurfaces,
|
||||
static noinline_for_stack dml_bool_t CalculateVActiveBandwithSupport(dml_uint_t NumberOfActiveSurfaces,
|
||||
dml_float_t ReturnBW,
|
||||
dml_bool_t NotUrgentLatencyHiding[],
|
||||
dml_float_t ReadBandwidthLuma[],
|
||||
|
@ -6019,7 +6019,7 @@ static void CalculatePrefetchBandwithSupport(
|
|||
#endif
|
||||
}
|
||||
|
||||
static dml_float_t CalculateBandwidthAvailableForImmediateFlip(
|
||||
static noinline_for_stack dml_float_t CalculateBandwidthAvailableForImmediateFlip(
|
||||
dml_uint_t NumberOfActiveSurfaces,
|
||||
dml_float_t ReturnBW,
|
||||
dml_float_t ReadBandwidthLuma[],
|
||||
|
@ -6213,7 +6213,7 @@ static dml_uint_t CalculateMaxVStartup(
|
|||
return max_vstartup_lines;
|
||||
}
|
||||
|
||||
static void set_calculate_prefetch_schedule_params(struct display_mode_lib_st *mode_lib,
|
||||
static noinline_for_stack void set_calculate_prefetch_schedule_params(struct display_mode_lib_st *mode_lib,
|
||||
struct CalculatePrefetchSchedule_params_st *CalculatePrefetchSchedule_params,
|
||||
dml_uint_t j,
|
||||
dml_uint_t k)
|
||||
|
@ -6265,7 +6265,7 @@ static void set_calculate_prefetch_schedule_params(struct display_mode_lib_st *m
|
|||
CalculatePrefetchSchedule_params->Tno_bw = &mode_lib->ms.Tno_bw[k];
|
||||
}
|
||||
|
||||
static void dml_prefetch_check(struct display_mode_lib_st *mode_lib)
|
||||
static noinline_for_stack void dml_prefetch_check(struct display_mode_lib_st *mode_lib)
|
||||
{
|
||||
struct dml_core_mode_support_locals_st *s = &mode_lib->scratch.dml_core_mode_support_locals;
|
||||
struct CalculatePrefetchSchedule_params_st *CalculatePrefetchSchedule_params = &mode_lib->scratch.CalculatePrefetchSchedule_params;
|
||||
|
|
|
@ -2778,7 +2778,7 @@ static double dml_get_return_bandwidth_available(
|
|||
return return_bw_mbps;
|
||||
}
|
||||
|
||||
static void calculate_bandwidth_available(
|
||||
static noinline_for_stack void calculate_bandwidth_available(
|
||||
double avg_bandwidth_available_min[dml2_core_internal_soc_state_max],
|
||||
double avg_bandwidth_available[dml2_core_internal_soc_state_max][dml2_core_internal_bw_max],
|
||||
double urg_bandwidth_available_min[dml2_core_internal_soc_state_max], // min between SDP and DRAM
|
||||
|
@ -3625,7 +3625,7 @@ static void CalculateDCFCLKDeepSleepTdlut(
|
|||
dml2_printf("DML::%s: DCFClkDeepSleep = %f (final)\n", __func__, *DCFClkDeepSleep);
|
||||
}
|
||||
|
||||
static void CalculateDCFCLKDeepSleep(
|
||||
static noinline_for_stack void CalculateDCFCLKDeepSleep(
|
||||
const struct dml2_display_cfg *display_cfg,
|
||||
unsigned int NumberOfActiveSurfaces,
|
||||
unsigned int BytePerPixelY[],
|
||||
|
@ -4142,7 +4142,7 @@ static bool ValidateODMMode(enum dml2_odm_mode ODMMode,
|
|||
return true;
|
||||
}
|
||||
|
||||
static void CalculateODMMode(
|
||||
static noinline_for_stack void CalculateODMMode(
|
||||
unsigned int MaximumPixelsPerLinePerDSCUnit,
|
||||
unsigned int HActive,
|
||||
enum dml2_output_format_class OutFormat,
|
||||
|
@ -4239,7 +4239,7 @@ static void CalculateODMMode(
|
|||
#endif
|
||||
}
|
||||
|
||||
static void CalculateOutputLink(
|
||||
static noinline_for_stack void CalculateOutputLink(
|
||||
struct dml2_core_internal_scratch *s,
|
||||
double PHYCLK,
|
||||
double PHYCLKD18,
|
||||
|
@ -5999,7 +5999,7 @@ static double calculate_impacted_Tsw(unsigned int exclude_plane_idx, unsigned in
|
|||
}
|
||||
|
||||
// a global check against the aggregate effect of the per plane prefetch schedule
|
||||
static bool CheckGlobalPrefetchAdmissibility(struct dml2_core_internal_scratch *scratch,
|
||||
static noinline_for_stack bool CheckGlobalPrefetchAdmissibility(struct dml2_core_internal_scratch *scratch,
|
||||
struct dml2_core_calcs_CheckGlobalPrefetchAdmissibility_params *p)
|
||||
{
|
||||
struct dml2_core_calcs_CheckGlobalPrefetchAdmissibility_locals *s = &scratch->CheckGlobalPrefetchAdmissibility_locals;
|
||||
|
@ -7012,7 +7012,7 @@ static void calculate_bytes_to_fetch_required_to_hide_latency(
|
|||
}
|
||||
}
|
||||
|
||||
static void calculate_vactive_det_fill_latency(
|
||||
static noinline_for_stack void calculate_vactive_det_fill_latency(
|
||||
const struct dml2_display_cfg *display_cfg,
|
||||
unsigned int num_active_planes,
|
||||
unsigned int bytes_required_l[],
|
||||
|
|
|
@ -194,6 +194,9 @@ void dpp_reset(struct dpp *dpp_base)
|
|||
dpp->filter_h = NULL;
|
||||
dpp->filter_v = NULL;
|
||||
|
||||
memset(&dpp_base->pos, 0, sizeof(dpp_base->pos));
|
||||
memset(&dpp_base->att, 0, sizeof(dpp_base->att));
|
||||
|
||||
memset(&dpp->scl_data, 0, sizeof(dpp->scl_data));
|
||||
memset(&dpp->pwl_data, 0, sizeof(dpp->pwl_data));
|
||||
}
|
||||
|
@ -480,10 +483,11 @@ void dpp1_set_cursor_position(
|
|||
if (src_y_offset + cursor_height <= 0)
|
||||
cur_en = 0; /* not visible beyond top edge*/
|
||||
|
||||
REG_UPDATE(CURSOR0_CONTROL,
|
||||
CUR0_ENABLE, cur_en);
|
||||
if (dpp_base->pos.cur0_ctl.bits.cur0_enable != cur_en) {
|
||||
REG_UPDATE(CURSOR0_CONTROL, CUR0_ENABLE, cur_en);
|
||||
|
||||
dpp_base->pos.cur0_ctl.bits.cur0_enable = cur_en;
|
||||
dpp_base->pos.cur0_ctl.bits.cur0_enable = cur_en;
|
||||
}
|
||||
}
|
||||
|
||||
void dpp1_cnv_set_optional_cursor_attributes(
|
||||
|
|
|
@ -154,9 +154,11 @@ void dpp401_set_cursor_position(
|
|||
struct dcn401_dpp *dpp = TO_DCN401_DPP(dpp_base);
|
||||
uint32_t cur_en = pos->enable ? 1 : 0;
|
||||
|
||||
REG_UPDATE(CURSOR0_CONTROL, CUR0_ENABLE, cur_en);
|
||||
if (dpp_base->pos.cur0_ctl.bits.cur0_enable != cur_en) {
|
||||
REG_UPDATE(CURSOR0_CONTROL, CUR0_ENABLE, cur_en);
|
||||
|
||||
dpp_base->pos.cur0_ctl.bits.cur0_enable = cur_en;
|
||||
dpp_base->pos.cur0_ctl.bits.cur0_enable = cur_en;
|
||||
}
|
||||
}
|
||||
|
||||
void dpp401_set_optional_cursor_attributes(
|
||||
|
|
|
@ -546,6 +546,12 @@ void hubp1_dcc_control(struct hubp *hubp, bool enable,
|
|||
SECONDARY_SURFACE_DCC_IND_64B_BLK, dcc_ind_64b_blk);
|
||||
}
|
||||
|
||||
void hubp_reset(struct hubp *hubp)
|
||||
{
|
||||
memset(&hubp->pos, 0, sizeof(hubp->pos));
|
||||
memset(&hubp->att, 0, sizeof(hubp->att));
|
||||
}
|
||||
|
||||
void hubp1_program_surface_config(
|
||||
struct hubp *hubp,
|
||||
enum surface_pixel_format format,
|
||||
|
@ -1351,8 +1357,9 @@ static void hubp1_wait_pipe_read_start(struct hubp *hubp)
|
|||
|
||||
void hubp1_init(struct hubp *hubp)
|
||||
{
|
||||
//do nothing
|
||||
hubp_reset(hubp);
|
||||
}
|
||||
|
||||
static const struct hubp_funcs dcn10_hubp_funcs = {
|
||||
.hubp_program_surface_flip_and_addr =
|
||||
hubp1_program_surface_flip_and_addr,
|
||||
|
@ -1365,6 +1372,7 @@ static const struct hubp_funcs dcn10_hubp_funcs = {
|
|||
.hubp_set_vm_context0_settings = hubp1_set_vm_context0_settings,
|
||||
.set_blank = hubp1_set_blank,
|
||||
.dcc_control = hubp1_dcc_control,
|
||||
.hubp_reset = hubp_reset,
|
||||
.mem_program_viewport = min_set_viewport,
|
||||
.set_hubp_blank_en = hubp1_set_hubp_blank_en,
|
||||
.set_cursor_attributes = hubp1_cursor_set_attributes,
|
||||
|
|
|
@ -746,6 +746,8 @@ void hubp1_dcc_control(struct hubp *hubp,
|
|||
bool enable,
|
||||
enum hubp_ind_block_size independent_64b_blks);
|
||||
|
||||
void hubp_reset(struct hubp *hubp);
|
||||
|
||||
bool hubp1_program_surface_flip_and_addr(
|
||||
struct hubp *hubp,
|
||||
const struct dc_plane_address *address,
|
||||
|
|
|
@ -1058,11 +1058,13 @@ void hubp2_cursor_set_position(
|
|||
if (src_y_offset + cursor_height <= 0)
|
||||
cur_en = 0; /* not visible beyond top edge*/
|
||||
|
||||
if (cur_en && REG_READ(CURSOR_SURFACE_ADDRESS) == 0)
|
||||
hubp->funcs->set_cursor_attributes(hubp, &hubp->curs_attr);
|
||||
if (hubp->pos.cur_ctl.bits.cur_enable != cur_en) {
|
||||
if (cur_en && REG_READ(CURSOR_SURFACE_ADDRESS) == 0)
|
||||
hubp->funcs->set_cursor_attributes(hubp, &hubp->curs_attr);
|
||||
|
||||
REG_UPDATE(CURSOR_CONTROL,
|
||||
REG_UPDATE(CURSOR_CONTROL,
|
||||
CURSOR_ENABLE, cur_en);
|
||||
}
|
||||
|
||||
REG_SET_2(CURSOR_POSITION, 0,
|
||||
CURSOR_X_POSITION, pos->x,
|
||||
|
@ -1674,6 +1676,7 @@ static struct hubp_funcs dcn20_hubp_funcs = {
|
|||
.set_blank = hubp2_set_blank,
|
||||
.set_blank_regs = hubp2_set_blank_regs,
|
||||
.dcc_control = hubp2_dcc_control,
|
||||
.hubp_reset = hubp_reset,
|
||||
.mem_program_viewport = min_set_viewport,
|
||||
.set_cursor_attributes = hubp2_cursor_set_attributes,
|
||||
.set_cursor_position = hubp2_cursor_set_position,
|
||||
|
|
|
@ -121,6 +121,7 @@ static struct hubp_funcs dcn201_hubp_funcs = {
|
|||
.set_cursor_position = hubp1_cursor_set_position,
|
||||
.set_blank = hubp1_set_blank,
|
||||
.dcc_control = hubp1_dcc_control,
|
||||
.hubp_reset = hubp_reset,
|
||||
.mem_program_viewport = min_set_viewport,
|
||||
.hubp_clk_cntl = hubp1_clk_cntl,
|
||||
.hubp_vtg_sel = hubp1_vtg_sel,
|
||||
|
|
|
@ -811,6 +811,8 @@ static void hubp21_init(struct hubp *hubp)
|
|||
struct dcn21_hubp *hubp21 = TO_DCN21_HUBP(hubp);
|
||||
//hubp[i].HUBPREQ_DEBUG.HUBPREQ_DEBUG[26] = 1;
|
||||
REG_WRITE(HUBPREQ_DEBUG, 1 << 26);
|
||||
|
||||
hubp_reset(hubp);
|
||||
}
|
||||
static struct hubp_funcs dcn21_hubp_funcs = {
|
||||
.hubp_enable_tripleBuffer = hubp2_enable_triplebuffer,
|
||||
|
@ -823,6 +825,7 @@ static struct hubp_funcs dcn21_hubp_funcs = {
|
|||
.hubp_set_vm_system_aperture_settings = hubp21_set_vm_system_aperture_settings,
|
||||
.set_blank = hubp1_set_blank,
|
||||
.dcc_control = hubp1_dcc_control,
|
||||
.hubp_reset = hubp_reset,
|
||||
.mem_program_viewport = hubp21_set_viewport,
|
||||
.set_cursor_attributes = hubp2_cursor_set_attributes,
|
||||
.set_cursor_position = hubp1_cursor_set_position,
|
||||
|
|
|
@ -499,6 +499,8 @@ void hubp3_init(struct hubp *hubp)
|
|||
struct dcn20_hubp *hubp2 = TO_DCN20_HUBP(hubp);
|
||||
//hubp[i].HUBPREQ_DEBUG.HUBPREQ_DEBUG[26] = 1;
|
||||
REG_WRITE(HUBPREQ_DEBUG, 1 << 26);
|
||||
|
||||
hubp_reset(hubp);
|
||||
}
|
||||
|
||||
static struct hubp_funcs dcn30_hubp_funcs = {
|
||||
|
@ -513,6 +515,7 @@ static struct hubp_funcs dcn30_hubp_funcs = {
|
|||
.set_blank = hubp2_set_blank,
|
||||
.set_blank_regs = hubp2_set_blank_regs,
|
||||
.dcc_control = hubp3_dcc_control,
|
||||
.hubp_reset = hubp_reset,
|
||||
.mem_program_viewport = min_set_viewport,
|
||||
.set_cursor_attributes = hubp2_cursor_set_attributes,
|
||||
.set_cursor_position = hubp2_cursor_set_position,
|
||||
|
|
|
@ -79,6 +79,7 @@ static struct hubp_funcs dcn31_hubp_funcs = {
|
|||
.hubp_set_vm_system_aperture_settings = hubp3_set_vm_system_aperture_settings,
|
||||
.set_blank = hubp2_set_blank,
|
||||
.dcc_control = hubp3_dcc_control,
|
||||
.hubp_reset = hubp_reset,
|
||||
.mem_program_viewport = min_set_viewport,
|
||||
.set_cursor_attributes = hubp2_cursor_set_attributes,
|
||||
.set_cursor_position = hubp2_cursor_set_position,
|
||||
|
|
|
@ -181,6 +181,7 @@ static struct hubp_funcs dcn32_hubp_funcs = {
|
|||
.set_blank = hubp2_set_blank,
|
||||
.set_blank_regs = hubp2_set_blank_regs,
|
||||
.dcc_control = hubp3_dcc_control,
|
||||
.hubp_reset = hubp_reset,
|
||||
.mem_program_viewport = min_set_viewport,
|
||||
.set_cursor_attributes = hubp32_cursor_set_attributes,
|
||||
.set_cursor_position = hubp2_cursor_set_position,
|
||||
|
|
|
@ -199,6 +199,7 @@ static struct hubp_funcs dcn35_hubp_funcs = {
|
|||
.hubp_set_vm_system_aperture_settings = hubp3_set_vm_system_aperture_settings,
|
||||
.set_blank = hubp2_set_blank,
|
||||
.dcc_control = hubp3_dcc_control,
|
||||
.hubp_reset = hubp_reset,
|
||||
.mem_program_viewport = min_set_viewport,
|
||||
.set_cursor_attributes = hubp2_cursor_set_attributes,
|
||||
.set_cursor_position = hubp2_cursor_set_position,
|
||||
|
|
|
@ -141,7 +141,7 @@ void hubp401_update_mall_sel(struct hubp *hubp, uint32_t mall_sel, bool c_cursor
|
|||
|
||||
void hubp401_init(struct hubp *hubp)
|
||||
{
|
||||
//For now nothing to do, HUBPREQ_DEBUG_DB register is removed on DCN4x.
|
||||
hubp_reset(hubp);
|
||||
}
|
||||
|
||||
void hubp401_vready_at_or_After_vsync(struct hubp *hubp,
|
||||
|
@ -742,11 +742,13 @@ void hubp401_cursor_set_position(
|
|||
dc_fixpt_from_int(dst_x_offset),
|
||||
param->h_scale_ratio));
|
||||
|
||||
if (cur_en && REG_READ(CURSOR_SURFACE_ADDRESS) == 0)
|
||||
hubp->funcs->set_cursor_attributes(hubp, &hubp->curs_attr);
|
||||
if (hubp->pos.cur_ctl.bits.cur_enable != cur_en) {
|
||||
if (cur_en && REG_READ(CURSOR_SURFACE_ADDRESS) == 0)
|
||||
hubp->funcs->set_cursor_attributes(hubp, &hubp->curs_attr);
|
||||
|
||||
REG_UPDATE(CURSOR_CONTROL,
|
||||
CURSOR_ENABLE, cur_en);
|
||||
REG_UPDATE(CURSOR_CONTROL,
|
||||
CURSOR_ENABLE, cur_en);
|
||||
}
|
||||
|
||||
REG_SET_2(CURSOR_POSITION, 0,
|
||||
CURSOR_X_POSITION, x_pos,
|
||||
|
@ -998,6 +1000,7 @@ static struct hubp_funcs dcn401_hubp_funcs = {
|
|||
.hubp_set_vm_system_aperture_settings = hubp3_set_vm_system_aperture_settings,
|
||||
.set_blank = hubp2_set_blank,
|
||||
.set_blank_regs = hubp2_set_blank_regs,
|
||||
.hubp_reset = hubp_reset,
|
||||
.mem_program_viewport = hubp401_set_viewport,
|
||||
.set_cursor_attributes = hubp32_cursor_set_attributes,
|
||||
.set_cursor_position = hubp401_cursor_set_position,
|
||||
|
|
|
@ -1286,6 +1286,7 @@ void dcn10_plane_atomic_power_down(struct dc *dc,
|
|||
if (hws->funcs.hubp_pg_control)
|
||||
hws->funcs.hubp_pg_control(hws, hubp->inst, false);
|
||||
|
||||
hubp->funcs->hubp_reset(hubp);
|
||||
dpp->funcs->dpp_reset(dpp);
|
||||
|
||||
REG_SET(DC_IP_REQUEST_CNTL, 0,
|
||||
|
@ -1447,6 +1448,7 @@ void dcn10_init_pipes(struct dc *dc, struct dc_state *context)
|
|||
/* Disable on the current state so the new one isn't cleared. */
|
||||
pipe_ctx = &dc->current_state->res_ctx.pipe_ctx[i];
|
||||
|
||||
hubp->funcs->hubp_reset(hubp);
|
||||
dpp->funcs->dpp_reset(dpp);
|
||||
|
||||
pipe_ctx->stream_res.tg = tg;
|
||||
|
|
|
@ -800,6 +800,7 @@ void dcn35_init_pipes(struct dc *dc, struct dc_state *context)
|
|||
/* Disable on the current state so the new one isn't cleared. */
|
||||
pipe_ctx = &dc->current_state->res_ctx.pipe_ctx[i];
|
||||
|
||||
hubp->funcs->hubp_reset(hubp);
|
||||
dpp->funcs->dpp_reset(dpp);
|
||||
|
||||
pipe_ctx->stream_res.tg = tg;
|
||||
|
@ -956,6 +957,7 @@ void dcn35_plane_atomic_disable(struct dc *dc, struct pipe_ctx *pipe_ctx)
|
|||
/*to do, need to support both case*/
|
||||
hubp->power_gated = true;
|
||||
|
||||
hubp->funcs->hubp_reset(hubp);
|
||||
dpp->funcs->dpp_reset(dpp);
|
||||
|
||||
pipe_ctx->stream = NULL;
|
||||
|
|
|
@ -163,6 +163,8 @@ struct hubp_funcs {
|
|||
void (*dcc_control)(struct hubp *hubp, bool enable,
|
||||
enum hubp_ind_block_size blk_size);
|
||||
|
||||
void (*hubp_reset)(struct hubp *hubp);
|
||||
|
||||
void (*mem_program_viewport)(
|
||||
struct hubp *hubp,
|
||||
const struct rect *viewport,
|
||||
|
|
|
@ -49,6 +49,17 @@
|
|||
| CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3)
|
||||
|
||||
/* Following flags shows PCIe lane width switch supported in driver which are decided by chipset and ASIC */
|
||||
|
||||
#define CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X1 0x00000001
|
||||
#define CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X2 0x00000002
|
||||
#define CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X4 0x00000004
|
||||
#define CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X8 0x00000008
|
||||
#define CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X12 0x00000010
|
||||
#define CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X16 0x00000020
|
||||
#define CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X32 0x00000040
|
||||
#define CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_MASK 0x0000FFFF
|
||||
#define CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_SHIFT 0
|
||||
|
||||
#define CAIL_PCIE_LINK_WIDTH_SUPPORT_X1 0x00010000
|
||||
#define CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 0x00020000
|
||||
#define CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 0x00040000
|
||||
|
@ -56,6 +67,7 @@
|
|||
#define CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 0x00100000
|
||||
#define CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 0x00200000
|
||||
#define CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 0x00400000
|
||||
#define CAIL_PCIE_LINK_WIDTH_SUPPORT_MASK 0xFFFF0000
|
||||
#define CAIL_PCIE_LINK_WIDTH_SUPPORT_SHIFT 16
|
||||
|
||||
/* 1/2/4/8/16 lanes */
|
||||
|
@ -65,4 +77,10 @@
|
|||
| CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 \
|
||||
| CAIL_PCIE_LINK_WIDTH_SUPPORT_X16)
|
||||
|
||||
#define AMDGPU_DEFAULT_ASIC_PCIE_MLW_MASK (CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X1 \
|
||||
| CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X2 \
|
||||
| CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X4 \
|
||||
| CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X8 \
|
||||
| CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X16)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -345,10 +345,15 @@ enum DC_DEBUG_MASK {
|
|||
*/
|
||||
DC_DISABLE_ACPI_EDID = 0x8000,
|
||||
|
||||
/*
|
||||
/**
|
||||
* @DC_DISABLE_HDMI_CEC: If set, disable HDMI-CEC feature in amdgpu driver.
|
||||
*/
|
||||
DC_DISABLE_HDMI_CEC = 0x10000,
|
||||
|
||||
/**
|
||||
* @DC_DISABLE_SUBVP: If set, disable DCN Sub-Viewport feature in amdgpu driver.
|
||||
*/
|
||||
DC_DISABLE_SUBVP = 0x20000,
|
||||
};
|
||||
|
||||
enum amd_dpm_forced_level;
|
||||
|
|
|
@ -93,7 +93,6 @@
|
|||
#define PPSMC_MSG_SelectPLPDMode 0x40
|
||||
#define PPSMC_MSG_RmaDueToBadPageThreshold 0x43
|
||||
#define PPSMC_MSG_SelectPstatePolicy 0x44
|
||||
#define PPSMC_MSG_ResetSDMA2 0x45
|
||||
#define PPSMC_MSG_ResetSDMA 0x4D
|
||||
#define PPSMC_Message_Count 0x4E
|
||||
|
||||
|
|
|
@ -276,8 +276,7 @@
|
|||
__SMU_DUMMY_MAP(SelectPstatePolicy), \
|
||||
__SMU_DUMMY_MAP(MALLPowerController), \
|
||||
__SMU_DUMMY_MAP(MALLPowerState), \
|
||||
__SMU_DUMMY_MAP(ResetSDMA), \
|
||||
__SMU_DUMMY_MAP(ResetSDMA2),
|
||||
__SMU_DUMMY_MAP(ResetSDMA),
|
||||
|
||||
#undef __SMU_DUMMY_MAP
|
||||
#define __SMU_DUMMY_MAP(type) SMU_MSG_##type
|
||||
|
|
|
@ -107,6 +107,7 @@ struct smu_13_0_dpm_context {
|
|||
struct smu_13_0_dpm_tables dpm_tables;
|
||||
uint32_t workload_policy_mask;
|
||||
uint32_t dcef_min_ds_clk;
|
||||
uint64_t caps;
|
||||
};
|
||||
|
||||
enum smu_13_0_power_state {
|
||||
|
|
|
@ -101,38 +101,24 @@ MODULE_FIRMWARE("amdgpu/smu_13_0_14.bin");
|
|||
#define MCA_BANK_IPID(_ip, _hwid, _type) \
|
||||
[AMDGPU_MCA_IP_##_ip] = { .hwid = _hwid, .mcatype = _type, }
|
||||
|
||||
static inline bool smu_v13_0_6_is_unified_metrics(struct smu_context *smu)
|
||||
{
|
||||
return (smu->adev->flags & AMD_IS_APU) &&
|
||||
smu->smc_fw_version <= 0x4556900;
|
||||
}
|
||||
#define SMU_CAP(x) SMU_13_0_6_CAPS_##x
|
||||
|
||||
static inline bool smu_v13_0_6_is_other_end_count_available(struct smu_context *smu)
|
||||
{
|
||||
switch (amdgpu_ip_version(smu->adev, MP1_HWIP, 0)) {
|
||||
case IP_VERSION(13, 0, 6):
|
||||
return smu->smc_fw_version >= 0x557600;
|
||||
case IP_VERSION(13, 0, 14):
|
||||
return smu->smc_fw_version >= 0x05550E00;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static inline bool smu_v13_0_6_is_blw_host_limit_available(struct smu_context *smu)
|
||||
{
|
||||
if (smu->adev->flags & AMD_IS_APU)
|
||||
return smu->smc_fw_version >= 0x04556F00;
|
||||
|
||||
switch (amdgpu_ip_version(smu->adev, MP1_HWIP, 0)) {
|
||||
case IP_VERSION(13, 0, 6):
|
||||
return smu->smc_fw_version >= 0x557900;
|
||||
case IP_VERSION(13, 0, 14):
|
||||
return smu->smc_fw_version >= 0x05551000;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
enum smu_v13_0_6_caps {
|
||||
SMU_CAP(DPM),
|
||||
SMU_CAP(UNI_METRICS),
|
||||
SMU_CAP(DPM_POLICY),
|
||||
SMU_CAP(OTHER_END_METRICS),
|
||||
SMU_CAP(SET_UCLK_MAX),
|
||||
SMU_CAP(PCIE_METRICS),
|
||||
SMU_CAP(HST_LIMIT_METRICS),
|
||||
SMU_CAP(MCA_DEBUG_MODE),
|
||||
SMU_CAP(PER_INST_METRICS),
|
||||
SMU_CAP(CTF_LIMIT),
|
||||
SMU_CAP(RMA_MSG),
|
||||
SMU_CAP(ACA_SYND),
|
||||
SMU_CAP(SDMA_RESET),
|
||||
SMU_CAP(ALL),
|
||||
};
|
||||
|
||||
struct mca_bank_ipid {
|
||||
enum amdgpu_mca_ip ip;
|
||||
|
@ -209,7 +195,6 @@ static const struct cmn2asic_msg_mapping smu_v13_0_6_message_map[SMU_MSG_MAX_COU
|
|||
MSG_MAP(RmaDueToBadPageThreshold, PPSMC_MSG_RmaDueToBadPageThreshold, 0),
|
||||
MSG_MAP(SelectPstatePolicy, PPSMC_MSG_SelectPstatePolicy, 0),
|
||||
MSG_MAP(ResetSDMA, PPSMC_MSG_ResetSDMA, 0),
|
||||
MSG_MAP(ResetSDMA2, PPSMC_MSG_ResetSDMA2, 0),
|
||||
};
|
||||
|
||||
// clang-format on
|
||||
|
@ -297,6 +282,162 @@ struct smu_v13_0_6_dpm_map {
|
|||
uint32_t *freq_table;
|
||||
};
|
||||
|
||||
static inline void smu_v13_0_6_cap_set(struct smu_context *smu,
|
||||
enum smu_v13_0_6_caps cap)
|
||||
{
|
||||
struct smu_13_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
|
||||
|
||||
dpm_context->caps |= BIT_ULL(cap);
|
||||
}
|
||||
|
||||
static inline void smu_v13_0_6_cap_clear(struct smu_context *smu,
|
||||
enum smu_v13_0_6_caps cap)
|
||||
{
|
||||
struct smu_13_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
|
||||
|
||||
dpm_context->caps &= ~BIT_ULL(cap);
|
||||
}
|
||||
|
||||
static inline bool smu_v13_0_6_cap_supported(struct smu_context *smu,
|
||||
enum smu_v13_0_6_caps cap)
|
||||
{
|
||||
struct smu_13_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
|
||||
|
||||
return !!(dpm_context->caps & BIT_ULL(cap));
|
||||
}
|
||||
|
||||
static void smu_v13_0_14_init_caps(struct smu_context *smu)
|
||||
{
|
||||
enum smu_v13_0_6_caps default_cap_list[] = { SMU_CAP(DPM),
|
||||
SMU_CAP(UNI_METRICS),
|
||||
SMU_CAP(SET_UCLK_MAX),
|
||||
SMU_CAP(DPM_POLICY),
|
||||
SMU_CAP(PCIE_METRICS),
|
||||
SMU_CAP(CTF_LIMIT),
|
||||
SMU_CAP(MCA_DEBUG_MODE),
|
||||
SMU_CAP(RMA_MSG),
|
||||
SMU_CAP(ACA_SYND) };
|
||||
uint32_t fw_ver = smu->smc_fw_version;
|
||||
|
||||
for (int i = 0; i < ARRAY_SIZE(default_cap_list); i++)
|
||||
smu_v13_0_6_cap_set(smu, default_cap_list[i]);
|
||||
|
||||
if (fw_ver >= 0x05550E00)
|
||||
smu_v13_0_6_cap_set(smu, SMU_CAP(OTHER_END_METRICS));
|
||||
if (fw_ver >= 0x05551000)
|
||||
smu_v13_0_6_cap_set(smu, SMU_CAP(HST_LIMIT_METRICS));
|
||||
if (fw_ver >= 0x05550B00)
|
||||
smu_v13_0_6_cap_set(smu, SMU_CAP(PER_INST_METRICS));
|
||||
if (fw_ver >= 0x5551200)
|
||||
smu_v13_0_6_cap_set(smu, SMU_CAP(SDMA_RESET));
|
||||
}
|
||||
|
||||
static void smu_v13_0_12_init_caps(struct smu_context *smu)
|
||||
{
|
||||
enum smu_v13_0_6_caps default_cap_list[] = { SMU_CAP(DPM),
|
||||
SMU_CAP(UNI_METRICS),
|
||||
SMU_CAP(PCIE_METRICS),
|
||||
SMU_CAP(CTF_LIMIT),
|
||||
SMU_CAP(MCA_DEBUG_MODE),
|
||||
SMU_CAP(RMA_MSG),
|
||||
SMU_CAP(ACA_SYND) };
|
||||
uint32_t fw_ver = smu->smc_fw_version;
|
||||
|
||||
for (int i = 0; i < ARRAY_SIZE(default_cap_list); i++)
|
||||
smu_v13_0_6_cap_set(smu, default_cap_list[i]);
|
||||
|
||||
if (fw_ver < 0x00561900)
|
||||
smu_v13_0_6_cap_clear(smu, SMU_CAP(DPM));
|
||||
|
||||
if (fw_ver >= 0x00561700)
|
||||
smu_v13_0_6_cap_set(smu, SMU_CAP(SDMA_RESET));
|
||||
}
|
||||
|
||||
static void smu_v13_0_6_init_caps(struct smu_context *smu)
|
||||
{
|
||||
enum smu_v13_0_6_caps default_cap_list[] = { SMU_CAP(DPM),
|
||||
SMU_CAP(UNI_METRICS),
|
||||
SMU_CAP(SET_UCLK_MAX),
|
||||
SMU_CAP(DPM_POLICY),
|
||||
SMU_CAP(PCIE_METRICS),
|
||||
SMU_CAP(CTF_LIMIT),
|
||||
SMU_CAP(MCA_DEBUG_MODE),
|
||||
SMU_CAP(RMA_MSG),
|
||||
SMU_CAP(ACA_SYND) };
|
||||
struct amdgpu_device *adev = smu->adev;
|
||||
uint32_t fw_ver = smu->smc_fw_version;
|
||||
uint32_t pgm = (fw_ver >> 24) & 0xFF;
|
||||
|
||||
for (int i = 0; i < ARRAY_SIZE(default_cap_list); i++)
|
||||
smu_v13_0_6_cap_set(smu, default_cap_list[i]);
|
||||
|
||||
if (fw_ver < 0x552F00)
|
||||
smu_v13_0_6_cap_clear(smu, SMU_CAP(DPM));
|
||||
if (fw_ver < 0x554500)
|
||||
smu_v13_0_6_cap_clear(smu, SMU_CAP(CTF_LIMIT));
|
||||
|
||||
if (adev->flags & AMD_IS_APU) {
|
||||
smu_v13_0_6_cap_clear(smu, SMU_CAP(PCIE_METRICS));
|
||||
smu_v13_0_6_cap_clear(smu, SMU_CAP(DPM_POLICY));
|
||||
smu_v13_0_6_cap_clear(smu, SMU_CAP(RMA_MSG));
|
||||
smu_v13_0_6_cap_clear(smu, SMU_CAP(ACA_SYND));
|
||||
|
||||
if (fw_ver <= 0x4556900)
|
||||
smu_v13_0_6_cap_clear(smu, SMU_CAP(UNI_METRICS));
|
||||
if (fw_ver >= 0x04556F00)
|
||||
smu_v13_0_6_cap_set(smu, SMU_CAP(HST_LIMIT_METRICS));
|
||||
if (fw_ver >= 0x04556A00)
|
||||
smu_v13_0_6_cap_set(smu, SMU_CAP(PER_INST_METRICS));
|
||||
} else {
|
||||
if (fw_ver >= 0x557600)
|
||||
smu_v13_0_6_cap_set(smu, SMU_CAP(OTHER_END_METRICS));
|
||||
if (fw_ver < 0x00556000)
|
||||
smu_v13_0_6_cap_clear(smu, SMU_CAP(DPM_POLICY));
|
||||
if (amdgpu_sriov_vf(adev) && (fw_ver < 0x556600))
|
||||
smu_v13_0_6_cap_clear(smu, SMU_CAP(SET_UCLK_MAX));
|
||||
if (fw_ver < 0x556300)
|
||||
smu_v13_0_6_cap_clear(smu, SMU_CAP(PCIE_METRICS));
|
||||
if (fw_ver < 0x554800)
|
||||
smu_v13_0_6_cap_clear(smu, SMU_CAP(MCA_DEBUG_MODE));
|
||||
if (fw_ver >= 0x556F00)
|
||||
smu_v13_0_6_cap_set(smu, SMU_CAP(PER_INST_METRICS));
|
||||
if (fw_ver < 0x00555a00)
|
||||
smu_v13_0_6_cap_clear(smu, SMU_CAP(RMA_MSG));
|
||||
if (fw_ver < 0x00555600)
|
||||
smu_v13_0_6_cap_clear(smu, SMU_CAP(ACA_SYND));
|
||||
if (pgm == 0 && fw_ver >= 0x557900)
|
||||
smu_v13_0_6_cap_set(smu, SMU_CAP(HST_LIMIT_METRICS));
|
||||
}
|
||||
if (((pgm == 7) && (fw_ver >= 0x7550700)) ||
|
||||
((pgm == 0) && (fw_ver >= 0x00557900)) ||
|
||||
((pgm == 4) && (fw_ver >= 0x4557000)))
|
||||
smu_v13_0_6_cap_set(smu, SMU_CAP(SDMA_RESET));
|
||||
}
|
||||
|
||||
static void smu_v13_0_x_init_caps(struct smu_context *smu)
|
||||
{
|
||||
switch (amdgpu_ip_version(smu->adev, MP1_HWIP, 0)) {
|
||||
case IP_VERSION(13, 0, 12):
|
||||
return smu_v13_0_12_init_caps(smu);
|
||||
case IP_VERSION(13, 0, 14):
|
||||
return smu_v13_0_14_init_caps(smu);
|
||||
default:
|
||||
return smu_v13_0_6_init_caps(smu);
|
||||
}
|
||||
}
|
||||
|
||||
static int smu_v13_0_6_check_fw_version(struct smu_context *smu)
|
||||
{
|
||||
int r;
|
||||
|
||||
r = smu_v13_0_check_fw_version(smu);
|
||||
/* Initialize caps flags once fw version is fetched */
|
||||
if (!r)
|
||||
smu_v13_0_x_init_caps(smu);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static int smu_v13_0_6_init_microcode(struct smu_context *smu)
|
||||
{
|
||||
const struct smc_firmware_header_v2_1 *v2_1;
|
||||
|
@ -618,7 +759,7 @@ static int smu_v13_0_6_setup_driver_pptable(struct smu_context *smu)
|
|||
MetricsTableA_t *metrics_a = (MetricsTableA_t *)smu_table->metrics_table;
|
||||
struct PPTable_t *pptable =
|
||||
(struct PPTable_t *)smu_table->driver_pptable;
|
||||
bool flag = smu_v13_0_6_is_unified_metrics(smu);
|
||||
bool flag = !smu_v13_0_6_cap_supported(smu, SMU_CAP(UNI_METRICS));
|
||||
int ret, i, retry = 100;
|
||||
uint32_t table_version;
|
||||
|
||||
|
@ -814,8 +955,7 @@ static int smu_v13_0_6_set_default_dpm_table(struct smu_context *smu)
|
|||
smu_v13_0_6_setup_driver_pptable(smu);
|
||||
|
||||
/* DPM policy not supported in older firmwares */
|
||||
if (!(smu->adev->flags & AMD_IS_APU) &&
|
||||
(smu->smc_fw_version < 0x00556000)) {
|
||||
if (!smu_v13_0_6_cap_supported(smu, SMU_CAP(DPM_POLICY))) {
|
||||
struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
|
||||
|
||||
smu_dpm->dpm_policies->policy_mask &=
|
||||
|
@ -992,7 +1132,7 @@ static int smu_v13_0_6_get_smu_metrics_data(struct smu_context *smu,
|
|||
struct smu_table_context *smu_table = &smu->smu_table;
|
||||
MetricsTableX_t *metrics_x = (MetricsTableX_t *)smu_table->metrics_table;
|
||||
MetricsTableA_t *metrics_a = (MetricsTableA_t *)smu_table->metrics_table;
|
||||
bool flag = smu_v13_0_6_is_unified_metrics(smu);
|
||||
bool flag = !smu_v13_0_6_cap_supported(smu, SMU_CAP(UNI_METRICS));
|
||||
struct amdgpu_device *adev = smu->adev;
|
||||
int ret = 0;
|
||||
int xcc_id;
|
||||
|
@ -1005,7 +1145,7 @@ static int smu_v13_0_6_get_smu_metrics_data(struct smu_context *smu,
|
|||
switch (member) {
|
||||
case METRICS_CURR_GFXCLK:
|
||||
case METRICS_AVERAGE_GFXCLK:
|
||||
if (smu->smc_fw_version >= 0x552F00) {
|
||||
if (smu_v13_0_6_cap_supported(smu, SMU_CAP(DPM))) {
|
||||
xcc_id = GET_INST(GC, 0);
|
||||
*value = SMUQ10_ROUND(GET_METRIC_FIELD(GfxclkFrequency, flag)[xcc_id]);
|
||||
} else {
|
||||
|
@ -1692,7 +1832,7 @@ static int smu_v13_0_6_notify_unload(struct smu_context *smu)
|
|||
static int smu_v13_0_6_mca_set_debug_mode(struct smu_context *smu, bool enable)
|
||||
{
|
||||
/* NOTE: this ClearMcaOnRead message is only supported for smu version 85.72.0 or higher */
|
||||
if (smu->smc_fw_version < 0x554800)
|
||||
if (!smu_v13_0_6_cap_supported(smu, SMU_CAP(MCA_DEBUG_MODE)))
|
||||
return 0;
|
||||
|
||||
return smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_ClearMcaOnRead,
|
||||
|
@ -1837,9 +1977,8 @@ static int smu_v13_0_6_set_soft_freq_limited_range(struct smu_context *smu,
|
|||
if (max == pstate_table->uclk_pstate.curr.max)
|
||||
return 0;
|
||||
/* For VF, only allowed in FW versions 85.102 or greater */
|
||||
if (amdgpu_sriov_vf(adev) &&
|
||||
((smu->smc_fw_version < 0x556600) ||
|
||||
(adev->flags & AMD_IS_APU)))
|
||||
if (!smu_v13_0_6_cap_supported(smu,
|
||||
SMU_CAP(SET_UCLK_MAX)))
|
||||
return -EOPNOTSUPP;
|
||||
/* Only max clock limiting is allowed for UCLK */
|
||||
ret = smu_v13_0_set_soft_freq_limited_range(
|
||||
|
@ -2043,7 +2182,7 @@ static int smu_v13_0_6_get_enabled_mask(struct smu_context *smu,
|
|||
|
||||
ret = smu_cmn_get_enabled_mask(smu, feature_mask);
|
||||
|
||||
if (ret == -EIO && smu->smc_fw_version < 0x552F00) {
|
||||
if (ret == -EIO && !smu_v13_0_6_cap_supported(smu, SMU_CAP(DPM))) {
|
||||
*feature_mask = 0;
|
||||
ret = 0;
|
||||
}
|
||||
|
@ -2336,11 +2475,10 @@ static int smu_v13_0_6_get_current_pcie_link_speed(struct smu_context *smu)
|
|||
|
||||
static ssize_t smu_v13_0_6_get_gpu_metrics(struct smu_context *smu, void **table)
|
||||
{
|
||||
bool per_inst, smu_13_0_6_per_inst, smu_13_0_14_per_inst, apu_per_inst;
|
||||
struct smu_table_context *smu_table = &smu->smu_table;
|
||||
struct gpu_metrics_v1_7 *gpu_metrics =
|
||||
(struct gpu_metrics_v1_7 *)smu_table->gpu_metrics_table;
|
||||
bool flag = smu_v13_0_6_is_unified_metrics(smu);
|
||||
bool flag = !smu_v13_0_6_cap_supported(smu, SMU_CAP(UNI_METRICS));
|
||||
int ret = 0, xcc_id, inst, i, j, k, idx;
|
||||
struct amdgpu_device *adev = smu->adev;
|
||||
MetricsTableX_t *metrics_x;
|
||||
|
@ -2348,6 +2486,7 @@ static ssize_t smu_v13_0_6_get_gpu_metrics(struct smu_context *smu, void **table
|
|||
struct amdgpu_xcp *xcp;
|
||||
u16 link_width_level;
|
||||
u32 inst_mask;
|
||||
bool per_inst;
|
||||
|
||||
metrics_x = kzalloc(max(sizeof(MetricsTableX_t), sizeof(MetricsTableA_t)), GFP_KERNEL);
|
||||
ret = smu_v13_0_6_get_metrics_table(smu, metrics_x, true);
|
||||
|
@ -2421,7 +2560,7 @@ static ssize_t smu_v13_0_6_get_gpu_metrics(struct smu_context *smu, void **table
|
|||
* table for both pf & one vf for smu version 85.99.0 or higher else report only
|
||||
* for pf from registers
|
||||
*/
|
||||
if (smu->smc_fw_version >= 0x556300) {
|
||||
if (smu_v13_0_6_cap_supported(smu, SMU_CAP(PCIE_METRICS))) {
|
||||
gpu_metrics->pcie_link_width = metrics_x->PCIeLinkWidth;
|
||||
gpu_metrics->pcie_link_speed =
|
||||
pcie_gen_to_speed(metrics_x->PCIeLinkSpeed);
|
||||
|
@ -2450,7 +2589,7 @@ static ssize_t smu_v13_0_6_get_gpu_metrics(struct smu_context *smu, void **table
|
|||
metrics_x->PCIeNAKSentCountAcc;
|
||||
gpu_metrics->pcie_nak_rcvd_count_acc =
|
||||
metrics_x->PCIeNAKReceivedCountAcc;
|
||||
if (smu_v13_0_6_is_other_end_count_available(smu))
|
||||
if (smu_v13_0_6_cap_supported(smu, SMU_CAP(OTHER_END_METRICS)))
|
||||
gpu_metrics->pcie_lc_perf_other_end_recovery =
|
||||
metrics_x->PCIeOtherEndRecoveryAcc;
|
||||
|
||||
|
@ -2475,17 +2614,7 @@ static ssize_t smu_v13_0_6_get_gpu_metrics(struct smu_context *smu, void **table
|
|||
|
||||
gpu_metrics->num_partition = adev->xcp_mgr->num_xcps;
|
||||
|
||||
apu_per_inst = (adev->flags & AMD_IS_APU) && (smu->smc_fw_version >= 0x04556A00);
|
||||
smu_13_0_6_per_inst = !(adev->flags & AMD_IS_APU) &&
|
||||
(amdgpu_ip_version(smu->adev, MP1_HWIP, 0)
|
||||
== IP_VERSION(13, 0, 6)) &&
|
||||
(smu->smc_fw_version >= 0x556F00);
|
||||
smu_13_0_14_per_inst = !(adev->flags & AMD_IS_APU) &&
|
||||
(amdgpu_ip_version(smu->adev, MP1_HWIP, 0)
|
||||
== IP_VERSION(13, 0, 14)) &&
|
||||
(smu->smc_fw_version >= 0x05550B00);
|
||||
|
||||
per_inst = apu_per_inst || smu_13_0_6_per_inst || smu_13_0_14_per_inst;
|
||||
per_inst = smu_v13_0_6_cap_supported(smu, SMU_CAP(PER_INST_METRICS));
|
||||
|
||||
for_each_xcp(adev->xcp_mgr, xcp, i) {
|
||||
amdgpu_xcp_get_inst_details(xcp, AMDGPU_XCP_VCN, &inst_mask);
|
||||
|
@ -2516,7 +2645,8 @@ static ssize_t smu_v13_0_6_get_gpu_metrics(struct smu_context *smu, void **table
|
|||
gpu_metrics->xcp_stats[i].gfx_busy_acc[idx] =
|
||||
SMUQ10_ROUND(metrics_x->GfxBusyAcc[inst]);
|
||||
|
||||
if (smu_v13_0_6_is_blw_host_limit_available(smu))
|
||||
if (smu_v13_0_6_cap_supported(
|
||||
smu, SMU_CAP(HST_LIMIT_METRICS)))
|
||||
gpu_metrics->xcp_stats[i].gfx_below_host_limit_acc[idx] =
|
||||
SMUQ10_ROUND(metrics_x->GfxclkBelowHostLimitAcc
|
||||
[inst]);
|
||||
|
@ -2624,7 +2754,7 @@ static int smu_v13_0_6_get_thermal_temperature_range(struct smu_context *smu,
|
|||
return -EINVAL;
|
||||
|
||||
/*Check smu version, GetCtfLimit message only supported for smu version 85.69 or higher */
|
||||
if (smu->smc_fw_version < 0x554500)
|
||||
if (!smu_v13_0_6_cap_supported(smu, SMU_CAP(CTF_LIMIT)))
|
||||
return 0;
|
||||
|
||||
/* Get SOC Max operating temperature */
|
||||
|
@ -2726,11 +2856,10 @@ static int smu_v13_0_6_smu_send_hbm_bad_page_num(struct smu_context *smu,
|
|||
|
||||
static int smu_v13_0_6_send_rma_reason(struct smu_context *smu)
|
||||
{
|
||||
struct amdgpu_device *adev = smu->adev;
|
||||
int ret;
|
||||
|
||||
/* NOTE: the message is only valid on dGPU with pmfw 85.90.0 and above */
|
||||
if ((adev->flags & AMD_IS_APU) || smu->smc_fw_version < 0x00555a00)
|
||||
if (!smu_v13_0_6_cap_supported(smu, SMU_CAP(RMA_MSG)))
|
||||
return 0;
|
||||
|
||||
ret = smu_cmn_send_smc_msg(smu, SMU_MSG_RmaDueToBadPageThreshold, NULL);
|
||||
|
@ -2744,31 +2873,13 @@ static int smu_v13_0_6_send_rma_reason(struct smu_context *smu)
|
|||
|
||||
static int smu_v13_0_6_reset_sdma(struct smu_context *smu, uint32_t inst_mask)
|
||||
{
|
||||
uint32_t smu_program;
|
||||
int ret = 0;
|
||||
|
||||
smu_program = (smu->smc_fw_version >> 24) & 0xff;
|
||||
switch (amdgpu_ip_version(smu->adev, MP1_HWIP, 0)) {
|
||||
case IP_VERSION(13, 0, 6):
|
||||
if (((smu_program == 7) && (smu->smc_fw_version > 0x07550700)) ||
|
||||
((smu_program == 0) && (smu->smc_fw_version > 0x00557700)))
|
||||
ret = smu_cmn_send_smc_msg_with_param(smu,
|
||||
SMU_MSG_ResetSDMA, inst_mask, NULL);
|
||||
else if ((smu_program == 4) &&
|
||||
(smu->smc_fw_version > 0x4556e6c))
|
||||
ret = smu_cmn_send_smc_msg_with_param(smu,
|
||||
SMU_MSG_ResetSDMA2, inst_mask, NULL);
|
||||
break;
|
||||
case IP_VERSION(13, 0, 14):
|
||||
if ((smu_program == 5) &&
|
||||
(smu->smc_fw_version > 0x05550f00))
|
||||
ret = smu_cmn_send_smc_msg_with_param(smu,
|
||||
SMU_MSG_ResetSDMA2, inst_mask, NULL);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (!smu_v13_0_6_cap_supported(smu, SMU_CAP(SDMA_RESET)))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
ret = smu_cmn_send_smc_msg_with_param(smu,
|
||||
SMU_MSG_ResetSDMA, inst_mask, NULL);
|
||||
if (ret)
|
||||
dev_err(smu->adev->dev,
|
||||
"failed to send ResetSDMA event with mask 0x%x\n",
|
||||
|
@ -3087,7 +3198,7 @@ static bool mca_smu_bank_is_valid(const struct mca_ras_info *mca_ras, struct amd
|
|||
if (instlo != 0x03b30400)
|
||||
return false;
|
||||
|
||||
if (!(adev->flags & AMD_IS_APU) && smu->smc_fw_version >= 0x00555600) {
|
||||
if (smu_v13_0_6_cap_supported(smu, SMU_CAP(ACA_SYND))) {
|
||||
errcode = MCA_REG__SYND__ERRORINFORMATION(entry->regs[MCA_REG_IDX_SYND]);
|
||||
errcode &= 0xff;
|
||||
} else {
|
||||
|
@ -3373,9 +3484,10 @@ static int aca_smu_get_valid_aca_bank(struct amdgpu_device *adev,
|
|||
|
||||
static int aca_smu_parse_error_code(struct amdgpu_device *adev, struct aca_bank *bank)
|
||||
{
|
||||
struct smu_context *smu = adev->powerplay.pp_handle;
|
||||
int error_code;
|
||||
|
||||
if (!(adev->flags & AMD_IS_APU) && adev->pm.fw_version >= 0x00555600)
|
||||
if (smu_v13_0_6_cap_supported(smu, SMU_CAP(ACA_SYND)))
|
||||
error_code = ACA_REG__SYND__ERRORINFORMATION(bank->regs[ACA_REG_IDX_SYND]);
|
||||
else
|
||||
error_code = ACA_REG__STATUS__ERRORCODE(bank->regs[ACA_REG_IDX_STATUS]);
|
||||
|
@ -3413,7 +3525,7 @@ static const struct pptable_funcs smu_v13_0_6_ppt_funcs = {
|
|||
.fini_power = smu_v13_0_fini_power,
|
||||
.check_fw_status = smu_v13_0_6_check_fw_status,
|
||||
/* pptable related */
|
||||
.check_fw_version = smu_v13_0_check_fw_version,
|
||||
.check_fw_version = smu_v13_0_6_check_fw_version,
|
||||
.set_driver_table_location = smu_v13_0_set_driver_table_location,
|
||||
.set_tool_table_location = smu_v13_0_set_tool_table_location,
|
||||
.notify_memory_pool_location = smu_v13_0_notify_memory_pool_location,
|
||||
|
|
|
@ -743,6 +743,15 @@ retry:
|
|||
if ((conn_configured & mask) != mask && conn_configured != conn_seq)
|
||||
goto retry;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
struct drm_connector *connector = connectors[i];
|
||||
|
||||
if (connector->has_tile)
|
||||
drm_client_get_tile_offsets(dev, connectors, connector_count,
|
||||
modes, offsets, i,
|
||||
connector->tile_h_loc, connector->tile_v_loc);
|
||||
}
|
||||
|
||||
/*
|
||||
* If the BIOS didn't enable everything it could, fall back to have the
|
||||
* same user experiencing of lighting up as much as possible like the
|
||||
|
|
|
@ -1354,14 +1354,14 @@ int drm_fb_helper_set_par(struct fb_info *info)
|
|||
}
|
||||
EXPORT_SYMBOL(drm_fb_helper_set_par);
|
||||
|
||||
static void pan_set(struct drm_fb_helper *fb_helper, int x, int y)
|
||||
static void pan_set(struct drm_fb_helper *fb_helper, int dx, int dy)
|
||||
{
|
||||
struct drm_mode_set *mode_set;
|
||||
|
||||
mutex_lock(&fb_helper->client.modeset_mutex);
|
||||
drm_client_for_each_modeset(mode_set, &fb_helper->client) {
|
||||
mode_set->x = x;
|
||||
mode_set->y = y;
|
||||
mode_set->x += dx;
|
||||
mode_set->y += dy;
|
||||
}
|
||||
mutex_unlock(&fb_helper->client.modeset_mutex);
|
||||
}
|
||||
|
@ -1370,16 +1370,18 @@ static int pan_display_atomic(struct fb_var_screeninfo *var,
|
|||
struct fb_info *info)
|
||||
{
|
||||
struct drm_fb_helper *fb_helper = info->par;
|
||||
int ret;
|
||||
int ret, dx, dy;
|
||||
|
||||
pan_set(fb_helper, var->xoffset, var->yoffset);
|
||||
dx = var->xoffset - info->var.xoffset;
|
||||
dy = var->yoffset - info->var.yoffset;
|
||||
pan_set(fb_helper, dx, dy);
|
||||
|
||||
ret = drm_client_modeset_commit_locked(&fb_helper->client);
|
||||
if (!ret) {
|
||||
info->var.xoffset = var->xoffset;
|
||||
info->var.yoffset = var->yoffset;
|
||||
} else
|
||||
pan_set(fb_helper, info->var.xoffset, info->var.yoffset);
|
||||
pan_set(fb_helper, -dx, -dy);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -757,7 +757,6 @@ static void bochs_pci_remove(struct pci_dev *pdev)
|
|||
|
||||
drm_dev_unplug(dev);
|
||||
drm_atomic_helper_shutdown(dev);
|
||||
drm_dev_put(dev);
|
||||
}
|
||||
|
||||
static void bochs_pci_shutdown(struct pci_dev *pdev)
|
||||
|
|
|
@ -107,8 +107,10 @@ v3d_irq(int irq, void *arg)
|
|||
|
||||
v3d_job_update_stats(&v3d->bin_job->base, V3D_BIN);
|
||||
trace_v3d_bcl_irq(&v3d->drm, fence->seqno);
|
||||
dma_fence_signal(&fence->base);
|
||||
|
||||
v3d->bin_job = NULL;
|
||||
dma_fence_signal(&fence->base);
|
||||
|
||||
status = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
@ -118,8 +120,10 @@ v3d_irq(int irq, void *arg)
|
|||
|
||||
v3d_job_update_stats(&v3d->render_job->base, V3D_RENDER);
|
||||
trace_v3d_rcl_irq(&v3d->drm, fence->seqno);
|
||||
dma_fence_signal(&fence->base);
|
||||
|
||||
v3d->render_job = NULL;
|
||||
dma_fence_signal(&fence->base);
|
||||
|
||||
status = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
@ -129,8 +133,10 @@ v3d_irq(int irq, void *arg)
|
|||
|
||||
v3d_job_update_stats(&v3d->csd_job->base, V3D_CSD);
|
||||
trace_v3d_csd_irq(&v3d->drm, fence->seqno);
|
||||
dma_fence_signal(&fence->base);
|
||||
|
||||
v3d->csd_job = NULL;
|
||||
dma_fence_signal(&fence->base);
|
||||
|
||||
status = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
@ -167,8 +173,10 @@ v3d_hub_irq(int irq, void *arg)
|
|||
|
||||
v3d_job_update_stats(&v3d->tfu_job->base, V3D_TFU);
|
||||
trace_v3d_tfu_irq(&v3d->drm, fence->seqno);
|
||||
dma_fence_signal(&fence->base);
|
||||
|
||||
v3d->tfu_job = NULL;
|
||||
dma_fence_signal(&fence->base);
|
||||
|
||||
status = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
|
|
@ -189,10 +189,11 @@ static void virtgpu_dma_buf_free_obj(struct drm_gem_object *obj)
|
|||
struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(obj);
|
||||
struct virtio_gpu_device *vgdev = obj->dev->dev_private;
|
||||
struct dma_buf_attachment *attach = obj->import_attach;
|
||||
struct dma_resv *resv = attach->dmabuf->resv;
|
||||
|
||||
if (attach) {
|
||||
dma_resv_lock(resv, NULL);
|
||||
struct dma_buf *dmabuf = attach->dmabuf;
|
||||
|
||||
dma_resv_lock(dmabuf->resv, NULL);
|
||||
|
||||
virtio_gpu_detach_object_fenced(bo);
|
||||
|
||||
|
@ -200,10 +201,10 @@ static void virtgpu_dma_buf_free_obj(struct drm_gem_object *obj)
|
|||
dma_buf_unmap_attachment(attach, bo->sgt,
|
||||
DMA_BIDIRECTIONAL);
|
||||
|
||||
dma_resv_unlock(resv);
|
||||
dma_resv_unlock(dmabuf->resv);
|
||||
|
||||
dma_buf_detach(attach->dmabuf, attach);
|
||||
dma_buf_put(attach->dmabuf);
|
||||
dma_buf_detach(dmabuf, attach);
|
||||
dma_buf_put(dmabuf);
|
||||
}
|
||||
|
||||
if (bo->created) {
|
||||
|
|
|
@ -1564,7 +1564,7 @@ static void zynqmp_dp_bridge_atomic_enable(struct drm_bridge *bridge,
|
|||
|
||||
pm_runtime_get_sync(dp->dev);
|
||||
|
||||
mutex_lock(&dp->lock);
|
||||
guard(mutex)(&dp->lock);
|
||||
zynqmp_dp_disp_enable(dp, old_bridge_state);
|
||||
|
||||
/*
|
||||
|
@ -1624,7 +1624,6 @@ static void zynqmp_dp_bridge_atomic_enable(struct drm_bridge *bridge,
|
|||
zynqmp_dp_write(dp, ZYNQMP_DP_SOFTWARE_RESET,
|
||||
ZYNQMP_DP_SOFTWARE_RESET_ALL);
|
||||
zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_ENABLE, 1);
|
||||
mutex_unlock(&dp->lock);
|
||||
}
|
||||
|
||||
static void zynqmp_dp_bridge_atomic_disable(struct drm_bridge *bridge,
|
||||
|
|
|
@ -60,6 +60,7 @@ struct zynqmp_dpsub_audio;
|
|||
* @layers: Video and graphics layers
|
||||
* @dp: The DisplayPort controller
|
||||
* @dma_align: DMA alignment constraint (must be a power of 2)
|
||||
* @audio: DP audio data
|
||||
*/
|
||||
struct zynqmp_dpsub {
|
||||
struct device *dev;
|
||||
|
|
|
@ -1131,7 +1131,6 @@ config CGROUP_PIDS
|
|||
|
||||
config CGROUP_RDMA
|
||||
bool "RDMA controller"
|
||||
select PAGE_COUNTER
|
||||
help
|
||||
Provides enforcement of RDMA resources defined by IB stack.
|
||||
It is fairly easy for consumers to exhaust RDMA resources, which
|
||||
|
|
Loading…
Add table
Reference in a new issue