diff options
Diffstat (limited to 'drivers/net/wwan/iosm/iosm_ipc_devlink.c')
-rw-r--r-- | drivers/net/wwan/iosm/iosm_ipc_devlink.c | 360 |
1 files changed, 0 insertions, 360 deletions
diff --git a/drivers/net/wwan/iosm/iosm_ipc_devlink.c b/drivers/net/wwan/iosm/iosm_ipc_devlink.c deleted file mode 100644 index 592792c277fe..000000000000 --- a/drivers/net/wwan/iosm/iosm_ipc_devlink.c +++ /dev/null @@ -1,360 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (C) 2020-2021 Intel Corporation. - */ - -#include "iosm_ipc_chnl_cfg.h" -#include "iosm_ipc_coredump.h" -#include "iosm_ipc_devlink.h" -#include "iosm_ipc_flash.h" - -/* Coredump list */ -static struct iosm_coredump_file_info list[IOSM_NOF_CD_REGION] = { - {"report.json", REPORT_JSON_SIZE,}, - {"coredump.fcd", COREDUMP_FCD_SIZE,}, - {"cdd.log", CDD_LOG_SIZE,}, - {"eeprom.bin", EEPROM_BIN_SIZE,}, - {"bootcore_trace.bin", BOOTCORE_TRC_BIN_SIZE,}, - {"bootcore_prev_trace.bin", BOOTCORE_PREV_TRC_BIN_SIZE,}, -}; - -/* Get the param values for the specific param ID's */ -static int ipc_devlink_get_param(struct devlink *dl, u32 id, - struct devlink_param_gset_ctx *ctx) -{ - struct iosm_devlink *ipc_devlink = devlink_priv(dl); - int rc = 0; - - switch (id) { - case IOSM_DEVLINK_PARAM_ID_ERASE_FULL_FLASH: - ctx->val.vu8 = ipc_devlink->param.erase_full_flash; - break; - - case IOSM_DEVLINK_PARAM_ID_DOWNLOAD_REGION: - ctx->val.vu8 = ipc_devlink->param.download_region; - break; - - case IOSM_DEVLINK_PARAM_ID_ADDRESS: - ctx->val.vu32 = ipc_devlink->param.address; - break; - - case IOSM_DEVLINK_PARAM_ID_REGION_COUNT: - ctx->val.vu8 = ipc_devlink->param.region_count; - break; - - default: - rc = -EOPNOTSUPP; - break; - } - - return rc; -} - -/* Set the param values for the specific param ID's */ -static int ipc_devlink_set_param(struct devlink *dl, u32 id, - struct devlink_param_gset_ctx *ctx) -{ - struct iosm_devlink *ipc_devlink = devlink_priv(dl); - int rc = 0; - - switch (id) { - case IOSM_DEVLINK_PARAM_ID_ERASE_FULL_FLASH: - ipc_devlink->param.erase_full_flash = ctx->val.vu8; - break; - - case IOSM_DEVLINK_PARAM_ID_DOWNLOAD_REGION: - ipc_devlink->param.download_region = ctx->val.vu8; - break; - - case IOSM_DEVLINK_PARAM_ID_ADDRESS: - ipc_devlink->param.address = ctx->val.vu32; - break; - - case IOSM_DEVLINK_PARAM_ID_REGION_COUNT: - ipc_devlink->param.region_count = ctx->val.vu8; - break; - - default: - rc = -EOPNOTSUPP; - break; - } - - return rc; -} - -/* Devlink param structure array */ -static const struct devlink_param iosm_devlink_params[] = { - DEVLINK_PARAM_DRIVER(IOSM_DEVLINK_PARAM_ID_ERASE_FULL_FLASH, - "erase_full_flash", DEVLINK_PARAM_TYPE_BOOL, - BIT(DEVLINK_PARAM_CMODE_RUNTIME), - ipc_devlink_get_param, ipc_devlink_set_param, - NULL), - DEVLINK_PARAM_DRIVER(IOSM_DEVLINK_PARAM_ID_DOWNLOAD_REGION, - "download_region", DEVLINK_PARAM_TYPE_BOOL, - BIT(DEVLINK_PARAM_CMODE_RUNTIME), - ipc_devlink_get_param, ipc_devlink_set_param, - NULL), - DEVLINK_PARAM_DRIVER(IOSM_DEVLINK_PARAM_ID_ADDRESS, - "address", DEVLINK_PARAM_TYPE_U32, - BIT(DEVLINK_PARAM_CMODE_RUNTIME), - ipc_devlink_get_param, ipc_devlink_set_param, - NULL), - DEVLINK_PARAM_DRIVER(IOSM_DEVLINK_PARAM_ID_REGION_COUNT, - "region_count", DEVLINK_PARAM_TYPE_U8, - BIT(DEVLINK_PARAM_CMODE_RUNTIME), - ipc_devlink_get_param, ipc_devlink_set_param, - NULL), -}; - -/* Get devlink flash component type */ -static enum iosm_flash_comp_type -ipc_devlink_get_flash_comp_type(const char comp_str[], u32 len) -{ - enum iosm_flash_comp_type fls_type; - - if (!strncmp("PSI", comp_str, len)) - fls_type = FLASH_COMP_TYPE_PSI; - else if (!strncmp("EBL", comp_str, len)) - fls_type = FLASH_COMP_TYPE_EBL; - else if (!strncmp("FLS", comp_str, len)) - fls_type = FLASH_COMP_TYPE_FLS; - else - fls_type = FLASH_COMP_TYPE_INVAL; - - return fls_type; -} - -/* Function triggered on devlink flash command - * Flash update function which calls multiple functions based on - * component type specified in the flash command - */ -static int ipc_devlink_flash_update(struct devlink *devlink, - struct devlink_flash_update_params *params, - struct netlink_ext_ack *extack) -{ - struct iosm_devlink *ipc_devlink = devlink_priv(devlink); - enum iosm_flash_comp_type fls_type; - u32 rc = -EINVAL; - u8 *mdm_rsp; - - mdm_rsp = kzalloc(IOSM_EBL_DW_PACK_SIZE, GFP_KERNEL); - if (!mdm_rsp) - return -ENOMEM; - - fls_type = ipc_devlink_get_flash_comp_type(params->component, - strlen(params->component)); - - switch (fls_type) { - case FLASH_COMP_TYPE_PSI: - rc = ipc_flash_boot_psi(ipc_devlink, params->fw); - break; - case FLASH_COMP_TYPE_EBL: - rc = ipc_flash_boot_ebl(ipc_devlink, params->fw); - if (!rc) - rc = ipc_flash_boot_set_capabilities(ipc_devlink, - mdm_rsp); - if (!rc) - rc = ipc_flash_read_swid(ipc_devlink, mdm_rsp); - break; - case FLASH_COMP_TYPE_FLS: - rc = ipc_flash_send_fls(ipc_devlink, params->fw, mdm_rsp); - break; - default: - devlink_flash_update_status_notify(devlink, "Invalid component", - params->component, 0, 0); - break; - } - - if (!rc) - devlink_flash_update_status_notify(devlink, "Flashing success", - params->component, 0, 0); - else - devlink_flash_update_status_notify(devlink, "Flashing failed", - params->component, 0, 0); - - kfree(mdm_rsp); - return rc; -} - -/* Call back function for devlink ops */ -static const struct devlink_ops devlink_flash_ops = { - .supported_flash_update_params = DEVLINK_SUPPORT_FLASH_UPDATE_COMPONENT, - .flash_update = ipc_devlink_flash_update, -}; - -/* Send command to modem to collect data */ -int ipc_devlink_send_cmd(struct iosm_devlink *ipc_devlink, u16 cmd, u32 entry) -{ - struct iosm_rpsi_cmd rpsi_cmd; - - rpsi_cmd.param.dword = cpu_to_le32(entry); - rpsi_cmd.cmd = cpu_to_le16(cmd); - rpsi_cmd.crc = rpsi_cmd.param.word[0] ^ rpsi_cmd.param.word[1] ^ - rpsi_cmd.cmd; - - return ipc_imem_sys_devlink_write(ipc_devlink, (u8 *)&rpsi_cmd, - sizeof(rpsi_cmd)); -} - -static int ipc_devlink_coredump_snapshot(struct devlink *dl, - const struct devlink_region_ops *ops, - struct netlink_ext_ack *extack, - u8 **data) -{ - struct iosm_devlink *ipc_devlink = devlink_priv(dl); - struct iosm_coredump_file_info *cd_list = ops->priv; - u32 region_size; - int rc; - - dev_dbg(ipc_devlink->dev, "Region:%s, ID:%d", ops->name, - cd_list->entry); - region_size = cd_list->default_size; - rc = ipc_coredump_collect(ipc_devlink, data, cd_list->entry, - region_size); - if (rc) { - dev_err(ipc_devlink->dev, "Fail to create snapshot,err %d", rc); - goto coredump_collect_err; - } - - /* Send coredump end cmd indicating end of coredump collection */ - if (cd_list->entry == (IOSM_NOF_CD_REGION - 1)) - ipc_coredump_get_list(ipc_devlink, rpsi_cmd_coredump_end); - - return rc; -coredump_collect_err: - ipc_coredump_get_list(ipc_devlink, rpsi_cmd_coredump_end); - return rc; -} - -/* To create regions for coredump files */ -static int ipc_devlink_create_region(struct iosm_devlink *devlink) -{ - struct devlink_region_ops *mdm_coredump; - int rc = 0; - u8 i; - - mdm_coredump = devlink->iosm_devlink_mdm_coredump; - for (i = 0; i < IOSM_NOF_CD_REGION; i++) { - mdm_coredump[i].name = list[i].filename; - mdm_coredump[i].snapshot = ipc_devlink_coredump_snapshot; - mdm_coredump[i].destructor = vfree; - devlink->cd_regions[i] = - devlink_region_create(devlink->devlink_ctx, - &mdm_coredump[i], MAX_SNAPSHOTS, - list[i].default_size); - - if (IS_ERR(devlink->cd_regions[i])) { - rc = PTR_ERR(devlink->cd_regions[i]); - dev_err(devlink->dev, "Devlink region fail,err %d", rc); - /* Delete previously created regions */ - for ( ; i > 0; i--) - devlink_region_destroy(devlink->cd_regions[i]); - goto region_create_fail; - } - list[i].entry = i; - mdm_coredump[i].priv = list + i; - } -region_create_fail: - return rc; -} - -/* To Destroy devlink regions */ -static void ipc_devlink_destroy_region(struct iosm_devlink *ipc_devlink) -{ - u8 i; - - for (i = 0; i < IOSM_NOF_CD_REGION; i++) - devlink_region_destroy(ipc_devlink->cd_regions[i]); -} - -/* Handle registration to devlink framework */ -struct iosm_devlink *ipc_devlink_init(struct iosm_imem *ipc_imem) -{ - struct ipc_chnl_cfg chnl_cfg_flash = { 0 }; - struct iosm_devlink *ipc_devlink; - struct devlink *devlink_ctx; - int rc; - - devlink_ctx = devlink_alloc(&devlink_flash_ops, - sizeof(struct iosm_devlink), - ipc_imem->dev); - if (!devlink_ctx) { - dev_err(ipc_imem->dev, "devlink_alloc failed"); - goto devlink_alloc_fail; - } - - ipc_devlink = devlink_priv(devlink_ctx); - ipc_devlink->devlink_ctx = devlink_ctx; - ipc_devlink->pcie = ipc_imem->pcie; - ipc_devlink->dev = ipc_imem->dev; - rc = devlink_register(devlink_ctx); - if (rc) { - dev_err(ipc_devlink->dev, "devlink_register failed rc %d", rc); - goto free_dl; - } - - rc = devlink_params_register(devlink_ctx, iosm_devlink_params, - ARRAY_SIZE(iosm_devlink_params)); - if (rc) { - dev_err(ipc_devlink->dev, - "devlink_params_register failed. rc %d", rc); - goto param_reg_fail; - } - - devlink_params_publish(devlink_ctx); - ipc_devlink->cd_file_info = list; - - rc = ipc_devlink_create_region(ipc_devlink); - if (rc) { - dev_err(ipc_devlink->dev, "Devlink Region create failed, rc %d", - rc); - goto region_create_fail; - } - - if (ipc_chnl_cfg_get(&chnl_cfg_flash, IPC_MEM_CTRL_CHL_ID_7) < 0) - goto chnl_get_fail; - - ipc_imem_channel_init(ipc_imem, IPC_CTYPE_CTRL, - chnl_cfg_flash, IRQ_MOD_OFF); - - init_completion(&ipc_devlink->devlink_sio.read_sem); - skb_queue_head_init(&ipc_devlink->devlink_sio.rx_list); - - dev_dbg(ipc_devlink->dev, "iosm devlink register success"); - - return ipc_devlink; - -chnl_get_fail: - ipc_devlink_destroy_region(ipc_devlink); -region_create_fail: - devlink_params_unpublish(devlink_ctx); - devlink_params_unregister(devlink_ctx, iosm_devlink_params, - ARRAY_SIZE(iosm_devlink_params)); -param_reg_fail: - devlink_unregister(devlink_ctx); -free_dl: - devlink_free(devlink_ctx); -devlink_alloc_fail: - return NULL; -} - -/* Handle unregistration of devlink */ -void ipc_devlink_deinit(struct iosm_devlink *ipc_devlink) -{ - struct devlink *devlink_ctx = ipc_devlink->devlink_ctx; - - ipc_devlink_destroy_region(ipc_devlink); - devlink_params_unpublish(devlink_ctx); - devlink_params_unregister(devlink_ctx, iosm_devlink_params, - ARRAY_SIZE(iosm_devlink_params)); - if (ipc_devlink->devlink_sio.devlink_read_pend) { - complete(&ipc_devlink->devlink_sio.read_sem); - complete(&ipc_devlink->devlink_sio.channel->ul_sem); - } - if (!ipc_devlink->devlink_sio.devlink_read_pend) - skb_queue_purge(&ipc_devlink->devlink_sio.rx_list); - - ipc_imem_sys_devlink_close(ipc_devlink); - devlink_unregister(devlink_ctx); - devlink_free(devlink_ctx); -} |