static int p54p_resume(struct device *device) { struct pci_dev *pdev = to_pci_dev(device); int err; err = pci_reenable_device(pdev); if (err) return err; return pci_set_power_state(pdev, PCI_D0); }
static int mic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { int brdnum = mic_data.dd_numdevs; int err = 0; bd_info_t *bd_info; mic_ctx_t *mic_ctx; #ifdef CONFIG_PCI_MSI int i=0; #endif if ((bd_info = (bd_info_t *)kzalloc(sizeof(bd_info_t), GFP_KERNEL)) == NULL) { printk("MIC: probe failed allocating memory for bd_info\n"); return -ENOSPC; } mic_ctx = &bd_info->bi_ctx; mic_ctx->bd_info = bd_info; mic_ctx->bi_id = brdnum; mic_ctx->bi_pdev = pdev; mic_ctx->msie = 0; mic_data.dd_bi[brdnum] = bd_info; if ((err = pci_enable_device(pdev))) { printk("pci_enable failed board #%d\n", brdnum); goto probe_freebd; } pci_set_master(pdev); err = pci_reenable_device(pdev); err = pci_set_dma_mask(pdev, DMA_BIT_MASK(64)); if (err) { printk("mic %d: ERROR DMA not available\n", brdnum); goto probe_freebd; } err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)); if (err) { printk("mic %d: ERROR pci_set_consistent_dma_mask(64) %d\n", brdnum, err); err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)); if (err) { printk("mic %d: ERROR pci_set_consistent_dma_mask(32) %d\n", brdnum, err); goto probe_freebd; } } // Allocate bar 4 for MMIO and GTT bd_info->bi_ctx.mmio.pa = pci_resource_start(pdev, DLDR_MMIO_BAR); bd_info->bi_ctx.mmio.len = pci_resource_len(pdev, DLDR_MMIO_BAR); if (request_mem_region(bd_info->bi_ctx.mmio.pa, bd_info->bi_ctx.mmio.len, "mic") == NULL) { printk("mic %d: failed to reserve mmio space\n", brdnum); goto probe_freebd; } // Allocate bar 0 for access Aperture bd_info->bi_ctx.aper.pa = pci_resource_start(pdev, DLDR_APT_BAR); bd_info->bi_ctx.aper.len = pci_resource_len(pdev, DLDR_APT_BAR); if (request_mem_region(bd_info->bi_ctx.aper.pa, bd_info->bi_ctx.aper.len, "mic") == NULL) { printk("mic %d: failed to reserve aperture space\n", brdnum); goto probe_relmmio; } #ifdef CONFIG_PCI_MSI if (mic_msi_enable){ for (i = 0; i < MIC_NUM_MSIX_ENTRIES; i ++) bd_info->bi_msix_entries[i].entry = i; err = pci_enable_msix(mic_ctx->bi_pdev, bd_info->bi_msix_entries, MIC_NUM_MSIX_ENTRIES); if (err == 0 ) { // Only support 1 MSIx for now err = request_irq(bd_info->bi_msix_entries[0].vector, mic_irq_isr, 0, "mic", mic_ctx); if (err != 0) { printk("MIC: Error in request_irq %d\n", err); goto probe_relaper; } mic_ctx->msie = 1; } } #endif // TODO: this needs to be hardened and actually return errors if ((err = adapter_init_device(mic_ctx)) != 0) { printk("MIC: Adapter init device failed %d\n", err); goto probe_relaper; } // Adding sysfs entries set_sysfs_entries(mic_ctx); bd_info->bi_sysfsdev = device_create(mic_lindata.dd_class, &pdev->dev, mic_lindata.dd_dev + 2 + mic_ctx->bd_info->bi_ctx.bi_id, NULL, "mic%d", mic_ctx->bd_info->bi_ctx.bi_id); err = sysfs_create_group(&mic_ctx->bd_info->bi_sysfsdev->kobj, &bd_attr_group); mic_ctx->sysfs_state = sysfs_get_dirent(mic_ctx->bd_info->bi_sysfsdev->kobj.sd, #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,35)) //NULL, #endif "state"); dev_set_drvdata(mic_ctx->bd_info->bi_sysfsdev, mic_ctx); if (!mic_ctx->msie) if ((err = request_irq(mic_ctx->bi_pdev->irq, mic_irq_isr, IRQF_SHARED, "mic", mic_ctx)) != 0) { printk("MIC: Error in request_irq %d\n", err); goto probe_unmapaper; } adapter_probe(&bd_info->bi_ctx); if (mic_ctx->bi_psmi.enabled) { err = sysfs_create_group(&mic_ctx->bd_info->bi_sysfsdev->kobj, &psmi_attr_group); err = device_create_bin_file(mic_ctx->bd_info->bi_sysfsdev, &mic_psmi_ptes_attr); } adapter_wait_reset(mic_ctx); // Adding a board instance so increment the total number of MICs in the system. list_add_tail(&bd_info->bi_list, &mic_data.dd_bdlist); mic_data.dd_numdevs++; printk("mic_probe %d:%d:%d as board #%d\n", pdev->bus->number, PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn), brdnum); return 0; probe_unmapaper: wait_event(mic_ctx->ioremapwq, mic_ctx->aper.va || mic_ctx->state == MIC_RESETFAIL); if (mic_ctx->aper.va) iounmap((void *)bd_info->bi_ctx.aper.va); iounmap((void *)bd_info->bi_ctx.mmio.va); probe_relaper: release_mem_region(bd_info->bi_ctx.aper.pa, bd_info->bi_ctx.aper.len); probe_relmmio: release_mem_region(bd_info->bi_ctx.mmio.pa, bd_info->bi_ctx.mmio.len); probe_freebd: kfree(bd_info); return err; }