1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (c) 2003-2022, Intel Corporation. All rights reserved. 4 * Intel Management Engine Interface (Intel MEI) Linux driver 5 */ 6 #include <linux/export.h> 7 #include <linux/sched.h> 8 #include <linux/wait.h> 9 #include <linux/pm_runtime.h> 10 #include <linux/slab.h> 11 12 #include <linux/mei.h> 13 14 #include "mei_dev.h" 15 #include "hbm.h" 16 #include "client.h" 17 18 static const char *mei_hbm_status_str(enum mei_hbm_status status) 19 { 20 #define MEI_HBM_STATUS(status) case MEI_HBMS_##status: return #status 21 switch (status) { 22 MEI_HBM_STATUS(SUCCESS); 23 MEI_HBM_STATUS(CLIENT_NOT_FOUND); 24 MEI_HBM_STATUS(ALREADY_EXISTS); 25 MEI_HBM_STATUS(REJECTED); 26 MEI_HBM_STATUS(INVALID_PARAMETER); 27 MEI_HBM_STATUS(NOT_ALLOWED); 28 MEI_HBM_STATUS(ALREADY_STARTED); 29 MEI_HBM_STATUS(NOT_STARTED); 30 default: return "unknown"; 31 } 32 #undef MEI_HBM_STATUS 33 }; 34 35 static const char *mei_cl_conn_status_str(enum mei_cl_connect_status status) 36 { 37 #define MEI_CL_CS(status) case MEI_CL_CONN_##status: return #status 38 switch (status) { 39 MEI_CL_CS(SUCCESS); 40 MEI_CL_CS(NOT_FOUND); 41 MEI_CL_CS(ALREADY_STARTED); 42 MEI_CL_CS(OUT_OF_RESOURCES); 43 MEI_CL_CS(MESSAGE_SMALL); 44 MEI_CL_CS(NOT_ALLOWED); 45 default: return "unknown"; 46 } 47 #undef MEI_CL_CCS 48 } 49 50 const char *mei_hbm_state_str(enum mei_hbm_state state) 51 { 52 #define MEI_HBM_STATE(state) case MEI_HBM_##state: return #state 53 switch (state) { 54 MEI_HBM_STATE(IDLE); 55 MEI_HBM_STATE(STARTING); 56 MEI_HBM_STATE(STARTED); 57 MEI_HBM_STATE(DR_SETUP); 58 MEI_HBM_STATE(ENUM_CLIENTS); 59 MEI_HBM_STATE(CLIENT_PROPERTIES); 60 MEI_HBM_STATE(STOPPED); 61 default: 62 return "unknown"; 63 } 64 #undef MEI_HBM_STATE 65 } 66 67 /** 68 * mei_cl_conn_status_to_errno - convert client connect response 69 * status to error code 70 * 71 * @status: client connect response status 72 * 73 * Return: corresponding error code 74 */ 75 static int mei_cl_conn_status_to_errno(enum mei_cl_connect_status status) 76 { 77 switch (status) { 78 case MEI_CL_CONN_SUCCESS: return 0; 79 case MEI_CL_CONN_NOT_FOUND: return -ENOTTY; 80 case MEI_CL_CONN_ALREADY_STARTED: return -EBUSY; 81 case MEI_CL_CONN_OUT_OF_RESOURCES: return -EBUSY; 82 case MEI_CL_CONN_MESSAGE_SMALL: return -EINVAL; 83 case MEI_CL_CONN_NOT_ALLOWED: return -EBUSY; 84 default: return -EINVAL; 85 } 86 } 87 88 /** 89 * mei_hbm_write_message - wrapper for sending hbm messages. 90 * 91 * @dev: mei device 92 * @hdr: mei header 93 * @data: payload 94 * 95 * Return: >=0 on success, <0 on error 96 */ 97 static inline int mei_hbm_write_message(struct mei_device *dev, 98 struct mei_msg_hdr *hdr, 99 const void *data) 100 { 101 return mei_write_message(dev, hdr, sizeof(*hdr), data, hdr->length); 102 } 103 104 /** 105 * mei_hbm_idle - set hbm to idle state 106 * 107 * @dev: the device structure 108 */ 109 void mei_hbm_idle(struct mei_device *dev) 110 { 111 dev->init_clients_timer = 0; 112 dev->hbm_state = MEI_HBM_IDLE; 113 } 114 115 /** 116 * mei_hbm_reset - reset hbm counters and book keeping data structures 117 * 118 * @dev: the device structure 119 */ 120 void mei_hbm_reset(struct mei_device *dev) 121 { 122 mei_me_cl_rm_all(dev); 123 124 mei_hbm_idle(dev); 125 } 126 127 /** 128 * mei_hbm_hdr - construct hbm header 129 * 130 * @mei_hdr: hbm header 131 * @length: payload length 132 */ 133 134 static inline void mei_hbm_hdr(struct mei_msg_hdr *mei_hdr, size_t length) 135 { 136 memset(mei_hdr, 0, sizeof(*mei_hdr)); 137 mei_hdr->length = length; 138 mei_hdr->msg_complete = 1; 139 } 140 141 /** 142 * mei_hbm_cl_hdr - construct client hbm header 143 * 144 * @cl: client 145 * @hbm_cmd: host bus message command 146 * @buf: buffer for cl header 147 * @len: buffer length 148 */ 149 static inline 150 void mei_hbm_cl_hdr(struct mei_cl *cl, u8 hbm_cmd, void *buf, size_t len) 151 { 152 struct mei_hbm_cl_cmd *cmd = buf; 153 154 memset(cmd, 0, len); 155 156 cmd->hbm_cmd = hbm_cmd; 157 cmd->host_addr = mei_cl_host_addr(cl); 158 cmd->me_addr = mei_cl_me_id(cl); 159 } 160 161 /** 162 * mei_hbm_cl_write - write simple hbm client message 163 * 164 * @dev: the device structure 165 * @cl: client 166 * @hbm_cmd: host bus message command 167 * @buf: message buffer 168 * @len: buffer length 169 * 170 * Return: 0 on success, <0 on failure. 171 */ 172 static inline int mei_hbm_cl_write(struct mei_device *dev, struct mei_cl *cl, 173 u8 hbm_cmd, void *buf, size_t len) 174 { 175 struct mei_msg_hdr mei_hdr; 176 177 mei_hbm_hdr(&mei_hdr, len); 178 mei_hbm_cl_hdr(cl, hbm_cmd, buf, len); 179 180 return mei_hbm_write_message(dev, &mei_hdr, buf); 181 } 182 183 /** 184 * mei_hbm_cl_addr_equal - check if the client's and 185 * the message address match 186 * 187 * @cl: client 188 * @cmd: hbm client message 189 * 190 * Return: true if addresses are the same 191 */ 192 static inline 193 bool mei_hbm_cl_addr_equal(struct mei_cl *cl, struct mei_hbm_cl_cmd *cmd) 194 { 195 return mei_cl_host_addr(cl) == cmd->host_addr && 196 mei_cl_me_id(cl) == cmd->me_addr; 197 } 198 199 /** 200 * mei_hbm_cl_find_by_cmd - find recipient client 201 * 202 * @dev: the device structure 203 * @buf: a buffer with hbm cl command 204 * 205 * Return: the recipient client or NULL if not found 206 */ 207 static inline 208 struct mei_cl *mei_hbm_cl_find_by_cmd(struct mei_device *dev, void *buf) 209 { 210 struct mei_hbm_cl_cmd *cmd = (struct mei_hbm_cl_cmd *)buf; 211 struct mei_cl *cl; 212 213 list_for_each_entry(cl, &dev->file_list, link) 214 if (mei_hbm_cl_addr_equal(cl, cmd)) 215 return cl; 216 return NULL; 217 } 218 219 220 /** 221 * mei_hbm_start_wait - wait for start response message. 222 * 223 * @dev: the device structure 224 * 225 * Return: 0 on success and < 0 on failure 226 */ 227 int mei_hbm_start_wait(struct mei_device *dev) 228 { 229 int ret; 230 231 if (dev->hbm_state > MEI_HBM_STARTING) 232 return 0; 233 234 mutex_unlock(&dev->device_lock); 235 ret = wait_event_timeout(dev->wait_hbm_start, 236 dev->hbm_state != MEI_HBM_STARTING, 237 dev->timeouts.hbm); 238 mutex_lock(&dev->device_lock); 239 240 if (ret == 0 && (dev->hbm_state <= MEI_HBM_STARTING)) { 241 dev->hbm_state = MEI_HBM_IDLE; 242 dev_err(dev->dev, "waiting for mei start failed\n"); 243 return -ETIME; 244 } 245 return 0; 246 } 247 248 /** 249 * mei_hbm_start_req - sends start request message. 250 * 251 * @dev: the device structure 252 * 253 * Return: 0 on success and < 0 on failure 254 */ 255 int mei_hbm_start_req(struct mei_device *dev) 256 { 257 struct mei_msg_hdr mei_hdr; 258 struct hbm_host_version_request req; 259 int ret; 260 261 mei_hbm_reset(dev); 262 263 mei_hbm_hdr(&mei_hdr, sizeof(req)); 264 265 /* host start message */ 266 memset(&req, 0, sizeof(req)); 267 req.hbm_cmd = HOST_START_REQ_CMD; 268 req.host_version.major_version = HBM_MAJOR_VERSION; 269 req.host_version.minor_version = HBM_MINOR_VERSION; 270 271 dev->hbm_state = MEI_HBM_IDLE; 272 ret = mei_hbm_write_message(dev, &mei_hdr, &req); 273 if (ret) { 274 dev_err(dev->dev, "version message write failed: ret = %d\n", 275 ret); 276 return ret; 277 } 278 279 dev->hbm_state = MEI_HBM_STARTING; 280 dev->init_clients_timer = dev->timeouts.client_init; 281 mei_schedule_stall_timer(dev); 282 return 0; 283 } 284 285 /** 286 * mei_hbm_dma_setup_req() - setup DMA request 287 * @dev: the device structure 288 * 289 * Return: 0 on success and < 0 on failure 290 */ 291 static int mei_hbm_dma_setup_req(struct mei_device *dev) 292 { 293 struct mei_msg_hdr mei_hdr; 294 struct hbm_dma_setup_request req; 295 unsigned int i; 296 int ret; 297 298 mei_hbm_hdr(&mei_hdr, sizeof(req)); 299 300 memset(&req, 0, sizeof(req)); 301 req.hbm_cmd = MEI_HBM_DMA_SETUP_REQ_CMD; 302 for (i = 0; i < DMA_DSCR_NUM; i++) { 303 phys_addr_t paddr; 304 305 paddr = dev->dr_dscr[i].daddr; 306 req.dma_dscr[i].addr_hi = upper_32_bits(paddr); 307 req.dma_dscr[i].addr_lo = lower_32_bits(paddr); 308 req.dma_dscr[i].size = dev->dr_dscr[i].size; 309 } 310 311 mei_dma_ring_reset(dev); 312 313 ret = mei_hbm_write_message(dev, &mei_hdr, &req); 314 if (ret) { 315 dev_err(dev->dev, "dma setup request write failed: ret = %d.\n", 316 ret); 317 return ret; 318 } 319 320 dev->hbm_state = MEI_HBM_DR_SETUP; 321 dev->init_clients_timer = dev->timeouts.client_init; 322 mei_schedule_stall_timer(dev); 323 return 0; 324 } 325 326 /** 327 * mei_hbm_capabilities_req - request capabilities 328 * 329 * @dev: the device structure 330 * 331 * Return: 0 on success and < 0 on failure 332 */ 333 static int mei_hbm_capabilities_req(struct mei_device *dev) 334 { 335 struct mei_msg_hdr mei_hdr; 336 struct hbm_capability_request req; 337 int ret; 338 339 mei_hbm_hdr(&mei_hdr, sizeof(req)); 340 341 memset(&req, 0, sizeof(req)); 342 req.hbm_cmd = MEI_HBM_CAPABILITIES_REQ_CMD; 343 if (dev->hbm_f_vt_supported) 344 req.capability_requested[0] |= HBM_CAP_VT; 345 346 if (dev->hbm_f_cd_supported) 347 req.capability_requested[0] |= HBM_CAP_CD; 348 349 if (dev->hbm_f_gsc_supported) 350 req.capability_requested[0] |= HBM_CAP_GSC; 351 352 ret = mei_hbm_write_message(dev, &mei_hdr, &req); 353 if (ret) { 354 dev_err(dev->dev, 355 "capabilities request write failed: ret = %d.\n", ret); 356 return ret; 357 } 358 359 dev->hbm_state = MEI_HBM_CAP_SETUP; 360 dev->init_clients_timer = dev->timeouts.client_init; 361 mei_schedule_stall_timer(dev); 362 return 0; 363 } 364 365 /** 366 * mei_hbm_enum_clients_req - sends enumeration client request message. 367 * 368 * @dev: the device structure 369 * 370 * Return: 0 on success and < 0 on failure 371 */ 372 static int mei_hbm_enum_clients_req(struct mei_device *dev) 373 { 374 struct mei_msg_hdr mei_hdr; 375 struct hbm_host_enum_request req; 376 int ret; 377 378 /* enumerate clients */ 379 mei_hbm_hdr(&mei_hdr, sizeof(req)); 380 381 memset(&req, 0, sizeof(req)); 382 req.hbm_cmd = HOST_ENUM_REQ_CMD; 383 req.flags |= dev->hbm_f_dc_supported ? MEI_HBM_ENUM_F_ALLOW_ADD : 0; 384 req.flags |= dev->hbm_f_ie_supported ? 385 MEI_HBM_ENUM_F_IMMEDIATE_ENUM : 0; 386 387 ret = mei_hbm_write_message(dev, &mei_hdr, &req); 388 if (ret) { 389 dev_err(dev->dev, "enumeration request write failed: ret = %d.\n", 390 ret); 391 return ret; 392 } 393 dev->hbm_state = MEI_HBM_ENUM_CLIENTS; 394 dev->init_clients_timer = dev->timeouts.client_init; 395 mei_schedule_stall_timer(dev); 396 return 0; 397 } 398 399 /** 400 * mei_hbm_me_cl_add - add new me client to the list 401 * 402 * @dev: the device structure 403 * @res: hbm property response 404 * 405 * Return: 0 on success and -ENOMEM on allocation failure 406 */ 407 408 static int mei_hbm_me_cl_add(struct mei_device *dev, 409 struct hbm_props_response *res) 410 { 411 struct mei_me_client *me_cl; 412 const uuid_le *uuid = &res->client_properties.protocol_name; 413 414 mei_me_cl_rm_by_uuid(dev, uuid); 415 416 me_cl = kzalloc(sizeof(*me_cl), GFP_KERNEL); 417 if (!me_cl) 418 return -ENOMEM; 419 420 mei_me_cl_init(me_cl); 421 422 me_cl->props = res->client_properties; 423 me_cl->client_id = res->me_addr; 424 me_cl->tx_flow_ctrl_creds = 0; 425 426 mei_me_cl_add(dev, me_cl); 427 428 return 0; 429 } 430 431 /** 432 * mei_hbm_add_cl_resp - send response to fw on client add request 433 * 434 * @dev: the device structure 435 * @addr: me address 436 * @status: response status 437 * 438 * Return: 0 on success and < 0 on failure 439 */ 440 static int mei_hbm_add_cl_resp(struct mei_device *dev, u8 addr, u8 status) 441 { 442 struct mei_msg_hdr mei_hdr; 443 struct hbm_add_client_response resp; 444 int ret; 445 446 dev_dbg(dev->dev, "adding client response\n"); 447 448 mei_hbm_hdr(&mei_hdr, sizeof(resp)); 449 450 memset(&resp, 0, sizeof(resp)); 451 resp.hbm_cmd = MEI_HBM_ADD_CLIENT_RES_CMD; 452 resp.me_addr = addr; 453 resp.status = status; 454 455 ret = mei_hbm_write_message(dev, &mei_hdr, &resp); 456 if (ret) 457 dev_err(dev->dev, "add client response write failed: ret = %d\n", 458 ret); 459 return ret; 460 } 461 462 /** 463 * mei_hbm_fw_add_cl_req - request from the fw to add a client 464 * 465 * @dev: the device structure 466 * @req: add client request 467 * 468 * Return: 0 on success and < 0 on failure 469 */ 470 static int mei_hbm_fw_add_cl_req(struct mei_device *dev, 471 struct hbm_add_client_request *req) 472 { 473 int ret; 474 u8 status = MEI_HBMS_SUCCESS; 475 476 BUILD_BUG_ON(sizeof(struct hbm_add_client_request) != 477 sizeof(struct hbm_props_response)); 478 479 ret = mei_hbm_me_cl_add(dev, (struct hbm_props_response *)req); 480 if (ret) 481 status = !MEI_HBMS_SUCCESS; 482 483 if (dev->dev_state == MEI_DEV_ENABLED) 484 schedule_work(&dev->bus_rescan_work); 485 486 return mei_hbm_add_cl_resp(dev, req->me_addr, status); 487 } 488 489 /** 490 * mei_hbm_cl_notify_req - send notification request 491 * 492 * @dev: the device structure 493 * @cl: a client to disconnect from 494 * @start: true for start false for stop 495 * 496 * Return: 0 on success and -EIO on write failure 497 */ 498 int mei_hbm_cl_notify_req(struct mei_device *dev, 499 struct mei_cl *cl, u8 start) 500 { 501 502 struct mei_msg_hdr mei_hdr; 503 struct hbm_notification_request req; 504 int ret; 505 506 mei_hbm_hdr(&mei_hdr, sizeof(req)); 507 mei_hbm_cl_hdr(cl, MEI_HBM_NOTIFY_REQ_CMD, &req, sizeof(req)); 508 509 req.start = start; 510 511 ret = mei_hbm_write_message(dev, &mei_hdr, &req); 512 if (ret) 513 dev_err(dev->dev, "notify request failed: ret = %d\n", ret); 514 515 return ret; 516 } 517 518 /** 519 * notify_res_to_fop - convert notification response to the proper 520 * notification FOP 521 * 522 * @cmd: client notification start response command 523 * 524 * Return: MEI_FOP_NOTIFY_START or MEI_FOP_NOTIFY_STOP; 525 */ 526 static inline enum mei_cb_file_ops notify_res_to_fop(struct mei_hbm_cl_cmd *cmd) 527 { 528 struct hbm_notification_response *rs = 529 (struct hbm_notification_response *)cmd; 530 531 return mei_cl_notify_req2fop(rs->start); 532 } 533 534 /** 535 * mei_hbm_cl_notify_start_res - update the client state according 536 * notify start response 537 * 538 * @dev: the device structure 539 * @cl: mei host client 540 * @cmd: client notification start response command 541 */ 542 static void mei_hbm_cl_notify_start_res(struct mei_device *dev, 543 struct mei_cl *cl, 544 struct mei_hbm_cl_cmd *cmd) 545 { 546 struct hbm_notification_response *rs = 547 (struct hbm_notification_response *)cmd; 548 549 cl_dbg(dev, cl, "hbm: notify start response status=%d\n", rs->status); 550 551 if (rs->status == MEI_HBMS_SUCCESS || 552 rs->status == MEI_HBMS_ALREADY_STARTED) { 553 cl->notify_en = true; 554 cl->status = 0; 555 } else { 556 cl->status = -EINVAL; 557 } 558 } 559 560 /** 561 * mei_hbm_cl_notify_stop_res - update the client state according 562 * notify stop response 563 * 564 * @dev: the device structure 565 * @cl: mei host client 566 * @cmd: client notification stop response command 567 */ 568 static void mei_hbm_cl_notify_stop_res(struct mei_device *dev, 569 struct mei_cl *cl, 570 struct mei_hbm_cl_cmd *cmd) 571 { 572 struct hbm_notification_response *rs = 573 (struct hbm_notification_response *)cmd; 574 575 cl_dbg(dev, cl, "hbm: notify stop response status=%d\n", rs->status); 576 577 if (rs->status == MEI_HBMS_SUCCESS || 578 rs->status == MEI_HBMS_NOT_STARTED) { 579 cl->notify_en = false; 580 cl->status = 0; 581 } else { 582 /* TODO: spec is not clear yet about other possible issues */ 583 cl->status = -EINVAL; 584 } 585 } 586 587 /** 588 * mei_hbm_cl_notify - signal notification event 589 * 590 * @dev: the device structure 591 * @cmd: notification client message 592 */ 593 static void mei_hbm_cl_notify(struct mei_device *dev, 594 struct mei_hbm_cl_cmd *cmd) 595 { 596 struct mei_cl *cl; 597 598 cl = mei_hbm_cl_find_by_cmd(dev, cmd); 599 if (cl) 600 mei_cl_notify(cl); 601 } 602 603 /** 604 * mei_hbm_cl_dma_map_req - send client dma map request 605 * 606 * @dev: the device structure 607 * @cl: mei host client 608 * 609 * Return: 0 on success and -EIO on write failure 610 */ 611 int mei_hbm_cl_dma_map_req(struct mei_device *dev, struct mei_cl *cl) 612 { 613 struct mei_msg_hdr mei_hdr; 614 struct hbm_client_dma_map_request req; 615 int ret; 616 617 mei_hbm_hdr(&mei_hdr, sizeof(req)); 618 619 memset(&req, 0, sizeof(req)); 620 621 req.hbm_cmd = MEI_HBM_CLIENT_DMA_MAP_REQ_CMD; 622 req.client_buffer_id = cl->dma.buffer_id; 623 req.address_lsb = lower_32_bits(cl->dma.daddr); 624 req.address_msb = upper_32_bits(cl->dma.daddr); 625 req.size = cl->dma.size; 626 627 ret = mei_hbm_write_message(dev, &mei_hdr, &req); 628 if (ret) 629 dev_err(dev->dev, "dma map request failed: ret = %d\n", ret); 630 631 return ret; 632 } 633 634 /** 635 * mei_hbm_cl_dma_unmap_req - send client dma unmap request 636 * 637 * @dev: the device structure 638 * @cl: mei host client 639 * 640 * Return: 0 on success and -EIO on write failure 641 */ 642 int mei_hbm_cl_dma_unmap_req(struct mei_device *dev, struct mei_cl *cl) 643 { 644 struct mei_msg_hdr mei_hdr; 645 struct hbm_client_dma_unmap_request req; 646 int ret; 647 648 mei_hbm_hdr(&mei_hdr, sizeof(req)); 649 650 memset(&req, 0, sizeof(req)); 651 652 req.hbm_cmd = MEI_HBM_CLIENT_DMA_UNMAP_REQ_CMD; 653 req.client_buffer_id = cl->dma.buffer_id; 654 655 ret = mei_hbm_write_message(dev, &mei_hdr, &req); 656 if (ret) 657 dev_err(dev->dev, "dma unmap request failed: ret = %d\n", ret); 658 659 return ret; 660 } 661 662 static void mei_hbm_cl_dma_map_res(struct mei_device *dev, 663 struct hbm_client_dma_response *res) 664 { 665 struct mei_cl *cl; 666 struct mei_cl_cb *cb, *next; 667 668 cl = NULL; 669 list_for_each_entry_safe(cb, next, &dev->ctrl_rd_list, list) { 670 if (cb->fop_type != MEI_FOP_DMA_MAP) 671 continue; 672 if (!cb->cl->dma.buffer_id || cb->cl->dma_mapped) 673 continue; 674 675 cl = cb->cl; 676 break; 677 } 678 if (!cl) 679 return; 680 681 if (res->status) { 682 dev_err(dev->dev, "cl dma map failed %d\n", res->status); 683 cl->status = -EFAULT; 684 } else { 685 dev_dbg(dev->dev, "cl dma map succeeded\n"); 686 cl->dma_mapped = 1; 687 cl->status = 0; 688 } 689 wake_up(&cl->wait); 690 } 691 692 static void mei_hbm_cl_dma_unmap_res(struct mei_device *dev, 693 struct hbm_client_dma_response *res) 694 { 695 struct mei_cl *cl; 696 struct mei_cl_cb *cb, *next; 697 698 cl = NULL; 699 list_for_each_entry_safe(cb, next, &dev->ctrl_rd_list, list) { 700 if (cb->fop_type != MEI_FOP_DMA_UNMAP) 701 continue; 702 if (!cb->cl->dma.buffer_id || !cb->cl->dma_mapped) 703 continue; 704 705 cl = cb->cl; 706 break; 707 } 708 if (!cl) 709 return; 710 711 if (res->status) { 712 dev_err(dev->dev, "cl dma unmap failed %d\n", res->status); 713 cl->status = -EFAULT; 714 } else { 715 dev_dbg(dev->dev, "cl dma unmap succeeded\n"); 716 cl->dma_mapped = 0; 717 cl->status = 0; 718 } 719 wake_up(&cl->wait); 720 } 721 722 /** 723 * mei_hbm_prop_req - request property for a single client 724 * 725 * @dev: the device structure 726 * @start_idx: client index to start search 727 * 728 * Return: 0 on success and < 0 on failure 729 */ 730 static int mei_hbm_prop_req(struct mei_device *dev, unsigned long start_idx) 731 { 732 struct mei_msg_hdr mei_hdr; 733 struct hbm_props_request req; 734 unsigned long addr; 735 int ret; 736 737 addr = find_next_bit(dev->me_clients_map, MEI_CLIENTS_MAX, start_idx); 738 739 /* We got all client properties */ 740 if (addr == MEI_CLIENTS_MAX) { 741 dev->hbm_state = MEI_HBM_STARTED; 742 mei_host_client_init(dev); 743 return 0; 744 } 745 746 mei_hbm_hdr(&mei_hdr, sizeof(req)); 747 748 memset(&req, 0, sizeof(req)); 749 750 req.hbm_cmd = HOST_CLIENT_PROPERTIES_REQ_CMD; 751 req.me_addr = addr; 752 753 ret = mei_hbm_write_message(dev, &mei_hdr, &req); 754 if (ret) { 755 dev_err(dev->dev, "properties request write failed: ret = %d\n", 756 ret); 757 return ret; 758 } 759 760 dev->init_clients_timer = dev->timeouts.client_init; 761 mei_schedule_stall_timer(dev); 762 763 return 0; 764 } 765 766 /** 767 * mei_hbm_pg - sends pg command 768 * 769 * @dev: the device structure 770 * @pg_cmd: the pg command code 771 * 772 * Return: -EIO on write failure 773 * -EOPNOTSUPP if the operation is not supported by the protocol 774 */ 775 int mei_hbm_pg(struct mei_device *dev, u8 pg_cmd) 776 { 777 struct mei_msg_hdr mei_hdr; 778 struct hbm_power_gate req; 779 int ret; 780 781 if (!dev->hbm_f_pg_supported) 782 return -EOPNOTSUPP; 783 784 mei_hbm_hdr(&mei_hdr, sizeof(req)); 785 786 memset(&req, 0, sizeof(req)); 787 req.hbm_cmd = pg_cmd; 788 789 ret = mei_hbm_write_message(dev, &mei_hdr, &req); 790 if (ret) 791 dev_err(dev->dev, "power gate command write failed.\n"); 792 return ret; 793 } 794 EXPORT_SYMBOL_GPL(mei_hbm_pg); 795 796 /** 797 * mei_hbm_stop_req - send stop request message 798 * 799 * @dev: mei device 800 * 801 * Return: -EIO on write failure 802 */ 803 static int mei_hbm_stop_req(struct mei_device *dev) 804 { 805 struct mei_msg_hdr mei_hdr; 806 struct hbm_host_stop_request req; 807 808 mei_hbm_hdr(&mei_hdr, sizeof(req)); 809 810 memset(&req, 0, sizeof(req)); 811 req.hbm_cmd = HOST_STOP_REQ_CMD; 812 req.reason = DRIVER_STOP_REQUEST; 813 814 return mei_hbm_write_message(dev, &mei_hdr, &req); 815 } 816 817 /** 818 * mei_hbm_cl_flow_control_req - sends flow control request. 819 * 820 * @dev: the device structure 821 * @cl: client info 822 * 823 * Return: -EIO on write failure 824 */ 825 int mei_hbm_cl_flow_control_req(struct mei_device *dev, struct mei_cl *cl) 826 { 827 struct hbm_flow_control req; 828 829 cl_dbg(dev, cl, "sending flow control\n"); 830 return mei_hbm_cl_write(dev, cl, MEI_FLOW_CONTROL_CMD, 831 &req, sizeof(req)); 832 } 833 834 /** 835 * mei_hbm_add_single_tx_flow_ctrl_creds - adds single buffer credentials. 836 * 837 * @dev: the device structure 838 * @fctrl: flow control response bus message 839 * 840 * Return: 0 on success, < 0 otherwise 841 */ 842 static int mei_hbm_add_single_tx_flow_ctrl_creds(struct mei_device *dev, 843 struct hbm_flow_control *fctrl) 844 { 845 struct mei_me_client *me_cl; 846 int rets; 847 848 me_cl = mei_me_cl_by_id(dev, fctrl->me_addr); 849 if (!me_cl) { 850 dev_err(dev->dev, "no such me client %d\n", fctrl->me_addr); 851 return -ENOENT; 852 } 853 854 if (WARN_ON(me_cl->props.single_recv_buf == 0)) { 855 rets = -EINVAL; 856 goto out; 857 } 858 859 me_cl->tx_flow_ctrl_creds++; 860 dev_dbg(dev->dev, "recv flow ctrl msg ME %d (single) creds = %d.\n", 861 fctrl->me_addr, me_cl->tx_flow_ctrl_creds); 862 863 rets = 0; 864 out: 865 mei_me_cl_put(me_cl); 866 return rets; 867 } 868 869 /** 870 * mei_hbm_cl_tx_flow_ctrl_creds_res - flow control response from me 871 * 872 * @dev: the device structure 873 * @fctrl: flow control response bus message 874 */ 875 static void mei_hbm_cl_tx_flow_ctrl_creds_res(struct mei_device *dev, 876 struct hbm_flow_control *fctrl) 877 { 878 struct mei_cl *cl; 879 880 if (!fctrl->host_addr) { 881 /* single receive buffer */ 882 mei_hbm_add_single_tx_flow_ctrl_creds(dev, fctrl); 883 return; 884 } 885 886 cl = mei_hbm_cl_find_by_cmd(dev, fctrl); 887 if (cl) { 888 cl->tx_flow_ctrl_creds++; 889 cl_dbg(dev, cl, "flow control creds = %d.\n", 890 cl->tx_flow_ctrl_creds); 891 } 892 } 893 894 895 /** 896 * mei_hbm_cl_disconnect_req - sends disconnect message to fw. 897 * 898 * @dev: the device structure 899 * @cl: a client to disconnect from 900 * 901 * Return: -EIO on write failure 902 */ 903 int mei_hbm_cl_disconnect_req(struct mei_device *dev, struct mei_cl *cl) 904 { 905 struct hbm_client_connect_request req; 906 907 return mei_hbm_cl_write(dev, cl, CLIENT_DISCONNECT_REQ_CMD, 908 &req, sizeof(req)); 909 } 910 911 /** 912 * mei_hbm_cl_disconnect_rsp - sends disconnect response to the FW 913 * 914 * @dev: the device structure 915 * @cl: a client to disconnect from 916 * 917 * Return: -EIO on write failure 918 */ 919 int mei_hbm_cl_disconnect_rsp(struct mei_device *dev, struct mei_cl *cl) 920 { 921 struct hbm_client_connect_response resp; 922 923 return mei_hbm_cl_write(dev, cl, CLIENT_DISCONNECT_RES_CMD, 924 &resp, sizeof(resp)); 925 } 926 927 /** 928 * mei_hbm_cl_disconnect_res - update the client state according 929 * disconnect response 930 * 931 * @dev: the device structure 932 * @cl: mei host client 933 * @cmd: disconnect client response host bus message 934 */ 935 static void mei_hbm_cl_disconnect_res(struct mei_device *dev, struct mei_cl *cl, 936 struct mei_hbm_cl_cmd *cmd) 937 { 938 struct hbm_client_connect_response *rs = 939 (struct hbm_client_connect_response *)cmd; 940 941 cl_dbg(dev, cl, "hbm: disconnect response status=%d\n", rs->status); 942 943 if (rs->status == MEI_CL_DISCONN_SUCCESS) 944 cl->state = MEI_FILE_DISCONNECT_REPLY; 945 cl->status = 0; 946 } 947 948 /** 949 * mei_hbm_cl_connect_req - send connection request to specific me client 950 * 951 * @dev: the device structure 952 * @cl: a client to connect to 953 * 954 * Return: -EIO on write failure 955 */ 956 int mei_hbm_cl_connect_req(struct mei_device *dev, struct mei_cl *cl) 957 { 958 struct hbm_client_connect_request req; 959 960 return mei_hbm_cl_write(dev, cl, CLIENT_CONNECT_REQ_CMD, 961 &req, sizeof(req)); 962 } 963 964 /** 965 * mei_hbm_cl_connect_res - update the client state according 966 * connection response 967 * 968 * @dev: the device structure 969 * @cl: mei host client 970 * @cmd: connect client response host bus message 971 */ 972 static void mei_hbm_cl_connect_res(struct mei_device *dev, struct mei_cl *cl, 973 struct mei_hbm_cl_cmd *cmd) 974 { 975 struct hbm_client_connect_response *rs = 976 (struct hbm_client_connect_response *)cmd; 977 978 cl_dbg(dev, cl, "hbm: connect response status=%s\n", 979 mei_cl_conn_status_str(rs->status)); 980 981 if (rs->status == MEI_CL_CONN_SUCCESS) 982 cl->state = MEI_FILE_CONNECTED; 983 else { 984 cl->state = MEI_FILE_DISCONNECT_REPLY; 985 if (rs->status == MEI_CL_CONN_NOT_FOUND) { 986 mei_me_cl_del(dev, cl->me_cl); 987 if (dev->dev_state == MEI_DEV_ENABLED) 988 schedule_work(&dev->bus_rescan_work); 989 } 990 } 991 cl->status = mei_cl_conn_status_to_errno(rs->status); 992 } 993 994 /** 995 * mei_hbm_cl_res - process hbm response received on behalf 996 * an client 997 * 998 * @dev: the device structure 999 * @rs: hbm client message 1000 * @fop_type: file operation type 1001 */ 1002 static void mei_hbm_cl_res(struct mei_device *dev, 1003 struct mei_hbm_cl_cmd *rs, 1004 enum mei_cb_file_ops fop_type) 1005 { 1006 struct mei_cl *cl; 1007 struct mei_cl_cb *cb, *next; 1008 1009 cl = NULL; 1010 list_for_each_entry_safe(cb, next, &dev->ctrl_rd_list, list) { 1011 1012 cl = cb->cl; 1013 1014 if (cb->fop_type != fop_type) 1015 continue; 1016 1017 if (mei_hbm_cl_addr_equal(cl, rs)) { 1018 list_del_init(&cb->list); 1019 break; 1020 } 1021 } 1022 1023 if (!cl) 1024 return; 1025 1026 switch (fop_type) { 1027 case MEI_FOP_CONNECT: 1028 mei_hbm_cl_connect_res(dev, cl, rs); 1029 break; 1030 case MEI_FOP_DISCONNECT: 1031 mei_hbm_cl_disconnect_res(dev, cl, rs); 1032 break; 1033 case MEI_FOP_NOTIFY_START: 1034 mei_hbm_cl_notify_start_res(dev, cl, rs); 1035 break; 1036 case MEI_FOP_NOTIFY_STOP: 1037 mei_hbm_cl_notify_stop_res(dev, cl, rs); 1038 break; 1039 default: 1040 return; 1041 } 1042 1043 cl->timer_count = 0; 1044 wake_up(&cl->wait); 1045 } 1046 1047 1048 /** 1049 * mei_hbm_fw_disconnect_req - disconnect request initiated by ME firmware 1050 * host sends disconnect response 1051 * 1052 * @dev: the device structure. 1053 * @disconnect_req: disconnect request bus message from the me 1054 * 1055 * Return: -ENOMEM on allocation failure 1056 */ 1057 static int mei_hbm_fw_disconnect_req(struct mei_device *dev, 1058 struct hbm_client_connect_request *disconnect_req) 1059 { 1060 struct mei_cl *cl; 1061 struct mei_cl_cb *cb; 1062 1063 cl = mei_hbm_cl_find_by_cmd(dev, disconnect_req); 1064 if (cl) { 1065 cl_warn(dev, cl, "fw disconnect request received\n"); 1066 cl->state = MEI_FILE_DISCONNECTING; 1067 cl->timer_count = 0; 1068 1069 cb = mei_cl_enqueue_ctrl_wr_cb(cl, 0, MEI_FOP_DISCONNECT_RSP, 1070 NULL); 1071 if (!cb) 1072 return -ENOMEM; 1073 } 1074 return 0; 1075 } 1076 1077 /** 1078 * mei_hbm_pg_enter_res - PG enter response received 1079 * 1080 * @dev: the device structure. 1081 * 1082 * Return: 0 on success, -EPROTO on state mismatch 1083 */ 1084 static int mei_hbm_pg_enter_res(struct mei_device *dev) 1085 { 1086 if (mei_pg_state(dev) != MEI_PG_OFF || 1087 dev->pg_event != MEI_PG_EVENT_WAIT) { 1088 dev_err(dev->dev, "hbm: pg entry response: state mismatch [%s, %d]\n", 1089 mei_pg_state_str(mei_pg_state(dev)), dev->pg_event); 1090 return -EPROTO; 1091 } 1092 1093 dev->pg_event = MEI_PG_EVENT_RECEIVED; 1094 wake_up(&dev->wait_pg); 1095 1096 return 0; 1097 } 1098 1099 /** 1100 * mei_hbm_pg_resume - process with PG resume 1101 * 1102 * @dev: the device structure. 1103 */ 1104 void mei_hbm_pg_resume(struct mei_device *dev) 1105 { 1106 pm_request_resume(dev->dev); 1107 } 1108 EXPORT_SYMBOL_GPL(mei_hbm_pg_resume); 1109 1110 /** 1111 * mei_hbm_pg_exit_res - PG exit response received 1112 * 1113 * @dev: the device structure. 1114 * 1115 * Return: 0 on success, -EPROTO on state mismatch 1116 */ 1117 static int mei_hbm_pg_exit_res(struct mei_device *dev) 1118 { 1119 if (mei_pg_state(dev) != MEI_PG_ON || 1120 (dev->pg_event != MEI_PG_EVENT_WAIT && 1121 dev->pg_event != MEI_PG_EVENT_IDLE)) { 1122 dev_err(dev->dev, "hbm: pg exit response: state mismatch [%s, %d]\n", 1123 mei_pg_state_str(mei_pg_state(dev)), dev->pg_event); 1124 return -EPROTO; 1125 } 1126 1127 switch (dev->pg_event) { 1128 case MEI_PG_EVENT_WAIT: 1129 dev->pg_event = MEI_PG_EVENT_RECEIVED; 1130 wake_up(&dev->wait_pg); 1131 break; 1132 case MEI_PG_EVENT_IDLE: 1133 /* 1134 * If the driver is not waiting on this then 1135 * this is HW initiated exit from PG. 1136 * Start runtime pm resume sequence to exit from PG. 1137 */ 1138 dev->pg_event = MEI_PG_EVENT_RECEIVED; 1139 mei_hbm_pg_resume(dev); 1140 break; 1141 default: 1142 WARN(1, "hbm: pg exit response: unexpected pg event = %d\n", 1143 dev->pg_event); 1144 return -EPROTO; 1145 } 1146 1147 return 0; 1148 } 1149 1150 /** 1151 * mei_hbm_config_features - check what hbm features and commands 1152 * are supported by the fw 1153 * 1154 * @dev: the device structure 1155 */ 1156 static void mei_hbm_config_features(struct mei_device *dev) 1157 { 1158 /* Power Gating Isolation Support */ 1159 dev->hbm_f_pg_supported = 0; 1160 if (dev->version.major_version > HBM_MAJOR_VERSION_PGI) 1161 dev->hbm_f_pg_supported = 1; 1162 1163 if (dev->version.major_version == HBM_MAJOR_VERSION_PGI && 1164 dev->version.minor_version >= HBM_MINOR_VERSION_PGI) 1165 dev->hbm_f_pg_supported = 1; 1166 1167 dev->hbm_f_dc_supported = 0; 1168 if (dev->version.major_version >= HBM_MAJOR_VERSION_DC) 1169 dev->hbm_f_dc_supported = 1; 1170 1171 dev->hbm_f_ie_supported = 0; 1172 if (dev->version.major_version >= HBM_MAJOR_VERSION_IE) 1173 dev->hbm_f_ie_supported = 1; 1174 1175 /* disconnect on connect timeout instead of link reset */ 1176 dev->hbm_f_dot_supported = 0; 1177 if (dev->version.major_version >= HBM_MAJOR_VERSION_DOT) 1178 dev->hbm_f_dot_supported = 1; 1179 1180 /* Notification Event Support */ 1181 dev->hbm_f_ev_supported = 0; 1182 if (dev->version.major_version >= HBM_MAJOR_VERSION_EV) 1183 dev->hbm_f_ev_supported = 1; 1184 1185 /* Fixed Address Client Support */ 1186 dev->hbm_f_fa_supported = 0; 1187 if (dev->version.major_version >= HBM_MAJOR_VERSION_FA) 1188 dev->hbm_f_fa_supported = 1; 1189 1190 /* OS ver message Support */ 1191 dev->hbm_f_os_supported = 0; 1192 if (dev->version.major_version >= HBM_MAJOR_VERSION_OS) 1193 dev->hbm_f_os_supported = 1; 1194 1195 /* DMA Ring Support */ 1196 dev->hbm_f_dr_supported = 0; 1197 if (dev->version.major_version > HBM_MAJOR_VERSION_DR || 1198 (dev->version.major_version == HBM_MAJOR_VERSION_DR && 1199 dev->version.minor_version >= HBM_MINOR_VERSION_DR)) 1200 dev->hbm_f_dr_supported = 1; 1201 1202 /* VTag Support */ 1203 dev->hbm_f_vt_supported = 0; 1204 if (dev->version.major_version > HBM_MAJOR_VERSION_VT || 1205 (dev->version.major_version == HBM_MAJOR_VERSION_VT && 1206 dev->version.minor_version >= HBM_MINOR_VERSION_VT)) 1207 dev->hbm_f_vt_supported = 1; 1208 1209 /* GSC support */ 1210 if (dev->version.major_version > HBM_MAJOR_VERSION_GSC || 1211 (dev->version.major_version == HBM_MAJOR_VERSION_GSC && 1212 dev->version.minor_version >= HBM_MINOR_VERSION_GSC)) 1213 dev->hbm_f_gsc_supported = 1; 1214 1215 /* Capability message Support */ 1216 dev->hbm_f_cap_supported = 0; 1217 if (dev->version.major_version > HBM_MAJOR_VERSION_CAP || 1218 (dev->version.major_version == HBM_MAJOR_VERSION_CAP && 1219 dev->version.minor_version >= HBM_MINOR_VERSION_CAP)) 1220 dev->hbm_f_cap_supported = 1; 1221 1222 /* Client DMA Support */ 1223 dev->hbm_f_cd_supported = 0; 1224 if (dev->version.major_version > HBM_MAJOR_VERSION_CD || 1225 (dev->version.major_version == HBM_MAJOR_VERSION_CD && 1226 dev->version.minor_version >= HBM_MINOR_VERSION_CD)) 1227 dev->hbm_f_cd_supported = 1; 1228 } 1229 1230 /** 1231 * mei_hbm_version_is_supported - checks whether the driver can 1232 * support the hbm version of the device 1233 * 1234 * @dev: the device structure 1235 * Return: true if driver can support hbm version of the device 1236 */ 1237 bool mei_hbm_version_is_supported(struct mei_device *dev) 1238 { 1239 return (dev->version.major_version < HBM_MAJOR_VERSION) || 1240 (dev->version.major_version == HBM_MAJOR_VERSION && 1241 dev->version.minor_version <= HBM_MINOR_VERSION); 1242 } 1243 1244 /** 1245 * mei_hbm_dispatch - bottom half read routine after ISR to 1246 * handle the read bus message cmd processing. 1247 * 1248 * @dev: the device structure 1249 * @hdr: header of bus message 1250 * 1251 * Return: 0 on success and < 0 on failure 1252 */ 1253 int mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr) 1254 { 1255 struct mei_bus_message *mei_msg; 1256 struct hbm_host_version_response *version_res; 1257 struct hbm_props_response *props_res; 1258 struct hbm_host_enum_response *enum_res; 1259 struct hbm_dma_setup_response *dma_setup_res; 1260 struct hbm_add_client_request *add_cl_req; 1261 struct hbm_capability_response *capability_res; 1262 int ret; 1263 1264 struct mei_hbm_cl_cmd *cl_cmd; 1265 struct hbm_client_connect_request *disconnect_req; 1266 struct hbm_flow_control *fctrl; 1267 struct hbm_client_dma_response *client_dma_res; 1268 1269 /* read the message to our buffer */ 1270 BUG_ON(hdr->length >= sizeof(dev->rd_msg_buf)); 1271 mei_read_slots(dev, dev->rd_msg_buf, hdr->length); 1272 mei_msg = (struct mei_bus_message *)dev->rd_msg_buf; 1273 cl_cmd = (struct mei_hbm_cl_cmd *)mei_msg; 1274 1275 /* ignore spurious message and prevent reset nesting 1276 * hbm is put to idle during system reset 1277 */ 1278 if (dev->hbm_state == MEI_HBM_IDLE) { 1279 dev_dbg(dev->dev, "hbm: state is idle ignore spurious messages\n"); 1280 return 0; 1281 } 1282 1283 switch (mei_msg->hbm_cmd) { 1284 case HOST_START_RES_CMD: 1285 dev_dbg(dev->dev, "hbm: start: response message received.\n"); 1286 1287 dev->init_clients_timer = 0; 1288 1289 version_res = (struct hbm_host_version_response *)mei_msg; 1290 1291 dev_dbg(dev->dev, "HBM VERSION: DRIVER=%02d:%02d DEVICE=%02d:%02d\n", 1292 HBM_MAJOR_VERSION, HBM_MINOR_VERSION, 1293 version_res->me_max_version.major_version, 1294 version_res->me_max_version.minor_version); 1295 1296 if (version_res->host_version_supported) { 1297 dev->version.major_version = HBM_MAJOR_VERSION; 1298 dev->version.minor_version = HBM_MINOR_VERSION; 1299 } else { 1300 dev->version.major_version = 1301 version_res->me_max_version.major_version; 1302 dev->version.minor_version = 1303 version_res->me_max_version.minor_version; 1304 } 1305 1306 if (!mei_hbm_version_is_supported(dev)) { 1307 dev_warn(dev->dev, "hbm: start: version mismatch - stopping the driver.\n"); 1308 1309 dev->hbm_state = MEI_HBM_STOPPED; 1310 if (mei_hbm_stop_req(dev)) { 1311 dev_err(dev->dev, "hbm: start: failed to send stop request\n"); 1312 return -EIO; 1313 } 1314 break; 1315 } 1316 1317 mei_hbm_config_features(dev); 1318 1319 if (dev->dev_state != MEI_DEV_INIT_CLIENTS || 1320 dev->hbm_state != MEI_HBM_STARTING) { 1321 if (dev->dev_state == MEI_DEV_POWER_DOWN || 1322 dev->dev_state == MEI_DEV_POWERING_DOWN) { 1323 dev_dbg(dev->dev, "hbm: start: on shutdown, ignoring\n"); 1324 return 0; 1325 } 1326 dev_err(dev->dev, "hbm: start: state mismatch, [%d, %d]\n", 1327 dev->dev_state, dev->hbm_state); 1328 return -EPROTO; 1329 } 1330 1331 if (dev->hbm_f_cap_supported) { 1332 if (mei_hbm_capabilities_req(dev)) 1333 return -EIO; 1334 wake_up(&dev->wait_hbm_start); 1335 break; 1336 } 1337 1338 if (dev->hbm_f_dr_supported) { 1339 if (mei_dmam_ring_alloc(dev)) 1340 dev_info(dev->dev, "running w/o dma ring\n"); 1341 if (mei_dma_ring_is_allocated(dev)) { 1342 if (mei_hbm_dma_setup_req(dev)) 1343 return -EIO; 1344 1345 wake_up(&dev->wait_hbm_start); 1346 break; 1347 } 1348 } 1349 1350 dev->hbm_f_dr_supported = 0; 1351 mei_dmam_ring_free(dev); 1352 1353 if (mei_hbm_enum_clients_req(dev)) 1354 return -EIO; 1355 1356 wake_up(&dev->wait_hbm_start); 1357 break; 1358 1359 case MEI_HBM_CAPABILITIES_RES_CMD: 1360 dev_dbg(dev->dev, "hbm: capabilities response: message received.\n"); 1361 1362 dev->init_clients_timer = 0; 1363 1364 if (dev->dev_state != MEI_DEV_INIT_CLIENTS || 1365 dev->hbm_state != MEI_HBM_CAP_SETUP) { 1366 if (dev->dev_state == MEI_DEV_POWER_DOWN || 1367 dev->dev_state == MEI_DEV_POWERING_DOWN) { 1368 dev_dbg(dev->dev, "hbm: capabilities response: on shutdown, ignoring\n"); 1369 return 0; 1370 } 1371 dev_err(dev->dev, "hbm: capabilities response: state mismatch, [%d, %d]\n", 1372 dev->dev_state, dev->hbm_state); 1373 return -EPROTO; 1374 } 1375 1376 capability_res = (struct hbm_capability_response *)mei_msg; 1377 if (!(capability_res->capability_granted[0] & HBM_CAP_VT)) 1378 dev->hbm_f_vt_supported = 0; 1379 if (!(capability_res->capability_granted[0] & HBM_CAP_CD)) 1380 dev->hbm_f_cd_supported = 0; 1381 1382 if (!(capability_res->capability_granted[0] & HBM_CAP_GSC)) 1383 dev->hbm_f_gsc_supported = 0; 1384 1385 if (dev->hbm_f_dr_supported) { 1386 if (mei_dmam_ring_alloc(dev)) 1387 dev_info(dev->dev, "running w/o dma ring\n"); 1388 if (mei_dma_ring_is_allocated(dev)) { 1389 if (mei_hbm_dma_setup_req(dev)) 1390 return -EIO; 1391 break; 1392 } 1393 } 1394 1395 dev->hbm_f_dr_supported = 0; 1396 mei_dmam_ring_free(dev); 1397 1398 if (mei_hbm_enum_clients_req(dev)) 1399 return -EIO; 1400 break; 1401 1402 case MEI_HBM_DMA_SETUP_RES_CMD: 1403 dev_dbg(dev->dev, "hbm: dma setup response: message received.\n"); 1404 1405 dev->init_clients_timer = 0; 1406 1407 if (dev->dev_state != MEI_DEV_INIT_CLIENTS || 1408 dev->hbm_state != MEI_HBM_DR_SETUP) { 1409 if (dev->dev_state == MEI_DEV_POWER_DOWN || 1410 dev->dev_state == MEI_DEV_POWERING_DOWN) { 1411 dev_dbg(dev->dev, "hbm: dma setup response: on shutdown, ignoring\n"); 1412 return 0; 1413 } 1414 dev_err(dev->dev, "hbm: dma setup response: state mismatch, [%d, %d]\n", 1415 dev->dev_state, dev->hbm_state); 1416 return -EPROTO; 1417 } 1418 1419 dma_setup_res = (struct hbm_dma_setup_response *)mei_msg; 1420 1421 if (dma_setup_res->status) { 1422 u8 status = dma_setup_res->status; 1423 1424 if (status == MEI_HBMS_NOT_ALLOWED) { 1425 dev_dbg(dev->dev, "hbm: dma setup not allowed\n"); 1426 } else { 1427 dev_info(dev->dev, "hbm: dma setup response: failure = %d %s\n", 1428 status, 1429 mei_hbm_status_str(status)); 1430 } 1431 dev->hbm_f_dr_supported = 0; 1432 mei_dmam_ring_free(dev); 1433 } 1434 1435 if (mei_hbm_enum_clients_req(dev)) 1436 return -EIO; 1437 break; 1438 1439 case CLIENT_CONNECT_RES_CMD: 1440 dev_dbg(dev->dev, "hbm: client connect response: message received.\n"); 1441 mei_hbm_cl_res(dev, cl_cmd, MEI_FOP_CONNECT); 1442 break; 1443 1444 case CLIENT_DISCONNECT_RES_CMD: 1445 dev_dbg(dev->dev, "hbm: client disconnect response: message received.\n"); 1446 mei_hbm_cl_res(dev, cl_cmd, MEI_FOP_DISCONNECT); 1447 break; 1448 1449 case MEI_FLOW_CONTROL_CMD: 1450 dev_dbg(dev->dev, "hbm: client flow control response: message received.\n"); 1451 1452 fctrl = (struct hbm_flow_control *)mei_msg; 1453 mei_hbm_cl_tx_flow_ctrl_creds_res(dev, fctrl); 1454 break; 1455 1456 case MEI_PG_ISOLATION_ENTRY_RES_CMD: 1457 dev_dbg(dev->dev, "hbm: power gate isolation entry response received\n"); 1458 ret = mei_hbm_pg_enter_res(dev); 1459 if (ret) 1460 return ret; 1461 break; 1462 1463 case MEI_PG_ISOLATION_EXIT_REQ_CMD: 1464 dev_dbg(dev->dev, "hbm: power gate isolation exit request received\n"); 1465 ret = mei_hbm_pg_exit_res(dev); 1466 if (ret) 1467 return ret; 1468 break; 1469 1470 case HOST_CLIENT_PROPERTIES_RES_CMD: 1471 dev_dbg(dev->dev, "hbm: properties response: message received.\n"); 1472 1473 dev->init_clients_timer = 0; 1474 1475 if (dev->dev_state != MEI_DEV_INIT_CLIENTS || 1476 dev->hbm_state != MEI_HBM_CLIENT_PROPERTIES) { 1477 if (dev->dev_state == MEI_DEV_POWER_DOWN || 1478 dev->dev_state == MEI_DEV_POWERING_DOWN) { 1479 dev_dbg(dev->dev, "hbm: properties response: on shutdown, ignoring\n"); 1480 return 0; 1481 } 1482 dev_err(dev->dev, "hbm: properties response: state mismatch, [%d, %d]\n", 1483 dev->dev_state, dev->hbm_state); 1484 return -EPROTO; 1485 } 1486 1487 props_res = (struct hbm_props_response *)mei_msg; 1488 1489 if (props_res->status == MEI_HBMS_CLIENT_NOT_FOUND) { 1490 dev_dbg(dev->dev, "hbm: properties response: %d CLIENT_NOT_FOUND\n", 1491 props_res->me_addr); 1492 } else if (props_res->status) { 1493 dev_err(dev->dev, "hbm: properties response: wrong status = %d %s\n", 1494 props_res->status, 1495 mei_hbm_status_str(props_res->status)); 1496 return -EPROTO; 1497 } else { 1498 mei_hbm_me_cl_add(dev, props_res); 1499 } 1500 1501 /* request property for the next client */ 1502 if (mei_hbm_prop_req(dev, props_res->me_addr + 1)) 1503 return -EIO; 1504 1505 break; 1506 1507 case HOST_ENUM_RES_CMD: 1508 dev_dbg(dev->dev, "hbm: enumeration response: message received\n"); 1509 1510 dev->init_clients_timer = 0; 1511 1512 enum_res = (struct hbm_host_enum_response *) mei_msg; 1513 BUILD_BUG_ON(sizeof(dev->me_clients_map) 1514 < sizeof(enum_res->valid_addresses)); 1515 memcpy(dev->me_clients_map, enum_res->valid_addresses, 1516 sizeof(enum_res->valid_addresses)); 1517 1518 if (dev->dev_state != MEI_DEV_INIT_CLIENTS || 1519 dev->hbm_state != MEI_HBM_ENUM_CLIENTS) { 1520 if (dev->dev_state == MEI_DEV_POWER_DOWN || 1521 dev->dev_state == MEI_DEV_POWERING_DOWN) { 1522 dev_dbg(dev->dev, "hbm: enumeration response: on shutdown, ignoring\n"); 1523 return 0; 1524 } 1525 dev_err(dev->dev, "hbm: enumeration response: state mismatch, [%d, %d]\n", 1526 dev->dev_state, dev->hbm_state); 1527 return -EPROTO; 1528 } 1529 1530 dev->hbm_state = MEI_HBM_CLIENT_PROPERTIES; 1531 1532 /* first property request */ 1533 if (mei_hbm_prop_req(dev, 0)) 1534 return -EIO; 1535 1536 break; 1537 1538 case HOST_STOP_RES_CMD: 1539 dev_dbg(dev->dev, "hbm: stop response: message received\n"); 1540 1541 dev->init_clients_timer = 0; 1542 1543 if (dev->hbm_state != MEI_HBM_STOPPED) { 1544 dev_err(dev->dev, "hbm: stop response: state mismatch, [%d, %d]\n", 1545 dev->dev_state, dev->hbm_state); 1546 return -EPROTO; 1547 } 1548 1549 mei_set_devstate(dev, MEI_DEV_POWER_DOWN); 1550 dev_info(dev->dev, "hbm: stop response: resetting.\n"); 1551 /* force the reset */ 1552 return -EPROTO; 1553 1554 case CLIENT_DISCONNECT_REQ_CMD: 1555 dev_dbg(dev->dev, "hbm: disconnect request: message received\n"); 1556 1557 disconnect_req = (struct hbm_client_connect_request *)mei_msg; 1558 mei_hbm_fw_disconnect_req(dev, disconnect_req); 1559 break; 1560 1561 case ME_STOP_REQ_CMD: 1562 dev_dbg(dev->dev, "hbm: stop request: message received\n"); 1563 dev->hbm_state = MEI_HBM_STOPPED; 1564 if (mei_hbm_stop_req(dev)) { 1565 dev_err(dev->dev, "hbm: stop request: failed to send stop request\n"); 1566 return -EIO; 1567 } 1568 break; 1569 1570 case MEI_HBM_ADD_CLIENT_REQ_CMD: 1571 dev_dbg(dev->dev, "hbm: add client request received\n"); 1572 /* 1573 * after the host receives the enum_resp 1574 * message clients may be added or removed 1575 */ 1576 if (dev->hbm_state <= MEI_HBM_ENUM_CLIENTS || 1577 dev->hbm_state >= MEI_HBM_STOPPED) { 1578 dev_err(dev->dev, "hbm: add client: state mismatch, [%d, %d]\n", 1579 dev->dev_state, dev->hbm_state); 1580 return -EPROTO; 1581 } 1582 add_cl_req = (struct hbm_add_client_request *)mei_msg; 1583 ret = mei_hbm_fw_add_cl_req(dev, add_cl_req); 1584 if (ret) { 1585 dev_err(dev->dev, "hbm: add client: failed to send response %d\n", 1586 ret); 1587 return -EIO; 1588 } 1589 dev_dbg(dev->dev, "hbm: add client request processed\n"); 1590 break; 1591 1592 case MEI_HBM_NOTIFY_RES_CMD: 1593 dev_dbg(dev->dev, "hbm: notify response received\n"); 1594 mei_hbm_cl_res(dev, cl_cmd, notify_res_to_fop(cl_cmd)); 1595 break; 1596 1597 case MEI_HBM_NOTIFICATION_CMD: 1598 dev_dbg(dev->dev, "hbm: notification\n"); 1599 mei_hbm_cl_notify(dev, cl_cmd); 1600 break; 1601 1602 case MEI_HBM_CLIENT_DMA_MAP_RES_CMD: 1603 dev_dbg(dev->dev, "hbm: client dma map response: message received.\n"); 1604 client_dma_res = (struct hbm_client_dma_response *)mei_msg; 1605 mei_hbm_cl_dma_map_res(dev, client_dma_res); 1606 break; 1607 1608 case MEI_HBM_CLIENT_DMA_UNMAP_RES_CMD: 1609 dev_dbg(dev->dev, "hbm: client dma unmap response: message received.\n"); 1610 client_dma_res = (struct hbm_client_dma_response *)mei_msg; 1611 mei_hbm_cl_dma_unmap_res(dev, client_dma_res); 1612 break; 1613 1614 default: 1615 WARN(1, "hbm: wrong command %d\n", mei_msg->hbm_cmd); 1616 return -EPROTO; 1617 1618 } 1619 return 0; 1620 } 1621 1622