1f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /*
2f5ba408cSMuhammad Hadi Asyrafi Abdul Halim * Copyright (c) 2019, ARM Limited and Contributors. All rights reserved.
3f5ba408cSMuhammad Hadi Asyrafi Abdul Halim *
4f5ba408cSMuhammad Hadi Asyrafi Abdul Halim * SPDX-License-Identifier: BSD-3-Clause
5f5ba408cSMuhammad Hadi Asyrafi Abdul Halim */
6f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
7f5ba408cSMuhammad Hadi Asyrafi Abdul Halim #include <assert.h>
8f5ba408cSMuhammad Hadi Asyrafi Abdul Halim #include <string.h>
9f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
10f5ba408cSMuhammad Hadi Asyrafi Abdul Halim #include <platform_def.h>
11f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
12f5ba408cSMuhammad Hadi Asyrafi Abdul Halim #include <common/debug.h>
13f5ba408cSMuhammad Hadi Asyrafi Abdul Halim #include <drivers/io/io_driver.h>
14f5ba408cSMuhammad Hadi Asyrafi Abdul Halim #include <drivers/io/io_memmap.h>
15f5ba408cSMuhammad Hadi Asyrafi Abdul Halim #include <drivers/io/io_storage.h>
16f5ba408cSMuhammad Hadi Asyrafi Abdul Halim #include <lib/utils.h>
17f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
18bf719f66SHadi Asyrafi #include "qspi/cadence_qspi.h"
19f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
20f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* As we need to be able to keep state for seek, only one file can be open
21f5ba408cSMuhammad Hadi Asyrafi Abdul Halim * at a time. Make this a structure and point to the entity->info. When we
22f5ba408cSMuhammad Hadi Asyrafi Abdul Halim * can malloc memory we can change this to support more open files.
23f5ba408cSMuhammad Hadi Asyrafi Abdul Halim */
24f5ba408cSMuhammad Hadi Asyrafi Abdul Halim typedef struct {
25f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Use the 'in_use' flag as any value for base and file_pos could be
26f5ba408cSMuhammad Hadi Asyrafi Abdul Halim * valid.
27f5ba408cSMuhammad Hadi Asyrafi Abdul Halim */
28f5ba408cSMuhammad Hadi Asyrafi Abdul Halim int in_use;
29f5ba408cSMuhammad Hadi Asyrafi Abdul Halim uintptr_t base;
30*70cb0bffSYann Gautier unsigned long long file_pos;
31*70cb0bffSYann Gautier unsigned long long size;
32f5ba408cSMuhammad Hadi Asyrafi Abdul Halim } file_state_t;
33f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
34f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static file_state_t current_file = {0};
35f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
36f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Identify the device type as memmap */
device_type_memmap(void)37f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static io_type_t device_type_memmap(void)
38f5ba408cSMuhammad Hadi Asyrafi Abdul Halim {
39f5ba408cSMuhammad Hadi Asyrafi Abdul Halim return IO_TYPE_MEMMAP;
40f5ba408cSMuhammad Hadi Asyrafi Abdul Halim }
41f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
42f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Memmap device functions */
43f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_dev_open(const uintptr_t dev_spec, io_dev_info_t **dev_info);
44f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_block_open(io_dev_info_t *dev_info, const uintptr_t spec,
45f5ba408cSMuhammad Hadi Asyrafi Abdul Halim io_entity_t *entity);
46f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_block_seek(io_entity_t *entity, int mode,
47*70cb0bffSYann Gautier signed long long offset);
48f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_block_len(io_entity_t *entity, size_t *length);
49f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_block_read(io_entity_t *entity, uintptr_t buffer,
50f5ba408cSMuhammad Hadi Asyrafi Abdul Halim size_t length, size_t *length_read);
51f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_block_write(io_entity_t *entity, const uintptr_t buffer,
52f5ba408cSMuhammad Hadi Asyrafi Abdul Halim size_t length, size_t *length_written);
53f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_block_close(io_entity_t *entity);
54f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_dev_close(io_dev_info_t *dev_info);
55f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
56f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
57f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static const io_dev_connector_t memmap_dev_connector = {
58f5ba408cSMuhammad Hadi Asyrafi Abdul Halim .dev_open = memmap_dev_open
59f5ba408cSMuhammad Hadi Asyrafi Abdul Halim };
60f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
61f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
62f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static const io_dev_funcs_t memmap_dev_funcs = {
63f5ba408cSMuhammad Hadi Asyrafi Abdul Halim .type = device_type_memmap,
64f5ba408cSMuhammad Hadi Asyrafi Abdul Halim .open = memmap_block_open,
65f5ba408cSMuhammad Hadi Asyrafi Abdul Halim .seek = memmap_block_seek,
66f5ba408cSMuhammad Hadi Asyrafi Abdul Halim .size = memmap_block_len,
67f5ba408cSMuhammad Hadi Asyrafi Abdul Halim .read = memmap_block_read,
68f5ba408cSMuhammad Hadi Asyrafi Abdul Halim .write = memmap_block_write,
69f5ba408cSMuhammad Hadi Asyrafi Abdul Halim .close = memmap_block_close,
70f5ba408cSMuhammad Hadi Asyrafi Abdul Halim .dev_init = NULL,
71f5ba408cSMuhammad Hadi Asyrafi Abdul Halim .dev_close = memmap_dev_close,
72f5ba408cSMuhammad Hadi Asyrafi Abdul Halim };
73f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
74f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
75f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* No state associated with this device so structure can be const */
76f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static const io_dev_info_t memmap_dev_info = {
77f5ba408cSMuhammad Hadi Asyrafi Abdul Halim .funcs = &memmap_dev_funcs,
78f5ba408cSMuhammad Hadi Asyrafi Abdul Halim .info = (uintptr_t)NULL
79f5ba408cSMuhammad Hadi Asyrafi Abdul Halim };
80f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
81f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
82f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Open a connection to the memmap device */
memmap_dev_open(const uintptr_t dev_spec __unused,io_dev_info_t ** dev_info)83f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_dev_open(const uintptr_t dev_spec __unused,
84f5ba408cSMuhammad Hadi Asyrafi Abdul Halim io_dev_info_t **dev_info)
85f5ba408cSMuhammad Hadi Asyrafi Abdul Halim {
86f5ba408cSMuhammad Hadi Asyrafi Abdul Halim assert(dev_info != NULL);
87f5ba408cSMuhammad Hadi Asyrafi Abdul Halim *dev_info = (io_dev_info_t *)&memmap_dev_info; /* cast away const */
88f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
89f5ba408cSMuhammad Hadi Asyrafi Abdul Halim return 0;
90f5ba408cSMuhammad Hadi Asyrafi Abdul Halim }
91f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
92f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
93f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
94f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Close a connection to the memmap device */
memmap_dev_close(io_dev_info_t * dev_info)95f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_dev_close(io_dev_info_t *dev_info)
96f5ba408cSMuhammad Hadi Asyrafi Abdul Halim {
97f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* NOP */
98f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* TODO: Consider tracking open files and cleaning them up here */
99f5ba408cSMuhammad Hadi Asyrafi Abdul Halim return 0;
100f5ba408cSMuhammad Hadi Asyrafi Abdul Halim }
101f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
102f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
103f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Open a file on the memmap device */
memmap_block_open(io_dev_info_t * dev_info,const uintptr_t spec,io_entity_t * entity)104f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_block_open(io_dev_info_t *dev_info, const uintptr_t spec,
105f5ba408cSMuhammad Hadi Asyrafi Abdul Halim io_entity_t *entity)
106f5ba408cSMuhammad Hadi Asyrafi Abdul Halim {
107f5ba408cSMuhammad Hadi Asyrafi Abdul Halim int result = -ENOMEM;
108f5ba408cSMuhammad Hadi Asyrafi Abdul Halim const io_block_spec_t *block_spec = (io_block_spec_t *)spec;
109f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
110f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Since we need to track open state for seek() we only allow one open
111f5ba408cSMuhammad Hadi Asyrafi Abdul Halim * spec at a time. When we have dynamic memory we can malloc and set
112f5ba408cSMuhammad Hadi Asyrafi Abdul Halim * entity->info.
113f5ba408cSMuhammad Hadi Asyrafi Abdul Halim */
114f5ba408cSMuhammad Hadi Asyrafi Abdul Halim if (current_file.in_use == 0) {
115f5ba408cSMuhammad Hadi Asyrafi Abdul Halim assert(block_spec != NULL);
116f5ba408cSMuhammad Hadi Asyrafi Abdul Halim assert(entity != NULL);
117f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
118f5ba408cSMuhammad Hadi Asyrafi Abdul Halim current_file.in_use = 1;
119f5ba408cSMuhammad Hadi Asyrafi Abdul Halim current_file.base = block_spec->offset;
120f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* File cursor offset for seek and incremental reads etc. */
121f5ba408cSMuhammad Hadi Asyrafi Abdul Halim current_file.file_pos = 0;
122f5ba408cSMuhammad Hadi Asyrafi Abdul Halim current_file.size = block_spec->length;
123f5ba408cSMuhammad Hadi Asyrafi Abdul Halim entity->info = (uintptr_t)¤t_file;
124f5ba408cSMuhammad Hadi Asyrafi Abdul Halim result = 0;
125f5ba408cSMuhammad Hadi Asyrafi Abdul Halim } else {
126f5ba408cSMuhammad Hadi Asyrafi Abdul Halim WARN("A Memmap device is already active. Close first.\n");
127f5ba408cSMuhammad Hadi Asyrafi Abdul Halim }
128f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
129f5ba408cSMuhammad Hadi Asyrafi Abdul Halim return result;
130f5ba408cSMuhammad Hadi Asyrafi Abdul Halim }
131f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
132f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
133f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Seek to a particular file offset on the memmap device */
memmap_block_seek(io_entity_t * entity,int mode,signed long long offset)134*70cb0bffSYann Gautier static int memmap_block_seek(io_entity_t *entity, int mode,
135*70cb0bffSYann Gautier signed long long offset)
136f5ba408cSMuhammad Hadi Asyrafi Abdul Halim {
137f5ba408cSMuhammad Hadi Asyrafi Abdul Halim int result = -ENOENT;
138f5ba408cSMuhammad Hadi Asyrafi Abdul Halim file_state_t *fp;
139f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
140f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* We only support IO_SEEK_SET for the moment. */
141f5ba408cSMuhammad Hadi Asyrafi Abdul Halim if (mode == IO_SEEK_SET) {
142f5ba408cSMuhammad Hadi Asyrafi Abdul Halim assert(entity != NULL);
143f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
144f5ba408cSMuhammad Hadi Asyrafi Abdul Halim fp = (file_state_t *) entity->info;
145f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
146f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Assert that new file position is valid */
147*70cb0bffSYann Gautier assert((offset >= 0) &&
148*70cb0bffSYann Gautier ((unsigned long long)offset < fp->size));
149f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
150f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Reset file position */
151f5ba408cSMuhammad Hadi Asyrafi Abdul Halim fp->file_pos = offset;
152f5ba408cSMuhammad Hadi Asyrafi Abdul Halim result = 0;
153f5ba408cSMuhammad Hadi Asyrafi Abdul Halim }
154f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
155f5ba408cSMuhammad Hadi Asyrafi Abdul Halim return result;
156f5ba408cSMuhammad Hadi Asyrafi Abdul Halim }
157f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
158f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
159f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Return the size of a file on the memmap device */
memmap_block_len(io_entity_t * entity,size_t * length)160f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_block_len(io_entity_t *entity, size_t *length)
161f5ba408cSMuhammad Hadi Asyrafi Abdul Halim {
162f5ba408cSMuhammad Hadi Asyrafi Abdul Halim assert(entity != NULL);
163f5ba408cSMuhammad Hadi Asyrafi Abdul Halim assert(length != NULL);
164f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
165f5ba408cSMuhammad Hadi Asyrafi Abdul Halim *length = ((file_state_t *)entity->info)->size;
166f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
167f5ba408cSMuhammad Hadi Asyrafi Abdul Halim return 0;
168f5ba408cSMuhammad Hadi Asyrafi Abdul Halim }
169f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
170f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
171f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Read data from a file on the memmap device */
memmap_block_read(io_entity_t * entity,uintptr_t buffer,size_t length,size_t * length_read)172f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_block_read(io_entity_t *entity, uintptr_t buffer,
173f5ba408cSMuhammad Hadi Asyrafi Abdul Halim size_t length, size_t *length_read)
174f5ba408cSMuhammad Hadi Asyrafi Abdul Halim {
175f5ba408cSMuhammad Hadi Asyrafi Abdul Halim file_state_t *fp;
176*70cb0bffSYann Gautier unsigned long long pos_after;
177f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
178f5ba408cSMuhammad Hadi Asyrafi Abdul Halim assert(entity != NULL);
179f5ba408cSMuhammad Hadi Asyrafi Abdul Halim assert(length_read != NULL);
180f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
181f5ba408cSMuhammad Hadi Asyrafi Abdul Halim fp = (file_state_t *) entity->info;
182f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
183f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Assert that file position is valid for this read operation */
184f5ba408cSMuhammad Hadi Asyrafi Abdul Halim pos_after = fp->file_pos + length;
185f5ba408cSMuhammad Hadi Asyrafi Abdul Halim assert((pos_after >= fp->file_pos) && (pos_after <= fp->size));
186f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
187f5ba408cSMuhammad Hadi Asyrafi Abdul Halim //memcpy((void *)buffer, (void *)(fp->base + fp->file_pos), length);
188f5ba408cSMuhammad Hadi Asyrafi Abdul Halim cad_qspi_read((void *)buffer, fp->base + fp->file_pos, length);
189f5ba408cSMuhammad Hadi Asyrafi Abdul Halim *length_read = length;
190f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
191f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Set file position after read */
192f5ba408cSMuhammad Hadi Asyrafi Abdul Halim fp->file_pos = pos_after;
193f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
194f5ba408cSMuhammad Hadi Asyrafi Abdul Halim return 0;
195f5ba408cSMuhammad Hadi Asyrafi Abdul Halim }
196f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
197f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
198f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Write data to a file on the memmap device */
memmap_block_write(io_entity_t * entity,const uintptr_t buffer,size_t length,size_t * length_written)199f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_block_write(io_entity_t *entity, const uintptr_t buffer,
200f5ba408cSMuhammad Hadi Asyrafi Abdul Halim size_t length, size_t *length_written)
201f5ba408cSMuhammad Hadi Asyrafi Abdul Halim {
202f5ba408cSMuhammad Hadi Asyrafi Abdul Halim file_state_t *fp;
203*70cb0bffSYann Gautier unsigned long long pos_after;
204f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
205f5ba408cSMuhammad Hadi Asyrafi Abdul Halim assert(entity != NULL);
206f5ba408cSMuhammad Hadi Asyrafi Abdul Halim assert(length_written != NULL);
207f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
208f5ba408cSMuhammad Hadi Asyrafi Abdul Halim fp = (file_state_t *) entity->info;
209f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
210f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Assert that file position is valid for this write operation */
211f5ba408cSMuhammad Hadi Asyrafi Abdul Halim pos_after = fp->file_pos + length;
212f5ba408cSMuhammad Hadi Asyrafi Abdul Halim assert((pos_after >= fp->file_pos) && (pos_after <= fp->size));
213f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
214f5ba408cSMuhammad Hadi Asyrafi Abdul Halim memcpy((void *)(fp->base + fp->file_pos), (void *)buffer, length);
215f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
216f5ba408cSMuhammad Hadi Asyrafi Abdul Halim *length_written = length;
217f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
218f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Set file position after write */
219f5ba408cSMuhammad Hadi Asyrafi Abdul Halim fp->file_pos = pos_after;
220f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
221f5ba408cSMuhammad Hadi Asyrafi Abdul Halim return 0;
222f5ba408cSMuhammad Hadi Asyrafi Abdul Halim }
223f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
224f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
225f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Close a file on the memmap device */
memmap_block_close(io_entity_t * entity)226f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_block_close(io_entity_t *entity)
227f5ba408cSMuhammad Hadi Asyrafi Abdul Halim {
228f5ba408cSMuhammad Hadi Asyrafi Abdul Halim assert(entity != NULL);
229f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
230f5ba408cSMuhammad Hadi Asyrafi Abdul Halim entity->info = 0;
231f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
232f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* This would be a mem free() if we had malloc.*/
233f5ba408cSMuhammad Hadi Asyrafi Abdul Halim zeromem((void *)¤t_file, sizeof(current_file));
234f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
235f5ba408cSMuhammad Hadi Asyrafi Abdul Halim return 0;
236f5ba408cSMuhammad Hadi Asyrafi Abdul Halim }
237f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
238f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
239f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Exported functions */
240f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
241f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Register the memmap driver with the IO abstraction */
register_io_dev_memmap(const io_dev_connector_t ** dev_con)242f5ba408cSMuhammad Hadi Asyrafi Abdul Halim int register_io_dev_memmap(const io_dev_connector_t **dev_con)
243f5ba408cSMuhammad Hadi Asyrafi Abdul Halim {
244f5ba408cSMuhammad Hadi Asyrafi Abdul Halim int result;
245f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
246f5ba408cSMuhammad Hadi Asyrafi Abdul Halim assert(dev_con != NULL);
247f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
248f5ba408cSMuhammad Hadi Asyrafi Abdul Halim result = io_register_device(&memmap_dev_info);
249f5ba408cSMuhammad Hadi Asyrafi Abdul Halim if (result == 0)
250f5ba408cSMuhammad Hadi Asyrafi Abdul Halim *dev_con = &memmap_dev_connector;
251f5ba408cSMuhammad Hadi Asyrafi Abdul Halim
252f5ba408cSMuhammad Hadi Asyrafi Abdul Halim return result;
253f5ba408cSMuhammad Hadi Asyrafi Abdul Halim }
254