Lines Matching +full:buffer +full:- +full:enable
1 /*-
5 * SPDX-License-Identifier: BSD-2-Clause
209 int timeout = ticks + MSEC_2_TICKS(ctrlr->device_init_timeout_in_ms); in ufshci_dev_init()
227 if (timeout - ticks < 0) { in ufshci_dev_init()
232 ctrlr->device_init_timeout_in_ms); in ufshci_dev_init()
262 index, selector, ctrlr->ref_clk); in ufshci_dev_init_reference_clock()
277 * - 7~15 = Above 2.0, 6 = 2.0, 5 = 1.8, 4 = 1.61, 3 = 1.6, 2 = 1.41, in ufshci_dev_init_unipro()
281 &ctrlr->unipro_version)) in ufshci_dev_init_unipro()
284 &ctrlr->ufs_dev.unipro_version)) in ufshci_dev_init_unipro()
289 * - 1=1us, 2=4us, 3=8us, 4=16us, 5=32us, 6=100us in ufshci_dev_init_unipro()
299 * wake-up peer M-RX in ufshci_dev_init_unipro()
308 if (ctrlr->quirks & UFSHCI_QUIRK_LONG_PEER_PA_TACTIVATE) { in ufshci_dev_init_unipro()
310 * Intel Lake-field UFSHCI has a quirk. We need to add 200us to in ufshci_dev_init_unipro()
331 * - TX[3:0], RX[7:4] in ufshci_dev_init_uic_power_mode()
332 * - Fast Mode = 1, Slow Mode = 2, FastAuto Mode = 4, SlowAuto Mode = 5 in ufshci_dev_init_uic_power_mode()
340 &ctrlr->max_tx_lanes)) in ufshci_dev_init_uic_power_mode()
343 &ctrlr->max_rx_lanes)) in ufshci_dev_init_uic_power_mode()
346 /* Get max HS-GEAR value */ in ufshci_dev_init_uic_power_mode()
348 &ctrlr->max_rx_hs_gear)) in ufshci_dev_init_uic_power_mode()
352 ctrlr->tx_lanes = ctrlr->max_tx_lanes; in ufshci_dev_init_uic_power_mode()
353 ctrlr->rx_lanes = ctrlr->max_rx_lanes; in ufshci_dev_init_uic_power_mode()
355 ctrlr->tx_lanes)) in ufshci_dev_init_uic_power_mode()
358 ctrlr->rx_lanes)) in ufshci_dev_init_uic_power_mode()
361 if (ctrlr->quirks & UFSHCI_QUIRK_CHANGE_LANE_AND_GEAR_SEPARATELY) { in ufshci_dev_init_uic_power_mode()
375 /* Set HS-GEAR to max gear */ in ufshci_dev_init_uic_power_mode()
376 ctrlr->hs_gear = ctrlr->max_rx_hs_gear; in ufshci_dev_init_uic_power_mode()
377 if (ufshci_uic_send_dme_set(ctrlr, PA_TxGear, ctrlr->hs_gear)) in ufshci_dev_init_uic_power_mode()
379 if (ufshci_uic_send_dme_set(ctrlr, PA_RxGear, ctrlr->hs_gear)) in ufshci_dev_init_uic_power_mode()
384 * - HS-MODE = ON / LS-MODE = OFF in ufshci_dev_init_uic_power_mode()
439 if (ctrlr->quirks & UFSHCI_QUIRK_WAIT_AFTER_POWER_MODE_CHANGE) { in ufshci_dev_init_uic_power_mode()
441 * Intel Lake-field UFSHCI has a quirk. in ufshci_dev_init_uic_power_mode()
466 struct ufshci_device *device = &ctrlr->ufs_dev; in ufshci_dev_get_descriptor()
469 * qTotalRawDeviceCapacity use big-endian byte ordering. in ufshci_dev_get_descriptor()
475 error = ufshci_dev_read_device_descriptor(ctrlr, &device->dev_desc); in ufshci_dev_get_descriptor()
479 ver = be16toh(device->dev_desc.wSpecVersion); in ufshci_dev_get_descriptor()
484 device->dev_desc.bNumberLU); in ufshci_dev_get_descriptor()
486 error = ufshci_dev_read_geometry_descriptor(ctrlr, &device->geo_desc); in ufshci_dev_get_descriptor()
490 if (device->geo_desc.bMaxNumberLU == 0) { in ufshci_dev_get_descriptor()
491 device->max_lun_count = 8; in ufshci_dev_get_descriptor()
492 } else if (device->geo_desc.bMaxNumberLU == 1) { in ufshci_dev_get_descriptor()
493 device->max_lun_count = 32; in ufshci_dev_get_descriptor()
497 device->geo_desc.bMaxNumberLU); in ufshci_dev_get_descriptor()
500 ctrlr->max_lun_count = device->max_lun_count; in ufshci_dev_get_descriptor()
503 be64toh(device->geo_desc.qTotalRawDeviceCapacity) * in ufshci_dev_get_descriptor()
512 struct ufshci_device *dev = &ctrlr->ufs_dev; in ufshci_dev_enable_write_booster()
515 /* Enable WriteBooster */ in ufshci_dev_enable_write_booster()
518 ufshci_printf(ctrlr, "Failed to enable WriteBooster\n"); in ufshci_dev_enable_write_booster()
521 dev->is_wb_enabled = true; in ufshci_dev_enable_write_booster()
523 /* Enable WriteBooster buffer flush during hibernate */ in ufshci_dev_enable_write_booster()
528 "Failed to enable WriteBooster buffer flush during hibernate\n"); in ufshci_dev_enable_write_booster()
532 /* Enable WriteBooster buffer flush */ in ufshci_dev_enable_write_booster()
536 "Failed to enable WriteBooster buffer flush\n"); in ufshci_dev_enable_write_booster()
539 dev->is_wb_flush_enabled = true; in ufshci_dev_enable_write_booster()
547 struct ufshci_device *dev = &ctrlr->ufs_dev; in ufshci_dev_disable_write_booster()
550 /* Disable WriteBooster buffer flush */ in ufshci_dev_disable_write_booster()
554 "Failed to disable WriteBooster buffer flush\n"); in ufshci_dev_disable_write_booster()
557 dev->is_wb_flush_enabled = false; in ufshci_dev_disable_write_booster()
559 /* Disable WriteBooster buffer flush during hibernate */ in ufshci_dev_disable_write_booster()
564 "Failed to disable WriteBooster buffer flush during hibernate\n"); in ufshci_dev_disable_write_booster()
574 dev->is_wb_enabled = false; in ufshci_dev_disable_write_booster()
583 struct ufshci_device *dev = &ctrlr->ufs_dev; in ufshci_dev_is_write_booster_buffer_life_time_left()
588 if (dev->wb_buffer_type == UFSHCI_DESC_WB_BUF_TYPE_LU_DEDICATED) in ufshci_dev_is_write_booster_buffer_life_time_left()
589 buffer_lun = dev->wb_dedicated_lu; in ufshci_dev_is_write_booster_buffer_life_time_left()
611 struct ufshci_device *dev = &ctrlr->ufs_dev; in ufshci_dev_need_write_booster_buffer_flush()
619 if (!dev->is_wb_enabled) in ufshci_dev_need_write_booster_buffer_flush()
630 if (dev->wb_buffer_type == UFSHCI_DESC_WB_BUF_TYPE_LU_DEDICATED) in ufshci_dev_need_write_booster_buffer_flush()
631 buffer_lun = dev->wb_dedicated_lu; in ufshci_dev_need_write_booster_buffer_flush()
641 switch (dev->wb_user_space_config_option) { in ufshci_dev_need_write_booster_buffer_flush()
649 * the current buffer is greater than 0 and the available buffer in ufshci_dev_need_write_booster_buffer_flush()
662 dev->write_booster_flush_threshold); in ufshci_dev_need_write_booster_buffer_flush()
681 struct ufshci_device *dev = &ctrlr->ufs_dev; in ufshci_dev_config_write_booster()
691 dev->dev_desc.dExtendedUfsFeaturesSupport); in ufshci_dev_config_write_booster()
701 /* Get WriteBooster buffer parameters */ in ufshci_dev_config_write_booster()
702 dev->wb_buffer_type = dev->dev_desc.bWriteBoosterBufferType; in ufshci_dev_config_write_booster()
703 dev->wb_user_space_config_option = in ufshci_dev_config_write_booster()
704 dev->dev_desc.bWriteBoosterBufferPreserveUserSpaceEn; in ufshci_dev_config_write_booster()
707 * Find the size of the write buffer. in ufshci_dev_config_write_booster()
708 * With LU-dedicated (00h), the WriteBooster buffer is assigned in ufshci_dev_config_write_booster()
709 * exclusively to one chosen LU (not one-per-LU), whereas Shared (01h) in ufshci_dev_config_write_booster()
710 * uses a single device-wide buffer shared by multiple LUs. in ufshci_dev_config_write_booster()
712 if (dev->wb_buffer_type == UFSHCI_DESC_WB_BUF_TYPE_SINGLE_SHARED) { in ufshci_dev_config_write_booster()
714 dev->dev_desc.dNumSharedWriteBoosterBufferAllocUnits); in ufshci_dev_config_write_booster()
716 "WriteBooster buffer type = Shared, alloc_units=%d\n", in ufshci_dev_config_write_booster()
718 } else if (dev->wb_buffer_type == in ufshci_dev_config_write_booster()
720 ufshci_printf(ctrlr, "WriteBooster buffer type = Dedicated\n"); in ufshci_dev_config_write_booster()
721 for (lun = 0; lun < ctrlr->max_lun_count; lun++) { in ufshci_dev_config_write_booster()
722 /* Find a dedicated buffer using a unit descriptor */ in ufshci_dev_config_write_booster()
730 dev->wb_dedicated_lu = lun; in ufshci_dev_config_write_booster()
736 "Not supported WriteBooster buffer type: 0x%x\n", in ufshci_dev_config_write_booster()
737 dev->wb_buffer_type); in ufshci_dev_config_write_booster()
742 ufshci_printf(ctrlr, "The WriteBooster buffer size is zero\n"); in ufshci_dev_config_write_booster()
746 dev->wb_buffer_size_mb = alloc_units * in ufshci_dev_config_write_booster()
747 dev->geo_desc.bAllocationUnitSize * in ufshci_dev_config_write_booster()
748 (be32toh(dev->geo_desc.dSegmentSize)) / in ufshci_dev_config_write_booster()
751 /* Set to flush when 40% of the available buffer size remains */ in ufshci_dev_config_write_booster()
752 dev->write_booster_flush_threshold = UFSHCI_ATTR_WB_AVAILABLE_40; in ufshci_dev_config_write_booster()
755 * Check if WriteBooster Buffer lifetime is left. in ufshci_dev_config_write_booster()
756 * WriteBooster Buffer lifetime — percent of life used based on P/E in ufshci_dev_config_write_booster()
767 "There is no WriteBooster buffer life time left.\n"); in ufshci_dev_config_write_booster()