]> Git Repo - J-u-boot.git/blame - board/synopsys/emsdp/emsdp.c
command: Remove the cmd_tbl_t typedef
[J-u-boot.git] / board / synopsys / emsdp / emsdp.c
CommitLineData
2c3f9261
AB
1// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Copyright (C) 2018 Synopsys, Inc. All rights reserved.
4 */
5
6#include <common.h>
09140113 7#include <command.h>
9a3b4ceb 8#include <cpu_func.h>
2c3f9261 9#include <dwmmc.h>
691d719d 10#include <init.h>
2c3f9261
AB
11#include <malloc.h>
12
4e86c7e3
AB
13#include <asm/arcregs.h>
14
2c3f9261
AB
15DECLARE_GLOBAL_DATA_PTR;
16
4e86c7e3
AB
17#define ARC_PERIPHERAL_BASE 0xF0000000
18
19#define CGU_ARC_FMEAS_ARC (void *)(ARC_PERIPHERAL_BASE + 0x84)
20#define CGU_ARC_FMEAS_ARC_START BIT(31)
21#define CGU_ARC_FMEAS_ARC_DONE BIT(30)
22#define CGU_ARC_FMEAS_ARC_CNT_MASK GENMASK(14, 0)
23#define CGU_ARC_FMEAS_ARC_RCNT_OFFSET 0
24#define CGU_ARC_FMEAS_ARC_FCNT_OFFSET 15
25
26#define SDIO_BASE (void *)(ARC_PERIPHERAL_BASE + 0x10000)
27
28int mach_cpu_init(void)
29{
30 int rcnt, fcnt;
31 u32 data;
32
33 /* Start frequency measurement */
34 writel(CGU_ARC_FMEAS_ARC_START, CGU_ARC_FMEAS_ARC);
35
36 /* Poll DONE bit */
37 do {
38 data = readl(CGU_ARC_FMEAS_ARC);
39 } while (!(data & CGU_ARC_FMEAS_ARC_DONE));
40
41 /* Amount of reference 100 MHz clocks */
42 rcnt = ((data >> CGU_ARC_FMEAS_ARC_RCNT_OFFSET) &
43 CGU_ARC_FMEAS_ARC_CNT_MASK);
44
45 /* Amount of CPU clocks */
46 fcnt = ((data >> CGU_ARC_FMEAS_ARC_FCNT_OFFSET) &
47 CGU_ARC_FMEAS_ARC_CNT_MASK);
48
49 gd->cpu_clk = ((100 * fcnt) / rcnt) * 1000000;
50
51 return 0;
52}
2c3f9261 53
9ddaf1d5
AB
54int board_early_init_r(void)
55{
56#define EMSDP_PSRAM_BASE 0xf2001000
57#define PSRAM_FLASH_CONFIG_REG_0 (void *)(EMSDP_PSRAM_BASE + 0x10)
58#define PSRAM_FLASH_CONFIG_REG_1 (void *)(EMSDP_PSRAM_BASE + 0x14)
59#define CRE_ENABLE BIT(31)
60#define CRE_DRIVE_CMD BIT(6)
61
62#define PSRAM_RCR_DPD BIT(1)
63#define PSRAM_RCR_PAGE_MODE BIT(7)
64
65/*
66 * PSRAM_FLASH_CONFIG_REG_x[30:15] to the address lines[16:1] of flash,
67 * thus "<< 1".
68 */
69#define PSRAM_RCR_SETUP ((PSRAM_RCR_DPD | PSRAM_RCR_PAGE_MODE) << 1)
70
71 // Switch PSRAM controller to command mode
72 writel(CRE_ENABLE | CRE_DRIVE_CMD, PSRAM_FLASH_CONFIG_REG_0);
73 // Program Refresh Configuration Register (RCR) for BANK0
74 writew(0, (void *)(0x10000000 + PSRAM_RCR_SETUP));
75 // Switch PSRAM controller back to memory mode
76 writel(0, PSRAM_FLASH_CONFIG_REG_0);
77
78
79 // Switch PSRAM controller to command mode
80 writel(CRE_ENABLE | CRE_DRIVE_CMD, PSRAM_FLASH_CONFIG_REG_1);
81 // Program Refresh Configuration Register (RCR) for BANK1
82 writew(0, (void *)(0x10800000 + PSRAM_RCR_SETUP));
83 // Switch PSRAM controller back to memory mode
84 writel(0, PSRAM_FLASH_CONFIG_REG_1);
85
86 printf("PSRAM initialized.\n");
87
88 return 0;
89}
90
2c3f9261 91#define CREG_BASE 0xF0001000
fb9a46a2
AB
92#define CREG_BOOT (void *)(CREG_BASE + 0x0FF0)
93#define CREG_IP_SW_RESET (void *)(CREG_BASE + 0x0FF0)
6ef705b1 94#define CREG_IP_VERSION (void *)(CREG_BASE + 0x0FF8)
2c3f9261 95
fb9a46a2
AB
96/* Bits in CREG_BOOT register */
97#define CREG_BOOT_WP_BIT BIT(8)
2c3f9261
AB
98
99void reset_cpu(ulong addr)
100{
fb9a46a2 101 writel(1, CREG_IP_SW_RESET);
2c3f9261
AB
102 while (1)
103 ; /* loop forever till reset */
104}
105
09140113
SG
106static int do_emsdp_rom(struct cmd_tbl *cmdtp, int flag, int argc,
107 char *const argv[])
2c3f9261 108{
fb9a46a2 109 u32 creg_boot = readl(CREG_BOOT);
2c3f9261
AB
110
111 if (!strcmp(argv[1], "unlock"))
fb9a46a2 112 creg_boot &= ~CREG_BOOT_WP_BIT;
2c3f9261 113 else if (!strcmp(argv[1], "lock"))
fb9a46a2 114 creg_boot |= CREG_BOOT_WP_BIT;
2c3f9261
AB
115 else
116 return CMD_RET_USAGE;
117
fb9a46a2 118 writel(creg_boot, CREG_BOOT);
2c3f9261
AB
119
120 return CMD_RET_SUCCESS;
121}
122
09140113 123struct cmd_tbl cmd_emsdp[] = {
adc9b09a 124 U_BOOT_CMD_MKENT(rom, 2, 0, do_emsdp_rom, "", ""),
2c3f9261
AB
125};
126
09140113
SG
127static int do_emsdp(struct cmd_tbl *cmdtp, int flag, int argc,
128 char *const argv[])
2c3f9261 129{
09140113 130 struct cmd_tbl *c;
2c3f9261 131
adc9b09a 132 c = find_cmd_tbl(argv[1], cmd_emsdp, ARRAY_SIZE(cmd_emsdp));
2c3f9261 133
adc9b09a 134 /* Strip off leading 'emsdp' command */
2c3f9261
AB
135 argc--;
136 argv++;
137
138 if (c == NULL || argc > c->maxargs)
139 return CMD_RET_USAGE;
140
141 return c->cmd(cmdtp, flag, argc, argv);
142}
143
144U_BOOT_CMD(
adc9b09a
AB
145 emsdp, CONFIG_SYS_MAXARGS, 0, do_emsdp,
146 "Synopsys EMSDP specific commands",
2c3f9261 147 "rom unlock - Unlock non-volatile memory for writing\n"
adc9b09a 148 "emsdp rom lock - Lock non-volatile memory to prevent writing\n"
2c3f9261 149);
6ef705b1
AB
150
151int checkboard(void)
152{
153 int version = readl(CREG_IP_VERSION);
154
155 printf("Board: ARC EM Software Development Platform v%d.%d\n",
156 (version >> 16) & 0xff, version & 0xff);
157 return 0;
158};
This page took 0.096382 seconds and 4 git commands to generate.