diff options
author | Rajan Vaja <rajan.vaja@xilinx.com> | 2018-01-17 02:39:27 -0800 |
---|---|---|
committer | Jolly Shah <jollys@xilinx.com> | 2018-03-15 10:23:49 -0700 |
commit | 63eb7a367d63526dbd15f3476b4bc2c6f852b48b (patch) | |
tree | bd5ceddbc6aa07f603f6f04c997ca6ee8e14af78 /plat | |
parent | 1a3f02b5a3fbf8b3fe3252ac5486b89be57ee50a (diff) | |
download | platform_external_arm-trusted-firmware-63eb7a367d63526dbd15f3476b4bc2c6f852b48b.tar.gz platform_external_arm-trusted-firmware-63eb7a367d63526dbd15f3476b4bc2c6f852b48b.tar.bz2 platform_external_arm-trusted-firmware-63eb7a367d63526dbd15f3476b4bc2c6f852b48b.zip |
zynqmp: pm: Add IOCTLs for global storage access
Add IOCTLs to read/write global general storage and
persistent global general storage registers access.
Signed-off-by: Rajan Vaja <rajanv@xilinx.com>
Signed-off-by: Jolly Shah <jollys@xilinx.com>
Diffstat (limited to 'plat')
-rw-r--r-- | plat/xilinx/zynqmp/pm_service/pm_api_ioctl.c | 88 | ||||
-rw-r--r-- | plat/xilinx/zynqmp/pm_service/pm_api_ioctl.h | 4 | ||||
-rw-r--r-- | plat/xilinx/zynqmp/zynqmp_def.h | 8 |
3 files changed, 100 insertions, 0 deletions
diff --git a/plat/xilinx/zynqmp/pm_service/pm_api_ioctl.c b/plat/xilinx/zynqmp/pm_service/pm_api_ioctl.c index 7634b8c87..3ef027287 100644 --- a/plat/xilinx/zynqmp/pm_service/pm_api_ioctl.c +++ b/plat/xilinx/zynqmp/pm_service/pm_api_ioctl.c @@ -396,6 +396,82 @@ static enum pm_ret_status pm_ioctl_get_pll_frac_data } /** + * pm_ioctl_write_ggs() - Ioctl function for writing + * global general storage (ggs) + * @index GGS register index + * @value Register value to be written + * + * This function writes value to GGS register. + * + * @return Returns status, either success or error+reason + */ +static enum pm_ret_status pm_ioctl_write_ggs(unsigned int index, + unsigned int value) +{ + if (index >= GGS_NUM_REGS) + return PM_RET_ERROR_ARGS; + + return pm_mmio_write(GGS_BASEADDR + (index << 2), 0xFFFFFFFF, value); +} + +/** + * pm_ioctl_read_ggs() - Ioctl function for reading + * global general storage (ggs) + * @index GGS register index + * @value Register value + * + * This function returns GGS register value. + * + * @return Returns status, either success or error+reason + */ +static enum pm_ret_status pm_ioctl_read_ggs(unsigned int index, + unsigned int *value) +{ + if (index >= GGS_NUM_REGS) + return PM_RET_ERROR_ARGS; + + return pm_mmio_read(GGS_BASEADDR + (index << 2), value); +} + +/** + * pm_ioctl_write_pggs() - Ioctl function for writing persistent + * global general storage (pggs) + * @index PGGS register index + * @value Register value to be written + * + * This function writes value to PGGS register. + * + * @return Returns status, either success or error+reason + */ +static enum pm_ret_status pm_ioctl_write_pggs(unsigned int index, + unsigned int value) +{ + if (index >= PGGS_NUM_REGS) + return PM_RET_ERROR_ARGS; + + return pm_mmio_write(PGGS_BASEADDR + (index << 2), 0xFFFFFFFF, value); +} + +/** + * pm_ioctl_read_pggs() - Ioctl function for reading persistent + * global general storage (pggs) + * @index PGGS register index + * @value Register value + * + * This function returns PGGS register value. + * + * @return Returns status, either success or error+reason + */ +static enum pm_ret_status pm_ioctl_read_pggs(unsigned int index, + unsigned int *value) +{ + if (index >= PGGS_NUM_REGS) + return PM_RET_ERROR_ARGS; + + return pm_mmio_read(PGGS_BASEADDR + (index << 2), value); +} + +/** * pm_api_ioctl() - PM IOCTL API for device control and configs * @node_id Node ID of the device * @ioctl_id ID of the requested IOCTL @@ -452,6 +528,18 @@ enum pm_ret_status pm_api_ioctl(enum pm_node_id nid, case IOCTL_GET_PLL_FRAC_DATA: ret = pm_ioctl_get_pll_frac_data(arg1, value); break; + case IOCTL_WRITE_GGS: + ret = pm_ioctl_write_ggs(arg1, arg2); + break; + case IOCTL_READ_GGS: + ret = pm_ioctl_read_ggs(arg1, value); + break; + case IOCTL_WRITE_PGGS: + ret = pm_ioctl_write_pggs(arg1, arg2); + break; + case IOCTL_READ_PGGS: + ret = pm_ioctl_read_pggs(arg1, value); + break; default: ret = PM_RET_ERROR_NOTSUPPORTED; } diff --git a/plat/xilinx/zynqmp/pm_service/pm_api_ioctl.h b/plat/xilinx/zynqmp/pm_service/pm_api_ioctl.h index b290574c8..548ac9e8d 100644 --- a/plat/xilinx/zynqmp/pm_service/pm_api_ioctl.h +++ b/plat/xilinx/zynqmp/pm_service/pm_api_ioctl.h @@ -27,6 +27,10 @@ enum pm_ioctl_id { IOCTL_GET_PLL_FRAC_MODE, IOCTL_SET_PLL_FRAC_DATA, IOCTL_GET_PLL_FRAC_DATA, + IOCTL_WRITE_GGS, + IOCTL_READ_GGS, + IOCTL_WRITE_PGGS, + IOCTL_READ_PGGS, }; enum rpu_oper_mode { diff --git a/plat/xilinx/zynqmp/zynqmp_def.h b/plat/xilinx/zynqmp/zynqmp_def.h index 3feae9d41..e7fceda59 100644 --- a/plat/xilinx/zynqmp/zynqmp_def.h +++ b/plat/xilinx/zynqmp/zynqmp_def.h @@ -303,4 +303,12 @@ #define IOU_SLCR_CAN_MIO_CTRL (IOU_SLCR_BASEADDR + 0x304) #define IOU_SLCR_WDT_CLK_SEL (IOU_SLCR_BASEADDR + 0x300) +/* Global general storage register base address */ +#define GGS_BASEADDR (0xFFD80030U) +#define GGS_NUM_REGS (4) + +/* Persistent global general storage register base address */ +#define PGGS_BASEADDR (0xFFD80050U) +#define PGGS_NUM_REGS (4) + #endif /* __ZYNQMP_DEF_H__ */ |