/*  This file is part of the program psim.
    
    Copyright 1994, 1995, 1996, 2003 Andrew Cagney
    
    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 3 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, see <http://www.gnu.org/licenses/>.
    
    */


#ifndef _HW_REGISTER_C_
#define _HW_REGISTER_C_

#include "device_table.h"
#include <stdlib.h>
#include "psim.h"

/* DEVICE


   register - dummy device to initialize processor registers


   DESCRIPTION

   The properties of this device are used, during initialization, to
   specify the initial value of various processor registers.  The
   property name specifying the register to be initialized with the
   special form <cpu-nr>.<register> being used to initialize a
   specific processor's register (eg 0.pc).

   Because, when the device tree is created, overriding properties are
   entered into the tree before any default values, this device must
   initialize registers in newest (default) to oldest (overriding)
   property order.

   The actual registers (for a given target) are defined in the file
   registers.c.

   This device is normally a child of the /openprom/init node.


   EXAMPLES


   Given a device tree containing the entry:

   |	/openprom/init/register/pc 0xfff00cf0

   then specifying the command line option:

   |	-o '/openprom/init/register/pc 0x0'

   would override the initial value of processor zero's program
   counter.  The resultant device tree tree containing:

   |	/openprom/init/register/0.pc 0x0
   |	/openprom/init/register/pc 0xfff00cf0

   and would be processed last to first resulting in the sequence: set
   all program counters to 0xfff00cf0; set processor zero's program
   counter to zero.

   */

static void
do_register_init(device *me,
		 const device_property *prop)
{
  psim *system = device_system(me);
  if (prop != NULL) {
    const char *name = prop->name;
    uint32_t value = device_find_integer_property(me, name);
    int processor;

    do_register_init(me, device_next_property(prop));

    if (strchr(name, '.') == NULL) {
      processor = -1;
      DTRACE(register, ("%s=0x%lx\n", name, (unsigned long)value));
    }
    else {
      char *end;
      processor = strtoul(name, &end, 0);
      ASSERT(end[0] == '.');
      name = end+1;
      DTRACE(register, ("%d.%s=0x%lx\n", processor, name,
			(unsigned long)value));
    }    
    if (psim_write_register(system, processor, /* all processors */
			    &value,
			    name,
			    cooked_transfer) <= 0)
      error("Invalid register name %s\n", name);
  }
}
		 

static void
register_init_data_callback(device *me)
{
  const device_property *prop = device_find_property(me, NULL);
  do_register_init(me, prop);
}


static device_callbacks const register_callbacks = {
  { NULL, register_init_data_callback, },
  { NULL, }, /* address */
  { NULL, }, /* IO */
  { NULL, }, /* DMA */
  { NULL, }, /* interrupt */
  { NULL, }, /* unit */
};

const device_descriptor hw_register_device_descriptor[] = {
  { "register", NULL, &register_callbacks },
  { NULL },
};

#endif /* _HW_REGISTER_C_ */
