[PATCH 2/2] drm/radeon: Avoid power table parsing memory leaks

2021-05-03 Thread Kees Cook
Avoid leaving a hanging pre-allocated clock_info if last mode is
invalid, and avoid heap corruption if no valid modes are found.

Fixes: 6991b8f2a319 ("drm/radeon/kms: fix segfault in pm rework")
Signed-off-by: Kees Cook 
---
 drivers/gpu/drm/radeon/radeon_atombios.c | 20 +++-
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c 
b/drivers/gpu/drm/radeon/radeon_atombios.c
index f9f4efa1738c..28c4413f4dc8 100644
--- a/drivers/gpu/drm/radeon/radeon_atombios.c
+++ b/drivers/gpu/drm/radeon/radeon_atombios.c
@@ -2120,11 +2120,14 @@ static int radeon_atombios_parse_power_table_1_3(struct 
radeon_device *rdev)
return state_index;
/* last mode is usually default, array is low to high */
for (i = 0; i < num_modes; i++) {
-   rdev->pm.power_state[state_index].clock_info =
-   kcalloc(1, sizeof(struct radeon_pm_clock_info),
-   GFP_KERNEL);
+   /* avoid memory leaks from invalid modes or unknown frev. */
+   if (!rdev->pm.power_state[state_index].clock_info) {
+   rdev->pm.power_state[state_index].clock_info =
+   kzalloc(sizeof(struct radeon_pm_clock_info),
+   GFP_KERNEL);
+   }
if (!rdev->pm.power_state[state_index].clock_info)
-   return state_index;
+   goto out;
rdev->pm.power_state[state_index].num_clock_modes = 1;
rdev->pm.power_state[state_index].clock_info[0].voltage.type = 
VOLTAGE_NONE;
switch (frev) {
@@ -2243,8 +2246,15 @@ static int radeon_atombios_parse_power_table_1_3(struct 
radeon_device *rdev)
break;
}
}
+out:
+   /* free any unused clock_info allocation. */
+   if (state_index && state_index < num_modes) {
+   kfree(rdev->pm.power_state[state_index].clock_info);
+   rdev->pm.power_state[state_index].clock_info = NULL;
+   }
+
/* last mode is usually default */
-   if (rdev->pm.default_power_state_index == -1) {
+   if (state_index && rdev->pm.default_power_state_index == -1) {
rdev->pm.power_state[state_index - 1].type =
POWER_STATE_TYPE_DEFAULT;
rdev->pm.default_power_state_index = state_index - 1;
-- 
2.25.1

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


Re: [RFC] CRIU support for ROCm

2021-05-03 Thread Adrian Reber
On Fri, Apr 30, 2021 at 09:57:45PM -0400, Felix Kuehling wrote:
> We have been working on a prototype supporting CRIU (Checkpoint/Restore
> In Userspace) for accelerated compute applications running on AMD GPUs
> using ROCm (Radeon Open Compute Platform). We're happy to finally share
> this work publicly to solicit feedback and advice. The end-goal is to
> get this work included upstream in Linux and CRIU. A short whitepaper
> describing our design and intention can be found on Github:
> https://github.com/RadeonOpenCompute/criu/tree/criu-dev/test/others/ext-kfd/README.md.
> 
> We have RFC patch series for the kernel (based on Alex Deucher's
> amd-staging-drm-next branch) and for CRIU including a new plugin and a
> few core CRIU changes. I will send those to the respective mailing lists
> separately in a minute. They can also be found on Github.
> 
> CRIU+plugin: https://github.com/RadeonOpenCompute/criu/commits/criu-dev
> Kernel (KFD):
> 
> https://github.com/RadeonOpenCompute/ROCK-Kernel-Driver/commits/fxkamd/criu-wip
> 
> At this point this is very much a work in progress and not ready for
> upstream inclusion. There are still several missing features, known
> issues, and open questions that we would like to start addressing with
> your feedback.
> 
> What's working and tested at this point:
> 
>   * Checkpoint and restore accelerated machine learning apps: PyTorch
> running Bert on systems with 1 or 2 GPUs (MI50 or MI100), 100%
> unmodified user mode stack
>   * Checkpoint on one system, restore on a different system
>   * Checkpoint on one GPU, restore on a different GPU

This is very impressive. As far as I know this is the first larger
plugin written for CRIU and publicly published. It is also the first GPU
supported and people have been asking this for many years. It is in fact
the first hardware device supported through a plugin.

> Major Known issues:
> 
>   * The KFD ioctl API is not final: Needs a complete redesign to allow
> future extension without breaking the ABI
>   * Very slow: Need to implement DMA to dump VRAM contents
> 
> Missing or incomplete features:
> 
>   * Support for the new KFD SVM API
>   * Check device topology during restore
>   * Checkpoint and restore multiple processes
>   * Support for applications using Mesa for video decode/encode
>   * Testing with more different GPUs and workloads
> 
> Big Open questions:
> 
>   * What's the preferred way to publish our CRIU plugin? In-tree or
> out-of-tree?

I would do it in-tree.

>   * What's the preferred way to distribute our CRIU plugin? Source?
> Binary .so? Whole CRIU? Just in-box support?

As you are planing to publish the source I would make it part of the
CRIU repository and this way it will find its way to the packages in the
different distributions.

Does the plugin require any additional dependencies? If there is no
additional dependency to a library the plugin can be easily be part of
the existing packages.

>   * If our plugin can be upstreamed in the CRIU tree, what would be the
> right directory?

I would just put it into criu/plugins/

It would also be good to have your patchset submitted as a PR on github
to have our normal CI test coverage of the changes.

Adrian
___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 0/2] drm/radeon: Fix off-by-one power_state index heap overwrite

2021-05-03 Thread Kees Cook
Hi,

This is an attempt at fixing a bug[1] uncovered by the relocation of
the slab freelist pointer offset, as well as some related clean-ups.

I don't have hardware to do runtime testing, but it builds. ;)

-Kees

[1] https://bugzilla.kernel.org/show_bug.cgi?id=211537

Kees Cook (2):
  drm/radeon: Fix off-by-one power_state index heap overwrite
  drm/radeon: Avoid power table parsing memory leaks

 drivers/gpu/drm/radeon/radeon_atombios.c | 26 
 1 file changed, 18 insertions(+), 8 deletions(-)

-- 
2.25.1

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 1/2] drm/radeon: Fix off-by-one power_state index heap overwrite

2021-05-03 Thread Kees Cook
An out of bounds write happens when setting the default power state.
KASAN sees this as:

[drm] radeon: 512M of GTT memory ready.
[drm] GART: num cpu pages 131072, num gpu pages 131072
==
BUG: KASAN: slab-out-of-bounds in
radeon_atombios_parse_power_table_1_3+0x1837/0x1998 [radeon]
Write of size 4 at addr 88810178d858 by task systemd-udevd/157

CPU: 0 PID: 157 Comm: systemd-udevd Not tainted 5.12.0-E620 #50
Hardware name: eMachineseMachines E620  /Nile   , BIOS V1.03 
09/30/2008
Call Trace:
 dump_stack+0xa5/0xe6
 print_address_description.constprop.0+0x18/0x239
 kasan_report+0x170/0x1a8
 radeon_atombios_parse_power_table_1_3+0x1837/0x1998 [radeon]
 radeon_atombios_get_power_modes+0x144/0x1888 [radeon]
 radeon_pm_init+0x1019/0x1904 [radeon]
 rs690_init+0x76e/0x84a [radeon]
 radeon_device_init+0x1c1a/0x21e5 [radeon]
 radeon_driver_load_kms+0xf5/0x30b [radeon]
 drm_dev_register+0x255/0x4a0 [drm]
 radeon_pci_probe+0x246/0x2f6 [radeon]
 pci_device_probe+0x1aa/0x294
 really_probe+0x30e/0x850
 driver_probe_device+0xe6/0x135
 device_driver_attach+0xc1/0xf8
 __driver_attach+0x13f/0x146
 bus_for_each_dev+0xfa/0x146
 bus_add_driver+0x2b3/0x447
 driver_register+0x242/0x2c1
 do_one_initcall+0x149/0x2fd
 do_init_module+0x1ae/0x573
 load_module+0x4dee/0x5cca
 __do_sys_finit_module+0xf1/0x140
 do_syscall_64+0x33/0x40
 entry_SYSCALL_64_after_hwframe+0x44/0xae

Without KASAN, this will manifest later when the kernel attempts to
allocate memory that was stomped, since it collides with the inline slab
freelist pointer:

invalid opcode:  [#1] SMP NOPTI
CPU: 0 PID: 781 Comm: openrc-run.sh Tainted: GW 5.10.12-gentoo-E620 #2
Hardware name: eMachineseMachines E620  /Nile , BIOS V1.03   
09/30/2008
RIP: 0010:kfree+0x115/0x230
Code: 89 c5 e8 75 ea ff ff 48 8b 00 0f ba e0 09 72 63 e8 1f f4 ff ff 41 89 c4 
48 8b 45 00 0f ba e0 10 72 0a 48 8b 45 08 a8 01 75 02 <0f> 0b 44 89 e1 48 c7 c2 
00 f0 ff ff be 06 00 00 00 48 d3 e2 48 c7
RSP: 0018:b42f40267e10 EFLAGS: 00010246
RAX: d61280ee8d88 RBX: 0004 RCX: 801d
RDX: 4000 RSI: ba1360b0 RDI: d61280ee8d80
RBP: d61280ee8d80 R08: b91bebdf R09: 
R10: 8fe2c1047ac8 R11:  R12: 
R13:  R14:  R15: 0100
FS:  7fe80eff6b68() GS:8fe339c0() knlGS:
CS:  0010 DS:  ES:  CR0: 80050033
CR2: 7fe80eec7bc0 CR3: 38012000 CR4: 06f0
Call Trace:
 __free_fdtable+0x16/0x1f
 put_files_struct+0x81/0x9b
 do_exit+0x433/0x94d
 do_group_exit+0xa6/0xa6
 __x64_sys_exit_group+0xf/0xf
 do_syscall_64+0x33/0x40
 entry_SYSCALL_64_after_hwframe+0x44/0xa9
RIP: 0033:0x7fe80ef64bea
Code: Unable to access opcode bytes at RIP 0x7fe80ef64bc0.
RSP: 002b:7ffdb1c47528 EFLAGS: 0246 ORIG_RAX: 00e7
RAX: ffda RBX: 0003 RCX: 7fe80ef64bea
RDX: 7fe80ef64f60 RSI:  RDI: 
RBP:  R08: 0001 R09: 
R10: 7fe80ee2c620 R11: 0246 R12: 7fe80eff41e0
R13:  R14: 0024 R15: 7fe80edf9cd0
Modules linked in: radeon(+) ath5k(+) snd_hda_codec_realtek ...

Use a valid power_state index when initializing the "flags" and "misc"
and "misc2" fields.

Reported-by: Erhard F. 
Fixes: a48b9b4edb8b ("drm/radeon/kms/pm: add asic specific callbacks for 
getting power state (v2)")
Fixes: 79daedc94281 ("drm/radeon/kms: minor pm cleanups")
Signed-off-by: Kees Cook 
---
 drivers/gpu/drm/radeon/radeon_atombios.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c 
b/drivers/gpu/drm/radeon/radeon_atombios.c
index 42301b4e56f5..f9f4efa1738c 100644
--- a/drivers/gpu/drm/radeon/radeon_atombios.c
+++ b/drivers/gpu/drm/radeon/radeon_atombios.c
@@ -2250,10 +2250,10 @@ static int radeon_atombios_parse_power_table_1_3(struct 
radeon_device *rdev)
rdev->pm.default_power_state_index = state_index - 1;
rdev->pm.power_state[state_index - 1].default_clock_mode =
&rdev->pm.power_state[state_index - 1].clock_info[0];
-   rdev->pm.power_state[state_index].flags &=
+   rdev->pm.power_state[state_index - 1].flags &=
~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
-   rdev->pm.power_state[state_index].misc = 0;
-   rdev->pm.power_state[state_index].misc2 = 0;
+   rdev->pm.power_state[state_index - 1].misc = 0;
+   rdev->pm.power_state[state_index - 1].misc2 = 0;
}
return state_index;
 }
-- 
2.25.1

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


RE: [PATCH v2 1/1] drm/i915: Use the correct max source link rate for MST

2021-05-03 Thread Jani Nikula
On Fri, 30 Apr 2021, "Cornij, Nikola"  wrote:
> I'll fix the dpcd part to use kHz on Monday

I'd appreciate that, thanks. I think it is the better interface.

> My apologies as well, not only for coming up with the wrong patch in
> first place, but also for missing to CC all the maintainers.

The drivers we have are monsters, and it can be tricky to get the
details right. All the more important to get the Cc's right; then at
least you can blame us afterwards. ;)

Thanks for reacting quickly, though.


BR,
Jani.


-- 
Jani Nikula, Intel Open Source Graphics Center
___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


Re: [Heads up to maintainers] Re: [PATCH v8 1/1] drm/drm_mst: Use Extended Base Receiver Capability DPCD space

2021-05-03 Thread Jani Nikula
On Fri, 30 Apr 2021, Jani Nikula  wrote:
> On Thu, 29 Apr 2021, Lyude Paul  wrote:
>> JFYI Jani and Ben: I will be pushing this patch to drm-misc-next sometime
>> today if there's no objections
>
> Thanks for the heads-up, I think this breaks i915. See my review
> comments elsewhere in the thread.

Looks like this was merged anyway.

98025a62cb00 ("drm/dp_mst: Use Extended Base Receiver Capability DPCD space")

I'm not happy how this played out.

1) You need to Cc relevant people

2) You need to get the ack before merging changes

3) You need to give people more than a day to react, with time zones and
all; I replied as soon as I saw the heads-up, but it was already too
late

It's broken on i915, and perhaps that could be fixed.

However I also think using DP spec rate codes and calling them "rate" is
a bad interface, especially when the unit breaks down with DP 2.0 rate
codes. It's confusing and it's not future proof. Fixing that afterwards
falls to whoever comes next to pick up the pieces.

I'd rather just see this reverted and redone.


BR,
Jani.


>
> BR,
> Jani.
>
>
>>
>> On Wed, 2021-04-28 at 19:43 -0400, Nikola Cornij wrote:
>>> [why]
>>> DP 1.4a spec madates that if DP_EXTENDED_RECEIVER_CAP_FIELD_PRESENT is
>>> set, Extended Base Receiver Capability DPCD space must be used. Without
>>> doing that, the three DPCD values that differ will be wrong, leading to
>>> incorrect or limited functionality. MST link rate, for example, could
>>> have a lower value. Also, Synaptics quirk wouldn't work out well when
>>> Extended DPCD was not read, resulting in no DSC for such hubs.
>>> 
>>> [how]
>>> Modify MST topology manager to use the values from Extended DPCD where
>>> applicable.
>>> 
>>> To prevent regression on the sources that have a lower maximum link rate
>>> capability than MAX_LINK_RATE from Extended DPCD, have the drivers
>>> supply maximum lane count and rate at initialization time.
>>> 
>>> This also reverts 'commit 2dcab875e763 ("Revert drm/dp_mst: Retrieve
>>> extended DPCD caps for topology manager")', brining the change back to
>>> the original 'commit ad44c03208e4 ("drm/dp_mst: Retrieve extended DPCD
>>> caps for topology manager")'.
>>> 
>>> Signed-off-by: Nikola Cornij 
>>> ---
>>>  .../display/amdgpu_dm/amdgpu_dm_mst_types.c   |  5 +++
>>>  .../gpu/drm/amd/display/dc/core/dc_link_dp.c  | 18 ++
>>>  drivers/gpu/drm/amd/display/dc/dc_link.h  |  2 ++
>>>  drivers/gpu/drm/drm_dp_mst_topology.c | 33 ---
>>>  drivers/gpu/drm/i915/display/intel_dp_mst.c   |  6 +++-
>>>  drivers/gpu/drm/nouveau/dispnv50/disp.c   |  3 +-
>>>  drivers/gpu/drm/radeon/radeon_dp_mst.c    |  7 
>>>  include/drm/drm_dp_mst_helper.h   | 12 ++-
>>>  8 files changed, 71 insertions(+), 15 deletions(-)
>>> 
>>> 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 997567f6f0ba..b7e01b6fb328 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
>>> @@ -429,6 +429,8 @@ void amdgpu_dm_initialize_dp_connector(struct
>>> amdgpu_display_manager *dm,
>>>    struct amdgpu_dm_connector
>>> *aconnector,
>>>    int link_index)
>>>  {
>>> +   struct dc_link_settings max_link_enc_cap = {0};
>>> +
>>> aconnector->dm_dp_aux.aux.name =
>>> kasprintf(GFP_KERNEL, "AMDGPU DM aux hw bus %d",
>>>   link_index);
>>> @@ -443,6 +445,7 @@ void amdgpu_dm_initialize_dp_connector(struct
>>> amdgpu_display_manager *dm,
>>> if (aconnector->base.connector_type == DRM_MODE_CONNECTOR_eDP)
>>> return;
>>>  
>>> +   dc_link_dp_get_max_link_enc_cap(aconnector->dc_link,
>>> &max_link_enc_cap);
>>> aconnector->mst_mgr.cbs = &dm_mst_cbs;
>>> drm_dp_mst_topology_mgr_init(
>>> &aconnector->mst_mgr,
>>> @@ -450,6 +453,8 @@ void amdgpu_dm_initialize_dp_connector(struct
>>> amdgpu_display_manager *dm,
>>> &aconnector->dm_dp_aux.aux,
>>> 16,
>>> 4,
>>> +   max_link_enc_cap.lane_count,
>>> +   max_link_enc_cap.link_rate,
>>> aconnector->connector_id);
>>>  
>>> drm_connector_attach_dp_subconnector_property(&aconnector->base);
>>> diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
>>> b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
>>> index 7d2e433c2275..6fe66b7ee53e 100644
>>> --- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
>>> +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
>>> @@ -1894,6 +1894,24 @@ bool dc_link_dp_sync_lt_end(struct dc_link *link,
>>> bool link_down)
>>> return true;
>>>  }
>>>  
>>> +bool dc_link_dp_get_max_link_enc_cap(const struct dc_link *link, struct
>>> dc_link_settings *max_link_enc_cap

Re: [Heads up to maintainers] Re: [PATCH v8 1/1] drm/drm_mst: Use Extended Base Receiver Capability DPCD space

2021-05-03 Thread Jani Nikula
On Mon, 03 May 2021, Jani Nikula  wrote:
> On Fri, 30 Apr 2021, Jani Nikula  wrote:
>> On Thu, 29 Apr 2021, Lyude Paul  wrote:
>>> JFYI Jani and Ben: I will be pushing this patch to drm-misc-next sometime
>>> today if there's no objections
>>
>> Thanks for the heads-up, I think this breaks i915. See my review
>> comments elsewhere in the thread.
>
> Looks like this was merged anyway.
>
> 98025a62cb00 ("drm/dp_mst: Use Extended Base Receiver Capability DPCD space")
>
> I'm not happy how this played out.
>
> 1) You need to Cc relevant people
>
> 2) You need to get the ack before merging changes
>
> 3) You need to give people more than a day to react, with time zones and
> all; I replied as soon as I saw the heads-up, but it was already too
> late
>
> It's broken on i915, and perhaps that could be fixed.
>
> However I also think using DP spec rate codes and calling them "rate" is
> a bad interface, especially when the unit breaks down with DP 2.0 rate
> codes. It's confusing and it's not future proof. Fixing that afterwards
> falls to whoever comes next to pick up the pieces.
>
> I'd rather just see this reverted and redone.

Okay, just saw that you'd fixed i915 already. Thanks. Let's roll with
that then.

BR,
Jani.


>
>
> BR,
> Jani.
>
>
>>
>> BR,
>> Jani.
>>
>>
>>>
>>> On Wed, 2021-04-28 at 19:43 -0400, Nikola Cornij wrote:
 [why]
 DP 1.4a spec madates that if DP_EXTENDED_RECEIVER_CAP_FIELD_PRESENT is
 set, Extended Base Receiver Capability DPCD space must be used. Without
 doing that, the three DPCD values that differ will be wrong, leading to
 incorrect or limited functionality. MST link rate, for example, could
 have a lower value. Also, Synaptics quirk wouldn't work out well when
 Extended DPCD was not read, resulting in no DSC for such hubs.
 
 [how]
 Modify MST topology manager to use the values from Extended DPCD where
 applicable.
 
 To prevent regression on the sources that have a lower maximum link rate
 capability than MAX_LINK_RATE from Extended DPCD, have the drivers
 supply maximum lane count and rate at initialization time.
 
 This also reverts 'commit 2dcab875e763 ("Revert drm/dp_mst: Retrieve
 extended DPCD caps for topology manager")', brining the change back to
 the original 'commit ad44c03208e4 ("drm/dp_mst: Retrieve extended DPCD
 caps for topology manager")'.
 
 Signed-off-by: Nikola Cornij 
 ---
  .../display/amdgpu_dm/amdgpu_dm_mst_types.c   |  5 +++
  .../gpu/drm/amd/display/dc/core/dc_link_dp.c  | 18 ++
  drivers/gpu/drm/amd/display/dc/dc_link.h  |  2 ++
  drivers/gpu/drm/drm_dp_mst_topology.c | 33 ---
  drivers/gpu/drm/i915/display/intel_dp_mst.c   |  6 +++-
  drivers/gpu/drm/nouveau/dispnv50/disp.c   |  3 +-
  drivers/gpu/drm/radeon/radeon_dp_mst.c    |  7 
  include/drm/drm_dp_mst_helper.h   | 12 ++-
  8 files changed, 71 insertions(+), 15 deletions(-)
 
 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 997567f6f0ba..b7e01b6fb328 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
 @@ -429,6 +429,8 @@ void amdgpu_dm_initialize_dp_connector(struct
 amdgpu_display_manager *dm,
    struct amdgpu_dm_connector
 *aconnector,
    int link_index)
  {
 +   struct dc_link_settings max_link_enc_cap = {0};
 +
 aconnector->dm_dp_aux.aux.name =
 kasprintf(GFP_KERNEL, "AMDGPU DM aux hw bus %d",
   link_index);
 @@ -443,6 +445,7 @@ void amdgpu_dm_initialize_dp_connector(struct
 amdgpu_display_manager *dm,
 if (aconnector->base.connector_type == DRM_MODE_CONNECTOR_eDP)
 return;
  
 +   dc_link_dp_get_max_link_enc_cap(aconnector->dc_link,
 &max_link_enc_cap);
 aconnector->mst_mgr.cbs = &dm_mst_cbs;
 drm_dp_mst_topology_mgr_init(
 &aconnector->mst_mgr,
 @@ -450,6 +453,8 @@ void amdgpu_dm_initialize_dp_connector(struct
 amdgpu_display_manager *dm,
 &aconnector->dm_dp_aux.aux,
 16,
 4,
 +   max_link_enc_cap.lane_count,
 +   max_link_enc_cap.link_rate,
 aconnector->connector_id);
  
 drm_connector_attach_dp_subconnector_property(&aconnector->base);
 diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
 b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
 index 7d2e433c2275..6fe66b7ee53e 100644
 --- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
 +++ b/drivers/gpu/drm/amd/display/d

[PATCH 1/2] MAINTAINERS: Fix TTM tree

2021-05-03 Thread Alex Deucher
TTM uses drm-misc now.  Update the tree.

Cc: David Ward 
Signed-off-by: Alex Deucher 
---
 MAINTAINERS | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index f03a198cbc52..27ee2a659867 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -6134,7 +6134,7 @@ M:Christian Koenig 
 M: Huang Rui 
 L: dri-de...@lists.freedesktop.org
 S: Maintained
-T: git git://people.freedesktop.org/~agd5f/linux
+T: git git://anongit.freedesktop.org/drm/drm-misc
 F: drivers/gpu/drm/ttm/
 F: include/drm/ttm/
 
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 2/2] MAINTAINERS: fix a few more amdgpu tree links

2021-05-03 Thread Alex Deucher
Switch to gitlab.

Fixes: 101c2fae5108d7 ("MAINTAINERS: update radeon/amdgpu/amdkfd git trees")
Cc: David Ward 
Signed-off-by: Alex Deucher 
---
 MAINTAINERS | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index 27ee2a659867..3ea29032e5dc 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -867,7 +867,7 @@ M:  Harry Wentland 
 M: Leo Li 
 L: amd-gfx@lists.freedesktop.org
 S: Supported
-T: git git://people.freedesktop.org/~agd5f/linux
+T: git https://gitlab.freedesktop.org/agd5f/linux.git
 F: drivers/gpu/drm/amd/display/
 
 AMD ENERGY DRIVER
@@ -950,7 +950,7 @@ AMD POWERPLAY
 M: Evan Quan 
 L: amd-gfx@lists.freedesktop.org
 S: Supported
-T: git git://people.freedesktop.org/~agd5f/linux
+T: git https://gitlab.freedesktop.org/agd5f/linux.git
 F: drivers/gpu/drm/amd/pm/powerplay/
 
 AMD SEATTLE DEVICE TREE SUPPORT
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


Re: [PATCH] drm/amdkfd: add ACPI SRAT parsing for topology

2021-05-03 Thread Eric Huang

Thanks Felix for your review. I will send another patch.

Eric

On 2021-04-30 7:42 p.m., Felix Kuehling wrote:

Am 2021-04-28 um 11:11 a.m. schrieb Eric Huang:

In NPS4 BIOS we need to find the closest numa node when creating
topology io link between cpu and gpu, if PCI driver doesn't set
it.

Signed-off-by: Eric Huang 
---
  drivers/gpu/drm/amd/amdkfd/kfd_crat.c | 94 ++-
  1 file changed, 91 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
index 38d45711675f..57518136c7d7 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
@@ -1759,6 +1759,87 @@ static int kfd_fill_gpu_memory_affinity(int *avail_size,
return 0;
  }
  
+#ifdef CONFIG_ACPI

+static void kfd_find_numa_node_in_srat(struct kfd_dev *kdev,
+   int *numa_node)
+{
+   struct acpi_table_header *table_header = NULL;
+   struct acpi_subtable_header *sub_header = NULL;
+   unsigned long table_end, subtable_len;
+   u32 pci_id = pci_domain_nr(kdev->pdev->bus) << 16 |
+   pci_dev_id(kdev->pdev);
+   u32 bdf;
+   acpi_status status;
+   struct acpi_srat_cpu_affinity *cpu;
+   struct acpi_srat_generic_affinity *gpu;
+   int pxm = 0, max_pxm = 0;
+   bool found = false;
+
+   /* Fetch the SRAT table from ACPI */
+   status = acpi_get_table(ACPI_SIG_SRAT, 0, &table_header);
+   if (status == AE_NOT_FOUND) {
+   pr_warn("SRAT table not found\n");
+   return;
+   } else if (ACPI_FAILURE(status)) {
+   const char *err = acpi_format_exception(status);
+   pr_err("SRAT table error: %s\n", err);
+   return;
+   }

After a successful call to acpi_get_table you need to call
acpi_put_table before this function returns to avoid leaking memory.



+
+   table_end = (unsigned long)table_header + table_header->length;
+
+   /* Parse all entries looking for a match. */
+
+   sub_header = (struct acpi_subtable_header *)
+   ((unsigned long)table_header +
+   sizeof(struct acpi_table_srat));
+   subtable_len = sub_header->length;
+
+   while (((unsigned long)sub_header) + subtable_len  < table_end) {
+   /*
+* If length is 0, break from this loop to avoid
+* infinite loop.
+*/
+   if (subtable_len == 0) {
+   pr_err("SRAT invalid zero length\n");
+   break;
+   }
+
+   switch (sub_header->type) {
+   case ACPI_SRAT_TYPE_CPU_AFFINITY:
+   cpu = (struct acpi_srat_cpu_affinity *)sub_header;
+   pxm = *((u32 *)cpu->proximity_domain_hi) << 8 |
+   cpu->proximity_domain_lo;
+   if (pxm > max_pxm)
+   max_pxm = pxm;
+   break;
+   case ACPI_SRAT_TYPE_GENERIC_AFFINITY:
+   gpu = (struct acpi_srat_generic_affinity *)sub_header;
+   bdf = *((u16 *)(&gpu->device_handle[0])) << 16 |
+   *((u16 *)(&gpu->device_handle[2]));
+   if (bdf == pci_id) {
+   found = true;
+   *numa_node = pxm_to_node(gpu->proximity_domain);
+   }
+   break;
+   default:
+   break;
+   }
+
+   if (found)
+   break;
+
+   sub_header = (struct acpi_subtable_header *)
+   ((unsigned long)sub_header + subtable_len);
+   subtable_len = sub_header->length;
+   }
+
+   /* workaround bad cpu-gpu binding case */
+   if (found && (*numa_node < 0 || *numa_node > max_pxm))
+   *numa_node = 0;

A suggestion: If you find a sensible NUMA node, call set_dev_node here.
That simplifies the caller. See below



+}
+#endif
+
  /* kfd_fill_gpu_direct_io_link - Fill in direct io link from GPU
   * to its NUMA node
   *@avail_size: Available size in the memory
@@ -1774,6 +1855,9 @@ static int kfd_fill_gpu_direct_io_link_to_cpu(int 
*avail_size,
uint32_t proximity_domain)
  {
struct amdgpu_device *adev = (struct amdgpu_device *)kdev->kgd;
+#ifdef CONFIG_NUMA
+   int numa_node = 0;

Should this be NUMA_NO_NODE?



+#endif
  
  	*avail_size -= sizeof(struct crat_subtype_iolink);

if (*avail_size < 0)
@@ -1805,9 +1889,13 @@ static int kfd_fill_gpu_direct_io_link_to_cpu(int 
*avail_size,
  
  	sub_type_hdr->proximity_domain_from = proximity_domain;

  #ifdef CONFIG_NUMA
-   if (kdev->pdev->dev.numa_node == NUMA_NO_NODE)
-   sub_type_hdr->proximity_domain_to = 0;
-   else
+   i

Re: [PATCH 1/2] MAINTAINERS: Fix TTM tree

2021-05-03 Thread Christian König

Am 03.05.21 um 15:47 schrieb Alex Deucher:

TTM uses drm-misc now.  Update the tree.

Cc: David Ward 
Signed-off-by: Alex Deucher 


Reviewed-by: Christian König  for the series.


---
  MAINTAINERS | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index f03a198cbc52..27ee2a659867 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -6134,7 +6134,7 @@ M:Christian Koenig 
  M:Huang Rui 
  L:dri-de...@lists.freedesktop.org
  S:Maintained
-T: git git://people.freedesktop.org/~agd5f/linux
+T: git git://anongit.freedesktop.org/drm/drm-misc
  F:drivers/gpu/drm/ttm/
  F:include/drm/ttm/
  


___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


RE: [PATCH v3 2/2] drm/amd/pm: Add debugfs node to read private buffer

2021-05-03 Thread Zhang, Hawking
[AMD Public Use]

Series is 

Reviewed-by: Hawking Zhang 

Regards,
Hawking
-Original Message-
From: Lazar, Lijo  
Sent: Monday, May 3, 2021 14:12
To: Lazar, Lijo ; amd-gfx@lists.freedesktop.org
Cc: Deucher, Alexander ; Wang, Kevin(Yang) 
; Koenig, Christian ; Zhang, 
Hawking 
Subject: RE: [PATCH v3 2/2] drm/amd/pm: Add debugfs node to read private buffer

[AMD Public Use]



-Original Message-
From: amd-gfx  On Behalf Of Lazar, Lijo
Sent: Friday, April 16, 2021 9:51 AM
To: amd-gfx@lists.freedesktop.org
Cc: Deucher, Alexander ; Wang, Kevin(Yang) 
; Koenig, Christian ; Zhang, 
Hawking 
Subject: [PATCH v3 2/2] drm/amd/pm: Add debugfs node to read private buffer

[AMD Public Use]

Add debugfs interface to read region allocated for FW private buffer

Signed-off-by: Lijo Lazar 
Suggested-by: Alex Deucher 
Reviewed-by: Christian König 
Reviewed-by: Kevin Wang 
---
 drivers/gpu/drm/amd/pm/amdgpu_pm.c | 44 ++
 1 file changed, 44 insertions(+)

diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c 
b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
index 8128603ef495..a229baa88483 100644
--- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c
+++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
@@ -3526,6 +3526,45 @@ static int amdgpu_debugfs_pm_info_show(struct seq_file 
*m, void *unused)
 
 DEFINE_SHOW_ATTRIBUTE(amdgpu_debugfs_pm_info);
 
+/*
+ * amdgpu_pm_priv_buffer_read - Read memory region allocated to FW
+ *
+ * Reads debug memory region allocated to PMFW  */ static ssize_t 
+amdgpu_pm_prv_buffer_read(struct file *f, char __user *buf,
+size_t size, loff_t *pos)
+{
+   struct amdgpu_device *adev = file_inode(f)->i_private;
+   const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
+   void *pp_handle = adev->powerplay.pp_handle;
+   size_t smu_prv_buf_size;
+   void *smu_prv_buf;
+
+   if (amdgpu_in_reset(adev))
+   return -EPERM;
+   if (adev->in_suspend && !adev->in_runpm)
+   return -EPERM;
+
+   if (pp_funcs && pp_funcs->get_smu_prv_buf_details)
+   pp_funcs->get_smu_prv_buf_details(pp_handle, &smu_prv_buf,
+ &smu_prv_buf_size);
+   else
+   return -ENOSYS;
+
+   if (!smu_prv_buf || !smu_prv_buf_size)
+   return -EINVAL;
+
+   return simple_read_from_buffer(buf, size, pos, smu_prv_buf,
+  smu_prv_buf_size);
+}
+
+static const struct file_operations amdgpu_debugfs_pm_prv_buffer_fops = {
+   .owner = THIS_MODULE,
+   .open = simple_open,
+   .read = amdgpu_pm_prv_buffer_read,
+   .llseek = default_llseek,
+};
+
 #endif
 
 void amdgpu_debugfs_pm_init(struct amdgpu_device *adev) @@ -3537,5 +3576,10 @@ 
void amdgpu_debugfs_pm_init(struct amdgpu_device *adev)
debugfs_create_file("amdgpu_pm_info", 0444, root, adev,
&amdgpu_debugfs_pm_info_fops);
 
+   if (adev->pm.smu_prv_buffer_size > 0)
+   debugfs_create_file_size("amdgpu_pm_prv_buffer", 0444, root,
+adev,
+&amdgpu_debugfs_pm_prv_buffer_fops,
+adev->pm.smu_prv_buffer_size);
 #endif
 }
--
2.17.1
___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.freedesktop.org%2Fmailman%2Flistinfo%2Famd-gfx&data=04%7C01%7Clijo.lazar%40amd.com%7C7832088a2ca34c755be908d9008f0258%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637541436501320898%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=PxT2L7MXjlrTSk37nP1GGCcWTzSzRWbEtO5w%2BkRUbMs%3D&reserved=0
___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH] drm/amdkfd: add ACPI SRAT parsing for topology

