summaryrefslogtreecommitdiffstats
path: root/qemu/roms/SLOF/clients/net-snk/oflib/rtas.c
diff options
context:
space:
mode:
Diffstat (limited to 'qemu/roms/SLOF/clients/net-snk/oflib/rtas.c')
-rw-r--r--qemu/roms/SLOF/clients/net-snk/oflib/rtas.c226
1 files changed, 0 insertions, 226 deletions
diff --git a/qemu/roms/SLOF/clients/net-snk/oflib/rtas.c b/qemu/roms/SLOF/clients/net-snk/oflib/rtas.c
deleted file mode 100644
index c514c7079..000000000
--- a/qemu/roms/SLOF/clients/net-snk/oflib/rtas.c
+++ /dev/null
@@ -1,226 +0,0 @@
-/******************************************************************************
- * 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 <stdarg.h>
-#include <stdio.h>
-#include <rtas.h>
-#include <of.h>
-#include <kernel.h>
-
-typedef int rtas_arg_t;
-
-typedef struct {
- int token;
- int nargs;
- int nret;
- rtas_arg_t args[16];
- rtas_arg_t *rets; /* Pointer to return values in args[]. */
-} rtas_args_t;
-
-rtas_args_t rtas_args;
-
-typedef struct {
- void *rtas_start;
- void *rtas_entry;
- int rtas_size;
- phandle_t dev;
-} rtas_t;
-
-extern rtas_t _rtas;
-static int instantiate_rtas(void);
-void rtas_call_entry(rtas_args_t *, void *, void *);
-
-int
-rtas_token(const char *service)
-{
- int token;
- int retVal;
- if (_rtas.dev == 0)
- instantiate_rtas();
-
- retVal = of_getprop(_rtas.dev, service, &token, sizeof(token));
- if (retVal == -1) {
- token = 0;
- }
- return token;
-}
-
-int
-rtas_call(int token, int nargs, int nret, int *outputs, ...)
-{
- va_list list;
- int i;
-
- rtas_args.token = token;
- rtas_args.nargs = nargs;
- rtas_args.nret = nret;
- rtas_args.rets = (rtas_arg_t *) & (rtas_args.args[nargs]);
- va_start(list, outputs);
- for (i = 0; i < nargs; ++i) {
- rtas_args.args[i] = (rtas_arg_t) (va_arg(list, unsigned int));
- }
- va_end(list);
-
- for (i = 0; i < nret; ++i)
- rtas_args.rets[i] = 0;
-
- rtas_call_entry(&rtas_args, _rtas.rtas_start, _rtas.rtas_entry);
- if (nret > 0 && outputs != 0)
- for (i = 0; i < nret; i++)
- outputs[i] = rtas_args.rets[i];
-#if 0
- printf("rtas call %x %x %x args: %x %x %x %x %x %x %x %x\n",
- token, nargs, nret,
- rtas_args.args[0],
- rtas_args.args[1],
- rtas_args.args[2],
- rtas_args.args[3],
- rtas_args.args[4], rtas_args.args[5], outputs[0], outputs[1]);
-#endif
- return ((nret > 0) ? rtas_args.rets[0] : 0);
-}
-
-rtas_t _rtas;
-
-static int
-instantiate_rtas(void)
-{
- long long *rtas_mem_space;
- ihandle_t ihandle;
-
- _rtas.dev = of_finddevice("/rtas");
- if ((long) _rtas.dev < 0) {
- printf("\nCould not open /rtas\n");
- return -1;
- }
-
- of_getprop(_rtas.dev, "rtas-size", &_rtas.rtas_size,
- sizeof(_rtas.rtas_size));
-
- if (_rtas.rtas_size <= 0) {
- printf("\nSize of rtas (%x) too small to make sense\n",
- _rtas.rtas_size);
- return -1;
- }
-
- rtas_mem_space = (long long *) malloc_aligned(_rtas.rtas_size, 0x100);
-
- if (!rtas_mem_space) {
- printf("\nFailed to allocated memory for RTAS\n");
- return -1;
- }
-
- ihandle = of_open("/rtas");
-
- if ((long) ihandle < 0) {
- printf("Could not open /rtas\n");
- return -1;
- }
-
- if ((long) (_rtas.rtas_entry = of_call_method_3("instantiate-rtas",
- ihandle,
- p32cast rtas_mem_space))
- > 0) {
- _rtas.rtas_start = rtas_mem_space;
- } else {
- printf("instantiate-rtas failed\n");
- return -1;
- }
-#if 0
- printf("\ninstantiate-rtas at %x size %x entry %x\n",
- _rtas.rtas_start, _rtas.rtas_size, _rtas.rtas_entry);
-#endif
- return 0;
-}
-
-static int read_pci_config_token = 0;
-static int write_pci_config_token = 0;
-static int ibm_read_pci_config_token = 0;
-static int ibm_write_pci_config_token = 0;
-static int get_time_of_day_token = 0;
-
-void
-rtas_init()
-{
- int ret;
- ret = instantiate_rtas();
- if (ret)
- return;
- read_pci_config_token = rtas_token("read-pci-config");
- ibm_read_pci_config_token = rtas_token("ibm,read-pci-config");
- write_pci_config_token = rtas_token("write-pci-config");
- ibm_write_pci_config_token = rtas_token("ibm,write-pci-config");
- get_time_of_day_token = rtas_token("get-time-of-day");
-}
-
-
-int
-rtas_pci_config_read(long long puid, int size, int bus, int devfn, int offset)
-{
- int value[2];
-
- if (ibm_read_pci_config_token && puid) {
- rtas_call(ibm_read_pci_config_token, 4, 2, value,
- bus << 16 | devfn << 8 | offset,
- puid >> 32, puid & 0xffffffffULL, size);
- } else if (read_pci_config_token) {
- rtas_call(read_pci_config_token, 2, 2, value,
- bus << 16 | devfn << 8 | offset, size);
- }
-
- return value[1];
-}
-
-int
-rtas_pci_config_write(long long puid, int size, int bus, int devfn,
- int offset, int value)
-{
- int rc;
-
- if (ibm_write_pci_config_token && puid) {
- rtas_call(ibm_write_pci_config_token, 5, 1, &rc,
- bus << 16 | devfn << 8 | offset,
- puid >> 32, puid & 0xffffffffULL, size, value);
- } else
- rtas_call(write_pci_config_token, 3, 1, &rc,
- bus << 16 | devfn << 8 | offset, size, value);
-
- return rc;
-}
-
-int
-rtas_get_time_of_day(dtime * get)
-{
- int rc = -1;
- unsigned int year;
- unsigned int month;
- unsigned int day;
- unsigned int hour;
- unsigned int minute;
- unsigned int second;
- unsigned int nano;
-
- if (get_time_of_day_token)
- rtas_call(get_time_of_day_token, 0, 8, &rc, &year, &month, &day,
- &hour, &minute, &second, &nano);
-
- get->year = year;
- get->month = month;
- get->day = day;
- get->hour = hour;
- get->minute = minute;
- get->second = second;
- get->nano = nano;
-
- return rc;
-}