soc: qcom: Add oem variant support for socinfo v17

Add APIs and support for additional field "oem variant"
introduced in socinfo v17.

Change-Id: I4c6e23c4c4f53fd630f9b0540ca89437cc184668
Signed-off-by: Naman Jain <quic_namajain@quicinc.com>
This commit is contained in:
Naman Jain 2022-09-21 10:17:49 +05:30
parent 3684d8e225
commit 18f6cc4024
2 changed files with 104 additions and 0 deletions

View File

@ -227,6 +227,16 @@ static const char * const hw_platform_ifeature_code[] = {
[SOCINFO_FC_YF - SOCINFO_FC_Y0] = "YF",
};
enum {
PLATFORM_OEM_VARIANT_QC = 0x0,
PLATFORM_OEM_VARIANT_OEM,
};
static const char * const hw_platform_oem_variant[] = {
[PLATFORM_OEM_VARIANT_QC] = "QC",
[PLATFORM_OEM_VARIANT_OEM] = "OEM",
};
/* Socinfo SMEM item structure */
struct socinfo {
__le32 fmt;
@ -278,6 +288,8 @@ struct socinfo {
__le32 pcode;
__le32 npartnamemap_offset;
__le32 nnum_partname_mapping;
/* Version 17 */
__le32 hw_plat_oem_variant;
} *socinfo;
#define PART_NAME_MAX 32
@ -315,6 +327,7 @@ struct socinfo_params {
u32 nmodem_supported;
u32 gpu_chip_id;
u32 gpu_vulkan_id;
u32 hw_plat_oem_variant;
};
struct smem_image_version {
@ -534,6 +547,13 @@ static uint32_t socinfo_get_pcode_id(void)
return pcode;
}
/* Version 17 */
static uint32_t socinfo_get_platform_oem_variant(void)
{
return (socinfo && socinfo_format >= SOCINFO_VERSION(0, 17)) ?
le32_to_cpu(socinfo->hw_plat_oem_variant) : 0;
}
/* Version 2 */
static ssize_t
msm_get_raw_id(struct device *dev,
@ -800,6 +820,34 @@ msm_get_feature_code(struct device *dev,
}
ATTR_DEFINE(feature_code);
/* Version 17 */
static ssize_t
msm_get_platform_oem_variant_id(struct device *dev,
struct device_attribute *attr,
char *buf)
{
uint32_t hw_oem_variant;
hw_oem_variant = socinfo_get_platform_oem_variant();
return scnprintf(buf, PAGE_SIZE, "%u\n", hw_oem_variant);
}
ATTR_DEFINE(platform_oem_variant_id);
static ssize_t
msm_get_platform_oem_variant(struct device *dev,
struct device_attribute *attr,
char *buf)
{
uint32_t hw_oem_variant;
hw_oem_variant = socinfo_get_platform_oem_variant();
if (hw_oem_variant != PLATFORM_OEM_VARIANT_QC)
hw_oem_variant = PLATFORM_OEM_VARIANT_OEM;
return scnprintf(buf, PAGE_SIZE, "%-.32s\n", hw_platform_oem_variant[hw_oem_variant]);
}
ATTR_DEFINE(platform_oem_variant);
struct qcom_socinfo {
struct soc_device *soc_dev;
struct soc_device_attribute attr;
@ -1195,6 +1243,10 @@ static void socinfo_populate_sysfs(struct qcom_socinfo *qcom_socinfo)
int i = 0;
switch (socinfo_format) {
case SOCINFO_VERSION(0, 17):
msm_custom_socinfo_attrs[i++] = &dev_attr_platform_oem_variant_id.attr;
msm_custom_socinfo_attrs[i++] = &dev_attr_platform_oem_variant.attr;
fallthrough;
case SOCINFO_VERSION(0, 16):
msm_custom_socinfo_attrs[i++] = &dev_attr_sku.attr;
msm_custom_socinfo_attrs[i++] = &dev_attr_feature_code.attr;
@ -1512,6 +1564,34 @@ static void socinfo_print(void)
sku ? sku : "Unknown");
break;
case SOCINFO_VERSION(0, 17):
pr_info("v%u.%u, id=%u, ver=%u.%u, raw_id=%u, raw_ver=%u, hw_plat=%u, hw_plat_ver=%u\n accessory_chip=%u, hw_plat_subtype=%u, pmic_model=%u, pmic_die_revision=%u foundry_id=%u serial_number=%u num_pmics=%u chip_family=0x%x raw_device_family=0x%x raw_device_number=0x%x nproduct_id=0x%x num_clusters=0x%x ncluster_array_offset=0x%x num_defective_parts=0x%x ndefective_parts_array_offset=0x%x nmodem_supported=0x%x feature_code=0x%x pcode=0x%x sku=%s hw_plat_oem_variant=%u\n",
f_maj, f_min, socinfo->id, v_maj, v_min,
socinfo->raw_id, socinfo->raw_ver,
socinfo->hw_plat,
socinfo->plat_ver,
socinfo->accessory_chip,
socinfo->hw_plat_subtype,
socinfo->pmic_model,
socinfo->pmic_die_rev,
socinfo->foundry_id,
socinfo->serial_num,
socinfo->num_pmics,
socinfo->chip_family,
socinfo->raw_device_family,
socinfo->raw_device_num,
socinfo->nproduct_id,
socinfo->num_clusters,
socinfo->ncluster_array_offset,
socinfo->num_defective_parts,
socinfo->ndefective_parts_array_offset,
socinfo->nmodem_supported,
socinfo->feature_code,
socinfo->pcode,
sku ? sku : "Unknown",
socinfo->hw_plat_oem_variant);
break;
default:
pr_err("Unknown format found: v%u.%u\n", f_maj, f_min);
break;
@ -1617,6 +1697,17 @@ uint32_t socinfo_get_partinfo_vulkan_id(unsigned int part_id)
}
EXPORT_SYMBOL(socinfo_get_partinfo_vulkan_id);
int socinfo_get_oem_variant_id(void)
{
if (socinfo_format < SOCINFO_VERSION(0, 17)) {
pr_warn("socinfo: oem_variant is not supported by bootloaders\n");
return -EINVAL;
}
return socinfo_get_platform_oem_variant();
}
EXPORT_SYMBOL(socinfo_get_oem_variant_id);
void socinfo_enumerate_partinfo_details(void)
{
unsigned int partinfo_array_offset;
@ -1795,6 +1886,14 @@ static void socinfo_debugfs_init(struct qcom_socinfo *qcom_socinfo,
&qcom_socinfo->info.fmt);
switch (qcom_socinfo->info.fmt) {
case SOCINFO_VERSION(0, 17):
qcom_socinfo->info.hw_plat_oem_variant =
__le32_to_cpu(info->hw_plat_oem_variant);
debugfs_create_u32("hardware_platform_oem_variant", 0444,
qcom_socinfo->dbg_root,
&qcom_socinfo->info.hw_plat_oem_variant);
fallthrough;
case SOCINFO_VERSION(0, 16):
qcom_socinfo->info.gpu_chip_id =
__le32_to_cpu(socinfo_get_partinfo_chip_id(SOCINFO_PART_GPU));

View File

@ -83,6 +83,7 @@ int socinfo_get_pcode(void);
char *socinfo_get_partinfo_part_name(unsigned int part_id);
uint32_t socinfo_get_partinfo_chip_id(unsigned int part_id);
uint32_t socinfo_get_partinfo_vulkan_id(unsigned int part_id);
int socinfo_get_oem_variant_id(void);
#else
static inline uint32_t socinfo_get_id(void)
{
@ -118,6 +119,10 @@ uint32_t socinfo_get_partinfo_vulkan_id(unsigned int part_id)
{
return 0;
}
int socinfo_get_oem_variant_id(void)
{
return -EINVAL;
}
#endif /* CONFIG_QCOM_SOCINFO */
#endif /* __SOC_QCOM_SOCINFO_H__ */