/* * Copyright (c) 2015 Freescale Semiconductor, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of Freescale Semiconductor nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /************************************************************************** * FILE NAME * * platform_info.c * * DESCRIPTION * * This file implements APIs to get platform specific * information for OpenAMP. * **************************************************************************/ #include "platform.h" #include "rpmsg/rpmsg.h" /* Reference implementation that show cases platform_get_cpu_info and platform_get_for_firmware API implementation for Bare metal environment */ extern struct hil_platform_ops proc_ops; /* * Linux requires the ALIGN to 0x1000(4KB) instead of 0x80 */ #define VRING_ALIGN 0x1000 /* * Linux has a different alignment requirement, and its have 512 buffers instead of 32 buffers for the 2 ring */ #define VRING0_BASE 0x8FFF0000 #define VRING1_BASE 0x8FFF8000 /* IPI_VECT here defines VRING index in MU */ #define VRING0_IPI_VECT 0 #define VRING1_IPI_VECT 1 #define MASTER_CPU_ID 0 #define REMOTE_CPU_ID 1 /** * This array provides definition of CPU nodes for master and remote * context. It contains two nodes because the same file is intended * to use with both master and remote configurations. On zynq platform * only one node definition is required for master/remote as there * are only two cores present in the platform. * * Only platform specific info is populated here. Rest of information * is obtained during resource table parsing.The platform specific * information includes; * * -CPU ID * -Shared Memory * -Interrupts * -Channel info. * * Although the channel info is not platform specific information * but it is convenient to keep it in HIL so that user can easily * provide it without modifying the generic part. * * It is good idea to define hil_proc structure with platform * specific fields populated as this can be easily copied to hil_proc * structure passed as parameter in platform_get_processor_info. The * other option is to populate the required structures individually * and copy them one by one to hil_proc structure in platform_get_processor_info * function. The first option is adopted here. * * * 1) First node in the array is intended for the remote contexts and it * defines Master CPU ID, shared memory, interrupts info, number of channels * and there names. This node defines only one channel * "rpmsg-data-channel". * * 2)Second node is required by the master and it defines remote CPU ID, * shared memory and interrupts info. In general no channel info is required by the * Master node, however in bare-metal master and linux remote case the linux * rpmsg bus driver behaves as master so the rpmsg driver on linux side still needs * channel info. This information is not required by the masters for bare-metal * remotes. * */ struct hil_proc proc_table []= { /* CPU node for remote context */ { /* CPU ID of master */ MASTER_CPU_ID, /* Shared memory info - Last field is not used currently */ { (void*)SHM_ADDR, SHM_SIZE, 0x00 }, /* VirtIO device info */ /*struct proc_vdev*/ { 2, (1<