[PATCH] drm/amdgpu: include percpu.h to fix SPARC build

2017-09-04 Thread Oded Gabbay
Signed-off-by: Oded Gabbay 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
index 8d689ab7e429..20bf9054e64e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
@@ -26,6 +26,7 @@
 #define AMDGPU_AMDKFD_H_INCLUDED
 
 #include 
+#include 
 #include 
 #include 
 
-- 
2.13.5

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


[PATCH] dma-fence: fix dma_fence_get_rcu_safe

2017-09-04 Thread Christian König
From: Christian König 

The logic is buggy and unnecessary complex. When dma_fence_get_rcu() fails to
acquire a reference it doesn't necessary mean that there is no fence at all.

It usually mean that the fence was replaced by a new one and in this situation
we certainly want to have the new one as result and *NOT* NULL.

Signed-off-by: Christian König 
Cc: Chris Wilson 
Cc: Daniel Vetter 
Cc: Sumit Semwal 
Cc: linux-me...@vger.kernel.org
Cc: dri-de...@lists.freedesktop.org
Cc: linaro-mm-...@lists.linaro.org
---
 include/linux/dma-fence.h | 23 ++-
 1 file changed, 2 insertions(+), 21 deletions(-)

diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h
index a5195a7..37f3d67 100644
--- a/include/linux/dma-fence.h
+++ b/include/linux/dma-fence.h
@@ -246,27 +246,8 @@ dma_fence_get_rcu_safe(struct dma_fence * __rcu *fencep)
struct dma_fence *fence;
 
fence = rcu_dereference(*fencep);
-   if (!fence || !dma_fence_get_rcu(fence))
-   return NULL;
-
-   /* The atomic_inc_not_zero() inside dma_fence_get_rcu()
-* provides a full memory barrier upon success (such as now).
-* This is paired with the write barrier from assigning
-* to the __rcu protected fence pointer so that if that
-* pointer still matches the current fence, we know we
-* have successfully acquire a reference to it. If it no
-* longer matches, we are holding a reference to some other
-* reallocated pointer. This is possible if the allocator
-* is using a freelist like SLAB_TYPESAFE_BY_RCU where the
-* fence remains valid for the RCU grace period, but it
-* may be reallocated. When using such allocators, we are
-* responsible for ensuring the reference we get is to
-* the right fence, as below.
-*/
-   if (fence == rcu_access_pointer(*fencep))
-   return rcu_pointer_handoff(fence);
-
-   dma_fence_put(fence);
+   if (!fence || dma_fence_get_rcu(fence))
+   return fence;
} while (1);
 }
 
-- 
2.7.4

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


Re: [PATCH] dma-fence: fix dma_fence_get_rcu_safe

2017-09-04 Thread Christian König
I really wonder what's wrong with my mail client, but it looks like this 
patch never made it at least to dri-devel.


Forwarding manually now,
Christian.

Am 04.09.2017 um 15:16 schrieb Christian König:

From: Christian König 

The logic is buggy and unnecessary complex. When dma_fence_get_rcu() fails to
acquire a reference it doesn't necessary mean that there is no fence at all.

It usually mean that the fence was replaced by a new one and in this situation
we certainly want to have the new one as result and *NOT* NULL.

Signed-off-by: Christian König 
Cc: Chris Wilson 
Cc: Daniel Vetter 
Cc: Sumit Semwal 
Cc: linux-me...@vger.kernel.org
Cc: dri-de...@lists.freedesktop.org
Cc: linaro-mm-...@lists.linaro.org
---
  include/linux/dma-fence.h | 23 ++-
  1 file changed, 2 insertions(+), 21 deletions(-)

diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h
index a5195a7..37f3d67 100644
--- a/include/linux/dma-fence.h
+++ b/include/linux/dma-fence.h
@@ -246,27 +246,8 @@ dma_fence_get_rcu_safe(struct dma_fence * __rcu *fencep)
struct dma_fence *fence;
  
  		fence = rcu_dereference(*fencep);

-   if (!fence || !dma_fence_get_rcu(fence))
-   return NULL;
-
-   /* The atomic_inc_not_zero() inside dma_fence_get_rcu()
-* provides a full memory barrier upon success (such as now).
-* This is paired with the write barrier from assigning
-* to the __rcu protected fence pointer so that if that
-* pointer still matches the current fence, we know we
-* have successfully acquire a reference to it. If it no
-* longer matches, we are holding a reference to some other
-* reallocated pointer. This is possible if the allocator
-* is using a freelist like SLAB_TYPESAFE_BY_RCU where the
-* fence remains valid for the RCU grace period, but it
-* may be reallocated. When using such allocators, we are
-* responsible for ensuring the reference we get is to
-* the right fence, as below.
-*/
-   if (fence == rcu_access_pointer(*fencep))
-   return rcu_pointer_handoff(fence);
-
-   dma_fence_put(fence);
+   if (!fence || dma_fence_get_rcu(fence))
+   return fence;
} while (1);
  }
  



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