2021-05-03 Thread Eric Huang
In NPS4 BIOS we need to find the closest numa node when creating
topology io link between cpu and gpu, if PCI driver doesn't set
it.

Signed-off-by: Eric Huang 
---
 drivers/gpu/drm/amd/amdkfd/kfd_crat.c | 95 ++-
 1 file changed, 93 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
index 38d45711675f..58c6738de774 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
@@ -1759,6 +1759,91 @@ static int kfd_fill_gpu_memory_affinity(int *avail_size,
return 0;
 }
 
+#ifdef CONFIG_ACPI_NUMA
+static void kfd_find_numa_node_in_srat(struct kfd_dev *kdev)
+{
+   struct acpi_table_header *table_header = NULL;
+   struct acpi_subtable_header *sub_header = NULL;
+   unsigned long table_end, subtable_len;
+   u32 pci_id = pci_domain_nr(kdev->pdev->bus) << 16 |
+   pci_dev_id(kdev->pdev);
+   u32 bdf;
+   acpi_status status;
+   struct acpi_srat_cpu_affinity *cpu;
+   struct acpi_srat_generic_affinity *gpu;
+   int pxm = 0, max_pxm = 0;
+   int numa_node = NUMA_NO_NODE;
+   bool found = false;
+
+   /* Fetch the SRAT table from ACPI */
+   status = acpi_get_table(ACPI_SIG_SRAT, 0, &table_header);
+   if (status == AE_NOT_FOUND) {
+   pr_warn("SRAT table not found\n");
+   return;
+   } else if (ACPI_FAILURE(status)) {
+   const char *err = acpi_format_exception(status);
+   pr_err("SRAT table error: %s\n", err);
+   return;
+   }
+
+   table_end = (unsigned long)table_header + table_header->length;
+
+   /* Parse all entries looking for a match. */
+   sub_header = (struct acpi_subtable_header *)
+   ((unsigned long)table_header +
+   sizeof(struct acpi_table_srat));
+   subtable_len = sub_header->length;
+
+   while (((unsigned long)sub_header) + subtable_len  < table_end) {
+   /*
+* If length is 0, break from this loop to avoid
+* infinite loop.
+*/
+   if (subtable_len == 0) {
+   pr_err("SRAT invalid zero length\n");
+   break;
+   }
+
+   switch (sub_header->type) {
+   case ACPI_SRAT_TYPE_CPU_AFFINITY:
+   cpu = (struct acpi_srat_cpu_affinity *)sub_header;
+   pxm = *((u32 *)cpu->proximity_domain_hi) << 8 |
+   cpu->proximity_domain_lo;
+   if (pxm > max_pxm)
+   max_pxm = pxm;
+   break;
+   case ACPI_SRAT_TYPE_GENERIC_AFFINITY:
+   gpu = (struct acpi_srat_generic_affinity *)sub_header;
+   bdf = *((u16 *)(&gpu->device_handle[0])) << 16 |
+   *((u16 *)(&gpu->device_handle[2]));
+   if (bdf == pci_id) {
+   found = true;
+   numa_node = pxm_to_node(gpu->proximity_domain);
+   }
+   break;
+   default:
+   break;
+   }
+
+   if (found)
+   break;
+
+   sub_header = (struct acpi_subtable_header *)
+   ((unsigned long)sub_header + subtable_len);
+   subtable_len = sub_header->length;
+   }
+
+   acpi_put_table(table_header);
+
+   /* Workaround bad cpu-gpu binding case */
+   if (found && (numa_node < 0 || numa_node > max_pxm))
+   numa_node = 0;
+
+   if (numa_node != NUMA_NO_NODE)
+   set_dev_node(&kdev->pdev->dev, numa_node);
+}
+#endif
+
 /* kfd_fill_gpu_direct_io_link - Fill in direct io link from GPU
  * to its NUMA node
  * @avail_size: Available size in the memory
@@ -1804,10 +1889,16 @@ static int kfd_fill_gpu_direct_io_link_to_cpu(int 
*avail_size,
}
 
sub_type_hdr->proximity_domain_from = proximity_domain;
-#ifdef CONFIG_NUMA
+
+#ifdef CONFIG_ACPI_NUMA
if (kdev->pdev->dev.numa_node == NUMA_NO_NODE)
+   kfd_find_numa_node_in_srat(kdev);
+#endif
+#ifdef CONFIG_NUMA
+   if (kdev->pdev->dev.numa_node == NUMA_NO_NODE) {
sub_type_hdr->proximity_domain_to = 0;
-   else
+   set_dev_node(&kdev->pdev->dev, 0);
+   } else
sub_type_hdr->proximity_domain_to = kdev->pdev->dev.numa_node;
 #else
sub_type_hdr->proximity_domain_to = 0;
-- 
2.17.1

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


A hotplug bug in AMDGPU

2021-05-03 Thread Mikulas Patocka
Hi

There's a bug with monitor hotplug starting with the kernel 5.7.

I have Radeon RX 570. If I boot the system with the monitor unplugged and 
then plug the monitor via DVI, the kernel 5.6 and below will properly 
initialized graphics; the kernels 5.7+ will not initialize it - and the 
monitor reports no signal.

I bisected the issue and it is caused by the patch 
4fdda2e66de0b7d37aa27af3c1bbe25ecb2d5408 ("drm/amdgpu/runpm: enable runpm 
on baco capable VI+ asics")

When I remove the code that sets adev->runpm on the kernel 5.12, monitor 
hotplug works correctly.

Mikulas


Signed-off-by: Mikulas Patocka 

---
 drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c |2 --
 1 file changed, 2 deletions(-)

Index: linux-5.12/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
===
--- linux-5.12.orig/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c 2021-04-26 
14:50:53.0 +0200
+++ linux-5.12/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c  2021-05-03 
16:19:54.0 +0200
@@ -183,8 +183,6 @@ int amdgpu_driver_load_kms(struct amdgpu
adev->runpm = true;
break;
default:
-   /* enable runpm on CI+ */
-   adev->runpm = true;
break;
}
if (adev->runpm)

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH] drm/amdkfd: fix no atomics settings in the kfd topology

2021-05-03 Thread Jonathan Kim
To account for various PCIe and xGMI setups, check the no atomics settings
for a device in relation to every direct peer.

Signed-off-by: Jonathan Kim 
---
 drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 55 ++-
 1 file changed, 34 insertions(+), 21 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
index 30430aefcfc7..40ac7fe2a499 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
@@ -1192,47 +1192,60 @@ static void kfd_fill_mem_clk_max_info(struct 
kfd_topology_device *dev)
mem->mem_clk_max = local_mem_info.mem_clk_max;
 }
 
