diff options
Diffstat (limited to 'plat/sun50iw1p1/scp/message_manager/message_manager.c')
-rw-r--r-- | plat/sun50iw1p1/scp/message_manager/message_manager.c | 282 |
1 files changed, 0 insertions, 282 deletions
diff --git a/plat/sun50iw1p1/scp/message_manager/message_manager.c b/plat/sun50iw1p1/scp/message_manager/message_manager.c deleted file mode 100644 index 46b8969..0000000 --- a/plat/sun50iw1p1/scp/message_manager/message_manager.c +++ /dev/null @@ -1,282 +0,0 @@ -/* - * arch/arm/mach-sunxi/arisc/message_manager/message_manager.c - * - * Copyright (c) 2012 Allwinner. - * 2012-10-01 Written by superm (superm@allwinnertech.com). - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include "message_manager_i.h" - -/* the start and end of message pool */ -static struct arisc_message *message_start; -static struct arisc_message *message_end; - -/* spinlock for this module */ -static spinlock_t msg_mgr_lock; - -/* message cache manager */ -static struct arisc_message_cache message_cache; - -static void *arisc_message_pool_base; -static uint32_t arisc_message_pool_size; - -/** - * initialize message manager. - * @para: none. - * - * returns: 0 if initialize succeeded, others if failed. - */ -int arisc_message_manager_init(void *addr, uint32_t size) -{ - int i; - - arisc_message_pool_base = addr; - arisc_message_pool_size = size; - - /* initialize message pool start and end */ - message_start = (struct arisc_message *)(arisc_message_pool_base); - message_end = (struct arisc_message *)((ptrdiff_t)arisc_message_pool_base + arisc_message_pool_size); - - //memset((void *)message_start, 0, arisc_message_pool_size); - - /* initialize message_cache */ - for (i = 0; i < ARISC_MESSAGE_CACHED_MAX; i++) { - message_cache.cache[i] = NULL; - } - message_cache.number = 0; - - return 0; -} - -/** - * exit message manager. - * @para: none. - * - * returns: 0 if exit succeeded, others if failed. - */ -int arisc_message_manager_exit(void) -{ - return 0; -} - -static int arisc_message_invalid(struct arisc_message *pmessage) -{ - if ((pmessage >= message_start) && - (pmessage < message_end)) { - /* valid arisc message */ - return 0; - } - /* invalid arisc message */ - return 1; -} - -/** - * allocate one message frame. mainly use for send message by message-box, - * the message frame allocate form messages pool shared memory area. - * @para: none. - * - * returns: the pointer of allocated message frame, NULL if failed; - */ -struct arisc_message *arisc_message_allocate(unsigned int msg_attr) -{ - struct arisc_message *pmessage = NULL; - struct arisc_message *palloc = NULL; - - /* first find in message_cache */ - spin_lock(&msg_mgr_lock); - if (message_cache.number) { - ARISC_INF("arisc message_cache.number = 0x%x.\n", message_cache.number); - message_cache.number--; - palloc = message_cache.cache[message_cache.number]; - ARISC_INF("message [%llx] allocate from message_cache\n", palloc); - if (arisc_message_invalid(palloc)) { - ARISC_ERR("allocate cache message [%llx] invalid\n", palloc); - } - } - spin_unlock(&msg_mgr_lock); - if (arisc_message_invalid(palloc)) { - /* - * cached message_cache finded fail, - * use spinlock 0 to exclusive with arisc. - */ - arisc_hwspin_lock(AW_MSG_HWSPINLOCK); - - /* search from the start of message pool every time. */ - pmessage = message_start; - while (pmessage < message_end) { - if (pmessage->state == ARISC_MESSAGE_FREED) { - /* find free message in message pool, allocate it */ - palloc = pmessage; - palloc->state = ARISC_MESSAGE_ALLOCATED; - ARISC_INF("message [%llx] allocate from message pool\n", palloc); - break; - } - /* next message frame */ - pmessage++; - } - /* unlock hwspinlock 0 */ - arisc_hwspin_unlock(AW_MSG_HWSPINLOCK); - } - if (arisc_message_invalid(palloc)) { - ARISC_ERR("allocate message [%llx] frame is invalid\n", palloc); - return NULL; - } - /* initialize messgae frame */ - palloc->next = NULL; - palloc->attr = msg_attr; - palloc->private = NULL; - - return palloc; -} - -/** - * free one message frame. mainly use for process message finished, - * free it to messages pool or add to free message queue. - * @pmessage: the pointer of free message frame. - * - * returns: none. - */ -void arisc_message_free(struct arisc_message *pmessage) -{ - struct arisc_message *free_message = pmessage; - - /* check this message valid or not */ - if (arisc_message_invalid(free_message)) { - ARISC_ERR("free invalid arisc message [%llx]\n", free_message); - return; - } - - /* try to free to free_list first */ - spin_lock(&msg_mgr_lock); - if (message_cache.number < ARISC_MESSAGE_CACHED_MAX) { - ARISC_INF("insert message [%llx] to message_cache\n", free_message); - ARISC_INF("message_cache number : %d\n", message_cache.number); - /* cached this message, message state: ALLOCATED */ - message_cache.cache[message_cache.number] = free_message; - message_cache.number++; - free_message->next = NULL; - free_message->state = ARISC_MESSAGE_ALLOCATED; - free_message = NULL; - } - spin_unlock(&msg_mgr_lock); - - /* try to free message to pool if free to cache fail */ - if (free_message) { - /* free to message pool,set message state as FREED. */ - arisc_hwspin_lock(AW_MSG_HWSPINLOCK); - ARISC_INF("insert message [%llx] to message pool\n", free_message); - free_message->state = ARISC_MESSAGE_FREED; - free_message->next = NULL; - arisc_hwspin_unlock(AW_MSG_HWSPINLOCK); - } -} - -/** - * notify system that one message coming. - * @pmessage: the pointer of coming message frame. - * - * returns: 0 if notify succeeded, other if failed. - */ -int arisc_message_coming_notify(struct arisc_message *pmessage) -{ - int ret; - - /* ac327 receive message to arisc */ - ARISC_INF("-------------------------------------------------------------\n"); - ARISC_INF(" MESSAGE FROM ARISC \n"); - ARISC_INF("message addr : %llx\n", pmessage); - ARISC_INF("message type : %x\n", pmessage->type); - ARISC_INF("message attr : %x\n", pmessage->attr); - ARISC_INF("-------------------------------------------------------------\n"); - - /* message per-process */ - pmessage->state = ARISC_MESSAGE_PROCESSING; - - /* process message */ - switch (pmessage->type) { - case ARISC_AXP_INT_COMING_NOTIFY: { - ARISC_INF("pmu interrupt coming notify\n"); - ret = arisc_axp_int_notify(pmessage); - pmessage->result = ret; - break; - } - case ARISC_AUDIO_PERDONE_NOTIFY: { - ARISC_INF("audio perdone notify\n"); - ret = arisc_audio_perdone_notify(pmessage); - pmessage->result = ret; - break; - } - case ARISC_REPORT_ERR_INFO: { - ARISC_INF("arisc report error info\n"); - ret = arisc_report_error_info(pmessage); - pmessage->result = ret; - break; - } - - default : { - ARISC_ERR("invalid message type for ac327 process\n"); - ARISC_ERR("message addr : %llx\n", pmessage); - ARISC_ERR("message state : %x\n", pmessage->state); - ARISC_ERR("message attr : %x\n", pmessage->attr); - ARISC_ERR("message type : %x\n", pmessage->type); - ARISC_ERR("message result : %x\n", pmessage->result); - ret = -EINVAL; - break; - } - } - /* message post process */ - pmessage->state = ARISC_MESSAGE_PROCESSED; - if (pmessage->attr & ARISC_MESSAGE_ATTR_HARDSYN) { - /* synchronous message, should feedback process result */ - arisc_hwmsgbox_feedback_message(pmessage, ARISC_SEND_MSG_TIMEOUT); - } else { - /* - * asyn message, no need feedback message result, - * free message directly. - */ - arisc_message_free(pmessage); - } - - return ret; -} - -struct arisc_message *arisc_message_map_to_cpux(uint32_t addr) -{ - struct arisc_message *message; - message = (struct arisc_message *)((ptrdiff_t)addr + (ptrdiff_t)arisc_message_pool_base); - - return message; -} - -uint32_t arisc_message_map_to_cpus(struct arisc_message *message) -{ - uint32_t value = (uint32_t)((ptrdiff_t)message - (ptrdiff_t)arisc_message_pool_base); - - return value; -} - -int arisc_message_valid(struct arisc_message *pmessage) -{ - if ((pmessage >= message_start) && (pmessage < message_end)) { - /* valid message */ - return 1; - } - - return 0; -} - |