All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] drm/amdgpu: add workarounds for Raven VCN TMZ issue
@ 2022-03-08  3:39 Lang Yu
  2022-03-08  7:12 ` Christian König
  0 siblings, 1 reply; 16+ messages in thread
From: Lang Yu @ 2022-03-08  3:39 UTC (permalink / raw)
  To: amd-gfx; +Cc: Alex Deucher, Huang Rui, Lang Yu, Christian Koenig

It is a hardware issue that VCN can't handle a GTT
backing stored TMZ buffer on Raven.

Move such a TMZ buffer to VRAM domain before command
submission.

v2:
 - Use patch_cs_in_place callback.

Suggested-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Lang Yu <Lang.Yu@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 68 +++++++++++++++++++++++++++
 1 file changed, 68 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
index 7bbb9ba6b80b..810932abd3af 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
@@ -24,6 +24,7 @@
 #include <linux/firmware.h>
 
 #include "amdgpu.h"
+#include "amdgpu_cs.h"
 #include "amdgpu_vcn.h"
 #include "amdgpu_pm.h"
 #include "soc15.h"
@@ -1905,6 +1906,72 @@ static const struct amd_ip_funcs vcn_v1_0_ip_funcs = {
 	.set_powergating_state = vcn_v1_0_set_powergating_state,
 };
 
+/**
+ * It is a hardware issue that Raven VCN can't handle a GTT TMZ buffer.
+ * Move such a GTT TMZ buffer to VRAM domain before command submission.
+ */
+static int vcn_v1_0_validate_bo(struct amdgpu_cs_parser *parser,
+				struct amdgpu_job *job,
+				uint64_t addr)
+{
+	struct ttm_operation_ctx ctx = { false, false };
+	struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;
+	struct amdgpu_vm *vm = &fpriv->vm;
+	struct amdgpu_bo_va_mapping *mapping;
+	struct amdgpu_bo *bo;
+	int r;
+
+	addr &= AMDGPU_GMC_HOLE_MASK;
+	if (addr & 0x7) {
+		DRM_ERROR("VCN messages must be 8 byte aligned!\n");
+		return -EINVAL;
+	}
+
+	mapping = amdgpu_vm_bo_lookup_mapping(vm, addr/AMDGPU_GPU_PAGE_SIZE);
+	if (!mapping || !mapping->bo_va || !mapping->bo_va->base.bo)
+		return -EINVAL;
+
+	bo = mapping->bo_va->base.bo;
+	if (!(bo->flags & AMDGPU_GEM_CREATE_ENCRYPTED))
+		return 0;
+
+	amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_VRAM);
+	r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
+	if (r) {
+		DRM_ERROR("Failed validating the VCN message BO (%d)!\n", r);
+		return r;
+	}
+
+	return r;
+}
+
+static int vcn_v1_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p,
+					   struct amdgpu_job *job,
+					   struct amdgpu_ib *ib)
+{
+	uint32_t msg_lo = 0, msg_hi = 0;
+	int i, r;
+
+	for (i = 0; i < ib->length_dw; i += 2) {
+		uint32_t reg = amdgpu_ib_get_value(ib, i);
+		uint32_t val = amdgpu_ib_get_value(ib, i + 1);
+
+		if (reg == PACKET0(p->adev->vcn.internal.data0, 0)) {
+			msg_lo = val;
+		} else if (reg == PACKET0(p->adev->vcn.internal.data1, 0)) {
+			msg_hi = val;
+		} else if (reg == PACKET0(p->adev->vcn.internal.cmd, 0)) {
+			r = vcn_v1_0_validate_bo(p, job,
+					     ((u64)msg_hi) << 32 | msg_lo);
+			if (r)
+				return r;
+		}
+	}
+
+	return 0;
+}
+
+
 static const struct amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
 	.type = AMDGPU_RING_TYPE_VCN_DEC,
 	.align_mask = 0xf,
@@ -1914,6 +1981,7 @@ static const struct amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
 	.get_rptr = vcn_v1_0_dec_ring_get_rptr,
 	.get_wptr = vcn_v1_0_dec_ring_get_wptr,
 	.set_wptr = vcn_v1_0_dec_ring_set_wptr,
+	.patch_cs_in_place = vcn_v1_0_ring_patch_cs_in_place,
 	.emit_frame_size =
 		6 + 6 + /* hdp invalidate / flush */
 		SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH v2] drm/amdgpu: add workarounds for Raven VCN TMZ issue
  2022-03-08  3:39 [PATCH v2] drm/amdgpu: add workarounds for Raven VCN TMZ issue Lang Yu
@ 2022-03-08  7:12 ` Christian König
  2022-03-08  7:33   ` Lang Yu
  0 siblings, 1 reply; 16+ messages in thread
From: Christian König @ 2022-03-08  7:12 UTC (permalink / raw)
  To: Lang Yu, amd-gfx, Liu, Leo, Zhu, James
  Cc: Alex Deucher, Huang Rui, Christian Koenig



Am 08.03.22 um 04:39 schrieb Lang Yu:
> It is a hardware issue that VCN can't handle a GTT
> backing stored TMZ buffer on Raven.
>
> Move such a TMZ buffer to VRAM domain before command
> submission.
>
> v2:
>   - Use patch_cs_in_place callback.
>
> Suggested-by: Christian König <christian.koenig@amd.com>
> Signed-off-by: Lang Yu <Lang.Yu@amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 68 +++++++++++++++++++++++++++
>   1 file changed, 68 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> index 7bbb9ba6b80b..810932abd3af 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> @@ -24,6 +24,7 @@
>   #include <linux/firmware.h>
>   
>   #include "amdgpu.h"
> +#include "amdgpu_cs.h"
>   #include "amdgpu_vcn.h"
>   #include "amdgpu_pm.h"
>   #include "soc15.h"
> @@ -1905,6 +1906,72 @@ static const struct amd_ip_funcs vcn_v1_0_ip_funcs = {
>   	.set_powergating_state = vcn_v1_0_set_powergating_state,
>   };
>   
> +/**
> + * It is a hardware issue that Raven VCN can't handle a GTT TMZ buffer.
> + * Move such a GTT TMZ buffer to VRAM domain before command submission.
> + */
> +static int vcn_v1_0_validate_bo(struct amdgpu_cs_parser *parser,
> +				struct amdgpu_job *job,
> +				uint64_t addr)
> +{
> +	struct ttm_operation_ctx ctx = { false, false };
> +	struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;
> +	struct amdgpu_vm *vm = &fpriv->vm;
> +	struct amdgpu_bo_va_mapping *mapping;
> +	struct amdgpu_bo *bo;
> +	int r;
> +
> +	addr &= AMDGPU_GMC_HOLE_MASK;
> +	if (addr & 0x7) {
> +		DRM_ERROR("VCN messages must be 8 byte aligned!\n");
> +		return -EINVAL;
> +	}
> +
> +	mapping = amdgpu_vm_bo_lookup_mapping(vm, addr/AMDGPU_GPU_PAGE_SIZE);
> +	if (!mapping || !mapping->bo_va || !mapping->bo_va->base.bo)
> +		return -EINVAL;
> +
> +	bo = mapping->bo_va->base.bo;
> +	if (!(bo->flags & AMDGPU_GEM_CREATE_ENCRYPTED))
> +		return 0;
> +
> +	amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_VRAM);
> +	r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
> +	if (r) {
> +		DRM_ERROR("Failed validating the VCN message BO (%d)!\n", r);
> +		return r;
> +	}

Well, exactly that won't work.

The message structure isn't TMZ protected because otherwise the driver 
won't be able to stitch it together.

What is TMZ protected are the surfaces the message structure is pointing 
to. So what you would need to do is to completely parse the structure 
and then move on the relevant buffers into VRAM.

Leo or James, can you help with that?

Regards,
Christian.

> +
> +	return r;
> +}
> +
> +static int vcn_v1_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p,
> +					   struct amdgpu_job *job,
> +					   struct amdgpu_ib *ib)
> +{
> +	uint32_t msg_lo = 0, msg_hi = 0;
> +	int i, r;
> +
> +	for (i = 0; i < ib->length_dw; i += 2) {
> +		uint32_t reg = amdgpu_ib_get_value(ib, i);
> +		uint32_t val = amdgpu_ib_get_value(ib, i + 1);
> +
> +		if (reg == PACKET0(p->adev->vcn.internal.data0, 0)) {
> +			msg_lo = val;
> +		} else if (reg == PACKET0(p->adev->vcn.internal.data1, 0)) {
> +			msg_hi = val;
> +		} else if (reg == PACKET0(p->adev->vcn.internal.cmd, 0)) {
> +			r = vcn_v1_0_validate_bo(p, job,
> +					     ((u64)msg_hi) << 32 | msg_lo);
> +			if (r)
> +				return r;
> +		}
> +	}
> +
> +	return 0;
> +}
> +
> +
>   static const struct amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
>   	.type = AMDGPU_RING_TYPE_VCN_DEC,
>   	.align_mask = 0xf,
> @@ -1914,6 +1981,7 @@ static const struct amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
>   	.get_rptr = vcn_v1_0_dec_ring_get_rptr,
>   	.get_wptr = vcn_v1_0_dec_ring_get_wptr,
>   	.set_wptr = vcn_v1_0_dec_ring_set_wptr,
> +	.patch_cs_in_place = vcn_v1_0_ring_patch_cs_in_place,
>   	.emit_frame_size =
>   		6 + 6 + /* hdp invalidate / flush */
>   		SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2] drm/amdgpu: add workarounds for Raven VCN TMZ issue
  2022-03-08  7:12 ` Christian König
@ 2022-03-08  7:33   ` Lang Yu
  2022-03-08  7:37     ` Christian König
  0 siblings, 1 reply; 16+ messages in thread
From: Lang Yu @ 2022-03-08  7:33 UTC (permalink / raw)
  To: Christian König
  Cc: amd-gfx, Huang Rui, Alex Deucher, Zhu, James, Liu, Leo, Christian Koenig

On 03/08/ , Christian König wrote:
> 
> 
> Am 08.03.22 um 04:39 schrieb Lang Yu:
> > It is a hardware issue that VCN can't handle a GTT
> > backing stored TMZ buffer on Raven.
> > 
> > Move such a TMZ buffer to VRAM domain before command
> > submission.
> > 
> > v2:
> >   - Use patch_cs_in_place callback.
> > 
> > Suggested-by: Christian König <christian.koenig@amd.com>
> > Signed-off-by: Lang Yu <Lang.Yu@amd.com>
> > ---
> >   drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 68 +++++++++++++++++++++++++++
> >   1 file changed, 68 insertions(+)
> > 
> > diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> > index 7bbb9ba6b80b..810932abd3af 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> > @@ -24,6 +24,7 @@
> >   #include <linux/firmware.h>
> >   #include "amdgpu.h"
> > +#include "amdgpu_cs.h"
> >   #include "amdgpu_vcn.h"
> >   #include "amdgpu_pm.h"
> >   #include "soc15.h"
> > @@ -1905,6 +1906,72 @@ static const struct amd_ip_funcs vcn_v1_0_ip_funcs = {
> >   	.set_powergating_state = vcn_v1_0_set_powergating_state,
> >   };
> > +/**
> > + * It is a hardware issue that Raven VCN can't handle a GTT TMZ buffer.
> > + * Move such a GTT TMZ buffer to VRAM domain before command submission.
> > + */
> > +static int vcn_v1_0_validate_bo(struct amdgpu_cs_parser *parser,
> > +				struct amdgpu_job *job,
> > +				uint64_t addr)
> > +{
> > +	struct ttm_operation_ctx ctx = { false, false };
> > +	struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;
> > +	struct amdgpu_vm *vm = &fpriv->vm;
> > +	struct amdgpu_bo_va_mapping *mapping;
> > +	struct amdgpu_bo *bo;
> > +	int r;
> > +
> > +	addr &= AMDGPU_GMC_HOLE_MASK;
> > +	if (addr & 0x7) {
> > +		DRM_ERROR("VCN messages must be 8 byte aligned!\n");
> > +		return -EINVAL;
> > +	}
> > +
> > +	mapping = amdgpu_vm_bo_lookup_mapping(vm, addr/AMDGPU_GPU_PAGE_SIZE);
> > +	if (!mapping || !mapping->bo_va || !mapping->bo_va->base.bo)
> > +		return -EINVAL;
> > +
> > +	bo = mapping->bo_va->base.bo;
> > +	if (!(bo->flags & AMDGPU_GEM_CREATE_ENCRYPTED))
> > +		return 0;
> > +
> > +	amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_VRAM);
> > +	r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
> > +	if (r) {
> > +		DRM_ERROR("Failed validating the VCN message BO (%d)!\n", r);
> > +		return r;
> > +	}
> 
> Well, exactly that won't work.
> 
> The message structure isn't TMZ protected because otherwise the driver won't
> be able to stitch it together.
> 
> What is TMZ protected are the surfaces the message structure is pointing to.
> So what you would need to do is to completely parse the structure and then
> move on the relevant buffers into VRAM.
> 
> Leo or James, can you help with that?

From my observations, when decoding secure contents, register
GPCOM_VCPU_DATA0 and GPCOM_VCPU_DATA1 are set to a TMZ buffer address.
And this way works when allocating TMZ buffers in GTT domain.

Regards,
Lang

