Add Linux application generic initialization
[processor-sdk/open-amp.git] / apps / system / linux / machine / generic / platform_info.c
1 /*
2  * Copyright (c) 2014, Mentor Graphics Corporation
3  * All rights reserved.
4  * Copyright (c) 2016 Xilinx, Inc.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright notice,
10  *    this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright notice,
12  *    this list of conditions and the following disclaimer in the documentation
13  *    and/or other materials provided with the distribution.
14  * 3. Neither the name of Mentor Graphics Corporation nor the names of its
15  *    contributors may be used to endorse or promote products derived from this
16  *    software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  */
31 /**************************************************************************
32  * FILE NAME
33  *
34  *       platform_info.c
35  *
36  * DESCRIPTION
37  *
38  *       This file implements APIs to get platform specific
39  *       information for OpenAMP.
40  *
41  **************************************************************************/
43 #include <openamp/hil.h>
44 #include <metal/io.h>
45 #include <metal/atomic.h>
47 #define IPI_CHN_BITMASK                   0x01000000 /* IPI channel bit mask APU<->RPU0 */
48 #define REMOTE_CPU_ID                     0
50 struct vring_ipi_info {
51         /* Socket file path */
52         char *path;
53         int fd;
54         struct metal_io_region *vring_io;
55         atomic_int sync;
56 };
58 struct rproc_info {
59         unsigned long rproc_id;
60         char *vring0_path;
61         char *vring0_bus;
62         char *vring1_path;
63         char *vring1_bus;
64         char *shm_path;
65         char *shm_bus;
66         int shm_size;
67         void *ipi0;
68         void *ipi1;
69         char *rpmsg_chnl;
70 };
72 extern struct hil_platform_ops linux_proc_ops;
74 static struct vring_ipi_info ipi_table[] = {
75         { "unixs:/tmp/openamp.event.0", -1, NULL, 0 },
76         { "unixs:/tmp/openamp.event.1", -1, NULL, 0 },
77         { "unix:/tmp/openamp.event.0", -1, NULL, 0 },
78         { "unix:/tmp/openamp.event.1", -1, NULL, 0 },
79 };
81 static struct rproc_info rproc_table [] = {
82         {
83                 0,
84                 "openamp.vrings",
85                 NULL,
86                 "openamp.vrings",
87                 NULL,
88                 "openamp.shm",
89                 NULL,
90                 0x40000,
91                 (void *)&ipi_table[0],
92                 (void *)&ipi_table[1],
93                 "rpmsg-openamp-demo-channel",
94         },
95         {
96                 0,
97                 "openamp.vrings",
98                 NULL,
99                 "openamp.vrings",
100                 NULL,
101                 "openamp.shm",
102                 NULL,
103                 0x40000,
104                 (void *)&ipi_table[2],
105                 (void *)&ipi_table[3],
106                 "rpmsg-openamp-demo-channel",
107         },
108 };
110 const struct firmware_info fw_table[] =
112         {"unknown",
113          0,
114          0}
115 };
117 const int fw_table_size = sizeof(fw_table)/sizeof(struct firmware_info);
119 struct hil_proc *platform_create_proc(int proc_index)
122         struct hil_proc *proc;
123         struct rproc_info *proc_data;
124         if (sizeof(rproc_table)/sizeof(struct rproc_info) <=
125                 (unsigned long)proc_index){
126                 fprintf(stderr, "ERROR: CPU id is invalid: %d.\n", proc_index);
127                 return NULL;
128         }
129         proc_data = &rproc_table[proc_index];
130         proc = hil_create_proc(&linux_proc_ops, proc_data->rproc_id, NULL);
131         if (!proc)
132                 return NULL;
134         /* Setup IPI info */
135         hil_set_ipi(proc, 0, (unsigned int)(-1), proc_data->ipi0);
136         hil_set_ipi(proc, 1, (unsigned int)(-1), proc_data->ipi1);
137         /* Setup vring info */
138         hil_set_vring(proc, 0, proc_data->vring0_bus, proc_data->vring0_path);
139         hil_set_vring(proc, 1, proc_data->vring1_bus, proc_data->vring1_path);
140         /* Setup shared memory info */
141         hil_set_shm (proc, proc_data->shm_bus, proc_data->shm_path,
142                 0, proc_data->shm_size);
143         /* Setup RPMSG channel info */
144         hil_set_rpmsg_channel(proc, 0, proc_data->rpmsg_chnl);
146         return proc;