Lines Matching full:u
40 static inline uint64_t ufs_mcq_reg_addr(UfsHc *u, int qid) in ufs_mcq_reg_addr() argument
46 static inline uint64_t ufs_mcq_op_reg_addr(UfsHc *u, int qid) in ufs_mcq_op_reg_addr() argument
52 static inline uint64_t ufs_reg_size(UfsHc *u) in ufs_reg_size() argument
55 return ufs_mcq_op_reg_addr(u, 0) + sizeof(u->mcq_op_reg); in ufs_reg_size()
58 static inline bool ufs_is_mcq_reg(UfsHc *u, uint64_t addr, unsigned size) in ufs_is_mcq_reg() argument
62 if (!u->params.mcq) { in ufs_is_mcq_reg()
66 mcq_reg_addr = ufs_mcq_reg_addr(u, 0); in ufs_is_mcq_reg()
68 addr + size <= mcq_reg_addr + sizeof(u->mcq_reg)); in ufs_is_mcq_reg()
71 static inline bool ufs_is_mcq_op_reg(UfsHc *u, uint64_t addr, unsigned size) in ufs_is_mcq_op_reg() argument
75 if (!u->params.mcq) { in ufs_is_mcq_op_reg()
79 mcq_op_reg_addr = ufs_mcq_op_reg_addr(u, 0); in ufs_is_mcq_op_reg()
81 addr + size <= mcq_op_reg_addr + sizeof(u->mcq_op_reg)); in ufs_is_mcq_op_reg()
84 static MemTxResult ufs_addr_read(UfsHc *u, hwaddr addr, void *buf, int size) in ufs_addr_read() argument
92 if (!FIELD_EX32(u->reg.cap, CAP, 64AS) && (hi >> 32)) { in ufs_addr_read()
96 return pci_dma_read(PCI_DEVICE(u), addr, buf, size); in ufs_addr_read()
99 static MemTxResult ufs_addr_write(UfsHc *u, hwaddr addr, const void *buf, in ufs_addr_write() argument
107 if (!FIELD_EX32(u->reg.cap, CAP, 64AS) && (hi >> 32)) { in ufs_addr_write()
111 return pci_dma_write(PCI_DEVICE(u), addr, buf, size); in ufs_addr_write()
114 static inline hwaddr ufs_get_utrd_addr(UfsHc *u, uint32_t slot) in ufs_get_utrd_addr() argument
116 hwaddr utrl_base_addr = (((hwaddr)u->reg.utrlbau) << 32) + u->reg.utrlba; in ufs_get_utrd_addr()
142 UfsHc *u = req->hc; in ufs_dma_read_utrd() local
143 hwaddr utrd_addr = ufs_get_utrd_addr(u, req->slot); in ufs_dma_read_utrd()
146 ret = ufs_addr_read(u, utrd_addr, &req->utrd, sizeof(req->utrd)); in ufs_dma_read_utrd()
155 UfsHc *u = req->hc; in ufs_dma_read_req_upiu() local
166 ret = ufs_addr_read(u, req_upiu_base_addr, &req_upiu->header, in ufs_dma_read_req_upiu()
181 ret = ufs_addr_read(u, req_upiu_base_addr, &req->req_upiu, copy_size); in ufs_dma_read_req_upiu()
190 UfsHc *u = req->hc; in ufs_dma_read_prdt() local
209 err = ufs_addr_read(u, prdt_base_addr, prd_entries, prdt_size); in ufs_dma_read_prdt()
216 pci_dma_sglist_init(req->sg, PCI_DEVICE(u), prdt_len); in ufs_dma_read_prdt()
257 UfsHc *u = req->hc; in ufs_dma_write_utrd() local
258 hwaddr utrd_addr = ufs_get_utrd_addr(u, req->slot); in ufs_dma_write_utrd()
261 ret = ufs_addr_write(u, utrd_addr, &req->utrd, sizeof(req->utrd)); in ufs_dma_write_utrd()
270 UfsHc *u = req->hc; in ufs_dma_write_rsp_upiu() local
289 ret = ufs_addr_write(u, rsp_upiu_base_addr, &req->rsp_upiu, copy_size); in ufs_dma_write_rsp_upiu()
308 static void ufs_irq_check(UfsHc *u) in ufs_irq_check() argument
310 PCIDevice *pci = PCI_DEVICE(u); in ufs_irq_check()
312 if ((u->reg.is & UFS_INTR_MASK) & u->reg.ie) { in ufs_irq_check()
321 static void ufs_process_db(UfsHc *u, uint32_t val) in ufs_process_db() argument
325 uint32_t nutrs = u->params.nutrs; in ufs_process_db()
328 val &= ~u->reg.utrldbr; in ufs_process_db()
337 req = &u->req_list[slot]; in ufs_process_db()
353 qemu_bh_schedule(u->doorbell_bh); in ufs_process_db()
356 static void ufs_process_uiccmd(UfsHc *u, uint32_t val) in ufs_process_uiccmd() argument
358 trace_ufs_process_uiccmd(val, u->reg.ucmdarg1, u->reg.ucmdarg2, in ufs_process_uiccmd()
359 u->reg.ucmdarg3); in ufs_process_uiccmd()
366 u->reg.hcs = FIELD_DP32(u->reg.hcs, HCS, DP, 1); in ufs_process_uiccmd()
367 u->reg.hcs = FIELD_DP32(u->reg.hcs, HCS, UTRLRDY, 1); in ufs_process_uiccmd()
368 u->reg.hcs = FIELD_DP32(u->reg.hcs, HCS, UTMRLRDY, 1); in ufs_process_uiccmd()
369 u->reg.ucmdarg2 = UFS_UIC_CMD_RESULT_SUCCESS; in ufs_process_uiccmd()
373 u->reg.is = FIELD_DP32(u->reg.is, IS, UHES, 1); in ufs_process_uiccmd()
374 u->reg.hcs = FIELD_DP32(u->reg.hcs, HCS, UPMCRS, UFS_PWR_LOCAL); in ufs_process_uiccmd()
375 u->reg.ucmdarg2 = UFS_UIC_CMD_RESULT_SUCCESS; in ufs_process_uiccmd()
378 u->reg.is = FIELD_DP32(u->reg.is, IS, UHXS, 1); in ufs_process_uiccmd()
379 u->reg.hcs = FIELD_DP32(u->reg.hcs, HCS, UPMCRS, UFS_PWR_LOCAL); in ufs_process_uiccmd()
380 u->reg.ucmdarg2 = UFS_UIC_CMD_RESULT_SUCCESS; in ufs_process_uiccmd()
383 u->reg.ucmdarg2 = UFS_UIC_CMD_RESULT_FAILURE; in ufs_process_uiccmd()
386 u->reg.is = FIELD_DP32(u->reg.is, IS, UCCS, 1); in ufs_process_uiccmd()
388 ufs_irq_check(u); in ufs_process_uiccmd()
391 static void ufs_mcq_init_req(UfsHc *u, UfsRequest *req, UfsSq *sq) in ufs_mcq_init_req() argument
395 req->hc = u; in ufs_mcq_init_req()
404 UfsHc *u = sq->u; in ufs_mcq_process_sq() local
408 uint16_t head = ufs_mcq_sq_head(u, sq->sqid); in ufs_mcq_process_sq()
411 while (!(ufs_mcq_sq_empty(u, sq->sqid) || QTAILQ_EMPTY(&sq->req_list))) { in ufs_mcq_process_sq()
413 err = ufs_addr_read(sq->u, addr, (void *)&sqe, sizeof(sqe)); in ufs_mcq_process_sq()
420 ufs_mcq_update_sq_head(u, sq->sqid, head); in ufs_mcq_process_sq()
425 ufs_mcq_init_req(sq->u, req, sq); in ufs_mcq_process_sq()
436 UfsHc *u = cq->u; in ufs_mcq_process_cq() local
439 uint32_t tail = ufs_mcq_cq_tail(u, cq->cqid); in ufs_mcq_process_cq()
456 ret = ufs_addr_write(u, cq->addr + tail, &req->cqe, sizeof(req->cqe)); in ufs_mcq_process_cq()
463 ufs_mcq_update_cq_tail(u, cq->cqid, tail); in ufs_mcq_process_cq()
469 if (!ufs_mcq_cq_empty(u, cq->cqid)) { in ufs_mcq_process_cq()
470 u->mcq_op_reg[cq->cqid].cq_int.is = in ufs_mcq_process_cq()
471 FIELD_DP32(u->mcq_op_reg[cq->cqid].cq_int.is, CQIS, TEPS, 1); in ufs_mcq_process_cq()
473 u->reg.is = FIELD_DP32(u->reg.is, IS, CQES, 1); in ufs_mcq_process_cq()
474 ufs_irq_check(u); in ufs_mcq_process_cq()
478 static bool ufs_mcq_create_sq(UfsHc *u, uint8_t qid, uint32_t attr) in ufs_mcq_create_sq() argument
480 UfsMcqReg *reg = &u->mcq_reg[qid]; in ufs_mcq_create_sq()
484 if (qid >= u->params.mcq_maxq) { in ufs_mcq_create_sq()
489 if (u->sq[qid]) { in ufs_mcq_create_sq()
494 if (!u->cq[cqid]) { in ufs_mcq_create_sq()
500 sq->u = u; in ufs_mcq_create_sq()
502 sq->cq = u->cq[cqid]; in ufs_mcq_create_sq()
507 &DEVICE(u)->mem_reentrancy_guard); in ufs_mcq_create_sq()
511 ufs_mcq_init_req(u, &sq->req[i], sq); in ufs_mcq_create_sq()
515 u->sq[qid] = sq; in ufs_mcq_create_sq()
521 static bool ufs_mcq_delete_sq(UfsHc *u, uint8_t qid) in ufs_mcq_delete_sq() argument
525 if (qid >= u->params.mcq_maxq) { in ufs_mcq_delete_sq()
530 if (!u->sq[qid]) { in ufs_mcq_delete_sq()
535 sq = u->sq[qid]; in ufs_mcq_delete_sq()
540 u->sq[qid] = NULL; in ufs_mcq_delete_sq()
544 static bool ufs_mcq_create_cq(UfsHc *u, uint8_t qid, uint32_t attr) in ufs_mcq_create_cq() argument
546 UfsMcqReg *reg = &u->mcq_reg[qid]; in ufs_mcq_create_cq()
549 if (qid >= u->params.mcq_maxq) { in ufs_mcq_create_cq()
554 if (u->cq[qid]) { in ufs_mcq_create_cq()
560 cq->u = u; in ufs_mcq_create_cq()
566 &DEVICE(u)->mem_reentrancy_guard); in ufs_mcq_create_cq()
569 u->cq[qid] = cq; in ufs_mcq_create_cq()
575 static bool ufs_mcq_delete_cq(UfsHc *u, uint8_t qid) in ufs_mcq_delete_cq() argument
579 if (qid >= u->params.mcq_maxq) { in ufs_mcq_delete_cq()
584 if (!u->cq[qid]) { in ufs_mcq_delete_cq()
589 for (int i = 0; i < ARRAY_SIZE(u->sq); i++) { in ufs_mcq_delete_cq()
590 if (u->sq[i] && u->sq[i]->cq->cqid == qid) { in ufs_mcq_delete_cq()
596 cq = u->cq[qid]; in ufs_mcq_delete_cq()
600 u->cq[qid] = NULL; in ufs_mcq_delete_cq()
604 static void ufs_write_reg(UfsHc *u, hwaddr offset, uint32_t data, unsigned size) in ufs_write_reg() argument
608 u->reg.is &= ~data; in ufs_write_reg()
609 ufs_irq_check(u); in ufs_write_reg()
612 u->reg.ie = data; in ufs_write_reg()
613 ufs_irq_check(u); in ufs_write_reg()
616 if (!FIELD_EX32(u->reg.hce, HCE, HCE) && FIELD_EX32(data, HCE, HCE)) { in ufs_write_reg()
617 u->reg.hcs = FIELD_DP32(u->reg.hcs, HCS, UCRDY, 1); in ufs_write_reg()
618 u->reg.hce = FIELD_DP32(u->reg.hce, HCE, HCE, 1); in ufs_write_reg()
619 } else if (FIELD_EX32(u->reg.hce, HCE, HCE) && in ufs_write_reg()
621 u->reg.hcs = 0; in ufs_write_reg()
622 u->reg.hce = FIELD_DP32(u->reg.hce, HCE, HCE, 0); in ufs_write_reg()
626 u->reg.utrlba = data & R_UTRLBA_UTRLBA_MASK; in ufs_write_reg()
629 u->reg.utrlbau = data; in ufs_write_reg()
632 ufs_process_db(u, data); in ufs_write_reg()
633 u->reg.utrldbr |= data; in ufs_write_reg()
636 u->reg.utrlrsr = data; in ufs_write_reg()
639 u->reg.utrlcnr &= ~data; in ufs_write_reg()
642 u->reg.utmrlba = data & R_UTMRLBA_UTMRLBA_MASK; in ufs_write_reg()
645 u->reg.utmrlbau = data; in ufs_write_reg()
648 ufs_process_uiccmd(u, data); in ufs_write_reg()
651 u->reg.ucmdarg1 = data; in ufs_write_reg()
654 u->reg.ucmdarg2 = data; in ufs_write_reg()
657 u->reg.ucmdarg3 = data; in ufs_write_reg()
660 u->reg.config = data; in ufs_write_reg()
663 u->reg.mcqconfig = data; in ufs_write_reg()
677 static void ufs_write_mcq_reg(UfsHc *u, hwaddr offset, uint32_t data, in ufs_write_mcq_reg() argument
681 UfsMcqReg *reg = &u->mcq_reg[qid]; in ufs_write_mcq_reg()
687 if (!ufs_mcq_create_sq(u, qid, data)) { in ufs_write_mcq_reg()
692 if (!ufs_mcq_delete_sq(u, qid)) { in ufs_write_mcq_reg()
710 if (!ufs_mcq_create_cq(u, qid, data)) { in ufs_write_mcq_reg()
715 if (!ufs_mcq_delete_cq(u, qid)) { in ufs_write_mcq_reg()
742 static void ufs_mcq_process_db(UfsHc *u, uint8_t qid, uint32_t db) in ufs_mcq_process_db() argument
746 if (qid >= u->params.mcq_maxq) { in ufs_mcq_process_db()
751 sq = u->sq[qid]; in ufs_mcq_process_db()
757 ufs_mcq_update_sq_tail(u, sq->sqid, db); in ufs_mcq_process_db()
761 static void ufs_write_mcq_op_reg(UfsHc *u, hwaddr offset, uint32_t data, in ufs_write_mcq_op_reg() argument
765 UfsMcqOpReg *opr = &u->mcq_op_reg[qid]; in ufs_write_mcq_op_reg()
770 ufs_mcq_process_db(u, qid, data); in ufs_write_mcq_op_reg()
776 ufs_mcq_update_cq_head(u, qid, data); in ufs_write_mcq_op_reg()
789 UfsHc *u = (UfsHc *)opaque; in ufs_mmio_read() local
794 if (addr + size <= sizeof(u->reg)) { in ufs_mmio_read()
796 ptr = (uint32_t *)&u->reg; in ufs_mmio_read()
797 } else if (ufs_is_mcq_reg(u, addr, size)) { in ufs_mmio_read()
798 offset = addr - ufs_mcq_reg_addr(u, 0); in ufs_mmio_read()
799 ptr = (uint32_t *)&u->mcq_reg; in ufs_mmio_read()
800 } else if (ufs_is_mcq_op_reg(u, addr, size)) { in ufs_mmio_read()
801 offset = addr - ufs_mcq_op_reg_addr(u, 0); in ufs_mmio_read()
802 ptr = (uint32_t *)&u->mcq_op_reg; in ufs_mmio_read()
816 UfsHc *u = (UfsHc *)opaque; in ufs_mmio_write() local
820 if (addr + size <= sizeof(u->reg)) { in ufs_mmio_write()
821 ufs_write_reg(u, addr, data, size); in ufs_mmio_write()
822 } else if (ufs_is_mcq_reg(u, addr, size)) { in ufs_mmio_write()
823 ufs_write_mcq_reg(u, addr - ufs_mcq_reg_addr(u, 0), data, size); in ufs_mmio_write()
824 } else if (ufs_is_mcq_op_reg(u, addr, size)) { in ufs_mmio_write()
825 ufs_write_mcq_op_reg(u, addr - ufs_mcq_op_reg_addr(u, 0), data, size); in ufs_mmio_write()
864 UfsHc *u = req->hc; in ufs_exec_scsi_cmd() local
871 if (!is_wlun(lun) && (lun >= UFS_MAX_LUS || u->lus[lun] == NULL)) { in ufs_exec_scsi_cmd()
878 lu = &u->report_wlu; in ufs_exec_scsi_cmd()
881 lu = &u->dev_wlu; in ufs_exec_scsi_cmd()
884 lu = &u->boot_wlu; in ufs_exec_scsi_cmd()
887 lu = &u->rpmb_wlu; in ufs_exec_scsi_cmd()
890 lu = u->lus[lun]; in ufs_exec_scsi_cmd()
1014 UfsHc *u = req->hc; in ufs_exec_query_flag() local
1027 value = *(((uint8_t *)&u->flags) + idn); in ufs_exec_query_flag()
1033 value = *(((uint8_t *)&u->flags) + idn); in ufs_exec_query_flag()
1040 *(((uint8_t *)&u->flags) + idn) = value; in ufs_exec_query_flag()
1045 static uint32_t ufs_read_attr_value(UfsHc *u, uint8_t idn) in ufs_read_attr_value() argument
1049 return u->attributes.boot_lun_en; in ufs_read_attr_value()
1051 return u->attributes.current_power_mode; in ufs_read_attr_value()
1053 return u->attributes.active_icc_level; in ufs_read_attr_value()
1055 return u->attributes.out_of_order_data_en; in ufs_read_attr_value()
1057 return u->attributes.background_op_status; in ufs_read_attr_value()
1059 return u->attributes.purge_status; in ufs_read_attr_value()
1061 return u->attributes.max_data_in_size; in ufs_read_attr_value()
1063 return u->attributes.max_data_out_size; in ufs_read_attr_value()
1065 return be32_to_cpu(u->attributes.dyn_cap_needed); in ufs_read_attr_value()
1067 return u->attributes.ref_clk_freq; in ufs_read_attr_value()
1069 return u->attributes.config_descr_lock; in ufs_read_attr_value()
1071 return u->attributes.max_num_of_rtt; in ufs_read_attr_value()
1073 return be16_to_cpu(u->attributes.exception_event_control); in ufs_read_attr_value()
1075 return be16_to_cpu(u->attributes.exception_event_status); in ufs_read_attr_value()
1077 return be32_to_cpu(u->attributes.seconds_passed); in ufs_read_attr_value()
1079 return be16_to_cpu(u->attributes.context_conf); in ufs_read_attr_value()
1081 return u->attributes.device_ffu_status; in ufs_read_attr_value()
1083 return be32_to_cpu(u->attributes.psa_state); in ufs_read_attr_value()
1085 return be32_to_cpu(u->attributes.psa_data_size); in ufs_read_attr_value()
1087 return u->attributes.ref_clk_gating_wait_time; in ufs_read_attr_value()
1089 return u->attributes.device_case_rough_temperaure; in ufs_read_attr_value()
1091 return u->attributes.device_too_high_temp_boundary; in ufs_read_attr_value()
1093 return u->attributes.device_too_low_temp_boundary; in ufs_read_attr_value()
1095 return u->attributes.throttling_status; in ufs_read_attr_value()
1097 return u->attributes.wb_buffer_flush_status; in ufs_read_attr_value()
1099 return u->attributes.available_wb_buffer_size; in ufs_read_attr_value()
1101 return u->attributes.wb_buffer_life_time_est; in ufs_read_attr_value()
1103 return be32_to_cpu(u->attributes.current_wb_buffer_size); in ufs_read_attr_value()
1105 return u->attributes.refresh_status; in ufs_read_attr_value()
1107 return u->attributes.refresh_freq; in ufs_read_attr_value()
1109 return u->attributes.refresh_unit; in ufs_read_attr_value()
1114 static QueryRespCode ufs_write_attr_value(UfsHc *u, uint8_t idn, uint32_t value) in ufs_write_attr_value() argument
1121 u->attributes.active_icc_level = value; in ufs_write_attr_value()
1124 u->attributes.max_data_in_size = value; in ufs_write_attr_value()
1127 u->attributes.max_data_out_size = value; in ufs_write_attr_value()
1130 u->attributes.ref_clk_freq = value; in ufs_write_attr_value()
1133 u->attributes.max_num_of_rtt = value; in ufs_write_attr_value()
1136 u->attributes.exception_event_control = cpu_to_be16(value); in ufs_write_attr_value()
1139 u->attributes.seconds_passed = cpu_to_be32(value); in ufs_write_attr_value()
1142 u->attributes.psa_state = value; in ufs_write_attr_value()
1145 u->attributes.psa_data_size = cpu_to_be32(value); in ufs_write_attr_value()
1153 UfsHc *u = req->hc; in ufs_exec_query_attr() local
1164 value = ufs_read_attr_value(u, idn); in ufs_exec_query_attr()
1168 ret = ufs_write_attr_value(u, idn, value); in ufs_exec_query_attr()
1183 UfsHc *u = req->hc; in ufs_read_unit_desc() local
1187 (lun >= UFS_MAX_LUS || u->lus[lun] == NULL)) { in ufs_read_unit_desc()
1195 memcpy(&req->rsp_upiu.qr.data, &u->lus[lun]->unit_desc, in ufs_read_unit_desc()
1196 sizeof(u->lus[lun]->unit_desc)); in ufs_read_unit_desc()
1226 desc.UC[3] = cpu_to_be16('U'); in product_name_str_desc()
1228 desc.UC[5] = cpu_to_be16('U'); in product_name_str_desc()
1254 UfsHc *u = req->hc; in ufs_read_string_desc() local
1258 if (index == u->device_desc.manufacturer_name) { in ufs_read_string_desc()
1261 } else if (index == u->device_desc.product_name) { in ufs_read_string_desc()
1264 } else if (index == u->device_desc.serial_number) { in ufs_read_string_desc()
1266 } else if (index == u->device_desc.oem_id) { in ufs_read_string_desc()
1268 } else if (index == u->device_desc.product_revision_level) { in ufs_read_string_desc()
1291 UfsHc *u = req->hc; in ufs_read_desc() local
1302 memcpy(&req->rsp_upiu.qr.data, &u->device_desc, sizeof(u->device_desc)); in ufs_read_desc()
1309 memcpy(&req->rsp_upiu.qr.data, &u->geometry_desc, in ufs_read_desc()
1310 sizeof(u->geometry_desc)); in ufs_read_desc()
1469 UfsHc *u = opaque; in ufs_process_req() local
1473 for (slot = 0; slot < u->params.nutrs; slot++) { in ufs_process_req()
1474 req = &u->req_list[slot]; in ufs_process_req()
1488 UfsHc *u = req->hc; in ufs_complete_req() local
1505 qemu_bh_schedule(u->complete_bh); in ufs_complete_req()
1525 UfsHc *u = opaque; in ufs_sendback_req() local
1529 for (slot = 0; slot < u->params.nutrs; slot++) { in ufs_sendback_req()
1530 req = &u->req_list[slot]; in ufs_sendback_req()
1547 u->reg.is = FIELD_DP32(u->reg.is, IS, UTRCS, 1); in ufs_sendback_req()
1550 u->reg.utrldbr &= ~(1 << slot); in ufs_sendback_req()
1551 u->reg.utrlcnr |= (1 << slot); in ufs_sendback_req()
1559 ufs_irq_check(u); in ufs_sendback_req()
1562 static bool ufs_check_constraints(UfsHc *u, Error **errp) in ufs_check_constraints() argument
1564 if (u->params.nutrs > UFS_MAX_NUTRS) { in ufs_check_constraints()
1570 if (u->params.nutmrs > UFS_MAX_NUTMRS) { in ufs_check_constraints()
1576 if (u->params.mcq_maxq >= UFS_MAX_MCQ_QNUM) { in ufs_check_constraints()
1584 static void ufs_init_pci(UfsHc *u, PCIDevice *pci_dev) in ufs_init_pci() argument
1591 memory_region_init_io(&u->iomem, OBJECT(u), &ufs_mmio_ops, u, "ufs", in ufs_init_pci()
1592 u->reg_size); in ufs_init_pci()
1593 pci_register_bar(pci_dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &u->iomem); in ufs_init_pci()
1594 u->irq = pci_allocate_irq(pci_dev); in ufs_init_pci()
1597 static void ufs_init_state(UfsHc *u) in ufs_init_state() argument
1599 u->req_list = g_new0(UfsRequest, u->params.nutrs); in ufs_init_state()
1601 for (int i = 0; i < u->params.nutrs; i++) { in ufs_init_state()
1602 u->req_list[i].hc = u; in ufs_init_state()
1603 u->req_list[i].slot = i; in ufs_init_state()
1604 u->req_list[i].sg = NULL; in ufs_init_state()
1605 u->req_list[i].state = UFS_REQUEST_IDLE; in ufs_init_state()
1608 u->doorbell_bh = qemu_bh_new_guarded(ufs_process_req, u, in ufs_init_state()
1609 &DEVICE(u)->mem_reentrancy_guard); in ufs_init_state()
1610 u->complete_bh = qemu_bh_new_guarded(ufs_sendback_req, u, in ufs_init_state()
1611 &DEVICE(u)->mem_reentrancy_guard); in ufs_init_state()
1613 if (u->params.mcq) { in ufs_init_state()
1614 memset(u->sq, 0, sizeof(u->sq)); in ufs_init_state()
1615 memset(u->cq, 0, sizeof(u->cq)); in ufs_init_state()
1619 static void ufs_init_hc(UfsHc *u) in ufs_init_hc() argument
1625 u->reg_size = pow2ceil(ufs_reg_size(u)); in ufs_init_hc()
1627 memset(&u->reg, 0, sizeof(u->reg)); in ufs_init_hc()
1628 memset(&u->mcq_reg, 0, sizeof(u->mcq_reg)); in ufs_init_hc()
1629 memset(&u->mcq_op_reg, 0, sizeof(u->mcq_op_reg)); in ufs_init_hc()
1630 cap = FIELD_DP32(cap, CAP, NUTRS, (u->params.nutrs - 1)); in ufs_init_hc()
1632 cap = FIELD_DP32(cap, CAP, NUTMRS, (u->params.nutmrs - 1)); in ufs_init_hc()
1639 cap = FIELD_DP32(cap, CAP, MCQS, u->params.mcq); in ufs_init_hc()
1640 u->reg.cap = cap; in ufs_init_hc()
1642 if (u->params.mcq) { in ufs_init_hc()
1644 u->reg.mcqconfig = mcqconfig; in ufs_init_hc()
1646 mcqcap = FIELD_DP32(mcqcap, MCQCAP, MAXQ, u->params.mcq_maxq - 1); in ufs_init_hc()
1649 u->reg.mcqcap = mcqcap; in ufs_init_hc()
1651 for (int i = 0; i < ARRAY_SIZE(u->mcq_reg); i++) { in ufs_init_hc()
1652 uint64_t addr = ufs_mcq_op_reg_addr(u, i); in ufs_init_hc()
1653 u->mcq_reg[i].sqdao = addr; in ufs_init_hc()
1654 u->mcq_reg[i].sqisao = addr + sizeof(UfsMcqSqReg); in ufs_init_hc()
1656 u->mcq_reg[i].cqdao = addr + sizeof(UfsMcqSqIntReg); in ufs_init_hc()
1658 u->mcq_reg[i].cqisao = addr + sizeof(UfsMcqCqReg); in ufs_init_hc()
1661 u->reg.ver = UFS_SPEC_VER; in ufs_init_hc()
1663 memset(&u->device_desc, 0, sizeof(DeviceDescriptor)); in ufs_init_hc()
1664 u->device_desc.length = sizeof(DeviceDescriptor); in ufs_init_hc()
1665 u->device_desc.descriptor_idn = UFS_QUERY_DESC_IDN_DEVICE; in ufs_init_hc()
1666 u->device_desc.device_sub_class = 0x01; in ufs_init_hc()
1667 u->device_desc.number_lu = 0x00; in ufs_init_hc()
1668 u->device_desc.number_wlu = 0x04; in ufs_init_hc()
1670 u->device_desc.init_power_mode = 0x01; /* Active Mode */ in ufs_init_hc()
1671 u->device_desc.high_priority_lun = 0x7F; /* Same Priority */ in ufs_init_hc()
1672 u->device_desc.spec_version = cpu_to_be16(UFS_SPEC_VER); in ufs_init_hc()
1673 u->device_desc.manufacturer_name = 0x00; in ufs_init_hc()
1674 u->device_desc.product_name = 0x01; in ufs_init_hc()
1675 u->device_desc.serial_number = 0x02; in ufs_init_hc()
1676 u->device_desc.oem_id = 0x03; in ufs_init_hc()
1677 u->device_desc.ud_0_base_offset = 0x16; in ufs_init_hc()
1678 u->device_desc.ud_config_p_length = 0x1A; in ufs_init_hc()
1679 u->device_desc.device_rtt_cap = 0x02; in ufs_init_hc()
1680 u->device_desc.queue_depth = u->params.nutrs; in ufs_init_hc()
1681 u->device_desc.product_revision_level = 0x04; in ufs_init_hc()
1683 memset(&u->geometry_desc, 0, sizeof(GeometryDescriptor)); in ufs_init_hc()
1684 u->geometry_desc.length = sizeof(GeometryDescriptor); in ufs_init_hc()
1685 u->geometry_desc.descriptor_idn = UFS_QUERY_DESC_IDN_GEOMETRY; in ufs_init_hc()
1686 u->geometry_desc.max_number_lu = (UFS_MAX_LUS == 32) ? 0x1 : 0x0; in ufs_init_hc()
1687 u->geometry_desc.segment_size = cpu_to_be32(0x2000); /* 4KB */ in ufs_init_hc()
1688 u->geometry_desc.allocation_unit_size = 0x1; /* 4KB */ in ufs_init_hc()
1689 u->geometry_desc.min_addr_block_size = 0x8; /* 4KB */ in ufs_init_hc()
1690 u->geometry_desc.max_in_buffer_size = 0x8; in ufs_init_hc()
1691 u->geometry_desc.max_out_buffer_size = 0x8; in ufs_init_hc()
1692 u->geometry_desc.rpmb_read_write_size = 0x40; in ufs_init_hc()
1693 u->geometry_desc.data_ordering = in ufs_init_hc()
1695 u->geometry_desc.max_context_id_number = 0x5; in ufs_init_hc()
1696 u->geometry_desc.supported_memory_types = cpu_to_be16(0x8001); in ufs_init_hc()
1698 memset(&u->attributes, 0, sizeof(u->attributes)); in ufs_init_hc()
1699 u->attributes.max_data_in_size = 0x08; in ufs_init_hc()
1700 u->attributes.max_data_out_size = 0x08; in ufs_init_hc()
1701 u->attributes.ref_clk_freq = 0x01; /* 26 MHz */ in ufs_init_hc()
1703 u->attributes.config_descr_lock = 0x01; in ufs_init_hc()
1704 u->attributes.max_num_of_rtt = 0x02; in ufs_init_hc()
1706 memset(&u->flags, 0, sizeof(u->flags)); in ufs_init_hc()
1707 u->flags.permanently_disable_fw_update = 1; in ufs_init_hc()
1712 UfsHc *u = UFS(pci_dev); in ufs_realize() local
1714 if (!ufs_check_constraints(u, errp)) { in ufs_realize()
1718 qbus_init(&u->bus, sizeof(UfsBus), TYPE_UFS_BUS, &pci_dev->qdev, in ufs_realize()
1719 u->parent_obj.qdev.id); in ufs_realize()
1721 ufs_init_state(u); in ufs_realize()
1722 ufs_init_hc(u); in ufs_realize()
1723 ufs_init_pci(u, pci_dev); in ufs_realize()
1725 ufs_init_wlu(&u->report_wlu, UFS_UPIU_REPORT_LUNS_WLUN); in ufs_realize()
1726 ufs_init_wlu(&u->dev_wlu, UFS_UPIU_UFS_DEVICE_WLUN); in ufs_realize()
1727 ufs_init_wlu(&u->boot_wlu, UFS_UPIU_BOOT_WLUN); in ufs_realize()
1728 ufs_init_wlu(&u->rpmb_wlu, UFS_UPIU_RPMB_WLUN); in ufs_realize()
1733 UfsHc *u = UFS(pci_dev); in ufs_exit() local
1735 qemu_bh_delete(u->doorbell_bh); in ufs_exit()
1736 qemu_bh_delete(u->complete_bh); in ufs_exit()
1738 for (int i = 0; i < u->params.nutrs; i++) { in ufs_exit()
1739 ufs_clear_req(&u->req_list[i]); in ufs_exit()
1741 g_free(u->req_list); in ufs_exit()
1743 for (int i = 0; i < ARRAY_SIZE(u->sq); i++) { in ufs_exit()
1744 if (u->sq[i]) { in ufs_exit()
1745 ufs_mcq_delete_sq(u, i); in ufs_exit()
1748 for (int i = 0; i < ARRAY_SIZE(u->cq); i++) { in ufs_exit()
1749 if (u->cq[i]) { in ufs_exit()
1750 ufs_mcq_delete_cq(u, i); in ufs_exit()