[PATCH 2/2] drm/display/dp_mst: Fix drm_dp_mst_add_affected_dsc_crtcs() return code

2022-11-04 Thread Lyude Paul
Looks like that we're accidentally dropping a pretty important return code
here. For some reason, we just return -EINVAL if we fail to get the MST
topology state. This is wrong: error codes are important and should never
be squashed without being handled, which here seems to have the potential
to cause a deadlock.

Signed-off-by: Lyude Paul 
Fixes: 8ec046716ca8 ("drm/dp_mst: Add helper to trigger modeset on affected DSC 
MST CRTCs")
Cc:  # v5.6+
---
 drivers/gpu/drm/display/drm_dp_mst_topology.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/display/drm_dp_mst_topology.c 
b/drivers/gpu/drm/display/drm_dp_mst_topology.c
index ecd22c038c8c0..51a46689cda70 100644
--- a/drivers/gpu/drm/display/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c
@@ -5186,7 +5186,7 @@ int drm_dp_mst_add_affected_dsc_crtcs(struct 
drm_atomic_state *state, struct drm
mst_state = drm_atomic_get_mst_topology_state(state, mgr);
 
if (IS_ERR(mst_state))
-   return -EINVAL;
+   return PTR_ERR(mst_state);
 
list_for_each_entry(pos, &mst_state->payloads, next) {
 
-- 
2.37.3



[PATCH 1/2] drm/amdgpu/mst: Stop ignoring error codes and deadlocking

2022-11-04 Thread Lyude Paul
It appears that amdgpu makes the mistake of completely ignoring the return
values from the DP MST helpers, and instead just returns a simple
true/false. In this case, it seems to have come back to bite us because as
a result of simply returning false from
compute_mst_dsc_configs_for_state(), amdgpu had no way of telling when a
deadlock happened from these helpers. This could definitely result in some
kernel splats.

Signed-off-by: Lyude Paul 
Fixes: 8c20a1ed9b4f ("drm/amd/display: MST DSC compute fair share")
Cc: Harry Wentland 
Cc:  # v5.6+
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |  18 +--
 .../display/amdgpu_dm/amdgpu_dm_mst_types.c   | 107 ++
 .../display/amdgpu_dm/amdgpu_dm_mst_types.h   |  12 +-
 3 files changed, 73 insertions(+), 64 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 0db2a88cd4d7b..6f76b2c84cdb5 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -6462,7 +6462,7 @@ static int dm_update_mst_vcpi_slots_for_dsc(struct 
drm_atomic_state *state,
struct drm_connector_state *new_con_state;
struct amdgpu_dm_connector *aconnector;
struct dm_connector_state *dm_conn_state;
-   int i, j;
+   int i, j, ret;
int vcpi, pbn_div, pbn, slot_num = 0;
 
for_each_new_connector_in_state(state, connector, new_con_state, i) {
@@ -6509,8 +6509,11 @@ static int dm_update_mst_vcpi_slots_for_dsc(struct 
drm_atomic_state *state,
dm_conn_state->pbn = pbn;
dm_conn_state->vcpi_slots = slot_num;
 
-   drm_dp_mst_atomic_enable_dsc(state, aconnector->port, 
dm_conn_state->pbn,
-false);
+   ret = drm_dp_mst_atomic_enable_dsc(state, 
aconnector->port,
+  dm_conn_state->pbn, 
false);
+   if (ret != 0)
+   return ret;
+
continue;
}
 
@@ -9523,10 +9526,9 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
 
 #if defined(CONFIG_DRM_AMD_DC_DCN)
if (dc_resource_is_dsc_encoding_supported(dc)) {
-   if (!pre_validate_dsc(state, &dm_state, vars)) {
-   ret = -EINVAL;
+   ret = pre_validate_dsc(state, &dm_state, vars);
+   if (ret != 0)
goto fail;
-   }
}
 #endif
 
@@ -9621,9 +9623,9 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
}
 
 #if defined(CONFIG_DRM_AMD_DC_DCN)
-   if (!compute_mst_dsc_configs_for_state(state, 
dm_state->context, vars)) {
+   ret = compute_mst_dsc_configs_for_state(state, 
dm_state->context, vars);
+   if (ret) {
DRM_DEBUG_DRIVER("compute_mst_dsc_configs_for_state() 
failed\n");
-   ret = -EINVAL;
goto fail;
}
 
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
index 6ff96b4bdda5c..30bc2e5058b70 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
@@ -864,25 +864,25 @@ static bool try_disable_dsc(struct drm_atomic_state 
*state,
return true;
 }
 
-static bool compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
-struct dc_state *dc_state,
-struct dc_link *dc_link,
-struct dsc_mst_fairness_vars *vars,
-struct drm_dp_mst_topology_mgr 
*mgr,
-int *link_vars_start_index)
+static int compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
+   struct dc_state *dc_state,
+   struct dc_link *dc_link,
+   struct dsc_mst_fairness_vars *vars,
+   struct drm_dp_mst_topology_mgr *mgr,
+   int *link_vars_start_index)
 {
struct dc_stream_state *stream;
struct dsc_mst_fairness_params params[MAX_PIPES];
struct amdgpu_dm_connector *aconnector;
struct drm_dp_mst_topology_state *mst_state = 
drm_atomic_get_mst_topology_state(state, mgr);
int count = 0;
-   int i, k;
+   int i, k, ret;
bool debugfs_overwrite = false;
 
memset(params, 0, sizeof(params));
 
if (IS_ERR(mst_state))
-   return false;
+   return PTR_ERR(mst_state);
 
mst_state->pbn_div = 

[PATCH 0/2] MST deadlocking fixes

2022-11-04 Thread Lyude Paul
Some deadlock related fixes for amdgpu and DRM, spurred by:
https://gitlab.freedesktop.org/drm/amd/-/issues/2171

Unfortunately these don't fully fix the problem yet, but I'm getting
there!

Lyude Paul (2):
  drm/amdgpu/mst: Stop ignoring error codes and deadlocking
  drm/display/dp_mst: Fix drm_dp_mst_add_affected_dsc_crtcs() return
code

 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |  18 +--
 .../display/amdgpu_dm/amdgpu_dm_mst_types.c   | 107 ++
 .../display/amdgpu_dm/amdgpu_dm_mst_types.h   |  12 +-
 drivers/gpu/drm/display/drm_dp_mst_topology.c |   2 +-
 4 files changed, 74 insertions(+), 65 deletions(-)

-- 
2.37.3



[pull] amdgpu, amdkfd, radeon, drm drm-next-6.2

2022-11-04 Thread Alex Deucher
Hi Dave, Daniel,

New stuff for 6.2.

The following changes since commit 9abf2313adc1ca1b6180c508c25f22f9395cc780:

  Linux 6.1-rc1 (2022-10-16 15:36:24 -0700)

are available in the Git repository at:

  https://gitlab.freedesktop.org/agd5f/linux.git 
tags/amd-drm-next-6.2-2022-11-04

for you to fetch changes up to fcf00f8d29f2fc6bf00531a1447be28b99073cc3:

  drm/amdkfd: Remove skiping userptr buffer mapping when mmu notifier marks it 
as invalid (2022-11-04 16:05:54 -0400)


amd-drm-next-6.2-2022-11-04:

amdgpu:
- Add TMZ support for GC 11.0.1
- More IP version check conversions
- Mode2 reset fixes for sienna cichlid
- SMU 13.x fixes
- RAS enablement on MP 13.x
- Replace kmap with kmap_local_page()
- Misc Clang warning fixes
- SR-IOV fixes for GC 11.x
- PCI AER fix
- DCN 3.2.x commit sequence rework
- SDMA 4.x doorbell fix
- Expose additional new GC 11.x firmware versions
- Misc code cleanups
- S0i3 fixes
- More DC FPU cleanup
- Add more DC kerneldoc
- Misc spelling and grammer fixes
- DCN 3.1.x fixes
- Plane modifier fix
- MCA RAS enablement
- Secure display locking fix
- RAS TA rework
- RAS EEPROM fixes
- Fail suspend if eviction fails
- Drop AMD specific DSC workarounds in favor of drm EDID quirks
- SR-IOV suspend/resume fixes
- Enable DCN support for ARM
- Enable secure display on DCN 2.1

amdkfd:
- Cache size fixes for GC 10.3.x
- kfd_dev struct cleanup
- GC11.x CWSR trap handler fix
- Userptr fixes
- Warning fixes

radeon:
- Replace kmap with kmap_local_page()

UAPI:
- Expose additional new GC 11.x firmware versions via the existing INFO query

drm:
- Add some new EDID DSC quirks


Alan Liu (3):
  drm/amd/display: Implement secure display on DCN21
  drm/amd/display: Drop struct crc_region and reuse struct rect
  drm/amdgpu: Move the mutex_lock to protect the return status of 
securedisplay command buffer

Alex Deucher (6):
  drm/amdgpu: convert vega20_ih.c to IP version checks
  drm/amdgpu: convert amdgpu_amdkfd_gpuvm.c to IP version checks
  drm/amdgpu: fix sdma doorbell init ordering on APUs
  drm/amdgpu/gfx9: set gfx.funcs in early init
  drm/amdgpu/gfx10: set gfx.funcs in early init
  drm/amdgpu/gfx11: set gfx.funcs in early init

Alvin Lee (4):
  drm/amd/display: Don't return false if no stream
  drm/amd/display: Remove optimization for VRR updates
  drm/amd/display: Enable timing sync on DCN32
  drm/amd/display: Don't enable ODM + MPO

Anthony Koo (2):
  drm/amd/display: Document part of the DMUB cmd
  drm/amd/display: [FW Promotion] Release 0.0.141.0

Ao Zhong (3):
  drm/amd/display: move remaining FPU code to dml folder
  drm/amd/display: move remaining FPU code to dml folder
  drm/amd/display: add DCN support for ARM64

Aric Cyr (4):
  drm/amd/display: 3.2.208
  drm/amd/display: Fix SDR visual confirm
  drm/amd/display: 3.2.209
  drm/amd/display: 3.2.210

Arunpravin Paneer Selvam (1):
  drm/amdgpu: Fix for BO move issue

Asher Song (1):
  drm/amdgpu: Revert "drm/amdgpu: getting fan speed pwm for vega10 properly"

Bhawanpreet Lakha (1):
  drm/amd/display: Fix HDCP 1.X 1A-04 failing

Candice Li (5):
  drm/amdgpu: Optimize RAS TA initialization and TA unload funcs
  drm/amdgpu: Optimize TA load/unload/invoke debugfs interfaces
  drm/amdgpu: Update ras eeprom support for smu v13_0_0 and v13_0_10
  drm/amdgpu: Add EEPROM I2C address support for ip discovery
  drm/amdgpu: Enable GFX RAS feature for gfx v11_0_3

Charlene Liu (2):
  drm/amd/display: Update DML formula
  drm/amd/display: Fix null pointer issues found in emulation

Chengming Gui (1):
  drm/amdgpu: fix pstate setting issue

Danijel Slivka (1):
  drm/amdgpu: set vm_update_mode=0 as default for Sienna Cichlid in SRIOV 
case

David Francis (1):
  drm/amd: Add IMU fw version to fw version queries

Deming Wang (1):
  drm/amdkfd: use vma_lookup() instead of find_vma()

Dillon Varone (4):
  drm/amd/display: Update latencies on DCN321
  drm/amd/display: Set memclk levels to be at least 1 for dcn32
  drm/amd/display: Reinit DPG when exiting dynamic ODM
  drm/amd/display: Check validation passed after applying pipe split changes

Dmytro Laktyushkin (1):
  drm/amd/display: correctly populate dcn315 clock table

Eric Bernstein (1):
  drm/amd/display: Include virtual signal to set k1 and k2 values

Evan Quan (3):
  drm/amd/pm: fulfill SMU13.0.0 cstate control interface
  drm/amd/pm: fulfill SMU13.0.7 cstate control interface
  drm/amd/pm: disable cstate feature for gpu reset scenario

Fabio M. De Francesco (2):
  drm/radeon: Replace kmap() with kmap_local_page()
  drm/amd/amdgpu: Replace kmap() with kmap_local_page()

Fangzhi Zuo (3):
  drm/amd/display: Add UHBR135 and UHBR20 into debugfs
  drm/amd/display: Ignore Cable ID Featur

Re: Coverity: kfd_parse_subtype_cache(): Memory - corruptions

2022-11-04 Thread Felix Kuehling

On 2022-11-04 15:41, coverity-bot wrote:

Hello!

This is an experimental semi-automated report about issues detected by
Coverity from a scan of next-20221104 as part of the linux-next scan project:
https://scan.coverity.com/projects/linux-next-weekly-scan

You're getting this email because you were associated with the identified
lines of code (noted below) that were touched by commits:

   Fri Dec 8 23:08:59 2017 -0500
 3a87177eb141 ("drm/amdkfd: Add topology support for dGPUs")

Coverity reported the following:

*** CID 1527133:  Memory - corruptions  (OVERRUN)
drivers/gpu/drm/amd/amdkfd/kfd_crat.c:1113 in kfd_parse_subtype_cache()
1107props->cache_size = cache->cache_size;
1108props->cacheline_size = cache->cache_line_size;
1109props->cachelines_per_tag = 
cache->lines_per_tag;
1110props->cache_assoc = cache->associativity;
props->cache_latency = cache->cache_latency;
1112
vvv CID 1527133:  Memory - corruptions  (OVERRUN)
vvv Overrunning array "cache->sibling_map" of 32 bytes by passing it to a function 
which accesses it at byte offset 63 using argument "64UL". [Note: The source code 
implementation of the function has been overridden by a builtin model.]
1113memcpy(props->sibling_map, cache->sibling_map,
1114sizeof(props->sibling_map));
1115
1116/* set the sibling_map_size as 32 for CRAT from 
ACPI */
1117props->sibling_map_size = CRAT_SIBLINGMAP_SIZE;
1118

If this is a false positive, please let us know so we can mark it as
such, or teach the Coverity rules to be smarter. If not, please make
sure fixes get into linux-next. :) For patches fixing this, please
include these lines (but double-check the "Fixes" first):

Reported-by: coverity-bot 
Addresses-Coverity-ID: 1527133 ("Memory - corruptions")
Fixes: 3a87177eb141 ("drm/amdkfd: Add topology support for dGPUs")

I'm not sure why this suddenly appeared after 5 years, but the read
over-run looks legit:



I think this was introduced by a more recent patch that was in fact 
meant to fix an array overrun on HW that is outgrowing the CRAT sibling 
map size:



commit 0938fbeb6f53fc44bc9b19784dee28496e68ba0c
Author: Ma Jun 
Date:   Wed Nov 2 15:53:26 2022 +0800

    drm/amdkfd: Fix the warning of array-index-out-of-bounds

    For some GPUs with more CUs, the original sibling_map[32]
    in struct crat_subtype_cache is not enough
    to save the cache information when create the VCRAT table,
    so skip filling the struct crat_subtype_cache info instead
    fill struct kfd_cache_properties directly to fix this problem.

    Signed-off-by: Ma Jun 
    Reviewed-by: Felix Kuehling 
    Signed-off-by: Alex Deucher 

I added Ma Jun to the email.

Regards,
  Felix




struct crat_subtype_cache {
 ...
 uint8_t sibling_map[CRAT_SIBLINGMAP_SIZE];

#define CRAT_SIBLINGMAP_SIZE32


struct kfd_cache_properties {
 ...
 uint8_t sibling_map[CACHE_SIBLINGMAP_SIZE];

#define CACHE_SIBLINGMAP_SIZE 64

Thanks for your attention!



Coverity: kfd_parse_subtype_cache(): Memory - corruptions

2022-11-04 Thread coverity-bot
Hello!

This is an experimental semi-automated report about issues detected by
Coverity from a scan of next-20221104 as part of the linux-next scan project:
https://scan.coverity.com/projects/linux-next-weekly-scan

You're getting this email because you were associated with the identified
lines of code (noted below) that were touched by commits:

  Fri Dec 8 23:08:59 2017 -0500
3a87177eb141 ("drm/amdkfd: Add topology support for dGPUs")

Coverity reported the following:

*** CID 1527133:  Memory - corruptions  (OVERRUN)
drivers/gpu/drm/amd/amdkfd/kfd_crat.c:1113 in kfd_parse_subtype_cache()
1107props->cache_size = cache->cache_size;
1108props->cacheline_size = cache->cache_line_size;
1109props->cachelines_per_tag = 
cache->lines_per_tag;
1110props->cache_assoc = cache->associativity;
props->cache_latency = cache->cache_latency;
1112
vvv CID 1527133:  Memory - corruptions  (OVERRUN)
vvv Overrunning array "cache->sibling_map" of 32 bytes by passing it to a 
function which accesses it at byte offset 63 using argument "64UL". [Note: The 
source code implementation of the function has been overridden by a builtin 
model.]
1113memcpy(props->sibling_map, cache->sibling_map,
1114sizeof(props->sibling_map));
1115
1116/* set the sibling_map_size as 32 for CRAT from 
ACPI */
1117props->sibling_map_size = CRAT_SIBLINGMAP_SIZE;
1118

If this is a false positive, please let us know so we can mark it as
such, or teach the Coverity rules to be smarter. If not, please make
sure fixes get into linux-next. :) For patches fixing this, please
include these lines (but double-check the "Fixes" first):

Reported-by: coverity-bot 
Addresses-Coverity-ID: 1527133 ("Memory - corruptions")
Fixes: 3a87177eb141 ("drm/amdkfd: Add topology support for dGPUs")

I'm not sure why this suddenly appeared after 5 years, but the read
over-run looks legit:

struct crat_subtype_cache {
...
uint8_t sibling_map[CRAT_SIBLINGMAP_SIZE];

#define CRAT_SIBLINGMAP_SIZE32


struct kfd_cache_properties {
...
uint8_t sibling_map[CACHE_SIBLINGMAP_SIZE];

#define CACHE_SIBLINGMAP_SIZE 64

Thanks for your attention!

-- 
Coverity-bot


[linux-next:master] BUILD SUCCESS WITH WARNING 0cdb3579f1ee4c1e55acf8dfb0697b660067b1f8

2022-11-04 Thread kernel test robot
tree/branch: 
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
branch HEAD: 0cdb3579f1ee4c1e55acf8dfb0697b660067b1f8  Add linux-next specific 
files for 20221104

Warning reports:

https://lore.kernel.org/oe-kbuild-all/202211041320.coq8eelj-...@intel.com
https://lore.kernel.org/oe-kbuild-all/202211041654.zcupre9o-...@intel.com

Warning: (recently discovered and may have been fixed)

drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc.c:4878: warning: This comment 
starts with '/**', but isn't a kernel-doc comment. Refer 
Documentation/doc-guide/kernel-doc.rst
drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_link_dp.c:5044:24: warning: 
implicit conversion from 'enum ' to 'enum dc_status' 
[-Wenum-conversion]
drivers/gpu/drm/msm/hdmi/hdmi.c:244:1: warning: 'static' is not at beginning of 
declaration [-Wold-style-declaration]
drivers/gpu/drm/msm/hdmi/hdmi.c:251:1: warning: 'static' is not at beginning of 
declaration [-Wold-style-declaration]

Warning ids grouped by kconfigs:

gcc_recent_errors
|-- alpha-allyesconfig
|   |-- 
drivers-gpu-drm-amd-amdgpu-..-display-dc-core-dc.c:warning:This-comment-starts-with-but-isn-t-a-kernel-doc-comment.-Refer-Documentation-doc-guide-kernel-doc.rst
|   |-- 
drivers-gpu-drm-amd-amdgpu-..-display-dc-core-dc_link_dp.c:warning:implicit-conversion-from-enum-anonymous-to-enum-dc_status
|   `-- 
drivers-gpu-drm-msm-hdmi-hdmi.c:warning:static-is-not-at-beginning-of-declaration
|-- arc-allyesconfig
|   |-- 
drivers-gpu-drm-amd-amdgpu-..-display-dc-core-dc.c:warning:This-comment-starts-with-but-isn-t-a-kernel-doc-comment.-Refer-Documentation-doc-guide-kernel-doc.rst
|   |-- 
drivers-gpu-drm-amd-amdgpu-..-display-dc-core-dc_link_dp.c:warning:implicit-conversion-from-enum-anonymous-to-enum-dc_status
|   `-- 
drivers-gpu-drm-msm-hdmi-hdmi.c:warning:static-is-not-at-beginning-of-declaration
|-- arc-randconfig-r036-20221104
|   `-- 
drivers-gpu-drm-amd-amdgpu-..-display-dc-core-dc_link_dp.c:warning:implicit-conversion-from-enum-anonymous-to-enum-dc_status
|-- arc-randconfig-r043-20221104
|   |-- 
drivers-gpu-drm-amd-amdgpu-..-display-dc-core-dc.c:warning:This-comment-starts-with-but-isn-t-a-kernel-doc-comment.-Refer-Documentation-doc-guide-kernel-doc.rst
|   `-- 
drivers-gpu-drm-amd-amdgpu-..-display-dc-core-dc_link_dp.c:warning:implicit-conversion-from-enum-anonymous-to-enum-dc_status
|-- arm-allyesconfig
|   |-- 
drivers-gpu-drm-amd-amdgpu-..-display-dc-core-dc.c:warning:This-comment-starts-with-but-isn-t-a-kernel-doc-comment.-Refer-Documentation-doc-guide-kernel-doc.rst
|   |-- 
drivers-gpu-drm-amd-amdgpu-..-display-dc-core-dc_link_dp.c:warning:implicit-conversion-from-enum-anonymous-to-enum-dc_status
|   `-- 
drivers-gpu-drm-msm-hdmi-hdmi.c:warning:static-is-not-at-beginning-of-declaration
|-- arm-defconfig
|   `-- 
drivers-gpu-drm-msm-hdmi-hdmi.c:warning:static-is-not-at-beginning-of-declaration
|-- arm64-allyesconfig
|   |-- 
drivers-gpu-drm-amd-amdgpu-..-display-dc-core-dc.c:warning:This-comment-starts-with-but-isn-t-a-kernel-doc-comment.-Refer-Documentation-doc-guide-kernel-doc.rst
|   |-- 
drivers-gpu-drm-amd-amdgpu-..-display-dc-core-dc_link_dp.c:warning:implicit-conversion-from-enum-anonymous-to-enum-dc_status
|   `-- 
drivers-gpu-drm-msm-hdmi-hdmi.c:warning:static-is-not-at-beginning-of-declaration
|-- i386-allyesconfig
|   |-- 
drivers-gpu-drm-amd-amdgpu-..-display-dc-core-dc.c:warning:This-comment-starts-with-but-isn-t-a-kernel-doc-comment.-Refer-Documentation-doc-guide-kernel-doc.rst
|   `-- 
drivers-gpu-drm-amd-amdgpu-..-display-dc-core-dc_link_dp.c:warning:implicit-conversion-from-enum-anonymous-to-enum-dc_status
|-- ia64-allmodconfig
|   |-- 
drivers-gpu-drm-amd-amdgpu-..-display-dc-core-dc.c:warning:This-comment-starts-with-but-isn-t-a-kernel-doc-comment.-Refer-Documentation-doc-guide-kernel-doc.rst
|   `-- 
drivers-gpu-drm-amd-amdgpu-..-display-dc-core-dc_link_dp.c:warning:implicit-conversion-from-enum-anonymous-to-enum-dc_status
|-- ia64-buildonly-randconfig-r006-20221104
|   |-- 
drivers-gpu-drm-amd-amdgpu-..-display-dc-core-dc.c:warning:This-comment-starts-with-but-isn-t-a-kernel-doc-comment.-Refer-Documentation-doc-guide-kernel-doc.rst
|   `-- 
drivers-gpu-drm-amd-amdgpu-..-display-dc-core-dc_link_dp.c:warning:implicit-conversion-from-enum-anonymous-to-enum-dc_status
|-- m68k-allmodconfig
|   `-- 
drivers-gpu-drm-msm-hdmi-hdmi.c:warning:static-is-not-at-beginning-of-declaration
|-- m68k-allyesconfig
|   `-- 
drivers-gpu-drm-msm-hdmi-hdmi.c:warning:static-is-not-at-beginning-of-declaration
|-- mips-allyesconfig
|   |-- 
drivers-gpu-drm-amd-amdgpu-..-display-dc-core-dc.c:warning:This-comment-starts-with-but-isn-t-a-kernel-doc-comment.-Refer-Documentation-doc-guide-kernel-doc.rst
|   |-- 
drivers-gpu-drm-amd-amdgpu-..-display-dc-core-dc_link_dp.c:warning:implicit-conversion-from-enum-anonymous-to-enum-dc_status
|   `-- 
drivers-gpu-drm-msm-hdmi-hdmi.c:warning:static-is-not-at-beginning-o

Re: [PATCH 1/2] drm/radeon: Using unsigned long instead of unsigned to fix possible overflow

2022-11-04 Thread Alex Deucher
On Fri, Nov 4, 2022 at 6:05 AM Hanjun Guo  wrote:
>
> VBIOSImageOffset in struct UEFI_ACPI_VFCT is ULONG (unsigned long),
> but it will be assigned to "unsigned offset", so use unsigned long
> instead of unsigned for the offset, to avoid possible overflow.

ULONG in atombios is 32 bits so an int should be fine.

Alex

>
> Signed-off-by: Hanjun Guo 
> ---
>  drivers/gpu/drm/radeon/radeon_bios.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon_bios.c 
> b/drivers/gpu/drm/radeon/radeon_bios.c
> index 3312165..520d1d6 100644
> --- a/drivers/gpu/drm/radeon/radeon_bios.c
> +++ b/drivers/gpu/drm/radeon/radeon_bios.c
> @@ -611,7 +611,7 @@ static bool radeon_acpi_vfct_bios(struct radeon_device 
> *rdev)
> struct acpi_table_header *hdr;
> acpi_size tbl_size;
> UEFI_ACPI_VFCT *vfct;
> -   unsigned offset;
> +   unsigned long offset;
>
> if (!ACPI_SUCCESS(acpi_get_table("VFCT", 1, &hdr)))
> return false;
> --
> 1.7.12.4
>


Re: [PATCH v5 02/31] drm/i915: Don't register backlight when another backlight should be used (v2)

2022-11-04 Thread Hans de Goede
Hi Matthew, Rafael,

On 10/27/22 14:09, Rafael J. Wysocki wrote:
> On Thu, Oct 27, 2022 at 12:37 PM Hans de Goede  wrote:
>>
>> Hi,
>>
>> On 10/27/22 11:52, Matthew Garrett wrote:
>>> On Thu, Oct 27, 2022 at 11:39:38AM +0200, Hans de Goede wrote:
>>>
 The *only* behavior which actually is new in 6.1 is the native GPU
 drivers now doing the equivalent of:

  if (acpi_video_get_backlight_type() != acpi_backlight_native)
  return;

 In their backlight register paths (i), which is causing the native
 backlight to disappear on your custom laptop setup and on Chromebooks
 (with the Chromebooks case being already solved I hope.).
>>>
>>> It's causing the backlight control to vanish on any machine that isn't
>>> ((acpi_video || vendor interface) || !acpi). Most machines that fall
>>> into that are either weird or Chromebooks or old, but there are machines
>>> that fall into that.
>>
>> I acknowledge that their are machines that fall into this category,
>> but I expect / hope there to be so few of them that we can just DMI
>> quirk our way out if this.
>>
>> I believe the old group to be small because:
>>
>> 1. Generally speaking the "native" control method is usually not
>> present on the really old (pre ACPI video spec) mobile GPUs.
>>
>> 2. On most old laptops I would still expect there to be a vendor
>> interface too, and if both get registered standard desktop environments
>> will prefer the vendor one, so then we need a native DMI quirk to
>> disable the vendor interface anyways and we already have a bunch of
>> those, so some laptops in this group are already covered by DMI quirks.
>>
>> And a fix for the Chromebook case is already in Linus' tree, which
>> just leaves the weird case, of which there will hopefully be only
>> a few.
>>
>> I do share your worry that this might break some machines, but
>> the only way to really find out is to get this code out there
>> I'm afraid.
>>
>> I have just written a blog post asking for people to check if
>> their laptop might be affected; and to report various details
>> to me of their laptop is affected:
>>
>> https://hansdegoede.dreamwidth.org/26548.html
>>
>> Lets wait and see how this goes. If I get (too) many reports then
>> I will send a revert of the addition of the:
>>
>> if (acpi_video_get_backlight_type() != acpi_backlight_native)
>> return;
>>
>> check to the i915 / radeon / amd / nouveau drivers.
>>
>> (And if I only get a couple of reports I will probably just submit
>> DMI quirks for the affected models).
> 
> Sounds reasonable to me, FWIW.

I have received quite a few test reports as a result of my blogpost
(and of the blogpost's mention in an arstechnica article).

Long story short, Matthew, you are right. Quite a few laptop models
will end up with an empty /sys/class/backlight because of the native
backlight class devices no longer registering when
acpi_video_backlight_use_native() returns false.

I will submit a patch-set later today to fix this (by making 
cpi_video_backlight_use_native() always return true for now).

More detailed summary/analysis of the received test reports:

-30 unaffected models

-The following laptop models:
 Acer Aspire 1640
 Apple MacBook 2.1
 Apple MacBook 4.1
 Apple MacBook Pro 7.1 (uses nv_backligh instead of intel_backlight!)
 HP Compaq nc6120
 IBM ThinkPad X40
 System76 Starling Star1

 All only have a native intel_backlight interface and the heuristics from
 acpi_video_get_backlight_type() return acpi_backlight_vendor there causing
 the changes in 6.1 to not register native backlights when
 acpi_video_backlight_use_native() returns false resulting in an empty
 /sys/class/backlight, breaking users ability to control their laptop
 panel's brightness.

 I will submit a patch to always make acpi_video_backlight_use_native()
 return true for now to work around this for 6.1.

 I do plan to try to re-introduce that change again later. First I need to
 change the heuristics to still native on more models so that on models
 where the native backlight is the only (working) entry they will
 return native.

-The Dell N1410 has acpi_video support and acpi_osi_is_win8() returns false
 so acpi_video_get_backlight_type() returns acpi_video, but acpi_video
 fails to register a backlight device due to a_BCM eval error.
 The intel_backlight interface works fine, but this model is going to need
 a DMI-use-native-quirk to avoid intel_backlight disappearing when
 acpi_video_backlight_use_native() is changed back.

-The following laptop models actually use a vendor backlight control method,
 while also having a native backlight entry under /sys/class/backlight:

 Asus EeePC 901   -> native backlight confirmed to also work
 Dell Latitude D610   -> native backlight confirmed to work better then vendor
 Sony Vaio PCG-FRV3   -> native backlight not tested

 Note these will keep working the same as before in 6.1, independent of
 the revert. I've tracked these seperatel

Re: [PATCH] drm/amdgpu: Inherit coherence flags on dmabuf import

2022-11-04 Thread Christian König

Am 04.11.22 um 16:40 schrieb Felix Kuehling:

When importing dmabufs from other amdgpu devices, inherit the coherence
flags from the exported BO. This ensures correct MTYPEs in the GPU PTEs
for multi-GPU mappings of shared BOs.

Fixes: 763fbebb20e1 ("drm/amdgpu: Set MTYPE in PTE based on BO flags")
Tested-by: Gang Ba 
Signed-off-by: Felix Kuehling 


Acked-by: Christian König 


---
  drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c | 4 +++-
  1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
index 7bd8e33b14be..271e30e34d93 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
@@ -328,7 +328,9 @@ amdgpu_dma_buf_create_obj(struct drm_device *dev, struct 
dma_buf *dma_buf)
if (dma_buf->ops == &amdgpu_dmabuf_ops) {
struct amdgpu_bo *other = gem_to_amdgpu_bo(dma_buf->priv);
  
-		flags |= other->flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC;

+   flags |= other->flags & (AMDGPU_GEM_CREATE_CPU_GTT_USWC |
+AMDGPU_GEM_CREATE_COHERENT |
+AMDGPU_GEM_CREATE_UNCACHED);
}
  
  	ret = amdgpu_gem_object_create(adev, dma_buf->size, PAGE_SIZE,




[PATCH] drm/amdgpu: Inherit coherence flags on dmabuf import

2022-11-04 Thread Felix Kuehling
When importing dmabufs from other amdgpu devices, inherit the coherence
flags from the exported BO. This ensures correct MTYPEs in the GPU PTEs
for multi-GPU mappings of shared BOs.

Fixes: 763fbebb20e1 ("drm/amdgpu: Set MTYPE in PTE based on BO flags")
Tested-by: Gang Ba 
Signed-off-by: Felix Kuehling 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
index 7bd8e33b14be..271e30e34d93 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
@@ -328,7 +328,9 @@ amdgpu_dma_buf_create_obj(struct drm_device *dev, struct 
dma_buf *dma_buf)
if (dma_buf->ops == &amdgpu_dmabuf_ops) {
struct amdgpu_bo *other = gem_to_amdgpu_bo(dma_buf->priv);
 
-   flags |= other->flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC;
+   flags |= other->flags & (AMDGPU_GEM_CREATE_CPU_GTT_USWC |
+AMDGPU_GEM_CREATE_COHERENT |
+AMDGPU_GEM_CREATE_UNCACHED);
}
 
ret = amdgpu_gem_object_create(adev, dma_buf->size, PAGE_SIZE,
-- 
2.32.0



Re: [PATCH] drm/amdgpu: wait till Gfxoff allow signal completes during suspend

2022-11-04 Thread Alex Deucher
On Fri, Nov 4, 2022 at 12:17 AM Harsh Jain  wrote:
>
> change guarantees that gfxoff is allowed before moving further in
> s2idle sequence to add more reliablity about gfxoff in amdgpu IP's
> suspend flow
>
> Signed-off-by: Harsh Jain 
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
> index 222d3d7ea076..5b2afe348c23 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
> @@ -581,11 +581,11 @@ void amdgpu_gfx_off_ctrl(struct amdgpu_device *adev, 
> bool enable)
>
> if (adev->gfx.gfx_off_req_count == 0 &&
> !adev->gfx.gfx_off_state) {
> -   /* If going to s2idle, no need to wait */
> -   if (adev->in_s0ix)
> -   delay = GFX_OFF_NO_DELAY;

I think we can leave this hunk.  The 0 delay is still fine even if if flush.

> schedule_delayed_work(&adev->gfx.gfx_off_delay_work,
>   delay);
> +   /* If going to s2idle, no need to wait */
> +   if (adev->in_s0ix)
> +   
> flush_delayed_work(&adev->gfx.gfx_off_delay_work);
> }
> } else {
> if (adev->gfx.gfx_off_req_count == 0) {
> --
> 2.25.1
>


Re: [PATCH] Revert "drm/amdgpu: Revert "drm/amdgpu: getting fan speed pwm for vega10 properly""

2022-11-04 Thread Alex Deucher
On Fri, Nov 4, 2022 at 5:30 AM Asher Song  wrote:
>
> This reverts commit 97370f1826eb7ee6880e09ee1eaafe28232cabc6.
>
> The origin patch "drm/amdgpu: getting fan speed pwm for vega10 properly" 
> works fine. Test failure is caused by test case self.

Instead of reverting the revert, can you just reapply the original
patch and amend the commit message with this statement?
Either way:
Acked-by: Alex Deucher 

Alex

>
> Signed-off-by: Asher Song 
> ---
>  .../amd/pm/powerplay/hwmgr/vega10_thermal.c   | 25 +--
>  1 file changed, 12 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_thermal.c 
> b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_thermal.c
> index dad3e3741a4e..190af79f3236 100644
> --- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_thermal.c
> +++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_thermal.c
> @@ -67,22 +67,21 @@ int vega10_fan_ctrl_get_fan_speed_info(struct pp_hwmgr 
> *hwmgr,
>  int vega10_fan_ctrl_get_fan_speed_pwm(struct pp_hwmgr *hwmgr,
> uint32_t *speed)
>  {
> -   uint32_t current_rpm;
> -   uint32_t percent = 0;
> -
> -   if (hwmgr->thermal_controller.fanInfo.bNoFan)
> -   return 0;
> +   struct amdgpu_device *adev = hwmgr->adev;
> +   uint32_t duty100, duty;
> +   uint64_t tmp64;
>
> -   if (vega10_get_current_rpm(hwmgr, ¤t_rpm))
> -   return -1;
> +   duty100 = REG_GET_FIELD(RREG32_SOC15(THM, 0, mmCG_FDO_CTRL1),
> +   CG_FDO_CTRL1, FMAX_DUTY100);
> +   duty = REG_GET_FIELD(RREG32_SOC15(THM, 0, mmCG_THERMAL_STATUS),
> +   CG_THERMAL_STATUS, FDO_PWM_DUTY);
>
> -   if (hwmgr->thermal_controller.
> -   advanceFanControlParameters.usMaxFanRPM != 0)
> -   percent = current_rpm * 255 /
> -   hwmgr->thermal_controller.
> -   advanceFanControlParameters.usMaxFanRPM;
> +   if (!duty100)
> +   return -EINVAL;
>
> -   *speed = MIN(percent, 255);
> +   tmp64 = (uint64_t)duty * 255;
> +   do_div(tmp64, duty100);
> +   *speed = MIN((uint32_t)tmp64, 255);
>
> return 0;
>  }
> --
> 2.25.1
>


[PATCH v1] drm/amd/display: Have risk for memory exhaustion

2022-11-04 Thread LongJun Tang
In dcn*_clock_source_create when dcn*_clk_src_construct fails allocated
clk_src needs release. A local attack could use this to cause memory
exhaustion.

Signed-off-by: LongJun Tang 
---
 drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c   | 1 +
 drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.c | 1 +
 drivers/gpu/drm/amd/display/dc/dcn302/dcn302_resource.c | 1 +
 drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.c | 1 +
 drivers/gpu/drm/amd/display/dc/dcn31/dcn31_resource.c   | 1 +
 drivers/gpu/drm/amd/display/dc/dcn315/dcn315_resource.c | 1 +
 drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c   | 1 +
 drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.c | 1 +
 8 files changed, 8 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c 
b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c
index 020f512e9690..9b7e786bd4a2 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c
@@ -1323,6 +1323,7 @@ static struct clock_source *dcn30_clock_source_create(
return &clk_src->base;
}
 
+   kfree(clk_src);
BREAK_TO_DEBUGGER();
return NULL;
 }
diff --git a/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.c 
b/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.c
index f04595b750ab..7c1225046544 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.c
@@ -1288,6 +1288,7 @@ static struct clock_source *dcn301_clock_source_create(
return &clk_src->base;
}
 
+   kfree(clk_src);
BREAK_TO_DEBUGGER();
return NULL;
 }
diff --git a/drivers/gpu/drm/amd/display/dc/dcn302/dcn302_resource.c 
b/drivers/gpu/drm/amd/display/dc/dcn302/dcn302_resource.c
index b925b6ddde5a..73ae1146dad5 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn302/dcn302_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn302/dcn302_resource.c
@@ -458,6 +458,7 @@ static struct clock_source 
*dcn302_clock_source_create(struct dc_context *ctx, s
return &clk_src->base;
}
 
+   kfree(clk_src);
BREAK_TO_DEBUGGER();
return NULL;
 }
diff --git a/drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.c 
b/drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.c
index 527d5c902878..0ea97eeec5a6 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.c
@@ -425,6 +425,7 @@ static struct clock_source 
*dcn303_clock_source_create(struct dc_context *ctx, s
return &clk_src->base;
}
 
+   kfree(clk_src);
BREAK_TO_DEBUGGER();
return NULL;
 }
diff --git a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_resource.c 
b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_resource.c
index fddc21a5a04c..b02aa8874efb 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_resource.c
@@ -1625,6 +1625,7 @@ static struct clock_source *dcn31_clock_source_create(
return &clk_src->base;
}
 
+   kfree(clk_src);
BREAK_TO_DEBUGGER();
return NULL;
 }
diff --git a/drivers/gpu/drm/amd/display/dc/dcn315/dcn315_resource.c 
b/drivers/gpu/drm/amd/display/dc/dcn315/dcn315_resource.c
index 58746c437554..b2ff29e5f93c 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn315/dcn315_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn315/dcn315_resource.c
@@ -1623,6 +1623,7 @@ static struct clock_source *dcn31_clock_source_create(
return &clk_src->base;
}
 
+   kfree(clk_src);
BREAK_TO_DEBUGGER();
return NULL;
 }
diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c 
b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c
index a88dd7b3d1c1..71730bb0 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c
@@ -829,6 +829,7 @@ static struct clock_source *dcn32_clock_source_create(
return &clk_src->base;
}
 
+   kfree(clk_src);
BREAK_TO_DEBUGGER();
return NULL;
 }
diff --git a/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.c 
b/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.c
index 61087f2385a9..d3980fc243c9 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.c
@@ -828,6 +828,7 @@ static struct clock_source *dcn321_clock_source_create(
return &clk_src->base;
}
 
+   kfree(clk_src);
BREAK_TO_DEBUGGER();
return NULL;
 }
-- 
2.17.1


No virus found
Checked by Hillstone Network AntiVirus


Re: [PATCH] drm/amd/amdgpu: Enable gfx pipe1 and fix related issues

2022-11-04 Thread Christian König




Am 04.11.22 um 12:19 schrieb Emily Deng:

Starting from SIENNA CICHLID asic supports two gfx pipes, enabling
two graphics queues for performance concern.

Signed-off-by: Emily Deng 
---
  drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c |  2 +-
  drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c  | 42 -
  2 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
index 331aa191910c..0072f36b44d1 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
@@ -33,7 +33,7 @@
container_of((e), struct amdgpu_ctx_entity, entity)
  
  const unsigned int amdgpu_ctx_num_entities[AMDGPU_HW_IP_NUM] = {

-   [AMDGPU_HW_IP_GFX]  =   1,
+   [AMDGPU_HW_IP_GFX]  =   2,


Again, please completely drop this. That change absolutely makes no 
sense at all.


Regards,
Christian.


[AMDGPU_HW_IP_COMPUTE]  =   4,
[AMDGPU_HW_IP_DMA]  =   2,
[AMDGPU_HW_IP_UVD]  =   1,
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
index 49d34c7bbf20..bbf18060611e 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
@@ -4606,7 +4606,7 @@ static int gfx_v10_0_sw_init(void *handle)
case IP_VERSION(10, 3, 3):
case IP_VERSION(10, 3, 7):
adev->gfx.me.num_me = 1;
-   adev->gfx.me.num_pipe_per_me = 1;
+   adev->gfx.me.num_pipe_per_me = 2;
adev->gfx.me.num_queue_per_pipe = 1;
adev->gfx.mec.num_mec = 2;
adev->gfx.mec.num_pipe_per_mec = 4;
@@ -6008,6 +6008,24 @@ static int gfx_v10_0_cp_gfx_load_microcode(struct 
amdgpu_device *adev)
return 0;
  }
  
+static int gfx_v10_0_wait_for_idle(void *handle)

+{
+   unsigned i;
+   u32 tmp;
+   struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+
+   for (i = 0; i < adev->usec_timeout; i++) {
+   /* read MC_STATUS */
+   tmp = RREG32_SOC15(GC, 0, mmGRBM_STATUS) &
+   GRBM_STATUS__GUI_ACTIVE_MASK;
+
+   if (!REG_GET_FIELD(tmp, GRBM_STATUS, GUI_ACTIVE))
+   return 0;
+   udelay(1);
+   }
+   return -ETIMEDOUT;
+}
+
  static int gfx_v10_0_cp_gfx_start(struct amdgpu_device *adev)
  {
struct amdgpu_ring *ring;
@@ -6069,7 +6087,7 @@ static int gfx_v10_0_cp_gfx_start(struct amdgpu_device 
*adev)
amdgpu_ring_write(ring, 0x8000);
  
  	amdgpu_ring_commit(ring);

-
+   gfx_v10_0_wait_for_idle(adev);
/* submit cs packet to copy state 0 to next available state */
if (adev->gfx.num_gfx_rings > 1) {
/* maximum supported gfx ring is 2 */
@@ -7404,24 +7422,6 @@ static bool gfx_v10_0_is_idle(void *handle)
return true;
  }
  
-static int gfx_v10_0_wait_for_idle(void *handle)

-{
-   unsigned i;
-   u32 tmp;
-   struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-   for (i = 0; i < adev->usec_timeout; i++) {
-   /* read MC_STATUS */
-   tmp = RREG32_SOC15(GC, 0, mmGRBM_STATUS) &
-   GRBM_STATUS__GUI_ACTIVE_MASK;
-
-   if (!REG_GET_FIELD(tmp, GRBM_STATUS, GUI_ACTIVE))
-   return 0;
-   udelay(1);
-   }
-   return -ETIMEDOUT;
-}
-
  static int gfx_v10_0_soft_reset(void *handle)
  {
u32 grbm_soft_reset = 0;
@@ -8466,7 +8466,7 @@ static void gfx_v10_0_ring_emit_hdp_flush(struct 
amdgpu_ring *ring)
}
reg_mem_engine = 0;
} else {
-   ref_and_mask = nbio_hf_reg->ref_and_mask_cp0;
+   ref_and_mask = nbio_hf_reg->ref_and_mask_cp0 << ring->pipe;
reg_mem_engine = 1; /* pfp */
}
  




[PATCH] drm/amd/amdgpu: Enable gfx pipe1 and fix related issues

2022-11-04 Thread Emily Deng
Starting from SIENNA CICHLID asic supports two gfx pipes, enabling
two graphics queues for performance concern.

Signed-off-by: Emily Deng 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c |  2 +-
 drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c  | 42 -
 2 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
index 331aa191910c..0072f36b44d1 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
@@ -33,7 +33,7 @@
container_of((e), struct amdgpu_ctx_entity, entity)
 
 const unsigned int amdgpu_ctx_num_entities[AMDGPU_HW_IP_NUM] = {
-   [AMDGPU_HW_IP_GFX]  =   1,
+   [AMDGPU_HW_IP_GFX]  =   2,
[AMDGPU_HW_IP_COMPUTE]  =   4,
[AMDGPU_HW_IP_DMA]  =   2,
[AMDGPU_HW_IP_UVD]  =   1,
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
index 49d34c7bbf20..bbf18060611e 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
@@ -4606,7 +4606,7 @@ static int gfx_v10_0_sw_init(void *handle)
case IP_VERSION(10, 3, 3):
case IP_VERSION(10, 3, 7):
adev->gfx.me.num_me = 1;
-   adev->gfx.me.num_pipe_per_me = 1;
+   adev->gfx.me.num_pipe_per_me = 2;
adev->gfx.me.num_queue_per_pipe = 1;
adev->gfx.mec.num_mec = 2;
adev->gfx.mec.num_pipe_per_mec = 4;
@@ -6008,6 +6008,24 @@ static int gfx_v10_0_cp_gfx_load_microcode(struct 
amdgpu_device *adev)
return 0;
 }
 
+static int gfx_v10_0_wait_for_idle(void *handle)
+{
+   unsigned i;
+   u32 tmp;
+   struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+
+   for (i = 0; i < adev->usec_timeout; i++) {
+   /* read MC_STATUS */
+   tmp = RREG32_SOC15(GC, 0, mmGRBM_STATUS) &
+   GRBM_STATUS__GUI_ACTIVE_MASK;
+
+   if (!REG_GET_FIELD(tmp, GRBM_STATUS, GUI_ACTIVE))
+   return 0;
+   udelay(1);
+   }
+   return -ETIMEDOUT;
+}
+
 static int gfx_v10_0_cp_gfx_start(struct amdgpu_device *adev)
 {
struct amdgpu_ring *ring;
@@ -6069,7 +6087,7 @@ static int gfx_v10_0_cp_gfx_start(struct amdgpu_device 
*adev)
amdgpu_ring_write(ring, 0x8000);
 
amdgpu_ring_commit(ring);
-
+   gfx_v10_0_wait_for_idle(adev);
/* submit cs packet to copy state 0 to next available state */
if (adev->gfx.num_gfx_rings > 1) {
/* maximum supported gfx ring is 2 */
@@ -7404,24 +7422,6 @@ static bool gfx_v10_0_is_idle(void *handle)
return true;
 }
 
-static int gfx_v10_0_wait_for_idle(void *handle)
-{
-   unsigned i;
-   u32 tmp;
-   struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-   for (i = 0; i < adev->usec_timeout; i++) {
-   /* read MC_STATUS */
-   tmp = RREG32_SOC15(GC, 0, mmGRBM_STATUS) &
-   GRBM_STATUS__GUI_ACTIVE_MASK;
-
-   if (!REG_GET_FIELD(tmp, GRBM_STATUS, GUI_ACTIVE))
-   return 0;
-   udelay(1);
-   }
-   return -ETIMEDOUT;
-}
-
 static int gfx_v10_0_soft_reset(void *handle)
 {
u32 grbm_soft_reset = 0;
@@ -8466,7 +8466,7 @@ static void gfx_v10_0_ring_emit_hdp_flush(struct 
amdgpu_ring *ring)
}
reg_mem_engine = 0;
} else {
-   ref_and_mask = nbio_hf_reg->ref_and_mask_cp0;
+   ref_and_mask = nbio_hf_reg->ref_and_mask_cp0 << ring->pipe;
reg_mem_engine = 1; /* pfp */
}
 
-- 
2.36.1



[PATCH] drm/amdgpu: add vram reservation logic based on vram_usagebyfirmware_v2_2

2022-11-04 Thread Tong Liu01
Move TMR region from top of FB to 2MB for FFBM, so we need to reserve TMR region
firstly to make sure TMR can be allocated at 2MB

Signed-off-by: Tong Liu01 
---
 .../gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c  | 106 ++
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c   |  52 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h   |   6 +
 drivers/gpu/drm/amd/include/atomfirmware.h|  56 -
 4 files changed, 192 insertions(+), 28 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
index b81b77a9efa6..65cf23818f4e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
@@ -101,39 +101,99 @@ void amdgpu_atomfirmware_scratch_regs_init(struct 
amdgpu_device *adev)
}
 }
 
+static int amdgpu_atomfirmware_allocate_fb_v2_1(struct amdgpu_device *adev,
+   struct vram_usagebyfirmware_v2_1 *firmware_usage_v2_1,
+   int *usage_bytes)
+{
+   uint32_t start_addr, size;
+
+   DRM_DEBUG("atom firmware v2_1 requested %08x %dkb fw %dkb drv\n",
+   le32_to_cpu(firmware_usage_v2_1->start_address_in_kb),
+   le16_to_cpu(firmware_usage_v2_1->used_by_firmware_in_kb),
+   le16_to_cpu(firmware_usage_v2_1->used_by_driver_in_kb));
+
+   start_addr = le32_to_cpu(firmware_usage_v2_1->start_address_in_kb);
+   size = le16_to_cpu(firmware_usage_v2_1->used_by_firmware_in_kb);
+
+   if ((uint32_t)(start_addr & ATOM_VRAM_OPERATION_FLAGS_MASK) ==
+   (uint32_t)(ATOM_VRAM_BLOCK_SRIOV_MSG_SHARE_RESERVATION <<
+   ATOM_VRAM_OPERATION_FLAGS_SHIFT)) {
+   /* Firmware request VRAM reservation for SR-IOV */
+   adev->mman.fw_vram_usage_start_offset = (start_addr &
+   (~ATOM_VRAM_OPERATION_FLAGS_MASK)) << 10;
+   adev->mman.fw_vram_usage_size = size << 10;
+   /* Use the default scratch size */
+   usage_bytes = 0;
+   } else {
+   usage_bytes =
+   le16_to_cpu(firmware_usage_v2_1->used_by_driver_in_kb) 
<< 10;
+   }
+   return 0;
+}
+
+static int amdgpu_atomfirmware_allocate_fb_v2_2(struct amdgpu_device *adev,
+   struct vram_usagebyfirmware_v2_2 *firmware_usage_v2_2,
+   int *usage_bytes)
+{
+   uint32_t fw_start_addr, fw_size, drv_start_addr, drv_size;
+
+   DRM_DEBUG("atom requested fw start at %08x %dkb and drv start at %08x 
%dkb\n",
+   le32_to_cpu(firmware_usage_v2_2->fw_region_start_address_in_kb),
+   le16_to_cpu(firmware_usage_v2_2->used_by_firmware_in_kb),
+   
le32_to_cpu(firmware_usage_v2_2->driver_region0_start_address_in_kb),
+   le32_to_cpu(firmware_usage_v2_2->used_by_driver_region0_in_kb));
+
+   fw_start_addr = 
le32_to_cpu(firmware_usage_v2_2->fw_region_start_address_in_kb);
+   fw_size = le16_to_cpu(firmware_usage_v2_2->used_by_firmware_in_kb);
+
+   drv_start_addr = 
le32_to_cpu(firmware_usage_v2_2->driver_region0_start_address_in_kb);
+   drv_size = 
le32_to_cpu(firmware_usage_v2_2->used_by_driver_region0_in_kb);
+
+   if ((uint32_t)(fw_start_addr & (ATOM_VRAM_BLOCK_NEEDS_NO_RESERVATION << 
30)) == 0) {
+   /* Firmware request VRAM reservation for SR-IOV */
+   adev->mman.fw_vram_usage_start_offset = (fw_start_addr &
+   (~ATOM_VRAM_OPERATION_FLAGS_MASK)) << 10;
+   adev->mman.fw_vram_usage_size = fw_size << 10;
+   }
+
+   if ((uint32_t)(drv_start_addr & (ATOM_VRAM_BLOCK_NEEDS_NO_RESERVATION 
<< 30)) == 0) {
+   /* driver request VRAM reservation for SR-IOV */
+   adev->mman.drv_vram_usage_start_offset = (drv_start_addr &
+   (~ATOM_VRAM_OPERATION_FLAGS_MASK)) << 10;
+   adev->mman.drv_vram_usage_size = drv_size << 10;
+   }
+
+   usage_bytes = 0;
+   return 0;
+}
+
 int amdgpu_atomfirmware_allocate_fb_scratch(struct amdgpu_device *adev)
 {
struct atom_context *ctx = adev->mode_info.atom_context;
int index = 
get_index_into_master_table(atom_master_list_of_data_tables_v2_1,
vram_usagebyfirmware);
-   struct vram_usagebyfirmware_v2_1 *firmware_usage;
-   uint32_t start_addr, size;
+   struct vram_usagebyfirmware_v2_1 *firmware_usage_v2_1;
+   struct vram_usagebyfirmware_v2_2 *firmware_usage_v2_2;
uint16_t data_offset;
+   uint8_t frev, crev;
int usage_bytes = 0;
 
-   if (amdgpu_atom_parse_data_header(ctx, index, NULL, NULL, NULL, 
&data_offset)) {
-   firmware_usage = (struct vram_usagebyfirmware_v2_1 *)(ctx->bios 
+ data_offset);
-   DRM_DEBUG("atom firmware requested %08x %dkb fw %dkb drv\n",
- le32_to_cpu(firmware_usage->start_address_in_kb),
- 

Re: [PATCH v3 23/23] drm/fb-helper: Clarify use of last_close and output_poll_changed

2022-11-04 Thread Javier Martinez Canillas
On 11/3/22 16:14, Thomas Zimmermann wrote:
> Clarify documentation in the use of struct drm_driver.last_close and
> struct drm_mode_config_funcs.output_poll_changed. Those callbacks should
> not be said for fbdev implementations on top of struct drm_client_funcs.
> 
> Signed-off-by: Thomas Zimmermann 
> ---

Reviewed-by: Javier Martinez Canillas 

-- 
Best regards,

Javier Martinez Canillas
Core Platforms
Red Hat



Re: [PATCH v3 20/23] drm/fb-helper: Set flag in struct drm_fb_helper for leaking physical addresses

2022-11-04 Thread Javier Martinez Canillas
On 11/3/22 16:14, Thomas Zimmermann wrote:
> Uncouple the parameter drm_leak_fbdev_smem from the implementation by
> setting a flag in struct drm_fb_helper. This will help to move the
> generic fbdev emulation into its own source file, while keeping the
> parameter in drm_fb_helper.c. No functional changes.
> 
> Signed-off-by: Thomas Zimmermann 
> ---

Reviewed-by: Javier Martinez Canillas 

-- 
Best regards,

Javier Martinez Canillas
Core Platforms
Red Hat



[PATCH 1/2] drm/radeon: Using unsigned long instead of unsigned to fix possible overflow

2022-11-04 Thread Hanjun Guo
VBIOSImageOffset in struct UEFI_ACPI_VFCT is ULONG (unsigned long),
but it will be assigned to "unsigned offset", so use unsigned long
instead of unsigned for the offset, to avoid possible overflow.

Signed-off-by: Hanjun Guo 
---
 drivers/gpu/drm/radeon/radeon_bios.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/radeon/radeon_bios.c 
b/drivers/gpu/drm/radeon/radeon_bios.c
index 3312165..520d1d6 100644
--- a/drivers/gpu/drm/radeon/radeon_bios.c
+++ b/drivers/gpu/drm/radeon/radeon_bios.c
@@ -611,7 +611,7 @@ static bool radeon_acpi_vfct_bios(struct radeon_device 
*rdev)
struct acpi_table_header *hdr;
acpi_size tbl_size;
UEFI_ACPI_VFCT *vfct;
-   unsigned offset;
+   unsigned long offset;
 
if (!ACPI_SUCCESS(acpi_get_table("VFCT", 1, &hdr)))
return false;
-- 
1.7.12.4



[PATCH 2/2] drm/radeon: Add the missed acpi_put_table() to fix memory leak

2022-11-04 Thread Hanjun Guo
When the radeon driver reads the bios information from ACPI
table in radeon_acpi_vfct_bios(), it misses to call acpi_put_table()
to release the ACPI memory after the init, so add acpi_put_table()
properly to fix the memory leak.

Fixes: 268ba0a99f89 ("drm/radeon: implement ACPI VFCT vbios fetch (v3)")
Signed-off-by: Hanjun Guo 
---
 drivers/gpu/drm/radeon/radeon_bios.c | 18 +++---
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_bios.c 
b/drivers/gpu/drm/radeon/radeon_bios.c
index 520d1d6..16730c1 100644
--- a/drivers/gpu/drm/radeon/radeon_bios.c
+++ b/drivers/gpu/drm/radeon/radeon_bios.c
@@ -612,13 +612,14 @@ static bool radeon_acpi_vfct_bios(struct radeon_device 
*rdev)
acpi_size tbl_size;
UEFI_ACPI_VFCT *vfct;
unsigned long offset;
+   bool r = false;
 
if (!ACPI_SUCCESS(acpi_get_table("VFCT", 1, &hdr)))
return false;
tbl_size = hdr->length;
if (tbl_size < sizeof(UEFI_ACPI_VFCT)) {
DRM_ERROR("ACPI VFCT table present but broken (too short 
#1)\n");
-   return false;
+   goto out;
}
 
vfct = (UEFI_ACPI_VFCT *)hdr;
@@ -631,13 +632,13 @@ static bool radeon_acpi_vfct_bios(struct radeon_device 
*rdev)
offset += sizeof(VFCT_IMAGE_HEADER);
if (offset > tbl_size) {
DRM_ERROR("ACPI VFCT image header truncated\n");
-   return false;
+   goto out;
}
 
offset += vhdr->ImageLength;
if (offset > tbl_size) {
DRM_ERROR("ACPI VFCT image truncated\n");
-   return false;
+   goto out;
}
 
if (vhdr->ImageLength &&
@@ -649,15 +650,18 @@ static bool radeon_acpi_vfct_bios(struct radeon_device 
*rdev)
rdev->bios = kmemdup(&vbios->VbiosContent,
 vhdr->ImageLength,
 GFP_KERNEL);
+   if (rdev->bios)
+  r = true;
 
-   if (!rdev->bios)
-   return false;
-   return true;
+   goto out;
}
}
 
DRM_ERROR("ACPI VFCT table present but broken (too short #2)\n");
-   return false;
+
+out:
+   acpi_put_table(hdr);
+   return r;
 }
 #else
 static inline bool radeon_acpi_vfct_bios(struct radeon_device *rdev)
-- 
1.7.12.4



RE: [PATCH] drm/amdgpu: wait till Gfxoff allow signal completes during suspend

2022-11-04 Thread Jain, Harsh
Please find my reply inline below

>> -Original Message-
>> From: amd-gfx  On Behalf Of 
>> Harsh Jain
>> Sent: Friday, November 4, 2022 12:17 PM
>> To: Deucher, Alexander 
>> Cc: Jain, Harsh ; amd-gfx@lists.freedesktop.org
>> Subject: [PATCH] drm/amdgpu: wait till Gfxoff allow signal completes 
>> during suspend
>> 
>> change guarantees that gfxoff is allowed before moving further in 
>> s2idle sequence to add more reliablity about gfxoff in amdgpu IP's 
>> suspend flow
>> 
>> Signed-off-by: Harsh Jain 
>> 
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
>> index 222d3d7ea076..5b2afe348c23 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
>> @@ -581,11 +581,11 @@ void amdgpu_gfx_off_ctrl(struct amdgpu_device 
>> *adev, bool enable)
>> 
>>  if (adev->gfx.gfx_off_req_count == 0 &&
>>  !adev->gfx.gfx_off_state) {
>> -/* If going to s2idle, no need to wait */
>> -if (adev->in_s0ix)
>> -delay = GFX_OFF_NO_DELAY;
>>  schedule_delayed_work(&adev-
>> >gfx.gfx_off_delay_work,
>>delay);
>> +/* If going to s2idle, no need to wait */
>> +if (adev->in_s0ix)
>> +flush_delayed_work(&adev-
>> >gfx.gfx_off_delay_work);
>[Quan, Evan] This seems a little weird. Can you just call 
>amdgpu_device_delay_enable_gfx_off directly for s0ix case?
>
>Evan
[Harsh Jain] amdgpu_device_delay_enable_gfx_off is a static function in 
amdgpu_device file.
It's better to keep it static otherwise it would create a new api for gfxoff 
control for which current api amdgpu_gfx_off_ctrl  is available.

Thanks
>>  }
>>  } else {
>>  if (adev->gfx.gfx_off_req_count == 0) {
>> --
>> 2.25.1


Re: [PATCH] drm/amdgpu: add vram reservation logic based on vram_usagebyfirmware_v2_2

2022-11-04 Thread Christian König

Hi Esther,

ok, that works as well.

I would just move the handling of version of the firmware table into 
separate functions. That should make it easier to understand what's 
going on here.


Thanks,
Christian.

Am 04.11.22 um 10:34 schrieb Liu01, Tong (Esther):

[AMD Official Use Only - General]

Hi Christian,

Based on VBIOS's comment " driver can allocate their own reservation region as long 
as it does not overlap firwmare's reservation region". Our understanding is that 
they are not mutual exclusive. So we create extra parameters to record drv reservation 
request.

Kind regards,
Esther

-Original Message-
From: Koenig, Christian 
Sent: 2022年11月4日星期五 下午5:09
To: Liu01, Tong (Esther) ; amd-gfx@lists.freedesktop.org
Cc: Andrey Grodzovsky ; Quan, Evan ; Chen, Horace ; 
Tuikov, Luben ; Deucher, Alexander ; Xiao, Jack ; 
Zhang, Hawking ; Liu, Monk ; Xu, Feifei ; Wang, Yang(Kevin) 

Subject: Re: [PATCH] drm/amdgpu: add vram reservation logic based on 
vram_usagebyfirmware_v2_2

Am 04.11.22 um 09:52 schrieb Tong Liu01:

Move TMR region from top of FB to 2MB for FFBM, so we need to reserve
TMR region firstly to make sure TMR can be allocated at 2MB

If I understand it correctly the two methods are mutual exclusive. So I think 
you can just extend the existing function in the amdgpu TTM code instead of 
adding a new one.


Signed-off-by: Tong Liu01 
---
   .../gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c  | 84 ++-
   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c   | 52 
   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h   |  6 ++
   drivers/gpu/drm/amd/include/atomfirmware.h| 56 +++--
   4 files changed, 171 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
index b81b77a9efa6..f577b1d151d9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
@@ -106,34 +106,74 @@ int amdgpu_atomfirmware_allocate_fb_scratch(struct 
amdgpu_device *adev)
struct atom_context *ctx = adev->mode_info.atom_context;
int index = 
get_index_into_master_table(atom_master_list_of_data_tables_v2_1,
vram_usagebyfirmware);
-   struct vram_usagebyfirmware_v2_1 *firmware_usage;
-   uint32_t start_addr, size;
+   struct vram_usagebyfirmware_v2_1 *firmware_usage_v2_1;
+   struct vram_usagebyfirmware_v2_2 *firmware_usage_v2_2;
+   uint32_t start_addr, size, fw_start_addr, fw_size, drv_addr, drv_size;
uint16_t data_offset;
+   uint8_t frev, crev;
int usage_bytes = 0;
   
-	if (amdgpu_atom_parse_data_header(ctx, index, NULL, NULL, NULL, &data_offset)) {

-   firmware_usage = (struct vram_usagebyfirmware_v2_1 *)(ctx->bios 
+ data_offset);
-   DRM_DEBUG("atom firmware requested %08x %dkb fw %dkb drv\n",
- le32_to_cpu(firmware_usage->start_address_in_kb),
- le16_to_cpu(firmware_usage->used_by_firmware_in_kb),
- le16_to_cpu(firmware_usage->used_by_driver_in_kb));
-
-   start_addr = le32_to_cpu(firmware_usage->start_address_in_kb);
-   size = le16_to_cpu(firmware_usage->used_by_firmware_in_kb);
-
-   if ((uint32_t)(start_addr & ATOM_VRAM_OPERATION_FLAGS_MASK) ==
-   (uint32_t)(ATOM_VRAM_BLOCK_SRIOV_MSG_SHARE_RESERVATION 
<<
-   ATOM_VRAM_OPERATION_FLAGS_SHIFT)) {
-   /* Firmware request VRAM reservation for SR-IOV */
-   adev->mman.fw_vram_usage_start_offset = (start_addr &
-   (~ATOM_VRAM_OPERATION_FLAGS_MASK)) << 10;
-   adev->mman.fw_vram_usage_size = size << 10;
-   /* Use the default scratch size */
+   if (amdgpu_atom_parse_data_header(ctx, index, NULL, &frev, &crev, 
&data_offset)) {
+   if (frev == 2 && crev == 1) {
+   firmware_usage_v2_1 =
+   (struct vram_usagebyfirmware_v2_1 *)(ctx->bios 
+ data_offset);
+   DRM_DEBUG("atom firmware v2_1 requested %08x %dkb fw %dkb 
drv\n",
+ le32_to_cpu(firmware_usage_v2_1->start_address_in_kb),
+ 
le16_to_cpu(firmware_usage_v2_1->used_by_firmware_in_kb),
+ 
le16_to_cpu(firmware_usage_v2_1->used_by_driver_in_kb));
+
+   start_addr = 
le32_to_cpu(firmware_usage_v2_1->start_address_in_kb);
+   size = 
le16_to_cpu(firmware_usage_v2_1->used_by_firmware_in_kb);
+
+   if ((uint32_t)(start_addr & 
ATOM_VRAM_OPERATION_FLAGS_MASK) ==
+   
(uint32_t)(ATOM_VRAM_BLOCK_SRIOV_MSG_SHARE_RESERVATION <<
+   ATOM_VRAM_OPERATION_FLAGS_SHIFT)) {
+   /* Firmware

RE: [PATCH] drm/amd/amdgpu: Enable gfx pipe1 and fix related issues

2022-11-04 Thread Deng, Emily
[AMD Official Use Only - General]

>-Original Message-
>From: Christian König 
>Sent: Friday, November 4, 2022 5:26 PM
>To: Deng, Emily ; amd-gfx@lists.freedesktop.org;
>Michel Dänzer 
>Subject: Re: [PATCH] drm/amd/amdgpu: Enable gfx pipe1 and fix related
>issues
>
>Am 04.11.22 um 01:32 schrieb Emily Deng:
>> Starting from SIENNA CICHLID asic supports two gfx pipes, enabling two
>> graphics queues for performance concern.
>
>With the printk still in the patch I assume that this is just a debugging 
>patch?
>
Sorry, will delete it.
>>
>> Signed-off-by: Emily Deng 
>> ---
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c |  2 +-
>>   drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c  | 43 +
>>   2 files changed, 23 insertions(+), 22 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
>> index 331aa191910c..0072f36b44d1 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
>> @@ -33,7 +33,7 @@
>>  container_of((e), struct amdgpu_ctx_entity, entity)
>>
>>   const unsigned int amdgpu_ctx_num_entities[AMDGPU_HW_IP_NUM] = {
>> -[AMDGPU_HW_IP_GFX]  =   1,
>> +[AMDGPU_HW_IP_GFX]  =   2,
>
>That's an absolutely clear NAK and as far as I can see also unnecessary.
>
>We don't want to expose the GFX queues as separate queues to userspace.
>
>Instead the queues have separate priorities which userspace can select.
>
>Regards,
>Christian.
>
>>  [AMDGPU_HW_IP_COMPUTE]  =   4,
>>  [AMDGPU_HW_IP_DMA]  =   2,
>>  [AMDGPU_HW_IP_UVD]  =   1,
>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
>> b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
>> index 49d34c7bbf20..9219cd29acd3 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
>> @@ -4606,7 +4606,7 @@ static int gfx_v10_0_sw_init(void *handle)
>>  case IP_VERSION(10, 3, 3):
>>  case IP_VERSION(10, 3, 7):
>>  adev->gfx.me.num_me = 1;
>> -adev->gfx.me.num_pipe_per_me = 1;
>> +adev->gfx.me.num_pipe_per_me = 2;
>>  adev->gfx.me.num_queue_per_pipe = 1;
>>  adev->gfx.mec.num_mec = 2;
>>  adev->gfx.mec.num_pipe_per_mec = 4; @@ -6008,6 +6008,25
>@@ static
>> int gfx_v10_0_cp_gfx_load_microcode(struct amdgpu_device *adev)
>>  return 0;
>>   }
>>
>> +static int gfx_v10_0_wait_for_idle(void *handle) {
>> +unsigned i;
>> +u32 tmp;
>> +struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>> +
>> +for (i = 0; i < adev->usec_timeout; i++) {
>> +/* read MC_STATUS */
>> +tmp = RREG32_SOC15(GC, 0, mmGRBM_STATUS) &
>> +GRBM_STATUS__GUI_ACTIVE_MASK;
>> +
>> +if (!REG_GET_FIELD(tmp, GRBM_STATUS, GUI_ACTIVE))
>> +return 0;
>> +udelay(1);
>> +}
>> +printk("Emily:gfx_v10_0_wait_for_idle\n");
>> +return -ETIMEDOUT;
>> +}
>> +
>>   static int gfx_v10_0_cp_gfx_start(struct amdgpu_device *adev)
>>   {
>>  struct amdgpu_ring *ring;
>> @@ -6069,7 +6088,7 @@ static int gfx_v10_0_cp_gfx_start(struct
>amdgpu_device *adev)
>>  amdgpu_ring_write(ring, 0x8000);
>>
>>  amdgpu_ring_commit(ring);
>> -
>> +gfx_v10_0_wait_for_idle(adev);
>>  /* submit cs packet to copy state 0 to next available state */
>>  if (adev->gfx.num_gfx_rings > 1) {
>>  /* maximum supported gfx ring is 2 */ @@ -7404,24 +7423,6
>@@
>> static bool gfx_v10_0_is_idle(void *handle)
>>  return true;
>>   }
>>
>> -static int gfx_v10_0_wait_for_idle(void *handle) -{
>> -unsigned i;
>> -u32 tmp;
>> -struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>> -
>> -for (i = 0; i < adev->usec_timeout; i++) {
>> -/* read MC_STATUS */
>> -tmp = RREG32_SOC15(GC, 0, mmGRBM_STATUS) &
>> -GRBM_STATUS__GUI_ACTIVE_MASK;
>> -
>> -if (!REG_GET_FIELD(tmp, GRBM_STATUS, GUI_ACTIVE))
>> -return 0;
>> -udelay(1);
>> -}
>> -return -ETIMEDOUT;
>> -}
>> -
>>   static int gfx_v10_0_soft_reset(void *handle)
>>   {
>>  u32 grbm_soft_reset = 0;
>> @@ -8466,7 +8467,7 @@ static void gfx_v10_0_ring_emit_hdp_flush(struct
>amdgpu_ring *ring)
>>  }
>>  reg_mem_engine = 0;
>>  } else {
>> -ref_and_mask = nbio_hf_reg->ref_and_mask_cp0;
>> +ref_and_mask = nbio_hf_reg->ref_and_mask_cp0 << ring-
>>pipe;
>>  reg_mem_engine = 1; /* pfp */
>>  }
>>



RE: [PATCH] drm/amdgpu: add vram reservation logic based on vram_usagebyfirmware_v2_2

2022-11-04 Thread Liu01, Tong (Esther)
[AMD Official Use Only - General]

Hi Christian,

Based on VBIOS's comment " driver can allocate their own reservation region as 
long as it does not overlap firwmare's reservation region". Our understanding 
is that they are not mutual exclusive. So we create extra parameters to record 
drv reservation request. 

Kind regards,
Esther

-Original Message-
From: Koenig, Christian  
Sent: 2022年11月4日星期五 下午5:09
To: Liu01, Tong (Esther) ; amd-gfx@lists.freedesktop.org
Cc: Andrey Grodzovsky ; Quan, Evan 
; Chen, Horace ; Tuikov, Luben 
; Deucher, Alexander ; Xiao, 
Jack ; Zhang, Hawking ; Liu, Monk 
; Xu, Feifei ; Wang, Yang(Kevin) 

Subject: Re: [PATCH] drm/amdgpu: add vram reservation logic based on 
vram_usagebyfirmware_v2_2

Am 04.11.22 um 09:52 schrieb Tong Liu01:
> Move TMR region from top of FB to 2MB for FFBM, so we need to reserve 
> TMR region firstly to make sure TMR can be allocated at 2MB

If I understand it correctly the two methods are mutual exclusive. So I think 
you can just extend the existing function in the amdgpu TTM code instead of 
adding a new one.

>
> Signed-off-by: Tong Liu01 
> ---
>   .../gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c  | 84 ++-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c   | 52 
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h   |  6 ++
>   drivers/gpu/drm/amd/include/atomfirmware.h| 56 +++--
>   4 files changed, 171 insertions(+), 27 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
> index b81b77a9efa6..f577b1d151d9 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
> @@ -106,34 +106,74 @@ int amdgpu_atomfirmware_allocate_fb_scratch(struct 
> amdgpu_device *adev)
>   struct atom_context *ctx = adev->mode_info.atom_context;
>   int index = 
> get_index_into_master_table(atom_master_list_of_data_tables_v2_1,
>   vram_usagebyfirmware);
> - struct vram_usagebyfirmware_v2_1 *firmware_usage;
> - uint32_t start_addr, size;
> + struct vram_usagebyfirmware_v2_1 *firmware_usage_v2_1;
> + struct vram_usagebyfirmware_v2_2 *firmware_usage_v2_2;
> + uint32_t start_addr, size, fw_start_addr, fw_size, drv_addr, drv_size;
>   uint16_t data_offset;
> + uint8_t frev, crev;
>   int usage_bytes = 0;
>   
> - if (amdgpu_atom_parse_data_header(ctx, index, NULL, NULL, NULL, 
> &data_offset)) {
> - firmware_usage = (struct vram_usagebyfirmware_v2_1 *)(ctx->bios 
> + data_offset);
> - DRM_DEBUG("atom firmware requested %08x %dkb fw %dkb drv\n",
> -   le32_to_cpu(firmware_usage->start_address_in_kb),
> -   le16_to_cpu(firmware_usage->used_by_firmware_in_kb),
> -   le16_to_cpu(firmware_usage->used_by_driver_in_kb));
> -
> - start_addr = le32_to_cpu(firmware_usage->start_address_in_kb);
> - size = le16_to_cpu(firmware_usage->used_by_firmware_in_kb);
> -
> - if ((uint32_t)(start_addr & ATOM_VRAM_OPERATION_FLAGS_MASK) ==
> - (uint32_t)(ATOM_VRAM_BLOCK_SRIOV_MSG_SHARE_RESERVATION 
> <<
> - ATOM_VRAM_OPERATION_FLAGS_SHIFT)) {
> - /* Firmware request VRAM reservation for SR-IOV */
> - adev->mman.fw_vram_usage_start_offset = (start_addr &
> - (~ATOM_VRAM_OPERATION_FLAGS_MASK)) << 10;
> - adev->mman.fw_vram_usage_size = size << 10;
> - /* Use the default scratch size */
> + if (amdgpu_atom_parse_data_header(ctx, index, NULL, &frev, &crev, 
> &data_offset)) {
> + if (frev == 2 && crev == 1) {
> + firmware_usage_v2_1 =
> + (struct vram_usagebyfirmware_v2_1 *)(ctx->bios 
> + data_offset);
> + DRM_DEBUG("atom firmware v2_1 requested %08x %dkb fw 
> %dkb drv\n",
> +   le32_to_cpu(firmware_usage_v2_1->start_address_in_kb),
> +   
> le16_to_cpu(firmware_usage_v2_1->used_by_firmware_in_kb),
> +   
> le16_to_cpu(firmware_usage_v2_1->used_by_driver_in_kb));
> +
> + start_addr = 
> le32_to_cpu(firmware_usage_v2_1->start_address_in_kb);
> + size = 
> le16_to_cpu(firmware_usage_v2_1->used_by_firmware_in_kb);
> +
> + if ((uint32_t)(start_addr & 
> ATOM_VRAM_OPERATION_FLAGS_MASK) ==
> + 
> (uint32_t)(ATOM_VRAM_BLOCK_SRIOV_MSG_SHARE_RESERVATION <<
> + ATOM_VRAM_OPERATION_FLAGS_SHIFT)) {
> + /* Firmware request VRAM reservation for SR-IOV 
> */
> + adev->mman.fw_vram_usage_start_offset = 
> (start_addr &
> + (~ATOM_VRAM_OPERATIO

[PATCH] Revert "drm/amdgpu: Revert "drm/amdgpu: getting fan speed pwm for vega10 properly""

2022-11-04 Thread Asher Song
This reverts commit 97370f1826eb7ee6880e09ee1eaafe28232cabc6.

The origin patch "drm/amdgpu: getting fan speed pwm for vega10 properly" works 
fine. Test failure is caused by test case self.

Signed-off-by: Asher Song 
---
 .../amd/pm/powerplay/hwmgr/vega10_thermal.c   | 25 +--
 1 file changed, 12 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_thermal.c 
b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_thermal.c
index dad3e3741a4e..190af79f3236 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_thermal.c
+++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_thermal.c
@@ -67,22 +67,21 @@ int vega10_fan_ctrl_get_fan_speed_info(struct pp_hwmgr 
*hwmgr,
 int vega10_fan_ctrl_get_fan_speed_pwm(struct pp_hwmgr *hwmgr,
uint32_t *speed)
 {
-   uint32_t current_rpm;
-   uint32_t percent = 0;
-
-   if (hwmgr->thermal_controller.fanInfo.bNoFan)
-   return 0;
+   struct amdgpu_device *adev = hwmgr->adev;
+   uint32_t duty100, duty;
+   uint64_t tmp64;
 
-   if (vega10_get_current_rpm(hwmgr, ¤t_rpm))
-   return -1;
+   duty100 = REG_GET_FIELD(RREG32_SOC15(THM, 0, mmCG_FDO_CTRL1),
+   CG_FDO_CTRL1, FMAX_DUTY100);
+   duty = REG_GET_FIELD(RREG32_SOC15(THM, 0, mmCG_THERMAL_STATUS),
+   CG_THERMAL_STATUS, FDO_PWM_DUTY);
 
-   if (hwmgr->thermal_controller.
-   advanceFanControlParameters.usMaxFanRPM != 0)
-   percent = current_rpm * 255 /
-   hwmgr->thermal_controller.
-   advanceFanControlParameters.usMaxFanRPM;
+   if (!duty100)
+   return -EINVAL;
 
-   *speed = MIN(percent, 255);
+   tmp64 = (uint64_t)duty * 255;
+   do_div(tmp64, duty100);
+   *speed = MIN((uint32_t)tmp64, 255);
 
return 0;
 }
-- 
2.25.1



Re: [PATCH 1/1] drm/amdgpu: Unlock bo_list_mutex after error handling

2022-11-04 Thread Christian König

Am 03.11.22 um 15:59 schrieb Philip Yang:

Get below kernel WARNING backtrace when pressing ctrl-C to kill kfdtest
application.

If amdgpu_cs_parser_bos returns error after taking bo_list_mutex, as
caller amdgpu_cs_ioctl will not unlock bo_list_mutex, this generates the
kernel WARNING.

Add unlock bo_list_mutex after amdgpu_cs_parser_bos error handling to
cleanup bo_list userptr bo.

  WARNING: kfdtest/2930 still has locks held!
  1 lock held by kfdtest/2930:
   (&list->bo_list_mutex){+.+.}-{3:3}, at: amdgpu_cs_ioctl+0xce5/0x1f10 [amdgpu]
   stack backtrace:
dump_stack_lvl+0x44/0x57
get_signal+0x79f/0xd00
arch_do_signal_or_restart+0x36/0x7b0
exit_to_user_mode_prepare+0xfd/0x1b0
syscall_exit_to_user_mode+0x19/0x40
do_syscall_64+0x40/0x80

Signed-off-by: Philip Yang 


Good catch, patch is Reviewed-by: Christian König 


---
  drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 1 +
  1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 1bbd39b3b0fc..d371000a5727 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -992,6 +992,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
kvfree(e->user_pages);
e->user_pages = NULL;
}
+   mutex_unlock(&p->bo_list->bo_list_mutex);
return r;
  }
  




Re: [PATCH] drm/amd/amdgpu: Enable gfx pipe1 and fix related issues

2022-11-04 Thread Christian König

Am 04.11.22 um 01:32 schrieb Emily Deng:

Starting from SIENNA CICHLID asic supports two gfx pipes, enabling
two graphics queues for performance concern.


With the printk still in the patch I assume that this is just a 
debugging patch?




Signed-off-by: Emily Deng 
---
  drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c |  2 +-
  drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c  | 43 +
  2 files changed, 23 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
index 331aa191910c..0072f36b44d1 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
@@ -33,7 +33,7 @@
container_of((e), struct amdgpu_ctx_entity, entity)
  
  const unsigned int amdgpu_ctx_num_entities[AMDGPU_HW_IP_NUM] = {

-   [AMDGPU_HW_IP_GFX]  =   1,
+   [AMDGPU_HW_IP_GFX]  =   2,


That's an absolutely clear NAK and as far as I can see also unnecessary.

We don't want to expose the GFX queues as separate queues to userspace.

Instead the queues have separate priorities which userspace can select.

Regards,
Christian.


[AMDGPU_HW_IP_COMPUTE]  =   4,
[AMDGPU_HW_IP_DMA]  =   2,
[AMDGPU_HW_IP_UVD]  =   1,
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
index 49d34c7bbf20..9219cd29acd3 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
@@ -4606,7 +4606,7 @@ static int gfx_v10_0_sw_init(void *handle)
case IP_VERSION(10, 3, 3):
case IP_VERSION(10, 3, 7):
adev->gfx.me.num_me = 1;
-   adev->gfx.me.num_pipe_per_me = 1;
+   adev->gfx.me.num_pipe_per_me = 2;
adev->gfx.me.num_queue_per_pipe = 1;
adev->gfx.mec.num_mec = 2;
adev->gfx.mec.num_pipe_per_mec = 4;
@@ -6008,6 +6008,25 @@ static int gfx_v10_0_cp_gfx_load_microcode(struct 
amdgpu_device *adev)
return 0;
  }
  
+static int gfx_v10_0_wait_for_idle(void *handle)

+{
+   unsigned i;
+   u32 tmp;
+   struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+
+   for (i = 0; i < adev->usec_timeout; i++) {
+   /* read MC_STATUS */
+   tmp = RREG32_SOC15(GC, 0, mmGRBM_STATUS) &
+   GRBM_STATUS__GUI_ACTIVE_MASK;
+
+   if (!REG_GET_FIELD(tmp, GRBM_STATUS, GUI_ACTIVE))
+   return 0;
+   udelay(1);
+   }
+   printk("Emily:gfx_v10_0_wait_for_idle\n");
+   return -ETIMEDOUT;
+}
+
  static int gfx_v10_0_cp_gfx_start(struct amdgpu_device *adev)
  {
struct amdgpu_ring *ring;
@@ -6069,7 +6088,7 @@ static int gfx_v10_0_cp_gfx_start(struct amdgpu_device 
*adev)
amdgpu_ring_write(ring, 0x8000);
  
  	amdgpu_ring_commit(ring);

-
+   gfx_v10_0_wait_for_idle(adev);
/* submit cs packet to copy state 0 to next available state */
if (adev->gfx.num_gfx_rings > 1) {
/* maximum supported gfx ring is 2 */
@@ -7404,24 +7423,6 @@ static bool gfx_v10_0_is_idle(void *handle)
return true;
  }
  
-static int gfx_v10_0_wait_for_idle(void *handle)

-{
-   unsigned i;
-   u32 tmp;
-   struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-   for (i = 0; i < adev->usec_timeout; i++) {
-   /* read MC_STATUS */
-   tmp = RREG32_SOC15(GC, 0, mmGRBM_STATUS) &
-   GRBM_STATUS__GUI_ACTIVE_MASK;
-
-   if (!REG_GET_FIELD(tmp, GRBM_STATUS, GUI_ACTIVE))
-   return 0;
-   udelay(1);
-   }
-   return -ETIMEDOUT;
-}
-
  static int gfx_v10_0_soft_reset(void *handle)
  {
u32 grbm_soft_reset = 0;
@@ -8466,7 +8467,7 @@ static void gfx_v10_0_ring_emit_hdp_flush(struct 
amdgpu_ring *ring)
}
reg_mem_engine = 0;
} else {
-   ref_and_mask = nbio_hf_reg->ref_and_mask_cp0;
+   ref_and_mask = nbio_hf_reg->ref_and_mask_cp0 << ring->pipe;
reg_mem_engine = 1; /* pfp */
}
  




Re: [PATCH] drm/amdgpu: add vram reservation logic based on vram_usagebyfirmware_v2_2

2022-11-04 Thread Christian König

Am 04.11.22 um 09:52 schrieb Tong Liu01:

Move TMR region from top of FB to 2MB for FFBM, so we need to reserve TMR region
firstly to make sure TMR can be allocated at 2MB


If I understand it correctly the two methods are mutual exclusive. So I 
think you can just extend the existing function in the amdgpu TTM code 
instead of adding a new one.




Signed-off-by: Tong Liu01 
---
  .../gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c  | 84 ++-
  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c   | 52 
  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h   |  6 ++
  drivers/gpu/drm/amd/include/atomfirmware.h| 56 +++--
  4 files changed, 171 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
index b81b77a9efa6..f577b1d151d9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
@@ -106,34 +106,74 @@ int amdgpu_atomfirmware_allocate_fb_scratch(struct 
amdgpu_device *adev)
struct atom_context *ctx = adev->mode_info.atom_context;
int index = 
get_index_into_master_table(atom_master_list_of_data_tables_v2_1,
vram_usagebyfirmware);
-   struct vram_usagebyfirmware_v2_1 *firmware_usage;
-   uint32_t start_addr, size;
+   struct vram_usagebyfirmware_v2_1 *firmware_usage_v2_1;
+   struct vram_usagebyfirmware_v2_2 *firmware_usage_v2_2;
+   uint32_t start_addr, size, fw_start_addr, fw_size, drv_addr, drv_size;
uint16_t data_offset;
+   uint8_t frev, crev;
int usage_bytes = 0;
  
-	if (amdgpu_atom_parse_data_header(ctx, index, NULL, NULL, NULL, &data_offset)) {

-   firmware_usage = (struct vram_usagebyfirmware_v2_1 *)(ctx->bios 
+ data_offset);
-   DRM_DEBUG("atom firmware requested %08x %dkb fw %dkb drv\n",
- le32_to_cpu(firmware_usage->start_address_in_kb),
- le16_to_cpu(firmware_usage->used_by_firmware_in_kb),
- le16_to_cpu(firmware_usage->used_by_driver_in_kb));
-
-   start_addr = le32_to_cpu(firmware_usage->start_address_in_kb);
-   size = le16_to_cpu(firmware_usage->used_by_firmware_in_kb);
-
-   if ((uint32_t)(start_addr & ATOM_VRAM_OPERATION_FLAGS_MASK) ==
-   (uint32_t)(ATOM_VRAM_BLOCK_SRIOV_MSG_SHARE_RESERVATION 
<<
-   ATOM_VRAM_OPERATION_FLAGS_SHIFT)) {
-   /* Firmware request VRAM reservation for SR-IOV */
-   adev->mman.fw_vram_usage_start_offset = (start_addr &
-   (~ATOM_VRAM_OPERATION_FLAGS_MASK)) << 10;
-   adev->mman.fw_vram_usage_size = size << 10;
-   /* Use the default scratch size */
+   if (amdgpu_atom_parse_data_header(ctx, index, NULL, &frev, &crev, 
&data_offset)) {
+   if (frev == 2 && crev == 1) {
+   firmware_usage_v2_1 =
+   (struct vram_usagebyfirmware_v2_1 *)(ctx->bios 
+ data_offset);
+   DRM_DEBUG("atom firmware v2_1 requested %08x %dkb fw %dkb 
drv\n",
+ le32_to_cpu(firmware_usage_v2_1->start_address_in_kb),
+ 
le16_to_cpu(firmware_usage_v2_1->used_by_firmware_in_kb),
+ 
le16_to_cpu(firmware_usage_v2_1->used_by_driver_in_kb));
+
+   start_addr = 
le32_to_cpu(firmware_usage_v2_1->start_address_in_kb);
+   size = 
le16_to_cpu(firmware_usage_v2_1->used_by_firmware_in_kb);
+
+   if ((uint32_t)(start_addr & 
ATOM_VRAM_OPERATION_FLAGS_MASK) ==
+   
(uint32_t)(ATOM_VRAM_BLOCK_SRIOV_MSG_SHARE_RESERVATION <<
+   ATOM_VRAM_OPERATION_FLAGS_SHIFT)) {
+   /* Firmware request VRAM reservation for SR-IOV 
*/
+   adev->mman.fw_vram_usage_start_offset = (start_addr 
&
+   (~ATOM_VRAM_OPERATION_FLAGS_MASK)) << 
10;
+   adev->mman.fw_vram_usage_size = size << 10;
+   /* Use the default scratch size */
+   usage_bytes = 0;
+   } else {
+   usage_bytes =
+   
le16_to_cpu(firmware_usage_v2_1->used_by_driver_in_kb) << 10;
+   }


That should probably be put into separate functions.

Regards,
Christian.


+   } else if (frev >= 2 && crev >= 2) {
+   firmware_usage_v2_2 =
+   (struct vram_usagebyfirmware_v2_2 *)(ctx->bios 
+ data_offset);
+   DRM_DEBUG("atom requested fw start at %08x %dkb and drv 
start at %08x %dkb\n",
+   

[PATCH] drm/amdgpu: add vram reservation logic based on vram_usagebyfirmware_v2_2

2022-11-04 Thread Tong Liu01
Move TMR region from top of FB to 2MB for FFBM, so we need to reserve TMR region
firstly to make sure TMR can be allocated at 2MB

Signed-off-by: Tong Liu01 
---
 .../gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c  | 84 ++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c   | 52 
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h   |  6 ++
 drivers/gpu/drm/amd/include/atomfirmware.h| 56 +++--
 4 files changed, 171 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
index b81b77a9efa6..f577b1d151d9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
@@ -106,34 +106,74 @@ int amdgpu_atomfirmware_allocate_fb_scratch(struct 
amdgpu_device *adev)
struct atom_context *ctx = adev->mode_info.atom_context;
int index = 
get_index_into_master_table(atom_master_list_of_data_tables_v2_1,
vram_usagebyfirmware);
-   struct vram_usagebyfirmware_v2_1 *firmware_usage;
-   uint32_t start_addr, size;
+   struct vram_usagebyfirmware_v2_1 *firmware_usage_v2_1;
+   struct vram_usagebyfirmware_v2_2 *firmware_usage_v2_2;
+   uint32_t start_addr, size, fw_start_addr, fw_size, drv_addr, drv_size;
uint16_t data_offset;
+   uint8_t frev, crev;
int usage_bytes = 0;
 
-   if (amdgpu_atom_parse_data_header(ctx, index, NULL, NULL, NULL, 
&data_offset)) {
-   firmware_usage = (struct vram_usagebyfirmware_v2_1 *)(ctx->bios 
+ data_offset);
-   DRM_DEBUG("atom firmware requested %08x %dkb fw %dkb drv\n",
- le32_to_cpu(firmware_usage->start_address_in_kb),
- le16_to_cpu(firmware_usage->used_by_firmware_in_kb),
- le16_to_cpu(firmware_usage->used_by_driver_in_kb));
-
-   start_addr = le32_to_cpu(firmware_usage->start_address_in_kb);
-   size = le16_to_cpu(firmware_usage->used_by_firmware_in_kb);
-
-   if ((uint32_t)(start_addr & ATOM_VRAM_OPERATION_FLAGS_MASK) ==
-   (uint32_t)(ATOM_VRAM_BLOCK_SRIOV_MSG_SHARE_RESERVATION 
<<
-   ATOM_VRAM_OPERATION_FLAGS_SHIFT)) {
-   /* Firmware request VRAM reservation for SR-IOV */
-   adev->mman.fw_vram_usage_start_offset = (start_addr &
-   (~ATOM_VRAM_OPERATION_FLAGS_MASK)) << 10;
-   adev->mman.fw_vram_usage_size = size << 10;
-   /* Use the default scratch size */
+   if (amdgpu_atom_parse_data_header(ctx, index, NULL, &frev, &crev, 
&data_offset)) {
+   if (frev == 2 && crev == 1) {
+   firmware_usage_v2_1 =
+   (struct vram_usagebyfirmware_v2_1 *)(ctx->bios 
+ data_offset);
+   DRM_DEBUG("atom firmware v2_1 requested %08x %dkb fw 
%dkb drv\n",
+ le32_to_cpu(firmware_usage_v2_1->start_address_in_kb),
+ 
le16_to_cpu(firmware_usage_v2_1->used_by_firmware_in_kb),
+ 
le16_to_cpu(firmware_usage_v2_1->used_by_driver_in_kb));
+
+   start_addr = 
le32_to_cpu(firmware_usage_v2_1->start_address_in_kb);
+   size = 
le16_to_cpu(firmware_usage_v2_1->used_by_firmware_in_kb);
+
+   if ((uint32_t)(start_addr & 
ATOM_VRAM_OPERATION_FLAGS_MASK) ==
+   
(uint32_t)(ATOM_VRAM_BLOCK_SRIOV_MSG_SHARE_RESERVATION <<
+   ATOM_VRAM_OPERATION_FLAGS_SHIFT)) {
+   /* Firmware request VRAM reservation for SR-IOV 
*/
+   adev->mman.fw_vram_usage_start_offset = 
(start_addr &
+   (~ATOM_VRAM_OPERATION_FLAGS_MASK)) << 
10;
+   adev->mman.fw_vram_usage_size = size << 10;
+   /* Use the default scratch size */
+   usage_bytes = 0;
+   } else {
+   usage_bytes =
+   
le16_to_cpu(firmware_usage_v2_1->used_by_driver_in_kb) << 10;
+   }
+   } else if (frev >= 2 && crev >= 2) {
+   firmware_usage_v2_2 =
+   (struct vram_usagebyfirmware_v2_2 *)(ctx->bios 
+ data_offset);
+   DRM_DEBUG("atom requested fw start at %08x %dkb and drv 
start at %08x %dkb\n",
+ 
le32_to_cpu(firmware_usage_v2_2->fw_region_start_address_in_kb),
+ 
le16_to_cpu(firmware_usage_v2_2->used_by_firmware_in_kb),
+ 
le32_to_cpu(firmware_usage_v2_2->driver_region0_start_address_in_kb),
+ 
le32_to_cpu(fir

Re: [PATCH] drm/amdgpu: workaround for TLB seq race

2022-11-04 Thread Stefan Springer
Working fine after 26hrs+ of testing, plus another 24hrs of the previous
version of this patch.
Sorry if there are multiple replies, I had to figure out how to properly
reply to a mailing list, such that the reply is picked up by patchwork (1st
time doing this).

Tested-by: Stefan Springer 


RE: [PATCH] drm/amdgpu: wait till Gfxoff allow signal completes during suspend

2022-11-04 Thread Quan, Evan
[AMD Official Use Only - General]



> -Original Message-
> From: amd-gfx  On Behalf Of
> Harsh Jain
> Sent: Friday, November 4, 2022 12:17 PM
> To: Deucher, Alexander 
> Cc: Jain, Harsh ; amd-gfx@lists.freedesktop.org
> Subject: [PATCH] drm/amdgpu: wait till Gfxoff allow signal completes during
> suspend
> 
> change guarantees that gfxoff is allowed before moving further in
> s2idle sequence to add more reliablity about gfxoff in amdgpu IP's
> suspend flow
> 
> Signed-off-by: Harsh Jain 
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
> index 222d3d7ea076..5b2afe348c23 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
> @@ -581,11 +581,11 @@ void amdgpu_gfx_off_ctrl(struct amdgpu_device
> *adev, bool enable)
> 
>   if (adev->gfx.gfx_off_req_count == 0 &&
>   !adev->gfx.gfx_off_state) {
> - /* If going to s2idle, no need to wait */
> - if (adev->in_s0ix)
> - delay = GFX_OFF_NO_DELAY;
>   schedule_delayed_work(&adev-
> >gfx.gfx_off_delay_work,
> delay);
> + /* If going to s2idle, no need to wait */
> + if (adev->in_s0ix)
> + flush_delayed_work(&adev-
> >gfx.gfx_off_delay_work);
[Quan, Evan] This seems a little weird. Can you just call 
amdgpu_device_delay_enable_gfx_off directly for s0ix case?

Evan
>   }
>   } else {
>   if (adev->gfx.gfx_off_req_count == 0) {
> --
> 2.25.1
<>

Re: [PATCH] drm/amdgpu: workaround for TLB seq race

2022-11-04 Thread Christian König

Am 03.11.22 um 22:18 schrieb Philip Yang:


On 2022-11-02 10:58, Christian König wrote:

It can happen that we query the sequence value before the callback
had a chance to run.

Work around that by grabbing the fence lock and releasing it again.
Should be replaced by hw handling soon.


kfd_flush_tlb is always called after waiting for map/unmap to GPU 
fence signalled, that means the callback is already executed


And exactly that's incorrect.

Waiting for the fence to signal means that the callback has started 
executing, but it doesn't mean that it is finished.


This can then result in one CPU racing with the callback handler and 
because of this you see the wrong TLB seq.


Regards,
Christian.

and the sequence is increased if tlb flush is needed, so no such race 
from KFD.


I am not sure but seems the race does exist for amdgpu to grab vm and 
schedule job.


Acked-by: Philip Yang 


Signed-off-by: Christian König 
---
  drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 15 +++
  1 file changed, 15 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h

index 9ecb7f663e19..e51a46c9582b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
@@ -485,6 +485,21 @@ void amdgpu_debugfs_vm_bo_info(struct amdgpu_vm 
*vm, struct seq_file *m);

   */
  static inline uint64_t amdgpu_vm_tlb_seq(struct amdgpu_vm *vm)
  {
+    unsigned long flags;
+    spinlock_t *lock;
+
+    /*
+ * Work around to stop racing between the fence signaling and 
handling
+ * the cb. The lock is static after initially setting it up, 
just make

+ * sure that the dma_fence structure isn't freed up.
+ */
+    rcu_read_lock();
+    lock = vm->last_tlb_flush->lock;
+    rcu_read_unlock();
+
+    spin_lock_irqsave(lock, flags);
+    spin_unlock_irqrestore(lock, flags);
+
  return atomic64_read(&vm->tlb_seq);
  }