Exemple #1
0
static int
mfi_pci_detach(device_t dev)
{
	struct mfi_softc *sc;
	int error, devcount, i;
	device_t *devlist;

	sc = device_get_softc(dev);

	sx_xlock(&sc->mfi_config_lock);
	mtx_lock(&sc->mfi_io_lock);
	if ((sc->mfi_flags & MFI_FLAGS_OPEN) != 0) {
		mtx_unlock(&sc->mfi_io_lock);
		sx_xunlock(&sc->mfi_config_lock);
		return (EBUSY);
	}
	sc->mfi_detaching = 1;
	mtx_unlock(&sc->mfi_io_lock);

	if ((error = device_get_children(sc->mfi_dev, &devlist, &devcount)) != 0) {
		sx_xunlock(&sc->mfi_config_lock);
		return error;
	}
	for (i = 0; i < devcount; i++)
		device_delete_child(sc->mfi_dev, devlist[i]);
	free(devlist, M_TEMP);
	sx_xunlock(&sc->mfi_config_lock);

	EVENTHANDLER_DEREGISTER(shutdown_final, sc->mfi_eh);

	mfi_shutdown(sc);
	mfi_free(sc);
	mfi_pci_free(sc);
	return (0);
}
Exemple #2
0
static int
mfi_pci_detach(device_t dev)
{
	struct mfi_softc *sc;
	struct mfi_disk *ld;
	int error;

	sc = device_get_softc(dev);

	sx_xlock(&sc->mfi_config_lock);
	mtx_lock(&sc->mfi_io_lock);
	if ((sc->mfi_flags & MFI_FLAGS_OPEN) != 0) {
		mtx_unlock(&sc->mfi_io_lock);
		sx_xunlock(&sc->mfi_config_lock);
		return (EBUSY);
	}
	sc->mfi_detaching = 1;
	mtx_unlock(&sc->mfi_io_lock);

	while ((ld = TAILQ_FIRST(&sc->mfi_ld_tqh)) != NULL) {
		if ((error = device_delete_child(dev, ld->ld_dev)) != 0) {
			sc->mfi_detaching = 0;
			sx_xunlock(&sc->mfi_config_lock);
			return (error);
		}
	}
	sx_xunlock(&sc->mfi_config_lock);

	EVENTHANDLER_DEREGISTER(shutdown_final, sc->mfi_eh);

	mfi_shutdown(sc);
	mfi_free(sc);
	mfi_pci_free(sc);
	return (0);
}
Exemple #3
0
static int
mfi_pci_attach(device_t dev)
{
	struct mfi_softc *sc;
	struct mfi_ident *m;
	int count, error;

	sc = device_get_softc(dev);
	bzero(sc, sizeof(*sc));
	sc->mfi_dev = dev;
	m = mfi_find_ident(dev);
	sc->mfi_flags = m->flags;

	/* Ensure busmastering is enabled */
	pci_enable_busmaster(dev);

	/* Allocate PCI registers */
	if ((sc->mfi_flags & MFI_FLAGS_1064R) ||
	    (sc->mfi_flags & MFI_FLAGS_1078)) {
		/* 1068/1078: Memory mapped BAR is at offset 0x10 */
		sc->mfi_regs_rid = PCIR_BAR(0);
	}
	else if ((sc->mfi_flags & MFI_FLAGS_GEN2) ||
		 (sc->mfi_flags & MFI_FLAGS_SKINNY) ||
		(sc->mfi_flags & MFI_FLAGS_TBOLT)) { 
		/* Gen2/Skinny: Memory mapped BAR is at offset 0x14 */
		sc->mfi_regs_rid = PCIR_BAR(1);
	}
	if ((sc->mfi_regs_resource = bus_alloc_resource_any(sc->mfi_dev,
	    SYS_RES_MEMORY, &sc->mfi_regs_rid, RF_ACTIVE)) == NULL) {
		device_printf(dev, "Cannot allocate PCI registers\n");
		return (ENXIO);
	}
	sc->mfi_btag = rman_get_bustag(sc->mfi_regs_resource);
	sc->mfi_bhandle = rman_get_bushandle(sc->mfi_regs_resource);

	error = ENOMEM;

	/* Allocate parent DMA tag */
	if (bus_dma_tag_create(	bus_get_dma_tag(dev),	/* PCI parent */
				1, 0,			/* algnmnt, boundary */
				BUS_SPACE_MAXADDR,	/* lowaddr */
				BUS_SPACE_MAXADDR,	/* highaddr */
				NULL, NULL,		/* filter, filterarg */
				BUS_SPACE_MAXSIZE_32BIT,/* maxsize */
				BUS_SPACE_UNRESTRICTED,	/* nsegments */
				BUS_SPACE_MAXSIZE_32BIT,/* maxsegsize */
				0,			/* flags */
				NULL, NULL,		/* lockfunc, lockarg */
				&sc->mfi_parent_dmat)) {
		device_printf(dev, "Cannot allocate parent DMA tag\n");
		goto out;
	}

	/* Allocate IRQ resource. */
	sc->mfi_irq_rid = 0;
	count = 1;
	if (mfi_msi && pci_alloc_msi(sc->mfi_dev, &count) == 0) {
		device_printf(sc->mfi_dev, "Using MSI\n");
		sc->mfi_irq_rid = 1;
	}
	if ((sc->mfi_irq = bus_alloc_resource_any(sc->mfi_dev, SYS_RES_IRQ,
	    &sc->mfi_irq_rid, RF_SHAREABLE | RF_ACTIVE)) == NULL) {
		device_printf(sc->mfi_dev, "Cannot allocate interrupt\n");
		error = EINVAL;
		goto out;
	}

	error = mfi_attach(sc);
out:
	if (error) {
		mfi_free(sc);
		mfi_pci_free(sc);
	}

	return (error);
}
Exemple #4
0
int main(int argc,char** argv) 
{
  void (*run_GridCut[4][27][3][3])(MFI*,unsigned char*,int*,double*,double*,double*);                                               \

#ifdef MT
  run_GridCut[2][ 4][MFI::TYPE_UINT8 ][MFI::TYPE_UINT8 ] = run_GridCut_2D_4C_MT<unsigned char ,unsigned char >;
  run_GridCut[2][ 4][MFI::TYPE_UINT16][MFI::TYPE_UINT8 ] = run_GridCut_2D_4C_MT<unsigned short,unsigned char >;
  run_GridCut[2][ 4][MFI::TYPE_UINT32][MFI::TYPE_UINT8 ] = run_GridCut_2D_4C_MT<unsigned int,  unsigned char >;
  run_GridCut[2][ 4][MFI::TYPE_UINT8 ][MFI::TYPE_UINT16] = run_GridCut_2D_4C_MT<unsigned char ,unsigned short>;
  run_GridCut[2][ 4][MFI::TYPE_UINT16][MFI::TYPE_UINT16] = run_GridCut_2D_4C_MT<unsigned short,unsigned short>;
  run_GridCut[2][ 4][MFI::TYPE_UINT32][MFI::TYPE_UINT16] = run_GridCut_2D_4C_MT<unsigned int,  unsigned short>;
  run_GridCut[2][ 4][MFI::TYPE_UINT8 ][MFI::TYPE_UINT32] = run_GridCut_2D_4C_MT<unsigned char ,unsigned int  >;
  run_GridCut[2][ 4][MFI::TYPE_UINT16][MFI::TYPE_UINT32] = run_GridCut_2D_4C_MT<unsigned short,unsigned int  >;
  run_GridCut[2][ 4][MFI::TYPE_UINT32][MFI::TYPE_UINT32] = run_GridCut_2D_4C_MT<unsigned int,  unsigned int  >;
  run_GridCut[3][ 6][MFI::TYPE_UINT8 ][MFI::TYPE_UINT8 ] = run_GridCut_3D_6C_MT<unsigned char ,unsigned char >;
  run_GridCut[3][ 6][MFI::TYPE_UINT16][MFI::TYPE_UINT8 ] = run_GridCut_3D_6C_MT<unsigned short,unsigned char >;
  run_GridCut[3][ 6][MFI::TYPE_UINT32][MFI::TYPE_UINT8 ] = run_GridCut_3D_6C_MT<unsigned int,  unsigned char >;
  run_GridCut[3][ 6][MFI::TYPE_UINT8 ][MFI::TYPE_UINT16] = run_GridCut_3D_6C_MT<unsigned char ,unsigned short>;
  run_GridCut[3][ 6][MFI::TYPE_UINT16][MFI::TYPE_UINT16] = run_GridCut_3D_6C_MT<unsigned short,unsigned short>;
  run_GridCut[3][ 6][MFI::TYPE_UINT32][MFI::TYPE_UINT16] = run_GridCut_3D_6C_MT<unsigned int,  unsigned short>;
  run_GridCut[3][ 6][MFI::TYPE_UINT8 ][MFI::TYPE_UINT32] = run_GridCut_3D_6C_MT<unsigned char ,unsigned int  >;
  run_GridCut[3][ 6][MFI::TYPE_UINT16][MFI::TYPE_UINT32] = run_GridCut_3D_6C_MT<unsigned short,unsigned int  >;
  run_GridCut[3][ 6][MFI::TYPE_UINT32][MFI::TYPE_UINT32] = run_GridCut_3D_6C_MT<unsigned int,  unsigned int  >;
#else
  run_GridCut[2][ 4][MFI::TYPE_UINT8 ][MFI::TYPE_UINT8 ] = run_GridCut_2D_4C<unsigned char ,unsigned char >;
  run_GridCut[2][ 4][MFI::TYPE_UINT16][MFI::TYPE_UINT8 ] = run_GridCut_2D_4C<unsigned short,unsigned char >;
  run_GridCut[2][ 4][MFI::TYPE_UINT32][MFI::TYPE_UINT8 ] = run_GridCut_2D_4C<unsigned int,  unsigned char >;
  run_GridCut[2][ 4][MFI::TYPE_UINT8 ][MFI::TYPE_UINT16] = run_GridCut_2D_4C<unsigned char ,unsigned short>;
  run_GridCut[2][ 4][MFI::TYPE_UINT16][MFI::TYPE_UINT16] = run_GridCut_2D_4C<unsigned short,unsigned short>;
  run_GridCut[2][ 4][MFI::TYPE_UINT32][MFI::TYPE_UINT16] = run_GridCut_2D_4C<unsigned int,  unsigned short>;
  run_GridCut[2][ 4][MFI::TYPE_UINT8 ][MFI::TYPE_UINT32] = run_GridCut_2D_4C<unsigned char ,unsigned int  >;
  run_GridCut[2][ 4][MFI::TYPE_UINT16][MFI::TYPE_UINT32] = run_GridCut_2D_4C<unsigned short,unsigned int  >;
  run_GridCut[2][ 4][MFI::TYPE_UINT32][MFI::TYPE_UINT32] = run_GridCut_2D_4C<unsigned int,  unsigned int  >;
  run_GridCut[3][ 6][MFI::TYPE_UINT8 ][MFI::TYPE_UINT8 ] = run_GridCut_3D_6C<unsigned char ,unsigned char >;
  run_GridCut[3][ 6][MFI::TYPE_UINT16][MFI::TYPE_UINT8 ] = run_GridCut_3D_6C<unsigned short,unsigned char >;
  run_GridCut[3][ 6][MFI::TYPE_UINT32][MFI::TYPE_UINT8 ] = run_GridCut_3D_6C<unsigned int,  unsigned char >;
  run_GridCut[3][ 6][MFI::TYPE_UINT8 ][MFI::TYPE_UINT16] = run_GridCut_3D_6C<unsigned char ,unsigned short>;
  run_GridCut[3][ 6][MFI::TYPE_UINT16][MFI::TYPE_UINT16] = run_GridCut_3D_6C<unsigned short,unsigned short>;
  run_GridCut[3][ 6][MFI::TYPE_UINT32][MFI::TYPE_UINT16] = run_GridCut_3D_6C<unsigned int,  unsigned short>;
  run_GridCut[3][ 6][MFI::TYPE_UINT8 ][MFI::TYPE_UINT32] = run_GridCut_3D_6C<unsigned char ,unsigned int  >;
  run_GridCut[3][ 6][MFI::TYPE_UINT16][MFI::TYPE_UINT32] = run_GridCut_3D_6C<unsigned short,unsigned int  >;
  run_GridCut[3][ 6][MFI::TYPE_UINT32][MFI::TYPE_UINT32] = run_GridCut_3D_6C<unsigned int,  unsigned int  >;
#endif
  
  run_GridCut[3][26][MFI::TYPE_UINT8 ][MFI::TYPE_UINT8 ] = run_GridCut_3D_26C<unsigned char ,unsigned char >;
  run_GridCut[3][26][MFI::TYPE_UINT16][MFI::TYPE_UINT8 ] = run_GridCut_3D_26C<unsigned short,unsigned char >;
  run_GridCut[3][26][MFI::TYPE_UINT32][MFI::TYPE_UINT8 ] = run_GridCut_3D_26C<unsigned int,  unsigned char >;
  run_GridCut[3][26][MFI::TYPE_UINT8 ][MFI::TYPE_UINT16] = run_GridCut_3D_26C<unsigned char ,unsigned short>;
  run_GridCut[3][26][MFI::TYPE_UINT16][MFI::TYPE_UINT16] = run_GridCut_3D_26C<unsigned short,unsigned short>;
  run_GridCut[3][26][MFI::TYPE_UINT32][MFI::TYPE_UINT16] = run_GridCut_3D_26C<unsigned int,  unsigned short>;
  run_GridCut[3][26][MFI::TYPE_UINT8 ][MFI::TYPE_UINT32] = run_GridCut_3D_26C<unsigned char ,unsigned int  >;
  run_GridCut[3][26][MFI::TYPE_UINT16][MFI::TYPE_UINT32] = run_GridCut_3D_26C<unsigned short,unsigned int  >;
  run_GridCut[3][26][MFI::TYPE_UINT32][MFI::TYPE_UINT32] = run_GridCut_3D_26C<unsigned int,  unsigned int  >;
    
  const char* dataset_path = argc==2 ? argv[1] : "./dataset";
    
  int num_instances = (sizeof(instances)/sizeof(Instance));
  
  printf("instance                            time-init  time-maxflow  time-output  total\n");

  for(int i=0;i<num_instances;i++)
  {
    double sum_time_init = 0.0;
    double sum_time_maxflow = 0.0;
    double sum_time_output = 0.0;

    for(int j=0;j<instances[i].count;j++)
    {
      char filename[1024];
      
      if (instances[i].count==1)
      {
        sprintf(filename,instances[i].filename,dataset_path);
      }
      else
      {
        sprintf(filename,instances[i].filename,dataset_path,j);
      }

      MFI* mfi = mfi_read(filename);
      
      if (!mfi)
      {
        printf("FAILED to read instance %s\n",filename);
        continue;
      }

      unsigned char* label = (unsigned char*)malloc(mfi->width*mfi->height*mfi->depth);
          
      int maxflow = -1;

      double time_init;
      double time_maxflow;
      double time_output;

      run_GridCut[mfi->dimension]
                 [mfi->connectivity]
                 [mfi->type_terminal_cap]
                 [mfi->type_neighbor_cap](mfi,label,&maxflow,&time_init,&time_maxflow,&time_output);

      sum_time_init    += time_init;
      sum_time_maxflow += time_maxflow;
      sum_time_output  += time_output;

      /**
      std::string name(filename);
      printf("%s, (%d, %d, %d, %d, %d, %d)\n", name.c_str(),
          mfi->width, mfi->height, mfi->depth, mfi->connectivity, maxflow, mfi->maxflow);

      mfi->maxflow = maxflow;
      mfi_write(mfi, name.c_str());
      //*/

      /**/
      if (maxflow != mfi->maxflow)
      {
        printf("INVALID maxflow value returned for instance %s\n",filename);
        return 1;
      }
      //*/
      free(label);
        
      mfi_free(mfi);      
    }

    double sum_time_total = sum_time_init + sum_time_maxflow + sum_time_output;

    printf("%-38s % 6.0f        % 6.0f       % 6.0f % 6.0f\n",
           instances[i].name,sum_time_init,sum_time_maxflow,sum_time_output,sum_time_total);
  }

  return 0;  
}
Exemple #5
0
static int
mfi_pci_attach(device_t dev)
{
	struct mfi_softc *sc;
	struct mfi_ident *m;
	uint32_t command;
	int count, error;

	sc = device_get_softc(dev);
	bzero(sc, sizeof(*sc));
	sc->mfi_dev = dev;
	m = mfi_find_ident(dev);
	sc->mfi_flags = m->flags;

	/* Verify that the adapter can be set up in PCI space */
	command = pci_read_config(dev, PCIR_COMMAND, 2);
	command |= PCIM_CMD_BUSMASTEREN;
	pci_write_config(dev, PCIR_COMMAND, command, 2);
	command = pci_read_config(dev, PCIR_COMMAND, 2);
	if ((command & PCIM_CMD_BUSMASTEREN) == 0) {
		device_printf(dev, "Can't enable PCI busmaster\n");
		return (ENXIO);
	}
	if ((command & PCIM_CMD_MEMEN) == 0) {
		device_printf(dev, "PCI memory window not available\n");
		return (ENXIO);
	}

	/* Allocate PCI registers */
	if ((sc->mfi_flags & MFI_FLAGS_1064R) ||
	    (sc->mfi_flags & MFI_FLAGS_1078)) {
		/* 1068/1078: Memory mapped BAR is at offset 0x10 */
		sc->mfi_regs_rid = PCIR_BAR(0);
	} else if (sc->mfi_flags & MFI_FLAGS_GEN2) {
		/* GEN2: Memory mapped BAR is at offset 0x14 */
		sc->mfi_regs_rid = PCIR_BAR(1);
	}
	if ((sc->mfi_regs_resource = bus_alloc_resource_any(sc->mfi_dev,
	    SYS_RES_MEMORY, &sc->mfi_regs_rid, RF_ACTIVE)) == NULL) {
		device_printf(dev, "Cannot allocate PCI registers\n");
		return (ENXIO);
	}
	sc->mfi_btag = rman_get_bustag(sc->mfi_regs_resource);
	sc->mfi_bhandle = rman_get_bushandle(sc->mfi_regs_resource);

	error = ENOMEM;

	/* Allocate parent DMA tag */
	if (bus_dma_tag_create(	NULL,			/* parent */
				1, 0,			/* algnmnt, boundary */
				BUS_SPACE_MAXADDR,	/* lowaddr */
				BUS_SPACE_MAXADDR,	/* highaddr */
				NULL, NULL,		/* filter, filterarg */
				BUS_SPACE_MAXSIZE_32BIT,/* maxsize */
				BUS_SPACE_UNRESTRICTED,	/* nsegments */
				BUS_SPACE_MAXSIZE_32BIT,/* maxsegsize */
				0,			/* flags */
				NULL, NULL,		/* lockfunc, lockarg */
				&sc->mfi_parent_dmat)) {
		device_printf(dev, "Cannot allocate parent DMA tag\n");
		goto out;
	}

	/* Allocate IRQ resource. */
	sc->mfi_irq_rid = 0;
	count = 1;
	if (mfi_msi && pci_alloc_msi(sc->mfi_dev, &count) == 0) {
		device_printf(sc->mfi_dev, "Using MSI\n");
		sc->mfi_irq_rid = 1;
	}
	if ((sc->mfi_irq = bus_alloc_resource_any(sc->mfi_dev, SYS_RES_IRQ,
	    &sc->mfi_irq_rid, RF_SHAREABLE | RF_ACTIVE)) == NULL) {
		device_printf(sc->mfi_dev, "Cannot allocate interrupt\n");
		error = EINVAL;
		goto out;
	}

	error = mfi_attach(sc);
out:
	if (error) {
		mfi_free(sc);
		mfi_pci_free(sc);
	}

	return (error);
}