/* Common hardware header file.
   Copyright (C) 1998-2021 Free Software Foundation, Inc.
   Contributed by Andrew Cagney and Cygnus Support.

This file is part of GDB, the GNU debugger.

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_MAIN
#define HW_MAIN

/* establish a type system */
#include "sim-basics.h"

/* construct a hw device */
#include "hw-device.h"
#include "hw-properties.h"
#include "hw-events.h"
#include "hw-alloc.h"
#include "hw-instances.h"
#include "hw-handles.h"
#include "hw-ports.h"

/* Description of a hardware device */

typedef void (hw_finish_method)
     (struct hw *me);

struct hw_descriptor
{
  const char *family;
  hw_finish_method *to_finish;
};

/* Helper functions to make the implementation of a device easier */

/* Go through the devices reg properties and look for those specifying
   an address to attach various registers to */

void do_hw_attach_regs (struct hw *me);

/* Perform a polling read on FD returning either the number of bytes
   or a hw_io status code that indicates the reason for the read
   failure */

enum
{
  HW_IO_EOF = -1, HW_IO_NOT_READY = -2, /* See: IEEE 1275 */
};

typedef int (do_hw_poll_read_method)
     (SIM_DESC sd, int, char *, int);

int do_hw_poll_read
(struct hw *me,
 do_hw_poll_read_method *read,
 int sim_io_fd,
 void *buf,
 unsigned size_of_buf);


#endif
