@samitouri / QOSamiQemu / commits / c1bf59e836

hw/ufs: Modify flag handling operation

Change internal flag handling operation same as attribute's In UFS device, some flag queries directly trigger specific device behaviour like attribute's, not only changes the internal values. So restructure flag query processing functions same as attribute processing, to facilitate linking detailed implementations based on individual flag value changes. Signed-off-by: Jaemyung Lee <jaemyung.lee@samsung.com> Signed-off-by: Jeuk Kim <jeuk20.kim@samsung.com>

Jaemyung Lee committed May 14, 2026 at 17:10 UTC c1bf59e836bd48557ee6d7c7bb0c939a31aaffc0
1 file changed +119 -33
hw/ufs/ufs.c
+119 -33
@@ -1089,6 +1089,122 @@ static inline QueryRespCode ufs_flag_check_idn_valid(uint8_t idn, int op)
1089 return UFS_QUERY_RESULT_SUCCESS;
1090 }
1091
1092 +static uint32_t ufs_read_flag_value(UfsHc *u, uint8_t idn)
1093 +{
1094 + switch (idn) {
1095 + case UFS_QUERY_FLAG_IDN_FDEVICEINIT:
1096 + return u->flags.device_init;
1097 + case UFS_QUERY_FLAG_IDN_PERMANENT_WPE:
1098 + return u->flags.permanent_wp_en;
1099 + case UFS_QUERY_FLAG_IDN_PWR_ON_WPE:
1100 + return u->flags.power_on_wp_en;
1101 + case UFS_QUERY_FLAG_IDN_BKOPS_EN:
1102 + return u->flags.background_ops_en;
1103 + case UFS_QUERY_FLAG_IDN_LIFE_SPAN_MODE_ENABLE:
1104 + return u->flags.device_life_span_mode_en;
1105 + case UFS_QUERY_FLAG_IDN_PURGE_ENABLE:
1106 + return u->flags.purge_enable;
1107 + case UFS_QUERY_FLAG_IDN_REFRESH_ENABLE:
1108 + return u->flags.refresh_enable;
1109 + case UFS_QUERY_FLAG_IDN_FPHYRESOURCEREMOVAL:
1110 + return u->flags.phy_resource_removal;
1111 + case UFS_QUERY_FLAG_IDN_BUSY_RTC:
1112 + return u->flags.busy_rtc;
1113 + case UFS_QUERY_FLAG_IDN_PERMANENTLY_DISABLE_FW_UPDATE:
1114 + return u->flags.permanently_disable_fw_update;
1115 + case UFS_QUERY_FLAG_IDN_WB_EN:
1116 + return u->flags.wb_en;
1117 + case UFS_QUERY_FLAG_IDN_WB_BUFF_FLUSH_EN:
1118 + return u->flags.wb_buffer_flush_en;
1119 + case UFS_QUERY_FLAG_IDN_WB_BUFF_FLUSH_DURING_HIBERN8:
1120 + return u->flags.wb_buffer_flush_during_hibernate;
1121 + case UFS_QUERY_FLAG_IDN_UNPIN_EN:
1122 + return u->flags.unpin_en;
1123 + default:
1124 + g_assert_not_reached();
1125 + return 0;
1126 + }
1127 +}
1128 +
1129 +static QueryRespCode ufs_write_flag_value(UfsHc *u, uint8_t idn, uint8_t value)
1130 +{
1131 + switch (idn) {
1132 + case UFS_QUERY_FLAG_IDN_FDEVICEINIT:
1133 + u->flags.device_init = 0;
1134 + break;
1135 + case UFS_QUERY_FLAG_IDN_PERMANENT_WPE:
1136 + u->flags.permanent_wp_en = value;
1137 + break;
1138 + case UFS_QUERY_FLAG_IDN_PWR_ON_WPE:
1139 + u->flags.power_on_wp_en = value;
1140 + break;
1141 + case UFS_QUERY_FLAG_IDN_BKOPS_EN:
1142 + u->flags.background_ops_en = value;
1143 + break;
1144 + case UFS_QUERY_FLAG_IDN_LIFE_SPAN_MODE_ENABLE:
1145 + u->flags.device_life_span_mode_en = value;
1146 + break;
1147 + case UFS_QUERY_FLAG_IDN_PURGE_ENABLE:
1148 + u->flags.purge_enable = value;
1149 + break;
1150 + case UFS_QUERY_FLAG_IDN_REFRESH_ENABLE:
1151 + u->flags.refresh_enable = value;
1152 + break;
1153 + case UFS_QUERY_FLAG_IDN_FPHYRESOURCEREMOVAL:
1154 + u->flags.phy_resource_removal = value;
1155 + break;
1156 + case UFS_QUERY_FLAG_IDN_PERMANENTLY_DISABLE_FW_UPDATE:
1157 + u->flags.permanently_disable_fw_update = value;
1158 + break;
1159 + case UFS_QUERY_FLAG_IDN_WB_EN:
1160 + u->flags.wb_en = value;
1161 + break;
1162 + case UFS_QUERY_FLAG_IDN_WB_BUFF_FLUSH_EN:
1163 + u->flags.wb_buffer_flush_en = value;
1164 + break;
1165 + case UFS_QUERY_FLAG_IDN_WB_BUFF_FLUSH_DURING_HIBERN8:
1166 + u->flags.wb_buffer_flush_during_hibernate = value;
1167 + break;
1168 + default:
1169 + return UFS_QUERY_RESULT_INVALID_VALUE;
1170 + }
1171 +
1172 + return UFS_QUERY_RESULT_SUCCESS;
1173 +}
1174 +
1175 +static QueryRespCode ufs_exec_query_flag(UfsRequest *req, int op)
1176 +{
1177 + UfsHc *u = req->hc;
1178 + uint8_t idn = req->req_upiu.qr.idn;
1179 + uint8_t value;
1180 + QueryRespCode ret;
1181 +
1182 + ret = ufs_flag_check_idn_valid(idn, op);
1183 + if (ret) {
1184 + return ret;
1185 + }
1186 +
1187 + if (op == UFS_QUERY_FLAG_READ) {
1188 + value = ufs_read_flag_value(u, idn);
1189 + ret = UFS_QUERY_RESULT_SUCCESS;
1190 + } else if (op == UFS_QUERY_FLAG_SET) {
1191 + value = 1;
1192 + ret = ufs_write_flag_value(u, idn, value);
1193 + } else if (op == UFS_QUERY_FLAG_CLEAR) {
1194 + value = 0;
1195 + ret = ufs_write_flag_value(u, idn, value);
1196 + } else if (op == UFS_QUERY_FLAG_TOGGLE) {
1197 + value = !(ufs_read_flag_value(u, idn));
1198 + ret = ufs_write_flag_value(u, idn, value);
1199 + } else {
1200 + trace_ufs_err_query_invalid_opcode(op);
1201 + return UFS_QUERY_RESULT_INVALID_OPCODE;
1202 + }
1203 +
1204 + req->rsp_upiu.qr.value = cpu_to_be32(value);
1205 + return ret;
1206 +}
1207 +
1208 static const int attr_permission[UFS_QUERY_ATTR_IDN_COUNT] = {
1209 /* booting is not supported */
1210 [UFS_QUERY_ATTR_IDN_BOOT_LU_EN] = UFS_QUERY_ATTR_READ,
@@ -1172,39 +1288,6 @@ static inline QueryRespCode ufs_attr_check_idn_valid(uint8_t idn, int op)
1288 return UFS_QUERY_RESULT_SUCCESS;
1289 }
1290
1175 -static QueryRespCode ufs_exec_query_flag(UfsRequest *req, int op)
1176 -{
1177 - UfsHc *u = req->hc;
1178 - uint8_t idn = req->req_upiu.qr.idn;
1179 - uint32_t value;
1180 - QueryRespCode ret;
1181 -
1182 - ret = ufs_flag_check_idn_valid(idn, op);
1183 - if (ret) {
1184 - return ret;
1185 - }
1186 -
1187 - if (idn == UFS_QUERY_FLAG_IDN_FDEVICEINIT) {
1188 - value = 0;
1189 - } else if (op == UFS_QUERY_FLAG_READ) {
1190 - value = *(((uint8_t *)&u->flags) + idn);
1191 - } else if (op == UFS_QUERY_FLAG_SET) {
1192 - value = 1;
1193 - } else if (op == UFS_QUERY_FLAG_CLEAR) {
1194 - value = 0;
1195 - } else if (op == UFS_QUERY_FLAG_TOGGLE) {
1196 - value = *(((uint8_t *)&u->flags) + idn);
1197 - value = !value;
1198 - } else {
1199 - trace_ufs_err_query_invalid_opcode(op);
1200 - return UFS_QUERY_RESULT_INVALID_OPCODE;
1201 - }
1202 -
1203 - *(((uint8_t *)&u->flags) + idn) = value;
1204 - req->rsp_upiu.qr.value = cpu_to_be32(value);
1205 - return UFS_QUERY_RESULT_SUCCESS;
1206 -}
1207 -
1291 static inline uint8_t ufs_read_device_temp(UfsHc *u)
1292 {
1293 uint8_t feat_sup = u->device_desc.ufs_features_support;
@@ -1369,6 +1452,9 @@ static QueryRespCode ufs_write_attr_value(UfsHc *u, uint8_t idn, uint32_t value)
1452 case UFS_QUERY_ATTR_IDN_TIMESTAMP:
1453 u->attributes.timestamp = cpu_to_be64(value);
1454 break;
1455 + default:
1456 + g_assert_not_reached();
1457 + return 0;
1458 }
1459 return UFS_QUERY_RESULT_SUCCESS;
1460 }