hal: Update acdb extn and platform to pass Instance ID support info

Update acdb extn and platform to pass Instance ID support info
in order to enable ACDB loader use this info and call the respective
ACDB SW APIs. Update GEF APIs to support instance ID feature.
Add a property to query the instance ID support and use that
to call ACDB loader for instance ID support.

CRs-Fixed: 2199639
Change-Id: I64b41faf23cb42ec2af1695adb8a7021cad996dc
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 6cca1bb..c4708a1 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -206,19 +206,6 @@
     int length;
 };
 
-typedef struct acdb_audio_cal_cfg {
-    uint32_t             persist;
-    uint32_t             snd_dev_id;
-    audio_devices_t      dev_id;
-    int32_t              acdb_dev_id;
-    uint32_t             app_type;
-    uint32_t             topo_id;
-    uint32_t             sampling_rate;
-    uint32_t             cal_type;
-    uint32_t             module_id;
-    uint32_t             param_id;
-} acdb_audio_cal_cfg_t;
-
 enum {
     CAL_MODE_SEND           = 0x1,
     CAL_MODE_PERSIST        = 0x2,
@@ -272,6 +259,7 @@
     int                        voice_feature_set;
     acdb_init_t                acdb_init;
     acdb_init_v3_t             acdb_init_v3;
+    acdb_init_v4_t             acdb_init_v4;
     acdb_deallocate_t          acdb_deallocate;
     acdb_send_audio_cal_t      acdb_send_audio_cal;
     acdb_send_audio_cal_v3_t   acdb_send_audio_cal_v3;
@@ -305,6 +293,7 @@
     bool is_asrc_supported;
     struct listnode acdb_meta_key_list;
     bool use_generic_handset;
+    struct acdb_init_data_v4 acdb_init_data;
 };
 
 static bool is_external_codec = false;
@@ -1935,7 +1924,12 @@
     snd_card_name = mixer_get_name(my_data->adev->mixer);
     snd_card_name = platform_get_snd_card_name_for_acdb_loader(snd_card_name);
 
-    if (my_data->acdb_init_v3) {
+    my_data->acdb_init_data.cvd_version = cvd_version;
+    my_data->acdb_init_data.snd_card_name = strdup(snd_card_name);
+    my_data->acdb_init_data.meta_key_list = &my_data->acdb_meta_key_list;
+    if (my_data->acdb_init_v4) {
+        result = my_data->acdb_init_v4(&my_data->acdb_init_data, ACDB_LOADER_INIT_V4);
+    } else if (my_data->acdb_init_v3) {
         result = my_data->acdb_init_v3(snd_card_name, cvd_version,
                                            &my_data->acdb_meta_key_list);
     } else if (my_data->acdb_init) {
@@ -2418,6 +2412,12 @@
             ALOGV("%s: Could not find the symbol acdb_loader_send_gain_dep_cal from %s",
                   __func__, LIB_ACDB_LOADER);
 
+        my_data->acdb_init_v4 = (acdb_init_v4_t)dlsym(my_data->acdb_handle,
+                                                     "acdb_loader_init_v4");
+        if (my_data->acdb_init_v4 == NULL) {
+            ALOGE("%s: dlsym error %s for acdb_loader_init_v4", __func__, dlerror());
+        }
+
         my_data->acdb_init_v3 = (acdb_init_v3_t)dlsym(my_data->acdb_handle,
                                                     "acdb_loader_init_v3");
         if (my_data->acdb_init_v3 == NULL) {
@@ -4838,11 +4838,19 @@
         cal->module_id = (uint32_t) strtoul(value, NULL, 0);
         ret = ret | 0x80;
     }
+#ifdef INSTANCE_ID_ENABLED
+    err = str_parms_get_str(parms, "cal_instanceid", value, sizeof(value));
+    if (err >= 0) {
+        str_parms_del(parms, "cal_instanceid");
+        cal->instance_id = (uint32_t) strtoul(value, NULL, 0);
+        ret = ret | 0x100;
+    }
+#endif
     err = str_parms_get_str(parms, "cal_paramid", value, sizeof(value));
     if (err >= 0) {
         str_parms_del(parms, "cal_paramid");
         cal->param_id = (uint32_t) strtoul(value, NULL, 0);
-        ret = ret | 0x100;
+        ret = ret | 0x200;
     }
     return ret;
 }
@@ -7597,7 +7605,37 @@
    return;
 }
 