> Regards,
> Christian.
> 
> > +
> > +	return r;
> > +}
> > +
> > +static int vcn_v1_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p,
> > +					   struct amdgpu_job *job,
> > +					   struct amdgpu_ib *ib)
> > +{
> > +	uint32_t msg_lo = 0, msg_hi = 0;
> > +	int i, r;
> > +
> > +	for (i = 0; i < ib->length_dw; i += 2) {
> > +		uint32_t reg = amdgpu_ib_get_value(ib, i);
> > +		uint32_t val = amdgpu_ib_get_value(ib, i + 1);
> > +
> > +		if (reg == PACKET0(p->adev->vcn.internal.data0, 0)) {
> > +			msg_lo = val;
> > +		} else if (reg == PACKET0(p->adev->vcn.internal.data1, 0)) {
> > +			msg_hi = val;
> > +		} else if (reg == PACKET0(p->adev->vcn.internal.cmd, 0)) {
> > +			r = vcn_v1_0_validate_bo(p, job,
> > +					     ((u64)msg_hi) << 32 | msg_lo);
> > +			if (r)
> > +				return r;
> > +		}
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +
> >   static const struct amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
> >   	.type = AMDGPU_RING_TYPE_VCN_DEC,
> >   	.align_mask = 0xf,
> > @@ -1914,6 +1981,7 @@ static const struct amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
> >   	.get_rptr = vcn_v1_0_dec_ring_get_rptr,
> >   	.get_wptr = vcn_v1_0_dec_ring_get_wptr,
> >   	.set_wptr = vcn_v1_0_dec_ring_set_wptr,
> > +	.patch_cs_in_place = vcn_v1_0_ring_patch_cs_in_place,
> >   	.emit_frame_size =
> >   		6 + 6 + /* hdp invalidate / flush */
> >   		SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
> 

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2] drm/amdgpu: add workarounds for Raven VCN TMZ issue
  2022-03-08  7:33   ` Lang Yu
@ 2022-03-08  7:37     ` Christian König
  2022-03-08  8:06       ` Lang Yu
  0 siblings, 1 reply; 16+ messages in thread
From: Christian König @ 2022-03-08  7:37 UTC (permalink / raw)
  To: Lang Yu
  Cc: amd-gfx, Huang Rui, Alex Deucher, Zhu, James, Liu, Leo, Christian Koenig

Am 08.03.22 um 08:33 schrieb Lang Yu:
> On 03/08/ , Christian König wrote:
>>
>> Am 08.03.22 um 04:39 schrieb Lang Yu:
>>> It is a hardware issue that VCN can't handle a GTT
>>> backing stored TMZ buffer on Raven.
>>>
>>> Move such a TMZ buffer to VRAM domain before command
>>> submission.
>>>
>>> v2:
>>>    - Use patch_cs_in_place callback.
>>>
>>> Suggested-by: Christian König <christian.koenig@amd.com>
>>> Signed-off-by: Lang Yu <Lang.Yu@amd.com>
>>> ---
>>>    drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 68 +++++++++++++++++++++++++++
>>>    1 file changed, 68 insertions(+)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>> index 7bbb9ba6b80b..810932abd3af 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>> @@ -24,6 +24,7 @@
>>>    #include <linux/firmware.h>
>>>    #include "amdgpu.h"
>>> +#include "amdgpu_cs.h"
>>>    #include "amdgpu_vcn.h"
>>>    #include "amdgpu_pm.h"
>>>    #include "soc15.h"
>>> @@ -1905,6 +1906,72 @@ static const struct amd_ip_funcs vcn_v1_0_ip_funcs = {
>>>    	.set_powergating_state = vcn_v1_0_set_powergating_state,
>>>    };
>>> +/**
>>> + * It is a hardware issue that Raven VCN can't handle a GTT TMZ buffer.
>>> + * Move such a GTT TMZ buffer to VRAM domain before command submission.
>>> + */
>>> +static int vcn_v1_0_validate_bo(struct amdgpu_cs_parser *parser,
>>> +				struct amdgpu_job *job,
>>> +				uint64_t addr)
>>> +{
>>> +	struct ttm_operation_ctx ctx = { false, false };
>>> +	struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;
>>> +	struct amdgpu_vm *vm = &fpriv->vm;
>>> +	struct amdgpu_bo_va_mapping *mapping;
>>> +	struct amdgpu_bo *bo;
>>> +	int r;
>>> +
>>> +	addr &= AMDGPU_GMC_HOLE_MASK;
>>> +	if (addr & 0x7) {
>>> +		DRM_ERROR("VCN messages must be 8 byte aligned!\n");
>>> +		return -EINVAL;
>>> +	}
>>> +
>>> +	mapping = amdgpu_vm_bo_lookup_mapping(vm, addr/AMDGPU_GPU_PAGE_SIZE);
>>> +	if (!mapping || !mapping->bo_va || !mapping->bo_va->base.bo)
>>> +		return -EINVAL;
>>> +
>>> +	bo = mapping->bo_va->base.bo;
>>> +	if (!(bo->flags & AMDGPU_GEM_CREATE_ENCRYPTED))
>>> +		return 0;
>>> +
>>> +	amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_VRAM);
>>> +	r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
>>> +	if (r) {
>>> +		DRM_ERROR("Failed validating the VCN message BO (%d)!\n", r);
>>> +		return r;
>>> +	}
>> Well, exactly that won't work.
>>
>> The message structure isn't TMZ protected because otherwise the driver won't
>> be able to stitch it together.
>>
>> What is TMZ protected are the surfaces the message structure is pointing to.
>> So what you would need to do is to completely parse the structure and then
>> move on the relevant buffers into VRAM.
>>
>> Leo or James, can you help with that?
>  From my observations, when decoding secure contents, register
> GPCOM_VCPU_DATA0 and GPCOM_VCPU_DATA1 are set to a TMZ buffer address.
> And this way works when allocating TMZ buffers in GTT domain.

As far as I remember that's only the case for the decoding, encoding 
works by putting the addresses into the message buffer.

But could be that decoding is sufficient, Leo and James need to comment 
on this.

Regards,
Christian.

>
> Regards,
> Lang
>
>> Regards,
>> Christian.
>>
>>> +
>>> +	return r;
>>> +}
>>> +
>>> +static int vcn_v1_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p,
>>> +					   struct amdgpu_job *job,
>>> +					   struct amdgpu_ib *ib)
>>> +{
>>> +	uint32_t msg_lo = 0, msg_hi = 0;
>>> +	int i, r;
>>> +
>>> +	for (i = 0; i < ib->length_dw; i += 2) {
>>> +		uint32_t reg = amdgpu_ib_get_value(ib, i);
>>> +		uint32_t val = amdgpu_ib_get_value(ib, i + 1);
>>> +
>>> +		if (reg == PACKET0(p->adev->vcn.internal.data0, 0)) {
>>> +			msg_lo = val;
>>> +		} else if (reg == PACKET0(p->adev->vcn.internal.data1, 0)) {
>>> +			msg_hi = val;
>>> +		} else if (reg == PACKET0(p->adev->vcn.internal.cmd, 0)) {
>>> +			r = vcn_v1_0_validate_bo(p, job,
>>> +					     ((u64)msg_hi) << 32 | msg_lo);
>>> +			if (r)
>>> +				return r;
>>> +		}
>>> +	}
>>> +
>>> +	return 0;
>>> +}
>>> +
>>> +
>>>    static const struct amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
>>>    	.type = AMDGPU_RING_TYPE_VCN_DEC,
>>>    	.align_mask = 0xf,
>>> @@ -1914,6 +1981,7 @@ static const struct amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
>>>    	.get_rptr = vcn_v1_0_dec_ring_get_rptr,
>>>    	.get_wptr = vcn_v1_0_dec_ring_get_wptr,
>>>    	.set_wptr = vcn_v1_0_dec_ring_set_wptr,
>>> +	.patch_cs_in_place = vcn_v1_0_ring_patch_cs_in_place,
>>>    	.emit_frame_size =
>>>    		6 + 6 + /* hdp invalidate / flush */
>>>    		SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2] drm/amdgpu: add workarounds for Raven VCN TMZ issue
  2022-03-08  7:37     ` Christian König
@ 2022-03-08  8:06       ` Lang Yu
  2022-03-08  9:16         ` Christian König
  0 siblings, 1 reply; 16+ messages in thread
From: Lang Yu @ 2022-03-08  8:06 UTC (permalink / raw)
  To: Christian König
  Cc: amd-gfx, Huang Rui, Alex Deucher, Zhu, James, Liu, Leo, Christian Koenig

On 03/08/ , Christian König wrote:
> Am 08.03.22 um 08:33 schrieb Lang Yu:
> > On 03/08/ , Christian König wrote:
> > > 
> > > Am 08.03.22 um 04:39 schrieb Lang Yu:
> > > > It is a hardware issue that VCN can't handle a GTT
> > > > backing stored TMZ buffer on Raven.
> > > > 
> > > > Move such a TMZ buffer to VRAM domain before command
> > > > submission.
> > > > 
> > > > v2:
> > > >    - Use patch_cs_in_place callback.
> > > > 
> > > > Suggested-by: Christian König <christian.koenig@amd.com>
> > > > Signed-off-by: Lang Yu <Lang.Yu@amd.com>
> > > > ---
> > > >    drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 68 +++++++++++++++++++++++++++
> > > >    1 file changed, 68 insertions(+)
> > > > 
> > > > diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> > > > index 7bbb9ba6b80b..810932abd3af 100644
> > > > --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> > > > +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> > > > @@ -24,6 +24,7 @@
> > > >    #include <linux/firmware.h>
> > > >    #include "amdgpu.h"
> > > > +#include "amdgpu_cs.h"
> > > >    #include "amdgpu_vcn.h"
> > > >    #include "amdgpu_pm.h"
> > > >    #include "soc15.h"
> > > > @@ -1905,6 +1906,72 @@ static const struct amd_ip_funcs vcn_v1_0_ip_funcs = {
> > > >    	.set_powergating_state = vcn_v1_0_set_powergating_state,
> > > >    };
> > > > +/**
> > > > + * It is a hardware issue that Raven VCN can't handle a GTT TMZ buffer.
> > > > + * Move such a GTT TMZ buffer to VRAM domain before command submission.
> > > > + */
> > > > +static int vcn_v1_0_validate_bo(struct amdgpu_cs_parser *parser,
> > > > +				struct amdgpu_job *job,
> > > > +				uint64_t addr)
> > > > +{
> > > > +	struct ttm_operation_ctx ctx = { false, false };
> > > > +	struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;
> > > > +	struct amdgpu_vm *vm = &fpriv->vm;
> > > > +	struct amdgpu_bo_va_mapping *mapping;
> > > > +	struct amdgpu_bo *bo;
> > > > +	int r;
> > > > +
> > > > +	addr &= AMDGPU_GMC_HOLE_MASK;
> > > > +	if (addr & 0x7) {
> > > > +		DRM_ERROR("VCN messages must be 8 byte aligned!\n");
> > > > +		return -EINVAL;
> > > > +	}
> > > > +
> > > > +	mapping = amdgpu_vm_bo_lookup_mapping(vm, addr/AMDGPU_GPU_PAGE_SIZE);
> > > > +	if (!mapping || !mapping->bo_va || !mapping->bo_va->base.bo)
> > > > +		return -EINVAL;
> > > > +
> > > > +	bo = mapping->bo_va->base.bo;
> > > > +	if (!(bo->flags & AMDGPU_GEM_CREATE_ENCRYPTED))
> > > > +		return 0;
> > > > +
> > > > +	amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_VRAM);
> > > > +	r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
> > > > +	if (r) {
> > > > +		DRM_ERROR("Failed validating the VCN message BO (%d)!\n", r);
> > > > +		return r;
> > > > +	}
> > > Well, exactly that won't work.
> > > 
> > > The message structure isn't TMZ protected because otherwise the driver won't
> > > be able to stitch it together.
> > > 
> > > What is TMZ protected are the surfaces the message structure is pointing to.
> > > So what you would need to do is to completely parse the structure and then
> > > move on the relevant buffers into VRAM.
> > > 
> > > Leo or James, can you help with that?
> >  From my observations, when decoding secure contents, register
> > GPCOM_VCPU_DATA0 and GPCOM_VCPU_DATA1 are set to a TMZ buffer address.
> > And this way works when allocating TMZ buffers in GTT domain.
> 
> As far as I remember that's only the case for the decoding, encoding works
> by putting the addresses into the message buffer.
> 
> But could be that decoding is sufficient, Leo and James need to comment on
> this.

It seems that only decode needs TMZ buffers. Only observe si_vid_create_tmz_buffer() 
was called in rvcn_dec_message_decode() in src/gallium/drivers/radeon/radeon_vcn_dec.c.

Regards,
Lang

> Regards,
> Christian.
> 
> > 
> > Regards,
> > Lang
> > 
> > > Regards,
> > > Christian.
> > > 
> > > > +
> > > > +	return r;
> > > > +}
> > > > +
> > > > +static int vcn_v1_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p,
> > > > +					   struct amdgpu_job *job,
> > > > +					   struct amdgpu_ib *ib)
> > > > +{
> > > > +	uint32_t msg_lo = 0, msg_hi = 0;
> > > > +	int i, r;
> > > > +
> > > > +	for (i = 0; i < ib->length_dw; i += 2) {
> > > > +		uint32_t reg = amdgpu_ib_get_value(ib, i);
> > > > +		uint32_t val = amdgpu_ib_get_value(ib, i + 1);
> > > > +
> > > > +		if (reg == PACKET0(p->adev->vcn.internal.data0, 0)) {
> > > > +			msg_lo = val;
> > > > +		} else if (reg == PACKET0(p->adev->vcn.internal.data1, 0)) {
> > > > +			msg_hi = val;
> > > > +		} else if (reg == PACKET0(p->adev->vcn.internal.cmd, 0)) {
> > > > +			r = vcn_v1_0_validate_bo(p, job,
> > > > +					     ((u64)msg_hi) << 32 | msg_lo);
> > > > +			if (r)
> > > > +				return r;
> > > > +		}
> > > > +	}
> > > > +
> > > > +	return 0;
> > > > +}
> > > > +
> > > > +
> > > >    static const struct amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
> > > >    	.type = AMDGPU_RING_TYPE_VCN_DEC,
> > > >    	.align_mask = 0xf,
> > > > @@ -1914,6 +1981,7 @@ static const struct amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
> > > >    	.get_rptr = vcn_v1_0_dec_ring_get_rptr,
> > > >    	.get_wptr = vcn_v1_0_dec_ring_get_wptr,
> > > >    	.set_wptr = vcn_v1_0_dec_ring_set_wptr,
> > > > +	.patch_cs_in_place = vcn_v1_0_ring_patch_cs_in_place,
> > > >    	.emit_frame_size =
> > > >    		6 + 6 + /* hdp invalidate / flush */
> > > >    		SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
> 

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2] drm/amdgpu: add workarounds for Raven VCN TMZ issue
  2022-03-08  8:06       ` Lang Yu
@ 2022-03-08  9:16         ` Christian König
  2022-03-08 15:14           ` Alex Deucher
  2022-03-08 16:18           ` Leo Liu
  0 siblings, 2 replies; 16+ messages in thread
From: Christian König @ 2022-03-08  9:16 UTC (permalink / raw)
  To: Lang Yu, Christian König
  Cc: Alex Deucher, Huang Rui, Zhu, James, Liu, Leo, amd-gfx

Am 08.03.22 um 09:06 schrieb Lang Yu:
> On 03/08/ , Christian König wrote:
>> Am 08.03.22 um 08:33 schrieb Lang Yu:
>>> On 03/08/ , Christian König wrote:
>>>> Am 08.03.22 um 04:39 schrieb Lang Yu:
>>>>> It is a hardware issue that VCN can't handle a GTT
>>>>> backing stored TMZ buffer on Raven.
>>>>>
>>>>> Move such a TMZ buffer to VRAM domain before command
>>>>> submission.
>>>>>
>>>>> v2:
>>>>>     - Use patch_cs_in_place callback.
>>>>>
>>>>> Suggested-by: Christian König <christian.koenig@amd.com>
>>>>> Signed-off-by: Lang Yu <Lang.Yu@amd.com>
>>>>> ---
>>>>>     drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 68 +++++++++++++++++++++++++++
>>>>>     1 file changed, 68 insertions(+)
>>>>>
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>> index 7bbb9ba6b80b..810932abd3af 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>> @@ -24,6 +24,7 @@
>>>>>     #include <linux/firmware.h>
>>>>>     #include "amdgpu.h"
>>>>> +#include "amdgpu_cs.h"
>>>>>     #include "amdgpu_vcn.h"
>>>>>     #include "amdgpu_pm.h"
>>>>>     #include "soc15.h"
>>>>> @@ -1905,6 +1906,72 @@ static const struct amd_ip_funcs vcn_v1_0_ip_funcs = {
>>>>>     	.set_powergating_state = vcn_v1_0_set_powergating_state,
>>>>>     };
>>>>> +/**
>>>>> + * It is a hardware issue that Raven VCN can't handle a GTT TMZ buffer.
>>>>> + * Move such a GTT TMZ buffer to VRAM domain before command submission.
>>>>> + */
>>>>> +static int vcn_v1_0_validate_bo(struct amdgpu_cs_parser *parser,
>>>>> +				struct amdgpu_job *job,
>>>>> +				uint64_t addr)
>>>>> +{
>>>>> +	struct ttm_operation_ctx ctx = { false, false };
>>>>> +	struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;
>>>>> +	struct amdgpu_vm *vm = &fpriv->vm;
>>>>> +	struct amdgpu_bo_va_mapping *mapping;
>>>>> +	struct amdgpu_bo *bo;
>>>>> +	int r;
>>>>> +
>>>>> +	addr &= AMDGPU_GMC_HOLE_MASK;
>>>>> +	if (addr & 0x7) {
>>>>> +		DRM_ERROR("VCN messages must be 8 byte aligned!\n");
>>>>> +		return -EINVAL;
>>>>> +	}
>>>>> +
>>>>> +	mapping = amdgpu_vm_bo_lookup_mapping(vm, addr/AMDGPU_GPU_PAGE_SIZE);
>>>>> +	if (!mapping || !mapping->bo_va || !mapping->bo_va->base.bo)
>>>>> +		return -EINVAL;
>>>>> +
>>>>> +	bo = mapping->bo_va->base.bo;
>>>>> +	if (!(bo->flags & AMDGPU_GEM_CREATE_ENCRYPTED))
>>>>> +		return 0;
>>>>> +
>>>>> +	amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_VRAM);
>>>>> +	r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
>>>>> +	if (r) {
>>>>> +		DRM_ERROR("Failed validating the VCN message BO (%d)!\n", r);
>>>>> +		return r;
>>>>> +	}
>>>> Well, exactly that won't work.
>>>>
>>>> The message structure isn't TMZ protected because otherwise the driver won't
>>>> be able to stitch it together.
>>>>
>>>> What is TMZ protected are the surfaces the message structure is pointing to.
>>>> So what you would need to do is to completely parse the structure and then
>>>> move on the relevant buffers into VRAM.
>>>>
>>>> Leo or James, can you help with that?
>>>   From my observations, when decoding secure contents, register
>>> GPCOM_VCPU_DATA0 and GPCOM_VCPU_DATA1 are set to a TMZ buffer address.
>>> And this way works when allocating TMZ buffers in GTT domain.
>> As far as I remember that's only the case for the decoding, encoding works
>> by putting the addresses into the message buffer.
>>
>> But could be that decoding is sufficient, Leo and James need to comment on
>> this.
> It seems that only decode needs TMZ buffers. Only observe si_vid_create_tmz_buffer()
> was called in rvcn_dec_message_decode() in src/gallium/drivers/radeon/radeon_vcn_dec.c.

Mhm, good point. Let's wait for Leo and James to wake up, when we don't 
need encode support than that would makes things much easier.

Regards,
Christian.

