firmware: zynqmp: Add helper API to self discovery the device

Add API to get SoC version and family info.

Signed-off-by: Harsh Jain <h.jain@amd.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
Harsh Jain 2025-12-20 21:28:54 +05:30 committed by Herbert Xu
parent c7a768f57d
commit 465d783126
2 changed files with 50 additions and 0 deletions

View File

@ -57,3 +57,34 @@ int zynqmp_pm_sha_hash(const u64 address, const u32 size, const u32 flags)
return zynqmp_pm_invoke_fn(PM_SECURE_SHA, NULL, 4, upper_addr, lower_addr, size, flags);
}
EXPORT_SYMBOL_GPL(zynqmp_pm_sha_hash);
/**
* xlnx_get_crypto_dev_data() - Get crypto dev data of platform
* @feature_map: List of available feature map of all platform
*
* Return: Returns crypto dev data, either address crypto dev or ERR PTR
*/
void *xlnx_get_crypto_dev_data(struct xlnx_feature *feature_map)
{
struct xlnx_feature *feature;
u32 pm_family_code;
int ret;
/* Get the Family code and sub family code of platform */
ret = zynqmp_pm_get_family_info(&pm_family_code);
if (ret < 0)
return ERR_PTR(ret);
feature = feature_map;
for (; feature->family; feature++) {
if (feature->family == pm_family_code) {
ret = zynqmp_pm_feature(feature->feature_id);
if (ret < 0)
return ERR_PTR(ret);
return feature->data;
}
}
return ERR_PTR(-ENODEV);
}
EXPORT_SYMBOL_GPL(xlnx_get_crypto_dev_data);

View File

@ -9,9 +9,23 @@
#ifndef __FIRMWARE_XLNX_ZYNQMP_CRYPTO_H__
#define __FIRMWARE_XLNX_ZYNQMP_CRYPTO_H__
/**
* struct xlnx_feature - Feature data
* @family: Family code of platform
* @subfamily: Subfamily code of platform
* @feature_id: Feature id of module
* @data: Collection of all supported platform data
*/
struct xlnx_feature {
u32 family;
u32 feature_id;
void *data;
};
#if IS_REACHABLE(CONFIG_ZYNQMP_FIRMWARE)
int zynqmp_pm_aes_engine(const u64 address, u32 *out);
int zynqmp_pm_sha_hash(const u64 address, const u32 size, const u32 flags);
void *xlnx_get_crypto_dev_data(struct xlnx_feature *feature_map);
#else
static inline int zynqmp_pm_aes_engine(const u64 address, u32 *out)
{
@ -23,6 +37,11 @@ static inline int zynqmp_pm_sha_hash(const u64 address, const u32 size,
{
return -ENODEV;
}
static inline void *xlnx_get_crypto_dev_data(struct xlnx_feature *feature_map)
{
return ERR_PTR(-ENODEV);
}
#endif
#endif /* __FIRMWARE_XLNX_ZYNQMP_CRYPTO_H__ */