diff --git a/include/linux/guest_shm.h b/include/linux/guest_shm.h new file mode 100644 index 000000000000..da89b3a7f684 --- /dev/null +++ b/include/linux/guest_shm.h @@ -0,0 +1,140 @@ +/* + * Copyright 2018, QNX Software Systems Limited (“QSS”). + * + * 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 the copyright holder 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 + * OWNER 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. + * + * Additional Patent Grant + * + * QSS hereby grants to you a perpetual, worldwide, non-exclusive, + * no-charge, irrevocable (except as stated in this section) patent + * license to make, have made, use, offer to sell, sell, import, + * transfer, and otherwise run, modify and propagate the contents of this + * header file (“Implementation”) , where such license applies + * only to those patent claims, both currently owned by QSS and + * acquired in the future, licensable by QSS that are necessarily + * infringed by this Implementation. This grant does + * not include claims that would be infringed only as a consequence of + * further modification of this Implementation. If you or your agent or + * exclusive licensee institute or order or agree to the institution of + * patent litigation against any entity (including a cross-claim or + * counterclaim in a lawsuit) alleging that this Implementation constitutes + * direct or contributory patent infringement, or inducement of patent + * infringement, then any patent rights granted to you under this license for + * this Implementation shall terminate as of the date such litigation is filed. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + */ + +/** + * @file + * definitions guest shared memory device + */ + +#ifndef _QVM_GUEST_SHM_H +#define _QVM_GUEST_SHM_H + +#ifdef __linux__ +#include +#else +#include +#endif + +/* + * Temporary VID definition until the updated propogates around + */ +#define PCI_VID_BlackBerry_QNX 0x1C05 + +#define PCI_DID_QNX_GUEST_SHM 0x0001 + +/** status of last creation request */ +enum guest_shm_status { + GSS_OK, /**< creation succeeded */ + GSS_UNKNOWN_FAILURE, /**< creation failed for an unknown reason */ + GSS_NOMEM, /**< creation failed due to lack of memory */ + GSS_CLIENT_MAX, /**< creation failed due to region already being used by the maximum number of guests */ + GSS_ILLEGAL_NAME, /**< creation failed due to illegal region name */ + GSS_NO_PERMISSION, /**< creation failed due to lack of permission */ + GSS_DOES_NOT_EXIST, /**< A find request failed */ +}; + +/** Maximum number of clients allowed to connect to a shared memory region */ +#define GUEST_SHM_MAX_CLIENTS 16 + +/** Maximum length allowed for region name */ +#define GUEST_SHM_MAX_NAME 32 + +/** Signature value to verify that vdev is present */ +#define GUEST_SHM_SIGNATURE 0x4d534732474d5651 + + +/** Register layout for factory registers */ +struct guest_shm_factory { + uint64_t signature; /**< == GUEST_SHM_SIGNATURE (R/O) */ + uint64_t shmem; /**< shared memory paddr (R/O) */ + uint32_t vector; /**< interrupt vector number (R/O) */ + uint32_t status; /**< status of last creation (R/O) */ + uint32_t size; /**< requested size in 4K pages, write causes creation */ + char name[GUEST_SHM_MAX_NAME]; /**< name of shared memory region */ + uint32_t find; /**< find an existing shared memory connection */ +}; + +/** Register layout for a region control page */ +struct guest_shm_control { + uint32_t status; /**< lower 16 bits: pending notification bitset, upper 16 bits: current active clients (R/O) */ + uint32_t idx; /**< connection index for this client (R/O) */ + uint32_t notify; /**< write a bitset of clients to notify */ + uint32_t detach; /**< write here to detach from the shared memory region */ +}; + + +static inline void +guest_shm_create(volatile struct guest_shm_factory *const __factory, unsigned const __size) { + /* Surround the size assignment with memory barriers so that + * the compiler doesn't try to shift the assignment before/after + * necessary bits (e.g. setting the name of the region) */ + asm volatile( "" ::: "memory"); + __factory->size = __size; + asm volatile( "" ::: "memory"); +} + + +static inline void +guest_shm_find(volatile struct guest_shm_factory *const __factory, unsigned const __find_num) { + /* Surround the find assignment with memory barriers so that + * the compiler doesn't try to shift the assignment before/after + * necessary bits (e.g. setting the name of the region) */ + asm volatile( "" ::: "memory"); + __factory->find = __find_num; + asm volatile( "" ::: "memory"); +} + +#endif + +#if defined(__QNXNTO__) && defined(__USESRCVERSION) +#include +__SRCVERSION("$URL$ $Rev$") +#endif