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
}