summaryrefslogtreecommitdiff
path: root/plat/sun50iw1p1/scp/message_manager/message_manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'plat/sun50iw1p1/scp/message_manager/message_manager.c')
-rw-r--r--plat/sun50iw1p1/scp/message_manager/message_manager.c282
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;
-}
-