drivers/ufs/host/cdns-pltfrm.c
Source file repositories/reference/linux-study-clean/drivers/ufs/host/cdns-pltfrm.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/ufs/host/cdns-pltfrm.c- Extension
.c- Size
- 9233 bytes
- Lines
- 335
- Domain
- Driver Families
- Bucket
- drivers/ufs
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/clk.hlinux/kernel.hlinux/module.hlinux/platform_device.hlinux/of.hlinux/time.hufshcd-pltfrm.h
Detected Declarations
struct cdns_ufs_hostfunction cdns_ufs_get_l4_attrfunction cdns_ufs_set_l4_attrfunction cdns_ufs_set_hclkdivfunction list_for_each_entryfunction cdns_ufs_hce_enable_notifyfunction cdns_ufs_hibern8_notifyfunction cdns_ufs_link_startup_notifyfunction cdns_ufs_initfunction cdns_ufs_m31_16nm_phy_initializationfunction cdns_ufs_pltfrm_probefunction cdns_ufs_pltfrm_remove
Annotated Snippet
struct cdns_ufs_host {
/**
* cdns_ufs_dme_attr_val - for storing L4 attributes
*/
u32 cdns_ufs_dme_attr_val[CDNS_UFS_MAX_L4_ATTRS];
};
/**
* cdns_ufs_get_l4_attr - get L4 attributes on local side
* @hba: per adapter instance
*
*/
static void cdns_ufs_get_l4_attr(struct ufs_hba *hba)
{
struct cdns_ufs_host *host = ufshcd_get_variant(hba);
ufshcd_dme_get(hba, UIC_ARG_MIB(T_PEERDEVICEID),
&host->cdns_ufs_dme_attr_val[0]);
ufshcd_dme_get(hba, UIC_ARG_MIB(T_PEERCPORTID),
&host->cdns_ufs_dme_attr_val[1]);
ufshcd_dme_get(hba, UIC_ARG_MIB(T_TRAFFICCLASS),
&host->cdns_ufs_dme_attr_val[2]);
ufshcd_dme_get(hba, UIC_ARG_MIB(T_PROTOCOLID),
&host->cdns_ufs_dme_attr_val[3]);
ufshcd_dme_get(hba, UIC_ARG_MIB(T_CPORTFLAGS),
&host->cdns_ufs_dme_attr_val[4]);
ufshcd_dme_get(hba, UIC_ARG_MIB(T_TXTOKENVALUE),
&host->cdns_ufs_dme_attr_val[5]);
ufshcd_dme_get(hba, UIC_ARG_MIB(T_RXTOKENVALUE),
&host->cdns_ufs_dme_attr_val[6]);
ufshcd_dme_get(hba, UIC_ARG_MIB(T_LOCALBUFFERSPACE),
&host->cdns_ufs_dme_attr_val[7]);
ufshcd_dme_get(hba, UIC_ARG_MIB(T_PEERBUFFERSPACE),
&host->cdns_ufs_dme_attr_val[8]);
ufshcd_dme_get(hba, UIC_ARG_MIB(T_CREDITSTOSEND),
&host->cdns_ufs_dme_attr_val[9]);
ufshcd_dme_get(hba, UIC_ARG_MIB(T_CPORTMODE),
&host->cdns_ufs_dme_attr_val[10]);
ufshcd_dme_get(hba, UIC_ARG_MIB(T_CONNECTIONSTATE),
&host->cdns_ufs_dme_attr_val[11]);
}
/**
* cdns_ufs_set_l4_attr - set L4 attributes on local side
* @hba: per adapter instance
*
*/
static void cdns_ufs_set_l4_attr(struct ufs_hba *hba)
{
struct cdns_ufs_host *host = ufshcd_get_variant(hba);
ufshcd_dme_set(hba, UIC_ARG_MIB(T_CONNECTIONSTATE), 0);
ufshcd_dme_set(hba, UIC_ARG_MIB(T_PEERDEVICEID),
host->cdns_ufs_dme_attr_val[0]);
ufshcd_dme_set(hba, UIC_ARG_MIB(T_PEERCPORTID),
host->cdns_ufs_dme_attr_val[1]);
ufshcd_dme_set(hba, UIC_ARG_MIB(T_TRAFFICCLASS),
host->cdns_ufs_dme_attr_val[2]);
ufshcd_dme_set(hba, UIC_ARG_MIB(T_PROTOCOLID),
host->cdns_ufs_dme_attr_val[3]);
ufshcd_dme_set(hba, UIC_ARG_MIB(T_CPORTFLAGS),
host->cdns_ufs_dme_attr_val[4]);
ufshcd_dme_set(hba, UIC_ARG_MIB(T_TXTOKENVALUE),
host->cdns_ufs_dme_attr_val[5]);
ufshcd_dme_set(hba, UIC_ARG_MIB(T_RXTOKENVALUE),
host->cdns_ufs_dme_attr_val[6]);
ufshcd_dme_set(hba, UIC_ARG_MIB(T_LOCALBUFFERSPACE),
host->cdns_ufs_dme_attr_val[7]);
ufshcd_dme_set(hba, UIC_ARG_MIB(T_PEERBUFFERSPACE),
host->cdns_ufs_dme_attr_val[8]);
ufshcd_dme_set(hba, UIC_ARG_MIB(T_CREDITSTOSEND),
host->cdns_ufs_dme_attr_val[9]);
ufshcd_dme_set(hba, UIC_ARG_MIB(T_CPORTMODE),
host->cdns_ufs_dme_attr_val[10]);
ufshcd_dme_set(hba, UIC_ARG_MIB(T_CONNECTIONSTATE),
host->cdns_ufs_dme_attr_val[11]);
}
/**
* cdns_ufs_set_hclkdiv() - set HCLKDIV register value based on the core_clk.
* @hba: host controller instance
*
* Return: zero for success and non-zero for failure.
*/
static int cdns_ufs_set_hclkdiv(struct ufs_hba *hba)
{
struct ufs_clk_info *clki;
struct list_head *head = &hba->clk_list_head;
unsigned long core_clk_rate = 0;
u32 core_clk_div = 0;
Annotation
- Immediate include surface: `linux/clk.h`, `linux/kernel.h`, `linux/module.h`, `linux/platform_device.h`, `linux/of.h`, `linux/time.h`, `ufshcd-pltfrm.h`.
- Detected declarations: `struct cdns_ufs_host`, `function cdns_ufs_get_l4_attr`, `function cdns_ufs_set_l4_attr`, `function cdns_ufs_set_hclkdiv`, `function list_for_each_entry`, `function cdns_ufs_hce_enable_notify`, `function cdns_ufs_hibern8_notify`, `function cdns_ufs_link_startup_notify`, `function cdns_ufs_init`, `function cdns_ufs_m31_16nm_phy_initialization`.
- Atlas domain: Driver Families / drivers/ufs.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.