/*
   "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;
}