soc/tegra: fuse: update speedo IDs for Tegra210

Bug 200255986
Bug 200418638

[ There's a merge conflict during the cherry-pick from Kernel 4.4
  to 4.9 because a later patch got merged first -- Nicolin ]

Change-Id: Iacf188f4cccea03d3a82f7ad18455c18681c506d
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Reviewed-on: http://git-master/r/1262213
(cherry picked from commit ca0b70d5504c94c8cb98d2765bba1c2601c27d78)
Signed-off-by: Danny Huang <dahuang@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1736725
(cherry picked from commit 4c0ca13ab0c39cb9b83a511f3f84826d533b529e)
[nicolinc: added fallthrough statements in switch-case]
Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-5.9/+/2444441
Reviewed-by: automaticguardword <automaticguardword@nvidia.com>
Reviewed-by: Sachin Nikam <snikam@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
GVS: Gerrit_Virtual_Submit
diff --git a/drivers/soc/tegra/fuse/speedo-tegra210.c b/drivers/soc/tegra/fuse/speedo-tegra210.c
index 89af2a2..de1fc644 100644
--- a/drivers/soc/tegra/fuse/speedo-tegra210.c
+++ b/drivers/soc/tegra/fuse/speedo-tegra210.c
@@ -58,6 +58,8 @@ static void __init rev_sku_to_speedo_ids(struct tegra_sku_info *sku_info,
 					 u8 speedo_rev, int *threshold)
 {
 	int sku = sku_info->sku_id;
+	int rev = sku_info->revision;
+	bool a02 = (rev == TEGRA_REVISION_A02) || (rev == TEGRA_REVISION_A02p);
 	bool vcm31_sku = false;
 
 	/* Assign to default */
@@ -73,8 +75,20 @@ static void __init rev_sku_to_speedo_ids(struct tegra_sku_info *sku_info,
 	switch (sku) {
 	case 0x00: /* Engineering SKU */
 	case 0x01: /* Engineering SKU */
+	case 0x13:
+		if (a02) {
+			sku_info->cpu_speedo_id = 5;
+			sku_info->gpu_speedo_id = 2;
+			break;
+		}
+		fallthrough; /* for a01 */
 	case 0x07:
 	case 0x17:
+		if (a02) {
+			sku_info->cpu_speedo_id = 7;
+			sku_info->gpu_speedo_id = 2;
+			break;
+		}
 		if (vcm31_sku) {
 			sku_info->cpu_speedo_id = 4;
 			sku_info->soc_speedo_id = 1;
@@ -84,17 +98,40 @@ static void __init rev_sku_to_speedo_ids(struct tegra_sku_info *sku_info,
 		}
 		fallthrough; /* for a01 */
 	case 0x27:
-		if (speedo_rev >= 2)
-			sku_info->gpu_speedo_id = 1;
+		if (a02) {
+			sku_info->cpu_speedo_id = 1;
+			sku_info->gpu_speedo_id = 2;
+			break;
+		}
+		sku_info->gpu_speedo_id = 1;
 		break;
-
-	case 0x13:
-		if (speedo_rev >= 2)
-			sku_info->gpu_speedo_id = 1;
-
-		sku_info->cpu_speedo_id = 1;
+	case 0x57:
+		sku_info->cpu_speedo_id = 4;
+		sku_info->soc_speedo_id = 1;
+		sku_info->gpu_speedo_id = 4;
+		*threshold = THRESHOLD_INDEX_1;
 		break;
-
+	case 0x83:
+		if (a02) {
+			sku_info->cpu_speedo_id = 3;
+			sku_info->gpu_speedo_id = 3;
+			break;
+		}
+		fallthrough; /* for a01 */
+	case 0x87:
+		if (a02) {
+			sku_info->cpu_speedo_id = 2;
+			sku_info->gpu_speedo_id = 1;
+			break;
+		}
+		fallthrough; /* for a01 */
+	case 0x8F:
+		if (a02) {
+			sku_info->cpu_speedo_id = 9;
+			sku_info->gpu_speedo_id = 2;
+			break;
+		}
+		fallthrough; /* for a01 */
 	default:
 		pr_err("Tegra210: unknown SKU %#04x\n", sku);
 		/* Using the default for the error case */
@@ -144,7 +181,6 @@ void __init tegra210_init_speedo_data(struct tegra_sku_info *sku_info)
 	 * revision. Note that GPU speedo value is fused in CPU_SPEEDO_2.
 	 */
 	speedo_revision = get_speedo_revision();
-	pr_info("Speedo Revision %u\n", speedo_revision);
 	sku_info->speedo_rev = speedo_revision;
 
 	if (speedo_revision >= 3) {
@@ -182,6 +218,21 @@ void __init tegra210_init_speedo_data(struct tegra_sku_info *sku_info)
 						  soc_process_speedos[index],
 						  SOC_PROCESS_CORNERS);
 
-	pr_debug("Tegra GPU Speedo ID=%d, Speedo Value=%d\n",
-		 sku_info->gpu_speedo_id, sku_info->gpu_speedo_value);
+	pr_info("Tegra Speedo/IDDQ fuse revision %u\n", speedo_revision);
+	pr_info("Tegra: CPU Speedo ID %d, SoC Speedo ID %d, GPU Speedo ID %d\n",
+		sku_info->cpu_speedo_id,
+		sku_info->soc_speedo_id,
+		sku_info->gpu_speedo_id);
+	pr_info("Tegra: CPU Process ID %d, SoC Process ID %d, GPU Process ID %d\n",
+		sku_info->cpu_process_id,
+		sku_info->soc_process_id,
+		sku_info->gpu_process_id);
+	pr_info("Tegra: CPU Speedo Value %d, SoC Speedo Value %d, GPU Speedo Value %d\n",
+		sku_info->cpu_speedo_value,
+		sku_info->soc_speedo_value,
+		sku_info->gpu_speedo_value);
+	pr_info("Tegra: CPU IDDQ Value %d, SoC IDDQ Value %d, GPU IDDQ Value %d\n",
+		sku_info->cpu_iddq_value,
+		sku_info->soc_iddq_value,
+		sku_info->gpu_iddq_value);
 }