>
> Regards,
> Lang
>
>> Regards,
>> Christian.
>>
>>> Regards,
>>> Lang
>>>
>>>> Regards,
>>>> Christian.
>>>>
>>>>> +
>>>>> +	return r;
>>>>> +}
>>>>> +
>>>>> +static int vcn_v1_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p,
>>>>> +					   struct amdgpu_job *job,
>>>>> +					   struct amdgpu_ib *ib)
>>>>> +{
>>>>> +	uint32_t msg_lo = 0, msg_hi = 0;
>>>>> +	int i, r;
>>>>> +
>>>>> +	for (i = 0; i < ib->length_dw; i += 2) {
>>>>> +		uint32_t reg = amdgpu_ib_get_value(ib, i);
>>>>> +		uint32_t val = amdgpu_ib_get_value(ib, i + 1);
>>>>> +
>>>>> +		if (reg == PACKET0(p->adev->vcn.internal.data0, 0)) {
>>>>> +			msg_lo = val;
>>>>> +		} else if (reg == PACKET0(p->adev->vcn.internal.data1, 0)) {
>>>>> +			msg_hi = val;
>>>>> +		} else if (reg == PACKET0(p->adev->vcn.internal.cmd, 0)) {
>>>>> +			r = vcn_v1_0_validate_bo(p, job,
>>>>> +					     ((u64)msg_hi) << 32 | msg_lo);
>>>>> +			if (r)
>>>>> +				return r;
>>>>> +		}
>>>>> +	}
>>>>> +
>>>>> +	return 0;
>>>>> +}
>>>>> +
>>>>> +
>>>>>     static const struct amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
>>>>>     	.type = AMDGPU_RING_TYPE_VCN_DEC,
>>>>>     	.align_mask = 0xf,
>>>>> @@ -1914,6 +1981,7 @@ static const struct amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
>>>>>     	.get_rptr = vcn_v1_0_dec_ring_get_rptr,
>>>>>     	.get_wptr = vcn_v1_0_dec_ring_get_wptr,
>>>>>     	.set_wptr = vcn_v1_0_dec_ring_set_wptr,
>>>>> +	.patch_cs_in_place = vcn_v1_0_ring_patch_cs_in_place,
>>>>>     	.emit_frame_size =
>>>>>     		6 + 6 + /* hdp invalidate / flush */
>>>>>     		SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2] drm/amdgpu: add workarounds for Raven VCN TMZ issue
  2022-03-08  9:16         ` Christian König
@ 2022-03-08 15:14           ` Alex Deucher
  2022-03-08 16:18           ` Leo Liu
  1 sibling, 0 replies; 16+ messages in thread
From: Alex Deucher @ 2022-03-08 15:14 UTC (permalink / raw)
  To: Christian König
  Cc: Liu, Leo, Christian König, amd-gfx list, Huang Rui,
	Alex Deucher, Zhu, James, Lang Yu

On Tue, Mar 8, 2022 at 4:16 AM Christian König <christian.koenig@amd.com> wrote:
>
> Am 08.03.22 um 09:06 schrieb Lang Yu:
> > On 03/08/ , Christian König wrote:
> >> Am 08.03.22 um 08:33 schrieb Lang Yu:
> >>> On 03/08/ , Christian König wrote:
> >>>> Am 08.03.22 um 04:39 schrieb Lang Yu:
> >>>>> It is a hardware issue that VCN can't handle a GTT
> >>>>> backing stored TMZ buffer on Raven.
> >>>>>
> >>>>> Move such a TMZ buffer to VRAM domain before command
> >>>>> submission.
> >>>>>
> >>>>> v2:
> >>>>>     - Use patch_cs_in_place callback.
> >>>>>
> >>>>> Suggested-by: Christian König <christian.koenig@amd.com>
> >>>>> Signed-off-by: Lang Yu <Lang.Yu@amd.com>
> >>>>> ---
> >>>>>     drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 68 +++++++++++++++++++++++++++
> >>>>>     1 file changed, 68 insertions(+)
> >>>>>
> >>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> >>>>> index 7bbb9ba6b80b..810932abd3af 100644
> >>>>> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> >>>>> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> >>>>> @@ -24,6 +24,7 @@
> >>>>>     #include <linux/firmware.h>
> >>>>>     #include "amdgpu.h"
> >>>>> +#include "amdgpu_cs.h"
> >>>>>     #include "amdgpu_vcn.h"
> >>>>>     #include "amdgpu_pm.h"
> >>>>>     #include "soc15.h"
> >>>>> @@ -1905,6 +1906,72 @@ static const struct amd_ip_funcs vcn_v1_0_ip_funcs = {
> >>>>>           .set_powergating_state = vcn_v1_0_set_powergating_state,
> >>>>>     };
> >>>>> +/**
> >>>>> + * It is a hardware issue that Raven VCN can't handle a GTT TMZ buffer.
> >>>>> + * Move such a GTT TMZ buffer to VRAM domain before command submission.
> >>>>> + */
> >>>>> +static int vcn_v1_0_validate_bo(struct amdgpu_cs_parser *parser,
> >>>>> +                         struct amdgpu_job *job,
> >>>>> +                         uint64_t addr)
> >>>>> +{
> >>>>> + struct ttm_operation_ctx ctx = { false, false };
> >>>>> + struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;
> >>>>> + struct amdgpu_vm *vm = &fpriv->vm;
> >>>>> + struct amdgpu_bo_va_mapping *mapping;
> >>>>> + struct amdgpu_bo *bo;
> >>>>> + int r;
> >>>>> +
> >>>>> + addr &= AMDGPU_GMC_HOLE_MASK;
> >>>>> + if (addr & 0x7) {
> >>>>> +         DRM_ERROR("VCN messages must be 8 byte aligned!\n");
> >>>>> +         return -EINVAL;
> >>>>> + }
> >>>>> +
> >>>>> + mapping = amdgpu_vm_bo_lookup_mapping(vm, addr/AMDGPU_GPU_PAGE_SIZE);
> >>>>> + if (!mapping || !mapping->bo_va || !mapping->bo_va->base.bo)
> >>>>> +         return -EINVAL;
> >>>>> +
> >>>>> + bo = mapping->bo_va->base.bo;
> >>>>> + if (!(bo->flags & AMDGPU_GEM_CREATE_ENCRYPTED))
> >>>>> +         return 0;
> >>>>> +
> >>>>> + amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_VRAM);
> >>>>> + r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
> >>>>> + if (r) {
> >>>>> +         DRM_ERROR("Failed validating the VCN message BO (%d)!\n", r);
> >>>>> +         return r;
> >>>>> + }
> >>>> Well, exactly that won't work.
> >>>>
> >>>> The message structure isn't TMZ protected because otherwise the driver won't
> >>>> be able to stitch it together.
> >>>>
> >>>> What is TMZ protected are the surfaces the message structure is pointing to.
> >>>> So what you would need to do is to completely parse the structure and then
> >>>> move on the relevant buffers into VRAM.
> >>>>
> >>>> Leo or James, can you help with that?
> >>>   From my observations, when decoding secure contents, register
> >>> GPCOM_VCPU_DATA0 and GPCOM_VCPU_DATA1 are set to a TMZ buffer address.
> >>> And this way works when allocating TMZ buffers in GTT domain.
> >> As far as I remember that's only the case for the decoding, encoding works
> >> by putting the addresses into the message buffer.
> >>
> >> But could be that decoding is sufficient, Leo and James need to comment on
> >> this.
> > It seems that only decode needs TMZ buffers. Only observe si_vid_create_tmz_buffer()
> > was called in rvcn_dec_message_decode() in src/gallium/drivers/radeon/radeon_vcn_dec.c.
>
> Mhm, good point. Let's wait for Leo and James to wake up, when we don't
> need encode support than that would makes things much easier.

If we don't support encrypted encode, we should add a check to prevent
it like we do for compute.

Alex

>
> Regards,
> Christian.
>
> >
> > Regards,
> > Lang
> >
> >> Regards,
> >> Christian.
> >>
> >>> Regards,
> >>> Lang
> >>>
> >>>> Regards,
> >>>> Christian.
> >>>>
> >>>>> +
> >>>>> + return r;
> >>>>> +}
> >>>>> +
> >>>>> +static int vcn_v1_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p,
> >>>>> +                                    struct amdgpu_job *job,
> >>>>> +                                    struct amdgpu_ib *ib)
> >>>>> +{
> >>>>> + uint32_t msg_lo = 0, msg_hi = 0;
> >>>>> + int i, r;
> >>>>> +
> >>>>> + for (i = 0; i < ib->length_dw; i += 2) {
> >>>>> +         uint32_t reg = amdgpu_ib_get_value(ib, i);
> >>>>> +         uint32_t val = amdgpu_ib_get_value(ib, i + 1);
> >>>>> +
> >>>>> +         if (reg == PACKET0(p->adev->vcn.internal.data0, 0)) {
> >>>>> +                 msg_lo = val;
> >>>>> +         } else if (reg == PACKET0(p->adev->vcn.internal.data1, 0)) {
> >>>>> +                 msg_hi = val;
> >>>>> +         } else if (reg == PACKET0(p->adev->vcn.internal.cmd, 0)) {
> >>>>> +                 r = vcn_v1_0_validate_bo(p, job,
> >>>>> +                                      ((u64)msg_hi) << 32 | msg_lo);
> >>>>> +                 if (r)
> >>>>> +                         return r;
> >>>>> +         }
> >>>>> + }
> >>>>> +
> >>>>> + return 0;
> >>>>> +}
> >>>>> +
> >>>>> +
> >>>>>     static const struct amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
> >>>>>           .type = AMDGPU_RING_TYPE_VCN_DEC,
> >>>>>           .align_mask = 0xf,
> >>>>> @@ -1914,6 +1981,7 @@ static const struct amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
> >>>>>           .get_rptr = vcn_v1_0_dec_ring_get_rptr,
> >>>>>           .get_wptr = vcn_v1_0_dec_ring_get_wptr,
> >>>>>           .set_wptr = vcn_v1_0_dec_ring_set_wptr,
> >>>>> + .patch_cs_in_place = vcn_v1_0_ring_patch_cs_in_place,
> >>>>>           .emit_frame_size =
> >>>>>                   6 + 6 + /* hdp invalidate / flush */
> >>>>>                   SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2] drm/amdgpu: add workarounds for Raven VCN TMZ issue
  2022-03-08  9:16         ` Christian König
  2022-03-08 15:14           ` Alex Deucher
@ 2022-03-08 16:18           ` Leo Liu
  2022-03-08 16:30             ` Leo Liu
  1 sibling, 1 reply; 16+ messages in thread
From: Leo Liu @ 2022-03-08 16:18 UTC (permalink / raw)
  To: Christian König, Lang Yu, Christian König
  Cc: Alex Deucher, Zhu, James, Huang Rui, amd-gfx


On 2022-03-08 04:16, Christian König wrote:
> Am 08.03.22 um 09:06 schrieb Lang Yu:
>> On 03/08/ , Christian König wrote:
>>> Am 08.03.22 um 08:33 schrieb Lang Yu:
>>>> On 03/08/ , Christian König wrote:
>>>>> Am 08.03.22 um 04:39 schrieb Lang Yu:
>>>>>> It is a hardware issue that VCN can't handle a GTT
>>>>>> backing stored TMZ buffer on Raven.
>>>>>>
>>>>>> Move such a TMZ buffer to VRAM domain before command
>>>>>> submission.
>>>>>>
>>>>>> v2:
>>>>>>     - Use patch_cs_in_place callback.
>>>>>>
>>>>>> Suggested-by: Christian König <christian.koenig@amd.com>
>>>>>> Signed-off-by: Lang Yu <Lang.Yu@amd.com>
>>>>>> ---
>>>>>>     drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 68 
>>>>>> +++++++++++++++++++++++++++
>>>>>>     1 file changed, 68 insertions(+)
>>>>>>
>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c 
>>>>>> b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>>> index 7bbb9ba6b80b..810932abd3af 100644
>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>>> @@ -24,6 +24,7 @@
>>>>>>     #include <linux/firmware.h>
>>>>>>     #include "amdgpu.h"
>>>>>> +#include "amdgpu_cs.h"
>>>>>>     #include "amdgpu_vcn.h"
>>>>>>     #include "amdgpu_pm.h"
>>>>>>     #include "soc15.h"
>>>>>> @@ -1905,6 +1906,72 @@ static const struct amd_ip_funcs 
>>>>>> vcn_v1_0_ip_funcs = {
>>>>>>         .set_powergating_state = vcn_v1_0_set_powergating_state,
>>>>>>     };
>>>>>> +/**
>>>>>> + * It is a hardware issue that Raven VCN can't handle a GTT TMZ 
>>>>>> buffer.
>>>>>> + * Move such a GTT TMZ buffer to VRAM domain before command 
>>>>>> submission.
>>>>>> + */
>>>>>> +static int vcn_v1_0_validate_bo(struct amdgpu_cs_parser *parser,
>>>>>> +                struct amdgpu_job *job,
>>>>>> +                uint64_t addr)
>>>>>> +{
>>>>>> +    struct ttm_operation_ctx ctx = { false, false };
>>>>>> +    struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;
>>>>>> +    struct amdgpu_vm *vm = &fpriv->vm;
>>>>>> +    struct amdgpu_bo_va_mapping *mapping;
>>>>>> +    struct amdgpu_bo *bo;
>>>>>> +    int r;
>>>>>> +
>>>>>> +    addr &= AMDGPU_GMC_HOLE_MASK;
>>>>>> +    if (addr & 0x7) {
>>>>>> +        DRM_ERROR("VCN messages must be 8 byte aligned!\n");
>>>>>> +        return -EINVAL;
>>>>>> +    }
>>>>>> +
>>>>>> +    mapping = amdgpu_vm_bo_lookup_mapping(vm, 
>>>>>> addr/AMDGPU_GPU_PAGE_SIZE);
>>>>>> +    if (!mapping || !mapping->bo_va || !mapping->bo_va->base.bo)
>>>>>> +        return -EINVAL;
>>>>>> +
>>>>>> +    bo = mapping->bo_va->base.bo;
>>>>>> +    if (!(bo->flags & AMDGPU_GEM_CREATE_ENCRYPTED))
>>>>>> +        return 0;
>>>>>> +
>>>>>> +    amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_VRAM);
>>>>>> +    r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
>>>>>> +    if (r) {
>>>>>> +        DRM_ERROR("Failed validating the VCN message BO 
>>>>>> (%d)!\n", r);
>>>>>> +        return r;
>>>>>> +    }
>>>>> Well, exactly that won't work.
>>>>>
>>>>> The message structure isn't TMZ protected because otherwise the 
>>>>> driver won't
>>>>> be able to stitch it together.
>>>>>
>>>>> What is TMZ protected are the surfaces the message structure is 
>>>>> pointing to.
>>>>> So what you would need to do is to completely parse the structure 
>>>>> and then
>>>>> move on the relevant buffers into VRAM.
>>>>>
>>>>> Leo or James, can you help with that?
>>>>   From my observations, when decoding secure contents, register
>>>> GPCOM_VCPU_DATA0 and GPCOM_VCPU_DATA1 are set to a TMZ buffer address.
>>>> And this way works when allocating TMZ buffers in GTT domain.
>>> As far as I remember that's only the case for the decoding, encoding 
>>> works
>>> by putting the addresses into the message buffer.
>>>
>>> But could be that decoding is sufficient, Leo and James need to 
>>> comment on
>>> this.
>> It seems that only decode needs TMZ buffers. Only observe 
>> si_vid_create_tmz_buffer()
>> was called in rvcn_dec_message_decode() in 
>> src/gallium/drivers/radeon/radeon_vcn_dec.c.
>
> Mhm, good point. Let's wait for Leo and James to wake up, when we 
> don't need encode support than that would makes things much easier.

For secure playback, the buffer required in TMZ are dpb, dt and ctx, for 
the rest esp. those for CPU access don't need that E.g. msg buffer, and 
bitstream buffer.

 From radeon_vcn_dec.c, you can see the buffer for dpb and ctx, and dt 
buffer frontend/va/surface is set to PIPE_BIND_PROTECTED.


Regards,

Leo



>
> Regards,
> Christian.
>
>>
>> Regards,
>> Lang
>>
>>> Regards,
>>> Christian.
>>>
>>>> Regards,
>>>> Lang
>>>>
>>>>> Regards,
>>>>> Christian.
>>>>>
>>>>>> +
>>>>>> +    return r;
>>>>>> +}
>>>>>> +
>>>>>> +static int vcn_v1_0_ring_patch_cs_in_place(struct 
>>>>>> amdgpu_cs_parser *p,
>>>>>> +                       struct amdgpu_job *job,
>>>>>> +                       struct amdgpu_ib *ib)
>>>>>> +{
>>>>>> +    uint32_t msg_lo = 0, msg_hi = 0;
>>>>>> +    int i, r;
>>>>>> +
>>>>>> +    for (i = 0; i < ib->length_dw; i += 2) {
>>>>>> +        uint32_t reg = amdgpu_ib_get_value(ib, i);
>>>>>> +        uint32_t val = amdgpu_ib_get_value(ib, i + 1);
>>>>>> +
>>>>>> +        if (reg == PACKET0(p->adev->vcn.internal.data0, 0)) {
>>>>>> +            msg_lo = val;
>>>>>> +        } else if (reg == PACKET0(p->adev->vcn.internal.data1, 
>>>>>> 0)) {
>>>>>> +            msg_hi = val;
>>>>>> +        } else if (reg == PACKET0(p->adev->vcn.internal.cmd, 0)) {
>>>>>> +            r = vcn_v1_0_validate_bo(p, job,
>>>>>> +                         ((u64)msg_hi) << 32 | msg_lo);
>>>>>> +            if (r)
>>>>>> +                return r;
>>>>>> +        }
>>>>>> +    }
>>>>>> +
>>>>>> +    return 0;
>>>>>> +}
>>>>>> +
>>>>>> +
>>>>>>     static const struct amdgpu_ring_funcs 
>>>>>> vcn_v1_0_dec_ring_vm_funcs = {
>>>>>>         .type = AMDGPU_RING_TYPE_VCN_DEC,
>>>>>>         .align_mask = 0xf,
>>>>>> @@ -1914,6 +1981,7 @@ static const struct amdgpu_ring_funcs 
>>>>>> vcn_v1_0_dec_ring_vm_funcs = {
>>>>>>         .get_rptr = vcn_v1_0_dec_ring_get_rptr,
>>>>>>         .get_wptr = vcn_v1_0_dec_ring_get_wptr,
>>>>>>         .set_wptr = vcn_v1_0_dec_ring_set_wptr,
>>>>>> +    .patch_cs_in_place = vcn_v1_0_ring_patch_cs_in_place,
>>>>>>         .emit_frame_size =
>>>>>>             6 + 6 + /* hdp invalidate / flush */
>>>>>>             SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2] drm/amdgpu: add workarounds for Raven VCN TMZ issue
  2022-03-08 16:18           ` Leo Liu
