/** * host_init_wd - mei initialization wd. * * @dev: the device structure * returns -ENENT if wd client cannot be found * -EIO if write has failed */ int mei_wd_host_init(struct mei_device *dev) { mei_cl_init(&dev->wd_cl, dev); /* look for WD client and connect to it */ dev->wd_cl.state = MEI_FILE_DISCONNECTED; dev->wd_timeout = AMT_WD_DEFAULT_TIMEOUT; /* find ME WD client */ mei_find_me_client_update_filext(dev, &dev->wd_cl, &mei_wd_guid, MEI_WD_HOST_CLIENT_ID); dev_dbg(&dev->pdev->dev, "wd: check client\n"); if (MEI_FILE_CONNECTING != dev->wd_cl.state) { dev_info(&dev->pdev->dev, "wd: failed to find the client\n"); return -ENOENT; } if (mei_connect(dev, &dev->wd_cl)) { dev_err(&dev->pdev->dev, "wd: failed to connect to the client\n"); dev->wd_cl.state = MEI_FILE_DISCONNECTED; dev->wd_cl.host_client_id = 0; return -EIO; } dev->wd_cl.timer_count = CONNECT_TIMEOUT; return 0; }
sep_keymaster_return_t send_req_to_fw(const uint8_t * req, const uint32_t req_len, const uint8_t * resp, const uint32_t resp_len) { sep_keymaster_return_t result = SEP_KEYMASTER_FAILURE; int Status = -1; MEI_HANDLE *mei_handle = NULL; //Connect to the TXEI driver mei_handle = mei_connect(&ANDROID_HECI_AGENT_GUID); if (!mei_handle) { LOGERR("mei_connect failed\n"); result = SEP_KEYMASTER_HECI_CONNECT_FAILED; goto exit; } //Send data to the FWout/target/product/byt_t_ffrd8/system/lib Status = mei_snd_rcv(mei_handle, (void *) req, (uint32_t) req_len, (void *) resp, (uint32_t) resp_len); if (Status < 0) { LOGERR("mei_snd_rcv failed\n"); result = SEP_KEYMASTER_HECI_SNDRCV_FAILED; goto exit; } result = SEP_KEYMASTER_SUCCESS; exit: if (mei_handle) { mei_disconnect(mei_handle); //TODO: What happens if disconnect fails? Memory leak? mei_handle = NULL; } return result; }
/** * host_init_wd - mei initialization wd. * * @dev: the device structure */ bool mei_wd_host_init(struct mei_device *dev) { bool ret = false; mei_cl_init(&dev->wd_cl, dev); /* look for WD client and connect to it */ dev->wd_cl.state = MEI_FILE_DISCONNECTED; dev->wd_timeout = AMT_WD_DEFAULT_TIMEOUT; /* find ME WD client */ mei_find_me_client_update_filext(dev, &dev->wd_cl, &mei_wd_guid, MEI_WD_HOST_CLIENT_ID); dev_dbg(&dev->pdev->dev, "check wd_cl\n"); if (MEI_FILE_CONNECTING == dev->wd_cl.state) { if (mei_connect(dev, &dev->wd_cl)) { dev_dbg(&dev->pdev->dev, "Failed to connect to WD client\n"); dev->wd_cl.state = MEI_FILE_DISCONNECTED; dev->wd_cl.host_client_id = 0; ret = false; goto end; } else { dev->wd_cl.timer_count = CONNECT_TIMEOUT; } } else { dev_dbg(&dev->pdev->dev, "Failed to find WD client\n"); ret = false; goto end; } end: return ret; }
/** * host_init_wd - mei initialization wd. * * @dev: the device structure */ void mei_wd_host_init(struct mei_device *dev) { mei_cl_init(&dev->wd_cl, dev); /* look for WD client and connect to it */ dev->wd_cl.state = MEI_FILE_DISCONNECTED; dev->wd_timeout = watchdog_timeout; if (dev->wd_timeout > 0) { mei_wd_start_setup(dev); /* find ME WD client */ mei_find_me_client_update_filext(dev, &dev->wd_cl, &mei_wd_guid, MEI_WD_HOST_CLIENT_ID); dev_dbg(&dev->pdev->dev, "check wd_cl\n"); if (MEI_FILE_CONNECTING == dev->wd_cl.state) { if (!mei_connect(dev, &dev->wd_cl)) { dev_dbg(&dev->pdev->dev, "Failed to connect to WD client\n"); dev->wd_cl.state = MEI_FILE_DISCONNECTED; dev->wd_cl.host_client_id = 0; mei_host_init_iamthif(dev) ; } else { dev->wd_cl.timer_count = CONNECT_TIMEOUT; } } else { dev_dbg(&dev->pdev->dev, "Failed to find WD client\n"); mei_host_init_iamthif(dev) ; } } else { dev->wd_bypass = true; dev_dbg(&dev->pdev->dev, "WD requested to be disabled\n"); mei_host_init_iamthif(dev) ; } }
uint32_t tee_init(const GUID *guid, void **ptrHandle) { *ptrHandle = (void *)mei_connect(guid); if (*ptrHandle == NULL) { printf("ptrHandle error"); return TEE_FAILURE; } return TEE_SUCCESSFUL; }