Lines Matching refs:req

92 static MemTxResult ufs_dma_read_utrd(UfsRequest *req)  in ufs_dma_read_utrd()  argument
94 UfsHc *u = req->hc; in ufs_dma_read_utrd()
95 hwaddr utrd_addr = ufs_get_utrd_addr(u, req->slot); in ufs_dma_read_utrd()
98 ret = ufs_addr_read(u, utrd_addr, &req->utrd, sizeof(req->utrd)); in ufs_dma_read_utrd()
100 trace_ufs_err_dma_read_utrd(req->slot, utrd_addr); in ufs_dma_read_utrd()
105 static MemTxResult ufs_dma_read_req_upiu(UfsRequest *req) in ufs_dma_read_req_upiu() argument
107 UfsHc *u = req->hc; in ufs_dma_read_req_upiu()
108 hwaddr req_upiu_base_addr = ufs_get_req_upiu_base_addr(&req->utrd); in ufs_dma_read_req_upiu()
109 UtpUpiuReq *req_upiu = &req->req_upiu; in ufs_dma_read_req_upiu()
121 trace_ufs_err_dma_read_req_upiu(req->slot, req_upiu_base_addr); in ufs_dma_read_req_upiu()
129 if (copy_size > sizeof(req->req_upiu)) { in ufs_dma_read_req_upiu()
130 copy_size = sizeof(req->req_upiu); in ufs_dma_read_req_upiu()
133 ret = ufs_addr_read(u, req_upiu_base_addr, &req->req_upiu, copy_size); in ufs_dma_read_req_upiu()
135 trace_ufs_err_dma_read_req_upiu(req->slot, req_upiu_base_addr); in ufs_dma_read_req_upiu()
140 static MemTxResult ufs_dma_read_prdt(UfsRequest *req) in ufs_dma_read_prdt() argument
142 UfsHc *u = req->hc; in ufs_dma_read_prdt()
143 uint16_t prdt_len = le16_to_cpu(req->utrd.prd_table_length); in ufs_dma_read_prdt()
145 le16_to_cpu(req->utrd.prd_table_offset) * sizeof(uint32_t); in ufs_dma_read_prdt()
151 assert(!req->sg); in ufs_dma_read_prdt()
158 req_upiu_base_addr = ufs_get_req_upiu_base_addr(&req->utrd); in ufs_dma_read_prdt()
163 trace_ufs_err_dma_read_prdt(req->slot, prdt_base_addr); in ufs_dma_read_prdt()
167 req->sg = g_malloc0(sizeof(QEMUSGList)); in ufs_dma_read_prdt()
168 pci_dma_sglist_init(req->sg, PCI_DEVICE(u), prdt_len); in ufs_dma_read_prdt()
169 req->data_len = 0; in ufs_dma_read_prdt()
174 qemu_sglist_add(req->sg, data_dma_addr, data_byte_count); in ufs_dma_read_prdt()
175 req->data_len += data_byte_count; in ufs_dma_read_prdt()
180 static MemTxResult ufs_dma_read_upiu(UfsRequest *req) in ufs_dma_read_upiu() argument
184 ret = ufs_dma_read_utrd(req); in ufs_dma_read_upiu()
189 ret = ufs_dma_read_req_upiu(req); in ufs_dma_read_upiu()
194 ret = ufs_dma_read_prdt(req); in ufs_dma_read_upiu()
202 static MemTxResult ufs_dma_write_utrd(UfsRequest *req) in ufs_dma_write_utrd() argument
204 UfsHc *u = req->hc; in ufs_dma_write_utrd()
205 hwaddr utrd_addr = ufs_get_utrd_addr(u, req->slot); in ufs_dma_write_utrd()
208 ret = ufs_addr_write(u, utrd_addr, &req->utrd, sizeof(req->utrd)); in ufs_dma_write_utrd()
210 trace_ufs_err_dma_write_utrd(req->slot, utrd_addr); in ufs_dma_write_utrd()
215 static MemTxResult ufs_dma_write_rsp_upiu(UfsRequest *req) in ufs_dma_write_rsp_upiu() argument
217 UfsHc *u = req->hc; in ufs_dma_write_rsp_upiu()
218 hwaddr rsp_upiu_base_addr = ufs_get_rsp_upiu_base_addr(&req->utrd); in ufs_dma_write_rsp_upiu()
220 le16_to_cpu(req->utrd.response_upiu_length) * sizeof(uint32_t); in ufs_dma_write_rsp_upiu()
222 be16_to_cpu(req->rsp_upiu.header.data_segment_length); in ufs_dma_write_rsp_upiu()
232 if (copy_size > sizeof(req->rsp_upiu)) { in ufs_dma_write_rsp_upiu()
233 copy_size = sizeof(req->rsp_upiu); in ufs_dma_write_rsp_upiu()
236 ret = ufs_addr_write(u, rsp_upiu_base_addr, &req->rsp_upiu, copy_size); in ufs_dma_write_rsp_upiu()
238 trace_ufs_err_dma_write_rsp_upiu(req->slot, rsp_upiu_base_addr); in ufs_dma_write_rsp_upiu()
243 static MemTxResult ufs_dma_write_upiu(UfsRequest *req) in ufs_dma_write_upiu() argument
247 ret = ufs_dma_write_rsp_upiu(req); in ufs_dma_write_upiu()
252 return ufs_dma_write_utrd(req); in ufs_dma_write_upiu()
273 UfsRequest *req; in ufs_process_db() local
284 req = &u->req_list[slot]; in ufs_process_db()
285 if (req->state == UFS_REQUEST_ERROR) { in ufs_process_db()
286 trace_ufs_err_utrl_slot_error(req->slot); in ufs_process_db()
290 if (req->state != UFS_REQUEST_IDLE) { in ufs_process_db()
291 trace_ufs_err_utrl_slot_busy(req->slot); in ufs_process_db()
296 req->state = UFS_REQUEST_READY; in ufs_process_db()
446 void ufs_build_upiu_header(UfsRequest *req, uint8_t trans_type, uint8_t flags, in ufs_build_upiu_header() argument
450 memcpy(&req->rsp_upiu.header, &req->req_upiu.header, sizeof(UtpUpiuHeader)); in ufs_build_upiu_header()
451 req->rsp_upiu.header.trans_type = trans_type; in ufs_build_upiu_header()
452 req->rsp_upiu.header.flags = flags; in ufs_build_upiu_header()
453 req->rsp_upiu.header.response = response; in ufs_build_upiu_header()
454 req->rsp_upiu.header.scsi_status = scsi_status; in ufs_build_upiu_header()
455 req->rsp_upiu.header.data_segment_length = cpu_to_be16(data_segment_length); in ufs_build_upiu_header()
458 static UfsReqResult ufs_exec_scsi_cmd(UfsRequest *req) in ufs_exec_scsi_cmd() argument
460 UfsHc *u = req->hc; in ufs_exec_scsi_cmd()
461 uint8_t lun = req->req_upiu.header.lun; in ufs_exec_scsi_cmd()
465 trace_ufs_exec_scsi_cmd(req->slot, lun, req->req_upiu.sc.cdb[0]); in ufs_exec_scsi_cmd()
489 return lu->scsi_op(lu, req); in ufs_exec_scsi_cmd()
492 static UfsReqResult ufs_exec_nop_cmd(UfsRequest *req) in ufs_exec_nop_cmd() argument
494 trace_ufs_exec_nop_cmd(req->slot); in ufs_exec_nop_cmd()
495 ufs_build_upiu_header(req, UFS_UPIU_TRANSACTION_NOP_IN, 0, 0, 0, 0); in ufs_exec_nop_cmd()
608 static QueryRespCode ufs_exec_query_flag(UfsRequest *req, int op) in ufs_exec_query_flag() argument
610 UfsHc *u = req->hc; in ufs_exec_query_flag()
611 uint8_t idn = req->req_upiu.qr.idn; in ufs_exec_query_flag()
637 req->rsp_upiu.qr.value = cpu_to_be32(value); in ufs_exec_query_flag()
743 static QueryRespCode ufs_exec_query_attr(UfsRequest *req, int op) in ufs_exec_query_attr() argument
745 UfsHc *u = req->hc; in ufs_exec_query_attr()
746 uint8_t idn = req->req_upiu.qr.idn; in ufs_exec_query_attr()
758 value = be32_to_cpu(req->req_upiu.qr.value); in ufs_exec_query_attr()
762 req->rsp_upiu.qr.value = cpu_to_be32(value); in ufs_exec_query_attr()
773 static QueryRespCode ufs_read_unit_desc(UfsRequest *req) in ufs_read_unit_desc() argument
775 UfsHc *u = req->hc; in ufs_read_unit_desc()
776 uint8_t lun = req->req_upiu.qr.index; in ufs_read_unit_desc()
780 trace_ufs_err_query_invalid_index(req->req_upiu.qr.opcode, lun); in ufs_read_unit_desc()
785 memcpy(&req->rsp_upiu.qr.data, &rpmb_unit_desc, rpmb_unit_desc.length); in ufs_read_unit_desc()
787 memcpy(&req->rsp_upiu.qr.data, &u->lus[lun]->unit_desc, in ufs_read_unit_desc()
844 static QueryRespCode ufs_read_string_desc(UfsRequest *req) in ufs_read_string_desc() argument
846 UfsHc *u = req->hc; in ufs_read_string_desc()
847 uint8_t index = req->req_upiu.qr.index; in ufs_read_string_desc()
852 memcpy(&req->rsp_upiu.qr.data, &desc, desc.length); in ufs_read_string_desc()
855 memcpy(&req->rsp_upiu.qr.data, &desc, desc.length); in ufs_read_string_desc()
857 memcpy(&req->rsp_upiu.qr.data, &null_str_desc, null_str_desc.length); in ufs_read_string_desc()
859 memcpy(&req->rsp_upiu.qr.data, &null_str_desc, null_str_desc.length); in ufs_read_string_desc()
862 memcpy(&req->rsp_upiu.qr.data, &desc, desc.length); in ufs_read_string_desc()
864 trace_ufs_err_query_invalid_index(req->req_upiu.qr.opcode, index); in ufs_read_string_desc()
881 static QueryRespCode ufs_read_desc(UfsRequest *req) in ufs_read_desc() argument
883 UfsHc *u = req->hc; in ufs_read_desc()
885 uint8_t idn = req->req_upiu.qr.idn; in ufs_read_desc()
886 uint16_t length = be16_to_cpu(req->req_upiu.qr.length); in ufs_read_desc()
891 memcpy(&req->rsp_upiu.qr.data, &u->device_desc, sizeof(u->device_desc)); in ufs_read_desc()
895 status = ufs_read_unit_desc(req); in ufs_read_desc()
898 memcpy(&req->rsp_upiu.qr.data, &u->geometry_desc, in ufs_read_desc()
904 memcpy(&req->rsp_upiu.qr.data, &desc, sizeof(InterconnectDescriptor)); in ufs_read_desc()
909 status = ufs_read_string_desc(req); in ufs_read_desc()
913 memset(&req->rsp_upiu.qr.data, 0, sizeof(PowerParametersDescriptor)); in ufs_read_desc()
914 req->rsp_upiu.qr.data[0] = sizeof(PowerParametersDescriptor); in ufs_read_desc()
915 req->rsp_upiu.qr.data[1] = UFS_QUERY_DESC_IDN_POWER; in ufs_read_desc()
920 memset(&req->rsp_upiu.qr.data, 0, sizeof(DeviceHealthDescriptor)); in ufs_read_desc()
921 req->rsp_upiu.qr.data[0] = sizeof(DeviceHealthDescriptor); in ufs_read_desc()
922 req->rsp_upiu.qr.data[1] = UFS_QUERY_DESC_IDN_HEALTH; in ufs_read_desc()
927 trace_ufs_err_query_invalid_idn(req->req_upiu.qr.opcode, idn); in ufs_read_desc()
931 if (length > req->rsp_upiu.qr.data[0]) { in ufs_read_desc()
932 length = req->rsp_upiu.qr.data[0]; in ufs_read_desc()
934 req->rsp_upiu.qr.opcode = req->req_upiu.qr.opcode; in ufs_read_desc()
935 req->rsp_upiu.qr.idn = req->req_upiu.qr.idn; in ufs_read_desc()
936 req->rsp_upiu.qr.index = req->req_upiu.qr.index; in ufs_read_desc()
937 req->rsp_upiu.qr.selector = req->req_upiu.qr.selector; in ufs_read_desc()
938 req->rsp_upiu.qr.length = cpu_to_be16(length); in ufs_read_desc()
943 static QueryRespCode ufs_exec_query_read(UfsRequest *req) in ufs_exec_query_read() argument
946 switch (req->req_upiu.qr.opcode) { in ufs_exec_query_read()
951 status = ufs_read_desc(req); in ufs_exec_query_read()
954 status = ufs_exec_query_attr(req, UFS_QUERY_ATTR_READ); in ufs_exec_query_read()
957 status = ufs_exec_query_flag(req, UFS_QUERY_FLAG_READ); in ufs_exec_query_read()
960 trace_ufs_err_query_invalid_opcode(req->req_upiu.qr.opcode); in ufs_exec_query_read()
968 static QueryRespCode ufs_exec_query_write(UfsRequest *req) in ufs_exec_query_write() argument
971 switch (req->req_upiu.qr.opcode) { in ufs_exec_query_write()
980 status = ufs_exec_query_attr(req, UFS_QUERY_ATTR_WRITE); in ufs_exec_query_write()
983 status = ufs_exec_query_flag(req, UFS_QUERY_FLAG_SET); in ufs_exec_query_write()
986 status = ufs_exec_query_flag(req, UFS_QUERY_FLAG_CLEAR); in ufs_exec_query_write()
989 status = ufs_exec_query_flag(req, UFS_QUERY_FLAG_TOGGLE); in ufs_exec_query_write()
992 trace_ufs_err_query_invalid_opcode(req->req_upiu.qr.opcode); in ufs_exec_query_write()
1000 static UfsReqResult ufs_exec_query_cmd(UfsRequest *req) in ufs_exec_query_cmd() argument
1002 uint8_t query_func = req->req_upiu.header.query_func; in ufs_exec_query_cmd()
1006 trace_ufs_exec_query_cmd(req->slot, req->req_upiu.qr.opcode); in ufs_exec_query_cmd()
1008 status = ufs_exec_query_read(req); in ufs_exec_query_cmd()
1010 status = ufs_exec_query_write(req); in ufs_exec_query_cmd()
1015 data_segment_length = be16_to_cpu(req->rsp_upiu.qr.length); in ufs_exec_query_cmd()
1016 ufs_build_upiu_header(req, UFS_UPIU_TRANSACTION_QUERY_RSP, 0, status, 0, in ufs_exec_query_cmd()
1025 static void ufs_exec_req(UfsRequest *req) in ufs_exec_req() argument
1029 if (ufs_dma_read_upiu(req)) { in ufs_exec_req()
1033 switch (req->req_upiu.header.trans_type) { in ufs_exec_req()
1035 req_result = ufs_exec_nop_cmd(req); in ufs_exec_req()
1038 req_result = ufs_exec_scsi_cmd(req); in ufs_exec_req()
1041 req_result = ufs_exec_query_cmd(req); in ufs_exec_req()
1044 trace_ufs_err_invalid_trans_code(req->slot, in ufs_exec_req()
1045 req->req_upiu.header.trans_type); in ufs_exec_req()
1055 ufs_complete_req(req, req_result); in ufs_exec_req()
1062 UfsRequest *req; in ufs_process_req() local
1066 req = &u->req_list[slot]; in ufs_process_req()
1068 if (req->state != UFS_REQUEST_READY) { in ufs_process_req()
1072 req->state = UFS_REQUEST_RUNNING; in ufs_process_req()
1074 ufs_exec_req(req); in ufs_process_req()
1078 void ufs_complete_req(UfsRequest *req, UfsReqResult req_result) in ufs_complete_req() argument
1080 UfsHc *u = req->hc; in ufs_complete_req()
1081 assert(req->state == UFS_REQUEST_RUNNING); in ufs_complete_req()
1084 req->utrd.header.dword_2 = cpu_to_le32(UFS_OCS_SUCCESS); in ufs_complete_req()
1086 req->utrd.header.dword_2 = cpu_to_le32(UFS_OCS_INVALID_CMD_TABLE_ATTR); in ufs_complete_req()
1089 trace_ufs_complete_req(req->slot); in ufs_complete_req()
1090 req->state = UFS_REQUEST_COMPLETE; in ufs_complete_req()
1094 static void ufs_clear_req(UfsRequest *req) in ufs_clear_req() argument
1096 if (req->sg != NULL) { in ufs_clear_req()
1097 qemu_sglist_destroy(req->sg); in ufs_clear_req()
1098 g_free(req->sg); in ufs_clear_req()
1099 req->sg = NULL; in ufs_clear_req()
1100 req->data_len = 0; in ufs_clear_req()
1103 memset(&req->utrd, 0, sizeof(req->utrd)); in ufs_clear_req()
1104 memset(&req->req_upiu, 0, sizeof(req->req_upiu)); in ufs_clear_req()
1105 memset(&req->rsp_upiu, 0, sizeof(req->rsp_upiu)); in ufs_clear_req()
1111 UfsRequest *req; in ufs_sendback_req() local
1115 req = &u->req_list[slot]; in ufs_sendback_req()
1117 if (req->state != UFS_REQUEST_COMPLETE) { in ufs_sendback_req()
1121 if (ufs_dma_write_upiu(req)) { in ufs_sendback_req()
1122 req->state = UFS_REQUEST_ERROR; in ufs_sendback_req()
1130 if (le32_to_cpu(req->utrd.header.dword_2) != UFS_OCS_SUCCESS || in ufs_sendback_req()
1131 le32_to_cpu(req->utrd.header.dword_0) & UFS_UTP_REQ_DESC_INT_CMD) { in ufs_sendback_req()
1138 trace_ufs_sendback_req(req->slot); in ufs_sendback_req()
1140 ufs_clear_req(req); in ufs_sendback_req()
1141 req->state = UFS_REQUEST_IDLE; in ufs_sendback_req()