@ 2022-03-08 16:30             ` Leo Liu
  2022-03-08 19:23               ` James Zhu
  2022-03-10  8:45               ` Lang Yu
  0 siblings, 2 replies; 16+ messages in thread
From: Leo Liu @ 2022-03-08 16:30 UTC (permalink / raw)
  To: Christian König, Lang Yu, Christian König
  Cc: Alex Deucher, Zhu, James, Huang Rui, amd-gfx


On 2022-03-08 11:18, Leo Liu wrote:
>
> On 2022-03-08 04:16, Christian König wrote:
>> Am 08.03.22 um 09:06 schrieb Lang Yu:
>>> On 03/08/ , Christian König wrote:
>>>> Am 08.03.22 um 08:33 schrieb Lang Yu:
>>>>> On 03/08/ , Christian König wrote:
>>>>>> Am 08.03.22 um 04:39 schrieb Lang Yu:
>>>>>>> It is a hardware issue that VCN can't handle a GTT
>>>>>>> backing stored TMZ buffer on Raven.
>>>>>>>
>>>>>>> Move such a TMZ buffer to VRAM domain before command
>>>>>>> submission.
>>>>>>>
>>>>>>> v2:
>>>>>>>     - Use patch_cs_in_place callback.
>>>>>>>
>>>>>>> Suggested-by: Christian König <christian.koenig@amd.com>
>>>>>>> Signed-off-by: Lang Yu <Lang.Yu@amd.com>
>>>>>>> ---
>>>>>>>     drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 68 
>>>>>>> +++++++++++++++++++++++++++
>>>>>>>     1 file changed, 68 insertions(+)
>>>>>>>
>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c 
>>>>>>> b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>>>> index 7bbb9ba6b80b..810932abd3af 100644
>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>>>> @@ -24,6 +24,7 @@
>>>>>>>     #include <linux/firmware.h>
>>>>>>>     #include "amdgpu.h"
>>>>>>> +#include "amdgpu_cs.h"
>>>>>>>     #include "amdgpu_vcn.h"
>>>>>>>     #include "amdgpu_pm.h"
>>>>>>>     #include "soc15.h"
>>>>>>> @@ -1905,6 +1906,72 @@ static const struct amd_ip_funcs 
>>>>>>> vcn_v1_0_ip_funcs = {
>>>>>>>         .set_powergating_state = vcn_v1_0_set_powergating_state,
>>>>>>>     };
>>>>>>> +/**
>>>>>>> + * It is a hardware issue that Raven VCN can't handle a GTT TMZ 
>>>>>>> buffer.
>>>>>>> + * Move such a GTT TMZ buffer to VRAM domain before command 
>>>>>>> submission.
>>>>>>> + */
>>>>>>> +static int vcn_v1_0_validate_bo(struct amdgpu_cs_parser *parser,
>>>>>>> +                struct amdgpu_job *job,
>>>>>>> +                uint64_t addr)
>>>>>>> +{
>>>>>>> +    struct ttm_operation_ctx ctx = { false, false };
>>>>>>> +    struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;
>>>>>>> +    struct amdgpu_vm *vm = &fpriv->vm;
>>>>>>> +    struct amdgpu_bo_va_mapping *mapping;
>>>>>>> +    struct amdgpu_bo *bo;
>>>>>>> +    int r;
>>>>>>> +
>>>>>>> +    addr &= AMDGPU_GMC_HOLE_MASK;
>>>>>>> +    if (addr & 0x7) {
>>>>>>> +        DRM_ERROR("VCN messages must be 8 byte aligned!\n");
>>>>>>> +        return -EINVAL;
>>>>>>> +    }
>>>>>>> +
>>>>>>> +    mapping = amdgpu_vm_bo_lookup_mapping(vm, 
>>>>>>> addr/AMDGPU_GPU_PAGE_SIZE);
>>>>>>> +    if (!mapping || !mapping->bo_va || !mapping->bo_va->base.bo)
>>>>>>> +        return -EINVAL;
>>>>>>> +
>>>>>>> +    bo = mapping->bo_va->base.bo;
>>>>>>> +    if (!(bo->flags & AMDGPU_GEM_CREATE_ENCRYPTED))
>>>>>>> +        return 0;
>>>>>>> +
>>>>>>> +    amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_VRAM);
>>>>>>> +    r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
>>>>>>> +    if (r) {
>>>>>>> +        DRM_ERROR("Failed validating the VCN message BO 
>>>>>>> (%d)!\n", r);
>>>>>>> +        return r;
>>>>>>> +    }
>>>>>> Well, exactly that won't work.
>>>>>>
>>>>>> The message structure isn't TMZ protected because otherwise the 
>>>>>> driver won't
>>>>>> be able to stitch it together.
>>>>>>
>>>>>> What is TMZ protected are the surfaces the message structure is 
>>>>>> pointing to.
>>>>>> So what you would need to do is to completely parse the structure 
>>>>>> and then
>>>>>> move on the relevant buffers into VRAM.
>>>>>>
>>>>>> Leo or James, can you help with that?
>>>>>   From my observations, when decoding secure contents, register
>>>>> GPCOM_VCPU_DATA0 and GPCOM_VCPU_DATA1 are set to a TMZ buffer 
>>>>> address.
>>>>> And this way works when allocating TMZ buffers in GTT domain.
>>>> As far as I remember that's only the case for the decoding, 
>>>> encoding works
>>>> by putting the addresses into the message buffer.
>>>>
>>>> But could be that decoding is sufficient, Leo and James need to 
>>>> comment on
>>>> this.
>>> It seems that only decode needs TMZ buffers. Only observe 
>>> si_vid_create_tmz_buffer()
>>> was called in rvcn_dec_message_decode() in 
>>> src/gallium/drivers/radeon/radeon_vcn_dec.c.
>>
>> Mhm, good point. Let's wait for Leo and James to wake up, when we 
>> don't need encode support than that would makes things much easier.
>
> For secure playback, the buffer required in TMZ are dpb, dt and ctx, 
> for the rest esp. those for CPU access don't need that E.g. msg 
> buffer, and bitstream buffer.
>
> From radeon_vcn_dec.c, you can see the buffer for dpb and ctx, and dt 
> buffer frontend/va/surface is set to PIPE_BIND_PROTECTED.
>
>
> Regards,
>
> Leo
>
For VCN1, due to performance reason, the msg and fb buffer was allocated 
into VRAM instead of GTT(for other HW), but those are not TMZ in order 
to have CPU access.


Regards,

Leo



>
>
>>
>> Regards,
>> Christian.
>>
>>>
>>> Regards,
>>> Lang
>>>
>>>> Regards,
>>>> Christian.
>>>>
>>>>> Regards,
>>>>> Lang
>>>>>
>>>>>> Regards,
>>>>>> Christian.
>>>>>>
>>>>>>> +
>>>>>>> +    return r;
>>>>>>> +}
>>>>>>> +
>>>>>>> +static int vcn_v1_0_ring_patch_cs_in_place(struct 
>>>>>>> amdgpu_cs_parser *p,
>>>>>>> +                       struct amdgpu_job *job,
>>>>>>> +                       struct amdgpu_ib *ib)
>>>>>>> +{
>>>>>>> +    uint32_t msg_lo = 0, msg_hi = 0;
>>>>>>> +    int i, r;
>>>>>>> +
>>>>>>> +    for (i = 0; i < ib->length_dw; i += 2) {
>>>>>>> +        uint32_t reg = amdgpu_ib_get_value(ib, i);
>>>>>>> +        uint32_t val = amdgpu_ib_get_value(ib, i + 1);
>>>>>>> +
>>>>>>> +        if (reg == PACKET0(p->adev->vcn.internal.data0, 0)) {
>>>>>>> +            msg_lo = val;
>>>>>>> +        } else if (reg == PACKET0(p->adev->vcn.internal.data1, 
>>>>>>> 0)) {
>>>>>>> +            msg_hi = val;
>>>>>>> +        } else if (reg == PACKET0(p->adev->vcn.internal.cmd, 0)) {
>>>>>>> +            r = vcn_v1_0_validate_bo(p, job,
>>>>>>> +                         ((u64)msg_hi) << 32 | msg_lo);
>>>>>>> +            if (r)
>>>>>>> +                return r;
>>>>>>> +        }
>>>>>>> +    }
>>>>>>> +
>>>>>>> +    return 0;
>>>>>>> +}
>>>>>>> +
>>>>>>> +
>>>>>>>     static const struct amdgpu_ring_funcs 
>>>>>>> vcn_v1_0_dec_ring_vm_funcs = {
>>>>>>>         .type = AMDGPU_RING_TYPE_VCN_DEC,
>>>>>>>         .align_mask = 0xf,
>>>>>>> @@ -1914,6 +1981,7 @@ static const struct amdgpu_ring_funcs 
>>>>>>> vcn_v1_0_dec_ring_vm_funcs = {
>>>>>>>         .get_rptr = vcn_v1_0_dec_ring_get_rptr,
>>>>>>>         .get_wptr = vcn_v1_0_dec_ring_get_wptr,
>>>>>>>         .set_wptr = vcn_v1_0_dec_ring_set_wptr,
>>>>>>> +    .patch_cs_in_place = vcn_v1_0_ring_patch_cs_in_place,
>>>>>>>         .emit_frame_size =
>>>>>>>             6 + 6 + /* hdp invalidate / flush */
>>>>>>>             SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
>>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2] drm/amdgpu: add workarounds for Raven VCN TMZ issue
  2022-03-08 16:30             ` Leo Liu
@ 2022-03-08 19:23               ` James Zhu
  2022-03-10  8:45               ` Lang Yu
  1 sibling, 0 replies; 16+ messages in thread
From: James Zhu @ 2022-03-08 19:23 UTC (permalink / raw)
  To: Leo Liu, Christian König, Lang Yu, Christian König
  Cc: Alex Deucher, Zhang, Boyuan, Zhu, James, Huang Rui, amd-gfx