-static void make_cal_cfg(acdb_audio_cal_cfg_t* cal, int acdb_dev_id,
+#ifdef INSTANCE_ID_ENABLED
+void platform_make_cal_cfg(acdb_audio_cal_cfg_t* cal, int acdb_dev_id,
+        int acdb_device_type, int app_type, int topology_id,
+        int sample_rate, uint32_t module_id, uint16_t instance_id,
+        uint32_t param_id, bool persist)
+{
+    int persist_send_flags = 1;
+
+    if (!cal) {
+        return;
+    }
+
+    if (persist)
+        persist_send_flags |= 0x2;
+
+    memset(cal, 0, sizeof(acdb_audio_cal_cfg_t));
+
+    cal->persist = persist;
+    cal->app_type = app_type;
+    cal->acdb_dev_id = acdb_dev_id;
+    cal->sampling_rate = sample_rate;
+    cal->topo_id = topology_id;
+    //if module and param id is set to 0, the whole blob will be stored
+    //or sent to the DSP
+    cal->module_id = module_id;
+    cal->instance_id = instance_id;
+    cal->param_id = param_id;
+    cal->cal_type = acdb_device_type;
+}
+#else
+void platform_make_cal_cfg(acdb_audio_cal_cfg_t* cal, int acdb_dev_id,
         int acdb_device_type, int app_type, int topology_id,
         int sample_rate, uint32_t module_id, uint32_t param_id, bool persist)
 {
@@ -7622,27 +7660,20 @@
     cal->module_id = module_id;
     cal->param_id = param_id;
     cal->cal_type = acdb_device_type;
-    cal->persist = persist;
-
 }
+#endif
 
-int platform_send_audio_cal(void* platform, int acdb_dev_id,
-       int acdb_device_type, int app_type, int topology_id, int sample_rate,
-       uint32_t module_id, uint32_t param_id, void* data, int length, bool persist)
+int platform_send_audio_cal(void* platform, acdb_audio_cal_cfg_t* cal,
+       void* data, int length, bool persist)
 {
     int ret = 0;
     struct platform_data *my_data = (struct platform_data *)platform;
-    acdb_audio_cal_cfg_t cal;
-    memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
 
     if (!my_data) {
         ret = -EINVAL;
         goto ERROR_RETURN;
     }
 
-    make_cal_cfg(&cal, acdb_dev_id, acdb_device_type, app_type, topology_id,
-        sample_rate, module_id, param_id, true);
-
     if (my_data->acdb_set_audio_cal) {
         // persist audio cal in local cache
         if (persist) {
@@ -7650,7 +7681,7 @@
         }
         // send audio cal to dsp
         if (ret == 0) {
-            cal.persist = false;
+            cal->persist = false;
             ret = my_data->acdb_set_audio_cal((void*)&cal, data, (uint32_t)length);
             if (persist && (ret != 0)) {
                 ALOGV("[%s] audio cal stored with success, ignore set cal failure", __func__);
@@ -7663,30 +7694,23 @@
     return ret;
 }
 
-int platform_get_audio_cal(void* platform, int acdb_dev_id,
-       int acdb_device_type, int app_type, int topology_id,
-       int sample_rate, uint32_t module_id, uint32_t param_id,
+int platform_get_audio_cal(void* platform, acdb_audio_cal_cfg_t* cal,
        void* data, int* length, bool persist)
 {
     int ret = 0;
     struct platform_data *my_data = (struct platform_data *)platform;
-    acdb_audio_cal_cfg_t cal;
-    memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
 
     if (!my_data) {
         ret = -EINVAL;
         goto ERROR_RETURN;
     }
 
-    make_cal_cfg(&cal, acdb_dev_id, acdb_device_type, app_type, topology_id,
-        sample_rate, module_id, param_id, false);
-
     if (my_data->acdb_get_audio_cal) {
         // get cal from dsp
         ret = my_data->acdb_get_audio_cal((void*)&cal, data, (uint32_t*)length);
         // get cached cal if prevoius attempt fails and persist flag is set
         if ((ret != 0) && persist) {
-            cal.persist = true;
+            cal->persist = true;
             ret = my_data->acdb_get_audio_cal((void*)&cal, data, (uint32_t*)length);
         }
     }
@@ -7695,24 +7719,17 @@
     return ret;
 }
 
-int platform_store_audio_cal(void* platform, int acdb_dev_id,
-       int acdb_device_type, int app_type, int topology_id,
-       int sample_rate, uint32_t module_id, uint32_t param_id,
+int platform_store_audio_cal(void* platform, acdb_audio_cal_cfg_t* cal,
        void* data, int length)
 {
     int ret = 0;
     struct platform_data *my_data = (struct platform_data *)platform;
-    acdb_audio_cal_cfg_t cal;
-    memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
 
     if (!my_data) {
         ret = -EINVAL;
         goto ERROR_RETURN;
     }
 
-    make_cal_cfg(&cal, acdb_dev_id, acdb_device_type, app_type, topology_id,
-        sample_rate, module_id, param_id, true);
-
     if (my_data->acdb_set_audio_cal) {
         ret = my_data->acdb_set_audio_cal((void*)&cal, data, (uint32_t)length);
     }
@@ -7721,24 +7738,17 @@
     return ret;
 }
 
-int platform_retrieve_audio_cal(void* platform, int acdb_dev_id,
-        int acdb_device_type, int app_type, int topology_id,
-        int sample_rate, uint32_t module_id, uint32_t param_id,
+int platform_retrieve_audio_cal(void* platform, acdb_audio_cal_cfg_t* cal,
         void* data, int* length)
 {
     int ret = 0;
     struct platform_data *my_data = (struct platform_data *)platform;
-    acdb_audio_cal_cfg_t cal;
-    memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
 
     if (!my_data) {
         ret = -EINVAL;
         goto ERROR_RETURN;
     }
 
-    make_cal_cfg(&cal, acdb_dev_id, acdb_device_type, app_type, topology_id,
-        sample_rate, module_id, param_id, true);
-
     if (my_data->acdb_get_audio_cal) {
         ret = my_data->acdb_get_audio_cal((void*)&cal, data, (uint32_t*)length);
     }