mirror of
git://nv-tegra.nvidia.com/linux-nv-oot.git
synced 2025-12-22 09:11:26 +03:00
scsi: ufs: add ufs-tegra driver as oot module
Add ufs-tegra driver. Bug 3621817 Change-Id: I4bf56d02ad627af84d516262edd93e1b593f4e50 Signed-off-by: Kartik <kkartik@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/2734906 Reviewed-by: Abhilash G <abhilashg@nvidia.com> Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com> GVS: Gerrit_Virtual_Submit <buildbot_gerritrpt@nvidia.com> Tested-by: Abhilash G <abhilashg@nvidia.com>
This commit is contained in:
committed by
mobile promotions
parent
9b754839fb
commit
1ba41d5ee2
@@ -18,6 +18,7 @@ obj-m += platform/tegra/
|
||||
obj-m += pwm/
|
||||
obj-m += ras/
|
||||
obj-m += rtc/
|
||||
obj-m += scsi/ufs/
|
||||
obj-m += soc/tegra/
|
||||
obj-m += spi/
|
||||
obj-m += thermal/
|
||||
|
||||
4
drivers/scsi/ufs/Makefile
Normal file
4
drivers/scsi/ufs/Makefile
Normal file
@@ -0,0 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||||
|
||||
obj-m += ufs-tegra.o
|
||||
1615
drivers/scsi/ufs/ufs-tegra.c
Normal file
1615
drivers/scsi/ufs/ufs-tegra.c
Normal file
File diff suppressed because it is too large
Load Diff
472
drivers/scsi/ufs/ufs-tegra.h
Normal file
472
drivers/scsi/ufs/ufs-tegra.h
Normal file
@@ -0,0 +1,472 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright (c) 2015-2022, NVIDIA CORPORATION. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef _UFS_TEGRA_H
|
||||
#define _UFS_TEGRA_H
|
||||
|
||||
#include <linux/io.h>
|
||||
|
||||
#define NV_ADDRESS_MAP_MPHY_L0_BASE 0x02470000
|
||||
#define NV_ADDRESS_MAP_MPHY_L1_BASE 0x02480000
|
||||
#define MPHY_ADDR_RANGE_T234 0x2268
|
||||
#define MPHY_ADDR_RANGE 0x200
|
||||
|
||||
/* UFS AUX Base address for T194 */
|
||||
#define NV_ADDRESS_MAP_UFSHC_AUX_BASE 0x02460000
|
||||
/* UFS AUX address range in T194 */
|
||||
#define UFS_AUX_ADDR_RANGE 0x1C
|
||||
|
||||
/* UFS AUX Base address for T234 */
|
||||
#define NV_ADDRESS_MAP_T23X_UFSHC_AUX_BASE 0x02510000
|
||||
/* UFS AUX address range in T234 */
|
||||
#define UFS_AUX_ADDR_RANGE_23X 0x20
|
||||
|
||||
|
||||
/*
|
||||
* M-PHY Registers
|
||||
*/
|
||||
#define MPHY_RX_APB_CAPABILITY_9C_9F_0 0x9c
|
||||
#define MPHY_RX_APB_VENDOR22_0 0x1d4
|
||||
#define MPHY_RX_APB_VENDOR24_0 0x1dc
|
||||
#define MPHY_RX_APB_VENDOR3_0_T234 0x2188
|
||||
#define MPHY_RX_APB_VENDOR4_0_T234 0x218c
|
||||
#define MPHY_RX_APB_VENDOR5_0_T234 0x2190
|
||||
#define MPHY_RX_APB_VENDOR8_0_T234 0x219c
|
||||
#define MPHY_RX_APB_VENDOR9_0_T234 0x21a0
|
||||
#define MPHY_RX_APB_VENDOR14_0_T234 0x21b4
|
||||
#define MPHY_RX_APB_VENDOR22_0_T234 0x21d4
|
||||
#define MPHY_RX_APB_VENDOR24_0_T234 0x21dc
|
||||
#define MPHY_RX_APB_VENDOR34_0_T234 0x2204
|
||||
#define MPHY_RX_APB_VENDOR37_0_T234 0X2210
|
||||
#define MPHY_RX_APB_VENDOR3B_0_T234 0X2220
|
||||
#define MPHY_RX_APB_VENDOR49_0_T234 0x2254
|
||||
|
||||
#define MPHY_TX_APB_TX_ATTRIBUTE_2C_2F_0 0x2c
|
||||
#define MPHY_TX_APB_TX_VENDOR0_0 0x100
|
||||
#define MPHY_TX_APB_TX_CG_OVR0_0 0x170
|
||||
#define MPHY_TX_APB_TX_VENDOR0_0_T234 0x1100
|
||||
#define MPHY_TX_APB_TX_VENDOR3_0_T234 0x110c
|
||||
#define MPHY_TX_APB_TX_VENDOR4_0_T234 0x1110
|
||||
#define MPHY_TX_APB_TX_CG_OVR0_0_T234 0x1170
|
||||
#define MPHY_TX_APB_PAD_TIMING14_0_T234 0x1194
|
||||
|
||||
#define MPHY_TX_APB_TX_CLK_CTRL0_0 0x160
|
||||
#define MPHY_TX_APB_TX_CLK_CTRL2_0 0x168
|
||||
#define MPHY_TX_APB_TX_CLK_CTRL0_0_T234 0x1160
|
||||
#define MPHY_TX_APB_TX_CLK_CTRL2_0_T234 0x1168
|
||||
|
||||
#define MPHY_TX_CLK_EN_SYMB (1 << 1)
|
||||
#define MPHY_TX_CLK_EN_SLOW (1 << 3)
|
||||
#define MPHY_TX_CLK_EN_FIXED (1 << 4)
|
||||
#define MPHY_TX_CLK_EN_3X (1 << 5)
|
||||
|
||||
#define MPHY_TX_APB_TX_ATTRIBUTE_34_37_0 0x34
|
||||
#define TX_ADVANCED_GRANULARITY (0x8 << 16)
|
||||
#define TX_ADVANCED_GRANULARITY_SETTINGS (0x1 << 8)
|
||||
#define MPHY_PWR_CHANGE_CLK_BOOST 0x0017
|
||||
#define MPHY_EQ_TIMEOUT 0x1AADB5
|
||||
#define MPHY_GO_BIT 1
|
||||
|
||||
#define MPHY_RX_APB_CAPABILITY_88_8B_0 0x88
|
||||
#define RX_HS_G1_SYNC_LENGTH_CAPABILITY(x) (((x) & 0x3f) << 24)
|
||||
#define RX_HS_SYNC_LENGTH 0xf
|
||||
|
||||
#define MPHY_RX_APB_CAPABILITY_94_97_0 0x94
|
||||
#define RX_HS_G2_SYNC_LENGTH_CAPABILITY(x) (((x) & 0x3f) << 0)
|
||||
#define RX_HS_G3_SYNC_LENGTH_CAPABILITY(x) (((x) & 0x3f) << 8)
|
||||
|
||||
#define MPHY_RX_APB_CAPABILITY_8C_8F_0 0x8c
|
||||
#define RX_MIN_ACTIVATETIME_CAP_ARG(x) (((x) & 0xf) << 24)
|
||||
#define RX_MIN_ACTIVATETIME 0x5
|
||||
|
||||
#define MPHY_RX_APB_CAPABILITY_98_9B_0 0x98
|
||||
#define RX_ADVANCED_FINE_GRANULARITY(x) (((x) & 0x1) << 0)
|
||||
#define RX_ADVANCED_GRANULARITY(x) (((x) & 0x3) << 1)
|
||||
#define RX_ADVANCED_MIN_ACTIVATETIME(x) (((x) & 0xf) << 16)
|
||||
#define RX_ADVANCED_MIN_AT 0xa
|
||||
|
||||
|
||||
#define MPHY_RX_APB_VENDOR2_0 0x184
|
||||
#define MPHY_RX_APB_VENDOR2_0_T234 0x2184
|
||||
#define MPHY_RX_APB_VENDOR2_0_RX_CAL_EN (1 << 15)
|
||||
#define MPHY_RX_APB_VENDOR2_0_RX_CAL_DONE (1 << 19)
|
||||
|
||||
#define MPHY_RX_CAPABILITY_88_8B_VAL_FPGA 0x4f00fa1a
|
||||
#define MPHY_RX_CAPABILITY_8C_8F_VAL_FPGA 0x50e080e
|
||||
#define MPHY_RX_CAPABILITY_94_97_VAL_FPGA 0xe0e4f4f
|
||||
#define MPHY_RX_CAPABILITY_98_9B_VAL_FPGA 0x4e0a0203
|
||||
|
||||
/* T234 FPGA specific values for clock dividor */
|
||||
#define MPHY_RX_PWM_CLOCK_DIV_VAL_FPGA 0x80f1e34
|
||||
#define MPHY_RX_HS_CLOCK_DIV_VAL_FPGA 0x01020608
|
||||
#define MPHY_TX_PWM_CLOCK_DIV_VAL_FPGA 0x08102040
|
||||
#define MPHY_TX_HS_CLOCK_DIV_VAL_FPGA 0x00000220
|
||||
#define MPHY_TX_HIBERN8_ENTER_TIME_FPGA 0x8
|
||||
|
||||
#define MPHY_RX_GO_REG_VAL_FPGA 0x4001
|
||||
|
||||
/* Unipro Vendor registers */
|
||||
|
||||
/*
|
||||
* Vendor Specific Attributes
|
||||
*/
|
||||
|
||||
#define VS_DEBUGSAVECONFIGTIME 0xD0A0
|
||||
#define VS_DEBUGSAVECONFIGTIME_TREF 0x6
|
||||
#define SET_TREF(x) (((x) & 0x7) << 2)
|
||||
#define VS_DEBUGSAVECONFIGTIME_ST_SCT 0x3
|
||||
#define SET_ST_SCT(x) ((x) & 0x3)
|
||||
#define VS_BURSTMBLCONFIG (0x5 << 13)
|
||||
#define VS_BURSTMBLREGISTER 0xc0
|
||||
#define VS_TXBURSTCLOSUREDELAY 0xD084
|
||||
|
||||
/*UFS Clock Defines*/
|
||||
#define UFSHC_CLK_FREQ 204000000
|
||||
#define UFSDEV_CLK_FREQ 19200000
|
||||
|
||||
/*Uphy pll clock defines*/
|
||||
#define UFS_CLK_UPHY_PLL3_RATEA 4992000000
|
||||
#define UFS_CLK_UPHY_PLL3_RATEB 5840000000
|
||||
|
||||
/* HS clock frequencies */
|
||||
#define MPHY_TX_HS_BIT_DIV_CLK 600000000
|
||||
#define MPHY_RX_HS_BIT_DIV_CLK 312500000
|
||||
|
||||
enum ufs_state {
|
||||
UFSHC_INIT,
|
||||
UFSHC_SUSPEND,
|
||||
UFSHC_RESUME,
|
||||
};
|
||||
|
||||
/* vendor specific pre-defined parameters */
|
||||
|
||||
/*
|
||||
* HCLKFrequency in MHz.
|
||||
* HCLKDIV is used to generate 1usec tick signal used by Unipro.
|
||||
*/
|
||||
#define UFS_VNDR_HCLKDIV_1US_TICK 0xCC
|
||||
|
||||
|
||||
/*UFS host controller vendor specific registers */
|
||||
enum {
|
||||
REG_UFS_VNDR_HCLKDIV = 0xFC,
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* UFS AUX Registers
|
||||
*/
|
||||
|
||||
#define UFSHC_AUX_UFSHC_STATUS_0 0x10
|
||||
#define UFSHC_HIBERNATE_STATUS (1 << 0)
|
||||
#define UFSHC_AUX_UFSHC_DEV_CTRL_0 0x14
|
||||
#define UFSHC_DEV_CLK_EN (1 << 0)
|
||||
#define UFSHC_DEV_RESET (1 << 1)
|
||||
#define UFSHC_AUX_UFSHC_SW_EN_CLK_SLCG_0 0x08
|
||||
#define UFSHC_CLK_OVR_ON (1 << 0)
|
||||
#define UFSHC_HCLK_OVR_ON (1 << 1)
|
||||
#define UFSHC_LP_CLK_T_CLK_OVR_ON (1 << 2)
|
||||
#define UFSHC_CLK_T_CLK_OVR_ON (1 << 3)
|
||||
#define UFSHC_CG_SYS_CLK_OVR_ON (1 << 4)
|
||||
#define UFSHC_TX_SYMBOL_CLK_OVR_ON (1 << 5)
|
||||
#define UFSHC_RX_SYMBOLCLKSELECTED_CLK_OVR_ON (1 << 6)
|
||||
#define UFSHC_PCLK_OVR_ON (1 << 7)
|
||||
|
||||
|
||||
#define PA_SCRAMBLING 0x1585
|
||||
#define PA_PEERSCRAMBLING 0x155B
|
||||
#define PA_TxHsG1SyncLength 0x1552
|
||||
#define PA_TxHsG2SyncLength 0x1554
|
||||
#define PA_TxHsG3SyncLength 0x1556
|
||||
#define PA_Local_TX_LCC_Enable 0x155E
|
||||
|
||||
#define SCREN 0x1
|
||||
|
||||
/*
|
||||
* DME Attributes
|
||||
*/
|
||||
#define DME_FC0PROTECTIONTIMEOUTVAL 0xD041
|
||||
#define DME_TC0REPLAYTIMEOUTVAL 0xD042
|
||||
#define DME_AFC0REQTIMEOUTVAL 0xD043
|
||||
|
||||
/*
|
||||
* MPHY Context save armphy_rx_apb registers
|
||||
*/
|
||||
|
||||
static u16 __attribute__ ((unused)) mphy_rx_apb[] = {
|
||||
0x080, /* MPHY_RX_APB_CAPABILITY_80_83_0 */
|
||||
0x084, /* MPHY_RX_APB_CAPABILITY_84_87_0 */
|
||||
0x088, /* MPHY_RX_APB_CAPABILITY_88_8B_0 */
|
||||
0x08c, /* MPHY_RX_APB_CAPABILITY_8C_8F_0 */
|
||||
0x090, /* MPHY_RX_APB_CAPABILITY_90_93_0 */
|
||||
0x094, /* MPHY_RX_APB_CAPABILITY_94_97_0 */
|
||||
0x098, /* MPHY_RX_APB_CAPABILITY_98_9B_0 */
|
||||
0x0a0, /* MPHY_RX_APB_ATTRIBUTE_A0_A3_0 */
|
||||
0x0a4, /* MPHY_RX_APB_ATTRIBUTE_A4_A7_0 */
|
||||
0x0a8, /* MPHY_RX_APB_ATTRIBUTE_A8_AB_0 */
|
||||
0x0d0, /* MPHY_RX_APB_MC_STATUS_D0_D3_0 */
|
||||
0x0d4, /* MPHY_RX_APB_MC_STATUS_D4_D7_0 */
|
||||
0x0d8, /* MPHY_RX_APB_MC_STATUS_D8_DB_0 */
|
||||
0x0dc, /* MPHY_RX_APB_MC_STATUS_DC_DF_0 */
|
||||
0x0e0, /* MPHY_RX_APB_MC_STATUS_E0_E3_0 */
|
||||
0x0e4, /* MPHY_RX_APB_MC_STATUS_E4_E7_0 */
|
||||
0x180, /* MPHY_RX_APB_VENDOR1_0 */
|
||||
0x184, /* MPHY_RX_APB_VENDOR2_0 */
|
||||
0x188, /* MPHY_RX_APB_VENDOR3_0 */
|
||||
0x18c, /* MPHY_RX_APB_VENDOR4_0 */
|
||||
0x190, /* MPHY_RX_APB_VENDOR5_0 */
|
||||
0x194, /* MPHY_RX_APB_VENDOR6_0 */
|
||||
0x198, /* MPHY_RX_APB_VENDOR7_0 */
|
||||
0x19c, /* MPHY_RX_APB_VENDOR8_0 */
|
||||
0x1a0, /* MPHY_RX_APB_VENDOR9_0 */
|
||||
0x1a4, /* MPHY_RX_APB_VENDOR10_0 */
|
||||
0x1a8, /* MPHY_RX_APB_VENDOR11_0 */
|
||||
0x1ac, /* MPHY_RX_APB_VENDOR12_0 */
|
||||
0x1b0, /* MPHY_RX_APB_VENDOR13_0 */
|
||||
0x1b4, /* MPHY_RX_APB_VENDOR14_0 */
|
||||
0x1b8, /* MPHY_RX_APB_VENDOR15_0 */
|
||||
0x1bc, /* MPHY_RX_APB_VENDOR16_0 */
|
||||
0x1c0, /* MPHY_RX_APB_VENDOR17_0 */
|
||||
0x1c4, /* MPHY_RX_APB_VENDOR18_0 */
|
||||
0x1c8, /* MPHY_RX_APB_VENDOR19_0 */
|
||||
0x1cc, /* MPHY_RX_APB_VENDOR20_0 */
|
||||
0x1d0, /* MPHY_RX_APB_VENDOR21_0 */
|
||||
0x1d4, /* MPHY_RX_APB_VENDOR22_0 */
|
||||
0x1d8, /* MPHY_RX_APB_VENDOR23_0 */
|
||||
0x1dc, /* MPHY_RX_APB_VENDOR24_0 */
|
||||
0x1e0, /* MPHY_RX_APB_VENDOR25_0 */
|
||||
0x1e4, /* MPHY_RX_APB_VENDOR26_0 */
|
||||
0x1e8, /* MPHY_RX_APB_VENDOR27_0 */
|
||||
0x1ec, /* MPHY_RX_APB_VENDOR28_0 */
|
||||
0x1f0, /* MPHY_RX_APB_VENDOR29_0 */
|
||||
0x1f4, /* MPHY_RX_APB_VENDOR30_0 */
|
||||
0x1f8, /* MPHY_RX_APB_VENDOR31_0 */
|
||||
0x1fc /* MPHY_RX_APB_VENDOR32_0 */
|
||||
};
|
||||
|
||||
/*
|
||||
* MPHY Context save armphy_tx_apb registers
|
||||
*/
|
||||
|
||||
static u16 __attribute__ ((unused)) mphy_tx_apb[] = {
|
||||
0x000, /* MPHY_TX_APB_TX_CAPABILITY_00_03_0 */
|
||||
0x004, /* MPHY_TX_APB_TX_CAPABILITY_04_07_0 */
|
||||
0x008, /* MPHY_TX_APB_TX_CAPABILITY_08_0B_0 */
|
||||
0x00c, /* MPHY_TX_APB_TX_CAPABILITY_0C_0F_0 */
|
||||
0x010, /* MPHY_TX_APB_TX_CAPABILITY_10_13_0 */
|
||||
0x020, /* MPHY_TX_APB_TX_ATTRIBUTE_20_23_0 */
|
||||
0x024, /* MPHY_TX_APB_TX_ATTRIBUTE_24_27_0 */
|
||||
0x028, /* MPHY_TX_APB_TX_ATTRIBUTE_28_2B_0 */
|
||||
0x02c, /* MPHY_TX_APB_TX_ATTRIBUTE_2C_2F_0 */
|
||||
0x030, /* MPHY_TX_APB_TX_ATTRIBUTE_30_33_0 */
|
||||
0x034, /* MPHY_TX_APB_TX_ATTRIBUTE_34_37_0 */
|
||||
0x038, /* MPHY_TX_APB_TX_ATTRIBUTE_38_3B_0 */
|
||||
0x060, /* MPHY_TX_APB_MC_ATTRIBUTE_60_63_0 */
|
||||
0x064, /* MPHY_TX_APB_MC_ATTRIBUTE_64_67_0 */
|
||||
0x100, /* MPHY_TX_APB_TX_VENDOR0_0 */
|
||||
0x104, /* MPHY_TX_APB_TX_VENDOR1_0 */
|
||||
0x108, /* MPHY_TX_APB_TX_VENDOR2_0 */
|
||||
0x10c, /* MPHY_TX_APB_TX_VENDOR3_0 */
|
||||
0x110, /* MPHY_TX_APB_TX_VENDOR4_0 */
|
||||
0x114, /* MPHY_TX_APB_TX_VENDOR5_0 */
|
||||
0x118, /* MPHY_TX_APB_TX_VENDOR6_0 */
|
||||
0x11c, /* MPHY_TX_APB_TX_VENDOR7_0 */
|
||||
0x120, /* MPHY_TX_APB_PAD_TIMING0_0 */
|
||||
0x124, /* MPHY_TX_APB_PAD_TIMING1_0 */
|
||||
0x128, /* MPHY_TX_APB_PAD_TIMING2_0 */
|
||||
0x12c, /* MPHY_TX_APB_PAD_TIMING3_0 */
|
||||
0x130, /* MPHY_TX_APB_PAD_TIMING4_0 */
|
||||
0x134, /* MPHY_TX_APB_PAD_TIMING5_0 */
|
||||
0x138, /* MPHY_TX_APB_PAD_TIMING6_0 */
|
||||
0x13c, /* MPHY_TX_APB_PAD_TIMING7_0 */
|
||||
0x140, /* MPHY_TX_APB_PAD_TIMING8_0 */
|
||||
0x144, /* MPHY_TX_APB_PAD_TIMING9_0 */
|
||||
0x148, /* MPHY_TX_APB_PAD_TIMING10_0 */
|
||||
0x14c, /* MPHY_TX_APB_TX_PAD_OVR_VAL0_0 */
|
||||
0x150, /* MPHY_TX_APB_TX_PAD_OVR_CTRL0_0 */
|
||||
0x154, /* MPHY_TX_APB_TX_OVR_CTRL0_0 */
|
||||
0x158, /* MPHY_TX_APB_TX_OVR_VAL0_0 */
|
||||
0x15c, /* MPHY_TX_APB_PAD_TIMER0_0 */
|
||||
0x160, /* MPHY_TX_APB_TX_CLK_CTRL0_0 */
|
||||
0x164, /* MPHY_TX_APB_TX_CLK_CTRL1_0 */
|
||||
0x168, /* MPHY_TX_APB_TX_CLK_CTRL2_0 */
|
||||
0x16c, /* MPHY_TX_APB_TX_CLK_CTRL3_0 */
|
||||
0x170, /* MPHY_TX_APB_TX_CG_OVR0_0 */
|
||||
0x174, /* MPHY_TX_APB_TX_CG_COUNTER0_0 */
|
||||
0x178, /* MPHY_TX_APB_TX_PAD_OVR_VAL1_0 */
|
||||
0x17c /* MPHY_TX_APB_TX_PAD_OVR_CTRL1_0 */
|
||||
};
|
||||
|
||||
struct ufs_tegra_soc_data {
|
||||
u8 chip_id;
|
||||
};
|
||||
|
||||
struct ufs_tegra_host {
|
||||
struct ufs_hba *hba;
|
||||
bool is_lane_clks_enabled;
|
||||
bool x2config;
|
||||
bool enable_mphy_rx_calib;
|
||||
bool enable_hs_mode;
|
||||
bool enable_38mhz_clk;
|
||||
bool enable_ufs_provisioning;
|
||||
u32 max_hs_gear;
|
||||
bool mask_fast_auto_mode;
|
||||
bool mask_hs_mode_b;
|
||||
bool configure_uphy_pll3;
|
||||
u32 max_pwm_gear;
|
||||
enum ufs_state ufshc_state;
|
||||
void *mphy_context;
|
||||
void __iomem *mphy_l0_base;
|
||||
void __iomem *mphy_l1_base;
|
||||
void __iomem *ufs_aux_base;
|
||||
struct reset_control *ufs_rst;
|
||||
struct reset_control *ufs_axi_m_rst;
|
||||
struct reset_control *ufshc_lp_rst;
|
||||
struct reset_control *mphy_l0_rx_rst;
|
||||
struct reset_control *mphy_l0_tx_rst;
|
||||
struct reset_control *mphy_l1_rx_rst;
|
||||
struct reset_control *mphy_l1_tx_rst;
|
||||
struct reset_control *mphy_clk_ctl_rst;
|
||||
struct clk *mphy_core_pll_fixed;
|
||||
struct clk *mphy_l0_tx_symb;
|
||||
struct clk *mphy_tx_1mhz_ref;
|
||||
struct clk *mphy_l0_rx_ana;
|
||||
struct clk *mphy_l0_rx_symb;
|
||||
struct clk *mphy_l0_tx_ls_3xbit;
|
||||
struct clk *mphy_l0_rx_ls_bit;
|
||||
struct clk *mphy_l1_rx_ana;
|
||||
struct clk *mphy_l0_tx_2x_symb;
|
||||
struct clk *mphy_tx_hs_symb_div;
|
||||
struct clk *mphy_tx_hs_mux_symb_div;
|
||||
struct clk *mphy_rx_hs_symb_div;
|
||||
struct clk *mphy_rx_hs_mux_symb_div;
|
||||
struct clk *mphy_force_ls_mode;
|
||||
struct clk *ufshc_parent;
|
||||
struct clk *ufsdev_parent;
|
||||
struct clk *ufshc_clk;
|
||||
struct clk *ufsdev_ref_clk;
|
||||
struct clk *ufsdev_osc;
|
||||
struct clk *ufs_uphy_pll3;
|
||||
struct clk *pllrefe_clk;
|
||||
struct regulator *vddio_ufs;
|
||||
struct regulator *vddio_ufs_ap;
|
||||
struct pinctrl *ufs_pinctrl;
|
||||
struct pinctrl_state *dpd_enable;
|
||||
struct pinctrl_state *dpd_disable;
|
||||
u32 vs_burst;
|
||||
/* Hibernate entry support is broken
|
||||
WAR is suggested to fix hibernate entry functionality
|
||||
*/
|
||||
#define NVQUIRK_BROKEN_HIBERN8_ENTRY UTP_TRANSFER_REQ_COMPL
|
||||
|
||||
/* UFS tegra deviations from standard UFSHCI spec. */
|
||||
unsigned int nvquirks;
|
||||
bool wake_enable_failed;
|
||||
bool enable_scramble;
|
||||
u32 ref_clk_freq;
|
||||
struct ufs_tegra_soc_data *soc;
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
u32 refclk_value;
|
||||
long program_refclk;
|
||||
u32 bootlun_en_id;
|
||||
long program_bootlun_en_id;
|
||||
u32 boot_enable;
|
||||
u32 descr_access_en;
|
||||
u8 *lun_desc_buf;
|
||||
long program_lun;
|
||||
#endif
|
||||
};
|
||||
|
||||
extern struct ufs_hba_variant_ops ufs_hba_tegra_vops;
|
||||
extern int ufshcd_rescan(struct ufs_hba *hb);
|
||||
void ufs_rescan(struct work_struct *work);
|
||||
|
||||
static inline u32 mphy_readl(void __iomem *mphy_base, u32 offset)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
val = readl(mphy_base + offset);
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline void mphy_writel(void __iomem *mphy_base, u32 val, u32 offset)
|
||||
{
|
||||
writel(val, mphy_base + offset);
|
||||
}
|
||||
|
||||
static inline void mphy_update(void __iomem *mphy_base, u32 val,
|
||||
u32 offset)
|
||||
{
|
||||
u32 update_val;
|
||||
|
||||
update_val = mphy_readl(mphy_base, offset);
|
||||
update_val |= val;
|
||||
mphy_writel(mphy_base, update_val, offset);
|
||||
}
|
||||
|
||||
static inline void mphy_clear_bits(void __iomem *mphy_base, u32 val,
|
||||
u32 offset)
|
||||
{
|
||||
u32 update_val;
|
||||
|
||||
update_val = mphy_readl(mphy_base, offset);
|
||||
update_val &= ~val;
|
||||
mphy_writel(mphy_base, update_val, offset);
|
||||
}
|
||||
|
||||
static inline u32 ufs_aux_readl(void __iomem *ufs_aux_base, u32 offset)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
val = readl(ufs_aux_base + offset);
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline void ufs_aux_writel(void __iomem *ufs_aux_base, u32 val,
|
||||
u32 offset)
|
||||
{
|
||||
writel(val, ufs_aux_base + offset);
|
||||
}
|
||||
|
||||
static inline void ufs_aux_update(void __iomem *ufs_aux_base, u32 val,
|
||||
u32 offset)
|
||||
{
|
||||
u32 update_val;
|
||||
|
||||
update_val = ufs_aux_readl(ufs_aux_base, offset);
|
||||
update_val |= val;
|
||||
ufs_aux_writel(ufs_aux_base, update_val, offset);
|
||||
}
|
||||
|
||||
static inline void ufs_aux_clear_bits(void __iomem *ufs_aux_base, u32 val,
|
||||
u32 offset)
|
||||
{
|
||||
u32 update_val;
|
||||
|
||||
update_val = ufs_aux_readl(ufs_aux_base, offset);
|
||||
update_val &= ~val;
|
||||
ufs_aux_writel(ufs_aux_base, update_val, offset);
|
||||
}
|
||||
|
||||
static inline void ufs_save_regs(void __iomem *reg_base, u32 *save_addr,
|
||||
u16 reg_array[], u32 no_of_regs)
|
||||
{
|
||||
u32 regs;
|
||||
u32 *dest = save_addr;
|
||||
|
||||
for (regs = 0; regs < no_of_regs; ++regs, ++dest)
|
||||
*dest = readl(reg_base + (u32)reg_array[regs]);
|
||||
}
|
||||
|
||||
static inline void ufs_restore_regs(void __iomem *reg_base, u32 *save_addr,
|
||||
u16 reg_array[], u32 no_of_regs)
|
||||
{
|
||||
u32 regs;
|
||||
u32 *src = save_addr;
|
||||
|
||||
for (regs = 0; regs < no_of_regs; ++regs, ++src)
|
||||
writel(*src, reg_base + (u32)reg_array[regs]);
|
||||
}
|
||||
|
||||
#endif
|
||||
645
include/drivers-private/scsi/ufs/k515/ufs.h
Normal file
645
include/drivers-private/scsi/ufs/k515/ufs.h
Normal file
@@ -0,0 +1,645 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* Universal Flash Storage Host controller driver
|
||||
* Copyright (C) 2011-2013 Samsung India Software Operations
|
||||
*
|
||||
* Authors:
|
||||
* Santosh Yaraganavi <santosh.sy@samsung.com>
|
||||
* Vinayak Holikatti <h.vinayak@samsung.com>
|
||||
*/
|
||||
|
||||
#ifndef _UFS_H
|
||||
#define _UFS_H
|
||||
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/types.h>
|
||||
#include <uapi/scsi/scsi_bsg_ufs.h>
|
||||
|
||||
#define GENERAL_UPIU_REQUEST_SIZE (sizeof(struct utp_upiu_req))
|
||||
#define QUERY_DESC_MAX_SIZE 255
|
||||
#define QUERY_DESC_MIN_SIZE 2
|
||||
#define QUERY_DESC_HDR_SIZE 2
|
||||
#define QUERY_OSF_SIZE (GENERAL_UPIU_REQUEST_SIZE - \
|
||||
(sizeof(struct utp_upiu_header)))
|
||||
#define UFS_SENSE_SIZE 18
|
||||
|
||||
#define UPIU_HEADER_DWORD(byte3, byte2, byte1, byte0)\
|
||||
cpu_to_be32((byte3 << 24) | (byte2 << 16) |\
|
||||
(byte1 << 8) | (byte0))
|
||||
/*
|
||||
* UFS device may have standard LUs and LUN id could be from 0x00 to
|
||||
* 0x7F. Standard LUs use "Peripheral Device Addressing Format".
|
||||
* UFS device may also have the Well Known LUs (also referred as W-LU)
|
||||
* which again could be from 0x00 to 0x7F. For W-LUs, device only use
|
||||
* the "Extended Addressing Format" which means the W-LUNs would be
|
||||
* from 0xc100 (SCSI_W_LUN_BASE) onwards.
|
||||
* This means max. LUN number reported from UFS device could be 0xC17F.
|
||||
*/
|
||||
#define UFS_UPIU_MAX_UNIT_NUM_ID 0x7F
|
||||
#define UFS_MAX_LUNS (SCSI_W_LUN_BASE + UFS_UPIU_MAX_UNIT_NUM_ID)
|
||||
#define UFS_UPIU_WLUN_ID (1 << 7)
|
||||
#define UFS_RPMB_UNIT 0xC4
|
||||
|
||||
/* WriteBooster buffer is available only for the logical unit from 0 to 7 */
|
||||
#define UFS_UPIU_MAX_WB_LUN_ID 8
|
||||
|
||||
/* Well known logical unit id in LUN field of UPIU */
|
||||
enum {
|
||||
UFS_UPIU_REPORT_LUNS_WLUN = 0x81,
|
||||
UFS_UPIU_UFS_DEVICE_WLUN = 0xD0,
|
||||
UFS_UPIU_BOOT_WLUN = 0xB0,
|
||||
UFS_UPIU_RPMB_WLUN = 0xC4,
|
||||
};
|
||||
|
||||
/*
|
||||
* UFS Protocol Information Unit related definitions
|
||||
*/
|
||||
|
||||
/* Task management functions */
|
||||
enum {
|
||||
UFS_ABORT_TASK = 0x01,
|
||||
UFS_ABORT_TASK_SET = 0x02,
|
||||
UFS_CLEAR_TASK_SET = 0x04,
|
||||
UFS_LOGICAL_RESET = 0x08,
|
||||
UFS_QUERY_TASK = 0x80,
|
||||
UFS_QUERY_TASK_SET = 0x81,
|
||||
};
|
||||
|
||||
/* UTP UPIU Transaction Codes Initiator to Target */
|
||||
enum {
|
||||
UPIU_TRANSACTION_NOP_OUT = 0x00,
|
||||
UPIU_TRANSACTION_COMMAND = 0x01,
|
||||
UPIU_TRANSACTION_DATA_OUT = 0x02,
|
||||
UPIU_TRANSACTION_TASK_REQ = 0x04,
|
||||
UPIU_TRANSACTION_QUERY_REQ = 0x16,
|
||||
};
|
||||
|
||||
/* UTP UPIU Transaction Codes Target to Initiator */
|
||||
enum {
|
||||
UPIU_TRANSACTION_NOP_IN = 0x20,
|
||||
UPIU_TRANSACTION_RESPONSE = 0x21,
|
||||
UPIU_TRANSACTION_DATA_IN = 0x22,
|
||||
UPIU_TRANSACTION_TASK_RSP = 0x24,
|
||||
UPIU_TRANSACTION_READY_XFER = 0x31,
|
||||
UPIU_TRANSACTION_QUERY_RSP = 0x36,
|
||||
UPIU_TRANSACTION_REJECT_UPIU = 0x3F,
|
||||
};
|
||||
|
||||
/* UPIU Read/Write flags */
|
||||
enum {
|
||||
UPIU_CMD_FLAGS_NONE = 0x00,
|
||||
UPIU_CMD_FLAGS_WRITE = 0x20,
|
||||
UPIU_CMD_FLAGS_READ = 0x40,
|
||||
};
|
||||
|
||||
/* UPIU Task Attributes */
|
||||
enum {
|
||||
UPIU_TASK_ATTR_SIMPLE = 0x00,
|
||||
UPIU_TASK_ATTR_ORDERED = 0x01,
|
||||
UPIU_TASK_ATTR_HEADQ = 0x02,
|
||||
UPIU_TASK_ATTR_ACA = 0x03,
|
||||
};
|
||||
|
||||
/* UPIU Query request function */
|
||||
enum {
|
||||
UPIU_QUERY_FUNC_STANDARD_READ_REQUEST = 0x01,
|
||||
UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST = 0x81,
|
||||
};
|
||||
|
||||
/* Flag idn for Query Requests*/
|
||||
enum flag_idn {
|
||||
QUERY_FLAG_IDN_FDEVICEINIT = 0x01,
|
||||
QUERY_FLAG_IDN_PERMANENT_WPE = 0x02,
|
||||
QUERY_FLAG_IDN_PWR_ON_WPE = 0x03,
|
||||
QUERY_FLAG_IDN_BKOPS_EN = 0x04,
|
||||
QUERY_FLAG_IDN_LIFE_SPAN_MODE_ENABLE = 0x05,
|
||||
QUERY_FLAG_IDN_PURGE_ENABLE = 0x06,
|
||||
QUERY_FLAG_IDN_RESERVED2 = 0x07,
|
||||
QUERY_FLAG_IDN_FPHYRESOURCEREMOVAL = 0x08,
|
||||
QUERY_FLAG_IDN_BUSY_RTC = 0x09,
|
||||
QUERY_FLAG_IDN_RESERVED3 = 0x0A,
|
||||
QUERY_FLAG_IDN_PERMANENTLY_DISABLE_FW_UPDATE = 0x0B,
|
||||
QUERY_FLAG_IDN_WB_EN = 0x0E,
|
||||
QUERY_FLAG_IDN_WB_BUFF_FLUSH_EN = 0x0F,
|
||||
QUERY_FLAG_IDN_WB_BUFF_FLUSH_DURING_HIBERN8 = 0x10,
|
||||
QUERY_FLAG_IDN_HPB_RESET = 0x11,
|
||||
QUERY_FLAG_IDN_HPB_EN = 0x12,
|
||||
};
|
||||
|
||||
/* Attribute idn for Query requests */
|
||||
enum attr_idn {
|
||||
QUERY_ATTR_IDN_BOOT_LU_EN = 0x00,
|
||||
QUERY_ATTR_IDN_MAX_HPB_SINGLE_CMD = 0x01,
|
||||
QUERY_ATTR_IDN_POWER_MODE = 0x02,
|
||||
QUERY_ATTR_IDN_ACTIVE_ICC_LVL = 0x03,
|
||||
QUERY_ATTR_IDN_OOO_DATA_EN = 0x04,
|
||||
QUERY_ATTR_IDN_BKOPS_STATUS = 0x05,
|
||||
QUERY_ATTR_IDN_PURGE_STATUS = 0x06,
|
||||
QUERY_ATTR_IDN_MAX_DATA_IN = 0x07,
|
||||
QUERY_ATTR_IDN_MAX_DATA_OUT = 0x08,
|
||||
QUERY_ATTR_IDN_DYN_CAP_NEEDED = 0x09,
|
||||
QUERY_ATTR_IDN_REF_CLK_FREQ = 0x0A,
|
||||
QUERY_ATTR_IDN_CONF_DESC_LOCK = 0x0B,
|
||||
QUERY_ATTR_IDN_MAX_NUM_OF_RTT = 0x0C,
|
||||
QUERY_ATTR_IDN_EE_CONTROL = 0x0D,
|
||||
QUERY_ATTR_IDN_EE_STATUS = 0x0E,
|
||||
QUERY_ATTR_IDN_SECONDS_PASSED = 0x0F,
|
||||
QUERY_ATTR_IDN_CNTX_CONF = 0x10,
|
||||
QUERY_ATTR_IDN_CORR_PRG_BLK_NUM = 0x11,
|
||||
QUERY_ATTR_IDN_RESERVED2 = 0x12,
|
||||
QUERY_ATTR_IDN_RESERVED3 = 0x13,
|
||||
QUERY_ATTR_IDN_FFU_STATUS = 0x14,
|
||||
QUERY_ATTR_IDN_PSA_STATE = 0x15,
|
||||
QUERY_ATTR_IDN_PSA_DATA_SIZE = 0x16,
|
||||
QUERY_ATTR_IDN_REF_CLK_GATING_WAIT_TIME = 0x17,
|
||||
QUERY_ATTR_IDN_WB_FLUSH_STATUS = 0x1C,
|
||||
QUERY_ATTR_IDN_AVAIL_WB_BUFF_SIZE = 0x1D,
|
||||
QUERY_ATTR_IDN_WB_BUFF_LIFE_TIME_EST = 0x1E,
|
||||
QUERY_ATTR_IDN_CURR_WB_BUFF_SIZE = 0x1F,
|
||||
};
|
||||
|
||||
/* Descriptor idn for Query requests */
|
||||
enum desc_idn {
|
||||
QUERY_DESC_IDN_DEVICE = 0x0,
|
||||
QUERY_DESC_IDN_CONFIGURATION = 0x1,
|
||||
QUERY_DESC_IDN_UNIT = 0x2,
|
||||
QUERY_DESC_IDN_RFU_0 = 0x3,
|
||||
QUERY_DESC_IDN_INTERCONNECT = 0x4,
|
||||
QUERY_DESC_IDN_STRING = 0x5,
|
||||
QUERY_DESC_IDN_RFU_1 = 0x6,
|
||||
QUERY_DESC_IDN_GEOMETRY = 0x7,
|
||||
QUERY_DESC_IDN_POWER = 0x8,
|
||||
QUERY_DESC_IDN_HEALTH = 0x9,
|
||||
QUERY_DESC_IDN_MAX,
|
||||
};
|
||||
|
||||
enum desc_header_offset {
|
||||
QUERY_DESC_LENGTH_OFFSET = 0x00,
|
||||
QUERY_DESC_DESC_TYPE_OFFSET = 0x01,
|
||||
};
|
||||
|
||||
/* Unit descriptor parameters offsets in bytes*/
|
||||
enum unit_desc_param {
|
||||
UNIT_DESC_PARAM_LEN = 0x0,
|
||||
UNIT_DESC_PARAM_TYPE = 0x1,
|
||||
UNIT_DESC_PARAM_UNIT_INDEX = 0x2,
|
||||
UNIT_DESC_PARAM_LU_ENABLE = 0x3,
|
||||
UNIT_DESC_PARAM_BOOT_LUN_ID = 0x4,
|
||||
UNIT_DESC_PARAM_LU_WR_PROTECT = 0x5,
|
||||
UNIT_DESC_PARAM_LU_Q_DEPTH = 0x6,
|
||||
UNIT_DESC_PARAM_PSA_SENSITIVE = 0x7,
|
||||
UNIT_DESC_PARAM_MEM_TYPE = 0x8,
|
||||
UNIT_DESC_PARAM_DATA_RELIABILITY = 0x9,
|
||||
UNIT_DESC_PARAM_LOGICAL_BLK_SIZE = 0xA,
|
||||
UNIT_DESC_PARAM_LOGICAL_BLK_COUNT = 0xB,
|
||||
UNIT_DESC_PARAM_ERASE_BLK_SIZE = 0x13,
|
||||
UNIT_DESC_PARAM_PROVISIONING_TYPE = 0x17,
|
||||
UNIT_DESC_PARAM_PHY_MEM_RSRC_CNT = 0x18,
|
||||
UNIT_DESC_PARAM_CTX_CAPABILITIES = 0x20,
|
||||
UNIT_DESC_PARAM_LARGE_UNIT_SIZE_M1 = 0x22,
|
||||
UNIT_DESC_PARAM_HPB_LU_MAX_ACTIVE_RGNS = 0x23,
|
||||
UNIT_DESC_PARAM_HPB_PIN_RGN_START_OFF = 0x25,
|
||||
UNIT_DESC_PARAM_HPB_NUM_PIN_RGNS = 0x27,
|
||||
UNIT_DESC_PARAM_WB_BUF_ALLOC_UNITS = 0x29,
|
||||
};
|
||||
|
||||
/* Device descriptor parameters offsets in bytes*/
|
||||
enum device_desc_param {
|
||||
DEVICE_DESC_PARAM_LEN = 0x0,
|
||||
DEVICE_DESC_PARAM_TYPE = 0x1,
|
||||
DEVICE_DESC_PARAM_DEVICE_TYPE = 0x2,
|
||||
DEVICE_DESC_PARAM_DEVICE_CLASS = 0x3,
|
||||
DEVICE_DESC_PARAM_DEVICE_SUB_CLASS = 0x4,
|
||||
DEVICE_DESC_PARAM_PRTCL = 0x5,
|
||||
DEVICE_DESC_PARAM_NUM_LU = 0x6,
|
||||
DEVICE_DESC_PARAM_NUM_WLU = 0x7,
|
||||
DEVICE_DESC_PARAM_BOOT_ENBL = 0x8,
|
||||
DEVICE_DESC_PARAM_DESC_ACCSS_ENBL = 0x9,
|
||||
DEVICE_DESC_PARAM_INIT_PWR_MODE = 0xA,
|
||||
DEVICE_DESC_PARAM_HIGH_PR_LUN = 0xB,
|
||||
DEVICE_DESC_PARAM_SEC_RMV_TYPE = 0xC,
|
||||
DEVICE_DESC_PARAM_SEC_LU = 0xD,
|
||||
DEVICE_DESC_PARAM_BKOP_TERM_LT = 0xE,
|
||||
DEVICE_DESC_PARAM_ACTVE_ICC_LVL = 0xF,
|
||||
DEVICE_DESC_PARAM_SPEC_VER = 0x10,
|
||||
DEVICE_DESC_PARAM_MANF_DATE = 0x12,
|
||||
DEVICE_DESC_PARAM_MANF_NAME = 0x14,
|
||||
DEVICE_DESC_PARAM_PRDCT_NAME = 0x15,
|
||||
DEVICE_DESC_PARAM_SN = 0x16,
|
||||
DEVICE_DESC_PARAM_OEM_ID = 0x17,
|
||||
DEVICE_DESC_PARAM_MANF_ID = 0x18,
|
||||
DEVICE_DESC_PARAM_UD_OFFSET = 0x1A,
|
||||
DEVICE_DESC_PARAM_UD_LEN = 0x1B,
|
||||
DEVICE_DESC_PARAM_RTT_CAP = 0x1C,
|
||||
DEVICE_DESC_PARAM_FRQ_RTC = 0x1D,
|
||||
DEVICE_DESC_PARAM_UFS_FEAT = 0x1F,
|
||||
DEVICE_DESC_PARAM_FFU_TMT = 0x20,
|
||||
DEVICE_DESC_PARAM_Q_DPTH = 0x21,
|
||||
DEVICE_DESC_PARAM_DEV_VER = 0x22,
|
||||
DEVICE_DESC_PARAM_NUM_SEC_WPA = 0x24,
|
||||
DEVICE_DESC_PARAM_PSA_MAX_DATA = 0x25,
|
||||
DEVICE_DESC_PARAM_PSA_TMT = 0x29,
|
||||
DEVICE_DESC_PARAM_PRDCT_REV = 0x2A,
|
||||
DEVICE_DESC_PARAM_HPB_VER = 0x40,
|
||||
DEVICE_DESC_PARAM_HPB_CONTROL = 0x42,
|
||||
DEVICE_DESC_PARAM_EXT_UFS_FEATURE_SUP = 0x4F,
|
||||
DEVICE_DESC_PARAM_WB_PRESRV_USRSPC_EN = 0x53,
|
||||
DEVICE_DESC_PARAM_WB_TYPE = 0x54,
|
||||
DEVICE_DESC_PARAM_WB_SHARED_ALLOC_UNITS = 0x55,
|
||||
};
|
||||
|
||||
/* Interconnect descriptor parameters offsets in bytes*/
|
||||
enum interconnect_desc_param {
|
||||
INTERCONNECT_DESC_PARAM_LEN = 0x0,
|
||||
INTERCONNECT_DESC_PARAM_TYPE = 0x1,
|
||||
INTERCONNECT_DESC_PARAM_UNIPRO_VER = 0x2,
|
||||
INTERCONNECT_DESC_PARAM_MPHY_VER = 0x4,
|
||||
};
|
||||
|
||||
/* Geometry descriptor parameters offsets in bytes*/
|
||||
enum geometry_desc_param {
|
||||
GEOMETRY_DESC_PARAM_LEN = 0x0,
|
||||
GEOMETRY_DESC_PARAM_TYPE = 0x1,
|
||||
GEOMETRY_DESC_PARAM_DEV_CAP = 0x4,
|
||||
GEOMETRY_DESC_PARAM_MAX_NUM_LUN = 0xC,
|
||||
GEOMETRY_DESC_PARAM_SEG_SIZE = 0xD,
|
||||
GEOMETRY_DESC_PARAM_ALLOC_UNIT_SIZE = 0x11,
|
||||
GEOMETRY_DESC_PARAM_MIN_BLK_SIZE = 0x12,
|
||||
GEOMETRY_DESC_PARAM_OPT_RD_BLK_SIZE = 0x13,
|
||||
GEOMETRY_DESC_PARAM_OPT_WR_BLK_SIZE = 0x14,
|
||||
GEOMETRY_DESC_PARAM_MAX_IN_BUF_SIZE = 0x15,
|
||||
GEOMETRY_DESC_PARAM_MAX_OUT_BUF_SIZE = 0x16,
|
||||
GEOMETRY_DESC_PARAM_RPMB_RW_SIZE = 0x17,
|
||||
GEOMETRY_DESC_PARAM_DYN_CAP_RSRC_PLC = 0x18,
|
||||
GEOMETRY_DESC_PARAM_DATA_ORDER = 0x19,
|
||||
GEOMETRY_DESC_PARAM_MAX_NUM_CTX = 0x1A,
|
||||
GEOMETRY_DESC_PARAM_TAG_UNIT_SIZE = 0x1B,
|
||||
GEOMETRY_DESC_PARAM_TAG_RSRC_SIZE = 0x1C,
|
||||
GEOMETRY_DESC_PARAM_SEC_RM_TYPES = 0x1D,
|
||||
GEOMETRY_DESC_PARAM_MEM_TYPES = 0x1E,
|
||||
GEOMETRY_DESC_PARAM_SCM_MAX_NUM_UNITS = 0x20,
|
||||
GEOMETRY_DESC_PARAM_SCM_CAP_ADJ_FCTR = 0x24,
|
||||
GEOMETRY_DESC_PARAM_NPM_MAX_NUM_UNITS = 0x26,
|
||||
GEOMETRY_DESC_PARAM_NPM_CAP_ADJ_FCTR = 0x2A,
|
||||
GEOMETRY_DESC_PARAM_ENM1_MAX_NUM_UNITS = 0x2C,
|
||||
GEOMETRY_DESC_PARAM_ENM1_CAP_ADJ_FCTR = 0x30,
|
||||
GEOMETRY_DESC_PARAM_ENM2_MAX_NUM_UNITS = 0x32,
|
||||
GEOMETRY_DESC_PARAM_ENM2_CAP_ADJ_FCTR = 0x36,
|
||||
GEOMETRY_DESC_PARAM_ENM3_MAX_NUM_UNITS = 0x38,
|
||||
GEOMETRY_DESC_PARAM_ENM3_CAP_ADJ_FCTR = 0x3C,
|
||||
GEOMETRY_DESC_PARAM_ENM4_MAX_NUM_UNITS = 0x3E,
|
||||
GEOMETRY_DESC_PARAM_ENM4_CAP_ADJ_FCTR = 0x42,
|
||||
GEOMETRY_DESC_PARAM_OPT_LOG_BLK_SIZE = 0x44,
|
||||
GEOMETRY_DESC_PARAM_HPB_REGION_SIZE = 0x48,
|
||||
GEOMETRY_DESC_PARAM_HPB_NUMBER_LU = 0x49,
|
||||
GEOMETRY_DESC_PARAM_HPB_SUBREGION_SIZE = 0x4A,
|
||||
GEOMETRY_DESC_PARAM_HPB_MAX_ACTIVE_REGS = 0x4B,
|
||||
GEOMETRY_DESC_PARAM_WB_MAX_ALLOC_UNITS = 0x4F,
|
||||
GEOMETRY_DESC_PARAM_WB_MAX_WB_LUNS = 0x53,
|
||||
GEOMETRY_DESC_PARAM_WB_BUFF_CAP_ADJ = 0x54,
|
||||
GEOMETRY_DESC_PARAM_WB_SUP_RED_TYPE = 0x55,
|
||||
GEOMETRY_DESC_PARAM_WB_SUP_WB_TYPE = 0x56,
|
||||
};
|
||||
|
||||
/* Health descriptor parameters offsets in bytes*/
|
||||
enum health_desc_param {
|
||||
HEALTH_DESC_PARAM_LEN = 0x0,
|
||||
HEALTH_DESC_PARAM_TYPE = 0x1,
|
||||
HEALTH_DESC_PARAM_EOL_INFO = 0x2,
|
||||
HEALTH_DESC_PARAM_LIFE_TIME_EST_A = 0x3,
|
||||
HEALTH_DESC_PARAM_LIFE_TIME_EST_B = 0x4,
|
||||
};
|
||||
|
||||
/* WriteBooster buffer mode */
|
||||
enum {
|
||||
WB_BUF_MODE_LU_DEDICATED = 0x0,
|
||||
WB_BUF_MODE_SHARED = 0x1,
|
||||
};
|
||||
|
||||
/*
|
||||
* Logical Unit Write Protect
|
||||
* 00h: LU not write protected
|
||||
* 01h: LU write protected when fPowerOnWPEn =1
|
||||
* 02h: LU permanently write protected when fPermanentWPEn =1
|
||||
*/
|
||||
enum ufs_lu_wp_type {
|
||||
UFS_LU_NO_WP = 0x00,
|
||||
UFS_LU_POWER_ON_WP = 0x01,
|
||||
UFS_LU_PERM_WP = 0x02,
|
||||
};
|
||||
|
||||
/* bActiveICCLevel parameter current units */
|
||||
enum {
|
||||
UFSHCD_NANO_AMP = 0,
|
||||
UFSHCD_MICRO_AMP = 1,
|
||||
UFSHCD_MILI_AMP = 2,
|
||||
UFSHCD_AMP = 3,
|
||||
};
|
||||
|
||||
/* Possible values for dExtendedUFSFeaturesSupport */
|
||||
enum {
|
||||
UFS_DEV_HPB_SUPPORT = BIT(7),
|
||||
UFS_DEV_WRITE_BOOSTER_SUP = BIT(8),
|
||||
};
|
||||
#define UFS_DEV_HPB_SUPPORT_VERSION 0x310
|
||||
|
||||
#define POWER_DESC_MAX_ACTV_ICC_LVLS 16
|
||||
|
||||
/* Attribute bActiveICCLevel parameter bit masks definitions */
|
||||
#define ATTR_ICC_LVL_UNIT_OFFSET 14
|
||||
#define ATTR_ICC_LVL_UNIT_MASK (0x3 << ATTR_ICC_LVL_UNIT_OFFSET)
|
||||
#define ATTR_ICC_LVL_VALUE_MASK 0x3FF
|
||||
|
||||
/* Power descriptor parameters offsets in bytes */
|
||||
enum power_desc_param_offset {
|
||||
PWR_DESC_LEN = 0x0,
|
||||
PWR_DESC_TYPE = 0x1,
|
||||
PWR_DESC_ACTIVE_LVLS_VCC_0 = 0x2,
|
||||
PWR_DESC_ACTIVE_LVLS_VCCQ_0 = 0x22,
|
||||
PWR_DESC_ACTIVE_LVLS_VCCQ2_0 = 0x42,
|
||||
};
|
||||
|
||||
/* Exception event mask values */
|
||||
enum {
|
||||
MASK_EE_STATUS = 0xFFFF,
|
||||
MASK_EE_DYNCAP_EVENT = BIT(0),
|
||||
MASK_EE_SYSPOOL_EVENT = BIT(1),
|
||||
MASK_EE_URGENT_BKOPS = BIT(2),
|
||||
MASK_EE_TOO_HIGH_TEMP = BIT(3),
|
||||
MASK_EE_TOO_LOW_TEMP = BIT(4),
|
||||
MASK_EE_WRITEBOOSTER_EVENT = BIT(5),
|
||||
MASK_EE_PERFORMANCE_THROTTLING = BIT(6),
|
||||
};
|
||||
|
||||
/* Background operation status */
|
||||
enum bkops_status {
|
||||
BKOPS_STATUS_NO_OP = 0x0,
|
||||
BKOPS_STATUS_NON_CRITICAL = 0x1,
|
||||
BKOPS_STATUS_PERF_IMPACT = 0x2,
|
||||
BKOPS_STATUS_CRITICAL = 0x3,
|
||||
BKOPS_STATUS_MAX = BKOPS_STATUS_CRITICAL,
|
||||
};
|
||||
|
||||
/* UTP QUERY Transaction Specific Fields OpCode */
|
||||
enum query_opcode {
|
||||
UPIU_QUERY_OPCODE_NOP = 0x0,
|
||||
UPIU_QUERY_OPCODE_READ_DESC = 0x1,
|
||||
UPIU_QUERY_OPCODE_WRITE_DESC = 0x2,
|
||||
UPIU_QUERY_OPCODE_READ_ATTR = 0x3,
|
||||
UPIU_QUERY_OPCODE_WRITE_ATTR = 0x4,
|
||||
UPIU_QUERY_OPCODE_READ_FLAG = 0x5,
|
||||
UPIU_QUERY_OPCODE_SET_FLAG = 0x6,
|
||||
UPIU_QUERY_OPCODE_CLEAR_FLAG = 0x7,
|
||||
UPIU_QUERY_OPCODE_TOGGLE_FLAG = 0x8,
|
||||
};
|
||||
|
||||
/* bRefClkFreq attribute values */
|
||||
enum ufs_ref_clk_freq {
|
||||
REF_CLK_FREQ_19_2_MHZ = 0,
|
||||
REF_CLK_FREQ_26_MHZ = 1,
|
||||
REF_CLK_FREQ_38_4_MHZ = 2,
|
||||
REF_CLK_FREQ_52_MHZ = 3,
|
||||
REF_CLK_FREQ_INVAL = -1,
|
||||
};
|
||||
|
||||
struct ufs_ref_clk {
|
||||
unsigned long freq_hz;
|
||||
enum ufs_ref_clk_freq val;
|
||||
};
|
||||
|
||||
/* Query response result code */
|
||||
enum {
|
||||
QUERY_RESULT_SUCCESS = 0x00,
|
||||
QUERY_RESULT_NOT_READABLE = 0xF6,
|
||||
QUERY_RESULT_NOT_WRITEABLE = 0xF7,
|
||||
QUERY_RESULT_ALREADY_WRITTEN = 0xF8,
|
||||
QUERY_RESULT_INVALID_LENGTH = 0xF9,
|
||||
QUERY_RESULT_INVALID_VALUE = 0xFA,
|
||||
QUERY_RESULT_INVALID_SELECTOR = 0xFB,
|
||||
QUERY_RESULT_INVALID_INDEX = 0xFC,
|
||||
QUERY_RESULT_INVALID_IDN = 0xFD,
|
||||
QUERY_RESULT_INVALID_OPCODE = 0xFE,
|
||||
QUERY_RESULT_GENERAL_FAILURE = 0xFF,
|
||||
};
|
||||
|
||||
/* UTP Transfer Request Command Type (CT) */
|
||||
enum {
|
||||
UPIU_COMMAND_SET_TYPE_SCSI = 0x0,
|
||||
UPIU_COMMAND_SET_TYPE_UFS = 0x1,
|
||||
UPIU_COMMAND_SET_TYPE_QUERY = 0x2,
|
||||
};
|
||||
|
||||
/* UTP Transfer Request Command Offset */
|
||||
#define UPIU_COMMAND_TYPE_OFFSET 28
|
||||
|
||||
/* Offset of the response code in the UPIU header */
|
||||
#define UPIU_RSP_CODE_OFFSET 8
|
||||
|
||||
enum {
|
||||
MASK_SCSI_STATUS = 0xFF,
|
||||
MASK_TASK_RESPONSE = 0xFF00,
|
||||
MASK_RSP_UPIU_RESULT = 0xFFFF,
|
||||
MASK_QUERY_DATA_SEG_LEN = 0xFFFF,
|
||||
MASK_RSP_UPIU_DATA_SEG_LEN = 0xFFFF,
|
||||
MASK_RSP_EXCEPTION_EVENT = 0x10000,
|
||||
MASK_TM_SERVICE_RESP = 0xFF,
|
||||
MASK_TM_FUNC = 0xFF,
|
||||
};
|
||||
|
||||
/* Task management service response */
|
||||
enum {
|
||||
UPIU_TASK_MANAGEMENT_FUNC_COMPL = 0x00,
|
||||
UPIU_TASK_MANAGEMENT_FUNC_NOT_SUPPORTED = 0x04,
|
||||
UPIU_TASK_MANAGEMENT_FUNC_SUCCEEDED = 0x08,
|
||||
UPIU_TASK_MANAGEMENT_FUNC_FAILED = 0x05,
|
||||
UPIU_INCORRECT_LOGICAL_UNIT_NO = 0x09,
|
||||
};
|
||||
|
||||
/* UFS device power modes */
|
||||
enum ufs_dev_pwr_mode {
|
||||
UFS_ACTIVE_PWR_MODE = 1,
|
||||
UFS_SLEEP_PWR_MODE = 2,
|
||||
UFS_POWERDOWN_PWR_MODE = 3,
|
||||
UFS_DEEPSLEEP_PWR_MODE = 4,
|
||||
};
|
||||
|
||||
#define UFS_WB_BUF_REMAIN_PERCENT(val) ((val) / 10)
|
||||
|
||||
/**
|
||||
* struct utp_cmd_rsp - Response UPIU structure
|
||||
* @residual_transfer_count: Residual transfer count DW-3
|
||||
* @reserved: Reserved double words DW-4 to DW-7
|
||||
* @sense_data_len: Sense data length DW-8 U16
|
||||
* @sense_data: Sense data field DW-8 to DW-12
|
||||
*/
|
||||
struct utp_cmd_rsp {
|
||||
__be32 residual_transfer_count;
|
||||
__be32 reserved[4];
|
||||
__be16 sense_data_len;
|
||||
u8 sense_data[UFS_SENSE_SIZE];
|
||||
};
|
||||
|
||||
struct ufshpb_active_field {
|
||||
__be16 active_rgn;
|
||||
__be16 active_srgn;
|
||||
};
|
||||
#define HPB_ACT_FIELD_SIZE 4
|
||||
|
||||
/**
|
||||
* struct utp_hpb_rsp - Response UPIU structure
|
||||
* @residual_transfer_count: Residual transfer count DW-3
|
||||
* @reserved1: Reserved double words DW-4 to DW-7
|
||||
* @sense_data_len: Sense data length DW-8 U16
|
||||
* @desc_type: Descriptor type of sense data
|
||||
* @additional_len: Additional length of sense data
|
||||
* @hpb_op: HPB operation type
|
||||
* @lun: LUN of response UPIU
|
||||
* @active_rgn_cnt: Active region count
|
||||
* @inactive_rgn_cnt: Inactive region count
|
||||
* @hpb_active_field: Recommended to read HPB region and subregion
|
||||
* @hpb_inactive_field: To be inactivated HPB region and subregion
|
||||
*/
|
||||
struct utp_hpb_rsp {
|
||||
__be32 residual_transfer_count;
|
||||
__be32 reserved1[4];
|
||||
__be16 sense_data_len;
|
||||
u8 desc_type;
|
||||
u8 additional_len;
|
||||
u8 hpb_op;
|
||||
u8 lun;
|
||||
u8 active_rgn_cnt;
|
||||
u8 inactive_rgn_cnt;
|
||||
struct ufshpb_active_field hpb_active_field[2];
|
||||
__be16 hpb_inactive_field[2];
|
||||
};
|
||||
#define UTP_HPB_RSP_SIZE 40
|
||||
|
||||
/**
|
||||
* struct utp_upiu_rsp - general upiu response structure
|
||||
* @header: UPIU header structure DW-0 to DW-2
|
||||
* @sr: fields structure for scsi command DW-3 to DW-12
|
||||
* @qr: fields structure for query request DW-3 to DW-7
|
||||
*/
|
||||
struct utp_upiu_rsp {
|
||||
struct utp_upiu_header header;
|
||||
union {
|
||||
struct utp_cmd_rsp sr;
|
||||
struct utp_hpb_rsp hr;
|
||||
struct utp_upiu_query qr;
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ufs_query_req - parameters for building a query request
|
||||
* @query_func: UPIU header query function
|
||||
* @upiu_req: the query request data
|
||||
*/
|
||||
struct ufs_query_req {
|
||||
u8 query_func;
|
||||
struct utp_upiu_query upiu_req;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ufs_query_resp - UPIU QUERY
|
||||
* @response: device response code
|
||||
* @upiu_res: query response data
|
||||
*/
|
||||
struct ufs_query_res {
|
||||
u8 response;
|
||||
struct utp_upiu_query upiu_res;
|
||||
};
|
||||
|
||||
#define UFS_VREG_VCC_MIN_UV 2700000 /* uV */
|
||||
#define UFS_VREG_VCC_MAX_UV 3600000 /* uV */
|
||||
#define UFS_VREG_VCC_1P8_MIN_UV 1700000 /* uV */
|
||||
#define UFS_VREG_VCC_1P8_MAX_UV 1950000 /* uV */
|
||||
#define UFS_VREG_VCCQ_MIN_UV 1140000 /* uV */
|
||||
#define UFS_VREG_VCCQ_MAX_UV 1260000 /* uV */
|
||||
#define UFS_VREG_VCCQ2_MIN_UV 1700000 /* uV */
|
||||
#define UFS_VREG_VCCQ2_MAX_UV 1950000 /* uV */
|
||||
|
||||
/*
|
||||
* VCCQ & VCCQ2 current requirement when UFS device is in sleep state
|
||||
* and link is in Hibern8 state.
|
||||
*/
|
||||
#define UFS_VREG_LPM_LOAD_UA 1000 /* uA */
|
||||
|
||||
struct ufs_vreg {
|
||||
struct regulator *reg;
|
||||
const char *name;
|
||||
bool always_on;
|
||||
bool enabled;
|
||||
int min_uV;
|
||||
int max_uV;
|
||||
int max_uA;
|
||||
};
|
||||
|
||||
struct ufs_vreg_info {
|
||||
struct ufs_vreg *vcc;
|
||||
struct ufs_vreg *vccq;
|
||||
struct ufs_vreg *vccq2;
|
||||
struct ufs_vreg *vdd_hba;
|
||||
};
|
||||
|
||||
struct ufs_dev_info {
|
||||
bool f_power_on_wp_en;
|
||||
/* Keeps information if any of the LU is power on write protected */
|
||||
bool is_lu_power_on_wp;
|
||||
/* Maximum number of general LU supported by the UFS device */
|
||||
u8 max_lu_supported;
|
||||
u16 wmanufacturerid;
|
||||
/*UFS device Product Name */
|
||||
u8 *model;
|
||||
u16 wspecversion;
|
||||
u32 clk_gating_wait_us;
|
||||
|
||||
/* UFS HPB related flag */
|
||||
bool hpb_enabled;
|
||||
|
||||
/* UFS WB related flags */
|
||||
bool wb_enabled;
|
||||
bool wb_buf_flush_enabled;
|
||||
u8 wb_dedicated_lu;
|
||||
u8 wb_buffer_type;
|
||||
|
||||
bool b_rpm_dev_flush_capable;
|
||||
u8 b_presrv_uspc_en;
|
||||
};
|
||||
|
||||
/*
|
||||
* This enum is used in string mapping in include/trace/events/ufs.h.
|
||||
*/
|
||||
enum ufs_trace_str_t {
|
||||
UFS_CMD_SEND, UFS_CMD_COMP, UFS_DEV_COMP,
|
||||
UFS_QUERY_SEND, UFS_QUERY_COMP, UFS_QUERY_ERR,
|
||||
UFS_TM_SEND, UFS_TM_COMP, UFS_TM_ERR
|
||||
};
|
||||
|
||||
/*
|
||||
* Transaction Specific Fields (TSF) type in the UPIU package, this enum is
|
||||
* used in include/trace/events/ufs.h for UFS command trace.
|
||||
*/
|
||||
enum ufs_trace_tsf_t {
|
||||
UFS_TSF_CDB, UFS_TSF_OSF, UFS_TSF_TM_INPUT, UFS_TSF_TM_OUTPUT
|
||||
};
|
||||
|
||||
/**
|
||||
* ufs_is_valid_unit_desc_lun - checks if the given LUN has a unit descriptor
|
||||
* @dev_info: pointer of instance of struct ufs_dev_info
|
||||
* @lun: LU number to check
|
||||
* @return: true if the lun has a matching unit descriptor, false otherwise
|
||||
*/
|
||||
static inline bool ufs_is_valid_unit_desc_lun(struct ufs_dev_info *dev_info,
|
||||
u8 lun, u8 param_offset)
|
||||
{
|
||||
if (!dev_info || !dev_info->max_lu_supported) {
|
||||
pr_err("Max General LU supported by UFS isn't initialized\n");
|
||||
return false;
|
||||
}
|
||||
/* WB is available only for the logical unit from 0 to 7 */
|
||||
if (param_offset == UNIT_DESC_PARAM_WB_BUF_ALLOC_UNITS)
|
||||
return lun < UFS_UPIU_MAX_WB_LUN_ID;
|
||||
return lun == UFS_UPIU_RPMB_WLUN || (lun < dev_info->max_lu_supported);
|
||||
}
|
||||
|
||||
#endif /* End of Header */
|
||||
125
include/drivers-private/scsi/ufs/k515/ufs_quirks.h
Normal file
125
include/drivers-private/scsi/ufs/k515/ufs_quirks.h
Normal file
@@ -0,0 +1,125 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef _UFS_QUIRKS_H_
|
||||
#define _UFS_QUIRKS_H_
|
||||
|
||||
/* return true if s1 is a prefix of s2 */
|
||||
#define STR_PRFX_EQUAL(s1, s2) !strncmp(s1, s2, strlen(s1))
|
||||
|
||||
#define UFS_ANY_VENDOR 0xFFFF
|
||||
#define UFS_ANY_MODEL "ANY_MODEL"
|
||||
|
||||
#define UFS_VENDOR_MICRON 0x12C
|
||||
#define UFS_VENDOR_SAMSUNG 0x1CE
|
||||
#define UFS_VENDOR_SKHYNIX 0x1AD
|
||||
#define UFS_VENDOR_TOSHIBA 0x198
|
||||
#define UFS_VENDOR_WDC 0x145
|
||||
|
||||
/**
|
||||
* ufs_dev_fix - ufs device quirk info
|
||||
* @card: ufs card details
|
||||
* @quirk: device quirk
|
||||
*/
|
||||
struct ufs_dev_fix {
|
||||
u16 wmanufacturerid;
|
||||
u8 *model;
|
||||
unsigned int quirk;
|
||||
};
|
||||
|
||||
#define END_FIX { }
|
||||
|
||||
/* add specific device quirk */
|
||||
#define UFS_FIX(_vendor, _model, _quirk) { \
|
||||
.wmanufacturerid = (_vendor),\
|
||||
.model = (_model), \
|
||||
.quirk = (_quirk), \
|
||||
}
|
||||
|
||||
/*
|
||||
* Some vendor's UFS device sends back to back NACs for the DL data frames
|
||||
* causing the host controller to raise the DFES error status. Sometimes
|
||||
* such UFS devices send back to back NAC without waiting for new
|
||||
* retransmitted DL frame from the host and in such cases it might be possible
|
||||
* the Host UniPro goes into bad state without raising the DFES error
|
||||
* interrupt. If this happens then all the pending commands would timeout
|
||||
* only after respective SW command (which is generally too large).
|
||||
*
|
||||
* We can workaround such device behaviour like this:
|
||||
* - As soon as SW sees the DL NAC error, it should schedule the error handler
|
||||
* - Error handler would sleep for 50ms to see if there are any fatal errors
|
||||
* raised by UFS controller.
|
||||
* - If there are fatal errors then SW does normal error recovery.
|
||||
* - If there are no fatal errors then SW sends the NOP command to device
|
||||
* to check if link is alive.
|
||||
* - If NOP command times out, SW does normal error recovery
|
||||
* - If NOP command succeed, skip the error handling.
|
||||
*
|
||||
* If DL NAC error is seen multiple times with some vendor's UFS devices then
|
||||
* enable this quirk to initiate quick error recovery and also silence related
|
||||
* error logs to reduce spamming of kernel logs.
|
||||
*/
|
||||
#define UFS_DEVICE_QUIRK_RECOVERY_FROM_DL_NAC_ERRORS (1 << 2)
|
||||
|
||||
/*
|
||||
* Few Toshiba UFS device models advertise RX_MIN_ACTIVATETIME_CAPABILITY as
|
||||
* 600us which may not be enough for reliable hibern8 exit hardware sequence
|
||||
* from UFS device.
|
||||
* To workaround this issue, host should set its PA_TACTIVATE time to 1ms even
|
||||
* if device advertises RX_MIN_ACTIVATETIME_CAPABILITY less than 1ms.
|
||||
*/
|
||||
#define UFS_DEVICE_QUIRK_PA_TACTIVATE (1 << 4)
|
||||
|
||||
/*
|
||||
* It seems some UFS devices may keep drawing more than sleep current
|
||||
* (atleast for 500us) from UFS rails (especially from VCCQ rail).
|
||||
* To avoid this situation, add 2ms delay before putting these UFS
|
||||
* rails in LPM mode.
|
||||
*/
|
||||
#define UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM (1 << 6)
|
||||
|
||||
/*
|
||||
* Some UFS devices require host PA_TACTIVATE to be lower than device
|
||||
* PA_TACTIVATE, enabling this quirk ensure this.
|
||||
*/
|
||||
#define UFS_DEVICE_QUIRK_HOST_PA_TACTIVATE (1 << 7)
|
||||
|
||||
/*
|
||||
* The max. value PA_SaveConfigTime is 250 (10us) but this is not enough for
|
||||
* some vendors.
|
||||
* Gear switch from PWM to HS may fail even with this max. PA_SaveConfigTime.
|
||||
* Gear switch can be issued by host controller as an error recovery and any
|
||||
* software delay will not help on this case so we need to increase
|
||||
* PA_SaveConfigTime to >32us as per vendor recommendation.
|
||||
*/
|
||||
#define UFS_DEVICE_QUIRK_HOST_PA_SAVECONFIGTIME (1 << 8)
|
||||
|
||||
/*
|
||||
* Some UFS devices require VS_DebugSaveConfigTime is 0x10,
|
||||
* enabling this quirk ensure this.
|
||||
*/
|
||||
#define UFS_DEVICE_QUIRK_HOST_VS_DEBUGSAVECONFIGTIME (1 << 9)
|
||||
|
||||
/*
|
||||
* Some pre-3.1 UFS devices can support extended features by upgrading
|
||||
* the firmware. Enable this quirk to make UFS core driver probe and enable
|
||||
* supported features on such devices.
|
||||
*/
|
||||
#define UFS_DEVICE_QUIRK_SUPPORT_EXTENDED_FEATURES (1 << 10)
|
||||
|
||||
/*
|
||||
* Some UFS devices require delay after VCC power rail is turned-off.
|
||||
* Enable this quirk to introduce 5ms delays after VCC power-off during
|
||||
* suspend flow.
|
||||
*/
|
||||
#define UFS_DEVICE_QUIRK_DELAY_AFTER_LPM (1 << 11)
|
||||
|
||||
/*
|
||||
* Some UFS devices require L2P entry should be swapped before being sent to the
|
||||
* UFS device for HPB READ command.
|
||||
*/
|
||||
#define UFS_DEVICE_QUIRK_SWAP_L2P_ENTRY_FOR_HPB_READ (1 << 12)
|
||||
|
||||
#endif /* UFS_QUIRKS_H_ */
|
||||
36
include/drivers-private/scsi/ufs/k515/ufshcd-pltfrm.h
Normal file
36
include/drivers-private/scsi/ufs/k515/ufshcd-pltfrm.h
Normal file
@@ -0,0 +1,36 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright (c) 2015, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef UFSHCD_PLTFRM_H_
|
||||
#define UFSHCD_PLTFRM_H_
|
||||
|
||||
#include "ufshcd.h"
|
||||
|
||||
#define UFS_PWM_MODE 1
|
||||
#define UFS_HS_MODE 2
|
||||
|
||||
struct ufs_dev_params {
|
||||
u32 pwm_rx_gear; /* pwm rx gear to work in */
|
||||
u32 pwm_tx_gear; /* pwm tx gear to work in */
|
||||
u32 hs_rx_gear; /* hs rx gear to work in */
|
||||
u32 hs_tx_gear; /* hs tx gear to work in */
|
||||
u32 rx_lanes; /* number of rx lanes */
|
||||
u32 tx_lanes; /* number of tx lanes */
|
||||
u32 rx_pwr_pwm; /* rx pwm working pwr */
|
||||
u32 tx_pwr_pwm; /* tx pwm working pwr */
|
||||
u32 rx_pwr_hs; /* rx hs working pwr */
|
||||
u32 tx_pwr_hs; /* tx hs working pwr */
|
||||
u32 hs_rate; /* rate A/B to work in HS */
|
||||
u32 desired_working_mode;
|
||||
};
|
||||
|
||||
int ufshcd_get_pwr_dev_param(struct ufs_dev_params *dev_param,
|
||||
struct ufs_pa_layer_attr *dev_max,
|
||||
struct ufs_pa_layer_attr *agreed_pwr);
|
||||
void ufshcd_init_pwr_dev_param(struct ufs_dev_params *dev_param);
|
||||
int ufshcd_pltfrm_init(struct platform_device *pdev,
|
||||
const struct ufs_hba_variant_ops *vops);
|
||||
void ufshcd_pltfrm_shutdown(struct platform_device *pdev);
|
||||
|
||||
#endif /* UFSHCD_PLTFRM_H_ */
|
||||
1392
include/drivers-private/scsi/ufs/k515/ufshcd.h
Normal file
1392
include/drivers-private/scsi/ufs/k515/ufshcd.h
Normal file
File diff suppressed because it is too large
Load Diff
506
include/drivers-private/scsi/ufs/k515/ufshci.h
Normal file
506
include/drivers-private/scsi/ufs/k515/ufshci.h
Normal file
@@ -0,0 +1,506 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* Universal Flash Storage Host controller driver
|
||||
* Copyright (C) 2011-2013 Samsung India Software Operations
|
||||
*
|
||||
* Authors:
|
||||
* Santosh Yaraganavi <santosh.sy@samsung.com>
|
||||
* Vinayak Holikatti <h.vinayak@samsung.com>
|
||||
*/
|
||||
|
||||
#ifndef _UFSHCI_H
|
||||
#define _UFSHCI_H
|
||||
|
||||
enum {
|
||||
TASK_REQ_UPIU_SIZE_DWORDS = 8,
|
||||
TASK_RSP_UPIU_SIZE_DWORDS = 8,
|
||||
ALIGNED_UPIU_SIZE = 512,
|
||||
};
|
||||
|
||||
/* UFSHCI Registers */
|
||||
enum {
|
||||
REG_CONTROLLER_CAPABILITIES = 0x00,
|
||||
REG_UFS_VERSION = 0x08,
|
||||
REG_CONTROLLER_DEV_ID = 0x10,
|
||||
REG_CONTROLLER_PROD_ID = 0x14,
|
||||
REG_AUTO_HIBERNATE_IDLE_TIMER = 0x18,
|
||||
REG_INTERRUPT_STATUS = 0x20,
|
||||
REG_INTERRUPT_ENABLE = 0x24,
|
||||
REG_CONTROLLER_STATUS = 0x30,
|
||||
REG_CONTROLLER_ENABLE = 0x34,
|
||||
REG_UIC_ERROR_CODE_PHY_ADAPTER_LAYER = 0x38,
|
||||
REG_UIC_ERROR_CODE_DATA_LINK_LAYER = 0x3C,
|
||||
REG_UIC_ERROR_CODE_NETWORK_LAYER = 0x40,
|
||||
REG_UIC_ERROR_CODE_TRANSPORT_LAYER = 0x44,
|
||||
REG_UIC_ERROR_CODE_DME = 0x48,
|
||||
REG_UTP_TRANSFER_REQ_INT_AGG_CONTROL = 0x4C,
|
||||
REG_UTP_TRANSFER_REQ_LIST_BASE_L = 0x50,
|
||||
REG_UTP_TRANSFER_REQ_LIST_BASE_H = 0x54,
|
||||
REG_UTP_TRANSFER_REQ_DOOR_BELL = 0x58,
|
||||
REG_UTP_TRANSFER_REQ_LIST_CLEAR = 0x5C,
|
||||
REG_UTP_TRANSFER_REQ_LIST_RUN_STOP = 0x60,
|
||||
REG_UTP_TASK_REQ_LIST_BASE_L = 0x70,
|
||||
REG_UTP_TASK_REQ_LIST_BASE_H = 0x74,
|
||||
REG_UTP_TASK_REQ_DOOR_BELL = 0x78,
|
||||
REG_UTP_TASK_REQ_LIST_CLEAR = 0x7C,
|
||||
REG_UTP_TASK_REQ_LIST_RUN_STOP = 0x80,
|
||||
REG_UIC_COMMAND = 0x90,
|
||||
REG_UIC_COMMAND_ARG_1 = 0x94,
|
||||
REG_UIC_COMMAND_ARG_2 = 0x98,
|
||||
REG_UIC_COMMAND_ARG_3 = 0x9C,
|
||||
|
||||
UFSHCI_REG_SPACE_SIZE = 0xA0,
|
||||
|
||||
REG_UFS_CCAP = 0x100,
|
||||
REG_UFS_CRYPTOCAP = 0x104,
|
||||
|
||||
UFSHCI_CRYPTO_REG_SPACE_SIZE = 0x400,
|
||||
};
|
||||
|
||||
/* Controller capability masks */
|
||||
enum {
|
||||
MASK_TRANSFER_REQUESTS_SLOTS = 0x0000001F,
|
||||
MASK_TASK_MANAGEMENT_REQUEST_SLOTS = 0x00070000,
|
||||
MASK_AUTO_HIBERN8_SUPPORT = 0x00800000,
|
||||
MASK_64_ADDRESSING_SUPPORT = 0x01000000,
|
||||
MASK_OUT_OF_ORDER_DATA_DELIVERY_SUPPORT = 0x02000000,
|
||||
MASK_UIC_DME_TEST_MODE_SUPPORT = 0x04000000,
|
||||
MASK_CRYPTO_SUPPORT = 0x10000000,
|
||||
};
|
||||
|
||||
#define UFS_MASK(mask, offset) ((mask) << (offset))
|
||||
|
||||
/* UFS Version 08h */
|
||||
#define MINOR_VERSION_NUM_MASK UFS_MASK(0xFFFF, 0)
|
||||
#define MAJOR_VERSION_NUM_MASK UFS_MASK(0xFFFF, 16)
|
||||
|
||||
/*
|
||||
* Controller UFSHCI version
|
||||
* - 2.x and newer use the following scheme:
|
||||
* major << 8 + minor << 4
|
||||
* - 1.x has been converted to match this in
|
||||
* ufshcd_get_ufs_version()
|
||||
*/
|
||||
static inline u32 ufshci_version(u32 major, u32 minor)
|
||||
{
|
||||
return (major << 8) + (minor << 4);
|
||||
}
|
||||
|
||||
/*
|
||||
* HCDDID - Host Controller Identification Descriptor
|
||||
* - Device ID and Device Class 10h
|
||||
*/
|
||||
#define DEVICE_CLASS UFS_MASK(0xFFFF, 0)
|
||||
#define DEVICE_ID UFS_MASK(0xFF, 24)
|
||||
|
||||
/*
|
||||
* HCPMID - Host Controller Identification Descriptor
|
||||
* - Product/Manufacturer ID 14h
|
||||
*/
|
||||
#define MANUFACTURE_ID_MASK UFS_MASK(0xFFFF, 0)
|
||||
#define PRODUCT_ID_MASK UFS_MASK(0xFFFF, 16)
|
||||
|
||||
/* AHIT - Auto-Hibernate Idle Timer */
|
||||
#define UFSHCI_AHIBERN8_TIMER_MASK GENMASK(9, 0)
|
||||
#define UFSHCI_AHIBERN8_SCALE_MASK GENMASK(12, 10)
|
||||
#define UFSHCI_AHIBERN8_SCALE_FACTOR 10
|
||||
#define UFSHCI_AHIBERN8_MAX (1023 * 100000)
|
||||
|
||||
/*
|
||||
* IS - Interrupt Status - 20h
|
||||
*/
|
||||
#define UTP_TRANSFER_REQ_COMPL 0x1
|
||||
#define UIC_DME_END_PT_RESET 0x2
|
||||
#define UIC_ERROR 0x4
|
||||
#define UIC_TEST_MODE 0x8
|
||||
#define UIC_POWER_MODE 0x10
|
||||
#define UIC_HIBERNATE_EXIT 0x20
|
||||
#define UIC_HIBERNATE_ENTER 0x40
|
||||
#define UIC_LINK_LOST 0x80
|
||||
#define UIC_LINK_STARTUP 0x100
|
||||
#define UTP_TASK_REQ_COMPL 0x200
|
||||
#define UIC_COMMAND_COMPL 0x400
|
||||
#define DEVICE_FATAL_ERROR 0x800
|
||||
#define CONTROLLER_FATAL_ERROR 0x10000
|
||||
#define SYSTEM_BUS_FATAL_ERROR 0x20000
|
||||
#define CRYPTO_ENGINE_FATAL_ERROR 0x40000
|
||||
|
||||
#define UFSHCD_UIC_HIBERN8_MASK (UIC_HIBERNATE_ENTER |\
|
||||
UIC_HIBERNATE_EXIT)
|
||||
|
||||
#define UFSHCD_UIC_PWR_MASK (UFSHCD_UIC_HIBERN8_MASK |\
|
||||
UIC_POWER_MODE)
|
||||
|
||||
#define UFSHCD_UIC_MASK (UIC_COMMAND_COMPL | UFSHCD_UIC_PWR_MASK)
|
||||
|
||||
#define UFSHCD_ERROR_MASK (UIC_ERROR |\
|
||||
DEVICE_FATAL_ERROR |\
|
||||
CONTROLLER_FATAL_ERROR |\
|
||||
SYSTEM_BUS_FATAL_ERROR |\
|
||||
CRYPTO_ENGINE_FATAL_ERROR)
|
||||
|
||||
#define INT_FATAL_ERRORS (DEVICE_FATAL_ERROR |\
|
||||
CONTROLLER_FATAL_ERROR |\
|
||||
SYSTEM_BUS_FATAL_ERROR |\
|
||||
CRYPTO_ENGINE_FATAL_ERROR)
|
||||
|
||||
/* HCS - Host Controller Status 30h */
|
||||
#define DEVICE_PRESENT 0x1
|
||||
#define UTP_TRANSFER_REQ_LIST_READY 0x2
|
||||
#define UTP_TASK_REQ_LIST_READY 0x4
|
||||
#define UIC_COMMAND_READY 0x8
|
||||
#define HOST_ERROR_INDICATOR 0x10
|
||||
#define DEVICE_ERROR_INDICATOR 0x20
|
||||
#define UIC_POWER_MODE_CHANGE_REQ_STATUS_MASK UFS_MASK(0x7, 8)
|
||||
|
||||
#define UFSHCD_STATUS_READY (UTP_TRANSFER_REQ_LIST_READY |\
|
||||
UTP_TASK_REQ_LIST_READY |\
|
||||
UIC_COMMAND_READY)
|
||||
|
||||
enum {
|
||||
PWR_OK = 0x0,
|
||||
PWR_LOCAL = 0x01,
|
||||
PWR_REMOTE = 0x02,
|
||||
PWR_BUSY = 0x03,
|
||||
PWR_ERROR_CAP = 0x04,
|
||||
PWR_FATAL_ERROR = 0x05,
|
||||
};
|
||||
|
||||
/* HCE - Host Controller Enable 34h */
|
||||
#define CONTROLLER_ENABLE 0x1
|
||||
#define CONTROLLER_DISABLE 0x0
|
||||
#define CRYPTO_GENERAL_ENABLE 0x2
|
||||
|
||||
/* UECPA - Host UIC Error Code PHY Adapter Layer 38h */
|
||||
#define UIC_PHY_ADAPTER_LAYER_ERROR 0x80000000
|
||||
#define UIC_PHY_ADAPTER_LAYER_ERROR_CODE_MASK 0x1F
|
||||
#define UIC_PHY_ADAPTER_LAYER_LANE_ERR_MASK 0xF
|
||||
#define UIC_PHY_ADAPTER_LAYER_GENERIC_ERROR 0x10
|
||||
|
||||
/* UECDL - Host UIC Error Code Data Link Layer 3Ch */
|
||||
#define UIC_DATA_LINK_LAYER_ERROR 0x80000000
|
||||
#define UIC_DATA_LINK_LAYER_ERROR_CODE_MASK 0xFFFF
|
||||
#define UIC_DATA_LINK_LAYER_ERROR_TCX_REP_TIMER_EXP 0x2
|
||||
#define UIC_DATA_LINK_LAYER_ERROR_AFCX_REQ_TIMER_EXP 0x4
|
||||
#define UIC_DATA_LINK_LAYER_ERROR_FCX_PRO_TIMER_EXP 0x8
|
||||
#define UIC_DATA_LINK_LAYER_ERROR_RX_BUF_OF 0x20
|
||||
#define UIC_DATA_LINK_LAYER_ERROR_PA_INIT 0x2000
|
||||
#define UIC_DATA_LINK_LAYER_ERROR_NAC_RECEIVED 0x0001
|
||||
#define UIC_DATA_LINK_LAYER_ERROR_TCx_REPLAY_TIMEOUT 0x0002
|
||||
|
||||
/* UECN - Host UIC Error Code Network Layer 40h */
|
||||
#define UIC_NETWORK_LAYER_ERROR 0x80000000
|
||||
#define UIC_NETWORK_LAYER_ERROR_CODE_MASK 0x7
|
||||
#define UIC_NETWORK_UNSUPPORTED_HEADER_TYPE 0x1
|
||||
#define UIC_NETWORK_BAD_DEVICEID_ENC 0x2
|
||||
#define UIC_NETWORK_LHDR_TRAP_PACKET_DROPPING 0x4
|
||||
|
||||
/* UECT - Host UIC Error Code Transport Layer 44h */
|
||||
#define UIC_TRANSPORT_LAYER_ERROR 0x80000000
|
||||
#define UIC_TRANSPORT_LAYER_ERROR_CODE_MASK 0x7F
|
||||
#define UIC_TRANSPORT_UNSUPPORTED_HEADER_TYPE 0x1
|
||||
#define UIC_TRANSPORT_UNKNOWN_CPORTID 0x2
|
||||
#define UIC_TRANSPORT_NO_CONNECTION_RX 0x4
|
||||
#define UIC_TRANSPORT_CONTROLLED_SEGMENT_DROPPING 0x8
|
||||
#define UIC_TRANSPORT_BAD_TC 0x10
|
||||
#define UIC_TRANSPORT_E2E_CREDIT_OVERFOW 0x20
|
||||
#define UIC_TRANSPORT_SAFETY_VALUE_DROPPING 0x40
|
||||
|
||||
/* UECDME - Host UIC Error Code DME 48h */
|
||||
#define UIC_DME_ERROR 0x80000000
|
||||
#define UIC_DME_ERROR_CODE_MASK 0x1
|
||||
|
||||
/* UTRIACR - Interrupt Aggregation control register - 0x4Ch */
|
||||
#define INT_AGGR_TIMEOUT_VAL_MASK 0xFF
|
||||
#define INT_AGGR_COUNTER_THRESHOLD_MASK UFS_MASK(0x1F, 8)
|
||||
#define INT_AGGR_COUNTER_AND_TIMER_RESET 0x10000
|
||||
#define INT_AGGR_STATUS_BIT 0x100000
|
||||
#define INT_AGGR_PARAM_WRITE 0x1000000
|
||||
#define INT_AGGR_ENABLE 0x80000000
|
||||
|
||||
/* UTRLRSR - UTP Transfer Request Run-Stop Register 60h */
|
||||
#define UTP_TRANSFER_REQ_LIST_RUN_STOP_BIT 0x1
|
||||
|
||||
/* UTMRLRSR - UTP Task Management Request Run-Stop Register 80h */
|
||||
#define UTP_TASK_REQ_LIST_RUN_STOP_BIT 0x1
|
||||
|
||||
/* UICCMD - UIC Command */
|
||||
#define COMMAND_OPCODE_MASK 0xFF
|
||||
#define GEN_SELECTOR_INDEX_MASK 0xFFFF
|
||||
|
||||
#define MIB_ATTRIBUTE_MASK UFS_MASK(0xFFFF, 16)
|
||||
#define RESET_LEVEL 0xFF
|
||||
|
||||
#define ATTR_SET_TYPE_MASK UFS_MASK(0xFF, 16)
|
||||
#define CONFIG_RESULT_CODE_MASK 0xFF
|
||||
#define GENERIC_ERROR_CODE_MASK 0xFF
|
||||
|
||||
/* GenSelectorIndex calculation macros for M-PHY attributes */
|
||||
#define UIC_ARG_MPHY_TX_GEN_SEL_INDEX(lane) (lane)
|
||||
#define UIC_ARG_MPHY_RX_GEN_SEL_INDEX(lane) (PA_MAXDATALANES + (lane))
|
||||
|
||||
#define UIC_ARG_MIB_SEL(attr, sel) ((((attr) & 0xFFFF) << 16) |\
|
||||
((sel) & 0xFFFF))
|
||||
#define UIC_ARG_MIB(attr) UIC_ARG_MIB_SEL(attr, 0)
|
||||
#define UIC_ARG_ATTR_TYPE(t) (((t) & 0xFF) << 16)
|
||||
#define UIC_GET_ATTR_ID(v) (((v) >> 16) & 0xFFFF)
|
||||
|
||||
/* Link Status*/
|
||||
enum link_status {
|
||||
UFSHCD_LINK_IS_DOWN = 1,
|
||||
UFSHCD_LINK_IS_UP = 2,
|
||||
};
|
||||
|
||||
/* UIC Commands */
|
||||
enum uic_cmd_dme {
|
||||
UIC_CMD_DME_GET = 0x01,
|
||||
UIC_CMD_DME_SET = 0x02,
|
||||
UIC_CMD_DME_PEER_GET = 0x03,
|
||||
UIC_CMD_DME_PEER_SET = 0x04,
|
||||
UIC_CMD_DME_POWERON = 0x10,
|
||||
UIC_CMD_DME_POWEROFF = 0x11,
|
||||
UIC_CMD_DME_ENABLE = 0x12,
|
||||
UIC_CMD_DME_RESET = 0x14,
|
||||
UIC_CMD_DME_END_PT_RST = 0x15,
|
||||
UIC_CMD_DME_LINK_STARTUP = 0x16,
|
||||
UIC_CMD_DME_HIBER_ENTER = 0x17,
|
||||
UIC_CMD_DME_HIBER_EXIT = 0x18,
|
||||
UIC_CMD_DME_TEST_MODE = 0x1A,
|
||||
};
|
||||
|
||||
/* UIC Config result code / Generic error code */
|
||||
enum {
|
||||
UIC_CMD_RESULT_SUCCESS = 0x00,
|
||||
UIC_CMD_RESULT_INVALID_ATTR = 0x01,
|
||||
UIC_CMD_RESULT_FAILURE = 0x01,
|
||||
UIC_CMD_RESULT_INVALID_ATTR_VALUE = 0x02,
|
||||
UIC_CMD_RESULT_READ_ONLY_ATTR = 0x03,
|
||||
UIC_CMD_RESULT_WRITE_ONLY_ATTR = 0x04,
|
||||
UIC_CMD_RESULT_BAD_INDEX = 0x05,
|
||||
UIC_CMD_RESULT_LOCKED_ATTR = 0x06,
|
||||
UIC_CMD_RESULT_BAD_TEST_FEATURE_INDEX = 0x07,
|
||||
UIC_CMD_RESULT_PEER_COMM_FAILURE = 0x08,
|
||||
UIC_CMD_RESULT_BUSY = 0x09,
|
||||
UIC_CMD_RESULT_DME_FAILURE = 0x0A,
|
||||
};
|
||||
|
||||
#define MASK_UIC_COMMAND_RESULT 0xFF
|
||||
|
||||
#define INT_AGGR_COUNTER_THLD_VAL(c) (((c) & 0x1F) << 8)
|
||||
#define INT_AGGR_TIMEOUT_VAL(t) (((t) & 0xFF) << 0)
|
||||
|
||||
/* Interrupt disable masks */
|
||||
enum {
|
||||
/* Interrupt disable mask for UFSHCI v1.0 */
|
||||
INTERRUPT_MASK_ALL_VER_10 = 0x30FFF,
|
||||
INTERRUPT_MASK_RW_VER_10 = 0x30000,
|
||||
|
||||
/* Interrupt disable mask for UFSHCI v1.1 */
|
||||
INTERRUPT_MASK_ALL_VER_11 = 0x31FFF,
|
||||
|
||||
/* Interrupt disable mask for UFSHCI v2.1 */
|
||||
INTERRUPT_MASK_ALL_VER_21 = 0x71FFF,
|
||||
};
|
||||
|
||||
/* CCAP - Crypto Capability 100h */
|
||||
union ufs_crypto_capabilities {
|
||||
__le32 reg_val;
|
||||
struct {
|
||||
u8 num_crypto_cap;
|
||||
u8 config_count;
|
||||
u8 reserved;
|
||||
u8 config_array_ptr;
|
||||
};
|
||||
};
|
||||
|
||||
enum ufs_crypto_key_size {
|
||||
UFS_CRYPTO_KEY_SIZE_INVALID = 0x0,
|
||||
UFS_CRYPTO_KEY_SIZE_128 = 0x1,
|
||||
UFS_CRYPTO_KEY_SIZE_192 = 0x2,
|
||||
UFS_CRYPTO_KEY_SIZE_256 = 0x3,
|
||||
UFS_CRYPTO_KEY_SIZE_512 = 0x4,
|
||||
};
|
||||
|
||||
enum ufs_crypto_alg {
|
||||
UFS_CRYPTO_ALG_AES_XTS = 0x0,
|
||||
UFS_CRYPTO_ALG_BITLOCKER_AES_CBC = 0x1,
|
||||
UFS_CRYPTO_ALG_AES_ECB = 0x2,
|
||||
UFS_CRYPTO_ALG_ESSIV_AES_CBC = 0x3,
|
||||
};
|
||||
|
||||
/* x-CRYPTOCAP - Crypto Capability X */
|
||||
union ufs_crypto_cap_entry {
|
||||
__le32 reg_val;
|
||||
struct {
|
||||
u8 algorithm_id;
|
||||
u8 sdus_mask; /* Supported data unit size mask */
|
||||
u8 key_size;
|
||||
u8 reserved;
|
||||
};
|
||||
};
|
||||
|
||||
#define UFS_CRYPTO_CONFIGURATION_ENABLE (1 << 7)
|
||||
#define UFS_CRYPTO_KEY_MAX_SIZE 64
|
||||
/* x-CRYPTOCFG - Crypto Configuration X */
|
||||
union ufs_crypto_cfg_entry {
|
||||
__le32 reg_val[32];
|
||||
struct {
|
||||
u8 crypto_key[UFS_CRYPTO_KEY_MAX_SIZE];
|
||||
u8 data_unit_size;
|
||||
u8 crypto_cap_idx;
|
||||
u8 reserved_1;
|
||||
u8 config_enable;
|
||||
u8 reserved_multi_host;
|
||||
u8 reserved_2;
|
||||
u8 vsb[2];
|
||||
u8 reserved_3[56];
|
||||
};
|
||||
};
|
||||
|
||||
/*
|
||||
* Request Descriptor Definitions
|
||||
*/
|
||||
|
||||
/* Transfer request command type */
|
||||
enum {
|
||||
UTP_CMD_TYPE_SCSI = 0x0,
|
||||
UTP_CMD_TYPE_UFS = 0x1,
|
||||
UTP_CMD_TYPE_DEV_MANAGE = 0x2,
|
||||
};
|
||||
|
||||
/* To accommodate UFS2.0 required Command type */
|
||||
enum {
|
||||
UTP_CMD_TYPE_UFS_STORAGE = 0x1,
|
||||
};
|
||||
|
||||
enum {
|
||||
UTP_SCSI_COMMAND = 0x00000000,
|
||||
UTP_NATIVE_UFS_COMMAND = 0x10000000,
|
||||
UTP_DEVICE_MANAGEMENT_FUNCTION = 0x20000000,
|
||||
UTP_REQ_DESC_INT_CMD = 0x01000000,
|
||||
UTP_REQ_DESC_CRYPTO_ENABLE_CMD = 0x00800000,
|
||||
};
|
||||
|
||||
/* UTP Transfer Request Data Direction (DD) */
|
||||
enum {
|
||||
UTP_NO_DATA_TRANSFER = 0x00000000,
|
||||
UTP_HOST_TO_DEVICE = 0x02000000,
|
||||
UTP_DEVICE_TO_HOST = 0x04000000,
|
||||
};
|
||||
|
||||
/* Overall command status values */
|
||||
enum {
|
||||
OCS_SUCCESS = 0x0,
|
||||
OCS_INVALID_CMD_TABLE_ATTR = 0x1,
|
||||
OCS_INVALID_PRDT_ATTR = 0x2,
|
||||
OCS_MISMATCH_DATA_BUF_SIZE = 0x3,
|
||||
OCS_MISMATCH_RESP_UPIU_SIZE = 0x4,
|
||||
OCS_PEER_COMM_FAILURE = 0x5,
|
||||
OCS_ABORTED = 0x6,
|
||||
OCS_FATAL_ERROR = 0x7,
|
||||
OCS_DEVICE_FATAL_ERROR = 0x8,
|
||||
OCS_INVALID_CRYPTO_CONFIG = 0x9,
|
||||
OCS_GENERAL_CRYPTO_ERROR = 0xA,
|
||||
OCS_INVALID_COMMAND_STATUS = 0x0F,
|
||||
MASK_OCS = 0x0F,
|
||||
};
|
||||
|
||||
/* The maximum length of the data byte count field in the PRDT is 256KB */
|
||||
#define PRDT_DATA_BYTE_COUNT_MAX (256 * 1024)
|
||||
/* The granularity of the data byte count field in the PRDT is 32-bit */
|
||||
#define PRDT_DATA_BYTE_COUNT_PAD 4
|
||||
|
||||
/**
|
||||
* struct ufshcd_sg_entry - UFSHCI PRD Entry
|
||||
* @base_addr: Lower 32bit physical address DW-0
|
||||
* @upper_addr: Upper 32bit physical address DW-1
|
||||
* @reserved: Reserved for future use DW-2
|
||||
* @size: size of physical segment DW-3
|
||||
*/
|
||||
struct ufshcd_sg_entry {
|
||||
__le32 base_addr;
|
||||
__le32 upper_addr;
|
||||
__le32 reserved;
|
||||
__le32 size;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct utp_transfer_cmd_desc - UFS Command Descriptor structure
|
||||
* @command_upiu: Command UPIU Frame address
|
||||
* @response_upiu: Response UPIU Frame address
|
||||
* @prd_table: Physical Region Descriptor
|
||||
*/
|
||||
struct utp_transfer_cmd_desc {
|
||||
u8 command_upiu[ALIGNED_UPIU_SIZE];
|
||||
u8 response_upiu[ALIGNED_UPIU_SIZE];
|
||||
struct ufshcd_sg_entry prd_table[SG_ALL];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct request_desc_header - Descriptor Header common to both UTRD and UTMRD
|
||||
* @dword0: Descriptor Header DW0
|
||||
* @dword1: Descriptor Header DW1
|
||||
* @dword2: Descriptor Header DW2
|
||||
* @dword3: Descriptor Header DW3
|
||||
*/
|
||||
struct request_desc_header {
|
||||
__le32 dword_0;
|
||||
__le32 dword_1;
|
||||
__le32 dword_2;
|
||||
__le32 dword_3;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct utp_transfer_req_desc - UTRD structure
|
||||
* @header: UTRD header DW-0 to DW-3
|
||||
* @command_desc_base_addr_lo: UCD base address low DW-4
|
||||
* @command_desc_base_addr_hi: UCD base address high DW-5
|
||||
* @response_upiu_length: response UPIU length DW-6
|
||||
* @response_upiu_offset: response UPIU offset DW-6
|
||||
* @prd_table_length: Physical region descriptor length DW-7
|
||||
* @prd_table_offset: Physical region descriptor offset DW-7
|
||||
*/
|
||||
struct utp_transfer_req_desc {
|
||||
|
||||
/* DW 0-3 */
|
||||
struct request_desc_header header;
|
||||
|
||||
/* DW 4-5*/
|
||||
__le32 command_desc_base_addr_lo;
|
||||
__le32 command_desc_base_addr_hi;
|
||||
|
||||
/* DW 6 */
|
||||
__le16 response_upiu_length;
|
||||
__le16 response_upiu_offset;
|
||||
|
||||
/* DW 7 */
|
||||
__le16 prd_table_length;
|
||||
__le16 prd_table_offset;
|
||||
};
|
||||
|
||||
/*
|
||||
* UTMRD structure.
|
||||
*/
|
||||
struct utp_task_req_desc {
|
||||
/* DW 0-3 */
|
||||
struct request_desc_header header;
|
||||
|
||||
/* DW 4-11 - Task request UPIU structure */
|
||||
struct {
|
||||
struct utp_upiu_header req_header;
|
||||
__be32 input_param1;
|
||||
__be32 input_param2;
|
||||
__be32 input_param3;
|
||||
__be32 __reserved1[2];
|
||||
} upiu_req;
|
||||
|
||||
/* DW 12-19 - Task Management Response UPIU structure */
|
||||
struct {
|
||||
struct utp_upiu_header rsp_header;
|
||||
__be32 output_param1;
|
||||
__be32 output_param2;
|
||||
__be32 __reserved2[3];
|
||||
} upiu_rsp;
|
||||
};
|
||||
|
||||
#endif /* End of Header */
|
||||
332
include/drivers-private/scsi/ufs/k515/unipro.h
Normal file
332
include/drivers-private/scsi/ufs/k515/unipro.h
Normal file
@@ -0,0 +1,332 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* drivers/scsi/ufs/unipro.h
|
||||
*
|
||||
* Copyright (C) 2013 Samsung Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
#ifndef _UNIPRO_H_
|
||||
#define _UNIPRO_H_
|
||||
|
||||
/*
|
||||
* M-TX Configuration Attributes
|
||||
*/
|
||||
#define TX_HIBERN8TIME_CAPABILITY 0x000F
|
||||
#define TX_MODE 0x0021
|
||||
#define TX_HSRATE_SERIES 0x0022
|
||||
#define TX_HSGEAR 0x0023
|
||||
#define TX_PWMGEAR 0x0024
|
||||
#define TX_AMPLITUDE 0x0025
|
||||
#define TX_HS_SLEWRATE 0x0026
|
||||
#define TX_SYNC_SOURCE 0x0027
|
||||
#define TX_HS_SYNC_LENGTH 0x0028
|
||||
#define TX_HS_PREPARE_LENGTH 0x0029
|
||||
#define TX_LS_PREPARE_LENGTH 0x002A
|
||||
#define TX_HIBERN8_CONTROL 0x002B
|
||||
#define TX_LCC_ENABLE 0x002C
|
||||
#define TX_PWM_BURST_CLOSURE_EXTENSION 0x002D
|
||||
#define TX_BYPASS_8B10B_ENABLE 0x002E
|
||||
#define TX_DRIVER_POLARITY 0x002F
|
||||
#define TX_HS_UNTERMINATED_LINE_DRIVE_ENABLE 0x0030
|
||||
#define TX_LS_TERMINATED_LINE_DRIVE_ENABLE 0x0031
|
||||
#define TX_LCC_SEQUENCER 0x0032
|
||||
#define TX_MIN_ACTIVATETIME 0x0033
|
||||
#define TX_PWM_G6_G7_SYNC_LENGTH 0x0034
|
||||
#define TX_REFCLKFREQ 0x00EB
|
||||
#define TX_CFGCLKFREQVAL 0x00EC
|
||||
#define CFGEXTRATTR 0x00F0
|
||||
#define DITHERCTRL2 0x00F1
|
||||
|
||||
/*
|
||||
* M-RX Configuration Attributes
|
||||
*/
|
||||
#define RX_MODE 0x00A1
|
||||
#define RX_HSRATE_SERIES 0x00A2
|
||||
#define RX_HSGEAR 0x00A3
|
||||
#define RX_PWMGEAR 0x00A4
|
||||
#define RX_LS_TERMINATED_ENABLE 0x00A5
|
||||
#define RX_HS_UNTERMINATED_ENABLE 0x00A6
|
||||
#define RX_ENTER_HIBERN8 0x00A7
|
||||
#define RX_BYPASS_8B10B_ENABLE 0x00A8
|
||||
#define RX_TERMINATION_FORCE_ENABLE 0x00A9
|
||||
#define RX_MIN_ACTIVATETIME_CAPABILITY 0x008F
|
||||
#define RX_HIBERN8TIME_CAPABILITY 0x0092
|
||||
#define RX_REFCLKFREQ 0x00EB
|
||||
#define RX_CFGCLKFREQVAL 0x00EC
|
||||
#define CFGWIDEINLN 0x00F0
|
||||
#define CFGRXCDR8 0x00BA
|
||||
#define ENARXDIRECTCFG4 0x00F2
|
||||
#define CFGRXOVR8 0x00BD
|
||||
#define RXDIRECTCTRL2 0x00C7
|
||||
#define ENARXDIRECTCFG3 0x00F3
|
||||
#define RXCALCTRL 0x00B4
|
||||
#define ENARXDIRECTCFG2 0x00F4
|
||||
#define CFGRXOVR4 0x00E9
|
||||
#define RXSQCTRL 0x00B5
|
||||
#define CFGRXOVR6 0x00BF
|
||||
#define RX_HS_G1_SYNC_LENGTH_CAP 0x008B
|
||||
#define RX_HS_G1_PREP_LENGTH_CAP 0x008C
|
||||
#define RX_HS_G2_SYNC_LENGTH_CAP 0x0094
|
||||
#define RX_HS_G3_SYNC_LENGTH_CAP 0x0095
|
||||
#define RX_HS_G2_PREP_LENGTH_CAP 0x0096
|
||||
#define RX_HS_G3_PREP_LENGTH_CAP 0x0097
|
||||
#define RX_ADV_GRANULARITY_CAP 0x0098
|
||||
#define RX_MIN_ACTIVATETIME_CAP 0x008F
|
||||
#define RX_HIBERN8TIME_CAP 0x0092
|
||||
#define RX_ADV_HIBERN8TIME_CAP 0x0099
|
||||
#define RX_ADV_MIN_ACTIVATETIME_CAP 0x009A
|
||||
|
||||
|
||||
#define is_mphy_tx_attr(attr) (attr < RX_MODE)
|
||||
#define RX_ADV_FINE_GRAN_STEP(x) ((((x) & 0x3) << 1) | 0x1)
|
||||
#define SYNC_LEN_FINE(x) ((x) & 0x3F)
|
||||
#define SYNC_LEN_COARSE(x) ((1 << 6) | ((x) & 0x3F))
|
||||
#define PREP_LEN(x) ((x) & 0xF)
|
||||
|
||||
#define RX_MIN_ACTIVATETIME_UNIT_US 100
|
||||
#define HIBERN8TIME_UNIT_US 100
|
||||
|
||||
/*
|
||||
* Common Block Attributes
|
||||
*/
|
||||
#define TX_GLOBALHIBERNATE UNIPRO_CB_OFFSET(0x002B)
|
||||
#define REFCLKMODE UNIPRO_CB_OFFSET(0x00BF)
|
||||
#define DIRECTCTRL19 UNIPRO_CB_OFFSET(0x00CD)
|
||||
#define DIRECTCTRL10 UNIPRO_CB_OFFSET(0x00E6)
|
||||
#define CDIRECTCTRL6 UNIPRO_CB_OFFSET(0x00EA)
|
||||
#define RTOBSERVESELECT UNIPRO_CB_OFFSET(0x00F0)
|
||||
#define CBDIVFACTOR UNIPRO_CB_OFFSET(0x00F1)
|
||||
#define CBDCOCTRL5 UNIPRO_CB_OFFSET(0x00F3)
|
||||
#define CBPRGPLL2 UNIPRO_CB_OFFSET(0x00F8)
|
||||
#define CBPRGTUNING UNIPRO_CB_OFFSET(0x00FB)
|
||||
|
||||
#define UNIPRO_CB_OFFSET(x) (0x8000 | x)
|
||||
|
||||
/*
|
||||
* PHY Adpater attributes
|
||||
*/
|
||||
#define PA_ACTIVETXDATALANES 0x1560
|
||||
#define PA_ACTIVERXDATALANES 0x1580
|
||||
#define PA_TXTRAILINGCLOCKS 0x1564
|
||||
#define PA_PHY_TYPE 0x1500
|
||||
#define PA_AVAILTXDATALANES 0x1520
|
||||
#define PA_AVAILRXDATALANES 0x1540
|
||||
#define PA_MINRXTRAILINGCLOCKS 0x1543
|
||||
#define PA_TXPWRSTATUS 0x1567
|
||||
#define PA_RXPWRSTATUS 0x1582
|
||||
#define PA_TXFORCECLOCK 0x1562
|
||||
#define PA_TXPWRMODE 0x1563
|
||||
#define PA_LEGACYDPHYESCDL 0x1570
|
||||
#define PA_MAXTXSPEEDFAST 0x1521
|
||||
#define PA_MAXTXSPEEDSLOW 0x1522
|
||||
#define PA_MAXRXSPEEDFAST 0x1541
|
||||
#define PA_MAXRXSPEEDSLOW 0x1542
|
||||
#define PA_TXLINKSTARTUPHS 0x1544
|
||||
#define PA_LOCAL_TX_LCC_ENABLE 0x155E
|
||||
#define PA_TXSPEEDFAST 0x1565
|
||||
#define PA_TXSPEEDSLOW 0x1566
|
||||
#define PA_REMOTEVERINFO 0x15A0
|
||||
#define PA_TXGEAR 0x1568
|
||||
#define PA_TXTERMINATION 0x1569
|
||||
#define PA_HSSERIES 0x156A
|
||||
#define PA_PWRMODE 0x1571
|
||||
#define PA_RXGEAR 0x1583
|
||||
#define PA_RXTERMINATION 0x1584
|
||||
#define PA_MAXRXPWMGEAR 0x1586
|
||||
#define PA_MAXRXHSGEAR 0x1587
|
||||
#define PA_RXHSUNTERMCAP 0x15A5
|
||||
#define PA_RXLSTERMCAP 0x15A6
|
||||
#define PA_GRANULARITY 0x15AA
|
||||
#define PA_PACPREQTIMEOUT 0x1590
|
||||
#define PA_PACPREQEOBTIMEOUT 0x1591
|
||||
#define PA_HIBERN8TIME 0x15A7
|
||||
#define PA_LOCALVERINFO 0x15A9
|
||||
#define PA_GRANULARITY 0x15AA
|
||||
#define PA_TACTIVATE 0x15A8
|
||||
#define PA_PACPFRAMECOUNT 0x15C0
|
||||
#define PA_PACPERRORCOUNT 0x15C1
|
||||
#define PA_PHYTESTCONTROL 0x15C2
|
||||
#define PA_PWRMODEUSERDATA0 0x15B0
|
||||
#define PA_PWRMODEUSERDATA1 0x15B1
|
||||
#define PA_PWRMODEUSERDATA2 0x15B2
|
||||
#define PA_PWRMODEUSERDATA3 0x15B3
|
||||
#define PA_PWRMODEUSERDATA4 0x15B4
|
||||
#define PA_PWRMODEUSERDATA5 0x15B5
|
||||
#define PA_PWRMODEUSERDATA6 0x15B6
|
||||
#define PA_PWRMODEUSERDATA7 0x15B7
|
||||
#define PA_PWRMODEUSERDATA8 0x15B8
|
||||
#define PA_PWRMODEUSERDATA9 0x15B9
|
||||
#define PA_PWRMODEUSERDATA10 0x15BA
|
||||
#define PA_PWRMODEUSERDATA11 0x15BB
|
||||
#define PA_CONNECTEDTXDATALANES 0x1561
|
||||
#define PA_CONNECTEDRXDATALANES 0x1581
|
||||
#define PA_LOGICALLANEMAP 0x15A1
|
||||
#define PA_SLEEPNOCONFIGTIME 0x15A2
|
||||
#define PA_STALLNOCONFIGTIME 0x15A3
|
||||
#define PA_SAVECONFIGTIME 0x15A4
|
||||
#define PA_TXHSADAPTTYPE 0x15D4
|
||||
|
||||
/* Adpat type for PA_TXHSADAPTTYPE attribute */
|
||||
#define PA_REFRESH_ADAPT 0x00
|
||||
#define PA_INITIAL_ADAPT 0x01
|
||||
#define PA_NO_ADAPT 0x03
|
||||
|
||||
#define PA_TACTIVATE_TIME_UNIT_US 10
|
||||
#define PA_HIBERN8_TIME_UNIT_US 100
|
||||
|
||||
/*Other attributes*/
|
||||
#define VS_MPHYCFGUPDT 0xD085
|
||||
#define VS_DEBUGOMC 0xD09E
|
||||
#define VS_POWERSTATE 0xD083
|
||||
|
||||
#define PA_GRANULARITY_MIN_VAL 1
|
||||
#define PA_GRANULARITY_MAX_VAL 6
|
||||
|
||||
/* PHY Adapter Protocol Constants */
|
||||
#define PA_MAXDATALANES 4
|
||||
|
||||
#define DL_FC0ProtectionTimeOutVal_Default 8191
|
||||
#define DL_TC0ReplayTimeOutVal_Default 65535
|
||||
#define DL_AFC0ReqTimeOutVal_Default 32767
|
||||
#define DL_FC1ProtectionTimeOutVal_Default 8191
|
||||
#define DL_TC1ReplayTimeOutVal_Default 65535
|
||||
#define DL_AFC1ReqTimeOutVal_Default 32767
|
||||
|
||||
#define DME_LocalFC0ProtectionTimeOutVal 0xD041
|
||||
#define DME_LocalTC0ReplayTimeOutVal 0xD042
|
||||
#define DME_LocalAFC0ReqTimeOutVal 0xD043
|
||||
|
||||
/* PA power modes */
|
||||
enum {
|
||||
FAST_MODE = 1,
|
||||
SLOW_MODE = 2,
|
||||
FASTAUTO_MODE = 4,
|
||||
SLOWAUTO_MODE = 5,
|
||||
UNCHANGED = 7,
|
||||
};
|
||||
|
||||
#define PWRMODE_MASK 0xF
|
||||
#define PWRMODE_RX_OFFSET 4
|
||||
|
||||
/* PA TX/RX Frequency Series */
|
||||
enum {
|
||||
PA_HS_MODE_A = 1,
|
||||
PA_HS_MODE_B = 2,
|
||||
};
|
||||
|
||||
enum ufs_pwm_gear_tag {
|
||||
UFS_PWM_DONT_CHANGE, /* Don't change Gear */
|
||||
UFS_PWM_G1, /* PWM Gear 1 (default for reset) */
|
||||
UFS_PWM_G2, /* PWM Gear 2 */
|
||||
UFS_PWM_G3, /* PWM Gear 3 */
|
||||
UFS_PWM_G4, /* PWM Gear 4 */
|
||||
UFS_PWM_G5, /* PWM Gear 5 */
|
||||
UFS_PWM_G6, /* PWM Gear 6 */
|
||||
UFS_PWM_G7, /* PWM Gear 7 */
|
||||
};
|
||||
|
||||
enum ufs_hs_gear_tag {
|
||||
UFS_HS_DONT_CHANGE, /* Don't change Gear */
|
||||
UFS_HS_G1, /* HS Gear 1 (default for reset) */
|
||||
UFS_HS_G2, /* HS Gear 2 */
|
||||
UFS_HS_G3, /* HS Gear 3 */
|
||||
UFS_HS_G4, /* HS Gear 4 */
|
||||
};
|
||||
|
||||
enum ufs_unipro_ver {
|
||||
UFS_UNIPRO_VER_RESERVED = 0,
|
||||
UFS_UNIPRO_VER_1_40 = 1, /* UniPro version 1.40 */
|
||||
UFS_UNIPRO_VER_1_41 = 2, /* UniPro version 1.41 */
|
||||
UFS_UNIPRO_VER_1_6 = 3, /* UniPro version 1.6 */
|
||||
UFS_UNIPRO_VER_1_61 = 4, /* UniPro version 1.61 */
|
||||
UFS_UNIPRO_VER_1_8 = 5, /* UniPro version 1.8 */
|
||||
UFS_UNIPRO_VER_MAX = 6, /* UniPro unsupported version */
|
||||
/* UniPro version field mask in PA_LOCALVERINFO */
|
||||
UFS_UNIPRO_VER_MASK = 0xF,
|
||||
};
|
||||
|
||||
/*
|
||||
* Data Link Layer Attributes
|
||||
*/
|
||||
#define DL_TC0TXFCTHRESHOLD 0x2040
|
||||
#define DL_FC0PROTTIMEOUTVAL 0x2041
|
||||
#define DL_TC0REPLAYTIMEOUTVAL 0x2042
|
||||
#define DL_AFC0REQTIMEOUTVAL 0x2043
|
||||
#define DL_AFC0CREDITTHRESHOLD 0x2044
|
||||
#define DL_TC0OUTACKTHRESHOLD 0x2045
|
||||
#define DL_TC1TXFCTHRESHOLD 0x2060
|
||||
#define DL_FC1PROTTIMEOUTVAL 0x2061
|
||||
#define DL_TC1REPLAYTIMEOUTVAL 0x2062
|
||||
#define DL_AFC1REQTIMEOUTVAL 0x2063
|
||||
#define DL_AFC1CREDITTHRESHOLD 0x2064
|
||||
#define DL_TC1OUTACKTHRESHOLD 0x2065
|
||||
#define DL_TXPREEMPTIONCAP 0x2000
|
||||
#define DL_TC0TXMAXSDUSIZE 0x2001
|
||||
#define DL_TC0RXINITCREDITVAL 0x2002
|
||||
#define DL_TC0TXBUFFERSIZE 0x2005
|
||||
#define DL_PEERTC0PRESENT 0x2046
|
||||
#define DL_PEERTC0RXINITCREVAL 0x2047
|
||||
#define DL_TC1TXMAXSDUSIZE 0x2003
|
||||
#define DL_TC1RXINITCREDITVAL 0x2004
|
||||
#define DL_TC1TXBUFFERSIZE 0x2006
|
||||
#define DL_PEERTC1PRESENT 0x2066
|
||||
#define DL_PEERTC1RXINITCREVAL 0x2067
|
||||
|
||||
/*
|
||||
* Network Layer Attributes
|
||||
*/
|
||||
#define N_DEVICEID 0x3000
|
||||
#define N_DEVICEID_VALID 0x3001
|
||||
#define N_TC0TXMAXSDUSIZE 0x3020
|
||||
#define N_TC1TXMAXSDUSIZE 0x3021
|
||||
|
||||
/*
|
||||
* Transport Layer Attributes
|
||||
*/
|
||||
#define T_NUMCPORTS 0x4000
|
||||
#define T_NUMTESTFEATURES 0x4001
|
||||
#define T_CONNECTIONSTATE 0x4020
|
||||
#define T_PEERDEVICEID 0x4021
|
||||
#define T_PEERCPORTID 0x4022
|
||||
#define T_TRAFFICCLASS 0x4023
|
||||
#define T_PROTOCOLID 0x4024
|
||||
#define T_CPORTFLAGS 0x4025
|
||||
#define T_TXTOKENVALUE 0x4026
|
||||
#define T_RXTOKENVALUE 0x4027
|
||||
#define T_LOCALBUFFERSPACE 0x4028
|
||||
#define T_PEERBUFFERSPACE 0x4029
|
||||
#define T_CREDITSTOSEND 0x402A
|
||||
#define T_CPORTMODE 0x402B
|
||||
#define T_TC0TXMAXSDUSIZE 0x4060
|
||||
#define T_TC1TXMAXSDUSIZE 0x4061
|
||||
|
||||
#ifdef FALSE
|
||||
#undef FALSE
|
||||
#endif
|
||||
|
||||
#ifdef TRUE
|
||||
#undef TRUE
|
||||
#endif
|
||||
|
||||
/* Boolean attribute values */
|
||||
enum {
|
||||
FALSE = 0,
|
||||
TRUE,
|
||||
};
|
||||
|
||||
/* CPort setting */
|
||||
#define E2EFC_ON (1 << 0)
|
||||
#define E2EFC_OFF (0 << 0)
|
||||
#define CSD_N_ON (0 << 1)
|
||||
#define CSD_N_OFF (1 << 1)
|
||||
#define CSV_N_ON (0 << 2)
|
||||
#define CSV_N_OFF (1 << 2)
|
||||
#define CPORT_DEF_FLAGS (CSV_N_OFF | CSD_N_OFF | E2EFC_OFF)
|
||||
|
||||
/* CPort connection state */
|
||||
enum {
|
||||
CPORT_IDLE = 0,
|
||||
CPORT_CONNECTED,
|
||||
};
|
||||
|
||||
#endif /* _UNIPRO_H_ */
|
||||
652
include/drivers-private/scsi/ufs/k517/ufs.h
Normal file
652
include/drivers-private/scsi/ufs/k517/ufs.h
Normal file
@@ -0,0 +1,652 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* Universal Flash Storage Host controller driver
|
||||
* Copyright (C) 2011-2013 Samsung India Software Operations
|
||||
*
|
||||
* Authors:
|
||||
* Santosh Yaraganavi <santosh.sy@samsung.com>
|
||||
* Vinayak Holikatti <h.vinayak@samsung.com>
|
||||
*/
|
||||
|
||||
#ifndef _UFS_H
|
||||
#define _UFS_H
|
||||
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/types.h>
|
||||
#include <uapi/scsi/scsi_bsg_ufs.h>
|
||||
|
||||
#define GENERAL_UPIU_REQUEST_SIZE (sizeof(struct utp_upiu_req))
|
||||
#define QUERY_DESC_MAX_SIZE 255
|
||||
#define QUERY_DESC_MIN_SIZE 2
|
||||
#define QUERY_DESC_HDR_SIZE 2
|
||||
#define QUERY_OSF_SIZE (GENERAL_UPIU_REQUEST_SIZE - \
|
||||
(sizeof(struct utp_upiu_header)))
|
||||
#define UFS_SENSE_SIZE 18
|
||||
|
||||
#define UPIU_HEADER_DWORD(byte3, byte2, byte1, byte0)\
|
||||
cpu_to_be32((byte3 << 24) | (byte2 << 16) |\
|
||||
(byte1 << 8) | (byte0))
|
||||
/*
|
||||
* UFS device may have standard LUs and LUN id could be from 0x00 to
|
||||
* 0x7F. Standard LUs use "Peripheral Device Addressing Format".
|
||||
* UFS device may also have the Well Known LUs (also referred as W-LU)
|
||||
* which again could be from 0x00 to 0x7F. For W-LUs, device only use
|
||||
* the "Extended Addressing Format" which means the W-LUNs would be
|
||||
* from 0xc100 (SCSI_W_LUN_BASE) onwards.
|
||||
* This means max. LUN number reported from UFS device could be 0xC17F.
|
||||
*/
|
||||
#define UFS_UPIU_MAX_UNIT_NUM_ID 0x7F
|
||||
#define UFS_MAX_LUNS (SCSI_W_LUN_BASE + UFS_UPIU_MAX_UNIT_NUM_ID)
|
||||
#define UFS_UPIU_WLUN_ID (1 << 7)
|
||||
#define UFS_RPMB_UNIT 0xC4
|
||||
|
||||
/* WriteBooster buffer is available only for the logical unit from 0 to 7 */
|
||||
#define UFS_UPIU_MAX_WB_LUN_ID 8
|
||||
|
||||
/* Well known logical unit id in LUN field of UPIU */
|
||||
enum {
|
||||
UFS_UPIU_REPORT_LUNS_WLUN = 0x81,
|
||||
UFS_UPIU_UFS_DEVICE_WLUN = 0xD0,
|
||||
UFS_UPIU_BOOT_WLUN = 0xB0,
|
||||
UFS_UPIU_RPMB_WLUN = 0xC4,
|
||||
};
|
||||
|
||||
/*
|
||||
* UFS Protocol Information Unit related definitions
|
||||
*/
|
||||
|
||||
/* Task management functions */
|
||||
enum {
|
||||
UFS_ABORT_TASK = 0x01,
|
||||
UFS_ABORT_TASK_SET = 0x02,
|
||||
UFS_CLEAR_TASK_SET = 0x04,
|
||||
UFS_LOGICAL_RESET = 0x08,
|
||||
UFS_QUERY_TASK = 0x80,
|
||||
UFS_QUERY_TASK_SET = 0x81,
|
||||
};
|
||||
|
||||
/* UTP UPIU Transaction Codes Initiator to Target */
|
||||
enum {
|
||||
UPIU_TRANSACTION_NOP_OUT = 0x00,
|
||||
UPIU_TRANSACTION_COMMAND = 0x01,
|
||||
UPIU_TRANSACTION_DATA_OUT = 0x02,
|
||||
UPIU_TRANSACTION_TASK_REQ = 0x04,
|
||||
UPIU_TRANSACTION_QUERY_REQ = 0x16,
|
||||
};
|
||||
|
||||
/* UTP UPIU Transaction Codes Target to Initiator */
|
||||
enum {
|
||||
UPIU_TRANSACTION_NOP_IN = 0x20,
|
||||
UPIU_TRANSACTION_RESPONSE = 0x21,
|
||||
UPIU_TRANSACTION_DATA_IN = 0x22,
|
||||
UPIU_TRANSACTION_TASK_RSP = 0x24,
|
||||
UPIU_TRANSACTION_READY_XFER = 0x31,
|
||||
UPIU_TRANSACTION_QUERY_RSP = 0x36,
|
||||
UPIU_TRANSACTION_REJECT_UPIU = 0x3F,
|
||||
};
|
||||
|
||||
/* UPIU Read/Write flags */
|
||||
enum {
|
||||
UPIU_CMD_FLAGS_NONE = 0x00,
|
||||
UPIU_CMD_FLAGS_WRITE = 0x20,
|
||||
UPIU_CMD_FLAGS_READ = 0x40,
|
||||
};
|
||||
|
||||
/* UPIU Task Attributes */
|
||||
enum {
|
||||
UPIU_TASK_ATTR_SIMPLE = 0x00,
|
||||
UPIU_TASK_ATTR_ORDERED = 0x01,
|
||||
UPIU_TASK_ATTR_HEADQ = 0x02,
|
||||
UPIU_TASK_ATTR_ACA = 0x03,
|
||||
};
|
||||
|
||||
/* UPIU Query request function */
|
||||
enum {
|
||||
UPIU_QUERY_FUNC_STANDARD_READ_REQUEST = 0x01,
|
||||
UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST = 0x81,
|
||||
};
|
||||
|
||||
/* Flag idn for Query Requests*/
|
||||
enum flag_idn {
|
||||
QUERY_FLAG_IDN_FDEVICEINIT = 0x01,
|
||||
QUERY_FLAG_IDN_PERMANENT_WPE = 0x02,
|
||||
QUERY_FLAG_IDN_PWR_ON_WPE = 0x03,
|
||||
QUERY_FLAG_IDN_BKOPS_EN = 0x04,
|
||||
QUERY_FLAG_IDN_LIFE_SPAN_MODE_ENABLE = 0x05,
|
||||
QUERY_FLAG_IDN_PURGE_ENABLE = 0x06,
|
||||
QUERY_FLAG_IDN_RESERVED2 = 0x07,
|
||||
QUERY_FLAG_IDN_FPHYRESOURCEREMOVAL = 0x08,
|
||||
QUERY_FLAG_IDN_BUSY_RTC = 0x09,
|
||||
QUERY_FLAG_IDN_RESERVED3 = 0x0A,
|
||||
QUERY_FLAG_IDN_PERMANENTLY_DISABLE_FW_UPDATE = 0x0B,
|
||||
QUERY_FLAG_IDN_WB_EN = 0x0E,
|
||||
QUERY_FLAG_IDN_WB_BUFF_FLUSH_EN = 0x0F,
|
||||
QUERY_FLAG_IDN_WB_BUFF_FLUSH_DURING_HIBERN8 = 0x10,
|
||||
QUERY_FLAG_IDN_HPB_RESET = 0x11,
|
||||
QUERY_FLAG_IDN_HPB_EN = 0x12,
|
||||
};
|
||||
|
||||
/* Attribute idn for Query requests */
|
||||
enum attr_idn {
|
||||
QUERY_ATTR_IDN_BOOT_LU_EN = 0x00,
|
||||
QUERY_ATTR_IDN_MAX_HPB_SINGLE_CMD = 0x01,
|
||||
QUERY_ATTR_IDN_POWER_MODE = 0x02,
|
||||
QUERY_ATTR_IDN_ACTIVE_ICC_LVL = 0x03,
|
||||
QUERY_ATTR_IDN_OOO_DATA_EN = 0x04,
|
||||
QUERY_ATTR_IDN_BKOPS_STATUS = 0x05,
|
||||
QUERY_ATTR_IDN_PURGE_STATUS = 0x06,
|
||||
QUERY_ATTR_IDN_MAX_DATA_IN = 0x07,
|
||||
QUERY_ATTR_IDN_MAX_DATA_OUT = 0x08,
|
||||
QUERY_ATTR_IDN_DYN_CAP_NEEDED = 0x09,
|
||||
QUERY_ATTR_IDN_REF_CLK_FREQ = 0x0A,
|
||||
QUERY_ATTR_IDN_CONF_DESC_LOCK = 0x0B,
|
||||
QUERY_ATTR_IDN_MAX_NUM_OF_RTT = 0x0C,
|
||||
QUERY_ATTR_IDN_EE_CONTROL = 0x0D,
|
||||
QUERY_ATTR_IDN_EE_STATUS = 0x0E,
|
||||
QUERY_ATTR_IDN_SECONDS_PASSED = 0x0F,
|
||||
QUERY_ATTR_IDN_CNTX_CONF = 0x10,
|
||||
QUERY_ATTR_IDN_CORR_PRG_BLK_NUM = 0x11,
|
||||
QUERY_ATTR_IDN_RESERVED2 = 0x12,
|
||||
QUERY_ATTR_IDN_RESERVED3 = 0x13,
|
||||
QUERY_ATTR_IDN_FFU_STATUS = 0x14,
|
||||
QUERY_ATTR_IDN_PSA_STATE = 0x15,
|
||||
QUERY_ATTR_IDN_PSA_DATA_SIZE = 0x16,
|
||||
QUERY_ATTR_IDN_REF_CLK_GATING_WAIT_TIME = 0x17,
|
||||
QUERY_ATTR_IDN_CASE_ROUGH_TEMP = 0x18,
|
||||
QUERY_ATTR_IDN_HIGH_TEMP_BOUND = 0x19,
|
||||
QUERY_ATTR_IDN_LOW_TEMP_BOUND = 0x1A,
|
||||
QUERY_ATTR_IDN_WB_FLUSH_STATUS = 0x1C,
|
||||
QUERY_ATTR_IDN_AVAIL_WB_BUFF_SIZE = 0x1D,
|
||||
QUERY_ATTR_IDN_WB_BUFF_LIFE_TIME_EST = 0x1E,
|
||||
QUERY_ATTR_IDN_CURR_WB_BUFF_SIZE = 0x1F,
|
||||
};
|
||||
|
||||
/* Descriptor idn for Query requests */
|
||||
enum desc_idn {
|
||||
QUERY_DESC_IDN_DEVICE = 0x0,
|
||||
QUERY_DESC_IDN_CONFIGURATION = 0x1,
|
||||
QUERY_DESC_IDN_UNIT = 0x2,
|
||||
QUERY_DESC_IDN_RFU_0 = 0x3,
|
||||
QUERY_DESC_IDN_INTERCONNECT = 0x4,
|
||||
QUERY_DESC_IDN_STRING = 0x5,
|
||||
QUERY_DESC_IDN_RFU_1 = 0x6,
|
||||
QUERY_DESC_IDN_GEOMETRY = 0x7,
|
||||
QUERY_DESC_IDN_POWER = 0x8,
|
||||
QUERY_DESC_IDN_HEALTH = 0x9,
|
||||
QUERY_DESC_IDN_MAX,
|
||||
};
|
||||
|
||||
enum desc_header_offset {
|
||||
QUERY_DESC_LENGTH_OFFSET = 0x00,
|
||||
QUERY_DESC_DESC_TYPE_OFFSET = 0x01,
|
||||
};
|
||||
|
||||
/* Unit descriptor parameters offsets in bytes*/
|
||||
enum unit_desc_param {
|
||||
UNIT_DESC_PARAM_LEN = 0x0,
|
||||
UNIT_DESC_PARAM_TYPE = 0x1,
|
||||
UNIT_DESC_PARAM_UNIT_INDEX = 0x2,
|
||||
UNIT_DESC_PARAM_LU_ENABLE = 0x3,
|
||||
UNIT_DESC_PARAM_BOOT_LUN_ID = 0x4,
|
||||
UNIT_DESC_PARAM_LU_WR_PROTECT = 0x5,
|
||||
UNIT_DESC_PARAM_LU_Q_DEPTH = 0x6,
|
||||
UNIT_DESC_PARAM_PSA_SENSITIVE = 0x7,
|
||||
UNIT_DESC_PARAM_MEM_TYPE = 0x8,
|
||||
UNIT_DESC_PARAM_DATA_RELIABILITY = 0x9,
|
||||
UNIT_DESC_PARAM_LOGICAL_BLK_SIZE = 0xA,
|
||||
UNIT_DESC_PARAM_LOGICAL_BLK_COUNT = 0xB,
|
||||
UNIT_DESC_PARAM_ERASE_BLK_SIZE = 0x13,
|
||||
UNIT_DESC_PARAM_PROVISIONING_TYPE = 0x17,
|
||||
UNIT_DESC_PARAM_PHY_MEM_RSRC_CNT = 0x18,
|
||||
UNIT_DESC_PARAM_CTX_CAPABILITIES = 0x20,
|
||||
UNIT_DESC_PARAM_LARGE_UNIT_SIZE_M1 = 0x22,
|
||||
UNIT_DESC_PARAM_HPB_LU_MAX_ACTIVE_RGNS = 0x23,
|
||||
UNIT_DESC_PARAM_HPB_PIN_RGN_START_OFF = 0x25,
|
||||
UNIT_DESC_PARAM_HPB_NUM_PIN_RGNS = 0x27,
|
||||
UNIT_DESC_PARAM_WB_BUF_ALLOC_UNITS = 0x29,
|
||||
};
|
||||
|
||||
/* Device descriptor parameters offsets in bytes*/
|
||||
enum device_desc_param {
|
||||
DEVICE_DESC_PARAM_LEN = 0x0,
|
||||
DEVICE_DESC_PARAM_TYPE = 0x1,
|
||||
DEVICE_DESC_PARAM_DEVICE_TYPE = 0x2,
|
||||
DEVICE_DESC_PARAM_DEVICE_CLASS = 0x3,
|
||||
DEVICE_DESC_PARAM_DEVICE_SUB_CLASS = 0x4,
|
||||
DEVICE_DESC_PARAM_PRTCL = 0x5,
|
||||
DEVICE_DESC_PARAM_NUM_LU = 0x6,
|
||||
DEVICE_DESC_PARAM_NUM_WLU = 0x7,
|
||||
DEVICE_DESC_PARAM_BOOT_ENBL = 0x8,
|
||||
DEVICE_DESC_PARAM_DESC_ACCSS_ENBL = 0x9,
|
||||
DEVICE_DESC_PARAM_INIT_PWR_MODE = 0xA,
|
||||
DEVICE_DESC_PARAM_HIGH_PR_LUN = 0xB,
|
||||
DEVICE_DESC_PARAM_SEC_RMV_TYPE = 0xC,
|
||||
DEVICE_DESC_PARAM_SEC_LU = 0xD,
|
||||
DEVICE_DESC_PARAM_BKOP_TERM_LT = 0xE,
|
||||
DEVICE_DESC_PARAM_ACTVE_ICC_LVL = 0xF,
|
||||
DEVICE_DESC_PARAM_SPEC_VER = 0x10,
|
||||
DEVICE_DESC_PARAM_MANF_DATE = 0x12,
|
||||
DEVICE_DESC_PARAM_MANF_NAME = 0x14,
|
||||
DEVICE_DESC_PARAM_PRDCT_NAME = 0x15,
|
||||
DEVICE_DESC_PARAM_SN = 0x16,
|
||||
DEVICE_DESC_PARAM_OEM_ID = 0x17,
|
||||
DEVICE_DESC_PARAM_MANF_ID = 0x18,
|
||||
DEVICE_DESC_PARAM_UD_OFFSET = 0x1A,
|
||||
DEVICE_DESC_PARAM_UD_LEN = 0x1B,
|
||||
DEVICE_DESC_PARAM_RTT_CAP = 0x1C,
|
||||
DEVICE_DESC_PARAM_FRQ_RTC = 0x1D,
|
||||
DEVICE_DESC_PARAM_UFS_FEAT = 0x1F,
|
||||
DEVICE_DESC_PARAM_FFU_TMT = 0x20,
|
||||
DEVICE_DESC_PARAM_Q_DPTH = 0x21,
|
||||
DEVICE_DESC_PARAM_DEV_VER = 0x22,
|
||||
DEVICE_DESC_PARAM_NUM_SEC_WPA = 0x24,
|
||||
DEVICE_DESC_PARAM_PSA_MAX_DATA = 0x25,
|
||||
DEVICE_DESC_PARAM_PSA_TMT = 0x29,
|
||||
DEVICE_DESC_PARAM_PRDCT_REV = 0x2A,
|
||||
DEVICE_DESC_PARAM_HPB_VER = 0x40,
|
||||
DEVICE_DESC_PARAM_HPB_CONTROL = 0x42,
|
||||
DEVICE_DESC_PARAM_EXT_UFS_FEATURE_SUP = 0x4F,
|
||||
DEVICE_DESC_PARAM_WB_PRESRV_USRSPC_EN = 0x53,
|
||||
DEVICE_DESC_PARAM_WB_TYPE = 0x54,
|
||||
DEVICE_DESC_PARAM_WB_SHARED_ALLOC_UNITS = 0x55,
|
||||
};
|
||||
|
||||
/* Interconnect descriptor parameters offsets in bytes*/
|
||||
enum interconnect_desc_param {
|
||||
INTERCONNECT_DESC_PARAM_LEN = 0x0,
|
||||
INTERCONNECT_DESC_PARAM_TYPE = 0x1,
|
||||
INTERCONNECT_DESC_PARAM_UNIPRO_VER = 0x2,
|
||||
INTERCONNECT_DESC_PARAM_MPHY_VER = 0x4,
|
||||
};
|
||||
|
||||
/* Geometry descriptor parameters offsets in bytes*/
|
||||
enum geometry_desc_param {
|
||||
GEOMETRY_DESC_PARAM_LEN = 0x0,
|
||||
GEOMETRY_DESC_PARAM_TYPE = 0x1,
|
||||
GEOMETRY_DESC_PARAM_DEV_CAP = 0x4,
|
||||
GEOMETRY_DESC_PARAM_MAX_NUM_LUN = 0xC,
|
||||
GEOMETRY_DESC_PARAM_SEG_SIZE = 0xD,
|
||||
GEOMETRY_DESC_PARAM_ALLOC_UNIT_SIZE = 0x11,
|
||||
GEOMETRY_DESC_PARAM_MIN_BLK_SIZE = 0x12,
|
||||
GEOMETRY_DESC_PARAM_OPT_RD_BLK_SIZE = 0x13,
|
||||
GEOMETRY_DESC_PARAM_OPT_WR_BLK_SIZE = 0x14,
|
||||
GEOMETRY_DESC_PARAM_MAX_IN_BUF_SIZE = 0x15,
|
||||
GEOMETRY_DESC_PARAM_MAX_OUT_BUF_SIZE = 0x16,
|
||||
GEOMETRY_DESC_PARAM_RPMB_RW_SIZE = 0x17,
|
||||
GEOMETRY_DESC_PARAM_DYN_CAP_RSRC_PLC = 0x18,
|
||||
GEOMETRY_DESC_PARAM_DATA_ORDER = 0x19,
|
||||
GEOMETRY_DESC_PARAM_MAX_NUM_CTX = 0x1A,
|
||||
GEOMETRY_DESC_PARAM_TAG_UNIT_SIZE = 0x1B,
|
||||
GEOMETRY_DESC_PARAM_TAG_RSRC_SIZE = 0x1C,
|
||||
GEOMETRY_DESC_PARAM_SEC_RM_TYPES = 0x1D,
|
||||
GEOMETRY_DESC_PARAM_MEM_TYPES = 0x1E,
|
||||
GEOMETRY_DESC_PARAM_SCM_MAX_NUM_UNITS = 0x20,
|
||||
GEOMETRY_DESC_PARAM_SCM_CAP_ADJ_FCTR = 0x24,
|
||||
GEOMETRY_DESC_PARAM_NPM_MAX_NUM_UNITS = 0x26,
|
||||
GEOMETRY_DESC_PARAM_NPM_CAP_ADJ_FCTR = 0x2A,
|
||||
GEOMETRY_DESC_PARAM_ENM1_MAX_NUM_UNITS = 0x2C,
|
||||
GEOMETRY_DESC_PARAM_ENM1_CAP_ADJ_FCTR = 0x30,
|
||||
GEOMETRY_DESC_PARAM_ENM2_MAX_NUM_UNITS = 0x32,
|
||||
GEOMETRY_DESC_PARAM_ENM2_CAP_ADJ_FCTR = 0x36,
|
||||
GEOMETRY_DESC_PARAM_ENM3_MAX_NUM_UNITS = 0x38,
|
||||
GEOMETRY_DESC_PARAM_ENM3_CAP_ADJ_FCTR = 0x3C,
|
||||
GEOMETRY_DESC_PARAM_ENM4_MAX_NUM_UNITS = 0x3E,
|
||||
GEOMETRY_DESC_PARAM_ENM4_CAP_ADJ_FCTR = 0x42,
|
||||
GEOMETRY_DESC_PARAM_OPT_LOG_BLK_SIZE = 0x44,
|
||||
GEOMETRY_DESC_PARAM_HPB_REGION_SIZE = 0x48,
|
||||
GEOMETRY_DESC_PARAM_HPB_NUMBER_LU = 0x49,
|
||||
GEOMETRY_DESC_PARAM_HPB_SUBREGION_SIZE = 0x4A,
|
||||
GEOMETRY_DESC_PARAM_HPB_MAX_ACTIVE_REGS = 0x4B,
|
||||
GEOMETRY_DESC_PARAM_WB_MAX_ALLOC_UNITS = 0x4F,
|
||||
GEOMETRY_DESC_PARAM_WB_MAX_WB_LUNS = 0x53,
|
||||
GEOMETRY_DESC_PARAM_WB_BUFF_CAP_ADJ = 0x54,
|
||||
GEOMETRY_DESC_PARAM_WB_SUP_RED_TYPE = 0x55,
|
||||
GEOMETRY_DESC_PARAM_WB_SUP_WB_TYPE = 0x56,
|
||||
};
|
||||
|
||||
/* Health descriptor parameters offsets in bytes*/
|
||||
enum health_desc_param {
|
||||
HEALTH_DESC_PARAM_LEN = 0x0,
|
||||
HEALTH_DESC_PARAM_TYPE = 0x1,
|
||||
HEALTH_DESC_PARAM_EOL_INFO = 0x2,
|
||||
HEALTH_DESC_PARAM_LIFE_TIME_EST_A = 0x3,
|
||||
HEALTH_DESC_PARAM_LIFE_TIME_EST_B = 0x4,
|
||||
};
|
||||
|
||||
/* WriteBooster buffer mode */
|
||||
enum {
|
||||
WB_BUF_MODE_LU_DEDICATED = 0x0,
|
||||
WB_BUF_MODE_SHARED = 0x1,
|
||||
};
|
||||
|
||||
/*
|
||||
* Logical Unit Write Protect
|
||||
* 00h: LU not write protected
|
||||
* 01h: LU write protected when fPowerOnWPEn =1
|
||||
* 02h: LU permanently write protected when fPermanentWPEn =1
|
||||
*/
|
||||
enum ufs_lu_wp_type {
|
||||
UFS_LU_NO_WP = 0x00,
|
||||
UFS_LU_POWER_ON_WP = 0x01,
|
||||
UFS_LU_PERM_WP = 0x02,
|
||||
};
|
||||
|
||||
/* bActiveICCLevel parameter current units */
|
||||
enum {
|
||||
UFSHCD_NANO_AMP = 0,
|
||||
UFSHCD_MICRO_AMP = 1,
|
||||
UFSHCD_MILI_AMP = 2,
|
||||
UFSHCD_AMP = 3,
|
||||
};
|
||||
|
||||
/* Possible values for dExtendedUFSFeaturesSupport */
|
||||
enum {
|
||||
UFS_DEV_LOW_TEMP_NOTIF = BIT(4),
|
||||
UFS_DEV_HIGH_TEMP_NOTIF = BIT(5),
|
||||
UFS_DEV_EXT_TEMP_NOTIF = BIT(6),
|
||||
UFS_DEV_HPB_SUPPORT = BIT(7),
|
||||
UFS_DEV_WRITE_BOOSTER_SUP = BIT(8),
|
||||
};
|
||||
#define UFS_DEV_HPB_SUPPORT_VERSION 0x310
|
||||
|
||||
#define POWER_DESC_MAX_ACTV_ICC_LVLS 16
|
||||
|
||||
/* Attribute bActiveICCLevel parameter bit masks definitions */
|
||||
#define ATTR_ICC_LVL_UNIT_OFFSET 14
|
||||
#define ATTR_ICC_LVL_UNIT_MASK (0x3 << ATTR_ICC_LVL_UNIT_OFFSET)
|
||||
#define ATTR_ICC_LVL_VALUE_MASK 0x3FF
|
||||
|
||||
/* Power descriptor parameters offsets in bytes */
|
||||
enum power_desc_param_offset {
|
||||
PWR_DESC_LEN = 0x0,
|
||||
PWR_DESC_TYPE = 0x1,
|
||||
PWR_DESC_ACTIVE_LVLS_VCC_0 = 0x2,
|
||||
PWR_DESC_ACTIVE_LVLS_VCCQ_0 = 0x22,
|
||||
PWR_DESC_ACTIVE_LVLS_VCCQ2_0 = 0x42,
|
||||
};
|
||||
|
||||
/* Exception event mask values */
|
||||
enum {
|
||||
MASK_EE_STATUS = 0xFFFF,
|
||||
MASK_EE_DYNCAP_EVENT = BIT(0),
|
||||
MASK_EE_SYSPOOL_EVENT = BIT(1),
|
||||
MASK_EE_URGENT_BKOPS = BIT(2),
|
||||
MASK_EE_TOO_HIGH_TEMP = BIT(3),
|
||||
MASK_EE_TOO_LOW_TEMP = BIT(4),
|
||||
MASK_EE_WRITEBOOSTER_EVENT = BIT(5),
|
||||
MASK_EE_PERFORMANCE_THROTTLING = BIT(6),
|
||||
};
|
||||
#define MASK_EE_URGENT_TEMP (MASK_EE_TOO_HIGH_TEMP | MASK_EE_TOO_LOW_TEMP)
|
||||
|
||||
/* Background operation status */
|
||||
enum bkops_status {
|
||||
BKOPS_STATUS_NO_OP = 0x0,
|
||||
BKOPS_STATUS_NON_CRITICAL = 0x1,
|
||||
BKOPS_STATUS_PERF_IMPACT = 0x2,
|
||||
BKOPS_STATUS_CRITICAL = 0x3,
|
||||
BKOPS_STATUS_MAX = BKOPS_STATUS_CRITICAL,
|
||||
};
|
||||
|
||||
/* UTP QUERY Transaction Specific Fields OpCode */
|
||||
enum query_opcode {
|
||||
UPIU_QUERY_OPCODE_NOP = 0x0,
|
||||
UPIU_QUERY_OPCODE_READ_DESC = 0x1,
|
||||
UPIU_QUERY_OPCODE_WRITE_DESC = 0x2,
|
||||
UPIU_QUERY_OPCODE_READ_ATTR = 0x3,
|
||||
UPIU_QUERY_OPCODE_WRITE_ATTR = 0x4,
|
||||
UPIU_QUERY_OPCODE_READ_FLAG = 0x5,
|
||||
UPIU_QUERY_OPCODE_SET_FLAG = 0x6,
|
||||
UPIU_QUERY_OPCODE_CLEAR_FLAG = 0x7,
|
||||
UPIU_QUERY_OPCODE_TOGGLE_FLAG = 0x8,
|
||||
};
|
||||
|
||||
/* bRefClkFreq attribute values */
|
||||
enum ufs_ref_clk_freq {
|
||||
REF_CLK_FREQ_19_2_MHZ = 0,
|
||||
REF_CLK_FREQ_26_MHZ = 1,
|
||||
REF_CLK_FREQ_38_4_MHZ = 2,
|
||||
REF_CLK_FREQ_52_MHZ = 3,
|
||||
REF_CLK_FREQ_INVAL = -1,
|
||||
};
|
||||
|
||||
struct ufs_ref_clk {
|
||||
unsigned long freq_hz;
|
||||
enum ufs_ref_clk_freq val;
|
||||
};
|
||||
|
||||
/* Query response result code */
|
||||
enum {
|
||||
QUERY_RESULT_SUCCESS = 0x00,
|
||||
QUERY_RESULT_NOT_READABLE = 0xF6,
|
||||
QUERY_RESULT_NOT_WRITEABLE = 0xF7,
|
||||
QUERY_RESULT_ALREADY_WRITTEN = 0xF8,
|
||||
QUERY_RESULT_INVALID_LENGTH = 0xF9,
|
||||
QUERY_RESULT_INVALID_VALUE = 0xFA,
|
||||
QUERY_RESULT_INVALID_SELECTOR = 0xFB,
|
||||
QUERY_RESULT_INVALID_INDEX = 0xFC,
|
||||
QUERY_RESULT_INVALID_IDN = 0xFD,
|
||||
QUERY_RESULT_INVALID_OPCODE = 0xFE,
|
||||
QUERY_RESULT_GENERAL_FAILURE = 0xFF,
|
||||
};
|
||||
|
||||
/* UTP Transfer Request Command Type (CT) */
|
||||
enum {
|
||||
UPIU_COMMAND_SET_TYPE_SCSI = 0x0,
|
||||
UPIU_COMMAND_SET_TYPE_UFS = 0x1,
|
||||
UPIU_COMMAND_SET_TYPE_QUERY = 0x2,
|
||||
};
|
||||
|
||||
/* UTP Transfer Request Command Offset */
|
||||
#define UPIU_COMMAND_TYPE_OFFSET 28
|
||||
|
||||
/* Offset of the response code in the UPIU header */
|
||||
#define UPIU_RSP_CODE_OFFSET 8
|
||||
|
||||
enum {
|
||||
MASK_SCSI_STATUS = 0xFF,
|
||||
MASK_TASK_RESPONSE = 0xFF00,
|
||||
MASK_RSP_UPIU_RESULT = 0xFFFF,
|
||||
MASK_QUERY_DATA_SEG_LEN = 0xFFFF,
|
||||
MASK_RSP_UPIU_DATA_SEG_LEN = 0xFFFF,
|
||||
MASK_RSP_EXCEPTION_EVENT = 0x10000,
|
||||
MASK_TM_SERVICE_RESP = 0xFF,
|
||||
MASK_TM_FUNC = 0xFF,
|
||||
};
|
||||
|
||||
/* Task management service response */
|
||||
enum {
|
||||
UPIU_TASK_MANAGEMENT_FUNC_COMPL = 0x00,
|
||||
UPIU_TASK_MANAGEMENT_FUNC_NOT_SUPPORTED = 0x04,
|
||||
UPIU_TASK_MANAGEMENT_FUNC_SUCCEEDED = 0x08,
|
||||
UPIU_TASK_MANAGEMENT_FUNC_FAILED = 0x05,
|
||||
UPIU_INCORRECT_LOGICAL_UNIT_NO = 0x09,
|
||||
};
|
||||
|
||||
/* UFS device power modes */
|
||||
enum ufs_dev_pwr_mode {
|
||||
UFS_ACTIVE_PWR_MODE = 1,
|
||||
UFS_SLEEP_PWR_MODE = 2,
|
||||
UFS_POWERDOWN_PWR_MODE = 3,
|
||||
UFS_DEEPSLEEP_PWR_MODE = 4,
|
||||
};
|
||||
|
||||
#define UFS_WB_BUF_REMAIN_PERCENT(val) ((val) / 10)
|
||||
|
||||
/**
|
||||
* struct utp_cmd_rsp - Response UPIU structure
|
||||
* @residual_transfer_count: Residual transfer count DW-3
|
||||
* @reserved: Reserved double words DW-4 to DW-7
|
||||
* @sense_data_len: Sense data length DW-8 U16
|
||||
* @sense_data: Sense data field DW-8 to DW-12
|
||||
*/
|
||||
struct utp_cmd_rsp {
|
||||
__be32 residual_transfer_count;
|
||||
__be32 reserved[4];
|
||||
__be16 sense_data_len;
|
||||
u8 sense_data[UFS_SENSE_SIZE];
|
||||
};
|
||||
|
||||
struct ufshpb_active_field {
|
||||
__be16 active_rgn;
|
||||
__be16 active_srgn;
|
||||
};
|
||||
#define HPB_ACT_FIELD_SIZE 4
|
||||
|
||||
/**
|
||||
* struct utp_hpb_rsp - Response UPIU structure
|
||||
* @residual_transfer_count: Residual transfer count DW-3
|
||||
* @reserved1: Reserved double words DW-4 to DW-7
|
||||
* @sense_data_len: Sense data length DW-8 U16
|
||||
* @desc_type: Descriptor type of sense data
|
||||
* @additional_len: Additional length of sense data
|
||||
* @hpb_op: HPB operation type
|
||||
* @lun: LUN of response UPIU
|
||||
* @active_rgn_cnt: Active region count
|
||||
* @inactive_rgn_cnt: Inactive region count
|
||||
* @hpb_active_field: Recommended to read HPB region and subregion
|
||||
* @hpb_inactive_field: To be inactivated HPB region and subregion
|
||||
*/
|
||||
struct utp_hpb_rsp {
|
||||
__be32 residual_transfer_count;
|
||||
__be32 reserved1[4];
|
||||
__be16 sense_data_len;
|
||||
u8 desc_type;
|
||||
u8 additional_len;
|
||||
u8 hpb_op;
|
||||
u8 lun;
|
||||
u8 active_rgn_cnt;
|
||||
u8 inactive_rgn_cnt;
|
||||
struct ufshpb_active_field hpb_active_field[2];
|
||||
__be16 hpb_inactive_field[2];
|
||||
};
|
||||
#define UTP_HPB_RSP_SIZE 40
|
||||
|
||||
/**
|
||||
* struct utp_upiu_rsp - general upiu response structure
|
||||
* @header: UPIU header structure DW-0 to DW-2
|
||||
* @sr: fields structure for scsi command DW-3 to DW-12
|
||||
* @qr: fields structure for query request DW-3 to DW-7
|
||||
*/
|
||||
struct utp_upiu_rsp {
|
||||
struct utp_upiu_header header;
|
||||
union {
|
||||
struct utp_cmd_rsp sr;
|
||||
struct utp_hpb_rsp hr;
|
||||
struct utp_upiu_query qr;
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ufs_query_req - parameters for building a query request
|
||||
* @query_func: UPIU header query function
|
||||
* @upiu_req: the query request data
|
||||
*/
|
||||
struct ufs_query_req {
|
||||
u8 query_func;
|
||||
struct utp_upiu_query upiu_req;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ufs_query_resp - UPIU QUERY
|
||||
* @response: device response code
|
||||
* @upiu_res: query response data
|
||||
*/
|
||||
struct ufs_query_res {
|
||||
u8 response;
|
||||
struct utp_upiu_query upiu_res;
|
||||
};
|
||||
|
||||
#define UFS_VREG_VCC_MIN_UV 2700000 /* uV */
|
||||
#define UFS_VREG_VCC_MAX_UV 3600000 /* uV */
|
||||
#define UFS_VREG_VCC_1P8_MIN_UV 1700000 /* uV */
|
||||
#define UFS_VREG_VCC_1P8_MAX_UV 1950000 /* uV */
|
||||
#define UFS_VREG_VCCQ_MIN_UV 1140000 /* uV */
|
||||
#define UFS_VREG_VCCQ_MAX_UV 1260000 /* uV */
|
||||
#define UFS_VREG_VCCQ2_MIN_UV 1700000 /* uV */
|
||||
#define UFS_VREG_VCCQ2_MAX_UV 1950000 /* uV */
|
||||
|
||||
/*
|
||||
* VCCQ & VCCQ2 current requirement when UFS device is in sleep state
|
||||
* and link is in Hibern8 state.
|
||||
*/
|
||||
#define UFS_VREG_LPM_LOAD_UA 1000 /* uA */
|
||||
|
||||
struct ufs_vreg {
|
||||
struct regulator *reg;
|
||||
const char *name;
|
||||
bool always_on;
|
||||
bool enabled;
|
||||
int min_uV;
|
||||
int max_uV;
|
||||
int max_uA;
|
||||
};
|
||||
|
||||
struct ufs_vreg_info {
|
||||
struct ufs_vreg *vcc;
|
||||
struct ufs_vreg *vccq;
|
||||
struct ufs_vreg *vccq2;
|
||||
struct ufs_vreg *vdd_hba;
|
||||
};
|
||||
|
||||
struct ufs_dev_info {
|
||||
bool f_power_on_wp_en;
|
||||
/* Keeps information if any of the LU is power on write protected */
|
||||
bool is_lu_power_on_wp;
|
||||
/* Maximum number of general LU supported by the UFS device */
|
||||
u8 max_lu_supported;
|
||||
u16 wmanufacturerid;
|
||||
/*UFS device Product Name */
|
||||
u8 *model;
|
||||
u16 wspecversion;
|
||||
u32 clk_gating_wait_us;
|
||||
|
||||
/* UFS HPB related flag */
|
||||
bool hpb_enabled;
|
||||
|
||||
/* UFS WB related flags */
|
||||
bool wb_enabled;
|
||||
bool wb_buf_flush_enabled;
|
||||
u8 wb_dedicated_lu;
|
||||
u8 wb_buffer_type;
|
||||
|
||||
bool b_rpm_dev_flush_capable;
|
||||
u8 b_presrv_uspc_en;
|
||||
};
|
||||
|
||||
/*
|
||||
* This enum is used in string mapping in include/trace/events/ufs.h.
|
||||
*/
|
||||
enum ufs_trace_str_t {
|
||||
UFS_CMD_SEND, UFS_CMD_COMP, UFS_DEV_COMP,
|
||||
UFS_QUERY_SEND, UFS_QUERY_COMP, UFS_QUERY_ERR,
|
||||
UFS_TM_SEND, UFS_TM_COMP, UFS_TM_ERR
|
||||
};
|
||||
|
||||
/*
|
||||
* Transaction Specific Fields (TSF) type in the UPIU package, this enum is
|
||||
* used in include/trace/events/ufs.h for UFS command trace.
|
||||
*/
|
||||
enum ufs_trace_tsf_t {
|
||||
UFS_TSF_CDB, UFS_TSF_OSF, UFS_TSF_TM_INPUT, UFS_TSF_TM_OUTPUT
|
||||
};
|
||||
|
||||
/**
|
||||
* ufs_is_valid_unit_desc_lun - checks if the given LUN has a unit descriptor
|
||||
* @dev_info: pointer of instance of struct ufs_dev_info
|
||||
* @lun: LU number to check
|
||||
* @return: true if the lun has a matching unit descriptor, false otherwise
|
||||
*/
|
||||
static inline bool ufs_is_valid_unit_desc_lun(struct ufs_dev_info *dev_info,
|
||||
u8 lun, u8 param_offset)
|
||||
{
|
||||
if (!dev_info || !dev_info->max_lu_supported) {
|
||||
pr_err("Max General LU supported by UFS isn't initialized\n");
|
||||
return false;
|
||||
}
|
||||
/* WB is available only for the logical unit from 0 to 7 */
|
||||
if (param_offset == UNIT_DESC_PARAM_WB_BUF_ALLOC_UNITS)
|
||||
return lun < UFS_UPIU_MAX_WB_LUN_ID;
|
||||
return lun == UFS_UPIU_RPMB_WLUN || (lun < dev_info->max_lu_supported);
|
||||
}
|
||||
|
||||
#endif /* End of Header */
|
||||
125
include/drivers-private/scsi/ufs/k517/ufs_quirks.h
Normal file
125
include/drivers-private/scsi/ufs/k517/ufs_quirks.h
Normal file
@@ -0,0 +1,125 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef _UFS_QUIRKS_H_
|
||||
#define _UFS_QUIRKS_H_
|
||||
|
||||
/* return true if s1 is a prefix of s2 */
|
||||
#define STR_PRFX_EQUAL(s1, s2) !strncmp(s1, s2, strlen(s1))
|
||||
|
||||
#define UFS_ANY_VENDOR 0xFFFF
|
||||
#define UFS_ANY_MODEL "ANY_MODEL"
|
||||
|
||||
#define UFS_VENDOR_MICRON 0x12C
|
||||
#define UFS_VENDOR_SAMSUNG 0x1CE
|
||||
#define UFS_VENDOR_SKHYNIX 0x1AD
|
||||
#define UFS_VENDOR_TOSHIBA 0x198
|
||||
#define UFS_VENDOR_WDC 0x145
|
||||
|
||||
/**
|
||||
* ufs_dev_fix - ufs device quirk info
|
||||
* @card: ufs card details
|
||||
* @quirk: device quirk
|
||||
*/
|
||||
struct ufs_dev_fix {
|
||||
u16 wmanufacturerid;
|
||||
u8 *model;
|
||||
unsigned int quirk;
|
||||
};
|
||||
|
||||
#define END_FIX { }
|
||||
|
||||
/* add specific device quirk */
|
||||
#define UFS_FIX(_vendor, _model, _quirk) { \
|
||||
.wmanufacturerid = (_vendor),\
|
||||
.model = (_model), \
|
||||
.quirk = (_quirk), \
|
||||
}
|
||||
|
||||
/*
|
||||
* Some vendor's UFS device sends back to back NACs for the DL data frames
|
||||
* causing the host controller to raise the DFES error status. Sometimes
|
||||
* such UFS devices send back to back NAC without waiting for new
|
||||
* retransmitted DL frame from the host and in such cases it might be possible
|
||||
* the Host UniPro goes into bad state without raising the DFES error
|
||||
* interrupt. If this happens then all the pending commands would timeout
|
||||
* only after respective SW command (which is generally too large).
|
||||
*
|
||||
* We can workaround such device behaviour like this:
|
||||
* - As soon as SW sees the DL NAC error, it should schedule the error handler
|
||||
* - Error handler would sleep for 50ms to see if there are any fatal errors
|
||||
* raised by UFS controller.
|
||||
* - If there are fatal errors then SW does normal error recovery.
|
||||
* - If there are no fatal errors then SW sends the NOP command to device
|
||||
* to check if link is alive.
|
||||
* - If NOP command times out, SW does normal error recovery
|
||||
* - If NOP command succeed, skip the error handling.
|
||||
*
|
||||
* If DL NAC error is seen multiple times with some vendor's UFS devices then
|
||||
* enable this quirk to initiate quick error recovery and also silence related
|
||||
* error logs to reduce spamming of kernel logs.
|
||||
*/
|
||||
#define UFS_DEVICE_QUIRK_RECOVERY_FROM_DL_NAC_ERRORS (1 << 2)
|
||||
|
||||
/*
|
||||
* Few Toshiba UFS device models advertise RX_MIN_ACTIVATETIME_CAPABILITY as
|
||||
* 600us which may not be enough for reliable hibern8 exit hardware sequence
|
||||
* from UFS device.
|
||||
* To workaround this issue, host should set its PA_TACTIVATE time to 1ms even
|
||||
* if device advertises RX_MIN_ACTIVATETIME_CAPABILITY less than 1ms.
|
||||
*/
|
||||
#define UFS_DEVICE_QUIRK_PA_TACTIVATE (1 << 4)
|
||||
|
||||
/*
|
||||
* It seems some UFS devices may keep drawing more than sleep current
|
||||
* (atleast for 500us) from UFS rails (especially from VCCQ rail).
|
||||
* To avoid this situation, add 2ms delay before putting these UFS
|
||||
* rails in LPM mode.
|
||||
*/
|
||||
#define UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM (1 << 6)
|
||||
|
||||
/*
|
||||
* Some UFS devices require host PA_TACTIVATE to be lower than device
|
||||
* PA_TACTIVATE, enabling this quirk ensure this.
|
||||
*/
|
||||
#define UFS_DEVICE_QUIRK_HOST_PA_TACTIVATE (1 << 7)
|
||||
|
||||
/*
|
||||
* The max. value PA_SaveConfigTime is 250 (10us) but this is not enough for
|
||||
* some vendors.
|
||||
* Gear switch from PWM to HS may fail even with this max. PA_SaveConfigTime.
|
||||
* Gear switch can be issued by host controller as an error recovery and any
|
||||
* software delay will not help on this case so we need to increase
|
||||
* PA_SaveConfigTime to >32us as per vendor recommendation.
|
||||
*/
|
||||
#define UFS_DEVICE_QUIRK_HOST_PA_SAVECONFIGTIME (1 << 8)
|
||||
|
||||
/*
|
||||
* Some UFS devices require VS_DebugSaveConfigTime is 0x10,
|
||||
* enabling this quirk ensure this.
|
||||
*/
|
||||
#define UFS_DEVICE_QUIRK_HOST_VS_DEBUGSAVECONFIGTIME (1 << 9)
|
||||
|
||||
/*
|
||||
* Some pre-3.1 UFS devices can support extended features by upgrading
|
||||
* the firmware. Enable this quirk to make UFS core driver probe and enable
|
||||
* supported features on such devices.
|
||||
*/
|
||||
#define UFS_DEVICE_QUIRK_SUPPORT_EXTENDED_FEATURES (1 << 10)
|
||||
|
||||
/*
|
||||
* Some UFS devices require delay after VCC power rail is turned-off.
|
||||
* Enable this quirk to introduce 5ms delays after VCC power-off during
|
||||
* suspend flow.
|
||||
*/
|
||||
#define UFS_DEVICE_QUIRK_DELAY_AFTER_LPM (1 << 11)
|
||||
|
||||
/*
|
||||
* Some UFS devices require L2P entry should be swapped before being sent to the
|
||||
* UFS device for HPB READ command.
|
||||
*/
|
||||
#define UFS_DEVICE_QUIRK_SWAP_L2P_ENTRY_FOR_HPB_READ (1 << 12)
|
||||
|
||||
#endif /* UFS_QUIRKS_H_ */
|
||||
36
include/drivers-private/scsi/ufs/k517/ufshcd-pltfrm.h
Normal file
36
include/drivers-private/scsi/ufs/k517/ufshcd-pltfrm.h
Normal file
@@ -0,0 +1,36 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright (c) 2015, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef UFSHCD_PLTFRM_H_
|
||||
#define UFSHCD_PLTFRM_H_
|
||||
|
||||
#include "ufshcd.h"
|
||||
|
||||
#define UFS_PWM_MODE 1
|
||||
#define UFS_HS_MODE 2
|
||||
|
||||
struct ufs_dev_params {
|
||||
u32 pwm_rx_gear; /* pwm rx gear to work in */
|
||||
u32 pwm_tx_gear; /* pwm tx gear to work in */
|
||||
u32 hs_rx_gear; /* hs rx gear to work in */
|
||||
u32 hs_tx_gear; /* hs tx gear to work in */
|
||||
u32 rx_lanes; /* number of rx lanes */
|
||||
u32 tx_lanes; /* number of tx lanes */
|
||||
u32 rx_pwr_pwm; /* rx pwm working pwr */
|
||||
u32 tx_pwr_pwm; /* tx pwm working pwr */
|
||||
u32 rx_pwr_hs; /* rx hs working pwr */
|
||||
u32 tx_pwr_hs; /* tx hs working pwr */
|
||||
u32 hs_rate; /* rate A/B to work in HS */
|
||||
u32 desired_working_mode;
|
||||
};
|
||||
|
||||
int ufshcd_get_pwr_dev_param(struct ufs_dev_params *dev_param,
|
||||
struct ufs_pa_layer_attr *dev_max,
|
||||
struct ufs_pa_layer_attr *agreed_pwr);
|
||||
void ufshcd_init_pwr_dev_param(struct ufs_dev_params *dev_param);
|
||||
int ufshcd_pltfrm_init(struct platform_device *pdev,
|
||||
const struct ufs_hba_variant_ops *vops);
|
||||
void ufshcd_pltfrm_shutdown(struct platform_device *pdev);
|
||||
|
||||
#endif /* UFSHCD_PLTFRM_H_ */
|
||||
1440
include/drivers-private/scsi/ufs/k517/ufshcd.h
Normal file
1440
include/drivers-private/scsi/ufs/k517/ufshcd.h
Normal file
File diff suppressed because it is too large
Load Diff
508
include/drivers-private/scsi/ufs/k517/ufshci.h
Normal file
508
include/drivers-private/scsi/ufs/k517/ufshci.h
Normal file
@@ -0,0 +1,508 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* Universal Flash Storage Host controller driver
|
||||
* Copyright (C) 2011-2013 Samsung India Software Operations
|
||||
*
|
||||
* Authors:
|
||||
* Santosh Yaraganavi <santosh.sy@samsung.com>
|
||||
* Vinayak Holikatti <h.vinayak@samsung.com>
|
||||
*/
|
||||
|
||||
#ifndef _UFSHCI_H
|
||||
#define _UFSHCI_H
|
||||
|
||||
enum {
|
||||
TASK_REQ_UPIU_SIZE_DWORDS = 8,
|
||||
TASK_RSP_UPIU_SIZE_DWORDS = 8,
|
||||
ALIGNED_UPIU_SIZE = 512,
|
||||
};
|
||||
|
||||
/* UFSHCI Registers */
|
||||
enum {
|
||||
REG_CONTROLLER_CAPABILITIES = 0x00,
|
||||
REG_UFS_VERSION = 0x08,
|
||||
REG_CONTROLLER_DEV_ID = 0x10,
|
||||
REG_CONTROLLER_PROD_ID = 0x14,
|
||||
REG_AUTO_HIBERNATE_IDLE_TIMER = 0x18,
|
||||
REG_INTERRUPT_STATUS = 0x20,
|
||||
REG_INTERRUPT_ENABLE = 0x24,
|
||||
REG_CONTROLLER_STATUS = 0x30,
|
||||
REG_CONTROLLER_ENABLE = 0x34,
|
||||
REG_UIC_ERROR_CODE_PHY_ADAPTER_LAYER = 0x38,
|
||||
REG_UIC_ERROR_CODE_DATA_LINK_LAYER = 0x3C,
|
||||
REG_UIC_ERROR_CODE_NETWORK_LAYER = 0x40,
|
||||
REG_UIC_ERROR_CODE_TRANSPORT_LAYER = 0x44,
|
||||
REG_UIC_ERROR_CODE_DME = 0x48,
|
||||
REG_UTP_TRANSFER_REQ_INT_AGG_CONTROL = 0x4C,
|
||||
REG_UTP_TRANSFER_REQ_LIST_BASE_L = 0x50,
|
||||
REG_UTP_TRANSFER_REQ_LIST_BASE_H = 0x54,
|
||||
REG_UTP_TRANSFER_REQ_DOOR_BELL = 0x58,
|
||||
REG_UTP_TRANSFER_REQ_LIST_CLEAR = 0x5C,
|
||||
REG_UTP_TRANSFER_REQ_LIST_RUN_STOP = 0x60,
|
||||
REG_UTP_TASK_REQ_LIST_BASE_L = 0x70,
|
||||
REG_UTP_TASK_REQ_LIST_BASE_H = 0x74,
|
||||
REG_UTP_TASK_REQ_DOOR_BELL = 0x78,
|
||||
REG_UTP_TASK_REQ_LIST_CLEAR = 0x7C,
|
||||
REG_UTP_TASK_REQ_LIST_RUN_STOP = 0x80,
|
||||
REG_UIC_COMMAND = 0x90,
|
||||
REG_UIC_COMMAND_ARG_1 = 0x94,
|
||||
REG_UIC_COMMAND_ARG_2 = 0x98,
|
||||
REG_UIC_COMMAND_ARG_3 = 0x9C,
|
||||
|
||||
UFSHCI_REG_SPACE_SIZE = 0xA0,
|
||||
|
||||
REG_UFS_CCAP = 0x100,
|
||||
REG_UFS_CRYPTOCAP = 0x104,
|
||||
|
||||
UFSHCI_CRYPTO_REG_SPACE_SIZE = 0x400,
|
||||
};
|
||||
|
||||
/* Controller capability masks */
|
||||
enum {
|
||||
MASK_TRANSFER_REQUESTS_SLOTS = 0x0000001F,
|
||||
MASK_TASK_MANAGEMENT_REQUEST_SLOTS = 0x00070000,
|
||||
MASK_AUTO_HIBERN8_SUPPORT = 0x00800000,
|
||||
MASK_64_ADDRESSING_SUPPORT = 0x01000000,
|
||||
MASK_OUT_OF_ORDER_DATA_DELIVERY_SUPPORT = 0x02000000,
|
||||
MASK_UIC_DME_TEST_MODE_SUPPORT = 0x04000000,
|
||||
MASK_CRYPTO_SUPPORT = 0x10000000,
|
||||
};
|
||||
|
||||
#define UFS_MASK(mask, offset) ((mask) << (offset))
|
||||
|
||||
/* UFS Version 08h */
|
||||
#define MINOR_VERSION_NUM_MASK UFS_MASK(0xFFFF, 0)
|
||||
#define MAJOR_VERSION_NUM_MASK UFS_MASK(0xFFFF, 16)
|
||||
|
||||
/*
|
||||
* Controller UFSHCI version
|
||||
* - 2.x and newer use the following scheme:
|
||||
* major << 8 + minor << 4
|
||||
* - 1.x has been converted to match this in
|
||||
* ufshcd_get_ufs_version()
|
||||
*/
|
||||
static inline u32 ufshci_version(u32 major, u32 minor)
|
||||
{
|
||||
return (major << 8) + (minor << 4);
|
||||
}
|
||||
|
||||
/*
|
||||
* HCDDID - Host Controller Identification Descriptor
|
||||
* - Device ID and Device Class 10h
|
||||
*/
|
||||
#define DEVICE_CLASS UFS_MASK(0xFFFF, 0)
|
||||
#define DEVICE_ID UFS_MASK(0xFF, 24)
|
||||
|
||||
/*
|
||||
* HCPMID - Host Controller Identification Descriptor
|
||||
* - Product/Manufacturer ID 14h
|
||||
*/
|
||||
#define MANUFACTURE_ID_MASK UFS_MASK(0xFFFF, 0)
|
||||
#define PRODUCT_ID_MASK UFS_MASK(0xFFFF, 16)
|
||||
|
||||
/* AHIT - Auto-Hibernate Idle Timer */
|
||||
#define UFSHCI_AHIBERN8_TIMER_MASK GENMASK(9, 0)
|
||||
#define UFSHCI_AHIBERN8_SCALE_MASK GENMASK(12, 10)
|
||||
#define UFSHCI_AHIBERN8_SCALE_FACTOR 10
|
||||
#define UFSHCI_AHIBERN8_MAX (1023 * 100000)
|
||||
|
||||
/*
|
||||
* IS - Interrupt Status - 20h
|
||||
*/
|
||||
#define UTP_TRANSFER_REQ_COMPL 0x1
|
||||
#define UIC_DME_END_PT_RESET 0x2
|
||||
#define UIC_ERROR 0x4
|
||||
#define UIC_TEST_MODE 0x8
|
||||
#define UIC_POWER_MODE 0x10
|
||||
#define UIC_HIBERNATE_EXIT 0x20
|
||||
#define UIC_HIBERNATE_ENTER 0x40
|
||||
#define UIC_LINK_LOST 0x80
|
||||
#define UIC_LINK_STARTUP 0x100
|
||||
#define UTP_TASK_REQ_COMPL 0x200
|
||||
#define UIC_COMMAND_COMPL 0x400
|
||||
#define DEVICE_FATAL_ERROR 0x800
|
||||
#define CONTROLLER_FATAL_ERROR 0x10000
|
||||
#define SYSTEM_BUS_FATAL_ERROR 0x20000
|
||||
#define CRYPTO_ENGINE_FATAL_ERROR 0x40000
|
||||
|
||||
#define UFSHCD_UIC_HIBERN8_MASK (UIC_HIBERNATE_ENTER |\
|
||||
UIC_HIBERNATE_EXIT)
|
||||
|
||||
#define UFSHCD_UIC_PWR_MASK (UFSHCD_UIC_HIBERN8_MASK |\
|
||||
UIC_POWER_MODE)
|
||||
|
||||
#define UFSHCD_UIC_MASK (UIC_COMMAND_COMPL | UFSHCD_UIC_PWR_MASK)
|
||||
|
||||
#define UFSHCD_ERROR_MASK (UIC_ERROR |\
|
||||
DEVICE_FATAL_ERROR |\
|
||||
CONTROLLER_FATAL_ERROR |\
|
||||
SYSTEM_BUS_FATAL_ERROR |\
|
||||
CRYPTO_ENGINE_FATAL_ERROR)
|
||||
|
||||
#define INT_FATAL_ERRORS (DEVICE_FATAL_ERROR |\
|
||||
CONTROLLER_FATAL_ERROR |\
|
||||
SYSTEM_BUS_FATAL_ERROR |\
|
||||
CRYPTO_ENGINE_FATAL_ERROR |\
|
||||
UIC_LINK_LOST)
|
||||
|
||||
/* HCS - Host Controller Status 30h */
|
||||
#define DEVICE_PRESENT 0x1
|
||||
#define UTP_TRANSFER_REQ_LIST_READY 0x2
|
||||
#define UTP_TASK_REQ_LIST_READY 0x4
|
||||
#define UIC_COMMAND_READY 0x8
|
||||
#define HOST_ERROR_INDICATOR 0x10
|
||||
#define DEVICE_ERROR_INDICATOR 0x20
|
||||
#define UIC_POWER_MODE_CHANGE_REQ_STATUS_MASK UFS_MASK(0x7, 8)
|
||||
|
||||
#define UFSHCD_STATUS_READY (UTP_TRANSFER_REQ_LIST_READY |\
|
||||
UTP_TASK_REQ_LIST_READY |\
|
||||
UIC_COMMAND_READY)
|
||||
|
||||
enum {
|
||||
PWR_OK = 0x0,
|
||||
PWR_LOCAL = 0x01,
|
||||
PWR_REMOTE = 0x02,
|
||||
PWR_BUSY = 0x03,
|
||||
PWR_ERROR_CAP = 0x04,
|
||||
PWR_FATAL_ERROR = 0x05,
|
||||
};
|
||||
|
||||
/* HCE - Host Controller Enable 34h */
|
||||
#define CONTROLLER_ENABLE 0x1
|
||||
#define CONTROLLER_DISABLE 0x0
|
||||
#define CRYPTO_GENERAL_ENABLE 0x2
|
||||
|
||||
/* UECPA - Host UIC Error Code PHY Adapter Layer 38h */
|
||||
#define UIC_PHY_ADAPTER_LAYER_ERROR 0x80000000
|
||||
#define UIC_PHY_ADAPTER_LAYER_ERROR_CODE_MASK 0x1F
|
||||
#define UIC_PHY_ADAPTER_LAYER_LANE_ERR_MASK 0xF
|
||||
#define UIC_PHY_ADAPTER_LAYER_GENERIC_ERROR 0x10
|
||||
|
||||
/* UECDL - Host UIC Error Code Data Link Layer 3Ch */
|
||||
#define UIC_DATA_LINK_LAYER_ERROR 0x80000000
|
||||
#define UIC_DATA_LINK_LAYER_ERROR_CODE_MASK 0xFFFF
|
||||
#define UIC_DATA_LINK_LAYER_ERROR_TCX_REP_TIMER_EXP 0x2
|
||||
#define UIC_DATA_LINK_LAYER_ERROR_AFCX_REQ_TIMER_EXP 0x4
|
||||
#define UIC_DATA_LINK_LAYER_ERROR_FCX_PRO_TIMER_EXP 0x8
|
||||
#define UIC_DATA_LINK_LAYER_ERROR_RX_BUF_OF 0x20
|
||||
#define UIC_DATA_LINK_LAYER_ERROR_PA_INIT 0x2000
|
||||
#define UIC_DATA_LINK_LAYER_ERROR_NAC_RECEIVED 0x0001
|
||||
#define UIC_DATA_LINK_LAYER_ERROR_TCx_REPLAY_TIMEOUT 0x0002
|
||||
|
||||
/* UECN - Host UIC Error Code Network Layer 40h */
|
||||
#define UIC_NETWORK_LAYER_ERROR 0x80000000
|
||||
#define UIC_NETWORK_LAYER_ERROR_CODE_MASK 0x7
|
||||
#define UIC_NETWORK_UNSUPPORTED_HEADER_TYPE 0x1
|
||||
#define UIC_NETWORK_BAD_DEVICEID_ENC 0x2
|
||||
#define UIC_NETWORK_LHDR_TRAP_PACKET_DROPPING 0x4
|
||||
|
||||
/* UECT - Host UIC Error Code Transport Layer 44h */
|
||||
#define UIC_TRANSPORT_LAYER_ERROR 0x80000000
|
||||
#define UIC_TRANSPORT_LAYER_ERROR_CODE_MASK 0x7F
|
||||
#define UIC_TRANSPORT_UNSUPPORTED_HEADER_TYPE 0x1
|
||||
#define UIC_TRANSPORT_UNKNOWN_CPORTID 0x2
|
||||
#define UIC_TRANSPORT_NO_CONNECTION_RX 0x4
|
||||
#define UIC_TRANSPORT_CONTROLLED_SEGMENT_DROPPING 0x8
|
||||
#define UIC_TRANSPORT_BAD_TC 0x10
|
||||
#define UIC_TRANSPORT_E2E_CREDIT_OVERFOW 0x20
|
||||
#define UIC_TRANSPORT_SAFETY_VALUE_DROPPING 0x40
|
||||
|
||||
/* UECDME - Host UIC Error Code DME 48h */
|
||||
#define UIC_DME_ERROR 0x80000000
|
||||
#define UIC_DME_ERROR_CODE_MASK 0x1
|
||||
|
||||
/* UTRIACR - Interrupt Aggregation control register - 0x4Ch */
|
||||
#define INT_AGGR_TIMEOUT_VAL_MASK 0xFF
|
||||
#define INT_AGGR_COUNTER_THRESHOLD_MASK UFS_MASK(0x1F, 8)
|
||||
#define INT_AGGR_COUNTER_AND_TIMER_RESET 0x10000
|
||||
#define INT_AGGR_STATUS_BIT 0x100000
|
||||
#define INT_AGGR_PARAM_WRITE 0x1000000
|
||||
#define INT_AGGR_ENABLE 0x80000000
|
||||
|
||||
/* UTRLRSR - UTP Transfer Request Run-Stop Register 60h */
|
||||
#define UTP_TRANSFER_REQ_LIST_RUN_STOP_BIT 0x1
|
||||
|
||||
/* UTMRLRSR - UTP Task Management Request Run-Stop Register 80h */
|
||||
#define UTP_TASK_REQ_LIST_RUN_STOP_BIT 0x1
|
||||
|
||||
/* UICCMD - UIC Command */
|
||||
#define COMMAND_OPCODE_MASK 0xFF
|
||||
#define GEN_SELECTOR_INDEX_MASK 0xFFFF
|
||||
|
||||
#define MIB_ATTRIBUTE_MASK UFS_MASK(0xFFFF, 16)
|
||||
#define RESET_LEVEL 0xFF
|
||||
|
||||
#define ATTR_SET_TYPE_MASK UFS_MASK(0xFF, 16)
|
||||
#define CONFIG_RESULT_CODE_MASK 0xFF
|
||||
#define GENERIC_ERROR_CODE_MASK 0xFF
|
||||
|
||||
/* GenSelectorIndex calculation macros for M-PHY attributes */
|
||||
#define UIC_ARG_MPHY_TX_GEN_SEL_INDEX(lane) (lane)
|
||||
#define UIC_ARG_MPHY_RX_GEN_SEL_INDEX(lane) (PA_MAXDATALANES + (lane))
|
||||
|
||||
#define UIC_ARG_MIB_SEL(attr, sel) ((((attr) & 0xFFFF) << 16) |\
|
||||
((sel) & 0xFFFF))
|
||||
#define UIC_ARG_MIB(attr) UIC_ARG_MIB_SEL(attr, 0)
|
||||
#define UIC_ARG_ATTR_TYPE(t) (((t) & 0xFF) << 16)
|
||||
#define UIC_GET_ATTR_ID(v) (((v) >> 16) & 0xFFFF)
|
||||
|
||||
/* Link Status*/
|
||||
enum link_status {
|
||||
UFSHCD_LINK_IS_DOWN = 1,
|
||||
UFSHCD_LINK_IS_UP = 2,
|
||||
};
|
||||
|
||||
/* UIC Commands */
|
||||
enum uic_cmd_dme {
|
||||
UIC_CMD_DME_GET = 0x01,
|
||||
UIC_CMD_DME_SET = 0x02,
|
||||
UIC_CMD_DME_PEER_GET = 0x03,
|
||||
UIC_CMD_DME_PEER_SET = 0x04,
|
||||
UIC_CMD_DME_POWERON = 0x10,
|
||||
UIC_CMD_DME_POWEROFF = 0x11,
|
||||
UIC_CMD_DME_ENABLE = 0x12,
|
||||
UIC_CMD_DME_RESET = 0x14,
|
||||
UIC_CMD_DME_END_PT_RST = 0x15,
|
||||
UIC_CMD_DME_LINK_STARTUP = 0x16,
|
||||
UIC_CMD_DME_HIBER_ENTER = 0x17,
|
||||
UIC_CMD_DME_HIBER_EXIT = 0x18,
|
||||
UIC_CMD_DME_TEST_MODE = 0x1A,
|
||||
};
|
||||
|
||||
/* UIC Config result code / Generic error code */
|
||||
enum {
|
||||
UIC_CMD_RESULT_SUCCESS = 0x00,
|
||||
UIC_CMD_RESULT_INVALID_ATTR = 0x01,
|
||||
UIC_CMD_RESULT_FAILURE = 0x01,
|
||||
UIC_CMD_RESULT_INVALID_ATTR_VALUE = 0x02,
|
||||
UIC_CMD_RESULT_READ_ONLY_ATTR = 0x03,
|
||||
UIC_CMD_RESULT_WRITE_ONLY_ATTR = 0x04,
|
||||
UIC_CMD_RESULT_BAD_INDEX = 0x05,
|
||||
UIC_CMD_RESULT_LOCKED_ATTR = 0x06,
|
||||
UIC_CMD_RESULT_BAD_TEST_FEATURE_INDEX = 0x07,
|
||||
UIC_CMD_RESULT_PEER_COMM_FAILURE = 0x08,
|
||||
UIC_CMD_RESULT_BUSY = 0x09,
|
||||
UIC_CMD_RESULT_DME_FAILURE = 0x0A,
|
||||
};
|
||||
|
||||
#define MASK_UIC_COMMAND_RESULT 0xFF
|
||||
|
||||
#define INT_AGGR_COUNTER_THLD_VAL(c) (((c) & 0x1F) << 8)
|
||||
#define INT_AGGR_TIMEOUT_VAL(t) (((t) & 0xFF) << 0)
|
||||
|
||||
/* Interrupt disable masks */
|
||||
enum {
|
||||
/* Interrupt disable mask for UFSHCI v1.0 */
|
||||
INTERRUPT_MASK_ALL_VER_10 = 0x30FFF,
|
||||
INTERRUPT_MASK_RW_VER_10 = 0x30000,
|
||||
|
||||
/* Interrupt disable mask for UFSHCI v1.1 */
|
||||
INTERRUPT_MASK_ALL_VER_11 = 0x31FFF,
|
||||
|
||||
/* Interrupt disable mask for UFSHCI v2.1 */
|
||||
INTERRUPT_MASK_ALL_VER_21 = 0x71FFF,
|
||||
};
|
||||
|
||||
/* CCAP - Crypto Capability 100h */
|
||||
union ufs_crypto_capabilities {
|
||||
__le32 reg_val;
|
||||
struct {
|
||||
u8 num_crypto_cap;
|
||||
u8 config_count;
|
||||
u8 reserved;
|
||||
u8 config_array_ptr;
|
||||
};
|
||||
};
|
||||
|
||||
enum ufs_crypto_key_size {
|
||||
UFS_CRYPTO_KEY_SIZE_INVALID = 0x0,
|
||||
UFS_CRYPTO_KEY_SIZE_128 = 0x1,
|
||||
UFS_CRYPTO_KEY_SIZE_192 = 0x2,
|
||||
UFS_CRYPTO_KEY_SIZE_256 = 0x3,
|
||||
UFS_CRYPTO_KEY_SIZE_512 = 0x4,
|
||||
};
|
||||
|
||||
enum ufs_crypto_alg {
|
||||
UFS_CRYPTO_ALG_AES_XTS = 0x0,
|
||||
UFS_CRYPTO_ALG_BITLOCKER_AES_CBC = 0x1,
|
||||
UFS_CRYPTO_ALG_AES_ECB = 0x2,
|
||||
UFS_CRYPTO_ALG_ESSIV_AES_CBC = 0x3,
|
||||
};
|
||||
|
||||
/* x-CRYPTOCAP - Crypto Capability X */
|
||||
union ufs_crypto_cap_entry {
|
||||
__le32 reg_val;
|
||||
struct {
|
||||
u8 algorithm_id;
|
||||
u8 sdus_mask; /* Supported data unit size mask */
|
||||
u8 key_size;
|
||||
u8 reserved;
|
||||
};
|
||||
};
|
||||
|
||||
#define UFS_CRYPTO_CONFIGURATION_ENABLE (1 << 7)
|
||||
#define UFS_CRYPTO_KEY_MAX_SIZE 64
|
||||
/* x-CRYPTOCFG - Crypto Configuration X */
|
||||
union ufs_crypto_cfg_entry {
|
||||
__le32 reg_val[32];
|
||||
struct {
|
||||
u8 crypto_key[UFS_CRYPTO_KEY_MAX_SIZE];
|
||||
u8 data_unit_size;
|
||||
u8 crypto_cap_idx;
|
||||
u8 reserved_1;
|
||||
u8 config_enable;
|
||||
u8 reserved_multi_host;
|
||||
u8 reserved_2;
|
||||
u8 vsb[2];
|
||||
u8 reserved_3[56];
|
||||
};
|
||||
};
|
||||
|
||||
/*
|
||||
* Request Descriptor Definitions
|
||||
*/
|
||||
|
||||
/* Transfer request command type */
|
||||
enum {
|
||||
UTP_CMD_TYPE_SCSI = 0x0,
|
||||
UTP_CMD_TYPE_UFS = 0x1,
|
||||
UTP_CMD_TYPE_DEV_MANAGE = 0x2,
|
||||
};
|
||||
|
||||
/* To accommodate UFS2.0 required Command type */
|
||||
enum {
|
||||
UTP_CMD_TYPE_UFS_STORAGE = 0x1,
|
||||
};
|
||||
|
||||
enum {
|
||||
UTP_SCSI_COMMAND = 0x00000000,
|
||||
UTP_NATIVE_UFS_COMMAND = 0x10000000,
|
||||
UTP_DEVICE_MANAGEMENT_FUNCTION = 0x20000000,
|
||||
UTP_REQ_DESC_INT_CMD = 0x01000000,
|
||||
UTP_REQ_DESC_CRYPTO_ENABLE_CMD = 0x00800000,
|
||||
};
|
||||
|
||||
/* UTP Transfer Request Data Direction (DD) */
|
||||
enum {
|
||||
UTP_NO_DATA_TRANSFER = 0x00000000,
|
||||
UTP_HOST_TO_DEVICE = 0x02000000,
|
||||
UTP_DEVICE_TO_HOST = 0x04000000,
|
||||
};
|
||||
|
||||
/* Overall command status values */
|
||||
enum utp_ocs {
|
||||
OCS_SUCCESS = 0x0,
|
||||
OCS_INVALID_CMD_TABLE_ATTR = 0x1,
|
||||
OCS_INVALID_PRDT_ATTR = 0x2,
|
||||
OCS_MISMATCH_DATA_BUF_SIZE = 0x3,
|
||||
OCS_MISMATCH_RESP_UPIU_SIZE = 0x4,
|
||||
OCS_PEER_COMM_FAILURE = 0x5,
|
||||
OCS_ABORTED = 0x6,
|
||||
OCS_FATAL_ERROR = 0x7,
|
||||
OCS_DEVICE_FATAL_ERROR = 0x8,
|
||||
OCS_INVALID_CRYPTO_CONFIG = 0x9,
|
||||
OCS_GENERAL_CRYPTO_ERROR = 0xA,
|
||||
OCS_INVALID_COMMAND_STATUS = 0x0F,
|
||||
};
|
||||
|
||||
enum {
|
||||
MASK_OCS = 0x0F,
|
||||
};
|
||||
|
||||
/* The maximum length of the data byte count field in the PRDT is 256KB */
|
||||
#define PRDT_DATA_BYTE_COUNT_MAX (256 * 1024)
|
||||
/* The granularity of the data byte count field in the PRDT is 32-bit */
|
||||
#define PRDT_DATA_BYTE_COUNT_PAD 4
|
||||
|
||||
/**
|
||||
* struct ufshcd_sg_entry - UFSHCI PRD Entry
|
||||
* @addr: Physical address; DW-0 and DW-1.
|
||||
* @reserved: Reserved for future use DW-2
|
||||
* @size: size of physical segment DW-3
|
||||
*/
|
||||
struct ufshcd_sg_entry {
|
||||
__le64 addr;
|
||||
__le32 reserved;
|
||||
__le32 size;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct utp_transfer_cmd_desc - UTP Command Descriptor (UCD)
|
||||
* @command_upiu: Command UPIU Frame address
|
||||
* @response_upiu: Response UPIU Frame address
|
||||
* @prd_table: Physical Region Descriptor
|
||||
*/
|
||||
struct utp_transfer_cmd_desc {
|
||||
u8 command_upiu[ALIGNED_UPIU_SIZE];
|
||||
u8 response_upiu[ALIGNED_UPIU_SIZE];
|
||||
struct ufshcd_sg_entry prd_table[SG_ALL];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct request_desc_header - Descriptor Header common to both UTRD and UTMRD
|
||||
* @dword0: Descriptor Header DW0
|
||||
* @dword1: Descriptor Header DW1
|
||||
* @dword2: Descriptor Header DW2
|
||||
* @dword3: Descriptor Header DW3
|
||||
*/
|
||||
struct request_desc_header {
|
||||
__le32 dword_0;
|
||||
__le32 dword_1;
|
||||
__le32 dword_2;
|
||||
__le32 dword_3;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct utp_transfer_req_desc - UTP Transfer Request Descriptor (UTRD)
|
||||
* @header: UTRD header DW-0 to DW-3
|
||||
* @command_desc_base_addr_lo: UCD base address low DW-4
|
||||
* @command_desc_base_addr_hi: UCD base address high DW-5
|
||||
* @response_upiu_length: response UPIU length DW-6
|
||||
* @response_upiu_offset: response UPIU offset DW-6
|
||||
* @prd_table_length: Physical region descriptor length DW-7
|
||||
* @prd_table_offset: Physical region descriptor offset DW-7
|
||||
*/
|
||||
struct utp_transfer_req_desc {
|
||||
|
||||
/* DW 0-3 */
|
||||
struct request_desc_header header;
|
||||
|
||||
/* DW 4-5*/
|
||||
__le32 command_desc_base_addr_lo;
|
||||
__le32 command_desc_base_addr_hi;
|
||||
|
||||
/* DW 6 */
|
||||
__le16 response_upiu_length;
|
||||
__le16 response_upiu_offset;
|
||||
|
||||
/* DW 7 */
|
||||
__le16 prd_table_length;
|
||||
__le16 prd_table_offset;
|
||||
};
|
||||
|
||||
/*
|
||||
* UTMRD structure.
|
||||
*/
|
||||
struct utp_task_req_desc {
|
||||
/* DW 0-3 */
|
||||
struct request_desc_header header;
|
||||
|
||||
/* DW 4-11 - Task request UPIU structure */
|
||||
struct {
|
||||
struct utp_upiu_header req_header;
|
||||
__be32 input_param1;
|
||||
__be32 input_param2;
|
||||
__be32 input_param3;
|
||||
__be32 __reserved1[2];
|
||||
} upiu_req;
|
||||
|
||||
/* DW 12-19 - Task Management Response UPIU structure */
|
||||
struct {
|
||||
struct utp_upiu_header rsp_header;
|
||||
__be32 output_param1;
|
||||
__be32 output_param2;
|
||||
__be32 __reserved2[3];
|
||||
} upiu_rsp;
|
||||
};
|
||||
|
||||
#endif /* End of Header */
|
||||
332
include/drivers-private/scsi/ufs/k517/unipro.h
Normal file
332
include/drivers-private/scsi/ufs/k517/unipro.h
Normal file
@@ -0,0 +1,332 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* drivers/scsi/ufs/unipro.h
|
||||
*
|
||||
* Copyright (C) 2013 Samsung Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
#ifndef _UNIPRO_H_
|
||||
#define _UNIPRO_H_
|
||||
|
||||
/*
|
||||
* M-TX Configuration Attributes
|
||||
*/
|
||||
#define TX_HIBERN8TIME_CAPABILITY 0x000F
|
||||
#define TX_MODE 0x0021
|
||||
#define TX_HSRATE_SERIES 0x0022
|
||||
#define TX_HSGEAR 0x0023
|
||||
#define TX_PWMGEAR 0x0024
|
||||
#define TX_AMPLITUDE 0x0025
|
||||
#define TX_HS_SLEWRATE 0x0026
|
||||
#define TX_SYNC_SOURCE 0x0027
|
||||
#define TX_HS_SYNC_LENGTH 0x0028
|
||||
#define TX_HS_PREPARE_LENGTH 0x0029
|
||||
#define TX_LS_PREPARE_LENGTH 0x002A
|
||||
#define TX_HIBERN8_CONTROL 0x002B
|
||||
#define TX_LCC_ENABLE 0x002C
|
||||
#define TX_PWM_BURST_CLOSURE_EXTENSION 0x002D
|
||||
#define TX_BYPASS_8B10B_ENABLE 0x002E
|
||||
#define TX_DRIVER_POLARITY 0x002F
|
||||
#define TX_HS_UNTERMINATED_LINE_DRIVE_ENABLE 0x0030
|
||||
#define TX_LS_TERMINATED_LINE_DRIVE_ENABLE 0x0031
|
||||
#define TX_LCC_SEQUENCER 0x0032
|
||||
#define TX_MIN_ACTIVATETIME 0x0033
|
||||
#define TX_PWM_G6_G7_SYNC_LENGTH 0x0034
|
||||
#define TX_REFCLKFREQ 0x00EB
|
||||
#define TX_CFGCLKFREQVAL 0x00EC
|
||||
#define CFGEXTRATTR 0x00F0
|
||||
#define DITHERCTRL2 0x00F1
|
||||
|
||||
/*
|
||||
* M-RX Configuration Attributes
|
||||
*/
|
||||
#define RX_MODE 0x00A1
|
||||
#define RX_HSRATE_SERIES 0x00A2
|
||||
#define RX_HSGEAR 0x00A3
|
||||
#define RX_PWMGEAR 0x00A4
|
||||
#define RX_LS_TERMINATED_ENABLE 0x00A5
|
||||
#define RX_HS_UNTERMINATED_ENABLE 0x00A6
|
||||
#define RX_ENTER_HIBERN8 0x00A7
|
||||
#define RX_BYPASS_8B10B_ENABLE 0x00A8
|
||||
#define RX_TERMINATION_FORCE_ENABLE 0x00A9
|
||||
#define RX_MIN_ACTIVATETIME_CAPABILITY 0x008F
|
||||
#define RX_HIBERN8TIME_CAPABILITY 0x0092
|
||||
#define RX_REFCLKFREQ 0x00EB
|
||||
#define RX_CFGCLKFREQVAL 0x00EC
|
||||
#define CFGWIDEINLN 0x00F0
|
||||
#define CFGRXCDR8 0x00BA
|
||||
#define ENARXDIRECTCFG4 0x00F2
|
||||
#define CFGRXOVR8 0x00BD
|
||||
#define RXDIRECTCTRL2 0x00C7
|
||||
#define ENARXDIRECTCFG3 0x00F3
|
||||
#define RXCALCTRL 0x00B4
|
||||
#define ENARXDIRECTCFG2 0x00F4
|
||||
#define CFGRXOVR4 0x00E9
|
||||
#define RXSQCTRL 0x00B5
|
||||
#define CFGRXOVR6 0x00BF
|
||||
#define RX_HS_G1_SYNC_LENGTH_CAP 0x008B
|
||||
#define RX_HS_G1_PREP_LENGTH_CAP 0x008C
|
||||
#define RX_HS_G2_SYNC_LENGTH_CAP 0x0094
|
||||
#define RX_HS_G3_SYNC_LENGTH_CAP 0x0095
|
||||
#define RX_HS_G2_PREP_LENGTH_CAP 0x0096
|
||||
#define RX_HS_G3_PREP_LENGTH_CAP 0x0097
|
||||
#define RX_ADV_GRANULARITY_CAP 0x0098
|
||||
#define RX_MIN_ACTIVATETIME_CAP 0x008F
|
||||
#define RX_HIBERN8TIME_CAP 0x0092
|
||||
#define RX_ADV_HIBERN8TIME_CAP 0x0099
|
||||
#define RX_ADV_MIN_ACTIVATETIME_CAP 0x009A
|
||||
|
||||
|
||||
#define is_mphy_tx_attr(attr) (attr < RX_MODE)
|
||||
#define RX_ADV_FINE_GRAN_STEP(x) ((((x) & 0x3) << 1) | 0x1)
|
||||
#define SYNC_LEN_FINE(x) ((x) & 0x3F)
|
||||
#define SYNC_LEN_COARSE(x) ((1 << 6) | ((x) & 0x3F))
|
||||
#define PREP_LEN(x) ((x) & 0xF)
|
||||
|
||||
#define RX_MIN_ACTIVATETIME_UNIT_US 100
|
||||
#define HIBERN8TIME_UNIT_US 100
|
||||
|
||||
/*
|
||||
* Common Block Attributes
|
||||
*/
|
||||
#define TX_GLOBALHIBERNATE UNIPRO_CB_OFFSET(0x002B)
|
||||
#define REFCLKMODE UNIPRO_CB_OFFSET(0x00BF)
|
||||
#define DIRECTCTRL19 UNIPRO_CB_OFFSET(0x00CD)
|
||||
#define DIRECTCTRL10 UNIPRO_CB_OFFSET(0x00E6)
|
||||
#define CDIRECTCTRL6 UNIPRO_CB_OFFSET(0x00EA)
|
||||
#define RTOBSERVESELECT UNIPRO_CB_OFFSET(0x00F0)
|
||||
#define CBDIVFACTOR UNIPRO_CB_OFFSET(0x00F1)
|
||||
#define CBDCOCTRL5 UNIPRO_CB_OFFSET(0x00F3)
|
||||
#define CBPRGPLL2 UNIPRO_CB_OFFSET(0x00F8)
|
||||
#define CBPRGTUNING UNIPRO_CB_OFFSET(0x00FB)
|
||||
|
||||
#define UNIPRO_CB_OFFSET(x) (0x8000 | x)
|
||||
|
||||
/*
|
||||
* PHY Adpater attributes
|
||||
*/
|
||||
#define PA_ACTIVETXDATALANES 0x1560
|
||||
#define PA_ACTIVERXDATALANES 0x1580
|
||||
#define PA_TXTRAILINGCLOCKS 0x1564
|
||||
#define PA_PHY_TYPE 0x1500
|
||||
#define PA_AVAILTXDATALANES 0x1520
|
||||
#define PA_AVAILRXDATALANES 0x1540
|
||||
#define PA_MINRXTRAILINGCLOCKS 0x1543
|
||||
#define PA_TXPWRSTATUS 0x1567
|
||||
#define PA_RXPWRSTATUS 0x1582
|
||||
#define PA_TXFORCECLOCK 0x1562
|
||||
#define PA_TXPWRMODE 0x1563
|
||||
#define PA_LEGACYDPHYESCDL 0x1570
|
||||
#define PA_MAXTXSPEEDFAST 0x1521
|
||||
#define PA_MAXTXSPEEDSLOW 0x1522
|
||||
#define PA_MAXRXSPEEDFAST 0x1541
|
||||
#define PA_MAXRXSPEEDSLOW 0x1542
|
||||
#define PA_TXLINKSTARTUPHS 0x1544
|
||||
#define PA_LOCAL_TX_LCC_ENABLE 0x155E
|
||||
#define PA_TXSPEEDFAST 0x1565
|
||||
#define PA_TXSPEEDSLOW 0x1566
|
||||
#define PA_REMOTEVERINFO 0x15A0
|
||||
#define PA_TXGEAR 0x1568
|
||||
#define PA_TXTERMINATION 0x1569
|
||||
#define PA_HSSERIES 0x156A
|
||||
#define PA_PWRMODE 0x1571
|
||||
#define PA_RXGEAR 0x1583
|
||||
#define PA_RXTERMINATION 0x1584
|
||||
#define PA_MAXRXPWMGEAR 0x1586
|
||||
#define PA_MAXRXHSGEAR 0x1587
|
||||
#define PA_RXHSUNTERMCAP 0x15A5
|
||||
#define PA_RXLSTERMCAP 0x15A6
|
||||
#define PA_GRANULARITY 0x15AA
|
||||
#define PA_PACPREQTIMEOUT 0x1590
|
||||
#define PA_PACPREQEOBTIMEOUT 0x1591
|
||||
#define PA_HIBERN8TIME 0x15A7
|
||||
#define PA_LOCALVERINFO 0x15A9
|
||||
#define PA_GRANULARITY 0x15AA
|
||||
#define PA_TACTIVATE 0x15A8
|
||||
#define PA_PACPFRAMECOUNT 0x15C0
|
||||
#define PA_PACPERRORCOUNT 0x15C1
|
||||
#define PA_PHYTESTCONTROL 0x15C2
|
||||
#define PA_PWRMODEUSERDATA0 0x15B0
|
||||
#define PA_PWRMODEUSERDATA1 0x15B1
|
||||
#define PA_PWRMODEUSERDATA2 0x15B2
|
||||
#define PA_PWRMODEUSERDATA3 0x15B3
|
||||
#define PA_PWRMODEUSERDATA4 0x15B4
|
||||
#define PA_PWRMODEUSERDATA5 0x15B5
|
||||
#define PA_PWRMODEUSERDATA6 0x15B6
|
||||
#define PA_PWRMODEUSERDATA7 0x15B7
|
||||
#define PA_PWRMODEUSERDATA8 0x15B8
|
||||
#define PA_PWRMODEUSERDATA9 0x15B9
|
||||
#define PA_PWRMODEUSERDATA10 0x15BA
|
||||
#define PA_PWRMODEUSERDATA11 0x15BB
|
||||
#define PA_CONNECTEDTXDATALANES 0x1561
|
||||
#define PA_CONNECTEDRXDATALANES 0x1581
|
||||
#define PA_LOGICALLANEMAP 0x15A1
|
||||
#define PA_SLEEPNOCONFIGTIME 0x15A2
|
||||
#define PA_STALLNOCONFIGTIME 0x15A3
|
||||
#define PA_SAVECONFIGTIME 0x15A4
|
||||
#define PA_TXHSADAPTTYPE 0x15D4
|
||||
|
||||
/* Adpat type for PA_TXHSADAPTTYPE attribute */
|
||||
#define PA_REFRESH_ADAPT 0x00
|
||||
#define PA_INITIAL_ADAPT 0x01
|
||||
#define PA_NO_ADAPT 0x03
|
||||
|
||||
#define PA_TACTIVATE_TIME_UNIT_US 10
|
||||
#define PA_HIBERN8_TIME_UNIT_US 100
|
||||
|
||||
/*Other attributes*/
|
||||
#define VS_MPHYCFGUPDT 0xD085
|
||||
#define VS_DEBUGOMC 0xD09E
|
||||
#define VS_POWERSTATE 0xD083
|
||||
|
||||
#define PA_GRANULARITY_MIN_VAL 1
|
||||
#define PA_GRANULARITY_MAX_VAL 6
|
||||
|
||||
/* PHY Adapter Protocol Constants */
|
||||
#define PA_MAXDATALANES 4
|
||||
|
||||
#define DL_FC0ProtectionTimeOutVal_Default 8191
|
||||
#define DL_TC0ReplayTimeOutVal_Default 65535
|
||||
#define DL_AFC0ReqTimeOutVal_Default 32767
|
||||
#define DL_FC1ProtectionTimeOutVal_Default 8191
|
||||
#define DL_TC1ReplayTimeOutVal_Default 65535
|
||||
#define DL_AFC1ReqTimeOutVal_Default 32767
|
||||
|
||||
#define DME_LocalFC0ProtectionTimeOutVal 0xD041
|
||||
#define DME_LocalTC0ReplayTimeOutVal 0xD042
|
||||
#define DME_LocalAFC0ReqTimeOutVal 0xD043
|
||||
|
||||
/* PA power modes */
|
||||
enum {
|
||||
FAST_MODE = 1,
|
||||
SLOW_MODE = 2,
|
||||
FASTAUTO_MODE = 4,
|
||||
SLOWAUTO_MODE = 5,
|
||||
UNCHANGED = 7,
|
||||
};
|
||||
|
||||
#define PWRMODE_MASK 0xF
|
||||
#define PWRMODE_RX_OFFSET 4
|
||||
|
||||
/* PA TX/RX Frequency Series */
|
||||
enum {
|
||||
PA_HS_MODE_A = 1,
|
||||
PA_HS_MODE_B = 2,
|
||||
};
|
||||
|
||||
enum ufs_pwm_gear_tag {
|
||||
UFS_PWM_DONT_CHANGE, /* Don't change Gear */
|
||||
UFS_PWM_G1, /* PWM Gear 1 (default for reset) */
|
||||
UFS_PWM_G2, /* PWM Gear 2 */
|
||||
UFS_PWM_G3, /* PWM Gear 3 */
|
||||
UFS_PWM_G4, /* PWM Gear 4 */
|
||||
UFS_PWM_G5, /* PWM Gear 5 */
|
||||
UFS_PWM_G6, /* PWM Gear 6 */
|
||||
UFS_PWM_G7, /* PWM Gear 7 */
|
||||
};
|
||||
|
||||
enum ufs_hs_gear_tag {
|
||||
UFS_HS_DONT_CHANGE, /* Don't change Gear */
|
||||
UFS_HS_G1, /* HS Gear 1 (default for reset) */
|
||||
UFS_HS_G2, /* HS Gear 2 */
|
||||
UFS_HS_G3, /* HS Gear 3 */
|
||||
UFS_HS_G4, /* HS Gear 4 */
|
||||
};
|
||||
|
||||
enum ufs_unipro_ver {
|
||||
UFS_UNIPRO_VER_RESERVED = 0,
|
||||
UFS_UNIPRO_VER_1_40 = 1, /* UniPro version 1.40 */
|
||||
UFS_UNIPRO_VER_1_41 = 2, /* UniPro version 1.41 */
|
||||
UFS_UNIPRO_VER_1_6 = 3, /* UniPro version 1.6 */
|
||||
UFS_UNIPRO_VER_1_61 = 4, /* UniPro version 1.61 */
|
||||
UFS_UNIPRO_VER_1_8 = 5, /* UniPro version 1.8 */
|
||||
UFS_UNIPRO_VER_MAX = 6, /* UniPro unsupported version */
|
||||
/* UniPro version field mask in PA_LOCALVERINFO */
|
||||
UFS_UNIPRO_VER_MASK = 0xF,
|
||||
};
|
||||
|
||||
/*
|
||||
* Data Link Layer Attributes
|
||||
*/
|
||||
#define DL_TC0TXFCTHRESHOLD 0x2040
|
||||
#define DL_FC0PROTTIMEOUTVAL 0x2041
|
||||
#define DL_TC0REPLAYTIMEOUTVAL 0x2042
|
||||
#define DL_AFC0REQTIMEOUTVAL 0x2043
|
||||
#define DL_AFC0CREDITTHRESHOLD 0x2044
|
||||
#define DL_TC0OUTACKTHRESHOLD 0x2045
|
||||
#define DL_TC1TXFCTHRESHOLD 0x2060
|
||||
#define DL_FC1PROTTIMEOUTVAL 0x2061
|
||||
#define DL_TC1REPLAYTIMEOUTVAL 0x2062
|
||||
#define DL_AFC1REQTIMEOUTVAL 0x2063
|
||||
#define DL_AFC1CREDITTHRESHOLD 0x2064
|
||||
#define DL_TC1OUTACKTHRESHOLD 0x2065
|
||||
#define DL_TXPREEMPTIONCAP 0x2000
|
||||
#define DL_TC0TXMAXSDUSIZE 0x2001
|
||||
#define DL_TC0RXINITCREDITVAL 0x2002
|
||||
#define DL_TC0TXBUFFERSIZE 0x2005
|
||||
#define DL_PEERTC0PRESENT 0x2046
|
||||
#define DL_PEERTC0RXINITCREVAL 0x2047
|
||||
#define DL_TC1TXMAXSDUSIZE 0x2003
|
||||
#define DL_TC1RXINITCREDITVAL 0x2004
|
||||
#define DL_TC1TXBUFFERSIZE 0x2006
|
||||
#define DL_PEERTC1PRESENT 0x2066
|
||||
#define DL_PEERTC1RXINITCREVAL 0x2067
|
||||
|
||||
/*
|
||||
* Network Layer Attributes
|
||||
*/
|
||||
#define N_DEVICEID 0x3000
|
||||
#define N_DEVICEID_VALID 0x3001
|
||||
#define N_TC0TXMAXSDUSIZE 0x3020
|
||||
#define N_TC1TXMAXSDUSIZE 0x3021
|
||||
|
||||
/*
|
||||
* Transport Layer Attributes
|
||||
*/
|
||||
#define T_NUMCPORTS 0x4000
|
||||
#define T_NUMTESTFEATURES 0x4001
|
||||
#define T_CONNECTIONSTATE 0x4020
|
||||
#define T_PEERDEVICEID 0x4021
|
||||
#define T_PEERCPORTID 0x4022
|
||||
#define T_TRAFFICCLASS 0x4023
|
||||
#define T_PROTOCOLID 0x4024
|
||||
#define T_CPORTFLAGS 0x4025
|
||||
#define T_TXTOKENVALUE 0x4026
|
||||
#define T_RXTOKENVALUE 0x4027
|
||||
#define T_LOCALBUFFERSPACE 0x4028
|
||||
#define T_PEERBUFFERSPACE 0x4029
|
||||
#define T_CREDITSTOSEND 0x402A
|
||||
#define T_CPORTMODE 0x402B
|
||||
#define T_TC0TXMAXSDUSIZE 0x4060
|
||||
#define T_TC1TXMAXSDUSIZE 0x4061
|
||||
|
||||
#ifdef FALSE
|
||||
#undef FALSE
|
||||
#endif
|
||||
|
||||
#ifdef TRUE
|
||||
#undef TRUE
|
||||
#endif
|
||||
|
||||
/* Boolean attribute values */
|
||||
enum {
|
||||
FALSE = 0,
|
||||
TRUE,
|
||||
};
|
||||
|
||||
/* CPort setting */
|
||||
#define E2EFC_ON (1 << 0)
|
||||
#define E2EFC_OFF (0 << 0)
|
||||
#define CSD_N_ON (0 << 1)
|
||||
#define CSD_N_OFF (1 << 1)
|
||||
#define CSV_N_ON (0 << 2)
|
||||
#define CSV_N_OFF (1 << 2)
|
||||
#define CPORT_DEF_FLAGS (CSV_N_OFF | CSD_N_OFF | E2EFC_OFF)
|
||||
|
||||
/* CPort connection state */
|
||||
enum {
|
||||
CPORT_IDLE = 0,
|
||||
CPORT_CONNECTED,
|
||||
};
|
||||
|
||||
#endif /* _UNIPRO_H_ */
|
||||
Reference in New Issue
Block a user