[-- Attachment #1: Type: text/plain, Size: 8602 bytes --]

+BoYuan

I am not sure if we need add ENCRYPT check when allocate surface if is 
supposed to be TMZ protected . For example:

VAStatus
*vlVaHandleSurfaceAllocate*(vlVaDriver *drv, vlVaSurface *surface,
                           struct pipe_video_buffer *templat,
                           const uint64_t *modifiers,
                           unsigned int modifiers_count)
{
    struct pipe_surface **surfaces;
    unsigned i;

*    if (is_encrypted && **templat) {/***is_encrypted is pseudocode*/
*

***templat->bind |= PIPE_BIND_PROTECTED;**
*

*    }*
    if (modifiers_count > 0) {
       if (!drv->pipe->create_video_buffer_with_modifiers)
          return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
       surface->buffer =
drv->pipe->create_video_buffer_with_modifiers(drv->pipe, templat,
                                                        modifiers,
modifiers_count);
    } else {
       surface->buffer = drv->pipe->create_video_buffer(drv->pipe, templat);
    }

Best Regards!

James

On 2022-03-08 11:30 a.m., Leo Liu wrote:
>
> On 2022-03-08 11:18, Leo Liu wrote:
>>
>> On 2022-03-08 04:16, Christian König wrote:
>>> Am 08.03.22 um 09:06 schrieb Lang Yu:
>>>> On 03/08/ , Christian König wrote:
>>>>> Am 08.03.22 um 08:33 schrieb Lang Yu:
>>>>>> On 03/08/ , Christian König wrote:
>>>>>>> Am 08.03.22 um 04:39 schrieb Lang Yu:
>>>>>>>> It is a hardware issue that VCN can't handle a GTT
>>>>>>>> backing stored TMZ buffer on Raven.
>>>>>>>>
>>>>>>>> Move such a TMZ buffer to VRAM domain before command
>>>>>>>> submission.
>>>>>>>>
>>>>>>>> v2:
>>>>>>>>     - Use patch_cs_in_place callback.
>>>>>>>>
>>>>>>>> Suggested-by: Christian König <christian.koenig@amd.com>
>>>>>>>> Signed-off-by: Lang Yu <Lang.Yu@amd.com>
>>>>>>>> ---
>>>>>>>>     drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 68 
>>>>>>>> +++++++++++++++++++++++++++
>>>>>>>>     1 file changed, 68 insertions(+)
>>>>>>>>
>>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c 
>>>>>>>> b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>>>>> index 7bbb9ba6b80b..810932abd3af 100644
>>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>>>>> @@ -24,6 +24,7 @@
>>>>>>>>     #include <linux/firmware.h>
>>>>>>>>     #include "amdgpu.h"
>>>>>>>> +#include "amdgpu_cs.h"
>>>>>>>>     #include "amdgpu_vcn.h"
>>>>>>>>     #include "amdgpu_pm.h"
>>>>>>>>     #include "soc15.h"
>>>>>>>> @@ -1905,6 +1906,72 @@ static const struct amd_ip_funcs 
>>>>>>>> vcn_v1_0_ip_funcs = {
>>>>>>>>         .set_powergating_state = vcn_v1_0_set_powergating_state,
>>>>>>>>     };
>>>>>>>> +/**
>>>>>>>> + * It is a hardware issue that Raven VCN can't handle a GTT 
>>>>>>>> TMZ buffer.
>>>>>>>> + * Move such a GTT TMZ buffer to VRAM domain before command 
>>>>>>>> submission.
>>>>>>>> + */
>>>>>>>> +static int vcn_v1_0_validate_bo(struct amdgpu_cs_parser *parser,
>>>>>>>> +                struct amdgpu_job *job,
>>>>>>>> +                uint64_t addr)
>>>>>>>> +{
>>>>>>>> +    struct ttm_operation_ctx ctx = { false, false };
>>>>>>>> +    struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;
>>>>>>>> +    struct amdgpu_vm *vm = &fpriv->vm;
>>>>>>>> +    struct amdgpu_bo_va_mapping *mapping;
>>>>>>>> +    struct amdgpu_bo *bo;
>>>>>>>> +    int r;
>>>>>>>> +
>>>>>>>> +    addr &= AMDGPU_GMC_HOLE_MASK;
>>>>>>>> +    if (addr & 0x7) {
>>>>>>>> +        DRM_ERROR("VCN messages must be 8 byte aligned!\n");
>>>>>>>> +        return -EINVAL;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    mapping = amdgpu_vm_bo_lookup_mapping(vm, 
>>>>>>>> addr/AMDGPU_GPU_PAGE_SIZE);
>>>>>>>> +    if (!mapping || !mapping->bo_va || !mapping->bo_va->base.bo)
>>>>>>>> +        return -EINVAL;
>>>>>>>> +
>>>>>>>> +    bo = mapping->bo_va->base.bo;
>>>>>>>> +    if (!(bo->flags & AMDGPU_GEM_CREATE_ENCRYPTED))
>>>>>>>> +        return 0;
>>>>>>>> +
>>>>>>>> +    amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_VRAM);
>>>>>>>> +    r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
>>>>>>>> +    if (r) {
>>>>>>>> +        DRM_ERROR("Failed validating the VCN message BO 
>>>>>>>> (%d)!\n", r);
>>>>>>>> +        return r;
>>>>>>>> +    }
>>>>>>> Well, exactly that won't work.
>>>>>>>
>>>>>>> The message structure isn't TMZ protected because otherwise the 
>>>>>>> driver won't
>>>>>>> be able to stitch it together.
>>>>>>>
>>>>>>> What is TMZ protected are the surfaces the message structure is 
>>>>>>> pointing to.
>>>>>>> So what you would need to do is to completely parse the 
>>>>>>> structure and then
>>>>>>> move on the relevant buffers into VRAM.
>>>>>>>
>>>>>>> Leo or James, can you help with that?
>>>>>>   From my observations, when decoding secure contents, register
>>>>>> GPCOM_VCPU_DATA0 and GPCOM_VCPU_DATA1 are set to a TMZ buffer 
>>>>>> address.
>>>>>> And this way works when allocating TMZ buffers in GTT domain.
>>>>> As far as I remember that's only the case for the decoding, 
>>>>> encoding works
>>>>> by putting the addresses into the message buffer.
>>>>>
>>>>> But could be that decoding is sufficient, Leo and James need to 
>>>>> comment on
>>>>> this.
>>>> It seems that only decode needs TMZ buffers. Only observe 
>>>> si_vid_create_tmz_buffer()
>>>> was called in rvcn_dec_message_decode() in 
>>>> src/gallium/drivers/radeon/radeon_vcn_dec.c.
>>>
>>> Mhm, good point. Let's wait for Leo and James to wake up, when we 
>>> don't need encode support than that would makes things much easier.
>>
>> For secure playback, the buffer required in TMZ are dpb, dt and ctx, 
>> for the rest esp. those for CPU access don't need that E.g. msg 
>> buffer, and bitstream buffer.
>>
>> From radeon_vcn_dec.c, you can see the buffer for dpb and ctx, and dt 
>> buffer frontend/va/surface is set to PIPE_BIND_PROTECTED.
>>
>>
>> Regards,
>>
>> Leo
>>
> For VCN1, due to performance reason, the msg and fb buffer was 
> allocated into VRAM instead of GTT(for other HW), but those are not 
> TMZ in order to have CPU access.
>
>
> Regards,
>
> Leo
>
>
>
>>
>>
>>>
>>> Regards,
>>> Christian.
>>>
>>>>
>>>> Regards,
>>>> Lang
>>>>
>>>>> Regards,
>>>>> Christian.
>>>>>
>>>>>> Regards,
>>>>>> Lang
>>>>>>
>>>>>>> Regards,
>>>>>>> Christian.
>>>>>>>
>>>>>>>> +
>>>>>>>> +    return r;
>>>>>>>> +}
>>>>>>>> +
>>>>>>>> +static int vcn_v1_0_ring_patch_cs_in_place(struct 
>>>>>>>> amdgpu_cs_parser *p,
>>>>>>>> +                       struct amdgpu_job *job,
>>>>>>>> +                       struct amdgpu_ib *ib)
>>>>>>>> +{
>>>>>>>> +    uint32_t msg_lo = 0, msg_hi = 0;
>>>>>>>> +    int i, r;
>>>>>>>> +
>>>>>>>> +    for (i = 0; i < ib->length_dw; i += 2) {
>>>>>>>> +        uint32_t reg = amdgpu_ib_get_value(ib, i);
>>>>>>>> +        uint32_t val = amdgpu_ib_get_value(ib, i + 1);
>>>>>>>> +
>>>>>>>> +        if (reg == PACKET0(p->adev->vcn.internal.data0, 0)) {
>>>>>>>> +            msg_lo = val;
>>>>>>>> +        } else if (reg == PACKET0(p->adev->vcn.internal.data1, 
>>>>>>>> 0)) {
>>>>>>>> +            msg_hi = val;
>>>>>>>> +        } else if (reg == PACKET0(p->adev->vcn.internal.cmd, 
>>>>>>>> 0)) {
>>>>>>>> +            r = vcn_v1_0_validate_bo(p, job,
>>>>>>>> +                         ((u64)msg_hi) << 32 | msg_lo);
>>>>>>>> +            if (r)
>>>>>>>> +                return r;
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    return 0;
>>>>>>>> +}
>>>>>>>> +
>>>>>>>> +
>>>>>>>>     static const struct amdgpu_ring_funcs 
>>>>>>>> vcn_v1_0_dec_ring_vm_funcs = {
>>>>>>>>         .type = AMDGPU_RING_TYPE_VCN_DEC,
>>>>>>>>         .align_mask = 0xf,
>>>>>>>> @@ -1914,6 +1981,7 @@ static const struct amdgpu_ring_funcs 
>>>>>>>> vcn_v1_0_dec_ring_vm_funcs = {
>>>>>>>>         .get_rptr = vcn_v1_0_dec_ring_get_rptr,
>>>>>>>>         .get_wptr = vcn_v1_0_dec_ring_get_wptr,
>>>>>>>>         .set_wptr = vcn_v1_0_dec_ring_set_wptr,
>>>>>>>> +    .patch_cs_in_place = vcn_v1_0_ring_patch_cs_in_place,
>>>>>>>>         .emit_frame_size =
>>>>>>>>             6 + 6 + /* hdp invalidate / flush */
>>>>>>>>             SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
>>>

[-- Attachment #2: Type: text/html, Size: 18766 bytes --]

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2] drm/amdgpu: add workarounds for Raven VCN TMZ issue
  2022-03-08 16:30             ` Leo Liu
  2022-03-08 19:23               ` James Zhu
@ 2022-03-10  8:45               ` Lang Yu
  2022-03-10  9:53                 ` Christian König
  1 sibling, 1 reply; 16+ messages in thread
From: Lang Yu @ 2022-03-10  8:45 UTC (permalink / raw)
  To: Leo Liu, Christian König
  Cc: Christian König, amd-gfx, Huang Rui, Alex Deucher, Zhu,
	James, Christian König

Ping.

On 03/08/ , Leo Liu wrote:
> 
> On 2022-03-08 11:18, Leo Liu wrote:
> > 
> > On 2022-03-08 04:16, Christian König wrote:
> > > Am 08.03.22 um 09:06 schrieb Lang Yu:
> > > > On 03/08/ , Christian König wrote:
> > > > > Am 08.03.22 um 08:33 schrieb Lang Yu:
> > > > > > On 03/08/ , Christian König wrote:
> > > > > > > Am 08.03.22 um 04:39 schrieb Lang Yu:
> > > > > > > > It is a hardware issue that VCN can't handle a GTT
> > > > > > > > backing stored TMZ buffer on Raven.
> > > > > > > > 
> > > > > > > > Move such a TMZ buffer to VRAM domain before command
> > > > > > > > submission.
> > > > > > > > 
> > > > > > > > v2:
> > > > > > > >     - Use patch_cs_in_place callback.
> > > > > > > > 
> > > > > > > > Suggested-by: Christian König <christian.koenig@amd.com>
> > > > > > > > Signed-off-by: Lang Yu <Lang.Yu@amd.com>
> > > > > > > > ---
> > > > > > > >     drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 68
> > > > > > > > +++++++++++++++++++++++++++
> > > > > > > >     1 file changed, 68 insertions(+)
> > > > > > > > 
> > > > > > > > diff --git
> > > > > > > > a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> > > > > > > > b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> > > > > > > > index 7bbb9ba6b80b..810932abd3af 100644
> > > > > > > > --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> > > > > > > > +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> > > > > > > > @@ -24,6 +24,7 @@
> > > > > > > >     #include <linux/firmware.h>
> > > > > > > >     #include "amdgpu.h"
> > > > > > > > +#include "amdgpu_cs.h"
> > > > > > > >     #include "amdgpu_vcn.h"
> > > > > > > >     #include "amdgpu_pm.h"
> > > > > > > >     #include "soc15.h"
> > > > > > > > @@ -1905,6 +1906,72 @@ static const struct
> > > > > > > > amd_ip_funcs vcn_v1_0_ip_funcs = {
> > > > > > > >         .set_powergating_state = vcn_v1_0_set_powergating_state,
> > > > > > > >     };
> > > > > > > > +/**
> > > > > > > > + * It is a hardware issue that Raven VCN can't
> > > > > > > > handle a GTT TMZ buffer.
> > > > > > > > + * Move such a GTT TMZ buffer to VRAM domain
> > > > > > > > before command submission.
> > > > > > > > + */
> > > > > > > > +static int vcn_v1_0_validate_bo(struct amdgpu_cs_parser *parser,
> > > > > > > > +                struct amdgpu_job *job,
> > > > > > > > +                uint64_t addr)
> > > > > > > > +{
> > > > > > > > +    struct ttm_operation_ctx ctx = { false, false };
> > > > > > > > +    struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;
> > > > > > > > +    struct amdgpu_vm *vm = &fpriv->vm;
> > > > > > > > +    struct amdgpu_bo_va_mapping *mapping;
> > > > > > > > +    struct amdgpu_bo *bo;
> > > > > > > > +    int r;
> > > > > > > > +
> > > > > > > > +    addr &= AMDGPU_GMC_HOLE_MASK;
> > > > > > > > +    if (addr & 0x7) {
> > > > > > > > +        DRM_ERROR("VCN messages must be 8 byte aligned!\n");
> > > > > > > > +        return -EINVAL;
> > > > > > > > +    }
> > > > > > > > +
> > > > > > > > +    mapping = amdgpu_vm_bo_lookup_mapping(vm,
> > > > > > > > addr/AMDGPU_GPU_PAGE_SIZE);
> > > > > > > > +    if (!mapping || !mapping->bo_va || !mapping->bo_va->base.bo)
> > > > > > > > +        return -EINVAL;
> > > > > > > > +
> > > > > > > > +    bo = mapping->bo_va->base.bo;
> > > > > > > > +    if (!(bo->flags & AMDGPU_GEM_CREATE_ENCRYPTED))
> > > > > > > > +        return 0;
> > > > > > > > +
> > > > > > > > +    amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_VRAM);
> > > > > > > > +    r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
> > > > > > > > +    if (r) {
> > > > > > > > +        DRM_ERROR("Failed validating the VCN
> > > > > > > > message BO (%d)!\n", r);
> > > > > > > > +        return r;
> > > > > > > > +    }
> > > > > > > Well, exactly that won't work.
> > > > > > > 
> > > > > > > The message structure isn't TMZ protected because
> > > > > > > otherwise the driver won't
> > > > > > > be able to stitch it together.
> > > > > > > 
> > > > > > > What is TMZ protected are the surfaces the message
> > > > > > > structure is pointing to.
> > > > > > > So what you would need to do is to completely parse
> > > > > > > the structure and then
> > > > > > > move on the relevant buffers into VRAM.
> > > > > > > 
> > > > > > > Leo or James, can you help with that?
> > > > > >   From my observations, when decoding secure contents, register
> > > > > > GPCOM_VCPU_DATA0 and GPCOM_VCPU_DATA1 are set to a TMZ
> > > > > > buffer address.
> > > > > > And this way works when allocating TMZ buffers in GTT domain.
> > > > > As far as I remember that's only the case for the decoding,
> > > > > encoding works
> > > > > by putting the addresses into the message buffer.
> > > > > 
> > > > > But could be that decoding is sufficient, Leo and James need
> > > > > to comment on
> > > > > this.
> > > > It seems that only decode needs TMZ buffers. Only observe
> > > > si_vid_create_tmz_buffer()
> > > > was called in rvcn_dec_message_decode() in
> > > > src/gallium/drivers/radeon/radeon_vcn_dec.c.
> > > 
> > > Mhm, good point. Let's wait for Leo and James to wake up, when we
> > > don't need encode support than that would makes things much easier.
> > 
> > For secure playback, the buffer required in TMZ are dpb, dt and ctx, for
> > the rest esp. those for CPU access don't need that E.g. msg buffer, and
> > bitstream buffer.
> > 
> > From radeon_vcn_dec.c, you can see the buffer for dpb and ctx, and dt
> > buffer frontend/va/surface is set to PIPE_BIND_PROTECTED.
> > 
> > 
> > Regards,
> > 
> > Leo
> > 
> For VCN1, due to performance reason, the msg and fb buffer was allocated
> into VRAM instead of GTT(for other HW), but those are not TMZ in order to
> have CPU access.
> 
> 
> Regards,
> 
> Leo
> 
> 
> 
> > 
> > 
> > > 
> > > Regards,
> > > Christian.
> > > 
> > > > 
> > > > Regards,
> > > > Lang
> > > > 
> > > > > Regards,
> > > > > Christian.
> > > > > 
> > > > > > Regards,
> > > > > > Lang
> > > > > > 
> > > > > > > Regards,
> > > > > > > Christian.
> > > > > > > 
> > > > > > > > +
> > > > > > > > +    return r;
> > > > > > > > +}
> > > > > > > > +
> > > > > > > > +static int
> > > > > > > > vcn_v1_0_ring_patch_cs_in_place(struct
> > > > > > > > amdgpu_cs_parser *p,
> > > > > > > > +                       struct amdgpu_job *job,
> > > > > > > > +                       struct amdgpu_ib *ib)
> > > > > > > > +{
> > > > > > > > +    uint32_t msg_lo = 0, msg_hi = 0;
> > > > > > > > +    int i, r;
> > > > > > > > +
> > > > > > > > +    for (i = 0; i < ib->length_dw; i += 2) {
> > > > > > > > +        uint32_t reg = amdgpu_ib_get_value(ib, i);
> > > > > > > > +        uint32_t val = amdgpu_ib_get_value(ib, i + 1);
> > > > > > > > +
> > > > > > > > +        if (reg == PACKET0(p->adev->vcn.internal.data0, 0)) {
> > > > > > > > +            msg_lo = val;
> > > > > > > > +        } else if (reg ==
> > > > > > > > PACKET0(p->adev->vcn.internal.data1, 0)) {
> > > > > > > > +            msg_hi = val;
> > > > > > > > +        } else if (reg == PACKET0(p->adev->vcn.internal.cmd, 0)) {
> > > > > > > > +            r = vcn_v1_0_validate_bo(p, job,
> > > > > > > > +                         ((u64)msg_hi) << 32 | msg_lo);
> > > > > > > > +            if (r)
> > > > > > > > +                return r;
> > > > > > > > +        }
> > > > > > > > +    }
> > > > > > > > +
> > > > > > > > +    return 0;
> > > > > > > > +}
> > > > > > > > +
> > > > > > > > +
> > > > > > > >     static const struct amdgpu_ring_funcs
> > > > > > > > vcn_v1_0_dec_ring_vm_funcs = {
> > > > > > > >         .type = AMDGPU_RING_TYPE_VCN_DEC,
> > > > > > > >         .align_mask = 0xf,
> > > > > > > > @@ -1914,6 +1981,7 @@ static const struct
> > > > > > > > amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
> > > > > > > >         .get_rptr = vcn_v1_0_dec_ring_get_rptr,
> > > > > > > >         .get_wptr = vcn_v1_0_dec_ring_get_wptr,
> > > > > > > >         .set_wptr = vcn_v1_0_dec_ring_set_wptr,
> > > > > > > > +    .patch_cs_in_place = vcn_v1_0_ring_patch_cs_in_place,
> > > > > > > >         .emit_frame_size =
> > > > > > > >             6 + 6 + /* hdp invalidate / flush */
> > > > > > > >             SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
> > > 

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2] drm/amdgpu: add workarounds for Raven VCN TMZ issue
  2022-03-10  8:45               ` Lang Yu
@ 2022-03-10  9:53                 ` Christian König
  2022-03-10 14:17                   ` Leo Liu
  0 siblings, 1 reply; 16+ messages in thread
From: Christian König @ 2022-03-10  9:53 UTC (permalink / raw)
  To: Lang Yu, Leo Liu
  Cc: Alex Deucher, Christian König, Zhu, James, Huang Rui, amd-gfx

Leo you didn't answered the question if we need TMZ for encode as well.

Regards,
Christian.

Am 10.03.22 um 09:45 schrieb Lang Yu:
> Ping.
>
> On 03/08/ , Leo Liu wrote:
>> On 2022-03-08 11:18, Leo Liu wrote:
>>> On 2022-03-08 04:16, Christian König wrote:
>>>> Am 08.03.22 um 09:06 schrieb Lang Yu:
>>>>> On 03/08/ , Christian König wrote:
>>>>>> Am 08.03.22 um 08:33 schrieb Lang Yu:
>>>>>>> On 03/08/ , Christian König wrote:
>>>>>>>> Am 08.03.22 um 04:39 schrieb Lang Yu:
>>>>>>>>> It is a hardware issue that VCN can't handle a GTT
>>>>>>>>> backing stored TMZ buffer on Raven.
>>>>>>>>>
>>>>>>>>> Move such a TMZ buffer to VRAM domain before command
>>>>>>>>> submission.
>>>>>>>>>
>>>>>>>>> v2:
>>>>>>>>>      - Use patch_cs_in_place callback.
>>>>>>>>>
>>>>>>>>> Suggested-by: Christian König <christian.koenig@amd.com>
>>>>>>>>> Signed-off-by: Lang Yu <Lang.Yu@amd.com>
>>>>>>>>> ---
>>>>>>>>>      drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 68
>>>>>>>>> +++++++++++++++++++++++++++
>>>>>>>>>      1 file changed, 68 insertions(+)
>>>>>>>>>
>>>>>>>>> diff --git
>>>>>>>>> a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>>>>>> b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>>>>>> index 7bbb9ba6b80b..810932abd3af 100644
>>>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>>>>>> @@ -24,6 +24,7 @@
>>>>>>>>>      #include <linux/firmware.h>
>>>>>>>>>      #include "amdgpu.h"
>>>>>>>>> +#include "amdgpu_cs.h"
>>>>>>>>>      #include "amdgpu_vcn.h"
>>>>>>>>>      #include "amdgpu_pm.h"
>>>>>>>>>      #include "soc15.h"
>>>>>>>>> @@ -1905,6 +1906,72 @@ static const struct
>>>>>>>>> amd_ip_funcs vcn_v1_0_ip_funcs = {
>>>>>>>>>          .set_powergating_state = vcn_v1_0_set_powergating_state,
>>>>>>>>>      };
>>>>>>>>> +/**
>>>>>>>>> + * It is a hardware issue that Raven VCN can't
>>>>>>>>> handle a GTT TMZ buffer.
>>>>>>>>> + * Move such a GTT TMZ buffer to VRAM domain
>>>>>>>>> before command submission.
>>>>>>>>> + */
>>>>>>>>> +static int vcn_v1_0_validate_bo(struct amdgpu_cs_parser *parser,
>>>>>>>>> +                struct amdgpu_job *job,
>>>>>>>>> +                uint64_t addr)
>>>>>>>>> +{
>>>>>>>>> +    struct ttm_operation_ctx ctx = { false, false };
>>>>>>>>> +    struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;
>>>>>>>>> +    struct amdgpu_vm *vm = &fpriv->vm;
>>>>>>>>> +    struct amdgpu_bo_va_mapping *mapping;
>>>>>>>>> +    struct amdgpu_bo *bo;
>>>>>>>>> +    int r;
>>>>>>>>> +
>>>>>>>>> +    addr &= AMDGPU_GMC_HOLE_MASK;
>>>>>>>>> +    if (addr & 0x7) {
>>>>>>>>> +        DRM_ERROR("VCN messages must be 8 byte aligned!\n");
>>>>>>>>> +        return -EINVAL;
>>>>>>>>> +    }
>>>>>>>>> +
>>>>>>>>> +    mapping = amdgpu_vm_bo_lookup_mapping(vm,
>>>>>>>>> addr/AMDGPU_GPU_PAGE_SIZE);
>>>>>>>>> +    if (!mapping || !mapping->bo_va || !mapping->bo_va->base.bo)
>>>>>>>>> +        return -EINVAL;
>>>>>>>>> +
>>>>>>>>> +    bo = mapping->bo_va->base.bo;
>>>>>>>>> +    if (!(bo->flags & AMDGPU_GEM_CREATE_ENCRYPTED))
>>>>>>>>> +        return 0;
>>>>>>>>> +
>>>>>>>>> +    amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_VRAM);
>>>>>>>>> +    r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
>>>>>>>>> +    if (r) {
>>>>>>>>> +        DRM_ERROR("Failed validating the VCN
>>>>>>>>> message BO (%d)!\n", r);
>>>>>>>>> +        return r;
>>>>>>>>> +    }
>>>>>>>> Well, exactly that won't work.
>>>>>>>>
>>>>>>>> The message structure isn't TMZ protected because
>>>>>>>> otherwise the driver won't
>>>>>>>> be able to stitch it together.
>>>>>>>>
>>>>>>>> What is TMZ protected are the surfaces the message
>>>>>>>> structure is pointing to.
>>>>>>>> So what you would need to do is to completely parse
>>>>>>>> the structure and then
>>>>>>>> move on the relevant buffers into VRAM.
>>>>>>>>
>>>>>>>> Leo or James, can you help with that?
>>>>>>>    From my observations, when decoding secure contents, register
>>>>>>> GPCOM_VCPU_DATA0 and GPCOM_VCPU_DATA1 are set to a TMZ
>>>>>>> buffer address.
>>>>>>> And this way works when allocating TMZ buffers in GTT domain.
>>>>>> As far as I remember that's only the case for the decoding,
>>>>>> encoding works
>>>>>> by putting the addresses into the message buffer.
>>>>>>
>>>>>> But could be that decoding is sufficient, Leo and James need
>>>>>> to comment on
>>>>>> this.
>>>>> It seems that only decode needs TMZ buffers. Only observe
>>>>> si_vid_create_tmz_buffer()
>>>>> was called in rvcn_dec_message_decode() in
>>>>> src/gallium/drivers/radeon/radeon_vcn_dec.c.
>>>> Mhm, good point. Let's wait for Leo and James to wake up, when we
>>>> don't need encode support than that would makes things much easier.
>>> For secure playback, the buffer required in TMZ are dpb, dt and ctx, for
>>> the rest esp. those for CPU access don't need that E.g. msg buffer, and
>>> bitstream buffer.
>>>
>>>  From radeon_vcn_dec.c, you can see the buffer for dpb and ctx, and dt
>>> buffer frontend/va/surface is set to PIPE_BIND_PROTECTED.
>>>
>>>
>>> Regards,
>>>
>>> Leo
>>>
>> For VCN1, due to performance reason, the msg and fb buffer was allocated
>> into VRAM instead of GTT(for other HW), but those are not TMZ in order to
>> have CPU access.
>>
>>
>> Regards,
>>
>> Leo
>>
>>
>>
>>>
>>>> Regards,
>>>> Christian.
>>>>
>>>>> Regards,
>>>>> Lang
>>>>>
>>>>>> Regards,
>>>>>> Christian.
>>>>>>
>>>>>>> Regards,
>>>>>>> Lang
>>>>>>>
>>>>>>>> Regards,
>>>>>>>> Christian.
>>>>>>>>
>>>>>>>>> +
>>>>>>>>> +    return r;
>>>>>>>>> +}
>>>>>>>>> +
>>>>>>>>> +static int
>>>>>>>>> vcn_v1_0_ring_patch_cs_in_place(struct
>>>>>>>>> amdgpu_cs_parser *p,
>>>>>>>>> +                       struct amdgpu_job *job,
>>>>>>>>> +                       struct amdgpu_ib *ib)
>>>>>>>>> +{
>>>>>>>>> +    uint32_t msg_lo = 0, msg_hi = 0;
>>>>>>>>> +    int i, r;
>>>>>>>>> +
>>>>>>>>> +    for (i = 0; i < ib->length_dw; i += 2) {
>>>>>>>>> +        uint32_t reg = amdgpu_ib_get_value(ib, i);
>>>>>>>>> +        uint32_t val = amdgpu_ib_get_value(ib, i + 1);
>>>>>>>>> +
>>>>>>>>> +        if (reg == PACKET0(p->adev->vcn.internal.data0, 0)) {
>>>>>>>>> +            msg_lo = val;
>>>>>>>>> +        } else if (reg ==
>>>>>>>>> PACKET0(p->adev->vcn.internal.data1, 0)) {
>>>>>>>>> +            msg_hi = val;
>>>>>>>>> +        } else if (reg == PACKET0(p->adev->vcn.internal.cmd, 0)) {
>>>>>>>>> +            r = vcn_v1_0_validate_bo(p, job,
>>>>>>>>> +                         ((u64)msg_hi) << 32 | msg_lo);
>>>>>>>>> +            if (r)
>>>>>>>>> +                return r;
>>>>>>>>> +        }
>>>>>>>>> +    }
>>>>>>>>> +
>>>>>>>>> +    return 0;
>>>>>>>>> +}
>>>>>>>>> +
>>>>>>>>> +
>>>>>>>>>      static const struct amdgpu_ring_funcs
>>>>>>>>> vcn_v1_0_dec_ring_vm_funcs = {
>>>>>>>>>          .type = AMDGPU_RING_TYPE_VCN_DEC,
>>>>>>>>>          .align_mask = 0xf,
>>>>>>>>> @@ -1914,6 +1981,7 @@ static const struct
>>>>>>>>> amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
>>>>>>>>>          .get_rptr = vcn_v1_0_dec_ring_get_rptr,
>>>>>>>>>          .get_wptr = vcn_v1_0_dec_ring_get_wptr,
>>>>>>>>>          .set_wptr = vcn_v1_0_dec_ring_set_wptr,
>>>>>>>>> +    .patch_cs_in_place = vcn_v1_0_ring_patch_cs_in_place,
>>>>>>>>>          .emit_frame_size =
>>>>>>>>>              6 + 6 + /* hdp invalidate / flush */
>>>>>>>>>              SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2] drm/amdgpu: add workarounds for Raven VCN TMZ issue
  2022-03-10  9:53                 ` Christian König
@ 2022-03-10 14:17                   ` Leo Liu
  2022-03-10 14:25                     ` Christian König
  0 siblings, 1 reply; 16+ messages in thread
From: Leo Liu @ 2022-03-10 14:17 UTC (permalink / raw)
  To: Christian König, Lang Yu
  Cc: Alex Deucher, Christian König, Zhu, James, Huang Rui, amd-gfx

No need for encode. Encrypting uses TEE/TA to convert clear bitstream to 
encrypted bitstream, and has nothing to do with VCN encode and tmz.

Regards,

Leo


On 2022-03-10 04:53, Christian König wrote:
> Leo you didn't answered the question if we need TMZ for encode as well.
>
> Regards,
> Christian.
>
> Am 10.03.22 um 09:45 schrieb Lang Yu:
>> Ping.
>>
>> On 03/08/ , Leo Liu wrote:
>>> On 2022-03-08 11:18, Leo Liu wrote:
>>>> On 2022-03-08 04:16, Christian König wrote:
>>>>> Am 08.03.22 um 09:06 schrieb Lang Yu:
>>>>>> On 03/08/ , Christian König wrote:
>>>>>>> Am 08.03.22 um 08:33 schrieb Lang Yu:
>>>>>>>> On 03/08/ , Christian König wrote:
>>>>>>>>> Am 08.03.22 um 04:39 schrieb Lang Yu:
>>>>>>>>>> It is a hardware issue that VCN can't handle a GTT
>>>>>>>>>> backing stored TMZ buffer on Raven.
>>>>>>>>>>
>>>>>>>>>> Move such a TMZ buffer to VRAM domain before command
>>>>>>>>>> submission.
>>>>>>>>>>
>>>>>>>>>> v2:
>>>>>>>>>>      - Use patch_cs_in_place callback.
>>>>>>>>>>
>>>>>>>>>> Suggested-by: Christian König <christian.koenig@amd.com>
>>>>>>>>>> Signed-off-by: Lang Yu <Lang.Yu@amd.com>
>>>>>>>>>> ---
>>>>>>>>>>      drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 68
>>>>>>>>>> +++++++++++++++++++++++++++
>>>>>>>>>>      1 file changed, 68 insertions(+)
>>>>>>>>>>
>>>>>>>>>> diff --git
>>>>>>>>>> a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>>>>>>> b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>>>>>>> index 7bbb9ba6b80b..810932abd3af 100644
>>>>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>>>>>>> @@ -24,6 +24,7 @@
>>>>>>>>>>      #include <linux/firmware.h>
>>>>>>>>>>      #include "amdgpu.h"
>>>>>>>>>> +#include "amdgpu_cs.h"
>>>>>>>>>>      #include "amdgpu_vcn.h"
>>>>>>>>>>      #include "amdgpu_pm.h"
>>>>>>>>>>      #include "soc15.h"
>>>>>>>>>> @@ -1905,6 +1906,72 @@ static const struct
>>>>>>>>>> amd_ip_funcs vcn_v1_0_ip_funcs = {
>>>>>>>>>>          .set_powergating_state = 
>>>>>>>>>> vcn_v1_0_set_powergating_state,
>>>>>>>>>>      };
>>>>>>>>>> +/**
>>>>>>>>>> + * It is a hardware issue that Raven VCN can't
>>>>>>>>>> handle a GTT TMZ buffer.
>>>>>>>>>> + * Move such a GTT TMZ buffer to VRAM domain
>>>>>>>>>> before command submission.
>>>>>>>>>> + */
>>>>>>>>>> +static int vcn_v1_0_validate_bo(struct amdgpu_cs_parser 
>>>>>>>>>> *parser,
>>>>>>>>>> +                struct amdgpu_job *job,
>>>>>>>>>> +                uint64_t addr)
>>>>>>>>>> +{
>>>>>>>>>> +    struct ttm_operation_ctx ctx = { false, false };
>>>>>>>>>> +    struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;
>>>>>>>>>> +    struct amdgpu_vm *vm = &fpriv->vm;
>>>>>>>>>> +    struct amdgpu_bo_va_mapping *mapping;
>>>>>>>>>> +    struct amdgpu_bo *bo;
>>>>>>>>>> +    int r;
>>>>>>>>>> +
>>>>>>>>>> +    addr &= AMDGPU_GMC_HOLE_MASK;
>>>>>>>>>> +    if (addr & 0x7) {
>>>>>>>>>> +        DRM_ERROR("VCN messages must be 8 byte aligned!\n");
>>>>>>>>>> +        return -EINVAL;
>>>>>>>>>> +    }
>>>>>>>>>> +
>>>>>>>>>> +    mapping = amdgpu_vm_bo_lookup_mapping(vm,
>>>>>>>>>> addr/AMDGPU_GPU_PAGE_SIZE);
>>>>>>>>>> +    if (!mapping || !mapping->bo_va || 
>>>>>>>>>> !mapping->bo_va->base.bo)
>>>>>>>>>> +        return -EINVAL;
>>>>>>>>>> +
>>>>>>>>>> +    bo = mapping->bo_va->base.bo;
>>>>>>>>>> +    if (!(bo->flags & AMDGPU_GEM_CREATE_ENCRYPTED))
>>>>>>>>>> +        return 0;
>>>>>>>>>> +
>>>>>>>>>> +    amdgpu_bo_placement_from_domain(bo, 
>>>>>>>>>> AMDGPU_GEM_DOMAIN_VRAM);
>>>>>>>>>> +    r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
>>>>>>>>>> +    if (r) {
>>>>>>>>>> +        DRM_ERROR("Failed validating the VCN
>>>>>>>>>> message BO (%d)!\n", r);
>>>>>>>>>> +        return r;
>>>>>>>>>> +    }
>>>>>>>>> Well, exactly that won't work.
>>>>>>>>>
>>>>>>>>> The message structure isn't TMZ protected because
>>>>>>>>> otherwise the driver won't
>>>>>>>>> be able to stitch it together.
>>>>>>>>>
>>>>>>>>> What is TMZ protected are the surfaces the message
>>>>>>>>> structure is pointing to.
>>>>>>>>> So what you would need to do is to completely parse
>>>>>>>>> the structure and then
>>>>>>>>> move on the relevant buffers into VRAM.
>>>>>>>>>
>>>>>>>>> Leo or James, can you help with that?
>>>>>>>>    From my observations, when decoding secure contents, register
>>>>>>>> GPCOM_VCPU_DATA0 and GPCOM_VCPU_DATA1 are set to a TMZ
>>>>>>>> buffer address.
>>>>>>>> And this way works when allocating TMZ buffers in GTT domain.
>>>>>>> As far as I remember that's only the case for the decoding,
>>>>>>> encoding works
>>>>>>> by putting the addresses into the message buffer.
>>>>>>>
>>>>>>> But could be that decoding is sufficient, Leo and James need
>>>>>>> to comment on
>>>>>>> this.
>>>>>> It seems that only decode needs TMZ buffers. Only observe
>>>>>> si_vid_create_tmz_buffer()
>>>>>> was called in rvcn_dec_message_decode() in
>>>>>> src/gallium/drivers/radeon/radeon_vcn_dec.c.
>>>>> Mhm, good point. Let's wait for Leo and James to wake up, when we
>>>>> don't need encode support than that would makes things much easier.
>>>> For secure playback, the buffer required in TMZ are dpb, dt and 
>>>> ctx, for
>>>> the rest esp. those for CPU access don't need that E.g. msg buffer, 
>>>> and
>>>> bitstream buffer.
>>>>
>>>>  From radeon_vcn_dec.c, you can see the buffer for dpb and ctx, and dt
>>>> buffer frontend/va/surface is set to PIPE_BIND_PROTECTED.
>>>>
>>>>
>>>> Regards,
>>>>
>>>> Leo
>>>>
>>> For VCN1, due to performance reason, the msg and fb buffer was 
>>> allocated
>>> into VRAM instead of GTT(for other HW), but those are not TMZ in 
>>> order to
>>> have CPU access.
>>>
>>>
>>> Regards,
>>>
>>> Leo
>>>
>>>
>>>
>>>>
>>>>> Regards,
>>>>> Christian.
>>>>>
>>>>>> Regards,
>>>>>> Lang
>>>>>>
>>>>>>> Regards,
>>>>>>> Christian.
>>>>>>>
>>>>>>>> Regards,
>>>>>>>> Lang
>>>>>>>>
>>>>>>>>> Regards,
>>>>>>>>> Christian.
>>>>>>>>>
>>>>>>>>>> +
>>>>>>>>>> +    return r;
>>>>>>>>>> +}
>>>>>>>>>> +
>>>>>>>>>> +static int
>>>>>>>>>> vcn_v1_0_ring_patch_cs_in_place(struct
>>>>>>>>>> amdgpu_cs_parser *p,
>>>>>>>>>> +                       struct amdgpu_job *job,
>>>>>>>>>> +                       struct amdgpu_ib *ib)
>>>>>>>>>> +{
>>>>>>>>>> +    uint32_t msg_lo = 0, msg_hi = 0;
>>>>>>>>>> +    int i, r;
>>>>>>>>>> +
>>>>>>>>>> +    for (i = 0; i < ib->length_dw; i += 2) {
>>>>>>>>>> +        uint32_t reg = amdgpu_ib_get_value(ib, i);
>>>>>>>>>> +        uint32_t val = amdgpu_ib_get_value(ib, i + 1);
>>>>>>>>>> +
>>>>>>>>>> +        if (reg == PACKET0(p->adev->vcn.internal.data0, 0)) {
>>>>>>>>>> +            msg_lo = val;
>>>>>>>>>> +        } else if (reg ==
>>>>>>>>>> PACKET0(p->adev->vcn.internal.data1, 0)) {
>>>>>>>>>> +            msg_hi = val;
>>>>>>>>>> +        } else if (reg == PACKET0(p->adev->vcn.internal.cmd, 
>>>>>>>>>> 0)) {
>>>>>>>>>> +            r = vcn_v1_0_validate_bo(p, job,
>>>>>>>>>> +                         ((u64)msg_hi) << 32 | msg_lo);
>>>>>>>>>> +            if (r)
>>>>>>>>>> +                return r;
>>>>>>>>>> +        }
>>>>>>>>>> +    }
>>>>>>>>>> +
>>>>>>>>>> +    return 0;
>>>>>>>>>> +}
>>>>>>>>>> +
>>>>>>>>>> +
>>>>>>>>>>      static const struct amdgpu_ring_funcs
>>>>>>>>>> vcn_v1_0_dec_ring_vm_funcs = {
>>>>>>>>>>          .type = AMDGPU_RING_TYPE_VCN_DEC,
>>>>>>>>>>          .align_mask = 0xf,
>>>>>>>>>> @@ -1914,6 +1981,7 @@ static const struct
>>>>>>>>>> amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
>>>>>>>>>>          .get_rptr = vcn_v1_0_dec_ring_get_rptr,
>>>>>>>>>>          .get_wptr = vcn_v1_0_dec_ring_get_wptr,
>>>>>>>>>>          .set_wptr = vcn_v1_0_dec_ring_set_wptr,
>>>>>>>>>> +    .patch_cs_in_place = vcn_v1_0_ring_patch_cs_in_place,
>>>>>>>>>>          .emit_frame_size =
>>>>>>>>>>              6 + 6 + /* hdp invalidate / flush */
>>>>>>>>>>              SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2] drm/amdgpu: add workarounds for Raven VCN TMZ issue
  2022-03-10 14:17                   ` Leo Liu
@ 2022-03-10 14:25                     ` Christian König
  2022-03-11  2:32                       ` Lang Yu
  0 siblings, 1 reply; 16+ messages in thread
From: Christian König @ 2022-03-10 14:25 UTC (permalink / raw)
  To: Leo Liu, Lang Yu
  Cc: Alex Deucher, Christian König, Zhu, James, Huang Rui, amd-gfx

Ok, thanks.

Lang is that case your patch should work fine.

Just add another patch with a check for the encode case to reject any CS 
with TMZ buffers in it.

Thanks,
Christian.

Am 10.03.22 um 15:17 schrieb Leo Liu:
> No need for encode. Encrypting uses TEE/TA to convert clear bitstream 
> to encrypted bitstream, and has nothing to do with VCN encode and tmz.
>
> Regards,
>
> Leo
>
>
> On 2022-03-10 04:53, Christian König wrote:
>> Leo you didn't answered the question if we need TMZ for encode as well.
>>
>> Regards,
>> Christian.
>>
>> Am 10.03.22 um 09:45 schrieb Lang Yu:
>>> Ping.
>>>
>>> On 03/08/ , Leo Liu wrote:
>>>> On 2022-03-08 11:18, Leo Liu wrote:
>>>>> On 2022-03-08 04:16, Christian König wrote:
>>>>>> Am 08.03.22 um 09:06 schrieb Lang Yu:
>>>>>>> On 03/08/ , Christian König wrote:
>>>>>>>> Am 08.03.22 um 08:33 schrieb Lang Yu:
>>>>>>>>> On 03/08/ , Christian König wrote:
>>>>>>>>>> Am 08.03.22 um 04:39 schrieb Lang Yu:
>>>>>>>>>>> It is a hardware issue that VCN can't handle a GTT
>>>>>>>>>>> backing stored TMZ buffer on Raven.
>>>>>>>>>>>
>>>>>>>>>>> Move such a TMZ buffer to VRAM domain before command
>>>>>>>>>>> submission.
>>>>>>>>>>>
>>>>>>>>>>> v2:
>>>>>>>>>>>      - Use patch_cs_in_place callback.
>>>>>>>>>>>
>>>>>>>>>>> Suggested-by: Christian König <christian.koenig@amd.com>
>>>>>>>>>>> Signed-off-by: Lang Yu <Lang.Yu@amd.com>
>>>>>>>>>>> ---
>>>>>>>>>>>      drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 68
>>>>>>>>>>> +++++++++++++++++++++++++++
>>>>>>>>>>>      1 file changed, 68 insertions(+)
>>>>>>>>>>>
>>>>>>>>>>> diff --git
>>>>>>>>>>> a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>>>>>>>> b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>>>>>>>> index 7bbb9ba6b80b..810932abd3af 100644
>>>>>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>>>>>>>>>>> @@ -24,6 +24,7 @@
>>>>>>>>>>>      #include <linux/firmware.h>
>>>>>>>>>>>      #include "amdgpu.h"
>>>>>>>>>>> +#include "amdgpu_cs.h"
>>>>>>>>>>>      #include "amdgpu_vcn.h"
>>>>>>>>>>>      #include "amdgpu_pm.h"
>>>>>>>>>>>      #include "soc15.h"
>>>>>>>>>>> @@ -1905,6 +1906,72 @@ static const struct
>>>>>>>>>>> amd_ip_funcs vcn_v1_0_ip_funcs = {
>>>>>>>>>>>          .set_powergating_state = 
>>>>>>>>>>> vcn_v1_0_set_powergating_state,
>>>>>>>>>>>      };
>>>>>>>>>>> +/**
>>>>>>>>>>> + * It is a hardware issue that Raven VCN can't
>>>>>>>>>>> handle a GTT TMZ buffer.
>>>>>>>>>>> + * Move such a GTT TMZ buffer to VRAM domain
>>>>>>>>>>> before command submission.
>>>>>>>>>>> + */
>>>>>>>>>>> +static int vcn_v1_0_validate_bo(struct amdgpu_cs_parser 
>>>>>>>>>>> *parser,
>>>>>>>>>>> +                struct amdgpu_job *job,
>>>>>>>>>>> +                uint64_t addr)
>>>>>>>>>>> +{
>>>>>>>>>>> +    struct ttm_operation_ctx ctx = { false, false };
>>>>>>>>>>> +    struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;
>>>>>>>>>>> +    struct amdgpu_vm *vm = &fpriv->vm;
>>>>>>>>>>> +    struct amdgpu_bo_va_mapping *mapping;
>>>>>>>>>>> +    struct amdgpu_bo *bo;
>>>>>>>>>>> +    int r;
>>>>>>>>>>> +
>>>>>>>>>>> +    addr &= AMDGPU_GMC_HOLE_MASK;
>>>>>>>>>>> +    if (addr & 0x7) {
>>>>>>>>>>> +        DRM_ERROR("VCN messages must be 8 byte aligned!\n");
>>>>>>>>>>> +        return -EINVAL;
>>>>>>>>>>> +    }
>>>>>>>>>>> +
>>>>>>>>>>> +    mapping = amdgpu_vm_bo_lookup_mapping(vm,
>>>>>>>>>>> addr/AMDGPU_GPU_PAGE_SIZE);
>>>>>>>>>>> +    if (!mapping || !mapping->bo_va || 
>>>>>>>>>>> !mapping->bo_va->base.bo)
>>>>>>>>>>> +        return -EINVAL;
>>>>>>>>>>> +
>>>>>>>>>>> +    bo = mapping->bo_va->base.bo;
>>>>>>>>>>> +    if (!(bo->flags & AMDGPU_GEM_CREATE_ENCRYPTED))
>>>>>>>>>>> +        return 0;
>>>>>>>>>>> +
>>>>>>>>>>> +    amdgpu_bo_placement_from_domain(bo, 
>>>>>>>>>>> AMDGPU_GEM_DOMAIN_VRAM);
>>>>>>>>>>> +    r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
>>>>>>>>>>> +    if (r) {
>>>>>>>>>>> +        DRM_ERROR("Failed validating the VCN
>>>>>>>>>>> message BO (%d)!\n", r);
>>>>>>>>>>> +        return r;
>>>>>>>>>>> +    }
>>>>>>>>>> Well, exactly that won't work.
>>>>>>>>>>
>>>>>>>>>> The message structure isn't TMZ protected because
>>>>>>>>>> otherwise the driver won't
>>>>>>>>>> be able to stitch it together.
>>>>>>>>>>
>>>>>>>>>> What is TMZ protected are the surfaces the message
>>>>>>>>>> structure is pointing to.
>>>>>>>>>> So what you would need to do is to completely parse
>>>>>>>>>> the structure and then
>>>>>>>>>> move on the relevant buffers into VRAM.
>>>>>>>>>>
>>>>>>>>>> Leo or James, can you help with that?
>>>>>>>>>    From my observations, when decoding secure contents, register
>>>>>>>>> GPCOM_VCPU_DATA0 and GPCOM_VCPU_DATA1 are set to a TMZ
>>>>>>>>> buffer address.
>>>>>>>>> And this way works when allocating TMZ buffers in GTT domain.
>>>>>>>> As far as I remember that's only the case for the decoding,
>>>>>>>> encoding works
>>>>>>>> by putting the addresses into the message buffer.
>>>>>>>>
>>>>>>>> But could be that decoding is sufficient, Leo and James need
>>>>>>>> to comment on
>>>>>>>> this.
>>>>>>> It seems that only decode needs TMZ buffers. Only observe
>>>>>>> si_vid_create_tmz_buffer()
>>>>>>> was called in rvcn_dec_message_decode() in
>>>>>>> src/gallium/drivers/radeon/radeon_vcn_dec.c.
>>>>>> Mhm, good point. Let's wait for Leo and James to wake up, when we
>>>>>> don't need encode support than that would makes things much easier.
>>>>> For secure playback, the buffer required in TMZ are dpb, dt and 
>>>>> ctx, for
>>>>> the rest esp. those for CPU access don't need that E.g. msg 
>>>>> buffer, and
>>>>> bitstream buffer.
>>>>>
>>>>>  From radeon_vcn_dec.c, you can see the buffer for dpb and ctx, 
>>>>> and dt
>>>>> buffer frontend/va/surface is set to PIPE_BIND_PROTECTED.
>>>>>
>>>>>
>>>>> Regards,
>>>>>
>>>>> Leo
>>>>>
>>>> For VCN1, due to performance reason, the msg and fb buffer was 
>>>> allocated
>>>> into VRAM instead of GTT(for other HW), but those are not TMZ in 
>>>> order to
>>>> have CPU access.
>>>>
>>>>
>>>> Regards,
>>>>
>>>> Leo
>>>>
>>>>
>>>>
>>>>>
>>>>>> Regards,
>>>>>> Christian.
>>>>>>
>>>>>>> Regards,
>>>>>>> Lang
>>>>>>>
>>>>>>>> Regards,
>>>>>>>> Christian.
>>>>>>>>
>>>>>>>>> Regards,
>>>>>>>>> Lang
>>>>>>>>>
>>>>>>>>>> Regards,
>>>>>>>>>> Christian.
>>>>>>>>>>
>>>>>>>>>>> +
>>>>>>>>>>> +    return r;
>>>>>>>>>>> +}
>>>>>>>>>>> +
>>>>>>>>>>> +static int
>>>>>>>>>>> vcn_v1_0_ring_patch_cs_in_place(struct
>>>>>>>>>>> amdgpu_cs_parser *p,
>>>>>>>>>>> +                       struct amdgpu_job *job,
>>>>>>>>>>> +                       struct amdgpu_ib *ib)
>>>>>>>>>>> +{
>>>>>>>>>>> +    uint32_t msg_lo = 0, msg_hi = 0;
>>>>>>>>>>> +    int i, r;
>>>>>>>>>>> +
>>>>>>>>>>> +    for (i = 0; i < ib->length_dw; i += 2) {
>>>>>>>>>>> +        uint32_t reg = amdgpu_ib_get_value(ib, i);
>>>>>>>>>>> +        uint32_t val = amdgpu_ib_get_value(ib, i + 1);
>>>>>>>>>>> +
>>>>>>>>>>> +        if (reg == PACKET0(p->adev->vcn.internal.data0, 0)) {
>>>>>>>>>>> +            msg_lo = val;
>>>>>>>>>>> +        } else if (reg ==
>>>>>>>>>>> PACKET0(p->adev->vcn.internal.data1, 0)) {
>>>>>>>>>>> +            msg_hi = val;
>>>>>>>>>>> +        } else if (reg == 
>>>>>>>>>>> PACKET0(p->adev->vcn.internal.cmd, 0)) {
>>>>>>>>>>> +            r = vcn_v1_0_validate_bo(p, job,
>>>>>>>>>>> +                         ((u64)msg_hi) << 32 | msg_lo);
>>>>>>>>>>> +            if (r)
>>>>>>>>>>> +                return r;
>>>>>>>>>>> +        }
>>>>>>>>>>> +    }
>>>>>>>>>>> +
>>>>>>>>>>> +    return 0;
>>>>>>>>>>> +}
>>>>>>>>>>> +
>>>>>>>>>>> +
>>>>>>>>>>>      static const struct amdgpu_ring_funcs
>>>>>>>>>>> vcn_v1_0_dec_ring_vm_funcs = {
>>>>>>>>>>>          .type = AMDGPU_RING_TYPE_VCN_DEC,
>>>>>>>>>>>          .align_mask = 0xf,
>>>>>>>>>>> @@ -1914,6 +1981,7 @@ static const struct
>>>>>>>>>>> amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
>>>>>>>>>>>          .get_rptr = vcn_v1_0_dec_ring_get_rptr,
>>>>>>>>>>>          .get_wptr = vcn_v1_0_dec_ring_get_wptr,
>>>>>>>>>>>          .set_wptr = vcn_v1_0_dec_ring_set_wptr,
>>>>>>>>>>> +    .patch_cs_in_place = vcn_v1_0_ring_patch_cs_in_place,
>>>>>>>>>>>          .emit_frame_size =
>>>>>>>>>>>              6 + 6 + /* hdp invalidate / flush */
>>>>>>>>>>>              SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
>>


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2] drm/amdgpu: add workarounds for Raven VCN TMZ issue
  2022-03-10 14:25                     ` Christian König
@ 2022-03-11  2:32                       ` Lang Yu
  2022-03-14 14:05                         ` Alex Deucher
  0 siblings, 1 reply; 16+ messages in thread
From: Lang Yu @ 2022-03-11  2:32 UTC (permalink / raw)
  To: Christian König
  Cc: Christian König, amd-gfx, Huang Rui, Alex Deucher, Zhu,
	James, Leo Liu

On 03/10/ , Christian König wrote:
> Ok, thanks.
> 
> Lang is that case your patch should work fine.
> 
> Just add another patch with a check for the encode case to reject any CS
> with TMZ buffers in it.

Only VCN decode ring is cared in this patch. For encode ring
(AMDGPU_HW_IP_VCN_ENC and AMDGPU_HW_IP_VCN_JPEG), is it fine 
we just reject secure IBs in amdgpu_ib_schedule like compute ring?

Regards,
Lang

> Thanks,
> Christian.
> 
> Am 10.03.22 um 15:17 schrieb Leo Liu:
> > No need for encode. Encrypting uses TEE/TA to convert clear bitstream to
> > encrypted bitstream, and has nothing to do with VCN encode and tmz.
> > 
> > Regards,
> > 
> > Leo
> > 
> > 
> > On 2022-03-10 04:53, Christian König wrote:
> > > Leo you didn't answered the question if we need TMZ for encode as well.
> > > 
> > > Regards,
> > > Christian.
> > > 
> > > Am 10.03.22 um 09:45 schrieb Lang Yu:
> > > > Ping.
> > > > 
> > > > On 03/08/ , Leo Liu wrote:
> > > > > On 2022-03-08 11:18, Leo Liu wrote:
> > > > > > On 2022-03-08 04:16, Christian König wrote:
> > > > > > > Am 08.03.22 um 09:06 schrieb Lang Yu:
> > > > > > > > On 03/08/ , Christian König wrote:
> > > > > > > > > Am 08.03.22 um 08:33 schrieb Lang Yu:
> > > > > > > > > > On 03/08/ , Christian König wrote:
> > > > > > > > > > > Am 08.03.22 um 04:39 schrieb Lang Yu:
> > > > > > > > > > > > It is a hardware issue that VCN can't handle a GTT
> > > > > > > > > > > > backing stored TMZ buffer on Raven.
> > > > > > > > > > > > 
> > > > > > > > > > > > Move such a TMZ buffer to VRAM domain before command
> > > > > > > > > > > > submission.
> > > > > > > > > > > > 
> > > > > > > > > > > > v2:
> > > > > > > > > > > >      - Use patch_cs_in_place callback.
> > > > > > > > > > > > 
> > > > > > > > > > > > Suggested-by: Christian König <christian.koenig@amd.com>
> > > > > > > > > > > > Signed-off-by: Lang Yu <Lang.Yu@amd.com>
> > > > > > > > > > > > ---
> > > > > > > > > > > >      drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 68
> > > > > > > > > > > > +++++++++++++++++++++++++++
> > > > > > > > > > > >      1 file changed, 68 insertions(+)
> > > > > > > > > > > > 
> > > > > > > > > > > > diff --git
> > > > > > > > > > > > a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> > > > > > > > > > > > b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> > > > > > > > > > > > index 7bbb9ba6b80b..810932abd3af 100644
> > > > > > > > > > > > --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> > > > > > > > > > > > +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> > > > > > > > > > > > @@ -24,6 +24,7 @@
> > > > > > > > > > > >      #include <linux/firmware.h>
> > > > > > > > > > > >      #include "amdgpu.h"
> > > > > > > > > > > > +#include "amdgpu_cs.h"
> > > > > > > > > > > >      #include "amdgpu_vcn.h"
> > > > > > > > > > > >      #include "amdgpu_pm.h"
> > > > > > > > > > > >      #include "soc15.h"
> > > > > > > > > > > > @@ -1905,6 +1906,72 @@ static const struct
> > > > > > > > > > > > amd_ip_funcs vcn_v1_0_ip_funcs = {
> > > > > > > > > > > >          .set_powergating_state
> > > > > > > > > > > > =
> > > > > > > > > > > > vcn_v1_0_set_powergating_state,
> > > > > > > > > > > >      };
> > > > > > > > > > > > +/**
> > > > > > > > > > > > + * It is a hardware issue that Raven VCN can't
> > > > > > > > > > > > handle a GTT TMZ buffer.
> > > > > > > > > > > > + * Move such a GTT TMZ buffer to VRAM domain
> > > > > > > > > > > > before command submission.
> > > > > > > > > > > > + */
> > > > > > > > > > > > +static int
> > > > > > > > > > > > vcn_v1_0_validate_bo(struct
> > > > > > > > > > > > amdgpu_cs_parser *parser,
> > > > > > > > > > > > +                struct amdgpu_job *job,
> > > > > > > > > > > > +                uint64_t addr)
> > > > > > > > > > > > +{
> > > > > > > > > > > > +    struct ttm_operation_ctx ctx = { false, false };
> > > > > > > > > > > > +    struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;
> > > > > > > > > > > > +    struct amdgpu_vm *vm = &fpriv->vm;
> > > > > > > > > > > > +    struct amdgpu_bo_va_mapping *mapping;
> > > > > > > > > > > > +    struct amdgpu_bo *bo;
> > > > > > > > > > > > +    int r;
> > > > > > > > > > > > +
> > > > > > > > > > > > +    addr &= AMDGPU_GMC_HOLE_MASK;
> > > > > > > > > > > > +    if (addr & 0x7) {
> > > > > > > > > > > > +        DRM_ERROR("VCN messages must be 8 byte aligned!\n");
> > > > > > > > > > > > +        return -EINVAL;
> > > > > > > > > > > > +    }
> > > > > > > > > > > > +
> > > > > > > > > > > > +    mapping = amdgpu_vm_bo_lookup_mapping(vm,
> > > > > > > > > > > > addr/AMDGPU_GPU_PAGE_SIZE);
> > > > > > > > > > > > +    if (!mapping ||
> > > > > > > > > > > > !mapping->bo_va ||
> > > > > > > > > > > > !mapping->bo_va->base.bo)
> > > > > > > > > > > > +        return -EINVAL;
> > > > > > > > > > > > +
> > > > > > > > > > > > +    bo = mapping->bo_va->base.bo;
> > > > > > > > > > > > +    if (!(bo->flags & AMDGPU_GEM_CREATE_ENCRYPTED))
> > > > > > > > > > > > +        return 0;
> > > > > > > > > > > > +
> > > > > > > > > > > > +   
> > > > > > > > > > > > amdgpu_bo_placement_from_domain(bo,
> > > > > > > > > > > > AMDGPU_GEM_DOMAIN_VRAM);
> > > > > > > > > > > > +    r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
> > > > > > > > > > > > +    if (r) {
> > > > > > > > > > > > +        DRM_ERROR("Failed validating the VCN
> > > > > > > > > > > > message BO (%d)!\n", r);
> > > > > > > > > > > > +        return r;
> > > > > > > > > > > > +    }
> > > > > > > > > > > Well, exactly that won't work.
> > > > > > > > > > > 
> > > > > > > > > > > The message structure isn't TMZ protected because
> > > > > > > > > > > otherwise the driver won't
> > > > > > > > > > > be able to stitch it together.
> > > > > > > > > > > 
> > > > > > > > > > > What is TMZ protected are the surfaces the message
> > > > > > > > > > > structure is pointing to.
> > > > > > > > > > > So what you would need to do is to completely parse
> > > > > > > > > > > the structure and then
> > > > > > > > > > > move on the relevant buffers into VRAM.
> > > > > > > > > > > 
> > > > > > > > > > > Leo or James, can you help with that?
> > > > > > > > > >    From my observations, when decoding secure contents, register
> > > > > > > > > > GPCOM_VCPU_DATA0 and GPCOM_VCPU_DATA1 are set to a TMZ
> > > > > > > > > > buffer address.
> > > > > > > > > > And this way works when allocating TMZ buffers in GTT domain.
> > > > > > > > > As far as I remember that's only the case for the decoding,
> > > > > > > > > encoding works
> > > > > > > > > by putting the addresses into the message buffer.
> > > > > > > > > 
> > > > > > > > > But could be that decoding is sufficient, Leo and James need
> > > > > > > > > to comment on
> > > > > > > > > this.
> > > > > > > > It seems that only decode needs TMZ buffers. Only observe
> > > > > > > > si_vid_create_tmz_buffer()
> > > > > > > > was called in rvcn_dec_message_decode() in
> > > > > > > > src/gallium/drivers/radeon/radeon_vcn_dec.c.
> > > > > > > Mhm, good point. Let's wait for Leo and James to wake up, when we
> > > > > > > don't need encode support than that would makes things much easier.
> > > > > > For secure playback, the buffer required in TMZ are dpb,
> > > > > > dt and ctx, for
> > > > > > the rest esp. those for CPU access don't need that E.g.
> > > > > > msg buffer, and
> > > > > > bitstream buffer.
> > > > > > 
> > > > > >  From radeon_vcn_dec.c, you can see the buffer for dpb
> > > > > > and ctx, and dt
> > > > > > buffer frontend/va/surface is set to PIPE_BIND_PROTECTED.
> > > > > > 
> > > > > > 
> > > > > > Regards,
> > > > > > 
> > > > > > Leo
> > > > > > 
> > > > > For VCN1, due to performance reason, the msg and fb buffer
> > > > > was allocated
> > > > > into VRAM instead of GTT(for other HW), but those are not
> > > > > TMZ in order to
> > > > > have CPU access.
> > > > > 
> > > > > 
> > > > > Regards,
> > > > > 
> > > > > Leo
> > > > > 
> > > > > 
> > > > > 
> > > > > > 
> > > > > > > Regards,
> > > > > > > Christian.
> > > > > > > 
> > > > > > > > Regards,
> > > > > > > > Lang
> > > > > > > > 
> > > > > > > > > Regards,
> > > > > > > > > Christian.
> > > > > > > > > 
> > > > > > > > > > Regards,
> > > > > > > > > > Lang
> > > > > > > > > > 
> > > > > > > > > > > Regards,
> > > > > > > > > > > Christian.
> > > > > > > > > > > 
> > > > > > > > > > > > +
> > > > > > > > > > > > +    return r;
> > > > > > > > > > > > +}
> > > > > > > > > > > > +
> > > > > > > > > > > > +static int
> > > > > > > > > > > > vcn_v1_0_ring_patch_cs_in_place(struct
> > > > > > > > > > > > amdgpu_cs_parser *p,
> > > > > > > > > > > > +                       struct amdgpu_job *job,
> > > > > > > > > > > > +                       struct amdgpu_ib *ib)
> > > > > > > > > > > > +{
> > > > > > > > > > > > +    uint32_t msg_lo = 0, msg_hi = 0;
> > > > > > > > > > > > +    int i, r;
> > > > > > > > > > > > +
> > > > > > > > > > > > +    for (i = 0; i < ib->length_dw; i += 2) {
> > > > > > > > > > > > +        uint32_t reg = amdgpu_ib_get_value(ib, i);
> > > > > > > > > > > > +        uint32_t val = amdgpu_ib_get_value(ib, i + 1);
> > > > > > > > > > > > +
> > > > > > > > > > > > +        if (reg == PACKET0(p->adev->vcn.internal.data0, 0)) {
> > > > > > > > > > > > +            msg_lo = val;
> > > > > > > > > > > > +        } else if (reg ==
> > > > > > > > > > > > PACKET0(p->adev->vcn.internal.data1, 0)) {
> > > > > > > > > > > > +            msg_hi = val;
> > > > > > > > > > > > +        } else if (reg ==
> > > > > > > > > > > > PACKET0(p->adev->vcn.internal.cmd,
> > > > > > > > > > > > 0)) {
> > > > > > > > > > > > +            r = vcn_v1_0_validate_bo(p, job,
> > > > > > > > > > > > +                         ((u64)msg_hi) << 32 | msg_lo);
> > > > > > > > > > > > +            if (r)
> > > > > > > > > > > > +                return r;
> > > > > > > > > > > > +        }
> > > > > > > > > > > > +    }
> > > > > > > > > > > > +
> > > > > > > > > > > > +    return 0;
> > > > > > > > > > > > +}
> > > > > > > > > > > > +
> > > > > > > > > > > > +
> > > > > > > > > > > >      static const struct amdgpu_ring_funcs
> > > > > > > > > > > > vcn_v1_0_dec_ring_vm_funcs = {
> > > > > > > > > > > >          .type = AMDGPU_RING_TYPE_VCN_DEC,
> > > > > > > > > > > >          .align_mask = 0xf,
> > > > > > > > > > > > @@ -1914,6 +1981,7 @@ static const struct
> > > > > > > > > > > > amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
> > > > > > > > > > > >          .get_rptr = vcn_v1_0_dec_ring_get_rptr,
> > > > > > > > > > > >          .get_wptr = vcn_v1_0_dec_ring_get_wptr,
> > > > > > > > > > > >          .set_wptr = vcn_v1_0_dec_ring_set_wptr,
> > > > > > > > > > > > +    .patch_cs_in_place = vcn_v1_0_ring_patch_cs_in_place,
> > > > > > > > > > > >          .emit_frame_size =
> > > > > > > > > > > >              6 + 6 + /* hdp invalidate / flush */
> > > > > > > > > > > >              SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
> > > 
> 

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2] drm/amdgpu: add workarounds for Raven VCN TMZ issue
  2022-03-11  2:32                       ` Lang Yu
@ 2022-03-14 14:05                         ` Alex Deucher
  0 siblings, 0 replies; 16+ messages in thread
From: Alex Deucher @ 2022-03-14 14:05 UTC (permalink / raw)
  To: Lang Yu
  Cc: Christian König, amd-gfx list, Huang Rui, Alex Deucher, Zhu,
	James, Leo Liu, Christian König

On Thu, Mar 10, 2022 at 9:32 PM Lang Yu <Lang.Yu@amd.com> wrote:
>
> On 03/10/ , Christian König wrote:
> > Ok, thanks.
> >
> > Lang is that case your patch should work fine.
> >
> > Just add another patch with a check for the encode case to reject any CS
> > with TMZ buffers in it.
>
> Only VCN decode ring is cared in this patch. For encode ring
> (AMDGPU_HW_IP_VCN_ENC and AMDGPU_HW_IP_VCN_JPEG), is it fine
> we just reject secure IBs in amdgpu_ib_schedule like compute ring?
>

Yes,  correct.

Alex

> Regards,
> Lang
>
> > Thanks,
> > Christian.
> >
> > Am 10.03.22 um 15:17 schrieb Leo Liu:
> > > No need for encode. Encrypting uses TEE/TA to convert clear bitstream to
> > > encrypted bitstream, and has nothing to do with VCN encode and tmz.
> > >
> > > Regards,
> > >
> > > Leo
> > >
> > >
> > > On 2022-03-10 04:53, Christian König wrote:
> > > > Leo you didn't answered the question if we need TMZ for encode as well.
> > > >
> > > > Regards,
> > > > Christian.
> > > >
> > > > Am 10.03.22 um 09:45 schrieb Lang Yu:
> > > > > Ping.
> > > > >
> > > > > On 03/08/ , Leo Liu wrote:
> > > > > > On 2022-03-08 11:18, Leo Liu wrote:
> > > > > > > On 2022-03-08 04:16, Christian König wrote:
> > > > > > > > Am 08.03.22 um 09:06 schrieb Lang Yu:
> > > > > > > > > On 03/08/ , Christian König wrote:
> > > > > > > > > > Am 08.03.22 um 08:33 schrieb Lang Yu:
> > > > > > > > > > > On 03/08/ , Christian König wrote:
> > > > > > > > > > > > Am 08.03.22 um 04:39 schrieb Lang Yu:
> > > > > > > > > > > > > It is a hardware issue that VCN can't handle a GTT
> > > > > > > > > > > > > backing stored TMZ buffer on Raven.
> > > > > > > > > > > > >
> > > > > > > > > > > > > Move such a TMZ buffer to VRAM domain before command
> > > > > > > > > > > > > submission.
> > > > > > > > > > > > >
> > > > > > > > > > > > > v2:
> > > > > > > > > > > > >      - Use patch_cs_in_place callback.
> > > > > > > > > > > > >
> > > > > > > > > > > > > Suggested-by: Christian König <christian.koenig@amd.com>
> > > > > > > > > > > > > Signed-off-by: Lang Yu <Lang.Yu@amd.com>
> > > > > > > > > > > > > ---
> > > > > > > > > > > > >      drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 68
> > > > > > > > > > > > > +++++++++++++++++++++++++++
> > > > > > > > > > > > >      1 file changed, 68 insertions(+)
> > > > > > > > > > > > >
> > > > > > > > > > > > > diff --git
> > > > > > > > > > > > > a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> > > > > > > > > > > > > b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> > > > > > > > > > > > > index 7bbb9ba6b80b..810932abd3af 100644
> > > > > > > > > > > > > --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> > > > > > > > > > > > > +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> > > > > > > > > > > > > @@ -24,6 +24,7 @@
> > > > > > > > > > > > >      #include <linux/firmware.h>
> > > > > > > > > > > > >      #include "amdgpu.h"
> > > > > > > > > > > > > +#include "amdgpu_cs.h"
> > > > > > > > > > > > >      #include "amdgpu_vcn.h"
> > > > > > > > > > > > >      #include "amdgpu_pm.h"
> > > > > > > > > > > > >      #include "soc15.h"
> > > > > > > > > > > > > @@ -1905,6 +1906,72 @@ static const struct
> > > > > > > > > > > > > amd_ip_funcs vcn_v1_0_ip_funcs = {
> > > > > > > > > > > > >          .set_powergating_state
> > > > > > > > > > > > > =
> > > > > > > > > > > > > vcn_v1_0_set_powergating_state,
> > > > > > > > > > > > >      };
> > > > > > > > > > > > > +/**
> > > > > > > > > > > > > + * It is a hardware issue that Raven VCN can't
> > > > > > > > > > > > > handle a GTT TMZ buffer.
> > > > > > > > > > > > > + * Move such a GTT TMZ buffer to VRAM domain
> > > > > > > > > > > > > before command submission.
> > > > > > > > > > > > > + */
> > > > > > > > > > > > > +static int
> > > > > > > > > > > > > vcn_v1_0_validate_bo(struct
> > > > > > > > > > > > > amdgpu_cs_parser *parser,
> > > > > > > > > > > > > +                struct amdgpu_job *job,
> > > > > > > > > > > > > +                uint64_t addr)
> > > > > > > > > > > > > +{
> > > > > > > > > > > > > +    struct ttm_operation_ctx ctx = { false, false };
> > > > > > > > > > > > > +    struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;
> > > > > > > > > > > > > +    struct amdgpu_vm *vm = &fpriv->vm;
> > > > > > > > > > > > > +    struct amdgpu_bo_va_mapping *mapping;
> > > > > > > > > > > > > +    struct amdgpu_bo *bo;
> > > > > > > > > > > > > +    int r;
> > > > > > > > > > > > > +
> > > > > > > > > > > > > +    addr &= AMDGPU_GMC_HOLE_MASK;
> > > > > > > > > > > > > +    if (addr & 0x7) {
> > > > > > > > > > > > > +        DRM_ERROR("VCN messages must be 8 byte aligned!\n");
> > > > > > > > > > > > > +        return -EINVAL;
> > > > > > > > > > > > > +    }
> > > > > > > > > > > > > +
> > > > > > > > > > > > > +    mapping = amdgpu_vm_bo_lookup_mapping(vm,
> > > > > > > > > > > > > addr/AMDGPU_GPU_PAGE_SIZE);
> > > > > > > > > > > > > +    if (!mapping ||
> > > > > > > > > > > > > !mapping->bo_va ||
> > > > > > > > > > > > > !mapping->bo_va->base.bo)
> > > > > > > > > > > > > +        return -EINVAL;
> > > > > > > > > > > > > +
> > > > > > > > > > > > > +    bo = mapping->bo_va->base.bo;
> > > > > > > > > > > > > +    if (!(bo->flags & AMDGPU_GEM_CREATE_ENCRYPTED))
> > > > > > > > > > > > > +        return 0;
> > > > > > > > > > > > > +
> > > > > > > > > > > > > +
> > > > > > > > > > > > > amdgpu_bo_placement_from_domain(bo,
> > > > > > > > > > > > > AMDGPU_GEM_DOMAIN_VRAM);
> > > > > > > > > > > > > +    r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
> > > > > > > > > > > > > +    if (r) {
> > > > > > > > > > > > > +        DRM_ERROR("Failed validating the VCN
> > > > > > > > > > > > > message BO (%d)!\n", r);
> > > > > > > > > > > > > +        return r;
> > > > > > > > > > > > > +    }
> > > > > > > > > > > > Well, exactly that won't work.
> > > > > > > > > > > >
> > > > > > > > > > > > The message structure isn't TMZ protected because
> > > > > > > > > > > > otherwise the driver won't
> > > > > > > > > > > > be able to stitch it together.
> > > > > > > > > > > >
> > > > > > > > > > > > What is TMZ protected are the surfaces the message
> > > > > > > > > > > > structure is pointing to.
> > > > > > > > > > > > So what you would need to do is to completely parse
> > > > > > > > > > > > the structure and then
> > > > > > > > > > > > move on the relevant buffers into VRAM.
> > > > > > > > > > > >
> > > > > > > > > > > > Leo or James, can you help with that?
> > > > > > > > > > >    From my observations, when decoding secure contents, register
> > > > > > > > > > > GPCOM_VCPU_DATA0 and GPCOM_VCPU_DATA1 are set to a TMZ
> > > > > > > > > > > buffer address.
> > > > > > > > > > > And this way works when allocating TMZ buffers in GTT domain.
> > > > > > > > > > As far as I remember that's only the case for the decoding,
> > > > > > > > > > encoding works
> > > > > > > > > > by putting the addresses into the message buffer.
> > > > > > > > > >
> > > > > > > > > > But could be that decoding is sufficient, Leo and James need
> > > > > > > > > > to comment on
> > > > > > > > > > this.
> > > > > > > > > It seems that only decode needs TMZ buffers. Only observe
> > > > > > > > > si_vid_create_tmz_buffer()
> > > > > > > > > was called in rvcn_dec_message_decode() in
> > > > > > > > > src/gallium/drivers/radeon/radeon_vcn_dec.c.
> > > > > > > > Mhm, good point. Let's wait for Leo and James to wake up, when we
> > > > > > > > don't need encode support than that would makes things much easier.
> > > > > > > For secure playback, the buffer required in TMZ are dpb,
> > > > > > > dt and ctx, for
> > > > > > > the rest esp. those for CPU access don't need that E.g.
> > > > > > > msg buffer, and
> > > > > > > bitstream buffer.
> > > > > > >
> > > > > > >  From radeon_vcn_dec.c, you can see the buffer for dpb
> > > > > > > and ctx, and dt
> > > > > > > buffer frontend/va/surface is set to PIPE_BIND_PROTECTED.
> > > > > > >
> > > > > > >
> > > > > > > Regards,
> > > > > > >
> > > > > > > Leo
> > > > > > >
> > > > > > For VCN1, due to performance reason, the msg and fb buffer
> > > > > > was allocated
> > > > > > into VRAM instead of GTT(for other HW), but those are not
> > > > > > TMZ in order to
> > > > > > have CPU access.
> > > > > >
> > > > > >
> > > > > > Regards,
> > > > > >
> > > > > > Leo
> > > > > >
> > > > > >
> > > > > >
> > > > > > >
> > > > > > > > Regards,
> > > > > > > > Christian.
> > > > > > > >
> > > > > > > > > Regards,
> > > > > > > > > Lang
> > > > > > > > >
> > > > > > > > > > Regards,
> > > > > > > > > > Christian.
> > > > > > > > > >
> > > > > > > > > > > Regards,
> > > > > > > > > > > Lang
> > > > > > > > > > >
> > > > > > > > > > > > Regards,
> > > > > > > > > > > > Christian.
> > > > > > > > > > > >
> > > > > > > > > > > > > +
> > > > > > > > > > > > > +    return r;
> > > > > > > > > > > > > +}
> > > > > > > > > > > > > +
> > > > > > > > > > > > > +static int
> > > > > > > > > > > > > vcn_v1_0_ring_patch_cs_in_place(struct
> > > > > > > > > > > > > amdgpu_cs_parser *p,
> > > > > > > > > > > > > +                       struct amdgpu_job *job,
> > > > > > > > > > > > > +                       struct amdgpu_ib *ib)
> > > > > > > > > > > > > +{
> > > > > > > > > > > > > +    uint32_t msg_lo = 0, msg_hi = 0;
> > > > > > > > > > > > > +    int i, r;
> > > > > > > > > > > > > +
> > > > > > > > > > > > > +    for (i = 0; i < ib->length_dw; i += 2) {
> > > > > > > > > > > > > +        uint32_t reg = amdgpu_ib_get_value(ib, i);
> > > > > > > > > > > > > +        uint32_t val = amdgpu_ib_get_value(ib, i + 1);
> > > > > > > > > > > > > +
> > > > > > > > > > > > > +        if (reg == PACKET0(p->adev->vcn.internal.data0, 0)) {
> > > > > > > > > > > > > +            msg_lo = val;
> > > > > > > > > > > > > +        } else if (reg ==
> > > > > > > > > > > > > PACKET0(p->adev->vcn.internal.data1, 0)) {
> > > > > > > > > > > > > +            msg_hi = val;
> > > > > > > > > > > > > +        } else if (reg ==
> > > > > > > > > > > > > PACKET0(p->adev->vcn.internal.cmd,
> > > > > > > > > > > > > 0)) {
> > > > > > > > > > > > > +            r = vcn_v1_0_validate_bo(p, job,
> > > > > > > > > > > > > +                         ((u64)msg_hi) << 32 | msg_lo);
> > > > > > > > > > > > > +            if (r)
> > > > > > > > > > > > > +                return r;
> > > > > > > > > > > > > +        }
> > > > > > > > > > > > > +    }
> > > > > > > > > > > > > +
> > > > > > > > > > > > > +    return 0;
> > > > > > > > > > > > > +}
> > > > > > > > > > > > > +
> > > > > > > > > > > > > +
> > > > > > > > > > > > >      static const struct amdgpu_ring_funcs
> > > > > > > > > > > > > vcn_v1_0_dec_ring_vm_funcs = {
> > > > > > > > > > > > >          .type = AMDGPU_RING_TYPE_VCN_DEC,
> > > > > > > > > > > > >          .align_mask = 0xf,
> > > > > > > > > > > > > @@ -1914,6 +1981,7 @@ static const struct
> > > > > > > > > > > > > amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
> > > > > > > > > > > > >          .get_rptr = vcn_v1_0_dec_ring_get_rptr,
> > > > > > > > > > > > >          .get_wptr = vcn_v1_0_dec_ring_get_wptr,
> > > > > > > > > > > > >          .set_wptr = vcn_v1_0_dec_ring_set_wptr,
> > > > > > > > > > > > > +    .patch_cs_in_place = vcn_v1_0_ring_patch_cs_in_place,
> > > > > > > > > > > > >          .emit_frame_size =
> > > > > > > > > > > > >              6 + 6 + /* hdp invalidate / flush */
> > > > > > > > > > > > >              SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
> > > >
> >

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2022-03-14 14:05 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-08  3:39 [PATCH v2] drm/amdgpu: add workarounds for Raven VCN TMZ issue Lang Yu
2022-03-08  7:12 ` Christian König
2022-03-08  7:33   ` Lang Yu
2022-03-08  7:37     ` Christian König
2022-03-08  8:06       ` Lang Yu
2022-03-08  9:16         ` Christian König
2022-03-08 15:14           ` Alex Deucher
2022-03-08 16:18           ` Leo Liu
2022-03-08 16:30             ` Leo Liu
2022-03-08 19:23               ` James Zhu
2022-03-10  8:45               ` Lang Yu
2022-03-10  9:53                 ` Christian König
2022-03-10 14:17                   ` Leo Liu
2022-03-10 14:25                     ` Christian König
2022-03-11  2:32                       ` Lang Yu
2022-03-14 14:05                         ` Alex Deucher

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.