1efb448d0SImran Khan // SPDX-License-Identifier: GPL-2.0 2efb448d0SImran Khan /* 3efb448d0SImran Khan * Copyright (c) 2009-2017, The Linux Foundation. All rights reserved. 4efb448d0SImran Khan * Copyright (c) 2017-2019, Linaro Ltd. 5efb448d0SImran Khan */ 6efb448d0SImran Khan 79c84c1e7SVaishali Thakkar #include <linux/debugfs.h> 8efb448d0SImran Khan #include <linux/err.h> 9efb448d0SImran Khan #include <linux/module.h> 10efb448d0SImran Khan #include <linux/platform_device.h> 11efb448d0SImran Khan #include <linux/random.h> 12efb448d0SImran Khan #include <linux/slab.h> 13efb448d0SImran Khan #include <linux/soc/qcom/smem.h> 14ec001bb7SRobert Marko #include <linux/soc/qcom/socinfo.h> 15efb448d0SImran Khan #include <linux/string.h> 1634ec89e6SKrzysztof Kozlowski #include <linux/stringify.h> 17efb448d0SImran Khan #include <linux/sys_soc.h> 18efb448d0SImran Khan #include <linux/types.h> 19efb448d0SImran Khan 20734c78e7SDmitry Baryshkov #include <asm/unaligned.h> 21734c78e7SDmitry Baryshkov 2234ec89e6SKrzysztof Kozlowski #include <dt-bindings/arm/qcom,ids.h> 2334ec89e6SKrzysztof Kozlowski 2434ec89e6SKrzysztof Kozlowski /* Helper macros to create soc_id table */ 2534ec89e6SKrzysztof Kozlowski #define qcom_board_id(id) QCOM_ID_ ## id, __stringify(id) 2634ec89e6SKrzysztof Kozlowski #define qcom_board_id_named(id, name) QCOM_ID_ ## id, (name) 2734ec89e6SKrzysztof Kozlowski 289c84c1e7SVaishali Thakkar #ifdef CONFIG_DEBUG_FS 29cd23d140SVaishali Thakkar #define SMEM_IMAGE_VERSION_BLOCKS_COUNT 32 30cd23d140SVaishali Thakkar #define SMEM_IMAGE_VERSION_SIZE 4096 31cd23d140SVaishali Thakkar #define SMEM_IMAGE_VERSION_NAME_SIZE 75 32cd23d140SVaishali Thakkar #define SMEM_IMAGE_VERSION_VARIANT_SIZE 20 33cd23d140SVaishali Thakkar #define SMEM_IMAGE_VERSION_OEM_SIZE 32 34cd23d140SVaishali Thakkar 35cd23d140SVaishali Thakkar /* 36cd23d140SVaishali Thakkar * SMEM Image table indices 37cd23d140SVaishali Thakkar */ 38cd23d140SVaishali Thakkar #define SMEM_IMAGE_TABLE_BOOT_INDEX 0 39cd23d140SVaishali Thakkar #define SMEM_IMAGE_TABLE_TZ_INDEX 1 40cd23d140SVaishali Thakkar #define SMEM_IMAGE_TABLE_RPM_INDEX 3 41cd23d140SVaishali Thakkar #define SMEM_IMAGE_TABLE_APPS_INDEX 10 42cd23d140SVaishali Thakkar #define SMEM_IMAGE_TABLE_MPSS_INDEX 11 43cd23d140SVaishali Thakkar #define SMEM_IMAGE_TABLE_ADSP_INDEX 12 44cd23d140SVaishali Thakkar #define SMEM_IMAGE_TABLE_CNSS_INDEX 13 45cd23d140SVaishali Thakkar #define SMEM_IMAGE_TABLE_VIDEO_INDEX 14 46cea0585cSNaman Jain #define SMEM_IMAGE_TABLE_DSPS_INDEX 15 47cea0585cSNaman Jain #define SMEM_IMAGE_TABLE_CDSP_INDEX 16 48cea0585cSNaman Jain #define SMEM_IMAGE_TABLE_CDSP1_INDEX 19 49cea0585cSNaman Jain #define SMEM_IMAGE_TABLE_GPDSP_INDEX 20 50cea0585cSNaman Jain #define SMEM_IMAGE_TABLE_GPDSP1_INDEX 21 51cd23d140SVaishali Thakkar #define SMEM_IMAGE_VERSION_TABLE 469 52cd23d140SVaishali Thakkar 53cd23d140SVaishali Thakkar /* 54cd23d140SVaishali Thakkar * SMEM Image table names 55cd23d140SVaishali Thakkar */ 56cd23d140SVaishali Thakkar static const char *const socinfo_image_names[] = { 57cd23d140SVaishali Thakkar [SMEM_IMAGE_TABLE_ADSP_INDEX] = "adsp", 58cd23d140SVaishali Thakkar [SMEM_IMAGE_TABLE_APPS_INDEX] = "apps", 59cd23d140SVaishali Thakkar [SMEM_IMAGE_TABLE_BOOT_INDEX] = "boot", 60cd23d140SVaishali Thakkar [SMEM_IMAGE_TABLE_CNSS_INDEX] = "cnss", 61cd23d140SVaishali Thakkar [SMEM_IMAGE_TABLE_MPSS_INDEX] = "mpss", 62cd23d140SVaishali Thakkar [SMEM_IMAGE_TABLE_RPM_INDEX] = "rpm", 63cd23d140SVaishali Thakkar [SMEM_IMAGE_TABLE_TZ_INDEX] = "tz", 64cd23d140SVaishali Thakkar [SMEM_IMAGE_TABLE_VIDEO_INDEX] = "video", 65cea0585cSNaman Jain [SMEM_IMAGE_TABLE_DSPS_INDEX] = "dsps", 66cea0585cSNaman Jain [SMEM_IMAGE_TABLE_CDSP_INDEX] = "cdsp", 67cea0585cSNaman Jain [SMEM_IMAGE_TABLE_CDSP1_INDEX] = "cdsp1", 68cea0585cSNaman Jain [SMEM_IMAGE_TABLE_GPDSP_INDEX] = "gpdsp", 69cea0585cSNaman Jain [SMEM_IMAGE_TABLE_GPDSP1_INDEX] = "gpdsp1", 70cd23d140SVaishali Thakkar }; 71cd23d140SVaishali Thakkar 729c84c1e7SVaishali Thakkar static const char *const pmic_models[] = { 739c84c1e7SVaishali Thakkar [0] = "Unknown PMIC model", 747fda2b0bSLuca Weiss [1] = "PM8941", 757fda2b0bSLuca Weiss [2] = "PM8841", 767fda2b0bSLuca Weiss [3] = "PM8019", 777fda2b0bSLuca Weiss [4] = "PM8226", 787fda2b0bSLuca Weiss [5] = "PM8110", 797fda2b0bSLuca Weiss [6] = "PMA8084", 807fda2b0bSLuca Weiss [7] = "PMI8962", 817fda2b0bSLuca Weiss [8] = "PMD9635", 829c84c1e7SVaishali Thakkar [9] = "PM8994", 837fda2b0bSLuca Weiss [10] = "PMI8994", 849c84c1e7SVaishali Thakkar [11] = "PM8916", 857fda2b0bSLuca Weiss [12] = "PM8004", 867fda2b0bSLuca Weiss [13] = "PM8909/PM8058", 879c84c1e7SVaishali Thakkar [14] = "PM8028", 889c84c1e7SVaishali Thakkar [15] = "PM8901", 897fda2b0bSLuca Weiss [16] = "PM8950/PM8027", 907fda2b0bSLuca Weiss [17] = "PMI8950/ISL9519", 912fae3eccSDmitry Baryshkov [18] = "PMK8001/PM8921", 922fae3eccSDmitry Baryshkov [19] = "PMI8996/PM8018", 937fda2b0bSLuca Weiss [20] = "PM8998/PM8015", 947fda2b0bSLuca Weiss [21] = "PMI8998/PM8014", 959c84c1e7SVaishali Thakkar [22] = "PM8821", 969c84c1e7SVaishali Thakkar [23] = "PM8038", 977fda2b0bSLuca Weiss [24] = "PM8005/PM8922", 98d50b5cb1SDang Huynh [25] = "PM8917/PM8937", 997fda2b0bSLuca Weiss [26] = "PM660L", 1007fda2b0bSLuca Weiss [27] = "PM660", 10143053242SDmitry Baryshkov [30] = "PM8150", 10243053242SDmitry Baryshkov [31] = "PM8150L", 10343053242SDmitry Baryshkov [32] = "PM8150B", 10443053242SDmitry Baryshkov [33] = "PMK8002", 10543053242SDmitry Baryshkov [36] = "PM8009", 106112d96fdSKonrad Dybcio [37] = "PMI632", 10787fd343cSBjorn Andersson [38] = "PM8150C", 108112d96fdSKonrad Dybcio [40] = "PM6150", 10987fd343cSBjorn Andersson [41] = "SMB2351", 110112d96fdSKonrad Dybcio [44] = "PM8008", 1115257841aSKonrad Dybcio [45] = "PM6125", 112112d96fdSKonrad Dybcio [46] = "PM7250B", 11376ee15aeSBjorn Andersson [47] = "PMK8350", 11476ee15aeSBjorn Andersson [48] = "PM8350", 11576ee15aeSBjorn Andersson [49] = "PM8350C", 11676ee15aeSBjorn Andersson [50] = "PM8350B", 11776ee15aeSBjorn Andersson [51] = "PMR735A", 11876ee15aeSBjorn Andersson [52] = "PMR735B", 119*6e697467SLuca Weiss [54] = "PM6350", 1205155e481SDmitry Baryshkov [55] = "PM4125", 12176ee15aeSBjorn Andersson [58] = "PM8450", 12276ee15aeSBjorn Andersson [65] = "PM8010", 1233b1eba18SKonrad Dybcio [69] = "PM8550VS", 1243b1eba18SKonrad Dybcio [70] = "PM8550VE", 1253b1eba18SKonrad Dybcio [71] = "PM8550B", 1263b1eba18SKonrad Dybcio [72] = "PMR735D", 1273b1eba18SKonrad Dybcio [73] = "PM8550", 1283b1eba18SKonrad Dybcio [74] = "PMK8550", 12985f5656aSKonrad Dybcio [82] = "PMC8380", 13085f5656aSKonrad Dybcio [83] = "SMB2360", 1319c84c1e7SVaishali Thakkar }; 1329c84c1e7SVaishali Thakkar 1339c84c1e7SVaishali Thakkar struct socinfo_params { 1349c84c1e7SVaishali Thakkar u32 raw_device_family; 1359c84c1e7SVaishali Thakkar u32 hw_plat_subtype; 1369c84c1e7SVaishali Thakkar u32 accessory_chip; 1379c84c1e7SVaishali Thakkar u32 raw_device_num; 1389c84c1e7SVaishali Thakkar u32 chip_family; 1399c84c1e7SVaishali Thakkar u32 foundry_id; 1409c84c1e7SVaishali Thakkar u32 plat_ver; 1419c84c1e7SVaishali Thakkar u32 raw_ver; 1429c84c1e7SVaishali Thakkar u32 hw_plat; 1439c84c1e7SVaishali Thakkar u32 fmt; 1440f12fe7fSDmitry Baryshkov u32 nproduct_id; 1450f12fe7fSDmitry Baryshkov u32 num_clusters; 1460f12fe7fSDmitry Baryshkov u32 ncluster_array_offset; 147d9c2a255SNaman Jain u32 num_subset_parts; 148d9c2a255SNaman Jain u32 nsubset_parts_array_offset; 1490f12fe7fSDmitry Baryshkov u32 nmodem_supported; 150f02a5373SNaman Jain u32 feature_code; 151f02a5373SNaman Jain u32 pcode; 1526bdab60dSNaman Jain u32 oem_variant; 153d9c2a255SNaman Jain u32 num_func_clusters; 154d9c2a255SNaman Jain u32 boot_cluster; 155d9c2a255SNaman Jain u32 boot_core; 1569c84c1e7SVaishali Thakkar }; 157cd23d140SVaishali Thakkar 158cd23d140SVaishali Thakkar struct smem_image_version { 159cd23d140SVaishali Thakkar char name[SMEM_IMAGE_VERSION_NAME_SIZE]; 160cd23d140SVaishali Thakkar char variant[SMEM_IMAGE_VERSION_VARIANT_SIZE]; 161cd23d140SVaishali Thakkar char pad; 162cd23d140SVaishali Thakkar char oem[SMEM_IMAGE_VERSION_OEM_SIZE]; 163cd23d140SVaishali Thakkar }; 1649c84c1e7SVaishali Thakkar #endif /* CONFIG_DEBUG_FS */ 1659c84c1e7SVaishali Thakkar 166efb448d0SImran Khan struct qcom_socinfo { 167efb448d0SImran Khan struct soc_device *soc_dev; 168efb448d0SImran Khan struct soc_device_attribute attr; 1699c84c1e7SVaishali Thakkar #ifdef CONFIG_DEBUG_FS 1709c84c1e7SVaishali Thakkar struct dentry *dbg_root; 1719c84c1e7SVaishali Thakkar struct socinfo_params info; 1729c84c1e7SVaishali Thakkar #endif /* CONFIG_DEBUG_FS */ 173efb448d0SImran Khan }; 174efb448d0SImran Khan 175efb448d0SImran Khan struct soc_id { 176efb448d0SImran Khan unsigned int id; 177efb448d0SImran Khan const char *name; 178efb448d0SImran Khan }; 179efb448d0SImran Khan 180efb448d0SImran Khan static const struct soc_id soc_id[] = { 18140017cebSStephan Gerhold { qcom_board_id(MSM8260) }, 18240017cebSStephan Gerhold { qcom_board_id(MSM8660) }, 18340017cebSStephan Gerhold { qcom_board_id(APQ8060) }, 18434ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8960) }, 18534ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8064) }, 18640017cebSStephan Gerhold { qcom_board_id(MSM8930) }, 18740017cebSStephan Gerhold { qcom_board_id(MSM8630) }, 18840017cebSStephan Gerhold { qcom_board_id(MSM8230) }, 18940017cebSStephan Gerhold { qcom_board_id(APQ8030) }, 19040017cebSStephan Gerhold { qcom_board_id(MSM8627) }, 19140017cebSStephan Gerhold { qcom_board_id(MSM8227) }, 19234ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8660A) }, 19334ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8260A) }, 19434ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8060A) }, 19534ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8974) }, 19640017cebSStephan Gerhold { qcom_board_id(MSM8225) }, 19740017cebSStephan Gerhold { qcom_board_id(MSM8625) }, 19834ec89e6SKrzysztof Kozlowski { qcom_board_id(MPQ8064) }, 19934ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8960AB) }, 20034ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8060AB) }, 20134ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8260AB) }, 20234ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8660AB) }, 20340017cebSStephan Gerhold { qcom_board_id(MSM8930AA) }, 20440017cebSStephan Gerhold { qcom_board_id(MSM8630AA) }, 20540017cebSStephan Gerhold { qcom_board_id(MSM8230AA) }, 20634ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8626) }, 20734ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8610) }, 20834ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8064AB) }, 20940017cebSStephan Gerhold { qcom_board_id(MSM8930AB) }, 21040017cebSStephan Gerhold { qcom_board_id(MSM8630AB) }, 21140017cebSStephan Gerhold { qcom_board_id(MSM8230AB) }, 21240017cebSStephan Gerhold { qcom_board_id(APQ8030AB) }, 21334ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8226) }, 21434ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8526) }, 21540017cebSStephan Gerhold { qcom_board_id(APQ8030AA) }, 21634ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8110) }, 21734ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8210) }, 21834ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8810) }, 21934ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8212) }, 22034ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8612) }, 22134ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8112) }, 22240017cebSStephan Gerhold { qcom_board_id(MSM8125) }, 22334ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8225Q) }, 22434ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8625Q) }, 22534ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8125Q) }, 22634ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8064AA) }, 22734ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8084) }, 22840017cebSStephan Gerhold { qcom_board_id(MSM8130) }, 22940017cebSStephan Gerhold { qcom_board_id(MSM8130AA) }, 23040017cebSStephan Gerhold { qcom_board_id(MSM8130AB) }, 23140017cebSStephan Gerhold { qcom_board_id(MSM8627AA) }, 23240017cebSStephan Gerhold { qcom_board_id(MSM8227AA) }, 23334ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8074) }, 23434ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8274) }, 23534ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8674) }, 23640017cebSStephan Gerhold { qcom_board_id(MDM9635) }, 23734ec89e6SKrzysztof Kozlowski { qcom_board_id_named(MSM8974PRO_AC, "MSM8974PRO-AC") }, 23834ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8126) }, 23934ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8026) }, 24034ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8926) }, 24179802479SChristian Marangi { qcom_board_id(IPQ8062) }, 24279802479SChristian Marangi { qcom_board_id(IPQ8064) }, 24379802479SChristian Marangi { qcom_board_id(IPQ8066) }, 24479802479SChristian Marangi { qcom_board_id(IPQ8068) }, 24534ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8326) }, 24634ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8916) }, 24734ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8994) }, 24834ec89e6SKrzysztof Kozlowski { qcom_board_id_named(APQ8074PRO_AA, "APQ8074PRO-AA") }, 24934ec89e6SKrzysztof Kozlowski { qcom_board_id_named(APQ8074PRO_AB, "APQ8074PRO-AB") }, 25034ec89e6SKrzysztof Kozlowski { qcom_board_id_named(APQ8074PRO_AC, "APQ8074PRO-AC") }, 25134ec89e6SKrzysztof Kozlowski { qcom_board_id_named(MSM8274PRO_AA, "MSM8274PRO-AA") }, 25234ec89e6SKrzysztof Kozlowski { qcom_board_id_named(MSM8274PRO_AB, "MSM8274PRO-AB") }, 25334ec89e6SKrzysztof Kozlowski { qcom_board_id_named(MSM8274PRO_AC, "MSM8274PRO-AC") }, 25434ec89e6SKrzysztof Kozlowski { qcom_board_id_named(MSM8674PRO_AA, "MSM8674PRO-AA") }, 25534ec89e6SKrzysztof Kozlowski { qcom_board_id_named(MSM8674PRO_AB, "MSM8674PRO-AB") }, 25634ec89e6SKrzysztof Kozlowski { qcom_board_id_named(MSM8674PRO_AC, "MSM8674PRO-AC") }, 25734ec89e6SKrzysztof Kozlowski { qcom_board_id_named(MSM8974PRO_AA, "MSM8974PRO-AA") }, 25834ec89e6SKrzysztof Kozlowski { qcom_board_id_named(MSM8974PRO_AB, "MSM8974PRO-AB") }, 25934ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8028) }, 26034ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8128) }, 26134ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8228) }, 26234ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8528) }, 26334ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8628) }, 26434ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8928) }, 26534ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8510) }, 26634ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8512) }, 26734ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8936) }, 26840017cebSStephan Gerhold { qcom_board_id(MDM9640) }, 26934ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8939) }, 27034ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8036) }, 27134ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8039) }, 27240017cebSStephan Gerhold { qcom_board_id(MSM8236) }, 27340017cebSStephan Gerhold { qcom_board_id(MSM8636) }, 27440017cebSStephan Gerhold { qcom_board_id(MSM8909) }, 27534ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8996) }, 27634ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8016) }, 27734ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8216) }, 27834ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8116) }, 27934ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8616) }, 28034ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8992) }, 28140017cebSStephan Gerhold { qcom_board_id(APQ8092) }, 28234ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8094) }, 28340017cebSStephan Gerhold { qcom_board_id(MSM8209) }, 28440017cebSStephan Gerhold { qcom_board_id(MSM8208) }, 28540017cebSStephan Gerhold { qcom_board_id(MDM9209) }, 28640017cebSStephan Gerhold { qcom_board_id(MDM9309) }, 28740017cebSStephan Gerhold { qcom_board_id(MDM9609) }, 28840017cebSStephan Gerhold { qcom_board_id(MSM8239) }, 28940017cebSStephan Gerhold { qcom_board_id(MSM8952) }, 29040017cebSStephan Gerhold { qcom_board_id(APQ8009) }, 291017a7c11SStephan Gerhold { qcom_board_id(MSM8956) }, 29240017cebSStephan Gerhold { qcom_board_id(MSM8929) }, 29340017cebSStephan Gerhold { qcom_board_id(MSM8629) }, 29440017cebSStephan Gerhold { qcom_board_id(MSM8229) }, 29540017cebSStephan Gerhold { qcom_board_id(APQ8029) }, 29640017cebSStephan Gerhold { qcom_board_id(APQ8056) }, 29740017cebSStephan Gerhold { qcom_board_id(MSM8609) }, 29840017cebSStephan Gerhold { qcom_board_id(APQ8076) }, 299017a7c11SStephan Gerhold { qcom_board_id(MSM8976) }, 30079802479SChristian Marangi { qcom_board_id(IPQ8065) }, 30179802479SChristian Marangi { qcom_board_id(IPQ8069) }, 30240017cebSStephan Gerhold { qcom_board_id(MDM9650) }, 30340017cebSStephan Gerhold { qcom_board_id(MDM9655) }, 30440017cebSStephan Gerhold { qcom_board_id(MDM9250) }, 30540017cebSStephan Gerhold { qcom_board_id(MDM9255) }, 30640017cebSStephan Gerhold { qcom_board_id(MDM9350) }, 30740017cebSStephan Gerhold { qcom_board_id(APQ8052) }, 30834ec89e6SKrzysztof Kozlowski { qcom_board_id(MDM9607) }, 30934ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8096) }, 31034ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8998) }, 31134ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8953) }, 31240017cebSStephan Gerhold { qcom_board_id(MSM8937) }, 31340017cebSStephan Gerhold { qcom_board_id(APQ8037) }, 31434ec89e6SKrzysztof Kozlowski { qcom_board_id(MDM8207) }, 31534ec89e6SKrzysztof Kozlowski { qcom_board_id(MDM9207) }, 31634ec89e6SKrzysztof Kozlowski { qcom_board_id(MDM9307) }, 31734ec89e6SKrzysztof Kozlowski { qcom_board_id(MDM9628) }, 31840017cebSStephan Gerhold { qcom_board_id(MSM8909W) }, 31940017cebSStephan Gerhold { qcom_board_id(APQ8009W) }, 32040017cebSStephan Gerhold { qcom_board_id(MSM8996L) }, 32140017cebSStephan Gerhold { qcom_board_id(MSM8917) }, 32234ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8053) }, 32334ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8996SG) }, 32440017cebSStephan Gerhold { qcom_board_id(APQ8017) }, 32540017cebSStephan Gerhold { qcom_board_id(MSM8217) }, 32640017cebSStephan Gerhold { qcom_board_id(MSM8617) }, 32734ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8996AU) }, 32834ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8096AU) }, 32934ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8096SG) }, 33040017cebSStephan Gerhold { qcom_board_id(MSM8940) }, 33140017cebSStephan Gerhold { qcom_board_id(SDX201) }, 33234ec89e6SKrzysztof Kozlowski { qcom_board_id(SDM660) }, 33334ec89e6SKrzysztof Kozlowski { qcom_board_id(SDM630) }, 33434ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8098) }, 33540017cebSStephan Gerhold { qcom_board_id(MSM8920) }, 33634ec89e6SKrzysztof Kozlowski { qcom_board_id(SDM845) }, 33734ec89e6SKrzysztof Kozlowski { qcom_board_id(MDM9206) }, 33834ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8074) }, 33934ec89e6SKrzysztof Kozlowski { qcom_board_id(SDA660) }, 34034ec89e6SKrzysztof Kozlowski { qcom_board_id(SDM658) }, 34134ec89e6SKrzysztof Kozlowski { qcom_board_id(SDA658) }, 34234ec89e6SKrzysztof Kozlowski { qcom_board_id(SDA630) }, 34340017cebSStephan Gerhold { qcom_board_id(MSM8905) }, 34440017cebSStephan Gerhold { qcom_board_id(SDX202) }, 34548e4da79SRichard Acayan { qcom_board_id(SDM670) }, 34634ec89e6SKrzysztof Kozlowski { qcom_board_id(SDM450) }, 347911eed82SBhupesh Sharma { qcom_board_id(SM8150) }, 34834ec89e6SKrzysztof Kozlowski { qcom_board_id(SDA845) }, 34934ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8072) }, 35034ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8076) }, 35134ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8078) }, 35234ec89e6SKrzysztof Kozlowski { qcom_board_id(SDM636) }, 35334ec89e6SKrzysztof Kozlowski { qcom_board_id(SDA636) }, 35434ec89e6SKrzysztof Kozlowski { qcom_board_id(SDM632) }, 35534ec89e6SKrzysztof Kozlowski { qcom_board_id(SDA632) }, 35634ec89e6SKrzysztof Kozlowski { qcom_board_id(SDA450) }, 35740017cebSStephan Gerhold { qcom_board_id(SDM439) }, 35840017cebSStephan Gerhold { qcom_board_id(SDM429) }, 35934ec89e6SKrzysztof Kozlowski { qcom_board_id(SM8250) }, 360911eed82SBhupesh Sharma { qcom_board_id(SA8155) }, 36140017cebSStephan Gerhold { qcom_board_id(SDA439) }, 36240017cebSStephan Gerhold { qcom_board_id(SDA429) }, 363bad8cdc2SDavid Wronek { qcom_board_id(SM7150) }, 364776b29ebSDanila Tikhonov { qcom_board_id(SM7150P) }, 36534ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8070) }, 36634ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8071) }, 36740017cebSStephan Gerhold { qcom_board_id(QM215) }, 36834ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8072A) }, 36934ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8074A) }, 37034ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8076A) }, 37134ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8078A) }, 37234ec89e6SKrzysztof Kozlowski { qcom_board_id(SM6125) }, 37334ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8070A) }, 37434ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8071A) }, 375e9104e73SRobert Marko { qcom_board_id(IPQ8172) }, 376e9104e73SRobert Marko { qcom_board_id(IPQ8173) }, 377e9104e73SRobert Marko { qcom_board_id(IPQ8174) }, 37834ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ6018) }, 37934ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ6028) }, 38040017cebSStephan Gerhold { qcom_board_id(SDM429W) }, 381f33ca7ecSBhupesh Sharma { qcom_board_id(SM4250) }, 38234ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ6000) }, 38334ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ6010) }, 38434ec89e6SKrzysztof Kozlowski { qcom_board_id(SC7180) }, 38534ec89e6SKrzysztof Kozlowski { qcom_board_id(SM6350) }, 38640017cebSStephan Gerhold { qcom_board_id(QCM2150) }, 38740017cebSStephan Gerhold { qcom_board_id(SDA429W) }, 38834ec89e6SKrzysztof Kozlowski { qcom_board_id(SM8350) }, 38918290c2eSKonrad Dybcio { qcom_board_id(QCM2290) }, 39023b45f8aSDavid Wronek { qcom_board_id(SM7125) }, 391f33ca7ecSBhupesh Sharma { qcom_board_id(SM6115) }, 3920369a590SRobert Marko { qcom_board_id(IPQ5010) }, 3930369a590SRobert Marko { qcom_board_id(IPQ5018) }, 3940369a590SRobert Marko { qcom_board_id(IPQ5028) }, 39534ec89e6SKrzysztof Kozlowski { qcom_board_id(SC8280XP) }, 39634ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ6005) }, 39734ec89e6SKrzysztof Kozlowski { qcom_board_id(QRB5165) }, 39834ec89e6SKrzysztof Kozlowski { qcom_board_id(SM8450) }, 39934ec89e6SKrzysztof Kozlowski { qcom_board_id(SM7225) }, 40034ec89e6SKrzysztof Kozlowski { qcom_board_id(SA8295P) }, 40134ec89e6SKrzysztof Kozlowski { qcom_board_id(SA8540P) }, 402f33ca7ecSBhupesh Sharma { qcom_board_id(QCM4290) }, 403f33ca7ecSBhupesh Sharma { qcom_board_id(QCS4290) }, 40434ec89e6SKrzysztof Kozlowski { qcom_board_id_named(SM8450_2, "SM8450") }, 40534ec89e6SKrzysztof Kozlowski { qcom_board_id_named(SM8450_3, "SM8450") }, 40634ec89e6SKrzysztof Kozlowski { qcom_board_id(SC7280) }, 40734ec89e6SKrzysztof Kozlowski { qcom_board_id(SC7180P) }, 40859872d59SLuca Weiss { qcom_board_id(QCM6490) }, 4090369a590SRobert Marko { qcom_board_id(IPQ5000) }, 4100369a590SRobert Marko { qcom_board_id(IPQ0509) }, 4110369a590SRobert Marko { qcom_board_id(IPQ0518) }, 41234ec89e6SKrzysztof Kozlowski { qcom_board_id(SM6375) }, 413c6653d8fSVaradarajan Narayanan { qcom_board_id(IPQ9514) }, 414c6653d8fSVaradarajan Narayanan { qcom_board_id(IPQ9550) }, 415c6653d8fSVaradarajan Narayanan { qcom_board_id(IPQ9554) }, 416c6653d8fSVaradarajan Narayanan { qcom_board_id(IPQ9570) }, 417c6653d8fSVaradarajan Narayanan { qcom_board_id(IPQ9574) }, 418017a7c11SStephan Gerhold { qcom_board_id(SM8550) }, 4190369a590SRobert Marko { qcom_board_id(IPQ5016) }, 420c6653d8fSVaradarajan Narayanan { qcom_board_id(IPQ9510) }, 421a11bc4a5SBhupesh Sharma { qcom_board_id(QRB4210) }, 42218290c2eSKonrad Dybcio { qcom_board_id(QRB2210) }, 423c8f349acSDanila Tikhonov { qcom_board_id(SM8475) }, 424c8f349acSDanila Tikhonov { qcom_board_id(SM8475P) }, 4257fa9c5fcSBartosz Golaszewski { qcom_board_id(SA8775P) }, 426759dcdf2SMelody Olvera { qcom_board_id(QRU1000) }, 427c8f349acSDanila Tikhonov { qcom_board_id(SM8475_2) }, 428759dcdf2SMelody Olvera { qcom_board_id(QDU1000) }, 429e876303cSAbel Vesa { qcom_board_id(X1E80100) }, 430f61319e5SNeil Armstrong { qcom_board_id(SM8650) }, 43142618de0STengfei Fan { qcom_board_id(SM4450) }, 432759dcdf2SMelody Olvera { qcom_board_id(QDU1010) }, 433759dcdf2SMelody Olvera { qcom_board_id(QRU1032) }, 434759dcdf2SMelody Olvera { qcom_board_id(QRU1052) }, 435759dcdf2SMelody Olvera { qcom_board_id(QRU1062) }, 436b0bc8c89SKathiravan T { qcom_board_id(IPQ5332) }, 437b0bc8c89SKathiravan T { qcom_board_id(IPQ5322) }, 4387f6e0028SKathiravan T { qcom_board_id(IPQ5312) }, 4397f6e0028SKathiravan T { qcom_board_id(IPQ5302) }, 440d7f3a369STengfei Fan { qcom_board_id(QCS8550) }, 441d7f3a369STengfei Fan { qcom_board_id(QCM8550) }, 442f471f91aSKathiravan T { qcom_board_id(IPQ5300) }, 4438ddfb4a8SKathiravan Thirumoorthy { qcom_board_id(IPQ5321) }, 444efb448d0SImran Khan }; 445efb448d0SImran Khan 446efb448d0SImran Khan static const char *socinfo_machine(struct device *dev, unsigned int id) 447efb448d0SImran Khan { 448efb448d0SImran Khan int idx; 449efb448d0SImran Khan 450efb448d0SImran Khan for (idx = 0; idx < ARRAY_SIZE(soc_id); idx++) { 451efb448d0SImran Khan if (soc_id[idx].id == id) 452efb448d0SImran Khan return soc_id[idx].name; 453efb448d0SImran Khan } 454efb448d0SImran Khan 455efb448d0SImran Khan return NULL; 456efb448d0SImran Khan } 457efb448d0SImran Khan 4589c84c1e7SVaishali Thakkar #ifdef CONFIG_DEBUG_FS 4599c84c1e7SVaishali Thakkar 4609c84c1e7SVaishali Thakkar #define QCOM_OPEN(name, _func) \ 4619c84c1e7SVaishali Thakkar static int qcom_open_##name(struct inode *inode, struct file *file) \ 4629c84c1e7SVaishali Thakkar { \ 4639c84c1e7SVaishali Thakkar return single_open(file, _func, inode->i_private); \ 4649c84c1e7SVaishali Thakkar } \ 4659c84c1e7SVaishali Thakkar \ 4669c84c1e7SVaishali Thakkar static const struct file_operations qcom_ ##name## _ops = { \ 4679c84c1e7SVaishali Thakkar .open = qcom_open_##name, \ 4689c84c1e7SVaishali Thakkar .read = seq_read, \ 4699c84c1e7SVaishali Thakkar .llseek = seq_lseek, \ 4709c84c1e7SVaishali Thakkar .release = single_release, \ 4719c84c1e7SVaishali Thakkar } 4729c84c1e7SVaishali Thakkar 4739c84c1e7SVaishali Thakkar #define DEBUGFS_ADD(info, name) \ 4748333b2c2SStephen Boyd debugfs_create_file(__stringify(name), 0444, \ 4759c84c1e7SVaishali Thakkar qcom_socinfo->dbg_root, \ 4769c84c1e7SVaishali Thakkar info, &qcom_ ##name## _ops) 4779c84c1e7SVaishali Thakkar 4789c84c1e7SVaishali Thakkar 4799c84c1e7SVaishali Thakkar static int qcom_show_build_id(struct seq_file *seq, void *p) 4809c84c1e7SVaishali Thakkar { 4819c84c1e7SVaishali Thakkar struct socinfo *socinfo = seq->private; 4829c84c1e7SVaishali Thakkar 4839c84c1e7SVaishali Thakkar seq_printf(seq, "%s\n", socinfo->build_id); 4849c84c1e7SVaishali Thakkar 4859c84c1e7SVaishali Thakkar return 0; 4869c84c1e7SVaishali Thakkar } 4879c84c1e7SVaishali Thakkar 4889c84c1e7SVaishali Thakkar static int qcom_show_pmic_model(struct seq_file *seq, void *p) 4899c84c1e7SVaishali Thakkar { 4909c84c1e7SVaishali Thakkar struct socinfo *socinfo = seq->private; 4919c84c1e7SVaishali Thakkar int model = SOCINFO_MINOR(le32_to_cpu(socinfo->pmic_model)); 4929c84c1e7SVaishali Thakkar 4939c84c1e7SVaishali Thakkar if (model < 0) 4949c84c1e7SVaishali Thakkar return -EINVAL; 4959c84c1e7SVaishali Thakkar 4965fb33d89SDan Carpenter if (model < ARRAY_SIZE(pmic_models) && pmic_models[model]) 4979c84c1e7SVaishali Thakkar seq_printf(seq, "%s\n", pmic_models[model]); 498e9247e2cSDmitry Baryshkov else 499e9247e2cSDmitry Baryshkov seq_printf(seq, "unknown (%d)\n", model); 5009c84c1e7SVaishali Thakkar 5019c84c1e7SVaishali Thakkar return 0; 5029c84c1e7SVaishali Thakkar } 5039c84c1e7SVaishali Thakkar 504734c78e7SDmitry Baryshkov static int qcom_show_pmic_model_array(struct seq_file *seq, void *p) 505734c78e7SDmitry Baryshkov { 506734c78e7SDmitry Baryshkov struct socinfo *socinfo = seq->private; 507734c78e7SDmitry Baryshkov unsigned int num_pmics = le32_to_cpu(socinfo->num_pmics); 508734c78e7SDmitry Baryshkov unsigned int pmic_array_offset = le32_to_cpu(socinfo->pmic_array_offset); 509734c78e7SDmitry Baryshkov int i; 510734c78e7SDmitry Baryshkov void *ptr = socinfo; 511734c78e7SDmitry Baryshkov 512734c78e7SDmitry Baryshkov ptr += pmic_array_offset; 513734c78e7SDmitry Baryshkov 514734c78e7SDmitry Baryshkov /* No need for bounds checking, it happened at socinfo_debugfs_init */ 515734c78e7SDmitry Baryshkov for (i = 0; i < num_pmics; i++) { 516734c78e7SDmitry Baryshkov unsigned int model = SOCINFO_MINOR(get_unaligned_le32(ptr + 2 * i * sizeof(u32))); 517734c78e7SDmitry Baryshkov unsigned int die_rev = get_unaligned_le32(ptr + (2 * i + 1) * sizeof(u32)); 518734c78e7SDmitry Baryshkov 519e6393818SColin Ian King if (model < ARRAY_SIZE(pmic_models) && pmic_models[model]) 520734c78e7SDmitry Baryshkov seq_printf(seq, "%s %u.%u\n", pmic_models[model], 521aec8535eSDmitry Baryshkov SOCINFO_MAJOR(die_rev), 522aec8535eSDmitry Baryshkov SOCINFO_MINOR(die_rev)); 523734c78e7SDmitry Baryshkov else 524734c78e7SDmitry Baryshkov seq_printf(seq, "unknown (%d)\n", model); 525734c78e7SDmitry Baryshkov } 526734c78e7SDmitry Baryshkov 527734c78e7SDmitry Baryshkov return 0; 528734c78e7SDmitry Baryshkov } 529734c78e7SDmitry Baryshkov 5309c84c1e7SVaishali Thakkar static int qcom_show_pmic_die_revision(struct seq_file *seq, void *p) 5319c84c1e7SVaishali Thakkar { 5329c84c1e7SVaishali Thakkar struct socinfo *socinfo = seq->private; 5339c84c1e7SVaishali Thakkar 5349c84c1e7SVaishali Thakkar seq_printf(seq, "%u.%u\n", 5359c84c1e7SVaishali Thakkar SOCINFO_MAJOR(le32_to_cpu(socinfo->pmic_die_rev)), 5369c84c1e7SVaishali Thakkar SOCINFO_MINOR(le32_to_cpu(socinfo->pmic_die_rev))); 5379c84c1e7SVaishali Thakkar 5389c84c1e7SVaishali Thakkar return 0; 5399c84c1e7SVaishali Thakkar } 5409c84c1e7SVaishali Thakkar 5410f12fe7fSDmitry Baryshkov static int qcom_show_chip_id(struct seq_file *seq, void *p) 5420f12fe7fSDmitry Baryshkov { 5430f12fe7fSDmitry Baryshkov struct socinfo *socinfo = seq->private; 5440f12fe7fSDmitry Baryshkov 5450f12fe7fSDmitry Baryshkov seq_printf(seq, "%s\n", socinfo->chip_id); 5460f12fe7fSDmitry Baryshkov 5470f12fe7fSDmitry Baryshkov return 0; 5480f12fe7fSDmitry Baryshkov } 5490f12fe7fSDmitry Baryshkov 5509c84c1e7SVaishali Thakkar QCOM_OPEN(build_id, qcom_show_build_id); 5519c84c1e7SVaishali Thakkar QCOM_OPEN(pmic_model, qcom_show_pmic_model); 552734c78e7SDmitry Baryshkov QCOM_OPEN(pmic_model_array, qcom_show_pmic_model_array); 5539c84c1e7SVaishali Thakkar QCOM_OPEN(pmic_die_rev, qcom_show_pmic_die_revision); 5540f12fe7fSDmitry Baryshkov QCOM_OPEN(chip_id, qcom_show_chip_id); 5559c84c1e7SVaishali Thakkar 556cd23d140SVaishali Thakkar #define DEFINE_IMAGE_OPS(type) \ 557cd23d140SVaishali Thakkar static int show_image_##type(struct seq_file *seq, void *p) \ 558cd23d140SVaishali Thakkar { \ 559cd23d140SVaishali Thakkar struct smem_image_version *image_version = seq->private; \ 5600d361b0aSStephen Boyd if (image_version->type[0] != '\0') \ 5610d361b0aSStephen Boyd seq_printf(seq, "%s\n", image_version->type); \ 562cd23d140SVaishali Thakkar return 0; \ 563cd23d140SVaishali Thakkar } \ 564cd23d140SVaishali Thakkar static int open_image_##type(struct inode *inode, struct file *file) \ 565cd23d140SVaishali Thakkar { \ 566cd23d140SVaishali Thakkar return single_open(file, show_image_##type, inode->i_private); \ 567cd23d140SVaishali Thakkar } \ 568cd23d140SVaishali Thakkar \ 569cd23d140SVaishali Thakkar static const struct file_operations qcom_image_##type##_ops = { \ 570cd23d140SVaishali Thakkar .open = open_image_##type, \ 571cd23d140SVaishali Thakkar .read = seq_read, \ 572cd23d140SVaishali Thakkar .llseek = seq_lseek, \ 573cd23d140SVaishali Thakkar .release = single_release, \ 574cd23d140SVaishali Thakkar } 575cd23d140SVaishali Thakkar 576cd23d140SVaishali Thakkar DEFINE_IMAGE_OPS(name); 577cd23d140SVaishali Thakkar DEFINE_IMAGE_OPS(variant); 578cd23d140SVaishali Thakkar DEFINE_IMAGE_OPS(oem); 579cd23d140SVaishali Thakkar 5809c84c1e7SVaishali Thakkar static void socinfo_debugfs_init(struct qcom_socinfo *qcom_socinfo, 581734c78e7SDmitry Baryshkov struct socinfo *info, size_t info_size) 5829c84c1e7SVaishali Thakkar { 583cd23d140SVaishali Thakkar struct smem_image_version *versions; 584cd23d140SVaishali Thakkar struct dentry *dentry; 5859c84c1e7SVaishali Thakkar size_t size; 586cd23d140SVaishali Thakkar int i; 587734c78e7SDmitry Baryshkov unsigned int num_pmics; 588734c78e7SDmitry Baryshkov unsigned int pmic_array_offset; 5899c84c1e7SVaishali Thakkar 5909c84c1e7SVaishali Thakkar qcom_socinfo->dbg_root = debugfs_create_dir("qcom_socinfo", NULL); 5919c84c1e7SVaishali Thakkar 5929c84c1e7SVaishali Thakkar qcom_socinfo->info.fmt = __le32_to_cpu(info->fmt); 5939c84c1e7SVaishali Thakkar 5948333b2c2SStephen Boyd debugfs_create_x32("info_fmt", 0444, qcom_socinfo->dbg_root, 59550f85d16SDmitry Baryshkov &qcom_socinfo->info.fmt); 59650f85d16SDmitry Baryshkov 5979c84c1e7SVaishali Thakkar switch (qcom_socinfo->info.fmt) { 598d9c2a255SNaman Jain case SOCINFO_VERSION(0, 19): 599d9c2a255SNaman Jain qcom_socinfo->info.num_func_clusters = __le32_to_cpu(info->num_func_clusters); 600d9c2a255SNaman Jain qcom_socinfo->info.boot_cluster = __le32_to_cpu(info->boot_cluster); 601d9c2a255SNaman Jain qcom_socinfo->info.boot_core = __le32_to_cpu(info->boot_core); 602d9c2a255SNaman Jain 603d9c2a255SNaman Jain debugfs_create_u32("num_func_clusters", 0444, qcom_socinfo->dbg_root, 604d9c2a255SNaman Jain &qcom_socinfo->info.num_func_clusters); 605d9c2a255SNaman Jain debugfs_create_u32("boot_cluster", 0444, qcom_socinfo->dbg_root, 606d9c2a255SNaman Jain &qcom_socinfo->info.boot_cluster); 607d9c2a255SNaman Jain debugfs_create_u32("boot_core", 0444, qcom_socinfo->dbg_root, 608d9c2a255SNaman Jain &qcom_socinfo->info.boot_core); 609d9c2a255SNaman Jain fallthrough; 610158826c7SNaman Jain case SOCINFO_VERSION(0, 18): 6116bdab60dSNaman Jain case SOCINFO_VERSION(0, 17): 6126bdab60dSNaman Jain qcom_socinfo->info.oem_variant = __le32_to_cpu(info->oem_variant); 6136bdab60dSNaman Jain debugfs_create_u32("oem_variant", 0444, qcom_socinfo->dbg_root, 6146bdab60dSNaman Jain &qcom_socinfo->info.oem_variant); 6156bdab60dSNaman Jain fallthrough; 616f02a5373SNaman Jain case SOCINFO_VERSION(0, 16): 617f02a5373SNaman Jain qcom_socinfo->info.feature_code = __le32_to_cpu(info->feature_code); 618f02a5373SNaman Jain qcom_socinfo->info.pcode = __le32_to_cpu(info->pcode); 619f02a5373SNaman Jain 620f02a5373SNaman Jain debugfs_create_u32("feature_code", 0444, qcom_socinfo->dbg_root, 621f02a5373SNaman Jain &qcom_socinfo->info.feature_code); 622f02a5373SNaman Jain debugfs_create_u32("pcode", 0444, qcom_socinfo->dbg_root, 623f02a5373SNaman Jain &qcom_socinfo->info.pcode); 624f02a5373SNaman Jain fallthrough; 6250f12fe7fSDmitry Baryshkov case SOCINFO_VERSION(0, 15): 6260f12fe7fSDmitry Baryshkov qcom_socinfo->info.nmodem_supported = __le32_to_cpu(info->nmodem_supported); 6270f12fe7fSDmitry Baryshkov 6288333b2c2SStephen Boyd debugfs_create_u32("nmodem_supported", 0444, qcom_socinfo->dbg_root, 6290f12fe7fSDmitry Baryshkov &qcom_socinfo->info.nmodem_supported); 630df561f66SGustavo A. R. Silva fallthrough; 6310f12fe7fSDmitry Baryshkov case SOCINFO_VERSION(0, 14): 6320f12fe7fSDmitry Baryshkov qcom_socinfo->info.num_clusters = __le32_to_cpu(info->num_clusters); 6330f12fe7fSDmitry Baryshkov qcom_socinfo->info.ncluster_array_offset = __le32_to_cpu(info->ncluster_array_offset); 634d9c2a255SNaman Jain qcom_socinfo->info.num_subset_parts = __le32_to_cpu(info->num_subset_parts); 635d9c2a255SNaman Jain qcom_socinfo->info.nsubset_parts_array_offset = 636d9c2a255SNaman Jain __le32_to_cpu(info->nsubset_parts_array_offset); 6370f12fe7fSDmitry Baryshkov 6388333b2c2SStephen Boyd debugfs_create_u32("num_clusters", 0444, qcom_socinfo->dbg_root, 6390f12fe7fSDmitry Baryshkov &qcom_socinfo->info.num_clusters); 6408333b2c2SStephen Boyd debugfs_create_u32("ncluster_array_offset", 0444, qcom_socinfo->dbg_root, 6410f12fe7fSDmitry Baryshkov &qcom_socinfo->info.ncluster_array_offset); 642d9c2a255SNaman Jain debugfs_create_u32("num_subset_parts", 0444, qcom_socinfo->dbg_root, 643d9c2a255SNaman Jain &qcom_socinfo->info.num_subset_parts); 644d9c2a255SNaman Jain debugfs_create_u32("nsubset_parts_array_offset", 0444, qcom_socinfo->dbg_root, 645d9c2a255SNaman Jain &qcom_socinfo->info.nsubset_parts_array_offset); 646df561f66SGustavo A. R. Silva fallthrough; 6470f12fe7fSDmitry Baryshkov case SOCINFO_VERSION(0, 13): 6480f12fe7fSDmitry Baryshkov qcom_socinfo->info.nproduct_id = __le32_to_cpu(info->nproduct_id); 6490f12fe7fSDmitry Baryshkov 6508333b2c2SStephen Boyd debugfs_create_u32("nproduct_id", 0444, qcom_socinfo->dbg_root, 6510f12fe7fSDmitry Baryshkov &qcom_socinfo->info.nproduct_id); 6520f12fe7fSDmitry Baryshkov DEBUGFS_ADD(info, chip_id); 653df561f66SGustavo A. R. Silva fallthrough; 6549c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 12): 6559c84c1e7SVaishali Thakkar qcom_socinfo->info.chip_family = 6569c84c1e7SVaishali Thakkar __le32_to_cpu(info->chip_family); 6579c84c1e7SVaishali Thakkar qcom_socinfo->info.raw_device_family = 6589c84c1e7SVaishali Thakkar __le32_to_cpu(info->raw_device_family); 6599c84c1e7SVaishali Thakkar qcom_socinfo->info.raw_device_num = 6609c84c1e7SVaishali Thakkar __le32_to_cpu(info->raw_device_num); 6619c84c1e7SVaishali Thakkar 6628333b2c2SStephen Boyd debugfs_create_x32("chip_family", 0444, qcom_socinfo->dbg_root, 6639c84c1e7SVaishali Thakkar &qcom_socinfo->info.chip_family); 6648333b2c2SStephen Boyd debugfs_create_x32("raw_device_family", 0444, 6659c84c1e7SVaishali Thakkar qcom_socinfo->dbg_root, 6669c84c1e7SVaishali Thakkar &qcom_socinfo->info.raw_device_family); 6678333b2c2SStephen Boyd debugfs_create_x32("raw_device_number", 0444, 6689c84c1e7SVaishali Thakkar qcom_socinfo->dbg_root, 6699c84c1e7SVaishali Thakkar &qcom_socinfo->info.raw_device_num); 670df561f66SGustavo A. R. Silva fallthrough; 6719c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 11): 672734c78e7SDmitry Baryshkov num_pmics = le32_to_cpu(info->num_pmics); 673734c78e7SDmitry Baryshkov pmic_array_offset = le32_to_cpu(info->pmic_array_offset); 674734c78e7SDmitry Baryshkov if (pmic_array_offset + 2 * num_pmics * sizeof(u32) <= info_size) 675734c78e7SDmitry Baryshkov DEBUGFS_ADD(info, pmic_model_array); 676734c78e7SDmitry Baryshkov fallthrough; 6779c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 10): 6789c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 9): 6799c84c1e7SVaishali Thakkar qcom_socinfo->info.foundry_id = __le32_to_cpu(info->foundry_id); 6809c84c1e7SVaishali Thakkar 6818333b2c2SStephen Boyd debugfs_create_u32("foundry_id", 0444, qcom_socinfo->dbg_root, 6829c84c1e7SVaishali Thakkar &qcom_socinfo->info.foundry_id); 683df561f66SGustavo A. R. Silva fallthrough; 6849c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 8): 6859c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 7): 6869c84c1e7SVaishali Thakkar DEBUGFS_ADD(info, pmic_model); 6879c84c1e7SVaishali Thakkar DEBUGFS_ADD(info, pmic_die_rev); 688df561f66SGustavo A. R. Silva fallthrough; 6899c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 6): 6909c84c1e7SVaishali Thakkar qcom_socinfo->info.hw_plat_subtype = 6919c84c1e7SVaishali Thakkar __le32_to_cpu(info->hw_plat_subtype); 6929c84c1e7SVaishali Thakkar 6938333b2c2SStephen Boyd debugfs_create_u32("hardware_platform_subtype", 0444, 6949c84c1e7SVaishali Thakkar qcom_socinfo->dbg_root, 6959c84c1e7SVaishali Thakkar &qcom_socinfo->info.hw_plat_subtype); 696df561f66SGustavo A. R. Silva fallthrough; 6979c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 5): 6989c84c1e7SVaishali Thakkar qcom_socinfo->info.accessory_chip = 6999c84c1e7SVaishali Thakkar __le32_to_cpu(info->accessory_chip); 7009c84c1e7SVaishali Thakkar 7018333b2c2SStephen Boyd debugfs_create_u32("accessory_chip", 0444, 7029c84c1e7SVaishali Thakkar qcom_socinfo->dbg_root, 7039c84c1e7SVaishali Thakkar &qcom_socinfo->info.accessory_chip); 704df561f66SGustavo A. R. Silva fallthrough; 7059c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 4): 7069c84c1e7SVaishali Thakkar qcom_socinfo->info.plat_ver = __le32_to_cpu(info->plat_ver); 7079c84c1e7SVaishali Thakkar 7088333b2c2SStephen Boyd debugfs_create_u32("platform_version", 0444, 7099c84c1e7SVaishali Thakkar qcom_socinfo->dbg_root, 7109c84c1e7SVaishali Thakkar &qcom_socinfo->info.plat_ver); 711df561f66SGustavo A. R. Silva fallthrough; 7129c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 3): 7139c84c1e7SVaishali Thakkar qcom_socinfo->info.hw_plat = __le32_to_cpu(info->hw_plat); 7149c84c1e7SVaishali Thakkar 7158333b2c2SStephen Boyd debugfs_create_u32("hardware_platform", 0444, 7169c84c1e7SVaishali Thakkar qcom_socinfo->dbg_root, 7179c84c1e7SVaishali Thakkar &qcom_socinfo->info.hw_plat); 718df561f66SGustavo A. R. Silva fallthrough; 7199c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 2): 7209c84c1e7SVaishali Thakkar qcom_socinfo->info.raw_ver = __le32_to_cpu(info->raw_ver); 7219c84c1e7SVaishali Thakkar 7228333b2c2SStephen Boyd debugfs_create_u32("raw_version", 0444, qcom_socinfo->dbg_root, 7239c84c1e7SVaishali Thakkar &qcom_socinfo->info.raw_ver); 724df561f66SGustavo A. R. Silva fallthrough; 7259c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 1): 7269c84c1e7SVaishali Thakkar DEBUGFS_ADD(info, build_id); 7279c84c1e7SVaishali Thakkar break; 7289c84c1e7SVaishali Thakkar } 729cd23d140SVaishali Thakkar 730cd23d140SVaishali Thakkar versions = qcom_smem_get(QCOM_SMEM_HOST_ANY, SMEM_IMAGE_VERSION_TABLE, 731cd23d140SVaishali Thakkar &size); 732cd23d140SVaishali Thakkar 733cd23d140SVaishali Thakkar for (i = 0; i < ARRAY_SIZE(socinfo_image_names); i++) { 734cd23d140SVaishali Thakkar if (!socinfo_image_names[i]) 735cd23d140SVaishali Thakkar continue; 736cd23d140SVaishali Thakkar 737cd23d140SVaishali Thakkar dentry = debugfs_create_dir(socinfo_image_names[i], 738cd23d140SVaishali Thakkar qcom_socinfo->dbg_root); 7398333b2c2SStephen Boyd debugfs_create_file("name", 0444, dentry, &versions[i], 740cd23d140SVaishali Thakkar &qcom_image_name_ops); 7418333b2c2SStephen Boyd debugfs_create_file("variant", 0444, dentry, &versions[i], 742cd23d140SVaishali Thakkar &qcom_image_variant_ops); 7438333b2c2SStephen Boyd debugfs_create_file("oem", 0444, dentry, &versions[i], 744cd23d140SVaishali Thakkar &qcom_image_oem_ops); 745cd23d140SVaishali Thakkar } 7469c84c1e7SVaishali Thakkar } 7479c84c1e7SVaishali Thakkar 7489c84c1e7SVaishali Thakkar static void socinfo_debugfs_exit(struct qcom_socinfo *qcom_socinfo) 7499c84c1e7SVaishali Thakkar { 7509c84c1e7SVaishali Thakkar debugfs_remove_recursive(qcom_socinfo->dbg_root); 7519c84c1e7SVaishali Thakkar } 7529c84c1e7SVaishali Thakkar #else 7539c84c1e7SVaishali Thakkar static void socinfo_debugfs_init(struct qcom_socinfo *qcom_socinfo, 754734c78e7SDmitry Baryshkov struct socinfo *info, size_t info_size) 7559c84c1e7SVaishali Thakkar { 7569c84c1e7SVaishali Thakkar } 7579c84c1e7SVaishali Thakkar static void socinfo_debugfs_exit(struct qcom_socinfo *qcom_socinfo) { } 7589c84c1e7SVaishali Thakkar #endif /* CONFIG_DEBUG_FS */ 7599c84c1e7SVaishali Thakkar 760efb448d0SImran Khan static int qcom_socinfo_probe(struct platform_device *pdev) 761efb448d0SImran Khan { 762efb448d0SImran Khan struct qcom_socinfo *qs; 763efb448d0SImran Khan struct socinfo *info; 764efb448d0SImran Khan size_t item_size; 765efb448d0SImran Khan 766efb448d0SImran Khan info = qcom_smem_get(QCOM_SMEM_HOST_ANY, SMEM_HW_SW_BUILD_ID, 767efb448d0SImran Khan &item_size); 768efb448d0SImran Khan if (IS_ERR(info)) { 769efb448d0SImran Khan dev_err(&pdev->dev, "Couldn't find socinfo\n"); 770efb448d0SImran Khan return PTR_ERR(info); 771efb448d0SImran Khan } 772efb448d0SImran Khan 773efb448d0SImran Khan qs = devm_kzalloc(&pdev->dev, sizeof(*qs), GFP_KERNEL); 774efb448d0SImran Khan if (!qs) 775efb448d0SImran Khan return -ENOMEM; 776efb448d0SImran Khan 777efb448d0SImran Khan qs->attr.family = "Snapdragon"; 778efb448d0SImran Khan qs->attr.machine = socinfo_machine(&pdev->dev, 779efb448d0SImran Khan le32_to_cpu(info->id)); 78027a34413SSrinivas Kandagatla qs->attr.soc_id = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%u", 78127a34413SSrinivas Kandagatla le32_to_cpu(info->id)); 782efb448d0SImran Khan qs->attr.revision = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%u.%u", 783efb448d0SImran Khan SOCINFO_MAJOR(le32_to_cpu(info->ver)), 784efb448d0SImran Khan SOCINFO_MINOR(le32_to_cpu(info->ver))); 785efb448d0SImran Khan if (offsetof(struct socinfo, serial_num) <= item_size) 786efb448d0SImran Khan qs->attr.serial_number = devm_kasprintf(&pdev->dev, GFP_KERNEL, 787efb448d0SImran Khan "%u", 788efb448d0SImran Khan le32_to_cpu(info->serial_num)); 789efb448d0SImran Khan 790efb448d0SImran Khan qs->soc_dev = soc_device_register(&qs->attr); 791efb448d0SImran Khan if (IS_ERR(qs->soc_dev)) 792efb448d0SImran Khan return PTR_ERR(qs->soc_dev); 793efb448d0SImran Khan 794734c78e7SDmitry Baryshkov socinfo_debugfs_init(qs, info, item_size); 7959c84c1e7SVaishali Thakkar 796efb448d0SImran Khan /* Feed the soc specific unique data into entropy pool */ 797efb448d0SImran Khan add_device_randomness(info, item_size); 798efb448d0SImran Khan 7999c5a4ec6SAntonio Martorana platform_set_drvdata(pdev, qs); 800efb448d0SImran Khan 801efb448d0SImran Khan return 0; 802efb448d0SImran Khan } 803efb448d0SImran Khan 804c0989f7dSUwe Kleine-König static void qcom_socinfo_remove(struct platform_device *pdev) 805efb448d0SImran Khan { 806efb448d0SImran Khan struct qcom_socinfo *qs = platform_get_drvdata(pdev); 807efb448d0SImran Khan 808efb448d0SImran Khan soc_device_unregister(qs->soc_dev); 809efb448d0SImran Khan 8109c84c1e7SVaishali Thakkar socinfo_debugfs_exit(qs); 811efb448d0SImran Khan } 812efb448d0SImran Khan 813efb448d0SImran Khan static struct platform_driver qcom_socinfo_driver = { 814efb448d0SImran Khan .probe = qcom_socinfo_probe, 815c0989f7dSUwe Kleine-König .remove_new = qcom_socinfo_remove, 816efb448d0SImran Khan .driver = { 817efb448d0SImran Khan .name = "qcom-socinfo", 818efb448d0SImran Khan }, 819efb448d0SImran Khan }; 820efb448d0SImran Khan 821efb448d0SImran Khan module_platform_driver(qcom_socinfo_driver); 822efb448d0SImran Khan 823efb448d0SImran Khan MODULE_DESCRIPTION("Qualcomm SoCinfo driver"); 824efb448d0SImran Khan MODULE_LICENSE("GPL v2"); 825efb448d0SImran Khan MODULE_ALIAS("platform:qcom-socinfo"); 826