secmem: fix get mem size [2/2]
PD#SWPL-38901
Problem:
Cobalt crash during play widevine.
the root cause is TDK reduce secmem size but the size in secmem allocator
is still 16M
Solution:
Add api to get real remain size in secmem
Verify:
T5D + Buildroot
Change-Id: I569c1a5827b2eb67960a4575824aa61343e8425e
Signed-off-by: Tao Guo <tao.guo@amlogic.com>
diff --git a/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.c b/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.c
index eb44f27..b14a13b 100644
--- a/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.c
+++ b/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.c
@@ -13,8 +13,6 @@
#include "secmem_ca.h"
#define MAX_BUFS_COUNT (511)
-#define MAX_SEC_MEMSZ (16*1024*1024)
-#define MAX_SEC_LIMIT (15*1024*1024)
GST_DEBUG_CATEGORY_STATIC (gst_secmem_allocator_debug);
#define GST_CAT_DEFAULT gst_secmem_allocator_debug
@@ -51,7 +49,6 @@
g_mutex_init (&self->mutex);
g_cond_init (&self->cond);
self->counter = 0;
- self->total_used = 0;
allocator->mem_type = GST_ALLOCATOR_SECMEM;
allocator->mem_map = gst_secmem_mem_map;
allocator->mem_unmap = gst_secmem_mem_unmap;
@@ -82,15 +79,21 @@
secmem_handle_t handle;
unsigned int ret;
uint32_t maxsize = 0;
+ uint32_t available = 0;
g_return_val_if_fail (GST_IS_SECMEM_ALLOCATOR (allocator), NULL);
g_return_val_if_fail(self->sess != NULL, NULL);
g_mutex_lock (&self->mutex);
- while (self->counter >= MAX_BUFS_COUNT ||
- self->total_used >= MAX_SEC_LIMIT) {
+
+ do {
+ if (Secure_V2_GetSecmemSize(self->sess, NULL, &available))
+ goto error_create;
+ if (self->counter < MAX_BUFS_COUNT && size < available)
+ break;
g_cond_wait (&self->cond, &self->mutex);
- }
+ } while (1);
+
ret = Secure_V2_MemCreate(self->sess, &handle);
if (ret) {
GST_ERROR("MemCreate failed");
@@ -115,7 +118,6 @@
}
mem->size = size;
GST_INFO("alloc dma %d maxsize %d", fd, maxsize);
- self->total_used += maxsize;
self->counter++;
g_mutex_unlock (&self->mutex);
return mem;
@@ -144,7 +146,6 @@
GST_ALLOCATOR_CLASS (parent_class)->free(allocator, memory);
Secure_V2_MemFree(self->sess, handle);
Secure_V2_MemRelease(self->sess, handle);
- self->total_used -= maxsize;
self->counter--;
g_cond_broadcast (&self->cond);
g_mutex_unlock (&self->mutex);
@@ -344,20 +345,18 @@
gint gst_secmem_get_free_buf_size(GstMemory *mem)
{
- gint sz;
+ uint32_t available = 0;
+
g_return_val_if_fail(mem != NULL, -1);
g_return_val_if_fail(GST_IS_SECMEM_ALLOCATOR (mem->allocator), -1);
GstSecmemAllocator *self = GST_SECMEM_ALLOCATOR (mem->allocator);
g_mutex_lock (&self->mutex);
- sz = MAX_SEC_MEMSZ - self->total_used;
+ g_return_val_if_fail(Secure_V2_GetSecmemSize(self->sess, NULL, &available) == 0, -1);
g_mutex_unlock (&self->mutex);
- return sz;
+ return available;
}
-//gint gst_secmem_allocator_get_available(GstAllocator *allocator)
-//{
-//
-//}
+
secmem_handle_t gst_buffer_get_secmem_handle(GstBuffer *buffer)
{
GstMemory *mem = gst_buffer_peek_memory(buffer, 0);
diff --git a/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.h b/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.h
index 6e0313e..cfe05ac 100644
--- a/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.h
+++ b/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.h
@@ -43,7 +43,6 @@
gboolean is_4k;
gboolean is_vp9;
gsize counter;
- gsize total_used;
GCond cond;
GMutex mutex;
};
@@ -66,7 +65,6 @@
gint gst_secmem_get_free_buf_size(GstMemory *mem);
secmem_handle_t gst_secmem_memory_get_handle (GstMemory *mem);
secmem_paddr_t gst_secmem_memory_get_paddr (GstMemory *mem);
-//gint gst_secmem_allocator_get_available(GstAllocator *allocator);
secmem_handle_t gst_buffer_get_secmem_handle(GstBuffer *buffer);
secmem_paddr_t gst_buffer_get_secmem_paddr(GstBuffer *buffer);
gboolean gst_buffer_copy_to_secmem(GstBuffer *dst, GstBuffer *src);