sst_dsp_inbox_read(ipc->dsp, msg->rx_data, msg->rx_size);
                switch (IPC_GLB_NOTIFY_MSG_TYPE(header.primary)) {
                case IPC_GLB_LOAD_MULTIPLE_MODS:
+               case IPC_GLB_LOAD_LIBRARY:
                        skl->mod_load_complete = true;
                        skl->mod_load_status = true;
                        wake_up(&skl->mod_load_wait);
                        ipc->dsp->fw_ops.get_fw_errcode(ipc->dsp));
                switch (IPC_GLB_NOTIFY_MSG_TYPE(header.primary)) {
                case IPC_GLB_LOAD_MULTIPLE_MODS:
+               case IPC_GLB_LOAD_LIBRARY:
                        skl->mod_load_complete = true;
                        skl->mod_load_status = false;
                        wake_up(&skl->mod_load_wait);
 
                        dev_err(ctx->dev, "unable to load firmware\n");
                        return ret;
                }
+
+               /* load libs as they are also lost on D3 */
+               if (skl->lib_count > 1) {
+                       ret = ctx->fw_ops.load_library(ctx, skl->lib_info,
+                                                       skl->lib_count);
+                       if (ret < 0) {
+                               dev_err(ctx->dev, "reload libs failed: %d\n",
+                                               ret);
+                               return ret;
+                       }
+
+               }
        }
 
        /*
 
        skl->cores.state[core_id] = SKL_DSP_RUNNING;
 
-       return ret;
+       return 0;
 }
 
 static int skl_set_dsp_D3(struct sst_dsp *ctx, unsigned int core_id)
        if (bytes_left < 0)
                return bytes_left;
 
-       if (is_module) { /* load module */
+       /* check is_module flag to load module or library */
+       if (is_module)
                ret = skl_ipc_load_modules(&skl->ipc, SKL_NUM_MODULES, &mod_id);
-               if (ret < 0) {
-                       dev_err(ctx->dev, "Failed to Load module: %d\n", ret);
-                       goto out;
-               }
+       else
+               ret = skl_sst_ipc_load_library(&skl->ipc, 0, table_id, false);
+
+       if (ret < 0) {
+               dev_err(ctx->dev, "Failed to Load %s with err %d\n",
+                               is_module ? "module" : "lib", ret);
+               goto out;
        }
 
        /*
        return ret;
 }
 
+static int
+kbl_load_library(struct sst_dsp *ctx, struct skl_lib_info *linfo, int lib_count)
+{
+       struct skl_sst *skl = ctx->thread_context;
+       struct firmware stripped_fw;
+       int ret, i;
+
+       /* library indices start from 1 to N. 0 represents base FW */
+       for (i = 1; i < lib_count; i++) {
+               ret = skl_prepare_lib_load(skl, &skl->lib_info[i], &stripped_fw,
+                                       SKL_ADSP_FW_BIN_HDR_OFFSET, i);
+               if (ret < 0)
+                       goto load_library_failed;
+               ret = skl_transfer_module(ctx, stripped_fw.data,
+                               stripped_fw.size, 0, i, false);
+               if (ret < 0)
+                       goto load_library_failed;
+       }
+
+       return 0;
+
+load_library_failed:
+       skl_release_library(linfo, lib_count);
+       return ret;
+}
+
 static int skl_load_module(struct sst_dsp *ctx, u16 mod_id, u8 *guid)
 {
        struct skl_module_table *module_entry = NULL;
        .set_state_D3 = skl_set_dsp_D3,
        .load_fw = skl_load_base_firmware,
        .get_fw_errcode = skl_get_errorcode,
+       .load_library = kbl_load_library,
        .load_mod = skl_load_module,
        .unload_mod = skl_unload_module,
 };
        }
 
        skl_dsp_init_core_state(sst);
+
+       if (ctx->lib_count > 1) {
+               ret = sst->fw_ops.load_library(sst, ctx->lib_info,
+                                               ctx->lib_count);
+               if (ret < 0) {
+                       dev_err(dev, "Load Library failed : %x\n", ret);
+                       return ret;
+               }
+       }
        ctx->is_first_boot = false;
 
        return 0;