[PATCH 1/2] dma-buf: make reservation_object_copy_fences rcu save

2017-09-04 Thread Christian König
From: Christian König 

Stop requiring that the src reservation object is locked for this operation.

Signed-off-by: Christian König 
---
 drivers/dma-buf/reservation.c | 56 ---
 1 file changed, 42 insertions(+), 14 deletions(-)

diff --git a/drivers/dma-buf/reservation.c b/drivers/dma-buf/reservation.c
index dec3a81..b44d9d7 100644
--- a/drivers/dma-buf/reservation.c
+++ b/drivers/dma-buf/reservation.c
@@ -266,8 +266,7 @@ EXPORT_SYMBOL(reservation_object_add_excl_fence);
 * @dst: the destination reservation object
 * @src: the source reservation object
 *
-* Copy all fences from src to dst. Both src->lock as well as dst-lock must be
-* held.
+* Copy all fences from src to dst. dst-lock must be held.
 */
 int reservation_object_copy_fences(struct reservation_object *dst,
   struct reservation_object *src)
@@ -277,33 +276,62 @@ int reservation_object_copy_fences(struct 
reservation_object *dst,
size_t size;
unsigned i;
 
-   src_list = reservation_object_get_list(src);
+   rcu_read_lock();
+   src_list = rcu_dereference(src->fence);
 
+retry:
if (src_list) {
-   size = offsetof(typeof(*src_list),
-   shared[src_list->shared_count]);
+   unsigned shared_count = src_list->shared_count;
+
+   size = offsetof(typeof(*src_list), shared[shared_count]);
+   rcu_read_unlock();
+
dst_list = kmalloc(size, GFP_KERNEL);
if (!dst_list)
return -ENOMEM;
 
-   dst_list->shared_count = src_list->shared_count;
-   dst_list->shared_max = src_list->shared_count;
-   for (i = 0; i < src_list->shared_count; ++i)
-   dst_list->shared[i] =
-   dma_fence_get(src_list->shared[i]);
+   rcu_read_lock();
+   src_list = rcu_dereference(src->fence);
+   if (!src_list || src_list->shared_count > shared_count) {
+   kfree(dst_list);
+   goto retry;
+   }
+
+   dst_list->shared_count = 0;
+   dst_list->shared_max = shared_count;
+   for (i = 0; i < src_list->shared_count; ++i) {
+   struct dma_fence *fence;
+
+   fence = rcu_dereference(src_list->shared[i]);
+   if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT,
+&fence->flags))
+   continue;
+
+   if (!dma_fence_get_rcu(fence)) {
+   kfree(dst_list);
+   src_list = rcu_dereference(src->fence);
+   goto retry;
+   }
+
+   if (dma_fence_is_signaled(fence)) {
+   dma_fence_put(fence);
+   continue;
+   }
+
+   dst_list->shared[dst_list->shared_count++] = fence;
+   }
} else {
dst_list = NULL;
}
 
+   new = dma_fence_get_rcu_safe(&src->fence_excl);
+   rcu_read_unlock();
+
kfree(dst->staged);
dst->staged = NULL;
 
src_list = reservation_object_get_list(dst);
-
old = reservation_object_get_excl(dst);
-   new = reservation_object_get_excl(src);
-
-   dma_fence_get(new);
 
preempt_disable();
write_seqcount_begin(&dst->seq);
-- 
2.7.4

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


[PATCH 2/2] drm/ttm: fix ttm_bo_cleanup_refs_or_queue once more

2017-09-04 Thread Christian König
From: Christian König 

With shared reservation objects __ttm_bo_reserve() can easily fail even on
destroyed BOs. This prevents correct handling when we need to individualize
the reservation object.

Fix this by individualizing the object before even trying to reserve it.

Signed-off-by: Christian König 
---
 drivers/gpu/drm/ttm/ttm_bo.c | 32 +---
 1 file changed, 17 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 180ce62..bee77d3 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -440,28 +440,29 @@ static void ttm_bo_cleanup_refs_or_queue(struct 
ttm_buffer_object *bo)
struct ttm_bo_global *glob = bo->glob;
int ret;
 
