1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (c) 2019, STMicroelectronics 4 * Copyright (c) 2021, Microchip 5 */ 6 7 #include <at91_clk.h> 8 #include <confine_array_index.h> 9 #include <drivers/scmi-msg.h> 10 #include <drivers/scmi.h> 11 #include <dt-bindings/clock/at91.h> 12 #include <initcall.h> 13 #include <tee_api_defines.h> 14 15 static_assert(SMT_BUF_SLOT_SIZE <= CFG_SCMI_SHMEM_SIZE); 16 17 register_phys_mem(MEM_AREA_IO_NSEC, CFG_SCMI_SHMEM_START, CFG_SCMI_SHMEM_SIZE); 18 19 struct channel_resources { 20 struct scmi_msg_channel *channel; 21 }; 22 23 static const struct channel_resources scmi_channel[] = { 24 [0] = { 25 .channel = &(struct scmi_msg_channel){ 26 .shm_addr = { .pa = CFG_SCMI_SHMEM_START }, 27 .shm_size = SMT_BUF_SLOT_SIZE, 28 }, 29 }, 30 }; 31 32 static const struct channel_resources *find_resource(unsigned int channel_id) 33 { 34 assert(channel_id < ARRAY_SIZE(scmi_channel)); 35 36 return scmi_channel + channel_id; 37 } 38 39 struct scmi_msg_channel *plat_scmi_get_channel(unsigned int channel_id) 40 { 41 const size_t max_id = ARRAY_SIZE(scmi_channel); 42 unsigned int confined_id = confine_array_index(channel_id, max_id); 43 44 if (channel_id >= max_id) 45 return NULL; 46 47 return find_resource(confined_id)->channel; 48 } 49 50 static const char vendor[] = "Microchip"; 51 static const char sub_vendor[] = ""; 52 53 const char *plat_scmi_vendor_name(void) 54 { 55 return vendor; 56 } 57 58 const char *plat_scmi_sub_vendor_name(void) 59 { 60 return sub_vendor; 61 } 62 63 /* Currently supporting only SCMI Base protocol */ 64 static const uint8_t plat_protocol_list[] = { 65 SCMI_PROTOCOL_ID_CLOCK, 66 0 /* Null termination */ 67 }; 68 69 size_t plat_scmi_protocol_count(void) 70 { 71 return ARRAY_SIZE(plat_protocol_list) - 1; 72 } 73 74 const uint8_t *plat_scmi_protocol_list(unsigned int channel_id __unused) 75 { 76 return plat_protocol_list; 77 } 78 79 struct sam_pmc_clk { 80 unsigned int scmi_id; 81 unsigned int pmc_type; 82 unsigned int pmc_id; 83 }; 84 85 #ifdef CFG_SAMA7G5 86 static const struct sam_pmc_clk pmc_clks[] = { 87 { 88 .scmi_id = AT91_SCMI_CLK_CORE_MCK, 89 .pmc_type = PMC_TYPE_CORE, 90 .pmc_id = PMC_MCK 91 }, 92 { 93 .scmi_id = AT91_SCMI_CLK_CORE_UTMI, 94 .pmc_type = PMC_TYPE_CORE, 95 .pmc_id = PMC_UTMI 96 }, 97 { 98 .scmi_id = AT91_SCMI_CLK_CORE_CPUPLLCK, 99 .pmc_type = PMC_TYPE_CORE, 100 .pmc_id = PMC_CPUPLL 101 }, 102 { 103 .scmi_id = AT91_SCMI_CLK_CORE_MAIN, 104 .pmc_type = PMC_TYPE_CORE, 105 .pmc_id = PMC_MAIN 106 }, 107 { 108 .scmi_id = AT91_SCMI_CLK_CORE_SYSPLLCK, 109 .pmc_type = PMC_TYPE_CORE, 110 .pmc_id = PMC_SYSPLL 111 }, 112 113 { 114 .scmi_id = AT91_SCMI_CLK_CORE_AUDIOPLLCK, 115 .pmc_type = PMC_TYPE_CORE, 116 .pmc_id = PMC_AUDIOPMCPLL 117 }, 118 119 { 120 .scmi_id = AT91_SCMI_CLK_CORE_MCK_PRES, 121 .pmc_type = PMC_TYPE_CORE, 122 .pmc_id = PMC_MCK_PRES 123 }, 124 { 125 .scmi_id = AT91_SCMI_CLK_CORE_DDRPLLCK, 126 .pmc_type = PMC_TYPE_CORE, 127 .pmc_id = PMC_DDRPLL 128 }, 129 { 130 .scmi_id = AT91_SCMI_CLK_CORE_IMGPLLCK, 131 .pmc_type = PMC_TYPE_CORE, 132 .pmc_id = PMC_IMGPLL 133 }, 134 { 135 .scmi_id = AT91_SCMI_CLK_CORE_ETHPLLCK, 136 .pmc_type = PMC_TYPE_CORE, 137 .pmc_id = PMC_ETHPLL 138 }, 139 { 140 .scmi_id = AT91_SCMI_CLK_UTMI1, 141 .pmc_type = PMC_TYPE_CORE, 142 .pmc_id = PMC_UTMI1 143 }, 144 { 145 .scmi_id = AT91_SCMI_CLK_UTMI2, 146 .pmc_type = PMC_TYPE_CORE, 147 .pmc_id = PMC_UTMI2 148 }, 149 { 150 .scmi_id = AT91_SCMI_CLK_UTMI3, 151 .pmc_type = PMC_TYPE_CORE, 152 .pmc_id = PMC_UTMI3 153 }, 154 { 155 .scmi_id = AT91_SCMI_CLK_SYSTEM_PCK0, 156 .pmc_type = PMC_TYPE_SYSTEM, 157 .pmc_id = 8 158 }, 159 { 160 .scmi_id = AT91_SCMI_CLK_SYSTEM_PCK1, 161 .pmc_type = PMC_TYPE_SYSTEM, 162 .pmc_id = 9 163 }, 164 { 165 .scmi_id = AT91_SCMI_CLK_SYSTEM_PCK2, 166 .pmc_type = PMC_TYPE_SYSTEM, 167 .pmc_id = 10 168 }, 169 { 170 .scmi_id = AT91_SCMI_CLK_SYSTEM_PCK3, 171 .pmc_type = PMC_TYPE_SYSTEM, 172 .pmc_id = 11 173 }, 174 { 175 .scmi_id = AT91_SCMI_CLK_SYSTEM_PCK4, 176 .pmc_type = PMC_TYPE_SYSTEM, 177 .pmc_id = 12 178 }, 179 { 180 .scmi_id = AT91_SCMI_CLK_SYSTEM_PCK5, 181 .pmc_type = PMC_TYPE_SYSTEM, 182 .pmc_id = 13 183 }, 184 { 185 .scmi_id = AT91_SCMI_CLK_SYSTEM_PCK6, 186 .pmc_type = PMC_TYPE_SYSTEM, 187 .pmc_id = 14 188 }, 189 { 190 .scmi_id = AT91_SCMI_CLK_SYSTEM_PCK7, 191 .pmc_type = PMC_TYPE_SYSTEM, 192 .pmc_id = 15 193 }, 194 { 195 .scmi_id = AT91_SCMI_CLK_PERIPH_MACB0_CLK, 196 .pmc_type = PMC_TYPE_PERIPHERAL, 197 .pmc_id = ID_GMAC0 198 }, 199 { 200 .scmi_id = AT91_SCMI_CLK_GCK_MACB0_GCLK, 201 .pmc_type = PMC_TYPE_GCK, 202 .pmc_id = ID_GMAC0 203 }, 204 { 205 .scmi_id = AT91_SCMI_CLK_GCK_MACB0_TSU, 206 .pmc_type = PMC_TYPE_GCK, 207 .pmc_id = ID_GMAC0_TSU 208 }, 209 { 210 .scmi_id = AT91_SCMI_CLK_PERIPH_TDES_CLK, 211 .pmc_type = PMC_TYPE_PERIPHERAL, 212 .pmc_id = ID_TDES 213 }, 214 { 215 .scmi_id = AT91_SCMI_CLK_PERIPH_HSMC_CLK, 216 .pmc_type = PMC_TYPE_PERIPHERAL, 217 .pmc_id = ID_HSMC 218 }, 219 { 220 .scmi_id = AT91_SCMI_CLK_PERIPH_PIOA_CLK, 221 .pmc_type = PMC_TYPE_PERIPHERAL, 222 .pmc_id = ID_PIOA 223 }, 224 { 225 .scmi_id = AT91_SCMI_CLK_PERIPH_FLX0_CLK, 226 .pmc_type = PMC_TYPE_PERIPHERAL, 227 .pmc_id = ID_FLEXCOM0 228 }, 229 { 230 .scmi_id = AT91_SCMI_CLK_PERIPH_FLX1_CLK, 231 .pmc_type = PMC_TYPE_PERIPHERAL, 232 .pmc_id = ID_FLEXCOM1 233 }, 234 { 235 .scmi_id = AT91_SCMI_CLK_PERIPH_FLX2_CLK, 236 .pmc_type = PMC_TYPE_PERIPHERAL, 237 .pmc_id = ID_FLEXCOM2 238 }, 239 { 240 .scmi_id = AT91_SCMI_CLK_PERIPH_FLX3_CLK, 241 .pmc_type = PMC_TYPE_PERIPHERAL, 242 .pmc_id = ID_FLEXCOM3 243 }, 244 { 245 .scmi_id = AT91_SCMI_CLK_PERIPH_FLX4_CLK, 246 .pmc_type = PMC_TYPE_PERIPHERAL, 247 .pmc_id = ID_FLEXCOM4 248 }, 249 { 250 .scmi_id = AT91_SCMI_CLK_PERIPH_FLX5_CLK, 251 .pmc_type = PMC_TYPE_PERIPHERAL, 252 .pmc_id = ID_FLEXCOM5 253 }, 254 { 255 .scmi_id = AT91_SCMI_CLK_PERIPH_FLX6_CLK, 256 .pmc_type = PMC_TYPE_PERIPHERAL, 257 .pmc_id = ID_FLEXCOM6 258 }, 259 { 260 .scmi_id = AT91_SCMI_CLK_PERIPH_FLX7_CLK, 261 .pmc_type = PMC_TYPE_PERIPHERAL, 262 .pmc_id = ID_FLEXCOM7 263 }, 264 { 265 .scmi_id = AT91_SCMI_CLK_PERIPH_FLX8_CLK, 266 .pmc_type = PMC_TYPE_PERIPHERAL, 267 .pmc_id = ID_FLEXCOM8 268 }, 269 { 270 .scmi_id = AT91_SCMI_CLK_PERIPH_FLX9_CLK, 271 .pmc_type = PMC_TYPE_PERIPHERAL, 272 .pmc_id = ID_FLEXCOM9 273 }, 274 { 275 .scmi_id = AT91_SCMI_CLK_PERIPH_FLX10_CLK, 276 .pmc_type = PMC_TYPE_PERIPHERAL, 277 .pmc_id = ID_FLEXCOM10 278 }, 279 { 280 .scmi_id = AT91_SCMI_CLK_PERIPH_FLX11_CLK, 281 .pmc_type = PMC_TYPE_PERIPHERAL, 282 .pmc_id = ID_FLEXCOM11 283 }, 284 { 285 .scmi_id = AT91_SCMI_CLK_PERIPH_TCB0_CLK, 286 .pmc_type = PMC_TYPE_PERIPHERAL, 287 .pmc_id = ID_TC0_CHANNEL0 288 }, 289 { 290 .scmi_id = AT91_SCMI_CLK_PERIPH_TCB1_CLK, 291 .pmc_type = PMC_TYPE_PERIPHERAL, 292 .pmc_id = ID_TC1_CHANNEL0 293 }, 294 { 295 .scmi_id = AT91_SCMI_CLK_PERIPH_PWM_CLK, 296 .pmc_type = PMC_TYPE_PERIPHERAL, 297 .pmc_id = ID_PWM 298 }, 299 { 300 .scmi_id = AT91_SCMI_CLK_GCK_ADC_GCLK, 301 .pmc_type = PMC_TYPE_GCK, 302 .pmc_id = ID_ADC 303 }, 304 { 305 .scmi_id = AT91_SCMI_CLK_PERIPH_UHPHS_CLK, 306 .pmc_type = PMC_TYPE_PERIPHERAL, 307 .pmc_id = ID_UHPHS 308 }, 309 { 310 .scmi_id = AT91_SCMI_CLK_PERIPH_UDPHSA_CLK, 311 .pmc_type = PMC_TYPE_PERIPHERAL, 312 .pmc_id = ID_UDPHSA 313 }, 314 { 315 .scmi_id = AT91_SCMI_CLK_PERIPH_UDPHSB_CLK, 316 .pmc_type = PMC_TYPE_PERIPHERAL, 317 .pmc_id = ID_UDPHSB 318 }, 319 { 320 .scmi_id = AT91_SCMI_CLK_PERIPH_SSC0_CLK, 321 .pmc_type = PMC_TYPE_PERIPHERAL, 322 .pmc_id = ID_SSC0 323 }, 324 { 325 .scmi_id = AT91_SCMI_CLK_PERIPH_SSC1_CLK, 326 .pmc_type = PMC_TYPE_PERIPHERAL, 327 .pmc_id = ID_SSC1 328 }, 329 { 330 .scmi_id = AT91_SCMI_CLK_PERIPH_TRNG_CLK, 331 .pmc_type = PMC_TYPE_PERIPHERAL, 332 .pmc_id = ID_TRNG 333 }, 334 { 335 .scmi_id = AT91_SCMI_CLK_PERIPH_PDMC0_CLK, 336 .pmc_type = PMC_TYPE_PERIPHERAL, 337 .pmc_id = ID_PDMC0 338 }, 339 { 340 .scmi_id = AT91_SCMI_CLK_PERIPH_PDMC1_CLK, 341 .pmc_type = PMC_TYPE_PERIPHERAL, 342 .pmc_id = ID_PDMC1 343 }, 344 { 345 .scmi_id = AT91_SCMI_CLK_PERIPH_SECURAM_CLK, 346 .pmc_type = PMC_TYPE_PERIPHERAL, 347 .pmc_id = ID_SECURAM 348 }, 349 { 350 .scmi_id = AT91_SCMI_CLK_PERIPH_I2S0_CLK, 351 .pmc_type = PMC_TYPE_PERIPHERAL, 352 .pmc_id = ID_I2SMCC0 353 }, 354 { 355 .scmi_id = AT91_SCMI_CLK_PERIPH_I2S1_CLK, 356 .pmc_type = PMC_TYPE_PERIPHERAL, 357 .pmc_id = ID_I2SMCC1 358 }, 359 { 360 .scmi_id = AT91_SCMI_CLK_PERIPH_CAN0_CLK, 361 .pmc_type = PMC_TYPE_PERIPHERAL, 362 .pmc_id = ID_MCAN0 363 }, 364 { 365 .scmi_id = AT91_SCMI_CLK_PERIPH_CAN1_CLK, 366 .pmc_type = PMC_TYPE_PERIPHERAL, 367 .pmc_id = ID_MCAN1 368 }, 369 { 370 .scmi_id = AT91_SCMI_CLK_PERIPH_CAN2_CLK, 371 .pmc_type = PMC_TYPE_PERIPHERAL, 372 .pmc_id = ID_MCAN2 373 }, 374 { 375 .scmi_id = AT91_SCMI_CLK_PERIPH_CAN3_CLK, 376 .pmc_type = PMC_TYPE_PERIPHERAL, 377 .pmc_id = ID_MCAN3 378 }, 379 { 380 .scmi_id = AT91_SCMI_CLK_PERIPH_CAN4_CLK, 381 .pmc_type = PMC_TYPE_PERIPHERAL, 382 .pmc_id = ID_MCAN4 383 }, 384 { 385 .scmi_id = AT91_SCMI_CLK_PERIPH_CAN5_CLK, 386 .pmc_type = PMC_TYPE_PERIPHERAL, 387 .pmc_id = ID_MCAN5 388 }, 389 { 390 .scmi_id = AT91_SCMI_CLK_PERIPH_DMA0_CLK, 391 .pmc_type = PMC_TYPE_PERIPHERAL, 392 .pmc_id = ID_XDMAC0 393 }, 394 { 395 .scmi_id = AT91_SCMI_CLK_PERIPH_DMA1_CLK, 396 .pmc_type = PMC_TYPE_PERIPHERAL, 397 .pmc_id = ID_XDMAC1 398 }, 399 { 400 .scmi_id = AT91_SCMI_CLK_PERIPH_DMA2_CLK, 401 .pmc_type = PMC_TYPE_PERIPHERAL, 402 .pmc_id = ID_XDMAC2 403 }, 404 { 405 .scmi_id = AT91_SCMI_CLK_PERIPH_SPDIFRX_CLK, 406 .pmc_type = PMC_TYPE_PERIPHERAL, 407 .pmc_id = ID_SPDIFRX 408 }, 409 { 410 .scmi_id = AT91_SCMI_CLK_PERIPH_SPDIFTX_CLK, 411 .pmc_type = PMC_TYPE_PERIPHERAL, 412 .pmc_id = ID_SPDIFTX 413 }, 414 { 415 .scmi_id = AT91_SCMI_CLK_GCK_SPDIFRX_GCLK, 416 .pmc_type = PMC_TYPE_GCK, 417 .pmc_id = ID_SPDIFRX 418 }, 419 { 420 .scmi_id = AT91_SCMI_CLK_GCK_SPDIFTX_GCLK, 421 .pmc_type = PMC_TYPE_GCK, 422 .pmc_id = ID_SPDIFTX 423 }, 424 { 425 .scmi_id = AT91_SCMI_CLK_PERIPH_AES_CLK, 426 .pmc_type = PMC_TYPE_PERIPHERAL, 427 .pmc_id = ID_AES 428 }, 429 { 430 .scmi_id = AT91_SCMI_CLK_PERIPH_AESB_CLK, 431 .pmc_type = PMC_TYPE_PERIPHERAL, 432 .pmc_id = ID_TZAESBASC 433 }, 434 { 435 .scmi_id = AT91_SCMI_CLK_PERIPH_SHA_CLK, 436 .pmc_type = PMC_TYPE_PERIPHERAL, 437 .pmc_id = ID_SHA 438 }, 439 { 440 .scmi_id = AT91_SCMI_CLK_PERIPH_SDMMC0_HCLK, 441 .pmc_type = PMC_TYPE_PERIPHERAL, 442 .pmc_id = ID_SDMMC0 443 }, 444 { 445 .scmi_id = AT91_SCMI_CLK_PERIPH_SDMMC1_HCLK, 446 .pmc_type = PMC_TYPE_PERIPHERAL, 447 .pmc_id = ID_SDMMC1 448 }, 449 { 450 .scmi_id = AT91_SCMI_CLK_PERIPH_SDMMC2_HCLK, 451 .pmc_type = PMC_TYPE_PERIPHERAL, 452 .pmc_id = ID_SDMMC2 453 }, 454 { 455 .scmi_id = AT91_SCMI_CLK_PERIPH_ISC_CLK, 456 .pmc_type = PMC_TYPE_PERIPHERAL, 457 .pmc_id = ID_ISC 458 }, 459 { 460 .scmi_id = AT91_SCMI_CLK_PERIPH_QSPI0_CLK, 461 .pmc_type = PMC_TYPE_PERIPHERAL, 462 .pmc_id = ID_QSPI0 463 }, 464 { 465 .scmi_id = AT91_SCMI_CLK_PERIPH_QSPI1_CLK, 466 .pmc_type = PMC_TYPE_PERIPHERAL, 467 .pmc_id = ID_QSPI1 468 }, 469 { 470 .scmi_id = AT91_SCMI_CLK_GCK_QSPI0_GCLK, 471 .pmc_type = PMC_TYPE_GCK, 472 .pmc_id = ID_QSPI0 473 }, 474 { 475 .scmi_id = AT91_SCMI_CLK_GCK_QSPI1_GCLK, 476 .pmc_type = PMC_TYPE_GCK, 477 .pmc_id = ID_QSPI1 478 }, 479 { 480 .scmi_id = AT91_SCMI_CLK_GCK_SDMMC0_GCLK, 481 .pmc_type = PMC_TYPE_GCK, 482 .pmc_id = ID_SDMMC0 483 }, 484 { 485 .scmi_id = AT91_SCMI_CLK_GCK_SDMMC1_GCLK, 486 .pmc_type = PMC_TYPE_GCK, 487 .pmc_id = ID_SDMMC1 488 }, 489 { 490 .scmi_id = AT91_SCMI_CLK_GCK_SDMMC2_GCLK, 491 .pmc_type = PMC_TYPE_GCK, 492 .pmc_id = ID_SDMMC2 493 }, 494 { 495 .scmi_id = AT91_SCMI_CLK_GCK_TCB0_GCLK, 496 .pmc_type = PMC_TYPE_GCK, 497 .pmc_id = ID_TC0_CHANNEL0 498 }, 499 { 500 .scmi_id = AT91_SCMI_CLK_GCK_TCB1_GCLK, 501 .pmc_type = PMC_TYPE_GCK, 502 .pmc_id = ID_TC1_CHANNEL0 503 }, 504 { 505 .scmi_id = AT91_SCMI_CLK_GCK_I2S0_GCLK, 506 .pmc_type = PMC_TYPE_GCK, 507 .pmc_id = ID_I2SMCC0 508 }, 509 { 510 .scmi_id = AT91_SCMI_CLK_GCK_I2S1_GCLK, 511 .pmc_type = PMC_TYPE_GCK, 512 .pmc_id = ID_I2SMCC1 513 }, 514 { 515 .scmi_id = AT91_SCMI_CLK_GCK_CAN0_GCLK, 516 .pmc_type = PMC_TYPE_GCK, 517 .pmc_id = ID_MCAN0 518 }, 519 { 520 .scmi_id = AT91_SCMI_CLK_GCK_CAN1_GCLK, 521 .pmc_type = PMC_TYPE_GCK, 522 .pmc_id = ID_MCAN1 523 }, 524 { 525 .scmi_id = AT91_SCMI_CLK_GCK_CAN2_GCLK, 526 .pmc_type = PMC_TYPE_GCK, 527 .pmc_id = ID_MCAN2 528 }, 529 { 530 .scmi_id = AT91_SCMI_CLK_GCK_CAN3_GCLK, 531 .pmc_type = PMC_TYPE_GCK, 532 .pmc_id = ID_MCAN3 533 }, 534 { 535 .scmi_id = AT91_SCMI_CLK_GCK_CAN4_GCLK, 536 .pmc_type = PMC_TYPE_GCK, 537 .pmc_id = ID_MCAN4 538 }, 539 { 540 .scmi_id = AT91_SCMI_CLK_GCK_CAN5_GCLK, 541 .pmc_type = PMC_TYPE_GCK, 542 .pmc_id = ID_MCAN5 543 }, 544 }; 545 #else 546 static const struct sam_pmc_clk pmc_clks[] = { 547 { 548 .scmi_id = AT91_SCMI_CLK_CORE_MCK, 549 .pmc_type = PMC_TYPE_CORE, 550 .pmc_id = PMC_MCK 551 }, 552 { 553 .scmi_id = AT91_SCMI_CLK_CORE_UTMI, 554 .pmc_type = PMC_TYPE_CORE, 555 .pmc_id = PMC_UTMI 556 }, 557 { 558 .scmi_id = AT91_SCMI_CLK_CORE_MAIN, 559 .pmc_type = PMC_TYPE_CORE, 560 .pmc_id = PMC_MAIN 561 }, 562 { 563 .scmi_id = AT91_SCMI_CLK_CORE_MCK2, 564 .pmc_type = PMC_TYPE_CORE, 565 .pmc_id = PMC_MCK2 566 }, 567 { 568 .scmi_id = AT91_SCMI_CLK_CORE_I2S0_MUX, 569 .pmc_type = PMC_TYPE_CORE, 570 .pmc_id = PMC_I2S0_MUX 571 }, 572 { 573 .scmi_id = AT91_SCMI_CLK_CORE_I2S1_MUX, 574 .pmc_type = PMC_TYPE_CORE, 575 .pmc_id = PMC_I2S1_MUX 576 }, 577 { 578 .scmi_id = AT91_SCMI_CLK_CORE_PLLACK, 579 .pmc_type = PMC_TYPE_CORE, 580 .pmc_id = PMC_PLLACK 581 }, 582 { 583 .scmi_id = AT91_SCMI_CLK_CORE_AUDIOPLLCK, 584 .pmc_type = PMC_TYPE_CORE, 585 .pmc_id = PMC_AUDIOPLLCK 586 }, 587 { 588 .scmi_id = AT91_SCMI_CLK_CORE_MCK_PRES, 589 .pmc_type = PMC_TYPE_CORE, 590 .pmc_id = PMC_MCK_PRES 591 }, 592 { 593 .scmi_id = AT91_SCMI_CLK_SYSTEM_DDRCK, 594 .pmc_type = PMC_TYPE_SYSTEM, 595 .pmc_id = 2 596 }, 597 { 598 .scmi_id = AT91_SCMI_CLK_SYSTEM_LCDCK, 599 .pmc_type = PMC_TYPE_SYSTEM, 600 .pmc_id = 3 601 }, 602 { 603 .scmi_id = AT91_SCMI_CLK_SYSTEM_UHPCK, 604 .pmc_type = PMC_TYPE_SYSTEM, 605 .pmc_id = 6 606 }, 607 { 608 .scmi_id = AT91_SCMI_CLK_SYSTEM_UDPCK, 609 .pmc_type = PMC_TYPE_SYSTEM, 610 .pmc_id = 7 611 }, 612 { 613 .scmi_id = AT91_SCMI_CLK_SYSTEM_PCK0, 614 .pmc_type = PMC_TYPE_SYSTEM, 615 .pmc_id = 8 616 }, 617 { 618 .scmi_id = AT91_SCMI_CLK_SYSTEM_PCK1, 619 .pmc_type = PMC_TYPE_SYSTEM, 620 .pmc_id = 9 621 }, 622 { 623 .scmi_id = AT91_SCMI_CLK_SYSTEM_PCK2, 624 .pmc_type = PMC_TYPE_SYSTEM, 625 .pmc_id = 10 626 }, 627 { 628 .scmi_id = AT91_SCMI_CLK_SYSTEM_ISCCK, 629 .pmc_type = PMC_TYPE_SYSTEM, 630 .pmc_id = 18 631 }, 632 { 633 .scmi_id = AT91_SCMI_CLK_PERIPH_MACB0_CLK, 634 .pmc_type = PMC_TYPE_PERIPHERAL, 635 .pmc_id = 5 636 }, 637 { 638 .scmi_id = AT91_SCMI_CLK_PERIPH_TDES_CLK, 639 .pmc_type = PMC_TYPE_PERIPHERAL, 640 .pmc_id = 11 641 }, 642 { 643 .scmi_id = AT91_SCMI_CLK_PERIPH_MATRIX1_CLK, 644 .pmc_type = PMC_TYPE_PERIPHERAL, 645 .pmc_id = 14 646 }, 647 { 648 .scmi_id = AT91_SCMI_CLK_PERIPH_HSMC_CLK, 649 .pmc_type = PMC_TYPE_PERIPHERAL, 650 .pmc_id = 17 651 }, 652 { 653 .scmi_id = AT91_SCMI_CLK_PERIPH_PIOA_CLK, 654 .pmc_type = PMC_TYPE_PERIPHERAL, 655 .pmc_id = 18 656 }, 657 { 658 .scmi_id = AT91_SCMI_CLK_PERIPH_FLX0_CLK, 659 .pmc_type = PMC_TYPE_PERIPHERAL, 660 .pmc_id = 19 661 }, 662 { 663 .scmi_id = AT91_SCMI_CLK_PERIPH_FLX1_CLK, 664 .pmc_type = PMC_TYPE_PERIPHERAL, 665 .pmc_id = 20 666 }, 667 { 668 .scmi_id = AT91_SCMI_CLK_PERIPH_FLX2_CLK, 669 .pmc_type = PMC_TYPE_PERIPHERAL, 670 .pmc_id = 21 671 }, 672 { 673 .scmi_id = AT91_SCMI_CLK_PERIPH_FLX3_CLK, 674 .pmc_type = PMC_TYPE_PERIPHERAL, 675 .pmc_id = 22 676 }, 677 { 678 .scmi_id = AT91_SCMI_CLK_PERIPH_FLX4_CLK, 679 .pmc_type = PMC_TYPE_PERIPHERAL, 680 .pmc_id = 23 681 }, 682 { 683 .scmi_id = AT91_SCMI_CLK_PERIPH_UART0_CLK, 684 .pmc_type = PMC_TYPE_PERIPHERAL, 685 .pmc_id = 24 686 }, 687 { 688 .scmi_id = AT91_SCMI_CLK_PERIPH_UART1_CLK, 689 .pmc_type = PMC_TYPE_PERIPHERAL, 690 .pmc_id = 25 691 }, 692 { 693 .scmi_id = AT91_SCMI_CLK_PERIPH_UART2_CLK, 694 .pmc_type = PMC_TYPE_PERIPHERAL, 695 .pmc_id = 26 696 }, 697 { 698 .scmi_id = AT91_SCMI_CLK_PERIPH_UART3_CLK, 699 .pmc_type = PMC_TYPE_PERIPHERAL, 700 .pmc_id = 27 701 }, 702 { 703 .scmi_id = AT91_SCMI_CLK_PERIPH_UART4_CLK, 704 .pmc_type = PMC_TYPE_PERIPHERAL, 705 .pmc_id = 28 706 }, 707 { 708 .scmi_id = AT91_SCMI_CLK_PERIPH_TWI0_CLK, 709 .pmc_type = PMC_TYPE_PERIPHERAL, 710 .pmc_id = 29 711 }, 712 { 713 .scmi_id = AT91_SCMI_CLK_PERIPH_TWI1_CLK, 714 .pmc_type = PMC_TYPE_PERIPHERAL, 715 .pmc_id = 30 716 }, 717 { 718 .scmi_id = AT91_SCMI_CLK_PERIPH_SPI0_CLK, 719 .pmc_type = PMC_TYPE_PERIPHERAL, 720 .pmc_id = 33 721 }, 722 { 723 .scmi_id = AT91_SCMI_CLK_PERIPH_SPI1_CLK, 724 .pmc_type = PMC_TYPE_PERIPHERAL, 725 .pmc_id = 34 726 }, 727 { 728 .scmi_id = AT91_SCMI_CLK_PERIPH_TCB0_CLK, 729 .pmc_type = PMC_TYPE_PERIPHERAL, 730 .pmc_id = 35 731 }, 732 { 733 .scmi_id = AT91_SCMI_CLK_PERIPH_TCB1_CLK, 734 .pmc_type = PMC_TYPE_PERIPHERAL, 735 .pmc_id = 36 736 }, 737 { 738 .scmi_id = AT91_SCMI_CLK_PERIPH_PWM_CLK, 739 .pmc_type = PMC_TYPE_PERIPHERAL, 740 .pmc_id = 38 741 }, 742 { 743 .scmi_id = AT91_SCMI_CLK_PERIPH_ADC_CLK, 744 .pmc_type = PMC_TYPE_PERIPHERAL, 745 .pmc_id = 40 746 }, 747 { 748 .scmi_id = AT91_SCMI_CLK_PERIPH_UHPHS_CLK, 749 .pmc_type = PMC_TYPE_PERIPHERAL, 750 .pmc_id = 41 751 }, 752 { 753 .scmi_id = AT91_SCMI_CLK_PERIPH_UDPHS_CLK, 754 .pmc_type = PMC_TYPE_PERIPHERAL, 755 .pmc_id = 42 756 }, 757 { 758 .scmi_id = AT91_SCMI_CLK_PERIPH_SSC0_CLK, 759 .pmc_type = PMC_TYPE_PERIPHERAL, 760 .pmc_id = 43 761 }, 762 { 763 .scmi_id = AT91_SCMI_CLK_PERIPH_SSC1_CLK, 764 .pmc_type = PMC_TYPE_PERIPHERAL, 765 .pmc_id = 44 766 }, 767 { 768 .scmi_id = AT91_SCMI_CLK_PERIPH_TRNG_CLK, 769 .pmc_type = PMC_TYPE_PERIPHERAL, 770 .pmc_id = 47 771 }, 772 { 773 .scmi_id = AT91_SCMI_CLK_PERIPH_PDMIC_CLK, 774 .pmc_type = PMC_TYPE_PERIPHERAL, 775 .pmc_id = 48 776 }, 777 { 778 .scmi_id = AT91_SCMI_CLK_PERIPH_SECURAM_CLK, 779 .pmc_type = PMC_TYPE_PERIPHERAL, 780 .pmc_id = 51 781 }, 782 { 783 .scmi_id = AT91_SCMI_CLK_PERIPH_I2S0_CLK, 784 .pmc_type = PMC_TYPE_PERIPHERAL, 785 .pmc_id = 54 786 }, 787 { 788 .scmi_id = AT91_SCMI_CLK_PERIPH_I2S1_CLK, 789 .pmc_type = PMC_TYPE_PERIPHERAL, 790 .pmc_id = 55 791 }, 792 { 793 .scmi_id = AT91_SCMI_CLK_PERIPH_CAN0_CLK, 794 .pmc_type = PMC_TYPE_PERIPHERAL, 795 .pmc_id = 56 796 }, 797 { 798 .scmi_id = AT91_SCMI_CLK_PERIPH_CAN1_CLK, 799 .pmc_type = PMC_TYPE_PERIPHERAL, 800 .pmc_id = 57 801 }, 802 { 803 .scmi_id = AT91_SCMI_CLK_PERIPH_PTC_CLK, 804 .pmc_type = PMC_TYPE_PERIPHERAL, 805 .pmc_id = 58 806 }, 807 { 808 .scmi_id = AT91_SCMI_CLK_PERIPH_CLASSD_CLK, 809 .pmc_type = PMC_TYPE_PERIPHERAL, 810 .pmc_id = 59 811 }, 812 { 813 .scmi_id = AT91_SCMI_CLK_PERIPH_DMA0_CLK, 814 .pmc_type = PMC_TYPE_PERIPHERAL, 815 .pmc_id = 6 816 }, 817 { 818 .scmi_id = AT91_SCMI_CLK_PERIPH_DMA1_CLK, 819 .pmc_type = PMC_TYPE_PERIPHERAL, 820 .pmc_id = 7 821 }, 822 { 823 .scmi_id = AT91_SCMI_CLK_PERIPH_AES_CLK, 824 .pmc_type = PMC_TYPE_PERIPHERAL, 825 .pmc_id = 9 826 }, 827 { 828 .scmi_id = AT91_SCMI_CLK_PERIPH_AESB_CLK, 829 .pmc_type = PMC_TYPE_PERIPHERAL, 830 .pmc_id = 10 831 }, 832 { 833 .scmi_id = AT91_SCMI_CLK_PERIPH_SHA_CLK, 834 .pmc_type = PMC_TYPE_PERIPHERAL, 835 .pmc_id = 12 836 }, 837 { 838 .scmi_id = AT91_SCMI_CLK_PERIPH_MPDDR_CLK, 839 .pmc_type = PMC_TYPE_PERIPHERAL, 840 .pmc_id = 13 841 }, 842 { 843 .scmi_id = AT91_SCMI_CLK_PERIPH_MATRIX0_CLK, 844 .pmc_type = PMC_TYPE_PERIPHERAL, 845 .pmc_id = 15 846 }, 847 { 848 .scmi_id = AT91_SCMI_CLK_PERIPH_SDMMC0_HCLK, 849 .pmc_type = PMC_TYPE_PERIPHERAL, 850 .pmc_id = 31 851 }, 852 { 853 .scmi_id = AT91_SCMI_CLK_PERIPH_SDMMC1_HCLK, 854 .pmc_type = PMC_TYPE_PERIPHERAL, 855 .pmc_id = 32 856 }, 857 { 858 .scmi_id = AT91_SCMI_CLK_PERIPH_LCDC_CLK, 859 .pmc_type = PMC_TYPE_PERIPHERAL, 860 .pmc_id = 45 861 }, 862 { 863 .scmi_id = AT91_SCMI_CLK_PERIPH_ISC_CLK, 864 .pmc_type = PMC_TYPE_PERIPHERAL, 865 .pmc_id = 46 866 }, 867 { 868 .scmi_id = AT91_SCMI_CLK_PERIPH_QSPI0_CLK, 869 .pmc_type = PMC_TYPE_PERIPHERAL, 870 .pmc_id = 52 871 }, 872 { 873 .scmi_id = AT91_SCMI_CLK_PERIPH_QSPI1_CLK, 874 .pmc_type = PMC_TYPE_PERIPHERAL, 875 .pmc_id = 53 876 }, 877 { 878 .scmi_id = AT91_SCMI_CLK_GCK_SDMMC0_GCLK, 879 .pmc_type = PMC_TYPE_GCK, 880 .pmc_id = 31 881 }, 882 { 883 .scmi_id = AT91_SCMI_CLK_GCK_SDMMC1_GCLK, 884 .pmc_type = PMC_TYPE_GCK, 885 .pmc_id = 32 886 }, 887 { 888 .scmi_id = AT91_SCMI_CLK_GCK_TCB0_GCLK, 889 .pmc_type = PMC_TYPE_GCK, 890 .pmc_id = 35 891 }, 892 { 893 .scmi_id = AT91_SCMI_CLK_GCK_TCB1_GCLK, 894 .pmc_type = PMC_TYPE_GCK, 895 .pmc_id = 36 896 }, 897 { 898 .scmi_id = AT91_SCMI_CLK_GCK_PWM_GCLK, 899 .pmc_type = PMC_TYPE_GCK, 900 .pmc_id = 38 901 }, 902 { 903 .scmi_id = AT91_SCMI_CLK_GCK_ISC_GCLK, 904 .pmc_type = PMC_TYPE_GCK, 905 .pmc_id = 46 906 }, 907 { 908 .scmi_id = AT91_SCMI_CLK_GCK_PDMIC_GCLK, 909 .pmc_type = PMC_TYPE_GCK, 910 .pmc_id = 48 911 }, 912 { 913 .scmi_id = AT91_SCMI_CLK_GCK_I2S0_GCLK, 914 .pmc_type = PMC_TYPE_GCK, 915 .pmc_id = 54 916 }, 917 { 918 .scmi_id = AT91_SCMI_CLK_GCK_I2S1_GCLK, 919 .pmc_type = PMC_TYPE_GCK, 920 .pmc_id = 55 921 }, 922 { 923 .scmi_id = AT91_SCMI_CLK_GCK_CAN0_GCLK, 924 .pmc_type = PMC_TYPE_GCK, 925 .pmc_id = 56 926 }, 927 { 928 .scmi_id = AT91_SCMI_CLK_GCK_CAN1_GCLK, 929 .pmc_type = PMC_TYPE_GCK, 930 .pmc_id = 57 931 }, 932 { 933 .scmi_id = AT91_SCMI_CLK_GCK_CLASSD_GCLK, 934 .pmc_type = PMC_TYPE_GCK, 935 .pmc_id = 59 936 }, 937 { 938 .scmi_id = AT91_SCMI_CLK_PROG_PROG0, 939 .pmc_type = PMC_TYPE_PROGRAMMABLE, 940 .pmc_id = 0 941 }, 942 { 943 .scmi_id = AT91_SCMI_CLK_PROG_PROG1, 944 .pmc_type = PMC_TYPE_PROGRAMMABLE, 945 .pmc_id = 1 946 }, 947 { 948 .scmi_id = AT91_SCMI_CLK_PROG_PROG2, 949 .pmc_type = PMC_TYPE_PROGRAMMABLE, 950 .pmc_id = 2 951 }, 952 }; 953 #endif 954 955 static TEE_Result sam_init_scmi_clk(void) 956 { 957 unsigned int i = 0; 958 struct clk *clk = NULL; 959 TEE_Result res = TEE_ERROR_GENERIC; 960 const struct sam_pmc_clk *pmc_clk = NULL; 961 962 for (i = 0; i < ARRAY_SIZE(pmc_clks); i++) { 963 pmc_clk = &pmc_clks[i]; 964 res = at91_pmc_clk_get(pmc_clk->pmc_type, pmc_clk->pmc_id, 965 &clk); 966 if (res) { 967 EMSG("Failed to get PMC clock type %u, id %u", 968 pmc_clk->pmc_type, pmc_clk->pmc_id); 969 return res; 970 } 971 res = scmi_clk_add(clk, 0, pmc_clk->scmi_id); 972 if (res) { 973 EMSG("Failed to add PMC SCMI clock id %u", 974 pmc_clk->scmi_id); 975 return res; 976 } 977 } 978 979 clk = at91_sckc_clk_get(); 980 if (!clk) 981 return TEE_ERROR_GENERIC; 982 983 res = scmi_clk_add(clk, 0, AT91_SCMI_CLK_SCKC_SLOWCK_32K); 984 if (res) { 985 EMSG("Failed to add slow clock to SCMI clocks"); 986 return res; 987 } 988 989 return TEE_SUCCESS; 990 } 991 992 /* 993 * Initialize platform SCMI resources 994 */ 995 static TEE_Result sam_init_scmi_server(void) 996 { 997 size_t i = 0; 998 999 for (i = 0; i < ARRAY_SIZE(scmi_channel); i++) { 1000 const struct channel_resources *res = scmi_channel + i; 1001 struct scmi_msg_channel *chan = res->channel; 1002 1003 /* Enforce non-secure shm mapped as device memory */ 1004 chan->shm_addr.va = (vaddr_t)phys_to_virt(chan->shm_addr.pa, 1005 MEM_AREA_IO_NSEC, 1); 1006 assert(chan->shm_addr.va); 1007 1008 scmi_smt_init_agent_channel(chan); 1009 } 1010 1011 return sam_init_scmi_clk(); 1012 } 1013 1014 driver_init_late(sam_init_scmi_server); 1015