blob: 5fa953b808a24d46489bdaa35d20e3d3f3750dc1 [file] [log] [blame]
julhal0137e1aea2021-02-09 15:22:20 +00001// SPDX-License-Identifier: BSD-3-Clause
2/*
3 * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
4 */
5
6#include <string.h>
Julian Hall7048d302021-06-03 16:07:28 +01007#include <config/interface/config_store.h>
8#include <config/interface/config_blob.h>
julhal0137e1aea2021-02-09 15:22:20 +00009#include <platform/interface/device_region.h>
10#include "sp_config_loader.h"
11
12
13struct sp_param_device_region
14{
15 char name[16];
16 uintptr_t location;
17 size_t size;
18};
19
Julian Hall7048d302021-06-03 16:07:28 +010020static void load_device_regions(const struct ffa_name_value_pair *value_pair);
21static void load_memory_regions(const struct ffa_name_value_pair *value_pair);
22static void load_blob(const struct ffa_name_value_pair *value_pair);
23
julhal0137e1aea2021-02-09 15:22:20 +000024/**
Julian Hall7048d302021-06-03 16:07:28 +010025 * Loads externally provided configuration data passed into the SP via
26 * FFA initialisation parameters. Data can originate from
27 * the SP manifest, an external device tree or a dynamic configuration
28 * mechanism such as a handover block (HOB).
julhal0137e1aea2021-02-09 15:22:20 +000029 */
30void sp_config_load(struct ffa_init_info *init_info)
31{
32 /* Load deployment specific configuration */
33 for (size_t param_index = 0; param_index < init_info->count; param_index++) {
34
35 if (!strcmp((const char *)init_info->nvp[param_index].name,"DEVICE_REGIONS")) {
36
Julian Hall7048d302021-06-03 16:07:28 +010037 load_device_regions(&init_info->nvp[param_index]);
38 }
39 else if (!strcmp((const char *)init_info->nvp[param_index].name,"MEMORY_REGIONS")) {
julhal0137e1aea2021-02-09 15:22:20 +000040
Julian Hall7048d302021-06-03 16:07:28 +010041 load_memory_regions(&init_info->nvp[param_index]);
42 }
43 else {
julhal0137e1aea2021-02-09 15:22:20 +000044
Julian Hall7048d302021-06-03 16:07:28 +010045 load_blob(&init_info->nvp[param_index]);
julhal0137e1aea2021-02-09 15:22:20 +000046 }
47 }
48}
Julian Hall7048d302021-06-03 16:07:28 +010049
50static void load_device_regions(const struct ffa_name_value_pair *value_pair)
51{
52 struct sp_param_device_region *d = (struct sp_param_device_region *)value_pair->value;
53
54 /* Iterate over the device regions */
55 while ((uintptr_t)d < (value_pair->value + value_pair->size)) {
56
57 struct device_region device_region;
58
59 strcpy(device_region.dev_class, d->name);
60 device_region.dev_instance = 0;
61 device_region.base_addr = d->location;
62 device_region.io_region_size = d->size;
63
64 config_store_add(CONFIG_CLASSIFIER_DEVICE_REGION,
65 device_region.dev_class, device_region.dev_instance,
66 &device_region, sizeof(device_region));
67
68 ++d;
69 }
70}
71
72static void load_memory_regions(const struct ffa_name_value_pair *value_pair)
73{
74 /* Not yet supported */
75 (void)value_pair;
76}
77
78static void load_blob(const struct ffa_name_value_pair *value_pair)
79{
80 struct config_blob blob;
81
82 blob.data = (const void*)value_pair->value;
83 blob.data_len = value_pair->size;
84
85 config_store_add(CONFIG_CLASSIFIER_BLOB,
86 (const char *)value_pair->name, 0,
87 &blob, sizeof(blob));
88}