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); }
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); }
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); }
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; }
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); }