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); 291fb2fdcd9SMaheedhar Bollapalli int32_t ret = SCMI_SUCCESS; 292c97857dbSAmit Nagal 293c97857dbSAmit Nagal if (clock == NULL) { 294fb2fdcd9SMaheedhar Bollapalli ret = SCMI_NOT_FOUND; 295fb2fdcd9SMaheedhar Bollapalli goto exit_label; 296c97857dbSAmit Nagal } 297c97857dbSAmit Nagal 298fbc415d2SMaheedhar Bollapalli if (start_idx > 0U) { 299fb2fdcd9SMaheedhar Bollapalli ret = SCMI_OUT_OF_RANGE; 300fb2fdcd9SMaheedhar Bollapalli goto exit_label; 301c97857dbSAmit Nagal } 302c97857dbSAmit Nagal 303c97857dbSAmit Nagal if (array == NULL) { 304c97857dbSAmit Nagal *nb_elts = 1U; 305c97857dbSAmit Nagal } else if (*nb_elts == 1U) { 306c97857dbSAmit Nagal *array = clock->rate; 307c97857dbSAmit Nagal VERBOSE("SCMI: CLK: id: %d, clk_name: %s, get_rate %lu\n", 308c97857dbSAmit Nagal scmi_id, clock->name, *array); 309c97857dbSAmit Nagal } else { 310fb2fdcd9SMaheedhar Bollapalli ret = SCMI_GENERIC_ERROR; 311c97857dbSAmit Nagal } 312c97857dbSAmit Nagal 313fb2fdcd9SMaheedhar Bollapalli exit_label: 314fb2fdcd9SMaheedhar Bollapalli return ret; 315c97857dbSAmit Nagal } 316c97857dbSAmit Nagal 317c97857dbSAmit Nagal unsigned long plat_scmi_clock_get_rate(unsigned int agent_id, unsigned int scmi_id) 318c97857dbSAmit Nagal { 319a0745f21SMaheedhar Bollapalli const struct scmi_clk *clock = clk_find(agent_id, scmi_id); 320c97857dbSAmit Nagal unsigned long ret; 321c97857dbSAmit Nagal 322*bb2b0227SPrasad Kummari if (clock == NULL) { 323c97857dbSAmit Nagal ret = SCMI_NOT_FOUND; 324c97857dbSAmit Nagal } else { 325c97857dbSAmit Nagal VERBOSE("SCMI: CLK: id: %d, get_rate: %lu\n", scmi_id, clock->rate); 326c97857dbSAmit Nagal ret = clock->rate; 327c97857dbSAmit Nagal } 328c97857dbSAmit Nagal return ret; 329c97857dbSAmit Nagal } 330c97857dbSAmit Nagal 331c97857dbSAmit Nagal int32_t plat_scmi_clock_set_rate(unsigned int agent_id, unsigned int scmi_id, 332c97857dbSAmit Nagal unsigned long rate) 333c97857dbSAmit Nagal { 334c97857dbSAmit Nagal struct scmi_clk *clock = clk_find(agent_id, scmi_id); 33507be78d5SMaheedhar Bollapalli int32_t ret = SCMI_SUCCESS; 336c97857dbSAmit Nagal 337*bb2b0227SPrasad Kummari if (clock == NULL) { 338c97857dbSAmit Nagal ret = SCMI_NOT_FOUND; 339c97857dbSAmit Nagal } else { 340c97857dbSAmit Nagal VERBOSE("SCMI: CLK: id: %d, set_rate: %lu\n", scmi_id, rate); 341c97857dbSAmit Nagal clock->rate = rate; 342c97857dbSAmit Nagal } 343c97857dbSAmit Nagal return ret; 344c97857dbSAmit Nagal } 345c97857dbSAmit Nagal 346c97857dbSAmit Nagal int32_t plat_scmi_clock_get_state(unsigned int agent_id, unsigned int scmi_id) 347c97857dbSAmit Nagal { 348a0745f21SMaheedhar Bollapalli const struct scmi_clk *clock = clk_find(agent_id, scmi_id); 349c97857dbSAmit Nagal int32_t ret; 350c97857dbSAmit Nagal 351*bb2b0227SPrasad Kummari if (clock == NULL) { 352c97857dbSAmit Nagal ret = SCMI_NOT_FOUND; 353c97857dbSAmit Nagal } else { 354c97857dbSAmit Nagal VERBOSE("SCMI: CLK: id: %d, get_state: %d\n", scmi_id, clock->enabled); 355c97857dbSAmit Nagal 356c97857dbSAmit Nagal if (clock->enabled) { 357c97857dbSAmit Nagal ret = HIGH; 358c97857dbSAmit Nagal } else { 359c97857dbSAmit Nagal ret = LOW; 360c97857dbSAmit Nagal } 361c97857dbSAmit Nagal } 362c97857dbSAmit Nagal return ret; 363c97857dbSAmit Nagal } 364c97857dbSAmit Nagal 365c97857dbSAmit Nagal int32_t plat_scmi_clock_set_state(unsigned int agent_id, unsigned int scmi_id, 366c97857dbSAmit Nagal bool enable_not_disable) 367c97857dbSAmit Nagal { 368c97857dbSAmit Nagal struct scmi_clk *clock = clk_find(agent_id, scmi_id); 369c97857dbSAmit Nagal int32_t ret; 370c97857dbSAmit Nagal 371c97857dbSAmit Nagal if (clock == NULL) { 372c97857dbSAmit Nagal ret = SCMI_NOT_FOUND; 373c97857dbSAmit Nagal } else { 374c97857dbSAmit Nagal if (enable_not_disable) { 375c97857dbSAmit Nagal if (!clock->enabled) { 376c97857dbSAmit Nagal VERBOSE("SCMI: clock: %u enable\n", scmi_id); 377c97857dbSAmit Nagal clock->enabled = true; 378c97857dbSAmit Nagal } 379c97857dbSAmit Nagal } else { 380c97857dbSAmit Nagal if (clock->enabled) { 381c97857dbSAmit Nagal VERBOSE("SCMI: clock: %u disable\n", scmi_id); 382c97857dbSAmit Nagal clock->enabled = false; 383c97857dbSAmit Nagal } 384c97857dbSAmit Nagal } 385c97857dbSAmit Nagal 386c97857dbSAmit Nagal VERBOSE("SCMI: CLK: id: %d, set_state: %d\n", scmi_id, clock->enabled); 387c97857dbSAmit Nagal 388c97857dbSAmit Nagal ret = SCMI_SUCCESS; 389c97857dbSAmit Nagal } 390c97857dbSAmit Nagal 391c97857dbSAmit Nagal return ret; 392c97857dbSAmit Nagal } 393c97857dbSAmit Nagal 394c97857dbSAmit Nagal 395c97857dbSAmit Nagal /* 396c97857dbSAmit Nagal * Platform SCMI reset domains 397c97857dbSAmit Nagal */ 398c97857dbSAmit Nagal static struct scmi_reset *find_reset(unsigned int agent_id, 399c97857dbSAmit Nagal unsigned int scmi_id) 400c97857dbSAmit Nagal { 401c97857dbSAmit Nagal const struct scmi_resources *resource = find_resource(agent_id); 402c97857dbSAmit Nagal size_t n; 403c97857dbSAmit Nagal 404c97857dbSAmit Nagal if (resource != NULL) { 405c97857dbSAmit Nagal for (n = 0U; n < resource->reset_count; n++) { 406c97857dbSAmit Nagal if (n == scmi_id) { 407c97857dbSAmit Nagal return &resource->reset[n]; 408c97857dbSAmit Nagal } 409c97857dbSAmit Nagal } 410c97857dbSAmit Nagal } 411c97857dbSAmit Nagal 412c97857dbSAmit Nagal return NULL; 413c97857dbSAmit Nagal } 414c97857dbSAmit Nagal 415c97857dbSAmit Nagal const char *plat_scmi_rstd_get_name(unsigned int agent_id, unsigned int scmi_id) 416c97857dbSAmit Nagal { 417c97857dbSAmit Nagal const struct scmi_reset *reset = find_reset(agent_id, scmi_id); 418c97857dbSAmit Nagal 419c97857dbSAmit Nagal if (reset == NULL) { 420c97857dbSAmit Nagal return NULL; 421c97857dbSAmit Nagal } 422c97857dbSAmit Nagal 423c97857dbSAmit Nagal return reset->name; 424c97857dbSAmit Nagal } 425c97857dbSAmit Nagal 426c97857dbSAmit Nagal size_t plat_scmi_rstd_count(unsigned int agent_id) 427c97857dbSAmit Nagal { 428c97857dbSAmit Nagal const struct scmi_resources *resource = find_resource(agent_id); 429c97857dbSAmit Nagal 430c97857dbSAmit Nagal if (resource == NULL) { 431c97857dbSAmit Nagal return 0U; 432c97857dbSAmit Nagal } 433c97857dbSAmit Nagal 434c97857dbSAmit Nagal return resource->reset_count; 435c97857dbSAmit Nagal } 436c97857dbSAmit Nagal 437c97857dbSAmit Nagal int32_t plat_scmi_rstd_autonomous(unsigned int agent_id, unsigned int scmi_id, 438c97857dbSAmit Nagal uint32_t state) 439c97857dbSAmit Nagal { 440c97857dbSAmit Nagal const struct scmi_reset *reset = find_reset(agent_id, scmi_id); 441c97857dbSAmit Nagal 442c97857dbSAmit Nagal if (reset == NULL) { 443c97857dbSAmit Nagal return SCMI_NOT_FOUND; 444c97857dbSAmit Nagal } 445c97857dbSAmit Nagal 446c97857dbSAmit Nagal /* Supports only reset with context loss */ 447c97857dbSAmit Nagal if (state != 0U) { 448c97857dbSAmit Nagal return SCMI_NOT_SUPPORTED; 449c97857dbSAmit Nagal } 450c97857dbSAmit Nagal 451c97857dbSAmit Nagal NOTICE("SCMI reset on ID %lu/%s\n", 452c97857dbSAmit Nagal reset->reset_id, plat_scmi_rstd_get_name(agent_id, scmi_id)); 453c97857dbSAmit Nagal 454c97857dbSAmit Nagal return SCMI_SUCCESS; 455c97857dbSAmit Nagal } 456c97857dbSAmit Nagal 457c97857dbSAmit Nagal int32_t plat_scmi_rstd_set_state(unsigned int agent_id, unsigned int scmi_id, 458c97857dbSAmit Nagal bool assert_not_deassert) 459c97857dbSAmit Nagal { 460c97857dbSAmit Nagal const struct scmi_reset *reset = find_reset(agent_id, scmi_id); 461c97857dbSAmit Nagal 462c97857dbSAmit Nagal if (reset == NULL) { 463c97857dbSAmit Nagal return SCMI_NOT_FOUND; 464c97857dbSAmit Nagal } 465c97857dbSAmit Nagal 466c97857dbSAmit Nagal if (assert_not_deassert) { 467c97857dbSAmit Nagal NOTICE("SCMI reset %lu/%s set\n", 468c97857dbSAmit Nagal reset->reset_id, plat_scmi_rstd_get_name(agent_id, scmi_id)); 469b9c20e5dSAmit Nagal 470b9c20e5dSAmit Nagal switch (scmi_id) { 471b9c20e5dSAmit Nagal case RESET_UFS0_0: 472b9c20e5dSAmit Nagal mmio_write_32(PMXC_CRP_RST_UFS, 1); 473b9c20e5dSAmit Nagal break; 474b9c20e5dSAmit Nagal case RESET_UFSPHY_0: 475b9c20e5dSAmit Nagal mmio_write_32(PMXC_IOU_SLCR_PHY_RESET, 1); 476b9c20e5dSAmit Nagal break; 477b9c20e5dSAmit Nagal default: 478b9c20e5dSAmit Nagal break; 479b9c20e5dSAmit Nagal } 480c97857dbSAmit Nagal } else { 481c97857dbSAmit Nagal NOTICE("SCMI reset %lu/%s release\n", 482c97857dbSAmit Nagal reset->reset_id, plat_scmi_rstd_get_name(agent_id, scmi_id)); 483b9c20e5dSAmit Nagal 484b9c20e5dSAmit Nagal switch (scmi_id) { 485b9c20e5dSAmit Nagal case RESET_UFS0_0: 486b9c20e5dSAmit Nagal mmio_write_32(PMXC_CRP_RST_UFS, 0); 487b9c20e5dSAmit Nagal break; 488b9c20e5dSAmit Nagal case RESET_UFSPHY_0: 489b9c20e5dSAmit Nagal mmio_write_32(PMXC_IOU_SLCR_PHY_RESET, 0); 490b9c20e5dSAmit Nagal break; 491b9c20e5dSAmit Nagal default: 492b9c20e5dSAmit Nagal break; 493b9c20e5dSAmit Nagal } 494c97857dbSAmit Nagal } 495c97857dbSAmit Nagal 496c97857dbSAmit Nagal return SCMI_SUCCESS; 497c97857dbSAmit Nagal } 498c97857dbSAmit Nagal 499095a20a7SMichal Simek /* 500095a20a7SMichal Simek * Platform SCMI reset domains 501095a20a7SMichal Simek */ 502095a20a7SMichal Simek static struct scmi_pd *find_pd(unsigned int agent_id, unsigned int pd_id) 503095a20a7SMichal Simek { 504095a20a7SMichal Simek const struct scmi_resources *resource = find_resource(agent_id); 505095a20a7SMichal Simek size_t n; 506095a20a7SMichal Simek 507095a20a7SMichal Simek if (resource != NULL) { 508095a20a7SMichal Simek for (n = 0U; n < resource->pd_count; n++) { 509095a20a7SMichal Simek if (n == pd_id) { 510095a20a7SMichal Simek return &resource->pd[n]; 511095a20a7SMichal Simek } 512095a20a7SMichal Simek } 513095a20a7SMichal Simek } 514095a20a7SMichal Simek 515095a20a7SMichal Simek return NULL; 516095a20a7SMichal Simek } 517095a20a7SMichal Simek 518095a20a7SMichal Simek size_t plat_scmi_pd_count(unsigned int agent_id) 519095a20a7SMichal Simek { 520095a20a7SMichal Simek const struct scmi_resources *resource = find_resource(agent_id); 521095a20a7SMichal Simek size_t ret; 522095a20a7SMichal Simek 523095a20a7SMichal Simek if (resource == NULL) { 524095a20a7SMichal Simek ret = 0U; 525095a20a7SMichal Simek } else { 526095a20a7SMichal Simek ret = resource->pd_count; 527095a20a7SMichal Simek 528095a20a7SMichal Simek NOTICE("SCMI: PD: %d\n", (unsigned int)ret); 529095a20a7SMichal Simek } 530095a20a7SMichal Simek return ret; 531095a20a7SMichal Simek } 532095a20a7SMichal Simek 533095a20a7SMichal Simek const char *plat_scmi_pd_get_name(unsigned int agent_id, unsigned int pd_id) 534095a20a7SMichal Simek { 535095a20a7SMichal Simek const struct scmi_pd *pd = find_pd(agent_id, pd_id); 536fb2fdcd9SMaheedhar Bollapalli const char *ret = NULL; 537095a20a7SMichal Simek 538fb2fdcd9SMaheedhar Bollapalli if (pd != NULL) { 539fb2fdcd9SMaheedhar Bollapalli ret = pd->name; 540095a20a7SMichal Simek } 541095a20a7SMichal Simek 542fb2fdcd9SMaheedhar Bollapalli return ret; 543095a20a7SMichal Simek } 544095a20a7SMichal Simek 545095a20a7SMichal Simek unsigned int plat_scmi_pd_statistics(unsigned int agent_id, unsigned long *pd_id) 546095a20a7SMichal Simek { 547095a20a7SMichal Simek return 0U; 548095a20a7SMichal Simek } 549095a20a7SMichal Simek 550095a20a7SMichal Simek unsigned int plat_scmi_pd_get_attributes(unsigned int agent_id, unsigned int pd_id) 551095a20a7SMichal Simek { 552095a20a7SMichal Simek return 0U; 553095a20a7SMichal Simek } 554095a20a7SMichal Simek 555095a20a7SMichal Simek unsigned int plat_scmi_pd_get_state(unsigned int agent_id, unsigned int pd_id) 556095a20a7SMichal Simek { 557095a20a7SMichal Simek const struct scmi_pd *pd = find_pd(agent_id, pd_id); 558fb2fdcd9SMaheedhar Bollapalli uint32_t ret = SCMI_NOT_SUPPORTED; 559095a20a7SMichal Simek 560fb2fdcd9SMaheedhar Bollapalli if (pd != NULL) { 561095a20a7SMichal Simek NOTICE("SCMI: PD: get id: %d, state: %x\n", pd_id, pd->state); 562095a20a7SMichal Simek 563fb2fdcd9SMaheedhar Bollapalli ret = pd->state; 564fb2fdcd9SMaheedhar Bollapalli } 565fb2fdcd9SMaheedhar Bollapalli 566fb2fdcd9SMaheedhar Bollapalli return ret; 567095a20a7SMichal Simek } 568095a20a7SMichal Simek 569095a20a7SMichal Simek int32_t plat_scmi_pd_set_state(unsigned int agent_id, unsigned int flags, unsigned int pd_id, 570095a20a7SMichal Simek unsigned int state) 571095a20a7SMichal Simek { 572095a20a7SMichal Simek struct scmi_pd *pd = find_pd(agent_id, pd_id); 57307be78d5SMaheedhar Bollapalli int32_t ret = SCMI_SUCCESS; 574095a20a7SMichal Simek 575095a20a7SMichal Simek if (pd == NULL) { 57607be78d5SMaheedhar Bollapalli ret = SCMI_NOT_SUPPORTED; 577fb2fdcd9SMaheedhar Bollapalli goto exit_label; 578fb2fdcd9SMaheedhar Bollapalli } 579095a20a7SMichal Simek 580095a20a7SMichal Simek NOTICE("SCMI: PD: set id: %d, orig state: %x, new state: %x, flags: %x\n", 581095a20a7SMichal Simek pd_id, pd->state, state, flags); 582095a20a7SMichal Simek 583095a20a7SMichal Simek pd->state = state; 584095a20a7SMichal Simek 585fb2fdcd9SMaheedhar Bollapalli exit_label: 58607be78d5SMaheedhar Bollapalli return ret; 587095a20a7SMichal Simek } 588095a20a7SMichal Simek 589095a20a7SMichal Simek 590c97857dbSAmit Nagal /* Currently only one channel is supported. Expectation is that channel 0 is used by NS SW */ 591c97857dbSAmit Nagal static struct scmi_msg_channel scmi_channel[] = { 592c97857dbSAmit Nagal [0] = { 593c97857dbSAmit Nagal .shm_addr = SMT_BUFFER_BASE, 594c97857dbSAmit Nagal .shm_size = SMT_BUF_SLOT_SIZE, 595c97857dbSAmit Nagal }, 596c97857dbSAmit Nagal }; 597c97857dbSAmit Nagal 598c97857dbSAmit Nagal struct scmi_msg_channel *plat_scmi_get_channel(unsigned int agent_id) 599c97857dbSAmit Nagal { 600c97857dbSAmit Nagal assert(agent_id < ARRAY_SIZE(scmi_channel)); 601c97857dbSAmit Nagal 602c97857dbSAmit Nagal VERBOSE("%d: SCMI asking for channel\n", agent_id); 603c97857dbSAmit Nagal 604c97857dbSAmit Nagal /* Just in case that code is reused */ 605c97857dbSAmit Nagal return &scmi_channel[agent_id]; 606c97857dbSAmit Nagal } 607c97857dbSAmit Nagal 608c97857dbSAmit Nagal /* Base protocol implementations */ 609c97857dbSAmit Nagal const char *plat_scmi_vendor_name(void) 610c97857dbSAmit Nagal { 611c97857dbSAmit Nagal return SCMI_VENDOR; 612c97857dbSAmit Nagal } 613c97857dbSAmit Nagal 614c97857dbSAmit Nagal const char *plat_scmi_sub_vendor_name(void) 615c97857dbSAmit Nagal { 616c97857dbSAmit Nagal return SCMI_PRODUCT; 617c97857dbSAmit Nagal } 618c97857dbSAmit Nagal 619c97857dbSAmit Nagal /* Currently supporting Clocks and Reset Domains */ 620c97857dbSAmit Nagal static const uint8_t plat_protocol_list[] = { 621c97857dbSAmit Nagal SCMI_PROTOCOL_ID_BASE, 622c97857dbSAmit Nagal SCMI_PROTOCOL_ID_CLOCK, 623c97857dbSAmit Nagal SCMI_PROTOCOL_ID_RESET_DOMAIN, 624095a20a7SMichal Simek SCMI_PROTOCOL_ID_POWER_DOMAIN, 625095a20a7SMichal Simek /* SCMI_PROTOCOL_ID_SENSOR, */ 626c97857dbSAmit Nagal 0U /* Null termination */ 627c97857dbSAmit Nagal }; 628c97857dbSAmit Nagal 629c97857dbSAmit Nagal size_t plat_scmi_protocol_count(void) 630c97857dbSAmit Nagal { 631c97857dbSAmit Nagal const size_t count = ARRAY_SIZE(plat_protocol_list) - 1U; 632c97857dbSAmit Nagal 633c97857dbSAmit Nagal VERBOSE("SCMI: Protocol count: %d\n", (int32_t)count); 634c97857dbSAmit Nagal 635c97857dbSAmit Nagal return count; 636c97857dbSAmit Nagal } 637c97857dbSAmit Nagal 638c97857dbSAmit Nagal const uint8_t *plat_scmi_protocol_list(unsigned int agent_id __unused) 639c97857dbSAmit Nagal { 640c97857dbSAmit Nagal return plat_protocol_list; 641c97857dbSAmit Nagal } 642c97857dbSAmit Nagal 643c97857dbSAmit Nagal void init_scmi_server(void) 644c97857dbSAmit Nagal { 645c97857dbSAmit Nagal size_t i; 646c97857dbSAmit Nagal int32_t ret; 647c97857dbSAmit Nagal 6489f51da5eSMaheedhar Bollapalli for (i = 0U; i < ARRAY_SIZE(scmi_channel); i++) { 649c97857dbSAmit Nagal scmi_smt_init_agent_channel(&scmi_channel[i]); 6509f51da5eSMaheedhar Bollapalli } 651c97857dbSAmit Nagal 652c97857dbSAmit Nagal INFO("SCMI: Server initialized\n"); 653c97857dbSAmit Nagal 654c97857dbSAmit Nagal if (platform_id == QEMU) { 655c97857dbSAmit Nagal /* default setting is for QEMU */ 656c97857dbSAmit Nagal } else if (platform_id == SPP) { 657c97857dbSAmit Nagal for (i = 0U; i < ARRAY_SIZE(scmi0_clock); i++) { 658c97857dbSAmit Nagal 659c97857dbSAmit Nagal /* Keep i2c on 100MHz to calculate rates properly */ 6609f51da5eSMaheedhar Bollapalli if ((i >= CLK_I2C0_0) && (i <= CLK_I2C7_0)) { 661c97857dbSAmit Nagal continue; 6629f51da5eSMaheedhar Bollapalli } 663b048601eSSai Krishna Potthuri 664b048601eSSai Krishna Potthuri /* Keep UFS clocks to default values to get the expected rates */ 6659f51da5eSMaheedhar Bollapalli if ((i >= CLK_UFS0_0) && (i <= CLK_UFS0_2)) { 666b048601eSSai Krishna Potthuri continue; 6679f51da5eSMaheedhar Bollapalli } 668b048601eSSai Krishna Potthuri 669c97857dbSAmit Nagal /* 670c97857dbSAmit Nagal * SPP supports multiple versions. 671c97857dbSAmit Nagal * The cpu_clock value is set to corresponding SPP 672c97857dbSAmit Nagal * version in early platform setup, resuse the same 673c97857dbSAmit Nagal * value here. 674c97857dbSAmit Nagal */ 675c97857dbSAmit Nagal ret = plat_scmi_clock_set_rate(0, i, cpu_clock); 676c97857dbSAmit Nagal if (ret < 0) { 677c97857dbSAmit Nagal NOTICE("Failed to set clock rate for SPP scmi_id=%ld\n", i); 678c97857dbSAmit Nagal } 679c97857dbSAmit Nagal } 680c97857dbSAmit Nagal } else { 681c97857dbSAmit Nagal /* Making MISRA C 2012 15.7 compliant */ 682c97857dbSAmit Nagal } 683c97857dbSAmit Nagal } 684