-static void kfd_fill_iolink_non_crat_info(struct kfd_topology_device *dev)
+static void kfd_set_iolink_no_atomics(struct kfd_topology_device *dev,
+   struct kfd_topology_device 
*target_gpu_dev,
+   struct kfd_iolink_properties *link)
 {
-   struct kfd_iolink_properties *link, *cpu_link;
-   struct kfd_topology_device *cpu_dev;
-   struct amdgpu_device *adev;
-   uint32_t cap;
-   uint32_t cpu_flag = CRAT_IOLINK_FLAGS_ENABLED;
-   uint32_t flag = CRAT_IOLINK_FLAGS_ENABLED;
-
-   if (!dev || !dev->gpu)
+   /* xgmi always supports atomics between links. */
+   if (link->iolink_type == CRAT_IOLINK_TYPE_XGMI)
return;
 
-   adev = (struct amdgpu_device *)(dev->gpu->kgd);
-   if (!adev->gmc.xgmi.connected_to_cpu) {
-   pcie_capability_read_dword(dev->gpu->pdev,
+   /* check pcie support to set cpu(dev) flags for target_get_dev link. */
+   if (target_gpu_dev) {
+   uint32_t cap;
+
+   pcie_capability_read_dword(target_gpu_dev->gpu->pdev,
PCI_EXP_DEVCAP2, &cap);
 
if (!(cap & (PCI_EXP_DEVCAP2_ATOMIC_COMP32 |
 PCI_EXP_DEVCAP2_ATOMIC_COMP64)))
-   cpu_flag |= CRAT_IOLINK_FLAGS_NO_ATOMICS_32_BIT |
+   link->flags |= CRAT_IOLINK_FLAGS_NO_ATOMICS_32_BIT |
CRAT_IOLINK_FLAGS_NO_ATOMICS_64_BIT;
-   }
-
-   if (!adev->gmc.xgmi.num_physical_nodes) {
+   /* set gpu (dev) flags. */
+   } else {
if (!dev->gpu->pci_atomic_requested ||
dev->gpu->device_info->asic_family ==
CHIP_HAWAII)
-   flag |= CRAT_IOLINK_FLAGS_NO_ATOMICS_32_BIT |
+   link->flags |= CRAT_IOLINK_FLAGS_NO_ATOMICS_32_BIT |
CRAT_IOLINK_FLAGS_NO_ATOMICS_64_BIT;
}
+}
+
+static void kfd_fill_iolink_non_crat_info(struct kfd_topology_device *dev)
+{
+   struct kfd_iolink_properties *link, *cpu_link;
+   struct kfd_topology_device *cpu_dev;
+   uint32_t flag_enable = CRAT_IOLINK_FLAGS_ENABLED;
+
+   if (!dev || !dev->gpu)
+   return;
 
/* GPU only creates direct links so apply flags setting to all */
list_for_each_entry(link, &dev->io_link_props, list) {
-   link->flags = flag;
+   link->flags = flag_enable;
+   kfd_set_iolink_no_atomics(dev, NULL, link);
cpu_dev = kfd_topology_device_by_proximity_domain(
link->node_to);
+
if (cpu_dev) {
list_for_each_entry(cpu_link,
-   &cpu_dev->io_link_props, list)
-   if (cpu_link->node_to == link->node_from)
-   cpu_link->flags = cpu_flag;
+   &cpu_dev->io_link_props, list) {
+   if (cpu_link->node_to == link->node_from) {
+   cpu_link->flags = flag_enable;
+   kfd_set_iolink_no_atomics(cpu_dev, dev,
+   cpu_link);
+   }
+   }
}
}
 }
-- 
2.17.1

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


Re: A hotplug bug in AMDGPU

2021-05-03 Thread Alex Deucher
On Mon, May 3, 2021 at 11:40 AM Mikulas Patocka  wrote:
>
> Hi
>
> There's a bug with monitor hotplug starting with the kernel 5.7.
>
> I have Radeon RX 570. If I boot the system with the monitor unplugged and
> then plug the monitor via DVI, the kernel 5.6 and below will properly
> initialized graphics; the kernels 5.7+ will not initialize it - and the
> monitor reports no signal.
>
> I bisected the issue and it is caused by the patch
> 4fdda2e66de0b7d37aa27af3c1bbe25ecb2d5408 ("drm/amdgpu/runpm: enable runpm
> on baco capable VI+ asics")
>
> When I remove the code that sets adev->runpm on the kernel 5.12, monitor
> hotplug works correctly.

This isn't really a hotplug bug per se.  That patch enabled runtime
power management which powered down the GPU completely to save power.
Unfortunately when it's powered down, hotplug interrupts won't work
because the entire GPU is powered off.  Disabling runtime pm will
allow hotplug interrupts to work, but will cause the GPU to burn a lot
more power.  I'm not sure what the best solution is.  You can manually
wake the card via sysfs (either via the runtime pm controls in
/sys/class/drm/card0/device/power or by reading a sensor on the board
like temperature) then hotplut the monitor or via a direct request to
probe the displays via the display server.

Alex

>
> Mikulas
>
>
> Signed-off-by: Mikulas Patocka 
>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c |2 --
>  1 file changed, 2 deletions(-)
>
> Index: linux-5.12/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> ===
> --- linux-5.12.orig/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c 2021-04-26 
> 14:50:53.0 +0200
> +++ linux-5.12/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c  2021-05-03 
> 16:19:54.0 +0200
> @@ -183,8 +183,6 @@ int amdgpu_driver_load_kms(struct amdgpu
> adev->runpm = true;
> break;
> default:
> -   /* enable runpm on CI+ */
> -   adev->runpm = true;
> break;
> }
> if (adev->runpm)
>
> ___
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.12 006/134] drm/amd/display: Fix MPC OGAM power on/off sequence

2021-05-03 Thread Sasha Levin
From: Nicholas Kazlauskas 

[ Upstream commit 737b2b536a30a467c405d75f2287e17828838a13 ]

[Why]
Color corruption can occur on bootup into a login
manager that applies a non-linear gamma LUT because
the LUT may not actually be powered on before writing.

It's cleared on the next full pipe reprogramming as
we switch to LUTB from LUTA and the pipe accessing
the LUT has taken it out of light sleep mode.

[How]
The MPCC_OGAM_MEM_PWR_FORCE register does not force
the current power mode when set to 0. It only forces
when set light sleep, deep sleep or shutdown.

The register to actually force power on and ignore
sleep modes is MPCC_OGAM_MEM_PWR_DIS - a value of 0
will enable power requests and a value of 1 will
disable them.

When PWR_FORCE!=0 is combined with PWR_DIS=0 then
MPCC OGAM memory is forced into the state specified
by the force bits.

If PWR_FORCE is 0 then it respects the mode specified
by MPCC_OGAM_MEM_LOW_PWR_MODE if the RAM LUT is not
in use.

We set that bit to shutdown on low power, but otherwise
it inherits from bootup defaults.

So for the fix:

1. Update the sequence to "force" power on when needed

We can use MPCC_OGAM_MEM_PWR_DIS for this to turn on the
memory even when the block is in bypass and pending to be
enabled for the next frame.

We need this for both low power enabled or disabled.

If we don't set this then we can run into issues when we
first program the LUT from bootup.

2. Don't apply FORCE_SEL

Once we enable power requests with DIS=0 we run into the
issue of the RAM being forced into light sleep and being
unusable for display output. Leave this 0 like we used to
for DCN20.

3. Rely on MPCC OGAM init to determine light sleep/deep sleep

MPC low power debug mode isn't enabled on any ASIC currently
but we'll respect the setting determined during init if it
is.

Lightly tested as working with IGT tests and desktop color
adjustment.

4. Change the MPC resource default for DCN30

It was interleaving the dcn20 and dcn30 versions before
depending on the sequence.

5. REG_WAIT for it to be on whenever we're powering up the
memory

Otherwise we can write register values too early and we'll
get corruption.

Signed-off-by: Nicholas Kazlauskas 
Reviewed-by: Eric Yang 
Acked-by: Qingqing Zhuo 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 .../gpu/drm/amd/display/dc/dcn30/dcn30_mpc.c  | 24 ++-
 1 file changed, 13 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_mpc.c 
b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_mpc.c
index 3e6f76096119..a7598356f37d 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_mpc.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_mpc.c
@@ -143,16 +143,18 @@ static void mpc3_power_on_ogam_lut(
 {
struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
 
-   if (mpc->ctx->dc->debug.enable_mem_low_power.bits.mpc) {
-   // Force power on
-   REG_UPDATE(MPCC_MEM_PWR_CTRL[mpcc_id], MPCC_OGAM_MEM_PWR_DIS, 
power_on == true ? 1:0);
-   // Wait for confirmation when powering on
-   if (power_on)
-   REG_WAIT(MPCC_MEM_PWR_CTRL[mpcc_id], 
MPCC_OGAM_MEM_PWR_STATE, 0, 10, 10);
-   } else {
-   REG_SET(MPCC_MEM_PWR_CTRL[mpcc_id], 0,
-   MPCC_OGAM_MEM_PWR_FORCE, power_on == true ? 0 : 
1);
-   }
+   /*
+* Powering on: force memory active so the LUT can be updated.
+* Powering off: allow entering memory low power mode
+*
+* Memory low power mode is controlled during MPC OGAM LUT init.
+*/
+   REG_UPDATE(MPCC_MEM_PWR_CTRL[mpcc_id],
+  MPCC_OGAM_MEM_PWR_DIS, power_on != 0);
+
+   /* Wait for memory to be powered on - we won't be able to write to it 
otherwise. */
+   if (power_on)
+   REG_WAIT(MPCC_MEM_PWR_CTRL[mpcc_id], MPCC_OGAM_MEM_PWR_STATE, 
0, 10, 10);
 }
 
 static void mpc3_configure_ogam_lut(
@@ -1427,7 +1429,7 @@ const struct mpc_funcs dcn30_mpc_funcs = {
.acquire_rmu = mpcc3_acquire_rmu,
.program_3dlut = mpc3_program_3dlut,
.release_rmu = mpcc3_release_rmu,
-   .power_on_mpc_mem_pwr = mpc20_power_on_ogam_lut,
+   .power_on_mpc_mem_pwr = mpc3_power_on_ogam_lut,
.get_mpc_out_mux = mpc1_get_mpc_out_mux,
 
 };
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.12 005/134] drm/amd/display: changing sr exit latency

2021-05-03 Thread Sasha Levin
From: Martin Leung 

[ Upstream commit efe213e5a57e0cd92fa4f328dc1963d330549982 ]

[Why]
Hardware team remeasured, need to update timings
to increase latency slightly and avoid intermittent
underflows.

[How]
sr exit latency update.

Signed-off-by: Martin Leung 
Reviewed-by: Alvin Lee 
Acked-by: Qingqing Zhuo 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

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 fb7f1dea3c46..71e2d5e02571 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c
@@ -181,7 +181,7 @@ struct _vcs_dpi_soc_bounding_box_st dcn3_0_soc = {
},
.min_dcfclk = 500.0, /* TODO: set this to actual min DCFCLK */
.num_states = 1,
-   .sr_exit_time_us = 12,
+   .sr_exit_time_us = 15.5,
.sr_enter_plus_exit_time_us = 20,
.urgent_latency_us = 4.0,
.urgent_latency_pixel_data_only_us = 4.0,
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.12 007/134] drm/amd/pm: do not issue message while write "r" into pp_od_clk_voltage

2021-05-03 Thread Sasha Levin
From: Huang Rui 

[ Upstream commit ca1203d7d7295c49e5707d7def457bdc524a8edb ]

We should commit the value after restore them back to default as well.

$ echo "r" > pp_od_clk_voltage
$ echo "c" > pp_od_clk_voltage

Signed-off-by: Huang Rui 
Reviewed-by: Alex Deucher 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 .../drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.c  | 14 ---
 .../gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c  | 38 ---
 .../gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c   | 18 -
 3 files changed, 70 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.c 
b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.c
index ed05a30d1139..e2a56a7f3d7a 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.c
+++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.c
@@ -1526,20 +1526,6 @@ static int smu10_set_fine_grain_clk_vol(struct pp_hwmgr 
*hwmgr,
 
smu10_data->gfx_actual_soft_min_freq = min_freq;
smu10_data->gfx_actual_soft_max_freq = max_freq;
-
-   ret = smum_send_msg_to_smc_with_parameter(hwmgr,
-   PPSMC_MSG_SetHardMinGfxClk,
-   min_freq,
-   NULL);
-   if (ret)
-   return ret;
-
-   ret = smum_send_msg_to_smc_with_parameter(hwmgr,
-   PPSMC_MSG_SetSoftMaxGfxClk,
-   max_freq,
-   NULL);
-   if (ret)
-   return ret;
} else if (type == PP_OD_COMMIT_DPM_TABLE) {
if (size != 0) {
pr_err("Input parameter number not correct\n");
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
index 101eaa20db9b..a80f551771b9 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
@@ -1462,7 +1462,6 @@ static int vangogh_od_edit_dpm_table(struct smu_context 
*smu, enum PP_OD_DPM_TAB
long input[], uint32_t size)
 {
int ret = 0;
-   int i;
struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm);
 
if (!(smu_dpm_ctx->dpm_level == AMD_DPM_FORCED_LEVEL_MANUAL)) {
@@ -1535,43 +1534,6 @@ static int vangogh_od_edit_dpm_table(struct smu_context 
*smu, enum PP_OD_DPM_TAB
smu->gfx_actual_soft_max_freq = 
smu->gfx_default_soft_max_freq;
smu->cpu_actual_soft_min_freq = 
smu->cpu_default_soft_min_freq;
smu->cpu_actual_soft_max_freq = 
smu->cpu_default_soft_max_freq;
-
-   ret = smu_cmn_send_smc_msg_with_param(smu, 
SMU_MSG_SetHardMinGfxClk,
-   
smu->gfx_actual_hard_min_freq, NULL);
-   if (ret) {
-   dev_err(smu->adev->dev, "Restore the default 
hard min sclk failed!");
-   return ret;
-   }
-
-   ret = smu_cmn_send_smc_msg_with_param(smu, 
SMU_MSG_SetSoftMaxGfxClk,
-   
smu->gfx_actual_soft_max_freq, NULL);
-   if (ret) {
-   dev_err(smu->adev->dev, "Restore the default 
soft max sclk failed!");
-   return ret;
-   }
-
-   if (smu->adev->pm.fw_version < 0x43f1b00) {
-   dev_warn(smu->adev->dev, "CPUSoftMax/CPUSoftMin 
are not supported, please update SBIOS!\n");
-   break;
-   }
-
-   for (i = 0; i < smu->cpu_core_num; i++) {
-   ret = smu_cmn_send_smc_msg_with_param(smu, 
SMU_MSG_SetSoftMinCclk,
- (i << 20) 
| smu->cpu_actual_soft_min_freq,
- NULL);
-   if (ret) {
-   dev_err(smu->adev->dev, "Set hard min 
cclk failed!");
-   return ret;
-   }
-
-   ret = smu_cmn_send_smc_msg_with_param(smu, 
SMU_MSG_SetSoftMaxCclk,
- (i << 20) 
| smu->cpu_actual_soft_max_freq,
- NULL);
-   if (ret) {
-   dev_err(smu->adev->dev, "Set soft max 
cclk failed!");
-   return ret;
-   }
-

[PATCH AUTOSEL 5.12 009/134] drm/amd/display: Check for DSC support instead of ASIC revision

2021-05-03 Thread Sasha Levin
From: Eryk Brol 

[ Upstream commit 349a19b2f1b01e713268c7de9944ad669ccdf369 ]

[why]
This check for ASIC revision is no longer useful and causes
lightup issues after a topology change in MST DSC scenario.
In this case, DSC configs should be recalculated for the new
topology. This check prevented that from happening on certain
ASICs that do, in fact, support DSC.

[how]
Change the ASIC revision to instead check if DSC is supported.

Signed-off-by: Eryk Brol 
Acked-by: Bindu Ramamurthy 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

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 d699a5cf6c11..8ad83ccfcc6a 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -9383,7 +9383,7 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
}
 
 #if defined(CONFIG_DRM_AMD_DC_DCN)
-   if (adev->asic_type >= CHIP_NAVI10) {
+   if (dc_resource_is_dsc_encoding_supported(dc)) {
for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, 
new_crtc_state, i) {
if (drm_atomic_crtc_needs_modeset(new_crtc_state)) {
ret = add_affected_mst_dsc_crtcs(state, crtc);
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.12 010/134] drm/amd/display: Don't optimize bandwidth before disabling planes

2021-05-03 Thread Sasha Levin
From: Aric Cyr 

[ Upstream commit 6ad98e8aeb0106f453bb154933e8355849244990 ]

[Why]
There is a window of time where we optimize bandwidth due to no streams
enabled will enable PSTATE changing but HUBPs are not disabled yet.
This results in underflow counter increasing in some hotplug scenarios.

[How]
Set the optimize-bandwidth flag for later processing once all the HUBPs
are properly disabled.

Signed-off-by: Aric Cyr 
Acked-by: Bindu Ramamurthy 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/core/dc.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 8f8a13c7cf73..c0b827d16268 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -2398,7 +2398,8 @@ static void commit_planes_do_stream_update(struct dc *dc,
if (pipe_ctx->stream_res.audio && 
!dc->debug.az_endpoint_mute_only)

pipe_ctx->stream_res.audio->funcs->az_disable(pipe_ctx->stream_res.audio);
 
-   dc->hwss.optimize_bandwidth(dc, 
dc->current_state);
+   dc->optimized_required = true;
+
} else {
if (dc->optimize_seamless_boot_streams 
== 0)
dc->hwss.prepare_bandwidth(dc, 
dc->current_state);
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.12 011/134] drm/amd/display: Return invalid state if GPINT times out

2021-05-03 Thread Sasha Levin
From: Wyatt Wood 

[ Upstream commit 8039bc7130ef4206a58e4dc288621bc97eba08eb ]

[Why]
GPINT timeout is causing PSR_STATE_0 to be returned when it shouldn't.
We must guarantee that PSR is fully disabled before doing hw programming
on driver-side.

[How]
Return invalid state if GPINT command times out. Let existing retry
logic send the GPINT until successful.

Tested-by: Daniel Wheeler 
Signed-off-by: Wyatt Wood 
Reviewed-by: Anthony Koo 
Acked-by: Rodrigo Siqueira 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c | 15 ++-
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c 
b/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c
index 69e34bef274c..febccb35ddad 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c
+++ b/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c
@@ -81,13 +81,18 @@ static void dmub_psr_get_state(struct dmub_psr *dmub, enum 
dc_psr_state *state)
 {
struct dmub_srv *srv = dmub->ctx->dmub_srv->dmub;
uint32_t raw_state;
+   enum dmub_status status = DMUB_STATUS_INVALID;
 
// Send gpint command and wait for ack
-   dmub_srv_send_gpint_command(srv, DMUB_GPINT__GET_PSR_STATE, 0, 30);
-
-   dmub_srv_get_gpint_response(srv, &raw_state);
-
-   *state = convert_psr_state(raw_state);
+   status = dmub_srv_send_gpint_command(srv, DMUB_GPINT__GET_PSR_STATE, 0, 
30);
+
+   if (status == DMUB_STATUS_OK) {
+   // GPINT was executed, get response
+   dmub_srv_get_gpint_response(srv, &raw_state);
+   *state = convert_psr_state(raw_state);
+   } else
+   // Return invalid state when GPINT times out
+   *state = 0xFF;
 }
 
 /*
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.12 012/134] drm/amdgpu/display: buffer INTERRUPT_LOW_IRQ_CONTEXT interrupt work

2021-05-03 Thread Sasha Levin
From: Xiaogang Chen 

[ Upstream commit b6f91fc183f758461b9462cc93e673adbbf95c2d ]

amdgpu DM handles INTERRUPT_LOW_IRQ_CONTEXT interrupt(hpd, hpd_rx) by using work
queue and uses single work_struct. If new interrupt is recevied before the
previous handler finished, new interrupts(same type) will be discarded and
driver just sends "amdgpu_dm_irq_schedule_work FAILED" message out. If some
important hpd, hpd_rx related interrupts are missed by driver the hot (un)plug
devices may cause system hang or instability, such as issues with system
resume from S3 sleep with mst device connected.

This patch dynamically allocates new amdgpu_dm_irq_handler_data for new
interrupts if previous INTERRUPT_LOW_IRQ_CONTEXT interrupt work has not been
handled. So the new interrupt works can be queued to the same workqueue_struct,
instead of discard the new interrupts. All allocated amdgpu_dm_irq_handler_data
are put into a single linked list and will be reused after.

Signed-off-by: Xiaogang Chen 
Reviewed-by: Aurabindo Pillai 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |  14 +--
 .../drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c | 115 --
 2 files changed, 80 insertions(+), 49 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
index 8bfe901cf237..52cc81705280 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
@@ -68,18 +68,6 @@ struct common_irq_params {
enum dc_irq_source irq_src;
 };
 
-/**
- * struct irq_list_head - Linked-list for low context IRQ handlers.
- *
- * @head: The list_head within &struct handler_data
- * @work: A work_struct containing the deferred handler work
- */
-struct irq_list_head {
-   struct list_head head;
-   /* In case this interrupt needs post-processing, 'work' will be queued*/
-   struct work_struct work;
-};
-
 /**
  * struct dm_compressor_info - Buffer info used by frame buffer compression
  * @cpu_addr: MMIO cpu addr
@@ -293,7 +281,7 @@ struct amdgpu_display_manager {
 * Note that handlers are called in the same order as they were
 * registered (FIFO).
 */
-   struct irq_list_head irq_handler_list_low_tab[DAL_IRQ_SOURCES_NUMBER];
+   struct list_head irq_handler_list_low_tab[DAL_IRQ_SOURCES_NUMBER];
 
/**
 * @irq_handler_list_high_tab:
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
index ec180ed1..8ce10d0973c5 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
@@ -82,6 +82,7 @@ struct amdgpu_dm_irq_handler_data {
struct amdgpu_display_manager *dm;
/* DAL irq source which registered for this interrupt. */
enum dc_irq_source irq_source;
+   struct work_struct work;
 };
 
 #define DM_IRQ_TABLE_LOCK(adev, flags) \
@@ -111,20 +112,10 @@ static void init_handler_common_data(struct 
amdgpu_dm_irq_handler_data *hcd,
  */
 static void dm_irq_work_func(struct work_struct *work)
 {
-   struct irq_list_head *irq_list_head =
-   container_of(work, struct irq_list_head, work);
-   struct list_head *handler_list = &irq_list_head->head;
-   struct amdgpu_dm_irq_handler_data *handler_data;
-
-   list_for_each_entry(handler_data, handler_list, list) {
-   DRM_DEBUG_KMS("DM_IRQ: work_func: for dal_src=%d\n",
-   handler_data->irq_source);
+   struct amdgpu_dm_irq_handler_data *handler_data =
+   container_of(work, struct amdgpu_dm_irq_handler_data, work);
 
-   DRM_DEBUG_KMS("DM_IRQ: schedule_work: for dal_src=%d\n",
-   handler_data->irq_source);
-
-   handler_data->handler(handler_data->handler_arg);
-   }
+   handler_data->handler(handler_data->handler_arg);
 
/* Call a DAL subcomponent which registered for interrupt notification
 * at INTERRUPT_LOW_IRQ_CONTEXT.
@@ -156,7 +147,7 @@ static struct list_head *remove_irq_handler(struct 
amdgpu_device *adev,
break;
case INTERRUPT_LOW_IRQ_CONTEXT:
default:
-   hnd_list = &adev->dm.irq_handler_list_low_tab[irq_source].head;
+   hnd_list = &adev->dm.irq_handler_list_low_tab[irq_source];
break;
}
 
@@ -290,7 +281,8 @@ void *amdgpu_dm_irq_register_interrupt(struct amdgpu_device 
*adev,
break;
case INTERRUPT_LOW_IRQ_CONTEXT:
default:
-   hnd_list = &adev->dm.irq_handler_list_low_tab[irq_source].head;
+   hnd_list = &adev->dm.irq_handler_list_low_tab[irq_source];
+   INIT_WORK(&handler_data->work, dm_irq_work_func);
break;
}
 
@@ -372,7 +364,7 @@ void amdgpu_dm_irq_unregister_interrupt

[PATCH AUTOSEL 5.12 019/134] drm/amd/pm/swsmu: clean up user profile function

2021-05-03 Thread Sasha Levin
From: Arunpravin 

[ Upstream commit d8cce9306801cfbf709055677f7896905094ff95 ]

Remove unnecessary comments, enable restore mode using
'|=' operator, fixes the alignment to improve the code
readability.

v2: Move all restoration flag check to bitwise '&' operator

Signed-off-by: Arunpravin 
Reviewed-by: Evan Quan 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 34 ---
 1 file changed, 12 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c 
b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
index cd905e41080e..42c4dbe3e362 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
@@ -279,35 +279,25 @@ static void smu_set_user_clk_dependencies(struct 
smu_context *smu, enum smu_clk_
if (smu->adev->in_suspend)
return;
 
-   /*
-* mclk, fclk and socclk are interdependent
-* on each other
-*/
if (clk == SMU_MCLK) {
-   /* reset clock dependency */
smu->user_dpm_profile.clk_dependency = 0;
-   /* set mclk dependent clocks(fclk and socclk) */
smu->user_dpm_profile.clk_dependency = BIT(SMU_FCLK) | 
BIT(SMU_SOCCLK);
} else if (clk == SMU_FCLK) {
-   /* give priority to mclk, if mclk dependent clocks are set */
+   /* MCLK takes precedence over FCLK */
if (smu->user_dpm_profile.clk_dependency == (BIT(SMU_FCLK) | 
BIT(SMU_SOCCLK)))
return;
 
-   /* reset clock dependency */
smu->user_dpm_profile.clk_dependency = 0;
-   /* set fclk dependent clocks(mclk and socclk) */
smu->user_dpm_profile.clk_dependency = BIT(SMU_MCLK) | 
BIT(SMU_SOCCLK);
} else if (clk == SMU_SOCCLK) {
-   /* give priority to mclk, if mclk dependent clocks are set */
+   /* MCLK takes precedence over SOCCLK */
if (smu->user_dpm_profile.clk_dependency == (BIT(SMU_FCLK) | 
BIT(SMU_SOCCLK)))
return;
 
-   /* reset clock dependency */
smu->user_dpm_profile.clk_dependency = 0;
-   /* set socclk dependent clocks(mclk and fclk) */
smu->user_dpm_profile.clk_dependency = BIT(SMU_MCLK) | 
BIT(SMU_FCLK);
} else
-   /* add clk dependencies here, if any */
+   /* Add clk dependencies here, if any */
return;
 }
 
@@ -331,7 +321,7 @@ static void smu_restore_dpm_user_profile(struct smu_context 
*smu)
return;
 
/* Enable restore flag */
-   smu->user_dpm_profile.flags = SMU_DPM_USER_PROFILE_RESTORE;
+   smu->user_dpm_profile.flags |= SMU_DPM_USER_PROFILE_RESTORE;
 
/* set the user dpm power limit */
if (smu->user_dpm_profile.power_limit) {
@@ -354,8 +344,8 @@ static void smu_restore_dpm_user_profile(struct smu_context 
*smu)
ret = smu_force_clk_levels(smu, clk_type,

smu->user_dpm_profile.clk_mask[clk_type]);
if (ret)
-   dev_err(smu->adev->dev, "Failed to set 
clock type = %d\n",
-   clk_type);
+   dev_err(smu->adev->dev,
+   "Failed to set clock type = 
%d\n", clk_type);
}
}
}
@@ -1777,7 +1767,7 @@ int smu_force_clk_levels(struct smu_context *smu,
 
if (smu->ppt_funcs && smu->ppt_funcs->force_clk_levels) {
ret = smu->ppt_funcs->force_clk_levels(smu, clk_type, mask);
-   if (!ret && smu->user_dpm_profile.flags != 
SMU_DPM_USER_PROFILE_RESTORE) {
+   if (!ret && !(smu->user_dpm_profile.flags & 
SMU_DPM_USER_PROFILE_RESTORE)) {
smu->user_dpm_profile.clk_mask[clk_type] = mask;
smu_set_user_clk_dependencies(smu, clk_type);
}
@@ -2034,7 +2024,7 @@ int smu_set_fan_speed_rpm(struct smu_context *smu, 
uint32_t speed)
if (smu->ppt_funcs->set_fan_speed_percent) {
percent = speed * 100 / smu->fan_max_rpm;
ret = smu->ppt_funcs->set_fan_speed_percent(smu, percent);
-   if (!ret && smu->user_dpm_profile.flags != 
SMU_DPM_USER_PROFILE_RESTORE)
+   if (!ret && !(smu->user_dpm_profile.flags & 
SMU_DPM_USER_PROFILE_RESTORE))
smu->user_dpm_profile.fan_speed_percent = percent;
}
 
@@ -2104,7 +2094,7 @@ int smu_set_power_limit(struct smu_context *smu, uint32_t 
limit)
 
if (smu->ppt_funcs->set_power_limit) {
ret = smu->ppt_funcs->set_power_limit(smu, limit);
-   if (!ret && smu->user_dpm_profile.flags != 
SMU_DPM_USE

[PATCH AUTOSEL 5.12 020/134] drm/amdgpu: Fix some unload driver issues

2021-05-03 Thread Sasha Levin
From: Emily Deng 

[ Upstream commit bb0cd09be45ea457f25fdcbcb3d6cf2230f26c46 ]

When unloading driver after killing some applications, it will hit sdma
flush tlb job timeout which is called by ttm_bo_delay_delete. So
to avoid the job submit after fence driver fini, call 
ttm_bo_lock_delayed_workqueue
before fence driver fini. And also put drm_sched_fini before waiting fence.

Signed-off-by: Emily Deng 
Reviewed-by: Christian König 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c  | 5 +++--
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 8a5a8ff5d362..5eee251e3335 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -3613,6 +3613,7 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
 {
dev_info(adev->dev, "amdgpu: finishing device.\n");
flush_delayed_work(&adev->delayed_init_work);
+   ttm_bo_lock_delayed_workqueue(&adev->mman.bdev);
adev->shutdown = true;
 
kfree(adev->pci_state);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
index d56f4023ebb3..7e8e46c39dbd 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
@@ -533,6 +533,8 @@ void amdgpu_fence_driver_fini(struct amdgpu_device *adev)
 
if (!ring || !ring->fence_drv.initialized)
continue;
+   if (!ring->no_scheduler)
+   drm_sched_fini(&ring->sched);
r = amdgpu_fence_wait_empty(ring);
if (r) {
/* no need to trigger GPU reset as we are unloading */
@@ -541,8 +543,7 @@ void amdgpu_fence_driver_fini(struct amdgpu_device *adev)
if (ring->fence_drv.irq_src)
amdgpu_irq_put(adev, ring->fence_drv.irq_src,
   ring->fence_drv.irq_type);
-   if (!ring->no_scheduler)
-   drm_sched_fini(&ring->sched);
+
del_timer_sync(&ring->fence_drv.fallback_timer);
for (j = 0; j <= ring->fence_drv.num_fences_mask; ++j)
dma_fence_put(ring->fence_drv.fences[j]);
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.12 013/134] drm/amd/display/dc/dce/dce_aux: Remove duplicate line causing 'field overwritten' issue

2021-05-03 Thread Sasha Levin
From: Lee Jones 

[ Upstream commit 3e3527f5b765c6f479ba55e5a570ee9538589a74 ]

Fixes the following W=1 kernel build warning(s):

 In file included from 
drivers/gpu/drm/amd/amdgpu/../display/dc/dce112/dce112_resource.c:59:
 
drivers/gpu/drm/amd/amdgpu/../include/asic_reg/dce/dce_11_2_sh_mask.h:10014:58: 
warning: initialized field overwritten [-Woverride-init]
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:214:16: note: in 
expansion of macro ‘AUX_SW_DATA__AUX_SW_AUTOINCREMENT_DISABLE__SHIFT’
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:127:2: note: in 
expansion of macro ‘AUX_SF’
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce112/dce112_resource.c:177:2: note: 
in expansion of macro ‘DCE_AUX_MASK_SH_LIST’
 
drivers/gpu/drm/amd/amdgpu/../include/asic_reg/dce/dce_11_2_sh_mask.h:10014:58: 
note: (near initialization for ‘aux_shift.AUX_SW_AUTOINCREMENT_DISABLE’)
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:214:16: note: in 
expansion of macro ‘AUX_SW_DATA__AUX_SW_AUTOINCREMENT_DISABLE__SHIFT’
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:127:2: note: in 
expansion of macro ‘AUX_SF’
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce112/dce112_resource.c:177:2: note: 
in expansion of macro ‘DCE_AUX_MASK_SH_LIST’
 
drivers/gpu/drm/amd/amdgpu/../include/asic_reg/dce/dce_11_2_sh_mask.h:10013:56: 
warning: initialized field overwritten [-Woverride-init]
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:214:16: note: in 
expansion of macro ‘AUX_SW_DATA__AUX_SW_AUTOINCREMENT_DISABLE_MASK’
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:127:2: note: in 
expansion of macro ‘AUX_SF’
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce112/dce112_resource.c:181:2: note: 
in expansion of macro ‘DCE_AUX_MASK_SH_LIST’
 
drivers/gpu/drm/amd/amdgpu/../include/asic_reg/dce/dce_11_2_sh_mask.h:10013:56: 
note: (near initialization for ‘aux_mask.AUX_SW_AUTOINCREMENT_DISABLE’)
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:214:16: note: in 
expansion of macro ‘AUX_SW_DATA__AUX_SW_AUTOINCREMENT_DISABLE_MASK’
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:127:2: note: in 
expansion of macro ‘AUX_SF’

Cc: Harry Wentland 
Cc: Leo Li 
Cc: Alex Deucher 
Cc: "Christian König" 
Cc: David Airlie 
Cc: Daniel Vetter 
Cc: amd-gfx@lists.freedesktop.org
Cc: dri-de...@lists.freedesktop.org
Signed-off-by: Lee Jones 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/dce/dce_aux.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_aux.h 
b/drivers/gpu/drm/amd/display/dc/dce/dce_aux.h
index 277484cf853e..d4be5954d7aa 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_aux.h
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_aux.h
@@ -99,7 +99,6 @@ struct dce110_aux_registers {
AUX_SF(AUX_SW_CONTROL, AUX_SW_GO, mask_sh),\
AUX_SF(AUX_SW_DATA, AUX_SW_AUTOINCREMENT_DISABLE, mask_sh),\
AUX_SF(AUX_SW_DATA, AUX_SW_DATA_RW, mask_sh),\
-   AUX_SF(AUX_SW_DATA, AUX_SW_AUTOINCREMENT_DISABLE, mask_sh),\
AUX_SF(AUX_SW_DATA, AUX_SW_INDEX, mask_sh),\
AUX_SF(AUX_SW_DATA, AUX_SW_DATA, mask_sh),\
AUX_SF(AUX_SW_STATUS, AUX_SW_REPLY_BYTE_COUNT, mask_sh),\
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.12 053/134] drm/amd/pm: fix workload mismatch on vega10

2021-05-03 Thread Sasha Levin
From: Kenneth Feng 

[ Upstream commit 0979d43259e13846d86ba17e451e17fec185d240 ]

Workload number mapped to the correct one.
This issue is only on vega10.

Signed-off-by: Kenneth Feng 
Reviewed-by: Kevin Wang 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c 
b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c
index 599ec9726601..959143eff651 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c
+++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c
@@ -5160,7 +5160,7 @@ static int vega10_set_power_profile_mode(struct pp_hwmgr 
*hwmgr, long *input, ui
 
 out:
smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_SetWorkloadMask,
-   1 << power_profile_mode,
+   (!power_profile_mode) ? 0 : 1 
<< (power_profile_mode - 1),
NULL);
hwmgr->power_profile_mode = power_profile_mode;
 
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.12 049/134] drm/amdgpu: mask the xgmi number of hops reported from psp to kfd

2021-05-03 Thread Sasha Levin
From: Jonathan Kim 

[ Upstream commit 4ac5617c4b7d0f0a8f879997f8ceaa14636d7554 ]

The psp supplies the link type in the upper 2 bits of the psp xgmi node
information num_hops field.  With a new link type, Aldebaran has these
bits set to a non-zero value (1 = xGMI3) so the KFD topology will report
the incorrect IO link weights without proper masking.
The actual number of hops is located in the 3 least significant bits of
this field so mask if off accordingly before passing it to the KFD.

Signed-off-by: Jonathan Kim 
Reviewed-by: Amber Lin 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c | 9 -
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
index 659b385b27b5..4d3a24fdeb9c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
@@ -468,15 +468,22 @@ int amdgpu_xgmi_update_topology(struct amdgpu_hive_info 
*hive, struct amdgpu_dev
 }
 
 
+/*
+ * NOTE psp_xgmi_node_info.num_hops layout is as follows:
+ * num_hops[7:6] = link type (0 = xGMI2, 1 = xGMI3, 2/3 = reserved)
+ * num_hops[5:3] = reserved
+ * num_hops[2:0] = number of hops
+ */
 int amdgpu_xgmi_get_hops_count(struct amdgpu_device *adev,
struct amdgpu_device *peer_adev)
 {
struct psp_xgmi_topology_info *top = &adev->psp.xgmi_context.top_info;
+   uint8_t num_hops_mask = 0x7;
int i;
 
for (i = 0 ; i < top->num_nodes; ++i)
if (top->nodes[i].node_id == peer_adev->gmc.xgmi.node_id)
-   return top->nodes[i].num_hops;
+   return top->nodes[i].num_hops & num_hops_mask;
return  -EINVAL;
 }
 
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.12 050/134] drm/amdkfd: Fix UBSAN shift-out-of-bounds warning

2021-05-03 Thread Sasha Levin
From: Anson Jacob 

[ Upstream commit 50e2fc36e72d4ad672032ebf646cecb48656efe0 ]

If get_num_sdma_queues or get_num_xgmi_sdma_queues is 0, we end up
doing a shift operation where the number of bits shifted equals
number of bits in the operand. This behaviour is undefined.

Set num_sdma_queues or num_xgmi_sdma_queues to ULLONG_MAX, if the
count is >= number of bits in the operand.

Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/1472

Reported-by: Lyude Paul 
Signed-off-by: Anson Jacob 
Reviewed-by: Alex Deucher 
Reviewed-by: Felix Kuehling 
Tested-by: Lyude Paul 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 .../drm/amd/amdkfd/kfd_device_queue_manager.c   | 17 +++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
index 4598a9a58125..a4266c4bca13 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
@@ -1128,6 +1128,9 @@ static int set_sched_resources(struct 
device_queue_manager *dqm)
 
 static int initialize_cpsch(struct device_queue_manager *dqm)
 {
+   uint64_t num_sdma_queues;
+   uint64_t num_xgmi_sdma_queues;
+
pr_debug("num of pipes: %d\n", get_pipes_per_mec(dqm));
 
mutex_init(&dqm->lock_hidden);
@@ -1136,8 +1139,18 @@ static int initialize_cpsch(struct device_queue_manager 
*dqm)
dqm->active_cp_queue_count = 0;
dqm->gws_queue_count = 0;
dqm->active_runlist = false;
-   dqm->sdma_bitmap = ~0ULL >> (64 - get_num_sdma_queues(dqm));
-   dqm->xgmi_sdma_bitmap = ~0ULL >> (64 - get_num_xgmi_sdma_queues(dqm));
+
+   num_sdma_queues = get_num_sdma_queues(dqm);
+   if (num_sdma_queues >= BITS_PER_TYPE(dqm->sdma_bitmap))
+   dqm->sdma_bitmap = ULLONG_MAX;
+   else
+   dqm->sdma_bitmap = (BIT_ULL(num_sdma_queues) - 1);
+
+   num_xgmi_sdma_queues = get_num_xgmi_sdma_queues(dqm);
+   if (num_xgmi_sdma_queues >= BITS_PER_TYPE(dqm->xgmi_sdma_bitmap))
+   dqm->xgmi_sdma_bitmap = ULLONG_MAX;
+   else
+   dqm->xgmi_sdma_bitmap = (BIT_ULL(num_xgmi_sdma_queues) - 1);
 
INIT_WORK(&dqm->hw_exception_work, kfd_process_hw_exception);
 
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.12 055/134] drm/amd/display: DCHUB underflow counter increasing in some scenarios

2021-05-03 Thread Sasha Levin
From: Aric Cyr 

[ Upstream commit 4710430a779e6077d81218ac768787545bff8c49 ]

[Why]
When unplugging a display, the underflow counter can be seen to
increase because PSTATE switch is allowed even when some planes are not
blanked.

[How]
Check that all planes are not active instead of all streams before
allowing PSTATE change.

Tested-by: Daniel Wheeler 
Signed-off-by: Aric Cyr 
Acked-by: Solomon Chiu 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c 
b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c
index c7e5a64e06af..81ea5d3a1947 100644
--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c
+++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c
@@ -252,6 +252,7 @@ static void dcn3_update_clocks(struct clk_mgr *clk_mgr_base,
bool force_reset = false;
bool update_uclk = false;
bool p_state_change_support;
+   int total_plane_count;
 
if (dc->work_arounds.skip_clock_update || !clk_mgr->smu_present)
return;
@@ -292,7 +293,8 @@ static void dcn3_update_clocks(struct clk_mgr *clk_mgr_base,
clk_mgr_base->clks.socclk_khz = new_clocks->socclk_khz;
 
clk_mgr_base->clks.prev_p_state_change_support = 
clk_mgr_base->clks.p_state_change_support;
-   p_state_change_support = new_clocks->p_state_change_support || 
(display_count == 0);
+   total_plane_count = clk_mgr_helper_get_active_plane_cnt(dc, context);
+   p_state_change_support = new_clocks->p_state_change_support || 
(total_plane_count == 0);
if (should_update_pstate_support(safe_to_lower, p_state_change_support, 
clk_mgr_base->clks.p_state_change_support)) {
clk_mgr_base->clks.p_state_change_support = 
p_state_change_support;
 
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.12 048/134] drm/amdgpu: enable 48-bit IH timestamp counter

2021-05-03 Thread Sasha Levin
From: Alex Sierra 

[ Upstream commit 9a9c59a8f4f4478d5951eb0bded1d17b936aad6e ]

By default this timestamp is 32 bit counter. It gets
overflowed in around 10 minutes.

Signed-off-by: Alex Sierra 
Reviewed-by: Felix Kuehling 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/vega20_ih.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/vega20_ih.c 
b/drivers/gpu/drm/amd/amdgpu/vega20_ih.c
index 75b06e1964ab..86dcf448e0c2 100644
--- a/drivers/gpu/drm/amd/amdgpu/vega20_ih.c
+++ b/drivers/gpu/drm/amd/amdgpu/vega20_ih.c
@@ -104,6 +104,8 @@ static int vega20_ih_toggle_ring_interrupts(struct 
amdgpu_device *adev,
 
tmp = RREG32(ih_regs->ih_rb_cntl);
tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, RB_ENABLE, (enable ? 1 : 0));
+   tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, RB_GPU_TS_ENABLE, 1);
+
/* enable_intr field is only valid in ring0 */
if (ih == &adev->irq.ih)
tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, ENABLE_INTR, (enable ? 1 : 
0));
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.12 056/134] drm/amd/display: fix dml prefetch validation

2021-05-03 Thread Sasha Levin
From: Dmytro Laktyushkin 

[ Upstream commit 8ee0fea4baf90e43efe2275de208a7809f9985bc ]

Incorrect variable used, missing initialization during validation.

Tested-by: Daniel Wheeler 
Signed-off-by: Dmytro Laktyushkin 
Reviewed-by: Eric Bernstein 
Acked-by: Solomon Chiu 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.c   | 1 +
 drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c | 1 +
 2 files changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.c 
b/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.c
index 0f3f510fd83b..9729cf292e84 100644
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.c
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.c
@@ -3437,6 +3437,7 @@ void dml20_ModeSupportAndSystemConfigurationFull(struct 
display_mode_lib *mode_l
mode_lib->vba.DCCEnabledInAnyPlane = true;
}
}
+   mode_lib->vba.UrgentLatency = mode_lib->vba.UrgentLatencyPixelDataOnly;
for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
locals->FabricAndDRAMBandwidthPerState[i] = dml_min(
mode_lib->vba.DRAMSpeedPerState[i] * 
mode_lib->vba.NumberOfChannels
diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c 
b/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c
index 210c96cd5b03..51098c2c9854 100644
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c
@@ -3544,6 +3544,7 @@ void dml20v2_ModeSupportAndSystemConfigurationFull(struct 
display_mode_lib *mode
mode_lib->vba.DCCEnabledInAnyPlane = true;
}
}
+   mode_lib->vba.UrgentLatency = mode_lib->vba.UrgentLatencyPixelDataOnly;
for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
locals->FabricAndDRAMBandwidthPerState[i] = dml_min(
mode_lib->vba.DRAMSpeedPerState[i] * 
mode_lib->vba.NumberOfChannels
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.12 057/134] drm/amd/display: Fix potential memory leak

2021-05-03 Thread Sasha Levin
From: Qingqing Zhuo 

[ Upstream commit 51ba691206e35464fd7ec33dd519d141c80b5dff ]

[Why]
vblank_workqueue is never released.

[How]
Free it upon dm finish.

Tested-by: Daniel Wheeler 
Signed-off-by: Qingqing Zhuo 
Reviewed-by: Nicholas Kazlauskas 
Acked-by: Solomon Chiu 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 9 +
 1 file changed, 9 insertions(+)

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 167e04ab9d5b..9c243f66867a 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -1191,6 +1191,15 @@ static void amdgpu_dm_fini(struct amdgpu_device *adev)
if (adev->dm.dc)
dc_deinit_callbacks(adev->dm.dc);
 #endif
+
+#if defined(CONFIG_DRM_AMD_DC_DCN)
+   if (adev->dm.vblank_workqueue) {
+   adev->dm.vblank_workqueue->dm = NULL;
+   kfree(adev->dm.vblank_workqueue);
+   adev->dm.vblank_workqueue = NULL;
+   }
+#endif
+
if (adev->dm.dc->ctx->dmub_srv) {
dc_dmub_srv_destroy(&adev->dm.dc->ctx->dmub_srv);
adev->dm.dc->ctx->dmub_srv = NULL;
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.12 058/134] drm/amdgpu: Fix memory leak

2021-05-03 Thread Sasha Levin
From: xinhui pan 

[ Upstream commit 79fcd446e7e182c52c2c808c76f8de3eb6714349 ]

drm_gem_object_put() should be paired with drm_gem_object_lookup().

All gem objs are saved in fb->base.obj[]. Need put the old first before
assign a new obj.

Trigger VRAM leak by running command below
$ service gdm restart

Signed-off-by: xinhui pan 
Acked-by: Alex Deucher 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
index f753e04fee99..cbe050436c7b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
@@ -910,8 +910,9 @@ int amdgpu_display_framebuffer_init(struct drm_device *dev,
}
 
for (i = 1; i < rfb->base.format->num_planes; ++i) {
+   drm_gem_object_get(rfb->base.obj[0]);
+   drm_gem_object_put(rfb->base.obj[i]);
rfb->base.obj[i] = rfb->base.obj[0];
-   drm_gem_object_get(rfb->base.obj[i]);
}
 
return 0;
@@ -960,6 +961,7 @@ amdgpu_display_user_framebuffer_create(struct drm_device 
*dev,
return ERR_PTR(ret);
}
 
+   drm_gem_object_put(obj);
return &amdgpu_fb->base;
 }
 
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.12 047/134] drm/amdgpu: enable retry fault wptr overflow

2021-05-03 Thread Sasha Levin
From: Philip Yang 

[ Upstream commit b672cb1eee59efe6ca5bb2a2ce90060a22860558 ]

If xnack is on, VM retry fault interrupt send to IH ring1, and ring1
will be full quickly. IH cannot receive other interrupts, this causes
deadlock if migrating buffer using sdma and waiting for sdma done while
handling retry fault.

Remove VMC from IH storm client, enable ring1 write pointer overflow,
then IH will drop retry fault interrupts and be able to receive other
interrupts while driver is handling retry fault.

IH ring1 write pointer doesn't writeback to memory by IH, and ring1
write pointer recorded by self-irq is not updated, so always read
the latest ring1 write pointer from register.

Signed-off-by: Philip Yang 
Signed-off-by: Felix Kuehling 
Reviewed-by: Felix Kuehling 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/vega10_ih.c | 32 +-
 drivers/gpu/drm/amd/amdgpu/vega20_ih.c | 32 +-
 2 files changed, 22 insertions(+), 42 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c 
b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
index 88626d83e07b..ca8efa5c6978 100644
--- a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
+++ b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
@@ -220,10 +220,8 @@ static int vega10_ih_enable_ring(struct amdgpu_device 
*adev,
tmp = vega10_ih_rb_cntl(ih, tmp);
if (ih == &adev->irq.ih)
tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, RPTR_REARM, 
!!adev->irq.msi_enabled);
-   if (ih == &adev->irq.ih1) {
-   tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_ENABLE, 0);
+   if (ih == &adev->irq.ih1)
tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, RB_FULL_DRAIN_ENABLE, 1);
-   }
if (amdgpu_sriov_vf(adev)) {
if (psp_reg_program(&adev->psp, ih_regs->psp_reg_id, tmp)) {
dev_err(adev->dev, "PSP program IH_RB_CNTL failed!\n");
@@ -265,7 +263,6 @@ static int vega10_ih_irq_init(struct amdgpu_device *adev)
u32 ih_chicken;
int ret;
int i;
-   u32 tmp;
 
/* disable irqs */
ret = vega10_ih_toggle_interrupts(adev, false);
@@ -291,15 +288,6 @@ static int vega10_ih_irq_init(struct amdgpu_device *adev)
}
}
 
-   tmp = RREG32_SOC15(OSSSYS, 0, mmIH_STORM_CLIENT_LIST_CNTL);
-   tmp = REG_SET_FIELD(tmp, IH_STORM_CLIENT_LIST_CNTL,
-   CLIENT18_IS_STORM_CLIENT, 1);
-   WREG32_SOC15(OSSSYS, 0, mmIH_STORM_CLIENT_LIST_CNTL, tmp);
-
-   tmp = RREG32_SOC15(OSSSYS, 0, mmIH_INT_FLOOD_CNTL);
-   tmp = REG_SET_FIELD(tmp, IH_INT_FLOOD_CNTL, FLOOD_CNTL_ENABLE, 1);
-   WREG32_SOC15(OSSSYS, 0, mmIH_INT_FLOOD_CNTL, tmp);
-
pci_set_master(adev->pdev);
 
/* enable interrupts */
@@ -345,11 +333,17 @@ static u32 vega10_ih_get_wptr(struct amdgpu_device *adev,
u32 wptr, tmp;
struct amdgpu_ih_regs *ih_regs;
 
-   wptr = le32_to_cpu(*ih->wptr_cpu);
-   ih_regs = &ih->ih_regs;
+   if (ih == &adev->irq.ih) {
+   /* Only ring0 supports writeback. On other rings fall back
+* to register-based code with overflow checking below.
+*/
+   wptr = le32_to_cpu(*ih->wptr_cpu);
 
-   if (!REG_GET_FIELD(wptr, IH_RB_WPTR, RB_OVERFLOW))
-   goto out;
+   if (!REG_GET_FIELD(wptr, IH_RB_WPTR, RB_OVERFLOW))
+   goto out;
+   }
+
+   ih_regs = &ih->ih_regs;
 
/* Double check that the overflow wasn't already cleared. */
wptr = RREG32_NO_KIQ(ih_regs->ih_rb_wptr);
@@ -440,15 +434,11 @@ static int vega10_ih_self_irq(struct amdgpu_device *adev,
  struct amdgpu_irq_src *source,
  struct amdgpu_iv_entry *entry)
 {
-   uint32_t wptr = cpu_to_le32(entry->src_data[0]);
-
switch (entry->ring_id) {
case 1:
-   *adev->irq.ih1.wptr_cpu = wptr;
schedule_work(&adev->irq.ih1_work);
break;
case 2:
-   *adev->irq.ih2.wptr_cpu = wptr;
schedule_work(&adev->irq.ih2_work);
break;
default: break;
diff --git a/drivers/gpu/drm/amd/amdgpu/vega20_ih.c 
b/drivers/gpu/drm/amd/amdgpu/vega20_ih.c
index 5a3c867d5881..75b06e1964ab 100644
--- a/drivers/gpu/drm/amd/amdgpu/vega20_ih.c
+++ b/drivers/gpu/drm/amd/amdgpu/vega20_ih.c
@@ -220,10 +220,8 @@ static int vega20_ih_enable_ring(struct amdgpu_device 
*adev,
tmp = vega20_ih_rb_cntl(ih, tmp);
if (ih == &adev->irq.ih)
tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, RPTR_REARM, 
!!adev->irq.msi_enabled);
-   if (ih == &adev->irq.ih1) {
-   tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_ENABLE, 0);
+   if (ih == &adev->irq.ih1)
tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, RB_FULL_DRAIN_ENABLE, 1);
-   }
if (amdgpu_sriov_vf(adev)) {
if

[PATCH AUTOSEL 5.12 051/134] drm/amd/display: Align cursor cache address to 2KB

2021-05-03 Thread Sasha Levin
From: Joshua Aberback 

[ Upstream commit 554ba183b135ef09250b61a202d88512b5bbd03a ]

[Why]
The registers for the address of the cursor are aligned to 2KB, so all
cursor surfaces also need to be aligned to 2KB. Currently, the
provided cursor cache surface is not aligned, so we need a workaround
until alignment is enforced by the surface provider.

[How]
 - round up surface address to nearest multiple of 2048
 - current policy is to provide a much bigger cache size than
   necessary,so this operation is safe

Tested-by: Daniel Wheeler 
Signed-off-by: Joshua Aberback 
Reviewed-by: Jun Lei 
Acked-by: Eryk Brol 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
index 06dc1e2e8383..07c8d2e2c09c 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
@@ -848,7 +848,7 @@ bool dcn30_apply_idle_power_optimizations(struct dc *dc, 
bool enable)
 
cmd.mall.cursor_copy_src.quad_part = 
cursor_attr.address.quad_part;
cmd.mall.cursor_copy_dst.quad_part =
-   
plane->address.grph.cursor_cache_addr.quad_part;
+   
(plane->address.grph.cursor_cache_addr.quad_part + 2047) & ~2047;
cmd.mall.cursor_width = 
cursor_attr.width;
cmd.mall.cursor_height = 
cursor_attr.height;
cmd.mall.cursor_pitch = 
cursor_attr.pitch;
@@ -858,8 +858,7 @@ bool dcn30_apply_idle_power_optimizations(struct dc *dc, 
bool enable)

dc_dmub_srv_wait_idle(dc->ctx->dmub_srv);
 
/* Use copied cursor, and it's okay to 
not switch back */
-   cursor_attr.address.quad_part =
-   
plane->address.grph.cursor_cache_addr.quad_part;
+   cursor_attr.address.quad_part = 
cmd.mall.cursor_copy_dst.quad_part;
dc_stream_set_cursor_attributes(stream, 
&cursor_attr);
}
 
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.12 052/134] drm/amdgpu : Fix asic reset regression issue introduce by 8f211fe8ac7c4f

2021-05-03 Thread Sasha Levin
From: shaoyunl 

[ Upstream commit c8941550aa66b2a90f4b32c45d59e8571e6e ]

This recent change introduce SDMA interrupt info printing with irq->process 
function.
These functions do not require a set function to enable/disable the irq

Signed-off-by: shaoyunl 
Reviewed-by: Hawking Zhang 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
index afbbec82a289..9be945d8e72f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
@@ -535,7 +535,7 @@ void amdgpu_irq_gpu_reset_resume_helper(struct 
amdgpu_device *adev)
for (j = 0; j < AMDGPU_MAX_IRQ_SRC_ID; ++j) {
struct amdgpu_irq_src *src = 
adev->irq.client[i].sources[j];
 
-   if (!src)
+   if (!src || !src->funcs || !src->funcs->set)
continue;
for (k = 0; k < src->num_types; k++)
amdgpu_irq_update(adev, src, k);
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.12 054/134] drm/amd/display: Fix UBSAN warning for not a valid value for type '_Bool'

2021-05-03 Thread Sasha Levin
From: Anson Jacob 

[ Upstream commit 6a30a92997eee49554f72b462dce90abe54a496f ]

[Why]
dc_cursor_position do not initialise position.translate_by_source when
crtc or plane->state->fb is NULL. UBSAN caught this error in
dce110_set_cursor_position, as the value was garbage.

[How]
Initialise dc_cursor_position structure elements to 0 in handle_cursor_update
before calling get_cursor_position.

Tested-by: Daniel Wheeler 
Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/1471
Reported-by: Lyude Paul 
Signed-off-by: Anson Jacob 
Reviewed-by: Aurabindo Jayamohanan Pillai 
Acked-by: Solomon Chiu 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 6 +-
 1 file changed, 1 insertion(+), 5 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 8ad83ccfcc6a..167e04ab9d5b 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -7417,10 +7417,6 @@ static int get_cursor_position(struct drm_plane *plane, 
struct drm_crtc *crtc,
int x, y;
int xorigin = 0, yorigin = 0;
 
-   position->enable = false;
-   position->x = 0;
-   position->y = 0;
-
if (!crtc || !plane->state->fb)
return 0;
 
@@ -7467,7 +7463,7 @@ static void handle_cursor_update(struct drm_plane *plane,
struct dm_crtc_state *crtc_state = crtc ? to_dm_crtc_state(crtc->state) 
: NULL;
struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
uint64_t address = afb ? afb->address : 0;
-   struct dc_cursor_position position;
+   struct dc_cursor_position position = {0};
struct dc_cursor_attributes attributes;
int ret;
 
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.11 005/115] drm/amd/display: changing sr exit latency

2021-05-03 Thread Sasha Levin
From: Martin Leung 

[ Upstream commit efe213e5a57e0cd92fa4f328dc1963d330549982 ]

[Why]
Hardware team remeasured, need to update timings
to increase latency slightly and avoid intermittent
underflows.

[How]
sr exit latency update.

Signed-off-by: Martin Leung 
Reviewed-by: Alvin Lee 
Acked-by: Qingqing Zhuo 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

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 7ec8936346b2..f90881f4458f 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c
@@ -181,7 +181,7 @@ struct _vcs_dpi_soc_bounding_box_st dcn3_0_soc = {
},
.min_dcfclk = 500.0, /* TODO: set this to actual min DCFCLK */
.num_states = 1,
-   .sr_exit_time_us = 12,
+   .sr_exit_time_us = 15.5,
.sr_enter_plus_exit_time_us = 20,
.urgent_latency_us = 4.0,
.urgent_latency_pixel_data_only_us = 4.0,
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.11 006/115] drm/amd/display: Fix MPC OGAM power on/off sequence

2021-05-03 Thread Sasha Levin
From: Nicholas Kazlauskas 

[ Upstream commit 737b2b536a30a467c405d75f2287e17828838a13 ]

[Why]
Color corruption can occur on bootup into a login
manager that applies a non-linear gamma LUT because
the LUT may not actually be powered on before writing.

It's cleared on the next full pipe reprogramming as
we switch to LUTB from LUTA and the pipe accessing
the LUT has taken it out of light sleep mode.

[How]
The MPCC_OGAM_MEM_PWR_FORCE register does not force
the current power mode when set to 0. It only forces
when set light sleep, deep sleep or shutdown.

The register to actually force power on and ignore
sleep modes is MPCC_OGAM_MEM_PWR_DIS - a value of 0
will enable power requests and a value of 1 will
disable them.

When PWR_FORCE!=0 is combined with PWR_DIS=0 then
MPCC OGAM memory is forced into the state specified
by the force bits.

If PWR_FORCE is 0 then it respects the mode specified
by MPCC_OGAM_MEM_LOW_PWR_MODE if the RAM LUT is not
in use.

We set that bit to shutdown on low power, but otherwise
it inherits from bootup defaults.

So for the fix:

1. Update the sequence to "force" power on when needed

We can use MPCC_OGAM_MEM_PWR_DIS for this to turn on the
memory even when the block is in bypass and pending to be
enabled for the next frame.

We need this for both low power enabled or disabled.

If we don't set this then we can run into issues when we
first program the LUT from bootup.

2. Don't apply FORCE_SEL

Once we enable power requests with DIS=0 we run into the
issue of the RAM being forced into light sleep and being
unusable for display output. Leave this 0 like we used to
for DCN20.

3. Rely on MPCC OGAM init to determine light sleep/deep sleep

MPC low power debug mode isn't enabled on any ASIC currently
but we'll respect the setting determined during init if it
is.

Lightly tested as working with IGT tests and desktop color
adjustment.

4. Change the MPC resource default for DCN30

It was interleaving the dcn20 and dcn30 versions before
depending on the sequence.

5. REG_WAIT for it to be on whenever we're powering up the
memory

Otherwise we can write register values too early and we'll
get corruption.

Signed-off-by: Nicholas Kazlauskas 
Reviewed-by: Eric Yang 
Acked-by: Qingqing Zhuo 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 .../gpu/drm/amd/display/dc/dcn30/dcn30_mpc.c  | 24 ++-
 1 file changed, 13 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_mpc.c 
b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_mpc.c
index 3e6f76096119..a7598356f37d 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_mpc.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_mpc.c
@@ -143,16 +143,18 @@ static void mpc3_power_on_ogam_lut(
 {
struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
 
-   if (mpc->ctx->dc->debug.enable_mem_low_power.bits.mpc) {
-   // Force power on
-   REG_UPDATE(MPCC_MEM_PWR_CTRL[mpcc_id], MPCC_OGAM_MEM_PWR_DIS, 
power_on == true ? 1:0);
-   // Wait for confirmation when powering on
-   if (power_on)
-   REG_WAIT(MPCC_MEM_PWR_CTRL[mpcc_id], 
MPCC_OGAM_MEM_PWR_STATE, 0, 10, 10);
-   } else {
-   REG_SET(MPCC_MEM_PWR_CTRL[mpcc_id], 0,
-   MPCC_OGAM_MEM_PWR_FORCE, power_on == true ? 0 : 
1);
-   }
+   /*
+* Powering on: force memory active so the LUT can be updated.
+* Powering off: allow entering memory low power mode
+*
+* Memory low power mode is controlled during MPC OGAM LUT init.
+*/
+   REG_UPDATE(MPCC_MEM_PWR_CTRL[mpcc_id],
+  MPCC_OGAM_MEM_PWR_DIS, power_on != 0);
+
+   /* Wait for memory to be powered on - we won't be able to write to it 
otherwise. */
+   if (power_on)
+   REG_WAIT(MPCC_MEM_PWR_CTRL[mpcc_id], MPCC_OGAM_MEM_PWR_STATE, 
0, 10, 10);
 }
 
 static void mpc3_configure_ogam_lut(
@@ -1427,7 +1429,7 @@ const struct mpc_funcs dcn30_mpc_funcs = {
.acquire_rmu = mpcc3_acquire_rmu,
.program_3dlut = mpc3_program_3dlut,
.release_rmu = mpcc3_release_rmu,
-   .power_on_mpc_mem_pwr = mpc20_power_on_ogam_lut,
+   .power_on_mpc_mem_pwr = mpc3_power_on_ogam_lut,
.get_mpc_out_mux = mpc1_get_mpc_out_mux,
 
 };
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.11 008/115] drm/amd/display: Check for DSC support instead of ASIC revision

2021-05-03 Thread Sasha Levin
From: Eryk Brol 

[ Upstream commit 349a19b2f1b01e713268c7de9944ad669ccdf369 ]

[why]
This check for ASIC revision is no longer useful and causes
lightup issues after a topology change in MST DSC scenario.
In this case, DSC configs should be recalculated for the new
topology. This check prevented that from happening on certain
ASICs that do, in fact, support DSC.

[how]
Change the ASIC revision to instead check if DSC is supported.

Signed-off-by: Eryk Brol 
Acked-by: Bindu Ramamurthy 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

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 62a637c03f60..fc2763745ae1 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -9216,7 +9216,7 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
}
 
 #if defined(CONFIG_DRM_AMD_DC_DCN)
-   if (adev->asic_type >= CHIP_NAVI10) {
+   if (dc_resource_is_dsc_encoding_supported(dc)) {
for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, 
new_crtc_state, i) {
if (drm_atomic_crtc_needs_modeset(new_crtc_state)) {
ret = add_affected_mst_dsc_crtcs(state, crtc);
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.11 009/115] drm/amd/display: Don't optimize bandwidth before disabling planes

2021-05-03 Thread Sasha Levin
From: Aric Cyr 

[ Upstream commit 6ad98e8aeb0106f453bb154933e8355849244990 ]

[Why]
There is a window of time where we optimize bandwidth due to no streams
enabled will enable PSTATE changing but HUBPs are not disabled yet.
This results in underflow counter increasing in some hotplug scenarios.

[How]
Set the optimize-bandwidth flag for later processing once all the HUBPs
are properly disabled.

Signed-off-by: Aric Cyr 
Acked-by: Bindu Ramamurthy 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/core/dc.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 58eb0d69873a..ccac86347315 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -2380,7 +2380,8 @@ static void commit_planes_do_stream_update(struct dc *dc,
if (pipe_ctx->stream_res.audio && 
!dc->debug.az_endpoint_mute_only)

pipe_ctx->stream_res.audio->funcs->az_disable(pipe_ctx->stream_res.audio);
 
-   dc->hwss.optimize_bandwidth(dc, 
dc->current_state);
+   dc->optimized_required = true;
+
} else {
if (dc->optimize_seamless_boot_streams 
== 0)
dc->hwss.prepare_bandwidth(dc, 
dc->current_state);
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.11 010/115] drm/amd/display: Return invalid state if GPINT times out

2021-05-03 Thread Sasha Levin
From: Wyatt Wood 

[ Upstream commit 8039bc7130ef4206a58e4dc288621bc97eba08eb ]

[Why]
GPINT timeout is causing PSR_STATE_0 to be returned when it shouldn't.
We must guarantee that PSR is fully disabled before doing hw programming
on driver-side.

[How]
Return invalid state if GPINT command times out. Let existing retry
logic send the GPINT until successful.

Tested-by: Daniel Wheeler 
Signed-off-by: Wyatt Wood 
Reviewed-by: Anthony Koo 
Acked-by: Rodrigo Siqueira 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c | 15 ++-
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c 
b/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c
index 17e84f34ceba..e0b195cad9ce 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c
+++ b/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c
@@ -81,13 +81,18 @@ static void dmub_psr_get_state(struct dmub_psr *dmub, enum 
dc_psr_state *state)
 {
struct dmub_srv *srv = dmub->ctx->dmub_srv->dmub;
uint32_t raw_state;
+   enum dmub_status status = DMUB_STATUS_INVALID;
 
// Send gpint command and wait for ack
-   dmub_srv_send_gpint_command(srv, DMUB_GPINT__GET_PSR_STATE, 0, 30);
-
-   dmub_srv_get_gpint_response(srv, &raw_state);
-
-   *state = convert_psr_state(raw_state);
+   status = dmub_srv_send_gpint_command(srv, DMUB_GPINT__GET_PSR_STATE, 0, 
30);
+
+   if (status == DMUB_STATUS_OK) {
+   // GPINT was executed, get response
+   dmub_srv_get_gpint_response(srv, &raw_state);
+   *state = convert_psr_state(raw_state);
+   } else
+   // Return invalid state when GPINT times out
+   *state = 0xFF;
 }
 
 /**
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.11 011/115] drm/amdgpu/display: buffer INTERRUPT_LOW_IRQ_CONTEXT interrupt work

2021-05-03 Thread Sasha Levin
From: Xiaogang Chen 

[ Upstream commit b6f91fc183f758461b9462cc93e673adbbf95c2d ]

amdgpu DM handles INTERRUPT_LOW_IRQ_CONTEXT interrupt(hpd, hpd_rx) by using work
queue and uses single work_struct. If new interrupt is recevied before the
previous handler finished, new interrupts(same type) will be discarded and
driver just sends "amdgpu_dm_irq_schedule_work FAILED" message out. If some
important hpd, hpd_rx related interrupts are missed by driver the hot (un)plug
devices may cause system hang or instability, such as issues with system
resume from S3 sleep with mst device connected.

This patch dynamically allocates new amdgpu_dm_irq_handler_data for new
interrupts if previous INTERRUPT_LOW_IRQ_CONTEXT interrupt work has not been
handled. So the new interrupt works can be queued to the same workqueue_struct,
instead of discard the new interrupts. All allocated amdgpu_dm_irq_handler_data
are put into a single linked list and will be reused after.

Signed-off-by: Xiaogang Chen 
Reviewed-by: Aurabindo Pillai 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |  14 +--
 .../drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c | 115 --
 2 files changed, 80 insertions(+), 49 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
index 1182dafcef02..9dc034b4548a 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
@@ -68,18 +68,6 @@ struct common_irq_params {
enum dc_irq_source irq_src;
 };
 
-/**
- * struct irq_list_head - Linked-list for low context IRQ handlers.
- *
- * @head: The list_head within &struct handler_data
- * @work: A work_struct containing the deferred handler work
- */
-struct irq_list_head {
-   struct list_head head;
-   /* In case this interrupt needs post-processing, 'work' will be queued*/
-   struct work_struct work;
-};
-
 /**
  * struct dm_compressor_info - Buffer info used by frame buffer compression
  * @cpu_addr: MMIO cpu addr
@@ -270,7 +258,7 @@ struct amdgpu_display_manager {
 * Note that handlers are called in the same order as they were
 * registered (FIFO).
 */
-   struct irq_list_head irq_handler_list_low_tab[DAL_IRQ_SOURCES_NUMBER];
+   struct list_head irq_handler_list_low_tab[DAL_IRQ_SOURCES_NUMBER];
 
/**
 * @irq_handler_list_high_tab:
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
index 26ed70e5538a..6cd76c0eebf9 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
@@ -82,6 +82,7 @@ struct amdgpu_dm_irq_handler_data {
struct amdgpu_display_manager *dm;
/* DAL irq source which registered for this interrupt. */
enum dc_irq_source irq_source;
+   struct work_struct work;
 };
 
 #define DM_IRQ_TABLE_LOCK(adev, flags) \
@@ -111,20 +112,10 @@ static void init_handler_common_data(struct 
amdgpu_dm_irq_handler_data *hcd,
  */
 static void dm_irq_work_func(struct work_struct *work)
 {
-   struct irq_list_head *irq_list_head =
-   container_of(work, struct irq_list_head, work);
-   struct list_head *handler_list = &irq_list_head->head;
-   struct amdgpu_dm_irq_handler_data *handler_data;
-
-   list_for_each_entry(handler_data, handler_list, list) {
-   DRM_DEBUG_KMS("DM_IRQ: work_func: for dal_src=%d\n",
-   handler_data->irq_source);
+   struct amdgpu_dm_irq_handler_data *handler_data =
+   container_of(work, struct amdgpu_dm_irq_handler_data, work);
 
-   DRM_DEBUG_KMS("DM_IRQ: schedule_work: for dal_src=%d\n",
-   handler_data->irq_source);
-
-   handler_data->handler(handler_data->handler_arg);
-   }
+   handler_data->handler(handler_data->handler_arg);
 
/* Call a DAL subcomponent which registered for interrupt notification
 * at INTERRUPT_LOW_IRQ_CONTEXT.
@@ -156,7 +147,7 @@ static struct list_head *remove_irq_handler(struct 
amdgpu_device *adev,
break;
case INTERRUPT_LOW_IRQ_CONTEXT:
default:
-   hnd_list = &adev->dm.irq_handler_list_low_tab[irq_source].head;
+   hnd_list = &adev->dm.irq_handler_list_low_tab[irq_source];
break;
}
 
@@ -290,7 +281,8 @@ void *amdgpu_dm_irq_register_interrupt(struct amdgpu_device 
*adev,
break;
case INTERRUPT_LOW_IRQ_CONTEXT:
default:
-   hnd_list = &adev->dm.irq_handler_list_low_tab[irq_source].head;
+   hnd_list = &adev->dm.irq_handler_list_low_tab[irq_source];
+   INIT_WORK(&handler_data->work, dm_irq_work_func);
break;
}
 
@@ -372,7 +364,7 @@ void amdgpu_dm_irq_unregister_interrupt

[PATCH AUTOSEL 5.11 012/115] drm/amd/display/dc/dce/dce_aux: Remove duplicate line causing 'field overwritten' issue

2021-05-03 Thread Sasha Levin
From: Lee Jones 

[ Upstream commit 89adc10178fd6cb68c8ef1905d269070a4d3bd64 ]

Fixes the following W=1 kernel build warning(s):

 In file included from 
drivers/gpu/drm/amd/amdgpu/../display/dc/dce112/dce112_resource.c:59:
 
drivers/gpu/drm/amd/amdgpu/../include/asic_reg/dce/dce_11_2_sh_mask.h:10014:58: 
warning: initialized field overwritten [-Woverride-init]
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:214:16: note: in 
expansion of macro ‘AUX_SW_DATA__AUX_SW_AUTOINCREMENT_DISABLE__SHIFT’
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:127:2: note: in 
expansion of macro ‘AUX_SF’
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce112/dce112_resource.c:177:2: note: 
in expansion of macro ‘DCE_AUX_MASK_SH_LIST’
 
drivers/gpu/drm/amd/amdgpu/../include/asic_reg/dce/dce_11_2_sh_mask.h:10014:58: 
note: (near initialization for ‘aux_shift.AUX_SW_AUTOINCREMENT_DISABLE’)
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:214:16: note: in 
expansion of macro ‘AUX_SW_DATA__AUX_SW_AUTOINCREMENT_DISABLE__SHIFT’
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:127:2: note: in 
expansion of macro ‘AUX_SF’
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce112/dce112_resource.c:177:2: note: 
in expansion of macro ‘DCE_AUX_MASK_SH_LIST’
 
drivers/gpu/drm/amd/amdgpu/../include/asic_reg/dce/dce_11_2_sh_mask.h:10013:56: 
warning: initialized field overwritten [-Woverride-init]
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:214:16: note: in 
expansion of macro ‘AUX_SW_DATA__AUX_SW_AUTOINCREMENT_DISABLE_MASK’
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:127:2: note: in 
expansion of macro ‘AUX_SF’
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce112/dce112_resource.c:181:2: note: 
in expansion of macro ‘DCE_AUX_MASK_SH_LIST’
 
drivers/gpu/drm/amd/amdgpu/../include/asic_reg/dce/dce_11_2_sh_mask.h:10013:56: 
note: (near initialization for ‘aux_mask.AUX_SW_AUTOINCREMENT_DISABLE’)
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:214:16: note: in 
expansion of macro ‘AUX_SW_DATA__AUX_SW_AUTOINCREMENT_DISABLE_MASK’
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:127:2: note: in 
expansion of macro ‘AUX_SF’

Cc: Harry Wentland 
Cc: Leo Li 
Cc: Alex Deucher 
Cc: "Christian König" 
Cc: David Airlie 
Cc: Daniel Vetter 
Cc: amd-gfx@lists.freedesktop.org
Cc: dri-de...@lists.freedesktop.org
Signed-off-by: Lee Jones 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/dce/dce_aux.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_aux.h 
b/drivers/gpu/drm/amd/display/dc/dce/dce_aux.h
index 382465862f29..f72f02e016ae 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_aux.h
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_aux.h
@@ -99,7 +99,6 @@ struct dce110_aux_registers {
AUX_SF(AUX_SW_CONTROL, AUX_SW_GO, mask_sh),\
AUX_SF(AUX_SW_DATA, AUX_SW_AUTOINCREMENT_DISABLE, mask_sh),\
AUX_SF(AUX_SW_DATA, AUX_SW_DATA_RW, mask_sh),\
-   AUX_SF(AUX_SW_DATA, AUX_SW_AUTOINCREMENT_DISABLE, mask_sh),\
AUX_SF(AUX_SW_DATA, AUX_SW_INDEX, mask_sh),\
AUX_SF(AUX_SW_DATA, AUX_SW_DATA, mask_sh),\
AUX_SF(AUX_SW_STATUS, AUX_SW_REPLY_BYTE_COUNT, mask_sh),\
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.11 018/115] drm/amdgpu: Fix some unload driver issues

2021-05-03 Thread Sasha Levin
From: Emily Deng 

[ Upstream commit bb0cd09be45ea457f25fdcbcb3d6cf2230f26c46 ]

When unloading driver after killing some applications, it will hit sdma
flush tlb job timeout which is called by ttm_bo_delay_delete. So
to avoid the job submit after fence driver fini, call 
ttm_bo_lock_delayed_workqueue
before fence driver fini. And also put drm_sched_fini before waiting fence.

Signed-off-by: Emily Deng 
Reviewed-by: Christian König 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c  | 5 +++--
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index eacfca776249..ccf30782e491 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -3579,6 +3579,7 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
 {
dev_info(adev->dev, "amdgpu: finishing device.\n");
flush_delayed_work(&adev->delayed_init_work);
+   ttm_bo_lock_delayed_workqueue(&adev->mman.bdev);
adev->shutdown = true;
 
kfree(adev->pci_state);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
index d56f4023ebb3..7e8e46c39dbd 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
@@ -533,6 +533,8 @@ void amdgpu_fence_driver_fini(struct amdgpu_device *adev)
 
if (!ring || !ring->fence_drv.initialized)
continue;
+   if (!ring->no_scheduler)
+   drm_sched_fini(&ring->sched);
r = amdgpu_fence_wait_empty(ring);
if (r) {
/* no need to trigger GPU reset as we are unloading */
@@ -541,8 +543,7 @@ void amdgpu_fence_driver_fini(struct amdgpu_device *adev)
if (ring->fence_drv.irq_src)
amdgpu_irq_put(adev, ring->fence_drv.irq_src,
   ring->fence_drv.irq_type);
-   if (!ring->no_scheduler)
-   drm_sched_fini(&ring->sched);
+
del_timer_sync(&ring->fence_drv.fallback_timer);
for (j = 0; j <= ring->fence_drv.num_fences_mask; ++j)
dma_fence_put(ring->fence_drv.fences[j]);
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.11 042/115] drm/amdgpu: mask the xgmi number of hops reported from psp to kfd

2021-05-03 Thread Sasha Levin
From: Jonathan Kim 

[ Upstream commit 4ac5617c4b7d0f0a8f879997f8ceaa14636d7554 ]

The psp supplies the link type in the upper 2 bits of the psp xgmi node
information num_hops field.  With a new link type, Aldebaran has these
bits set to a non-zero value (1 = xGMI3) so the KFD topology will report
the incorrect IO link weights without proper masking.
The actual number of hops is located in the 3 least significant bits of
this field so mask if off accordingly before passing it to the KFD.

Signed-off-by: Jonathan Kim 
Reviewed-by: Amber Lin 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c | 9 -
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
index 541ef6be390f..6ef374cb3ee2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
@@ -470,15 +470,22 @@ int amdgpu_xgmi_update_topology(struct amdgpu_hive_info 
*hive, struct amdgpu_dev
 }
 
 
+/*
+ * NOTE psp_xgmi_node_info.num_hops layout is as follows:
+ * num_hops[7:6] = link type (0 = xGMI2, 1 = xGMI3, 2/3 = reserved)
+ * num_hops[5:3] = reserved
+ * num_hops[2:0] = number of hops
+ */
 int amdgpu_xgmi_get_hops_count(struct amdgpu_device *adev,
struct amdgpu_device *peer_adev)
 {
struct psp_xgmi_topology_info *top = &adev->psp.xgmi_context.top_info;
+   uint8_t num_hops_mask = 0x7;
int i;
 
for (i = 0 ; i < top->num_nodes; ++i)
if (top->nodes[i].node_id == peer_adev->gmc.xgmi.node_id)
-   return top->nodes[i].num_hops;
+   return top->nodes[i].num_hops & num_hops_mask;
return  -EINVAL;
 }
 
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.11 043/115] drm/amdkfd: Fix UBSAN shift-out-of-bounds warning

2021-05-03 Thread Sasha Levin
From: Anson Jacob 

[ Upstream commit 50e2fc36e72d4ad672032ebf646cecb48656efe0 ]

If get_num_sdma_queues or get_num_xgmi_sdma_queues is 0, we end up
doing a shift operation where the number of bits shifted equals
number of bits in the operand. This behaviour is undefined.

Set num_sdma_queues or num_xgmi_sdma_queues to ULLONG_MAX, if the
count is >= number of bits in the operand.

Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/1472

Reported-by: Lyude Paul 
Signed-off-by: Anson Jacob 
Reviewed-by: Alex Deucher 
Reviewed-by: Felix Kuehling 
Tested-by: Lyude Paul 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 .../drm/amd/amdkfd/kfd_device_queue_manager.c   | 17 +++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
index 4598a9a58125..a4266c4bca13 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
@@ -1128,6 +1128,9 @@ static int set_sched_resources(struct 
device_queue_manager *dqm)
 
 static int initialize_cpsch(struct device_queue_manager *dqm)
 {
+   uint64_t num_sdma_queues;
+   uint64_t num_xgmi_sdma_queues;
+
pr_debug("num of pipes: %d\n", get_pipes_per_mec(dqm));
 
mutex_init(&dqm->lock_hidden);
@@ -1136,8 +1139,18 @@ static int initialize_cpsch(struct device_queue_manager 
*dqm)
dqm->active_cp_queue_count = 0;
dqm->gws_queue_count = 0;
dqm->active_runlist = false;
-   dqm->sdma_bitmap = ~0ULL >> (64 - get_num_sdma_queues(dqm));
-   dqm->xgmi_sdma_bitmap = ~0ULL >> (64 - get_num_xgmi_sdma_queues(dqm));
+
+   num_sdma_queues = get_num_sdma_queues(dqm);
+   if (num_sdma_queues >= BITS_PER_TYPE(dqm->sdma_bitmap))
+   dqm->sdma_bitmap = ULLONG_MAX;
+   else
+   dqm->sdma_bitmap = (BIT_ULL(num_sdma_queues) - 1);
+
+   num_xgmi_sdma_queues = get_num_xgmi_sdma_queues(dqm);
+   if (num_xgmi_sdma_queues >= BITS_PER_TYPE(dqm->xgmi_sdma_bitmap))
+   dqm->xgmi_sdma_bitmap = ULLONG_MAX;
+   else
+   dqm->xgmi_sdma_bitmap = (BIT_ULL(num_xgmi_sdma_queues) - 1);
 
INIT_WORK(&dqm->hw_exception_work, kfd_process_hw_exception);
 
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.11 044/115] drm/amdgpu : Fix asic reset regression issue introduce by 8f211fe8ac7c4f

2021-05-03 Thread Sasha Levin
From: shaoyunl 

[ Upstream commit c8941550aa66b2a90f4b32c45d59e8571e6e ]

This recent change introduce SDMA interrupt info printing with irq->process 
function.
These functions do not require a set function to enable/disable the irq

Signed-off-by: shaoyunl 
Reviewed-by: Hawking Zhang 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
index bea57e8e793f..b535f7c6c61b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
@@ -534,7 +534,7 @@ void amdgpu_irq_gpu_reset_resume_helper(struct 
amdgpu_device *adev)
for (j = 0; j < AMDGPU_MAX_IRQ_SRC_ID; ++j) {
struct amdgpu_irq_src *src = 
adev->irq.client[i].sources[j];
 
-   if (!src)
+   if (!src || !src->funcs || !src->funcs->set)
continue;
for (k = 0; k < src->num_types; k++)
amdgpu_irq_update(adev, src, k);
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.11 045/115] drm/amd/pm: fix workload mismatch on vega10

2021-05-03 Thread Sasha Levin
From: Kenneth Feng 

[ Upstream commit 0979d43259e13846d86ba17e451e17fec185d240 ]

Workload number mapped to the correct one.
This issue is only on vega10.

Signed-off-by: Kenneth Feng 
Reviewed-by: Kevin Wang 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c 
b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c
index 892f08f2ba42..13b5ae1c106f 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c
+++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c
@@ -5161,7 +5161,7 @@ static int vega10_set_power_profile_mode(struct pp_hwmgr 
*hwmgr, long *input, ui
 
 out:
smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_SetWorkloadMask,
-   1 << power_profile_mode,
+   (!power_profile_mode) ? 0 : 1 
<< (power_profile_mode - 1),
NULL);
hwmgr->power_profile_mode = power_profile_mode;
 
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.11 046/115] drm/amd/display: Fix UBSAN warning for not a valid value for type '_Bool'

2021-05-03 Thread Sasha Levin
From: Anson Jacob 

[ Upstream commit 6a30a92997eee49554f72b462dce90abe54a496f ]

[Why]
dc_cursor_position do not initialise position.translate_by_source when
crtc or plane->state->fb is NULL. UBSAN caught this error in
dce110_set_cursor_position, as the value was garbage.

[How]
Initialise dc_cursor_position structure elements to 0 in handle_cursor_update
before calling get_cursor_position.

Tested-by: Daniel Wheeler 
Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/1471
Reported-by: Lyude Paul 
Signed-off-by: Anson Jacob 
Reviewed-by: Aurabindo Jayamohanan Pillai 
Acked-by: Solomon Chiu 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 6 +-
 1 file changed, 1 insertion(+), 5 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 fc2763745ae1..2b957d60c7b5 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -7250,10 +7250,6 @@ static int get_cursor_position(struct drm_plane *plane, 
struct drm_crtc *crtc,
int x, y;
int xorigin = 0, yorigin = 0;
 
-   position->enable = false;
-   position->x = 0;
-   position->y = 0;
-
if (!crtc || !plane->state->fb)
return 0;
 
@@ -7300,7 +7296,7 @@ static void handle_cursor_update(struct drm_plane *plane,
struct dm_crtc_state *crtc_state = crtc ? to_dm_crtc_state(crtc->state) 
: NULL;
struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
uint64_t address = afb ? afb->address : 0;
-   struct dc_cursor_position position;
+   struct dc_cursor_position position = {0};
struct dc_cursor_attributes attributes;
int ret;
 
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.11 047/115] drm/amd/display: DCHUB underflow counter increasing in some scenarios

2021-05-03 Thread Sasha Levin
From: Aric Cyr 

[ Upstream commit 4710430a779e6077d81218ac768787545bff8c49 ]

[Why]
When unplugging a display, the underflow counter can be seen to
increase because PSTATE switch is allowed even when some planes are not
blanked.

[How]
Check that all planes are not active instead of all streams before
allowing PSTATE change.

Tested-by: Daniel Wheeler 
Signed-off-by: Aric Cyr 
Acked-by: Solomon Chiu 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c 
b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c
index ab98c259ef69..cbe94cf489c7 100644
--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c
+++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c
@@ -252,6 +252,7 @@ static void dcn3_update_clocks(struct clk_mgr *clk_mgr_base,
bool force_reset = false;
bool update_uclk = false;
bool p_state_change_support;
+   int total_plane_count;
 
if (dc->work_arounds.skip_clock_update || !clk_mgr->smu_present)
return;
@@ -292,7 +293,8 @@ static void dcn3_update_clocks(struct clk_mgr *clk_mgr_base,
clk_mgr_base->clks.socclk_khz = new_clocks->socclk_khz;
 
clk_mgr_base->clks.prev_p_state_change_support = 
clk_mgr_base->clks.p_state_change_support;
-   p_state_change_support = new_clocks->p_state_change_support || 
(display_count == 0);
+   total_plane_count = clk_mgr_helper_get_active_plane_cnt(dc, context);
+   p_state_change_support = new_clocks->p_state_change_support || 
(total_plane_count == 0);
if (should_update_pstate_support(safe_to_lower, p_state_change_support, 
clk_mgr_base->clks.p_state_change_support)) {
clk_mgr_base->clks.p_state_change_support = 
p_state_change_support;
 
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.11 049/115] drm/amdgpu: Fix memory leak

2021-05-03 Thread Sasha Levin
From: xinhui pan 

[ Upstream commit 79fcd446e7e182c52c2c808c76f8de3eb6714349 ]

drm_gem_object_put() should be paired with drm_gem_object_lookup().

All gem objs are saved in fb->base.obj[]. Need put the old first before
assign a new obj.

Trigger VRAM leak by running command below
$ service gdm restart

Signed-off-by: xinhui pan 
Acked-by: Alex Deucher 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
index 48cb33e5b382..f5fa1befa7e2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
@@ -910,8 +910,9 @@ int amdgpu_display_framebuffer_init(struct drm_device *dev,
}
 
for (i = 1; i < rfb->base.format->num_planes; ++i) {
+   drm_gem_object_get(rfb->base.obj[0]);
+   drm_gem_object_put(rfb->base.obj[i]);
rfb->base.obj[i] = rfb->base.obj[0];
-   drm_gem_object_get(rfb->base.obj[i]);
}
 
return 0;
@@ -960,6 +961,7 @@ amdgpu_display_user_framebuffer_create(struct drm_device 
*dev,
return ERR_PTR(ret);
}
 
+   drm_gem_object_put(obj);
return &amdgpu_fb->base;
 }
 
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.11 048/115] drm/amd/display: fix dml prefetch validation

2021-05-03 Thread Sasha Levin
From: Dmytro Laktyushkin 

[ Upstream commit 8ee0fea4baf90e43efe2275de208a7809f9985bc ]

Incorrect variable used, missing initialization during validation.

Tested-by: Daniel Wheeler 
Signed-off-by: Dmytro Laktyushkin 
Reviewed-by: Eric Bernstein 
Acked-by: Solomon Chiu 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.c   | 1 +
 drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c | 1 +
 2 files changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.c 
b/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.c
index 45f028986a8d..b3f0476899d3 100644
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.c
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.c
@@ -3437,6 +3437,7 @@ void dml20_ModeSupportAndSystemConfigurationFull(struct 
display_mode_lib *mode_l
mode_lib->vba.DCCEnabledInAnyPlane = true;
}
}
+   mode_lib->vba.UrgentLatency = mode_lib->vba.UrgentLatencyPixelDataOnly;
for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
locals->FabricAndDRAMBandwidthPerState[i] = dml_min(
mode_lib->vba.DRAMSpeedPerState[i] * 
mode_lib->vba.NumberOfChannels
diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c 
b/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c
index 80170f9721ce..1bcda7eba4a6 100644
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c
@@ -3510,6 +3510,7 @@ void dml20v2_ModeSupportAndSystemConfigurationFull(struct 
display_mode_lib *mode
mode_lib->vba.DCCEnabledInAnyPlane = true;
}
}
+   mode_lib->vba.UrgentLatency = mode_lib->vba.UrgentLatencyPixelDataOnly;
for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
locals->FabricAndDRAMBandwidthPerState[i] = dml_min(
mode_lib->vba.DRAMSpeedPerState[i] * 
mode_lib->vba.NumberOfChannels
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.10 005/100] drm/amd/display: changing sr exit latency

2021-05-03 Thread Sasha Levin
From: Martin Leung 

[ Upstream commit efe213e5a57e0cd92fa4f328dc1963d330549982 ]

[Why]
Hardware team remeasured, need to update timings
to increase latency slightly and avoid intermittent
underflows.

[How]
sr exit latency update.

Signed-off-by: Martin Leung 
Reviewed-by: Alvin Lee 
Acked-by: Qingqing Zhuo 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

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 2455d210ccf6..8465cae180da 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c
@@ -180,7 +180,7 @@ struct _vcs_dpi_soc_bounding_box_st dcn3_0_soc = {
},
.min_dcfclk = 500.0, /* TODO: set this to actual min DCFCLK */
.num_states = 1,
-   .sr_exit_time_us = 12,
+   .sr_exit_time_us = 15.5,
.sr_enter_plus_exit_time_us = 20,
.urgent_latency_us = 4.0,
.urgent_latency_pixel_data_only_us = 4.0,
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.10 007/100] drm/amd/display: Check for DSC support instead of ASIC revision

2021-05-03 Thread Sasha Levin
From: Eryk Brol 

[ Upstream commit 349a19b2f1b01e713268c7de9944ad669ccdf369 ]

[why]
This check for ASIC revision is no longer useful and causes
lightup issues after a topology change in MST DSC scenario.
In this case, DSC configs should be recalculated for the new
topology. This check prevented that from happening on certain
ASICs that do, in fact, support DSC.

[how]
Change the ASIC revision to instead check if DSC is supported.

Signed-off-by: Eryk Brol 
Acked-by: Bindu Ramamurthy 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

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 c07737c45677..830d302be045 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -8659,7 +8659,7 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
}
 
 #if defined(CONFIG_DRM_AMD_DC_DCN)
-   if (adev->asic_type >= CHIP_NAVI10) {
+   if (dc_resource_is_dsc_encoding_supported(dc)) {
for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, 
new_crtc_state, i) {
if (drm_atomic_crtc_needs_modeset(new_crtc_state)) {
ret = add_affected_mst_dsc_crtcs(state, crtc);
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.10 008/100] drm/amd/display: Don't optimize bandwidth before disabling planes

2021-05-03 Thread Sasha Levin
From: Aric Cyr 

[ Upstream commit 6ad98e8aeb0106f453bb154933e8355849244990 ]

[Why]
There is a window of time where we optimize bandwidth due to no streams
enabled will enable PSTATE changing but HUBPs are not disabled yet.
This results in underflow counter increasing in some hotplug scenarios.

[How]
Set the optimize-bandwidth flag for later processing once all the HUBPs
are properly disabled.

Signed-off-by: Aric Cyr 
Acked-by: Bindu Ramamurthy 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/core/dc.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index ffb21196bf59..921c4ca6e902 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -2345,7 +2345,8 @@ static void commit_planes_do_stream_update(struct dc *dc,
if (pipe_ctx->stream_res.audio && 
!dc->debug.az_endpoint_mute_only)

pipe_ctx->stream_res.audio->funcs->az_disable(pipe_ctx->stream_res.audio);
 
-   dc->hwss.optimize_bandwidth(dc, 
dc->current_state);
+   dc->optimized_required = true;
+
} else {
if (dc->optimize_seamless_boot_streams 
== 0)
dc->hwss.prepare_bandwidth(dc, 
dc->current_state);
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.10 009/100] drm/amdgpu/display: buffer INTERRUPT_LOW_IRQ_CONTEXT interrupt work

2021-05-03 Thread Sasha Levin
From: Xiaogang Chen 

[ Upstream commit b6f91fc183f758461b9462cc93e673adbbf95c2d ]

amdgpu DM handles INTERRUPT_LOW_IRQ_CONTEXT interrupt(hpd, hpd_rx) by using work
queue and uses single work_struct. If new interrupt is recevied before the
previous handler finished, new interrupts(same type) will be discarded and
driver just sends "amdgpu_dm_irq_schedule_work FAILED" message out. If some
important hpd, hpd_rx related interrupts are missed by driver the hot (un)plug
devices may cause system hang or instability, such as issues with system
resume from S3 sleep with mst device connected.

This patch dynamically allocates new amdgpu_dm_irq_handler_data for new
interrupts if previous INTERRUPT_LOW_IRQ_CONTEXT interrupt work has not been
handled. So the new interrupt works can be queued to the same workqueue_struct,
instead of discard the new interrupts. All allocated amdgpu_dm_irq_handler_data
are put into a single linked list and will be reused after.

Signed-off-by: Xiaogang Chen 
Reviewed-by: Aurabindo Pillai 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |  14 +--
 .../drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c | 115 --
 2 files changed, 80 insertions(+), 49 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
index a8a0e8cb1a11..1df7f1b18049 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
@@ -68,18 +68,6 @@ struct common_irq_params {
enum dc_irq_source irq_src;
 };
 
-/**
- * struct irq_list_head - Linked-list for low context IRQ handlers.
- *
- * @head: The list_head within &struct handler_data
- * @work: A work_struct containing the deferred handler work
- */
-struct irq_list_head {
-   struct list_head head;
-   /* In case this interrupt needs post-processing, 'work' will be queued*/
-   struct work_struct work;
-};
-
 /**
  * struct dm_compressor_info - Buffer info used by frame buffer compression
  * @cpu_addr: MMIO cpu addr
@@ -270,7 +258,7 @@ struct amdgpu_display_manager {
 * Note that handlers are called in the same order as they were
 * registered (FIFO).
 */
-   struct irq_list_head irq_handler_list_low_tab[DAL_IRQ_SOURCES_NUMBER];
+   struct list_head irq_handler_list_low_tab[DAL_IRQ_SOURCES_NUMBER];
 
/**
 * @irq_handler_list_high_tab:
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
index 357778556b06..281b274e2b9b 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
@@ -82,6 +82,7 @@ struct amdgpu_dm_irq_handler_data {
struct amdgpu_display_manager *dm;
/* DAL irq source which registered for this interrupt. */
enum dc_irq_source irq_source;
+   struct work_struct work;
 };
 
 #define DM_IRQ_TABLE_LOCK(adev, flags) \
@@ -111,20 +112,10 @@ static void init_handler_common_data(struct 
amdgpu_dm_irq_handler_data *hcd,
  */
 static void dm_irq_work_func(struct work_struct *work)
 {
-   struct irq_list_head *irq_list_head =
-   container_of(work, struct irq_list_head, work);
-   struct list_head *handler_list = &irq_list_head->head;
-   struct amdgpu_dm_irq_handler_data *handler_data;
-
-   list_for_each_entry(handler_data, handler_list, list) {
-   DRM_DEBUG_KMS("DM_IRQ: work_func: for dal_src=%d\n",
-   handler_data->irq_source);
+   struct amdgpu_dm_irq_handler_data *handler_data =
+   container_of(work, struct amdgpu_dm_irq_handler_data, work);
 
-   DRM_DEBUG_KMS("DM_IRQ: schedule_work: for dal_src=%d\n",
-   handler_data->irq_source);
-
-   handler_data->handler(handler_data->handler_arg);
-   }
+   handler_data->handler(handler_data->handler_arg);
 
/* Call a DAL subcomponent which registered for interrupt notification
 * at INTERRUPT_LOW_IRQ_CONTEXT.
@@ -156,7 +147,7 @@ static struct list_head *remove_irq_handler(struct 
amdgpu_device *adev,
break;
case INTERRUPT_LOW_IRQ_CONTEXT:
default:
-   hnd_list = &adev->dm.irq_handler_list_low_tab[irq_source].head;
+   hnd_list = &adev->dm.irq_handler_list_low_tab[irq_source];
break;
}
 
@@ -287,7 +278,8 @@ void *amdgpu_dm_irq_register_interrupt(struct amdgpu_device 
*adev,
break;
case INTERRUPT_LOW_IRQ_CONTEXT:
default:
-   hnd_list = &adev->dm.irq_handler_list_low_tab[irq_source].head;
+   hnd_list = &adev->dm.irq_handler_list_low_tab[irq_source];
+   INIT_WORK(&handler_data->work, dm_irq_work_func);
break;
}
 
@@ -369,7 +361,7 @@ void amdgpu_dm_irq_unregister_interrupt

[PATCH AUTOSEL 5.10 010/100] drm/amd/display/dc/dce/dce_aux: Remove duplicate line causing 'field overwritten' issue

2021-05-03 Thread Sasha Levin
From: Lee Jones 

[ Upstream commit 89adc10178fd6cb68c8ef1905d269070a4d3bd64 ]

Fixes the following W=1 kernel build warning(s):

 In file included from 
drivers/gpu/drm/amd/amdgpu/../display/dc/dce112/dce112_resource.c:59:
 
drivers/gpu/drm/amd/amdgpu/../include/asic_reg/dce/dce_11_2_sh_mask.h:10014:58: 
warning: initialized field overwritten [-Woverride-init]
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:214:16: note: in 
expansion of macro ‘AUX_SW_DATA__AUX_SW_AUTOINCREMENT_DISABLE__SHIFT’
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:127:2: note: in 
expansion of macro ‘AUX_SF’
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce112/dce112_resource.c:177:2: note: 
in expansion of macro ‘DCE_AUX_MASK_SH_LIST’
 
drivers/gpu/drm/amd/amdgpu/../include/asic_reg/dce/dce_11_2_sh_mask.h:10014:58: 
note: (near initialization for ‘aux_shift.AUX_SW_AUTOINCREMENT_DISABLE’)
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:214:16: note: in 
expansion of macro ‘AUX_SW_DATA__AUX_SW_AUTOINCREMENT_DISABLE__SHIFT’
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:127:2: note: in 
expansion of macro ‘AUX_SF’
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce112/dce112_resource.c:177:2: note: 
in expansion of macro ‘DCE_AUX_MASK_SH_LIST’
 
drivers/gpu/drm/amd/amdgpu/../include/asic_reg/dce/dce_11_2_sh_mask.h:10013:56: 
warning: initialized field overwritten [-Woverride-init]
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:214:16: note: in 
expansion of macro ‘AUX_SW_DATA__AUX_SW_AUTOINCREMENT_DISABLE_MASK’
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:127:2: note: in 
expansion of macro ‘AUX_SF’
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce112/dce112_resource.c:181:2: note: 
in expansion of macro ‘DCE_AUX_MASK_SH_LIST’
 
drivers/gpu/drm/amd/amdgpu/../include/asic_reg/dce/dce_11_2_sh_mask.h:10013:56: 
note: (near initialization for ‘aux_mask.AUX_SW_AUTOINCREMENT_DISABLE’)
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:214:16: note: in 
expansion of macro ‘AUX_SW_DATA__AUX_SW_AUTOINCREMENT_DISABLE_MASK’
 drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.h:127:2: note: in 
expansion of macro ‘AUX_SF’

Cc: Harry Wentland 
Cc: Leo Li 
Cc: Alex Deucher 
Cc: "Christian König" 
Cc: David Airlie 
Cc: Daniel Vetter 
Cc: amd-gfx@lists.freedesktop.org
Cc: dri-de...@lists.freedesktop.org
Signed-off-by: Lee Jones 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/dce/dce_aux.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_aux.h 
b/drivers/gpu/drm/amd/display/dc/dce/dce_aux.h
index 382465862f29..f72f02e016ae 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_aux.h
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_aux.h
@@ -99,7 +99,6 @@ struct dce110_aux_registers {
AUX_SF(AUX_SW_CONTROL, AUX_SW_GO, mask_sh),\
AUX_SF(AUX_SW_DATA, AUX_SW_AUTOINCREMENT_DISABLE, mask_sh),\
AUX_SF(AUX_SW_DATA, AUX_SW_DATA_RW, mask_sh),\
-   AUX_SF(AUX_SW_DATA, AUX_SW_AUTOINCREMENT_DISABLE, mask_sh),\
AUX_SF(AUX_SW_DATA, AUX_SW_INDEX, mask_sh),\
AUX_SF(AUX_SW_DATA, AUX_SW_DATA, mask_sh),\
AUX_SF(AUX_SW_STATUS, AUX_SW_REPLY_BYTE_COUNT, mask_sh),\
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.10 013/100] drm/amdgpu: Fix some unload driver issues

2021-05-03 Thread Sasha Levin
From: Emily Deng 

[ Upstream commit bb0cd09be45ea457f25fdcbcb3d6cf2230f26c46 ]

When unloading driver after killing some applications, it will hit sdma
flush tlb job timeout which is called by ttm_bo_delay_delete. So
to avoid the job submit after fence driver fini, call 
ttm_bo_lock_delayed_workqueue
before fence driver fini. And also put drm_sched_fini before waiting fence.

Signed-off-by: Emily Deng 
Reviewed-by: Christian König 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c  | 5 +++--
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 76d10f1c579b..7f2689d4b86d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -3551,6 +3551,7 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
 {
dev_info(adev->dev, "amdgpu: finishing device.\n");
flush_delayed_work(&adev->delayed_init_work);
+   ttm_bo_lock_delayed_workqueue(&adev->mman.bdev);
adev->shutdown = true;
 
kfree(adev->pci_state);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
index fe2d495d08ab..d07c458c0bed 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
@@ -532,6 +532,8 @@ void amdgpu_fence_driver_fini(struct amdgpu_device *adev)
 
if (!ring || !ring->fence_drv.initialized)
continue;
+   if (!ring->no_scheduler)
+   drm_sched_fini(&ring->sched);
r = amdgpu_fence_wait_empty(ring);
if (r) {
/* no need to trigger GPU reset as we are unloading */
@@ -540,8 +542,7 @@ void amdgpu_fence_driver_fini(struct amdgpu_device *adev)
if (ring->fence_drv.irq_src)
amdgpu_irq_put(adev, ring->fence_drv.irq_src,
   ring->fence_drv.irq_type);
-   if (!ring->no_scheduler)
-   drm_sched_fini(&ring->sched);
+
del_timer_sync(&ring->fence_drv.fallback_timer);
for (j = 0; j <= ring->fence_drv.num_fences_mask; ++j)
dma_fence_put(ring->fence_drv.fences[j]);
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.10 035/100] drm/amd/pm: fix workload mismatch on vega10

2021-05-03 Thread Sasha Levin
From: Kenneth Feng 

[ Upstream commit 0979d43259e13846d86ba17e451e17fec185d240 ]

Workload number mapped to the correct one.
This issue is only on vega10.

Signed-off-by: Kenneth Feng 
Reviewed-by: Kevin Wang 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c 
b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c
index ed4eafc744d3..132c269c7c89 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c
+++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c
@@ -5159,7 +5159,7 @@ static int vega10_set_power_profile_mode(struct pp_hwmgr 
*hwmgr, long *input, ui
 
 out:
smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_SetWorkloadMask,
-   1 << power_profile_mode,
+   (!power_profile_mode) ? 0 : 1 
<< (power_profile_mode - 1),
NULL);
hwmgr->power_profile_mode = power_profile_mode;
 
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.10 036/100] drm/amd/display: Fix UBSAN warning for not a valid value for type '_Bool'

2021-05-03 Thread Sasha Levin
From: Anson Jacob 

[ Upstream commit 6a30a92997eee49554f72b462dce90abe54a496f ]

[Why]
dc_cursor_position do not initialise position.translate_by_source when
crtc or plane->state->fb is NULL. UBSAN caught this error in
dce110_set_cursor_position, as the value was garbage.

[How]
Initialise dc_cursor_position structure elements to 0 in handle_cursor_update
before calling get_cursor_position.

Tested-by: Daniel Wheeler 
Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/1471
Reported-by: Lyude Paul 
Signed-off-by: Anson Jacob 
Reviewed-by: Aurabindo Jayamohanan Pillai 
Acked-by: Solomon Chiu 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 6 +-
 1 file changed, 1 insertion(+), 5 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 830d302be045..12a4f0675fb0 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -6800,10 +6800,6 @@ static int get_cursor_position(struct drm_plane *plane, 
struct drm_crtc *crtc,
int x, y;
int xorigin = 0, yorigin = 0;
 
-   position->enable = false;
-   position->x = 0;
-   position->y = 0;
-
if (!crtc || !plane->state->fb)
return 0;
 
@@ -6850,7 +6846,7 @@ static void handle_cursor_update(struct drm_plane *plane,
struct dm_crtc_state *crtc_state = crtc ? to_dm_crtc_state(crtc->state) 
: NULL;
struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
uint64_t address = afb ? afb->address : 0;
-   struct dc_cursor_position position;
+   struct dc_cursor_position position = {0};
struct dc_cursor_attributes attributes;
int ret;
 
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.10 032/100] drm/amdgpu: mask the xgmi number of hops reported from psp to kfd

2021-05-03 Thread Sasha Levin
From: Jonathan Kim 

[ Upstream commit 4ac5617c4b7d0f0a8f879997f8ceaa14636d7554 ]

The psp supplies the link type in the upper 2 bits of the psp xgmi node
information num_hops field.  With a new link type, Aldebaran has these
bits set to a non-zero value (1 = xGMI3) so the KFD topology will report
the incorrect IO link weights without proper masking.
The actual number of hops is located in the 3 least significant bits of
this field so mask if off accordingly before passing it to the KFD.

Signed-off-by: Jonathan Kim 
Reviewed-by: Amber Lin 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c | 9 -
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
index 1162913c8bf4..0526dec1d736 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
@@ -465,15 +465,22 @@ int amdgpu_xgmi_update_topology(struct amdgpu_hive_info 
*hive, struct amdgpu_dev
 }
 
 
+/*
+ * NOTE psp_xgmi_node_info.num_hops layout is as follows:
+ * num_hops[7:6] = link type (0 = xGMI2, 1 = xGMI3, 2/3 = reserved)
+ * num_hops[5:3] = reserved
+ * num_hops[2:0] = number of hops
+ */
 int amdgpu_xgmi_get_hops_count(struct amdgpu_device *adev,
struct amdgpu_device *peer_adev)
 {
struct psp_xgmi_topology_info *top = &adev->psp.xgmi_context.top_info;
+   uint8_t num_hops_mask = 0x7;
int i;
 
for (i = 0 ; i < top->num_nodes; ++i)
if (top->nodes[i].node_id == peer_adev->gmc.xgmi.node_id)
-   return top->nodes[i].num_hops;
+   return top->nodes[i].num_hops & num_hops_mask;
return  -EINVAL;
 }
 
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.4 03/57] drm/amd/display: Check for DSC support instead of ASIC revision

2021-05-03 Thread Sasha Levin
From: Eryk Brol 

[ Upstream commit 349a19b2f1b01e713268c7de9944ad669ccdf369 ]

[why]
This check for ASIC revision is no longer useful and causes
lightup issues after a topology change in MST DSC scenario.
In this case, DSC configs should be recalculated for the new
topology. This check prevented that from happening on certain
ASICs that do, in fact, support DSC.

[how]
Change the ASIC revision to instead check if DSC is supported.

Signed-off-by: Eryk Brol 
Acked-by: Bindu Ramamurthy 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

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 fbbe611d4873..2626aacf492f 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -7330,7 +7330,7 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
}
 
 #if defined(CONFIG_DRM_AMD_DC_DCN)
-   if (adev->asic_type >= CHIP_NAVI10) {
+   if (dc_resource_is_dsc_encoding_supported(dc)) {
for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, 
new_crtc_state, i) {
if (drm_atomic_crtc_needs_modeset(new_crtc_state)) {
ret = add_affected_mst_dsc_crtcs(state, crtc);
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.4 04/57] drm/amd/display: Don't optimize bandwidth before disabling planes

2021-05-03 Thread Sasha Levin
From: Aric Cyr 

[ Upstream commit 6ad98e8aeb0106f453bb154933e8355849244990 ]

[Why]
There is a window of time where we optimize bandwidth due to no streams
enabled will enable PSTATE changing but HUBPs are not disabled yet.
This results in underflow counter increasing in some hotplug scenarios.

[How]
Set the optimize-bandwidth flag for later processing once all the HUBPs
are properly disabled.

Signed-off-by: Aric Cyr 
Acked-by: Bindu Ramamurthy 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/core/dc.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 68d56a91d44b..092db590087c 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -1961,7 +1961,8 @@ static void commit_planes_do_stream_update(struct dc *dc,
if (pipe_ctx->stream_res.audio && 
!dc->debug.az_endpoint_mute_only)

pipe_ctx->stream_res.audio->funcs->az_disable(pipe_ctx->stream_res.audio);
 
-   dc->hwss.optimize_bandwidth(dc, 
dc->current_state);
+   dc->optimized_required = true;
+
} else {
if (!dc->optimize_seamless_boot)
dc->hwss.prepare_bandwidth(dc, 
dc->current_state);
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.10 034/100] drm/amdgpu : Fix asic reset regression issue introduce by 8f211fe8ac7c4f

2021-05-03 Thread Sasha Levin
From: shaoyunl 

[ Upstream commit c8941550aa66b2a90f4b32c45d59e8571e6e ]

This recent change introduce SDMA interrupt info printing with irq->process 
function.
These functions do not require a set function to enable/disable the irq

Signed-off-by: shaoyunl 
Reviewed-by: Hawking Zhang 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
index 300ac73b4738..2f70fdd6104f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
@@ -499,7 +499,7 @@ void amdgpu_irq_gpu_reset_resume_helper(struct 
amdgpu_device *adev)
for (j = 0; j < AMDGPU_MAX_IRQ_SRC_ID; ++j) {
struct amdgpu_irq_src *src = 
adev->irq.client[i].sources[j];
 
-   if (!src)
+   if (!src || !src->funcs || !src->funcs->set)
continue;
for (k = 0; k < src->num_types; k++)
amdgpu_irq_update(adev, src, k);
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.10 033/100] drm/amdkfd: Fix UBSAN shift-out-of-bounds warning

2021-05-03 Thread Sasha Levin
From: Anson Jacob 

[ Upstream commit 50e2fc36e72d4ad672032ebf646cecb48656efe0 ]

If get_num_sdma_queues or get_num_xgmi_sdma_queues is 0, we end up
doing a shift operation where the number of bits shifted equals
number of bits in the operand. This behaviour is undefined.

Set num_sdma_queues or num_xgmi_sdma_queues to ULLONG_MAX, if the
count is >= number of bits in the operand.

Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/1472

Reported-by: Lyude Paul 
Signed-off-by: Anson Jacob 
Reviewed-by: Alex Deucher 
Reviewed-by: Felix Kuehling 
Tested-by: Lyude Paul 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 .../drm/amd/amdkfd/kfd_device_queue_manager.c   | 17 +++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
index 8e5cfb1f8a51..6ea8a4b6efde 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
@@ -1128,6 +1128,9 @@ static int set_sched_resources(struct 
device_queue_manager *dqm)
 
 static int initialize_cpsch(struct device_queue_manager *dqm)
 {
+   uint64_t num_sdma_queues;
+   uint64_t num_xgmi_sdma_queues;
+
pr_debug("num of pipes: %d\n", get_pipes_per_mec(dqm));
 
mutex_init(&dqm->lock_hidden);
@@ -1136,8 +1139,18 @@ static int initialize_cpsch(struct device_queue_manager 
*dqm)
dqm->active_cp_queue_count = 0;
dqm->gws_queue_count = 0;
dqm->active_runlist = false;
-   dqm->sdma_bitmap = ~0ULL >> (64 - get_num_sdma_queues(dqm));
-   dqm->xgmi_sdma_bitmap = ~0ULL >> (64 - get_num_xgmi_sdma_queues(dqm));
+
+   num_sdma_queues = get_num_sdma_queues(dqm);
+   if (num_sdma_queues >= BITS_PER_TYPE(dqm->sdma_bitmap))
+   dqm->sdma_bitmap = ULLONG_MAX;
+   else
+   dqm->sdma_bitmap = (BIT_ULL(num_sdma_queues) - 1);
+
+   num_xgmi_sdma_queues = get_num_xgmi_sdma_queues(dqm);
+   if (num_xgmi_sdma_queues >= BITS_PER_TYPE(dqm->xgmi_sdma_bitmap))
+   dqm->xgmi_sdma_bitmap = ULLONG_MAX;
+   else
+   dqm->xgmi_sdma_bitmap = (BIT_ULL(num_xgmi_sdma_queues) - 1);
 
INIT_WORK(&dqm->hw_exception_work, kfd_process_hw_exception);
 
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.10 037/100] drm/amd/display: DCHUB underflow counter increasing in some scenarios

2021-05-03 Thread Sasha Levin
From: Aric Cyr 

[ Upstream commit 4710430a779e6077d81218ac768787545bff8c49 ]

[Why]
When unplugging a display, the underflow counter can be seen to
increase because PSTATE switch is allowed even when some planes are not
blanked.

[How]
Check that all planes are not active instead of all streams before
allowing PSTATE change.

Tested-by: Daniel Wheeler 
Signed-off-by: Aric Cyr 
Acked-by: Solomon Chiu 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c 
b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c
index 95d883482227..cab47bb21172 100644
--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c
+++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c
@@ -240,6 +240,7 @@ static void dcn3_update_clocks(struct clk_mgr *clk_mgr_base,
bool force_reset = false;
bool update_uclk = false;
bool p_state_change_support;
+   int total_plane_count;
 
if (dc->work_arounds.skip_clock_update || !clk_mgr->smu_present)
return;
@@ -280,7 +281,8 @@ static void dcn3_update_clocks(struct clk_mgr *clk_mgr_base,
clk_mgr_base->clks.socclk_khz = new_clocks->socclk_khz;
 
clk_mgr_base->clks.prev_p_state_change_support = 
clk_mgr_base->clks.p_state_change_support;
-   p_state_change_support = new_clocks->p_state_change_support || 
(display_count == 0);
+   total_plane_count = clk_mgr_helper_get_active_plane_cnt(dc, context);
+   p_state_change_support = new_clocks->p_state_change_support || 
(total_plane_count == 0);
if (should_update_pstate_support(safe_to_lower, p_state_change_support, 
clk_mgr_base->clks.p_state_change_support)) {
clk_mgr_base->clks.p_state_change_support = 
p_state_change_support;
 
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.10 038/100] drm/amd/display: fix dml prefetch validation

2021-05-03 Thread Sasha Levin
From: Dmytro Laktyushkin 

[ Upstream commit 8ee0fea4baf90e43efe2275de208a7809f9985bc ]

Incorrect variable used, missing initialization during validation.

Tested-by: Daniel Wheeler 
Signed-off-by: Dmytro Laktyushkin 
Reviewed-by: Eric Bernstein 
Acked-by: Solomon Chiu 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.c   | 1 +
 drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c | 1 +
 2 files changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.c 
b/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.c
index 45f028986a8d..b3f0476899d3 100644
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.c
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.c
@@ -3437,6 +3437,7 @@ void dml20_ModeSupportAndSystemConfigurationFull(struct 
display_mode_lib *mode_l
mode_lib->vba.DCCEnabledInAnyPlane = true;
}
}
+   mode_lib->vba.UrgentLatency = mode_lib->vba.UrgentLatencyPixelDataOnly;
for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
locals->FabricAndDRAMBandwidthPerState[i] = dml_min(
mode_lib->vba.DRAMSpeedPerState[i] * 
mode_lib->vba.NumberOfChannels
diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c 
b/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c
index 80170f9721ce..1bcda7eba4a6 100644
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c
@@ -3510,6 +3510,7 @@ void dml20v2_ModeSupportAndSystemConfigurationFull(struct 
display_mode_lib *mode
mode_lib->vba.DCCEnabledInAnyPlane = true;
}
}
+   mode_lib->vba.UrgentLatency = mode_lib->vba.UrgentLatencyPixelDataOnly;
for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
locals->FabricAndDRAMBandwidthPerState[i] = dml_min(
mode_lib->vba.DRAMSpeedPerState[i] * 
mode_lib->vba.NumberOfChannels
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.4 20/57] drm/amdgpu: mask the xgmi number of hops reported from psp to kfd

2021-05-03 Thread Sasha Levin
From: Jonathan Kim 

[ Upstream commit 4ac5617c4b7d0f0a8f879997f8ceaa14636d7554 ]

The psp supplies the link type in the upper 2 bits of the psp xgmi node
information num_hops field.  With a new link type, Aldebaran has these
bits set to a non-zero value (1 = xGMI3) so the KFD topology will report
the incorrect IO link weights without proper masking.
The actual number of hops is located in the 3 least significant bits of
this field so mask if off accordingly before passing it to the KFD.

Signed-off-by: Jonathan Kim 
Reviewed-by: Amber Lin 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c | 9 -
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
index 65aae75f80fd..ce1048bad158 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
@@ -311,15 +311,22 @@ int amdgpu_xgmi_update_topology(struct amdgpu_hive_info 
*hive, struct amdgpu_dev
 }
 
 
+/*
+ * NOTE psp_xgmi_node_info.num_hops layout is as follows:
+ * num_hops[7:6] = link type (0 = xGMI2, 1 = xGMI3, 2/3 = reserved)
+ * num_hops[5:3] = reserved
+ * num_hops[2:0] = number of hops
+ */
 int amdgpu_xgmi_get_hops_count(struct amdgpu_device *adev,
struct amdgpu_device *peer_adev)
 {
struct psp_xgmi_topology_info *top = &adev->psp.xgmi_context.top_info;
+   uint8_t num_hops_mask = 0x7;
int i;
 
for (i = 0 ; i < top->num_nodes; ++i)
if (top->nodes[i].node_id == peer_adev->gmc.xgmi.node_id)
-   return top->nodes[i].num_hops;
+   return top->nodes[i].num_hops & num_hops_mask;
return  -EINVAL;
 }
 
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.4 21/57] drm/amdkfd: Fix UBSAN shift-out-of-bounds warning

2021-05-03 Thread Sasha Levin
From: Anson Jacob 

[ Upstream commit 50e2fc36e72d4ad672032ebf646cecb48656efe0 ]

If get_num_sdma_queues or get_num_xgmi_sdma_queues is 0, we end up
doing a shift operation where the number of bits shifted equals
number of bits in the operand. This behaviour is undefined.

Set num_sdma_queues or num_xgmi_sdma_queues to ULLONG_MAX, if the
count is >= number of bits in the operand.

Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/1472

Reported-by: Lyude Paul 
Signed-off-by: Anson Jacob 
Reviewed-by: Alex Deucher 
Reviewed-by: Felix Kuehling 
Tested-by: Lyude Paul 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 .../drm/amd/amdkfd/kfd_device_queue_manager.c   | 17 +++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
index e9a278440079..ab69898c9cb7 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
@@ -1011,6 +1011,9 @@ static int set_sched_resources(struct 
device_queue_manager *dqm)
 
 static int initialize_cpsch(struct device_queue_manager *dqm)
 {
+   uint64_t num_sdma_queues;
+   uint64_t num_xgmi_sdma_queues;
+
pr_debug("num of pipes: %d\n", get_pipes_per_mec(dqm));
 
mutex_init(&dqm->lock_hidden);
@@ -1019,8 +1022,18 @@ static int initialize_cpsch(struct device_queue_manager 
*dqm)
dqm->sdma_queue_count = 0;
dqm->xgmi_sdma_queue_count = 0;
dqm->active_runlist = false;
-   dqm->sdma_bitmap = ~0ULL >> (64 - get_num_sdma_queues(dqm));
-   dqm->xgmi_sdma_bitmap = ~0ULL >> (64 - get_num_xgmi_sdma_queues(dqm));
+
+   num_sdma_queues = get_num_sdma_queues(dqm);
+   if (num_sdma_queues >= BITS_PER_TYPE(dqm->sdma_bitmap))
+   dqm->sdma_bitmap = ULLONG_MAX;
+   else
+   dqm->sdma_bitmap = (BIT_ULL(num_sdma_queues) - 1);
+
+   num_xgmi_sdma_queues = get_num_xgmi_sdma_queues(dqm);
+   if (num_xgmi_sdma_queues >= BITS_PER_TYPE(dqm->xgmi_sdma_bitmap))
+   dqm->xgmi_sdma_bitmap = ULLONG_MAX;
+   else
+   dqm->xgmi_sdma_bitmap = (BIT_ULL(num_xgmi_sdma_queues) - 1);
 
INIT_WORK(&dqm->hw_exception_work, kfd_process_hw_exception);
 
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.4 22/57] drm/amdgpu : Fix asic reset regression issue introduce by 8f211fe8ac7c4f

2021-05-03 Thread Sasha Levin
From: shaoyunl 

[ Upstream commit c8941550aa66b2a90f4b32c45d59e8571e6e ]

This recent change introduce SDMA interrupt info printing with irq->process 
function.
These functions do not require a set function to enable/disable the irq

Signed-off-by: shaoyunl 
Reviewed-by: Hawking Zhang 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
index 2a3f5ec298db..76429932035e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
@@ -469,7 +469,7 @@ void amdgpu_irq_gpu_reset_resume_helper(struct 
amdgpu_device *adev)
for (j = 0; j < AMDGPU_MAX_IRQ_SRC_ID; ++j) {
struct amdgpu_irq_src *src = 
adev->irq.client[i].sources[j];
 
-   if (!src)
+   if (!src || !src->funcs || !src->funcs->set)
continue;
for (k = 0; k < src->num_types; k++)
amdgpu_irq_update(adev, src, k);
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.4 23/57] drm/amd/display: Fix UBSAN warning for not a valid value for type '_Bool'

2021-05-03 Thread Sasha Levin
From: Anson Jacob 

[ Upstream commit 6a30a92997eee49554f72b462dce90abe54a496f ]

[Why]
dc_cursor_position do not initialise position.translate_by_source when
crtc or plane->state->fb is NULL. UBSAN caught this error in
dce110_set_cursor_position, as the value was garbage.

[How]
Initialise dc_cursor_position structure elements to 0 in handle_cursor_update
before calling get_cursor_position.

Tested-by: Daniel Wheeler 
Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/1471
Reported-by: Lyude Paul 
Signed-off-by: Anson Jacob 
Reviewed-by: Aurabindo Jayamohanan Pillai 
Acked-by: Solomon Chiu 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 6 +-
 1 file changed, 1 insertion(+), 5 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 2626aacf492f..1aec841fda35 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -5372,10 +5372,6 @@ static int get_cursor_position(struct drm_plane *plane, 
struct drm_crtc *crtc,
int x, y;
int xorigin = 0, yorigin = 0;
 
-   position->enable = false;
-   position->x = 0;
-   position->y = 0;
-
if (!crtc || !plane->state->fb)
return 0;
 
@@ -5427,7 +5423,7 @@ static void handle_cursor_update(struct drm_plane *plane,
struct dm_crtc_state *crtc_state = crtc ? to_dm_crtc_state(crtc->state) 
: NULL;
struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
uint64_t address = afb ? afb->address : 0;
-   struct dc_cursor_position position;
+   struct dc_cursor_position position = {0};
struct dc_cursor_attributes attributes;
int ret;
 
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.4 24/57] drm/amd/display: fix dml prefetch validation

2021-05-03 Thread Sasha Levin
From: Dmytro Laktyushkin 

[ Upstream commit 8ee0fea4baf90e43efe2275de208a7809f9985bc ]

Incorrect variable used, missing initialization during validation.

Tested-by: Daniel Wheeler 
Signed-off-by: Dmytro Laktyushkin 
Reviewed-by: Eric Bernstein 
Acked-by: Solomon Chiu 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.c   | 1 +
 drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c | 1 +
 2 files changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.c 
b/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.c
index 6c6c486b774a..945d23ca3677 100644
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.c
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.c
@@ -3435,6 +3435,7 @@ void dml20_ModeSupportAndSystemConfigurationFull(struct 
display_mode_lib *mode_l
mode_lib->vba.DCCEnabledInAnyPlane = true;
}
}
+   mode_lib->vba.UrgentLatency = mode_lib->vba.UrgentLatencyPixelDataOnly;
for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
locals->FabricAndDRAMBandwidthPerState[i] = dml_min(
mode_lib->vba.DRAMSpeedPerState[i] * 
mode_lib->vba.NumberOfChannels
diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c 
b/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c
index 0fafd693ffb4..5b5ed1be19ba 100644
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c
@@ -3467,6 +3467,7 @@ void dml20v2_ModeSupportAndSystemConfigurationFull(struct 
display_mode_lib *mode
mode_lib->vba.DCCEnabledInAnyPlane = true;
}
}
+   mode_lib->vba.UrgentLatency = mode_lib->vba.UrgentLatencyPixelDataOnly;
for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
locals->FabricAndDRAMBandwidthPerState[i] = dml_min(
mode_lib->vba.DRAMSpeedPerState[i] * 
mode_lib->vba.NumberOfChannels
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.4 49/57] drm/amdkfd: Fix cat debugfs hang_hws file causes system crash bug

2021-05-03 Thread Sasha Levin
From: Qu Huang 

[ Upstream commit d73610211eec8aa027850982b1a48980aa1bc96e ]

Here is the system crash log:
[ 1272.884438] BUG: unable to handle kernel NULL pointer dereference at
(null)
[ 1272.88] IP: [<  (null)>]   (null)
[ 1272.884447] PGD 825b09067 PUD 8267c8067 PMD 0
[ 1272.884452] Oops: 0010 [#1] SMP
[ 1272.884509] CPU: 13 PID: 3485 Comm: cat Kdump: loaded Tainted: G
[ 1272.884515] task: 9a38dbd4d140 ti: 9a37cd3b8000 task.ti:
9a37cd3b8000
[ 1272.884517] RIP: 0010:[<>]  [<  (null)>]
(null)
[ 1272.884520] RSP: 0018:9a37cd3bbe68  EFLAGS: 00010203
[ 1272.884522] RAX:  RBX:  RCX:
00014d5f
[ 1272.884524] RDX: fff4 RSI: 0001 RDI:
9a38aca4d200
[ 1272.884526] RBP: 9a37cd3bbed0 R08: 9a38dcd5f1a0 R09:
9a31ffc07300
[ 1272.884527] R10: 9a31ffc07300 R11: addd5e9d R12:
9a38b4e0fb00
[ 1272.884529] R13: 0001 R14: 9a37cd3bbf18 R15:
9a38aca4d200
[ 1272.884532] FS:  7feccaa67740() GS:9a38dcd4()
knlGS:
[ 1272.884534] CS:  0010 DS:  ES:  CR0: 80050033
[ 1272.884536] CR2:  CR3: 0008267c CR4:
003407e0
[ 1272.884537] Call Trace:
[ 1272.884544]  [] ? seq_read+0x130/0x440
[ 1272.884548]  [] vfs_read+0x9f/0x170
[ 1272.884552]  [] SyS_read+0x7f/0xf0
[ 1272.884557]  [] system_call_fastpath+0x22/0x27
[ 1272.884558] Code:  Bad RIP value.
[ 1272.884562] RIP  [<  (null)>]   (null)
[ 1272.884564]  RSP 
[ 1272.884566] CR2: 

Signed-off-by: Qu Huang 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdkfd/kfd_debugfs.c | 7 ++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_debugfs.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_debugfs.c
index 511712c2e382..673d5e34f213 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_debugfs.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_debugfs.c
@@ -33,6 +33,11 @@ static int kfd_debugfs_open(struct inode *inode, struct file 
*file)
 
return single_open(file, show, NULL);
 }
+static int kfd_debugfs_hang_hws_read(struct seq_file *m, void *data)
+{
+   seq_printf(m, "echo gpu_id > hang_hws\n");
+   return 0;
+}
 
 static ssize_t kfd_debugfs_hang_hws_write(struct file *file,
const char __user *user_buf, size_t size, loff_t *ppos)
@@ -94,7 +99,7 @@ void kfd_debugfs_init(void)
debugfs_create_file("rls", S_IFREG | 0444, debugfs_root,
kfd_debugfs_rls_by_device, &kfd_debugfs_fops);
debugfs_create_file("hang_hws", S_IFREG | 0200, debugfs_root,
-   NULL, &kfd_debugfs_hang_hws_fops);
+   kfd_debugfs_hang_hws_read, 
&kfd_debugfs_hang_hws_fops);
 }
 
 void kfd_debugfs_fini(void)
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.4 50/57] amdgpu: avoid incorrect %hu format string

2021-05-03 Thread Sasha Levin
From: Arnd Bergmann 

[ Upstream commit 7d98d416c2cc1c1f7d9508e887de4630e521d797 ]

clang points out that the %hu format string does not match the type
of the variables here:

drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c:263:7: warning: format specifies type 
'unsigned short' but the argument has type 'unsigned int' [-Wformat]
  version_major, version_minor);
  ^
include/drm/drm_print.h:498:19: note: expanded from macro 'DRM_ERROR'
__drm_err(fmt, ##__VA_ARGS__)
  ~~~^~~

Change it to a regular %u, the same way a previous patch did for
another instance of the same warning.

Reviewed-by: Christian König 
Reviewed-by: Tom Rix 
Signed-off-by: Arnd Bergmann 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
index b2c364b8695f..cfa8324b9f51 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
@@ -231,7 +231,7 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
if ((adev->asic_type == CHIP_POLARIS10 ||
 adev->asic_type == CHIP_POLARIS11) &&
(adev->uvd.fw_version < FW_1_66_16))
-   DRM_ERROR("POLARIS10/11 UVD firmware version %hu.%hu is 
too old.\n",
+   DRM_ERROR("POLARIS10/11 UVD firmware version %u.%u is 
too old.\n",
  version_major, version_minor);
} else {
unsigned int enc_major, enc_minor, dec_minor;
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 5.4 51/57] drm/amdgpu: fix NULL pointer dereference

2021-05-03 Thread Sasha Levin
From: Guchun Chen 

[ Upstream commit 3c3dc654333f6389803cdcaf03912e94173ae510 ]

ttm->sg needs to be checked before accessing its child member.

Call Trace:
 amdgpu_ttm_backend_destroy+0x12/0x70 [amdgpu]
 ttm_bo_cleanup_memtype_use+0x3a/0x60 [ttm]
 ttm_bo_release+0x17d/0x300 [ttm]
 amdgpu_bo_unref+0x1a/0x30 [amdgpu]
 amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu+0x78b/0x8b0 [amdgpu]
 kfd_ioctl_alloc_memory_of_gpu+0x118/0x220 [amdgpu]
 kfd_ioctl+0x222/0x400 [amdgpu]
 ? kfd_dev_is_large_bar+0x90/0x90 [amdgpu]
 __x64_sys_ioctl+0x8e/0xd0
 ? __context_tracking_exit+0x52/0x90
 do_syscall_64+0x33/0x80
 entry_SYSCALL_64_after_hwframe+0x44/0xa9
RIP: 0033:0x7f97f264d317
Code: b3 66 90 48 8b 05 71 4b 2d 00 64 c7 00 26 00 00 00 48 c7 c0 ff ff ff ff 
c3 66 2e 0f 1f 84 00 00 00 00 00 b8 10 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 
c3 48 8b 0d 41 4b 2d 00 f7 d8 64 89 01 48
RSP: 002b:7ffdb402c338 EFLAGS: 0246 ORIG_RAX: 0010
RAX: ffda RBX: 7f97f3cc63a0 RCX: 7f97f264d317
RDX: 7ffdb402c380 RSI: c0284b16 RDI: 0003
RBP: 7ffdb402c380 R08: 7ffdb402c428 R09: c404
R10: c404 R11: 0246 R12: c0284b16
R13: 0003 R14: 7f97f3cc63a0 R15: 7f883620

Signed-off-by: Guchun Chen 
Acked-by: Christian König 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index c6a1dfe79e80..91e3a87b1de8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -984,7 +984,7 @@ static void amdgpu_ttm_tt_unpin_userptr(struct ttm_tt *ttm)
DMA_BIDIRECTIONAL : DMA_TO_DEVICE;
 
/* double check that we don't free the table twice */
-   if (!ttm->sg->sgl)
+   if (!ttm->sg || !ttm->sg->sgl)
return;
 
/* unmap the pages mapped to the device */
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 4.19 14/35] drm/amdgpu : Fix asic reset regression issue introduce by 8f211fe8ac7c4f

2021-05-03 Thread Sasha Levin
From: shaoyunl 

[ Upstream commit c8941550aa66b2a90f4b32c45d59e8571e6e ]

This recent change introduce SDMA interrupt info printing with irq->process 
function.
These functions do not require a set function to enable/disable the irq

Signed-off-by: shaoyunl 
Reviewed-by: Hawking Zhang 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
index 1abf5b5bac9e..18402a6ba8fe 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
@@ -447,7 +447,7 @@ void amdgpu_irq_gpu_reset_resume_helper(struct 
amdgpu_device *adev)
for (j = 0; j < AMDGPU_MAX_IRQ_SRC_ID; ++j) {
struct amdgpu_irq_src *src = 
adev->irq.client[i].sources[j];
 
-   if (!src)
+   if (!src || !src->funcs || !src->funcs->set)
continue;
for (k = 0; k < src->num_types; k++)
amdgpu_irq_update(adev, src, k);
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 4.19 31/35] drm/amdgpu: fix NULL pointer dereference

2021-05-03 Thread Sasha Levin
From: Guchun Chen 

[ Upstream commit 3c3dc654333f6389803cdcaf03912e94173ae510 ]

ttm->sg needs to be checked before accessing its child member.

Call Trace:
 amdgpu_ttm_backend_destroy+0x12/0x70 [amdgpu]
 ttm_bo_cleanup_memtype_use+0x3a/0x60 [ttm]
 ttm_bo_release+0x17d/0x300 [ttm]
 amdgpu_bo_unref+0x1a/0x30 [amdgpu]
 amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu+0x78b/0x8b0 [amdgpu]
 kfd_ioctl_alloc_memory_of_gpu+0x118/0x220 [amdgpu]
 kfd_ioctl+0x222/0x400 [amdgpu]
 ? kfd_dev_is_large_bar+0x90/0x90 [amdgpu]
 __x64_sys_ioctl+0x8e/0xd0
 ? __context_tracking_exit+0x52/0x90
 do_syscall_64+0x33/0x80
 entry_SYSCALL_64_after_hwframe+0x44/0xa9
RIP: 0033:0x7f97f264d317
Code: b3 66 90 48 8b 05 71 4b 2d 00 64 c7 00 26 00 00 00 48 c7 c0 ff ff ff ff 
c3 66 2e 0f 1f 84 00 00 00 00 00 b8 10 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 
c3 48 8b 0d 41 4b 2d 00 f7 d8 64 89 01 48
RSP: 002b:7ffdb402c338 EFLAGS: 0246 ORIG_RAX: 0010
RAX: ffda RBX: 7f97f3cc63a0 RCX: 7f97f264d317
RDX: 7ffdb402c380 RSI: c0284b16 RDI: 0003
RBP: 7ffdb402c380 R08: 7ffdb402c428 R09: c404
R10: c404 R11: 0246 R12: c0284b16
R13: 0003 R14: 7f97f3cc63a0 R15: 7f883620

Signed-off-by: Guchun Chen 
Acked-by: Christian König 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index abad7460084f..757fa486aac4 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -971,7 +971,7 @@ static void amdgpu_ttm_tt_unpin_userptr(struct ttm_tt *ttm)
DMA_BIDIRECTIONAL : DMA_TO_DEVICE;
 
/* double check that we don't free the table twice */
-   if (!ttm->sg->sgl)
+   if (!ttm->sg || !ttm->sg->sgl)
return;
 
/* unmap the pages mapped to the device */
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 4.19 30/35] amdgpu: avoid incorrect %hu format string

2021-05-03 Thread Sasha Levin
From: Arnd Bergmann 

[ Upstream commit 7d98d416c2cc1c1f7d9508e887de4630e521d797 ]

clang points out that the %hu format string does not match the type
of the variables here:

drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c:263:7: warning: format specifies type 
'unsigned short' but the argument has type 'unsigned int' [-Wformat]
  version_major, version_minor);
  ^
include/drm/drm_print.h:498:19: note: expanded from macro 'DRM_ERROR'
__drm_err(fmt, ##__VA_ARGS__)
  ~~~^~~

Change it to a regular %u, the same way a previous patch did for
another instance of the same warning.

Reviewed-by: Christian König 
Reviewed-by: Tom Rix 
Signed-off-by: Arnd Bergmann 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
index e5a6db6beab7..8c5f39beee7c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
@@ -231,7 +231,7 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
if ((adev->asic_type == CHIP_POLARIS10 ||
 adev->asic_type == CHIP_POLARIS11) &&
(adev->uvd.fw_version < FW_1_66_16))
-   DRM_ERROR("POLARIS10/11 UVD firmware version %hu.%hu is 
too old.\n",
+   DRM_ERROR("POLARIS10/11 UVD firmware version %u.%u is 
too old.\n",
  version_major, version_minor);
} else {
unsigned int enc_major, enc_minor, dec_minor;
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 4.14 13/31] drm/amdgpu : Fix asic reset regression issue introduce by 8f211fe8ac7c4f

2021-05-03 Thread Sasha Levin
From: shaoyunl 

[ Upstream commit c8941550aa66b2a90f4b32c45d59e8571e6e ]

This recent change introduce SDMA interrupt info printing with irq->process 
function.
These functions do not require a set function to enable/disable the irq

Signed-off-by: shaoyunl 
Reviewed-by: Hawking Zhang 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
index 538e5f27d120..fb9361590754 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
@@ -437,7 +437,7 @@ void amdgpu_irq_gpu_reset_resume_helper(struct 
amdgpu_device *adev)
for (j = 0; j < AMDGPU_MAX_IRQ_SRC_ID; ++j) {
struct amdgpu_irq_src *src = 
adev->irq.client[i].sources[j];
 
-   if (!src)
+   if (!src || !src->funcs || !src->funcs->set)
continue;
for (k = 0; k < src->num_types; k++)
amdgpu_irq_update(adev, src, k);
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 4.14 28/31] drm/amdgpu: fix NULL pointer dereference

2021-05-03 Thread Sasha Levin
From: Guchun Chen 

[ Upstream commit 3c3dc654333f6389803cdcaf03912e94173ae510 ]

ttm->sg needs to be checked before accessing its child member.

Call Trace:
 amdgpu_ttm_backend_destroy+0x12/0x70 [amdgpu]
 ttm_bo_cleanup_memtype_use+0x3a/0x60 [ttm]
 ttm_bo_release+0x17d/0x300 [ttm]
 amdgpu_bo_unref+0x1a/0x30 [amdgpu]
 amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu+0x78b/0x8b0 [amdgpu]
 kfd_ioctl_alloc_memory_of_gpu+0x118/0x220 [amdgpu]
 kfd_ioctl+0x222/0x400 [amdgpu]
 ? kfd_dev_is_large_bar+0x90/0x90 [amdgpu]
 __x64_sys_ioctl+0x8e/0xd0
 ? __context_tracking_exit+0x52/0x90
 do_syscall_64+0x33/0x80
 entry_SYSCALL_64_after_hwframe+0x44/0xa9
RIP: 0033:0x7f97f264d317
Code: b3 66 90 48 8b 05 71 4b 2d 00 64 c7 00 26 00 00 00 48 c7 c0 ff ff ff ff 
c3 66 2e 0f 1f 84 00 00 00 00 00 b8 10 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 
c3 48 8b 0d 41 4b 2d 00 f7 d8 64 89 01 48
RSP: 002b:7ffdb402c338 EFLAGS: 0246 ORIG_RAX: 0010
RAX: ffda RBX: 7f97f3cc63a0 RCX: 7f97f264d317
RDX: 7ffdb402c380 RSI: c0284b16 RDI: 0003
RBP: 7ffdb402c380 R08: 7ffdb402c428 R09: c404
R10: c404 R11: 0246 R12: c0284b16
R13: 0003 R14: 7f97f3cc63a0 R15: 7f883620

Signed-off-by: Guchun Chen 
Acked-by: Christian König 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index ae700e445fbc..d057bc29bf4c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -742,7 +742,7 @@ static void amdgpu_ttm_tt_unpin_userptr(struct ttm_tt *ttm)
DMA_BIDIRECTIONAL : DMA_TO_DEVICE;
 
/* double check that we don't free the table twice */
-   if (!ttm->sg->sgl)
+   if (!ttm->sg || !ttm->sg->sgl)
return;
 
/* free the sg table and pages again */
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 4.9 22/24] drm/amdgpu: fix NULL pointer dereference

2021-05-03 Thread Sasha Levin
From: Guchun Chen 

[ Upstream commit 3c3dc654333f6389803cdcaf03912e94173ae510 ]

ttm->sg needs to be checked before accessing its child member.

Call Trace:
 amdgpu_ttm_backend_destroy+0x12/0x70 [amdgpu]
 ttm_bo_cleanup_memtype_use+0x3a/0x60 [ttm]
 ttm_bo_release+0x17d/0x300 [ttm]
 amdgpu_bo_unref+0x1a/0x30 [amdgpu]
 amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu+0x78b/0x8b0 [amdgpu]
 kfd_ioctl_alloc_memory_of_gpu+0x118/0x220 [amdgpu]
 kfd_ioctl+0x222/0x400 [amdgpu]
 ? kfd_dev_is_large_bar+0x90/0x90 [amdgpu]
 __x64_sys_ioctl+0x8e/0xd0
 ? __context_tracking_exit+0x52/0x90
 do_syscall_64+0x33/0x80
 entry_SYSCALL_64_after_hwframe+0x44/0xa9
RIP: 0033:0x7f97f264d317
Code: b3 66 90 48 8b 05 71 4b 2d 00 64 c7 00 26 00 00 00 48 c7 c0 ff ff ff ff 
c3 66 2e 0f 1f 84 00 00 00 00 00 b8 10 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 
c3 48 8b 0d 41 4b 2d 00 f7 d8 64 89 01 48
RSP: 002b:7ffdb402c338 EFLAGS: 0246 ORIG_RAX: 0010
RAX: ffda RBX: 7f97f3cc63a0 RCX: 7f97f264d317
RDX: 7ffdb402c380 RSI: c0284b16 RDI: 0003
RBP: 7ffdb402c380 R08: 7ffdb402c428 R09: c404
R10: c404 R11: 0246 R12: c0284b16
R13: 0003 R14: 7f97f3cc63a0 R15: 7f883620

Signed-off-by: Guchun Chen 
Acked-by: Christian König 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 80c60a62d39e..7271e3f32d82 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -652,7 +652,7 @@ static void amdgpu_ttm_tt_unpin_userptr(struct ttm_tt *ttm)
DMA_BIDIRECTIONAL : DMA_TO_DEVICE;
 
/* double check that we don't free the table twice */
-   if (!ttm->sg->sgl)
+   if (!ttm->sg || !ttm->sg->sgl)
return;
 
/* free the sg table and pages again */
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH AUTOSEL 4.4 14/16] drm/amdgpu: fix NULL pointer dereference

2021-05-03 Thread Sasha Levin
From: Guchun Chen 

[ Upstream commit 3c3dc654333f6389803cdcaf03912e94173ae510 ]

ttm->sg needs to be checked before accessing its child member.

Call Trace:
 amdgpu_ttm_backend_destroy+0x12/0x70 [amdgpu]
 ttm_bo_cleanup_memtype_use+0x3a/0x60 [ttm]
 ttm_bo_release+0x17d/0x300 [ttm]
 amdgpu_bo_unref+0x1a/0x30 [amdgpu]
 amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu+0x78b/0x8b0 [amdgpu]
 kfd_ioctl_alloc_memory_of_gpu+0x118/0x220 [amdgpu]
 kfd_ioctl+0x222/0x400 [amdgpu]
 ? kfd_dev_is_large_bar+0x90/0x90 [amdgpu]
 __x64_sys_ioctl+0x8e/0xd0
 ? __context_tracking_exit+0x52/0x90
 do_syscall_64+0x33/0x80
 entry_SYSCALL_64_after_hwframe+0x44/0xa9
RIP: 0033:0x7f97f264d317
Code: b3 66 90 48 8b 05 71 4b 2d 00 64 c7 00 26 00 00 00 48 c7 c0 ff ff ff ff 
c3 66 2e 0f 1f 84 00 00 00 00 00 b8 10 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 
c3 48 8b 0d 41 4b 2d 00 f7 d8 64 89 01 48
RSP: 002b:7ffdb402c338 EFLAGS: 0246 ORIG_RAX: 0010
RAX: ffda RBX: 7f97f3cc63a0 RCX: 7f97f264d317
RDX: 7ffdb402c380 RSI: c0284b16 RDI: 0003
RBP: 7ffdb402c380 R08: 7ffdb402c428 R09: c404
R10: c404 R11: 0246 R12: c0284b16
R13: 0003 R14: 7f97f3cc63a0 R15: 7f883620

Signed-off-by: Guchun Chen 
Acked-by: Christian König 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 062c23125b2a..6beb3e76e1c9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -566,7 +566,7 @@ static void amdgpu_ttm_tt_unpin_userptr(struct ttm_tt *ttm)
DMA_BIDIRECTIONAL : DMA_TO_DEVICE;
 
/* double check that we don't free the table twice */
-   if (!ttm->sg->sgl)
+   if (!ttm->sg || !ttm->sg->sgl)
return;
 
/* free the sg table and pages again */
-- 
2.30.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH v1 0/1] drm/dp_mst: Use kHz as link rate units when settig source max link caps at init

2021-05-03 Thread Nikola Cornij
A patch that uses kHz as the link rate units when passing max link rate
to drm_dp_mst_topology_mgr_init() at initialization time.

It should be a 2nd and final follow-up patch to '98025a62cb00 
("drm/dp_mst: Use Extended Base Receiver Capability DPCD space")'.

Change history:

v1:
  - Initial

Nikola Cornij (1):
  drm/dp_mst: Use kHz as link rate units when settig source max link
caps at init

 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c   | 4 ++--
 drivers/gpu/drm/drm_dp_mst_topology.c | 8 
 drivers/gpu/drm/i915/display/intel_dp_mst.c   | 4 ++--
 drivers/gpu/drm/nouveau/dispnv50/disp.c   | 5 +++--
 drivers/gpu/drm/radeon/radeon_dp_mst.c| 2 +-
 include/drm/drm_dp_mst_helper.h   | 8 
 6 files changed, 16 insertions(+), 15 deletions(-)

-- 
2.25.1

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH v1 1/1] drm/dp_mst: Use kHz as link rate units when settig source max link caps at init

