Newer
Older
ubix / src / sys / deviceman / bus_resources_portio.c
@grayspace grayspace on 7 Jul 2002 1 KB *** empty log message ***
/*
   "bus_resources_portio.c"

   created by: grayspace aka J. Leveille
   for: UbixOS Project
   date: May 12, 2002

   purpose: for port IO resource management

   $Id$
*/

#include "../../grayspace-misc/gsdefines.h"
#include "../../sys/include/misc/misc_bit_array.h"
#include "../../sys/include/deviceman/bus_resources.h"

/* checks a range of port addresses
   returns:
      - 1 if the range is comptetely empty
      - 0 otherwise                          */
int BUS_PORTIO_CheckRange( BUS_PORTIO_POOL * p_bpp,
                           DWORDg baseaddr,
                           DWORDg overaddr         )
{
   BIT_ARRAY_RANGE_PARAMS rp;
   BIT_ARRAY_MAKERANGEPARAMS( rp, p_bpp->a_addrs, baseaddr, overaddr );
   return BIT_ARRAY_IsRangeEmpty( &rp );
}

/* allocates a range of port addresses
   returns:
      - 1 on success
      - 0 on failure    */
int BUS_PORTIO_AllocateRange( BUS_PORTIO_POOL * p_bpp,
                              DWORDg baseaddr,
                              DWORDg overaddr         )
{
   BIT_ARRAY_RANGE_PARAMS rp;
   BIT_ARRAY_MAKERANGEPARAMS( rp, p_bpp->a_addrs, baseaddr, overaddr );

   /* check if this port range is free */
   if( BIT_ARRAY_IsRangeEmpty( &rp ) )
   {
      /* allocate it */
      BIT_ARRAY_SetRange( &rp );

      /* success */
      return 1;
   }

   /* fail */
   return 0;
}

/* frees a range of port addresses
   returns:
      - 1 if any port addresses in the range were allocated
      - 0 otherwise                                         */
int BUS_PORTIO_FreeRange(  BUS_PORTIO_POOL * p_bpp,
                           DWORDg baseaddr,
                           DWORDg overaddr         )
{
   BIT_ARRAY_RANGE_PARAMS rp;
   BIT_ARRAY_MAKERANGEPARAMS( rp, p_bpp->a_addrs, baseaddr, overaddr );

   /* check if this port range is free */
   if( !BIT_ARRAY_IsRangeEmpty( &rp ) )
   {
      /* free it */
      BIT_ARRAY_ResetRange( &rp );

      /* success */
      return 1;
   }

   /* fail */
   return 0;
}