coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
pmif_spmi.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <console/console.h>
4 #include <device/mmio.h>
5 #include <soc/addressmap.h>
6 #include <soc/pmif.h>
7 #include <soc/pmif_spmi.h>
8 #include <soc/pmif_sw.h>
9 #include <soc/spmi.h>
10 
11 #define PMIF_CMD_PER_3 (0x1 << PMIF_CMD_EXT_REG_LONG)
12 #define PMIF_CMD_PER_1_3 ((0x1 << PMIF_CMD_REG) | (0x1 << PMIF_CMD_EXT_REG_LONG))
13 
14 /* SPMI_MST, SPMI_SAMPL_CTRL */
15 DEFINE_BIT(SAMPL_CK_POL, 0)
16 DEFINE_BITFIELD(SAMPL_CK_DLY, 3, 1)
17 
18 /* PMIF, SPI_MODE_CTRL */
19 DEFINE_BIT(SPI_MODE_CTRL, 7)
20 DEFINE_BIT(SRVOL_EN, 11)
21 DEFINE_BIT(SPI_MODE_EXT_CMD, 12)
22 DEFINE_BIT(SPI_EINT_MODE_GATING_EN, 13)
23 
24 /* PMIF, SLEEP_PROTECTION_CTRL */
25 DEFINE_BITFIELD(SPM_SLEEP_REQ_SEL, 1, 0)
26 DEFINE_BITFIELD(SCP_SLEEP_REQ_SEL, 10, 9)
27 
28 static const struct spmi_device spmi_dev[] = {
29  {
31  .type = BUCK_CPU,
32  .type_id = BUCK_CPU_ID,
33  },
34  {
35  .slvid = SPMI_SLAVE_7,
36  .type = BUCK_GPU,
37  .type_id = BUCK_GPU_ID,
38  },
39 };
40 
41 static int spmi_read_check(struct pmif *pmif_arb, int slvid)
42 {
43  u32 rdata = 0;
44 
45  pmif_arb->read(pmif_arb, slvid, MT6315_READ_TEST, &rdata);
46  if (rdata != MT6315_DEFAULT_VALUE_READ) {
47  printk(BIOS_ERR, "%s next, slvid:%d rdata = 0x%x.\n",
48  __func__, slvid, rdata);
49  return -E_NODEV;
50  }
51 
52  pmif_arb->read(pmif_arb, slvid, MT6315_READ_TEST_1, &rdata);
53  if (rdata != MT6315_DEFAULT_VALUE_READ) {
54  printk(BIOS_ERR, "%s next, slvid:%d rdata = 0x%x.\n",
55  __func__, slvid, rdata);
56  return -E_NODEV;
57  }
58 
59  return 0;
60 }
61 
62 static int spmi_cali_rd_clock_polarity(struct pmif *pmif_arb, const struct spmi_device *dev)
63 {
64  int i;
65  bool success = false;
66  const struct cali cali_data[] = {
71  };
72 
73  /* Indicate sampling clock polarity, 1: Positive 0: Negative */
74  for (i = 0; i < ARRAY_SIZE(cali_data); i++) {
75  SET32_BITFIELDS(&mtk_spmi_mst->mst_sampl, SAMPL_CK_DLY, cali_data[i].dly,
76  SAMPL_CK_POL, cali_data[i].pol);
77  if (spmi_read_check(pmif_arb, dev->slvid) == 0) {
78  success = true;
79  break;
80  }
81  }
82 
83  if (!success)
84  die("ERROR - calibration fail for spmi clk");
85 
86  return 0;
87 }
88 
89 static int spmi_mst_init(struct pmif *pmif_arb)
90 {
91  int i;
92 
93  if (!pmif_arb) {
94  printk(BIOS_ERR, "%s: null pointer for pmif dev.\n", __func__);
95  return -E_INVAL;
96  }
97 
100 
101  for (i = 0; i < ARRAY_SIZE(spmi_dev); i++)
103 
104  return 0;
105 }
106 
107 static void pmif_spmi_force_normal_mode(int mstid)
108 {
109  struct pmif *arb = get_pmif_controller(PMIF_SPMI, mstid);
110 
111  /* listen srclken_0 only for entering normal or sleep mode */
113  SPI_MODE_CTRL, 0,
114  SRVOL_EN, 0,
115  SPI_MODE_EXT_CMD, 1,
116  SPI_EINT_MODE_GATING_EN, 1);
117 
118  /* enable spm/scp sleep request */
119  SET32_BITFIELDS(&arb->mtk_pmif->sleep_protection_ctrl, SPM_SLEEP_REQ_SEL, 0,
120  SCP_SLEEP_REQ_SEL, 0);
121 }
122 
124 {
125  struct pmif *arb = get_pmif_controller(PMIF_SPMI, mstid);
126 
129 }
130 
131 static void pmif_spmi_enable_cmdIssue(int mstid, bool en)
132 {
133  struct pmif *arb = get_pmif_controller(PMIF_SPMI, mstid);
134 
135  /* Enable cmdIssue */
136  write32(&arb->mtk_pmif->cmdissue_en, en);
137 }
138 
139 static void pmif_spmi_enable(int mstid)
140 {
141  struct pmif *arb = get_pmif_controller(PMIF_SPMI, mstid);
142  u32 cmd_per;
143 
144  /* clear all cmd permission for per channel */
145  write32(&arb->mtk_pmif->inf_cmd_per_0, 0);
146  write32(&arb->mtk_pmif->inf_cmd_per_1, 0);
147  write32(&arb->mtk_pmif->inf_cmd_per_2, 0);
148  write32(&arb->mtk_pmif->inf_cmd_per_3, 0);
149 
150  /* enable if we need cmd 0~3 permission for per channel */
151  cmd_per = PMIF_CMD_PER_3 << 28 | PMIF_CMD_PER_3 << 24 |
152  PMIF_CMD_PER_3 << 20 | PMIF_CMD_PER_3 << 16 |
153  PMIF_CMD_PER_3 << 8 | PMIF_CMD_PER_3 << 4 |
154  PMIF_CMD_PER_1_3 << 0;
155  write32(&arb->mtk_pmif->inf_cmd_per_0, cmd_per);
156 
157  cmd_per = PMIF_CMD_PER_3 << 4;
158  write32(&arb->mtk_pmif->inf_cmd_per_1, cmd_per);
159 
160  /*
161  * set bytecnt max limitation.
162  * hw bytecnt indicate when we set 0, it can send 1 byte;
163  * set 1, it can send 2 byte.
164  */
169 
170  /* Add latency limitation */
172  write32(&arb->mtk_pmif->lat_limit_0, 0);
173  write32(&arb->mtk_pmif->lat_limit_1, 0x4);
174  write32(&arb->mtk_pmif->lat_limit_2, 0x8);
175  write32(&arb->mtk_pmif->lat_limit_4, 0x8);
176  write32(&arb->mtk_pmif->lat_limit_6, 0x3FF);
177  write32(&arb->mtk_pmif->lat_limit_9, 0x4);
179 
182  write32(&arb->mtk_pmif->timer_ctrl, 0x3);
183  write32(&arb->mtk_pmif->init_done, 1);
184 }
185 
186 int pmif_spmi_init(struct pmif *arb)
187 {
188  if (arb->is_pmif_init_done(arb) != 0) {
191  pmif_spmi_enable_cmdIssue(arb->mstid, true);
192  pmif_spmi_enable(arb->mstid);
193  if (arb->is_pmif_init_done(arb))
194  return -E_NODEV;
195  }
196 
197  if (spmi_mst_init(arb)) {
198  printk(BIOS_ERR, "[%s] failed to init spmi master\n", __func__);
199  return -E_NODEV;
200  }
201 
202  return 0;
203 }
static void write32(void *addr, uint32_t val)
Definition: mmio.h:40
#define ARRAY_SIZE(a)
Definition: helpers.h:12
static struct pmif * pmif_arb
Definition: clkbuf.c:27
static void pmif_spmi_enable_swinf(int mstid)
Definition: pmif_spmi.c:123
#define PMIF_CMD_PER_1_3
Definition: pmif_spmi.c:12
static int spmi_mst_init(struct pmif *pmif_arb)
Definition: pmif_spmi.c:89
int pmif_spmi_init(struct pmif *arb)
Definition: pmif_spmi.c:186
static const struct spmi_device spmi_dev[]
Definition: pmif_spmi.c:28
#define PMIF_CMD_PER_3
Definition: pmif_spmi.c:11
static int spmi_read_check(struct pmif *pmif_arb, int slvid)
Definition: pmif_spmi.c:41
static void pmif_spmi_force_normal_mode(int mstid)
Definition: pmif_spmi.c:107
static int spmi_cali_rd_clock_polarity(struct pmif *pmif_arb, const struct spmi_device *dev)
Definition: pmif_spmi.c:62
static void pmif_spmi_enable_cmdIssue(int mstid, bool en)
Definition: pmif_spmi.c:131
static void pmif_spmi_enable(int mstid)
Definition: pmif_spmi.c:139
#define printk(level,...)
Definition: stdlib.h:16
void __noreturn die(const char *fmt,...)
Definition: die.c:17
#define DEFINE_BITFIELD(name, high_bit, low_bit)
Definition: mmio.h:124
#define DEFINE_BIT(name, bit)
Definition: mmio.h:131
#define SET32_BITFIELDS(addr,...)
Definition: mmio.h:201
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
void pmif_spmi_iocfg(void)
Definition: pmif_spmi.c:44
int spmi_config_master(void)
Definition: pmif_spmi.c:24
@ PMIF_SPMI
Definition: pmif_common.h:40
@ E_INVAL
Definition: pmif_common.h:47
@ E_NODEV
Definition: pmif_common.h:46
struct pmif * get_pmif_controller(int inf, int mstid)
Definition: pmif.c:168
#define PMIF_SPMI_SW_CHAN
Definition: pmif_spmi.h:13
@ SPMI_CK_DLY_1T
Definition: pmif_spmi.h:53
@ SPMI_CK_NO_DLY
Definition: pmif_spmi.h:52
#define mtk_spmi_mst
Definition: pmif_spmi.h:44
#define MT6315_DEFAULT_VALUE_READ
Definition: pmif_spmi.h:83
#define PMIF_SPMI_INF
Definition: pmif_spmi.h:14
@ MT6315_READ_TEST_1
Definition: pmif_spmi.h:80
@ MT6315_READ_TEST
Definition: pmif_spmi.h:79
@ SPMI_CK_POL_POS
Definition: pmif_spmi.h:58
@ SPMI_CK_POL_NEG
Definition: pmif_spmi.h:57
@ BUCK_CPU_ID
Definition: spmi.h:42
@ BUCK_GPU_ID
Definition: spmi.h:43
@ SPMI_SLAVE_7
Definition: spmi.h:23
@ SPMI_SLAVE_6
Definition: spmi.h:22
@ BUCK_GPU
Definition: spmi.h:37
@ BUCK_CPU
Definition: spmi.h:36
uint32_t u32
Definition: stdint.h:51
Definition: pmif_spmi.h:46
unsigned int dly
Definition: pmif_spmi.h:47
unsigned int pol
Definition: pmif_spmi.h:48
u32 inf_max_bytecnt_per_0
Definition: pmif.h:22
u32 inf_cmd_per_3
Definition: pmif.h:21
u32 timer_ctrl
Definition: pmif.h:55
u32 spi_mode_ctrl
Definition: pmif.h:59
u32 inf_max_bytecnt_per_1
Definition: pmif.h:23
u32 lat_limit_1
Definition: pmif.h:37
u32 lat_limit_4
Definition: pmif.h:40
u32 lat_limit_6
Definition: pmif.h:42
u32 inf_max_bytecnt_per_2
Definition: pmif.h:24
u32 inf_en
Definition: pmif.h:16
u32 lat_limit_2
Definition: pmif.h:38
u32 lat_limit_0
Definition: pmif.h:36
u32 cmdissue_en
Definition: pmif.h:53
u32 inf_cmd_per_0
Definition: pmif.h:18
u32 lat_limit_9
Definition: pmif.h:45
u32 init_done
Definition: pmif.h:11
u32 inf_cmd_per_2
Definition: pmif.h:20
u32 arb_en
Definition: pmif.h:32
u32 lat_cnter_en
Definition: pmif.h:34
u32 inf_max_bytecnt_per_3
Definition: pmif.h:25
u32 inf_cmd_per_1
Definition: pmif.h:19
u32 lat_limit_loading
Definition: pmif.h:35
u32 sleep_protection_ctrl
Definition: pmif.h:57
void(* read)(struct pmif *arb, u32 slvid, u32 reg, u32 *data)
Definition: pmif_common.h:31
int(* is_pmif_init_done)(struct pmif *arb)
Definition: pmif_common.h:35
struct mtk_pmif_regs * mtk_pmif
Definition: pmif_common.h:26
u32 mstid
Definition: pmif_common.h:29
u32 slvid
Definition: spmi.h:48