Skip to content

Commit 2072ce0

Browse files
committed
Merge branch 'drm-fixes-5.0' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
A few fixes for 5.0: - Fix radeon crash on SI with VM passthrough - Fencing fix for shared buffers - Fix power hwmon reporting on APUs - Powerplay fix for APUs Signed-off-by: Dave Airlie <airlied@redhat.com> From: Alex Deucher <alexdeucher@gmail.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190201043455.5988-1-alexander.deucher@amd.com
2 parents 8834f56 + 6e11ea9 commit 2072ce0

File tree

5 files changed

+60
-13
lines changed

5 files changed

+60
-13
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1686,7 +1686,8 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj,
16861686
effective_mode &= ~S_IWUSR;
16871687

16881688
if ((adev->flags & AMD_IS_APU) &&
1689-
(attr == &sensor_dev_attr_power1_cap_max.dev_attr.attr ||
1689+
(attr == &sensor_dev_attr_power1_average.dev_attr.attr ||
1690+
attr == &sensor_dev_attr_power1_cap_max.dev_attr.attr ||
16901691
attr == &sensor_dev_attr_power1_cap_min.dev_attr.attr||
16911692
attr == &sensor_dev_attr_power1_cap.dev_attr.attr))
16921693
return 0;

drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c

Lines changed: 51 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include "amdgpu_gem.h"
3939
#include <drm/amdgpu_drm.h>
4040
#include <linux/dma-buf.h>
41+
#include <linux/dma-fence-array.h>
4142

4243
/**
4344
* amdgpu_gem_prime_get_sg_table - &drm_driver.gem_prime_get_sg_table
@@ -187,6 +188,48 @@ amdgpu_gem_prime_import_sg_table(struct drm_device *dev,
187188
return ERR_PTR(ret);
188189
}
189190

191+
static int
192+
__reservation_object_make_exclusive(struct reservation_object *obj)
193+
{
194+
struct dma_fence **fences;
195+
unsigned int count;
196+
int r;
197+
198+
if (!reservation_object_get_list(obj)) /* no shared fences to convert */
199+
return 0;
200+
201+
r = reservation_object_get_fences_rcu(obj, NULL, &count, &fences);
202+
if (r)
203+
return r;
204+
205+
if (count == 0) {
206+
/* Now that was unexpected. */
207+
} else if (count == 1) {
208+
reservation_object_add_excl_fence(obj, fences[0]);
209+
dma_fence_put(fences[0]);
210+
kfree(fences);
211+
} else {
212+
struct dma_fence_array *array;
213+
214+
array = dma_fence_array_create(count, fences,
215+
dma_fence_context_alloc(1), 0,
216+
false);
217+
if (!array)
218+
goto err_fences_put;
219+
220+
reservation_object_add_excl_fence(obj, &array->base);
221+
dma_fence_put(&array->base);
222+
}
223+
224+
return 0;
225+
226+
err_fences_put:
227+
while (count--)
228+
dma_fence_put(fences[count]);
229+
kfree(fences);
230+
return -ENOMEM;
231+
}
232+
190233
/**
191234
* amdgpu_gem_map_attach - &dma_buf_ops.attach implementation
192235
* @dma_buf: Shared DMA buffer
@@ -218,16 +261,16 @@ static int amdgpu_gem_map_attach(struct dma_buf *dma_buf,
218261

219262
if (attach->dev->driver != adev->dev->driver) {
220263
/*
221-
* Wait for all shared fences to complete before we switch to future
222-
* use of exclusive fence on this prime shared bo.
264+
* We only create shared fences for internal use, but importers
265+
* of the dmabuf rely on exclusive fences for implicitly
266+
* tracking write hazards. As any of the current fences may
267+
* correspond to a write, we need to convert all existing
268+
* fences on the reservation object into a single exclusive
269+
* fence.
223270
*/
224-
r = reservation_object_wait_timeout_rcu(bo->tbo.resv,
225-
true, false,
226-
MAX_SCHEDULE_TIMEOUT);
227-
if (unlikely(r < 0)) {
228-
DRM_DEBUG_PRIME("Fence wait failed: %li\n", r);
271+
r = __reservation_object_make_exclusive(bo->tbo.resv);
272+
if (r)
229273
goto error_unreserve;
230-
}
231274
}
232275

233276
/* pin buffer into GTT */

drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1033,6 +1033,7 @@ static int smu10_get_clock_by_type_with_latency(struct pp_hwmgr *hwmgr,
10331033
break;
10341034
case amd_pp_dpp_clock:
10351035
pclk_vol_table = pinfo->vdd_dep_on_dppclk;
1036+
break;
10361037
default:
10371038
return -EINVAL;
10381039
}

drivers/gpu/drm/radeon/ci_dpm.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5676,7 +5676,7 @@ int ci_dpm_init(struct radeon_device *rdev)
56765676
u16 data_offset, size;
56775677
u8 frev, crev;
56785678
struct ci_power_info *pi;
5679-
enum pci_bus_speed speed_cap;
5679+
enum pci_bus_speed speed_cap = PCI_SPEED_UNKNOWN;
56805680
struct pci_dev *root = rdev->pdev->bus->self;
56815681
int ret;
56825682

@@ -5685,7 +5685,8 @@ int ci_dpm_init(struct radeon_device *rdev)
56855685
return -ENOMEM;
56865686
rdev->pm.dpm.priv = pi;
56875687

5688-
speed_cap = pcie_get_speed_cap(root);
5688+
if (!pci_is_root_bus(rdev->pdev->bus))
5689+
speed_cap = pcie_get_speed_cap(root);
56895690
if (speed_cap == PCI_SPEED_UNKNOWN) {
56905691
pi->sys_pcie_mask = 0;
56915692
} else {

drivers/gpu/drm/radeon/si_dpm.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6899,7 +6899,7 @@ int si_dpm_init(struct radeon_device *rdev)
68996899
struct ni_power_info *ni_pi;
69006900
struct si_power_info *si_pi;
69016901
struct atom_clock_dividers dividers;
6902-
enum pci_bus_speed speed_cap;
6902+
enum pci_bus_speed speed_cap = PCI_SPEED_UNKNOWN;
69036903
struct pci_dev *root = rdev->pdev->bus->self;
69046904
int ret;
69056905

@@ -6911,7 +6911,8 @@ int si_dpm_init(struct radeon_device *rdev)
69116911
eg_pi = &ni_pi->eg;
69126912
pi = &eg_pi->rv7xx;
69136913

6914-
speed_cap = pcie_get_speed_cap(root);
6914+
if (!pci_is_root_bus(rdev->pdev->bus))
6915+
speed_cap = pcie_get_speed_cap(root);
69156916
if (speed_cap == PCI_SPEED_UNKNOWN) {
69166917
si_pi->sys_pcie_mask = 0;
69176918
} else {

0 commit comments

Comments
 (0)