xref: /openbmc/u-boot/cmd/fsi.c (revision 18b134e0)
1*ade283d8Sryan_chen #include <common.h>
2*ade283d8Sryan_chen #include <command.h>
3*ade283d8Sryan_chen #include <aspeed_fsi.h>
4*ade283d8Sryan_chen #include <dm/device.h>
5*ade283d8Sryan_chen #include <dm/uclass.h>
6*ade283d8Sryan_chen 
7*ade283d8Sryan_chen struct fsi_master_aspeed *fsi;
8*ade283d8Sryan_chen 
do_break(void)9*ade283d8Sryan_chen static void do_break(void)
10*ade283d8Sryan_chen {
11*ade283d8Sryan_chen 	debug("%s\n", __func__);
12*ade283d8Sryan_chen 	aspeed_fsi_break(fsi, 0);
13*ade283d8Sryan_chen }
14*ade283d8Sryan_chen 
do_status(void)15*ade283d8Sryan_chen static void do_status(void)
16*ade283d8Sryan_chen {
17*ade283d8Sryan_chen 	debug("%s\n", __func__);
18*ade283d8Sryan_chen 	aspeed_fsi_status(fsi);
19*ade283d8Sryan_chen }
20*ade283d8Sryan_chen 
do_getcfam(int argc,char * const argv[])21*ade283d8Sryan_chen static void do_getcfam(int argc, char *const argv[])
22*ade283d8Sryan_chen {
23*ade283d8Sryan_chen 	int rc;
24*ade283d8Sryan_chen 	uint32_t addr, val;
25*ade283d8Sryan_chen 
26*ade283d8Sryan_chen 	if (argc != 3) {
27*ade283d8Sryan_chen 		printf("invalid arguments to getcfam\n");
28*ade283d8Sryan_chen 		return;
29*ade283d8Sryan_chen 	}
30*ade283d8Sryan_chen 
31*ade283d8Sryan_chen 	addr = simple_strtoul(argv[2], NULL, 16);
32*ade283d8Sryan_chen 
33*ade283d8Sryan_chen 	debug("%s %08x\n", __func__, addr);
34*ade283d8Sryan_chen 	rc = aspeed_fsi_read(fsi, 0, addr, &val, 4);
35*ade283d8Sryan_chen 	if (rc) {
36*ade283d8Sryan_chen 		printf("error reading: %d\n", rc);
37*ade283d8Sryan_chen 		return;
38*ade283d8Sryan_chen 	}
39*ade283d8Sryan_chen 
40*ade283d8Sryan_chen 	printf("0x%08x\n", be32_to_cpu(val));
41*ade283d8Sryan_chen }
42*ade283d8Sryan_chen 
do_putcfam(int argc,char * const argv[])43*ade283d8Sryan_chen static void do_putcfam(int argc, char *const argv[])
44*ade283d8Sryan_chen {
45*ade283d8Sryan_chen 	int rc;
46*ade283d8Sryan_chen 	uint32_t addr, val;
47*ade283d8Sryan_chen 
48*ade283d8Sryan_chen 	if (argc != 4) {
49*ade283d8Sryan_chen 		printf("invalid arguments to putcfam\n");
50*ade283d8Sryan_chen 		return;
51*ade283d8Sryan_chen 	}
52*ade283d8Sryan_chen 
53*ade283d8Sryan_chen 	addr = simple_strtoul(argv[2], NULL, 16);
54*ade283d8Sryan_chen 	val = simple_strtoul(argv[3], NULL, 16);
55*ade283d8Sryan_chen 
56*ade283d8Sryan_chen 	debug("%s %08x %08x\n", __func__, addr, val);
57*ade283d8Sryan_chen 	rc = aspeed_fsi_write(fsi, 0, addr, &val, 4);
58*ade283d8Sryan_chen 	if (rc)
59*ade283d8Sryan_chen 		printf("error writing: %d\n", rc);
60*ade283d8Sryan_chen }
61*ade283d8Sryan_chen 
do_divisor(int argc,char * const argv[])62*ade283d8Sryan_chen static void do_divisor(int argc, char *const argv[])
63*ade283d8Sryan_chen {
64*ade283d8Sryan_chen 	int rc;
65*ade283d8Sryan_chen 	uint32_t val;
66*ade283d8Sryan_chen 
67*ade283d8Sryan_chen 	if (argc == 2) {
68*ade283d8Sryan_chen 		rc = aspeed_fsi_divisor(fsi, 0);
69*ade283d8Sryan_chen 		if (rc > 0)
70*ade283d8Sryan_chen 			printf("divsior: %d\n", rc);
71*ade283d8Sryan_chen 	} else if (argc == 3) {
72*ade283d8Sryan_chen 		val = simple_strtoul(argv[2], NULL, 0);
73*ade283d8Sryan_chen 		rc = aspeed_fsi_divisor(fsi, val);
74*ade283d8Sryan_chen 	} else {
75*ade283d8Sryan_chen 		printf("invalid arguments to divisor\n");
76*ade283d8Sryan_chen 		return;
77*ade283d8Sryan_chen 	}
78*ade283d8Sryan_chen 
79*ade283d8Sryan_chen 	if (rc < 0)
80*ade283d8Sryan_chen 		printf("divisor error: %d\n", rc);
81*ade283d8Sryan_chen }
82*ade283d8Sryan_chen 
do_probe(int argc,char * const argv[])83*ade283d8Sryan_chen static struct fsi_master_aspeed *do_probe(int argc, char *const argv[])
84*ade283d8Sryan_chen {
85*ade283d8Sryan_chen 	struct udevice *dev;
86*ade283d8Sryan_chen 	const char *devices[] = {"fsi@1e79b000", "fsi@1e79b100"};
87*ade283d8Sryan_chen 	int rc, id;
88*ade283d8Sryan_chen 
89*ade283d8Sryan_chen 	if (argc > 3) {
90*ade283d8Sryan_chen 		printf("invalid arguments to probe\n");
91*ade283d8Sryan_chen 		return NULL;
92*ade283d8Sryan_chen 	}
93*ade283d8Sryan_chen 
94*ade283d8Sryan_chen 	if (argc == 2)
95*ade283d8Sryan_chen 		id = 0;
96*ade283d8Sryan_chen 	else
97*ade283d8Sryan_chen 		id = simple_strtoul(argv[2], NULL, 10);
98*ade283d8Sryan_chen 
99*ade283d8Sryan_chen 	if (id > 1) {
100*ade283d8Sryan_chen 		printf("valid devices: 0, 1\n");
101*ade283d8Sryan_chen 		return NULL;
102*ade283d8Sryan_chen 	}
103*ade283d8Sryan_chen 
104*ade283d8Sryan_chen 	rc = uclass_get_device_by_name(UCLASS_MISC, devices[id], &dev);
105*ade283d8Sryan_chen 	if (rc) {
106*ade283d8Sryan_chen 		printf("fsi device %s not found\n", devices[id]);
107*ade283d8Sryan_chen 		return NULL;
108*ade283d8Sryan_chen 	}
109*ade283d8Sryan_chen 	return dev_get_priv(dev);
110*ade283d8Sryan_chen }
111*ade283d8Sryan_chen 
112*ade283d8Sryan_chen 
do_fsi(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])113*ade283d8Sryan_chen static int do_fsi(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
114*ade283d8Sryan_chen {
115*ade283d8Sryan_chen 
116*ade283d8Sryan_chen 	if (!strcmp(argv[1], "probe")) {
117*ade283d8Sryan_chen 		fsi = do_probe(argc, argv);
118*ade283d8Sryan_chen 		return 0;
119*ade283d8Sryan_chen 	}
120*ade283d8Sryan_chen 
121*ade283d8Sryan_chen 	if (fsi == NULL) {
122*ade283d8Sryan_chen 		printf("Run probe first\n");
123*ade283d8Sryan_chen 		return -EINVAL;
124*ade283d8Sryan_chen 	}
125*ade283d8Sryan_chen 
126*ade283d8Sryan_chen 	if (!strcmp(argv[1], "break"))
127*ade283d8Sryan_chen 		do_break();
128*ade283d8Sryan_chen 	else if (!strcmp(argv[1], "status"))
129*ade283d8Sryan_chen 		do_status();
130*ade283d8Sryan_chen 	else if (!strncmp(argv[1], "put", 3))
131*ade283d8Sryan_chen 		do_putcfam(argc, argv);
132*ade283d8Sryan_chen 	else if (!strncmp(argv[1], "get", 3))
133*ade283d8Sryan_chen 		do_getcfam(argc, argv);
134*ade283d8Sryan_chen 	else if (!strncmp(argv[1], "div", 3))
135*ade283d8Sryan_chen 		do_divisor(argc, argv);
136*ade283d8Sryan_chen 
137*ade283d8Sryan_chen 	return 0;
138*ade283d8Sryan_chen }
139*ade283d8Sryan_chen 
140*ade283d8Sryan_chen static char fsi_help_text[] =
141*ade283d8Sryan_chen 	"fsi probe [<n>]\n"
142*ade283d8Sryan_chen 	"fsi break\n"
143*ade283d8Sryan_chen 	"fsi getcfam <addr>\n"
144*ade283d8Sryan_chen 	"fsi putcfam <addr> <value>\n"
145*ade283d8Sryan_chen 	"fsi divisor [<divisor>]\n"
146*ade283d8Sryan_chen 	"fsi status\n";
147*ade283d8Sryan_chen 
148*ade283d8Sryan_chen U_BOOT_CMD(
149*ade283d8Sryan_chen 	fsi, 4, 1, do_fsi,
150*ade283d8Sryan_chen 	"IBM FSI commands",
151*ade283d8Sryan_chen 	fsi_help_text
152*ade283d8Sryan_chen );
153*ade283d8Sryan_chen 
154