fix(versal2): add ufs specific features support

Following IOCTL IDs are required for UFS specific functionalities.

IOCTL ID - 40(IOCTL_UFS_TXRX_CFGRDY_GET)
This gives the Tx_Rx_config_rdy_signal_mon(0xF1061054) register value
which contains the Tx and Rx lanes configuration ready signal information.

IOCTL ID - 41(IOCTL_UFS_SRAM_CSR_SEL)
Select - 0(IOCTL_UFS_SRAM_CSR_SET)
This will allow to set sram control and status register (0xF106104C)
with the value provided by driver.

Select - 1(IOCTL_UFS_SRAM_CSR_GET)
This should return the sram control and status register (0xF106104C) value
to the driver.

UFS Host reset assert/de-assert(using SCMI) support is added.
register address : 0xF1260340

UFS PHY reset assert/de-assert(using SCMI) support is added.
register address : 0xF1061050

Change-Id: I5368cc7251350946bd5ddb3a4c817b75e1d4a43e
Signed-off-by: Amit Nagal <amit.nagal@amd.com>
This commit is contained in:
Amit Nagal 2024-07-28 20:32:58 -12:00
parent fe40084d3b
commit b9c20e5d14
5 changed files with 58 additions and 4 deletions

View file

@ -125,6 +125,10 @@
#define APU_CLUSTER_STEP U(0x100000) #define APU_CLUSTER_STEP U(0x100000)
#define SLCR_OSPI_QSPI_IOU_AXI_MUX_SEL U(0xF1060504) #define SLCR_OSPI_QSPI_IOU_AXI_MUX_SEL U(0xF1060504)
#define PMXC_IOU_SLCR_SRAM_CSR U(0xF106104C)
#define PMXC_IOU_SLCR_PHY_RESET U(0xF1061050)
#define PMXC_IOU_SLCR_TX_RX_CONFIG_RDY U(0xF1061054)
#define PMXC_CRP_RST_UFS U(0xF1260340)
/******************************************************************************* /*******************************************************************************
* IRQ constants * IRQ constants

View file

@ -136,5 +136,6 @@
#define RESET_I3C6_0 32 #define RESET_I3C6_0 32
#define RESET_I3C7_0 33 #define RESET_I3C7_0 33
#define RESET_I3C8_0 34 #define RESET_I3C8_0 34
#define RESET_UFSPHY_0 35
#endif /* _VERSAL2_SCMI_H */ #endif /* _VERSAL2_SCMI_H */

View file

