rockchip: add reset or power off gpio configuration for rk3399
authorCaesar Wang <wxt@rock-chips.com>
Wed, 25 May 2016 11:03:04 +0000 (19:03 +0800)
committerCaesar Wang <wxt@rock-chips.com>
Fri, 27 May 2016 01:39:56 +0000 (09:39 +0800)
We add plat parameter structs to support BL2 to pass variable-length,
variable-type parameters to BL31. The parameters are structured as a
link list. During bl31 setup time, we travse the list to process each
parameter. throuth this way, we can get the reset or power off gpio
parameter, and do hardware control in BL31. This structure also can
pass other parameter to BL31 in future.

plat/rockchip/common/bl31_plat_setup.c
plat/rockchip/common/include/plat_params.h [new file with mode: 0644]
plat/rockchip/common/include/plat_private.h
plat/rockchip/common/params_setup.c [new file with mode: 0644]
plat/rockchip/rk3368/platform.mk
plat/rockchip/rk3399/platform.mk

index 727a2c7439a990a56212bafeb1d12c6ec8b866c6..47a245a6c43c75646678d5819b6feb27cd7c39ef 100644 (file)
@@ -120,6 +120,9 @@ void bl31_early_platform_setup(bl31_params_t *from_bl2,
         * Copy the code into pmusram.
         */
        plat_rockchip_pmusram_prepare();
+
+       /* there may have some board sepcific message need to initialize */
+       params_early_setup(plat_params_from_bl2);
 }
 
 /*******************************************************************************
diff --git a/plat/rockchip/common/include/plat_params.h b/plat/rockchip/common/include/plat_params.h
new file mode 100644 (file)
index 0000000..cad4535
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __PLAT_PARAMS_H__
+#define __PLAT_PARAMS_H__
+
+#include <stdint.h>
+
+/*
+ * We defined several plat parameter structs for BL2 to pass platform related
+ * parameters to Rockchip BL31 platform code.  All plat parameters start with
+ * a common header, which has a type field to indicate the parameter type, and
+ * a next pointer points to next parameter. If the parameter is the last one in
+ * the list, next pointer will points to NULL.  After the header comes the
+ * variable-sized members that describe the parameter. The picture below shows
+ * how the parameters are kept in memory.
+ *
+ * head of list  ---> +----------------+ --+
+ *                    |      type      |   |
+ *                    +----------------+   |--> struct bl31_plat_param
+ *               +----|      next      |   |
+ *               |    +----------------+ --+
+ *               |    | parameter data |
+ *               |    +----------------+
+ *               |
+ *               +--> +----------------+ --+
+ *                    |      type      |   |
+ *                    +----------------+   |--> struct bl31_plat_param
+ *           NULL <---|      next      |   |
+ *                    +----------------+ --+
+ *                    | parameter data |
+ *                    +----------------+
+ *
+ * Note: The SCTLR_EL3.A bit (Alignment fault check enable) of ARM TF is set,
+ * so be sure each parameter struct starts on 64-bit aligned address. If not,
+ * alignment fault will occur during accessing its data member.
+ */
+
+/* param type */
+enum {
+       PARAM_NONE = 0,
+       PARAM_RESET,
+       PARAM_POWEROFF,
+};
+
+struct gpio_info {
+       uint8_t polarity;
+       uint8_t direction;
+       uint8_t pull_mode;
+       uint32_t index;
+};
+
+/* common header for all plat parameter type */
+struct bl31_plat_param {
+       uint64_t type;
+       void *next;
+};
+
+struct bl31_gpio_param {
+       struct bl31_plat_param h;
+       struct gpio_info gpio;
+};
+
+#endif /* __PLAT_PARAMS_H__ */
index 8cd762d06533531a1f3a2333f2476a0d9da7c36c..031a3413e95e6720c6e6418715431b50da1e4fe1 100644 (file)
@@ -97,6 +97,8 @@ void plat_cci_disable(void);
 
 void plat_delay_timer_init(void);
 
+void params_early_setup(void *plat_params_from_bl2);
+
 void plat_rockchip_gic_driver_init(void);
 void plat_rockchip_gic_init(void);
 void plat_rockchip_gic_cpuif_enable(void);
@@ -110,6 +112,8 @@ void plat_setup_rockchip_pm_ops(struct rockchip_pm_ops_cb *ops);
 
 void platform_cpu_warmboot(void);
 
