diff --git a/drivers/soc/qcom/socinfo.c b/drivers/soc/qcom/socinfo.c
index 251c0fd94962..ff92064c2246 100644
--- a/drivers/soc/qcom/socinfo.c
+++ b/drivers/soc/qcom/socinfo.c
@@ -41,6 +41,52 @@
  */
 #define SMEM_HW_SW_BUILD_ID            137
 
+enum {
+	HW_PLATFORM_UNKNOWN = 0,
+	HW_PLATFORM_SURF = 1,
+	HW_PLATFORM_FFA = 2,
+	HW_PLATFORM_FLUID = 3,
+	HW_PLATFORM_SVLTE_FFA = 4,
+	HW_PLATFORM_SVLTE_SURF = 5,
+	HW_PLATFORM_MTP_MDM = 7,
+	HW_PLATFORM_MTP = 8,
+	HW_PLATFORM_LIQUID = 9,
+	HW_PLATFORM_DRAGON = 10,
+	HW_PLATFORM_QRD = 11,
+	HW_PLATFORM_HRD = 13,
+	HW_PLATFORM_DTV = 14,
+	HW_PLATFORM_RCM = 21,
+	HW_PLATFORM_STP = 23,
+	HW_PLATFORM_SBC = 24,
+	HW_PLATFORM_HDK = 31,
+	HW_PLATFORM_ATP = 33,
+	HW_PLATFORM_IDP = 34,
+	HW_PLATFORM_INVALID
+};
+
+static const char * const hw_platform[] = {
+	[HW_PLATFORM_UNKNOWN] = "Unknown",
+	[HW_PLATFORM_SURF] = "Surf",
+	[HW_PLATFORM_FFA] = "FFA",
+	[HW_PLATFORM_FLUID] = "Fluid",
+	[HW_PLATFORM_SVLTE_FFA] = "SVLTE_FFA",
+	[HW_PLATFORM_SVLTE_SURF] = "SLVTE_SURF",
+	[HW_PLATFORM_MTP_MDM] = "MDM_MTP_NO_DISPLAY",
+	[HW_PLATFORM_MTP] = "MTP",
+	[HW_PLATFORM_RCM] = "RCM",
+	[HW_PLATFORM_LIQUID] = "Liquid",
+	[HW_PLATFORM_DRAGON] = "Dragon",
+	[HW_PLATFORM_QRD] = "QRD",
+	[HW_PLATFORM_HRD] = "HRD",
+	[HW_PLATFORM_DTV] = "DTV",
+	[HW_PLATFORM_STP] = "STP",
+	[HW_PLATFORM_SBC] = "SBC",
+	[HW_PLATFORM_HDK] = "HDK",
+	[HW_PLATFORM_ATP] = "ATP",
+	[HW_PLATFORM_IDP] = "IDP",
+	[HW_PLATFORM_INVALID] = "Invalid",
+};
+
 #ifdef CONFIG_DEBUG_FS
 #define SMEM_IMAGE_VERSION_BLOCKS_COUNT        32
 #define SMEM_IMAGE_VERSION_SIZE                4096
@@ -368,6 +414,140 @@ static const struct soc_id soc_id[] = {
 	{ qcom_board_id(QRU1062) },
 };
 
