Lines Matching +full:efuse +full:- +full:size
2 * eFuse driver for Rockchip devices
5 * Written by Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
7 * SPDX-License-Identifier: GPL-2.0+
15 #include <linux/arm-smccc.h>
89 typedef int (*EFUSE_READ)(struct udevice *dev, int offset, void *buf, int size);
92 u32 ctrl; /* 0x00 efuse control register */
93 u32 dout; /* 0x04 efuse data out register */
94 u32 rf; /* 0x08 efuse redundancy bit used register */
98 /* 0x14 efuse strobe finish control register */
120 /* setup efuse timing */ in rk1808_efuse_timing_init()
136 void *buf, int size) in rockchip_rk1808_efuse_read() argument
139 struct rockchip_efuse_regs *efuse = in rockchip_rk1808_efuse_read() local
140 (struct rockchip_efuse_regs *)plat->base; in rockchip_rk1808_efuse_read()
146 rk1808_efuse_timing_init(plat->base); in rockchip_rk1808_efuse_read()
149 addr_end = roundup(offset + size, RK1808_NBYTES) / RK1808_NBYTES; in rockchip_rk1808_efuse_read()
151 addr_len = addr_end - addr_start; in rockchip_rk1808_efuse_read()
155 return -ENOMEM; in rockchip_rk1808_efuse_read()
157 while (addr_len--) { in rockchip_rk1808_efuse_read()
160 &efuse->auto_ctrl); in rockchip_rk1808_efuse_read()
162 status = readl(&efuse->int_status); in rockchip_rk1808_efuse_read()
164 ret = -EIO; in rockchip_rk1808_efuse_read()
167 out_value = readl(&efuse->dout2); in rockchip_rk1808_efuse_read()
168 writel(RK1808_INT_FINISH, &efuse->int_status); in rockchip_rk1808_efuse_read()
173 memcpy(buf, buffer + addr_offset, size); in rockchip_rk1808_efuse_read()
182 void *buf, int size) in rockchip_rk3368_efuse_read() argument
185 struct rockchip_efuse_regs *efuse = in rockchip_rk3368_efuse_read() local
186 (struct rockchip_efuse_regs *)plat->base; in rockchip_rk3368_efuse_read()
191 sip_smc_secure_reg_write((ulong)&efuse->ctrl, in rockchip_rk3368_efuse_read()
194 while (size--) { in rockchip_rk3368_efuse_read()
195 res = sip_smc_secure_reg_read((ulong)&efuse->ctrl); in rockchip_rk3368_efuse_read()
196 sip_smc_secure_reg_write((ulong)&efuse->ctrl, res.a1 & in rockchip_rk3368_efuse_read()
199 res = sip_smc_secure_reg_read((ulong)&efuse->ctrl); in rockchip_rk3368_efuse_read()
200 sip_smc_secure_reg_write((ulong)&efuse->ctrl, res.a1 | in rockchip_rk3368_efuse_read()
205 res = sip_smc_secure_reg_read((ulong)&efuse->ctrl); in rockchip_rk3368_efuse_read()
206 sip_smc_secure_reg_write((ulong)&efuse->ctrl, in rockchip_rk3368_efuse_read()
210 res = sip_smc_secure_reg_read((ulong)&efuse->dout); in rockchip_rk3368_efuse_read()
213 res = sip_smc_secure_reg_read((ulong)&efuse->ctrl); in rockchip_rk3368_efuse_read()
214 sip_smc_secure_reg_write((ulong)&efuse->ctrl, in rockchip_rk3368_efuse_read()
220 sip_smc_secure_reg_write((ulong)&efuse->ctrl, in rockchip_rk3368_efuse_read()
228 void *buf, int size) in rockchip_rk3399_efuse_read() argument
231 struct rockchip_efuse_regs *efuse = in rockchip_rk3399_efuse_read() local
232 (struct rockchip_efuse_regs *)plat->base; in rockchip_rk3399_efuse_read()
242 addr_end = DIV_ROUND_UP(offset + size, RK3399_BYTES_PER_FUSE); in rockchip_rk3399_efuse_read()
244 /* cap to the size of the efuse block */ in rockchip_rk3399_efuse_read()
249 &efuse->ctrl); in rockchip_rk3399_efuse_read()
252 setbits_le32(&efuse->ctrl, in rockchip_rk3399_efuse_read()
255 out_value = readl(&efuse->dout); in rockchip_rk3399_efuse_read()
256 clrbits_le32(&efuse->ctrl, RK3399_STROBE); in rockchip_rk3399_efuse_read()
264 writel(RK3399_PD | RK3399_CSB, &efuse->ctrl); in rockchip_rk3399_efuse_read()
266 memcpy(buf, bytes + addr_offset, size); in rockchip_rk3399_efuse_read()
272 void *buf, int size) in rockchip_rk3288_efuse_read() argument
275 struct rockchip_efuse_regs *efuse = in rockchip_rk3288_efuse_read() local
276 (struct rockchip_efuse_regs *)plat->base; in rockchip_rk3288_efuse_read()
280 if (size > (max_size - offset)) in rockchip_rk3288_efuse_read()
281 size = max_size - offset; in rockchip_rk3288_efuse_read()
284 writel(RK3288_LOAD | RK3288_PGENB, &efuse->ctrl); in rockchip_rk3288_efuse_read()
287 while (size--) { in rockchip_rk3288_efuse_read()
288 writel(readl(&efuse->ctrl) & in rockchip_rk3288_efuse_read()
290 &efuse->ctrl); in rockchip_rk3288_efuse_read()
292 writel(readl(&efuse->ctrl) | in rockchip_rk3288_efuse_read()
294 &efuse->ctrl); in rockchip_rk3288_efuse_read()
297 writel(readl(&efuse->ctrl) | in rockchip_rk3288_efuse_read()
298 RK3288_STROBE, &efuse->ctrl); in rockchip_rk3288_efuse_read()
301 *buffer++ = readl(&efuse->dout); in rockchip_rk3288_efuse_read()
303 writel(readl(&efuse->ctrl) & in rockchip_rk3288_efuse_read()
304 (~RK3288_STROBE), &efuse->ctrl); in rockchip_rk3288_efuse_read()
309 writel(RK3288_PGENB | RK3288_CSB, &efuse->ctrl); in rockchip_rk3288_efuse_read()
316 void *buf, int size) in rockchip_rk3288_efuse_secure_read() argument
319 struct rockchip_efuse_regs *efuse = in rockchip_rk3288_efuse_secure_read() local
320 (struct rockchip_efuse_regs *)plat->base; in rockchip_rk3288_efuse_secure_read()
325 if (size > (max_size - offset)) in rockchip_rk3288_efuse_secure_read()
326 size = max_size - offset; in rockchip_rk3288_efuse_secure_read()
329 sip_smc_secure_reg_write((ulong)&efuse->ctrl, in rockchip_rk3288_efuse_secure_read()
332 while (size--) { in rockchip_rk3288_efuse_secure_read()
333 res = sip_smc_secure_reg_read((ulong)&efuse->ctrl); in rockchip_rk3288_efuse_secure_read()
334 sip_smc_secure_reg_write((ulong)&efuse->ctrl, res.a1 & in rockchip_rk3288_efuse_secure_read()
337 res = sip_smc_secure_reg_read((ulong)&efuse->ctrl); in rockchip_rk3288_efuse_secure_read()
338 sip_smc_secure_reg_write((ulong)&efuse->ctrl, res.a1 | in rockchip_rk3288_efuse_secure_read()
343 res = sip_smc_secure_reg_read((ulong)&efuse->ctrl); in rockchip_rk3288_efuse_secure_read()
344 sip_smc_secure_reg_write((ulong)&efuse->ctrl, in rockchip_rk3288_efuse_secure_read()
348 res = sip_smc_secure_reg_read((ulong)&efuse->dout); in rockchip_rk3288_efuse_secure_read()
351 res = sip_smc_secure_reg_read((ulong)&efuse->ctrl); in rockchip_rk3288_efuse_secure_read()
352 sip_smc_secure_reg_write((ulong)&efuse->ctrl, in rockchip_rk3288_efuse_secure_read()
358 sip_smc_secure_reg_write((ulong)&efuse->ctrl, in rockchip_rk3288_efuse_secure_read()
366 void *buf, int size) in rockchip_rk3328_efuse_read() argument
369 struct rockchip_efuse_regs *efuse = in rockchip_rk3328_efuse_read() local
370 (struct rockchip_efuse_regs *)plat->base; in rockchip_rk3328_efuse_read()
376 /* Max non-secure Byte */ in rockchip_rk3328_efuse_read()
377 if (size > 32) in rockchip_rk3328_efuse_read()
378 size = 32; in rockchip_rk3328_efuse_read()
380 /* 128 Byte efuse, 96 Byte for secure, 32 Byte for non-secure */ in rockchip_rk3328_efuse_read()
384 addr_end = roundup(offset + size, RK3399_BYTES_PER_FUSE) / in rockchip_rk3328_efuse_read()
387 addr_len = addr_end - addr_start; in rockchip_rk3328_efuse_read()
391 return -ENOMEM; in rockchip_rk3328_efuse_read()
396 &efuse->auto_ctrl); in rockchip_rk3328_efuse_read()
398 status = readl(&efuse->int_status); in rockchip_rk3328_efuse_read()
400 ret = -EIO; in rockchip_rk3328_efuse_read()
403 out_value = readl(&efuse->dout2); in rockchip_rk3328_efuse_read()
404 writel(RK3328_INT_FINISH, &efuse->int_status); in rockchip_rk3328_efuse_read()
409 memcpy(buf, buffer + addr_offset, size); in rockchip_rk3328_efuse_read()
417 void *buf, int size) in rockchip_efuse_read() argument
423 return -ENOSYS; in rockchip_efuse_read()
425 return (*efuse_read)(dev, offset, buf, size); in rockchip_efuse_read()
430 *buf = device_is_compatible(dev, "rockchip,rk3288-secure-efuse") ? in rockchip_efuse_capatiblity()
439 int ret = -EINVAL; in rockchip_efuse_ioctl()
459 plat->base = dev_read_addr_ptr(dev); in rockchip_efuse_ofdata_to_platdata()
465 .compatible = "rockchip,rk1808-efuse",
470 .compatible = "rockchip,rk3288-secure-efuse",
475 .compatible = "rockchip,rk3066a-efuse",
479 .compatible = "rockchip,rk3188-efuse",
483 .compatible = "rockchip,rk322x-efuse",
487 .compatible = "rockchip,rk3328-efuse",
492 .compatible = "rockchip,rk3368-efuse",
497 .compatible = "rockchip,rk3399-efuse",