+void *plat_get_rockchip_gpio_reset(void);
+void *plat_get_rockchip_gpio_poweroff(void);
 void plat_rockchip_gpio_init(void);
 
 extern const unsigned char rockchip_power_domain_tree_desc[];
diff --git a/plat/rockchip/common/params_setup.c b/plat/rockchip/common/params_setup.c
new file mode 100644 (file)
index 0000000..2a49556
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <arm_gic.h>
+#include <assert.h>
+#include <bl_common.h>
+#include <console.h>
+#include <debug.h>
+#include <gpio.h>
+#include <mmio.h>
+#include <platform.h>
+#include <plat_params.h>
+#include <plat_private.h>
+#include <string.h>
+
+static struct bl31_plat_param *bl31_params_head;
+static struct bl31_gpio_param param_reset;
+static struct bl31_gpio_param param_poweroff;
+static struct gpio_info *rst_gpio;
+static struct gpio_info *poweroff_gpio;
+
+void *plat_get_rockchip_gpio_reset(void)
+{
+       return rst_gpio;
+}
+
+void *plat_get_rockchip_gpio_poweroff(void)
+{
+       return poweroff_gpio;
+}
+
+void params_early_setup(void *plat_param_from_bl2)
+{
+       struct bl31_plat_param *param;
+       struct bl31_plat_param *bl2_param;
+       struct bl31_gpio_param *gpio_param;
+
+       /* keep plat parameters for later processing if need */
+       bl2_param = (struct bl31_plat_param *)plat_param_from_bl2;
+       while (bl2_param) {
+               switch (bl2_param->type) {
+               case PARAM_RESET:
+                       param = (struct bl31_plat_param *)&param_reset;
+                       memcpy((void *)param, (void *)bl2_param,
+                               sizeof(struct bl31_gpio_param));
+                       gpio_param = (struct bl31_gpio_param *)param;
+                       rst_gpio = &gpio_param->gpio;
+                       break;
+               case PARAM_POWEROFF:
+                       param = (struct bl31_plat_param *)&param_poweroff;
+                       memcpy((void *)param, (void *)bl2_param,
+                               sizeof(struct bl31_gpio_param));
+                       gpio_param = (struct bl31_gpio_param *)param;
+                       poweroff_gpio = &gpio_param->gpio;
+                       break;
+               default:
+                       NOTICE("not expected type found\n");
+                       return; /* don't continue if unexpected type found */
+               }
+               param->next = bl31_params_head;
+               bl31_params_head = param;
+               bl2_param = bl2_param->next;
+       }
+}
index 0e64b7e851ef402a158a5e8d1d56735aff757e8e..50eda3223d0e2f9610fd65e9737fee932a1cce46 100644 (file)
@@ -63,6 +63,7 @@ BL31_SOURCES          +=      ${RK_GIC_SOURCES}                               \
                                plat/common/aarch64/platform_mp_stack.S         \
                                ${RK_PLAT_COMMON}/aarch64/plat_helpers.S        \
                                ${RK_PLAT_COMMON}/bl31_plat_setup.c             \
+                               ${RK_PLAT_COMMON}/params_setup.c                \
                                ${RK_PLAT_COMMON}/pmusram/pmu_sram_cpus_on.S            \
                                ${RK_PLAT_COMMON}/pmusram/pmu_sram.c            \
                                ${RK_PLAT_COMMON}/plat_pm.c                     \
index fe1aabcb8910c1242f193e0d074770076a89539e..b0ce56f3af44f0ac85db4cf438df2032e43e911c 100644 (file)
@@ -64,6 +64,7 @@ BL31_SOURCES            +=      ${RK_GIC_SOURCES}
                                 plat/common/aarch64/platform_mp_stack.S         \
                                 ${RK_PLAT_COMMON}/aarch64/plat_helpers.S        \
                                 ${RK_PLAT_COMMON}/bl31_plat_setup.c             \
+                                ${RK_PLAT_COMMON}/params_setup.c                \
                                 ${RK_PLAT_COMMON}/pmusram/pmu_sram_cpus_on.S   \
                                ${RK_PLAT_COMMON}/pmusram/pmu_sram.c            \
                                 ${RK_PLAT_COMMON}/plat_pm.c                     \