* [PATCH 1/3] drm/amdgpu: add vcpu_bo cpu address
@ 2017-05-31 19:28 Leo Liu
[not found] ` <20170531192826.17571-1-leo.liu-5C7GfCeVMHo@public.gmane.org>
0 siblings, 1 reply; 9+ messages in thread
From: Leo Liu @ 2017-05-31 19:28 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Leo Liu
Signed-off-by: Leo Liu <leo.liu@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
index 0a7f18c..c93f74a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
@@ -33,6 +33,7 @@
struct amdgpu_vce {
struct amdgpu_bo *vcpu_bo;
uint64_t gpu_addr;
+ void *cpu_addr;
unsigned fw_version;
unsigned fb_version;
atomic_t handles[AMDGPU_MAX_VCE_HANDLES];
--
2.7.4
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/3] drm/amdgpu: use existing function amdgpu_bo_create_kernel
[not found] ` <20170531192826.17571-1-leo.liu-5C7GfCeVMHo@public.gmane.org>
@ 2017-05-31 19:28 ` Leo Liu
[not found] ` <20170531192826.17571-2-leo.liu-5C7GfCeVMHo@public.gmane.org>
2017-05-31 19:28 ` [PATCH 3/3] drm/amdgpu: add saved_bo to save vce 4.0 context when suspend Leo Liu
2017-05-31 21:00 ` Leo Liu
2 siblings, 1 reply; 9+ messages in thread
From: Leo Liu @ 2017-05-31 19:28 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Leo Liu
To simplify vce bo create
Signed-off-by: Leo Liu <leo.liu@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 27 +++------------------------
1 file changed, 3 insertions(+), 24 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
index 735c38d..b9b0906 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
@@ -165,35 +165,14 @@ int amdgpu_vce_sw_init(struct amdgpu_device *adev, unsigned long size)
adev->vce.fw_version = ((version_major << 24) | (version_minor << 16) |
(binary_id << 8));
- /* allocate firmware, stack and heap BO */
-
- r = amdgpu_bo_create(adev, size, PAGE_SIZE, true,
- AMDGPU_GEM_DOMAIN_VRAM,
- AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
- AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS,
- NULL, NULL, &adev->vce.vcpu_bo);
+ r = amdgpu_bo_create_kernel(adev, size, PAGE_SIZE,
+ AMDGPU_GEM_DOMAIN_VRAM, &adev->vce.vcpu_bo,
+ &adev->vce.gpu_addr, &adev->vce.cpu_addr);
if (r) {
dev_err(adev->dev, "(%d) failed to allocate VCE bo\n", r);
return r;
}
- r = amdgpu_bo_reserve(adev->vce.vcpu_bo, false);
- if (r) {
- amdgpu_bo_unref(&adev->vce.vcpu_bo);
- dev_err(adev->dev, "(%d) failed to reserve VCE bo\n", r);
- return r;
- }
-
- r = amdgpu_bo_pin(adev->vce.vcpu_bo, AMDGPU_GEM_DOMAIN_VRAM,
- &adev->vce.gpu_addr);
- amdgpu_bo_unreserve(adev->vce.vcpu_bo);
- if (r) {
- amdgpu_bo_unref(&adev->vce.vcpu_bo);
- dev_err(adev->dev, "(%d) VCE bo pin failed\n", r);
- return r;
- }
-
-
ring = &adev->vce.ring[0];
rq = &ring->sched.sched_rq[AMD_SCHED_PRIORITY_NORMAL];
r = amd_sched_entity_init(&ring->sched, &adev->vce.entity,
--
2.7.4
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/3] drm/amdgpu: add saved_bo to save vce 4.0 context when suspend
[not found] ` <20170531192826.17571-1-leo.liu-5C7GfCeVMHo@public.gmane.org>
2017-05-31 19:28 ` [PATCH 2/3] drm/amdgpu: use existing function amdgpu_bo_create_kernel Leo Liu
@ 2017-05-31 19:28 ` Leo Liu
[not found] ` <20170531192826.17571-3-leo.liu-5C7GfCeVMHo@public.gmane.org>
2017-05-31 21:00 ` Leo Liu
2 siblings, 1 reply; 9+ messages in thread
From: Leo Liu @ 2017-05-31 19:28 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Leo Liu
We are using PSP to resume firmware after suspend, and it is
resumed at where it got suspended, so we'd better save the
the context.
Signed-off-by: Leo Liu <leo.liu@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h | 1 +
drivers/gpu/drm/amd/amdgpu/vce_v4_0.c | 39 ++++++++++++++++++++++++++++-----
2 files changed, 35 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
index c93f74a..5ce54cd 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
@@ -34,6 +34,7 @@ struct amdgpu_vce {
struct amdgpu_bo *vcpu_bo;
uint64_t gpu_addr;
void *cpu_addr;
+ void *saved_bo;
unsigned fw_version;
unsigned fb_version;
atomic_t handles[AMDGPU_MAX_VCE_HANDLES];
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
index 0b7fcc1..2230a99 100644
--- a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
@@ -522,8 +522,22 @@ static int vce_v4_0_hw_fini(void *handle)
static int vce_v4_0_suspend(void *handle)
{
- int r;
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+ int r;
+
+ if (adev->vce.vcpu_bo == NULL)
+ return 0;
+
+ if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
+ unsigned size = amdgpu_bo_size(adev->vce.vcpu_bo);
+ void *ptr = adev->vce.cpu_addr;
+
+ adev->vce.saved_bo = kmalloc(size, GFP_KERNEL);
+ if (!adev->vce.saved_bo)
+ return -ENOMEM;
+
+ memcpy_fromio(adev->vce.saved_bo, ptr, size);
+ }
r = vce_v4_0_hw_fini(adev);
if (r)
@@ -534,12 +548,27 @@ static int vce_v4_0_suspend(void *handle)
static int vce_v4_0_resume(void *handle)
{
- int r;
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+ int r;
- r = amdgpu_vce_resume(adev);
- if (r)
- return r;
+ if (adev->vce.vcpu_bo == NULL)
+ return -EINVAL;
+
+ if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
+ unsigned size = amdgpu_bo_size(adev->vce.vcpu_bo);
+ void *ptr = adev->vce.cpu_addr;
+
+ if (adev->vce.saved_bo != NULL) {
+ memcpy_toio(ptr, adev->vce.saved_bo, size);
+ kfree(adev->vce.saved_bo);
+ adev->vce.saved_bo = NULL;
+ } else
+ memset_io(ptr, 0, size);
+ } else {
+ r = amdgpu_vce_resume(adev);
+ if (r)
+ return r;
+ }
return vce_v4_0_hw_init(adev);
}
--
2.7.4
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 9+ messages in thread
* RE: [PATCH 3/3] drm/amdgpu: add saved_bo to save vce 4.0 context when suspend
[not found] ` <20170531192826.17571-3-leo.liu-5C7GfCeVMHo@public.gmane.org>
@ 2017-05-31 19:54 ` Deucher, Alexander
[not found] ` <BN6PR12MB1652D083E4A3123CFE3B3628F7F10-/b2+HYfkarQqUD6E6FAiowdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
0 siblings, 1 reply; 9+ messages in thread
From: Deucher, Alexander @ 2017-05-31 19:54 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Liu, Leo
> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-bounces@lists.freedesktop.org] On Behalf
> Of Leo Liu
> Sent: Wednesday, May 31, 2017 3:28 PM
> To: amd-gfx@lists.freedesktop.org
> Cc: Liu, Leo
> Subject: [PATCH 3/3] drm/amdgpu: add saved_bo to save vce 4.0 context
> when suspend
>
> We are using PSP to resume firmware after suspend, and it is
> resumed at where it got suspended, so we'd better save the
> the context.
>
> Signed-off-by: Leo Liu <leo.liu@amd.com>
Patches 1, 2 are:
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
A few comments below on patch 3.
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h | 1 +
> drivers/gpu/drm/amd/amdgpu/vce_v4_0.c | 39
> ++++++++++++++++++++++++++++-----
> 2 files changed, 35 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
> index c93f74a..5ce54cd 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
> @@ -34,6 +34,7 @@ struct amdgpu_vce {
> struct amdgpu_bo *vcpu_bo;
> uint64_t gpu_addr;
> void *cpu_addr;
> + void *saved_bo;
> unsigned fw_version;
> unsigned fb_version;
> atomic_t handles[AMDGPU_MAX_VCE_HANDLES];
> diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
> b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
> index 0b7fcc1..2230a99 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
> @@ -522,8 +522,22 @@ static int vce_v4_0_hw_fini(void *handle)
>
> static int vce_v4_0_suspend(void *handle)
> {
> - int r;
> struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> + int r;
> +
> + if (adev->vce.vcpu_bo == NULL)
> + return 0;
> +
> + if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
> + unsigned size = amdgpu_bo_size(adev->vce.vcpu_bo);
> + void *ptr = adev->vce.cpu_addr;
> +
> + adev->vce.saved_bo = kmalloc(size, GFP_KERNEL);
Might want to avoid malloc/free in the suspend/resume paths. Just malloc/free the memory at sw_init/fini time.
> + if (!adev->vce.saved_bo)
> + return -ENOMEM;
> +
> + memcpy_fromio(adev->vce.saved_bo, ptr, size);
> + }
>
> r = vce_v4_0_hw_fini(adev);
> if (r)
> @@ -534,12 +548,27 @@ static int vce_v4_0_suspend(void *handle)
>
> static int vce_v4_0_resume(void *handle)
> {
> - int r;
> struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> + int r;
>
> - r = amdgpu_vce_resume(adev);
> - if (r)
> - return r;
> + if (adev->vce.vcpu_bo == NULL)
> + return -EINVAL;
> +
> + if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
> + unsigned size = amdgpu_bo_size(adev->vce.vcpu_bo);
> + void *ptr = adev->vce.cpu_addr;
> +
> + if (adev->vce.saved_bo != NULL) {
> + memcpy_toio(ptr, adev->vce.saved_bo, size);
> + kfree(adev->vce.saved_bo);
> + adev->vce.saved_bo = NULL;
> + } else
Kernel coding style; should be } else { ... } to match the chunk above.
> + memset_io(ptr, 0, size);
> + } else {
> + r = amdgpu_vce_resume(adev);
> + if (r)
> + return r;
> + }
>
> return vce_v4_0_hw_init(adev);
> }
> --
> 2.7.4
>
> _______________________________________________
> 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
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 3/3] drm/amdgpu: add saved_bo to save vce 4.0 context when suspend
[not found] ` <BN6PR12MB1652D083E4A3123CFE3B3628F7F10-/b2+HYfkarQqUD6E6FAiowdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
@ 2017-05-31 20:06 ` Leo Liu
0 siblings, 0 replies; 9+ messages in thread
From: Leo Liu @ 2017-05-31 20:06 UTC (permalink / raw)
To: Deucher, Alexander, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
[-- Attachment #1.1: Type: text/plain, Size: 4216 bytes --]
On 05/31/2017 03:54 PM, Deucher, Alexander wrote:
> > -----Original Message-----
> > From: amd-gfx [mailto:amd-gfx-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org] On Behalf
> > Of Leo Liu
> > Sent: Wednesday, May 31, 2017 3:28 PM
> > To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
> > Cc: Liu, Leo
> > Subject: [PATCH 3/3] drm/amdgpu: add saved_bo to save vce 4.0 context
> > when suspend
> >
> > We are using PSP to resume firmware after suspend, and it is
> > resumed at where it got suspended, so we'd better save the
> > the context.
> >
> > Signed-off-by: Leo Liu <leo.liu-5C7GfCeVMHo@public.gmane.org>
>
> Patches 1, 2 are:
> Reviewed-by: Alex Deucher <alexander.deucher-5C7GfCeVMHo@public.gmane.org>
> A few comments below on patch 3.
>
>
> > ---
> > drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h | 1 +
> > drivers/gpu/drm/amd/amdgpu/vce_v4_0.c | 39
> > ++++++++++++++++++++++++++++-----
> > 2 files changed, 35 insertions(+), 5 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
> > b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
> > index c93f74a..5ce54cd 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
> > @@ -34,6 +34,7 @@ struct amdgpu_vce {
> > struct amdgpu_bo *vcpu_bo;
> > uint64_t gpu_addr;
> > void *cpu_addr;
> > + void *saved_bo;
> > unsigned fw_version;
> > unsigned fb_version;
> > atomic_t handles[AMDGPU_MAX_VCE_HANDLES];
> > diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
> > b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
> > index 0b7fcc1..2230a99 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
> > @@ -522,8 +522,22 @@ static int vce_v4_0_hw_fini(void *handle)
> >
> > static int vce_v4_0_suspend(void *handle)
> > {
> > - int r;
> > struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> > + int r;
> > +
> > + if (adev->vce.vcpu_bo == NULL)
> > + return 0;
> > +
> > + if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
> > + unsigned size = amdgpu_bo_size(adev->vce.vcpu_bo);
> > + void *ptr = adev->vce.cpu_addr;
> > +
> > + adev->vce.saved_bo = kmalloc(size, GFP_KERNEL);
>
> Might want to avoid malloc/free in the suspend/resume paths. Just
> malloc/free the memory at sw_init/fini time.
Just waste a bit memory if it never goes to suspend, but sure, I will
fix it in v2.
Thanks,
Leo
>
> > + if (!adev->vce.saved_bo)
> > + return -ENOMEM;
> > +
> > + memcpy_fromio(adev->vce.saved_bo, ptr, size);
> > + }
> >
> > r = vce_v4_0_hw_fini(adev);
> > if (r)
> > @@ -534,12 +548,27 @@ static int vce_v4_0_suspend(void *handle)
> >
> > static int vce_v4_0_resume(void *handle)
> > {
> > - int r;
> > struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> > + int r;
> >
> > - r = amdgpu_vce_resume(adev);
> > - if (r)
> > - return r;
> > + if (adev->vce.vcpu_bo == NULL)
> > + return -EINVAL;
> > +
> > + if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
> > + unsigned size = amdgpu_bo_size(adev->vce.vcpu_bo);
> > + void *ptr = adev->vce.cpu_addr;
> > +
> > + if (adev->vce.saved_bo != NULL) {
> > + memcpy_toio(ptr, adev->vce.saved_bo, size);
> > + kfree(adev->vce.saved_bo);
> > + adev->vce.saved_bo = NULL;
> > + } else
>
> Kernel coding style; should be } else { ... } to match the chunk above.
>
> > + memset_io(ptr, 0, size);
> > + } else {
> > + r = amdgpu_vce_resume(adev);
> > + if (r)
> > + return r;
> > + }
> >
> > return vce_v4_0_hw_init(adev);
> > }
> > --
> > 2.7.4
> >
> > _______________________________________________
> > amd-gfx mailing list
> > amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
> > https://lists.freedesktop.org/mailman/listinfo/amd-gfx
[-- Attachment #1.2: Type: text/html, Size: 8783 bytes --]
[-- Attachment #2: Type: text/plain, Size: 154 bytes --]
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 3/3] drm/amdgpu: add saved_bo to save vce 4.0 context when suspend
[not found] ` <20170531192826.17571-1-leo.liu-5C7GfCeVMHo@public.gmane.org>
2017-05-31 19:28 ` [PATCH 2/3] drm/amdgpu: use existing function amdgpu_bo_create_kernel Leo Liu
2017-05-31 19:28 ` [PATCH 3/3] drm/amdgpu: add saved_bo to save vce 4.0 context when suspend Leo Liu
@ 2017-05-31 21:00 ` Leo Liu
[not found] ` <20170531210040.20919-1-leo.liu-5C7GfCeVMHo@public.gmane.org>
2 siblings, 1 reply; 9+ messages in thread
From: Leo Liu @ 2017-05-31 21:00 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Leo Liu
We are using PSP to resume firmware after suspend, and it is
resumed at where it got suspended, so we'd better save the
the context.
Signed-off-by: Leo Liu <leo.liu@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h | 1 +
drivers/gpu/drm/amd/amdgpu/vce_v4_0.c | 45 +++++++++++++++++++++++++++------
2 files changed, 38 insertions(+), 8 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
index f5f35cc..f83e0c3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
@@ -34,6 +34,7 @@ struct amdgpu_vce {
struct amdgpu_bo *vcpu_bo;
uint64_t gpu_addr;
void *cpu_addr;
+ void *saved_bo;
unsigned fw_version;
unsigned fb_version;
atomic_t handles[AMDGPU_MAX_VCE_HANDLES];
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
index ada2d0a..5229593 100644
--- a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
@@ -419,15 +419,19 @@ static int vce_v4_0_sw_init(void *handle)
if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
const struct common_firmware_header *hdr;
+ unsigned size = amdgpu_bo_size(adev->vce.vcpu_bo);
+
+ adev->vce.saved_bo = kmalloc(size, GFP_KERNEL);
+ if (!adev->vce.saved_bo)
+ return -ENOMEM;
+
hdr = (const struct common_firmware_header *)adev->vce.fw->data;
adev->firmware.ucode[AMDGPU_UCODE_ID_VCE].ucode_id = AMDGPU_UCODE_ID_VCE;
adev->firmware.ucode[AMDGPU_UCODE_ID_VCE].fw = adev->vce.fw;
adev->firmware.fw_size +=
ALIGN(le32_to_cpu(hdr->ucode_size_bytes), PAGE_SIZE);
DRM_INFO("PSP loading VCE firmware\n");
- }
-
- if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) {
+ } else {
r = amdgpu_vce_resume(adev);
if (r)
return r;
@@ -466,6 +470,11 @@ static int vce_v4_0_sw_fini(void *handle)
/* free MM table */
amdgpu_virt_free_mm_table(adev);
+ if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
+ kfree(adev->vce.saved_bo);
+ adev->vce.saved_bo = NULL;
+ }
+
r = amdgpu_vce_suspend(adev);
if (r)
return r;
@@ -522,8 +531,18 @@ static int vce_v4_0_hw_fini(void *handle)
static int vce_v4_0_suspend(void *handle)
{
- int r;
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+ int r;
+
+ if (adev->vce.vcpu_bo == NULL)
+ return 0;
+
+ if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
+ unsigned size = amdgpu_bo_size(adev->vce.vcpu_bo);
+ void *ptr = adev->vce.cpu_addr;
+
+ memcpy_fromio(adev->vce.saved_bo, ptr, size);
+ }
r = vce_v4_0_hw_fini(adev);
if (r)
@@ -534,12 +553,22 @@ static int vce_v4_0_suspend(void *handle)
static int vce_v4_0_resume(void *handle)
{
- int r;
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+ int r;
- r = amdgpu_vce_resume(adev);
- if (r)
- return r;
+ if (adev->vce.vcpu_bo == NULL)
+ return -EINVAL;
+
+ if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
+ unsigned size = amdgpu_bo_size(adev->vce.vcpu_bo);
+ void *ptr = adev->vce.cpu_addr;
+
+ memcpy_toio(ptr, adev->vce.saved_bo, size);
+ } else {
+ r = amdgpu_vce_resume(adev);
+ if (r)
+ return r;
+ }
return vce_v4_0_hw_init(adev);
}
--
2.7.4
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 9+ messages in thread
* RE: [PATCH 3/3] drm/amdgpu: add saved_bo to save vce 4.0 context when suspend
[not found] ` <20170531210040.20919-1-leo.liu-5C7GfCeVMHo@public.gmane.org>
@ 2017-05-31 21:18 ` Deucher, Alexander
0 siblings, 0 replies; 9+ messages in thread
From: Deucher, Alexander @ 2017-05-31 21:18 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Liu, Leo
> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-bounces@lists.freedesktop.org] On Behalf
> Of Leo Liu
> Sent: Wednesday, May 31, 2017 5:01 PM
> To: amd-gfx@lists.freedesktop.org
> Cc: Liu, Leo
> Subject: [PATCH 3/3] drm/amdgpu: add saved_bo to save vce 4.0 context
> when suspend
>
> We are using PSP to resume firmware after suspend, and it is
> resumed at where it got suspended, so we'd better save the
> the context.
>
> Signed-off-by: Leo Liu <leo.liu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h | 1 +
> drivers/gpu/drm/amd/amdgpu/vce_v4_0.c | 45
> +++++++++++++++++++++++++++------
> 2 files changed, 38 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
> index f5f35cc..f83e0c3 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
> @@ -34,6 +34,7 @@ struct amdgpu_vce {
> struct amdgpu_bo *vcpu_bo;
> uint64_t gpu_addr;
> void *cpu_addr;
> + void *saved_bo;
> unsigned fw_version;
> unsigned fb_version;
> atomic_t handles[AMDGPU_MAX_VCE_HANDLES];
> diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
> b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
> index ada2d0a..5229593 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
> @@ -419,15 +419,19 @@ static int vce_v4_0_sw_init(void *handle)
>
> if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
> const struct common_firmware_header *hdr;
> + unsigned size = amdgpu_bo_size(adev->vce.vcpu_bo);
> +
> + adev->vce.saved_bo = kmalloc(size, GFP_KERNEL);
> + if (!adev->vce.saved_bo)
> + return -ENOMEM;
> +
> hdr = (const struct common_firmware_header *)adev-
> >vce.fw->data;
> adev-
> >firmware.ucode[AMDGPU_UCODE_ID_VCE].ucode_id =
> AMDGPU_UCODE_ID_VCE;
> adev->firmware.ucode[AMDGPU_UCODE_ID_VCE].fw =
> adev->vce.fw;
> adev->firmware.fw_size +=
> ALIGN(le32_to_cpu(hdr->ucode_size_bytes),
> PAGE_SIZE);
> DRM_INFO("PSP loading VCE firmware\n");
> - }
> -
> - if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) {
> + } else {
> r = amdgpu_vce_resume(adev);
> if (r)
> return r;
> @@ -466,6 +470,11 @@ static int vce_v4_0_sw_fini(void *handle)
> /* free MM table */
> amdgpu_virt_free_mm_table(adev);
>
> + if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
> + kfree(adev->vce.saved_bo);
> + adev->vce.saved_bo = NULL;
> + }
> +
> r = amdgpu_vce_suspend(adev);
> if (r)
> return r;
> @@ -522,8 +531,18 @@ static int vce_v4_0_hw_fini(void *handle)
>
> static int vce_v4_0_suspend(void *handle)
> {
> - int r;
> struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> + int r;
> +
> + if (adev->vce.vcpu_bo == NULL)
> + return 0;
> +
> + if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
> + unsigned size = amdgpu_bo_size(adev->vce.vcpu_bo);
> + void *ptr = adev->vce.cpu_addr;
> +
> + memcpy_fromio(adev->vce.saved_bo, ptr, size);
> + }
>
> r = vce_v4_0_hw_fini(adev);
> if (r)
> @@ -534,12 +553,22 @@ static int vce_v4_0_suspend(void *handle)
>
> static int vce_v4_0_resume(void *handle)
> {
> - int r;
> struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> + int r;
>
> - r = amdgpu_vce_resume(adev);
> - if (r)
> - return r;
> + if (adev->vce.vcpu_bo == NULL)
> + return -EINVAL;
> +
> + if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
> + unsigned size = amdgpu_bo_size(adev->vce.vcpu_bo);
> + void *ptr = adev->vce.cpu_addr;
> +
> + memcpy_toio(ptr, adev->vce.saved_bo, size);
> + } else {
> + r = amdgpu_vce_resume(adev);
> + if (r)
> + return r;
> + }
>
> return vce_v4_0_hw_init(adev);
> }
> --
> 2.7.4
>
> _______________________________________________
> 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
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/3] drm/amdgpu: use existing function amdgpu_bo_create_kernel
[not found] ` <20170531192826.17571-2-leo.liu-5C7GfCeVMHo@public.gmane.org>
@ 2017-06-01 10:55 ` Christian König
[not found] ` <852ceaa1-a899-40ab-a6a2-fb33001885b0-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
0 siblings, 1 reply; 9+ messages in thread
From: Christian König @ 2017-06-01 10:55 UTC (permalink / raw)
To: Leo Liu, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Am 31.05.2017 um 21:28 schrieb Leo Liu:
> To simplify vce bo create
>
> Signed-off-by: Leo Liu <leo.liu@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 27 +++------------------------
> 1 file changed, 3 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
> index 735c38d..b9b0906 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
> @@ -165,35 +165,14 @@ int amdgpu_vce_sw_init(struct amdgpu_device *adev, unsigned long size)
> adev->vce.fw_version = ((version_major << 24) | (version_minor << 16) |
> (binary_id << 8));
>
> - /* allocate firmware, stack and heap BO */
> -
> - r = amdgpu_bo_create(adev, size, PAGE_SIZE, true,
> - AMDGPU_GEM_DOMAIN_VRAM,
> - AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
> - AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS,
> - NULL, NULL, &adev->vce.vcpu_bo);
> + r = amdgpu_bo_create_kernel(adev, size, PAGE_SIZE,
> + AMDGPU_GEM_DOMAIN_VRAM, &adev->vce.vcpu_bo,
> + &adev->vce.gpu_addr, &adev->vce.cpu_addr);
When you now CPU map the BO you also need to make sure that this mapping
is properly destroyed in amdgpu_vce_sw_fini().
In other words use amdgpu_bo_free_kernel() in amdgpu_vce_sw_fini() as
well :)
Apart from that the set looks good to me,
Christian.
> if (r) {
> dev_err(adev->dev, "(%d) failed to allocate VCE bo\n", r);
> return r;
> }
>
> - r = amdgpu_bo_reserve(adev->vce.vcpu_bo, false);
> - if (r) {
> - amdgpu_bo_unref(&adev->vce.vcpu_bo);
> - dev_err(adev->dev, "(%d) failed to reserve VCE bo\n", r);
> - return r;
> - }
> -
> - r = amdgpu_bo_pin(adev->vce.vcpu_bo, AMDGPU_GEM_DOMAIN_VRAM,
> - &adev->vce.gpu_addr);
> - amdgpu_bo_unreserve(adev->vce.vcpu_bo);
> - if (r) {
> - amdgpu_bo_unref(&adev->vce.vcpu_bo);
> - dev_err(adev->dev, "(%d) VCE bo pin failed\n", r);
> - return r;
> - }
> -
> -
> ring = &adev->vce.ring[0];
> rq = &ring->sched.sched_rq[AMD_SCHED_PRIORITY_NORMAL];
> r = amd_sched_entity_init(&ring->sched, &adev->vce.entity,
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/3] drm/amdgpu: use existing function amdgpu_bo_create_kernel
[not found] ` <852ceaa1-a899-40ab-a6a2-fb33001885b0-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
@ 2017-06-01 13:11 ` Leo Liu
0 siblings, 0 replies; 9+ messages in thread
From: Leo Liu @ 2017-06-01 13:11 UTC (permalink / raw)
To: Christian König, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
On 06/01/2017 06:55 AM, Christian König wrote:
> Am 31.05.2017 um 21:28 schrieb Leo Liu:
>> To simplify vce bo create
>>
>> Signed-off-by: Leo Liu <leo.liu@amd.com>
>> ---
>> drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 27
>> +++------------------------
>> 1 file changed, 3 insertions(+), 24 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
>> index 735c38d..b9b0906 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
>> @@ -165,35 +165,14 @@ int amdgpu_vce_sw_init(struct amdgpu_device
>> *adev, unsigned long size)
>> adev->vce.fw_version = ((version_major << 24) | (version_minor
>> << 16) |
>> (binary_id << 8));
>> - /* allocate firmware, stack and heap BO */
>> -
>> - r = amdgpu_bo_create(adev, size, PAGE_SIZE, true,
>> - AMDGPU_GEM_DOMAIN_VRAM,
>> - AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
>> - AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS,
>> - NULL, NULL, &adev->vce.vcpu_bo);
>> + r = amdgpu_bo_create_kernel(adev, size, PAGE_SIZE,
>> + AMDGPU_GEM_DOMAIN_VRAM, &adev->vce.vcpu_bo,
>> + &adev->vce.gpu_addr, &adev->vce.cpu_addr);
>
> When you now CPU map the BO you also need to make sure that this
> mapping is properly destroyed in amdgpu_vce_sw_fini().
>
> In other words use amdgpu_bo_free_kernel() in amdgpu_vce_sw_fini() as
> well :)
Thanks for pointing this out. I will add it following your comment.
Thanks,
Leo
>
> Apart from that the set looks good to me,
> Christian.
>
>> if (r) {
>> dev_err(adev->dev, "(%d) failed to allocate VCE bo\n", r);
>> return r;
>> }
>> - r = amdgpu_bo_reserve(adev->vce.vcpu_bo, false);
>> - if (r) {
>> - amdgpu_bo_unref(&adev->vce.vcpu_bo);
>> - dev_err(adev->dev, "(%d) failed to reserve VCE bo\n", r);
>> - return r;
>> - }
>> -
>> - r = amdgpu_bo_pin(adev->vce.vcpu_bo, AMDGPU_GEM_DOMAIN_VRAM,
>> - &adev->vce.gpu_addr);
>> - amdgpu_bo_unreserve(adev->vce.vcpu_bo);
>> - if (r) {
>> - amdgpu_bo_unref(&adev->vce.vcpu_bo);
>> - dev_err(adev->dev, "(%d) VCE bo pin failed\n", r);
>> - return r;
>> - }
>> -
>> -
>> ring = &adev->vce.ring[0];
>> rq = &ring->sched.sched_rq[AMD_SCHED_PRIORITY_NORMAL];
>> r = amd_sched_entity_init(&ring->sched, &adev->vce.entity,
>
>
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2017-06-01 13:11 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-05-31 19:28 [PATCH 1/3] drm/amdgpu: add vcpu_bo cpu address Leo Liu
[not found] ` <20170531192826.17571-1-leo.liu-5C7GfCeVMHo@public.gmane.org>
2017-05-31 19:28 ` [PATCH 2/3] drm/amdgpu: use existing function amdgpu_bo_create_kernel Leo Liu
[not found] ` <20170531192826.17571-2-leo.liu-5C7GfCeVMHo@public.gmane.org>
2017-06-01 10:55 ` Christian König
[not found] ` <852ceaa1-a899-40ab-a6a2-fb33001885b0-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
2017-06-01 13:11 ` Leo Liu
2017-05-31 19:28 ` [PATCH 3/3] drm/amdgpu: add saved_bo to save vce 4.0 context when suspend Leo Liu
[not found] ` <20170531192826.17571-3-leo.liu-5C7GfCeVMHo@public.gmane.org>
2017-05-31 19:54 ` Deucher, Alexander
[not found] ` <BN6PR12MB1652D083E4A3123CFE3B3628F7F10-/b2+HYfkarQqUD6E6FAiowdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2017-05-31 20:06 ` Leo Liu
2017-05-31 21:00 ` Leo Liu
[not found] ` <20170531210040.20919-1-leo.liu-5C7GfCeVMHo@public.gmane.org>
2017-05-31 21:18 ` Deucher, Alexander
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.