1 /* 2 * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #include <assert.h> 8 #include <errno.h> 9 #include <string.h> 10 11 #include <common/bl_common.h> 12 #include <common/debug.h> 13 #include <drivers/console.h> 14 #include <drivers/gpio.h> 15 #include <libfdt.h> 16 #include <lib/coreboot.h> 17 #include <lib/mmio.h> 18 #include <plat/common/platform.h> 19 20 #include <plat_params.h> 21 #include <plat_private.h> 22 23 static struct gpio_info param_reset; 24 static struct gpio_info param_poweroff; 25 static struct bl31_apio_param param_apio; 26 static struct gpio_info *rst_gpio; 27 static struct gpio_info *poweroff_gpio; 28 static struct gpio_info suspend_gpio[10]; 29 uint32_t suspend_gpio_cnt; 30 static struct apio_info *suspend_apio; 31 32 #if COREBOOT 33 static int dt_process_fdt(void *blob) 34 { 35 return -ENODEV; 36 } 37 #else 38 static uint8_t fdt_buffer[0x10000]; 39 40 void *plat_get_fdt(void) 41 { 42 return &fdt_buffer[0]; 43 } 44 45 static int dt_process_fdt(void *blob) 46 { 47 void *fdt = plat_get_fdt(); 48 int ret; 49 50 ret = fdt_open_into(blob, fdt, 0x10000); 51 if (ret < 0) 52 return ret; 53 54 return 0; 55 } 56 #endif 57 58 struct gpio_info *plat_get_rockchip_gpio_reset(void) 59 { 60 return rst_gpio; 61 } 62 63 struct gpio_info *plat_get_rockchip_gpio_poweroff(void) 64 { 65 return poweroff_gpio; 66 } 67 68 struct gpio_info *plat_get_rockchip_suspend_gpio(uint32_t *count) 69 { 70 *count = suspend_gpio_cnt; 71 72 return &suspend_gpio[0]; 73 } 74 75 struct apio_info *plat_get_rockchip_suspend_apio(void) 76 { 77 return suspend_apio; 78 } 79 80 void params_early_setup(void *plat_param_from_bl2) 81 { 82 struct bl31_plat_param *bl2_param; 83 struct bl31_gpio_param *gpio_param; 84 85 /* 86 * Test if this is a FDT passed as a platform-specific parameter 87 * block. 88 */ 89 if (!dt_process_fdt(plat_param_from_bl2)) 90 return; 91 92 /* keep plat parameters for later processing if need */ 93 bl2_param = (struct bl31_plat_param *)plat_param_from_bl2; 94 while (bl2_param) { 95 switch (bl2_param->type) { 96 case PARAM_RESET: 97 gpio_param = (struct bl31_gpio_param *)bl2_param; 98 memcpy(¶m_reset, &gpio_param->gpio, 99 sizeof(struct gpio_info)); 100 rst_gpio = ¶m_reset; 101 break; 102 case PARAM_POWEROFF: 103 gpio_param = (struct bl31_gpio_param *)bl2_param; 104 memcpy(¶m_poweroff, &gpio_param->gpio, 105 sizeof(struct gpio_info)); 106 poweroff_gpio = ¶m_poweroff; 107 break; 108 case PARAM_SUSPEND_GPIO: 109 if (suspend_gpio_cnt >= ARRAY_SIZE(suspend_gpio)) { 110 ERROR("exceed support suspend gpio number\n"); 111 break; 112 } 113 gpio_param = (struct bl31_gpio_param *)bl2_param; 114 memcpy(&suspend_gpio[suspend_gpio_cnt], 115 &gpio_param->gpio, 116 sizeof(struct gpio_info)); 117 suspend_gpio_cnt++; 118 break; 119 case PARAM_SUSPEND_APIO: 120 memcpy(¶m_apio, bl2_param, 121 sizeof(struct bl31_apio_param)); 122 suspend_apio = ¶m_apio.apio; 123 break; 124 #if COREBOOT 125 case PARAM_COREBOOT_TABLE: 126 coreboot_table_setup((void *) 127 ((struct bl31_u64_param *)bl2_param)->value); 128 break; 129 #endif 130 default: 131 ERROR("not expected type found %lld\n", 132 bl2_param->type); 133 break; 134 } 135 bl2_param = bl2_param->next; 136 } 137 } 138