| .. | .. |
|---|
| 87 | 87 | #define TRNG_v1_VERSION_CODE 0x46bc |
|---|
| 88 | 88 | /* end of TRNG_V1 register define */ |
|---|
| 89 | 89 | |
|---|
| 90 | +/* start of RKRNG register define */ |
|---|
| 91 | +#define RKRNG_CTRL 0x0010 |
|---|
| 92 | +#define RKRNG_CTRL_INST_REQ BIT(0) |
|---|
| 93 | +#define RKRNG_CTRL_RESEED_REQ BIT(1) |
|---|
| 94 | +#define RKRNG_CTRL_TEST_REQ BIT(2) |
|---|
| 95 | +#define RKRNG_CTRL_SW_DRNG_REQ BIT(3) |
|---|
| 96 | +#define RKRNG_CTRL_SW_TRNG_REQ BIT(4) |
|---|
| 97 | + |
|---|
| 98 | +#define RKRNG_STATE 0x0014 |
|---|
| 99 | +#define RKRNG_STATE_INST_ACK BIT(0) |
|---|
| 100 | +#define RKRNG_STATE_RESEED_ACK BIT(1) |
|---|
| 101 | +#define RKRNG_STATE_TEST_ACK BIT(2) |
|---|
| 102 | +#define RKRNG_STATE_SW_DRNG_ACK BIT(3) |
|---|
| 103 | +#define RKRNG_STATE_SW_TRNG_ACK BIT(4) |
|---|
| 104 | + |
|---|
| 105 | +/* DRNG_DATA_0 ~ DNG_DATA_7 */ |
|---|
| 106 | +#define RKRNG_DRNG_DATA_0 0x0070 |
|---|
| 107 | +#define RKRNG_DRNG_DATA_7 0x008C |
|---|
| 108 | + |
|---|
| 109 | +/* end of RKRNG register define */ |
|---|
| 110 | + |
|---|
| 90 | 111 | struct rk_rng_soc_data { |
|---|
| 91 | 112 | u32 default_offset; |
|---|
| 92 | 113 | |
|---|
| .. | .. |
|---|
| 178 | 199 | *(u32 *)(buf + i) = be32_to_cpu(rk_rng_readl(rng, offset + i)); |
|---|
| 179 | 200 | } |
|---|
| 180 | 201 | |
|---|
| 181 | | -static int rk_crypto_v1_read(struct hwrng *rng, void *buf, size_t max, bool wait) |
|---|
| 202 | +static int crypto_v1_read(struct hwrng *rng, void *buf, size_t max, bool wait) |
|---|
| 182 | 203 | { |
|---|
| 183 | 204 | int ret = 0; |
|---|
| 184 | 205 | u32 reg_ctrl = 0; |
|---|
| .. | .. |
|---|
| 211 | 232 | return ret; |
|---|
| 212 | 233 | } |
|---|
| 213 | 234 | |
|---|
| 214 | | -static int rk_crypto_v2_read(struct hwrng *rng, void *buf, size_t max, bool wait) |
|---|
| 235 | +static int crypto_v2_read(struct hwrng *rng, void *buf, size_t max, bool wait) |
|---|
| 215 | 236 | { |
|---|
| 216 | 237 | int ret = 0; |
|---|
| 217 | 238 | u32 reg_ctrl = 0; |
|---|
| .. | .. |
|---|
| 246 | 267 | return ret; |
|---|
| 247 | 268 | } |
|---|
| 248 | 269 | |
|---|
| 249 | | -static int rk_trng_v1_init(struct hwrng *rng) |
|---|
| 270 | +static int trng_v1_init(struct hwrng *rng) |
|---|
| 250 | 271 | { |
|---|
| 251 | 272 | int ret; |
|---|
| 252 | 273 | uint32_t auto_reseed_cnt = 1000; |
|---|
| 253 | 274 | uint32_t reg_ctrl, status, version; |
|---|
| 254 | 275 | struct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng); |
|---|
| 255 | | - |
|---|
| 256 | | - ret = pm_runtime_get_sync(rk_rng->dev); |
|---|
| 257 | | - if (ret < 0) { |
|---|
| 258 | | - pm_runtime_put_noidle(rk_rng->dev); |
|---|
| 259 | | - return ret; |
|---|
| 260 | | - } |
|---|
| 261 | 276 | |
|---|
| 262 | 277 | version = rk_rng_readl(rk_rng, TRNG_V1_VERSION); |
|---|
| 263 | 278 | if (version != TRNG_v1_VERSION_CODE) { |
|---|
| .. | .. |
|---|
| 296 | 311 | |
|---|
| 297 | 312 | ret = 0; |
|---|
| 298 | 313 | exit: |
|---|
| 299 | | - pm_runtime_mark_last_busy(rk_rng->dev); |
|---|
| 300 | | - pm_runtime_put_sync_autosuspend(rk_rng->dev); |
|---|
| 301 | 314 | |
|---|
| 302 | 315 | return ret; |
|---|
| 303 | 316 | } |
|---|
| 304 | 317 | |
|---|
| 305 | | -static int rk_trng_v1_read(struct hwrng *rng, void *buf, size_t max, bool wait) |
|---|
| 318 | +static int trng_v1_read(struct hwrng *rng, void *buf, size_t max, bool wait) |
|---|
| 306 | 319 | { |
|---|
| 307 | 320 | int ret = 0; |
|---|
| 308 | 321 | u32 reg_ctrl = 0; |
|---|
| .. | .. |
|---|
| 345 | 358 | return ret; |
|---|
| 346 | 359 | } |
|---|
| 347 | 360 | |
|---|
| 348 | | -static const struct rk_rng_soc_data rk_crypto_v1_soc_data = { |
|---|
| 361 | +static int rkrng_init(struct hwrng *rng) |
|---|
| 362 | +{ |
|---|
| 363 | + struct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng); |
|---|
| 364 | + u32 reg = 0; |
|---|
| 365 | + |
|---|
| 366 | + rk_rng_writel(rk_rng, HIWORD_UPDATE(0, 0xffff, 0), RKRNG_CTRL); |
|---|
| 367 | + |
|---|
| 368 | + reg = rk_rng_readl(rk_rng, RKRNG_STATE); |
|---|
| 369 | + rk_rng_writel(rk_rng, reg, RKRNG_STATE); |
|---|
| 370 | + |
|---|
| 371 | + return 0; |
|---|
| 372 | +} |
|---|
| 373 | + |
|---|
| 374 | +static int rkrng_read(struct hwrng *rng, void *buf, size_t max, bool wait) |
|---|
| 375 | +{ |
|---|
| 376 | + struct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng); |
|---|
| 377 | + u32 reg_ctrl = 0; |
|---|
| 378 | + int ret; |
|---|
| 379 | + |
|---|
| 380 | + reg_ctrl = RKRNG_CTRL_SW_DRNG_REQ; |
|---|
| 381 | + |
|---|
| 382 | + rk_rng_writel(rk_rng, HIWORD_UPDATE(reg_ctrl, 0xffff, 0), RKRNG_CTRL); |
|---|
| 383 | + |
|---|
| 384 | + ret = readl_poll_timeout(rk_rng->mem + RKRNG_STATE, reg_ctrl, |
|---|
| 385 | + (reg_ctrl & RKRNG_STATE_SW_DRNG_ACK), |
|---|
| 386 | + ROCKCHIP_POLL_PERIOD_US, |
|---|
| 387 | + ROCKCHIP_POLL_TIMEOUT_US); |
|---|
| 388 | + |
|---|
| 389 | + if (ret) |
|---|
| 390 | + goto exit; |
|---|
| 391 | + |
|---|
| 392 | + rk_rng_writel(rk_rng, reg_ctrl, RKRNG_STATE); |
|---|
| 393 | + |
|---|
| 394 | + ret = min_t(size_t, max, RK_MAX_RNG_BYTE); |
|---|
| 395 | + |
|---|
| 396 | + rk_rng_read_regs(rk_rng, RKRNG_DRNG_DATA_0, buf, ret); |
|---|
| 397 | + |
|---|
| 398 | +exit: |
|---|
| 399 | + /* close TRNG */ |
|---|
| 400 | + rk_rng_writel(rk_rng, HIWORD_UPDATE(0, 0xffff, 0), RKRNG_CTRL); |
|---|
| 401 | + |
|---|
| 402 | + return ret; |
|---|
| 403 | +} |
|---|
| 404 | + |
|---|
| 405 | +static const struct rk_rng_soc_data crypto_v1_soc_data = { |
|---|
| 349 | 406 | .default_offset = 0, |
|---|
| 350 | 407 | |
|---|
| 351 | | - .rk_rng_read = rk_crypto_v1_read, |
|---|
| 408 | + .rk_rng_read = crypto_v1_read, |
|---|
| 352 | 409 | }; |
|---|
| 353 | 410 | |
|---|
| 354 | | -static const struct rk_rng_soc_data rk_crypto_v2_soc_data = { |
|---|
| 411 | +static const struct rk_rng_soc_data crypto_v2_soc_data = { |
|---|
| 355 | 412 | .default_offset = CRYPTO_V2_RNG_DEFAULT_OFFSET, |
|---|
| 356 | 413 | |
|---|
| 357 | | - .rk_rng_read = rk_crypto_v2_read, |
|---|
| 414 | + .rk_rng_read = crypto_v2_read, |
|---|
| 358 | 415 | }; |
|---|
| 359 | 416 | |
|---|
| 360 | | -static const struct rk_rng_soc_data rk_trng_v1_soc_data = { |
|---|
| 417 | +static const struct rk_rng_soc_data trng_v1_soc_data = { |
|---|
| 361 | 418 | .default_offset = 0, |
|---|
| 362 | 419 | |
|---|
| 363 | | - .rk_rng_init = rk_trng_v1_init, |
|---|
| 364 | | - .rk_rng_read = rk_trng_v1_read, |
|---|
| 420 | + .rk_rng_init = trng_v1_init, |
|---|
| 421 | + .rk_rng_read = trng_v1_read, |
|---|
| 422 | +}; |
|---|
| 423 | + |
|---|
| 424 | +static const struct rk_rng_soc_data rkrng_soc_data = { |
|---|
| 425 | + .default_offset = 0, |
|---|
| 426 | + |
|---|
| 427 | + .rk_rng_init = rkrng_init, |
|---|
| 428 | + .rk_rng_read = rkrng_read, |
|---|
| 365 | 429 | }; |
|---|
| 366 | 430 | |
|---|
| 367 | 431 | static const struct of_device_id rk_rng_dt_match[] = { |
|---|
| 368 | 432 | { |
|---|
| 369 | 433 | .compatible = "rockchip,cryptov1-rng", |
|---|
| 370 | | - .data = (void *)&rk_crypto_v1_soc_data, |
|---|
| 434 | + .data = (void *)&crypto_v1_soc_data, |
|---|
| 371 | 435 | }, |
|---|
| 372 | 436 | { |
|---|
| 373 | 437 | .compatible = "rockchip,cryptov2-rng", |
|---|
| 374 | | - .data = (void *)&rk_crypto_v2_soc_data, |
|---|
| 438 | + .data = (void *)&crypto_v2_soc_data, |
|---|
| 375 | 439 | }, |
|---|
| 376 | 440 | { |
|---|
| 377 | 441 | .compatible = "rockchip,trngv1", |
|---|
| 378 | | - .data = (void *)&rk_trng_v1_soc_data, |
|---|
| 442 | + .data = (void *)&trng_v1_soc_data, |
|---|
| 443 | + }, |
|---|
| 444 | + { |
|---|
| 445 | + .compatible = "rockchip,rkrng", |
|---|
| 446 | + .data = (void *)&rkrng_soc_data, |
|---|
| 379 | 447 | }, |
|---|
| 380 | 448 | { }, |
|---|
| 381 | 449 | }; |
|---|
| .. | .. |
|---|
| 445 | 513 | } |
|---|
| 446 | 514 | |
|---|
| 447 | 515 | /* for some platform need hardware operation when probe */ |
|---|
| 448 | | - if (rk_rng->soc_data->rk_rng_init) |
|---|
| 516 | + if (rk_rng->soc_data->rk_rng_init) { |
|---|
| 517 | + pm_runtime_get_sync(rk_rng->dev); |
|---|
| 518 | + |
|---|
| 449 | 519 | ret = rk_rng->soc_data->rk_rng_init(&rk_rng->rng); |
|---|
| 450 | 520 | |
|---|
| 521 | + pm_runtime_mark_last_busy(rk_rng->dev); |
|---|
| 522 | + pm_runtime_put_sync_autosuspend(rk_rng->dev); |
|---|
| 523 | + } |
|---|
| 524 | + |
|---|
| 451 | 525 | return ret; |
|---|
| 452 | 526 | } |
|---|
| 453 | 527 | |
|---|