1  /*
   2   * \brief  I/O-port session interface
   3   * \author Christian Helmuth
   4   * \date   2007-04-17
   5   *
   6   * An I/O port session permits access to a range of ports. Inside this range
   7   * variable-sized accesses (i.e., 8, 16, 32 bit) at arbitrary addresses are
   8   * allowed - currently, alignment is not enforced. Core enforces that access is
   9   * limited to the session-defined range while the user provides physical I/O port
  10   * addresses as arguments.
  11   *
  12   * The design is founded on experiences while programming PCI configuration
  13   * space which needs two 32-bit port registers. Each byte, word and dword in
  14   * the data register must be explicitly accessible for read and write. The old
  15   * design needs six capabilities only for the data register.
  16   */

  17  
  18  /*
  19   * Copyright (C) 2007-2013 Genode Labs GmbH
  20   *
  21   * This file is part of the Genode OS framework, which is distributed
  22   * under the terms of the GNU General Public License version 2.
  23   */

  24  
  25  #ifndef _INCLUDE__IO_PORT_SESSION__IO_PORT_SESSION_H_
  26  #define _INCLUDE__IO_PORT_SESSION__IO_PORT_SESSION_H_
  27  
  28  #include <base/capability.h>
  29  #include <session/session.h>
  30  
  31  namespace Genode { struct Io_port_session; }
  32  
  33  
  34  struct Genode::Io_port_session : Session
  35  {
  36     static const char *service_name() { return "IO_PORT"; }
  37  
  38     virtual ~Io_port_session() { }
  39  
  40     /******************************
  41      ** Read value from I/O port **
  42      ******************************/

  43  
  44     /**
  45      * Read byte (8 bit)
  46      *
  47      * \param address  physical I/O port address
  48      *
  49      * \return         value read from port
  50      */

  51     virtual unsigned char inb(unsigned short address) = 0;

  52  
  53     /**
  54      * Read word (16 bit)
  55      *
  56      * \param address  physical I/O port address
  57      *
  58      * \return         value read from port
  59      */

  60     virtual unsigned short inw(unsigned short address) = 0;

  61  
  62     /**
  63      * Read double word (32 bit)
  64      *
  65      * \param address  physical I/O port address
  66      *
  67      * \return         value read from port
  68      */

  69     virtual unsigned inl(unsigned short address) = 0;

  70  
  71  
  72     /*****************************
  73      ** Write value to I/O port **
  74      *****************************/

  75  
  76     /**
  77      * Write byte (8 bit)
  78      *
  79      * \param address  physical I/O port address
  80      * \param value    value to write to port
  81      */

  82     virtual void outb(unsigned short address, unsigned char value) = 0;

  83  
  84     /**
  85      * Write word (16 bit)
  86      *
  87      * \param address  physical I/O port address
  88      * \param value    value to write to port
  89      */

  90     virtual void outw(unsigned short address, unsigned short value) = 0;

  91  
  92     /**
  93      * Write double word (32 bit)
  94      *
  95      * \param address  physical I/O port address
  96      * \param value    value to write to port
  97      */

  98     virtual void outl(unsigned short address, unsigned value) = 0;

  99  
 100  
 101     /*********************
 102      ** RPC declaration **
 103      *********************/

 104  
 105     GENODE_RPC(Rpc_inb, unsigned char,  inb, unsigned short);
 106     GENODE_RPC(Rpc_inw, unsigned short, inw, unsigned short);
 107     GENODE_RPC(Rpc_inl, unsigned,       inl, unsigned short);
 108  
 109     GENODE_RPC(Rpc_outb, void, outb, unsigned short, unsigned char);
 110     GENODE_RPC(Rpc_outw, void, outw, unsigned short, unsigned short);
 111     GENODE_RPC(Rpc_outl, void, outl, unsigned short, unsigned);
 112  
 113     GENODE_RPC_INTERFACE(Rpc_inb, Rpc_inw, Rpc_inl, Rpc_outb, Rpc_outw, Rpc_outl);
 114  }
;

 115  
 116  #endif /* _INCLUDE__IO_PORT_SESSION__IO_PORT_SESSION_H_ */