1c97857dbSAmit Nagal /* 2c97857dbSAmit Nagal * Copyright (c) 2023-2024, Advanced Micro Devices, Inc. All rights reserved. 3c97857dbSAmit Nagal * 4c97857dbSAmit Nagal * SPDX-License-Identifier: BSD-3-Clause 5c97857dbSAmit Nagal */ 6c97857dbSAmit Nagal 7c97857dbSAmit Nagal #include <assert.h> 8c97857dbSAmit Nagal #include <errno.h> 9c97857dbSAmit Nagal #include <inttypes.h> 10c97857dbSAmit Nagal 11c97857dbSAmit Nagal #include <drivers/scmi-msg.h> 12c97857dbSAmit Nagal #include <drivers/scmi.h> 13b9c20e5dSAmit Nagal #include <lib/mmio.h> 14c97857dbSAmit Nagal #include <lib/utils_def.h> 15c97857dbSAmit Nagal #include <platform_def.h> 16c97857dbSAmit Nagal #include <scmi.h> 17c97857dbSAmit Nagal 18c97857dbSAmit Nagal #include "plat_private.h" 19c97857dbSAmit Nagal 20c97857dbSAmit Nagal #define HIGH (1) 21c97857dbSAmit Nagal #define LOW (0) 22c97857dbSAmit Nagal 23c97857dbSAmit Nagal struct scmi_clk { 24c97857dbSAmit Nagal unsigned long clock_id; 25c97857dbSAmit Nagal unsigned long rate; 26c97857dbSAmit Nagal const char *name; 27c97857dbSAmit Nagal bool enabled; 28c97857dbSAmit Nagal }; 29c97857dbSAmit Nagal 30c97857dbSAmit Nagal #define CLOCK_CELL(_scmi_id, _id, _name, _init_enabled, _rate) \ 31c97857dbSAmit Nagal [_scmi_id] = { \ 32c97857dbSAmit Nagal .clock_id = (_id), \ 33c97857dbSAmit Nagal .name = (_name), \ 34c97857dbSAmit Nagal .enabled = (_init_enabled), \ 35c97857dbSAmit Nagal .rate = (_rate), \ 36c97857dbSAmit Nagal } 37c97857dbSAmit Nagal 38c97857dbSAmit Nagal static struct scmi_clk scmi0_clock[] = { 39c97857dbSAmit Nagal CLOCK_CELL(CLK_GEM0_0, CLK_GEM0_0, "gem0_pclk", true, 100000000), 40c97857dbSAmit Nagal CLOCK_CELL(CLK_GEM0_1, CLK_GEM0_1, "gem0_hclk", true, 100000000), 41c97857dbSAmit Nagal CLOCK_CELL(CLK_GEM0_2, CLK_GEM0_2, "gem0_tx_clk", true, 125000000), 42c97857dbSAmit Nagal CLOCK_CELL(CLK_GEM0_3, CLK_GEM0_3, "gem0_rx_clk", true, 100000000), 43c97857dbSAmit Nagal CLOCK_CELL(CLK_GEM0_4, CLK_GEM0_4, "gem0_tsu_clk", true, 100000000), 44c97857dbSAmit Nagal CLOCK_CELL(CLK_GEM1_0, CLK_GEM1_0, "gem1_pclk", true, 100000000), 45c97857dbSAmit Nagal CLOCK_CELL(CLK_GEM1_1, CLK_GEM1_1, "gem1_hclk", true, 100000000), 46c97857dbSAmit Nagal CLOCK_CELL(CLK_GEM1_2, CLK_GEM1_2, "gem1_tx_clk", true, 125000000), 47c97857dbSAmit Nagal CLOCK_CELL(CLK_GEM1_3, CLK_GEM1_3, "gem1_rx_clk", true, 100000000), 48c97857dbSAmit Nagal CLOCK_CELL(CLK_GEM1_4, CLK_GEM1_4, "gem1_tsu_clk", true, 100000000), 49c97857dbSAmit Nagal CLOCK_CELL(CLK_SERIAL0_0, CLK_SERIAL0_0, "uart0_uartclk", true, 100000000), 50c97857dbSAmit Nagal CLOCK_CELL(CLK_SERIAL0_1, CLK_SERIAL0_1, "uart0_apb_pclk", true, 100000000), 51c97857dbSAmit Nagal CLOCK_CELL(CLK_SERIAL1_0, CLK_SERIAL1_0, "uart1_uartclk", true, 100000000), 52c97857dbSAmit Nagal CLOCK_CELL(CLK_SERIAL1_1, CLK_SERIAL1_1, "uart1_apb_pclk", true, 100000000), 53c97857dbSAmit Nagal CLOCK_CELL(CLK_UFS0_0, CLK_UFS0_0, "ufs_core_clk", true, 100000000), 54b048601eSSai Krishna Potthuri CLOCK_CELL(CLK_UFS0_1, CLK_UFS0_1, "ufs_phy_clk", true, 26000000), 55b048601eSSai Krishna Potthuri CLOCK_CELL(CLK_UFS0_2, CLK_UFS0_2, "ufs_ref_pclk", true, 26000000), 56c97857dbSAmit Nagal CLOCK_CELL(CLK_USB0_0, CLK_USB0_0, "usb0_bus_clk", true, 100000000), 57c97857dbSAmit Nagal CLOCK_CELL(CLK_USB0_1, CLK_USB0_1, "usb0_ref_clk", true, 100000000), 58c97857dbSAmit Nagal CLOCK_CELL(CLK_USB0_2, CLK_USB0_2, "usb0_dwc_clk", true, 100000000), 59c97857dbSAmit Nagal CLOCK_CELL(CLK_USB1_0, CLK_USB1_0, "usb1_bus_clk", true, 100000000), 60c97857dbSAmit Nagal CLOCK_CELL(CLK_USB1_1, CLK_USB1_1, "usb1_ref_clk", true, 100000000), 61c97857dbSAmit Nagal CLOCK_CELL(CLK_USB1_2, CLK_USB1_2, "usb1_dwc_clk", true, 100000000), 62c97857dbSAmit Nagal CLOCK_CELL(CLK_MMC0_0, CLK_MMC0_0, "mmc0_xin_clk", true, 100000000), 63c97857dbSAmit Nagal CLOCK_CELL(CLK_MMC0_1, CLK_MMC0_1, "mmc0_ahb_clk", true, 100000000), 64c97857dbSAmit Nagal CLOCK_CELL(CLK_MMC0_2, CLK_MMC0_2, "mmc0_gate_clk", true, 100000000), 65c97857dbSAmit Nagal CLOCK_CELL(CLK_MMC1_0, CLK_MMC1_0, "mmc1_xin_clk", true, 100000000), 66c97857dbSAmit Nagal CLOCK_CELL(CLK_MMC1_1, CLK_MMC1_1, "mmc1_ahb_clk", true, 100000000), 67c97857dbSAmit Nagal CLOCK_CELL(CLK_MMC1_2, CLK_MMC1_2, "mmc1_gate_clk", true, 100000000), 68c97857dbSAmit Nagal CLOCK_CELL(CLK_TTC0_0, CLK_TTC0_0, "ttc0_clk", true, 100000000), 69c97857dbSAmit Nagal CLOCK_CELL(CLK_TTC1_0, CLK_TTC1_0, "ttc1_clk", true, 100000000), 70c97857dbSAmit Nagal CLOCK_CELL(CLK_TTC2_0, CLK_TTC2_0, "ttc2_clk", true, 100000000), 71c97857dbSAmit Nagal CLOCK_CELL(CLK_TTC3_0, CLK_TTC3_0, "ttc3_clk", true, 100000000), 72c97857dbSAmit Nagal CLOCK_CELL(CLK_TTC4_0, CLK_TTC4_0, "ttc4_clk", true, 100000000), 73c97857dbSAmit Nagal CLOCK_CELL(CLK_TTC5_0, CLK_TTC5_0, "ttc5_clk", true, 100000000), 74c97857dbSAmit Nagal CLOCK_CELL(CLK_TTC6_0, CLK_TTC6_0, "ttc6_clk", true, 100000000), 75c97857dbSAmit Nagal CLOCK_CELL(CLK_TTC7_0, CLK_TTC7_0, "ttc7_clk", true, 100000000), 76c97857dbSAmit Nagal CLOCK_CELL(CLK_I2C0_0, CLK_I2C0_0, "i2c0_clk", true, 100000000), 77c97857dbSAmit Nagal CLOCK_CELL(CLK_I2C1_0, CLK_I2C1_0, "i2c1_clk", true, 100000000), 78c97857dbSAmit Nagal CLOCK_CELL(CLK_I2C2_0, CLK_I2C2_0, "i2c2_clk", true, 100000000), 79c97857dbSAmit Nagal CLOCK_CELL(CLK_I2C3_0, CLK_I2C3_0, "i2c3_clk", true, 100000000), 80c97857dbSAmit Nagal CLOCK_CELL(CLK_I2C4_0, CLK_I2C4_0, "i2c4_clk", true, 100000000), 81c97857dbSAmit Nagal CLOCK_CELL(CLK_I2C5_0, CLK_I2C5_0, "i2c5_clk", true, 100000000), 82c97857dbSAmit Nagal CLOCK_CELL(CLK_I2C6_0, CLK_I2C6_0, "i2c6_clk", true, 100000000), 83c97857dbSAmit Nagal CLOCK_CELL(CLK_I2C7_0, CLK_I2C7_0, "i2c7_clk", true, 100000000), 84c97857dbSAmit Nagal CLOCK_CELL(CLK_OSPI0_0, CLK_OSPI0_0, "ospi0_clk", true, 100000000), 85c97857dbSAmit Nagal CLOCK_CELL(CLK_QSPI0_0, CLK_QSPI0_0, "qpsi0_ref_clk", true, 100000000), 86c97857dbSAmit Nagal CLOCK_CELL(CLK_QSPI0_1, CLK_QSPI0_1, "qspi0_pclk", true, 100000000), 87c97857dbSAmit Nagal CLOCK_CELL(CLK_WWDT0_0, CLK_WWDT0_0, "wwdt0_clk", true, 100000000), 88c97857dbSAmit Nagal CLOCK_CELL(CLK_WWDT1_0, CLK_WWDT1_0, "wwdt1_clk", true, 100000000), 89c97857dbSAmit Nagal CLOCK_CELL(CLK_WWDT2_0, CLK_WWDT2_0, "wwdt2_clk", true, 100000000), 90c97857dbSAmit Nagal CLOCK_CELL(CLK_WWDT3_0, CLK_WWDT3_0, "wwdt3_clk", true, 100000000), 91c97857dbSAmit Nagal CLOCK_CELL(CLK_ADMA0_0, CLK_ADMA0_0, "adma0_main_clk", true, 100000000), 92c97857dbSAmit Nagal CLOCK_CELL(CLK_ADMA0_1, CLK_ADMA0_1, "adma0_apb_clk", true, 100000000), 93c97857dbSAmit Nagal CLOCK_CELL(CLK_ADMA1_0, CLK_ADMA1_0, "adma1_main_clk", true, 100000000), 94c97857dbSAmit Nagal CLOCK_CELL(CLK_ADMA1_1, CLK_ADMA1_1, "adma1_apb_clk", true, 100000000), 95c97857dbSAmit Nagal CLOCK_CELL(CLK_ADMA2_0, CLK_ADMA2_0, "adma2_main_clk", true, 100000000), 96c97857dbSAmit Nagal CLOCK_CELL(CLK_ADMA2_1, CLK_ADMA2_1, "adma2_apb_clk", true, 100000000), 97c97857dbSAmit Nagal CLOCK_CELL(CLK_ADMA3_0, CLK_ADMA3_0, "adma3_main_clk", true, 100000000), 98c97857dbSAmit Nagal CLOCK_CELL(CLK_ADMA3_1, CLK_ADMA3_1, "adma3_apb_clk", true, 100000000), 99c97857dbSAmit Nagal CLOCK_CELL(CLK_ADMA4_0, CLK_ADMA4_0, "adma4_main_clk", true, 100000000), 100c97857dbSAmit Nagal CLOCK_CELL(CLK_ADMA4_1, CLK_ADMA4_1, "adma4_apb_clk", true, 100000000), 101c97857dbSAmit Nagal CLOCK_CELL(CLK_ADMA5_0, CLK_ADMA5_0, "adma5_main_clk", true, 100000000), 102c97857dbSAmit Nagal CLOCK_CELL(CLK_ADMA5_1, CLK_ADMA5_1, "adma5_apb_clk", true, 100000000), 103c97857dbSAmit Nagal CLOCK_CELL(CLK_ADMA6_0, CLK_ADMA6_0, "adma6_main_clk", true, 100000000), 104c97857dbSAmit Nagal CLOCK_CELL(CLK_ADMA6_1, CLK_ADMA6_1, "adma6_apb_clk", true, 100000000), 105c97857dbSAmit Nagal CLOCK_CELL(CLK_ADMA7_0, CLK_ADMA7_0, "adma7_main_clk", true, 100000000), 106c97857dbSAmit Nagal CLOCK_CELL(CLK_ADMA7_1, CLK_ADMA7_1, "adma7_apb_clk", true, 100000000), 107c97857dbSAmit Nagal CLOCK_CELL(CLK_CAN0_0, CLK_CAN0_0, "can0_can_clk", true, 100000000), 108c97857dbSAmit Nagal CLOCK_CELL(CLK_CAN0_1, CLK_CAN0_1, "can0_axi_clk", true, 100000000), 109c97857dbSAmit Nagal CLOCK_CELL(CLK_CAN1_0, CLK_CAN1_0, "can1_can_clk", true, 100000000), 110c97857dbSAmit Nagal CLOCK_CELL(CLK_CAN1_1, CLK_CAN1_1, "can1_axi_clk", true, 100000000), 111c97857dbSAmit Nagal CLOCK_CELL(CLK_CAN2_0, CLK_CAN2_0, "can2_can_clk", true, 100000000), 112c97857dbSAmit Nagal CLOCK_CELL(CLK_CAN2_1, CLK_CAN2_1, "can2_axi_clk", true, 100000000), 113c97857dbSAmit Nagal CLOCK_CELL(CLK_CAN3_0, CLK_CAN3_0, "can3_can_clk", true, 100000000), 114c97857dbSAmit Nagal CLOCK_CELL(CLK_CAN3_1, CLK_CAN3_1, "can3_axi_clk", true, 100000000), 115c97857dbSAmit Nagal CLOCK_CELL(CLK_PS_GPIO_0, CLK_PS_GPIO_0, "ps_gpio_clk", true, 100000000), 116c97857dbSAmit Nagal CLOCK_CELL(CLK_PMC_GPIO_0, CLK_PMC_GPIO_0, "pmc_gpio_clk", true, 100000000), 117c97857dbSAmit Nagal CLOCK_CELL(CLK_SPI0_0, CLK_SPI0_0, "spi0_ref_clk", true, 100000000), 118c97857dbSAmit Nagal CLOCK_CELL(CLK_SPI0_1, CLK_SPI0_1, "spi0_pclk", true, 100000000), 119c97857dbSAmit Nagal CLOCK_CELL(CLK_SPI1_0, CLK_SPI1_0, "spi1_ref_clk", true, 100000000), 120c97857dbSAmit Nagal CLOCK_CELL(CLK_SPI1_1, CLK_SPI1_1, "spi1_pclk", true, 100000000), 121c97857dbSAmit Nagal CLOCK_CELL(CLK_I3C0_0, CLK_I3C0_0, "i3c0_clk", true, 100000000), 122c97857dbSAmit Nagal CLOCK_CELL(CLK_I3C1_0, CLK_I3C1_0, "i3c1_clk", true, 100000000), 123c97857dbSAmit Nagal CLOCK_CELL(CLK_I3C2_0, CLK_I3C2_0, "i3c2_clk", true, 100000000), 124c97857dbSAmit Nagal CLOCK_CELL(CLK_I3C3_0, CLK_I3C3_0, "i3c3_clk", true, 100000000), 125c97857dbSAmit Nagal CLOCK_CELL(CLK_I3C4_0, CLK_I3C4_0, "i3c4_clk", true, 100000000), 126c97857dbSAmit Nagal CLOCK_CELL(CLK_I3C5_0, CLK_I3C5_0, "i3c5_clk", true, 100000000), 127c97857dbSAmit Nagal CLOCK_CELL(CLK_I3C6_0, CLK_I3C6_0, "i3c6_clk", true, 100000000), 128c97857dbSAmit Nagal CLOCK_CELL(CLK_I3C7_0, CLK_I3C7_0, "i3c7_clk", true, 100000000), 129c97857dbSAmit Nagal }; 130c97857dbSAmit Nagal 131c97857dbSAmit Nagal /* 132c97857dbSAmit Nagal * struct scmi_reset - Data for the exposed reset controller 133c97857dbSAmit Nagal * @reset_id: Reset identifier in RCC reset driver 134c97857dbSAmit Nagal * @name: Reset string ID exposed to agent 135c97857dbSAmit Nagal */ 136c97857dbSAmit Nagal struct scmi_reset { 137c97857dbSAmit Nagal unsigned long reset_id; 138c97857dbSAmit Nagal const char *name; 139c97857dbSAmit Nagal }; 140c97857dbSAmit Nagal 141c97857dbSAmit Nagal #define RESET_CELL(_scmi_id, _id, _name) \ 142c97857dbSAmit Nagal [_scmi_id] = { \ 143c97857dbSAmit Nagal .reset_id = (_id), \ 144c97857dbSAmit Nagal .name = (_name), \ 145c97857dbSAmit Nagal } 146c97857dbSAmit Nagal 147c97857dbSAmit Nagal static struct scmi_reset scmi0_reset[] = { 148c97857dbSAmit Nagal RESET_CELL(RESET_GEM0_0, RESET_GEM0_0, "gem0"), 149c97857dbSAmit Nagal RESET_CELL(RESET_GEM1_0, RESET_GEM1_0, "gem1"), 150c97857dbSAmit Nagal RESET_CELL(RESET_SERIAL0_0, RESET_SERIAL0_0, "serial0"), 151c97857dbSAmit Nagal RESET_CELL(RESET_SERIAL1_0, RESET_SERIAL1_0, "serial1"), 152c97857dbSAmit Nagal RESET_CELL(RESET_UFS0_0, RESET_UFS0_0, "ufs0"), 153c97857dbSAmit Nagal RESET_CELL(RESET_I2C0_0, RESET_I2C0_0, "i2c0"), 154c97857dbSAmit Nagal RESET_CELL(RESET_I2C1_0, RESET_I2C1_0, "i2c1"), 155c97857dbSAmit Nagal RESET_CELL(RESET_I2C2_0, RESET_I2C2_0, "i2c2"), 156c97857dbSAmit Nagal RESET_CELL(RESET_I2C3_0, RESET_I2C3_0, "i2c3"), 157c97857dbSAmit Nagal RESET_CELL(RESET_I2C4_0, RESET_I2C4_0, "i2c4"), 158c97857dbSAmit Nagal RESET_CELL(RESET_I2C5_0, RESET_I2C5_0, "i2c5"), 159c97857dbSAmit Nagal RESET_CELL(RESET_I2C6_0, RESET_I2C6_0, "i2c6"), 160c97857dbSAmit Nagal RESET_CELL(RESET_I2C7_0, RESET_I2C7_0, "i2c7"), 161c97857dbSAmit Nagal RESET_CELL(RESET_I2C8_0, RESET_I2C8_0, "i2c8"), 162c97857dbSAmit Nagal RESET_CELL(RESET_OSPI0_0, RESET_OSPI0_0, "ospi"), 163c97857dbSAmit Nagal RESET_CELL(RESET_USB0_0, RESET_USB0_0, "usb0_0"), 164c97857dbSAmit Nagal RESET_CELL(RESET_USB0_1, RESET_USB0_1, "usb0_1"), 165c97857dbSAmit Nagal RESET_CELL(RESET_USB0_2, RESET_USB0_2, "usb0_2"), 166c97857dbSAmit Nagal RESET_CELL(RESET_USB1_0, RESET_USB1_0, "usb1_0"), 167c97857dbSAmit Nagal RESET_CELL(RESET_USB1_1, RESET_USB1_1, "usb1_1"), 168c97857dbSAmit Nagal RESET_CELL(RESET_USB1_2, RESET_USB1_2, "usb1_2"), 169c97857dbSAmit Nagal RESET_CELL(RESET_MMC0_0, RESET_MMC0_0, "mmc0"), 170c97857dbSAmit Nagal RESET_CELL(RESET_MMC1_0, RESET_MMC1_0, "mmc1"), 171c97857dbSAmit Nagal RESET_CELL(RESET_SPI0_0, RESET_SPI0_0, "spi0"), 172c97857dbSAmit Nagal RESET_CELL(RESET_SPI1_0, RESET_SPI1_0, "spi1"), 173c97857dbSAmit Nagal RESET_CELL(RESET_QSPI0_0, RESET_QSPI0_0, "qspi"), 174c97857dbSAmit Nagal RESET_CELL(RESET_I3C0_0, RESET_I3C0_0, "i3c0"), 175c97857dbSAmit Nagal RESET_CELL(RESET_I3C1_0, RESET_I3C1_0, "i3c1"), 176c97857dbSAmit Nagal RESET_CELL(RESET_I3C2_0, RESET_I3C2_0, "i3c2"), 177c97857dbSAmit Nagal RESET_CELL(RESET_I3C3_0, RESET_I3C3_0, "i3c3"), 178c97857dbSAmit Nagal RESET_CELL(RESET_I3C4_0, RESET_I3C4_0, "i3c4"), 179c97857dbSAmit Nagal RESET_CELL(RESET_I3C5_0, RESET_I3C5_0, "i3c5"), 180c97857dbSAmit Nagal RESET_CELL(RESET_I3C6_0, RESET_I3C6_0, "i3c6"), 181c97857dbSAmit Nagal RESET_CELL(RESET_I3C7_0, RESET_I3C7_0, "i3c7"), 182c97857dbSAmit Nagal RESET_CELL(RESET_I3C8_0, RESET_I3C8_0, "i3c8"), 183b9c20e5dSAmit Nagal RESET_CELL(RESET_UFSPHY_0, RESET_UFSPHY_0, "ufsphy0"), 184c97857dbSAmit Nagal }; 185c97857dbSAmit Nagal 186095a20a7SMichal Simek /** 187095a20a7SMichal Simek * struct scmi_pd - Data for the exposed power domain controller 188095a20a7SMichal Simek * @pd_id: pd identifier in RCC reset driver 189095a20a7SMichal Simek * @name: pd string ID exposed to agent 190095a20a7SMichal Simek * @state: keep state setting 191095a20a7SMichal Simek */ 192095a20a7SMichal Simek struct scmi_pd { 193095a20a7SMichal Simek unsigned long pd_id; 194095a20a7SMichal Simek const char *name; 195095a20a7SMichal Simek unsigned int state; 196095a20a7SMichal Simek }; 197095a20a7SMichal Simek 198095a20a7SMichal Simek #define PD_CELL(_scmi_id, _id, _name, _state) \ 199095a20a7SMichal Simek [_scmi_id] = { \ 200095a20a7SMichal Simek .pd_id = _id, \ 201095a20a7SMichal Simek .name = _name, \ 202095a20a7SMichal Simek .state = _state, \ 203095a20a7SMichal Simek } 204095a20a7SMichal Simek 205095a20a7SMichal Simek static struct scmi_pd scmi0_pd[] = { 206095a20a7SMichal Simek PD_CELL(PD_USB0, PD_USB0, "usb0", 0), 207095a20a7SMichal Simek PD_CELL(PD_USB1, PD_USB1, "usb1", 0), 208095a20a7SMichal Simek }; 209095a20a7SMichal Simek 210c97857dbSAmit Nagal struct scmi_resources { 211c97857dbSAmit Nagal struct scmi_clk *clock; 212c97857dbSAmit Nagal size_t clock_count; 213c97857dbSAmit Nagal struct scmi_reset *reset; 214c97857dbSAmit Nagal size_t reset_count; 215095a20a7SMichal Simek struct scmi_pd *pd; 216095a20a7SMichal Simek size_t pd_count; 217c97857dbSAmit Nagal }; 218c97857dbSAmit Nagal 219c97857dbSAmit Nagal static const struct scmi_resources resources[] = { 220c97857dbSAmit Nagal [0] = { 221c97857dbSAmit Nagal .clock = scmi0_clock, 222c97857dbSAmit Nagal .clock_count = ARRAY_SIZE(scmi0_clock), 223c97857dbSAmit Nagal .reset = scmi0_reset, 224c97857dbSAmit Nagal .reset_count = ARRAY_SIZE(scmi0_reset), 225095a20a7SMichal Simek .pd = scmi0_pd, 226095a20a7SMichal Simek .pd_count = ARRAY_SIZE(scmi0_pd), 227c97857dbSAmit Nagal }, 228c97857dbSAmit Nagal }; 229c97857dbSAmit Nagal 230c97857dbSAmit Nagal static const struct scmi_resources *find_resource(unsigned int agent_id) 231c97857dbSAmit Nagal { 232c97857dbSAmit Nagal assert(agent_id < ARRAY_SIZE(resources)); 233c97857dbSAmit Nagal 234c97857dbSAmit Nagal return &resources[agent_id]; 235c97857dbSAmit Nagal } 236c97857dbSAmit Nagal 237c97857dbSAmit Nagal static struct scmi_clk *clk_find(unsigned int agent_id, unsigned int scmi_id) 238c97857dbSAmit Nagal { 239c97857dbSAmit Nagal const struct scmi_resources *resource = find_resource(agent_id); 240c97857dbSAmit Nagal size_t n = 0U; 241c97857dbSAmit Nagal struct scmi_clk *ret = NULL; 242c97857dbSAmit Nagal 243c97857dbSAmit Nagal if (resource != NULL) { 244c97857dbSAmit Nagal for (n = 0U; n < resource->clock_count; n++) { 245c97857dbSAmit Nagal if (n == scmi_id) { 246c97857dbSAmit Nagal ret = &resource->clock[n]; 247c97857dbSAmit Nagal break; 248c97857dbSAmit Nagal } 249c97857dbSAmit Nagal } 250c97857dbSAmit Nagal } 251c97857dbSAmit Nagal 252c97857dbSAmit Nagal return ret; 253c97857dbSAmit Nagal } 254c97857dbSAmit Nagal 255c97857dbSAmit Nagal size_t plat_scmi_clock_count(unsigned int agent_id) 256c97857dbSAmit Nagal { 257c97857dbSAmit Nagal const struct scmi_resources *resource = find_resource(agent_id); 258c97857dbSAmit Nagal size_t ret; 259c97857dbSAmit Nagal 260c97857dbSAmit Nagal if (resource == NULL) { 261c97857dbSAmit Nagal ret = 0U; 262c97857dbSAmit Nagal } else { 263c97857dbSAmit Nagal VERBOSE("SCMI: CLK: %d clocks\n", (unsigned int)resource->clock_count); 264c97857dbSAmit Nagal 265c97857dbSAmit Nagal ret = resource->clock_count; 266c97857dbSAmit Nagal } 267c97857dbSAmit Nagal return ret; 268c97857dbSAmit Nagal } 269c97857dbSAmit Nagal 270c97857dbSAmit Nagal const char *plat_scmi_clock_get_name(unsigned int agent_id, unsigned int scmi_id) 271c97857dbSAmit Nagal { 272a0745f21SMaheedhar Bollapalli const struct scmi_clk *clock = clk_find(agent_id, scmi_id); 273c97857dbSAmit Nagal const char *ret; 274c97857dbSAmit Nagal 275c97857dbSAmit Nagal if (clock == NULL) { 276c97857dbSAmit Nagal ret = NULL; 277c97857dbSAmit Nagal } else { 278c97857dbSAmit Nagal VERBOSE("SCMI: CLK: id: %d, get_name: %s\n", scmi_id, clock->name); 279c97857dbSAmit Nagal 280c97857dbSAmit Nagal ret = clock->name; 281c97857dbSAmit Nagal } 282c97857dbSAmit Nagal return ret; 283c97857dbSAmit Nagal }; 284c97857dbSAmit Nagal 285c97857dbSAmit Nagal /* Called by Linux */ 286c97857dbSAmit Nagal int32_t plat_scmi_clock_rates_array(unsigned int agent_id, unsigned int scmi_id, 287c97857dbSAmit Nagal unsigned long *array, size_t *nb_elts, 288c97857dbSAmit Nagal uint32_t start_idx) 289c97857dbSAmit Nagal { 290a0745f21SMaheedhar Bollapalli const struct scmi_clk *clock = clk_find(agent_id, scmi_id); 291c97857dbSAmit Nagal 292c97857dbSAmit Nagal if (clock == NULL) { 293c97857dbSAmit Nagal return SCMI_NOT_FOUND; 294c97857dbSAmit Nagal } 295c97857dbSAmit Nagal 296*fbc415d2SMaheedhar Bollapalli if (start_idx > 0U) { 297c97857dbSAmit Nagal return SCMI_OUT_OF_RANGE; 298c97857dbSAmit Nagal } 299c97857dbSAmit Nagal 300c97857dbSAmit Nagal if (array == NULL) { 301c97857dbSAmit Nagal *nb_elts = 1U; 302c97857dbSAmit Nagal } else if (*nb_elts == 1U) { 303c97857dbSAmit Nagal *array = clock->rate; 304c97857dbSAmit Nagal VERBOSE("SCMI: CLK: id: %d, clk_name: %s, get_rate %lu\n", 305c97857dbSAmit Nagal scmi_id, clock->name, *array); 306c97857dbSAmit Nagal } else { 307c97857dbSAmit Nagal return SCMI_GENERIC_ERROR; 308c97857dbSAmit Nagal } 309c97857dbSAmit Nagal 310c97857dbSAmit Nagal return SCMI_SUCCESS; 311c97857dbSAmit Nagal } 312c97857dbSAmit Nagal 313c97857dbSAmit Nagal unsigned long plat_scmi_clock_get_rate(unsigned int agent_id, unsigned int scmi_id) 314c97857dbSAmit Nagal { 315a0745f21SMaheedhar Bollapalli const struct scmi_clk *clock = clk_find(agent_id, scmi_id); 316c97857dbSAmit Nagal unsigned long ret; 317c97857dbSAmit Nagal 318c97857dbSAmit Nagal if ((clock == NULL)) { 319c97857dbSAmit Nagal ret = SCMI_NOT_FOUND; 320c97857dbSAmit Nagal } else { 321c97857dbSAmit Nagal VERBOSE("SCMI: CLK: id: %d, get_rate: %lu\n", scmi_id, clock->rate); 322c97857dbSAmit Nagal ret = clock->rate; 323c97857dbSAmit Nagal } 324c97857dbSAmit Nagal return ret; 325c97857dbSAmit Nagal } 326c97857dbSAmit Nagal 327c97857dbSAmit Nagal int32_t plat_scmi_clock_set_rate(unsigned int agent_id, unsigned int scmi_id, 328c97857dbSAmit Nagal unsigned long rate) 329c97857dbSAmit Nagal { 330c97857dbSAmit Nagal struct scmi_clk *clock = clk_find(agent_id, scmi_id); 331c97857dbSAmit Nagal unsigned long ret = UL(SCMI_SUCCESS); 332c97857dbSAmit Nagal 333c97857dbSAmit Nagal if ((clock == NULL)) { 334c97857dbSAmit Nagal ret = SCMI_NOT_FOUND; 335c97857dbSAmit Nagal } else { 336c97857dbSAmit Nagal VERBOSE("SCMI: CLK: id: %d, set_rate: %lu\n", scmi_id, rate); 337c97857dbSAmit Nagal clock->rate = rate; 338c97857dbSAmit Nagal } 339c97857dbSAmit Nagal return ret; 340c97857dbSAmit Nagal } 341c97857dbSAmit Nagal 342c97857dbSAmit Nagal int32_t plat_scmi_clock_get_state(unsigned int agent_id, unsigned int scmi_id) 343c97857dbSAmit Nagal { 344a0745f21SMaheedhar Bollapalli const struct scmi_clk *clock = clk_find(agent_id, scmi_id); 345c97857dbSAmit Nagal int32_t ret; 346c97857dbSAmit Nagal 347c97857dbSAmit Nagal if ((clock == NULL)) { 348c97857dbSAmit Nagal ret = SCMI_NOT_FOUND; 349c97857dbSAmit Nagal } else { 350c97857dbSAmit Nagal VERBOSE("SCMI: CLK: id: %d, get_state: %d\n", scmi_id, clock->enabled); 351c97857dbSAmit Nagal 352c97857dbSAmit Nagal if (clock->enabled) { 353c97857dbSAmit Nagal ret = HIGH; 354c97857dbSAmit Nagal } else { 355c97857dbSAmit Nagal ret = LOW; 356c97857dbSAmit Nagal } 357c97857dbSAmit Nagal } 358c97857dbSAmit Nagal return ret; 359c97857dbSAmit Nagal } 360c97857dbSAmit Nagal 361c97857dbSAmit Nagal int32_t plat_scmi_clock_set_state(unsigned int agent_id, unsigned int scmi_id, 362c97857dbSAmit Nagal bool enable_not_disable) 363c97857dbSAmit Nagal { 364c97857dbSAmit Nagal struct scmi_clk *clock = clk_find(agent_id, scmi_id); 365c97857dbSAmit Nagal int32_t ret; 366c97857dbSAmit Nagal 367c97857dbSAmit Nagal if (clock == NULL) { 368c97857dbSAmit Nagal ret = SCMI_NOT_FOUND; 369c97857dbSAmit Nagal } else { 370c97857dbSAmit Nagal if (enable_not_disable) { 371c97857dbSAmit Nagal if (!clock->enabled) { 372c97857dbSAmit Nagal VERBOSE("SCMI: clock: %u enable\n", scmi_id); 373c97857dbSAmit Nagal clock->enabled = true; 374c97857dbSAmit Nagal } 375c97857dbSAmit Nagal } else { 376c97857dbSAmit Nagal if (clock->enabled) { 377c97857dbSAmit Nagal VERBOSE("SCMI: clock: %u disable\n", scmi_id); 378c97857dbSAmit Nagal clock->enabled = false; 379c97857dbSAmit Nagal } 380c97857dbSAmit Nagal } 381c97857dbSAmit Nagal 382c97857dbSAmit Nagal VERBOSE("SCMI: CLK: id: %d, set_state: %d\n", scmi_id, clock->enabled); 383c97857dbSAmit Nagal 384c97857dbSAmit Nagal ret = SCMI_SUCCESS; 385c97857dbSAmit Nagal } 386c97857dbSAmit Nagal 387c97857dbSAmit Nagal return ret; 388c97857dbSAmit Nagal } 389c97857dbSAmit Nagal 390c97857dbSAmit Nagal 391c97857dbSAmit Nagal /* 392c97857dbSAmit Nagal * Platform SCMI reset domains 393c97857dbSAmit Nagal */ 394c97857dbSAmit Nagal static struct scmi_reset *find_reset(unsigned int agent_id, 395c97857dbSAmit Nagal unsigned int scmi_id) 396c97857dbSAmit Nagal { 397c97857dbSAmit Nagal const struct scmi_resources *resource = find_resource(agent_id); 398c97857dbSAmit Nagal size_t n; 399c97857dbSAmit Nagal 400c97857dbSAmit Nagal if (resource != NULL) { 401c97857dbSAmit Nagal for (n = 0U; n < resource->reset_count; n++) { 402c97857dbSAmit Nagal if (n == scmi_id) { 403c97857dbSAmit Nagal return &resource->reset[n]; 404c97857dbSAmit Nagal } 405c97857dbSAmit Nagal } 406c97857dbSAmit Nagal } 407c97857dbSAmit Nagal 408c97857dbSAmit Nagal return NULL; 409c97857dbSAmit Nagal } 410c97857dbSAmit Nagal 411c97857dbSAmit Nagal const char *plat_scmi_rstd_get_name(unsigned int agent_id, unsigned int scmi_id) 412c97857dbSAmit Nagal { 413c97857dbSAmit Nagal const struct scmi_reset *reset = find_reset(agent_id, scmi_id); 414c97857dbSAmit Nagal 415c97857dbSAmit Nagal if (reset == NULL) { 416c97857dbSAmit Nagal return NULL; 417c97857dbSAmit Nagal } 418c97857dbSAmit Nagal 419c97857dbSAmit Nagal return reset->name; 420c97857dbSAmit Nagal } 421c97857dbSAmit Nagal 422c97857dbSAmit Nagal size_t plat_scmi_rstd_count(unsigned int agent_id) 423c97857dbSAmit Nagal { 424c97857dbSAmit Nagal const struct scmi_resources *resource = find_resource(agent_id); 425c97857dbSAmit Nagal 426c97857dbSAmit Nagal if (resource == NULL) { 427c97857dbSAmit Nagal return 0U; 428c97857dbSAmit Nagal } 429c97857dbSAmit Nagal 430c97857dbSAmit Nagal return resource->reset_count; 431c97857dbSAmit Nagal } 432c97857dbSAmit Nagal 433c97857dbSAmit Nagal int32_t plat_scmi_rstd_autonomous(unsigned int agent_id, unsigned int scmi_id, 434c97857dbSAmit Nagal uint32_t state) 435c97857dbSAmit Nagal { 436c97857dbSAmit Nagal const struct scmi_reset *reset = find_reset(agent_id, scmi_id); 437c97857dbSAmit Nagal 438c97857dbSAmit Nagal if (reset == NULL) { 439c97857dbSAmit Nagal return SCMI_NOT_FOUND; 440c97857dbSAmit Nagal } 441c97857dbSAmit Nagal 442c97857dbSAmit Nagal /* Supports only reset with context loss */ 443c97857dbSAmit Nagal if (state != 0U) { 444c97857dbSAmit Nagal return SCMI_NOT_SUPPORTED; 445c97857dbSAmit Nagal } 446c97857dbSAmit Nagal 447c97857dbSAmit Nagal NOTICE("SCMI reset on ID %lu/%s\n", 448c97857dbSAmit Nagal reset->reset_id, plat_scmi_rstd_get_name(agent_id, scmi_id)); 449c97857dbSAmit Nagal 450c97857dbSAmit Nagal return SCMI_SUCCESS; 451c97857dbSAmit Nagal } 452c97857dbSAmit Nagal 453c97857dbSAmit Nagal int32_t plat_scmi_rstd_set_state(unsigned int agent_id, unsigned int scmi_id, 454c97857dbSAmit Nagal bool assert_not_deassert) 455c97857dbSAmit Nagal { 456c97857dbSAmit Nagal const struct scmi_reset *reset = find_reset(agent_id, scmi_id); 457c97857dbSAmit Nagal 458c97857dbSAmit Nagal if (reset == NULL) { 459c97857dbSAmit Nagal return SCMI_NOT_FOUND; 460c97857dbSAmit Nagal } 461c97857dbSAmit Nagal 462c97857dbSAmit Nagal if (assert_not_deassert) { 463c97857dbSAmit Nagal NOTICE("SCMI reset %lu/%s set\n", 464c97857dbSAmit Nagal reset->reset_id, plat_scmi_rstd_get_name(agent_id, scmi_id)); 465b9c20e5dSAmit Nagal 466b9c20e5dSAmit Nagal switch (scmi_id) { 467b9c20e5dSAmit Nagal case RESET_UFS0_0: 468b9c20e5dSAmit Nagal mmio_write_32(PMXC_CRP_RST_UFS, 1); 469b9c20e5dSAmit Nagal break; 470b9c20e5dSAmit Nagal case RESET_UFSPHY_0: 471b9c20e5dSAmit Nagal mmio_write_32(PMXC_IOU_SLCR_PHY_RESET, 1); 472b9c20e5dSAmit Nagal break; 473b9c20e5dSAmit Nagal default: 474b9c20e5dSAmit Nagal break; 475b9c20e5dSAmit Nagal } 476c97857dbSAmit Nagal } else { 477c97857dbSAmit Nagal NOTICE("SCMI reset %lu/%s release\n", 478c97857dbSAmit Nagal reset->reset_id, plat_scmi_rstd_get_name(agent_id, scmi_id)); 479b9c20e5dSAmit Nagal 480b9c20e5dSAmit Nagal switch (scmi_id) { 481b9c20e5dSAmit Nagal case RESET_UFS0_0: 482b9c20e5dSAmit Nagal mmio_write_32(PMXC_CRP_RST_UFS, 0); 483b9c20e5dSAmit Nagal break; 484b9c20e5dSAmit Nagal case RESET_UFSPHY_0: 485b9c20e5dSAmit Nagal mmio_write_32(PMXC_IOU_SLCR_PHY_RESET, 0); 486b9c20e5dSAmit Nagal break; 487b9c20e5dSAmit Nagal default: 488b9c20e5dSAmit Nagal break; 489b9c20e5dSAmit Nagal } 490c97857dbSAmit Nagal } 491c97857dbSAmit Nagal 492c97857dbSAmit Nagal return SCMI_SUCCESS; 493c97857dbSAmit Nagal } 494c97857dbSAmit Nagal 495095a20a7SMichal Simek /* 496095a20a7SMichal Simek * Platform SCMI reset domains 497095a20a7SMichal Simek */ 498095a20a7SMichal Simek static struct scmi_pd *find_pd(unsigned int agent_id, unsigned int pd_id) 499095a20a7SMichal Simek { 500095a20a7SMichal Simek const struct scmi_resources *resource = find_resource(agent_id); 501095a20a7SMichal Simek size_t n; 502095a20a7SMichal Simek 503095a20a7SMichal Simek if (resource != NULL) { 504095a20a7SMichal Simek for (n = 0U; n < resource->pd_count; n++) { 505095a20a7SMichal Simek if (n == pd_id) { 506095a20a7SMichal Simek return &resource->pd[n]; 507095a20a7SMichal Simek } 508095a20a7SMichal Simek } 509095a20a7SMichal Simek } 510095a20a7SMichal Simek 511095a20a7SMichal Simek return NULL; 512095a20a7SMichal Simek } 513095a20a7SMichal Simek 514095a20a7SMichal Simek size_t plat_scmi_pd_count(unsigned int agent_id) 515095a20a7SMichal Simek { 516095a20a7SMichal Simek const struct scmi_resources *resource = find_resource(agent_id); 517095a20a7SMichal Simek size_t ret; 518095a20a7SMichal Simek 519095a20a7SMichal Simek if (resource == NULL) { 520095a20a7SMichal Simek ret = 0U; 521095a20a7SMichal Simek } else { 522095a20a7SMichal Simek ret = resource->pd_count; 523095a20a7SMichal Simek 524095a20a7SMichal Simek NOTICE("SCMI: PD: %d\n", (unsigned int)ret); 525095a20a7SMichal Simek } 526095a20a7SMichal Simek return ret; 527095a20a7SMichal Simek } 528095a20a7SMichal Simek 529095a20a7SMichal Simek const char *plat_scmi_pd_get_name(unsigned int agent_id, unsigned int pd_id) 530095a20a7SMichal Simek { 531095a20a7SMichal Simek const struct scmi_pd *pd = find_pd(agent_id, pd_id); 532095a20a7SMichal Simek 533095a20a7SMichal Simek if (pd == NULL) { 534095a20a7SMichal Simek return NULL; 535095a20a7SMichal Simek } 536095a20a7SMichal Simek 537095a20a7SMichal Simek return pd->name; 538095a20a7SMichal Simek } 539095a20a7SMichal Simek 540095a20a7SMichal Simek unsigned int plat_scmi_pd_statistics(unsigned int agent_id, unsigned long *pd_id) 541095a20a7SMichal Simek { 542095a20a7SMichal Simek return 0U; 543095a20a7SMichal Simek } 544095a20a7SMichal Simek 545095a20a7SMichal Simek unsigned int plat_scmi_pd_get_attributes(unsigned int agent_id, unsigned int pd_id) 546095a20a7SMichal Simek { 547095a20a7SMichal Simek return 0U; 548095a20a7SMichal Simek } 549095a20a7SMichal Simek 550095a20a7SMichal Simek unsigned int plat_scmi_pd_get_state(unsigned int agent_id, unsigned int pd_id) 551095a20a7SMichal Simek { 552095a20a7SMichal Simek const struct scmi_pd *pd = find_pd(agent_id, pd_id); 553095a20a7SMichal Simek 554095a20a7SMichal Simek if (pd == NULL) { 555095a20a7SMichal Simek return SCMI_NOT_SUPPORTED; 556095a20a7SMichal Simek } 557095a20a7SMichal Simek 558095a20a7SMichal Simek NOTICE("SCMI: PD: get id: %d, state: %x\n", pd_id, pd->state); 559095a20a7SMichal Simek 560095a20a7SMichal Simek return pd->state; 561095a20a7SMichal Simek } 562095a20a7SMichal Simek 563095a20a7SMichal Simek int32_t plat_scmi_pd_set_state(unsigned int agent_id, unsigned int flags, unsigned int pd_id, 564095a20a7SMichal Simek unsigned int state) 565095a20a7SMichal Simek { 566095a20a7SMichal Simek struct scmi_pd *pd = find_pd(agent_id, pd_id); 567095a20a7SMichal Simek 568095a20a7SMichal Simek if (pd == NULL) { 569095a20a7SMichal Simek return SCMI_NOT_SUPPORTED; 570095a20a7SMichal Simek } 571095a20a7SMichal Simek 572095a20a7SMichal Simek NOTICE("SCMI: PD: set id: %d, orig state: %x, new state: %x, flags: %x\n", 573095a20a7SMichal Simek pd_id, pd->state, state, flags); 574095a20a7SMichal Simek 575095a20a7SMichal Simek pd->state = state; 576095a20a7SMichal Simek 577095a20a7SMichal Simek return 0U; 578095a20a7SMichal Simek } 579095a20a7SMichal Simek 580095a20a7SMichal Simek 581c97857dbSAmit Nagal /* Currently only one channel is supported. Expectation is that channel 0 is used by NS SW */ 582c97857dbSAmit Nagal static struct scmi_msg_channel scmi_channel[] = { 583c97857dbSAmit Nagal [0] = { 584c97857dbSAmit Nagal .shm_addr = SMT_BUFFER_BASE, 585c97857dbSAmit Nagal .shm_size = SMT_BUF_SLOT_SIZE, 586c97857dbSAmit Nagal }, 587c97857dbSAmit Nagal }; 588c97857dbSAmit Nagal 589c97857dbSAmit Nagal struct scmi_msg_channel *plat_scmi_get_channel(unsigned int agent_id) 590c97857dbSAmit Nagal { 591c97857dbSAmit Nagal assert(agent_id < ARRAY_SIZE(scmi_channel)); 592c97857dbSAmit Nagal 593c97857dbSAmit Nagal VERBOSE("%d: SCMI asking for channel\n", agent_id); 594c97857dbSAmit Nagal 595c97857dbSAmit Nagal /* Just in case that code is reused */ 596c97857dbSAmit Nagal return &scmi_channel[agent_id]; 597c97857dbSAmit Nagal } 598c97857dbSAmit Nagal 599c97857dbSAmit Nagal /* Base protocol implementations */ 600c97857dbSAmit Nagal const char *plat_scmi_vendor_name(void) 601c97857dbSAmit Nagal { 602c97857dbSAmit Nagal return SCMI_VENDOR; 603c97857dbSAmit Nagal } 604c97857dbSAmit Nagal 605c97857dbSAmit Nagal const char *plat_scmi_sub_vendor_name(void) 606c97857dbSAmit Nagal { 607c97857dbSAmit Nagal return SCMI_PRODUCT; 608c97857dbSAmit Nagal } 609c97857dbSAmit Nagal 610c97857dbSAmit Nagal /* Currently supporting Clocks and Reset Domains */ 611c97857dbSAmit Nagal static const uint8_t plat_protocol_list[] = { 612c97857dbSAmit Nagal SCMI_PROTOCOL_ID_BASE, 613c97857dbSAmit Nagal SCMI_PROTOCOL_ID_CLOCK, 614c97857dbSAmit Nagal SCMI_PROTOCOL_ID_RESET_DOMAIN, 615095a20a7SMichal Simek SCMI_PROTOCOL_ID_POWER_DOMAIN, 616095a20a7SMichal Simek /* SCMI_PROTOCOL_ID_SENSOR, */ 617c97857dbSAmit Nagal 0U /* Null termination */ 618c97857dbSAmit Nagal }; 619c97857dbSAmit Nagal 620c97857dbSAmit Nagal size_t plat_scmi_protocol_count(void) 621c97857dbSAmit Nagal { 622c97857dbSAmit Nagal const size_t count = ARRAY_SIZE(plat_protocol_list) - 1U; 623c97857dbSAmit Nagal 624c97857dbSAmit Nagal VERBOSE("SCMI: Protocol count: %d\n", (int32_t)count); 625c97857dbSAmit Nagal 626c97857dbSAmit Nagal return count; 627c97857dbSAmit Nagal } 628c97857dbSAmit Nagal 629c97857dbSAmit Nagal const uint8_t *plat_scmi_protocol_list(unsigned int agent_id __unused) 630c97857dbSAmit Nagal { 631c97857dbSAmit Nagal return plat_protocol_list; 632c97857dbSAmit Nagal } 633c97857dbSAmit Nagal 634c97857dbSAmit Nagal void init_scmi_server(void) 635c97857dbSAmit Nagal { 636c97857dbSAmit Nagal size_t i; 637c97857dbSAmit Nagal int32_t ret; 638c97857dbSAmit Nagal 639c97857dbSAmit Nagal for (i = 0U; i < ARRAY_SIZE(scmi_channel); i++) 640c97857dbSAmit Nagal scmi_smt_init_agent_channel(&scmi_channel[i]); 641c97857dbSAmit Nagal 642c97857dbSAmit Nagal INFO("SCMI: Server initialized\n"); 643c97857dbSAmit Nagal 644c97857dbSAmit Nagal if (platform_id == QEMU) { 645c97857dbSAmit Nagal /* default setting is for QEMU */ 646c97857dbSAmit Nagal } else if (platform_id == SPP) { 647c97857dbSAmit Nagal for (i = 0U; i < ARRAY_SIZE(scmi0_clock); i++) { 648c97857dbSAmit Nagal 649c97857dbSAmit Nagal /* Keep i2c on 100MHz to calculate rates properly */ 65015a9e381SMaheedhar Bollapalli if ((i >= CLK_I2C0_0) && (i <= CLK_I2C7_0)) 651c97857dbSAmit Nagal continue; 652b048601eSSai Krishna Potthuri 653b048601eSSai Krishna Potthuri /* Keep UFS clocks to default values to get the expected rates */ 654b048601eSSai Krishna Potthuri if (i >= CLK_UFS0_0 && i <= CLK_UFS0_2) 655b048601eSSai Krishna Potthuri continue; 656b048601eSSai Krishna Potthuri 657c97857dbSAmit Nagal /* 658c97857dbSAmit Nagal * SPP supports multiple versions. 659c97857dbSAmit Nagal * The cpu_clock value is set to corresponding SPP 660c97857dbSAmit Nagal * version in early platform setup, resuse the same 661c97857dbSAmit Nagal * value here. 662c97857dbSAmit Nagal */ 663c97857dbSAmit Nagal ret = plat_scmi_clock_set_rate(0, i, cpu_clock); 664c97857dbSAmit Nagal if (ret < 0) { 665c97857dbSAmit Nagal NOTICE("Failed to set clock rate for SPP scmi_id=%ld\n", i); 666c97857dbSAmit Nagal } 667c97857dbSAmit Nagal } 668c97857dbSAmit Nagal } else { 669c97857dbSAmit Nagal /* Making MISRA C 2012 15.7 compliant */ 670c97857dbSAmit Nagal } 671c97857dbSAmit Nagal } 672