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:
Linus Torvalds 2025-01-27 17:17:16 -08:00
commit 7d6e5b5258
47 changed files with 1737 additions and 1388 deletions

View File

@ -144,6 +144,4 @@ Internals
.. kernel-doc:: drivers/gpu/drm/xlnx/zynqmp_dp.c .. 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 .. kernel-doc:: drivers/gpu/drm/xlnx/zynqmp_kms.c

View File

@ -294,6 +294,7 @@ config DRM_TTM_HELPER
tristate tristate
depends on DRM depends on DRM
select DRM_TTM select DRM_TTM
select DRM_KMS_HELPER if DRM_FBDEV_EMULATION
select FB_CORE if DRM_FBDEV_EMULATION select FB_CORE if DRM_FBDEV_EMULATION
select FB_SYSMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION select FB_SYSMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION
help help
@ -302,6 +303,7 @@ config DRM_TTM_HELPER
config DRM_GEM_DMA_HELPER config DRM_GEM_DMA_HELPER
tristate tristate
depends on DRM depends on DRM
select DRM_KMS_HELPER if DRM_FBDEV_EMULATION
select FB_CORE if DRM_FBDEV_EMULATION select FB_CORE if DRM_FBDEV_EMULATION
select FB_DMAMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION select FB_DMAMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION
help help
@ -310,6 +312,7 @@ config DRM_GEM_DMA_HELPER
config DRM_GEM_SHMEM_HELPER config DRM_GEM_SHMEM_HELPER
tristate tristate
depends on DRM && MMU depends on DRM && MMU
select DRM_KMS_HELPER if DRM_FBDEV_EMULATION
select FB_CORE if DRM_FBDEV_EMULATION select FB_CORE if DRM_FBDEV_EMULATION
select FB_SYSMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION select FB_SYSMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION
help help

View File

