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> 14efb448d0SImran Khan #include <linux/string.h> 1534ec89e6SKrzysztof Kozlowski #include <linux/stringify.h> 16efb448d0SImran Khan #include <linux/sys_soc.h> 17efb448d0SImran Khan #include <linux/types.h> 18efb448d0SImran Khan 19734c78e7SDmitry Baryshkov #include <asm/unaligned.h> 20734c78e7SDmitry Baryshkov 2134ec89e6SKrzysztof Kozlowski #include <dt-bindings/arm/qcom,ids.h> 2234ec89e6SKrzysztof Kozlowski 23efb448d0SImran Khan /* 24efb448d0SImran Khan * SoC version type with major number in the upper 16 bits and minor 25efb448d0SImran Khan * number in the lower 16 bits. 26efb448d0SImran Khan */ 27efb448d0SImran Khan #define SOCINFO_MAJOR(ver) (((ver) >> 16) & 0xffff) 28efb448d0SImran Khan #define SOCINFO_MINOR(ver) ((ver) & 0xffff) 299c84c1e7SVaishali Thakkar #define SOCINFO_VERSION(maj, min) ((((maj) & 0xffff) << 16)|((min) & 0xffff)) 30efb448d0SImran Khan 3134ec89e6SKrzysztof Kozlowski /* Helper macros to create soc_id table */ 3234ec89e6SKrzysztof Kozlowski #define qcom_board_id(id) QCOM_ID_ ## id, __stringify(id) 3334ec89e6SKrzysztof Kozlowski #define qcom_board_id_named(id, name) QCOM_ID_ ## id, (name) 3434ec89e6SKrzysztof Kozlowski 35efb448d0SImran Khan #define SMEM_SOCINFO_BUILD_ID_LENGTH 32 360f12fe7fSDmitry Baryshkov #define SMEM_SOCINFO_CHIP_ID_LENGTH 32 37efb448d0SImran Khan 38efb448d0SImran Khan /* 39efb448d0SImran Khan * SMEM item id, used to acquire handles to respective 40efb448d0SImran Khan * SMEM region. 41efb448d0SImran Khan */ 42efb448d0SImran Khan #define SMEM_HW_SW_BUILD_ID 137 43efb448d0SImran Khan 449c84c1e7SVaishali Thakkar #ifdef CONFIG_DEBUG_FS 45cd23d140SVaishali Thakkar #define SMEM_IMAGE_VERSION_BLOCKS_COUNT 32 46cd23d140SVaishali Thakkar #define SMEM_IMAGE_VERSION_SIZE 4096 47cd23d140SVaishali Thakkar #define SMEM_IMAGE_VERSION_NAME_SIZE 75 48cd23d140SVaishali Thakkar #define SMEM_IMAGE_VERSION_VARIANT_SIZE 20 49cd23d140SVaishali Thakkar #define SMEM_IMAGE_VERSION_OEM_SIZE 32 50cd23d140SVaishali Thakkar 51cd23d140SVaishali Thakkar /* 52cd23d140SVaishali Thakkar * SMEM Image table indices 53cd23d140SVaishali Thakkar */ 54cd23d140SVaishali Thakkar #define SMEM_IMAGE_TABLE_BOOT_INDEX 0 55cd23d140SVaishali Thakkar #define SMEM_IMAGE_TABLE_TZ_INDEX 1 56cd23d140SVaishali Thakkar #define SMEM_IMAGE_TABLE_RPM_INDEX 3 57cd23d140SVaishali Thakkar #define SMEM_IMAGE_TABLE_APPS_INDEX 10 58cd23d140SVaishali Thakkar #define SMEM_IMAGE_TABLE_MPSS_INDEX 11 59cd23d140SVaishali Thakkar #define SMEM_IMAGE_TABLE_ADSP_INDEX 12 60cd23d140SVaishali Thakkar #define SMEM_IMAGE_TABLE_CNSS_INDEX 13 61cd23d140SVaishali Thakkar #define SMEM_IMAGE_TABLE_VIDEO_INDEX 14 62cd23d140SVaishali Thakkar #define SMEM_IMAGE_VERSION_TABLE 469 63cd23d140SVaishali Thakkar 64cd23d140SVaishali Thakkar /* 65cd23d140SVaishali Thakkar * SMEM Image table names 66cd23d140SVaishali Thakkar */ 67cd23d140SVaishali Thakkar static const char *const socinfo_image_names[] = { 68cd23d140SVaishali Thakkar [SMEM_IMAGE_TABLE_ADSP_INDEX] = "adsp", 69cd23d140SVaishali Thakkar [SMEM_IMAGE_TABLE_APPS_INDEX] = "apps", 70cd23d140SVaishali Thakkar [SMEM_IMAGE_TABLE_BOOT_INDEX] = "boot", 71cd23d140SVaishali Thakkar [SMEM_IMAGE_TABLE_CNSS_INDEX] = "cnss", 72cd23d140SVaishali Thakkar [SMEM_IMAGE_TABLE_MPSS_INDEX] = "mpss", 73cd23d140SVaishali Thakkar [SMEM_IMAGE_TABLE_RPM_INDEX] = "rpm", 74cd23d140SVaishali Thakkar [SMEM_IMAGE_TABLE_TZ_INDEX] = "tz", 75cd23d140SVaishali Thakkar [SMEM_IMAGE_TABLE_VIDEO_INDEX] = "video", 76cd23d140SVaishali Thakkar }; 77cd23d140SVaishali Thakkar 789c84c1e7SVaishali Thakkar static const char *const pmic_models[] = { 799c84c1e7SVaishali Thakkar [0] = "Unknown PMIC model", 807fda2b0bSLuca Weiss [1] = "PM8941", 817fda2b0bSLuca Weiss [2] = "PM8841", 827fda2b0bSLuca Weiss [3] = "PM8019", 837fda2b0bSLuca Weiss [4] = "PM8226", 847fda2b0bSLuca Weiss [5] = "PM8110", 857fda2b0bSLuca Weiss [6] = "PMA8084", 867fda2b0bSLuca Weiss [7] = "PMI8962", 877fda2b0bSLuca Weiss [8] = "PMD9635", 889c84c1e7SVaishali Thakkar [9] = "PM8994", 897fda2b0bSLuca Weiss [10] = "PMI8994", 909c84c1e7SVaishali Thakkar [11] = "PM8916", 917fda2b0bSLuca Weiss [12] = "PM8004", 927fda2b0bSLuca Weiss [13] = "PM8909/PM8058", 939c84c1e7SVaishali Thakkar [14] = "PM8028", 949c84c1e7SVaishali Thakkar [15] = "PM8901", 957fda2b0bSLuca Weiss [16] = "PM8950/PM8027", 967fda2b0bSLuca Weiss [17] = "PMI8950/ISL9519", 972fae3eccSDmitry Baryshkov [18] = "PMK8001/PM8921", 982fae3eccSDmitry Baryshkov [19] = "PMI8996/PM8018", 997fda2b0bSLuca Weiss [20] = "PM8998/PM8015", 1007fda2b0bSLuca Weiss [21] = "PMI8998/PM8014", 1019c84c1e7SVaishali Thakkar [22] = "PM8821", 1029c84c1e7SVaishali Thakkar [23] = "PM8038", 1037fda2b0bSLuca Weiss [24] = "PM8005/PM8922", 1049c84c1e7SVaishali Thakkar [25] = "PM8917", 1057fda2b0bSLuca Weiss [26] = "PM660L", 1067fda2b0bSLuca Weiss [27] = "PM660", 10743053242SDmitry Baryshkov [30] = "PM8150", 10843053242SDmitry Baryshkov [31] = "PM8150L", 10943053242SDmitry Baryshkov [32] = "PM8150B", 11043053242SDmitry Baryshkov [33] = "PMK8002", 11143053242SDmitry Baryshkov [36] = "PM8009", 112112d96fdSKonrad Dybcio [37] = "PMI632", 11387fd343cSBjorn Andersson [38] = "PM8150C", 114112d96fdSKonrad Dybcio [40] = "PM6150", 11587fd343cSBjorn Andersson [41] = "SMB2351", 116112d96fdSKonrad Dybcio [44] = "PM8008", 1175257841aSKonrad Dybcio [45] = "PM6125", 118112d96fdSKonrad Dybcio [46] = "PM7250B", 11976ee15aeSBjorn Andersson [47] = "PMK8350", 12076ee15aeSBjorn Andersson [48] = "PM8350", 12176ee15aeSBjorn Andersson [49] = "PM8350C", 12276ee15aeSBjorn Andersson [50] = "PM8350B", 12376ee15aeSBjorn Andersson [51] = "PMR735A", 12476ee15aeSBjorn Andersson [52] = "PMR735B", 125112d96fdSKonrad Dybcio [55] = "PM2250", 12676ee15aeSBjorn Andersson [58] = "PM8450", 12776ee15aeSBjorn Andersson [65] = "PM8010", 1289c84c1e7SVaishali Thakkar }; 1299c84c1e7SVaishali Thakkar #endif /* CONFIG_DEBUG_FS */ 1309c84c1e7SVaishali Thakkar 131efb448d0SImran Khan /* Socinfo SMEM item structure */ 132efb448d0SImran Khan struct socinfo { 133efb448d0SImran Khan __le32 fmt; 134efb448d0SImran Khan __le32 id; 135efb448d0SImran Khan __le32 ver; 136efb448d0SImran Khan char build_id[SMEM_SOCINFO_BUILD_ID_LENGTH]; 137efb448d0SImran Khan /* Version 2 */ 138efb448d0SImran Khan __le32 raw_id; 139efb448d0SImran Khan __le32 raw_ver; 140efb448d0SImran Khan /* Version 3 */ 141efb448d0SImran Khan __le32 hw_plat; 142efb448d0SImran Khan /* Version 4 */ 143efb448d0SImran Khan __le32 plat_ver; 144efb448d0SImran Khan /* Version 5 */ 145efb448d0SImran Khan __le32 accessory_chip; 146efb448d0SImran Khan /* Version 6 */ 147efb448d0SImran Khan __le32 hw_plat_subtype; 148efb448d0SImran Khan /* Version 7 */ 149efb448d0SImran Khan __le32 pmic_model; 150efb448d0SImran Khan __le32 pmic_die_rev; 151efb448d0SImran Khan /* Version 8 */ 152efb448d0SImran Khan __le32 pmic_model_1; 153efb448d0SImran Khan __le32 pmic_die_rev_1; 154efb448d0SImran Khan __le32 pmic_model_2; 155efb448d0SImran Khan __le32 pmic_die_rev_2; 156efb448d0SImran Khan /* Version 9 */ 157efb448d0SImran Khan __le32 foundry_id; 158efb448d0SImran Khan /* Version 10 */ 159efb448d0SImran Khan __le32 serial_num; 160efb448d0SImran Khan /* Version 11 */ 161efb448d0SImran Khan __le32 num_pmics; 162efb448d0SImran Khan __le32 pmic_array_offset; 163efb448d0SImran Khan /* Version 12 */ 164efb448d0SImran Khan __le32 chip_family; 165efb448d0SImran Khan __le32 raw_device_family; 166efb448d0SImran Khan __le32 raw_device_num; 1670f12fe7fSDmitry Baryshkov /* Version 13 */ 1680f12fe7fSDmitry Baryshkov __le32 nproduct_id; 1690f12fe7fSDmitry Baryshkov char chip_id[SMEM_SOCINFO_CHIP_ID_LENGTH]; 1700f12fe7fSDmitry Baryshkov /* Version 14 */ 1710f12fe7fSDmitry Baryshkov __le32 num_clusters; 1720f12fe7fSDmitry Baryshkov __le32 ncluster_array_offset; 1730f12fe7fSDmitry Baryshkov __le32 num_defective_parts; 1740f12fe7fSDmitry Baryshkov __le32 ndefective_parts_array_offset; 1750f12fe7fSDmitry Baryshkov /* Version 15 */ 1760f12fe7fSDmitry Baryshkov __le32 nmodem_supported; 177f02a5373SNaman Jain /* Version 16 */ 178f02a5373SNaman Jain __le32 feature_code; 179f02a5373SNaman Jain __le32 pcode; 180f02a5373SNaman Jain __le32 npartnamemap_offset; 181f02a5373SNaman Jain __le32 nnum_partname_mapping; 1826bdab60dSNaman Jain /* Version 17 */ 1836bdab60dSNaman Jain __le32 oem_variant; 184efb448d0SImran Khan }; 185efb448d0SImran Khan 1869c84c1e7SVaishali Thakkar #ifdef CONFIG_DEBUG_FS 1879c84c1e7SVaishali Thakkar struct socinfo_params { 1889c84c1e7SVaishali Thakkar u32 raw_device_family; 1899c84c1e7SVaishali Thakkar u32 hw_plat_subtype; 1909c84c1e7SVaishali Thakkar u32 accessory_chip; 1919c84c1e7SVaishali Thakkar u32 raw_device_num; 1929c84c1e7SVaishali Thakkar u32 chip_family; 1939c84c1e7SVaishali Thakkar u32 foundry_id; 1949c84c1e7SVaishali Thakkar u32 plat_ver; 1959c84c1e7SVaishali Thakkar u32 raw_ver; 1969c84c1e7SVaishali Thakkar u32 hw_plat; 1979c84c1e7SVaishali Thakkar u32 fmt; 1980f12fe7fSDmitry Baryshkov u32 nproduct_id; 1990f12fe7fSDmitry Baryshkov u32 num_clusters; 2000f12fe7fSDmitry Baryshkov u32 ncluster_array_offset; 2010f12fe7fSDmitry Baryshkov u32 num_defective_parts; 2020f12fe7fSDmitry Baryshkov u32 ndefective_parts_array_offset; 2030f12fe7fSDmitry Baryshkov u32 nmodem_supported; 204f02a5373SNaman Jain u32 feature_code; 205f02a5373SNaman Jain u32 pcode; 2066bdab60dSNaman Jain u32 oem_variant; 2079c84c1e7SVaishali Thakkar }; 208cd23d140SVaishali Thakkar 209cd23d140SVaishali Thakkar struct smem_image_version { 210cd23d140SVaishali Thakkar char name[SMEM_IMAGE_VERSION_NAME_SIZE]; 211cd23d140SVaishali Thakkar char variant[SMEM_IMAGE_VERSION_VARIANT_SIZE]; 212cd23d140SVaishali Thakkar char pad; 213cd23d140SVaishali Thakkar char oem[SMEM_IMAGE_VERSION_OEM_SIZE]; 214cd23d140SVaishali Thakkar }; 2159c84c1e7SVaishali Thakkar #endif /* CONFIG_DEBUG_FS */ 2169c84c1e7SVaishali Thakkar 217efb448d0SImran Khan struct qcom_socinfo { 218efb448d0SImran Khan struct soc_device *soc_dev; 219efb448d0SImran Khan struct soc_device_attribute attr; 2209c84c1e7SVaishali Thakkar #ifdef CONFIG_DEBUG_FS 2219c84c1e7SVaishali Thakkar struct dentry *dbg_root; 2229c84c1e7SVaishali Thakkar struct socinfo_params info; 2239c84c1e7SVaishali Thakkar #endif /* CONFIG_DEBUG_FS */ 224efb448d0SImran Khan }; 225efb448d0SImran Khan 226efb448d0SImran Khan struct soc_id { 227efb448d0SImran Khan unsigned int id; 228efb448d0SImran Khan const char *name; 229efb448d0SImran Khan }; 230efb448d0SImran Khan 231efb448d0SImran Khan static const struct soc_id soc_id[] = { 23240017cebSStephan Gerhold { qcom_board_id(MSM8260) }, 23340017cebSStephan Gerhold { qcom_board_id(MSM8660) }, 23440017cebSStephan Gerhold { qcom_board_id(APQ8060) }, 23534ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8960) }, 23634ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8064) }, 23740017cebSStephan Gerhold { qcom_board_id(MSM8930) }, 23840017cebSStephan Gerhold { qcom_board_id(MSM8630) }, 23940017cebSStephan Gerhold { qcom_board_id(MSM8230) }, 24040017cebSStephan Gerhold { qcom_board_id(APQ8030) }, 24140017cebSStephan Gerhold { qcom_board_id(MSM8627) }, 24240017cebSStephan Gerhold { qcom_board_id(MSM8227) }, 24334ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8660A) }, 24434ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8260A) }, 24534ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8060A) }, 24634ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8974) }, 24740017cebSStephan Gerhold { qcom_board_id(MSM8225) }, 24840017cebSStephan Gerhold { qcom_board_id(MSM8625) }, 24934ec89e6SKrzysztof Kozlowski { qcom_board_id(MPQ8064) }, 25034ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8960AB) }, 25134ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8060AB) }, 25234ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8260AB) }, 25334ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8660AB) }, 25440017cebSStephan Gerhold { qcom_board_id(MSM8930AA) }, 25540017cebSStephan Gerhold { qcom_board_id(MSM8630AA) }, 25640017cebSStephan Gerhold { qcom_board_id(MSM8230AA) }, 25734ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8626) }, 25834ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8610) }, 25934ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8064AB) }, 26040017cebSStephan Gerhold { qcom_board_id(MSM8930AB) }, 26140017cebSStephan Gerhold { qcom_board_id(MSM8630AB) }, 26240017cebSStephan Gerhold { qcom_board_id(MSM8230AB) }, 26340017cebSStephan Gerhold { qcom_board_id(APQ8030AB) }, 26434ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8226) }, 26534ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8526) }, 26640017cebSStephan Gerhold { qcom_board_id(APQ8030AA) }, 26734ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8110) }, 26834ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8210) }, 26934ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8810) }, 27034ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8212) }, 27134ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8612) }, 27234ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8112) }, 27340017cebSStephan Gerhold { qcom_board_id(MSM8125) }, 27434ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8225Q) }, 27534ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8625Q) }, 27634ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8125Q) }, 27734ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8064AA) }, 27834ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8084) }, 27940017cebSStephan Gerhold { qcom_board_id(MSM8130) }, 28040017cebSStephan Gerhold { qcom_board_id(MSM8130AA) }, 28140017cebSStephan Gerhold { qcom_board_id(MSM8130AB) }, 28240017cebSStephan Gerhold { qcom_board_id(MSM8627AA) }, 28340017cebSStephan Gerhold { qcom_board_id(MSM8227AA) }, 28434ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8074) }, 28534ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8274) }, 28634ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8674) }, 28740017cebSStephan Gerhold { qcom_board_id(MDM9635) }, 28834ec89e6SKrzysztof Kozlowski { qcom_board_id_named(MSM8974PRO_AC, "MSM8974PRO-AC") }, 28934ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8126) }, 29034ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8026) }, 29134ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8926) }, 29279802479SChristian Marangi { qcom_board_id(IPQ8062) }, 29379802479SChristian Marangi { qcom_board_id(IPQ8064) }, 29479802479SChristian Marangi { qcom_board_id(IPQ8066) }, 29579802479SChristian Marangi { qcom_board_id(IPQ8068) }, 29634ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8326) }, 29734ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8916) }, 29834ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8994) }, 29934ec89e6SKrzysztof Kozlowski { qcom_board_id_named(APQ8074PRO_AA, "APQ8074PRO-AA") }, 30034ec89e6SKrzysztof Kozlowski { qcom_board_id_named(APQ8074PRO_AB, "APQ8074PRO-AB") }, 30134ec89e6SKrzysztof Kozlowski { qcom_board_id_named(APQ8074PRO_AC, "APQ8074PRO-AC") }, 30234ec89e6SKrzysztof Kozlowski { qcom_board_id_named(MSM8274PRO_AA, "MSM8274PRO-AA") }, 30334ec89e6SKrzysztof Kozlowski { qcom_board_id_named(MSM8274PRO_AB, "MSM8274PRO-AB") }, 30434ec89e6SKrzysztof Kozlowski { qcom_board_id_named(MSM8274PRO_AC, "MSM8274PRO-AC") }, 30534ec89e6SKrzysztof Kozlowski { qcom_board_id_named(MSM8674PRO_AA, "MSM8674PRO-AA") }, 30634ec89e6SKrzysztof Kozlowski { qcom_board_id_named(MSM8674PRO_AB, "MSM8674PRO-AB") }, 30734ec89e6SKrzysztof Kozlowski { qcom_board_id_named(MSM8674PRO_AC, "MSM8674PRO-AC") }, 30834ec89e6SKrzysztof Kozlowski { qcom_board_id_named(MSM8974PRO_AA, "MSM8974PRO-AA") }, 30934ec89e6SKrzysztof Kozlowski { qcom_board_id_named(MSM8974PRO_AB, "MSM8974PRO-AB") }, 31034ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8028) }, 31134ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8128) }, 31234ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8228) }, 31334ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8528) }, 31434ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8628) }, 31534ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8928) }, 31634ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8510) }, 31734ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8512) }, 31834ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8936) }, 31940017cebSStephan Gerhold { qcom_board_id(MDM9640) }, 32034ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8939) }, 32134ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8036) }, 32234ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8039) }, 32340017cebSStephan Gerhold { qcom_board_id(MSM8236) }, 32440017cebSStephan Gerhold { qcom_board_id(MSM8636) }, 32540017cebSStephan Gerhold { qcom_board_id(MSM8909) }, 32634ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8996) }, 32734ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8016) }, 32834ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8216) }, 32934ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8116) }, 33034ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8616) }, 33134ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8992) }, 33240017cebSStephan Gerhold { qcom_board_id(APQ8092) }, 33334ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8094) }, 33440017cebSStephan Gerhold { qcom_board_id(MSM8209) }, 33540017cebSStephan Gerhold { qcom_board_id(MSM8208) }, 33640017cebSStephan Gerhold { qcom_board_id(MDM9209) }, 33740017cebSStephan Gerhold { qcom_board_id(MDM9309) }, 33840017cebSStephan Gerhold { qcom_board_id(MDM9609) }, 33940017cebSStephan Gerhold { qcom_board_id(MSM8239) }, 34040017cebSStephan Gerhold { qcom_board_id(MSM8952) }, 34140017cebSStephan Gerhold { qcom_board_id(APQ8009) }, 342017a7c11SStephan Gerhold { qcom_board_id(MSM8956) }, 34340017cebSStephan Gerhold { qcom_board_id(MSM8929) }, 34440017cebSStephan Gerhold { qcom_board_id(MSM8629) }, 34540017cebSStephan Gerhold { qcom_board_id(MSM8229) }, 34640017cebSStephan Gerhold { qcom_board_id(APQ8029) }, 34740017cebSStephan Gerhold { qcom_board_id(APQ8056) }, 34840017cebSStephan Gerhold { qcom_board_id(MSM8609) }, 34940017cebSStephan Gerhold { qcom_board_id(APQ8076) }, 350017a7c11SStephan Gerhold { qcom_board_id(MSM8976) }, 35179802479SChristian Marangi { qcom_board_id(IPQ8065) }, 35279802479SChristian Marangi { qcom_board_id(IPQ8069) }, 35340017cebSStephan Gerhold { qcom_board_id(MDM9650) }, 35440017cebSStephan Gerhold { qcom_board_id(MDM9655) }, 35540017cebSStephan Gerhold { qcom_board_id(MDM9250) }, 35640017cebSStephan Gerhold { qcom_board_id(MDM9255) }, 35740017cebSStephan Gerhold { qcom_board_id(MDM9350) }, 35840017cebSStephan Gerhold { qcom_board_id(APQ8052) }, 35934ec89e6SKrzysztof Kozlowski { qcom_board_id(MDM9607) }, 36034ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8096) }, 36134ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8998) }, 36234ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8953) }, 36340017cebSStephan Gerhold { qcom_board_id(MSM8937) }, 36440017cebSStephan Gerhold { qcom_board_id(APQ8037) }, 36534ec89e6SKrzysztof Kozlowski { qcom_board_id(MDM8207) }, 36634ec89e6SKrzysztof Kozlowski { qcom_board_id(MDM9207) }, 36734ec89e6SKrzysztof Kozlowski { qcom_board_id(MDM9307) }, 36834ec89e6SKrzysztof Kozlowski { qcom_board_id(MDM9628) }, 36940017cebSStephan Gerhold { qcom_board_id(MSM8909W) }, 37040017cebSStephan Gerhold { qcom_board_id(APQ8009W) }, 37140017cebSStephan Gerhold { qcom_board_id(MSM8996L) }, 37240017cebSStephan Gerhold { qcom_board_id(MSM8917) }, 37334ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8053) }, 37434ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8996SG) }, 37540017cebSStephan Gerhold { qcom_board_id(APQ8017) }, 37640017cebSStephan Gerhold { qcom_board_id(MSM8217) }, 37740017cebSStephan Gerhold { qcom_board_id(MSM8617) }, 37834ec89e6SKrzysztof Kozlowski { qcom_board_id(MSM8996AU) }, 37934ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8096AU) }, 38034ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8096SG) }, 38140017cebSStephan Gerhold { qcom_board_id(MSM8940) }, 38240017cebSStephan Gerhold { qcom_board_id(SDX201) }, 38334ec89e6SKrzysztof Kozlowski { qcom_board_id(SDM660) }, 38434ec89e6SKrzysztof Kozlowski { qcom_board_id(SDM630) }, 38534ec89e6SKrzysztof Kozlowski { qcom_board_id(APQ8098) }, 38640017cebSStephan Gerhold { qcom_board_id(MSM8920) }, 38734ec89e6SKrzysztof Kozlowski { qcom_board_id(SDM845) }, 38834ec89e6SKrzysztof Kozlowski { qcom_board_id(MDM9206) }, 38934ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8074) }, 39034ec89e6SKrzysztof Kozlowski { qcom_board_id(SDA660) }, 39134ec89e6SKrzysztof Kozlowski { qcom_board_id(SDM658) }, 39234ec89e6SKrzysztof Kozlowski { qcom_board_id(SDA658) }, 39334ec89e6SKrzysztof Kozlowski { qcom_board_id(SDA630) }, 39440017cebSStephan Gerhold { qcom_board_id(MSM8905) }, 39540017cebSStephan Gerhold { qcom_board_id(SDX202) }, 39634ec89e6SKrzysztof Kozlowski { qcom_board_id(SDM450) }, 397911eed82SBhupesh Sharma { qcom_board_id(SM8150) }, 39834ec89e6SKrzysztof Kozlowski { qcom_board_id(SDA845) }, 39934ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8072) }, 40034ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8076) }, 40134ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8078) }, 40234ec89e6SKrzysztof Kozlowski { qcom_board_id(SDM636) }, 40334ec89e6SKrzysztof Kozlowski { qcom_board_id(SDA636) }, 40434ec89e6SKrzysztof Kozlowski { qcom_board_id(SDM632) }, 40534ec89e6SKrzysztof Kozlowski { qcom_board_id(SDA632) }, 40634ec89e6SKrzysztof Kozlowski { qcom_board_id(SDA450) }, 40740017cebSStephan Gerhold { qcom_board_id(SDM439) }, 40840017cebSStephan Gerhold { qcom_board_id(SDM429) }, 40934ec89e6SKrzysztof Kozlowski { qcom_board_id(SM8250) }, 410911eed82SBhupesh Sharma { qcom_board_id(SA8155) }, 41140017cebSStephan Gerhold { qcom_board_id(SDA439) }, 41240017cebSStephan Gerhold { qcom_board_id(SDA429) }, 413bad8cdc2SDavid Wronek { qcom_board_id(SM7150) }, 41434ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8070) }, 41534ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8071) }, 41640017cebSStephan Gerhold { qcom_board_id(QM215) }, 41734ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8072A) }, 41834ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8074A) }, 41934ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8076A) }, 42034ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8078A) }, 42134ec89e6SKrzysztof Kozlowski { qcom_board_id(SM6125) }, 42234ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8070A) }, 42334ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ8071A) }, 42434ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ6018) }, 42534ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ6028) }, 42640017cebSStephan Gerhold { qcom_board_id(SDM429W) }, 427f33ca7ecSBhupesh Sharma { qcom_board_id(SM4250) }, 42834ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ6000) }, 42934ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ6010) }, 43034ec89e6SKrzysztof Kozlowski { qcom_board_id(SC7180) }, 43134ec89e6SKrzysztof Kozlowski { qcom_board_id(SM6350) }, 43240017cebSStephan Gerhold { qcom_board_id(QCM2150) }, 43340017cebSStephan Gerhold { qcom_board_id(SDA429W) }, 43434ec89e6SKrzysztof Kozlowski { qcom_board_id(SM8350) }, 43518290c2eSKonrad Dybcio { qcom_board_id(QCM2290) }, 436f33ca7ecSBhupesh Sharma { qcom_board_id(SM6115) }, 4370369a590SRobert Marko { qcom_board_id(IPQ5010) }, 4380369a590SRobert Marko { qcom_board_id(IPQ5018) }, 4390369a590SRobert Marko { qcom_board_id(IPQ5028) }, 44034ec89e6SKrzysztof Kozlowski { qcom_board_id(SC8280XP) }, 44134ec89e6SKrzysztof Kozlowski { qcom_board_id(IPQ6005) }, 44234ec89e6SKrzysztof Kozlowski { qcom_board_id(QRB5165) }, 44334ec89e6SKrzysztof Kozlowski { qcom_board_id(SM8450) }, 44434ec89e6SKrzysztof Kozlowski { qcom_board_id(SM7225) }, 44534ec89e6SKrzysztof Kozlowski { qcom_board_id(SA8295P) }, 44634ec89e6SKrzysztof Kozlowski { qcom_board_id(SA8540P) }, 447f33ca7ecSBhupesh Sharma { qcom_board_id(QCM4290) }, 448f33ca7ecSBhupesh Sharma { qcom_board_id(QCS4290) }, 44934ec89e6SKrzysztof Kozlowski { qcom_board_id_named(SM8450_2, "SM8450") }, 45034ec89e6SKrzysztof Kozlowski { qcom_board_id_named(SM8450_3, "SM8450") }, 45134ec89e6SKrzysztof Kozlowski { qcom_board_id(SC7280) }, 45234ec89e6SKrzysztof Kozlowski { qcom_board_id(SC7180P) }, 4530369a590SRobert Marko { qcom_board_id(IPQ5000) }, 4540369a590SRobert Marko { qcom_board_id(IPQ0509) }, 4550369a590SRobert Marko { qcom_board_id(IPQ0518) }, 45634ec89e6SKrzysztof Kozlowski { qcom_board_id(SM6375) }, 457c6653d8fSVaradarajan Narayanan { qcom_board_id(IPQ9514) }, 458c6653d8fSVaradarajan Narayanan { qcom_board_id(IPQ9550) }, 459c6653d8fSVaradarajan Narayanan { qcom_board_id(IPQ9554) }, 460c6653d8fSVaradarajan Narayanan { qcom_board_id(IPQ9570) }, 461c6653d8fSVaradarajan Narayanan { qcom_board_id(IPQ9574) }, 462017a7c11SStephan Gerhold { qcom_board_id(SM8550) }, 4630369a590SRobert Marko { qcom_board_id(IPQ5016) }, 464c6653d8fSVaradarajan Narayanan { qcom_board_id(IPQ9510) }, 465a11bc4a5SBhupesh Sharma { qcom_board_id(QRB4210) }, 46618290c2eSKonrad Dybcio { qcom_board_id(QRB2210) }, 4677fa9c5fcSBartosz Golaszewski { qcom_board_id(SA8775P) }, 468759dcdf2SMelody Olvera { qcom_board_id(QRU1000) }, 469759dcdf2SMelody Olvera { qcom_board_id(QDU1000) }, 470759dcdf2SMelody Olvera { qcom_board_id(QDU1010) }, 4710369a590SRobert Marko { qcom_board_id(IPQ5019) }, 472759dcdf2SMelody Olvera { qcom_board_id(QRU1032) }, 473759dcdf2SMelody Olvera { qcom_board_id(QRU1052) }, 474759dcdf2SMelody Olvera { qcom_board_id(QRU1062) }, 475b0bc8c89SKathiravan T { qcom_board_id(IPQ5332) }, 476b0bc8c89SKathiravan T { qcom_board_id(IPQ5322) }, 477*7f6e0028SKathiravan T { qcom_board_id(IPQ5312) }, 478*7f6e0028SKathiravan T { qcom_board_id(IPQ5302) }, 479efb448d0SImran Khan }; 480efb448d0SImran Khan 481efb448d0SImran Khan static const char *socinfo_machine(struct device *dev, unsigned int id) 482efb448d0SImran Khan { 483efb448d0SImran Khan int idx; 484efb448d0SImran Khan 485efb448d0SImran Khan for (idx = 0; idx < ARRAY_SIZE(soc_id); idx++) { 486efb448d0SImran Khan if (soc_id[idx].id == id) 487efb448d0SImran Khan return soc_id[idx].name; 488efb448d0SImran Khan } 489efb448d0SImran Khan 490efb448d0SImran Khan return NULL; 491efb448d0SImran Khan } 492efb448d0SImran Khan 4939c84c1e7SVaishali Thakkar #ifdef CONFIG_DEBUG_FS 4949c84c1e7SVaishali Thakkar 4959c84c1e7SVaishali Thakkar #define QCOM_OPEN(name, _func) \ 4969c84c1e7SVaishali Thakkar static int qcom_open_##name(struct inode *inode, struct file *file) \ 4979c84c1e7SVaishali Thakkar { \ 4989c84c1e7SVaishali Thakkar return single_open(file, _func, inode->i_private); \ 4999c84c1e7SVaishali Thakkar } \ 5009c84c1e7SVaishali Thakkar \ 5019c84c1e7SVaishali Thakkar static const struct file_operations qcom_ ##name## _ops = { \ 5029c84c1e7SVaishali Thakkar .open = qcom_open_##name, \ 5039c84c1e7SVaishali Thakkar .read = seq_read, \ 5049c84c1e7SVaishali Thakkar .llseek = seq_lseek, \ 5059c84c1e7SVaishali Thakkar .release = single_release, \ 5069c84c1e7SVaishali Thakkar } 5079c84c1e7SVaishali Thakkar 5089c84c1e7SVaishali Thakkar #define DEBUGFS_ADD(info, name) \ 5098333b2c2SStephen Boyd debugfs_create_file(__stringify(name), 0444, \ 5109c84c1e7SVaishali Thakkar qcom_socinfo->dbg_root, \ 5119c84c1e7SVaishali Thakkar info, &qcom_ ##name## _ops) 5129c84c1e7SVaishali Thakkar 5139c84c1e7SVaishali Thakkar 5149c84c1e7SVaishali Thakkar static int qcom_show_build_id(struct seq_file *seq, void *p) 5159c84c1e7SVaishali Thakkar { 5169c84c1e7SVaishali Thakkar struct socinfo *socinfo = seq->private; 5179c84c1e7SVaishali Thakkar 5189c84c1e7SVaishali Thakkar seq_printf(seq, "%s\n", socinfo->build_id); 5199c84c1e7SVaishali Thakkar 5209c84c1e7SVaishali Thakkar return 0; 5219c84c1e7SVaishali Thakkar } 5229c84c1e7SVaishali Thakkar 5239c84c1e7SVaishali Thakkar static int qcom_show_pmic_model(struct seq_file *seq, void *p) 5249c84c1e7SVaishali Thakkar { 5259c84c1e7SVaishali Thakkar struct socinfo *socinfo = seq->private; 5269c84c1e7SVaishali Thakkar int model = SOCINFO_MINOR(le32_to_cpu(socinfo->pmic_model)); 5279c84c1e7SVaishali Thakkar 5289c84c1e7SVaishali Thakkar if (model < 0) 5299c84c1e7SVaishali Thakkar return -EINVAL; 5309c84c1e7SVaishali Thakkar 5315fb33d89SDan Carpenter if (model < ARRAY_SIZE(pmic_models) && pmic_models[model]) 5329c84c1e7SVaishali Thakkar seq_printf(seq, "%s\n", pmic_models[model]); 533e9247e2cSDmitry Baryshkov else 534e9247e2cSDmitry Baryshkov seq_printf(seq, "unknown (%d)\n", model); 5359c84c1e7SVaishali Thakkar 5369c84c1e7SVaishali Thakkar return 0; 5379c84c1e7SVaishali Thakkar } 5389c84c1e7SVaishali Thakkar 539734c78e7SDmitry Baryshkov static int qcom_show_pmic_model_array(struct seq_file *seq, void *p) 540734c78e7SDmitry Baryshkov { 541734c78e7SDmitry Baryshkov struct socinfo *socinfo = seq->private; 542734c78e7SDmitry Baryshkov unsigned int num_pmics = le32_to_cpu(socinfo->num_pmics); 543734c78e7SDmitry Baryshkov unsigned int pmic_array_offset = le32_to_cpu(socinfo->pmic_array_offset); 544734c78e7SDmitry Baryshkov int i; 545734c78e7SDmitry Baryshkov void *ptr = socinfo; 546734c78e7SDmitry Baryshkov 547734c78e7SDmitry Baryshkov ptr += pmic_array_offset; 548734c78e7SDmitry Baryshkov 549734c78e7SDmitry Baryshkov /* No need for bounds checking, it happened at socinfo_debugfs_init */ 550734c78e7SDmitry Baryshkov for (i = 0; i < num_pmics; i++) { 551734c78e7SDmitry Baryshkov unsigned int model = SOCINFO_MINOR(get_unaligned_le32(ptr + 2 * i * sizeof(u32))); 552734c78e7SDmitry Baryshkov unsigned int die_rev = get_unaligned_le32(ptr + (2 * i + 1) * sizeof(u32)); 553734c78e7SDmitry Baryshkov 554e6393818SColin Ian King if (model < ARRAY_SIZE(pmic_models) && pmic_models[model]) 555734c78e7SDmitry Baryshkov seq_printf(seq, "%s %u.%u\n", pmic_models[model], 556aec8535eSDmitry Baryshkov SOCINFO_MAJOR(die_rev), 557aec8535eSDmitry Baryshkov SOCINFO_MINOR(die_rev)); 558734c78e7SDmitry Baryshkov else 559734c78e7SDmitry Baryshkov seq_printf(seq, "unknown (%d)\n", model); 560734c78e7SDmitry Baryshkov } 561734c78e7SDmitry Baryshkov 562734c78e7SDmitry Baryshkov return 0; 563734c78e7SDmitry Baryshkov } 564734c78e7SDmitry Baryshkov 5659c84c1e7SVaishali Thakkar static int qcom_show_pmic_die_revision(struct seq_file *seq, void *p) 5669c84c1e7SVaishali Thakkar { 5679c84c1e7SVaishali Thakkar struct socinfo *socinfo = seq->private; 5689c84c1e7SVaishali Thakkar 5699c84c1e7SVaishali Thakkar seq_printf(seq, "%u.%u\n", 5709c84c1e7SVaishali Thakkar SOCINFO_MAJOR(le32_to_cpu(socinfo->pmic_die_rev)), 5719c84c1e7SVaishali Thakkar SOCINFO_MINOR(le32_to_cpu(socinfo->pmic_die_rev))); 5729c84c1e7SVaishali Thakkar 5739c84c1e7SVaishali Thakkar return 0; 5749c84c1e7SVaishali Thakkar } 5759c84c1e7SVaishali Thakkar 5760f12fe7fSDmitry Baryshkov static int qcom_show_chip_id(struct seq_file *seq, void *p) 5770f12fe7fSDmitry Baryshkov { 5780f12fe7fSDmitry Baryshkov struct socinfo *socinfo = seq->private; 5790f12fe7fSDmitry Baryshkov 5800f12fe7fSDmitry Baryshkov seq_printf(seq, "%s\n", socinfo->chip_id); 5810f12fe7fSDmitry Baryshkov 5820f12fe7fSDmitry Baryshkov return 0; 5830f12fe7fSDmitry Baryshkov } 5840f12fe7fSDmitry Baryshkov 5859c84c1e7SVaishali Thakkar QCOM_OPEN(build_id, qcom_show_build_id); 5869c84c1e7SVaishali Thakkar QCOM_OPEN(pmic_model, qcom_show_pmic_model); 587734c78e7SDmitry Baryshkov QCOM_OPEN(pmic_model_array, qcom_show_pmic_model_array); 5889c84c1e7SVaishali Thakkar QCOM_OPEN(pmic_die_rev, qcom_show_pmic_die_revision); 5890f12fe7fSDmitry Baryshkov QCOM_OPEN(chip_id, qcom_show_chip_id); 5909c84c1e7SVaishali Thakkar 591cd23d140SVaishali Thakkar #define DEFINE_IMAGE_OPS(type) \ 592cd23d140SVaishali Thakkar static int show_image_##type(struct seq_file *seq, void *p) \ 593cd23d140SVaishali Thakkar { \ 594cd23d140SVaishali Thakkar struct smem_image_version *image_version = seq->private; \ 5950d361b0aSStephen Boyd if (image_version->type[0] != '\0') \ 5960d361b0aSStephen Boyd seq_printf(seq, "%s\n", image_version->type); \ 597cd23d140SVaishali Thakkar return 0; \ 598cd23d140SVaishali Thakkar } \ 599cd23d140SVaishali Thakkar static int open_image_##type(struct inode *inode, struct file *file) \ 600cd23d140SVaishali Thakkar { \ 601cd23d140SVaishali Thakkar return single_open(file, show_image_##type, inode->i_private); \ 602cd23d140SVaishali Thakkar } \ 603cd23d140SVaishali Thakkar \ 604cd23d140SVaishali Thakkar static const struct file_operations qcom_image_##type##_ops = { \ 605cd23d140SVaishali Thakkar .open = open_image_##type, \ 606cd23d140SVaishali Thakkar .read = seq_read, \ 607cd23d140SVaishali Thakkar .llseek = seq_lseek, \ 608cd23d140SVaishali Thakkar .release = single_release, \ 609cd23d140SVaishali Thakkar } 610cd23d140SVaishali Thakkar 611cd23d140SVaishali Thakkar DEFINE_IMAGE_OPS(name); 612cd23d140SVaishali Thakkar DEFINE_IMAGE_OPS(variant); 613cd23d140SVaishali Thakkar DEFINE_IMAGE_OPS(oem); 614cd23d140SVaishali Thakkar 6159c84c1e7SVaishali Thakkar static void socinfo_debugfs_init(struct qcom_socinfo *qcom_socinfo, 616734c78e7SDmitry Baryshkov struct socinfo *info, size_t info_size) 6179c84c1e7SVaishali Thakkar { 618cd23d140SVaishali Thakkar struct smem_image_version *versions; 619cd23d140SVaishali Thakkar struct dentry *dentry; 6209c84c1e7SVaishali Thakkar size_t size; 621cd23d140SVaishali Thakkar int i; 622734c78e7SDmitry Baryshkov unsigned int num_pmics; 623734c78e7SDmitry Baryshkov unsigned int pmic_array_offset; 6249c84c1e7SVaishali Thakkar 6259c84c1e7SVaishali Thakkar qcom_socinfo->dbg_root = debugfs_create_dir("qcom_socinfo", NULL); 6269c84c1e7SVaishali Thakkar 6279c84c1e7SVaishali Thakkar qcom_socinfo->info.fmt = __le32_to_cpu(info->fmt); 6289c84c1e7SVaishali Thakkar 6298333b2c2SStephen Boyd debugfs_create_x32("info_fmt", 0444, qcom_socinfo->dbg_root, 63050f85d16SDmitry Baryshkov &qcom_socinfo->info.fmt); 63150f85d16SDmitry Baryshkov 6329c84c1e7SVaishali Thakkar switch (qcom_socinfo->info.fmt) { 6336bdab60dSNaman Jain case SOCINFO_VERSION(0, 17): 6346bdab60dSNaman Jain qcom_socinfo->info.oem_variant = __le32_to_cpu(info->oem_variant); 6356bdab60dSNaman Jain debugfs_create_u32("oem_variant", 0444, qcom_socinfo->dbg_root, 6366bdab60dSNaman Jain &qcom_socinfo->info.oem_variant); 6376bdab60dSNaman Jain fallthrough; 638f02a5373SNaman Jain case SOCINFO_VERSION(0, 16): 639f02a5373SNaman Jain qcom_socinfo->info.feature_code = __le32_to_cpu(info->feature_code); 640f02a5373SNaman Jain qcom_socinfo->info.pcode = __le32_to_cpu(info->pcode); 641f02a5373SNaman Jain 642f02a5373SNaman Jain debugfs_create_u32("feature_code", 0444, qcom_socinfo->dbg_root, 643f02a5373SNaman Jain &qcom_socinfo->info.feature_code); 644f02a5373SNaman Jain debugfs_create_u32("pcode", 0444, qcom_socinfo->dbg_root, 645f02a5373SNaman Jain &qcom_socinfo->info.pcode); 646f02a5373SNaman Jain fallthrough; 6470f12fe7fSDmitry Baryshkov case SOCINFO_VERSION(0, 15): 6480f12fe7fSDmitry Baryshkov qcom_socinfo->info.nmodem_supported = __le32_to_cpu(info->nmodem_supported); 6490f12fe7fSDmitry Baryshkov 6508333b2c2SStephen Boyd debugfs_create_u32("nmodem_supported", 0444, qcom_socinfo->dbg_root, 6510f12fe7fSDmitry Baryshkov &qcom_socinfo->info.nmodem_supported); 652df561f66SGustavo A. R. Silva fallthrough; 6530f12fe7fSDmitry Baryshkov case SOCINFO_VERSION(0, 14): 6540f12fe7fSDmitry Baryshkov qcom_socinfo->info.num_clusters = __le32_to_cpu(info->num_clusters); 6550f12fe7fSDmitry Baryshkov qcom_socinfo->info.ncluster_array_offset = __le32_to_cpu(info->ncluster_array_offset); 6560f12fe7fSDmitry Baryshkov qcom_socinfo->info.num_defective_parts = __le32_to_cpu(info->num_defective_parts); 6570f12fe7fSDmitry Baryshkov qcom_socinfo->info.ndefective_parts_array_offset = __le32_to_cpu(info->ndefective_parts_array_offset); 6580f12fe7fSDmitry Baryshkov 6598333b2c2SStephen Boyd debugfs_create_u32("num_clusters", 0444, qcom_socinfo->dbg_root, 6600f12fe7fSDmitry Baryshkov &qcom_socinfo->info.num_clusters); 6618333b2c2SStephen Boyd debugfs_create_u32("ncluster_array_offset", 0444, qcom_socinfo->dbg_root, 6620f12fe7fSDmitry Baryshkov &qcom_socinfo->info.ncluster_array_offset); 6638333b2c2SStephen Boyd debugfs_create_u32("num_defective_parts", 0444, qcom_socinfo->dbg_root, 6640f12fe7fSDmitry Baryshkov &qcom_socinfo->info.num_defective_parts); 6658333b2c2SStephen Boyd debugfs_create_u32("ndefective_parts_array_offset", 0444, qcom_socinfo->dbg_root, 6660f12fe7fSDmitry Baryshkov &qcom_socinfo->info.ndefective_parts_array_offset); 667df561f66SGustavo A. R. Silva fallthrough; 6680f12fe7fSDmitry Baryshkov case SOCINFO_VERSION(0, 13): 6690f12fe7fSDmitry Baryshkov qcom_socinfo->info.nproduct_id = __le32_to_cpu(info->nproduct_id); 6700f12fe7fSDmitry Baryshkov 6718333b2c2SStephen Boyd debugfs_create_u32("nproduct_id", 0444, qcom_socinfo->dbg_root, 6720f12fe7fSDmitry Baryshkov &qcom_socinfo->info.nproduct_id); 6730f12fe7fSDmitry Baryshkov DEBUGFS_ADD(info, chip_id); 674df561f66SGustavo A. R. Silva fallthrough; 6759c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 12): 6769c84c1e7SVaishali Thakkar qcom_socinfo->info.chip_family = 6779c84c1e7SVaishali Thakkar __le32_to_cpu(info->chip_family); 6789c84c1e7SVaishali Thakkar qcom_socinfo->info.raw_device_family = 6799c84c1e7SVaishali Thakkar __le32_to_cpu(info->raw_device_family); 6809c84c1e7SVaishali Thakkar qcom_socinfo->info.raw_device_num = 6819c84c1e7SVaishali Thakkar __le32_to_cpu(info->raw_device_num); 6829c84c1e7SVaishali Thakkar 6838333b2c2SStephen Boyd debugfs_create_x32("chip_family", 0444, qcom_socinfo->dbg_root, 6849c84c1e7SVaishali Thakkar &qcom_socinfo->info.chip_family); 6858333b2c2SStephen Boyd debugfs_create_x32("raw_device_family", 0444, 6869c84c1e7SVaishali Thakkar qcom_socinfo->dbg_root, 6879c84c1e7SVaishali Thakkar &qcom_socinfo->info.raw_device_family); 6888333b2c2SStephen Boyd debugfs_create_x32("raw_device_number", 0444, 6899c84c1e7SVaishali Thakkar qcom_socinfo->dbg_root, 6909c84c1e7SVaishali Thakkar &qcom_socinfo->info.raw_device_num); 691df561f66SGustavo A. R. Silva fallthrough; 6929c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 11): 693734c78e7SDmitry Baryshkov num_pmics = le32_to_cpu(info->num_pmics); 694734c78e7SDmitry Baryshkov pmic_array_offset = le32_to_cpu(info->pmic_array_offset); 695734c78e7SDmitry Baryshkov if (pmic_array_offset + 2 * num_pmics * sizeof(u32) <= info_size) 696734c78e7SDmitry Baryshkov DEBUGFS_ADD(info, pmic_model_array); 697734c78e7SDmitry Baryshkov fallthrough; 6989c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 10): 6999c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 9): 7009c84c1e7SVaishali Thakkar qcom_socinfo->info.foundry_id = __le32_to_cpu(info->foundry_id); 7019c84c1e7SVaishali Thakkar 7028333b2c2SStephen Boyd debugfs_create_u32("foundry_id", 0444, qcom_socinfo->dbg_root, 7039c84c1e7SVaishali Thakkar &qcom_socinfo->info.foundry_id); 704df561f66SGustavo A. R. Silva fallthrough; 7059c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 8): 7069c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 7): 7079c84c1e7SVaishali Thakkar DEBUGFS_ADD(info, pmic_model); 7089c84c1e7SVaishali Thakkar DEBUGFS_ADD(info, pmic_die_rev); 709df561f66SGustavo A. R. Silva fallthrough; 7109c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 6): 7119c84c1e7SVaishali Thakkar qcom_socinfo->info.hw_plat_subtype = 7129c84c1e7SVaishali Thakkar __le32_to_cpu(info->hw_plat_subtype); 7139c84c1e7SVaishali Thakkar 7148333b2c2SStephen Boyd debugfs_create_u32("hardware_platform_subtype", 0444, 7159c84c1e7SVaishali Thakkar qcom_socinfo->dbg_root, 7169c84c1e7SVaishali Thakkar &qcom_socinfo->info.hw_plat_subtype); 717df561f66SGustavo A. R. Silva fallthrough; 7189c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 5): 7199c84c1e7SVaishali Thakkar qcom_socinfo->info.accessory_chip = 7209c84c1e7SVaishali Thakkar __le32_to_cpu(info->accessory_chip); 7219c84c1e7SVaishali Thakkar 7228333b2c2SStephen Boyd debugfs_create_u32("accessory_chip", 0444, 7239c84c1e7SVaishali Thakkar qcom_socinfo->dbg_root, 7249c84c1e7SVaishali Thakkar &qcom_socinfo->info.accessory_chip); 725df561f66SGustavo A. R. Silva fallthrough; 7269c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 4): 7279c84c1e7SVaishali Thakkar qcom_socinfo->info.plat_ver = __le32_to_cpu(info->plat_ver); 7289c84c1e7SVaishali Thakkar 7298333b2c2SStephen Boyd debugfs_create_u32("platform_version", 0444, 7309c84c1e7SVaishali Thakkar qcom_socinfo->dbg_root, 7319c84c1e7SVaishali Thakkar &qcom_socinfo->info.plat_ver); 732df561f66SGustavo A. R. Silva fallthrough; 7339c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 3): 7349c84c1e7SVaishali Thakkar qcom_socinfo->info.hw_plat = __le32_to_cpu(info->hw_plat); 7359c84c1e7SVaishali Thakkar 7368333b2c2SStephen Boyd debugfs_create_u32("hardware_platform", 0444, 7379c84c1e7SVaishali Thakkar qcom_socinfo->dbg_root, 7389c84c1e7SVaishali Thakkar &qcom_socinfo->info.hw_plat); 739df561f66SGustavo A. R. Silva fallthrough; 7409c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 2): 7419c84c1e7SVaishali Thakkar qcom_socinfo->info.raw_ver = __le32_to_cpu(info->raw_ver); 7429c84c1e7SVaishali Thakkar 7438333b2c2SStephen Boyd debugfs_create_u32("raw_version", 0444, qcom_socinfo->dbg_root, 7449c84c1e7SVaishali Thakkar &qcom_socinfo->info.raw_ver); 745df561f66SGustavo A. R. Silva fallthrough; 7469c84c1e7SVaishali Thakkar case SOCINFO_VERSION(0, 1): 7479c84c1e7SVaishali Thakkar DEBUGFS_ADD(info, build_id); 7489c84c1e7SVaishali Thakkar break; 7499c84c1e7SVaishali Thakkar } 750cd23d140SVaishali Thakkar 751cd23d140SVaishali Thakkar versions = qcom_smem_get(QCOM_SMEM_HOST_ANY, SMEM_IMAGE_VERSION_TABLE, 752cd23d140SVaishali Thakkar &size); 753cd23d140SVaishali Thakkar 754cd23d140SVaishali Thakkar for (i = 0; i < ARRAY_SIZE(socinfo_image_names); i++) { 755cd23d140SVaishali Thakkar if (!socinfo_image_names[i]) 756cd23d140SVaishali Thakkar continue; 757cd23d140SVaishali Thakkar 758cd23d140SVaishali Thakkar dentry = debugfs_create_dir(socinfo_image_names[i], 759cd23d140SVaishali Thakkar qcom_socinfo->dbg_root); 7608333b2c2SStephen Boyd debugfs_create_file("name", 0444, dentry, &versions[i], 761cd23d140SVaishali Thakkar &qcom_image_name_ops); 7628333b2c2SStephen Boyd debugfs_create_file("variant", 0444, dentry, &versions[i], 763cd23d140SVaishali Thakkar &qcom_image_variant_ops); 7648333b2c2SStephen Boyd debugfs_create_file("oem", 0444, dentry, &versions[i], 765cd23d140SVaishali Thakkar &qcom_image_oem_ops); 766cd23d140SVaishali Thakkar } 7679c84c1e7SVaishali Thakkar } 7689c84c1e7SVaishali Thakkar 7699c84c1e7SVaishali Thakkar static void socinfo_debugfs_exit(struct qcom_socinfo *qcom_socinfo) 7709c84c1e7SVaishali Thakkar { 7719c84c1e7SVaishali Thakkar debugfs_remove_recursive(qcom_socinfo->dbg_root); 7729c84c1e7SVaishali Thakkar } 7739c84c1e7SVaishali Thakkar #else 7749c84c1e7SVaishali Thakkar static void socinfo_debugfs_init(struct qcom_socinfo *qcom_socinfo, 775734c78e7SDmitry Baryshkov struct socinfo *info, size_t info_size) 7769c84c1e7SVaishali Thakkar { 7779c84c1e7SVaishali Thakkar } 7789c84c1e7SVaishali Thakkar static void socinfo_debugfs_exit(struct qcom_socinfo *qcom_socinfo) { } 7799c84c1e7SVaishali Thakkar #endif /* CONFIG_DEBUG_FS */ 7809c84c1e7SVaishali Thakkar 781efb448d0SImran Khan static int qcom_socinfo_probe(struct platform_device *pdev) 782efb448d0SImran Khan { 783efb448d0SImran Khan struct qcom_socinfo *qs; 784efb448d0SImran Khan struct socinfo *info; 785efb448d0SImran Khan size_t item_size; 786efb448d0SImran Khan 787efb448d0SImran Khan info = qcom_smem_get(QCOM_SMEM_HOST_ANY, SMEM_HW_SW_BUILD_ID, 788efb448d0SImran Khan &item_size); 789efb448d0SImran Khan if (IS_ERR(info)) { 790efb448d0SImran Khan dev_err(&pdev->dev, "Couldn't find socinfo\n"); 791efb448d0SImran Khan return PTR_ERR(info); 792efb448d0SImran Khan } 793efb448d0SImran Khan 794efb448d0SImran Khan qs = devm_kzalloc(&pdev->dev, sizeof(*qs), GFP_KERNEL); 795efb448d0SImran Khan if (!qs) 796efb448d0SImran Khan return -ENOMEM; 797efb448d0SImran Khan 798efb448d0SImran Khan qs->attr.family = "Snapdragon"; 799efb448d0SImran Khan qs->attr.machine = socinfo_machine(&pdev->dev, 800efb448d0SImran Khan le32_to_cpu(info->id)); 80127a34413SSrinivas Kandagatla qs->attr.soc_id = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%u", 80227a34413SSrinivas Kandagatla le32_to_cpu(info->id)); 803efb448d0SImran Khan qs->attr.revision = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%u.%u", 804efb448d0SImran Khan SOCINFO_MAJOR(le32_to_cpu(info->ver)), 805efb448d0SImran Khan SOCINFO_MINOR(le32_to_cpu(info->ver))); 806efb448d0SImran Khan if (offsetof(struct socinfo, serial_num) <= item_size) 807efb448d0SImran Khan qs->attr.serial_number = devm_kasprintf(&pdev->dev, GFP_KERNEL, 808efb448d0SImran Khan "%u", 809efb448d0SImran Khan le32_to_cpu(info->serial_num)); 810efb448d0SImran Khan 811efb448d0SImran Khan qs->soc_dev = soc_device_register(&qs->attr); 812efb448d0SImran Khan if (IS_ERR(qs->soc_dev)) 813efb448d0SImran Khan return PTR_ERR(qs->soc_dev); 814efb448d0SImran Khan 815734c78e7SDmitry Baryshkov socinfo_debugfs_init(qs, info, item_size); 8169c84c1e7SVaishali Thakkar 817efb448d0SImran Khan /* Feed the soc specific unique data into entropy pool */ 818efb448d0SImran Khan add_device_randomness(info, item_size); 819efb448d0SImran Khan 8209c5a4ec6SAntonio Martorana platform_set_drvdata(pdev, qs); 821efb448d0SImran Khan 822efb448d0SImran Khan return 0; 823efb448d0SImran Khan } 824efb448d0SImran Khan 825efb448d0SImran Khan static int qcom_socinfo_remove(struct platform_device *pdev) 826efb448d0SImran Khan { 827efb448d0SImran Khan struct qcom_socinfo *qs = platform_get_drvdata(pdev); 828efb448d0SImran Khan 829efb448d0SImran Khan soc_device_unregister(qs->soc_dev); 830efb448d0SImran Khan 8319c84c1e7SVaishali Thakkar socinfo_debugfs_exit(qs); 8329c84c1e7SVaishali Thakkar 833efb448d0SImran Khan return 0; 834efb448d0SImran Khan } 835efb448d0SImran Khan 836efb448d0SImran Khan static struct platform_driver qcom_socinfo_driver = { 837efb448d0SImran Khan .probe = qcom_socinfo_probe, 838efb448d0SImran Khan .remove = qcom_socinfo_remove, 839efb448d0SImran Khan .driver = { 840efb448d0SImran Khan .name = "qcom-socinfo", 841efb448d0SImran Khan }, 842efb448d0SImran Khan }; 843efb448d0SImran Khan 844efb448d0SImran Khan module_platform_driver(qcom_socinfo_driver); 845efb448d0SImran Khan 846efb448d0SImran Khan MODULE_DESCRIPTION("Qualcomm SoCinfo driver"); 847efb448d0SImran Khan MODULE_LICENSE("GPL v2"); 848efb448d0SImran Khan MODULE_ALIAS("platform:qcom-socinfo"); 849