Lines Matching refs:dev

101 void mei_hbm_idle(struct mei_device *dev)  in mei_hbm_idle()  argument
103 dev->init_clients_timer = 0; in mei_hbm_idle()
104 dev->hbm_state = MEI_HBM_IDLE; in mei_hbm_idle()
112 void mei_hbm_reset(struct mei_device *dev) in mei_hbm_reset() argument
114 dev->me_client_index = 0; in mei_hbm_reset()
116 mei_me_cl_rm_all(dev); in mei_hbm_reset()
118 mei_hbm_idle(dev); in mei_hbm_reset()
168 int mei_hbm_cl_write(struct mei_device *dev, in mei_hbm_cl_write() argument
171 struct mei_msg_hdr *mei_hdr = &dev->wr_msg.hdr; in mei_hbm_cl_write()
174 mei_hbm_cl_hdr(cl, hbm_cmd, dev->wr_msg.data, len); in mei_hbm_cl_write()
176 return mei_write_message(dev, mei_hdr, dev->wr_msg.data); in mei_hbm_cl_write()
204 struct mei_cl *mei_hbm_cl_find_by_cmd(struct mei_device *dev, void *buf) in mei_hbm_cl_find_by_cmd() argument
209 list_for_each_entry(cl, &dev->file_list, link) in mei_hbm_cl_find_by_cmd()
223 int mei_hbm_start_wait(struct mei_device *dev) in mei_hbm_start_wait() argument
227 if (dev->hbm_state > MEI_HBM_STARTING) in mei_hbm_start_wait()
230 mutex_unlock(&dev->device_lock); in mei_hbm_start_wait()
231 ret = wait_event_timeout(dev->wait_hbm_start, in mei_hbm_start_wait()
232 dev->hbm_state != MEI_HBM_STARTING, in mei_hbm_start_wait()
234 mutex_lock(&dev->device_lock); in mei_hbm_start_wait()
236 if (ret == 0 && (dev->hbm_state <= MEI_HBM_STARTING)) { in mei_hbm_start_wait()
237 dev->hbm_state = MEI_HBM_IDLE; in mei_hbm_start_wait()
238 dev_err(dev->dev, "waiting for mei start failed\n"); in mei_hbm_start_wait()
251 int mei_hbm_start_req(struct mei_device *dev) in mei_hbm_start_req() argument
253 struct mei_msg_hdr *mei_hdr = &dev->wr_msg.hdr; in mei_hbm_start_req()
258 mei_hbm_reset(dev); in mei_hbm_start_req()
263 start_req = (struct hbm_host_version_request *)dev->wr_msg.data; in mei_hbm_start_req()
269 dev->hbm_state = MEI_HBM_IDLE; in mei_hbm_start_req()
270 ret = mei_write_message(dev, mei_hdr, dev->wr_msg.data); in mei_hbm_start_req()
272 dev_err(dev->dev, "version message write failed: ret = %d\n", in mei_hbm_start_req()
277 dev->hbm_state = MEI_HBM_STARTING; in mei_hbm_start_req()
278 dev->init_clients_timer = MEI_CLIENTS_INIT_TIMEOUT; in mei_hbm_start_req()
289 static int mei_hbm_enum_clients_req(struct mei_device *dev) in mei_hbm_enum_clients_req() argument
291 struct mei_msg_hdr *mei_hdr = &dev->wr_msg.hdr; in mei_hbm_enum_clients_req()
299 enum_req = (struct hbm_host_enum_request *)dev->wr_msg.data; in mei_hbm_enum_clients_req()
303 ret = mei_write_message(dev, mei_hdr, dev->wr_msg.data); in mei_hbm_enum_clients_req()
305 dev_err(dev->dev, "enumeration request write failed: ret = %d.\n", in mei_hbm_enum_clients_req()
309 dev->hbm_state = MEI_HBM_ENUM_CLIENTS; in mei_hbm_enum_clients_req()
310 dev->init_clients_timer = MEI_CLIENTS_INIT_TIMEOUT; in mei_hbm_enum_clients_req()
323 static int mei_hbm_me_cl_add(struct mei_device *dev, in mei_hbm_me_cl_add() argument
329 mei_me_cl_rm_by_uuid(dev, uuid); in mei_hbm_me_cl_add()
341 mei_me_cl_add(dev, me_cl); in mei_hbm_me_cl_add()
354 static int mei_hbm_prop_req(struct mei_device *dev) in mei_hbm_prop_req() argument
357 struct mei_msg_hdr *mei_hdr = &dev->wr_msg.hdr; in mei_hbm_prop_req()
363 next_client_index = find_next_bit(dev->me_clients_map, MEI_CLIENTS_MAX, in mei_hbm_prop_req()
364 dev->me_client_index); in mei_hbm_prop_req()
368 dev->hbm_state = MEI_HBM_STARTED; in mei_hbm_prop_req()
369 schedule_work(&dev->init_work); in mei_hbm_prop_req()
375 prop_req = (struct hbm_props_request *)dev->wr_msg.data; in mei_hbm_prop_req()
382 ret = mei_write_message(dev, mei_hdr, dev->wr_msg.data); in mei_hbm_prop_req()
384 dev_err(dev->dev, "properties request write failed: ret = %d\n", in mei_hbm_prop_req()
389 dev->init_clients_timer = MEI_CLIENTS_INIT_TIMEOUT; in mei_hbm_prop_req()
390 dev->me_client_index = next_client_index; in mei_hbm_prop_req()
404 int mei_hbm_pg(struct mei_device *dev, u8 pg_cmd) in mei_hbm_pg() argument
406 struct mei_msg_hdr *mei_hdr = &dev->wr_msg.hdr; in mei_hbm_pg()
411 if (!dev->hbm_f_pg_supported) in mei_hbm_pg()
416 req = (struct hbm_power_gate *)dev->wr_msg.data; in mei_hbm_pg()
420 ret = mei_write_message(dev, mei_hdr, dev->wr_msg.data); in mei_hbm_pg()
422 dev_err(dev->dev, "power gate command write failed.\n"); in mei_hbm_pg()
434 static int mei_hbm_stop_req(struct mei_device *dev) in mei_hbm_stop_req() argument
436 struct mei_msg_hdr *mei_hdr = &dev->wr_msg.hdr; in mei_hbm_stop_req()
438 (struct hbm_host_stop_request *)dev->wr_msg.data; in mei_hbm_stop_req()
447 return mei_write_message(dev, mei_hdr, dev->wr_msg.data); in mei_hbm_stop_req()
458 int mei_hbm_cl_flow_control_req(struct mei_device *dev, struct mei_cl *cl) in mei_hbm_cl_flow_control_req() argument
462 cl_dbg(dev, cl, "sending flow control\n"); in mei_hbm_cl_flow_control_req()
463 return mei_hbm_cl_write(dev, cl, MEI_FLOW_CONTROL_CMD, len); in mei_hbm_cl_flow_control_req()
474 static int mei_hbm_add_single_flow_creds(struct mei_device *dev, in mei_hbm_add_single_flow_creds() argument
480 me_cl = mei_me_cl_by_id(dev, flow->me_addr); in mei_hbm_add_single_flow_creds()
482 dev_err(dev->dev, "no such me client %d\n", in mei_hbm_add_single_flow_creds()
493 dev_dbg(dev->dev, "recv flow ctrl msg ME %d (single) creds = %d.\n", in mei_hbm_add_single_flow_creds()
508 static void mei_hbm_cl_flow_control_res(struct mei_device *dev, in mei_hbm_cl_flow_control_res() argument
515 mei_hbm_add_single_flow_creds(dev, flow_control); in mei_hbm_cl_flow_control_res()
519 cl = mei_hbm_cl_find_by_cmd(dev, flow_control); in mei_hbm_cl_flow_control_res()
522 cl_dbg(dev, cl, "flow control creds = %d.\n", in mei_hbm_cl_flow_control_res()
536 int mei_hbm_cl_disconnect_req(struct mei_device *dev, struct mei_cl *cl) in mei_hbm_cl_disconnect_req() argument
540 return mei_hbm_cl_write(dev, cl, CLIENT_DISCONNECT_REQ_CMD, len); in mei_hbm_cl_disconnect_req()
551 int mei_hbm_cl_disconnect_rsp(struct mei_device *dev, struct mei_cl *cl) in mei_hbm_cl_disconnect_rsp() argument
555 return mei_hbm_cl_write(dev, cl, CLIENT_DISCONNECT_RES_CMD, len); in mei_hbm_cl_disconnect_rsp()
566 static void mei_hbm_cl_disconnect_res(struct mei_device *dev, struct mei_cl *cl, in mei_hbm_cl_disconnect_res() argument
572 cl_dbg(dev, cl, "hbm: disconnect response status=%d\n", rs->status); in mei_hbm_cl_disconnect_res()
587 int mei_hbm_cl_connect_req(struct mei_device *dev, struct mei_cl *cl) in mei_hbm_cl_connect_req() argument
591 return mei_hbm_cl_write(dev, cl, CLIENT_CONNECT_REQ_CMD, len); in mei_hbm_cl_connect_req()
602 static void mei_hbm_cl_connect_res(struct mei_device *dev, struct mei_cl *cl, in mei_hbm_cl_connect_res() argument
608 cl_dbg(dev, cl, "hbm: connect response status=%s\n", in mei_hbm_cl_connect_res()
626 static void mei_hbm_cl_res(struct mei_device *dev, in mei_hbm_cl_res() argument
634 list_for_each_entry_safe(cb, next, &dev->ctrl_rd_list.list, list) { in mei_hbm_cl_res()
652 mei_hbm_cl_connect_res(dev, cl, rs); in mei_hbm_cl_res()
655 mei_hbm_cl_disconnect_res(dev, cl, rs); in mei_hbm_cl_res()
675 static int mei_hbm_fw_disconnect_req(struct mei_device *dev, in mei_hbm_fw_disconnect_req() argument
681 cl = mei_hbm_cl_find_by_cmd(dev, disconnect_req); in mei_hbm_fw_disconnect_req()
683 cl_dbg(dev, cl, "disconnect request received\n"); in mei_hbm_fw_disconnect_req()
690 cl_dbg(dev, cl, "add disconnect response as first\n"); in mei_hbm_fw_disconnect_req()
691 list_add(&cb->list, &dev->ctrl_wr_list.list); in mei_hbm_fw_disconnect_req()
702 static void mei_hbm_config_features(struct mei_device *dev) in mei_hbm_config_features() argument
705 dev->hbm_f_pg_supported = 0; in mei_hbm_config_features()
706 if (dev->version.major_version > HBM_MAJOR_VERSION_PGI) in mei_hbm_config_features()
707 dev->hbm_f_pg_supported = 1; in mei_hbm_config_features()
709 if (dev->version.major_version == HBM_MAJOR_VERSION_PGI && in mei_hbm_config_features()
710 dev->version.minor_version >= HBM_MINOR_VERSION_PGI) in mei_hbm_config_features()
711 dev->hbm_f_pg_supported = 1; in mei_hbm_config_features()
721 bool mei_hbm_version_is_supported(struct mei_device *dev) in mei_hbm_version_is_supported() argument
723 return (dev->version.major_version < HBM_MAJOR_VERSION) || in mei_hbm_version_is_supported()
724 (dev->version.major_version == HBM_MAJOR_VERSION && in mei_hbm_version_is_supported()
725 dev->version.minor_version <= HBM_MINOR_VERSION); in mei_hbm_version_is_supported()
737 int mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr) in mei_hbm_dispatch() argument
749 BUG_ON(hdr->length >= sizeof(dev->rd_msg_buf)); in mei_hbm_dispatch()
750 mei_read_slots(dev, dev->rd_msg_buf, hdr->length); in mei_hbm_dispatch()
751 mei_msg = (struct mei_bus_message *)dev->rd_msg_buf; in mei_hbm_dispatch()
757 if (dev->hbm_state == MEI_HBM_IDLE) { in mei_hbm_dispatch()
758 dev_dbg(dev->dev, "hbm: state is idle ignore spurious messages\n"); in mei_hbm_dispatch()
764 dev_dbg(dev->dev, "hbm: start: response message received.\n"); in mei_hbm_dispatch()
766 dev->init_clients_timer = 0; in mei_hbm_dispatch()
770 dev_dbg(dev->dev, "HBM VERSION: DRIVER=%02d:%02d DEVICE=%02d:%02d\n", in mei_hbm_dispatch()
776 dev->version.major_version = HBM_MAJOR_VERSION; in mei_hbm_dispatch()
777 dev->version.minor_version = HBM_MINOR_VERSION; in mei_hbm_dispatch()
779 dev->version.major_version = in mei_hbm_dispatch()
781 dev->version.minor_version = in mei_hbm_dispatch()
785 if (!mei_hbm_version_is_supported(dev)) { in mei_hbm_dispatch()
786 dev_warn(dev->dev, "hbm: start: version mismatch - stopping the driver.\n"); in mei_hbm_dispatch()
788 dev->hbm_state = MEI_HBM_STOPPED; in mei_hbm_dispatch()
789 if (mei_hbm_stop_req(dev)) { in mei_hbm_dispatch()
790 dev_err(dev->dev, "hbm: start: failed to send stop request\n"); in mei_hbm_dispatch()
796 mei_hbm_config_features(dev); in mei_hbm_dispatch()
798 if (dev->dev_state != MEI_DEV_INIT_CLIENTS || in mei_hbm_dispatch()
799 dev->hbm_state != MEI_HBM_STARTING) { in mei_hbm_dispatch()
800 dev_err(dev->dev, "hbm: start: state mismatch, [%d, %d]\n", in mei_hbm_dispatch()
801 dev->dev_state, dev->hbm_state); in mei_hbm_dispatch()
805 if (mei_hbm_enum_clients_req(dev)) { in mei_hbm_dispatch()
806 dev_err(dev->dev, "hbm: start: failed to send enumeration request\n"); in mei_hbm_dispatch()
810 wake_up(&dev->wait_hbm_start); in mei_hbm_dispatch()
814 dev_dbg(dev->dev, "hbm: client connect response: message received.\n"); in mei_hbm_dispatch()
815 mei_hbm_cl_res(dev, cl_cmd, MEI_FOP_CONNECT); in mei_hbm_dispatch()
819 dev_dbg(dev->dev, "hbm: client disconnect response: message received.\n"); in mei_hbm_dispatch()
820 mei_hbm_cl_res(dev, cl_cmd, MEI_FOP_DISCONNECT); in mei_hbm_dispatch()
824 dev_dbg(dev->dev, "hbm: client flow control response: message received.\n"); in mei_hbm_dispatch()
827 mei_hbm_cl_flow_control_res(dev, flow_control); in mei_hbm_dispatch()
831 dev_dbg(dev->dev, "power gate isolation entry response received\n"); in mei_hbm_dispatch()
832 dev->pg_event = MEI_PG_EVENT_RECEIVED; in mei_hbm_dispatch()
833 if (waitqueue_active(&dev->wait_pg)) in mei_hbm_dispatch()
834 wake_up(&dev->wait_pg); in mei_hbm_dispatch()
838 dev_dbg(dev->dev, "power gate isolation exit request received\n"); in mei_hbm_dispatch()
839 dev->pg_event = MEI_PG_EVENT_RECEIVED; in mei_hbm_dispatch()
840 if (waitqueue_active(&dev->wait_pg)) in mei_hbm_dispatch()
841 wake_up(&dev->wait_pg); in mei_hbm_dispatch()
848 pm_request_resume(dev->dev); in mei_hbm_dispatch()
852 dev_dbg(dev->dev, "hbm: properties response: message received.\n"); in mei_hbm_dispatch()
854 dev->init_clients_timer = 0; in mei_hbm_dispatch()
856 if (dev->dev_state != MEI_DEV_INIT_CLIENTS || in mei_hbm_dispatch()
857 dev->hbm_state != MEI_HBM_CLIENT_PROPERTIES) { in mei_hbm_dispatch()
858 dev_err(dev->dev, "hbm: properties response: state mismatch, [%d, %d]\n", in mei_hbm_dispatch()
859 dev->dev_state, dev->hbm_state); in mei_hbm_dispatch()
866 dev_err(dev->dev, "hbm: properties response: wrong status = %d %s\n", in mei_hbm_dispatch()
872 mei_hbm_me_cl_add(dev, props_res); in mei_hbm_dispatch()
874 dev->me_client_index++; in mei_hbm_dispatch()
877 if (mei_hbm_prop_req(dev)) in mei_hbm_dispatch()
883 dev_dbg(dev->dev, "hbm: enumeration response: message received\n"); in mei_hbm_dispatch()
885 dev->init_clients_timer = 0; in mei_hbm_dispatch()
888 BUILD_BUG_ON(sizeof(dev->me_clients_map) in mei_hbm_dispatch()
890 memcpy(dev->me_clients_map, enum_res->valid_addresses, in mei_hbm_dispatch()
893 if (dev->dev_state != MEI_DEV_INIT_CLIENTS || in mei_hbm_dispatch()
894 dev->hbm_state != MEI_HBM_ENUM_CLIENTS) { in mei_hbm_dispatch()
895 dev_err(dev->dev, "hbm: enumeration response: state mismatch, [%d, %d]\n", in mei_hbm_dispatch()
896 dev->dev_state, dev->hbm_state); in mei_hbm_dispatch()
900 dev->hbm_state = MEI_HBM_CLIENT_PROPERTIES; in mei_hbm_dispatch()
903 if (mei_hbm_prop_req(dev)) in mei_hbm_dispatch()
909 dev_dbg(dev->dev, "hbm: stop response: message received\n"); in mei_hbm_dispatch()
911 dev->init_clients_timer = 0; in mei_hbm_dispatch()
913 if (dev->hbm_state != MEI_HBM_STOPPED) { in mei_hbm_dispatch()
914 dev_err(dev->dev, "hbm: stop response: state mismatch, [%d, %d]\n", in mei_hbm_dispatch()
915 dev->dev_state, dev->hbm_state); in mei_hbm_dispatch()
919 dev->dev_state = MEI_DEV_POWER_DOWN; in mei_hbm_dispatch()
920 dev_info(dev->dev, "hbm: stop response: resetting.\n"); in mei_hbm_dispatch()
926 dev_dbg(dev->dev, "hbm: disconnect request: message received\n"); in mei_hbm_dispatch()
929 mei_hbm_fw_disconnect_req(dev, disconnect_req); in mei_hbm_dispatch()
933 dev_dbg(dev->dev, "hbm: stop request: message received\n"); in mei_hbm_dispatch()
934 dev->hbm_state = MEI_HBM_STOPPED; in mei_hbm_dispatch()
935 if (mei_hbm_stop_req(dev)) { in mei_hbm_dispatch()
936 dev_err(dev->dev, "hbm: stop request: failed to send stop request\n"); in mei_hbm_dispatch()