1 /*
2  * Arm SCP/MCP Software
3  * Copyright (c) 2019-2021, Arm Limited and Contributors. All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include "config_juno_xrp7724.h"
9 #include "config_mock_psu.h"
10 #include "config_psu.h"
11 #include "juno_id.h"
12 
13 #include <mod_juno_xrp7724.h>
14 #include <mod_mock_psu.h>
15 #include <mod_psu.h>
16 
17 #include <fwk_assert.h>
18 #include <fwk_element.h>
19 #include <fwk_id.h>
20 #include <fwk_module.h>
21 #include <fwk_module_idx.h>
22 #include <fwk_status.h>
23 
24 #include <stddef.h>
25 
26 static struct fwk_element psu_dev_desc_table[] = {
27     [MOD_PSU_ELEMENT_IDX_VSYS] = {
28         .name = "VSYS",
29         .data = &(const struct mod_psu_element_cfg) {
30             .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_JUNO_XRP7724,
31                 MOD_JUNO_XRP7724_ELEMENT_IDX_PSU_VSYS),
32             .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_JUNO_XRP7724,
33                 MOD_JUNO_XRP7724_API_IDX_PSU),
34         },
35     },
36     [MOD_PSU_ELEMENT_IDX_VBIG] = {
37         .name = "VBIG",
38         .data = &(const struct mod_psu_element_cfg) {
39             .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_JUNO_XRP7724,
40                 MOD_JUNO_XRP7724_ELEMENT_IDX_PSU_VBIG),
41             .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_JUNO_XRP7724,
42                 MOD_JUNO_XRP7724_API_IDX_PSU),
43         },
44     },
45     [MOD_PSU_ELEMENT_IDX_VLITTLE] = {
46         .name = "VLITLLE",
47         .data = &(const struct mod_psu_element_cfg) {
48             .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_JUNO_XRP7724,
49                 MOD_JUNO_XRP7724_ELEMENT_IDX_PSU_VLITTLE),
50             .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_JUNO_XRP7724,
51                 MOD_JUNO_XRP7724_API_IDX_PSU),
52         },
53     },
54     [MOD_PSU_ELEMENT_IDX_VGPU] = {
55         .name = "VGPU",
56         .data = &(const struct mod_psu_element_cfg) {
57             .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_JUNO_XRP7724,
58                 MOD_JUNO_XRP7724_ELEMENT_IDX_PSU_VGPU),
59             .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_JUNO_XRP7724,
60                 MOD_JUNO_XRP7724_API_IDX_PSU),
61         },
62     },
63     [MOD_PSU_ELEMENT_IDX_COUNT] = { 0 },
64 };
65 
66 /* When running on a model, use the mock_psu */
67 static struct fwk_element psu_element_table_fvp[] = {
68     [MOD_PSU_ELEMENT_IDX_VSYS] = {
69         .name = "Fake-VSYS",
70         .data = &(const struct mod_psu_element_cfg) {
71             .driver_id = FWK_ID_ELEMENT_INIT(
72                 FWK_MODULE_IDX_MOCK_PSU, MOD_MOCK_PSU_ELEMENT_IDX_VSYS),
73             .driver_api_id = FWK_ID_API_INIT(
74                 FWK_MODULE_IDX_MOCK_PSU, MOD_MOCK_PSU_API_IDX_DRIVER),
75         },
76     },
77     [MOD_PSU_ELEMENT_IDX_VBIG] = {
78         .name = "Fake-VBIG",
79         .data = &(const struct mod_psu_element_cfg) {
80             .driver_id = FWK_ID_ELEMENT_INIT(
81                 FWK_MODULE_IDX_MOCK_PSU, MOD_MOCK_PSU_ELEMENT_IDX_VBIG),
82             .driver_api_id = FWK_ID_API_INIT(
83                 FWK_MODULE_IDX_MOCK_PSU, MOD_MOCK_PSU_API_IDX_DRIVER),
84         },
85     },
86     [MOD_PSU_ELEMENT_IDX_VLITTLE] = {
87         .name = "Fake-VLITTLE",
88         .data = &(const struct mod_psu_element_cfg) {
89             .driver_id = FWK_ID_ELEMENT_INIT(
90                 FWK_MODULE_IDX_MOCK_PSU, MOD_MOCK_PSU_ELEMENT_IDX_VLITTLE),
91             .driver_api_id = FWK_ID_API_INIT(
92                 FWK_MODULE_IDX_MOCK_PSU, MOD_MOCK_PSU_API_IDX_DRIVER),
93         },
94     },
95     [MOD_PSU_ELEMENT_IDX_VGPU] = {
96         .name = "Fake-VGPU",
97         .data = &(const struct mod_psu_element_cfg) {
98             .driver_id = FWK_ID_ELEMENT_INIT(
99                 FWK_MODULE_IDX_MOCK_PSU, MOD_MOCK_PSU_ELEMENT_IDX_VGPU),
100             .driver_api_id = FWK_ID_API_INIT(
101                 FWK_MODULE_IDX_MOCK_PSU, MOD_MOCK_PSU_API_IDX_DRIVER),
102         },
103     },
104     [MOD_PSU_ELEMENT_IDX_COUNT] = { 0 } /* Termination description */
105 };
106 
psu_get_dev_desc_table(fwk_id_t module_id)107 static const struct fwk_element *psu_get_dev_desc_table(fwk_id_t module_id)
108 {
109     int status;
110     enum juno_idx_platform platform_id = JUNO_IDX_PLATFORM_COUNT;
111 
112     status = juno_id_get_platform(&platform_id);
113     if (!fwk_expect(status == FWK_SUCCESS)) {
114         return NULL;
115     }
116 
117     if (platform_id == JUNO_IDX_PLATFORM_FVP) {
118         return psu_element_table_fvp;
119     } else {
120         return psu_dev_desc_table;
121     }
122 }
123 
124 struct fwk_module_config config_psu = {
125     .elements = FWK_MODULE_DYNAMIC_ELEMENTS(psu_get_dev_desc_table),
126 };
127