2021-05-03 Thread Nikola Cornij
[why]
Link rate in kHz is what is eventually required to calculate the link
bandwidth, which makes kHz a more generic unit. This should also make
forward-compatibility with new DP standards easier.

[how]
- Replace 'link rate DPCD code' with 'link rate in kHz' when used with
drm_dp_mst_topology_mgr_init()
- Add/remove related DPCD code conversion from/to kHz where applicable

Signed-off-by: Nikola Cornij 
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c   | 4 ++--
 drivers/gpu/drm/drm_dp_mst_topology.c | 8 
 drivers/gpu/drm/i915/display/intel_dp_mst.c   | 4 ++--
 drivers/gpu/drm/nouveau/dispnv50/disp.c   | 5 +++--
 drivers/gpu/drm/radeon/radeon_dp_mst.c| 2 +-
 include/drm/drm_dp_mst_helper.h   | 8 
 6 files changed, 16 insertions(+), 15 deletions(-)

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 ef8d53e24c47..3f3ead83c21c 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
@@ -453,8 +453,8 @@ void amdgpu_dm_initialize_dp_connector(struct 
amdgpu_display_manager *dm,
&aconnector->dm_dp_aux.aux,
16,
4,
-   (u8)max_link_enc_cap.lane_count,
-   (u8)max_link_enc_cap.link_rate,
+   max_link_enc_cap.lane_count,
+   drm_dp_bw_code_to_link_rate(max_link_enc_cap.link_rate),
aconnector->connector_id);
 
