static int pmc_core_probe(struct pci_dev *dev, const struct pci_device_id *id) { struct device *ptr_dev = &dev->dev; struct pmc_dev *pmcdev = &pmc; const struct x86_cpu_id *cpu_id; const struct pmc_reg_map *map = (struct pmc_reg_map *)id->driver_data; int err; cpu_id = x86_match_cpu(intel_pmc_core_ids); if (!cpu_id) { dev_dbg(&dev->dev, "PMC Core: cpuid mismatch.\n"); return -EINVAL; } err = pcim_enable_device(dev); if (err < 0) { dev_dbg(&dev->dev, "PMC Core: failed to enable Power Management Controller.\n"); return err; } err = pci_read_config_dword(dev, SPT_PMC_BASE_ADDR_OFFSET, &pmcdev->base_addr); if (err < 0) { dev_dbg(&dev->dev, "PMC Core: failed to read PCI config space.\n"); return err; } pmcdev->base_addr &= PMC_BASE_ADDR_MASK; dev_dbg(&dev->dev, "PMC Core: PWRMBASE is %#x\n", pmcdev->base_addr); pmcdev->regbase = devm_ioremap_nocache(ptr_dev, pmcdev->base_addr, SPT_PMC_MMIO_REG_LEN); if (!pmcdev->regbase) { dev_dbg(&dev->dev, "PMC Core: ioremap failed.\n"); return -ENOMEM; } mutex_init(&pmcdev->lock); pmcdev->pmc_xram_read_bit = pmc_core_check_read_lock_bit(); pmcdev->map = map; err = pmc_core_dbgfs_register(pmcdev); if (err < 0) dev_warn(&dev->dev, "PMC Core: debugfs register failed.\n"); pmc.has_slp_s0_res = true; return 0; }
static int __init pmc_core_probe(void) { struct pmc_dev *pmcdev = &pmc; const struct x86_cpu_id *cpu_id; u64 slp_s0_addr; int err; cpu_id = x86_match_cpu(intel_pmc_core_ids); if (!cpu_id) return -ENODEV; pmcdev->map = (struct pmc_reg_map *)cpu_id->driver_data; /* * Coffeelake has CPU ID of Kabylake and Cannonlake PCH. So here * Sunrisepoint PCH regmap can't be used. Use Cannonlake PCH regmap * in this case. */ if (!pci_dev_present(pmc_pci_ids)) pmcdev->map = &cnp_reg_map; if (lpit_read_residency_count_address(&slp_s0_addr)) pmcdev->base_addr = PMC_BASE_ADDR_DEFAULT; else pmcdev->base_addr = slp_s0_addr - pmcdev->map->slp_s0_offset; pmcdev->regbase = ioremap(pmcdev->base_addr, pmcdev->map->regmap_length); if (!pmcdev->regbase) return -ENOMEM; mutex_init(&pmcdev->lock); pmcdev->pmc_xram_read_bit = pmc_core_check_read_lock_bit(); err = pmc_core_dbgfs_register(pmcdev); if (err < 0) { pr_warn(" debugfs register failed.\n"); iounmap(pmcdev->regbase); return err; } pr_info(" initialized\n"); return 0; }