@ -161,12 +161,29 @@ int sip_svc_setup_init(void)
static int32_t no_pm_ioctl(uint32_t device_id, uint32_t ioctl_id, static int32_t no_pm_ioctl(uint32_t device_id, uint32_t ioctl_id,
uint32_t arg1, uint32_t arg2) uint32_t arg1, uint32_t arg2)
{ {
int32_t ret = 0;
VERBOSE("%s: ioctl_id: %x, arg1: %x\n", __func__, ioctl_id, arg1); VERBOSE("%s: ioctl_id: %x, arg1: %x\n", __func__, ioctl_id, arg1);
if (ioctl_id == IOCTL_OSPI_MUX_SELECT) {
switch (ioctl_id) {
case IOCTL_OSPI_MUX_SELECT:
mmio_write_32(SLCR_OSPI_QSPI_IOU_AXI_MUX_SEL, arg1); mmio_write_32(SLCR_OSPI_QSPI_IOU_AXI_MUX_SEL, arg1);
return 0; break;
case IOCTL_UFS_TXRX_CFGRDY_GET:
ret = (int32_t) mmio_read_32(PMXC_IOU_SLCR_TX_RX_CONFIG_RDY);
break;
case IOCTL_UFS_SRAM_CSR_SEL:
if (arg1 == 1) {
ret = (int32_t) mmio_read_32(PMXC_IOU_SLCR_SRAM_CSR);
} else if (arg1 == 0) {
mmio_write_32(PMXC_IOU_SLCR_SRAM_CSR, arg2);
}
break;
default:
ret = PM_RET_ERROR_NOFEATURE;
break;
} }
return PM_RET_ERROR_NOFEATURE;
return ret;
} }
static uint64_t no_pm_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3, static uint64_t no_pm_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3,
@ -187,7 +204,13 @@ static uint64_t no_pm_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64
case PM_IOCTL: case PM_IOCTL:
{ {
ret = no_pm_ioctl(arg[0], arg[1], arg[2], arg[3]); ret = no_pm_ioctl(arg[0], arg[1], arg[2], arg[3]);
SMC_RET1(handle, (uint64_t)ret); /* Firmware driver expects return code in upper 32 bits and
* status in lower 32 bits.
* status is always SUCCESS(0) for mmio low level register
* r/w calls and return value is the value returned from
* no_pm_ioctl
*/
SMC_RET1(handle, ((uint64_t)ret << 32));
} }
case PM_GET_CHIPID: case PM_GET_CHIPID:
{ {

View file

@ -10,6 +10,7 @@
#include <drivers/scmi-msg.h> #include <drivers/scmi-msg.h>
#include <drivers/scmi.h> #include <drivers/scmi.h>
#include <lib/mmio.h>
#include <lib/utils_def.h> #include <lib/utils_def.h>
#include <platform_def.h> #include <platform_def.h>
#include <scmi.h> #include <scmi.h>
@ -179,6 +180,7 @@ static struct scmi_reset scmi0_reset[] = {
RESET_CELL(RESET_I3C6_0, RESET_I3C6_0, "i3c6"), RESET_CELL(RESET_I3C6_0, RESET_I3C6_0, "i3c6"),
RESET_CELL(RESET_I3C7_0, RESET_I3C7_0, "i3c7"), RESET_CELL(RESET_I3C7_0, RESET_I3C7_0, "i3c7"),
RESET_CELL(RESET_I3C8_0, RESET_I3C8_0, "i3c8"), RESET_CELL(RESET_I3C8_0, RESET_I3C8_0, "i3c8"),
RESET_CELL(RESET_UFSPHY_0, RESET_UFSPHY_0, "ufsphy0"),
}; };
struct scmi_resources { struct scmi_resources {
@ -433,9 +435,31 @@ int32_t plat_scmi_rstd_set_state(unsigned int agent_id, unsigned int scmi_id,
if (assert_not_deassert) { if (assert_not_deassert) {
NOTICE("SCMI reset %lu/%s set\n", NOTICE("SCMI reset %lu/%s set\n",
reset->reset_id, plat_scmi_rstd_get_name(agent_id, scmi_id)); reset->reset_id, plat_scmi_rstd_get_name(agent_id, scmi_id));
switch (scmi_id) {
case RESET_UFS0_0:
mmio_write_32(PMXC_CRP_RST_UFS, 1);
break;
case RESET_UFSPHY_0:
mmio_write_32(PMXC_IOU_SLCR_PHY_RESET, 1);
break;
default:
break;
}
} else { } else {
NOTICE("SCMI reset %lu/%s release\n", NOTICE("SCMI reset %lu/%s release\n",
reset->reset_id, plat_scmi_rstd_get_name(agent_id, scmi_id)); reset->reset_id, plat_scmi_rstd_get_name(agent_id, scmi_id));
switch (scmi_id) {
case RESET_UFS0_0:
mmio_write_32(PMXC_CRP_RST_UFS, 0);
break;
case RESET_UFSPHY_0:
mmio_write_32(PMXC_IOU_SLCR_PHY_RESET, 0);
break;
default:
break;
}
} }
return SCMI_SUCCESS; return SCMI_SUCCESS;

View file

@ -95,6 +95,8 @@ enum {
IOCTL_GET_LAST_RESET_REASON = 23, IOCTL_GET_LAST_RESET_REASON = 23,
/* AI engine NPI ISR clear */ /* AI engine NPI ISR clear */
IOCTL_AIE_ISR_CLEAR = 24, IOCTL_AIE_ISR_CLEAR = 24,
IOCTL_UFS_TXRX_CFGRDY_GET = 40,
IOCTL_UFS_SRAM_CSR_SEL = 41,
}; };
/** /**