include/linux/soc/qcom/ubwc.h

Source file repositories/reference/linux-study-clean/include/linux/soc/qcom/ubwc.h

File Facts

System
Linux kernel
Corpus path
include/linux/soc/qcom/ubwc.h
Extension
.h
Size
3186 bytes
Lines
125
Domain
Core OS
Bucket
Core Kernel Interface
Inferred role
Core OS: implementation source
Status
source implementation candidate

Why This File Exists

Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.

Dependency Surface

Detected Declarations

Annotated Snippet

struct qcom_ubwc_cfg_data {
	u32 ubwc_enc_version;
	/* Can be read from MDSS_BASE + 0x58 */
	u32 ubwc_dec_version;

	/**
	 * @ubwc_swizzle: Whether to enable level 1, 2 & 3 bank swizzling.
	 *
	 * UBWC 1.0 always enables all three levels.
	 * UBWC 2.0 removes level 1 bank swizzling, leaving levels 2 & 3.
	 * UBWC 4.0 adds the optional ability to disable levels 2 & 3.
	 */
	u32 ubwc_swizzle;
#define UBWC_SWIZZLE_ENABLE_LVL1	BIT(0)
#define UBWC_SWIZZLE_ENABLE_LVL2	BIT(1)
#define UBWC_SWIZZLE_ENABLE_LVL3	BIT(2)

	/**
	 * @highest_bank_bit: Highest Bank Bit
	 *
	 * The Highest Bank Bit value represents the bit of the highest
	 * DDR bank.  This should ideally use DRAM type detection.
	 */
	int highest_bank_bit;
	bool ubwc_bank_spread;

	/**
	 * @macrotile_mode: Macrotile Mode
	 *
	 * Whether to use 4-channel macrotiling mode or the newer
	 * 8-channel macrotiling mode introduced in UBWC 3.1. 0 is
	 * 4-channel and 1 is 8-channel.
	 */
	bool macrotile_mode;
};

#define UBWC_1_0 0x10000000
#define UBWC_2_0 0x20000000
#define UBWC_3_0 0x30000000
#define UBWC_3_1 0x30010000 /* UBWC 3.0 + Macrotile mode */
#define UBWC_4_0 0x40000000
#define UBWC_4_3 0x40030000
#define UBWC_5_0 0x50000000
#define UBWC_6_0 0x60000000

#if IS_ENABLED(CONFIG_QCOM_UBWC_CONFIG)
const struct qcom_ubwc_cfg_data *qcom_ubwc_config_get_data(void);
#else
static inline const struct qcom_ubwc_cfg_data *qcom_ubwc_config_get_data(void)
{
	return ERR_PTR(-EOPNOTSUPP);
}
#endif

static inline bool qcom_ubwc_get_ubwc_mode(const struct qcom_ubwc_cfg_data *cfg)
{
	bool ret = cfg->ubwc_enc_version == UBWC_1_0;

	if (ret && !(cfg->ubwc_swizzle & UBWC_SWIZZLE_ENABLE_LVL1))
		pr_err("UBWC config discrepancy - level 1 swizzling disabled on UBWC 1.0\n");

	return ret;
}

/*
 * This is the best guess, based on the MDSS driver, which worked so far.
 */
static inline bool qcom_ubwc_min_acc_length_64b(const struct qcom_ubwc_cfg_data *cfg)
{
	return cfg->ubwc_enc_version == UBWC_1_0 &&
		(cfg->ubwc_dec_version == UBWC_2_0 ||
		 cfg->ubwc_dec_version == UBWC_3_0);
}

static inline bool qcom_ubwc_macrotile_mode(const struct qcom_ubwc_cfg_data *cfg)
{
	return cfg->macrotile_mode;
}

static inline bool qcom_ubwc_bank_spread(const struct qcom_ubwc_cfg_data *cfg)
{
	return cfg->ubwc_bank_spread;
}

static inline u32 qcom_ubwc_swizzle(const struct qcom_ubwc_cfg_data *cfg)
{
	return cfg->ubwc_swizzle;
}

static inline u32 qcom_ubwc_version_tag(const struct qcom_ubwc_cfg_data *cfg)

Annotation

Implementation Notes