blob: 985d4234f73d8b010aecc61dc1697be14fc67db1 [file] [log] [blame]
commit 5f0a5507eb6c9ed3745b89a1246bb7a7b6141857
Author: Petter Lundanes <petter.lundanes@arm.com>
Date: Mon Feb 9 14:37:06 2015 +0100
Adds a service to enable/disable GPU cache snooping
Adds a service to enable/disable cache snooping over
CCI for GPU on request from SMC (mali kernel driver).
diff --git a/bl31/bl31.mk b/bl31/bl31.mk
index 4c25a60..cd0b530 100644
--- a/bl31/bl31.mk
+++ b/bl31/bl31.mk
@@ -50,7 +50,8 @@ BL31_SOURCES += bl31/bl31_main.c \
services/std_svc/psci/psci_helpers.S \
services/std_svc/psci/psci_main.c \
services/std_svc/psci/psci_setup.c \
- services/std_svc/psci/psci_system_off.c
+ services/std_svc/psci/psci_system_off.c \
+ services/sips/arm/css/svc.c
ifeq (${USE_COHERENT_MEM}, 1)
BL31_SOURCES += lib/locks/bakery/bakery_lock_coherent.c
diff --git a/services/sips/arm/css/svc.c b/services/sips/arm/css/svc.c
new file mode 100644
index 0000000..bbc63a4
--- /dev/null
+++ b/services/sips/arm/css/svc.c
@@ -0,0 +1,88 @@
+#include <debug.h>
+#include <runtime_svc.h>
+#include <stdint.h>
+#include <cci400.h>
+#include <uuid.h>
+#include <mmio.h>
+
+
+/* This should be updated to the CCI port the GPU is connect to on your platform.*/
+#define GPU_CCI_PORT 3U
+
+/*
+ * See SMC calling convention for details.
+ * Bit 31 - 1 = Fast call.
+ * Bits 29:24 - 0x2 = SIP service call.
+ * Bits 15:00 - Function number.
+ *
+ * These must correspond to the IDs given in device tree for the device driver.
+ */
+#define SMC_FID_ENABLE_COHERENCY (0x8200ff04)
+#define SMC_FID_DISABLE_COHERENCY (0x8200ff05)
+
+/* Setup CSS Services */
+static int32_t css_svc_setup(void)
+{
+ return 0;
+}
+
+static void cci_enable_gpu_coherency(unsigned int cciport)
+{
+ /* Enable Snoops */
+ mmio_write_32(CCI400_BASE + SLAVE_IFACE_OFFSET(cciport) + SNOOP_CTRL_REG,
+ (SNOOP_EN_BIT));
+
+ /* Wait for the dust to settle down */
+ while (mmio_read_32(CCI400_BASE + STATUS_REG) & CHANGE_PENDING_BIT)
+ ;
+}
+static void cci_disable_gpu_coherency(unsigned int cciport)
+{
+ /* Disable Snoops */
+ mmio_write_32(CCI400_BASE + SLAVE_IFACE_OFFSET(cciport) + SNOOP_CTRL_REG,
+ 0U);
+
+ /* Wait for the dust to settle down */
+ while (mmio_read_32(CCI400_BASE + STATUS_REG) & CHANGE_PENDING_BIT)
+ ;
+}
+
+/*
+ * Top-level CSS Service SMC handler.
+ */
+uint64_t css_svc_smc_handler(uint32_t smc_fid,
+ uint64_t x1,
+ uint64_t x2,
+ uint64_t x3,
+ uint64_t x4,
+ void *cookie,
+ void *handle,
+ uint64_t flags)
+{
+ switch (smc_fid) {
+ case SMC_FID_ENABLE_COHERENCY:
+ {
+ cci_enable_gpu_coherency(GPU_CCI_PORT);
+ SMC_RET1(handle, 0x0);
+ }
+ case SMC_FID_DISABLE_COHERENCY:
+ {
+ cci_disable_gpu_coherency(GPU_CCI_PORT);
+ SMC_RET1(handle, 0x0);
+ }
+ default:
+ WARN("Unimplemented CSS Service Call: 0x%x \n", smc_fid);
+ SMC_RET1(handle, SMC_UNK);
+ }
+}
+
+/* Register as runtime service */
+DECLARE_RT_SVC(
+ css_svc,
+
+ OEN_SIP_START,
+ OEN_SIP_END,
+ SMC_TYPE_FAST,
+ css_svc_setup,
+ css_svc_smc_handler
+);