@ -2365,8 +2365,8 @@ int amdgpu_device_ip_block_add(struct amdgpu_device *adev,
break; break;
} }
DRM_INFO("add ip block number %d <%s>\n", adev->num_ip_blocks, dev_info(adev->dev, "detected ip block number %d <%s>\n",
ip_block_version->funcs->name); adev->num_ip_blocks, ip_block_version->funcs->name);
adev->ip_blocks[adev->num_ip_blocks].adev = adev; 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 * 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) 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 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) if (amdgpu_pcie_gen_cap)
adev->pm.pcie_gen_mask = 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, amdgpu_device_partner_bandwidth(adev, &platform_speed_cap,
&platform_link_width); &platform_link_width);
amdgpu_device_gpu_bandwidth(adev, &speed_cap, &link_width);
if (adev->pm.pcie_gen_mask == 0) { if (adev->pm.pcie_gen_mask == 0) {
/* asic caps */ /* asic caps */
pdev = adev->pdev;
speed_cap = pcie_get_speed_cap(pdev);
if (speed_cap == PCI_SPEED_UNKNOWN) { if (speed_cap == PCI_SPEED_UNKNOWN) {
adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 | adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 | 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) { 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) { if (platform_link_width == PCIE_LNK_WIDTH_UNKNOWN) {
adev->pm.pcie_mlw_mask |= AMDGPU_DEFAULT_PCIE_MLW_MASK; adev->pm.pcie_mlw_mask |= AMDGPU_DEFAULT_PCIE_MLW_MASK;
} else { } else {
switch (platform_link_width) { switch (platform_link_width) {
case PCIE_LNK_X32: case PCIE_LNK_X32:
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 | adev->pm.pcie_mlw_mask |= (CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 |
CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 | CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 | CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 | CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 | CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
break; break;
case PCIE_LNK_X16: case PCIE_LNK_X16:
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 | adev->pm.pcie_mlw_mask |= (CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 | CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 | CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 | CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
break; break;
case PCIE_LNK_X12: case PCIE_LNK_X12:
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 | adev->pm.pcie_mlw_mask |= (CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 | CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 | CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
break; break;
case PCIE_LNK_X8: case PCIE_LNK_X8:
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 | adev->pm.pcie_mlw_mask |= (CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 | CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
break; break;
case PCIE_LNK_X4: case PCIE_LNK_X4:
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 | adev->pm.pcie_mlw_mask |= (CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
break; break;
case PCIE_LNK_X2: case PCIE_LNK_X2:
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | adev->pm.pcie_mlw_mask |= (CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
break; break;
case PCIE_LNK_X1: 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; break;
default: default:
break; break;

View File

@ -280,7 +280,7 @@ module_param_named(gartsize, amdgpu_gart_size, uint, 0600);
/** /**
* DOC: gttsize (int) * DOC: gttsize (int)
* Restrict the size of GTT domain (for userspace use) in MiB for testing. * 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_PARM_DESC(gttsize, "Size of the GTT userspace domain in megabytes (-1 = auto)");
module_param_named(gttsize, amdgpu_gtt_size, int, 0600); 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). * 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_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) * 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). * 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_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) * 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). * 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_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) * 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). * 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_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) * DOC: ras_enable (int)
@ -730,7 +730,7 @@ module_param_named(noretry, amdgpu_noretry, int, 0644);
*/ */
MODULE_PARM_DESC(force_asic_type, MODULE_PARM_DESC(force_asic_type,
"A non negative value used to specify the asic type for all supported GPUs"); "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) * 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. * assigns queues to HQDs.
*/ */
int sched_policy = KFD_SCHED_POLICY_HWS; 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, MODULE_PARM_DESC(sched_policy,
"Scheduling policy (0 = HWS (Default), 1 = HWS without over-subscription, 2 = Non-HWS (Used for debugging only)"); "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. * Setting 1 enables halt on hang.
*/ */
int halt_if_hws_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)"); 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). * check says. Default value: false (rely on MEC2 firmware version check).
*/ */
bool hws_gws_support; 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)"); 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; 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_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 #endif
/** /**
@ -849,7 +849,7 @@ module_param_named(no_queue_eviction_on_vm_fault, amdgpu_no_queue_eviction_on_vm
*/ */
int amdgpu_mtype_local; int amdgpu_mtype_local;
MODULE_PARM_DESC(mtype_local, "MTYPE for local memory (0 = MTYPE_RW (default), 1 = MTYPE_NC, 2 = MTYPE_CC)"); 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) * 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) * 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_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 * 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 * - 0x4: Disable GPU soft recovery, always do a full reset
*/ */
MODULE_PARM_DESC(debug_mask, "debug options for amdgpu, disabled by default"); 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) * DOC: agp (int)

View File

@ -297,7 +297,7 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned int num_ibs,
amdgpu_ring_patch_cond_exec(ring, cond_exec); amdgpu_ring_patch_cond_exec(ring, cond_exec);
ring->current_ctx = fence_ctx; 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); amdgpu_ring_emit_switch_buffer(ring);
if (ring->funcs->emit_wave_limit && if (ring->funcs->emit_wave_limit &&

View File

@ -846,7 +846,7 @@ out:
case AMDGPU_INFO_DEV_INFO: { case AMDGPU_INFO_DEV_INFO: {
struct drm_amdgpu_info_device *dev_info; struct drm_amdgpu_info_device *dev_info;
uint64_t vm_size; 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); dev_info = kzalloc(sizeof(*dev_info), GFP_KERNEL);
if (!dev_info) if (!dev_info)
@ -934,15 +934,18 @@ out:
dev_info->tcc_disabled_mask = adev->gfx.config.tcc_disabled_mask; dev_info->tcc_disabled_mask = adev->gfx.config.tcc_disabled_mask;
/* Combine the chip gen mask with the platform (CPU/mobo) 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_gen = fls(pcie_gen_mask);
dev_info->pcie_num_lanes = dev_info->pcie_num_lanes =
adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 ? 32 : pcie_width_mask & CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X32 ? 32 :
adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 ? 16 : pcie_width_mask & CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X16 ? 16 :
adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 ? 12 : pcie_width_mask & CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X12 ? 12 :
adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 ? 8 : pcie_width_mask & CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X8 ? 8 :
adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 ? 4 : pcie_width_mask & CAIL_ASIC_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_X2 ? 2 : 1;
dev_info->tcp_cache_size = adev->gfx.config.gc_tcp_l1_size; 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; dev_info->num_sqc_per_wgp = adev->gfx.config.gc_num_sqc_per_wgp;

View File

@ -40,7 +40,7 @@
#define AMDGPU_MES_VERSION_MASK 0x00000fff #define AMDGPU_MES_VERSION_MASK 0x00000fff
#define AMDGPU_MES_API_VERSION_MASK 0x00fff000 #define AMDGPU_MES_API_VERSION_MASK 0x00fff000
#define AMDGPU_MES_FEAT_VERSION_MASK 0xff000000 #define AMDGPU_MES_FEAT_VERSION_MASK 0xff000000
#define AMDGPU_MES_MSCRATCH_SIZE 0x8000 #define AMDGPU_MES_MSCRATCH_SIZE 0x40000
enum amdgpu_mes_priority_level { enum amdgpu_mes_priority_level {
AMDGPU_MES_PRIORITY_LEVEL_LOW = 0, AMDGPU_MES_PRIORITY_LEVEL_LOW = 0,

View File

@ -107,6 +107,7 @@ struct amdgpu_sdma {
struct amdgpu_irq_src doorbell_invalid_irq; struct amdgpu_irq_src doorbell_invalid_irq;
struct amdgpu_irq_src pool_timeout_irq; struct amdgpu_irq_src pool_timeout_irq;
struct amdgpu_irq_src srbm_write_irq; struct amdgpu_irq_src srbm_write_irq;
struct amdgpu_irq_src ctxt_empty_irq;
int num_instances; int num_instances;
uint32_t sdma_mask; uint32_t sdma_mask;

View File

@ -427,7 +427,7 @@ void amdgpu_xcp_release_sched(struct amdgpu_device *adev,
return; return;
sched = entity->entity.rq->sched; sched = entity->entity.rq->sched;
if (sched->ready) { if (drm_sched_wqueue_ready(sched)) {
ring = to_amdgpu_ring(entity->entity.rq->sched); ring = to_amdgpu_ring(entity->entity.rq->sched);
atomic_dec(&adev->xcp_mgr->xcp[ring->xcp_id].ref_cnt); atomic_dec(&adev->xcp_mgr->xcp[ring->xcp_id].ref_cnt);
} }

View File

@ -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)) { 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: default:
adev->gfx.enable_cleaner_shader = false; adev->gfx.enable_cleaner_shader = false;
break; break;

View File

@ -756,7 +756,8 @@ static int mes_v12_0_set_hw_resources(struct amdgpu_mes *mes, int pipe)
if (amdgpu_mes_log_enable) { if (amdgpu_mes_log_enable) {
mes_set_hw_res_pkt.enable_mes_event_int_logging = 1; 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) if (enforce_isolation)
@ -983,29 +984,50 @@ static void mes_v12_0_enable(struct amdgpu_device *adev, bool enable)
uint32_t pipe, data = 0; uint32_t pipe, data = 0;
if (enable) { 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); mutex_lock(&adev->srbm_mutex);
for (pipe = 0; pipe < AMDGPU_MAX_MES_PIPES; pipe++) { for (pipe = 0; pipe < AMDGPU_MAX_MES_PIPES; pipe++) {
soc21_grbm_select(adev, 3, pipe, 0, 0); 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; ucode_addr = adev->mes.uc_start_addr[pipe] >> 2;
WREG32_SOC15(GC, 0, regCP_MES_PRGRM_CNTR_START, WREG32_SOC15(GC, 0, regCP_MES_PRGRM_CNTR_START,
lower_32_bits(ucode_addr)); lower_32_bits(ucode_addr));
WREG32_SOC15(GC, 0, regCP_MES_PRGRM_CNTR_START_HI, WREG32_SOC15(GC, 0, regCP_MES_PRGRM_CNTR_START_HI,
upper_32_bits(ucode_addr)); 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); soc21_grbm_select(adev, 0, 0, 0, 0);
mutex_unlock(&adev->srbm_mutex); 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) if (amdgpu_emu_mode)
msleep(100); msleep(100);
else if (adev->enable_uni_mes) 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.kiq_hw_fini = &mes_v12_0_kiq_hw_fini;
adev->mes.enable_legacy_queue_map = true; 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); r = amdgpu_mes_init(adev);
if (r) if (r)
return r; return r;

View File

@ -1406,6 +1406,12 @@ static int sdma_v4_4_2_sw_init(struct amdgpu_ip_block *ip_block)
&adev->sdma.srbm_write_irq); &adev->sdma.srbm_write_irq);
if (r) if (r)
return 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++) { 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; 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( static void sdma_v4_4_2_inst_update_medium_grain_light_sleep(
struct amdgpu_device *adev, bool enable, uint32_t inst_mask) 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, .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) static void sdma_v4_4_2_set_irq_funcs(struct amdgpu_device *adev)
{ {
adev->sdma.trap_irq.num_types = adev->sdma.num_instances; 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.doorbell_invalid_irq.num_types = adev->sdma.num_instances;
adev->sdma.pool_timeout_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.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.trap_irq.funcs = &sdma_v4_4_2_trap_irq_funcs;
adev->sdma.illegal_inst_irq.funcs = &sdma_v4_4_2_illegal_inst_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.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.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.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

View File

@ -447,7 +447,9 @@ L_SAVE:
s_getreg_b32 s_save_m0, hwreg(HW_REG_MODE) //MODE 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) 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 */ /* 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 s_and_b32 s_save_tmp, s_save_spi_init_hi, S_SAVE_SPI_INIT_FIRST_WAVE_MASK // extract fisrt wave bit

View File

@ -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, struct migrate_vma *migrate, struct dma_fence **mfence,
dma_addr_t *scratch, uint64_t ttm_res_offset) 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 amdgpu_device *adev = node->adev;
struct device *dev = adev->dev; struct device *dev = adev->dev;
struct amdgpu_res_cursor cursor; struct amdgpu_res_cursor cursor;
uint64_t mpages = 0;
dma_addr_t *src; dma_addr_t *src;
uint64_t *dst; uint64_t *dst;
uint64_t i, j; 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, amdgpu_res_first(prange->ttm_res, ttm_res_offset,
npages << PAGE_SHIFT, &cursor); npages << PAGE_SHIFT, &cursor);
for (i = j = 0; i < npages; i++) { for (i = j = 0; (i < npages) && (mpages < migrate->cpages); i++) {
struct page *spage; struct page *spage;
dst[i] = cursor.start + (j << PAGE_SHIFT); if (migrate->src[i] & MIGRATE_PFN_MIGRATE) {
migrate->dst[i] = svm_migrate_addr_to_pfn(adev, dst[i]); dst[i] = cursor.start + (j << PAGE_SHIFT);
svm_migrate_get_vram_page(prange, migrate->dst[i]); migrate->dst[i] = svm_migrate_addr_to_pfn(adev, dst[i]);
migrate->dst[i] = migrate_pfn(migrate->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]); spage = migrate_pfn_to_page(migrate->src[i]);
if (spage && !is_zone_device_page(spage)) { if (spage && !is_zone_device_page(spage)) {
src[i] = dma_map_page(dev, spage, 0, PAGE_SIZE, 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: out_free_vram_pages:
if (r) { if (r) {
pr_debug("failed %d to copy memory to vram\n", 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]); svm_migrate_put_vram_page(adev, dst[i]);
migrate->dst[i] = 0; migrate->dst[i] = 0;
mpages--;
} }
} }

View File

@ -2034,6 +2034,9 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
if (amdgpu_dc_debug_mask & DC_FORCE_SUBVP_MCLK_SWITCH) if (amdgpu_dc_debug_mask & DC_FORCE_SUBVP_MCLK_SWITCH)
adev->dm.dc->debug.force_subvp_mclk_switch = true; 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) { if (amdgpu_dc_debug_mask & DC_ENABLE_DML2) {
adev->dm.dc->debug.using_dml2 = true; adev->dm.dc->debug.using_dml2 = true;
adev->dm.dc->debug.using_dml21 = 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); new_plane_state = drm_atomic_get_plane_state(state, plane);
old_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 && if (old_plane_state->fb && new_plane_state->fb &&
get_mem_type(old_plane_state->fb) != get_mem_type(new_plane_state->fb)) get_mem_type(old_plane_state->fb) != get_mem_type(new_plane_state->fb))
return true; return true;

View File

@ -1736,7 +1736,7 @@ static void CalculateBytePerPixelAndBlockSizes(
#endif #endif
} // CalculateBytePerPixelAndBlockSizes } // CalculateBytePerPixelAndBlockSizes
static dml_float_t CalculateTWait( static noinline_for_stack dml_float_t CalculateTWait(
dml_uint_t PrefetchMode, dml_uint_t PrefetchMode,
enum dml_use_mall_for_pstate_change_mode UseMALLForPStateChange, enum dml_use_mall_for_pstate_change_mode UseMALLForPStateChange,
dml_bool_t SynchronizeDRRDisplaysForUCLKPStateChangeFinal, dml_bool_t SynchronizeDRRDisplaysForUCLKPStateChangeFinal,
@ -4458,7 +4458,7 @@ static void CalculateSwathWidth(
} }
} // CalculateSwathWidth } // CalculateSwathWidth
static dml_float_t CalculateExtraLatency( static noinline_for_stack dml_float_t CalculateExtraLatency(
dml_uint_t RoundTripPingLatencyCycles, dml_uint_t RoundTripPingLatencyCycles,
dml_uint_t ReorderingBytes, dml_uint_t ReorderingBytes,
dml_float_t DCFCLK, dml_float_t DCFCLK,
@ -5915,7 +5915,7 @@ static dml_uint_t DSCDelayRequirement(
return DSCDelayRequirement_val; 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_float_t ReturnBW,
dml_bool_t NotUrgentLatencyHiding[], dml_bool_t NotUrgentLatencyHiding[],
dml_float_t ReadBandwidthLuma[], dml_float_t ReadBandwidthLuma[],
@ -6019,7 +6019,7 @@ static void CalculatePrefetchBandwithSupport(
#endif #endif
} }
static dml_float_t CalculateBandwidthAvailableForImmediateFlip( static noinline_for_stack dml_float_t CalculateBandwidthAvailableForImmediateFlip(
dml_uint_t NumberOfActiveSurfaces, dml_uint_t NumberOfActiveSurfaces,
dml_float_t ReturnBW, dml_float_t ReturnBW,
dml_float_t ReadBandwidthLuma[], dml_float_t ReadBandwidthLuma[],
@ -6213,7 +6213,7 @@ static dml_uint_t CalculateMaxVStartup(
return max_vstartup_lines; 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, struct CalculatePrefetchSchedule_params_st *CalculatePrefetchSchedule_params,
dml_uint_t j, dml_uint_t j,
dml_uint_t k) 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]; 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 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; struct CalculatePrefetchSchedule_params_st *CalculatePrefetchSchedule_params = &mode_lib->scratch.CalculatePrefetchSchedule_params;

View File

@ -2778,7 +2778,7 @@ static double dml_get_return_bandwidth_available(
return return_bw_mbps; 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_min[dml2_core_internal_soc_state_max],
double avg_bandwidth_available[dml2_core_internal_soc_state_max][dml2_core_internal_bw_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 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); 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, const struct dml2_display_cfg *display_cfg,
unsigned int NumberOfActiveSurfaces, unsigned int NumberOfActiveSurfaces,
unsigned int BytePerPixelY[], unsigned int BytePerPixelY[],
@ -4142,7 +4142,7 @@ static bool ValidateODMMode(enum dml2_odm_mode ODMMode,
return true; return true;
} }
static void CalculateODMMode( static noinline_for_stack void CalculateODMMode(
unsigned int MaximumPixelsPerLinePerDSCUnit, unsigned int MaximumPixelsPerLinePerDSCUnit,
unsigned int HActive, unsigned int HActive,
enum dml2_output_format_class OutFormat, enum dml2_output_format_class OutFormat,
@ -4239,7 +4239,7 @@ static void CalculateODMMode(
#endif #endif
} }
static void CalculateOutputLink( static noinline_for_stack void CalculateOutputLink(
struct dml2_core_internal_scratch *s, struct dml2_core_internal_scratch *s,
double PHYCLK, double PHYCLK,
double PHYCLKD18, 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 // 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_params *p)
{ {
struct dml2_core_calcs_CheckGlobalPrefetchAdmissibility_locals *s = &scratch->CheckGlobalPrefetchAdmissibility_locals; 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, const struct dml2_display_cfg *display_cfg,
unsigned int num_active_planes, unsigned int num_active_planes,
unsigned int bytes_required_l[], unsigned int bytes_required_l[],

View File

@ -194,6 +194,9 @@ void dpp_reset(struct dpp *dpp_base)
dpp->filter_h = NULL; dpp->filter_h = NULL;
dpp->filter_v = 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->scl_data, 0, sizeof(dpp->scl_data));
memset(&dpp->pwl_data, 0, sizeof(dpp->pwl_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) if (src_y_offset + cursor_height <= 0)
cur_en = 0; /* not visible beyond top edge*/ cur_en = 0; /* not visible beyond top edge*/
REG_UPDATE(CURSOR0_CONTROL, if (dpp_base->pos.cur0_ctl.bits.cur0_enable != cur_en) {
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( void dpp1_cnv_set_optional_cursor_attributes(

View File

@ -154,9 +154,11 @@ void dpp401_set_cursor_position(
struct dcn401_dpp *dpp = TO_DCN401_DPP(dpp_base); struct dcn401_dpp *dpp = TO_DCN401_DPP(dpp_base);
uint32_t cur_en = pos->enable ? 1 : 0; 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( void dpp401_set_optional_cursor_attributes(

View File

@ -546,6 +546,12 @@ void hubp1_dcc_control(struct hubp *hubp, bool enable,
SECONDARY_SURFACE_DCC_IND_64B_BLK, dcc_ind_64b_blk); 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( void hubp1_program_surface_config(
struct hubp *hubp, struct hubp *hubp,
enum surface_pixel_format format, 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) void hubp1_init(struct hubp *hubp)
{ {
//do nothing hubp_reset(hubp);
} }
static const struct hubp_funcs dcn10_hubp_funcs = { static const struct hubp_funcs dcn10_hubp_funcs = {
.hubp_program_surface_flip_and_addr = .hubp_program_surface_flip_and_addr =
hubp1_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, .hubp_set_vm_context0_settings = hubp1_set_vm_context0_settings,
.set_blank = hubp1_set_blank, .set_blank = hubp1_set_blank,
.dcc_control = hubp1_dcc_control, .dcc_control = hubp1_dcc_control,
.hubp_reset = hubp_reset,
.mem_program_viewport = min_set_viewport, .mem_program_viewport = min_set_viewport,
.set_hubp_blank_en = hubp1_set_hubp_blank_en, .set_hubp_blank_en = hubp1_set_hubp_blank_en,
.set_cursor_attributes = hubp1_cursor_set_attributes, .set_cursor_attributes = hubp1_cursor_set_attributes,

View File

@ -746,6 +746,8 @@ void hubp1_dcc_control(struct hubp *hubp,
bool enable, bool enable,
enum hubp_ind_block_size independent_64b_blks); enum hubp_ind_block_size independent_64b_blks);
void hubp_reset(struct hubp *hubp);
bool hubp1_program_surface_flip_and_addr( bool hubp1_program_surface_flip_and_addr(
struct hubp *hubp, struct hubp *hubp,
const struct dc_plane_address *address, const struct dc_plane_address *address,

View File

@ -1058,11 +1058,13 @@ void hubp2_cursor_set_position(
if (src_y_offset + cursor_height <= 0) if (src_y_offset + cursor_height <= 0)
cur_en = 0; /* not visible beyond top edge*/ cur_en = 0; /* not visible beyond top edge*/
if (cur_en && REG_READ(CURSOR_SURFACE_ADDRESS) == 0) if (hubp->pos.cur_ctl.bits.cur_enable != cur_en) {
hubp->funcs->set_cursor_attributes(hubp, &hubp->curs_attr); 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); CURSOR_ENABLE, cur_en);
}
REG_SET_2(CURSOR_POSITION, 0, REG_SET_2(CURSOR_POSITION, 0,
CURSOR_X_POSITION, pos->x, CURSOR_X_POSITION, pos->x,
@ -1674,6 +1676,7 @@ static struct hubp_funcs dcn20_hubp_funcs = {
.set_blank = hubp2_set_blank, .set_blank = hubp2_set_blank,
.set_blank_regs = hubp2_set_blank_regs, .set_blank_regs = hubp2_set_blank_regs,
.dcc_control = hubp2_dcc_control, .dcc_control = hubp2_dcc_control,
.hubp_reset = hubp_reset,
.mem_program_viewport = min_set_viewport, .mem_program_viewport = min_set_viewport,
.set_cursor_attributes = hubp2_cursor_set_attributes, .set_cursor_attributes = hubp2_cursor_set_attributes,
.set_cursor_position = hubp2_cursor_set_position, .set_cursor_position = hubp2_cursor_set_position,

View File

@ -121,6 +121,7 @@ static struct hubp_funcs dcn201_hubp_funcs = {
.set_cursor_position = hubp1_cursor_set_position, .set_cursor_position = hubp1_cursor_set_position,
.set_blank = hubp1_set_blank, .set_blank = hubp1_set_blank,
.dcc_control = hubp1_dcc_control, .dcc_control = hubp1_dcc_control,
.hubp_reset = hubp_reset,
.mem_program_viewport = min_set_viewport, .mem_program_viewport = min_set_viewport,
.hubp_clk_cntl = hubp1_clk_cntl, .hubp_clk_cntl = hubp1_clk_cntl,
.hubp_vtg_sel = hubp1_vtg_sel, .hubp_vtg_sel = hubp1_vtg_sel,

View File

@ -811,6 +811,8 @@ static void hubp21_init(struct hubp *hubp)
struct dcn21_hubp *hubp21 = TO_DCN21_HUBP(hubp); struct dcn21_hubp *hubp21 = TO_DCN21_HUBP(hubp);
//hubp[i].HUBPREQ_DEBUG.HUBPREQ_DEBUG[26] = 1; //hubp[i].HUBPREQ_DEBUG.HUBPREQ_DEBUG[26] = 1;
REG_WRITE(HUBPREQ_DEBUG, 1 << 26); REG_WRITE(HUBPREQ_DEBUG, 1 << 26);
hubp_reset(hubp);
} }
static struct hubp_funcs dcn21_hubp_funcs = { static struct hubp_funcs dcn21_hubp_funcs = {
.hubp_enable_tripleBuffer = hubp2_enable_triplebuffer, .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, .hubp_set_vm_system_aperture_settings = hubp21_set_vm_system_aperture_settings,
.set_blank = hubp1_set_blank, .set_blank = hubp1_set_blank,
.dcc_control = hubp1_dcc_control, .dcc_control = hubp1_dcc_control,
.hubp_reset = hubp_reset,
.mem_program_viewport = hubp21_set_viewport, .mem_program_viewport = hubp21_set_viewport,
.set_cursor_attributes = hubp2_cursor_set_attributes, .set_cursor_attributes = hubp2_cursor_set_attributes,
.set_cursor_position = hubp1_cursor_set_position, .set_cursor_position = hubp1_cursor_set_position,

View File

@ -499,6 +499,8 @@ void hubp3_init(struct hubp *hubp)
struct dcn20_hubp *hubp2 = TO_DCN20_HUBP(hubp); struct dcn20_hubp *hubp2 = TO_DCN20_HUBP(hubp);
//hubp[i].HUBPREQ_DEBUG.HUBPREQ_DEBUG[26] = 1; //hubp[i].HUBPREQ_DEBUG.HUBPREQ_DEBUG[26] = 1;
REG_WRITE(HUBPREQ_DEBUG, 1 << 26); REG_WRITE(HUBPREQ_DEBUG, 1 << 26);
hubp_reset(hubp);
} }
static struct hubp_funcs dcn30_hubp_funcs = { 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 = hubp2_set_blank,
.set_blank_regs = hubp2_set_blank_regs, .set_blank_regs = hubp2_set_blank_regs,
.dcc_control = hubp3_dcc_control, .dcc_control = hubp3_dcc_control,
.hubp_reset = hubp_reset,
.mem_program_viewport = min_set_viewport, .mem_program_viewport = min_set_viewport,
.set_cursor_attributes = hubp2_cursor_set_attributes, .set_cursor_attributes = hubp2_cursor_set_attributes,
.set_cursor_position = hubp2_cursor_set_position, .set_cursor_position = hubp2_cursor_set_position,

View File

@ -79,6 +79,7 @@ static struct hubp_funcs dcn31_hubp_funcs = {
.hubp_set_vm_system_aperture_settings = hubp3_set_vm_system_aperture_settings, .hubp_set_vm_system_aperture_settings = hubp3_set_vm_system_aperture_settings,
.set_blank = hubp2_set_blank, .set_blank = hubp2_set_blank,
.dcc_control = hubp3_dcc_control, .dcc_control = hubp3_dcc_control,
.hubp_reset = hubp_reset,
.mem_program_viewport = min_set_viewport, .mem_program_viewport = min_set_viewport,
.set_cursor_attributes = hubp2_cursor_set_attributes, .set_cursor_attributes = hubp2_cursor_set_attributes,
.set_cursor_position = hubp2_cursor_set_position, .set_cursor_position = hubp2_cursor_set_position,

View File

@ -181,6 +181,7 @@ static struct hubp_funcs dcn32_hubp_funcs = {
.set_blank = hubp2_set_blank, .set_blank = hubp2_set_blank,
.set_blank_regs = hubp2_set_blank_regs, .set_blank_regs = hubp2_set_blank_regs,
.dcc_control = hubp3_dcc_control, .dcc_control = hubp3_dcc_control,
.hubp_reset = hubp_reset,
.mem_program_viewport = min_set_viewport, .mem_program_viewport = min_set_viewport,
.set_cursor_attributes = hubp32_cursor_set_attributes, .set_cursor_attributes = hubp32_cursor_set_attributes,
.set_cursor_position = hubp2_cursor_set_position, .set_cursor_position = hubp2_cursor_set_position,

View File

@ -199,6 +199,7 @@ static struct hubp_funcs dcn35_hubp_funcs = {
.hubp_set_vm_system_aperture_settings = hubp3_set_vm_system_aperture_settings, .hubp_set_vm_system_aperture_settings = hubp3_set_vm_system_aperture_settings,
.set_blank = hubp2_set_blank, .set_blank = hubp2_set_blank,
.dcc_control = hubp3_dcc_control, .dcc_control = hubp3_dcc_control,
.hubp_reset = hubp_reset,
.mem_program_viewport = min_set_viewport, .mem_program_viewport = min_set_viewport,
.set_cursor_attributes = hubp2_cursor_set_attributes, .set_cursor_attributes = hubp2_cursor_set_attributes,
.set_cursor_position = hubp2_cursor_set_position, .set_cursor_position = hubp2_cursor_set_position,

View File

@ -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) 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, 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), dc_fixpt_from_int(dst_x_offset),
param->h_scale_ratio)); param->h_scale_ratio));
if (cur_en && REG_READ(CURSOR_SURFACE_ADDRESS) == 0) if (hubp->pos.cur_ctl.bits.cur_enable != cur_en) {
hubp->funcs->set_cursor_attributes(hubp, &hubp->curs_attr); 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); CURSOR_ENABLE, cur_en);
}
REG_SET_2(CURSOR_POSITION, 0, REG_SET_2(CURSOR_POSITION, 0,
CURSOR_X_POSITION, x_pos, 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, .hubp_set_vm_system_aperture_settings = hubp3_set_vm_system_aperture_settings,
.set_blank = hubp2_set_blank, .set_blank = hubp2_set_blank,
.set_blank_regs = hubp2_set_blank_regs, .set_blank_regs = hubp2_set_blank_regs,
.hubp_reset = hubp_reset,
.mem_program_viewport = hubp401_set_viewport, .mem_program_viewport = hubp401_set_viewport,
.set_cursor_attributes = hubp32_cursor_set_attributes, .set_cursor_attributes = hubp32_cursor_set_attributes,
.set_cursor_position = hubp401_cursor_set_position, .set_cursor_position = hubp401_cursor_set_position,

View File

@ -1286,6 +1286,7 @@ void dcn10_plane_atomic_power_down(struct dc *dc,
if (hws->funcs.hubp_pg_control) if (hws->funcs.hubp_pg_control)
hws->funcs.hubp_pg_control(hws, hubp->inst, false); hws->funcs.hubp_pg_control(hws, hubp->inst, false);
hubp->funcs->hubp_reset(hubp);
dpp->funcs->dpp_reset(dpp); dpp->funcs->dpp_reset(dpp);
REG_SET(DC_IP_REQUEST_CNTL, 0, 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. */ /* Disable on the current state so the new one isn't cleared. */
pipe_ctx = &dc->current_state->res_ctx.pipe_ctx[i]; pipe_ctx = &dc->current_state->res_ctx.pipe_ctx[i];
hubp->funcs->hubp_reset(hubp);
dpp->funcs->dpp_reset(dpp); dpp->funcs->dpp_reset(dpp);
pipe_ctx->stream_res.tg = tg; pipe_ctx->stream_res.tg = tg;

View File

@ -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. */ /* Disable on the current state so the new one isn't cleared. */
pipe_ctx = &dc->current_state->res_ctx.pipe_ctx[i]; pipe_ctx = &dc->current_state->res_ctx.pipe_ctx[i];
hubp->funcs->hubp_reset(hubp);
dpp->funcs->dpp_reset(dpp); dpp->funcs->dpp_reset(dpp);
pipe_ctx->stream_res.tg = tg; 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*/ /*to do, need to support both case*/
hubp->power_gated = true; hubp->power_gated = true;
hubp->funcs->hubp_reset(hubp);
dpp->funcs->dpp_reset(dpp); dpp->funcs->dpp_reset(dpp);
pipe_ctx->stream = NULL; pipe_ctx->stream = NULL;

View File

@ -163,6 +163,8 @@ struct hubp_funcs {
void (*dcc_control)(struct hubp *hubp, bool enable, void (*dcc_control)(struct hubp *hubp, bool enable,
enum hubp_ind_block_size blk_size); enum hubp_ind_block_size blk_size);
void (*hubp_reset)(struct hubp *hubp);
void (*mem_program_viewport)( void (*mem_program_viewport)(
struct hubp *hubp, struct hubp *hubp,
const struct rect *viewport, const struct rect *viewport,

View File

@ -49,6 +49,17 @@
| CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3) | CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3)
/* Following flags shows PCIe lane width switch supported in driver which are decided by chipset and ASIC */ /* 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_X1 0x00010000
#define CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 0x00020000 #define CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 0x00020000
#define CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 0x00040000 #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_X12 0x00100000
#define CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 0x00200000 #define CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 0x00200000
#define CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 0x00400000 #define CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 0x00400000
#define CAIL_PCIE_LINK_WIDTH_SUPPORT_MASK 0xFFFF0000
#define CAIL_PCIE_LINK_WIDTH_SUPPORT_SHIFT 16 #define CAIL_PCIE_LINK_WIDTH_SUPPORT_SHIFT 16
/* 1/2/4/8/16 lanes */ /* 1/2/4/8/16 lanes */
@ -65,4 +77,10 @@
| CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 \ | CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 \
| CAIL_PCIE_LINK_WIDTH_SUPPORT_X16) | 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 #endif

View File

@ -345,10 +345,15 @@ enum DC_DEBUG_MASK {
*/ */
DC_DISABLE_ACPI_EDID = 0x8000, DC_DISABLE_ACPI_EDID = 0x8000,
/* /**
* @DC_DISABLE_HDMI_CEC: If set, disable HDMI-CEC feature in amdgpu driver. * @DC_DISABLE_HDMI_CEC: If set, disable HDMI-CEC feature in amdgpu driver.
*/ */
DC_DISABLE_HDMI_CEC = 0x10000, 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; enum amd_dpm_forced_level;

View File

@ -93,7 +93,6 @@
#define PPSMC_MSG_SelectPLPDMode 0x40 #define PPSMC_MSG_SelectPLPDMode 0x40
#define PPSMC_MSG_RmaDueToBadPageThreshold 0x43 #define PPSMC_MSG_RmaDueToBadPageThreshold 0x43
#define PPSMC_MSG_SelectPstatePolicy 0x44 #define PPSMC_MSG_SelectPstatePolicy 0x44
#define PPSMC_MSG_ResetSDMA2 0x45
#define PPSMC_MSG_ResetSDMA 0x4D #define PPSMC_MSG_ResetSDMA 0x4D
#define PPSMC_Message_Count 0x4E #define PPSMC_Message_Count 0x4E

View File

@ -276,8 +276,7 @@
__SMU_DUMMY_MAP(SelectPstatePolicy), \ __SMU_DUMMY_MAP(SelectPstatePolicy), \
__SMU_DUMMY_MAP(MALLPowerController), \ __SMU_DUMMY_MAP(MALLPowerController), \
__SMU_DUMMY_MAP(MALLPowerState), \ __SMU_DUMMY_MAP(MALLPowerState), \
__SMU_DUMMY_MAP(ResetSDMA), \ __SMU_DUMMY_MAP(ResetSDMA),
__SMU_DUMMY_MAP(ResetSDMA2),
#undef __SMU_DUMMY_MAP #undef __SMU_DUMMY_MAP
#define __SMU_DUMMY_MAP(type) SMU_MSG_##type #define __SMU_DUMMY_MAP(type) SMU_MSG_##type

View File

@ -107,6 +107,7 @@ struct smu_13_0_dpm_context {
struct smu_13_0_dpm_tables dpm_tables; struct smu_13_0_dpm_tables dpm_tables;
uint32_t workload_policy_mask; uint32_t workload_policy_mask;
uint32_t dcef_min_ds_clk; uint32_t dcef_min_ds_clk;
uint64_t caps;
}; };
enum smu_13_0_power_state { enum smu_13_0_power_state {

View File

@ -101,38 +101,24 @@ MODULE_FIRMWARE("amdgpu/smu_13_0_14.bin");
#define MCA_BANK_IPID(_ip, _hwid, _type) \ #define MCA_BANK_IPID(_ip, _hwid, _type) \
[AMDGPU_MCA_IP_##_ip] = { .hwid = _hwid, .mcatype = _type, } [AMDGPU_MCA_IP_##_ip] = { .hwid = _hwid, .mcatype = _type, }
static inline bool smu_v13_0_6_is_unified_metrics(struct smu_context *smu) #define SMU_CAP(x) SMU_13_0_6_CAPS_##x
{
return (smu->adev->flags & AMD_IS_APU) &&
smu->smc_fw_version <= 0x4556900;
}
static inline bool smu_v13_0_6_is_other_end_count_available(struct smu_context *smu) enum smu_v13_0_6_caps {
{ SMU_CAP(DPM),
switch (amdgpu_ip_version(smu->adev, MP1_HWIP, 0)) { SMU_CAP(UNI_METRICS),
case IP_VERSION(13, 0, 6): SMU_CAP(DPM_POLICY),
return smu->smc_fw_version >= 0x557600; SMU_CAP(OTHER_END_METRICS),
case IP_VERSION(13, 0, 14): SMU_CAP(SET_UCLK_MAX),
return smu->smc_fw_version >= 0x05550E00; SMU_CAP(PCIE_METRICS),
default: SMU_CAP(HST_LIMIT_METRICS),
return false; SMU_CAP(MCA_DEBUG_MODE),
} SMU_CAP(PER_INST_METRICS),
} SMU_CAP(CTF_LIMIT),
SMU_CAP(RMA_MSG),
static inline bool smu_v13_0_6_is_blw_host_limit_available(struct smu_context *smu) SMU_CAP(ACA_SYND),
{ SMU_CAP(SDMA_RESET),
if (smu->adev->flags & AMD_IS_APU) SMU_CAP(ALL),
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;
}
}
struct mca_bank_ipid { struct mca_bank_ipid {
enum amdgpu_mca_ip ip; 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(RmaDueToBadPageThreshold, PPSMC_MSG_RmaDueToBadPageThreshold, 0),
MSG_MAP(SelectPstatePolicy, PPSMC_MSG_SelectPstatePolicy, 0), MSG_MAP(SelectPstatePolicy, PPSMC_MSG_SelectPstatePolicy, 0),
MSG_MAP(ResetSDMA, PPSMC_MSG_ResetSDMA, 0), MSG_MAP(ResetSDMA, PPSMC_MSG_ResetSDMA, 0),
MSG_MAP(ResetSDMA2, PPSMC_MSG_ResetSDMA2, 0),
}; };
// clang-format on // clang-format on
@ -297,6 +282,162 @@ struct smu_v13_0_6_dpm_map {
uint32_t *freq_table; 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) static int smu_v13_0_6_init_microcode(struct smu_context *smu)
{ {
const struct smc_firmware_header_v2_1 *v2_1; 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; MetricsTableA_t *metrics_a = (MetricsTableA_t *)smu_table->metrics_table;
struct PPTable_t *pptable = struct PPTable_t *pptable =
(struct PPTable_t *)smu_table->driver_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; int ret, i, retry = 100;
uint32_t table_version; 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); smu_v13_0_6_setup_driver_pptable(smu);
/* DPM policy not supported in older firmwares */ /* DPM policy not supported in older firmwares */
if (!(smu->adev->flags & AMD_IS_APU) && if (!smu_v13_0_6_cap_supported(smu, SMU_CAP(DPM_POLICY))) {
(smu->smc_fw_version < 0x00556000)) {
struct smu_dpm_context *smu_dpm = &smu->smu_dpm; struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
smu_dpm->dpm_policies->policy_mask &= 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; struct smu_table_context *smu_table = &smu->smu_table;
MetricsTableX_t *metrics_x = (MetricsTableX_t *)smu_table->metrics_table; MetricsTableX_t *metrics_x = (MetricsTableX_t *)smu_table->metrics_table;
MetricsTableA_t *metrics_a = (MetricsTableA_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; struct amdgpu_device *adev = smu->adev;
int ret = 0; int ret = 0;
int xcc_id; int xcc_id;
@ -1005,7 +1145,7 @@ static int smu_v13_0_6_get_smu_metrics_data(struct smu_context *smu,
switch (member) { switch (member) {
case METRICS_CURR_GFXCLK: case METRICS_CURR_GFXCLK:
case METRICS_AVERAGE_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); xcc_id = GET_INST(GC, 0);
*value = SMUQ10_ROUND(GET_METRIC_FIELD(GfxclkFrequency, flag)[xcc_id]); *value = SMUQ10_ROUND(GET_METRIC_FIELD(GfxclkFrequency, flag)[xcc_id]);
} else { } 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) 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 */ /* 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 0;
return smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_ClearMcaOnRead, 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) if (max == pstate_table->uclk_pstate.curr.max)
return 0; return 0;
/* For VF, only allowed in FW versions 85.102 or greater */ /* For VF, only allowed in FW versions 85.102 or greater */
if (amdgpu_sriov_vf(adev) && if (!smu_v13_0_6_cap_supported(smu,
((smu->smc_fw_version < 0x556600) || SMU_CAP(SET_UCLK_MAX)))
(adev->flags & AMD_IS_APU)))
return -EOPNOTSUPP; return -EOPNOTSUPP;
/* Only max clock limiting is allowed for UCLK */ /* Only max clock limiting is allowed for UCLK */
ret = smu_v13_0_set_soft_freq_limited_range( 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); 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; *feature_mask = 0;
ret = 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) 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 smu_table_context *smu_table = &smu->smu_table;
struct gpu_metrics_v1_7 *gpu_metrics = struct gpu_metrics_v1_7 *gpu_metrics =
(struct gpu_metrics_v1_7 *)smu_table->gpu_metrics_table; (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; int ret = 0, xcc_id, inst, i, j, k, idx;
struct amdgpu_device *adev = smu->adev; struct amdgpu_device *adev = smu->adev;
MetricsTableX_t *metrics_x; 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; struct amdgpu_xcp *xcp;
u16 link_width_level; u16 link_width_level;
u32 inst_mask; u32 inst_mask;
bool per_inst;
metrics_x = kzalloc(max(sizeof(MetricsTableX_t), sizeof(MetricsTableA_t)), GFP_KERNEL); metrics_x = kzalloc(max(sizeof(MetricsTableX_t), sizeof(MetricsTableA_t)), GFP_KERNEL);
ret = smu_v13_0_6_get_metrics_table(smu, metrics_x, true); 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 * table for both pf & one vf for smu version 85.99.0 or higher else report only
* for pf from registers * 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_width = metrics_x->PCIeLinkWidth;
gpu_metrics->pcie_link_speed = gpu_metrics->pcie_link_speed =
pcie_gen_to_speed(metrics_x->PCIeLinkSpeed); 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; metrics_x->PCIeNAKSentCountAcc;
gpu_metrics->pcie_nak_rcvd_count_acc = gpu_metrics->pcie_nak_rcvd_count_acc =
metrics_x->PCIeNAKReceivedCountAcc; 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 = gpu_metrics->pcie_lc_perf_other_end_recovery =
metrics_x->PCIeOtherEndRecoveryAcc; 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; gpu_metrics->num_partition = adev->xcp_mgr->num_xcps;
apu_per_inst = (adev->flags & AMD_IS_APU) && (smu->smc_fw_version >= 0x04556A00); per_inst = smu_v13_0_6_cap_supported(smu, SMU_CAP(PER_INST_METRICS));
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;
for_each_xcp(adev->xcp_mgr, xcp, i) { for_each_xcp(adev->xcp_mgr, xcp, i) {
amdgpu_xcp_get_inst_details(xcp, AMDGPU_XCP_VCN, &inst_mask); 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] = gpu_metrics->xcp_stats[i].gfx_busy_acc[idx] =
SMUQ10_ROUND(metrics_x->GfxBusyAcc[inst]); 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] = gpu_metrics->xcp_stats[i].gfx_below_host_limit_acc[idx] =
SMUQ10_ROUND(metrics_x->GfxclkBelowHostLimitAcc SMUQ10_ROUND(metrics_x->GfxclkBelowHostLimitAcc
[inst]); [inst]);
@ -2624,7 +2754,7 @@ static int smu_v13_0_6_get_thermal_temperature_range(struct smu_context *smu,
return -EINVAL; return -EINVAL;
/*Check smu version, GetCtfLimit message only supported for smu version 85.69 or higher */ /*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; return 0;
/* Get SOC Max operating temperature */ /* 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) static int smu_v13_0_6_send_rma_reason(struct smu_context *smu)
{ {
struct amdgpu_device *adev = smu->adev;
int ret; int ret;
/* NOTE: the message is only valid on dGPU with pmfw 85.90.0 and above */ /* 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; return 0;
ret = smu_cmn_send_smc_msg(smu, SMU_MSG_RmaDueToBadPageThreshold, NULL); 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) static int smu_v13_0_6_reset_sdma(struct smu_context *smu, uint32_t inst_mask)
{ {
uint32_t smu_program;
int ret = 0; int ret = 0;
smu_program = (smu->smc_fw_version >> 24) & 0xff; if (!smu_v13_0_6_cap_supported(smu, SMU_CAP(SDMA_RESET)))
switch (amdgpu_ip_version(smu->adev, MP1_HWIP, 0)) { return -EOPNOTSUPP;
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;
}
ret = smu_cmn_send_smc_msg_with_param(smu,
SMU_MSG_ResetSDMA, inst_mask, NULL);
if (ret) if (ret)
dev_err(smu->adev->dev, dev_err(smu->adev->dev,
"failed to send ResetSDMA event with mask 0x%x\n", "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) if (instlo != 0x03b30400)
return false; 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 = MCA_REG__SYND__ERRORINFORMATION(entry->regs[MCA_REG_IDX_SYND]);
errcode &= 0xff; errcode &= 0xff;
} else { } 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) 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; 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]); error_code = ACA_REG__SYND__ERRORINFORMATION(bank->regs[ACA_REG_IDX_SYND]);
else else
error_code = ACA_REG__STATUS__ERRORCODE(bank->regs[ACA_REG_IDX_STATUS]); 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, .fini_power = smu_v13_0_fini_power,
.check_fw_status = smu_v13_0_6_check_fw_status, .check_fw_status = smu_v13_0_6_check_fw_status,
/* pptable related */ /* 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_driver_table_location = smu_v13_0_set_driver_table_location,
.set_tool_table_location = smu_v13_0_set_tool_table_location, .set_tool_table_location = smu_v13_0_set_tool_table_location,
.notify_memory_pool_location = smu_v13_0_notify_memory_pool_location, .notify_memory_pool_location = smu_v13_0_notify_memory_pool_location,

View File

@ -743,6 +743,15 @@ retry:
if ((conn_configured & mask) != mask && conn_configured != conn_seq) if ((conn_configured & mask) != mask && conn_configured != conn_seq)
goto retry; 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 * 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 * same user experiencing of lighting up as much as possible like the

View File

@ -1354,14 +1354,14 @@ int drm_fb_helper_set_par(struct fb_info *info)
} }
EXPORT_SYMBOL(drm_fb_helper_set_par); 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; struct drm_mode_set *mode_set;
mutex_lock(&fb_helper->client.modeset_mutex); mutex_lock(&fb_helper->client.modeset_mutex);
drm_client_for_each_modeset(mode_set, &fb_helper->client) { drm_client_for_each_modeset(mode_set, &fb_helper->client) {
mode_set->x = x; mode_set->x += dx;
mode_set->y = y; mode_set->y += dy;
} }
mutex_unlock(&fb_helper->client.modeset_mutex); 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 fb_info *info)
{ {
struct drm_fb_helper *fb_helper = info->par; 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); ret = drm_client_modeset_commit_locked(&fb_helper->client);
if (!ret) { if (!ret) {
info->var.xoffset = var->xoffset; info->var.xoffset = var->xoffset;
info->var.yoffset = var->yoffset; info->var.yoffset = var->yoffset;
} else } else
pan_set(fb_helper, info->var.xoffset, info->var.yoffset); pan_set(fb_helper, -dx, -dy);
return ret; return ret;
} }

View File

@ -757,7 +757,6 @@ static void bochs_pci_remove(struct pci_dev *pdev)
drm_dev_unplug(dev); drm_dev_unplug(dev);
drm_atomic_helper_shutdown(dev); drm_atomic_helper_shutdown(dev);
drm_dev_put(dev);
} }
static void bochs_pci_shutdown(struct pci_dev *pdev) static void bochs_pci_shutdown(struct pci_dev *pdev)

View File

@ -107,8 +107,10 @@ v3d_irq(int irq, void *arg)
v3d_job_update_stats(&v3d->bin_job->base, V3D_BIN); v3d_job_update_stats(&v3d->bin_job->base, V3D_BIN);
trace_v3d_bcl_irq(&v3d->drm, fence->seqno); trace_v3d_bcl_irq(&v3d->drm, fence->seqno);
dma_fence_signal(&fence->base);
v3d->bin_job = NULL; v3d->bin_job = NULL;
dma_fence_signal(&fence->base);
status = IRQ_HANDLED; status = IRQ_HANDLED;
} }
@ -118,8 +120,10 @@ v3d_irq(int irq, void *arg)
v3d_job_update_stats(&v3d->render_job->base, V3D_RENDER); v3d_job_update_stats(&v3d->render_job->base, V3D_RENDER);
trace_v3d_rcl_irq(&v3d->drm, fence->seqno); trace_v3d_rcl_irq(&v3d->drm, fence->seqno);
dma_fence_signal(&fence->base);
v3d->render_job = NULL; v3d->render_job = NULL;
dma_fence_signal(&fence->base);
status = IRQ_HANDLED; status = IRQ_HANDLED;
} }
@ -129,8 +133,10 @@ v3d_irq(int irq, void *arg)
v3d_job_update_stats(&v3d->csd_job->base, V3D_CSD); v3d_job_update_stats(&v3d->csd_job->base, V3D_CSD);
trace_v3d_csd_irq(&v3d->drm, fence->seqno); trace_v3d_csd_irq(&v3d->drm, fence->seqno);
dma_fence_signal(&fence->base);
v3d->csd_job = NULL; v3d->csd_job = NULL;
dma_fence_signal(&fence->base);
status = IRQ_HANDLED; status = IRQ_HANDLED;
} }
@ -167,8 +173,10 @@ v3d_hub_irq(int irq, void *arg)
v3d_job_update_stats(&v3d->tfu_job->base, V3D_TFU); v3d_job_update_stats(&v3d->tfu_job->base, V3D_TFU);
trace_v3d_tfu_irq(&v3d->drm, fence->seqno); trace_v3d_tfu_irq(&v3d->drm, fence->seqno);
dma_fence_signal(&fence->base);
v3d->tfu_job = NULL; v3d->tfu_job = NULL;
dma_fence_signal(&fence->base);
status = IRQ_HANDLED; status = IRQ_HANDLED;
} }

View File

@ -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_object *bo = gem_to_virtio_gpu_obj(obj);
struct virtio_gpu_device *vgdev = obj->dev->dev_private; struct virtio_gpu_device *vgdev = obj->dev->dev_private;
struct dma_buf_attachment *attach = obj->import_attach; struct dma_buf_attachment *attach = obj->import_attach;
struct dma_resv *resv = attach->dmabuf->resv;
if (attach) { 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); 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_buf_unmap_attachment(attach, bo->sgt,
DMA_BIDIRECTIONAL); DMA_BIDIRECTIONAL);
dma_resv_unlock(resv); dma_resv_unlock(dmabuf->resv);
dma_buf_detach(attach->dmabuf, attach); dma_buf_detach(dmabuf, attach);
dma_buf_put(attach->dmabuf); dma_buf_put(dmabuf);
} }
if (bo->created) { if (bo->created) {

View File

@ -1564,7 +1564,7 @@ static void zynqmp_dp_bridge_atomic_enable(struct drm_bridge *bridge,
pm_runtime_get_sync(dp->dev); pm_runtime_get_sync(dp->dev);
mutex_lock(&dp->lock); guard(mutex)(&dp->lock);
zynqmp_dp_disp_enable(dp, old_bridge_state); 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_write(dp, ZYNQMP_DP_SOFTWARE_RESET,
ZYNQMP_DP_SOFTWARE_RESET_ALL); ZYNQMP_DP_SOFTWARE_RESET_ALL);
zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_ENABLE, 1); 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, static void zynqmp_dp_bridge_atomic_disable(struct drm_bridge *bridge,

View File

@ -60,6 +60,7 @@ struct zynqmp_dpsub_audio;
* @layers: Video and graphics layers * @layers: Video and graphics layers
* @dp: The DisplayPort controller * @dp: The DisplayPort controller
* @dma_align: DMA alignment constraint (must be a power of 2) * @dma_align: DMA alignment constraint (must be a power of 2)
* @audio: DP audio data
*/ */
struct zynqmp_dpsub { struct zynqmp_dpsub {
struct device *dev; struct device *dev;

View File

@ -1131,7 +1131,6 @@ config CGROUP_PIDS
config CGROUP_RDMA config CGROUP_RDMA
bool "RDMA controller" bool "RDMA controller"
select PAGE_COUNTER
help help
Provides enforcement of RDMA resources defined by IB stack. Provides enforcement of RDMA resources defined by IB stack.
It is fairly easy for consumers to exhaust RDMA resources, which It is fairly easy for consumers to exhaust RDMA resources, which