/* * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include #include #include #include #include #include #include #include #include #include #include static struct gpio_info param_reset; static struct gpio_info param_poweroff; static struct bl31_apio_param param_apio; static struct gpio_info *rst_gpio; static struct gpio_info *poweroff_gpio; static struct gpio_info suspend_gpio[10]; uint32_t suspend_gpio_cnt; static struct apio_info *suspend_apio; #if COREBOOT static int dt_process_fdt(void *blob) { return -ENODEV; } #else static uint8_t fdt_buffer[0x10000]; void *plat_get_fdt(void) { return &fdt_buffer[0]; } static int dt_process_fdt(void *blob) { void *fdt = plat_get_fdt(); int ret; ret = fdt_open_into(blob, fdt, 0x10000); if (ret < 0) return ret; return 0; } #endif struct gpio_info *plat_get_rockchip_gpio_reset(void) { return rst_gpio; } struct gpio_info *plat_get_rockchip_gpio_poweroff(void) { return poweroff_gpio; } struct gpio_info *plat_get_rockchip_suspend_gpio(uint32_t *count) { *count = suspend_gpio_cnt; return &suspend_gpio[0]; } struct apio_info *plat_get_rockchip_suspend_apio(void) { return suspend_apio; } void params_early_setup(void *plat_param_from_bl2) { struct bl31_plat_param *bl2_param; struct bl31_gpio_param *gpio_param; /* * Test if this is a FDT passed as a platform-specific parameter * block. */ if (!dt_process_fdt(plat_param_from_bl2)) return; /* 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: gpio_param = (struct bl31_gpio_param *)bl2_param; memcpy(¶m_reset, &gpio_param->gpio, sizeof(struct gpio_info)); rst_gpio = ¶m_reset; break; case PARAM_POWEROFF: gpio_param = (struct bl31_gpio_param *)bl2_param; memcpy(¶m_poweroff, &gpio_param->gpio, sizeof(struct gpio_info)); poweroff_gpio = ¶m_poweroff; break; case PARAM_SUSPEND_GPIO: if (suspend_gpio_cnt >= ARRAY_SIZE(suspend_gpio)) { ERROR("exceed support suspend gpio number\n"); break; } gpio_param = (struct bl31_gpio_param *)bl2_param; memcpy(&suspend_gpio[suspend_gpio_cnt], &gpio_param->gpio, sizeof(struct gpio_info)); suspend_gpio_cnt++; break; case PARAM_SUSPEND_APIO: memcpy(¶m_apio, bl2_param, sizeof(struct bl31_apio_param)); suspend_apio = ¶m_apio.apio; break; #if COREBOOT case PARAM_COREBOOT_TABLE: coreboot_table_setup((void *) ((struct bl31_u64_param *)bl2_param)->value); break; #endif default: ERROR("not expected type found %lld\n", bl2_param->type); break; } bl2_param = bl2_param->next; } }