linux/drivers/scsi/ufs/ufs-sysfs.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2// Copyright (C) 2018 Western Digital Corporation
   3
   4#include <linux/err.h>
   5#include <linux/string.h>
   6#include <linux/bitfield.h>
   7#include <asm/unaligned.h>
   8
   9#include "ufs.h"
  10#include "ufs-sysfs.h"
  11
  12static const char *ufshcd_uic_link_state_to_string(
  13                        enum uic_link_state state)
  14{
  15        switch (state) {
  16        case UIC_LINK_OFF_STATE:        return "OFF";
  17        case UIC_LINK_ACTIVE_STATE:     return "ACTIVE";
  18        case UIC_LINK_HIBERN8_STATE:    return "HIBERN8";
  19        case UIC_LINK_BROKEN_STATE:     return "BROKEN";
  20        default:                        return "UNKNOWN";
  21        }
  22}
  23
  24static const char *ufshcd_ufs_dev_pwr_mode_to_string(
  25                        enum ufs_dev_pwr_mode state)
  26{
  27        switch (state) {
  28        case UFS_ACTIVE_PWR_MODE:       return "ACTIVE";
  29        case UFS_SLEEP_PWR_MODE:        return "SLEEP";
  30        case UFS_POWERDOWN_PWR_MODE:    return "POWERDOWN";
  31        case UFS_DEEPSLEEP_PWR_MODE:    return "DEEPSLEEP";
  32        default:                        return "UNKNOWN";
  33        }
  34}
  35
  36static inline ssize_t ufs_sysfs_pm_lvl_store(struct device *dev,
  37                                             struct device_attribute *attr,
  38                                             const char *buf, size_t count,
  39                                             bool rpm)
  40{
  41        struct ufs_hba *hba = dev_get_drvdata(dev);
  42        struct ufs_dev_info *dev_info = &hba->dev_info;
  43        unsigned long flags, value;
  44
  45        if (kstrtoul(buf, 0, &value))
  46                return -EINVAL;
  47
  48        if (value >= UFS_PM_LVL_MAX)
  49                return -EINVAL;
  50
  51        if (ufs_pm_lvl_states[value].dev_state == UFS_DEEPSLEEP_PWR_MODE &&
  52            (!(hba->caps & UFSHCD_CAP_DEEPSLEEP) ||
  53             !(dev_info->wspecversion >= 0x310)))
  54                return -EINVAL;
  55
  56        spin_lock_irqsave(hba->host->host_lock, flags);
  57        if (rpm)
  58                hba->rpm_lvl = value;
  59        else
  60                hba->spm_lvl = value;
  61        spin_unlock_irqrestore(hba->host->host_lock, flags);
  62        return count;
  63}
  64
  65static ssize_t rpm_lvl_show(struct device *dev,
  66                struct device_attribute *attr, char *buf)
  67{
  68        struct ufs_hba *hba = dev_get_drvdata(dev);
  69
  70        return sysfs_emit(buf, "%d\n", hba->rpm_lvl);
  71}
  72
  73static ssize_t rpm_lvl_store(struct device *dev,
  74                struct device_attribute *attr, const char *buf, size_t count)
  75{
  76        return ufs_sysfs_pm_lvl_store(dev, attr, buf, count, true);
  77}
  78
  79static ssize_t rpm_target_dev_state_show(struct device *dev,
  80                struct device_attribute *attr, char *buf)
  81{
  82        struct ufs_hba *hba = dev_get_drvdata(dev);
  83
  84        return sysfs_emit(buf, "%s\n", ufshcd_ufs_dev_pwr_mode_to_string(
  85                        ufs_pm_lvl_states[hba->rpm_lvl].dev_state));
  86}
  87
  88static ssize_t rpm_target_link_state_show(struct device *dev,
  89                struct device_attribute *attr, char *buf)
  90{
  91        struct ufs_hba *hba = dev_get_drvdata(dev);
  92
  93        return sysfs_emit(buf, "%s\n", ufshcd_uic_link_state_to_string(
  94                        ufs_pm_lvl_states[hba->rpm_lvl].link_state));
  95}
  96
  97static ssize_t spm_lvl_show(struct device *dev,
  98                struct device_attribute *attr, char *buf)
  99{
 100        struct ufs_hba *hba = dev_get_drvdata(dev);
 101
 102        return sysfs_emit(buf, "%d\n", hba->spm_lvl);
 103}
 104
 105static ssize_t spm_lvl_store(struct device *dev,
 106                struct device_attribute *attr, const char *buf, size_t count)
 107{
 108        return ufs_sysfs_pm_lvl_store(dev, attr, buf, count, false);
 109}
 110
 111static ssize_t spm_target_dev_state_show(struct device *dev,
 112                struct device_attribute *attr, char *buf)
 113{
 114        struct ufs_hba *hba = dev_get_drvdata(dev);
 115
 116        return sysfs_emit(buf, "%s\n", ufshcd_ufs_dev_pwr_mode_to_string(
 117                                ufs_pm_lvl_states[hba->spm_lvl].dev_state));
 118}
 119
 120static ssize_t spm_target_link_state_show(struct device *dev,
 121                struct device_attribute *attr, char *buf)
 122{
 123        struct ufs_hba *hba = dev_get_drvdata(dev);
 124
 125        return sysfs_emit(buf, "%s\n", ufshcd_uic_link_state_to_string(
 126                                ufs_pm_lvl_states[hba->spm_lvl].link_state));
 127}
 128
 129/* Convert Auto-Hibernate Idle Timer register value to microseconds */
 130static int ufshcd_ahit_to_us(u32 ahit)
 131{
 132        int timer = FIELD_GET(UFSHCI_AHIBERN8_TIMER_MASK, ahit);
 133        int scale = FIELD_GET(UFSHCI_AHIBERN8_SCALE_MASK, ahit);
 134
 135        for (; scale > 0; --scale)
 136                timer *= UFSHCI_AHIBERN8_SCALE_FACTOR;
 137
 138        return timer;
 139}
 140
 141/* Convert microseconds to Auto-Hibernate Idle Timer register value */
 142static u32 ufshcd_us_to_ahit(unsigned int timer)
 143{
 144        unsigned int scale;
 145
 146        for (scale = 0; timer > UFSHCI_AHIBERN8_TIMER_MASK; ++scale)
 147                timer /= UFSHCI_AHIBERN8_SCALE_FACTOR;
 148
 149        return FIELD_PREP(UFSHCI_AHIBERN8_TIMER_MASK, timer) |
 150               FIELD_PREP(UFSHCI_AHIBERN8_SCALE_MASK, scale);
 151}
 152
 153static ssize_t auto_hibern8_show(struct device *dev,
 154                                 struct device_attribute *attr, char *buf)
 155{
 156        u32 ahit;
 157        int ret;
 158        struct ufs_hba *hba = dev_get_drvdata(dev);
 159
 160        if (!ufshcd_is_auto_hibern8_supported(hba))
 161                return -EOPNOTSUPP;
 162
 163        down(&hba->host_sem);
 164        if (!ufshcd_is_user_access_allowed(hba)) {
 165                ret = -EBUSY;
 166                goto out;
 167        }
 168
 169        pm_runtime_get_sync(hba->dev);
 170        ufshcd_hold(hba, false);
 171        ahit = ufshcd_readl(hba, REG_AUTO_HIBERNATE_IDLE_TIMER);
 172        ufshcd_release(hba);
 173        pm_runtime_put_sync(hba->dev);
 174
 175        ret = sysfs_emit(buf, "%d\n", ufshcd_ahit_to_us(ahit));
 176
 177out:
 178        up(&hba->host_sem);
 179        return ret;
 180}
 181
 182static ssize_t auto_hibern8_store(struct device *dev,
 183                                  struct device_attribute *attr,
 184                                  const char *buf, size_t count)
 185{
 186        struct ufs_hba *hba = dev_get_drvdata(dev);
 187        unsigned int timer;
 188        int ret = 0;
 189
 190        if (!ufshcd_is_auto_hibern8_supported(hba))
 191                return -EOPNOTSUPP;
 192
 193        if (kstrtouint(buf, 0, &timer))
 194                return -EINVAL;
 195
 196        if (timer > UFSHCI_AHIBERN8_MAX)
 197                return -EINVAL;
 198
 199        down(&hba->host_sem);
 200        if (!ufshcd_is_user_access_allowed(hba)) {
 201                ret = -EBUSY;
 202                goto out;
 203        }
 204
 205        ufshcd_auto_hibern8_update(hba, ufshcd_us_to_ahit(timer));
 206
 207out:
 208        up(&hba->host_sem);
 209        return ret ? ret : count;
 210}
 211
 212static ssize_t wb_on_show(struct device *dev, struct device_attribute *attr,
 213                          char *buf)
 214{
 215        struct ufs_hba *hba = dev_get_drvdata(dev);
 216
 217        return sysfs_emit(buf, "%d\n", hba->dev_info.wb_enabled);
 218}
 219
 220static ssize_t wb_on_store(struct device *dev, struct device_attribute *attr,
 221                           const char *buf, size_t count)
 222{
 223        struct ufs_hba *hba = dev_get_drvdata(dev);
 224        unsigned int wb_enable;
 225        ssize_t res;
 226
 227        if (!ufshcd_is_wb_allowed(hba) || ufshcd_is_clkscaling_supported(hba)) {
 228                /*
 229                 * If the platform supports UFSHCD_CAP_CLK_SCALING, turn WB
 230                 * on/off will be done while clock scaling up/down.
 231                 */
 232                dev_warn(dev, "To control WB through wb_on is not allowed!\n");
 233                return -EOPNOTSUPP;
 234        }
 235
 236        if (kstrtouint(buf, 0, &wb_enable))
 237                return -EINVAL;
 238
 239        if (wb_enable != 0 && wb_enable != 1)
 240                return -EINVAL;
 241
 242        down(&hba->host_sem);
 243        if (!ufshcd_is_user_access_allowed(hba)) {
 244                res = -EBUSY;
 245                goto out;
 246        }
 247
 248        pm_runtime_get_sync(hba->dev);
 249        res = ufshcd_wb_toggle(hba, wb_enable);
 250        pm_runtime_put_sync(hba->dev);
 251out:
 252        up(&hba->host_sem);
 253        return res < 0 ? res : count;
 254}
 255
 256static DEVICE_ATTR_RW(rpm_lvl);
 257static DEVICE_ATTR_RO(rpm_target_dev_state);
 258static DEVICE_ATTR_RO(rpm_target_link_state);
 259static DEVICE_ATTR_RW(spm_lvl);
 260static DEVICE_ATTR_RO(spm_target_dev_state);
 261static DEVICE_ATTR_RO(spm_target_link_state);
 262static DEVICE_ATTR_RW(auto_hibern8);
 263static DEVICE_ATTR_RW(wb_on);
 264
 265static struct attribute *ufs_sysfs_ufshcd_attrs[] = {
 266        &dev_attr_rpm_lvl.attr,
 267        &dev_attr_rpm_target_dev_state.attr,
 268        &dev_attr_rpm_target_link_state.attr,
 269        &dev_attr_spm_lvl.attr,
 270        &dev_attr_spm_target_dev_state.attr,
 271        &dev_attr_spm_target_link_state.attr,
 272        &dev_attr_auto_hibern8.attr,
 273        &dev_attr_wb_on.attr,
 274        NULL
 275};
 276
 277static const struct attribute_group ufs_sysfs_default_group = {
 278        .attrs = ufs_sysfs_ufshcd_attrs,
 279};
 280
 281static ssize_t ufs_sysfs_read_desc_param(struct ufs_hba *hba,
 282                                  enum desc_idn desc_id,
 283                                  u8 desc_index,
 284                                  u8 param_offset,
 285                                  u8 *sysfs_buf,
 286                                  u8 param_size)
 287{
 288        u8 desc_buf[8] = {0};
 289        int ret;
 290
 291        if (param_size > 8)
 292                return -EINVAL;
 293
 294        down(&hba->host_sem);
 295        if (!ufshcd_is_user_access_allowed(hba)) {
 296                ret = -EBUSY;
 297                goto out;
 298        }
 299
 300        pm_runtime_get_sync(hba->dev);
 301        ret = ufshcd_read_desc_param(hba, desc_id, desc_index,
 302                                param_offset, desc_buf, param_size);
 303        pm_runtime_put_sync(hba->dev);
 304        if (ret) {
 305                ret = -EINVAL;
 306                goto out;
 307        }
 308
 309        switch (param_size) {
 310        case 1:
 311                ret = sysfs_emit(sysfs_buf, "0x%02X\n", *desc_buf);
 312                break;
 313        case 2:
 314                ret = sysfs_emit(sysfs_buf, "0x%04X\n",
 315                        get_unaligned_be16(desc_buf));
 316                break;
 317        case 4:
 318                ret = sysfs_emit(sysfs_buf, "0x%08X\n",
 319                        get_unaligned_be32(desc_buf));
 320                break;
 321        case 8:
 322                ret = sysfs_emit(sysfs_buf, "0x%016llX\n",
 323                        get_unaligned_be64(desc_buf));
 324                break;
 325        }
 326
 327out:
 328        up(&hba->host_sem);
 329        return ret;
 330}
 331
 332#define UFS_DESC_PARAM(_name, _puname, _duname, _size)                  \
 333static ssize_t _name##_show(struct device *dev,                         \
 334        struct device_attribute *attr, char *buf)                       \
 335{                                                                       \
 336        struct ufs_hba *hba = dev_get_drvdata(dev);                     \
 337        return ufs_sysfs_read_desc_param(hba, QUERY_DESC_IDN_##_duname, \
 338                0, _duname##_DESC_PARAM##_puname, buf, _size);          \
 339}                                                                       \
 340static DEVICE_ATTR_RO(_name)
 341
 342#define UFS_DEVICE_DESC_PARAM(_name, _uname, _size)                     \
 343        UFS_DESC_PARAM(_name, _uname, DEVICE, _size)
 344
 345UFS_DEVICE_DESC_PARAM(device_type, _DEVICE_TYPE, 1);
 346UFS_DEVICE_DESC_PARAM(device_class, _DEVICE_CLASS, 1);
 347UFS_DEVICE_DESC_PARAM(device_sub_class, _DEVICE_SUB_CLASS, 1);
 348UFS_DEVICE_DESC_PARAM(protocol, _PRTCL, 1);
 349UFS_DEVICE_DESC_PARAM(number_of_luns, _NUM_LU, 1);
 350UFS_DEVICE_DESC_PARAM(number_of_wluns, _NUM_WLU, 1);
 351UFS_DEVICE_DESC_PARAM(boot_enable, _BOOT_ENBL, 1);
 352UFS_DEVICE_DESC_PARAM(descriptor_access_enable, _DESC_ACCSS_ENBL, 1);
 353UFS_DEVICE_DESC_PARAM(initial_power_mode, _INIT_PWR_MODE, 1);
 354UFS_DEVICE_DESC_PARAM(high_priority_lun, _HIGH_PR_LUN, 1);
 355UFS_DEVICE_DESC_PARAM(secure_removal_type, _SEC_RMV_TYPE, 1);
 356UFS_DEVICE_DESC_PARAM(support_security_lun, _SEC_LU, 1);
 357UFS_DEVICE_DESC_PARAM(bkops_termination_latency, _BKOP_TERM_LT, 1);
 358UFS_DEVICE_DESC_PARAM(initial_active_icc_level, _ACTVE_ICC_LVL, 1);
 359UFS_DEVICE_DESC_PARAM(specification_version, _SPEC_VER, 2);
 360UFS_DEVICE_DESC_PARAM(manufacturing_date, _MANF_DATE, 2);
 361UFS_DEVICE_DESC_PARAM(manufacturer_id, _MANF_ID, 2);
 362UFS_DEVICE_DESC_PARAM(rtt_capability, _RTT_CAP, 1);
 363UFS_DEVICE_DESC_PARAM(rtc_update, _FRQ_RTC, 2);
 364UFS_DEVICE_DESC_PARAM(ufs_features, _UFS_FEAT, 1);
 365UFS_DEVICE_DESC_PARAM(ffu_timeout, _FFU_TMT, 1);
 366UFS_DEVICE_DESC_PARAM(queue_depth, _Q_DPTH, 1);
 367UFS_DEVICE_DESC_PARAM(device_version, _DEV_VER, 2);
 368UFS_DEVICE_DESC_PARAM(number_of_secure_wpa, _NUM_SEC_WPA, 1);
 369UFS_DEVICE_DESC_PARAM(psa_max_data_size, _PSA_MAX_DATA, 4);
 370UFS_DEVICE_DESC_PARAM(psa_state_timeout, _PSA_TMT, 1);
 371UFS_DEVICE_DESC_PARAM(ext_feature_sup, _EXT_UFS_FEATURE_SUP, 4);
 372UFS_DEVICE_DESC_PARAM(wb_presv_us_en, _WB_PRESRV_USRSPC_EN, 1);
 373UFS_DEVICE_DESC_PARAM(wb_type, _WB_TYPE, 1);
 374UFS_DEVICE_DESC_PARAM(wb_shared_alloc_units, _WB_SHARED_ALLOC_UNITS, 4);
 375
 376static struct attribute *ufs_sysfs_device_descriptor[] = {
 377        &dev_attr_device_type.attr,
 378        &dev_attr_device_class.attr,
 379        &dev_attr_device_sub_class.attr,
 380        &dev_attr_protocol.attr,
 381        &dev_attr_number_of_luns.attr,
 382        &dev_attr_number_of_wluns.attr,
 383        &dev_attr_boot_enable.attr,
 384        &dev_attr_descriptor_access_enable.attr,
 385        &dev_attr_initial_power_mode.attr,
 386        &dev_attr_high_priority_lun.attr,
 387        &dev_attr_secure_removal_type.attr,
 388        &dev_attr_support_security_lun.attr,
 389        &dev_attr_bkops_termination_latency.attr,
 390        &dev_attr_initial_active_icc_level.attr,
 391        &dev_attr_specification_version.attr,
 392        &dev_attr_manufacturing_date.attr,
 393        &dev_attr_manufacturer_id.attr,
 394        &dev_attr_rtt_capability.attr,
 395        &dev_attr_rtc_update.attr,
 396        &dev_attr_ufs_features.attr,
 397        &dev_attr_ffu_timeout.attr,
 398        &dev_attr_queue_depth.attr,
 399        &dev_attr_device_version.attr,
 400        &dev_attr_number_of_secure_wpa.attr,
 401        &dev_attr_psa_max_data_size.attr,
 402        &dev_attr_psa_state_timeout.attr,
 403        &dev_attr_ext_feature_sup.attr,
 404        &dev_attr_wb_presv_us_en.attr,
 405        &dev_attr_wb_type.attr,
 406        &dev_attr_wb_shared_alloc_units.attr,
 407        NULL,
 408};
 409
 410static const struct attribute_group ufs_sysfs_device_descriptor_group = {
 411        .name = "device_descriptor",
 412        .attrs = ufs_sysfs_device_descriptor,
 413};
 414
 415#define UFS_INTERCONNECT_DESC_PARAM(_name, _uname, _size)               \
 416        UFS_DESC_PARAM(_name, _uname, INTERCONNECT, _size)
 417
 418UFS_INTERCONNECT_DESC_PARAM(unipro_version, _UNIPRO_VER, 2);
 419UFS_INTERCONNECT_DESC_PARAM(mphy_version, _MPHY_VER, 2);
 420
 421static struct attribute *ufs_sysfs_interconnect_descriptor[] = {
 422        &dev_attr_unipro_version.attr,
 423        &dev_attr_mphy_version.attr,
 424        NULL,
 425};
 426
 427static const struct attribute_group ufs_sysfs_interconnect_descriptor_group = {
 428        .name = "interconnect_descriptor",
 429        .attrs = ufs_sysfs_interconnect_descriptor,
 430};
 431
 432#define UFS_GEOMETRY_DESC_PARAM(_name, _uname, _size)                   \
 433        UFS_DESC_PARAM(_name, _uname, GEOMETRY, _size)
 434
 435UFS_GEOMETRY_DESC_PARAM(raw_device_capacity, _DEV_CAP, 8);
 436UFS_GEOMETRY_DESC_PARAM(max_number_of_luns, _MAX_NUM_LUN, 1);
 437UFS_GEOMETRY_DESC_PARAM(segment_size, _SEG_SIZE, 4);
 438UFS_GEOMETRY_DESC_PARAM(allocation_unit_size, _ALLOC_UNIT_SIZE, 1);
 439UFS_GEOMETRY_DESC_PARAM(min_addressable_block_size, _MIN_BLK_SIZE, 1);
 440UFS_GEOMETRY_DESC_PARAM(optimal_read_block_size, _OPT_RD_BLK_SIZE, 1);
 441UFS_GEOMETRY_DESC_PARAM(optimal_write_block_size, _OPT_WR_BLK_SIZE, 1);
 442UFS_GEOMETRY_DESC_PARAM(max_in_buffer_size, _MAX_IN_BUF_SIZE, 1);
 443UFS_GEOMETRY_DESC_PARAM(max_out_buffer_size, _MAX_OUT_BUF_SIZE, 1);
 444UFS_GEOMETRY_DESC_PARAM(rpmb_rw_size, _RPMB_RW_SIZE, 1);
 445UFS_GEOMETRY_DESC_PARAM(dyn_capacity_resource_policy, _DYN_CAP_RSRC_PLC, 1);
 446UFS_GEOMETRY_DESC_PARAM(data_ordering, _DATA_ORDER, 1);
 447UFS_GEOMETRY_DESC_PARAM(max_number_of_contexts, _MAX_NUM_CTX, 1);
 448UFS_GEOMETRY_DESC_PARAM(sys_data_tag_unit_size, _TAG_UNIT_SIZE, 1);
 449UFS_GEOMETRY_DESC_PARAM(sys_data_tag_resource_size, _TAG_RSRC_SIZE, 1);
 450UFS_GEOMETRY_DESC_PARAM(secure_removal_types, _SEC_RM_TYPES, 1);
 451UFS_GEOMETRY_DESC_PARAM(memory_types, _MEM_TYPES, 2);
 452UFS_GEOMETRY_DESC_PARAM(sys_code_memory_max_alloc_units,
 453        _SCM_MAX_NUM_UNITS, 4);
 454UFS_GEOMETRY_DESC_PARAM(sys_code_memory_capacity_adjustment_factor,
 455        _SCM_CAP_ADJ_FCTR, 2);
 456UFS_GEOMETRY_DESC_PARAM(non_persist_memory_max_alloc_units,
 457        _NPM_MAX_NUM_UNITS, 4);
 458UFS_GEOMETRY_DESC_PARAM(non_persist_memory_capacity_adjustment_factor,
 459        _NPM_CAP_ADJ_FCTR, 2);
 460UFS_GEOMETRY_DESC_PARAM(enh1_memory_max_alloc_units,
 461        _ENM1_MAX_NUM_UNITS, 4);
 462UFS_GEOMETRY_DESC_PARAM(enh1_memory_capacity_adjustment_factor,
 463        _ENM1_CAP_ADJ_FCTR, 2);
 464UFS_GEOMETRY_DESC_PARAM(enh2_memory_max_alloc_units,
 465        _ENM2_MAX_NUM_UNITS, 4);
 466UFS_GEOMETRY_DESC_PARAM(enh2_memory_capacity_adjustment_factor,
 467        _ENM2_CAP_ADJ_FCTR, 2);
 468UFS_GEOMETRY_DESC_PARAM(enh3_memory_max_alloc_units,
 469        _ENM3_MAX_NUM_UNITS, 4);
 470UFS_GEOMETRY_DESC_PARAM(enh3_memory_capacity_adjustment_factor,
 471        _ENM3_CAP_ADJ_FCTR, 2);
 472UFS_GEOMETRY_DESC_PARAM(enh4_memory_max_alloc_units,
 473        _ENM4_MAX_NUM_UNITS, 4);
 474UFS_GEOMETRY_DESC_PARAM(enh4_memory_capacity_adjustment_factor,
 475        _ENM4_CAP_ADJ_FCTR, 2);
 476UFS_GEOMETRY_DESC_PARAM(wb_max_alloc_units, _WB_MAX_ALLOC_UNITS, 4);
 477UFS_GEOMETRY_DESC_PARAM(wb_max_wb_luns, _WB_MAX_WB_LUNS, 1);
 478UFS_GEOMETRY_DESC_PARAM(wb_buff_cap_adj, _WB_BUFF_CAP_ADJ, 1);
 479UFS_GEOMETRY_DESC_PARAM(wb_sup_red_type, _WB_SUP_RED_TYPE, 1);
 480UFS_GEOMETRY_DESC_PARAM(wb_sup_wb_type, _WB_SUP_WB_TYPE, 1);
 481
 482
 483static struct attribute *ufs_sysfs_geometry_descriptor[] = {
 484        &dev_attr_raw_device_capacity.attr,
 485        &dev_attr_max_number_of_luns.attr,
 486        &dev_attr_segment_size.attr,
 487        &dev_attr_allocation_unit_size.attr,
 488        &dev_attr_min_addressable_block_size.attr,
 489        &dev_attr_optimal_read_block_size.attr,
 490        &dev_attr_optimal_write_block_size.attr,
 491        &dev_attr_max_in_buffer_size.attr,
 492        &dev_attr_max_out_buffer_size.attr,
 493        &dev_attr_rpmb_rw_size.attr,
 494        &dev_attr_dyn_capacity_resource_policy.attr,
 495        &dev_attr_data_ordering.attr,
 496        &dev_attr_max_number_of_contexts.attr,
 497        &dev_attr_sys_data_tag_unit_size.attr,
 498        &dev_attr_sys_data_tag_resource_size.attr,
 499        &dev_attr_secure_removal_types.attr,
 500        &dev_attr_memory_types.attr,
 501        &dev_attr_sys_code_memory_max_alloc_units.attr,
 502        &dev_attr_sys_code_memory_capacity_adjustment_factor.attr,
 503        &dev_attr_non_persist_memory_max_alloc_units.attr,
 504        &dev_attr_non_persist_memory_capacity_adjustment_factor.attr,
 505        &dev_attr_enh1_memory_max_alloc_units.attr,
 506        &dev_attr_enh1_memory_capacity_adjustment_factor.attr,
 507        &dev_attr_enh2_memory_max_alloc_units.attr,
 508        &dev_attr_enh2_memory_capacity_adjustment_factor.attr,
 509        &dev_attr_enh3_memory_max_alloc_units.attr,
 510        &dev_attr_enh3_memory_capacity_adjustment_factor.attr,
 511        &dev_attr_enh4_memory_max_alloc_units.attr,
 512        &dev_attr_enh4_memory_capacity_adjustment_factor.attr,
 513        &dev_attr_wb_max_alloc_units.attr,
 514        &dev_attr_wb_max_wb_luns.attr,
 515        &dev_attr_wb_buff_cap_adj.attr,
 516        &dev_attr_wb_sup_red_type.attr,
 517        &dev_attr_wb_sup_wb_type.attr,
 518        NULL,
 519};
 520
 521static const struct attribute_group ufs_sysfs_geometry_descriptor_group = {
 522        .name = "geometry_descriptor",
 523        .attrs = ufs_sysfs_geometry_descriptor,
 524};
 525
 526#define UFS_HEALTH_DESC_PARAM(_name, _uname, _size)                     \
 527        UFS_DESC_PARAM(_name, _uname, HEALTH, _size)
 528
 529UFS_HEALTH_DESC_PARAM(eol_info, _EOL_INFO, 1);
 530UFS_HEALTH_DESC_PARAM(life_time_estimation_a, _LIFE_TIME_EST_A, 1);
 531UFS_HEALTH_DESC_PARAM(life_time_estimation_b, _LIFE_TIME_EST_B, 1);
 532
 533static struct attribute *ufs_sysfs_health_descriptor[] = {
 534        &dev_attr_eol_info.attr,
 535        &dev_attr_life_time_estimation_a.attr,
 536        &dev_attr_life_time_estimation_b.attr,
 537        NULL,
 538};
 539
 540static const struct attribute_group ufs_sysfs_health_descriptor_group = {
 541        .name = "health_descriptor",
 542        .attrs = ufs_sysfs_health_descriptor,
 543};
 544
 545#define UFS_POWER_DESC_PARAM(_name, _uname, _index)                     \
 546static ssize_t _name##_index##_show(struct device *dev,                 \
 547        struct device_attribute *attr, char *buf)                       \
 548{                                                                       \
 549        struct ufs_hba *hba = dev_get_drvdata(dev);                     \
 550        return ufs_sysfs_read_desc_param(hba, QUERY_DESC_IDN_POWER, 0,  \
 551                PWR_DESC##_uname##_0 + _index * 2, buf, 2);             \
 552}                                                                       \
 553static DEVICE_ATTR_RO(_name##_index)
 554
 555UFS_POWER_DESC_PARAM(active_icc_levels_vcc, _ACTIVE_LVLS_VCC, 0);
 556UFS_POWER_DESC_PARAM(active_icc_levels_vcc, _ACTIVE_LVLS_VCC, 1);
 557UFS_POWER_DESC_PARAM(active_icc_levels_vcc, _ACTIVE_LVLS_VCC, 2);
 558UFS_POWER_DESC_PARAM(active_icc_levels_vcc, _ACTIVE_LVLS_VCC, 3);
 559UFS_POWER_DESC_PARAM(active_icc_levels_vcc, _ACTIVE_LVLS_VCC, 4);
 560UFS_POWER_DESC_PARAM(active_icc_levels_vcc, _ACTIVE_LVLS_VCC, 5);
 561UFS_POWER_DESC_PARAM(active_icc_levels_vcc, _ACTIVE_LVLS_VCC, 6);
 562UFS_POWER_DESC_PARAM(active_icc_levels_vcc, _ACTIVE_LVLS_VCC, 7);
 563UFS_POWER_DESC_PARAM(active_icc_levels_vcc, _ACTIVE_LVLS_VCC, 8);
 564UFS_POWER_DESC_PARAM(active_icc_levels_vcc, _ACTIVE_LVLS_VCC, 9);
 565UFS_POWER_DESC_PARAM(active_icc_levels_vcc, _ACTIVE_LVLS_VCC, 10);
 566UFS_POWER_DESC_PARAM(active_icc_levels_vcc, _ACTIVE_LVLS_VCC, 11);
 567UFS_POWER_DESC_PARAM(active_icc_levels_vcc, _ACTIVE_LVLS_VCC, 12);
 568UFS_POWER_DESC_PARAM(active_icc_levels_vcc, _ACTIVE_LVLS_VCC, 13);
 569UFS_POWER_DESC_PARAM(active_icc_levels_vcc, _ACTIVE_LVLS_VCC, 14);
 570UFS_POWER_DESC_PARAM(active_icc_levels_vcc, _ACTIVE_LVLS_VCC, 15);
 571UFS_POWER_DESC_PARAM(active_icc_levels_vccq, _ACTIVE_LVLS_VCCQ, 0);
 572UFS_POWER_DESC_PARAM(active_icc_levels_vccq, _ACTIVE_LVLS_VCCQ, 1);
 573UFS_POWER_DESC_PARAM(active_icc_levels_vccq, _ACTIVE_LVLS_VCCQ, 2);
 574UFS_POWER_DESC_PARAM(active_icc_levels_vccq, _ACTIVE_LVLS_VCCQ, 3);
 575UFS_POWER_DESC_PARAM(active_icc_levels_vccq, _ACTIVE_LVLS_VCCQ, 4);
 576UFS_POWER_DESC_PARAM(active_icc_levels_vccq, _ACTIVE_LVLS_VCCQ, 5);
 577UFS_POWER_DESC_PARAM(active_icc_levels_vccq, _ACTIVE_LVLS_VCCQ, 6);
 578UFS_POWER_DESC_PARAM(active_icc_levels_vccq, _ACTIVE_LVLS_VCCQ, 7);
 579UFS_POWER_DESC_PARAM(active_icc_levels_vccq, _ACTIVE_LVLS_VCCQ, 8);
 580UFS_POWER_DESC_PARAM(active_icc_levels_vccq, _ACTIVE_LVLS_VCCQ, 9);
 581UFS_POWER_DESC_PARAM(active_icc_levels_vccq, _ACTIVE_LVLS_VCCQ, 10);
 582UFS_POWER_DESC_PARAM(active_icc_levels_vccq, _ACTIVE_LVLS_VCCQ, 11);
 583UFS_POWER_DESC_PARAM(active_icc_levels_vccq, _ACTIVE_LVLS_VCCQ, 12);
 584UFS_POWER_DESC_PARAM(active_icc_levels_vccq, _ACTIVE_LVLS_VCCQ, 13);
 585UFS_POWER_DESC_PARAM(active_icc_levels_vccq, _ACTIVE_LVLS_VCCQ, 14);
 586UFS_POWER_DESC_PARAM(active_icc_levels_vccq, _ACTIVE_LVLS_VCCQ, 15);
 587UFS_POWER_DESC_PARAM(active_icc_levels_vccq2, _ACTIVE_LVLS_VCCQ2, 0);
 588UFS_POWER_DESC_PARAM(active_icc_levels_vccq2, _ACTIVE_LVLS_VCCQ2, 1);
 589UFS_POWER_DESC_PARAM(active_icc_levels_vccq2, _ACTIVE_LVLS_VCCQ2, 2);
 590UFS_POWER_DESC_PARAM(active_icc_levels_vccq2, _ACTIVE_LVLS_VCCQ2, 3);
 591UFS_POWER_DESC_PARAM(active_icc_levels_vccq2, _ACTIVE_LVLS_VCCQ2, 4);
 592UFS_POWER_DESC_PARAM(active_icc_levels_vccq2, _ACTIVE_LVLS_VCCQ2, 5);
 593UFS_POWER_DESC_PARAM(active_icc_levels_vccq2, _ACTIVE_LVLS_VCCQ2, 6);
 594UFS_POWER_DESC_PARAM(active_icc_levels_vccq2, _ACTIVE_LVLS_VCCQ2, 7);
 595UFS_POWER_DESC_PARAM(active_icc_levels_vccq2, _ACTIVE_LVLS_VCCQ2, 8);
 596UFS_POWER_DESC_PARAM(active_icc_levels_vccq2, _ACTIVE_LVLS_VCCQ2, 9);
 597UFS_POWER_DESC_PARAM(active_icc_levels_vccq2, _ACTIVE_LVLS_VCCQ2, 10);
 598UFS_POWER_DESC_PARAM(active_icc_levels_vccq2, _ACTIVE_LVLS_VCCQ2, 11);
 599UFS_POWER_DESC_PARAM(active_icc_levels_vccq2, _ACTIVE_LVLS_VCCQ2, 12);
 600UFS_POWER_DESC_PARAM(active_icc_levels_vccq2, _ACTIVE_LVLS_VCCQ2, 13);
 601UFS_POWER_DESC_PARAM(active_icc_levels_vccq2, _ACTIVE_LVLS_VCCQ2, 14);
 602UFS_POWER_DESC_PARAM(active_icc_levels_vccq2, _ACTIVE_LVLS_VCCQ2, 15);
 603
 604static struct attribute *ufs_sysfs_power_descriptor[] = {
 605        &dev_attr_active_icc_levels_vcc0.attr,
 606        &dev_attr_active_icc_levels_vcc1.attr,
 607        &dev_attr_active_icc_levels_vcc2.attr,
 608        &dev_attr_active_icc_levels_vcc3.attr,
 609        &dev_attr_active_icc_levels_vcc4.attr,
 610        &dev_attr_active_icc_levels_vcc5.attr,
 611        &dev_attr_active_icc_levels_vcc6.attr,
 612        &dev_attr_active_icc_levels_vcc7.attr,
 613        &dev_attr_active_icc_levels_vcc8.attr,
 614        &dev_attr_active_icc_levels_vcc9.attr,
 615        &dev_attr_active_icc_levels_vcc10.attr,
 616        &dev_attr_active_icc_levels_vcc11.attr,
 617        &dev_attr_active_icc_levels_vcc12.attr,
 618        &dev_attr_active_icc_levels_vcc13.attr,
 619        &dev_attr_active_icc_levels_vcc14.attr,
 620        &dev_attr_active_icc_levels_vcc15.attr,
 621        &dev_attr_active_icc_levels_vccq0.attr,
 622        &dev_attr_active_icc_levels_vccq1.attr,
 623        &dev_attr_active_icc_levels_vccq2.attr,
 624        &dev_attr_active_icc_levels_vccq3.attr,
 625        &dev_attr_active_icc_levels_vccq4.attr,
 626        &dev_attr_active_icc_levels_vccq5.attr,
 627        &dev_attr_active_icc_levels_vccq6.attr,
 628        &dev_attr_active_icc_levels_vccq7.attr,
 629        &dev_attr_active_icc_levels_vccq8.attr,
 630        &dev_attr_active_icc_levels_vccq9.attr,
 631        &dev_attr_active_icc_levels_vccq10.attr,
 632        &dev_attr_active_icc_levels_vccq11.attr,
 633        &dev_attr_active_icc_levels_vccq12.attr,
 634        &dev_attr_active_icc_levels_vccq13.attr,
 635        &dev_attr_active_icc_levels_vccq14.attr,
 636        &dev_attr_active_icc_levels_vccq15.attr,
 637        &dev_attr_active_icc_levels_vccq20.attr,
 638        &dev_attr_active_icc_levels_vccq21.attr,
 639        &dev_attr_active_icc_levels_vccq22.attr,
 640        &dev_attr_active_icc_levels_vccq23.attr,
 641        &dev_attr_active_icc_levels_vccq24.attr,
 642        &dev_attr_active_icc_levels_vccq25.attr,
 643        &dev_attr_active_icc_levels_vccq26.attr,
 644        &dev_attr_active_icc_levels_vccq27.attr,
 645        &dev_attr_active_icc_levels_vccq28.attr,
 646        &dev_attr_active_icc_levels_vccq29.attr,
 647        &dev_attr_active_icc_levels_vccq210.attr,
 648        &dev_attr_active_icc_levels_vccq211.attr,
 649        &dev_attr_active_icc_levels_vccq212.attr,
 650        &dev_attr_active_icc_levels_vccq213.attr,
 651        &dev_attr_active_icc_levels_vccq214.attr,
 652        &dev_attr_active_icc_levels_vccq215.attr,
 653        NULL,
 654};
 655
 656static const struct attribute_group ufs_sysfs_power_descriptor_group = {
 657        .name = "power_descriptor",
 658        .attrs = ufs_sysfs_power_descriptor,
 659};
 660
 661#define UFS_STRING_DESCRIPTOR(_name, _pname)                            \
 662static ssize_t _name##_show(struct device *dev,                         \
 663        struct device_attribute *attr, char *buf)                       \
 664{                                                                       \
 665        u8 index;                                                       \
 666        struct ufs_hba *hba = dev_get_drvdata(dev);                     \
 667        int ret;                                                        \
 668        int desc_len = QUERY_DESC_MAX_SIZE;                             \
 669        u8 *desc_buf;                                                   \
 670                                                                        \
 671        down(&hba->host_sem);                                           \
 672        if (!ufshcd_is_user_access_allowed(hba)) {                      \
 673                up(&hba->host_sem);                                     \
 674                return -EBUSY;                                          \
 675        }                                                               \
 676        desc_buf = kzalloc(QUERY_DESC_MAX_SIZE, GFP_ATOMIC);            \
 677        if (!desc_buf) {                                                \
 678                up(&hba->host_sem);                                     \
 679                return -ENOMEM;                                         \
 680        }                                                               \
 681        pm_runtime_get_sync(hba->dev);                                  \
 682        ret = ufshcd_query_descriptor_retry(hba,                        \
 683                UPIU_QUERY_OPCODE_READ_DESC, QUERY_DESC_IDN_DEVICE,     \
 684                0, 0, desc_buf, &desc_len);                             \
 685        if (ret) {                                                      \
 686                ret = -EINVAL;                                          \
 687                goto out;                                               \
 688        }                                                               \
 689        index = desc_buf[DEVICE_DESC_PARAM##_pname];                    \
 690        kfree(desc_buf);                                                \
 691        desc_buf = NULL;                                                \
 692        ret = ufshcd_read_string_desc(hba, index, &desc_buf,            \
 693                                      SD_ASCII_STD);                    \
 694        if (ret < 0)                                                    \
 695                goto out;                                               \
 696        ret = sysfs_emit(buf, "%s\n", desc_buf);                        \
 697out:                                                                    \
 698        pm_runtime_put_sync(hba->dev);                                  \
 699        kfree(desc_buf);                                                \
 700        up(&hba->host_sem);                                             \
 701        return ret;                                                     \
 702}                                                                       \
 703static DEVICE_ATTR_RO(_name)
 704
 705UFS_STRING_DESCRIPTOR(manufacturer_name, _MANF_NAME);
 706UFS_STRING_DESCRIPTOR(product_name, _PRDCT_NAME);
 707UFS_STRING_DESCRIPTOR(oem_id, _OEM_ID);
 708UFS_STRING_DESCRIPTOR(serial_number, _SN);
 709UFS_STRING_DESCRIPTOR(product_revision, _PRDCT_REV);
 710
 711static struct attribute *ufs_sysfs_string_descriptors[] = {
 712        &dev_attr_manufacturer_name.attr,
 713        &dev_attr_product_name.attr,
 714        &dev_attr_oem_id.attr,
 715        &dev_attr_serial_number.attr,
 716        &dev_attr_product_revision.attr,
 717        NULL,
 718};
 719
 720static const struct attribute_group ufs_sysfs_string_descriptors_group = {
 721        .name = "string_descriptors",
 722        .attrs = ufs_sysfs_string_descriptors,
 723};
 724
 725static inline bool ufshcd_is_wb_flags(enum flag_idn idn)
 726{
 727        return ((idn >= QUERY_FLAG_IDN_WB_EN) &&
 728                (idn <= QUERY_FLAG_IDN_WB_BUFF_FLUSH_DURING_HIBERN8));
 729}
 730
 731#define UFS_FLAG(_name, _uname)                                         \
 732static ssize_t _name##_show(struct device *dev,                         \
 733        struct device_attribute *attr, char *buf)                       \
 734{                                                                       \
 735        bool flag;                                                      \
 736        u8 index = 0;                                                   \
 737        int ret;                                                        \
 738        struct ufs_hba *hba = dev_get_drvdata(dev);                     \
 739                                                                        \
 740        down(&hba->host_sem);                                           \
 741        if (!ufshcd_is_user_access_allowed(hba)) {                      \
 742                up(&hba->host_sem);                                     \
 743                return -EBUSY;                                          \
 744        }                                                               \
 745        if (ufshcd_is_wb_flags(QUERY_FLAG_IDN##_uname))                 \
 746                index = ufshcd_wb_get_query_index(hba);                 \
 747        pm_runtime_get_sync(hba->dev);                                  \
 748        ret = ufshcd_query_flag(hba, UPIU_QUERY_OPCODE_READ_FLAG,       \
 749                QUERY_FLAG_IDN##_uname, index, &flag);                  \
 750        pm_runtime_put_sync(hba->dev);                                  \
 751        if (ret) {                                                      \
 752                ret = -EINVAL;                                          \
 753                goto out;                                               \
 754        }                                                               \
 755        ret = sysfs_emit(buf, "%s\n", flag ? "true" : "false");         \
 756out:                                                                    \
 757        up(&hba->host_sem);                                             \
 758        return ret;                                                     \
 759}                                                                       \
 760static DEVICE_ATTR_RO(_name)
 761
 762UFS_FLAG(device_init, _FDEVICEINIT);
 763UFS_FLAG(permanent_wpe, _PERMANENT_WPE);
 764UFS_FLAG(power_on_wpe, _PWR_ON_WPE);
 765UFS_FLAG(bkops_enable, _BKOPS_EN);
 766UFS_FLAG(life_span_mode_enable, _LIFE_SPAN_MODE_ENABLE);
 767UFS_FLAG(phy_resource_removal, _FPHYRESOURCEREMOVAL);
 768UFS_FLAG(busy_rtc, _BUSY_RTC);
 769UFS_FLAG(disable_fw_update, _PERMANENTLY_DISABLE_FW_UPDATE);
 770UFS_FLAG(wb_enable, _WB_EN);
 771UFS_FLAG(wb_flush_en, _WB_BUFF_FLUSH_EN);
 772UFS_FLAG(wb_flush_during_h8, _WB_BUFF_FLUSH_DURING_HIBERN8);
 773
 774static struct attribute *ufs_sysfs_device_flags[] = {
 775        &dev_attr_device_init.attr,
 776        &dev_attr_permanent_wpe.attr,
 777        &dev_attr_power_on_wpe.attr,
 778        &dev_attr_bkops_enable.attr,
 779        &dev_attr_life_span_mode_enable.attr,
 780        &dev_attr_phy_resource_removal.attr,
 781        &dev_attr_busy_rtc.attr,
 782        &dev_attr_disable_fw_update.attr,
 783        &dev_attr_wb_enable.attr,
 784        &dev_attr_wb_flush_en.attr,
 785        &dev_attr_wb_flush_during_h8.attr,
 786        NULL,
 787};
 788
 789static const struct attribute_group ufs_sysfs_flags_group = {
 790        .name = "flags",
 791        .attrs = ufs_sysfs_device_flags,
 792};
 793
 794static inline bool ufshcd_is_wb_attrs(enum attr_idn idn)
 795{
 796        return ((idn >= QUERY_ATTR_IDN_WB_FLUSH_STATUS) &&
 797                (idn <= QUERY_ATTR_IDN_CURR_WB_BUFF_SIZE));
 798}
 799
 800#define UFS_ATTRIBUTE(_name, _uname)                                    \
 801static ssize_t _name##_show(struct device *dev,                         \
 802        struct device_attribute *attr, char *buf)                       \
 803{                                                                       \
 804        struct ufs_hba *hba = dev_get_drvdata(dev);                     \
 805        u32 value;                                                      \
 806        int ret;                                                        \
 807        u8 index = 0;                                                   \
 808                                                                        \
 809        down(&hba->host_sem);                                           \
 810        if (!ufshcd_is_user_access_allowed(hba)) {                      \
 811                up(&hba->host_sem);                                     \
 812                return -EBUSY;                                          \
 813        }                                                               \
 814        if (ufshcd_is_wb_attrs(QUERY_ATTR_IDN##_uname))                 \
 815                index = ufshcd_wb_get_query_index(hba);                 \
 816        pm_runtime_get_sync(hba->dev);                                  \
 817        ret = ufshcd_query_attr(hba, UPIU_QUERY_OPCODE_READ_ATTR,       \
 818                QUERY_ATTR_IDN##_uname, index, 0, &value);              \
 819        pm_runtime_put_sync(hba->dev);                                  \
 820        if (ret) {                                                      \
 821                ret = -EINVAL;                                          \
 822                goto out;                                               \
 823        }                                                               \
 824        ret = sysfs_emit(buf, "0x%08X\n", value);                       \
 825out:                                                                    \
 826        up(&hba->host_sem);                                             \
 827        return ret;                                                     \
 828}                                                                       \
 829static DEVICE_ATTR_RO(_name)
 830
 831UFS_ATTRIBUTE(boot_lun_enabled, _BOOT_LU_EN);
 832UFS_ATTRIBUTE(current_power_mode, _POWER_MODE);
 833UFS_ATTRIBUTE(active_icc_level, _ACTIVE_ICC_LVL);
 834UFS_ATTRIBUTE(ooo_data_enabled, _OOO_DATA_EN);
 835UFS_ATTRIBUTE(bkops_status, _BKOPS_STATUS);
 836UFS_ATTRIBUTE(purge_status, _PURGE_STATUS);
 837UFS_ATTRIBUTE(max_data_in_size, _MAX_DATA_IN);
 838UFS_ATTRIBUTE(max_data_out_size, _MAX_DATA_OUT);
 839UFS_ATTRIBUTE(reference_clock_frequency, _REF_CLK_FREQ);
 840UFS_ATTRIBUTE(configuration_descriptor_lock, _CONF_DESC_LOCK);
 841UFS_ATTRIBUTE(max_number_of_rtt, _MAX_NUM_OF_RTT);
 842UFS_ATTRIBUTE(exception_event_control, _EE_CONTROL);
 843UFS_ATTRIBUTE(exception_event_status, _EE_STATUS);
 844UFS_ATTRIBUTE(ffu_status, _FFU_STATUS);
 845UFS_ATTRIBUTE(psa_state, _PSA_STATE);
 846UFS_ATTRIBUTE(psa_data_size, _PSA_DATA_SIZE);
 847UFS_ATTRIBUTE(wb_flush_status, _WB_FLUSH_STATUS);
 848UFS_ATTRIBUTE(wb_avail_buf, _AVAIL_WB_BUFF_SIZE);
 849UFS_ATTRIBUTE(wb_life_time_est, _WB_BUFF_LIFE_TIME_EST);
 850UFS_ATTRIBUTE(wb_cur_buf, _CURR_WB_BUFF_SIZE);
 851
 852
 853static struct attribute *ufs_sysfs_attributes[] = {
 854        &dev_attr_boot_lun_enabled.attr,
 855        &dev_attr_current_power_mode.attr,
 856        &dev_attr_active_icc_level.attr,
 857        &dev_attr_ooo_data_enabled.attr,
 858        &dev_attr_bkops_status.attr,
 859        &dev_attr_purge_status.attr,
 860        &dev_attr_max_data_in_size.attr,
 861        &dev_attr_max_data_out_size.attr,
 862        &dev_attr_reference_clock_frequency.attr,
 863        &dev_attr_configuration_descriptor_lock.attr,
 864        &dev_attr_max_number_of_rtt.attr,
 865        &dev_attr_exception_event_control.attr,
 866        &dev_attr_exception_event_status.attr,
 867        &dev_attr_ffu_status.attr,
 868        &dev_attr_psa_state.attr,
 869        &dev_attr_psa_data_size.attr,
 870        &dev_attr_wb_flush_status.attr,
 871        &dev_attr_wb_avail_buf.attr,
 872        &dev_attr_wb_life_time_est.attr,
 873        &dev_attr_wb_cur_buf.attr,
 874        NULL,
 875};
 876
 877static const struct attribute_group ufs_sysfs_attributes_group = {
 878        .name = "attributes",
 879        .attrs = ufs_sysfs_attributes,
 880};
 881
 882static const struct attribute_group *ufs_sysfs_groups[] = {
 883        &ufs_sysfs_default_group,
 884        &ufs_sysfs_device_descriptor_group,
 885        &ufs_sysfs_interconnect_descriptor_group,
 886        &ufs_sysfs_geometry_descriptor_group,
 887        &ufs_sysfs_health_descriptor_group,
 888        &ufs_sysfs_power_descriptor_group,
 889        &ufs_sysfs_string_descriptors_group,
 890        &ufs_sysfs_flags_group,
 891        &ufs_sysfs_attributes_group,
 892        NULL,
 893};
 894
 895#define UFS_LUN_DESC_PARAM(_pname, _puname, _duname, _size)             \
 896static ssize_t _pname##_show(struct device *dev,                        \
 897        struct device_attribute *attr, char *buf)                       \
 898{                                                                       \
 899        struct scsi_device *sdev = to_scsi_device(dev);                 \
 900        struct ufs_hba *hba = shost_priv(sdev->host);                   \
 901        u8 lun = ufshcd_scsi_to_upiu_lun(sdev->lun);                    \
 902        if (!ufs_is_valid_unit_desc_lun(&hba->dev_info, lun,            \
 903                                _duname##_DESC_PARAM##_puname))         \
 904                return -EINVAL;                                         \
 905        return ufs_sysfs_read_desc_param(hba, QUERY_DESC_IDN_##_duname, \
 906                lun, _duname##_DESC_PARAM##_puname, buf, _size);        \
 907}                                                                       \
 908static DEVICE_ATTR_RO(_pname)
 909
 910#define UFS_UNIT_DESC_PARAM(_name, _uname, _size)                       \
 911        UFS_LUN_DESC_PARAM(_name, _uname, UNIT, _size)
 912
 913UFS_UNIT_DESC_PARAM(boot_lun_id, _BOOT_LUN_ID, 1);
 914UFS_UNIT_DESC_PARAM(lun_write_protect, _LU_WR_PROTECT, 1);
 915UFS_UNIT_DESC_PARAM(lun_queue_depth, _LU_Q_DEPTH, 1);
 916UFS_UNIT_DESC_PARAM(psa_sensitive, _PSA_SENSITIVE, 1);
 917UFS_UNIT_DESC_PARAM(lun_memory_type, _MEM_TYPE, 1);
 918UFS_UNIT_DESC_PARAM(data_reliability, _DATA_RELIABILITY, 1);
 919UFS_UNIT_DESC_PARAM(logical_block_size, _LOGICAL_BLK_SIZE, 1);
 920UFS_UNIT_DESC_PARAM(logical_block_count, _LOGICAL_BLK_COUNT, 8);
 921UFS_UNIT_DESC_PARAM(erase_block_size, _ERASE_BLK_SIZE, 4);
 922UFS_UNIT_DESC_PARAM(provisioning_type, _PROVISIONING_TYPE, 1);
 923UFS_UNIT_DESC_PARAM(physical_memory_resourse_count, _PHY_MEM_RSRC_CNT, 8);
 924UFS_UNIT_DESC_PARAM(context_capabilities, _CTX_CAPABILITIES, 2);
 925UFS_UNIT_DESC_PARAM(large_unit_granularity, _LARGE_UNIT_SIZE_M1, 1);
 926UFS_UNIT_DESC_PARAM(wb_buf_alloc_units, _WB_BUF_ALLOC_UNITS, 4);
 927
 928
 929static struct attribute *ufs_sysfs_unit_descriptor[] = {
 930        &dev_attr_boot_lun_id.attr,
 931        &dev_attr_lun_write_protect.attr,
 932        &dev_attr_lun_queue_depth.attr,
 933        &dev_attr_psa_sensitive.attr,
 934        &dev_attr_lun_memory_type.attr,
 935        &dev_attr_data_reliability.attr,
 936        &dev_attr_logical_block_size.attr,
 937        &dev_attr_logical_block_count.attr,
 938        &dev_attr_erase_block_size.attr,
 939        &dev_attr_provisioning_type.attr,
 940        &dev_attr_physical_memory_resourse_count.attr,
 941        &dev_attr_context_capabilities.attr,
 942        &dev_attr_large_unit_granularity.attr,
 943        &dev_attr_wb_buf_alloc_units.attr,
 944        NULL,
 945};
 946
 947const struct attribute_group ufs_sysfs_unit_descriptor_group = {
 948        .name = "unit_descriptor",
 949        .attrs = ufs_sysfs_unit_descriptor,
 950};
 951
 952static ssize_t dyn_cap_needed_attribute_show(struct device *dev,
 953        struct device_attribute *attr, char *buf)
 954{
 955        u32 value;
 956        struct scsi_device *sdev = to_scsi_device(dev);
 957        struct ufs_hba *hba = shost_priv(sdev->host);
 958        u8 lun = ufshcd_scsi_to_upiu_lun(sdev->lun);
 959        int ret;
 960
 961        down(&hba->host_sem);
 962        if (!ufshcd_is_user_access_allowed(hba)) {
 963                ret = -EBUSY;
 964                goto out;
 965        }
 966
 967        pm_runtime_get_sync(hba->dev);
 968        ret = ufshcd_query_attr(hba, UPIU_QUERY_OPCODE_READ_ATTR,
 969                QUERY_ATTR_IDN_DYN_CAP_NEEDED, lun, 0, &value);
 970        pm_runtime_put_sync(hba->dev);
 971        if (ret) {
 972                ret = -EINVAL;
 973                goto out;
 974        }
 975
 976        ret = sysfs_emit(buf, "0x%08X\n", value);
 977
 978out:
 979        up(&hba->host_sem);
 980        return ret;
 981}
 982static DEVICE_ATTR_RO(dyn_cap_needed_attribute);
 983
 984static struct attribute *ufs_sysfs_lun_attributes[] = {
 985        &dev_attr_dyn_cap_needed_attribute.attr,
 986        NULL,
 987};
 988
 989const struct attribute_group ufs_sysfs_lun_attributes_group = {
 990        .attrs = ufs_sysfs_lun_attributes,
 991};
 992
 993void ufs_sysfs_add_nodes(struct device *dev)
 994{
 995        int ret;
 996
 997        ret = sysfs_create_groups(&dev->kobj, ufs_sysfs_groups);
 998        if (ret)
 999                dev_err(dev,
1000                        "%s: sysfs groups creation failed (err = %d)\n",
1001                        __func__, ret);
1002}
1003
1004void ufs_sysfs_remove_nodes(struct device *dev)
1005{
1006        sysfs_remove_groups(&dev->kobj, ufs_sysfs_groups);
1007}
1008