gpu_service: Add deinit call when service is finished with
authorpopcornmix <popcornmix@gmail.com>
Tue, 21 Mar 2017 20:49:16 +0000 (20:49 +0000)
committerpopcornmix <popcornmix@gmail.com>
Tue, 21 Mar 2017 20:55:48 +0000 (20:55 +0000)
This allows the auto turbo mode to be disabled when done

interface/vmcs_host/vc_vchi_gpuserv.c
interface/vmcs_host/vc_vchi_gpuserv.h

index 7cd4358c14095bd9f029229fe99a97147e469c05..b09445bc3d99bc94fc8bb65355a2f80c46559aaf 100755 (executable)
@@ -148,6 +148,33 @@ error:
    return -1;
 }
 
+/******************************************************************************
+NAME
+
+   vc_gpuserv_deinit
+
+SYNOPSIS
+   void vc_gpuserv_init( void )
+
+FUNCTION
+   Deinitialise the gpu service. Should be called when gpu_service is no longer required
+
+RETURNS
+   zero on success
+******************************************************************************/
+
+void vc_gpuserv_deinit( void )
+{
+   vcos_mutex_lock(&gpuserv_client.lock);
+
+   if (gpuserv_client.refcount > 0 && --gpuserv_client.refcount == 0)
+   {
+      vchi_service_close(gpuserv_client.service);
+      gpuserv_client.service = 0;
+   }
+   vcos_mutex_unlock(&gpuserv_client.lock);
+}
+
 /******************************************************************************
 NAME
    gpuserv_callback
@@ -208,7 +235,15 @@ int32_t vc_gpuserv_execute_code(int num_jobs, struct gpu_job_s jobs[])
    VCHIQ_ELEMENT_T elements[MAX_JOBS];
    int i;
 
-   if (vc_gpuserv_init() != 0)
+   // hack: temporarily allow calling this function without calling vc_gpuserv_init
+   // will be removed later
+   if (!gpuserv_client.service)
+   {
+      vc_gpuserv_init();
+      vcos_log_error("%s: called without calling vc_gpuserv_init", VCOS_FUNCTION);
+   }
+
+   if (!gpuserv_client.service)
    {
       vcos_log_error("%s: vchiq service not initialised", VCOS_FUNCTION);
       return -1;
index b3c9bf57fa17d7ff1cbc71bd75efef3b5176066b..eca7e361a730a514b252ac05720c6e157ad7c950 100755 (executable)
@@ -87,6 +87,8 @@ struct gpu_job_s {
 
 VCHPRE_ int32_t VCHPOST_ vc_gpuserv_init(void);
 
+VCHPRE_ void VCHPOST_ vc_gpuserv_deinit(void);
+
 VCHPRE_ int32_t VCHPOST_ vc_gpuserv_execute_code(int num_jobs, struct gpu_job_s jobs[]);
 
 #endif