static __init int amd_ibs_init(void) { u32 caps; int ret = -EINVAL; caps = __get_ibs_caps(); if (!caps) return -ENODEV; /* ibs not supported by the cpu */ ibs_eilvt_setup(); if (!ibs_eilvt_valid()) goto out; perf_ibs_pm_init(); cpu_notifier_register_begin(); ibs_caps = caps; /* make ibs_caps visible to other cpus: */ smp_mb(); smp_call_function(setup_APIC_ibs, NULL, 1); __perf_cpu_notifier(perf_ibs_cpu_notifier); cpu_notifier_register_done(); ret = perf_event_ibs_init(); out: if (ret) pr_err("Failed to setup IBS, %d\n", ret); return ret; }
static __init int amd_ibs_init(void) { u32 caps; int ret = -EINVAL; caps = __get_ibs_caps(); if (!caps) return -ENODEV; /* ibs not supported by the cpu */ /* * Force LVT offset assignment for family 10h: The offsets are * not assigned by the BIOS for this family, so the OS is * responsible for doing it. If the OS assignment fails, fall * back to BIOS settings and try to setup this. */ if (boot_cpu_data.x86 == 0x10) force_ibs_eilvt_setup(); if (!ibs_eilvt_valid()) goto out; get_online_cpus(); ibs_caps = caps; /* make ibs_caps visible to other cpus: */ smp_mb(); perf_cpu_notifier(perf_ibs_cpu_notifier); smp_call_function(setup_APIC_ibs, NULL, 1); put_online_cpus(); ret = perf_event_ibs_init(); out: if (ret) pr_err("Failed to setup IBS, %d\n", ret); return ret; }