+   ret = ttm_bo_individualize_resv(bo);
+   if (ret) {
+   /* Last resort, if we fail to allocate memory for the
+* fences block for the BO to become idle
+*/
+   reservation_object_wait_timeout_rcu(bo->resv, true, false,
+   30 * HZ);
+   spin_lock(&glob->lru_lock);
+   goto error;
+   }
+
spin_lock(&glob->lru_lock);
ret = __ttm_bo_reserve(bo, false, true, NULL);
-
if (!ret) {
-   if (!ttm_bo_wait(bo, false, true)) {
+   if (reservation_object_test_signaled_rcu(&bo->ttm_resv, true)) {
ttm_bo_del_from_lru(bo);
spin_unlock(&glob->lru_lock);
+   if (bo->resv != &bo->ttm_resv)
+   reservation_object_unlock(&bo->ttm_resv);
ttm_bo_cleanup_memtype_use(bo);
-
return;
}
 
-   ret = ttm_bo_individualize_resv(bo);
-   if (ret) {
-   /* Last resort, if we fail to allocate memory for the
-* fences block for the BO to become idle and free it.
-*/
-   spin_unlock(&glob->lru_lock);
-   ttm_bo_wait(bo, true, true);
-   ttm_bo_cleanup_memtype_use(bo);
-   return;
-   }
ttm_bo_flush_all_fences(bo);
 
/*
@@ -474,11 +475,12 @@ static void ttm_bo_cleanup_refs_or_queue(struct 
ttm_buffer_object *bo)
ttm_bo_add_to_lru(bo);
}
 
-   if (bo->resv != &bo->ttm_resv)
-   reservation_object_unlock(&bo->ttm_resv);
__ttm_bo_unreserve(bo);
}
+   if (bo->resv != &bo->ttm_resv)
+   reservation_object_unlock(&bo->ttm_resv);
 
+error:
kref_get(&bo->list_kref);
list_add_tail(&bo->ddestroy, &bdev->ddestroy);
spin_unlock(&glob->lru_lock);
-- 
2.7.4

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


Re: [PATCH libdrm] libdrm_amdgpu: add kernel semaphore support

2017-09-04 Thread Marek Olšák
On Fri, Sep 1, 2017 at 5:36 PM, Marek Olšák  wrote:
> On Thu, Jul 6, 2017 at 3:17 AM, Dave Airlie  wrote:
>> From: Dave Airlie 
>>
>> This adds kernel semaphore support to the command submission
>> interface in what should be a backwards compatible manner,
>> it adds a new command submission API.
>>
>> Signed-off-by: Dave Airlie 
>> ---
>>  amdgpu/amdgpu.h|  29 -
>>  amdgpu/amdgpu_cs.c | 118 
>> +
>>  2 files changed, 138 insertions(+), 9 deletions(-)
>>
>> diff --git a/amdgpu/amdgpu.h b/amdgpu/amdgpu.h
>> index 1901fa8..649b66e 100644
>> --- a/amdgpu/amdgpu.h
>> +++ b/amdgpu/amdgpu.h
>> @@ -369,6 +369,16 @@ struct amdgpu_cs_request {
>> struct amdgpu_cs_fence_info fence_info;
>>  };
>>
>> +struct amdgpu_cs_request_syncobj {
>> +   /*
>> +*
>> +*/
>
> Did you mean to fill in the comment here?
>
> Also, is this interface relevant with the raw CS API?

Additionally, where can I find the kernel patch for this?

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


Re: [PATCH libdrm] libdrm_amdgpu: add kernel semaphore support

2017-09-04 Thread Dave Airlie
On 2 September 2017 at 01:36, Marek Olšák  wrote:
> On Thu, Jul 6, 2017 at 3:17 AM, Dave Airlie  wrote:
>> From: Dave Airlie 
>>
>> This adds kernel semaphore support to the command submission
>> interface in what should be a backwards compatible manner,
>> it adds a new command submission API.
>>
>> Signed-off-by: Dave Airlie 
>> ---
>>  amdgpu/amdgpu.h|  29 -
>>  amdgpu/amdgpu_cs.c | 118 
>> +
>>  2 files changed, 138 insertions(+), 9 deletions(-)
>>
>> diff --git a/amdgpu/amdgpu.h b/amdgpu/amdgpu.h
>> index 1901fa8..649b66e 100644
>> --- a/amdgpu/amdgpu.h
>> +++ b/amdgpu/amdgpu.h
>> @@ -369,6 +369,16 @@ struct amdgpu_cs_request {
>> struct amdgpu_cs_fence_info fence_info;
>>  };
>>
>> +struct amdgpu_cs_request_syncobj {
>> +   /*
>> +*
>> +*/
>
> Did you mean to fill in the comment here?
>
> Also, is this interface relevant with the raw CS API?

This patch isn't required anymore. The raw CS interface replaced it.

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


Re: [PATCH libdrm] libdrm_amdgpu: add kernel semaphore support

2017-09-04 Thread Dave Airlie
On 5 September 2017 at 05:23, Marek Olšák  wrote:
> On Fri, Sep 1, 2017 at 5:36 PM, Marek Olšák  wrote:
>> On Thu, Jul 6, 2017 at 3:17 AM, Dave Airlie  wrote:
>>> From: Dave Airlie 
>>>
>>> This adds kernel semaphore support to the command submission
>>> interface in what should be a backwards compatible manner,
>>> it adds a new command submission API.
>>>
>>> Signed-off-by: Dave Airlie 
>>> ---
>>>  amdgpu/amdgpu.h|  29 -
>>>  amdgpu/amdgpu_cs.c | 118 
>>> +
>>>  2 files changed, 138 insertions(+), 9 deletions(-)
>>>
>>> diff --git a/amdgpu/amdgpu.h b/amdgpu/amdgpu.h
>>> index 1901fa8..649b66e 100644
>>> --- a/amdgpu/amdgpu.h
>>> +++ b/amdgpu/amdgpu.h
>>> @@ -369,6 +369,16 @@ struct amdgpu_cs_request {
>>> struct amdgpu_cs_fence_info fence_info;
>>>  };
>>>
>>> +struct amdgpu_cs_request_syncobj {
>>> +   /*
>>> +*
>>> +*/
>>
>> Did you mean to fill in the comment here?
>>
>> Also, is this interface relevant with the raw CS API?
>
> Additionally, where can I find the kernel patch for this?

In the kernel. :-)

https://lists.freedesktop.org/archives/dri-devel/2017-June/143206.html

was the one that was committed,

660e855813f78b7fe63ff1ebc4f2ca07d94add0b is the git sha1.

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


[PATCH 4/4] drm/amd/powerplay: delete dead code in powerplay

2017-09-04 Thread Rex Zhu
delete functiontable related codes

Change-Id: If4bba21beaf3e7fe100eb80def28f83f3b8ef077
Signed-off-by: Rex Zhu 
---
 drivers/gpu/drm/amd/powerplay/hwmgr/Makefile   |   2 +-
 drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c |   3 +-
 .../gpu/drm/amd/powerplay/hwmgr/functiontables.c   | 161 -
 .../gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c  |  82 +++
 drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c|  12 --
 drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.c |   3 -
 drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c |   3 -
 drivers/gpu/drm/amd/powerplay/inc/hwmgr.h  |  48 --
 8 files changed, 22 insertions(+), 292 deletions(-)
 delete mode 100644 drivers/gpu/drm/amd/powerplay/hwmgr/functiontables.c

diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/Makefile 
b/drivers/gpu/drm/amd/powerplay/hwmgr/Makefile
index 79119d6..dc4bbcf 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/Makefile
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/Makefile
@@ -2,7 +2,7 @@
 # Makefile for the 'hw manager' sub-component of powerplay.
 # It provides the hardware management services for the driver.
 
-HARDWARE_MGR = hwmgr.o processpptables.o functiontables.o \
+HARDWARE_MGR = hwmgr.o processpptables.o \
hardwaremanager.o pp_acpi.o cz_hwmgr.o \
cz_clockpowergating.o pppcielanes.o\
process_pptables_v1_0.o ppatomctrl.o ppatomfwctrl.o \
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c
index 7efe008..d3b4646 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c
@@ -1142,8 +1142,7 @@ static int cz_hwmgr_backend_init(struct pp_hwmgr *hwmgr)
return -ENOMEM;
 
hwmgr->backend = data;
-   phm_cap_set(hwmgr->platform_descriptor.platformCaps,
-   PHM_PlatformCaps_TablelessHardwareInterface);
+
result = cz_initialize_dpm_defaults(hwmgr);
if (result != 0) {
pr_err("cz_initialize_dpm_defaults failed\n");
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/functiontables.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/functiontables.c
deleted file mode 100644
index bc7d8bd..000
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/functiontables.c
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright 2015 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-#include 
-#include 
-#include 
-#include "hwmgr.h"
-
-static int phm_run_table(struct pp_hwmgr *hwmgr,
-struct phm_runtime_table_header *rt_table,
-void *input,
-void *output,
-void *temp_storage)
-{
-   int result = 0;
-   phm_table_function *function;
-
-   if (rt_table->function_list == NULL) {
-   pr_debug("this function not implement!\n");
-   return 0;
-   }
-
-   for (function = rt_table->function_list; NULL != *function; function++) 
{
-   int tmp = (*function)(hwmgr, input, output, temp_storage, 
result);
-
-   if (tmp == PP_Result_TableImmediateExit)
-   break;
-   if (tmp) {
-   if (0 == result)
-   result = tmp;
-   if (rt_table->exit_error)
-   break;
-   }
-   }
-
-   return result;
-}
-
-int phm_dispatch_table(struct pp_hwmgr *hwmgr,
-  struct phm_runtime_table_header *rt_table,
-  void *input, void *output)
-{
-   int result;
-   void *temp_storage;
-
-   if (hwmgr == NULL || rt_table == NULL) {
-   pr_err("Invalid Parameter!\n");
-   return -EINVAL;
-   }
-
-   if (0 != rt_table->storage_size) {
-   temp_storage = kzalloc(rt_table->storage_siz

[PATCH 2/4] drm/amd/powerplay: refine powerplay code for CZ/ST

2017-09-04 Thread Rex Zhu
1. add function points instand of creat function tables
2. implement stop dpm tasks for CZ/ST

Change-Id: Ibe6fc92b989ba125da34857ce8b056e8b699b41b
Signed-off-by: Rex Zhu 
---
 .../drm/amd/powerplay/hwmgr/cz_clockpowergating.c  |  30 --
 drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c | 377 +
 2 files changed, 159 insertions(+), 248 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c
index b33935f..5baf1a4 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c
@@ -103,16 +103,6 @@ int cz_phm_ungate_all_display_phys(struct pp_hwmgr *hwmgr)
return 0;
 }
 
-static int cz_tf_uvd_power_gating_initialize(struct pp_hwmgr *hwmgr, void 
*pInput, void *pOutput, void *pStorage, int Result)
-{
-   return 0;
-}
-
-static int cz_tf_vce_power_gating_initialize(struct pp_hwmgr *hwmgr, void 
*pInput, void *pOutput, void *pStorage, int Result)
-{
-   return 0;
-}
-
 int cz_enable_disable_uvd_dpm(struct pp_hwmgr *hwmgr, bool enable)
 {
struct cz_hwmgr *cz_hwmgr = (struct cz_hwmgr *)(hwmgr->backend);
@@ -221,23 +211,3 @@ int cz_dpm_powergate_vce(struct pp_hwmgr *hwmgr, bool 
bgate)
return 0;
 }
 
-
-static const struct phm_master_table_item cz_enable_clock_power_gatings_list[] 
= {
-   /*we don't need an exit table here, because there is only D3 cold on 
Kv*/
-   {
- .isFunctionNeededInRuntimeTable = phm_cf_want_uvd_power_gating,
- .tableFunction = cz_tf_uvd_power_gating_initialize
-   },
-   {
- .isFunctionNeededInRuntimeTable = phm_cf_want_vce_power_gating,
- .tableFunction = cz_tf_vce_power_gating_initialize
-   },
-   /* to do { NULL, cz_tf_xdma_power_gating_enable }, */
-   { }
-};
-
-const struct phm_master_table_header cz_phm_enable_clock_power_gatings_master 
= {
-   0,
-   PHM_MasterTableFlag_None,
-   cz_enable_clock_power_gatings_list
-};
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c
index 7f3b24f..7efe008 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c
@@ -440,14 +440,7 @@ static int cz_construct_boot_state(struct pp_hwmgr *hwmgr)
return 0;
 }
 
-static int cz_tf_reset_active_process_mask(struct pp_hwmgr *hwmgr, void *input,
-   void *output, void *storage, int result)
-{
-   return 0;
-}
-
-static int cz_tf_upload_pptable_to_smu(struct pp_hwmgr *hwmgr, void *input,
-  void *output, void *storage, int result)
+static int cz_upload_pptable_to_smu(struct pp_hwmgr *hwmgr)
 {
struct SMU8_Fusion_ClkTable *clock_table;
int ret;
@@ -566,8 +559,7 @@ static int cz_tf_upload_pptable_to_smu(struct pp_hwmgr 
*hwmgr, void *input,
return ret;
 }
 
-static int cz_tf_init_sclk_limit(struct pp_hwmgr *hwmgr, void *input,
-void *output, void *storage, int result)
+static int cz_init_sclk_limit(struct pp_hwmgr *hwmgr)
 {
struct cz_hwmgr *cz_hwmgr = (struct cz_hwmgr *)(hwmgr->backend);
struct phm_clock_voltage_dependency_table *table =
@@ -593,8 +585,7 @@ static int cz_tf_init_sclk_limit(struct pp_hwmgr *hwmgr, 
void *input,
return 0;
 }
 
-static int cz_tf_init_uvd_limit(struct pp_hwmgr *hwmgr, void *input,
-   void *output, void *storage, int result)
+static int cz_init_uvd_limit(struct pp_hwmgr *hwmgr)
 {
struct cz_hwmgr *cz_hwmgr = (struct cz_hwmgr *)(hwmgr->backend);
struct phm_uvd_clock_voltage_dependency_table *table =
@@ -621,8 +612,7 @@ static int cz_tf_init_uvd_limit(struct pp_hwmgr *hwmgr, 
void *input,
return 0;
 }
 
-static int cz_tf_init_vce_limit(struct pp_hwmgr *hwmgr, void *input,
-   void *output, void *storage, int result)
+static int cz_init_vce_limit(struct pp_hwmgr *hwmgr)
 {
struct cz_hwmgr *cz_hwmgr = (struct cz_hwmgr *)(hwmgr->backend);
struct phm_vce_clock_voltage_dependency_table *table =
@@ -649,8 +639,7 @@ static int cz_tf_init_vce_limit(struct pp_hwmgr *hwmgr, 
void *input,
return 0;
 }
 
-static int cz_tf_init_acp_limit(struct pp_hwmgr *hwmgr, void *input,
-   void *output, void *storage, int result)
+static int cz_init_acp_limit(struct pp_hwmgr *hwmgr)
 {
struct cz_hwmgr *cz_hwmgr = (struct cz_hwmgr *)(hwmgr->backend);
struct phm_acp_clock_voltage_dependency_table *table =
@@ -676,8 +665,7 @@ static int cz_tf_init_acp_limit(struct pp_hwmgr *hwmgr, 
void *input,
return 0;
 }
 
-static int cz_tf_init_power_gate_state(struct pp_hwmgr *hwmgr, void *input,
-   void *output, void *storage, int result)
+static void cz_init_power_gate_state(struct 

[PATCH 3/4] drm/amd/powerplay: refine powerplay code for RV

2017-09-04 Thread Rex Zhu
use function points instand of function table.

Change-Id: Ic3a4fc1492dcb33884c32a70ec9b2013b412d52a
Signed-off-by: Rex Zhu 
---
 drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.c | 137 ++---
 1 file changed, 33 insertions(+), 104 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.c
index d5a9c07..da74f95 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.c
@@ -157,8 +157,7 @@ static int rv_construct_boot_state(struct pp_hwmgr *hwmgr)
return 0;
 }
 
-static int rv_tf_set_clock_limit(struct pp_hwmgr *hwmgr, void *input,
-   void *output, void *storage, int result)
+static int rv_set_clock_limit(struct pp_hwmgr *hwmgr, const void *input)
 {
struct rv_hwmgr *rv_data = (struct rv_hwmgr *)(hwmgr->backend);
struct PP_Clocks clocks = {0};
@@ -234,19 +233,12 @@ static int rv_set_active_display_count(struct pp_hwmgr 
*hwmgr, uint32_t count)
return 0;
 }
 
-static const struct phm_master_table_item rv_set_power_state_list[] = {
-   { NULL, rv_tf_set_clock_limit },
-   { }
-};
-
-static const struct phm_master_table_header rv_set_power_state_master = {
-   0,
-   PHM_MasterTableFlag_None,
-   rv_set_power_state_list
-};
+static int rv_set_power_state_tasks(struct pp_hwmgr *hwmgr, const void *input)
+{
+   return rv_set_clock_limit(hwmgr, input);
+}
 
-static int rv_tf_init_power_gate_state(struct pp_hwmgr *hwmgr, void *input,
-   void *output, void *storage, int result)
+static int rv_init_power_gate_state(struct pp_hwmgr *hwmgr)
 {
struct rv_hwmgr *rv_data = (struct rv_hwmgr *)(hwmgr->backend);
 
@@ -257,20 +249,13 @@ static int rv_tf_init_power_gate_state(struct pp_hwmgr 
*hwmgr, void *input,
return 0;
 }
 
-static const struct phm_master_table_item rv_setup_asic_list[] = {
-   { .tableFunction = rv_tf_init_power_gate_state },
-   { }
-};
 
-static const struct phm_master_table_header rv_setup_asic_master = {
-   0,
-   PHM_MasterTableFlag_None,
-   rv_setup_asic_list
-};
+static int rv_setup_asic_task(struct pp_hwmgr *hwmgr)
+{
+   return rv_init_power_gate_state(hwmgr);
+}
 
-static int rv_tf_reset_cc6_data(struct pp_hwmgr *hwmgr,
-   void *input, void *output,
-   void *storage, int result)
+static int rv_reset_cc6_data(struct pp_hwmgr *hwmgr)
 {
struct rv_hwmgr *rv_data = (struct rv_hwmgr *)(hwmgr->backend);
 
@@ -282,21 +267,12 @@ static int rv_tf_reset_cc6_data(struct pp_hwmgr *hwmgr,
return 0;
 }
 
-static const struct phm_master_table_item rv_power_down_asic_list[] = {
-   { .tableFunction = rv_tf_reset_cc6_data },
-   { }
-};
-
-static const struct phm_master_table_header rv_power_down_asic_master = {
-   0,
-   PHM_MasterTableFlag_None,
-   rv_power_down_asic_list
-};
-
+static int rv_power_off_asic(struct pp_hwmgr *hwmgr)
+{
+   return rv_reset_cc6_data(hwmgr);
+}
 
-static int rv_tf_disable_gfx_off(struct pp_hwmgr *hwmgr,
-   void *input, void *output,
-   void *storage, int result)
+static int rv_disable_gfx_off(struct pp_hwmgr *hwmgr)
 {
struct rv_hwmgr *rv_data = (struct rv_hwmgr *)(hwmgr->backend);
 
@@ -307,21 +283,12 @@ static int rv_tf_disable_gfx_off(struct pp_hwmgr *hwmgr,
return 0;
 }
 
-static const struct phm_master_table_item rv_disable_dpm_list[] = {
-   {NULL, rv_tf_disable_gfx_off},
-   { },
-};
-
-
-static const struct phm_master_table_header rv_disable_dpm_master = {
-   0,
-   PHM_MasterTableFlag_None,
-   rv_disable_dpm_list
-};
+static int rv_disable_dpm_tasks(struct pp_hwmgr *hwmgr)
+{
+   return rv_disable_gfx_off(hwmgr);
+}
 
-static int rv_tf_enable_gfx_off(struct pp_hwmgr *hwmgr,
-   void *input, void *output,
-   void *storage, int result)
+static int rv_enable_gfx_off(struct pp_hwmgr *hwmgr)
 {
struct rv_hwmgr *rv_data = (struct rv_hwmgr *)(hwmgr->backend);
 
@@ -332,16 +299,10 @@ static int rv_tf_enable_gfx_off(struct pp_hwmgr *hwmgr,
return 0;
 }
 
-static const struct phm_master_table_item rv_enable_dpm_list[] = {
-   {NULL, rv_tf_enable_gfx_off},
-   { },
-};
-
-static const struct phm_master_table_header rv_enable_dpm_master = {
-   0,
-   PHM_MasterTableFlag_None,
-   rv_enable_dpm_list
-};
+static int rv_enable_dpm_tasks(struct pp_hwmgr *hwmgr)
+{
+   return rv_enable_gfx_off(hwmgr);
+}
 
 static int rv_apply_state_adjust_rules(struct pp_hwmgr *hwmgr,
struct pp_power_state  *prequest_ps,
@@ -474,6 +435,9 @@ static int rv_hwmgr_backend_init(struct pp_hwmgr *hwmgr)
 
hwmgr->ba

[PATCH 1/4] drm/amd/powerplay: refine code for thermal control in powerplay

2017-09-04 Thread Rex Zhu
add function point start_thermal_controller in hwmgr,
delete thermal function table and related functions

Change-Id: I61db5b7e37d75fdc55acd570369ca833b5346d01
Signed-off-by: Rex Zhu 
---
 .../gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c  |   6 +-
 drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c|   1 +
 drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c   |   4 +-
 drivers/gpu/drm/amd/powerplay/hwmgr/smu7_thermal.c | 148 +++--
 drivers/gpu/drm/amd/powerplay/hwmgr/smu7_thermal.h |   5 +-
 drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c |   2 +-
 .../gpu/drm/amd/powerplay/hwmgr/vega10_thermal.c   | 137 +++
 .../gpu/drm/amd/powerplay/hwmgr/vega10_thermal.h   |  13 +-
 drivers/gpu/drm/amd/powerplay/inc/hwmgr.h  |   3 +-
 drivers/gpu/drm/amd/powerplay/inc/smumgr.h |   6 +-
 drivers/gpu/drm/amd/powerplay/smumgr/smumgr.c  |   6 +-
 11 files changed, 55 insertions(+), 276 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c
index ce378bd..a3991c0 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c
@@ -306,8 +306,10 @@ int phm_start_thermal_controller(struct pp_hwmgr *hwmgr, 
struct PP_TemperatureRa
range.min = temperature_range->min;
}
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
-   PHM_PlatformCaps_ThermalController))
-   return phm_dispatch_table(hwmgr, 
&(hwmgr->start_thermal_controller), &range, NULL);
+   PHM_PlatformCaps_ThermalController)
+   && hwmgr->hwmgr_func->start_thermal_controller != NULL)
+   return hwmgr->hwmgr_func->start_thermal_controller(hwmgr, 
&range);
+
return 0;
 }
 
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
index 19b6f11..f0d0d1f 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
@@ -73,6 +73,7 @@ int hwmgr_early_init(struct pp_instance *handle)
hwmgr->dpm_level = AMD_DPM_FORCED_LEVEL_AUTO;
hwmgr_init_default_caps(hwmgr);
hwmgr_set_user_specify_caps(hwmgr);
+   hwmgr->fan_ctrl_is_in_default_mode = true;
 
switch (hwmgr->chip_family) {
case AMDGPU_FAMILY_CZ:
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
index 7894978..781a05e 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
@@ -2284,7 +2284,6 @@ static int smu7_hwmgr_backend_fini(struct pp_hwmgr *hwmgr)
 {
kfree(hwmgr->dyn_state.vddc_dep_on_dal_pwrl);
hwmgr->dyn_state.vddc_dep_on_dal_pwrl = NULL;
-   pp_smu7_thermal_fini(hwmgr);
kfree(hwmgr->backend);
hwmgr->backend = NULL;
 
@@ -2301,8 +2300,6 @@ static int smu7_hwmgr_backend_init(struct pp_hwmgr *hwmgr)
return -ENOMEM;
 
hwmgr->backend = data;
-   pp_smu7_thermal_initialize(hwmgr);
-
smu7_patch_voltage_workaround(hwmgr);
smu7_init_dpm_defaults(hwmgr);
 
@@ -4660,6 +4657,7 @@ static int smu7_avfs_control(struct pp_hwmgr *hwmgr, bool 
enable)
.set_power_profile_state = smu7_set_power_profile_state,
.avfs_control = smu7_avfs_control,
.disable_smc_firmware_ctf = smu7_thermal_disable_alert,
+   .start_thermal_controller = smu7_start_thermal_controller,
 };
 
 uint8_t smu7_get_sleep_divider_id_from_clock(uint32_t clock,
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_thermal.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_thermal.c
index baddb56..da9e842 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_thermal.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_thermal.c
@@ -367,7 +367,7 @@ static int smu7_thermal_initialize(struct pp_hwmgr *hwmgr)
 *
 * @paramhwmgr The address of the hardware manager.
 */
-int smu7_thermal_enable_alert(struct pp_hwmgr *hwmgr)
+static void smu7_thermal_enable_alert(struct pp_hwmgr *hwmgr)
 {
uint32_t alert;
 
@@ -378,7 +378,7 @@ int smu7_thermal_enable_alert(struct pp_hwmgr *hwmgr)
CG_THERMAL_INT, THERM_INT_MASK, alert);
 
/* send message to SMU to enable internal thermal interrupts */
-   return smum_send_msg_to_smc(hwmgr->smumgr, 
PPSMC_MSG_Thermal_Cntl_Enable);
+   smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_Thermal_Cntl_Enable);
 }
 
 /**
@@ -423,8 +423,7 @@ int smu7_thermal_stop_thermal_controller(struct pp_hwmgr 
*hwmgr)
 * @paramResult the last failure code
 * @return   result from set temperature range routine
 */
-static int tf_smu7_thermal_start_smc_fan_control(struct pp_hwmgr *hwmgr,
-   void *input, void *output, void *storage, int result)
+static int smu7_thermal_start_smc_fan_control(struct pp_hwmgr *hwmgr)
 {
 /* If the