blob: b34cbd08e0732b15ff96364afe0372ece205272d [file] [log] [blame]
Dave Gerlachf8f8b122020-07-15 23:39:59 -05001// SPDX-License-Identifier: GPL-2.0+
2/*
Nishanth Menoneaa39c62023-11-01 15:56:03 -05003 * Copyright (C) 2020 Texas Instruments Incorporated - https://www.ti.com/
Dave Gerlachf8f8b122020-07-15 23:39:59 -05004 * Dave Gerlach <d-gerlach@ti.com>
5 */
6
Dave Gerlachf8f8b122020-07-15 23:39:59 -05007#include <dm.h>
8#include <soc.h>
9
Andrew Davisf92ee082023-04-06 11:38:12 -050010#include <asm/arch/hardware.h>
Dave Gerlachf8f8b122020-07-15 23:39:59 -050011#include <asm/io.h>
12
Simon Glassb75b15b2020-12-03 16:55:23 -070013struct soc_ti_k3_plat {
Dave Gerlachf8f8b122020-07-15 23:39:59 -050014 const char *family;
15 const char *revision;
16};
17
18static const char *get_family_string(u32 idreg)
19{
20 const char *family;
Manorit Chawdhry627f78c2025-03-17 10:24:23 +053021 u32 jtag_dev_id;
22 u32 pkg;
Dave Gerlachf8f8b122020-07-15 23:39:59 -050023 u32 soc;
24
Manorit Chawdhry627f78c2025-03-17 10:24:23 +053025 jtag_dev_id = readl(CTRLMMR_WKUP_JTAG_DEVICE_ID);
26
Dave Gerlachf8f8b122020-07-15 23:39:59 -050027 soc = (idreg & JTAG_ID_PARTNO_MASK) >> JTAG_ID_PARTNO_SHIFT;
28
29 switch (soc) {
Jayesh Choudharybeadd862024-06-12 14:41:11 +053030 case JTAG_ID_PARTNO_AM62X:
31 family = "AM62X";
32 break;
33 case JTAG_ID_PARTNO_AM62AX:
34 family = "AM62AX";
35 break;
36 case JTAG_ID_PARTNO_AM62PX:
37 family = "AM62PX";
38 break;
39 case JTAG_ID_PARTNO_AM64X:
40 family = "AM64X";
41 break;
Andrew Davisf92ee082023-04-06 11:38:12 -050042 case JTAG_ID_PARTNO_AM65X:
Dave Gerlachf8f8b122020-07-15 23:39:59 -050043 family = "AM65X";
44 break;
Andrew Davisf92ee082023-04-06 11:38:12 -050045 case JTAG_ID_PARTNO_J7200:
Kishon Vijay Abraham I6e7f5ae2020-08-05 22:44:27 +053046 family = "J7200";
47 break;
Jayesh Choudharybeadd862024-06-12 14:41:11 +053048 case JTAG_ID_PARTNO_J721E:
49 family = "J721E";
Lokesh Vutlac6558042021-05-06 16:44:48 +053050 break;
Andrew Davisf92ee082023-04-06 11:38:12 -050051 case JTAG_ID_PARTNO_J721S2:
David Huang26457192022-01-25 20:56:36 +053052 family = "J721S2";
53 break;
Jayesh Choudharyef18f772024-06-12 14:41:12 +053054 case JTAG_ID_PARTNO_J722S:
55 family = "J722S";
56 break;
Apurva Nandan197dc2c2024-02-24 01:51:43 +053057 case JTAG_ID_PARTNO_J784S4:
Manorit Chawdhry627f78c2025-03-17 10:24:23 +053058 {
59 /* Keep default family as J784S4 */
60 family = "J784S4";
61
62 pkg = (jtag_dev_id & JTAG_DEV_J742S2_PKG_MASK) >> JTAG_DEV_J742S2_PKG_SHIFT;
63 if (pkg == JTAG_ID_PKG_J742S2)
64 family = "J742S2";
65
66 break;
67 }
Dave Gerlachf8f8b122020-07-15 23:39:59 -050068 default:
69 family = "Unknown Silicon";
70 };
71
72 return family;
73}
74
Bryan Brattlof1a798db2022-01-26 16:07:33 -060075static char *j721e_rev_string_map[] = {
Neha Malcom Francis63af59d2024-07-15 16:45:50 +053076 "1.0", "1.1", "2.0",
Bryan Brattlof1a798db2022-01-26 16:07:33 -060077};
78
Bryan Brattlof05722fd2022-06-21 16:36:03 -050079static char *typical_rev_string_map[] = {
80 "1.0", "2.0", "3.0",
Bryan Brattlof1a798db2022-01-26 16:07:33 -060081};
82
Dave Gerlachf8f8b122020-07-15 23:39:59 -050083static const char *get_rev_string(u32 idreg)
84{
Dave Gerlachf8f8b122020-07-15 23:39:59 -050085 u32 rev;
Bryan Brattlof1a798db2022-01-26 16:07:33 -060086 u32 soc;
Dave Gerlachf8f8b122020-07-15 23:39:59 -050087
88 rev = (idreg & JTAG_ID_VARIANT_MASK) >> JTAG_ID_VARIANT_SHIFT;
Bryan Brattlof1a798db2022-01-26 16:07:33 -060089 soc = (idreg & JTAG_ID_PARTNO_MASK) >> JTAG_ID_PARTNO_SHIFT;
Dave Gerlachf8f8b122020-07-15 23:39:59 -050090
Bryan Brattlof1a798db2022-01-26 16:07:33 -060091 switch (soc) {
Andrew Davisf92ee082023-04-06 11:38:12 -050092 case JTAG_ID_PARTNO_J721E:
Rasmus Villemoesf5cc9232023-03-24 08:44:29 +010093 if (rev >= ARRAY_SIZE(j721e_rev_string_map))
Bryan Brattlof1a798db2022-01-26 16:07:33 -060094 goto bail;
95 return j721e_rev_string_map[rev];
96
Dave Gerlachf8f8b122020-07-15 23:39:59 -050097 default:
Rasmus Villemoesf5cc9232023-03-24 08:44:29 +010098 if (rev >= ARRAY_SIZE(typical_rev_string_map))
Bryan Brattlof05722fd2022-06-21 16:36:03 -050099 goto bail;
100 return typical_rev_string_map[rev];
Dave Gerlachf8f8b122020-07-15 23:39:59 -0500101 };
102
Bryan Brattlof1a798db2022-01-26 16:07:33 -0600103bail:
104 return "Unknown Revision";
Dave Gerlachf8f8b122020-07-15 23:39:59 -0500105}
106
107static int soc_ti_k3_get_family(struct udevice *dev, char *buf, int size)
108{
Simon Glassb75b15b2020-12-03 16:55:23 -0700109 struct soc_ti_k3_plat *plat = dev_get_plat(dev);
Dave Gerlachf8f8b122020-07-15 23:39:59 -0500110
111 snprintf(buf, size, "%s", plat->family);
112
113 return 0;
114}
115
116static int soc_ti_k3_get_revision(struct udevice *dev, char *buf, int size)
117{
Simon Glassb75b15b2020-12-03 16:55:23 -0700118 struct soc_ti_k3_plat *plat = dev_get_plat(dev);
Dave Gerlachf8f8b122020-07-15 23:39:59 -0500119
120 snprintf(buf, size, "SR%s", plat->revision);
121
122 return 0;
123}
124
125static const struct soc_ops soc_ti_k3_ops = {
126 .get_family = soc_ti_k3_get_family,
127 .get_revision = soc_ti_k3_get_revision,
128};
129
130int soc_ti_k3_probe(struct udevice *dev)
131{
Simon Glassb75b15b2020-12-03 16:55:23 -0700132 struct soc_ti_k3_plat *plat = dev_get_plat(dev);
Dave Gerlachf8f8b122020-07-15 23:39:59 -0500133 u32 idreg;
134 void *idreg_addr;
135
136 idreg_addr = dev_read_addr_ptr(dev);
137 if (!idreg_addr)
138 return -EINVAL;
139
140 idreg = readl(idreg_addr);
141
142 plat->family = get_family_string(idreg);
143 plat->revision = get_rev_string(idreg);
144
145 return 0;
146}
147
148static const struct udevice_id soc_ti_k3_ids[] = {
149 { .compatible = "ti,am654-chipid" },
150 { }
151};
152
153U_BOOT_DRIVER(soc_ti_k3) = {
154 .name = "soc_ti_k3",
155 .id = UCLASS_SOC,
156 .ops = &soc_ti_k3_ops,
157 .of_match = soc_ti_k3_ids,
158 .probe = soc_ti_k3_probe,
Simon Glassb75b15b2020-12-03 16:55:23 -0700159 .plat_auto = sizeof(struct soc_ti_k3_plat),
Dave Gerlachf8f8b122020-07-15 23:39:59 -0500160};