blob: 61671d49ac79584bb097ce6030d2baa9d1773712 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2004, 2008 IBM Corporation
* All rights reserved.
* This program and the accompanying materials
* are made available under the terms of the BSD License
* which accompanies this distribution, and is available at
* http://www.opensource.org/licenses/bsd-license.php
*
* Contributors:
* IBM Corporation - initial implementation
*****************************************************************************/
#include <stdint.h>
#include <rtas.h>
#include "rtas_table.h"
//#define _RTAS_TRACE
//#define _RTAS_COUNT_CALLS
#ifdef _RTAS_COUNT_CALLS
int rtas_callcount[0x40] __attribute__((aligned (16)));
#endif
/* rtas_config is used to store the run-time configuration flags (which are
* provided by SLOF during instantiate-rtas) */
long rtas_config;
/* Prototype */
void rtas_call (rtas_args_t *rtas_args);
/*
Function: rtas_call
Input:
rtas_args: pointer to RTAS arguments structure
Output:
Description: Handle RTAS call. This C function is called
from the asm function rtas_entry.
*/
void
rtas_call (rtas_args_t *rtas_args)
{
int idx;
#ifdef _RTAS_COUNT_CALLS
/* Count how often every RTAS function is called. */
if (rtas_args->token < (int)(sizeof(rtas_callcount)/sizeof(rtas_callcount[0]))) {
static int callcount_initialized = 0;
/* If the array is used the first time, we have to set all entries to 0 */
if (!callcount_initialized) {
unsigned int i;
callcount_initialized = 1;
for (i = 0; i < sizeof(rtas_callcount)/sizeof(rtas_callcount[0]); i++)
rtas_callcount[i] = 0;
}
/* Increment the counter of the RTAS call */
rtas_callcount[rtas_args->token] += 1;
}
#endif
#ifdef _RTAS_TRACE
unsigned int parCnt = rtas_args->nargs;
unsigned int *pInt = rtas_args->args;
printf("\n\r*** rtas_call=0x%x", rtas_args->token);
#ifdef _RTAS_COUNT_CALLS
printf(" count=0x%x", rtas_callcount[rtas_args->token]);
#endif
printf(" len=0x%x", parCnt);
printf("\n\r ");
while(parCnt--) {
printf("0x%x ", *pInt++);
}
#endif
idx = rtas_args->token - 1;
/* Check if there's a function for the token: */
if (idx >= 0 && idx < rtas_func_tab_size
&& rtas_func_tab[idx].func != NULL) {
/* Now jump to the RTAS function: */
rtas_func_tab[idx].func(rtas_args);
}
else {
/* We didn't find a function - return error code: */
rtas_args->args[rtas_args->nargs] = -1;
}
}