return UFS_QUERY_RESULT_SUCCESS;
}
+static uint32_t ufs_read_flag_value(UfsHc *u, uint8_t idn)
+{
+ switch (idn) {
+ case UFS_QUERY_FLAG_IDN_FDEVICEINIT:
+ return u->flags.device_init;
+ case UFS_QUERY_FLAG_IDN_PERMANENT_WPE:
+ return u->flags.permanent_wp_en;
+ case UFS_QUERY_FLAG_IDN_PWR_ON_WPE:
+ return u->flags.power_on_wp_en;
+ case UFS_QUERY_FLAG_IDN_BKOPS_EN:
+ return u->flags.background_ops_en;
+ case UFS_QUERY_FLAG_IDN_LIFE_SPAN_MODE_ENABLE:
+ return u->flags.device_life_span_mode_en;
+ case UFS_QUERY_FLAG_IDN_PURGE_ENABLE:
+ return u->flags.purge_enable;
+ case UFS_QUERY_FLAG_IDN_REFRESH_ENABLE:
+ return u->flags.refresh_enable;
+ case UFS_QUERY_FLAG_IDN_FPHYRESOURCEREMOVAL:
+ return u->flags.phy_resource_removal;
+ case UFS_QUERY_FLAG_IDN_BUSY_RTC:
+ return u->flags.busy_rtc;
+ case UFS_QUERY_FLAG_IDN_PERMANENTLY_DISABLE_FW_UPDATE:
+ return u->flags.permanently_disable_fw_update;
+ case UFS_QUERY_FLAG_IDN_WB_EN:
+ return u->flags.wb_en;
+ case UFS_QUERY_FLAG_IDN_WB_BUFF_FLUSH_EN:
+ return u->flags.wb_buffer_flush_en;
+ case UFS_QUERY_FLAG_IDN_WB_BUFF_FLUSH_DURING_HIBERN8:
+ return u->flags.wb_buffer_flush_during_hibernate;
+ case UFS_QUERY_FLAG_IDN_UNPIN_EN:
+ return u->flags.unpin_en;
+ default:
+ g_assert_not_reached();
+ return 0;
+ }
+}
+
+static QueryRespCode ufs_write_flag_value(UfsHc *u, uint8_t idn, uint8_t value)
+{
+ switch (idn) {
+ case UFS_QUERY_FLAG_IDN_FDEVICEINIT:
+ u->flags.device_init = 0;
+ break;
+ case UFS_QUERY_FLAG_IDN_PERMANENT_WPE:
+ u->flags.permanent_wp_en = value;
+ break;
+ case UFS_QUERY_FLAG_IDN_PWR_ON_WPE:
+ u->flags.power_on_wp_en = value;
+ break;
+ case UFS_QUERY_FLAG_IDN_BKOPS_EN:
+ u->flags.background_ops_en = value;
+ break;
+ case UFS_QUERY_FLAG_IDN_LIFE_SPAN_MODE_ENABLE:
+ u->flags.device_life_span_mode_en = value;
+ break;
+ case UFS_QUERY_FLAG_IDN_PURGE_ENABLE:
+ u->flags.purge_enable = value;
+ break;
+ case UFS_QUERY_FLAG_IDN_REFRESH_ENABLE:
+ u->flags.refresh_enable = value;
+ break;
+ case UFS_QUERY_FLAG_IDN_FPHYRESOURCEREMOVAL:
+ u->flags.phy_resource_removal = value;
+ break;
+ case UFS_QUERY_FLAG_IDN_PERMANENTLY_DISABLE_FW_UPDATE:
+ u->flags.permanently_disable_fw_update = value;
+ break;
+ case UFS_QUERY_FLAG_IDN_WB_EN:
+ u->flags.wb_en = value;
+ break;
+ case UFS_QUERY_FLAG_IDN_WB_BUFF_FLUSH_EN:
+ u->flags.wb_buffer_flush_en = value;
+ break;
+ case UFS_QUERY_FLAG_IDN_WB_BUFF_FLUSH_DURING_HIBERN8:
+ u->flags.wb_buffer_flush_during_hibernate = value;
+ break;
+ default:
+ return UFS_QUERY_RESULT_INVALID_VALUE;
+ }
+
+ return UFS_QUERY_RESULT_SUCCESS;
+}
+
+static QueryRespCode ufs_exec_query_flag(UfsRequest *req, int op)
+{
+ UfsHc *u = req->hc;
+ uint8_t idn = req->req_upiu.qr.idn;
+ uint8_t value;
+ QueryRespCode ret;
+
+ ret = ufs_flag_check_idn_valid(idn, op);
+ if (ret) {
+ return ret;
+ }
+
+ if (op == UFS_QUERY_FLAG_READ) {
+ value = ufs_read_flag_value(u, idn);
+ ret = UFS_QUERY_RESULT_SUCCESS;
+ } else if (op == UFS_QUERY_FLAG_SET) {
+ value = 1;
+ ret = ufs_write_flag_value(u, idn, value);
+ } else if (op == UFS_QUERY_FLAG_CLEAR) {
+ value = 0;
+ ret = ufs_write_flag_value(u, idn, value);
+ } else if (op == UFS_QUERY_FLAG_TOGGLE) {
+ value = !(ufs_read_flag_value(u, idn));
+ ret = ufs_write_flag_value(u, idn, value);
+ } else {
+ trace_ufs_err_query_invalid_opcode(op);
+ return UFS_QUERY_RESULT_INVALID_OPCODE;
+ }
+
+ req->rsp_upiu.qr.value = cpu_to_be32(value);
+ return ret;
+}
+
static const int attr_permission[UFS_QUERY_ATTR_IDN_COUNT] = {
/* booting is not supported */
[UFS_QUERY_ATTR_IDN_BOOT_LU_EN] = UFS_QUERY_ATTR_READ,
return UFS_QUERY_RESULT_SUCCESS;
}
-static QueryRespCode ufs_exec_query_flag(UfsRequest *req, int op)
-{
- UfsHc *u = req->hc;
- uint8_t idn = req->req_upiu.qr.idn;
- uint32_t value;
- QueryRespCode ret;
-
- ret = ufs_flag_check_idn_valid(idn, op);
- if (ret) {
- return ret;
- }
-
- if (idn == UFS_QUERY_FLAG_IDN_FDEVICEINIT) {
- value = 0;
- } else if (op == UFS_QUERY_FLAG_READ) {
- value = *(((uint8_t *)&u->flags) + idn);
- } else if (op == UFS_QUERY_FLAG_SET) {
- value = 1;
- } else if (op == UFS_QUERY_FLAG_CLEAR) {
- value = 0;
- } else if (op == UFS_QUERY_FLAG_TOGGLE) {
- value = *(((uint8_t *)&u->flags) + idn);
- value = !value;
- } else {
- trace_ufs_err_query_invalid_opcode(op);
- return UFS_QUERY_RESULT_INVALID_OPCODE;
- }
-
- *(((uint8_t *)&u->flags) + idn) = value;
- req->rsp_upiu.qr.value = cpu_to_be32(value);
- return UFS_QUERY_RESULT_SUCCESS;
-}
-
static inline uint8_t ufs_read_device_temp(UfsHc *u)
{
uint8_t feat_sup = u->device_desc.ufs_features_support;
case UFS_QUERY_ATTR_IDN_TIMESTAMP:
u->attributes.timestamp = cpu_to_be64(value);
break;
+ default:
+ g_assert_not_reached();
+ return 0;
}
return UFS_QUERY_RESULT_SUCCESS;
}