apps:generic:zynq7: add remotproc master support
[processor-sdk/open-amp.git] / apps / system / generic / machine / zynq7 / platform_info_remoteproc_master.c
1 /*
2  * Copyright (c) 2014, Mentor Graphics Corporation
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  *    this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright notice,
11  *    this list of conditions and the following disclaimer in the documentation
12  *    and/or other materials provided with the distribution.
13  * 3. Neither the name of Mentor Graphics Corporation nor the names of its
14  *    contributors may be used to endorse or promote products derived from this
15  *    software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27  * POSSIBILITY OF SUCH DAMAGE.
28  */
30 /**************************************************************************
31  * FILE NAME
32  *
33  *       platform_info.c
34  *
35  * DESCRIPTION
36  *
37  *       This file implements APIs to get platform specific
38  *       information for OpenAMP. 
39  *
40  **************************************************************************/
42 #include "openamp/hil.h"
44 /* Reference implementation that show cases platform_get_cpu_info and 
45  platform_get_for_firmware API implementation for Bare metal environment */
47 extern struct hil_platform_ops proc_ops;
49 /* IPC Device parameters */
50 #define SHM_ADDR                          (void *)0x08008000
51 #define SHM_SIZE                          0x00200000
52 #define VRING0_IPI_VECT                   6
53 #define VRING1_IPI_VECT                   3
54 #define MASTER_CPU_ID                     0
55 #define REMOTE_CPU_ID                     1
57 /**
58  * This array provdes defnition of CPU nodes for master and remote
59  * context. It contains two nodes beacuse the same file is intended
60  * to use with both master and remote configurations. On zynq platform
61  * only one node defintion is required for master/remote as there
62  * are only two cores present in the platform.
63  *
64  * Only platform specific info is populated here. Rest of information
65  * is obtained during resource table parsing.The platform specific
66  * information includes;
67  *
68  * -CPU ID
69  * -Shared Memory
70  * -Interrupts
71  * -Channel info.
72  *
73  * Although the channel info is not platform specific information
74  * but it is conveneient to keep it in HIL so that user can easily
75  * provide it without modifying the generic part.
76  *
77  * It is good idea to define hil_proc structure with platform
78  * specific fields populated as this can be easily copied to hil_proc
79  * structure passed as parameter in platform_get_processor_info. The
80  * other option is to populate the required structures individually
81  * and copy them one by one to hil_proc structure in platform_get_processor_info
82  * function. The first option is adopted here.
83  *
84  *
85  * 1) First node in the array is intended for the remote contexts and it
86  *    defines Master CPU ID, shared memory, interrupts info, number of channels
87  *    and there names. This node defines only one channel
88  *   "rpmsg-openamp-demo-channel".
89  *
90  * 2)Second node is required by the master and it defines remote CPU ID,
91  *   shared memory and interrupts info. In general no channel info is required by the
92  *   Master node, however in baremetal master and linux remote case the linux
93  *   rpmsg bus driver behaves as master so the rpmsg driver on linux side still needs
94  *   channel info. This information is not required by the masters for baremetal
95  *   remotes. 
96  *
97  */
98 struct hil_proc proc_table []=
99 {
101     /* CPU node for remote context */
102     {
103         /* CPU ID of master */
104         MASTER_CPU_ID,
106         /* Shared memory info - Last field is not used currently */
107         {
108             SHM_ADDR, SHM_SIZE, 0x00
109         },
111         /* VirtIO device info */
112         {
113             /* Leave these three fields empty as these are obtained from rsc
114              * table.
115              */
116              0, 0, 0,
118              /* Vring info */
119             {
121                 {
122                      /* Provide only vring interrupts info here. Other fields are
123                       * obtained from the resource table so leave them empty.
124                       */
125                      NULL, NULL, 0, 0,
126                      {
127                          VRING0_IPI_VECT,0x1006,1,NULL
128                      }
129                 },
130                 {
131                     NULL, NULL, 0, 0,
132                     {
133                         VRING1_IPI_VECT,0x1006,1,NULL
134                     }
135                 }
136             }
137         },
139         /* Number of RPMSG channels */
140         1,
142         /* RPMSG channel info - Only channel name is expected currently */
143         {
144             {"rpmsg-openamp-demo-channel"}
145         },
147         /* HIL platform ops table. */
148         &proc_ops,
150         /* Next three fields are for future use only */
151         0,
152         0,
153         NULL
154     },
156     /* CPU node for remote context */
157     {
158         /* CPU ID of remote */
159         REMOTE_CPU_ID,
161         /* Shared memory info - Last field is not used currently */
162         {
163             SHM_ADDR, SHM_SIZE, 0x00
164         },
166         /* VirtIO device info */
167         {
168             0, 0, 0,
169             {
170                 {
171                     /* Provide vring interrupts info here. Other fields are obtained
172                      * from the rsc table so leave them empty.
173                      */
174                     NULL, NULL, 0, 0,
175                     {
176                         VRING0_IPI_VECT,0x1006,1
177                     }
178                 },
179                 {
180                     NULL, NULL, 0, 0,
181                     {
182                         VRING1_IPI_VECT,0x1006,1
183                     }
184                 }
185             }
186         },
188         /* Number of RPMSG channels */
189         1,
191         /* RPMSG channel info - Only channel name is expected currently */
192         {
193             {"rpmsg-openamp-demo-channel"}
194         },
196         /* HIL platform ops table. */
197         &proc_ops,
199         /* Next three fields are for future use only */
200         0,
201         0,
202         NULL
203     }
204 };
206 /**
207  * platform_get_processor_info
208  *
209  * Copies the target info from the user defined data structures to
210  * HIL proc  data structure.In case of remote contexts this function
211  * is called with the reserved CPU ID HIL_RSVD_CPU_ID, because for
212  * remotes there is only one master.
213  *
214  * @param proc   - HIL proc to populate
215  * @param cpu_id - CPU ID
216  *
217  * return  - status of execution
218  */
219 int platform_get_processor_info(struct hil_proc *proc , int cpu_id) {
220     int idx;
221     for(idx = 0; idx < sizeof(proc_table)/sizeof(struct hil_proc); idx++) {
222         if((cpu_id == HIL_RSVD_CPU_ID) || (proc_table[idx].cpu_id == cpu_id) ) {
223             env_memcpy(proc,&proc_table[idx], sizeof(struct hil_proc));
224             return 0;
225         }
226     }
227     return -1;
230 int platform_get_processor_for_fw(char *fw_name) {
232     return 1;