static int set_msi_sid(struct irte *irte, struct pci_dev *dev) { struct set_msi_sid_data data; if (!irte || !dev) return -1; pci_for_each_dma_alias(dev, set_msi_sid_cb, &data); /* * DMA alias provides us with a PCI device and alias. The only case * where the it will return an alias on a different bus than the * device is the case of a PCIe-to-PCI bridge, where the alias is for * the subordinate bus. In this case we can only verify the bus. * * If the alias device is on a different bus than our source device * then we have a topology based alias, use it. * * Otherwise, the alias is for a device DMA quirk and we cannot * assume that MSI uses the same requester ID. Therefore use the * original device. */ if (PCI_BUS_NUM(data.alias) != data.pdev->bus->number) set_irte_sid(irte, SVT_VERIFY_BUS, SQ_ALL_16, PCI_DEVID(PCI_BUS_NUM(data.alias), dev->bus->number)); else if (data.pdev->bus->number != dev->bus->number) set_irte_sid(irte, SVT_VERIFY_SID_SQ, SQ_ALL_16, data.alias); else set_irte_sid(irte, SVT_VERIFY_SID_SQ, SQ_ALL_16, PCI_DEVID(dev->bus->number, dev->devfn)); return 0; }
void InitXboxHardware(HardwareModel hardwareModel) { // Determine which (revisions of which) components should be used for this hardware model MCPXRevision mcpx_revision = MCPXRevisionFromHardwareModel(hardwareModel); SCMRevision smc_revision = SCMRevisionFromHardwareModel(hardwareModel); TVEncoder tv_encoder = TVEncoderFromHardwareModel(hardwareModel); // Create busses g_PCIBus = new PCIBus(); g_SMBus = new SMBus(); // Create devices g_MCPX = new MCPXDevice(mcpx_revision); g_SMC = new SMCDevice(smc_revision); g_EEPROM = new EEPROMDevice(); g_NVNet = new NVNetDevice(); g_NV2A = new NV2ADevice(); g_ADM1032 = new ADM1032Device(); // Connect devices to SM bus g_SMBus->ConnectDevice(SMBUS_ADDRESS_SYSTEM_MICRO_CONTROLLER, g_SMC); // W 0x20 R 0x21 g_SMBus->ConnectDevice(SMBUS_ADDRESS_EEPROM, g_EEPROM); // W 0xA8 R 0xA9 // TODO : Other SMBus devices to connect //g_SMBus->ConnectDevice(SMBUS_ADDRESS_MCPX, g_MCPX); // W 0x10 R 0x11 -- TODO : Is MCPX an SMBus and/or PCI device? g_SMBus->ConnectDevice(SMBUS_ADDRESS_TEMPERATURE_MONITOR, g_ADM1032); // W 0x98 R 0x99 //g_SMBus->ConnectDevice(SMBUS_ADDRESS_TV_ENCODER, g_TVEncoder); // W 0x88 R 0x89 switch (tv_encoder) { case TVEncoder::Conexant: // g_SMBus->ConnectDevice(SMBUS_ADDRESS_TV_ENCODER_ID_CONEXANT, g_TVEncoderConexant); // W 0x8A R 0x8B break; case TVEncoder::Focus: // g_SMBus->ConnectDevice(SMBUS_ADDRESS_TV_ENCODER_ID_FOCUS, g_TVEncoderFocus); // W 0xD4 R 0xD5 break; case TVEncoder::XCalibur: // g_SMBus->ConnectDevice(SMBUS_ADDRESS_TV_ENCODER_ID_XCALIBUR, g_TVEncoderXCalibur); // W 0xE0 R 0xE1 break; } // Connect devices to PCI bus g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(1, 1)), g_SMBus); g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(4, 0)), g_NVNet); //g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(4, 1)), g_MCPX); // MCPX device ID = 0x0808 ? //g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(5, 0)), g_NVAPU); //g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(6, 0)), g_AC97); g_PCIBus->ConnectDevice(PCI_DEVID(1, PCI_DEVFN(0, 0)), g_NV2A); // TODO : Handle other SMBUS Addresses, like PIC_ADDRESS, XCALIBUR_ADDRESS // Resources : http://pablot.com/misc/fancontroller.cpp // https://github.com/JayFoxRox/Chihiro-Launcher/blob/master/hook.h // https://github.com/docbrown/vxb/wiki/Xbox-Hardware-Information // https://web.archive.org/web/20100617022549/http://www.xbox-linux.org/wiki/PIC }
static void piix4_poweroff(void) { int spec_devid; u16 sts; /* Ensure the power button status is clear */ while (1) { sts = inw(io_offset + PIIX4_FUNC3IO_PMSTS); if (!(sts & PIIX4_FUNC3IO_PMSTS_PWRBTN_STS)) break; outw(sts, io_offset + PIIX4_FUNC3IO_PMSTS); } /* Enable entry to suspend */ outw(PIIX4_FUNC3IO_PMCNTRL_SUS_TYP_SOFF | PIIX4_FUNC3IO_PMCNTRL_SUS_EN, io_offset + PIIX4_FUNC3IO_PMCNTRL); /* If the special cycle occurs too soon this doesn't work... */ mdelay(10); /* * The PIIX4 will enter the suspend state only after seeing a special * cycle with the correct magic data on the PCI bus. Generate that * cycle now. */ spec_devid = PCI_DEVID(0, PCI_DEVFN(0x1f, 0x7)); pci_bus_write_config_dword(pm_dev->bus, spec_devid, 0, PIIX4_SUSPEND_MAGIC); /* Give the system some time to power down, then error */ mdelay(1000); pr_emerg("Unable to poweroff system\n"); }
static int htirq_domain_alloc(struct irq_domain *domain, unsigned int virq, unsigned int nr_irqs, void *arg) { struct ht_irq_cfg *ht_cfg; struct irq_alloc_info *info = arg; struct pci_dev *dev; irq_hw_number_t hwirq; int ret; if (nr_irqs > 1 || !info) return -EINVAL; dev = info->ht_dev; hwirq = (info->ht_idx & 0xFF) | PCI_DEVID(dev->bus->number, dev->devfn) << 8 | (pci_domain_nr(dev->bus) & 0xFFFFFFFF) << 24; if (irq_find_mapping(domain, hwirq) > 0) return -EEXIST; ht_cfg = kmalloc(sizeof(*ht_cfg), GFP_KERNEL); if (!ht_cfg) return -ENOMEM; ret = irq_domain_alloc_irqs_parent(domain, virq, nr_irqs, info); if (ret < 0) { kfree(ht_cfg); return ret; } /* Initialize msg to a value that will never match the first write. */ ht_cfg->msg.address_lo = 0xffffffff; ht_cfg->msg.address_hi = 0xffffffff; ht_cfg->dev = info->ht_dev; ht_cfg->update = info->ht_update; ht_cfg->pos = info->ht_pos; ht_cfg->idx = 0x10 + (info->ht_idx * 2); irq_domain_set_info(domain, virq, hwirq, &ht_irq_chip, ht_cfg, handle_edge_irq, ht_cfg, "edge"); return 0; }
static int quark_default_data(struct plat_stmmacenet_data *plat, struct stmmac_pci_info *info) { struct pci_dev *pdev = info->pdev; int ret; /* * Refuse to load the driver and register net device if MAC controller * does not connect to any PHY interface. */ ret = stmmac_pci_find_phy_addr(info); if (ret < 0) return ret; plat->bus_id = PCI_DEVID(pdev->bus->number, pdev->devfn); plat->phy_addr = ret; plat->interface = PHY_INTERFACE_MODE_RMII; plat->clk_csr = 2; plat->has_gmac = 1; plat->force_sf_dma_mode = 1; plat->mdio_bus_data->phy_reset = NULL; plat->mdio_bus_data->phy_mask = 0; plat->dma_cfg->pbl = 16; plat->dma_cfg->pblx8 = true; plat->dma_cfg->fixed_burst = 1; /* AXI (TODO) */ /* Set default value for multicast hash bins */ plat->multicast_filter_bins = HASH_TABLE_SIZE; /* Set default value for unicast filter entries */ plat->unicast_filter_entries = 1; /* Set the maxmtu to a default of JUMBO_LEN */ plat->maxmtu = JUMBO_LEN; return 0; }