drm_connector_attach_dp_subconnector_property(&aconnector->base);
diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c 
b/drivers/gpu/drm/drm_dp_mst_topology.c
index 54604633e65c..32b7f8983b94 100644
--- a/drivers/gpu/drm/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/drm_dp_mst_topology.c
@@ -3722,9 +3722,9 @@ int drm_dp_mst_topology_mgr_set_mst(struct 
drm_dp_mst_topology_mgr *mgr, bool ms
}
 
lane_count = min_t(int, mgr->dpcd[2] & DP_MAX_LANE_COUNT_MASK, 
mgr->max_lane_count);
-   link_rate = min_t(int, mgr->dpcd[1], mgr->max_link_rate);
+   link_rate = min_t(int, 
drm_dp_bw_code_to_link_rate(mgr->dpcd[1]), mgr->max_link_rate);
mgr->pbn_div = drm_dp_get_vc_payload_bw(mgr,
-   
drm_dp_bw_code_to_link_rate(link_rate),
+   link_rate,
lane_count);
if (mgr->pbn_div == 0) {
ret = -EINVAL;
@@ -5454,7 +5454,7 @@ EXPORT_SYMBOL(drm_atomic_get_mst_topology_state);
  * @max_dpcd_transaction_bytes: hw specific DPCD transaction limit
  * @max_payloads: maximum number of payloads this GPU can source
  * @max_lane_count: maximum number of lanes this GPU supports
- * @max_link_rate: maximum link rate this GPU supports, units as in DPCD
+ * @max_link_rate: maximum link rate per lane this GPU supports in kHz
  * @conn_base_id: the connector object ID the MST device is connected to.
  *
  * Return 0 for success, or negative error code on failure
@@ -5462,7 +5462,7 @@ EXPORT_SYMBOL(drm_atomic_get_mst_topology_state);
 int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr,
 struct drm_device *dev, struct drm_dp_aux *aux,
 int max_dpcd_transaction_bytes, int 
max_payloads,
-u8 max_lane_count, u8 max_link_rate,
+int max_lane_count, int max_link_rate,
 int conn_base_id)
 {
struct drm_dp_mst_topology_state *mst_state;
diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c 
b/drivers/gpu/drm/i915/display/intel_dp_mst.c
index f608c0cb98f4..26f65445bc8a 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
@@ -960,8 +960,8 @@ intel_dp_mst_encoder_init(struct intel_digital_port 
*dig_port, int conn_base_id)
intel_dp_create_fake_mst_encoders(dig_port);
ret = drm_dp_mst_topology_mgr_init(&intel_dp->mst_mgr, &i915->drm,
   &intel_dp->aux, 16, 3,
-  (u8)dig_port->max_lanes,
-  
drm_dp_link_rate_to_bw_code(max_source_rate),
+  dig_port->max_lanes,
+  max_source_rate,
   conn_base_id);
if (ret)
return ret;
diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c 
b/drivers/gpu/drm/nouveau/dispnv50/disp.c
index c46d0374b6e6..f949767698fc 100644
--- a/drivers/gpu/drm/nouveau/dispnv50/disp.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c
@@ -1617,8 +1617,9 @@ nv50_mstm_new(

[PATCH] Update NV SIMD-per-CU to 2

2021-05-03 Thread Joseph Greathouse
Navi series GPUs have 2 SIMDs per CU (and then 2 CUs per WGP).
The NV enum headers incorrectly listed this as 4, which later meant
we were incorrectly reporting the number of SIMDs in the HSA
topology. This could cause problems down the line for user-space
applications that want to launch a fixed amount of work to each
SIMD.

Signed-off-by: Joseph Greathouse 
Change-Id: I94021ca71363a3d27330b2fda8e6acaac258017e
---
 drivers/gpu/drm/amd/include/navi10_enum.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/include/navi10_enum.h 
b/drivers/gpu/drm/amd/include/navi10_enum.h
index d5ead9680c6e..84bcb96f76ea 100644
--- a/drivers/gpu/drm/amd/include/navi10_enum.h
+++ b/drivers/gpu/drm/amd/include/navi10_enum.h
@@ -430,7 +430,7 @@ ARRAY_2D_DEPTH   = 0x0001,
  */
 
 typedef enum ENUM_NUM_SIMD_PER_CU {
-NUM_SIMD_PER_CU  = 0x0004,
+NUM_SIMD_PER_CU  = 0x0002,
 } ENUM_NUM_SIMD_PER_CU;
 
 /*
-- 
2.20.1

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


Re: [PATCH v1 1/1] drm/dp_mst: Use kHz as link rate units when settig source max link caps at init

2021-05-03 Thread Jani Nikula
On Mon, 03 May 2021, Nikola Cornij  wrote:
> [why]
> Link rate in kHz is what is eventually required to calculate the link
> bandwidth, which makes kHz a more generic unit. This should also make
> forward-compatibility with new DP standards easier.
>
> [how]
> - Replace 'link rate DPCD code' with 'link rate in kHz' when used with
> drm_dp_mst_topology_mgr_init()
> - Add/remove related DPCD code conversion from/to kHz where applicable
>
> Signed-off-by: Nikola Cornij 

LGTM,

Acked-by: Jani Nikula 

for merging via drm-misc-next where the previous patches went.

> ---
>  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c   | 4 ++--
>  drivers/gpu/drm/drm_dp_mst_topology.c | 8 
>  drivers/gpu/drm/i915/display/intel_dp_mst.c   | 4 ++--
>  drivers/gpu/drm/nouveau/dispnv50/disp.c   | 5 +++--
>  drivers/gpu/drm/radeon/radeon_dp_mst.c| 2 +-
>  include/drm/drm_dp_mst_helper.h   | 8 
>  6 files changed, 16 insertions(+), 15 deletions(-)
>
> 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 ef8d53e24c47..3f3ead83c21c 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
> @@ -453,8 +453,8 @@ void amdgpu_dm_initialize_dp_connector(struct 
> amdgpu_display_manager *dm,
>   &aconnector->dm_dp_aux.aux,
>   16,
>   4,
> - (u8)max_link_enc_cap.lane_count,
> - (u8)max_link_enc_cap.link_rate,
> + max_link_enc_cap.lane_count,
> + drm_dp_bw_code_to_link_rate(max_link_enc_cap.link_rate),
>   aconnector->connector_id);
>  
>   drm_connector_attach_dp_subconnector_property(&aconnector->base);
> diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c 
> b/drivers/gpu/drm/drm_dp_mst_topology.c
> index 54604633e65c..32b7f8983b94 100644
> --- a/drivers/gpu/drm/drm_dp_mst_topology.c
> +++ b/drivers/gpu/drm/drm_dp_mst_topology.c
> @@ -3722,9 +3722,9 @@ int drm_dp_mst_topology_mgr_set_mst(struct 
> drm_dp_mst_topology_mgr *mgr, bool ms
>   }
>  
>   lane_count = min_t(int, mgr->dpcd[2] & DP_MAX_LANE_COUNT_MASK, 
> mgr->max_lane_count);
> - link_rate = min_t(int, mgr->dpcd[1], mgr->max_link_rate);
> + link_rate = min_t(int, 
> drm_dp_bw_code_to_link_rate(mgr->dpcd[1]), mgr->max_link_rate);
>   mgr->pbn_div = drm_dp_get_vc_payload_bw(mgr,
> - 
> drm_dp_bw_code_to_link_rate(link_rate),
> + link_rate,
>   lane_count);
>   if (mgr->pbn_div == 0) {
>   ret = -EINVAL;
> @@ -5454,7 +5454,7 @@ EXPORT_SYMBOL(drm_atomic_get_mst_topology_state);
>   * @max_dpcd_transaction_bytes: hw specific DPCD transaction limit
>   * @max_payloads: maximum number of payloads this GPU can source
>   * @max_lane_count: maximum number of lanes this GPU supports
> - * @max_link_rate: maximum link rate this GPU supports, units as in DPCD
> + * @max_link_rate: maximum link rate per lane this GPU supports in kHz
>   * @conn_base_id: the connector object ID the MST device is connected to.
>   *
>   * Return 0 for success, or negative error code on failure
> @@ -5462,7 +5462,7 @@ EXPORT_SYMBOL(drm_atomic_get_mst_topology_state);
>  int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr,
>struct drm_device *dev, struct drm_dp_aux *aux,
>int max_dpcd_transaction_bytes, int 
> max_payloads,
> -  u8 max_lane_count, u8 max_link_rate,
> +  int max_lane_count, int max_link_rate,
>int conn_base_id)
>  {
>   struct drm_dp_mst_topology_state *mst_state;
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c 
> b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> index f608c0cb98f4..26f65445bc8a 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> @@ -960,8 +960,8 @@ intel_dp_mst_encoder_init(struct intel_digital_port 
> *dig_port, int conn_base_id)
>   intel_dp_create_fake_mst_encoders(dig_port);
>   ret = drm_dp_mst_topology_mgr_init(&intel_dp->mst_mgr, &i915->drm,
>  &intel_dp->aux, 16, 3,
> -(u8)dig_port->max_lanes,
> -
> drm_dp_link_rate_to_bw_code(max_source_rate),
> +dig_port->max_lanes,
> +max_source_rate,
>  conn_base_id);
>   if (ret)
>   return ret;
> diff -

Re: [PATCH] Update NV SIMD-per-CU to 2

2021-05-03 Thread Deucher, Alexander
[AMD Official Use Only - Internal Distribution Only]

Please fix the subject:
drm/amdgpu: Update NV SIMD-per-CU to 2
With that fixed, the patch is:
Reviewed-by: Alex Deucher 

From: amd-gfx  on behalf of Joseph 
Greathouse 
Sent: Monday, May 3, 2021 1:25 PM
To: amd-gfx@lists.freedesktop.org 
Cc: Greathouse, Joseph ; Zhang, Hawking 

Subject: [PATCH] Update NV SIMD-per-CU to 2

Navi series GPUs have 2 SIMDs per CU (and then 2 CUs per WGP).
The NV enum headers incorrectly listed this as 4, which later meant
we were incorrectly reporting the number of SIMDs in the HSA
topology. This could cause problems down the line for user-space
applications that want to launch a fixed amount of work to each
SIMD.

Signed-off-by: Joseph Greathouse 
Change-Id: I94021ca71363a3d27330b2fda8e6acaac258017e
---
 drivers/gpu/drm/amd/include/navi10_enum.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/include/navi10_enum.h 
b/drivers/gpu/drm/amd/include/navi10_enum.h
index d5ead9680c6e..84bcb96f76ea 100644
--- a/drivers/gpu/drm/amd/include/navi10_enum.h
+++ b/drivers/gpu/drm/amd/include/navi10_enum.h
@@ -430,7 +430,7 @@ ARRAY_2D_DEPTH   = 0x0001,
  */

 typedef enum ENUM_NUM_SIMD_PER_CU {
-NUM_SIMD_PER_CU  = 0x0004,
+NUM_SIMD_PER_CU  = 0x0002,
 } ENUM_NUM_SIMD_PER_CU;

 /*
--
2.20.1

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.freedesktop.org%2Fmailman%2Flistinfo%2Famd-gfx&data=04%7C01%7Calexander.deucher%40amd.com%7C0a03ae95bbda46750ed308d90e588bc6%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637556595746142277%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=JAHxu%2FPQTzHASsbie%2FnJGRX9B%2F17%2B6%2FXWeQnadzkj1I%3D&reserved=0
___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


Re: [PATCH] Update NV SIMD-per-CU to 2

2021-05-03 Thread Felix Kuehling
Am 2021-05-03 um 1:25 p.m. schrieb Joseph Greathouse:
> Navi series GPUs have 2 SIMDs per CU (and then 2 CUs per WGP).
> The NV enum headers incorrectly listed this as 4, which later meant
> we were incorrectly reporting the number of SIMDs in the HSA
> topology. This could cause problems down the line for user-space
> applications that want to launch a fixed amount of work to each
> SIMD.
>
> Signed-off-by: Joseph Greathouse 
> Change-Id: I94021ca71363a3d27330b2fda8e6acaac258017e

Please remove the Change-Id. You can disable generation of Change-Ids in
your kernel repository with this command:

    git config --bool gerrit.createChangeId false

The change looks good to me. As far as I can see in the code this would
fix both the simd_count and simd_per_cu properties in the KFD topology.
I don't see this value used anywhere else in amdgpu, so there shouldn't
be any other unexpected side effects.

Reviewed-by: Felix Kuehling 


> ---
>  drivers/gpu/drm/amd/include/navi10_enum.h | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/include/navi10_enum.h 
> b/drivers/gpu/drm/amd/include/navi10_enum.h
> index d5ead9680c6e..84bcb96f76ea 100644
> --- a/drivers/gpu/drm/amd/include/navi10_enum.h
> +++ b/drivers/gpu/drm/amd/include/navi10_enum.h
> @@ -430,7 +430,7 @@ ARRAY_2D_DEPTH   = 0x0001,
>   */
>  
>  typedef enum ENUM_NUM_SIMD_PER_CU {
> -NUM_SIMD_PER_CU  = 0x0004,
> +NUM_SIMD_PER_CU  = 0x0002,
>  } ENUM_NUM_SIMD_PER_CU;
>  
>  /*
___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


Re: [PATCH v5 06/27] drm/amdgpu: Handle IOMMU enabled case.

2021-05-03 Thread Andrey Grodzovsky




On 2021-04-29 11:13 p.m., Alex Deucher wrote:

On Wed, Apr 28, 2021 at 11:13 AM Andrey Grodzovsky
 wrote:


Handle all DMA IOMMU gropup related dependencies before the
group is removed.

v5: Drop IOMMU notifier and switch to lockless call to ttm_tt_unpopulate

Signed-off-by: Andrey Grodzovsky 
---
  drivers/gpu/drm/amd/amdgpu/amdgpu.h|  2 ++
  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 31 --
  drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c   |  3 +--
  drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h   |  1 +
  drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c|  9 +++
  drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 13 -
  drivers/gpu/drm/amd/amdgpu/amdgpu_object.h |  2 ++
  drivers/gpu/drm/amd/amdgpu/cik_ih.c|  1 -
  drivers/gpu/drm/amd/amdgpu/cz_ih.c |  1 -
  drivers/gpu/drm/amd/amdgpu/iceland_ih.c|  1 -
  drivers/gpu/drm/amd/amdgpu/navi10_ih.c |  3 ---
  drivers/gpu/drm/amd/amdgpu/si_ih.c |  1 -
  drivers/gpu/drm/amd/amdgpu/tonga_ih.c  |  1 -
  drivers/gpu/drm/amd/amdgpu/vega10_ih.c |  3 ---
  14 files changed, 56 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index fddb82897e5d..30a24db5f4d1 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -1054,6 +1054,8 @@ struct amdgpu_device {

 boolin_pci_err_recovery;
 struct pci_saved_state  *pci_state;
+
+   struct list_headdevice_bo_list;
  };

  static inline struct amdgpu_device *drm_to_adev(struct drm_device *ddev)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 46d646c40338..91594ddc2459 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -70,6 +70,7 @@
  #include 
  #include 

+
  MODULE_FIRMWARE("amdgpu/vega10_gpu_info.bin");
  MODULE_FIRMWARE("amdgpu/vega12_gpu_info.bin");
  MODULE_FIRMWARE("amdgpu/raven_gpu_info.bin");
@@ -3211,7 +3212,6 @@ static const struct attribute *amdgpu_dev_attributes[] = {
 NULL
  };

-
  /**
   * amdgpu_device_init - initialize the driver
   *
@@ -3316,6 +3316,8 @@ int amdgpu_device_init(struct amdgpu_device *adev,

 INIT_WORK(&adev->xgmi_reset_work, amdgpu_device_xgmi_reset_func);

+   INIT_LIST_HEAD(&adev->device_bo_list);
+
 adev->gfx.gfx_off_req_count = 1;
 adev->pm.ac_power = power_supply_is_system_supplied() > 0;

@@ -3601,6 +3603,28 @@ int amdgpu_device_init(struct amdgpu_device *adev,
 return r;
  }

+static void amdgpu_clear_dma_mappings(struct amdgpu_device *adev)


Prefix this with amdgpu_device for consistency.  E.g.,
amdgpu_device_clear_dma_mappings()


+{
+   struct amdgpu_bo *bo = NULL;
+
+   /*
+* Unmaps all DMA mappings before device will be removed from it's
+* IOMMU group otherwise in case of IOMMU enabled system a crash
+* will happen.
+*/
+
+   spin_lock(&adev->mman.bdev.lru_lock);
+   while (!list_empty(&adev->device_bo_list)) {
+   bo = list_first_entry(&adev->device_bo_list, struct amdgpu_bo, 
bo);
+   list_del_init(&bo->bo);
+   spin_unlock(&adev->mman.bdev.lru_lock);
+   if (bo->tbo.ttm)
+   ttm_tt_unpopulate(bo->tbo.bdev, bo->tbo.ttm);
+   spin_lock(&adev->mman.bdev.lru_lock);
+   }
+   spin_unlock(&adev->mman.bdev.lru_lock);
+}
+
  /**
   * amdgpu_device_fini - tear down the driver
   *
@@ -3639,12 +3663,15 @@ void amdgpu_device_fini_hw(struct amdgpu_device *adev)
 amdgpu_ucode_sysfs_fini(adev);
 sysfs_remove_files(&adev->dev->kobj, amdgpu_dev_attributes);

-
 amdgpu_fbdev_fini(adev);

 amdgpu_irq_fini_hw(adev);

 amdgpu_device_ip_fini_early(adev);
+
+   amdgpu_clear_dma_mappings(adev);
+
+   amdgpu_gart_dummy_page_fini(adev);
  }

  void amdgpu_device_fini_sw(struct amdgpu_device *adev)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
index fde2d899b2c4..49cdcaf8512d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
@@ -92,7 +92,7 @@ static int amdgpu_gart_dummy_page_init(struct amdgpu_device 
*adev)
   *
   * Frees the dummy page used by the driver (all asics).
   */
-static void amdgpu_gart_dummy_page_fini(struct amdgpu_device *adev)
+void amdgpu_gart_dummy_page_fini(struct amdgpu_device *adev)
  {
 if (!adev->dummy_page_addr)
 return;
@@ -397,5 +397,4 @@ void amdgpu_gart_fini(struct amdgpu_device *adev)
 vfree(adev->gart.pages);
 adev->gart.pages = NULL;
  #endif
-   amdgpu_gart_dummy_page_fini(adev);
  }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h
index afa2e2877d87..5678d9c105ab 100644
--- a/drivers/gpu/

Re: [PATCH] drm/amdkfd: fix no atomics settings in the kfd topology

2021-05-03 Thread Felix Kuehling
Am 2021-05-03 um 11:57 a.m. schrieb Jonathan Kim:
> To account for various PCIe and xGMI setups, check the no atomics settings
> for a device in relation to every direct peer.

Thanks, this looks reasonable. Some more nit-picks about naming and
coding style inline.


>
> Signed-off-by: Jonathan Kim 
> ---
>  drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 55 ++-
>  1 file changed, 34 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c 
> b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
> index 30430aefcfc7..40ac7fe2a499 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
> @@ -1192,47 +1192,60 @@ static void kfd_fill_mem_clk_max_info(struct 
> kfd_topology_device *dev)
>   mem->mem_clk_max = local_mem_info.mem_clk_max;
>  }
>  
> -static void kfd_fill_iolink_non_crat_info(struct kfd_topology_device *dev)
> +static void kfd_set_iolink_no_atomics(struct kfd_topology_device *dev,
> + struct kfd_topology_device 
> *target_gpu_dev,
> + struct kfd_iolink_properties *link)
>  {
> - struct kfd_iolink_properties *link, *cpu_link;
> - struct kfd_topology_device *cpu_dev;
> - struct amdgpu_device *adev;
> - uint32_t cap;
> - uint32_t cpu_flag = CRAT_IOLINK_FLAGS_ENABLED;
> - uint32_t flag = CRAT_IOLINK_FLAGS_ENABLED;
> -
> - if (!dev || !dev->gpu)
> + /* xgmi always supports atomics between links. */
> + if (link->iolink_type == CRAT_IOLINK_TYPE_XGMI)
>   return;
>  
> - adev = (struct amdgpu_device *)(dev->gpu->kgd);
> - if (!adev->gmc.xgmi.connected_to_cpu) {
> - pcie_capability_read_dword(dev->gpu->pdev,
> + /* check pcie support to set cpu(dev) flags for target_get_dev link. */
> + if (target_gpu_dev) {
> + uint32_t cap;
> +
> + pcie_capability_read_dword(target_gpu_dev->gpu->pdev,
>   PCI_EXP_DEVCAP2, &cap);
>  
>   if (!(cap & (PCI_EXP_DEVCAP2_ATOMIC_COMP32 |
>PCI_EXP_DEVCAP2_ATOMIC_COMP64)))
> - cpu_flag |= CRAT_IOLINK_FLAGS_NO_ATOMICS_32_BIT |
> + link->flags |= CRAT_IOLINK_FLAGS_NO_ATOMICS_32_BIT |
>   CRAT_IOLINK_FLAGS_NO_ATOMICS_64_BIT;
> - }
> -
> - if (!adev->gmc.xgmi.num_physical_nodes) {
> + /* set gpu (dev) flags. */
> + } else {
>   if (!dev->gpu->pci_atomic_requested ||
>   dev->gpu->device_info->asic_family ==
>   CHIP_HAWAII)
> - flag |= CRAT_IOLINK_FLAGS_NO_ATOMICS_32_BIT |
> + link->flags |= CRAT_IOLINK_FLAGS_NO_ATOMICS_32_BIT |
>   CRAT_IOLINK_FLAGS_NO_ATOMICS_64_BIT;
>   }
> +}
> +
> +static void kfd_fill_iolink_non_crat_info(struct kfd_topology_device *dev)
> +{
> + struct kfd_iolink_properties *link, *cpu_link;
> + struct kfd_topology_device *cpu_dev;

The names cpu_link and cpu_dev are still misleading. When GPUs have XGMI
links these links may, in fact, be other GPUs and the XGMI links from
those GPUs. I think a better name would be "peer_dev" and "inbound_link".


> + uint32_t flag_enable = CRAT_IOLINK_FLAGS_ENABLED;

You don't need this variable. Just use CRAT_IOLINK_FLAGS_ENABLED below.


> +
> + if (!dev || !dev->gpu)
> + return;
>  
>   /* GPU only creates direct links so apply flags setting to all */
>   list_for_each_entry(link, &dev->io_link_props, list) {
> - link->flags = flag;
> + link->flags = flag_enable;
> + kfd_set_iolink_no_atomics(dev, NULL, link);
>   cpu_dev = kfd_topology_device_by_proximity_domain(
>   link->node_to);
> +
>   if (cpu_dev) {

To minimize indentation, I'd do

if (!peer_dev)
continue;

>   list_for_each_entry(cpu_link,
> - &cpu_dev->io_link_props, list)
> - if (cpu_link->node_to == link->node_from)
> - cpu_link->flags = cpu_flag;
> + &cpu_dev->io_link_props, list) {
> + if (cpu_link->node_to == link->node_from) {
> + cpu_link->flags = flag_enable;

To minimize indentation, and to avoid unnecessary loop iterations, I'd do

if (inbound_link->node_to != link->node_from)
continue;
inbound_link->flags = KFD_IOLINK_CRAT_FLAGS_ENABLED;
kfd_set_iolink_no_atomics(peer_dev, dev, inbound_link);
break;

Regards,
  Felix


> + kfd_set_iolink_no_atomics(cpu_dev, dev,
> +

Re: [RFC] CRIU support for ROCm

2021-05-03 Thread Felix Kuehling
Am 2021-05-01 um 1:03 p.m. schrieb Adrian Reber:
> On Fri, Apr 30, 2021 at 09:57:45PM -0400, Felix Kuehling wrote:
>> We have been working on a prototype supporting CRIU (Checkpoint/Restore
>> In Userspace) for accelerated compute applications running on AMD GPUs
>> using ROCm (Radeon Open Compute Platform). We're happy to finally share
>> this work publicly to solicit feedback and advice. The end-goal is to
>> get this work included upstream in Linux and CRIU. A short whitepaper
>> describing our design and intention can be found on Github:
>> https://github.com/RadeonOpenCompute/criu/tree/criu-dev/test/others/ext-kfd/README.md
>>
>> We have RFC patch series for the kernel (based on Alex Deucher's
>> amd-staging-drm-next branch) and for CRIU including a new plugin and a
>> few core CRIU changes. I will send those to the respective mailing lists
>> separately in a minute. They can also be found on Github.
>>
>> CRIU+plugin: https://github.com/RadeonOpenCompute/criu/commits/criu-dev
>> Kernel (KFD):
>> 
>> https://github.com/RadeonOpenCompute/ROCK-Kernel-Driver/commits/fxkamd/criu-wip
>>
>> At this point this is very much a work in progress and not ready for
>> upstream inclusion. There are still several missing features, known
>> issues, and open questions that we would like to start addressing with
>> your feedback.
>>
>> What's working and tested at this point:
>>
>>   * Checkpoint and restore accelerated machine learning apps: PyTorch
>> running Bert on systems with 1 or 2 GPUs (MI50 or MI100), 100%
>> unmodified user mode stack
>>   * Checkpoint on one system, restore on a different system
>>   * Checkpoint on one GPU, restore on a different GPU
> This is very impressive. As far as I know this is the first larger
> plugin written for CRIU and publicly published. It is also the first GPU
> supported and people have been asking this for many years. It is in fact
> the first hardware device supported through a plugin.
>
>> Major Known issues:
>>
>>   * The KFD ioctl API is not final: Needs a complete redesign to allow
>> future extension without breaking the ABI
>>   * Very slow: Need to implement DMA to dump VRAM contents
>>
>> Missing or incomplete features:
>>
>>   * Support for the new KFD SVM API
>>   * Check device topology during restore
>>   * Checkpoint and restore multiple processes
>>   * Support for applications using Mesa for video decode/encode
>>   * Testing with more different GPUs and workloads
>>
>> Big Open questions:
>>
>>   * What's the preferred way to publish our CRIU plugin? In-tree or
>> out-of-tree?
> I would do it in-tree.
>
>>   * What's the preferred way to distribute our CRIU plugin? Source?
>> Binary .so? Whole CRIU? Just in-box support?
> As you are planing to publish the source I would make it part of the
> CRIU repository and this way it will find its way to the packages in the
> different distributions.

Thanks. These are the answers I was hoping for.


>
> Does the plugin require any additional dependencies? If there is no
> additional dependency to a library the plugin can be easily be part of
> the existing packages.

The DMA solution we're considering for saving VRAM contents would add a
dependency on libdrm and libdrm-amdgpu.


>
>>   * If our plugin can be upstreamed in the CRIU tree, what would be the
>> right directory?
> I would just put it into criu/plugins/

Sounds good.


>
> It would also be good to have your patchset submitted as a PR on github
> to have our normal CI test coverage of the changes.

We'll probably have to recreate our repository to start as a fork of the
upstream CRIU repository, so that we can easily send pull-requests.
We're not going to be ready for upstreaming for a few more months,
probably. Do you want to get occasionaly pull requests anyway, just to
run CI on our work-in-progress code?

Regards,
  Felix


>
>   Adrian
___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


Re: [PATCH] drm/amdkfd: add ACPI SRAT parsing for topology

2021-05-03 Thread Zeng, Oak
I feel such parsing work should be part of the ACPI generic work so should be 
done in drivers/acpi/num/srat.c (see acpi_table_parse_srat) and the acpi 
subsystem should expose APIs for rest drivers to query such numa information.

Regards,
Oak 

 

On 2021-04-28, 11:12 AM, "amd-gfx on behalf of Eric Huang" 
 
wrote:

In NPS4 BIOS we need to find the closest numa node when creating
topology io link between cpu and gpu, if PCI driver doesn't set
it.

Signed-off-by: Eric Huang 
---
 drivers/gpu/drm/amd/amdkfd/kfd_crat.c | 94 ++-
 1 file changed, 91 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
index 38d45711675f..57518136c7d7 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
@@ -1759,6 +1759,87 @@ static int kfd_fill_gpu_memory_affinity(int 
*avail_size,
return 0;
 }

+#ifdef CONFIG_ACPI
+static void kfd_find_numa_node_in_srat(struct kfd_dev *kdev,
+   int *numa_node)
+{
+   struct acpi_table_header *table_header = NULL;
+   struct acpi_subtable_header *sub_header = NULL;
+   unsigned long table_end, subtable_len;
+   u32 pci_id = pci_domain_nr(kdev->pdev->bus) << 16 |
+   pci_dev_id(kdev->pdev);
+   u32 bdf;
+   acpi_status status;
+   struct acpi_srat_cpu_affinity *cpu;
+   struct acpi_srat_generic_affinity *gpu;
+   int pxm = 0, max_pxm = 0;
+   bool found = false;
+
+   /* Fetch the SRAT table from ACPI */
+   status = acpi_get_table(ACPI_SIG_SRAT, 0, &table_header);
+   if (status == AE_NOT_FOUND) {
+   pr_warn("SRAT table not found\n");
+   return;
+   } else if (ACPI_FAILURE(status)) {
+   const char *err = acpi_format_exception(status);
+   pr_err("SRAT table error: %s\n", err);
+   return;
+   }
+
+   table_end = (unsigned long)table_header + table_header->length;
+
+   /* Parse all entries looking for a match. */
+
+   sub_header = (struct acpi_subtable_header *)
+   ((unsigned long)table_header +
+   sizeof(struct acpi_table_srat));
+   subtable_len = sub_header->length;
+
+   while (((unsigned long)sub_header) + subtable_len  < table_end) {
+   /*
+* If length is 0, break from this loop to avoid
+* infinite loop.
+*/
+   if (subtable_len == 0) {
+   pr_err("SRAT invalid zero length\n");
+   break;
+   }
+
+   switch (sub_header->type) {
+   case ACPI_SRAT_TYPE_CPU_AFFINITY:
+   cpu = (struct acpi_srat_cpu_affinity *)sub_header;
+   pxm = *((u32 *)cpu->proximity_domain_hi) << 8 |
+   cpu->proximity_domain_lo;
+   if (pxm > max_pxm)
+   max_pxm = pxm;
+   break;
+   case ACPI_SRAT_TYPE_GENERIC_AFFINITY:
+   gpu = (struct acpi_srat_generic_affinity *)sub_header;
+   bdf = *((u16 *)(&gpu->device_handle[0])) << 16 |
+   *((u16 *)(&gpu->device_handle[2]));
+   if (bdf == pci_id) {
+   found = true;
+   *numa_node = pxm_to_node(gpu->proximity_domain);
+   }
+   break;
+   default:
+   break;
+   }
+
+   if (found)
+   break;
+
+   sub_header = (struct acpi_subtable_header *)
+   ((unsigned long)sub_header + subtable_len);
+   subtable_len = sub_header->length;
+   }
+
+   /* workaround bad cpu-gpu binding case */
+   if (found && (*numa_node < 0 || *numa_node > max_pxm))
+   *numa_node = 0;
+}
+#endif
+
 /* kfd_fill_gpu_direct_io_link - Fill in direct io link from GPU
  * to its NUMA node
  * @avail_size: Available size in the memory
@@ -1774,6 +1855,9 @@ static int kfd_fill_gpu_direct_io_link_to_cpu(int 
*avail_size,
uint32_t proximity_domain)
 {
struct amdgpu_device *adev = (struct amdgpu_device *)kdev->kgd;
+#ifdef CONFIG_NUMA
+   int numa_node = 0;
+#endif

*avail_size -= sizeof(struct crat_subtype_iolink);
if (*avail_size < 0)
@@ -1805,9 +1889,13 @@ static int kfd_fill_gpu_direct_io_link_to_cpu(int 
*avail_size,

sub_type_hdr->proximity_domain_from = proximity_domain;
 #ifdef CONFIG_NUMA
-   if (kdev->pdev->dev.numa_node == NUMA_NO_NODE)
-   sub_type_hdr->proximity_domain_to = 0;
   

Re: [PATCH] drm/amdkfd: add ACPI SRAT parsing for topology

2021-05-03 Thread Felix Kuehling
Am 2021-05-03 um 10:47 a.m. schrieb Eric Huang:
> In NPS4 BIOS we need to find the closest numa node when creating
> topology io link between cpu and gpu, if PCI driver doesn't set
> it.
>
> Signed-off-by: Eric Huang 
> ---
>  drivers/gpu/drm/amd/amdkfd/kfd_crat.c | 95 ++-
>  1 file changed, 93 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c 
> b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
> index 38d45711675f..58c6738de774 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
> @@ -1759,6 +1759,91 @@ static int kfd_fill_gpu_memory_affinity(int 
> *avail_size,
>   return 0;
>  }
>  
> +#ifdef CONFIG_ACPI_NUMA
> +static void kfd_find_numa_node_in_srat(struct kfd_dev *kdev)
> +{
> + struct acpi_table_header *table_header = NULL;
> + struct acpi_subtable_header *sub_header = NULL;
> + unsigned long table_end, subtable_len;
> + u32 pci_id = pci_domain_nr(kdev->pdev->bus) << 16 |
> + pci_dev_id(kdev->pdev);
> + u32 bdf;
> + acpi_status status;
> + struct acpi_srat_cpu_affinity *cpu;
> + struct acpi_srat_generic_affinity *gpu;
> + int pxm = 0, max_pxm = 0;
> + int numa_node = NUMA_NO_NODE;
> + bool found = false;
> +
> + /* Fetch the SRAT table from ACPI */
> + status = acpi_get_table(ACPI_SIG_SRAT, 0, &table_header);
> + if (status == AE_NOT_FOUND) {
> + pr_warn("SRAT table not found\n");
> + return;
> + } else if (ACPI_FAILURE(status)) {
> + const char *err = acpi_format_exception(status);
> + pr_err("SRAT table error: %s\n", err);
> + return;
> + }
> +
> + table_end = (unsigned long)table_header + table_header->length;
> +
> + /* Parse all entries looking for a match. */
> + sub_header = (struct acpi_subtable_header *)
> + ((unsigned long)table_header +
> + sizeof(struct acpi_table_srat));
> + subtable_len = sub_header->length;
> +
> + while (((unsigned long)sub_header) + subtable_len  < table_end) {
> + /*
> +  * If length is 0, break from this loop to avoid
> +  * infinite loop.
> +  */
> + if (subtable_len == 0) {
> + pr_err("SRAT invalid zero length\n");
> + break;
> + }
> +
> + switch (sub_header->type) {
> + case ACPI_SRAT_TYPE_CPU_AFFINITY:
> + cpu = (struct acpi_srat_cpu_affinity *)sub_header;
> + pxm = *((u32 *)cpu->proximity_domain_hi) << 8 |
> + cpu->proximity_domain_lo;
> + if (pxm > max_pxm)
> + max_pxm = pxm;
> + break;
> + case ACPI_SRAT_TYPE_GENERIC_AFFINITY:
> + gpu = (struct acpi_srat_generic_affinity *)sub_header;
> + bdf = *((u16 *)(&gpu->device_handle[0])) << 16 |
> + *((u16 *)(&gpu->device_handle[2]));
> + if (bdf == pci_id) {
> + found = true;
> + numa_node = pxm_to_node(gpu->proximity_domain);
> + }
> + break;
> + default:
> + break;
> + }
> +
> + if (found)
> + break;
> +
> + sub_header = (struct acpi_subtable_header *)
> + ((unsigned long)sub_header + subtable_len);
> + subtable_len = sub_header->length;
> + }
> +
> + acpi_put_table(table_header);
> +
> + /* Workaround bad cpu-gpu binding case */
> + if (found && (numa_node < 0 || numa_node > max_pxm))
> + numa_node = 0;
> +
> + if (numa_node != NUMA_NO_NODE)
> + set_dev_node(&kdev->pdev->dev, numa_node);
> +}
> +#endif
> +
>  /* kfd_fill_gpu_direct_io_link - Fill in direct io link from GPU
>   * to its NUMA node
>   *   @avail_size: Available size in the memory
> @@ -1804,10 +1889,16 @@ static int kfd_fill_gpu_direct_io_link_to_cpu(int 
> *avail_size,
>   }
>  
>   sub_type_hdr->proximity_domain_from = proximity_domain;
> -#ifdef CONFIG_NUMA
> +
> +#ifdef CONFIG_ACPI_NUMA
>   if (kdev->pdev->dev.numa_node == NUMA_NO_NODE)
> + kfd_find_numa_node_in_srat(kdev);
> +#endif
> +#ifdef CONFIG_NUMA
> + if (kdev->pdev->dev.numa_node == NUMA_NO_NODE) {
>   sub_type_hdr->proximity_domain_to = 0;
> - else
> + set_dev_node(&kdev->pdev->dev, 0);

This should not be here. If you really want to lie about the NUMA node
and pretend that it's 0 and not NO_NODE, then that should be done in
kfd_find_numa_node_in_srat. That should be the only function that
changes the dev->numa_node. Like Oak pointed out, eventually that should
maybe not even be part of 

Re: [PATCH] drm/amdkfd: add ACPI SRAT parsing for topology

2021-05-03 Thread Eric Huang
In drivers/acpi/numa/srat.c, the generic CCD parsing is for the mapping 
of numa node and pxm domain that creates arrays of pxm_to_node_map and 
node_to_pxm_map. We are currently using API pxm_to_node() to get the 
corresponding information.


For GCD parsing, the relation of GCD to CCD is defined by AMD, generic 
parsing in srat.c is considering a GCD as a new numa node which is not 
suitable for our need.


Regards,
Eric

On 2021-05-03 2:43 p.m., Zeng, Oak wrote:

I feel such parsing work should be part of the ACPI generic work so should be 
done in drivers/acpi/num/srat.c (see acpi_table_parse_srat) and the acpi 
subsystem should expose APIs for rest drivers to query such numa information.

Regards,
Oak

  


On 2021-04-28, 11:12 AM, "amd-gfx on behalf of Eric Huang" 
 wrote:

 In NPS4 BIOS we need to find the closest numa node when creating
 topology io link between cpu and gpu, if PCI driver doesn't set
 it.

 Signed-off-by: Eric Huang 
 ---
  drivers/gpu/drm/amd/amdkfd/kfd_crat.c | 94 ++-
  1 file changed, 91 insertions(+), 3 deletions(-)

 diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
 index 38d45711675f..57518136c7d7 100644
 --- a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
 +++ b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
 @@ -1759,6 +1759,87 @@ static int kfd_fill_gpu_memory_affinity(int 
*avail_size,
return 0;
  }

 +#ifdef CONFIG_ACPI
 +static void kfd_find_numa_node_in_srat(struct kfd_dev *kdev,
 +  int *numa_node)
 +{
 +  struct acpi_table_header *table_header = NULL;
 +  struct acpi_subtable_header *sub_header = NULL;
 +  unsigned long table_end, subtable_len;
 +  u32 pci_id = pci_domain_nr(kdev->pdev->bus) << 16 |
 +  pci_dev_id(kdev->pdev);
 +  u32 bdf;
 +  acpi_status status;
 +  struct acpi_srat_cpu_affinity *cpu;
 +  struct acpi_srat_generic_affinity *gpu;
 +  int pxm = 0, max_pxm = 0;
 +  bool found = false;
 +
 +  /* Fetch the SRAT table from ACPI */
 +  status = acpi_get_table(ACPI_SIG_SRAT, 0, &table_header);
 +  if (status == AE_NOT_FOUND) {
 +  pr_warn("SRAT table not found\n");
 +  return;
 +  } else if (ACPI_FAILURE(status)) {
 +  const char *err = acpi_format_exception(status);
 +  pr_err("SRAT table error: %s\n", err);
 +  return;
 +  }
 +
 +  table_end = (unsigned long)table_header + table_header->length;
 +
 +  /* Parse all entries looking for a match. */
 +
 +  sub_header = (struct acpi_subtable_header *)
 +  ((unsigned long)table_header +
 +  sizeof(struct acpi_table_srat));
 +  subtable_len = sub_header->length;
 +
 +  while (((unsigned long)sub_header) + subtable_len  < table_end) {
 +  /*
 +   * If length is 0, break from this loop to avoid
 +   * infinite loop.
 +   */
 +  if (subtable_len == 0) {
 +  pr_err("SRAT invalid zero length\n");
 +  break;
 +  }
 +
 +  switch (sub_header->type) {
 +  case ACPI_SRAT_TYPE_CPU_AFFINITY:
 +  cpu = (struct acpi_srat_cpu_affinity *)sub_header;
 +  pxm = *((u32 *)cpu->proximity_domain_hi) << 8 |
 +  cpu->proximity_domain_lo;
 +  if (pxm > max_pxm)
 +  max_pxm = pxm;
 +  break;
 +  case ACPI_SRAT_TYPE_GENERIC_AFFINITY:
 +  gpu = (struct acpi_srat_generic_affinity *)sub_header;
 +  bdf = *((u16 *)(&gpu->device_handle[0])) << 16 |
 +  *((u16 *)(&gpu->device_handle[2]));
 +  if (bdf == pci_id) {
 +  found = true;
 +  *numa_node = pxm_to_node(gpu->proximity_domain);
 +  }
 +  break;
 +  default:
 +  break;
 +  }
 +
 +  if (found)
 +  break;
 +
 +  sub_header = (struct acpi_subtable_header *)
 +  ((unsigned long)sub_header + subtable_len);
 +  subtable_len = sub_header->length;
 +  }
 +
 +  /* workaround bad cpu-gpu binding case */
 +  if (found && (*numa_node < 0 || *numa_node > max_pxm))
 +  *numa_node = 0;
 +}
 +#endif
 +
  /* kfd_fill_gpu_direct_io_link - Fill in direct io link from GPU
   * to its NUMA node
   *@avail_size: Available size in the memory
 @@ -1774,6 +1855,9 @@ static int kfd_fill_gpu_direct_io_link_to_cpu(int 
*avail_size,
uint32_t proximity_domain)
  {
  

Re: [PATCH] drm/amdkfd: add ACPI SRAT parsing for topology

2021-05-03 Thread Eric Huang



On 2021-05-03 3:13 p.m., Felix Kuehling wrote:

Am 2021-05-03 um 10:47 a.m. schrieb Eric Huang:

In NPS4 BIOS we need to find the closest numa node when creating
topology io link between cpu and gpu, if PCI driver doesn't set
it.

Signed-off-by: Eric Huang 
---
  drivers/gpu/drm/amd/amdkfd/kfd_crat.c | 95 ++-
  1 file changed, 93 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
index 38d45711675f..58c6738de774 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
@@ -1759,6 +1759,91 @@ static int kfd_fill_gpu_memory_affinity(int *avail_size,
return 0;
  }
  
+#ifdef CONFIG_ACPI_NUMA

+static void kfd_find_numa_node_in_srat(struct kfd_dev *kdev)
+{
+   struct acpi_table_header *table_header = NULL;
+   struct acpi_subtable_header *sub_header = NULL;
+   unsigned long table_end, subtable_len;
+   u32 pci_id = pci_domain_nr(kdev->pdev->bus) << 16 |
+   pci_dev_id(kdev->pdev);
+   u32 bdf;
+   acpi_status status;
+   struct acpi_srat_cpu_affinity *cpu;
+   struct acpi_srat_generic_affinity *gpu;
+   int pxm = 0, max_pxm = 0;
+   int numa_node = NUMA_NO_NODE;
+   bool found = false;
+
+   /* Fetch the SRAT table from ACPI */
+   status = acpi_get_table(ACPI_SIG_SRAT, 0, &table_header);
+   if (status == AE_NOT_FOUND) {
+   pr_warn("SRAT table not found\n");
+   return;
+   } else if (ACPI_FAILURE(status)) {
+   const char *err = acpi_format_exception(status);
+   pr_err("SRAT table error: %s\n", err);
+   return;
+   }
+
+   table_end = (unsigned long)table_header + table_header->length;
+
+   /* Parse all entries looking for a match. */
+   sub_header = (struct acpi_subtable_header *)
+   ((unsigned long)table_header +
+   sizeof(struct acpi_table_srat));
+   subtable_len = sub_header->length;
+
+   while (((unsigned long)sub_header) + subtable_len  < table_end) {
+   /*
+* If length is 0, break from this loop to avoid
+* infinite loop.
+*/
+   if (subtable_len == 0) {
+   pr_err("SRAT invalid zero length\n");
+   break;
+   }
+
+   switch (sub_header->type) {
+   case ACPI_SRAT_TYPE_CPU_AFFINITY:
+   cpu = (struct acpi_srat_cpu_affinity *)sub_header;
+   pxm = *((u32 *)cpu->proximity_domain_hi) << 8 |
+   cpu->proximity_domain_lo;
+   if (pxm > max_pxm)
+   max_pxm = pxm;
+   break;
+   case ACPI_SRAT_TYPE_GENERIC_AFFINITY:
+   gpu = (struct acpi_srat_generic_affinity *)sub_header;
+   bdf = *((u16 *)(&gpu->device_handle[0])) << 16 |
+   *((u16 *)(&gpu->device_handle[2]));
+   if (bdf == pci_id) {
+   found = true;
+   numa_node = pxm_to_node(gpu->proximity_domain);
+   }
+   break;
+   default:
+   break;
+   }
+
+   if (found)
+   break;
+
+   sub_header = (struct acpi_subtable_header *)
+   ((unsigned long)sub_header + subtable_len);
+   subtable_len = sub_header->length;
+   }
+
+   acpi_put_table(table_header);
+
+   /* Workaround bad cpu-gpu binding case */
+   if (found && (numa_node < 0 || numa_node > max_pxm))
+   numa_node = 0;
+
+   if (numa_node != NUMA_NO_NODE)
+   set_dev_node(&kdev->pdev->dev, numa_node);
+}
+#endif
+
  /* kfd_fill_gpu_direct_io_link - Fill in direct io link from GPU
   * to its NUMA node
   *@avail_size: Available size in the memory
@@ -1804,10 +1889,16 @@ static int kfd_fill_gpu_direct_io_link_to_cpu(int 
*avail_size,
}
  
  	sub_type_hdr->proximity_domain_from = proximity_domain;

-#ifdef CONFIG_NUMA
+
+#ifdef CONFIG_ACPI_NUMA
if (kdev->pdev->dev.numa_node == NUMA_NO_NODE)
+   kfd_find_numa_node_in_srat(kdev);
+#endif
+#ifdef CONFIG_NUMA
+   if (kdev->pdev->dev.numa_node == NUMA_NO_NODE) {
sub_type_hdr->proximity_domain_to = 0;
-   else
+   set_dev_node(&kdev->pdev->dev, 0);

This should not be here. If you really want to lie about the NUMA node
and pretend that it's 0 and not NO_NODE, then that should be done in
kfd_find_numa_node_in_srat. That should be the only function that
changes the dev->numa_node. Like Oak pointed out, eventually that should
maybe not even be part of the driver. But I'm OK with kee

Re: [PATCH] drm/amdkfd: add ACPI SRAT parsing for topology

2021-05-03 Thread Felix Kuehling
Am 2021-05-03 um 3:27 p.m. schrieb Eric Huang:
>
>
> On 2021-05-03 3:13 p.m., Felix Kuehling wrote:
>> Am 2021-05-03 um 10:47 a.m. schrieb Eric Huang:
>>> In NPS4 BIOS we need to find the closest numa node when creating
>>> topology io link between cpu and gpu, if PCI driver doesn't set
>>> it.
>>>
>>> Signed-off-by: Eric Huang 
>>> ---
>>>   drivers/gpu/drm/amd/amdkfd/kfd_crat.c | 95
>>> ++-
>>>   1 file changed, 93 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
>>> b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
>>> index 38d45711675f..58c6738de774 100644
>>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
>>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
>>> @@ -1759,6 +1759,91 @@ static int kfd_fill_gpu_memory_affinity(int
>>> *avail_size,
>>>   return 0;
>>>   }
>>>   +#ifdef CONFIG_ACPI_NUMA
>>> +static void kfd_find_numa_node_in_srat(struct kfd_dev *kdev)
>>> +{
>>> +    struct acpi_table_header *table_header = NULL;
>>> +    struct acpi_subtable_header *sub_header = NULL;
>>> +    unsigned long table_end, subtable_len;
>>> +    u32 pci_id = pci_domain_nr(kdev->pdev->bus) << 16 |
>>> +    pci_dev_id(kdev->pdev);
>>> +    u32 bdf;
>>> +    acpi_status status;
>>> +    struct acpi_srat_cpu_affinity *cpu;
>>> +    struct acpi_srat_generic_affinity *gpu;
>>> +    int pxm = 0, max_pxm = 0;
>>> +    int numa_node = NUMA_NO_NODE;
>>> +    bool found = false;
>>> +
>>> +    /* Fetch the SRAT table from ACPI */
>>> +    status = acpi_get_table(ACPI_SIG_SRAT, 0, &table_header);
>>> +    if (status == AE_NOT_FOUND) {
>>> +    pr_warn("SRAT table not found\n");
>>> +    return;
>>> +    } else if (ACPI_FAILURE(status)) {
>>> +    const char *err = acpi_format_exception(status);
>>> +    pr_err("SRAT table error: %s\n", err);
>>> +    return;
>>> +    }
>>> +
>>> +    table_end = (unsigned long)table_header + table_header->length;
>>> +
>>> +    /* Parse all entries looking for a match. */
>>> +    sub_header = (struct acpi_subtable_header *)
>>> +    ((unsigned long)table_header +
>>> +    sizeof(struct acpi_table_srat));
>>> +    subtable_len = sub_header->length;
>>> +
>>> +    while (((unsigned long)sub_header) + subtable_len  < table_end) {
>>> +    /*
>>> + * If length is 0, break from this loop to avoid
>>> + * infinite loop.
>>> + */
>>> +    if (subtable_len == 0) {
>>> +    pr_err("SRAT invalid zero length\n");
>>> +    break;
>>> +    }
>>> +
>>> +    switch (sub_header->type) {
>>> +    case ACPI_SRAT_TYPE_CPU_AFFINITY:
>>> +    cpu = (struct acpi_srat_cpu_affinity *)sub_header;
>>> +    pxm = *((u32 *)cpu->proximity_domain_hi) << 8 |
>>> +    cpu->proximity_domain_lo;
>>> +    if (pxm > max_pxm)
>>> +    max_pxm = pxm;
>>> +    break;
>>> +    case ACPI_SRAT_TYPE_GENERIC_AFFINITY:
>>> +    gpu = (struct acpi_srat_generic_affinity *)sub_header;
>>> +    bdf = *((u16 *)(&gpu->device_handle[0])) << 16 |
>>> +    *((u16 *)(&gpu->device_handle[2]));
>>> +    if (bdf == pci_id) {
>>> +    found = true;
>>> +    numa_node = pxm_to_node(gpu->proximity_domain);
>>> +    }
>>> +    break;
>>> +    default:
>>> +    break;
>>> +    }
>>> +
>>> +    if (found)
>>> +    break;
>>> +
>>> +    sub_header = (struct acpi_subtable_header *)
>>> +    ((unsigned long)sub_header + subtable_len);
>>> +    subtable_len = sub_header->length;
>>> +    }
>>> +
>>> +    acpi_put_table(table_header);
>>> +
>>> +    /* Workaround bad cpu-gpu binding case */
>>> +    if (found && (numa_node < 0 || numa_node > max_pxm))
>>> +    numa_node = 0;
>>> +
>>> +    if (numa_node != NUMA_NO_NODE)
>>> +    set_dev_node(&kdev->pdev->dev, numa_node);
>>> +}
>>> +#endif
>>> +
>>>   /* kfd_fill_gpu_direct_io_link - Fill in direct io link from GPU
>>>    * to its NUMA node
>>>    *    @avail_size: Available size in the memory
>>> @@ -1804,10 +1889,16 @@ static int
>>> kfd_fill_gpu_direct_io_link_to_cpu(int *avail_size,
>>>   }
>>>     sub_type_hdr->proximity_domain_from = proximity_domain;
>>> -#ifdef CONFIG_NUMA
>>> +
>>> +#ifdef CONFIG_ACPI_NUMA
>>>   if (kdev->pdev->dev.numa_node == NUMA_NO_NODE)
>>> +    kfd_find_numa_node_in_srat(kdev);
>>> +#endif
>>> +#ifdef CONFIG_NUMA
>>> +    if (kdev->pdev->dev.numa_node == NUMA_NO_NODE) {
>>>   sub_type_hdr->proximity_domain_to = 0;
>>> -    else
>>> +    set_dev_node(&kdev->pdev->dev, 0);
>> This should not be here. If you really want to lie about the NUMA node
>> and pretend that it's 0 and not NO_NODE, then that should be done in
>> kfd_find_numa_node_in_srat. That should be the only function that
>> changes the dev->numa_node. Like Oak pointed out, eventually that should
>> maybe not even be part of the driver. Bu

[PATCH] drm/amdkfd: fix no atomics settings in the kfd topology

2021-05-03 Thread Jonathan Kim
To account for various PCIe and xGMI setups, check the no atomics settings
for a device in relation to every direct peer.

v2: apply suggested clean ups in main loop.

Signed-off-by: Jonathan Kim 
---
 drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 61 ++-
 1 file changed, 37 insertions(+), 24 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
index 30430aefcfc7..fb4f718a1148 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
@@ -1192,47 +1192,60 @@ static void kfd_fill_mem_clk_max_info(struct 
kfd_topology_device *dev)
mem->mem_clk_max = local_mem_info.mem_clk_max;
 }
 
-static void kfd_fill_iolink_non_crat_info(struct kfd_topology_device *dev)
+static void kfd_set_iolink_no_atomics(struct kfd_topology_device *dev,
+   struct kfd_topology_device 
*target_gpu_dev,
+   struct kfd_iolink_properties *link)
 {
-   struct kfd_iolink_properties *link, *cpu_link;
-   struct kfd_topology_device *cpu_dev;
-   struct amdgpu_device *adev;
-   uint32_t cap;
-   uint32_t cpu_flag = CRAT_IOLINK_FLAGS_ENABLED;
-   uint32_t flag = CRAT_IOLINK_FLAGS_ENABLED;
-
-   if (!dev || !dev->gpu)
+   /* xgmi always supports atomics between links. */
+   if (link->iolink_type == CRAT_IOLINK_TYPE_XGMI)
return;
 
-   adev = (struct amdgpu_device *)(dev->gpu->kgd);
-   if (!adev->gmc.xgmi.connected_to_cpu) {
-   pcie_capability_read_dword(dev->gpu->pdev,
+   /* check pcie support to set cpu(dev) flags for target_gpu_dev link. */
+   if (target_gpu_dev) {
+   uint32_t cap;
+
+   pcie_capability_read_dword(target_gpu_dev->gpu->pdev,
PCI_EXP_DEVCAP2, &cap);
 
if (!(cap & (PCI_EXP_DEVCAP2_ATOMIC_COMP32 |
 PCI_EXP_DEVCAP2_ATOMIC_COMP64)))
-   cpu_flag |= CRAT_IOLINK_FLAGS_NO_ATOMICS_32_BIT |
+   link->flags |= CRAT_IOLINK_FLAGS_NO_ATOMICS_32_BIT |
CRAT_IOLINK_FLAGS_NO_ATOMICS_64_BIT;
-   }
-
-   if (!adev->gmc.xgmi.num_physical_nodes) {
+   /* set gpu (dev) flags. */
+   } else {
if (!dev->gpu->pci_atomic_requested ||
dev->gpu->device_info->asic_family ==
CHIP_HAWAII)
-   flag |= CRAT_IOLINK_FLAGS_NO_ATOMICS_32_BIT |
+   link->flags |= CRAT_IOLINK_FLAGS_NO_ATOMICS_32_BIT |
CRAT_IOLINK_FLAGS_NO_ATOMICS_64_BIT;
}
+}
+
+static void kfd_fill_iolink_non_crat_info(struct kfd_topology_device *dev)
+{
+   struct kfd_iolink_properties *link, *inbound_link;
+   struct kfd_topology_device *peer_dev;
+
+   if (!dev || !dev->gpu)
+   return;
 
/* GPU only creates direct links so apply flags setting to all */
list_for_each_entry(link, &dev->io_link_props, list) {
-   link->flags = flag;
-   cpu_dev = kfd_topology_device_by_proximity_domain(
+   link->flags = CRAT_IOLINK_FLAGS_ENABLED;
+   kfd_set_iolink_no_atomics(dev, NULL, link);
+   peer_dev = kfd_topology_device_by_proximity_domain(
link->node_to);
-   if (cpu_dev) {
-   list_for_each_entry(cpu_link,
-   &cpu_dev->io_link_props, list)
-   if (cpu_link->node_to == link->node_from)
-   cpu_link->flags = cpu_flag;
+
+   if (!peer_dev)
+   continue;
+
+   list_for_each_entry(inbound_link, &peer_dev->io_link_props,
+   list) {
+   if (inbound_link->node_to != link->node_from)
+   continue;
+
+   inbound_link->flags = CRAT_IOLINK_FLAGS_ENABLED;
+   kfd_set_iolink_no_atomics(peer_dev, dev, inbound_link);
}
}
 }
-- 
2.17.1

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


Re: [PATCH] drm/amdkfd: fix no atomics settings in the kfd topology

2021-05-03 Thread Felix Kuehling
Am 2021-05-03 um 3:49 p.m. schrieb Jonathan Kim:
> To account for various PCIe and xGMI setups, check the no atomics settings
> for a device in relation to every direct peer.
>
> v2: apply suggested clean ups in main loop.
>
> Signed-off-by: Jonathan Kim 

Reviewed-by: Felix Kuehling 


> ---
>  drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 61 ++-
>  1 file changed, 37 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c 
> b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
> index 30430aefcfc7..fb4f718a1148 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
> @@ -1192,47 +1192,60 @@ static void kfd_fill_mem_clk_max_info(struct 
> kfd_topology_device *dev)
>   mem->mem_clk_max = local_mem_info.mem_clk_max;
>  }
>  
> -static void kfd_fill_iolink_non_crat_info(struct kfd_topology_device *dev)
> +static void kfd_set_iolink_no_atomics(struct kfd_topology_device *dev,
> + struct kfd_topology_device 
> *target_gpu_dev,
> + struct kfd_iolink_properties *link)
>  {
> - struct kfd_iolink_properties *link, *cpu_link;
> - struct kfd_topology_device *cpu_dev;
> - struct amdgpu_device *adev;
> - uint32_t cap;
> - uint32_t cpu_flag = CRAT_IOLINK_FLAGS_ENABLED;
> - uint32_t flag = CRAT_IOLINK_FLAGS_ENABLED;
> -
> - if (!dev || !dev->gpu)
> + /* xgmi always supports atomics between links. */
> + if (link->iolink_type == CRAT_IOLINK_TYPE_XGMI)
>   return;
>  
> - adev = (struct amdgpu_device *)(dev->gpu->kgd);
> - if (!adev->gmc.xgmi.connected_to_cpu) {
> - pcie_capability_read_dword(dev->gpu->pdev,
> + /* check pcie support to set cpu(dev) flags for target_gpu_dev link. */
> + if (target_gpu_dev) {
> + uint32_t cap;
> +
> + pcie_capability_read_dword(target_gpu_dev->gpu->pdev,
>   PCI_EXP_DEVCAP2, &cap);
>  
>   if (!(cap & (PCI_EXP_DEVCAP2_ATOMIC_COMP32 |
>PCI_EXP_DEVCAP2_ATOMIC_COMP64)))
> - cpu_flag |= CRAT_IOLINK_FLAGS_NO_ATOMICS_32_BIT |
> + link->flags |= CRAT_IOLINK_FLAGS_NO_ATOMICS_32_BIT |
>   CRAT_IOLINK_FLAGS_NO_ATOMICS_64_BIT;
> - }
> -
> - if (!adev->gmc.xgmi.num_physical_nodes) {
> + /* set gpu (dev) flags. */
> + } else {
>   if (!dev->gpu->pci_atomic_requested ||
>   dev->gpu->device_info->asic_family ==
>   CHIP_HAWAII)
> - flag |= CRAT_IOLINK_FLAGS_NO_ATOMICS_32_BIT |
> + link->flags |= CRAT_IOLINK_FLAGS_NO_ATOMICS_32_BIT |
>   CRAT_IOLINK_FLAGS_NO_ATOMICS_64_BIT;
>   }
> +}
> +
> +static void kfd_fill_iolink_non_crat_info(struct kfd_topology_device *dev)
> +{
> + struct kfd_iolink_properties *link, *inbound_link;
> + struct kfd_topology_device *peer_dev;
> +
> + if (!dev || !dev->gpu)
> + return;
>  
>   /* GPU only creates direct links so apply flags setting to all */
>   list_for_each_entry(link, &dev->io_link_props, list) {
> - link->flags = flag;
> - cpu_dev = kfd_topology_device_by_proximity_domain(
> + link->flags = CRAT_IOLINK_FLAGS_ENABLED;
> + kfd_set_iolink_no_atomics(dev, NULL, link);
> + peer_dev = kfd_topology_device_by_proximity_domain(
>   link->node_to);
> - if (cpu_dev) {
> - list_for_each_entry(cpu_link,
> - &cpu_dev->io_link_props, list)
> - if (cpu_link->node_to == link->node_from)
> - cpu_link->flags = cpu_flag;
> +
> + if (!peer_dev)
> + continue;
> +
> + list_for_each_entry(inbound_link, &peer_dev->io_link_props,
> + list) {
> + if (inbound_link->node_to != link->node_from)
> + continue;
> +
> + inbound_link->flags = CRAT_IOLINK_FLAGS_ENABLED;
> + kfd_set_iolink_no_atomics(peer_dev, dev, inbound_link);
>   }
>   }
>  }
___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


  1   2   >