+/* sysfs attributes */
+#define ATTR_DEFINE(param) \
+	static DEVICE_ATTR(param, 0644, qcom_get_##param, NULL)
+
+/* Version 2 */
+static ssize_t
+qcom_get_raw_id(struct device *dev,
+		struct device_attribute *attr,
+		char *buf)
+{
+	return scnprintf(buf, PAGE_SIZE, "%u\n",
+			 le32_to_cpu(soc_info->raw_id));
+}
+ATTR_DEFINE(raw_id);
+
+static ssize_t
+qcom_get_raw_version(struct device *dev,
+		struct device_attribute *attr,
+		char *buf)
+{
+	return scnprintf(buf, PAGE_SIZE, "%u\n",
+			 le32_to_cpu(soc_info->raw_ver));
+}
+ATTR_DEFINE(raw_version);
+
+/* Version 3 */
+static ssize_t
+qcom_get_hw_platform(struct device *dev,
+		struct device_attribute *attr,
+		char *buf)
+{
+	uint32_t hw_plat = le32_to_cpu(soc_info->hw_plat);
+
+	hw_plat = (hw_plat >= HW_PLATFORM_INVALID) ? HW_PLATFORM_INVALID : hw_plat;
+	return scnprintf(buf, PAGE_SIZE, "%-.32s\n",
+			hw_platform[hw_plat]);
+}
+ATTR_DEFINE(hw_platform);
+
+/* Version 4 */
+static ssize_t
+qcom_get_platform_version(struct device *dev,
+		struct device_attribute *attr,
+		char *buf)
+{
+	return scnprintf(buf, PAGE_SIZE, "%u\n",
+			 le32_to_cpu(soc_info->plat_ver));
+}
+ATTR_DEFINE(platform_version);
+
+/* Version 5 */
+static ssize_t
+qcom_get_accessory_chip(struct device *dev,
+		struct device_attribute *attr,
+		char *buf)
+{
+	return scnprintf(buf, PAGE_SIZE, "%u\n",
+			le32_to_cpu(soc_info->accessory_chip));
+}
+ATTR_DEFINE(accessory_chip);
+
+/* Version 6 */
+static ssize_t
+qcom_get_platform_subtype_id(struct device *dev,
+		struct device_attribute *attr,
+		char *buf)
+{
+	return scnprintf(buf, PAGE_SIZE, "%u\n",
+			 le32_to_cpu(soc_info->hw_plat_subtype));
+}
+ATTR_DEFINE(platform_subtype_id);
+
+static struct attribute *qcom_custom_socinfo_attrs[7];
+
+static const struct attribute_group custom_soc_attr_group = {
+	.attrs = qcom_custom_socinfo_attrs,
+};
+
+static void qcom_socinfo_populate_sysfs(struct qcom_socinfo *qcom_socinfo)
+{
+	int i = 0, socinfo_format = le32_to_cpu(soc_info->fmt);
+
+	/* Note: qcom_custom_socinfo_attrs[] size needs to be in sync with attributes added here. */
+	switch (socinfo_format) {
+	case SOCINFO_VERSION(0, 16):
+		fallthrough;
+	case SOCINFO_VERSION(0, 15):
+		fallthrough;
+	case SOCINFO_VERSION(0, 14):
+		fallthrough;
+	case SOCINFO_VERSION(0, 13):
+		fallthrough;
+	case SOCINFO_VERSION(0, 12):
+		fallthrough;
+	case SOCINFO_VERSION(0, 11):
+		fallthrough;
+	case SOCINFO_VERSION(0, 10):
+		fallthrough;
+	case SOCINFO_VERSION(0, 9):
+		fallthrough;
+	case SOCINFO_VERSION(0, 8):
+		fallthrough;
+	case SOCINFO_VERSION(0, 7):
+		fallthrough;
+	case SOCINFO_VERSION(0, 6):
+		qcom_custom_socinfo_attrs[i++] =
+			&dev_attr_platform_subtype_id.attr;
+		fallthrough;
+	case SOCINFO_VERSION(0, 5):
+		qcom_custom_socinfo_attrs[i++] = &dev_attr_accessory_chip.attr;
+		fallthrough;
+	case SOCINFO_VERSION(0, 4):
+		qcom_custom_socinfo_attrs[i++] = &dev_attr_platform_version.attr;
+		fallthrough;
+	case SOCINFO_VERSION(0, 3):
+		qcom_custom_socinfo_attrs[i++] = &dev_attr_hw_platform.attr;
+		fallthrough;
+	case SOCINFO_VERSION(0, 2):
+		qcom_custom_socinfo_attrs[i++] = &dev_attr_raw_id.attr;
+		qcom_custom_socinfo_attrs[i++] = &dev_attr_raw_version.attr;
+		fallthrough;
+	case SOCINFO_VERSION(0, 1):
+		break;
+	default:
+		pr_err("Unknown socinfo format: v%u.%u\n",
+				SOCINFO_MAJOR(socinfo_format),
+				SOCINFO_MINOR(socinfo_format));
+		break;
+	}
+
+	qcom_custom_socinfo_attrs[i] = NULL;
+	qcom_socinfo->attr.custom_attr_group = &custom_soc_attr_group;
+}
+
 static const char *socinfo_machine(struct device *dev, unsigned int id)
 {
 	int idx;
@@ -696,6 +876,7 @@ static int qcom_socinfo_probe(struct platform_device *pdev)
 							"%u",
 							le32_to_cpu(soc_info->serial_num));
 
+	qcom_socinfo_populate_sysfs(qs);
 	qs->soc_dev = soc_device_register(&qs->attr);
 	if (IS_ERR(qs->soc_dev))
 		return PTR_ERR(qs->soc_dev);
