1185363Sjkoshy/*- 2185363Sjkoshy * Copyright (c) 2008 Joseph Koshy 3185363Sjkoshy * All rights reserved. 4185363Sjkoshy * 5185363Sjkoshy * Redistribution and use in source and binary forms, with or without 6185363Sjkoshy * modification, are permitted provided that the following conditions 7185363Sjkoshy * are met: 8185363Sjkoshy * 1. Redistributions of source code must retain the above copyright 9185363Sjkoshy * notice, this list of conditions and the following disclaimer. 10185363Sjkoshy * 2. Redistributions in binary form must reproduce the above copyright 11185363Sjkoshy * notice, this list of conditions and the following disclaimer in the 12185363Sjkoshy * documentation and/or other materials provided with the distribution. 13185363Sjkoshy * 14185363Sjkoshy * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15185363Sjkoshy * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16185363Sjkoshy * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17185363Sjkoshy * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18185363Sjkoshy * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19185363Sjkoshy * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20185363Sjkoshy * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21185363Sjkoshy * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22185363Sjkoshy * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23185363Sjkoshy * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24185363Sjkoshy * SUCH DAMAGE. 25185363Sjkoshy */ 26185363Sjkoshy 27185363Sjkoshy/* 28250038Shiren * Intel Core PMCs. 29185363Sjkoshy */ 30185363Sjkoshy 31185363Sjkoshy#include <sys/cdefs.h> 32185363Sjkoshy__FBSDID("$FreeBSD$"); 33185363Sjkoshy 34185363Sjkoshy#include <sys/param.h> 35196224Sjhb#include <sys/bus.h> 36185363Sjkoshy#include <sys/pmc.h> 37185363Sjkoshy#include <sys/pmckern.h> 38185363Sjkoshy#include <sys/systm.h> 39185363Sjkoshy 40196224Sjhb#include <machine/intr_machdep.h> 41196224Sjhb#include <machine/apicvar.h> 42185363Sjkoshy#include <machine/cpu.h> 43185363Sjkoshy#include <machine/cpufunc.h> 44229397Sfabient#include <machine/md_var.h> 45185363Sjkoshy#include <machine/specialreg.h> 46185363Sjkoshy 47185363Sjkoshy#define CORE_CPUID_REQUEST 0xA 48185363Sjkoshy#define CORE_CPUID_REQUEST_SIZE 0x4 49185363Sjkoshy#define CORE_CPUID_EAX 0x0 50185363Sjkoshy#define CORE_CPUID_EBX 0x1 51185363Sjkoshy#define CORE_CPUID_ECX 0x2 52185363Sjkoshy#define CORE_CPUID_EDX 0x3 53185363Sjkoshy 54185363Sjkoshy#define IAF_PMC_CAPS \ 55244999Sgnn (PMC_CAP_READ | PMC_CAP_WRITE | PMC_CAP_INTERRUPT | \ 56244999Sgnn PMC_CAP_USER | PMC_CAP_SYSTEM) 57185363Sjkoshy#define IAF_RI_TO_MSR(RI) ((RI) + (1 << 30)) 58185363Sjkoshy 59185363Sjkoshy#define IAP_PMC_CAPS (PMC_CAP_INTERRUPT | PMC_CAP_USER | PMC_CAP_SYSTEM | \ 60185363Sjkoshy PMC_CAP_EDGE | PMC_CAP_THRESHOLD | PMC_CAP_READ | PMC_CAP_WRITE | \ 61185363Sjkoshy PMC_CAP_INVERT | PMC_CAP_QUALIFIER | PMC_CAP_PRECISE) 62185363Sjkoshy 63185363Sjkoshy/* 64185363Sjkoshy * "Architectural" events defined by Intel. The values of these 65185363Sjkoshy * symbols correspond to positions in the bitmask returned by 66185363Sjkoshy * the CPUID.0AH instruction. 67185363Sjkoshy */ 68185363Sjkoshyenum core_arch_events { 69185363Sjkoshy CORE_AE_BRANCH_INSTRUCTION_RETIRED = 5, 70185363Sjkoshy CORE_AE_BRANCH_MISSES_RETIRED = 6, 71185363Sjkoshy CORE_AE_INSTRUCTION_RETIRED = 1, 72185363Sjkoshy CORE_AE_LLC_MISSES = 4, 73185363Sjkoshy CORE_AE_LLC_REFERENCE = 3, 74185363Sjkoshy CORE_AE_UNHALTED_REFERENCE_CYCLES = 2, 75185363Sjkoshy CORE_AE_UNHALTED_CORE_CYCLES = 0 76185363Sjkoshy}; 77185363Sjkoshy 78185363Sjkoshystatic enum pmc_cputype core_cputype; 79185363Sjkoshy 80185363Sjkoshystruct core_cpu { 81185363Sjkoshy volatile uint32_t pc_resync; 82185363Sjkoshy volatile uint32_t pc_iafctrl; /* Fixed function control. */ 83185363Sjkoshy volatile uint64_t pc_globalctrl; /* Global control register. */ 84185363Sjkoshy struct pmc_hw pc_corepmcs[]; 85185363Sjkoshy}; 86185363Sjkoshy 87185363Sjkoshystatic struct core_cpu **core_pcpu; 88185363Sjkoshy 89185363Sjkoshystatic uint32_t core_architectural_events; 90185363Sjkoshystatic uint64_t core_pmcmask; 91185363Sjkoshy 92185363Sjkoshystatic int core_iaf_ri; /* relative index of fixed counters */ 93185363Sjkoshystatic int core_iaf_width; 94185363Sjkoshystatic int core_iaf_npmc; 95185363Sjkoshy 96185363Sjkoshystatic int core_iap_width; 97185363Sjkoshystatic int core_iap_npmc; 98185363Sjkoshy 99185363Sjkoshystatic int 100185363Sjkoshycore_pcpu_noop(struct pmc_mdep *md, int cpu) 101185363Sjkoshy{ 102185363Sjkoshy (void) md; 103185363Sjkoshy (void) cpu; 104185363Sjkoshy return (0); 105185363Sjkoshy} 106185363Sjkoshy 107185363Sjkoshystatic int 108185363Sjkoshycore_pcpu_init(struct pmc_mdep *md, int cpu) 109185363Sjkoshy{ 110185363Sjkoshy struct pmc_cpu *pc; 111185363Sjkoshy struct core_cpu *cc; 112185363Sjkoshy struct pmc_hw *phw; 113185363Sjkoshy int core_ri, n, npmc; 114185363Sjkoshy 115185363Sjkoshy KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), 116185363Sjkoshy ("[iaf,%d] insane cpu number %d", __LINE__, cpu)); 117185363Sjkoshy 118185363Sjkoshy PMCDBG(MDP,INI,1,"core-init cpu=%d", cpu); 119185363Sjkoshy 120185363Sjkoshy core_ri = md->pmd_classdep[PMC_MDEP_CLASS_INDEX_IAP].pcd_ri; 121185363Sjkoshy npmc = md->pmd_classdep[PMC_MDEP_CLASS_INDEX_IAP].pcd_num; 122185363Sjkoshy 123185363Sjkoshy if (core_cputype != PMC_CPU_INTEL_CORE) 124185363Sjkoshy npmc += md->pmd_classdep[PMC_MDEP_CLASS_INDEX_IAF].pcd_num; 125185363Sjkoshy 126185363Sjkoshy cc = malloc(sizeof(struct core_cpu) + npmc * sizeof(struct pmc_hw), 127185363Sjkoshy M_PMC, M_WAITOK | M_ZERO); 128185363Sjkoshy 129185363Sjkoshy core_pcpu[cpu] = cc; 130185363Sjkoshy pc = pmc_pcpu[cpu]; 131185363Sjkoshy 132185363Sjkoshy KASSERT(pc != NULL && cc != NULL, 133185363Sjkoshy ("[core,%d] NULL per-cpu structures cpu=%d", __LINE__, cpu)); 134185363Sjkoshy 135185363Sjkoshy for (n = 0, phw = cc->pc_corepmcs; n < npmc; n++, phw++) { 136185363Sjkoshy phw->phw_state = PMC_PHW_FLAG_IS_ENABLED | 137185363Sjkoshy PMC_PHW_CPU_TO_STATE(cpu) | 138185363Sjkoshy PMC_PHW_INDEX_TO_STATE(n + core_ri); 139185363Sjkoshy phw->phw_pmc = NULL; 140185363Sjkoshy pc->pc_hwpmcs[n + core_ri] = phw; 141185363Sjkoshy } 142185363Sjkoshy 143185363Sjkoshy return (0); 144185363Sjkoshy} 145185363Sjkoshy 146185363Sjkoshystatic int 147185363Sjkoshycore_pcpu_fini(struct pmc_mdep *md, int cpu) 148185363Sjkoshy{ 149185363Sjkoshy int core_ri, n, npmc; 150185363Sjkoshy struct pmc_cpu *pc; 151185363Sjkoshy struct core_cpu *cc; 152210012Sgnn uint64_t msr = 0; 153185363Sjkoshy 154185363Sjkoshy KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), 155185363Sjkoshy ("[core,%d] insane cpu number (%d)", __LINE__, cpu)); 156185363Sjkoshy 157185363Sjkoshy PMCDBG(MDP,INI,1,"core-pcpu-fini cpu=%d", cpu); 158185363Sjkoshy 159185363Sjkoshy if ((cc = core_pcpu[cpu]) == NULL) 160185363Sjkoshy return (0); 161185363Sjkoshy 162185363Sjkoshy core_pcpu[cpu] = NULL; 163185363Sjkoshy 164185363Sjkoshy pc = pmc_pcpu[cpu]; 165185363Sjkoshy 166185363Sjkoshy KASSERT(pc != NULL, ("[core,%d] NULL per-cpu %d state", __LINE__, 167185363Sjkoshy cpu)); 168185363Sjkoshy 169185363Sjkoshy npmc = md->pmd_classdep[PMC_MDEP_CLASS_INDEX_IAP].pcd_num; 170185363Sjkoshy core_ri = md->pmd_classdep[PMC_MDEP_CLASS_INDEX_IAP].pcd_ri; 171185363Sjkoshy 172210012Sgnn for (n = 0; n < npmc; n++) { 173210621Sgnn msr = rdmsr(IAP_EVSEL0 + n) & ~IAP_EVSEL_MASK; 174210621Sgnn wrmsr(IAP_EVSEL0 + n, msr); 175210012Sgnn } 176185363Sjkoshy 177185363Sjkoshy if (core_cputype != PMC_CPU_INTEL_CORE) { 178210621Sgnn msr = rdmsr(IAF_CTRL) & ~IAF_CTRL_MASK; 179210621Sgnn wrmsr(IAF_CTRL, msr); 180185363Sjkoshy npmc += md->pmd_classdep[PMC_MDEP_CLASS_INDEX_IAF].pcd_num; 181185363Sjkoshy } 182185363Sjkoshy 183185363Sjkoshy for (n = 0; n < npmc; n++) 184185363Sjkoshy pc->pc_hwpmcs[n + core_ri] = NULL; 185185363Sjkoshy 186185363Sjkoshy free(cc, M_PMC); 187185363Sjkoshy 188185363Sjkoshy return (0); 189185363Sjkoshy} 190185363Sjkoshy 191185363Sjkoshy/* 192185363Sjkoshy * Fixed function counters. 193185363Sjkoshy */ 194185363Sjkoshy 195185363Sjkoshystatic pmc_value_t 196185363Sjkoshyiaf_perfctr_value_to_reload_count(pmc_value_t v) 197185363Sjkoshy{ 198185363Sjkoshy v &= (1ULL << core_iaf_width) - 1; 199185363Sjkoshy return (1ULL << core_iaf_width) - v; 200185363Sjkoshy} 201185363Sjkoshy 202185363Sjkoshystatic pmc_value_t 203185363Sjkoshyiaf_reload_count_to_perfctr_value(pmc_value_t rlc) 204185363Sjkoshy{ 205185363Sjkoshy return (1ULL << core_iaf_width) - rlc; 206185363Sjkoshy} 207185363Sjkoshy 208185363Sjkoshystatic int 209185363Sjkoshyiaf_allocate_pmc(int cpu, int ri, struct pmc *pm, 210185363Sjkoshy const struct pmc_op_pmcallocate *a) 211185363Sjkoshy{ 212185363Sjkoshy enum pmc_event ev; 213185363Sjkoshy uint32_t caps, flags, validflags; 214185363Sjkoshy 215185363Sjkoshy KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), 216185363Sjkoshy ("[core,%d] illegal CPU %d", __LINE__, cpu)); 217185363Sjkoshy 218185363Sjkoshy PMCDBG(MDP,ALL,1, "iaf-allocate ri=%d reqcaps=0x%x", ri, pm->pm_caps); 219185363Sjkoshy 220185363Sjkoshy if (ri < 0 || ri > core_iaf_npmc) 221185363Sjkoshy return (EINVAL); 222185363Sjkoshy 223185363Sjkoshy caps = a->pm_caps; 224185363Sjkoshy 225185363Sjkoshy if (a->pm_class != PMC_CLASS_IAF || 226185363Sjkoshy (caps & IAF_PMC_CAPS) != caps) 227185363Sjkoshy return (EINVAL); 228185363Sjkoshy 229185363Sjkoshy ev = pm->pm_event; 230185363Sjkoshy if (ev < PMC_EV_IAF_FIRST || ev > PMC_EV_IAF_LAST) 231185363Sjkoshy return (EINVAL); 232185363Sjkoshy 233185363Sjkoshy if (ev == PMC_EV_IAF_INSTR_RETIRED_ANY && ri != 0) 234185363Sjkoshy return (EINVAL); 235185363Sjkoshy if (ev == PMC_EV_IAF_CPU_CLK_UNHALTED_CORE && ri != 1) 236185363Sjkoshy return (EINVAL); 237185363Sjkoshy if (ev == PMC_EV_IAF_CPU_CLK_UNHALTED_REF && ri != 2) 238185363Sjkoshy return (EINVAL); 239185363Sjkoshy 240185363Sjkoshy flags = a->pm_md.pm_iaf.pm_iaf_flags; 241185363Sjkoshy 242185363Sjkoshy validflags = IAF_MASK; 243185363Sjkoshy 244185363Sjkoshy if (core_cputype != PMC_CPU_INTEL_ATOM) 245185363Sjkoshy validflags &= ~IAF_ANY; 246185363Sjkoshy 247185363Sjkoshy if ((flags & ~validflags) != 0) 248185363Sjkoshy return (EINVAL); 249185363Sjkoshy 250185363Sjkoshy if (caps & PMC_CAP_INTERRUPT) 251185363Sjkoshy flags |= IAF_PMI; 252185363Sjkoshy if (caps & PMC_CAP_SYSTEM) 253185363Sjkoshy flags |= IAF_OS; 254185363Sjkoshy if (caps & PMC_CAP_USER) 255185363Sjkoshy flags |= IAF_USR; 256185363Sjkoshy if ((caps & (PMC_CAP_USER | PMC_CAP_SYSTEM)) == 0) 257185363Sjkoshy flags |= (IAF_OS | IAF_USR); 258185363Sjkoshy 259185363Sjkoshy pm->pm_md.pm_iaf.pm_iaf_ctrl = (flags << (ri * 4)); 260185363Sjkoshy 261185363Sjkoshy PMCDBG(MDP,ALL,2, "iaf-allocate config=0x%jx", 262185363Sjkoshy (uintmax_t) pm->pm_md.pm_iaf.pm_iaf_ctrl); 263185363Sjkoshy 264185363Sjkoshy return (0); 265185363Sjkoshy} 266185363Sjkoshy 267185363Sjkoshystatic int 268185363Sjkoshyiaf_config_pmc(int cpu, int ri, struct pmc *pm) 269185363Sjkoshy{ 270185363Sjkoshy KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), 271185363Sjkoshy ("[core,%d] illegal CPU %d", __LINE__, cpu)); 272185363Sjkoshy 273185363Sjkoshy KASSERT(ri >= 0 && ri < core_iaf_npmc, 274185363Sjkoshy ("[core,%d] illegal row-index %d", __LINE__, ri)); 275185363Sjkoshy 276185363Sjkoshy PMCDBG(MDP,CFG,1, "iaf-config cpu=%d ri=%d pm=%p", cpu, ri, pm); 277185363Sjkoshy 278185363Sjkoshy KASSERT(core_pcpu[cpu] != NULL, ("[core,%d] null per-cpu %d", __LINE__, 279185363Sjkoshy cpu)); 280185363Sjkoshy 281185363Sjkoshy core_pcpu[cpu]->pc_corepmcs[ri + core_iaf_ri].phw_pmc = pm; 282185363Sjkoshy 283185363Sjkoshy return (0); 284185363Sjkoshy} 285185363Sjkoshy 286185363Sjkoshystatic int 287185363Sjkoshyiaf_describe(int cpu, int ri, struct pmc_info *pi, struct pmc **ppmc) 288185363Sjkoshy{ 289185363Sjkoshy int error; 290185363Sjkoshy struct pmc_hw *phw; 291185363Sjkoshy char iaf_name[PMC_NAME_MAX]; 292185363Sjkoshy 293185363Sjkoshy phw = &core_pcpu[cpu]->pc_corepmcs[ri + core_iaf_ri]; 294185363Sjkoshy 295185363Sjkoshy (void) snprintf(iaf_name, sizeof(iaf_name), "IAF-%d", ri); 296185363Sjkoshy if ((error = copystr(iaf_name, pi->pm_name, PMC_NAME_MAX, 297185363Sjkoshy NULL)) != 0) 298185363Sjkoshy return (error); 299185363Sjkoshy 300185363Sjkoshy pi->pm_class = PMC_CLASS_IAF; 301185363Sjkoshy 302185363Sjkoshy if (phw->phw_state & PMC_PHW_FLAG_IS_ENABLED) { 303185363Sjkoshy pi->pm_enabled = TRUE; 304185363Sjkoshy *ppmc = phw->phw_pmc; 305185363Sjkoshy } else { 306185363Sjkoshy pi->pm_enabled = FALSE; 307185363Sjkoshy *ppmc = NULL; 308185363Sjkoshy } 309185363Sjkoshy 310185363Sjkoshy return (0); 311185363Sjkoshy} 312185363Sjkoshy 313185363Sjkoshystatic int 314185363Sjkoshyiaf_get_config(int cpu, int ri, struct pmc **ppm) 315185363Sjkoshy{ 316185363Sjkoshy *ppm = core_pcpu[cpu]->pc_corepmcs[ri + core_iaf_ri].phw_pmc; 317185363Sjkoshy 318185363Sjkoshy return (0); 319185363Sjkoshy} 320185363Sjkoshy 321185363Sjkoshystatic int 322185363Sjkoshyiaf_get_msr(int ri, uint32_t *msr) 323185363Sjkoshy{ 324185363Sjkoshy KASSERT(ri >= 0 && ri < core_iaf_npmc, 325185363Sjkoshy ("[iaf,%d] ri %d out of range", __LINE__, ri)); 326185363Sjkoshy 327185363Sjkoshy *msr = IAF_RI_TO_MSR(ri); 328185363Sjkoshy 329185363Sjkoshy return (0); 330185363Sjkoshy} 331185363Sjkoshy 332185363Sjkoshystatic int 333185363Sjkoshyiaf_read_pmc(int cpu, int ri, pmc_value_t *v) 334185363Sjkoshy{ 335185363Sjkoshy struct pmc *pm; 336185363Sjkoshy pmc_value_t tmp; 337185363Sjkoshy 338185363Sjkoshy KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), 339185363Sjkoshy ("[core,%d] illegal cpu value %d", __LINE__, cpu)); 340185363Sjkoshy KASSERT(ri >= 0 && ri < core_iaf_npmc, 341185363Sjkoshy ("[core,%d] illegal row-index %d", __LINE__, ri)); 342185363Sjkoshy 343185363Sjkoshy pm = core_pcpu[cpu]->pc_corepmcs[ri + core_iaf_ri].phw_pmc; 344185363Sjkoshy 345185363Sjkoshy KASSERT(pm, 346185363Sjkoshy ("[core,%d] cpu %d ri %d(%d) pmc not configured", __LINE__, cpu, 347185363Sjkoshy ri, ri + core_iaf_ri)); 348185363Sjkoshy 349185363Sjkoshy tmp = rdpmc(IAF_RI_TO_MSR(ri)); 350185363Sjkoshy 351185363Sjkoshy if (PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm))) 352185363Sjkoshy *v = iaf_perfctr_value_to_reload_count(tmp); 353185363Sjkoshy else 354185363Sjkoshy *v = tmp; 355185363Sjkoshy 356185363Sjkoshy PMCDBG(MDP,REA,1, "iaf-read cpu=%d ri=%d msr=0x%x -> v=%jx", cpu, ri, 357185363Sjkoshy IAF_RI_TO_MSR(ri), *v); 358185363Sjkoshy 359185363Sjkoshy return (0); 360185363Sjkoshy} 361185363Sjkoshy 362185363Sjkoshystatic int 363185363Sjkoshyiaf_release_pmc(int cpu, int ri, struct pmc *pmc) 364185363Sjkoshy{ 365185363Sjkoshy PMCDBG(MDP,REL,1, "iaf-release cpu=%d ri=%d pm=%p", cpu, ri, pmc); 366185363Sjkoshy 367185363Sjkoshy KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), 368185363Sjkoshy ("[core,%d] illegal CPU value %d", __LINE__, cpu)); 369185363Sjkoshy KASSERT(ri >= 0 && ri < core_iaf_npmc, 370185363Sjkoshy ("[core,%d] illegal row-index %d", __LINE__, ri)); 371185363Sjkoshy 372185363Sjkoshy KASSERT(core_pcpu[cpu]->pc_corepmcs[ri + core_iaf_ri].phw_pmc == NULL, 373185363Sjkoshy ("[core,%d] PHW pmc non-NULL", __LINE__)); 374185363Sjkoshy 375185363Sjkoshy return (0); 376185363Sjkoshy} 377185363Sjkoshy 378185363Sjkoshystatic int 379185363Sjkoshyiaf_start_pmc(int cpu, int ri) 380185363Sjkoshy{ 381185363Sjkoshy struct pmc *pm; 382185363Sjkoshy struct core_cpu *iafc; 383210012Sgnn uint64_t msr = 0; 384185363Sjkoshy 385185363Sjkoshy KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), 386185363Sjkoshy ("[core,%d] illegal CPU value %d", __LINE__, cpu)); 387185363Sjkoshy KASSERT(ri >= 0 && ri < core_iaf_npmc, 388185363Sjkoshy ("[core,%d] illegal row-index %d", __LINE__, ri)); 389185363Sjkoshy 390185363Sjkoshy PMCDBG(MDP,STA,1,"iaf-start cpu=%d ri=%d", cpu, ri); 391185363Sjkoshy 392185363Sjkoshy iafc = core_pcpu[cpu]; 393185363Sjkoshy pm = iafc->pc_corepmcs[ri + core_iaf_ri].phw_pmc; 394185363Sjkoshy 395185363Sjkoshy iafc->pc_iafctrl |= pm->pm_md.pm_iaf.pm_iaf_ctrl; 396185363Sjkoshy 397210621Sgnn msr = rdmsr(IAF_CTRL) & ~IAF_CTRL_MASK; 398210012Sgnn wrmsr(IAF_CTRL, msr | (iafc->pc_iafctrl & IAF_CTRL_MASK)); 399185363Sjkoshy 400185363Sjkoshy do { 401185363Sjkoshy iafc->pc_resync = 0; 402185363Sjkoshy iafc->pc_globalctrl |= (1ULL << (ri + IAF_OFFSET)); 403210621Sgnn msr = rdmsr(IA_GLOBAL_CTRL) & ~IAF_GLOBAL_CTRL_MASK; 404210012Sgnn wrmsr(IA_GLOBAL_CTRL, msr | (iafc->pc_globalctrl & 405210012Sgnn IAF_GLOBAL_CTRL_MASK)); 406185363Sjkoshy } while (iafc->pc_resync != 0); 407185363Sjkoshy 408185363Sjkoshy PMCDBG(MDP,STA,1,"iafctrl=%x(%x) globalctrl=%jx(%jx)", 409185363Sjkoshy iafc->pc_iafctrl, (uint32_t) rdmsr(IAF_CTRL), 410185363Sjkoshy iafc->pc_globalctrl, rdmsr(IA_GLOBAL_CTRL)); 411185363Sjkoshy 412185363Sjkoshy return (0); 413185363Sjkoshy} 414185363Sjkoshy 415185363Sjkoshystatic int 416185363Sjkoshyiaf_stop_pmc(int cpu, int ri) 417185363Sjkoshy{ 418185363Sjkoshy uint32_t fc; 419185363Sjkoshy struct core_cpu *iafc; 420210012Sgnn uint64_t msr = 0; 421185363Sjkoshy 422185363Sjkoshy PMCDBG(MDP,STO,1,"iaf-stop cpu=%d ri=%d", cpu, ri); 423185363Sjkoshy 424185363Sjkoshy iafc = core_pcpu[cpu]; 425185363Sjkoshy 426185363Sjkoshy KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), 427185363Sjkoshy ("[core,%d] illegal CPU value %d", __LINE__, cpu)); 428185363Sjkoshy KASSERT(ri >= 0 && ri < core_iaf_npmc, 429185363Sjkoshy ("[core,%d] illegal row-index %d", __LINE__, ri)); 430185363Sjkoshy 431185363Sjkoshy fc = (IAF_MASK << (ri * 4)); 432185363Sjkoshy 433185363Sjkoshy if (core_cputype != PMC_CPU_INTEL_ATOM) 434185363Sjkoshy fc &= ~IAF_ANY; 435185363Sjkoshy 436185363Sjkoshy iafc->pc_iafctrl &= ~fc; 437185363Sjkoshy 438185363Sjkoshy PMCDBG(MDP,STO,1,"iaf-stop iafctrl=%x", iafc->pc_iafctrl); 439210621Sgnn msr = rdmsr(IAF_CTRL) & ~IAF_CTRL_MASK; 440210012Sgnn wrmsr(IAF_CTRL, msr | (iafc->pc_iafctrl & IAF_CTRL_MASK)); 441185363Sjkoshy 442185363Sjkoshy do { 443185363Sjkoshy iafc->pc_resync = 0; 444185363Sjkoshy iafc->pc_globalctrl &= ~(1ULL << (ri + IAF_OFFSET)); 445210621Sgnn msr = rdmsr(IA_GLOBAL_CTRL) & ~IAF_GLOBAL_CTRL_MASK; 446210012Sgnn wrmsr(IA_GLOBAL_CTRL, msr | (iafc->pc_globalctrl & 447210012Sgnn IAF_GLOBAL_CTRL_MASK)); 448185363Sjkoshy } while (iafc->pc_resync != 0); 449185363Sjkoshy 450185363Sjkoshy PMCDBG(MDP,STO,1,"iafctrl=%x(%x) globalctrl=%jx(%jx)", 451185363Sjkoshy iafc->pc_iafctrl, (uint32_t) rdmsr(IAF_CTRL), 452185363Sjkoshy iafc->pc_globalctrl, rdmsr(IA_GLOBAL_CTRL)); 453185363Sjkoshy 454185363Sjkoshy return (0); 455185363Sjkoshy} 456185363Sjkoshy 457185363Sjkoshystatic int 458185363Sjkoshyiaf_write_pmc(int cpu, int ri, pmc_value_t v) 459185363Sjkoshy{ 460185363Sjkoshy struct core_cpu *cc; 461185363Sjkoshy struct pmc *pm; 462210012Sgnn uint64_t msr; 463185363Sjkoshy 464185363Sjkoshy KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), 465185363Sjkoshy ("[core,%d] illegal cpu value %d", __LINE__, cpu)); 466185363Sjkoshy KASSERT(ri >= 0 && ri < core_iaf_npmc, 467185363Sjkoshy ("[core,%d] illegal row-index %d", __LINE__, ri)); 468185363Sjkoshy 469185363Sjkoshy cc = core_pcpu[cpu]; 470185363Sjkoshy pm = cc->pc_corepmcs[ri + core_iaf_ri].phw_pmc; 471185363Sjkoshy 472185363Sjkoshy KASSERT(pm, 473185363Sjkoshy ("[core,%d] cpu %d ri %d pmc not configured", __LINE__, cpu, ri)); 474185363Sjkoshy 475185363Sjkoshy if (PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm))) 476185363Sjkoshy v = iaf_reload_count_to_perfctr_value(v); 477185363Sjkoshy 478210621Sgnn /* Turn off fixed counters */ 479210621Sgnn msr = rdmsr(IAF_CTRL) & ~IAF_CTRL_MASK; 480210621Sgnn wrmsr(IAF_CTRL, msr); 481210621Sgnn 482210012Sgnn wrmsr(IAF_CTR0 + ri, v & ((1ULL << core_iaf_width) - 1)); 483210621Sgnn 484210621Sgnn /* Turn on fixed counters */ 485210621Sgnn msr = rdmsr(IAF_CTRL) & ~IAF_CTRL_MASK; 486210012Sgnn wrmsr(IAF_CTRL, msr | (cc->pc_iafctrl & IAF_CTRL_MASK)); 487185363Sjkoshy 488185363Sjkoshy PMCDBG(MDP,WRI,1, "iaf-write cpu=%d ri=%d msr=0x%x v=%jx iafctrl=%jx " 489185363Sjkoshy "pmc=%jx", cpu, ri, IAF_RI_TO_MSR(ri), v, 490185363Sjkoshy (uintmax_t) rdmsr(IAF_CTRL), 491185363Sjkoshy (uintmax_t) rdpmc(IAF_RI_TO_MSR(ri))); 492185363Sjkoshy 493185363Sjkoshy return (0); 494185363Sjkoshy} 495185363Sjkoshy 496185363Sjkoshy 497185363Sjkoshystatic void 498185363Sjkoshyiaf_initialize(struct pmc_mdep *md, int maxcpu, int npmc, int pmcwidth) 499185363Sjkoshy{ 500185363Sjkoshy struct pmc_classdep *pcd; 501185363Sjkoshy 502185363Sjkoshy KASSERT(md != NULL, ("[iaf,%d] md is NULL", __LINE__)); 503185363Sjkoshy 504185363Sjkoshy PMCDBG(MDP,INI,1, "%s", "iaf-initialize"); 505185363Sjkoshy 506185363Sjkoshy pcd = &md->pmd_classdep[PMC_MDEP_CLASS_INDEX_IAF]; 507185363Sjkoshy 508185363Sjkoshy pcd->pcd_caps = IAF_PMC_CAPS; 509185363Sjkoshy pcd->pcd_class = PMC_CLASS_IAF; 510185363Sjkoshy pcd->pcd_num = npmc; 511185363Sjkoshy pcd->pcd_ri = md->pmd_npmc; 512185363Sjkoshy pcd->pcd_width = pmcwidth; 513185363Sjkoshy 514185363Sjkoshy pcd->pcd_allocate_pmc = iaf_allocate_pmc; 515185363Sjkoshy pcd->pcd_config_pmc = iaf_config_pmc; 516185363Sjkoshy pcd->pcd_describe = iaf_describe; 517185363Sjkoshy pcd->pcd_get_config = iaf_get_config; 518185363Sjkoshy pcd->pcd_get_msr = iaf_get_msr; 519185363Sjkoshy pcd->pcd_pcpu_fini = core_pcpu_noop; 520185363Sjkoshy pcd->pcd_pcpu_init = core_pcpu_noop; 521185363Sjkoshy pcd->pcd_read_pmc = iaf_read_pmc; 522185363Sjkoshy pcd->pcd_release_pmc = iaf_release_pmc; 523185363Sjkoshy pcd->pcd_start_pmc = iaf_start_pmc; 524185363Sjkoshy pcd->pcd_stop_pmc = iaf_stop_pmc; 525185363Sjkoshy pcd->pcd_write_pmc = iaf_write_pmc; 526185363Sjkoshy 527185363Sjkoshy md->pmd_npmc += npmc; 528185363Sjkoshy} 529185363Sjkoshy 530185363Sjkoshy/* 531185363Sjkoshy * Intel programmable PMCs. 532185363Sjkoshy */ 533185363Sjkoshy 534185363Sjkoshy/* 535185363Sjkoshy * Event descriptor tables. 536185363Sjkoshy * 537185363Sjkoshy * For each event id, we track: 538185363Sjkoshy * 539185363Sjkoshy * 1. The CPUs that the event is valid for. 540185363Sjkoshy * 541185363Sjkoshy * 2. If the event uses a fixed UMASK, the value of the umask field. 542185363Sjkoshy * If the event doesn't use a fixed UMASK, a mask of legal bits 543185363Sjkoshy * to check against. 544185363Sjkoshy */ 545185363Sjkoshy 546185363Sjkoshystruct iap_event_descr { 547185363Sjkoshy enum pmc_event iap_ev; 548185363Sjkoshy unsigned char iap_evcode; 549185363Sjkoshy unsigned char iap_umask; 550241609Sfabient unsigned int iap_flags; 551185363Sjkoshy}; 552185363Sjkoshy 553185363Sjkoshy#define IAP_F_CC (1 << 0) /* CPU: Core */ 554185585Sjkoshy#define IAP_F_CC2 (1 << 1) /* CPU: Core2 family */ 555185585Sjkoshy#define IAP_F_CC2E (1 << 2) /* CPU: Core2 Extreme only */ 556185363Sjkoshy#define IAP_F_CA (1 << 3) /* CPU: Atom */ 557187761Sjeff#define IAP_F_I7 (1 << 4) /* CPU: Core i7 */ 558206089Sfabient#define IAP_F_I7O (1 << 4) /* CPU: Core i7 (old) */ 559206089Sfabient#define IAP_F_WM (1 << 5) /* CPU: Westmere */ 560241609Sfabient#define IAP_F_SB (1 << 6) /* CPU: Sandy Bridge */ 561241609Sfabient#define IAP_F_IB (1 << 7) /* CPU: Ivy Bridge */ 562242594Ssbruno#define IAP_F_SBX (1 << 8) /* CPU: Sandy Bridge Xeon */ 563250038Shiren#define IAP_F_IBX (1 << 9) /* CPU: Ivy Bridge Xeon */ 564249655Shiren#define IAP_F_HW (1 << 10) /* CPU: Haswell */ 565249655Shiren#define IAP_F_FM (1 << 11) /* Fixed mask */ 566185363Sjkoshy 567206089Sfabient#define IAP_F_ALLCPUSCORE2 \ 568206089Sfabient (IAP_F_CC | IAP_F_CC2 | IAP_F_CC2E | IAP_F_CA) 569185363Sjkoshy 570185363Sjkoshy/* Sub fields of UMASK that this event supports. */ 571185363Sjkoshy#define IAP_M_CORE (1 << 0) /* Core specificity */ 572185363Sjkoshy#define IAP_M_AGENT (1 << 1) /* Agent specificity */ 573185363Sjkoshy#define IAP_M_PREFETCH (1 << 2) /* Prefetch */ 574185363Sjkoshy#define IAP_M_MESI (1 << 3) /* MESI */ 575185363Sjkoshy#define IAP_M_SNOOPRESPONSE (1 << 4) /* Snoop response */ 576185363Sjkoshy#define IAP_M_SNOOPTYPE (1 << 5) /* Snoop type */ 577185363Sjkoshy#define IAP_M_TRANSITION (1 << 6) /* Transition */ 578185363Sjkoshy 579185363Sjkoshy#define IAP_F_CORE (0x3 << 14) /* Core specificity */ 580185363Sjkoshy#define IAP_F_AGENT (0x1 << 13) /* Agent specificity */ 581185363Sjkoshy#define IAP_F_PREFETCH (0x3 << 12) /* Prefetch */ 582185363Sjkoshy#define IAP_F_MESI (0xF << 8) /* MESI */ 583185363Sjkoshy#define IAP_F_SNOOPRESPONSE (0xB << 8) /* Snoop response */ 584185363Sjkoshy#define IAP_F_SNOOPTYPE (0x3 << 8) /* Snoop type */ 585185363Sjkoshy#define IAP_F_TRANSITION (0x1 << 12) /* Transition */ 586185363Sjkoshy 587185363Sjkoshy#define IAP_PREFETCH_RESERVED (0x2 << 12) 588185363Sjkoshy#define IAP_CORE_THIS (0x1 << 14) 589185363Sjkoshy#define IAP_CORE_ALL (0x3 << 14) 590185363Sjkoshy#define IAP_F_CMASK 0xFF000000 591185363Sjkoshy 592185363Sjkoshystatic struct iap_event_descr iap_events[] = { 593185363Sjkoshy#undef IAPDESCR 594185363Sjkoshy#define IAPDESCR(N,EV,UM,FLAGS) { \ 595185363Sjkoshy .iap_ev = PMC_EV_IAP_EVENT_##N, \ 596185363Sjkoshy .iap_evcode = (EV), \ 597185363Sjkoshy .iap_umask = (UM), \ 598185363Sjkoshy .iap_flags = (FLAGS) \ 599185363Sjkoshy } 600185363Sjkoshy 601206089Sfabient IAPDESCR(02H_01H, 0x02, 0x01, IAP_F_FM | IAP_F_I7O), 602185363Sjkoshy IAPDESCR(02H_81H, 0x02, 0x81, IAP_F_FM | IAP_F_CA), 603185363Sjkoshy 604185363Sjkoshy IAPDESCR(03H_00H, 0x03, 0x00, IAP_F_FM | IAP_F_CC), 605242594Ssbruno IAPDESCR(03H_01H, 0x03, 0x01, IAP_F_FM | IAP_F_I7O | IAP_F_SB | 606242594Ssbruno IAP_F_SBX), 607250038Shiren IAPDESCR(03H_02H, 0x03, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 608249655Shiren IAP_F_WM | IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 609206089Sfabient IAPDESCR(03H_04H, 0x03, 0x04, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | IAP_F_I7O), 610242594Ssbruno IAPDESCR(03H_08H, 0x03, 0x08, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | IAP_F_SB | 611242594Ssbruno IAP_F_SBX), 612242594Ssbruno IAPDESCR(03H_10H, 0x03, 0x10, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | IAP_F_SB | 613242594Ssbruno IAP_F_SBX), 614185363Sjkoshy IAPDESCR(03H_20H, 0x03, 0x20, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 615185363Sjkoshy 616185363Sjkoshy IAPDESCR(04H_00H, 0x04, 0x00, IAP_F_FM | IAP_F_CC), 617206089Sfabient IAPDESCR(04H_01H, 0x04, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | IAP_F_I7O), 618185363Sjkoshy IAPDESCR(04H_02H, 0x04, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 619206089Sfabient IAPDESCR(04H_07H, 0x04, 0x07, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 620185363Sjkoshy IAPDESCR(04H_08H, 0x04, 0x08, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 621185363Sjkoshy 622185363Sjkoshy IAPDESCR(05H_00H, 0x05, 0x00, IAP_F_FM | IAP_F_CC), 623242594Ssbruno IAPDESCR(05H_01H, 0x05, 0x01, IAP_F_FM | IAP_F_I7O | IAP_F_SB | IAP_F_IB | 624249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 625250038Shiren IAPDESCR(05H_02H, 0x05, 0x02, IAP_F_FM | IAP_F_I7O | IAP_F_WM | IAP_F_SB | 626250038Shiren IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 627206089Sfabient IAPDESCR(05H_03H, 0x05, 0x03, IAP_F_FM | IAP_F_I7O), 628185363Sjkoshy 629206089Sfabient IAPDESCR(06H_00H, 0x06, 0x00, IAP_F_FM | IAP_F_CC | IAP_F_CC2 | 630206089Sfabient IAP_F_CC2E | IAP_F_CA), 631206089Sfabient IAPDESCR(06H_01H, 0x06, 0x01, IAP_F_FM | IAP_F_I7O), 632206089Sfabient IAPDESCR(06H_02H, 0x06, 0x02, IAP_F_FM | IAP_F_I7O), 633206089Sfabient IAPDESCR(06H_04H, 0x06, 0x04, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 634206089Sfabient IAPDESCR(06H_08H, 0x06, 0x08, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 635206089Sfabient IAPDESCR(06H_0FH, 0x06, 0x0F, IAP_F_FM | IAP_F_I7O), 636185363Sjkoshy 637185363Sjkoshy IAPDESCR(07H_00H, 0x07, 0x00, IAP_F_FM | IAP_F_CC | IAP_F_CC2), 638250038Shiren IAPDESCR(07H_01H, 0x07, 0x01, IAP_F_FM | IAP_F_ALLCPUSCORE2 | 639249655Shiren IAP_F_I7 | IAP_F_WM | IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | 640249655Shiren IAP_F_HW), 641206089Sfabient IAPDESCR(07H_02H, 0x07, 0x02, IAP_F_FM | IAP_F_ALLCPUSCORE2), 642206089Sfabient IAPDESCR(07H_03H, 0x07, 0x03, IAP_F_FM | IAP_F_ALLCPUSCORE2), 643185363Sjkoshy IAPDESCR(07H_06H, 0x07, 0x06, IAP_F_FM | IAP_F_CA), 644242594Ssbruno IAPDESCR(07H_08H, 0x07, 0x08, IAP_F_FM | IAP_F_CA | IAP_F_SB | 645242594Ssbruno IAP_F_SBX), 646185363Sjkoshy 647206089Sfabient IAPDESCR(08H_01H, 0x08, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 648249655Shiren IAP_F_I7 | IAP_F_WM | IAP_F_SB | IAP_F_SBX | IAP_F_HW), 649206089Sfabient IAPDESCR(08H_02H, 0x08, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 650249655Shiren IAP_F_I7 | IAP_F_WM | IAP_F_SB | IAP_F_SBX | IAP_F_HW), 651206089Sfabient IAPDESCR(08H_04H, 0x08, 0x04, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 652249655Shiren IAP_F_WM | IAP_F_SB | IAP_F_SBX | IAP_F_HW), 653185363Sjkoshy IAPDESCR(08H_05H, 0x08, 0x05, IAP_F_FM | IAP_F_CA), 654185363Sjkoshy IAPDESCR(08H_06H, 0x08, 0x06, IAP_F_FM | IAP_F_CA), 655185363Sjkoshy IAPDESCR(08H_07H, 0x08, 0x07, IAP_F_FM | IAP_F_CA), 656185363Sjkoshy IAPDESCR(08H_08H, 0x08, 0x08, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 657185363Sjkoshy IAPDESCR(08H_09H, 0x08, 0x09, IAP_F_FM | IAP_F_CA), 658249655Shiren IAPDESCR(08H_0EH, 0x08, 0x0E, IAP_F_FM | IAP_F_HW), 659242594Ssbruno IAPDESCR(08H_10H, 0x08, 0x10, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 660249655Shiren IAP_F_SBX | IAP_F_HW), 661249655Shiren IAPDESCR(08H_20H, 0x08, 0x20, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_HW), 662249655Shiren IAPDESCR(08H_40H, 0x08, 0x40, IAP_F_FM | IAP_F_I7O | IAP_F_HW), 663249655Shiren IAPDESCR(08H_60H, 0x08, 0x60, IAP_F_FM | IAP_F_HW), 664249655Shiren IAPDESCR(08H_80H, 0x08, 0x80, IAP_F_FM | IAP_F_I7 | IAP_F_HW), 665249492Shiren IAPDESCR(08H_81H, 0x08, 0x81, IAP_F_FM | IAP_F_IB | IAP_F_IBX), 666249492Shiren IAPDESCR(08H_82H, 0x08, 0x82, IAP_F_FM | IAP_F_IB | IAP_F_IBX), 667249492Shiren IAPDESCR(08H_84H, 0x08, 0x84, IAP_F_FM | IAP_F_IB | IAP_F_IBX), 668185363Sjkoshy 669206089Sfabient IAPDESCR(09H_01H, 0x09, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | IAP_F_I7O), 670206089Sfabient IAPDESCR(09H_02H, 0x09, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | IAP_F_I7O), 671206089Sfabient IAPDESCR(09H_04H, 0x09, 0x04, IAP_F_FM | IAP_F_I7O), 672206089Sfabient IAPDESCR(09H_08H, 0x09, 0x08, IAP_F_FM | IAP_F_I7O), 673185363Sjkoshy 674206089Sfabient IAPDESCR(0BH_01H, 0x0B, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 675206089Sfabient IAPDESCR(0BH_02H, 0x0B, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 676206089Sfabient IAPDESCR(0BH_10H, 0x0B, 0x10, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 677206089Sfabient 678206089Sfabient IAPDESCR(0CH_01H, 0x0C, 0x01, IAP_F_FM | IAP_F_CC2 | IAP_F_I7 | 679206089Sfabient IAP_F_WM), 680185363Sjkoshy IAPDESCR(0CH_02H, 0x0C, 0x02, IAP_F_FM | IAP_F_CC2), 681185363Sjkoshy IAPDESCR(0CH_03H, 0x0C, 0x03, IAP_F_FM | IAP_F_CA), 682185363Sjkoshy 683249655Shiren IAPDESCR(0DH_03H, 0x0D, 0x03, IAP_F_FM | IAP_F_SB | IAP_F_SBX | IAP_F_HW), 684242594Ssbruno IAPDESCR(0DH_40H, 0x0D, 0x40, IAP_F_FM | IAP_F_SB | IAP_F_SBX), 685234046Sdavide 686250038Shiren IAPDESCR(0EH_01H, 0x0E, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 687250038Shiren IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 688206089Sfabient IAPDESCR(0EH_02H, 0x0E, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 689249655Shiren IAPDESCR(0EH_10H, 0x0E, 0x10, IAP_F_FM | IAP_F_IB | IAP_F_IBX | IAP_F_HW), 690249655Shiren IAPDESCR(0EH_20H, 0x0E, 0x20, IAP_F_FM | IAP_F_IB | IAP_F_IBX | IAP_F_HW), 691249655Shiren IAPDESCR(0EH_40H, 0x0E, 0x40, IAP_F_FM | IAP_F_IB | IAP_F_IBX | IAP_F_HW), 692206089Sfabient 693206089Sfabient IAPDESCR(0FH_01H, 0x0F, 0x01, IAP_F_FM | IAP_F_I7), 694206089Sfabient IAPDESCR(0FH_02H, 0x0F, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 695206089Sfabient IAPDESCR(0FH_08H, 0x0F, 0x08, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 696206089Sfabient IAPDESCR(0FH_10H, 0x0F, 0x10, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 697206089Sfabient IAPDESCR(0FH_20H, 0x0F, 0x20, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 698206089Sfabient IAPDESCR(0FH_80H, 0x0F, 0x80, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 699206089Sfabient 700206089Sfabient IAPDESCR(10H_00H, 0x10, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 701250038Shiren IAPDESCR(10H_01H, 0x10, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_I7 | 702242594Ssbruno IAP_F_WM | IAP_F_SB | IAP_F_SBX), 703206089Sfabient IAPDESCR(10H_02H, 0x10, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 704206089Sfabient IAPDESCR(10H_04H, 0x10, 0x04, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 705206089Sfabient IAPDESCR(10H_08H, 0x10, 0x08, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 706242594Ssbruno IAPDESCR(10H_10H, 0x10, 0x10, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 707242594Ssbruno IAP_F_SBX), 708242594Ssbruno IAPDESCR(10H_20H, 0x10, 0x20, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 709242594Ssbruno IAP_F_SBX), 710242594Ssbruno IAPDESCR(10H_40H, 0x10, 0x40, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 711242594Ssbruno IAP_F_SBX), 712242594Ssbruno IAPDESCR(10H_80H, 0x10, 0x80, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 713242594Ssbruno IAP_F_SBX), 714185363Sjkoshy IAPDESCR(10H_81H, 0x10, 0x81, IAP_F_FM | IAP_F_CA), 715185363Sjkoshy 716185363Sjkoshy IAPDESCR(11H_00H, 0x11, 0x00, IAP_F_FM | IAP_F_CC | IAP_F_CC2), 717242594Ssbruno IAPDESCR(11H_01H, 0x11, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_SB | 718242594Ssbruno IAP_F_SBX), 719242594Ssbruno IAPDESCR(11H_02H, 0x11, 0x02, IAP_F_FM | IAP_F_SB | IAP_F_SBX), 720185363Sjkoshy IAPDESCR(11H_81H, 0x11, 0x81, IAP_F_FM | IAP_F_CA), 721185363Sjkoshy 722206089Sfabient IAPDESCR(12H_00H, 0x12, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 723206089Sfabient IAPDESCR(12H_01H, 0x12, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_I7 | IAP_F_WM), 724206089Sfabient IAPDESCR(12H_02H, 0x12, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 725206089Sfabient IAPDESCR(12H_04H, 0x12, 0x04, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 726206089Sfabient IAPDESCR(12H_08H, 0x12, 0x08, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 727206089Sfabient IAPDESCR(12H_10H, 0x12, 0x10, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 728206089Sfabient IAPDESCR(12H_20H, 0x12, 0x20, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 729206089Sfabient IAPDESCR(12H_40H, 0x12, 0x40, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 730185363Sjkoshy IAPDESCR(12H_81H, 0x12, 0x81, IAP_F_FM | IAP_F_CA), 731185363Sjkoshy 732206089Sfabient IAPDESCR(13H_00H, 0x13, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 733206089Sfabient IAPDESCR(13H_01H, 0x13, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_I7 | IAP_F_WM), 734206089Sfabient IAPDESCR(13H_02H, 0x13, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 735206089Sfabient IAPDESCR(13H_04H, 0x13, 0x04, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 736206089Sfabient IAPDESCR(13H_07H, 0x13, 0x07, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 737185363Sjkoshy IAPDESCR(13H_81H, 0x13, 0x81, IAP_F_FM | IAP_F_CA), 738185363Sjkoshy 739185363Sjkoshy IAPDESCR(14H_00H, 0x14, 0x00, IAP_F_FM | IAP_F_CC | IAP_F_CC2), 740250038Shiren IAPDESCR(14H_01H, 0x14, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_I7 | 741249492Shiren IAP_F_WM | IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 742206089Sfabient IAPDESCR(14H_02H, 0x14, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 743185363Sjkoshy 744242594Ssbruno IAPDESCR(17H_01H, 0x17, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 745242594Ssbruno IAP_F_SBX), 746206089Sfabient 747185363Sjkoshy IAPDESCR(18H_00H, 0x18, 0x00, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 748206089Sfabient IAPDESCR(18H_01H, 0x18, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 749185363Sjkoshy 750185363Sjkoshy IAPDESCR(19H_00H, 0x19, 0x00, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 751206089Sfabient IAPDESCR(19H_01H, 0x19, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 752206089Sfabient IAP_F_I7 | IAP_F_WM), 753185363Sjkoshy IAPDESCR(19H_02H, 0x19, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 754185363Sjkoshy 755206089Sfabient IAPDESCR(1DH_01H, 0x1D, 0x01, IAP_F_FM | IAP_F_I7O), 756206089Sfabient IAPDESCR(1DH_02H, 0x1D, 0x02, IAP_F_FM | IAP_F_I7O), 757206089Sfabient IAPDESCR(1DH_04H, 0x1D, 0x04, IAP_F_FM | IAP_F_I7O), 758206089Sfabient 759206089Sfabient IAPDESCR(1EH_01H, 0x1E, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 760206089Sfabient 761206089Sfabient IAPDESCR(20H_01H, 0x20, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 762206089Sfabient IAPDESCR(21H, 0x21, IAP_M_CORE, IAP_F_ALLCPUSCORE2), 763185363Sjkoshy IAPDESCR(22H, 0x22, IAP_M_CORE, IAP_F_CC2), 764206089Sfabient IAPDESCR(23H, 0x23, IAP_M_CORE, IAP_F_ALLCPUSCORE2), 765206089Sfabient 766206089Sfabient IAPDESCR(24H, 0x24, IAP_M_CORE | IAP_M_PREFETCH, IAP_F_ALLCPUSCORE2), 767250038Shiren IAPDESCR(24H_01H, 0x24, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 768250038Shiren IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 769206089Sfabient IAPDESCR(24H_02H, 0x24, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 770250038Shiren IAPDESCR(24H_03H, 0x24, 0x03, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 771250038Shiren IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 772250038Shiren IAPDESCR(24H_04H, 0x24, 0x04, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 773250038Shiren IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 774250038Shiren IAPDESCR(24H_08H, 0x24, 0x08, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 775250038Shiren IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 776250038Shiren IAPDESCR(24H_0CH, 0x24, 0x0C, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 777250038Shiren IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 778250038Shiren IAPDESCR(24H_10H, 0x24, 0x10, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 779250038Shiren IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 780250038Shiren IAPDESCR(24H_20H, 0x24, 0x20, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 781250038Shiren IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 782249655Shiren IAPDESCR(24H_21H, 0x24, 0x21, IAP_F_FM | IAP_F_HW), 783249655Shiren IAPDESCR(24H_22H, 0x24, 0x22, IAP_F_FM | IAP_F_HW), 784249655Shiren IAPDESCR(24H_24H, 0x24, 0x24, IAP_F_FM | IAP_F_HW), 785249655Shiren IAPDESCR(24H_27H, 0x24, 0x27, IAP_F_FM | IAP_F_HW), 786250038Shiren IAPDESCR(24H_30H, 0x24, 0x30, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 787250038Shiren IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 788250038Shiren IAPDESCR(24H_40H, 0x24, 0x40, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 789250038Shiren IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 790249655Shiren IAPDESCR(24H_41H, 0x24, 0x41, IAP_F_FM | IAP_F_HW), 791249655Shiren IAPDESCR(24H_42H, 0x24, 0x42, IAP_F_FM | IAP_F_HW), 792249655Shiren IAPDESCR(24H_44H, 0x24, 0x44, IAP_F_FM | IAP_F_HW), 793249655Shiren IAPDESCR(24H_50H, 0x24, 0x50, IAP_F_FM | IAP_F_HW), 794250038Shiren IAPDESCR(24H_80H, 0x24, 0x80, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 795250038Shiren IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 796250038Shiren IAPDESCR(24H_C0H, 0x24, 0xC0, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 797250038Shiren IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 798249655Shiren IAPDESCR(24H_E1H, 0x24, 0xE1, IAP_F_FM | IAP_F_HW), 799249655Shiren IAPDESCR(24H_E2H, 0x24, 0xE2, IAP_F_FM | IAP_F_HW), 800249655Shiren IAPDESCR(24H_E4H, 0x24, 0xE4, IAP_F_FM | IAP_F_HW), 801249655Shiren IAPDESCR(24H_E7H, 0x24, 0xE7, IAP_F_FM | IAP_F_HW), 802206089Sfabient IAPDESCR(24H_AAH, 0x24, 0xAA, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 803249655Shiren IAPDESCR(24H_F8H, 0x24, 0xF8, IAP_F_FM | IAP_F_HW), 804249655Shiren IAPDESCR(24H_3FH, 0x24, 0x3F, IAP_F_FM | IAP_F_HW), 805249655Shiren IAPDESCR(24H_FFH, 0x24, 0xFF, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_HW), 806206089Sfabient 807206089Sfabient IAPDESCR(25H, 0x25, IAP_M_CORE, IAP_F_ALLCPUSCORE2), 808206089Sfabient 809206089Sfabient IAPDESCR(26H, 0x26, IAP_M_CORE | IAP_M_PREFETCH, IAP_F_ALLCPUSCORE2), 810206089Sfabient IAPDESCR(26H_01H, 0x26, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 811206089Sfabient IAPDESCR(26H_02H, 0x26, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 812206089Sfabient IAPDESCR(26H_04H, 0x26, 0x04, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 813206089Sfabient IAPDESCR(26H_08H, 0x26, 0x08, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 814206089Sfabient IAPDESCR(26H_0FH, 0x26, 0x0F, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 815206089Sfabient IAPDESCR(26H_10H, 0x26, 0x10, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 816206089Sfabient IAPDESCR(26H_20H, 0x26, 0x20, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 817206089Sfabient IAPDESCR(26H_40H, 0x26, 0x40, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 818206089Sfabient IAPDESCR(26H_80H, 0x26, 0x80, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 819206089Sfabient IAPDESCR(26H_F0H, 0x26, 0xF0, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 820206089Sfabient IAPDESCR(26H_FFH, 0x26, 0xFF, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 821206089Sfabient 822206089Sfabient IAPDESCR(27H, 0x27, IAP_M_CORE | IAP_M_PREFETCH, IAP_F_ALLCPUSCORE2), 823250038Shiren IAPDESCR(27H_01H, 0x27, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 824250038Shiren IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 825206089Sfabient IAPDESCR(27H_02H, 0x27, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 826242594Ssbruno IAPDESCR(27H_04H, 0x27, 0x04, IAP_F_FM | IAP_F_I7O | IAP_F_SB | 827242594Ssbruno IAP_F_SBX), 828250038Shiren IAPDESCR(27H_08H, 0x27, 0x08, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 829250038Shiren IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 830206089Sfabient IAPDESCR(27H_0EH, 0x27, 0x0E, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 831250038Shiren IAPDESCR(27H_0FH, 0x27, 0x0F, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 832250038Shiren IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 833206089Sfabient IAPDESCR(27H_10H, 0x27, 0x10, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 834206089Sfabient IAPDESCR(27H_20H, 0x27, 0x20, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 835206089Sfabient IAPDESCR(27H_40H, 0x27, 0x40, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 836249655Shiren IAPDESCR(27H_50H, 0x27, 0x50, IAP_F_FM | IAP_F_HW), 837206089Sfabient IAPDESCR(27H_80H, 0x27, 0x80, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 838206089Sfabient IAPDESCR(27H_E0H, 0x27, 0xE0, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 839206089Sfabient IAPDESCR(27H_F0H, 0x27, 0xF0, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 840206089Sfabient 841206089Sfabient IAPDESCR(28H, 0x28, IAP_M_CORE | IAP_M_MESI, IAP_F_ALLCPUSCORE2), 842250038Shiren IAPDESCR(28H_01H, 0x28, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_IB | 843250038Shiren IAP_F_SBX | IAP_F_IBX), 844242594Ssbruno IAPDESCR(28H_02H, 0x28, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SBX), 845250038Shiren IAPDESCR(28H_04H, 0x28, 0x04, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 846250038Shiren IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 847250038Shiren IAPDESCR(28H_08H, 0x28, 0x08, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_SB | 848250038Shiren IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 849250038Shiren IAPDESCR(28H_0FH, 0x28, 0x0F, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_IB | 850249492Shiren IAP_F_SBX | IAP_F_IBX), 851206089Sfabient 852185363Sjkoshy IAPDESCR(29H, 0x29, IAP_M_CORE | IAP_M_MESI, IAP_F_CC), 853185363Sjkoshy IAPDESCR(29H, 0x29, IAP_M_CORE | IAP_M_MESI | IAP_M_PREFETCH, 854185363Sjkoshy IAP_F_CA | IAP_F_CC2), 855206089Sfabient IAPDESCR(2AH, 0x2A, IAP_M_CORE | IAP_M_MESI, IAP_F_ALLCPUSCORE2), 856185363Sjkoshy IAPDESCR(2BH, 0x2B, IAP_M_CORE | IAP_M_MESI, IAP_F_CA | IAP_F_CC2), 857185363Sjkoshy 858185363Sjkoshy IAPDESCR(2EH, 0x2E, IAP_M_CORE | IAP_M_MESI | IAP_M_PREFETCH, 859206089Sfabient IAP_F_ALLCPUSCORE2), 860206089Sfabient IAPDESCR(2EH_01H, 0x2E, 0x01, IAP_F_FM | IAP_F_WM), 861206089Sfabient IAPDESCR(2EH_02H, 0x2E, 0x02, IAP_F_FM | IAP_F_WM), 862234046Sdavide IAPDESCR(2EH_41H, 0x2E, 0x41, IAP_F_FM | IAP_F_ALLCPUSCORE2 | IAP_F_I7 | 863249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 864234046Sdavide IAPDESCR(2EH_4FH, 0x2E, 0x4F, IAP_F_FM | IAP_F_ALLCPUSCORE2 | IAP_F_I7 | 865249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 866185363Sjkoshy 867185363Sjkoshy IAPDESCR(30H, 0x30, IAP_M_CORE | IAP_M_MESI | IAP_M_PREFETCH, 868206089Sfabient IAP_F_ALLCPUSCORE2), 869185363Sjkoshy IAPDESCR(32H, 0x32, IAP_M_CORE | IAP_M_MESI | IAP_M_PREFETCH, IAP_F_CC), 870185363Sjkoshy IAPDESCR(32H, 0x32, IAP_M_CORE, IAP_F_CA | IAP_F_CC2), 871185363Sjkoshy 872185363Sjkoshy IAPDESCR(3AH, 0x3A, IAP_M_TRANSITION, IAP_F_CC), 873185363Sjkoshy IAPDESCR(3AH_00H, 0x3A, 0x00, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 874185363Sjkoshy 875206089Sfabient IAPDESCR(3BH_C0H, 0x3B, 0xC0, IAP_F_FM | IAP_F_ALLCPUSCORE2), 876185363Sjkoshy 877206089Sfabient IAPDESCR(3CH_00H, 0x3C, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2 | 878250038Shiren IAP_F_I7 | IAP_F_WM | IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | 879250038Shiren IAP_F_HW), 880206089Sfabient IAPDESCR(3CH_01H, 0x3C, 0x01, IAP_F_FM | IAP_F_ALLCPUSCORE2 | 881250038Shiren IAP_F_I7 | IAP_F_WM | IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | 882250038Shiren IAP_F_HW), 883206089Sfabient IAPDESCR(3CH_02H, 0x3C, 0x02, IAP_F_FM | IAP_F_ALLCPUSCORE2), 884185363Sjkoshy 885206089Sfabient IAPDESCR(3DH_01H, 0x3D, 0x01, IAP_F_FM | IAP_F_I7O), 886206089Sfabient 887201023Sjkoshy IAPDESCR(40H, 0x40, IAP_M_MESI, IAP_F_CC | IAP_F_CC2), 888206089Sfabient IAPDESCR(40H_01H, 0x40, 0x01, IAP_F_FM | IAP_F_I7), 889206089Sfabient IAPDESCR(40H_02H, 0x40, 0x02, IAP_F_FM | IAP_F_I7), 890206089Sfabient IAPDESCR(40H_04H, 0x40, 0x04, IAP_F_FM | IAP_F_I7), 891206089Sfabient IAPDESCR(40H_08H, 0x40, 0x08, IAP_F_FM | IAP_F_I7), 892206089Sfabient IAPDESCR(40H_0FH, 0x40, 0x0F, IAP_F_FM | IAP_F_I7), 893185363Sjkoshy IAPDESCR(40H_21H, 0x40, 0x21, IAP_F_FM | IAP_F_CA), 894185363Sjkoshy 895185363Sjkoshy IAPDESCR(41H, 0x41, IAP_M_MESI, IAP_F_CC | IAP_F_CC2), 896206089Sfabient IAPDESCR(41H_01H, 0x41, 0x01, IAP_F_FM | IAP_F_I7O), 897206089Sfabient IAPDESCR(41H_02H, 0x41, 0x02, IAP_F_FM | IAP_F_I7), 898206089Sfabient IAPDESCR(41H_04H, 0x41, 0x04, IAP_F_FM | IAP_F_I7), 899206089Sfabient IAPDESCR(41H_08H, 0x41, 0x08, IAP_F_FM | IAP_F_I7), 900206089Sfabient IAPDESCR(41H_0FH, 0x41, 0x0F, IAP_F_FM | IAP_F_I7O), 901185363Sjkoshy IAPDESCR(41H_22H, 0x41, 0x22, IAP_F_FM | IAP_F_CA), 902185363Sjkoshy 903206089Sfabient IAPDESCR(42H, 0x42, IAP_M_MESI, IAP_F_ALLCPUSCORE2), 904206089Sfabient IAPDESCR(42H_01H, 0x42, 0x01, IAP_F_FM | IAP_F_I7), 905206089Sfabient IAPDESCR(42H_02H, 0x42, 0x02, IAP_F_FM | IAP_F_I7), 906206089Sfabient IAPDESCR(42H_04H, 0x42, 0x04, IAP_F_FM | IAP_F_I7), 907206089Sfabient IAPDESCR(42H_08H, 0x42, 0x08, IAP_F_FM | IAP_F_I7), 908185363Sjkoshy IAPDESCR(42H_10H, 0x42, 0x10, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 909185363Sjkoshy 910206089Sfabient IAPDESCR(43H_01H, 0x43, 0x01, IAP_F_FM | IAP_F_ALLCPUSCORE2 | 911206089Sfabient IAP_F_I7), 912206089Sfabient IAPDESCR(43H_02H, 0x43, 0x02, IAP_F_FM | IAP_F_CA | 913206089Sfabient IAP_F_CC2 | IAP_F_I7), 914185363Sjkoshy 915185363Sjkoshy IAPDESCR(44H_02H, 0x44, 0x02, IAP_F_FM | IAP_F_CC), 916185363Sjkoshy 917206089Sfabient IAPDESCR(45H_0FH, 0x45, 0x0F, IAP_F_FM | IAP_F_ALLCPUSCORE2), 918185363Sjkoshy 919206089Sfabient IAPDESCR(46H_00H, 0x46, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 920206089Sfabient IAPDESCR(47H_00H, 0x47, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 921185363Sjkoshy 922206089Sfabient IAPDESCR(48H_00H, 0x48, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 923242594Ssbruno IAPDESCR(48H_01H, 0x48, 0x01, IAP_F_FM | IAP_F_SB | IAP_F_IB | 924249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 925234044Sdavide IAPDESCR(48H_02H, 0x48, 0x02, IAP_F_FM | IAP_F_I7O), 926206089Sfabient 927185363Sjkoshy IAPDESCR(49H_00H, 0x49, 0x00, IAP_F_FM | IAP_F_CC), 928206089Sfabient IAPDESCR(49H_01H, 0x49, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 929250038Shiren IAP_F_I7 | IAP_F_WM | IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | 930250038Shiren IAP_F_HW), 931206089Sfabient IAPDESCR(49H_02H, 0x49, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 932250038Shiren IAP_F_I7 | IAP_F_WM | IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | 933250038Shiren IAP_F_HW), 934242594Ssbruno IAPDESCR(49H_04H, 0x49, 0x04, IAP_F_FM | IAP_F_WM | IAP_F_SB | IAP_F_IB | 935249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 936249655Shiren IAPDESCR(49H_0EH, 0x49, 0x0E, IAP_F_FM | IAP_F_HW), 937234046Sdavide IAPDESCR(49H_10H, 0x49, 0x10, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 938250038Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 939249655Shiren IAPDESCR(49H_20H, 0x49, 0x20, IAP_F_FM | IAP_F_I7 | IAP_F_HW), 940249655Shiren IAPDESCR(49H_40H, 0x49, 0x40, IAP_F_FM | IAP_F_I7O | IAP_F_HW), 941249655Shiren IAPDESCR(49H_60H, 0x49, 0x60, IAP_F_FM | IAP_F_HW), 942249655Shiren IAPDESCR(49H_80H, 0x49, 0x80, IAP_F_FM | IAP_F_WM | IAP_F_I7 | IAP_F_HW), 943185363Sjkoshy 944206089Sfabient IAPDESCR(4BH_00H, 0x4B, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 945206089Sfabient IAPDESCR(4BH_01H, 0x4B, 0x01, IAP_F_FM | IAP_F_ALLCPUSCORE2 | IAP_F_I7O), 946206089Sfabient IAPDESCR(4BH_02H, 0x4B, 0x02, IAP_F_FM | IAP_F_ALLCPUSCORE2), 947185363Sjkoshy IAPDESCR(4BH_03H, 0x4B, 0x03, IAP_F_FM | IAP_F_CC), 948206089Sfabient IAPDESCR(4BH_08H, 0x4B, 0x08, IAP_F_FM | IAP_F_I7O), 949185363Sjkoshy 950185363Sjkoshy IAPDESCR(4CH_00H, 0x4C, 0x00, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 951234046Sdavide IAPDESCR(4CH_01H, 0x4C, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 952249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 953242594Ssbruno IAPDESCR(4CH_02H, 0x4C, 0x02, IAP_F_FM | IAP_F_SB | IAP_F_IB | 954249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 955185363Sjkoshy 956206089Sfabient IAPDESCR(4DH_01H, 0x4D, 0x01, IAP_F_FM | IAP_F_I7O), 957206089Sfabient 958206089Sfabient IAPDESCR(4EH_01H, 0x4E, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 959234046Sdavide IAPDESCR(4EH_02H, 0x4E, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 960242594Ssbruno IAP_F_SB | IAP_F_SBX), 961206089Sfabient IAPDESCR(4EH_04H, 0x4E, 0x04, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 962185363Sjkoshy IAPDESCR(4EH_10H, 0x4E, 0x10, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 963185363Sjkoshy 964185363Sjkoshy IAPDESCR(4FH_00H, 0x4F, 0x00, IAP_F_FM | IAP_F_CC), 965206089Sfabient IAPDESCR(4FH_02H, 0x4F, 0x02, IAP_F_FM | IAP_F_I7O), 966206089Sfabient IAPDESCR(4FH_04H, 0x4F, 0x04, IAP_F_FM | IAP_F_I7O), 967206089Sfabient IAPDESCR(4FH_08H, 0x4F, 0x08, IAP_F_FM | IAP_F_I7O), 968206089Sfabient IAPDESCR(4FH_10H, 0x4F, 0x10, IAP_F_FM | IAP_F_WM), 969185363Sjkoshy 970234046Sdavide IAPDESCR(51H_01H, 0x51, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 971249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 972234046Sdavide IAPDESCR(51H_02H, 0x51, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 973242594Ssbruno IAP_F_SB | IAP_F_SBX), 974234046Sdavide IAPDESCR(51H_04H, 0x51, 0x04, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 975242594Ssbruno IAP_F_SB | IAP_F_SBX), 976234046Sdavide IAPDESCR(51H_08H, 0x51, 0x08, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 977242594Ssbruno IAP_F_SB | IAP_F_SBX), 978185363Sjkoshy 979206089Sfabient IAPDESCR(52H_01H, 0x52, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 980234046Sdavide 981206089Sfabient IAPDESCR(53H_01H, 0x53, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 982206089Sfabient 983249655Shiren IAPDESCR(58H_01H, 0x58, 0x01, IAP_F_FM | IAP_F_IB | IAP_F_IBX | IAP_F_HW), 984249655Shiren IAPDESCR(58H_02H, 0x58, 0x02, IAP_F_FM | IAP_F_IB | IAP_F_IBX | IAP_F_HW), 985249655Shiren IAPDESCR(58H_04H, 0x58, 0x04, IAP_F_FM | IAP_F_IB | IAP_F_IBX | IAP_F_HW), 986249655Shiren IAPDESCR(58H_08H, 0x58, 0x08, IAP_F_FM | IAP_F_IB | IAP_F_IBX | IAP_F_HW), 987241609Sfabient 988242594Ssbruno IAPDESCR(59H_20H, 0x59, 0x20, IAP_F_FM | IAP_F_SB | IAP_F_SBX), 989242594Ssbruno IAPDESCR(59H_40H, 0x59, 0x40, IAP_F_FM | IAP_F_SB | IAP_F_SBX), 990242594Ssbruno IAPDESCR(59H_80H, 0x59, 0x80, IAP_F_FM | IAP_F_SB | IAP_F_SBX), 991234046Sdavide 992242594Ssbruno IAPDESCR(5BH_0CH, 0x5B, 0x0C, IAP_F_FM | IAP_F_SB | IAP_F_SBX), 993242594Ssbruno IAPDESCR(5BH_0FH, 0x5B, 0x0F, IAP_F_FM | IAP_F_SB | IAP_F_SBX), 994242594Ssbruno IAPDESCR(5BH_40H, 0x5B, 0x40, IAP_F_FM | IAP_F_SB | IAP_F_SBX), 995242594Ssbruno IAPDESCR(5BH_4FH, 0x5B, 0x4F, IAP_F_FM | IAP_F_SB | IAP_F_SBX), 996234046Sdavide 997242594Ssbruno IAPDESCR(5CH_01H, 0x5C, 0x01, IAP_F_FM | IAP_F_SB | IAP_F_IB | 998249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 999242594Ssbruno IAPDESCR(5CH_02H, 0x5C, 0x02, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1000249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1001250038Shiren 1002242594Ssbruno IAPDESCR(5EH_01H, 0x5E, 0x01, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1003249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1004234046Sdavide 1005241609Sfabient IAPDESCR(5FH_01H, 0x5F, 0x01, IAP_F_FM | IAP_F_IB), 1006249492Shiren IAPDESCR(5FH_04H, 0x5F, 0x04, IAP_F_IBX), 1007241609Sfabient 1008206089Sfabient IAPDESCR(60H, 0x60, IAP_M_AGENT | IAP_M_CORE, IAP_F_ALLCPUSCORE2), 1009234046Sdavide IAPDESCR(60H_01H, 0x60, 0x01, IAP_F_FM | IAP_F_WM | IAP_F_I7O | 1010249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1011249492Shiren IAPDESCR(60H_02H, 0x60, 0x02, IAP_F_FM | IAP_F_WM | IAP_F_I7O | IAP_F_IB | 1012249655Shiren IAP_F_IBX | IAP_F_HW), 1013234046Sdavide IAPDESCR(60H_04H, 0x60, 0x04, IAP_F_FM | IAP_F_WM | IAP_F_I7O | 1014249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1015234046Sdavide IAPDESCR(60H_08H, 0x60, 0x08, IAP_F_FM | IAP_F_WM | IAP_F_I7O | 1016249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1017206089Sfabient 1018185363Sjkoshy IAPDESCR(61H, 0x61, IAP_M_AGENT, IAP_F_CA | IAP_F_CC2), 1019185363Sjkoshy IAPDESCR(61H_00H, 0x61, 0x00, IAP_F_FM | IAP_F_CC), 1020185363Sjkoshy 1021206089Sfabient IAPDESCR(62H, 0x62, IAP_M_AGENT, IAP_F_ALLCPUSCORE2), 1022185363Sjkoshy IAPDESCR(62H_00H, 0x62, 0x00, IAP_F_FM | IAP_F_CC), 1023185363Sjkoshy 1024185363Sjkoshy IAPDESCR(63H, 0x63, IAP_M_AGENT | IAP_M_CORE, 1025185363Sjkoshy IAP_F_CA | IAP_F_CC2), 1026185363Sjkoshy IAPDESCR(63H, 0x63, IAP_M_CORE, IAP_F_CC), 1027234046Sdavide IAPDESCR(63H_01H, 0x63, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1028249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1029234046Sdavide IAPDESCR(63H_02H, 0x63, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1030249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1031185363Sjkoshy 1032185363Sjkoshy IAPDESCR(64H, 0x64, IAP_M_CORE, IAP_F_CA | IAP_F_CC2), 1033185363Sjkoshy IAPDESCR(64H_40H, 0x64, 0x40, IAP_F_FM | IAP_F_CC), 1034185363Sjkoshy 1035185363Sjkoshy IAPDESCR(65H, 0x65, IAP_M_AGENT | IAP_M_CORE, 1036185363Sjkoshy IAP_F_CA | IAP_F_CC2), 1037185363Sjkoshy IAPDESCR(65H, 0x65, IAP_M_CORE, IAP_F_CC), 1038185363Sjkoshy 1039206089Sfabient IAPDESCR(66H, 0x66, IAP_M_AGENT | IAP_M_CORE, IAP_F_ALLCPUSCORE2), 1040185363Sjkoshy 1041185363Sjkoshy IAPDESCR(67H, 0x67, IAP_M_AGENT | IAP_M_CORE, IAP_F_CA | IAP_F_CC2), 1042185363Sjkoshy IAPDESCR(67H, 0x67, IAP_M_AGENT, IAP_F_CC), 1043185363Sjkoshy 1044206089Sfabient IAPDESCR(68H, 0x68, IAP_M_AGENT | IAP_M_CORE, IAP_F_ALLCPUSCORE2), 1045206089Sfabient IAPDESCR(69H, 0x69, IAP_M_AGENT | IAP_M_CORE, IAP_F_ALLCPUSCORE2), 1046206089Sfabient IAPDESCR(6AH, 0x6A, IAP_M_AGENT | IAP_M_CORE, IAP_F_ALLCPUSCORE2), 1047206089Sfabient IAPDESCR(6BH, 0x6B, IAP_M_AGENT | IAP_M_CORE, IAP_F_ALLCPUSCORE2), 1048185363Sjkoshy 1049206089Sfabient IAPDESCR(6CH, 0x6C, IAP_M_AGENT | IAP_M_CORE, IAP_F_ALLCPUSCORE2), 1050206089Sfabient IAPDESCR(6CH_01H, 0x6C, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1051206089Sfabient 1052185363Sjkoshy IAPDESCR(6DH, 0x6D, IAP_M_AGENT | IAP_M_CORE, IAP_F_CA | IAP_F_CC2), 1053185363Sjkoshy IAPDESCR(6DH, 0x6D, IAP_M_CORE, IAP_F_CC), 1054185363Sjkoshy 1055185363Sjkoshy IAPDESCR(6EH, 0x6E, IAP_M_AGENT | IAP_M_CORE, IAP_F_CA | IAP_F_CC2), 1056185363Sjkoshy IAPDESCR(6EH, 0x6E, IAP_M_CORE, IAP_F_CC), 1057185363Sjkoshy 1058185363Sjkoshy IAPDESCR(6FH, 0x6F, IAP_M_AGENT | IAP_M_CORE, IAP_F_CA | IAP_F_CC2), 1059185363Sjkoshy IAPDESCR(6FH, 0x6F, IAP_M_CORE, IAP_F_CC), 1060185363Sjkoshy 1061185363Sjkoshy IAPDESCR(70H, 0x70, IAP_M_AGENT | IAP_M_CORE, IAP_F_CA | IAP_F_CC2), 1062185363Sjkoshy IAPDESCR(70H, 0x70, IAP_M_CORE, IAP_F_CC), 1063185363Sjkoshy 1064185363Sjkoshy IAPDESCR(77H, 0x77, IAP_M_AGENT | IAP_M_SNOOPRESPONSE, 1065185363Sjkoshy IAP_F_CA | IAP_F_CC2), 1066185363Sjkoshy IAPDESCR(77H, 0x77, IAP_M_AGENT | IAP_M_MESI, IAP_F_CC), 1067185363Sjkoshy 1068185363Sjkoshy IAPDESCR(78H, 0x78, IAP_M_CORE, IAP_F_CC), 1069185363Sjkoshy IAPDESCR(78H, 0x78, IAP_M_CORE | IAP_M_SNOOPTYPE, IAP_F_CA | IAP_F_CC2), 1070185363Sjkoshy 1071242594Ssbruno IAPDESCR(79H_02H, 0x79, 0x02, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1072249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1073242594Ssbruno IAPDESCR(79H_04H, 0x79, 0x04, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1074249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1075242594Ssbruno IAPDESCR(79H_08H, 0x79, 0x08, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1076249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1077242594Ssbruno IAPDESCR(79H_10H, 0x79, 0x10, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1078249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1079242594Ssbruno IAPDESCR(79H_20H, 0x79, 0x20, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1080249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1081242594Ssbruno IAPDESCR(79H_30H, 0x79, 0x30, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1082249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1083249655Shiren IAPDESCR(79H_18H, 0x79, 0x18, IAP_F_FM | IAP_F_IB | IAP_F_IBX | IAP_F_HW), 1084249655Shiren IAPDESCR(79H_24H, 0x79, 0x24, IAP_F_FM | IAP_F_IB | IAP_F_IBX | IAP_F_HW), 1085249655Shiren IAPDESCR(79H_3CH, 0x79, 0x3C, IAP_F_FM | IAP_F_IB | IAP_F_IBX | IAP_F_HW), 1086250038Shiren 1087185363Sjkoshy IAPDESCR(7AH, 0x7A, IAP_M_AGENT, IAP_F_CA | IAP_F_CC2), 1088185363Sjkoshy 1089185363Sjkoshy IAPDESCR(7BH, 0x7B, IAP_M_AGENT, IAP_F_CA | IAP_F_CC2), 1090185363Sjkoshy 1091206089Sfabient IAPDESCR(7DH, 0x7D, IAP_M_CORE, IAP_F_ALLCPUSCORE2), 1092185363Sjkoshy 1093185363Sjkoshy IAPDESCR(7EH, 0x7E, IAP_M_AGENT | IAP_M_CORE, IAP_F_CA | IAP_F_CC2), 1094185363Sjkoshy IAPDESCR(7EH_00H, 0x7E, 0x00, IAP_F_FM | IAP_F_CC), 1095185363Sjkoshy 1096185363Sjkoshy IAPDESCR(7FH, 0x7F, IAP_M_CORE, IAP_F_CA | IAP_F_CC2), 1097185363Sjkoshy 1098206089Sfabient IAPDESCR(80H_00H, 0x80, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1099206089Sfabient IAPDESCR(80H_01H, 0x80, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1100206089Sfabient IAPDESCR(80H_02H, 0x80, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_I7 | 1101249655Shiren IAP_F_WM | IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1102206089Sfabient IAPDESCR(80H_03H, 0x80, 0x03, IAP_F_FM | IAP_F_CA | IAP_F_I7 | 1103206089Sfabient IAP_F_WM), 1104206089Sfabient IAPDESCR(80H_04H, 0x80, 0x04, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1105185363Sjkoshy 1106206089Sfabient IAPDESCR(81H_00H, 0x81, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1107206089Sfabient IAPDESCR(81H_01H, 0x81, 0x01, IAP_F_FM | IAP_F_I7O), 1108206089Sfabient IAPDESCR(81H_02H, 0x81, 0x02, IAP_F_FM | IAP_F_I7O), 1109185363Sjkoshy 1110206089Sfabient IAPDESCR(82H_01H, 0x82, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1111185363Sjkoshy IAPDESCR(82H_02H, 0x82, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1112185363Sjkoshy IAPDESCR(82H_04H, 0x82, 0x04, IAP_F_FM | IAP_F_CA), 1113185363Sjkoshy IAPDESCR(82H_10H, 0x82, 0x10, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1114185363Sjkoshy IAPDESCR(82H_12H, 0x82, 0x12, IAP_F_FM | IAP_F_CC2), 1115185363Sjkoshy IAPDESCR(82H_40H, 0x82, 0x40, IAP_F_FM | IAP_F_CC2), 1116185363Sjkoshy 1117206089Sfabient IAPDESCR(83H_01H, 0x83, 0x01, IAP_F_FM | IAP_F_I7O), 1118185363Sjkoshy IAPDESCR(83H_02H, 0x83, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1119185363Sjkoshy 1120185363Sjkoshy IAPDESCR(85H_00H, 0x85, 0x00, IAP_F_FM | IAP_F_CC), 1121234046Sdavide IAPDESCR(85H_01H, 0x85, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1122249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1123234046Sdavide IAPDESCR(85H_02H, 0x85, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1124249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1125234046Sdavide IAPDESCR(85H_04H, 0x85, 0x04, IAP_F_FM | IAP_F_WM | IAP_F_I7O | 1126249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1127249655Shiren IAPDESCR(85H_0EH, 0x85, 0x0E, IAP_F_FM | IAP_F_HW), 1128242594Ssbruno IAPDESCR(85H_10H, 0x85, 0x10, IAP_F_FM | IAP_F_I7O | IAP_F_SB | IAP_F_IB | 1129249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1130249655Shiren IAPDESCR(85H_20H, 0x85, 0x20, IAP_F_FM | IAP_F_I7O | IAP_F_HW), 1131249655Shiren IAPDESCR(85H_40H, 0x85, 0x40, IAP_F_FM | IAP_F_I7O | IAP_F_HW), 1132249655Shiren IAPDESCR(85H_60H, 0x85, 0x60, IAP_F_FM | IAP_F_HW), 1133206089Sfabient IAPDESCR(85H_80H, 0x85, 0x80, IAP_F_FM | IAP_F_WM | IAP_F_I7O), 1134185363Sjkoshy 1135206089Sfabient IAPDESCR(86H_00H, 0x86, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1136185363Sjkoshy 1137206089Sfabient IAPDESCR(87H_00H, 0x87, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1138234046Sdavide IAPDESCR(87H_01H, 0x87, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1139249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1140206089Sfabient IAPDESCR(87H_02H, 0x87, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1141234046Sdavide IAPDESCR(87H_04H, 0x87, 0x04, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1142249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1143206089Sfabient IAPDESCR(87H_08H, 0x87, 0x08, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1144206089Sfabient IAPDESCR(87H_0FH, 0x87, 0x0F, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1145185363Sjkoshy 1146206089Sfabient IAPDESCR(88H_00H, 0x88, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1147234046Sdavide IAPDESCR(88H_01H, 0x88, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1148249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1149234046Sdavide IAPDESCR(88H_02H, 0x88, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1150249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1151234046Sdavide IAPDESCR(88H_04H, 0x88, 0x04, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1152249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1153206089Sfabient IAPDESCR(88H_07H, 0x88, 0x07, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1154234046Sdavide IAPDESCR(88H_08H, 0x88, 0x08, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1155249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1156234046Sdavide IAPDESCR(88H_10H, 0x88, 0x10, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1157249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1158234046Sdavide IAPDESCR(88H_20H, 0x88, 0x20, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1159249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1160206089Sfabient IAPDESCR(88H_30H, 0x88, 0x30, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1161234046Sdavide IAPDESCR(88H_40H, 0x88, 0x40, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1162249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1163206089Sfabient IAPDESCR(88H_7FH, 0x88, 0x7F, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1164242594Ssbruno IAPDESCR(88H_80H, 0x88, 0x80, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1165249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1166242594Ssbruno IAPDESCR(88H_FFH, 0x88, 0xFF, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1167249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1168185363Sjkoshy 1169206089Sfabient IAPDESCR(89H_00H, 0x89, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1170234046Sdavide IAPDESCR(89H_01H, 0x89, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1171249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1172206089Sfabient IAPDESCR(89H_02H, 0x89, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1173234046Sdavide IAPDESCR(89H_04H, 0x89, 0x04, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1174249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1175206089Sfabient IAPDESCR(89H_07H, 0x89, 0x07, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1176234046Sdavide IAPDESCR(89H_08H, 0x89, 0x08, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1177249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1178234046Sdavide IAPDESCR(89H_10H, 0x89, 0x10, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1179249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1180234046Sdavide IAPDESCR(89H_20H, 0x89, 0x20, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1181249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1182206089Sfabient IAPDESCR(89H_30H, 0x89, 0x30, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1183234046Sdavide IAPDESCR(89H_40H, 0x89, 0x40, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1184249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1185206089Sfabient IAPDESCR(89H_7FH, 0x89, 0x7F, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1186242594Ssbruno IAPDESCR(89H_80H, 0x89, 0x80, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1187249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1188242594Ssbruno IAPDESCR(89H_FFH, 0x89, 0xFF, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1189249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1190185363Sjkoshy 1191206089Sfabient IAPDESCR(8AH_00H, 0x8A, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1192206089Sfabient IAPDESCR(8BH_00H, 0x8B, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1193206089Sfabient IAPDESCR(8CH_00H, 0x8C, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1194206089Sfabient IAPDESCR(8DH_00H, 0x8D, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1195206089Sfabient IAPDESCR(8EH_00H, 0x8E, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1196206089Sfabient IAPDESCR(8FH_00H, 0x8F, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1197206089Sfabient 1198206089Sfabient IAPDESCR(90H_00H, 0x90, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1199206089Sfabient IAPDESCR(91H_00H, 0x91, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1200206089Sfabient IAPDESCR(92H_00H, 0x92, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1201206089Sfabient IAPDESCR(93H_00H, 0x93, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1202206089Sfabient IAPDESCR(94H_00H, 0x94, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1203206089Sfabient 1204242594Ssbruno IAPDESCR(9CH_01H, 0x9C, 0x01, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1205250038Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1206234046Sdavide 1207185363Sjkoshy IAPDESCR(97H_00H, 0x97, 0x00, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1208185363Sjkoshy IAPDESCR(98H_00H, 0x98, 0x00, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1209185363Sjkoshy IAPDESCR(A0H_00H, 0xA0, 0x00, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1210185363Sjkoshy 1211234046Sdavide IAPDESCR(A1H_01H, 0xA1, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1212249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1213234046Sdavide IAPDESCR(A1H_02H, 0xA1, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1214249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1215234046Sdavide IAPDESCR(A1H_04H, 0xA1, 0x04, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1216249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1217234046Sdavide IAPDESCR(A1H_08H, 0xA1, 0x08, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1218249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1219242594Ssbruno IAPDESCR(A1H_0CH, 0xA1, 0x0C, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1220249492Shiren IAP_F_SBX | IAP_F_IBX), 1221234046Sdavide IAPDESCR(A1H_10H, 0xA1, 0x10, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1222249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1223234046Sdavide IAPDESCR(A1H_20H, 0xA1, 0x20, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1224249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1225242594Ssbruno IAPDESCR(A1H_30H, 0xA1, 0x30, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1226249492Shiren IAP_F_SBX | IAP_F_IBX), 1227242594Ssbruno IAPDESCR(A1H_40H, 0xA1, 0x40, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1228249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1229242594Ssbruno IAPDESCR(A1H_80H, 0xA1, 0x80, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1230249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1231250038Shiren 1232185363Sjkoshy IAPDESCR(A2H_00H, 0xA2, 0x00, IAP_F_FM | IAP_F_CC), 1233234046Sdavide IAPDESCR(A2H_01H, 0xA2, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1234249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1235234046Sdavide IAPDESCR(A2H_02H, 0xA2, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1236242594Ssbruno IAP_F_SB | IAP_F_SBX), 1237234046Sdavide IAPDESCR(A2H_04H, 0xA2, 0x04, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1238249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1239234046Sdavide IAPDESCR(A2H_08H, 0xA2, 0x08, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1240249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1241234046Sdavide IAPDESCR(A2H_10H, 0xA2, 0x10, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1242249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1243234046Sdavide IAPDESCR(A2H_20H, 0xA2, 0x20, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1244242594Ssbruno IAP_F_SB | IAP_F_SBX), 1245234046Sdavide IAPDESCR(A2H_40H, 0xA2, 0x40, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1246242594Ssbruno IAP_F_SB | IAP_F_SBX), 1247234046Sdavide IAPDESCR(A2H_80H, 0xA2, 0x80, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1248242594Ssbruno IAP_F_SB | IAP_F_SBX), 1249185363Sjkoshy 1250249655Shiren IAPDESCR(A3H_01H, 0xA3, 0x01, IAP_F_FM | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1251249655Shiren IAPDESCR(A3H_02H, 0xA3, 0x02, IAP_F_FM | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1252249492Shiren IAPDESCR(A3H_04H, 0xA3, 0x04, IAP_F_FM | IAP_F_SBX | IAP_F_IBX), 1253249655Shiren IAPDESCR(A3H_05H, 0xA3, 0x05, IAP_F_FM | IAP_F_HW), 1254249655Shiren IAPDESCR(A3H_08H, 0xA3, 0x08, IAP_F_FM | IAP_F_IBX | IAP_F_HW), 1255242594Ssbruno 1256206089Sfabient IAPDESCR(A6H_01H, 0xA6, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1257206089Sfabient IAPDESCR(A7H_01H, 0xA7, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1258206089Sfabient IAPDESCR(A8H_01H, 0xA8, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1259206089Sfabient 1260185363Sjkoshy IAPDESCR(AAH_01H, 0xAA, 0x01, IAP_F_FM | IAP_F_CC2), 1261185363Sjkoshy IAPDESCR(AAH_02H, 0xAA, 0x02, IAP_F_FM | IAP_F_CA), 1262185363Sjkoshy IAPDESCR(AAH_03H, 0xAA, 0x03, IAP_F_FM | IAP_F_CA), 1263185363Sjkoshy IAPDESCR(AAH_08H, 0xAA, 0x08, IAP_F_FM | IAP_F_CC2), 1264185363Sjkoshy 1265234046Sdavide IAPDESCR(ABH_01H, 0xAB, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1266249492Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 1267234046Sdavide IAPDESCR(ABH_02H, 0xAB, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1268249492Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 1269185363Sjkoshy 1270242594Ssbruno IAPDESCR(ACH_02H, 0xAC, 0x02, IAP_F_FM | IAP_F_SB | IAP_F_SBX), 1271242594Ssbruno IAPDESCR(ACH_08H, 0xAC, 0x08, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1272249492Shiren IAP_F_SBX | IAP_F_IBX), 1273242594Ssbruno IAPDESCR(ACH_0AH, 0xAC, 0x0A, IAP_F_FM | IAP_F_SB | IAP_F_SBX), 1274185363Sjkoshy 1275234046Sdavide IAPDESCR(AEH_01H, 0xAE, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1276249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1277234046Sdavide 1278206089Sfabient IAPDESCR(B0H_00H, 0xB0, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1279234046Sdavide IAPDESCR(B0H_01H, 0xB0, 0x01, IAP_F_FM | IAP_F_WM | IAP_F_I7O | 1280249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1281249492Shiren IAPDESCR(B0H_02H, 0xB0, 0x02, IAP_F_FM | IAP_F_WM | IAP_F_I7O | IAP_F_IB | 1282249655Shiren IAP_F_IBX | IAP_F_HW), 1283234046Sdavide IAPDESCR(B0H_04H, 0xB0, 0x04, IAP_F_FM | IAP_F_WM | IAP_F_I7O | 1284249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1285234046Sdavide IAPDESCR(B0H_08H, 0xB0, 0x08, IAP_F_FM | IAP_F_WM | IAP_F_I7O | 1286249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1287206684Sfabient IAPDESCR(B0H_10H, 0xB0, 0x10, IAP_F_FM | IAP_F_WM | IAP_F_I7O), 1288206089Sfabient IAPDESCR(B0H_20H, 0xB0, 0x20, IAP_F_FM | IAP_F_I7O), 1289206089Sfabient IAPDESCR(B0H_40H, 0xB0, 0x40, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1290206089Sfabient IAPDESCR(B0H_80H, 0xB0, 0x80, IAP_F_FM | IAP_F_CA | IAP_F_WM | IAP_F_I7O), 1291185363Sjkoshy 1292206089Sfabient IAPDESCR(B1H_00H, 0xB1, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1293234046Sdavide IAPDESCR(B1H_01H, 0xB1, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1294249492Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 1295234046Sdavide IAPDESCR(B1H_02H, 0xB1, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1296249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1297206089Sfabient IAPDESCR(B1H_04H, 0xB1, 0x04, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1298206089Sfabient IAPDESCR(B1H_08H, 0xB1, 0x08, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1299206089Sfabient IAPDESCR(B1H_10H, 0xB1, 0x10, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1300206089Sfabient IAPDESCR(B1H_1FH, 0xB1, 0x1F, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1301206089Sfabient IAPDESCR(B1H_20H, 0xB1, 0x20, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1302206089Sfabient IAPDESCR(B1H_3FH, 0xB1, 0x3F, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1303206089Sfabient IAPDESCR(B1H_40H, 0xB1, 0x40, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1304206089Sfabient IAPDESCR(B1H_80H, 0xB1, 0x80, IAP_F_FM | IAP_F_CA | IAP_F_I7 | 1305206089Sfabient IAP_F_WM), 1306206089Sfabient 1307234046Sdavide IAPDESCR(B2H_01H, 0xB2, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1308242594Ssbruno IAP_F_SB | IAP_F_SBX), 1309206089Sfabient 1310206089Sfabient IAPDESCR(B3H_01H, 0xB3, 0x01, IAP_F_FM | IAP_F_ALLCPUSCORE2 | 1311206089Sfabient IAP_F_WM | IAP_F_I7O), 1312206089Sfabient IAPDESCR(B3H_02H, 0xB3, 0x02, IAP_F_FM | IAP_F_ALLCPUSCORE2 | 1313206089Sfabient IAP_F_WM | IAP_F_I7O), 1314206089Sfabient IAPDESCR(B3H_04H, 0xB3, 0x04, IAP_F_FM | IAP_F_ALLCPUSCORE2 | 1315206089Sfabient IAP_F_WM | IAP_F_I7O), 1316206089Sfabient IAPDESCR(B3H_08H, 0xB3, 0x08, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1317206089Sfabient IAPDESCR(B3H_10H, 0xB3, 0x10, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1318206089Sfabient IAPDESCR(B3H_20H, 0xB3, 0x20, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1319185363Sjkoshy IAPDESCR(B3H_81H, 0xB3, 0x81, IAP_F_FM | IAP_F_CA), 1320185363Sjkoshy IAPDESCR(B3H_82H, 0xB3, 0x82, IAP_F_FM | IAP_F_CA), 1321185363Sjkoshy IAPDESCR(B3H_84H, 0xB3, 0x84, IAP_F_FM | IAP_F_CA), 1322185363Sjkoshy IAPDESCR(B3H_88H, 0xB3, 0x88, IAP_F_FM | IAP_F_CA), 1323185363Sjkoshy IAPDESCR(B3H_90H, 0xB3, 0x90, IAP_F_FM | IAP_F_CA), 1324185363Sjkoshy IAPDESCR(B3H_A0H, 0xB3, 0xA0, IAP_F_FM | IAP_F_CA), 1325185363Sjkoshy 1326206089Sfabient IAPDESCR(B4H_01H, 0xB4, 0x01, IAP_F_FM | IAP_F_WM), 1327206089Sfabient IAPDESCR(B4H_02H, 0xB4, 0x02, IAP_F_FM | IAP_F_WM), 1328206089Sfabient IAPDESCR(B4H_04H, 0xB4, 0x04, IAP_F_FM | IAP_F_WM), 1329206089Sfabient 1330242594Ssbruno IAPDESCR(B6H_01H, 0xB6, 0x01, IAP_F_FM | IAP_F_SB | IAP_F_SBX), 1331206089Sfabient 1332234046Sdavide IAPDESCR(B7H_01H, 0xB7, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1333249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1334234046Sdavide 1335206089Sfabient IAPDESCR(B8H_01H, 0xB8, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1336206089Sfabient IAPDESCR(B8H_02H, 0xB8, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1337206089Sfabient IAPDESCR(B8H_04H, 0xB8, 0x04, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1338206089Sfabient 1339206089Sfabient IAPDESCR(BAH_01H, 0xBA, 0x01, IAP_F_FM | IAP_F_I7O), 1340206089Sfabient IAPDESCR(BAH_02H, 0xBA, 0x02, IAP_F_FM | IAP_F_I7O), 1341206089Sfabient 1342234046Sdavide IAPDESCR(BBH_01H, 0xBB, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1343249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1344206089Sfabient 1345249655Shiren IAPDESCR(BCH_11H, 0xBC, 0x11, IAP_F_FM | IAP_F_HW), 1346249655Shiren IAPDESCR(BCH_12H, 0xBC, 0x12, IAP_F_FM | IAP_F_HW), 1347249655Shiren IAPDESCR(BCH_14H, 0xBC, 0x14, IAP_F_FM | IAP_F_HW), 1348249655Shiren IAPDESCR(BCH_18H, 0xBC, 0x18, IAP_F_FM | IAP_F_HW), 1349249655Shiren IAPDESCR(BCH_21H, 0xBC, 0x21, IAP_F_FM | IAP_F_HW), 1350249655Shiren IAPDESCR(BCH_22H, 0xBC, 0x22, IAP_F_FM | IAP_F_HW), 1351249655Shiren IAPDESCR(BCH_24H, 0xBC, 0x24, IAP_F_FM | IAP_F_HW), 1352249655Shiren IAPDESCR(BCH_28H, 0xBC, 0x28, IAP_F_FM | IAP_F_HW), 1353249655Shiren 1354242594Ssbruno IAPDESCR(BDH_01H, 0xBD, 0x01, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1355249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1356242594Ssbruno IAPDESCR(BDH_20H, 0xBD, 0x20, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1357249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1358234046Sdavide 1359242594Ssbruno IAPDESCR(BFH_05H, 0xBF, 0x05, IAP_F_FM | IAP_F_SB | IAP_F_SBX), 1360234046Sdavide 1361234046Sdavide IAPDESCR(C0H_00H, 0xC0, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2 | 1362249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1363206089Sfabient IAPDESCR(C0H_01H, 0xC0, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1364249492Shiren IAP_F_I7 | IAP_F_WM | IAP_F_SB | IAP_F_IB | IAP_F_SBX | 1365249655Shiren IAP_F_IBX | IAP_F_HW), 1366206089Sfabient IAPDESCR(C0H_02H, 0xC0, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1367234046Sdavide IAP_F_I7 | IAP_F_WM | IAP_F_SB), 1368206089Sfabient IAPDESCR(C0H_04H, 0xC0, 0x04, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1369206089Sfabient IAP_F_I7 | IAP_F_WM), 1370185363Sjkoshy IAPDESCR(C0H_08H, 0xC0, 0x08, IAP_F_FM | IAP_F_CC2E), 1371185363Sjkoshy 1372185363Sjkoshy IAPDESCR(C1H_00H, 0xC1, 0x00, IAP_F_FM | IAP_F_CC), 1373185363Sjkoshy IAPDESCR(C1H_01H, 0xC1, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1374242594Ssbruno IAPDESCR(C1H_02H, 0xC1, 0x02, IAP_F_FM | IAP_F_SB | IAP_F_SBX), 1375242594Ssbruno IAPDESCR(C1H_08H, 0xC1, 0x08, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1376249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1377242594Ssbruno IAPDESCR(C1H_10H, 0xC1, 0x10, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1378249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1379242594Ssbruno IAPDESCR(C1H_20H, 0xC1, 0x20, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1380249492Shiren IAP_F_SBX | IAP_F_IBX), 1381249655Shiren IAPDESCR(C1H_40H, 0xC1, 0x40, IAP_F_FM | IAP_F_HW), 1382185363Sjkoshy IAPDESCR(C1H_FEH, 0xC1, 0xFE, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1383185363Sjkoshy 1384185363Sjkoshy IAPDESCR(C2H_00H, 0xC2, 0x00, IAP_F_FM | IAP_F_CC), 1385206089Sfabient IAPDESCR(C2H_01H, 0xC2, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1386249492Shiren IAP_F_I7 | IAP_F_WM | IAP_F_SB | IAP_F_IB | IAP_F_SBX | 1387249655Shiren IAP_F_IBX | IAP_F_HW), 1388206089Sfabient IAPDESCR(C2H_02H, 0xC2, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1389249492Shiren IAP_F_I7 | IAP_F_WM | IAP_F_SB | IAP_F_IB | IAP_F_SBX | 1390249655Shiren IAP_F_IBX | IAP_F_HW), 1391206089Sfabient IAPDESCR(C2H_04H, 0xC2, 0x04, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1392206089Sfabient IAP_F_I7 | IAP_F_WM), 1393185363Sjkoshy IAPDESCR(C2H_07H, 0xC2, 0x07, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1394185363Sjkoshy IAPDESCR(C2H_08H, 0xC2, 0x08, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1395185363Sjkoshy IAPDESCR(C2H_0FH, 0xC2, 0x0F, IAP_F_FM | IAP_F_CC2), 1396185363Sjkoshy IAPDESCR(C2H_10H, 0xC2, 0x10, IAP_F_FM | IAP_F_CA), 1397185363Sjkoshy 1398185363Sjkoshy IAPDESCR(C3H_00H, 0xC3, 0x00, IAP_F_FM | IAP_F_CC), 1399206089Sfabient IAPDESCR(C3H_01H, 0xC3, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1400206089Sfabient IAP_F_I7 | IAP_F_WM), 1401234046Sdavide IAPDESCR(C3H_02H, 0xC3, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1402249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1403206089Sfabient IAPDESCR(C3H_04H, 0xC3, 0x04, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1404249492Shiren IAP_F_I7 | IAP_F_WM | IAP_F_SB | IAP_F_IB | IAP_F_SBX | 1405249655Shiren IAP_F_IBX | IAP_F_HW), 1406206089Sfabient IAPDESCR(C3H_10H, 0xC3, 0x10, IAP_F_FM | IAP_F_I7O), 1407242594Ssbruno IAPDESCR(C3H_20H, 0xC3, 0x20, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1408249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1409185363Sjkoshy 1410206089Sfabient IAPDESCR(C4H_00H, 0xC4, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2 | 1411249492Shiren IAP_F_I7 | IAP_F_WM | IAP_F_SB | IAP_F_IB | IAP_F_SBX | 1412249655Shiren IAP_F_IBX | IAP_F_HW), 1413206089Sfabient IAPDESCR(C4H_01H, 0xC4, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1414249492Shiren IAP_F_I7 | IAP_F_WM | IAP_F_SB | IAP_F_IB | IAP_F_SBX | 1415249655Shiren IAP_F_IBX | IAP_F_HW), 1416206089Sfabient IAPDESCR(C4H_02H, 0xC4, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1417249492Shiren IAP_F_I7 | IAP_F_WM | IAP_F_SB | IAP_F_IB | IAP_F_SBX | 1418249655Shiren IAP_F_IBX | IAP_F_HW), 1419206089Sfabient IAPDESCR(C4H_04H, 0xC4, 0x04, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1420249492Shiren IAP_F_I7 | IAP_F_WM | IAP_F_SB | IAP_F_IB | IAP_F_SBX | 1421249655Shiren IAP_F_IBX | IAP_F_HW), 1422234046Sdavide IAPDESCR(C4H_08H, 0xC4, 0x08, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1423249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1424185363Sjkoshy IAPDESCR(C4H_0CH, 0xC4, 0x0C, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1425185363Sjkoshy IAPDESCR(C4H_0FH, 0xC4, 0x0F, IAP_F_FM | IAP_F_CA), 1426242594Ssbruno IAPDESCR(C4H_10H, 0xC4, 0x10, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1427249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1428242594Ssbruno IAPDESCR(C4H_20H, 0xC4, 0x20, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1429249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1430242594Ssbruno IAPDESCR(C4H_40H, 0xC4, 0x40, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1431249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1432185363Sjkoshy 1433206089Sfabient IAPDESCR(C5H_00H, 0xC5, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2 | 1434249492Shiren IAP_F_I7 | IAP_F_WM | IAP_F_SB | IAP_F_IB | IAP_F_SBX | 1435249655Shiren IAP_F_IBX | IAP_F_HW), 1436242594Ssbruno IAPDESCR(C5H_01H, 0xC5, 0x01, IAP_F_FM | IAP_F_WM | IAP_F_SB | 1437249655Shiren IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1438234046Sdavide IAPDESCR(C5H_02H, 0xC5, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1439249492Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 1440242594Ssbruno IAPDESCR(C5H_04H, 0xC5, 0x04, IAP_F_FM | IAP_F_WM | IAP_F_SB | 1441249655Shiren IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1442242594Ssbruno IAPDESCR(C5H_10H, 0xC5, 0x10, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1443249492Shiren IAP_F_SBX | IAP_F_IBX), 1444242594Ssbruno IAPDESCR(C5H_20H, 0xC5, 0x20, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1445249492Shiren IAP_F_SBX | IAP_F_IBX), 1446185363Sjkoshy 1447185363Sjkoshy IAPDESCR(C6H_00H, 0xC6, 0x00, IAP_F_FM | IAP_F_CC), 1448185363Sjkoshy IAPDESCR(C6H_01H, 0xC6, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1449185363Sjkoshy IAPDESCR(C6H_02H, 0xC6, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1450185363Sjkoshy 1451185363Sjkoshy IAPDESCR(C7H_00H, 0xC7, 0x00, IAP_F_FM | IAP_F_CC), 1452206089Sfabient IAPDESCR(C7H_01H, 0xC7, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1453206089Sfabient IAP_F_I7 | IAP_F_WM), 1454206089Sfabient IAPDESCR(C7H_02H, 0xC7, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1455206089Sfabient IAP_F_I7 | IAP_F_WM), 1456206089Sfabient IAPDESCR(C7H_04H, 0xC7, 0x04, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1457206089Sfabient IAP_F_I7 | IAP_F_WM), 1458206089Sfabient IAPDESCR(C7H_08H, 0xC7, 0x08, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1459206089Sfabient IAP_F_I7 | IAP_F_WM), 1460206089Sfabient IAPDESCR(C7H_10H, 0xC7, 0x10, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1461206089Sfabient IAP_F_I7 | IAP_F_WM), 1462185363Sjkoshy IAPDESCR(C7H_1FH, 0xC7, 0x1F, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1463185363Sjkoshy 1464206089Sfabient IAPDESCR(C8H_00H, 0xC8, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1465206089Sfabient IAPDESCR(C8H_20H, 0xC8, 0x20, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1466185363Sjkoshy 1467206089Sfabient IAPDESCR(C9H_00H, 0xC9, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1468185363Sjkoshy 1469185363Sjkoshy IAPDESCR(CAH_00H, 0xCA, 0x00, IAP_F_FM | IAP_F_CC), 1470185363Sjkoshy IAPDESCR(CAH_01H, 0xCA, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1471234046Sdavide IAPDESCR(CAH_02H, 0xCA, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1472249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1473234046Sdavide IAPDESCR(CAH_04H, 0xCA, 0x04, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1474249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1475234046Sdavide IAPDESCR(CAH_08H, 0xCA, 0x08, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1476249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1477242594Ssbruno IAPDESCR(CAH_10H, 0xCA, 0x10, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1478249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1479242594Ssbruno IAPDESCR(CAH_1EH, 0xCA, 0x1E, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1480249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1481185363Sjkoshy 1482206089Sfabient IAPDESCR(CBH_01H, 0xCB, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1483206089Sfabient IAP_F_I7 | IAP_F_WM), 1484206089Sfabient IAPDESCR(CBH_02H, 0xCB, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1485206089Sfabient IAP_F_I7 | IAP_F_WM), 1486206089Sfabient IAPDESCR(CBH_04H, 0xCB, 0x04, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1487206089Sfabient IAP_F_I7 | IAP_F_WM), 1488206089Sfabient IAPDESCR(CBH_08H, 0xCB, 0x08, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1489206089Sfabient IAP_F_I7 | IAP_F_WM), 1490206089Sfabient IAPDESCR(CBH_10H, 0xCB, 0x10, IAP_F_FM | IAP_F_CC2 | IAP_F_I7 | 1491206089Sfabient IAP_F_WM), 1492206089Sfabient IAPDESCR(CBH_40H, 0xCB, 0x40, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1493206089Sfabient IAPDESCR(CBH_80H, 0xCB, 0x80, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1494185363Sjkoshy 1495185363Sjkoshy IAPDESCR(CCH_00H, 0xCC, 0x00, IAP_F_FM | IAP_F_CC), 1496206089Sfabient IAPDESCR(CCH_01H, 0xCC, 0x01, IAP_F_FM | IAP_F_ALLCPUSCORE2 | 1497206089Sfabient IAP_F_I7 | IAP_F_WM), 1498206089Sfabient IAPDESCR(CCH_02H, 0xCC, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1499206089Sfabient IAP_F_I7 | IAP_F_WM), 1500206089Sfabient IAPDESCR(CCH_03H, 0xCC, 0x03, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1501242594Ssbruno IAPDESCR(CCH_20H, 0xCC, 0x20, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1502249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1503185363Sjkoshy 1504206089Sfabient IAPDESCR(CDH_00H, 0xCD, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1505242594Ssbruno IAPDESCR(CDH_01H, 0xCD, 0x01, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1506249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1507242594Ssbruno IAPDESCR(CDH_02H, 0xCD, 0x02, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1508250038Shiren IAP_F_SBX | IAP_F_IBX), 1509234046Sdavide 1510206089Sfabient IAPDESCR(CEH_00H, 0xCE, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1511185363Sjkoshy IAPDESCR(CFH_00H, 0xCF, 0x00, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1512185363Sjkoshy 1513185363Sjkoshy IAPDESCR(D0H_00H, 0xD0, 0x00, IAP_F_FM | IAP_F_CC), 1514234046Sdavide IAPDESCR(D0H_01H, 0xD0, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1515249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1516242594Ssbruno IAPDESCR(D0H_02H, 0xD0, 0x02, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1517249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1518242594Ssbruno IAPDESCR(D0H_10H, 0xD0, 0x10, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1519249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1520242594Ssbruno IAPDESCR(D0H_20H, 0xD0, 0x20, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1521249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1522242594Ssbruno IAPDESCR(D0H_40H, 0xD0, 0x40, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1523249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1524242594Ssbruno IAPDESCR(D0H_80H, 0xD0, 0X80, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1525249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1526250038Shiren 1527242594Ssbruno IAPDESCR(D1H_01H, 0xD1, 0x01, IAP_F_FM | IAP_F_WM | IAP_F_SB | 1528249655Shiren IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1529234046Sdavide IAPDESCR(D1H_02H, 0xD1, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1530249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1531234046Sdavide IAPDESCR(D1H_04H, 0xD1, 0x04, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1532249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1533206089Sfabient IAPDESCR(D1H_08H, 0xD1, 0x08, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1534249655Shiren IAPDESCR(D1H_10H, 0xD1, 0x10, IAP_F_HW), 1535249492Shiren IAPDESCR(D1H_20H, 0xD1, 0x20, IAP_F_FM | IAP_F_SBX | IAP_F_IBX), 1536242594Ssbruno IAPDESCR(D1H_40H, 0xD1, 0x40, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1537249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1538206089Sfabient 1539206089Sfabient IAPDESCR(D2H_01H, 0xD2, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1540249655Shiren IAP_F_I7 | IAP_F_WM | IAP_F_SB | IAP_F_IB | IAP_F_IBX | IAP_F_HW), 1541206089Sfabient IAPDESCR(D2H_02H, 0xD2, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1542249655Shiren IAP_F_I7 | IAP_F_WM | IAP_F_SB | IAP_F_IB | IAP_F_IBX | IAP_F_HW), 1543206089Sfabient IAPDESCR(D2H_04H, 0xD2, 0x04, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1544249655Shiren IAP_F_I7 | IAP_F_WM | IAP_F_SB | IAP_F_IB | IAP_F_IBX | IAP_F_HW), 1545206089Sfabient IAPDESCR(D2H_08H, 0xD2, 0x08, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1546249655Shiren IAP_F_I7 | IAP_F_WM | IAP_F_SB | IAP_F_IB | IAP_F_IBX | IAP_F_HW), 1547206089Sfabient IAPDESCR(D2H_0FH, 0xD2, 0x0F, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1548206089Sfabient IAP_F_I7 | IAP_F_WM), 1549185363Sjkoshy IAPDESCR(D2H_10H, 0xD2, 0x10, IAP_F_FM | IAP_F_CC2E), 1550185363Sjkoshy 1551249492Shiren IAPDESCR(D3H_01H, 0xD3, 0x01, IAP_F_FM | IAP_F_IB | IAP_F_SBX | 1552249655Shiren IAP_F_IBX | IAP_F_HW), 1553249492Shiren IAPDESCR(D3H_04H, 0xD3, 0x04, IAP_F_FM | IAP_F_SBX | IAP_F_IBX), 1554249492Shiren IAPDESCR(D3H_10H, 0xD3, 0x10, IAP_F_IBX), 1555249492Shiren IAPDESCR(D3H_20H, 0xD3, 0x20, IAP_F_IBX), 1556241609Sfabient 1557206089Sfabient IAPDESCR(D4H_01H, 0xD4, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1558206089Sfabient IAP_F_I7 | IAP_F_WM), 1559234046Sdavide IAPDESCR(D4H_02H, 0xD4, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1560242594Ssbruno IAP_F_SB | IAP_F_SBX), 1561185363Sjkoshy IAPDESCR(D4H_04H, 0xD4, 0x04, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1562185363Sjkoshy IAPDESCR(D4H_08H, 0xD4, 0x08, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1563185363Sjkoshy IAPDESCR(D4H_0FH, 0xD4, 0x0F, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1564185363Sjkoshy 1565206089Sfabient IAPDESCR(D5H_01H, 0xD5, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_CC2 | 1566206089Sfabient IAP_F_I7 | IAP_F_WM), 1567185363Sjkoshy IAPDESCR(D5H_02H, 0xD5, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1568185363Sjkoshy IAPDESCR(D5H_04H, 0xD5, 0x04, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1569185363Sjkoshy IAPDESCR(D5H_08H, 0xD5, 0x08, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1570185363Sjkoshy IAPDESCR(D5H_0FH, 0xD5, 0x0F, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1571185363Sjkoshy 1572185363Sjkoshy IAPDESCR(D7H_00H, 0xD7, 0x00, IAP_F_FM | IAP_F_CC), 1573185363Sjkoshy 1574185363Sjkoshy IAPDESCR(D8H_00H, 0xD8, 0x00, IAP_F_FM | IAP_F_CC), 1575185363Sjkoshy IAPDESCR(D8H_01H, 0xD8, 0x01, IAP_F_FM | IAP_F_CC), 1576185363Sjkoshy IAPDESCR(D8H_02H, 0xD8, 0x02, IAP_F_FM | IAP_F_CC), 1577185363Sjkoshy IAPDESCR(D8H_03H, 0xD8, 0x03, IAP_F_FM | IAP_F_CC), 1578185363Sjkoshy IAPDESCR(D8H_04H, 0xD8, 0x04, IAP_F_FM | IAP_F_CC), 1579185363Sjkoshy 1580185363Sjkoshy IAPDESCR(D9H_00H, 0xD9, 0x00, IAP_F_FM | IAP_F_CC), 1581185363Sjkoshy IAPDESCR(D9H_01H, 0xD9, 0x01, IAP_F_FM | IAP_F_CC), 1582185363Sjkoshy IAPDESCR(D9H_02H, 0xD9, 0x02, IAP_F_FM | IAP_F_CC), 1583185363Sjkoshy IAPDESCR(D9H_03H, 0xD9, 0x03, IAP_F_FM | IAP_F_CC), 1584185363Sjkoshy 1585185363Sjkoshy IAPDESCR(DAH_00H, 0xDA, 0x00, IAP_F_FM | IAP_F_CC), 1586185363Sjkoshy IAPDESCR(DAH_01H, 0xDA, 0x01, IAP_F_FM | IAP_F_CC), 1587185363Sjkoshy IAPDESCR(DAH_02H, 0xDA, 0x02, IAP_F_FM | IAP_F_CC), 1588185363Sjkoshy 1589185363Sjkoshy IAPDESCR(DBH_00H, 0xDB, 0x00, IAP_F_FM | IAP_F_CC), 1590206089Sfabient IAPDESCR(DBH_01H, 0xDB, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1591185363Sjkoshy 1592185363Sjkoshy IAPDESCR(DCH_01H, 0xDC, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1593185363Sjkoshy IAPDESCR(DCH_02H, 0xDC, 0x02, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1594185363Sjkoshy IAPDESCR(DCH_04H, 0xDC, 0x04, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1595185363Sjkoshy IAPDESCR(DCH_08H, 0xDC, 0x08, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1596185363Sjkoshy IAPDESCR(DCH_10H, 0xDC, 0x10, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1597185363Sjkoshy IAPDESCR(DCH_1FH, 0xDC, 0x1F, IAP_F_FM | IAP_F_CA | IAP_F_CC2), 1598185363Sjkoshy 1599185363Sjkoshy IAPDESCR(E0H_00H, 0xE0, 0x00, IAP_F_FM | IAP_F_CC | IAP_F_CC2), 1600206089Sfabient IAPDESCR(E0H_01H, 0xE0, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_I7 | 1601206089Sfabient IAP_F_WM), 1602185363Sjkoshy 1603185363Sjkoshy IAPDESCR(E2H_00H, 0xE2, 0x00, IAP_F_FM | IAP_F_CC), 1604185363Sjkoshy 1605206089Sfabient IAPDESCR(E4H_00H, 0xE4, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1606206089Sfabient IAPDESCR(E4H_01H, 0xE4, 0x01, IAP_F_FM | IAP_F_I7O), 1607206089Sfabient 1608206089Sfabient IAPDESCR(E5H_01H, 0xE5, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1609206089Sfabient 1610185363Sjkoshy IAPDESCR(E6H_00H, 0xE6, 0x00, IAP_F_FM | IAP_F_CC | IAP_F_CC2), 1611206089Sfabient IAPDESCR(E6H_01H, 0xE6, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_I7 | 1612242594Ssbruno IAP_F_WM | IAP_F_SBX), 1613206089Sfabient IAPDESCR(E6H_02H, 0xE6, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1614249655Shiren IAPDESCR(E6H_1FH, 0xE6, 0x1F, IAP_F_FM | IAP_F_IBX | IAP_F_HW), 1615185363Sjkoshy 1616206089Sfabient IAPDESCR(E8H_01H, 0xE8, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1617206089Sfabient IAPDESCR(E8H_02H, 0xE8, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1618234044Sdavide IAPDESCR(E8H_03H, 0xE8, 0x03, IAP_F_FM | IAP_F_I7O), 1619187761Sjeff 1620206089Sfabient IAPDESCR(ECH_01H, 0xEC, 0x01, IAP_F_FM | IAP_F_WM), 1621206089Sfabient 1622206089Sfabient IAPDESCR(F0H_00H, 0xF0, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1623234046Sdavide IAPDESCR(F0H_01H, 0xF0, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1624249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1625234046Sdavide IAPDESCR(F0H_02H, 0xF0, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1626249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1627234046Sdavide IAPDESCR(F0H_04H, 0xF0, 0x04, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1628249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1629234046Sdavide IAPDESCR(F0H_08H, 0xF0, 0x08, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1630249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1631234046Sdavide IAPDESCR(F0H_10H, 0xF0, 0x10, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1632249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1633234046Sdavide IAPDESCR(F0H_20H, 0xF0, 0x20, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1634249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1635234046Sdavide IAPDESCR(F0H_40H, 0xF0, 0x40, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1636249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1637234046Sdavide IAPDESCR(F0H_80H, 0xF0, 0x80, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1638249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1639206089Sfabient 1640242594Ssbruno IAPDESCR(F1H_01H, 0xF1, 0x01, IAP_F_FM | IAP_F_SB | IAP_F_IB | 1641249655Shiren IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1642234046Sdavide IAPDESCR(F1H_02H, 0xF1, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1643249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1644234046Sdavide IAPDESCR(F1H_04H, 0xF1, 0x04, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1645249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1646234046Sdavide IAPDESCR(F1H_07H, 0xF1, 0x07, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1647249655Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW), 1648206089Sfabient 1649234046Sdavide IAPDESCR(F2H_01H, 0xF2, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1650249492Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 1651234046Sdavide IAPDESCR(F2H_02H, 0xF2, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1652249492Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 1653234046Sdavide IAPDESCR(F2H_04H, 0xF2, 0x04, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1654249492Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 1655249655Shiren IAPDESCR(F2H_05H, 0xF2, 0x05, IAP_F_FM | IAP_F_HW), 1656249655Shiren IAPDESCR(F2H_06H, 0xF2, 0x06, IAP_F_FM | IAP_F_HW), 1657234046Sdavide IAPDESCR(F2H_08H, 0xF2, 0x08, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1658249492Shiren IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX), 1659249492Shiren IAPDESCR(F2H_0AH, 0xF2, 0x0A, IAP_F_FM | IAP_F_SB | IAP_F_SBX | 1660249492Shiren IAP_F_IBX), 1661206089Sfabient IAPDESCR(F2H_0FH, 0xF2, 0x0F, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1662206089Sfabient 1663206089Sfabient IAPDESCR(F3H_01H, 0xF3, 0x01, IAP_F_FM | IAP_F_I7O), 1664206089Sfabient IAPDESCR(F3H_02H, 0xF3, 0x02, IAP_F_FM | IAP_F_I7O), 1665206089Sfabient IAPDESCR(F3H_04H, 0xF3, 0x04, IAP_F_FM | IAP_F_I7O), 1666206089Sfabient IAPDESCR(F3H_08H, 0xF3, 0x08, IAP_F_FM | IAP_F_I7O), 1667206089Sfabient IAPDESCR(F3H_10H, 0xF3, 0x10, IAP_F_FM | IAP_F_I7O), 1668206089Sfabient IAPDESCR(F3H_20H, 0xF3, 0x20, IAP_F_FM | IAP_F_I7O), 1669206089Sfabient 1670206089Sfabient IAPDESCR(F4H_01H, 0xF4, 0x01, IAP_F_FM | IAP_F_I7O), 1671206089Sfabient IAPDESCR(F4H_02H, 0xF4, 0x02, IAP_F_FM | IAP_F_I7O), 1672206089Sfabient IAPDESCR(F4H_04H, 0xF4, 0x04, IAP_F_FM | IAP_F_WM | IAP_F_I7O), 1673206089Sfabient IAPDESCR(F4H_08H, 0xF4, 0x08, IAP_F_FM | IAP_F_I7O), 1674234046Sdavide IAPDESCR(F4H_10H, 0xF4, 0x10, IAP_F_FM | IAP_F_I7 | IAP_F_WM | 1675242594Ssbruno IAP_F_SB | IAP_F_SBX), 1676206089Sfabient 1677206089Sfabient IAPDESCR(F6H_01H, 0xF6, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM), 1678206089Sfabient 1679206089Sfabient IAPDESCR(F7H_01H, 0xF7, 0x01, IAP_F_FM | IAP_F_WM | IAP_F_I7), 1680206089Sfabient IAPDESCR(F7H_02H, 0xF7, 0x02, IAP_F_FM | IAP_F_WM | IAP_F_I7), 1681206089Sfabient IAPDESCR(F7H_04H, 0xF7, 0x04, IAP_F_FM | IAP_F_WM | IAP_F_I7), 1682206089Sfabient 1683206089Sfabient IAPDESCR(F8H_00H, 0xF8, 0x00, IAP_F_FM | IAP_F_ALLCPUSCORE2), 1684206089Sfabient IAPDESCR(F8H_01H, 0xF8, 0x01, IAP_F_FM | IAP_F_I7O), 1685206089Sfabient 1686206089Sfabient IAPDESCR(FDH_01H, 0xFD, 0x01, IAP_F_FM | IAP_F_WM | IAP_F_I7), 1687206089Sfabient IAPDESCR(FDH_02H, 0xFD, 0x02, IAP_F_FM | IAP_F_WM | IAP_F_I7), 1688206089Sfabient IAPDESCR(FDH_04H, 0xFD, 0x04, IAP_F_FM | IAP_F_WM | IAP_F_I7), 1689206089Sfabient IAPDESCR(FDH_08H, 0xFD, 0x08, IAP_F_FM | IAP_F_WM | IAP_F_I7), 1690206089Sfabient IAPDESCR(FDH_10H, 0xFD, 0x10, IAP_F_FM | IAP_F_WM | IAP_F_I7), 1691206089Sfabient IAPDESCR(FDH_20H, 0xFD, 0x20, IAP_F_FM | IAP_F_WM | IAP_F_I7), 1692206089Sfabient IAPDESCR(FDH_40H, 0xFD, 0x40, IAP_F_FM | IAP_F_WM | IAP_F_I7), 1693185363Sjkoshy}; 1694185363Sjkoshy 1695185363Sjkoshystatic const int niap_events = sizeof(iap_events) / sizeof(iap_events[0]); 1696185363Sjkoshy 1697185363Sjkoshystatic pmc_value_t 1698185363Sjkoshyiap_perfctr_value_to_reload_count(pmc_value_t v) 1699185363Sjkoshy{ 1700185363Sjkoshy v &= (1ULL << core_iap_width) - 1; 1701185363Sjkoshy return (1ULL << core_iap_width) - v; 1702185363Sjkoshy} 1703185363Sjkoshy 1704185363Sjkoshystatic pmc_value_t 1705185363Sjkoshyiap_reload_count_to_perfctr_value(pmc_value_t rlc) 1706185363Sjkoshy{ 1707185363Sjkoshy return (1ULL << core_iap_width) - rlc; 1708185363Sjkoshy} 1709185363Sjkoshy 1710185363Sjkoshystatic int 1711185363Sjkoshyiap_pmc_has_overflowed(int ri) 1712185363Sjkoshy{ 1713185363Sjkoshy uint64_t v; 1714185363Sjkoshy 1715185363Sjkoshy /* 1716185363Sjkoshy * We treat a Core (i.e., Intel architecture v1) PMC as has 1717185363Sjkoshy * having overflowed if its MSB is zero. 1718185363Sjkoshy */ 1719185363Sjkoshy v = rdpmc(ri); 1720185363Sjkoshy return ((v & (1ULL << (core_iap_width - 1))) == 0); 1721185363Sjkoshy} 1722185363Sjkoshy 1723185363Sjkoshy/* 1724185363Sjkoshy * Check an event against the set of supported architectural events. 1725185363Sjkoshy * 1726185363Sjkoshy * Returns 1 if the event is architectural and unsupported on this 1727185363Sjkoshy * CPU. Returns 0 otherwise. 1728185363Sjkoshy */ 1729185363Sjkoshy 1730185363Sjkoshystatic int 1731185363Sjkoshyiap_architectural_event_is_unsupported(enum pmc_event pe) 1732185363Sjkoshy{ 1733185363Sjkoshy enum core_arch_events ae; 1734185363Sjkoshy 1735185363Sjkoshy switch (pe) { 1736185363Sjkoshy case PMC_EV_IAP_EVENT_3CH_00H: 1737185363Sjkoshy ae = CORE_AE_UNHALTED_CORE_CYCLES; 1738185363Sjkoshy break; 1739185363Sjkoshy case PMC_EV_IAP_EVENT_C0H_00H: 1740185363Sjkoshy ae = CORE_AE_INSTRUCTION_RETIRED; 1741185363Sjkoshy break; 1742185363Sjkoshy case PMC_EV_IAP_EVENT_3CH_01H: 1743185363Sjkoshy ae = CORE_AE_UNHALTED_REFERENCE_CYCLES; 1744185363Sjkoshy break; 1745185363Sjkoshy case PMC_EV_IAP_EVENT_2EH_4FH: 1746185363Sjkoshy ae = CORE_AE_LLC_REFERENCE; 1747185363Sjkoshy break; 1748185363Sjkoshy case PMC_EV_IAP_EVENT_2EH_41H: 1749185363Sjkoshy ae = CORE_AE_LLC_MISSES; 1750185363Sjkoshy break; 1751185363Sjkoshy case PMC_EV_IAP_EVENT_C4H_00H: 1752185363Sjkoshy ae = CORE_AE_BRANCH_INSTRUCTION_RETIRED; 1753185363Sjkoshy break; 1754185363Sjkoshy case PMC_EV_IAP_EVENT_C5H_00H: 1755185363Sjkoshy ae = CORE_AE_BRANCH_MISSES_RETIRED; 1756185363Sjkoshy break; 1757185363Sjkoshy 1758185363Sjkoshy default: /* Non architectural event. */ 1759185363Sjkoshy return (0); 1760185363Sjkoshy } 1761185363Sjkoshy 1762185363Sjkoshy return ((core_architectural_events & (1 << ae)) == 0); 1763185363Sjkoshy} 1764185363Sjkoshy 1765185363Sjkoshystatic int 1766206089Sfabientiap_event_corei7_ok_on_counter(enum pmc_event pe, int ri) 1767206089Sfabient{ 1768206089Sfabient uint32_t mask; 1769206089Sfabient 1770206089Sfabient switch (pe) { 1771206089Sfabient /* 1772206089Sfabient * Events valid only on counter 0, 1. 1773206089Sfabient */ 1774206089Sfabient case PMC_EV_IAP_EVENT_40H_01H: 1775206089Sfabient case PMC_EV_IAP_EVENT_40H_02H: 1776206089Sfabient case PMC_EV_IAP_EVENT_40H_04H: 1777206089Sfabient case PMC_EV_IAP_EVENT_40H_08H: 1778206089Sfabient case PMC_EV_IAP_EVENT_40H_0FH: 1779206089Sfabient case PMC_EV_IAP_EVENT_41H_02H: 1780206089Sfabient case PMC_EV_IAP_EVENT_41H_04H: 1781206089Sfabient case PMC_EV_IAP_EVENT_41H_08H: 1782206089Sfabient case PMC_EV_IAP_EVENT_42H_01H: 1783206089Sfabient case PMC_EV_IAP_EVENT_42H_02H: 1784206089Sfabient case PMC_EV_IAP_EVENT_42H_04H: 1785206089Sfabient case PMC_EV_IAP_EVENT_42H_08H: 1786206089Sfabient case PMC_EV_IAP_EVENT_43H_01H: 1787206089Sfabient case PMC_EV_IAP_EVENT_43H_02H: 1788206089Sfabient case PMC_EV_IAP_EVENT_51H_01H: 1789206089Sfabient case PMC_EV_IAP_EVENT_51H_02H: 1790206089Sfabient case PMC_EV_IAP_EVENT_51H_04H: 1791206089Sfabient case PMC_EV_IAP_EVENT_51H_08H: 1792206089Sfabient case PMC_EV_IAP_EVENT_63H_01H: 1793206089Sfabient case PMC_EV_IAP_EVENT_63H_02H: 1794206089Sfabient mask = 0x3; 1795206089Sfabient break; 1796206089Sfabient 1797206089Sfabient default: 1798206089Sfabient mask = ~0; /* Any row index is ok. */ 1799206089Sfabient } 1800206089Sfabient 1801206089Sfabient return (mask & (1 << ri)); 1802206089Sfabient} 1803206089Sfabient 1804206089Sfabientstatic int 1805206089Sfabientiap_event_westmere_ok_on_counter(enum pmc_event pe, int ri) 1806206089Sfabient{ 1807206089Sfabient uint32_t mask; 1808206089Sfabient 1809206089Sfabient switch (pe) { 1810206089Sfabient /* 1811206089Sfabient * Events valid only on counter 0. 1812206089Sfabient */ 1813229393Sfabient case PMC_EV_IAP_EVENT_60H_01H: 1814229393Sfabient case PMC_EV_IAP_EVENT_60H_02H: 1815229393Sfabient case PMC_EV_IAP_EVENT_60H_04H: 1816250038Shiren case PMC_EV_IAP_EVENT_60H_08H: 1817206089Sfabient case PMC_EV_IAP_EVENT_B3H_01H: 1818206089Sfabient case PMC_EV_IAP_EVENT_B3H_02H: 1819206089Sfabient case PMC_EV_IAP_EVENT_B3H_04H: 1820206089Sfabient mask = 0x1; 1821206089Sfabient break; 1822206089Sfabient 1823206089Sfabient /* 1824206089Sfabient * Events valid only on counter 0, 1. 1825206089Sfabient */ 1826229393Sfabient case PMC_EV_IAP_EVENT_4CH_01H: 1827229393Sfabient case PMC_EV_IAP_EVENT_4EH_01H: 1828229393Sfabient case PMC_EV_IAP_EVENT_4EH_02H: 1829229393Sfabient case PMC_EV_IAP_EVENT_4EH_04H: 1830206089Sfabient case PMC_EV_IAP_EVENT_51H_01H: 1831206089Sfabient case PMC_EV_IAP_EVENT_51H_02H: 1832206089Sfabient case PMC_EV_IAP_EVENT_51H_04H: 1833206089Sfabient case PMC_EV_IAP_EVENT_51H_08H: 1834206089Sfabient case PMC_EV_IAP_EVENT_63H_01H: 1835206089Sfabient case PMC_EV_IAP_EVENT_63H_02H: 1836206089Sfabient mask = 0x3; 1837206089Sfabient break; 1838206089Sfabient 1839206089Sfabient default: 1840206089Sfabient mask = ~0; /* Any row index is ok. */ 1841206089Sfabient } 1842206089Sfabient 1843206089Sfabient return (mask & (1 << ri)); 1844206089Sfabient} 1845206089Sfabient 1846206089Sfabientstatic int 1847249492Shireniap_event_sb_sbx_ib_ibx_ok_on_counter(enum pmc_event pe, int ri) 1848234046Sdavide{ 1849234046Sdavide uint32_t mask; 1850241609Sfabient 1851234046Sdavide switch (pe) { 1852241609Sfabient /* Events valid only on counter 0. */ 1853241609Sfabient case PMC_EV_IAP_EVENT_B7H_01H: 1854241609Sfabient mask = 0x1; 1855241609Sfabient break; 1856241609Sfabient /* Events valid only on counter 1. */ 1857241609Sfabient case PMC_EV_IAP_EVENT_C0H_01H: 1858241609Sfabient mask = 0x1; 1859241609Sfabient break; 1860241609Sfabient /* Events valid only on counter 2. */ 1861234046Sdavide case PMC_EV_IAP_EVENT_48H_01H: 1862242594Ssbruno case PMC_EV_IAP_EVENT_A2H_02H: 1863241609Sfabient mask = 0x4; 1864234046Sdavide break; 1865241609Sfabient /* Events valid only on counter 3. */ 1866249492Shiren case PMC_EV_IAP_EVENT_A3H_08H: 1867241609Sfabient case PMC_EV_IAP_EVENT_BBH_01H: 1868241609Sfabient case PMC_EV_IAP_EVENT_CDH_01H: 1869241609Sfabient case PMC_EV_IAP_EVENT_CDH_02H: 1870241609Sfabient mask = 0x8; 1871241609Sfabient break; 1872234046Sdavide default: 1873234046Sdavide mask = ~0; /* Any row index is ok. */ 1874234046Sdavide } 1875241609Sfabient 1876234046Sdavide return (mask & (1 << ri)); 1877234046Sdavide} 1878234046Sdavide 1879234046Sdavidestatic int 1880185363Sjkoshyiap_event_ok_on_counter(enum pmc_event pe, int ri) 1881185363Sjkoshy{ 1882185363Sjkoshy uint32_t mask; 1883185363Sjkoshy 1884185363Sjkoshy switch (pe) { 1885185363Sjkoshy /* 1886185363Sjkoshy * Events valid only on counter 0. 1887185363Sjkoshy */ 1888185363Sjkoshy case PMC_EV_IAP_EVENT_10H_00H: 1889185363Sjkoshy case PMC_EV_IAP_EVENT_14H_00H: 1890185363Sjkoshy case PMC_EV_IAP_EVENT_18H_00H: 1891206089Sfabient case PMC_EV_IAP_EVENT_B3H_01H: 1892206089Sfabient case PMC_EV_IAP_EVENT_B3H_02H: 1893206089Sfabient case PMC_EV_IAP_EVENT_B3H_04H: 1894185363Sjkoshy case PMC_EV_IAP_EVENT_C1H_00H: 1895185363Sjkoshy case PMC_EV_IAP_EVENT_CBH_01H: 1896185363Sjkoshy case PMC_EV_IAP_EVENT_CBH_02H: 1897185363Sjkoshy mask = (1 << 0); 1898185363Sjkoshy break; 1899185363Sjkoshy 1900185363Sjkoshy /* 1901185363Sjkoshy * Events valid only on counter 1. 1902185363Sjkoshy */ 1903185363Sjkoshy case PMC_EV_IAP_EVENT_11H_00H: 1904185363Sjkoshy case PMC_EV_IAP_EVENT_12H_00H: 1905185363Sjkoshy case PMC_EV_IAP_EVENT_13H_00H: 1906185363Sjkoshy mask = (1 << 1); 1907185363Sjkoshy break; 1908185363Sjkoshy 1909185363Sjkoshy default: 1910185363Sjkoshy mask = ~0; /* Any row index is ok. */ 1911185363Sjkoshy } 1912185363Sjkoshy 1913185363Sjkoshy return (mask & (1 << ri)); 1914185363Sjkoshy} 1915185363Sjkoshy 1916185363Sjkoshystatic int 1917185363Sjkoshyiap_allocate_pmc(int cpu, int ri, struct pmc *pm, 1918185363Sjkoshy const struct pmc_op_pmcallocate *a) 1919185363Sjkoshy{ 1920229397Sfabient int n, model; 1921185363Sjkoshy enum pmc_event ev; 1922185363Sjkoshy struct iap_event_descr *ie; 1923185363Sjkoshy uint32_t c, caps, config, cpuflag, evsel, mask; 1924185363Sjkoshy 1925185363Sjkoshy KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), 1926185363Sjkoshy ("[core,%d] illegal CPU %d", __LINE__, cpu)); 1927185363Sjkoshy KASSERT(ri >= 0 && ri < core_iap_npmc, 1928185363Sjkoshy ("[core,%d] illegal row-index value %d", __LINE__, ri)); 1929185363Sjkoshy 1930185363Sjkoshy /* check requested capabilities */ 1931185363Sjkoshy caps = a->pm_caps; 1932185363Sjkoshy if ((IAP_PMC_CAPS & caps) != caps) 1933185363Sjkoshy return (EPERM); 1934185363Sjkoshy 1935185363Sjkoshy ev = pm->pm_event; 1936185363Sjkoshy 1937185363Sjkoshy if (iap_architectural_event_is_unsupported(ev)) 1938185363Sjkoshy return (EOPNOTSUPP); 1939185363Sjkoshy 1940229397Sfabient /* 1941229397Sfabient * A small number of events are not supported in all the 1942229397Sfabient * processors based on a given microarchitecture. 1943229397Sfabient */ 1944250038Shiren if (ev == PMC_EV_IAP_EVENT_0FH_01H || ev == PMC_EV_IAP_EVENT_0FH_80H) { 1945229397Sfabient model = ((cpu_id & 0xF0000) >> 12) | ((cpu_id & 0xF0) >> 4); 1946250038Shiren if (core_cputype == PMC_CPU_INTEL_COREI7 && model != 0x2E) 1947250038Shiren return (EINVAL); 1948229397Sfabient } 1949250038Shiren 1950206089Sfabient switch (core_cputype) { 1951206089Sfabient case PMC_CPU_INTEL_COREI7: 1952206089Sfabient if (iap_event_corei7_ok_on_counter(ev, ri) == 0) 1953206089Sfabient return (EINVAL); 1954206089Sfabient break; 1955234046Sdavide case PMC_CPU_INTEL_SANDYBRIDGE: 1956242594Ssbruno case PMC_CPU_INTEL_SANDYBRIDGE_XEON: 1957241609Sfabient case PMC_CPU_INTEL_IVYBRIDGE: 1958249492Shiren case PMC_CPU_INTEL_IVYBRIDGE_XEON: 1959249655Shiren case PMC_CPU_INTEL_HASWELL: 1960249492Shiren if (iap_event_sb_sbx_ib_ibx_ok_on_counter(ev, ri) == 0) 1961234046Sdavide return (EINVAL); 1962234046Sdavide break; 1963206089Sfabient case PMC_CPU_INTEL_WESTMERE: 1964206089Sfabient if (iap_event_westmere_ok_on_counter(ev, ri) == 0) 1965206089Sfabient return (EINVAL); 1966206089Sfabient break; 1967206089Sfabient default: 1968206089Sfabient if (iap_event_ok_on_counter(ev, ri) == 0) 1969206089Sfabient return (EINVAL); 1970206089Sfabient } 1971185363Sjkoshy 1972185363Sjkoshy /* 1973185363Sjkoshy * Look for an event descriptor with matching CPU and event id 1974185363Sjkoshy * fields. 1975185363Sjkoshy */ 1976185363Sjkoshy 1977185363Sjkoshy switch (core_cputype) { 1978185363Sjkoshy default: 1979185363Sjkoshy case PMC_CPU_INTEL_ATOM: 1980185363Sjkoshy cpuflag = IAP_F_CA; 1981185363Sjkoshy break; 1982185363Sjkoshy case PMC_CPU_INTEL_CORE: 1983185363Sjkoshy cpuflag = IAP_F_CC; 1984185363Sjkoshy break; 1985185363Sjkoshy case PMC_CPU_INTEL_CORE2: 1986185363Sjkoshy cpuflag = IAP_F_CC2; 1987185363Sjkoshy break; 1988185363Sjkoshy case PMC_CPU_INTEL_CORE2EXTREME: 1989185585Sjkoshy cpuflag = IAP_F_CC2 | IAP_F_CC2E; 1990185363Sjkoshy break; 1991187761Sjeff case PMC_CPU_INTEL_COREI7: 1992187761Sjeff cpuflag = IAP_F_I7; 1993187761Sjeff break; 1994249655Shiren case PMC_CPU_INTEL_HASWELL: 1995249655Shiren cpuflag = IAP_F_HW; 1996249655Shiren break; 1997241609Sfabient case PMC_CPU_INTEL_IVYBRIDGE: 1998241609Sfabient cpuflag = IAP_F_IB; 1999241609Sfabient break; 2000249492Shiren case PMC_CPU_INTEL_IVYBRIDGE_XEON: 2001249492Shiren cpuflag = IAP_F_IBX; 2002249492Shiren break; 2003250038Shiren case PMC_CPU_INTEL_SANDYBRIDGE: 2004234046Sdavide cpuflag = IAP_F_SB; 2005234046Sdavide break; 2006250038Shiren case PMC_CPU_INTEL_SANDYBRIDGE_XEON: 2007242594Ssbruno cpuflag = IAP_F_SBX; 2008242594Ssbruno break; 2009206089Sfabient case PMC_CPU_INTEL_WESTMERE: 2010206089Sfabient cpuflag = IAP_F_WM; 2011206089Sfabient break; 2012185363Sjkoshy } 2013185363Sjkoshy 2014185363Sjkoshy for (n = 0, ie = iap_events; n < niap_events; n++, ie++) 2015185363Sjkoshy if (ie->iap_ev == ev && ie->iap_flags & cpuflag) 2016185363Sjkoshy break; 2017185363Sjkoshy 2018185363Sjkoshy if (n == niap_events) 2019185363Sjkoshy return (EINVAL); 2020185363Sjkoshy 2021185363Sjkoshy /* 2022185363Sjkoshy * A matching event descriptor has been found, so start 2023185363Sjkoshy * assembling the contents of the event select register. 2024185363Sjkoshy */ 2025185363Sjkoshy evsel = ie->iap_evcode; 2026185363Sjkoshy 2027185363Sjkoshy config = a->pm_md.pm_iap.pm_iap_config & ~IAP_F_CMASK; 2028185363Sjkoshy 2029185363Sjkoshy /* 2030185363Sjkoshy * If the event uses a fixed umask value, reject any umask 2031185363Sjkoshy * bits set by the user. 2032185363Sjkoshy */ 2033185363Sjkoshy if (ie->iap_flags & IAP_F_FM) { 2034185363Sjkoshy 2035185363Sjkoshy if (IAP_UMASK(config) != 0) 2036185363Sjkoshy return (EINVAL); 2037185363Sjkoshy 2038185363Sjkoshy evsel |= (ie->iap_umask << 8); 2039185363Sjkoshy 2040185363Sjkoshy } else { 2041185363Sjkoshy 2042185363Sjkoshy /* 2043185363Sjkoshy * Otherwise, the UMASK value needs to be taken from 2044185363Sjkoshy * the MD fields of the allocation request. Reject 2045185363Sjkoshy * requests that specify reserved bits. 2046185363Sjkoshy */ 2047185363Sjkoshy 2048185363Sjkoshy mask = 0; 2049185363Sjkoshy 2050201023Sjkoshy if (ie->iap_umask & IAP_M_CORE) { 2051185363Sjkoshy if ((c = (config & IAP_F_CORE)) != IAP_CORE_ALL && 2052185363Sjkoshy c != IAP_CORE_THIS) 2053185363Sjkoshy return (EINVAL); 2054185363Sjkoshy mask |= IAP_F_CORE; 2055185363Sjkoshy } 2056185363Sjkoshy 2057201023Sjkoshy if (ie->iap_umask & IAP_M_AGENT) 2058185363Sjkoshy mask |= IAP_F_AGENT; 2059185363Sjkoshy 2060201023Sjkoshy if (ie->iap_umask & IAP_M_PREFETCH) { 2061185363Sjkoshy 2062185363Sjkoshy if ((c = (config & IAP_F_PREFETCH)) == 2063185363Sjkoshy IAP_PREFETCH_RESERVED) 2064185363Sjkoshy return (EINVAL); 2065185363Sjkoshy 2066185363Sjkoshy mask |= IAP_F_PREFETCH; 2067185363Sjkoshy } 2068185363Sjkoshy 2069201023Sjkoshy if (ie->iap_umask & IAP_M_MESI) 2070185363Sjkoshy mask |= IAP_F_MESI; 2071185363Sjkoshy 2072201023Sjkoshy if (ie->iap_umask & IAP_M_SNOOPRESPONSE) 2073185363Sjkoshy mask |= IAP_F_SNOOPRESPONSE; 2074185363Sjkoshy 2075201023Sjkoshy if (ie->iap_umask & IAP_M_SNOOPTYPE) 2076185363Sjkoshy mask |= IAP_F_SNOOPTYPE; 2077185363Sjkoshy 2078201023Sjkoshy if (ie->iap_umask & IAP_M_TRANSITION) 2079185363Sjkoshy mask |= IAP_F_TRANSITION; 2080185363Sjkoshy 2081185363Sjkoshy /* 2082185363Sjkoshy * If bits outside of the allowed set of umask bits 2083185363Sjkoshy * are set, reject the request. 2084185363Sjkoshy */ 2085185363Sjkoshy if (config & ~mask) 2086185363Sjkoshy return (EINVAL); 2087185363Sjkoshy 2088185363Sjkoshy evsel |= (config & mask); 2089185363Sjkoshy 2090185363Sjkoshy } 2091185363Sjkoshy 2092185363Sjkoshy /* 2093234046Sdavide * Only Atom and SandyBridge CPUs support the 'ANY' qualifier. 2094185363Sjkoshy */ 2095234046Sdavide if (core_cputype == PMC_CPU_INTEL_ATOM || 2096242594Ssbruno core_cputype == PMC_CPU_INTEL_SANDYBRIDGE || 2097242594Ssbruno core_cputype == PMC_CPU_INTEL_SANDYBRIDGE_XEON) 2098185363Sjkoshy evsel |= (config & IAP_ANY); 2099185363Sjkoshy else if (config & IAP_ANY) 2100185363Sjkoshy return (EINVAL); 2101185363Sjkoshy 2102206089Sfabient /* 2103206089Sfabient * Check offcore response configuration. 2104206089Sfabient */ 2105206089Sfabient if (a->pm_md.pm_iap.pm_iap_rsp != 0) { 2106206089Sfabient if (ev != PMC_EV_IAP_EVENT_B7H_01H && 2107206089Sfabient ev != PMC_EV_IAP_EVENT_BBH_01H) 2108206089Sfabient return (EINVAL); 2109206089Sfabient if (core_cputype == PMC_CPU_INTEL_COREI7 && 2110206089Sfabient ev == PMC_EV_IAP_EVENT_BBH_01H) 2111206089Sfabient return (EINVAL); 2112241609Sfabient if ((core_cputype == PMC_CPU_INTEL_COREI7 || 2113241609Sfabient core_cputype == PMC_CPU_INTEL_WESTMERE) && 2114241609Sfabient a->pm_md.pm_iap.pm_iap_rsp & ~IA_OFFCORE_RSP_MASK_I7WM) 2115206089Sfabient return (EINVAL); 2116241609Sfabient else if ((core_cputype == PMC_CPU_INTEL_SANDYBRIDGE || 2117249492Shiren core_cputype == PMC_CPU_INTEL_SANDYBRIDGE_XEON || 2118249492Shiren core_cputype == PMC_CPU_INTEL_IVYBRIDGE || 2119249492Shiren core_cputype == PMC_CPU_INTEL_IVYBRIDGE_XEON) && 2120241609Sfabient a->pm_md.pm_iap.pm_iap_rsp & ~IA_OFFCORE_RSP_MASK_SBIB) 2121241609Sfabient return (EINVAL); 2122241609Sfabient pm->pm_md.pm_iap.pm_iap_rsp = a->pm_md.pm_iap.pm_iap_rsp; 2123206089Sfabient } 2124206089Sfabient 2125185363Sjkoshy if (caps & PMC_CAP_THRESHOLD) 2126185363Sjkoshy evsel |= (a->pm_md.pm_iap.pm_iap_config & IAP_F_CMASK); 2127185363Sjkoshy if (caps & PMC_CAP_USER) 2128185363Sjkoshy evsel |= IAP_USR; 2129185363Sjkoshy if (caps & PMC_CAP_SYSTEM) 2130185363Sjkoshy evsel |= IAP_OS; 2131185363Sjkoshy if ((caps & (PMC_CAP_USER | PMC_CAP_SYSTEM)) == 0) 2132185363Sjkoshy evsel |= (IAP_OS | IAP_USR); 2133185363Sjkoshy if (caps & PMC_CAP_EDGE) 2134185363Sjkoshy evsel |= IAP_EDGE; 2135185363Sjkoshy if (caps & PMC_CAP_INVERT) 2136185363Sjkoshy evsel |= IAP_INV; 2137185363Sjkoshy if (caps & PMC_CAP_INTERRUPT) 2138185363Sjkoshy evsel |= IAP_INT; 2139185363Sjkoshy 2140185363Sjkoshy pm->pm_md.pm_iap.pm_iap_evsel = evsel; 2141185363Sjkoshy 2142185363Sjkoshy return (0); 2143185363Sjkoshy} 2144185363Sjkoshy 2145185363Sjkoshystatic int 2146185363Sjkoshyiap_config_pmc(int cpu, int ri, struct pmc *pm) 2147185363Sjkoshy{ 2148185363Sjkoshy KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), 2149185363Sjkoshy ("[core,%d] illegal CPU %d", __LINE__, cpu)); 2150185363Sjkoshy 2151185363Sjkoshy KASSERT(ri >= 0 && ri < core_iap_npmc, 2152185363Sjkoshy ("[core,%d] illegal row-index %d", __LINE__, ri)); 2153185363Sjkoshy 2154185363Sjkoshy PMCDBG(MDP,CFG,1, "iap-config cpu=%d ri=%d pm=%p", cpu, ri, pm); 2155185363Sjkoshy 2156185363Sjkoshy KASSERT(core_pcpu[cpu] != NULL, ("[core,%d] null per-cpu %d", __LINE__, 2157185363Sjkoshy cpu)); 2158185363Sjkoshy 2159185363Sjkoshy core_pcpu[cpu]->pc_corepmcs[ri].phw_pmc = pm; 2160185363Sjkoshy 2161185363Sjkoshy return (0); 2162185363Sjkoshy} 2163185363Sjkoshy 2164185363Sjkoshystatic int 2165185363Sjkoshyiap_describe(int cpu, int ri, struct pmc_info *pi, struct pmc **ppmc) 2166185363Sjkoshy{ 2167185363Sjkoshy int error; 2168185363Sjkoshy struct pmc_hw *phw; 2169185363Sjkoshy char iap_name[PMC_NAME_MAX]; 2170185363Sjkoshy 2171185363Sjkoshy phw = &core_pcpu[cpu]->pc_corepmcs[ri]; 2172185363Sjkoshy 2173185363Sjkoshy (void) snprintf(iap_name, sizeof(iap_name), "IAP-%d", ri); 2174185363Sjkoshy if ((error = copystr(iap_name, pi->pm_name, PMC_NAME_MAX, 2175185363Sjkoshy NULL)) != 0) 2176185363Sjkoshy return (error); 2177185363Sjkoshy 2178185363Sjkoshy pi->pm_class = PMC_CLASS_IAP; 2179185363Sjkoshy 2180185363Sjkoshy if (phw->phw_state & PMC_PHW_FLAG_IS_ENABLED) { 2181185363Sjkoshy pi->pm_enabled = TRUE; 2182185363Sjkoshy *ppmc = phw->phw_pmc; 2183185363Sjkoshy } else { 2184185363Sjkoshy pi->pm_enabled = FALSE; 2185185363Sjkoshy *ppmc = NULL; 2186185363Sjkoshy } 2187185363Sjkoshy 2188185363Sjkoshy return (0); 2189185363Sjkoshy} 2190185363Sjkoshy 2191185363Sjkoshystatic int 2192185363Sjkoshyiap_get_config(int cpu, int ri, struct pmc **ppm) 2193185363Sjkoshy{ 2194185363Sjkoshy *ppm = core_pcpu[cpu]->pc_corepmcs[ri].phw_pmc; 2195185363Sjkoshy 2196185363Sjkoshy return (0); 2197185363Sjkoshy} 2198185363Sjkoshy 2199185363Sjkoshystatic int 2200185363Sjkoshyiap_get_msr(int ri, uint32_t *msr) 2201185363Sjkoshy{ 2202185363Sjkoshy KASSERT(ri >= 0 && ri < core_iap_npmc, 2203185363Sjkoshy ("[iap,%d] ri %d out of range", __LINE__, ri)); 2204185363Sjkoshy 2205185363Sjkoshy *msr = ri; 2206185363Sjkoshy 2207185363Sjkoshy return (0); 2208185363Sjkoshy} 2209185363Sjkoshy 2210185363Sjkoshystatic int 2211185363Sjkoshyiap_read_pmc(int cpu, int ri, pmc_value_t *v) 2212185363Sjkoshy{ 2213185363Sjkoshy struct pmc *pm; 2214185363Sjkoshy pmc_value_t tmp; 2215185363Sjkoshy 2216185363Sjkoshy KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), 2217185363Sjkoshy ("[core,%d] illegal cpu value %d", __LINE__, cpu)); 2218185363Sjkoshy KASSERT(ri >= 0 && ri < core_iap_npmc, 2219185363Sjkoshy ("[core,%d] illegal row-index %d", __LINE__, ri)); 2220185363Sjkoshy 2221185363Sjkoshy pm = core_pcpu[cpu]->pc_corepmcs[ri].phw_pmc; 2222185363Sjkoshy 2223185363Sjkoshy KASSERT(pm, 2224185363Sjkoshy ("[core,%d] cpu %d ri %d pmc not configured", __LINE__, cpu, 2225185363Sjkoshy ri)); 2226185363Sjkoshy 2227185363Sjkoshy tmp = rdpmc(ri); 2228185363Sjkoshy if (PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm))) 2229185363Sjkoshy *v = iap_perfctr_value_to_reload_count(tmp); 2230185363Sjkoshy else 2231233810Sgnn *v = tmp & ((1ULL << core_iap_width) - 1); 2232185363Sjkoshy 2233185363Sjkoshy PMCDBG(MDP,REA,1, "iap-read cpu=%d ri=%d msr=0x%x -> v=%jx", cpu, ri, 2234185363Sjkoshy ri, *v); 2235185363Sjkoshy 2236185363Sjkoshy return (0); 2237185363Sjkoshy} 2238185363Sjkoshy 2239185363Sjkoshystatic int 2240185363Sjkoshyiap_release_pmc(int cpu, int ri, struct pmc *pm) 2241185363Sjkoshy{ 2242185363Sjkoshy (void) pm; 2243185363Sjkoshy 2244185363Sjkoshy PMCDBG(MDP,REL,1, "iap-release cpu=%d ri=%d pm=%p", cpu, ri, 2245185363Sjkoshy pm); 2246185363Sjkoshy 2247185363Sjkoshy KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), 2248185363Sjkoshy ("[core,%d] illegal CPU value %d", __LINE__, cpu)); 2249185363Sjkoshy KASSERT(ri >= 0 && ri < core_iap_npmc, 2250185363Sjkoshy ("[core,%d] illegal row-index %d", __LINE__, ri)); 2251185363Sjkoshy 2252185363Sjkoshy KASSERT(core_pcpu[cpu]->pc_corepmcs[ri].phw_pmc 2253185363Sjkoshy == NULL, ("[core,%d] PHW pmc non-NULL", __LINE__)); 2254185363Sjkoshy 2255185363Sjkoshy return (0); 2256185363Sjkoshy} 2257185363Sjkoshy 2258185363Sjkoshystatic int 2259185363Sjkoshyiap_start_pmc(int cpu, int ri) 2260185363Sjkoshy{ 2261185363Sjkoshy struct pmc *pm; 2262185363Sjkoshy uint32_t evsel; 2263185363Sjkoshy struct core_cpu *cc; 2264185363Sjkoshy 2265185363Sjkoshy KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), 2266185363Sjkoshy ("[core,%d] illegal CPU value %d", __LINE__, cpu)); 2267185363Sjkoshy KASSERT(ri >= 0 && ri < core_iap_npmc, 2268185363Sjkoshy ("[core,%d] illegal row-index %d", __LINE__, ri)); 2269185363Sjkoshy 2270185363Sjkoshy cc = core_pcpu[cpu]; 2271185363Sjkoshy pm = cc->pc_corepmcs[ri].phw_pmc; 2272185363Sjkoshy 2273185363Sjkoshy KASSERT(pm, 2274185363Sjkoshy ("[core,%d] starting cpu%d,ri%d with no pmc configured", 2275185363Sjkoshy __LINE__, cpu, ri)); 2276185363Sjkoshy 2277185363Sjkoshy PMCDBG(MDP,STA,1, "iap-start cpu=%d ri=%d", cpu, ri); 2278185363Sjkoshy 2279185363Sjkoshy evsel = pm->pm_md.pm_iap.pm_iap_evsel; 2280185363Sjkoshy 2281185363Sjkoshy PMCDBG(MDP,STA,2, "iap-start/2 cpu=%d ri=%d evselmsr=0x%x evsel=0x%x", 2282185363Sjkoshy cpu, ri, IAP_EVSEL0 + ri, evsel); 2283185363Sjkoshy 2284206089Sfabient /* Event specific configuration. */ 2285206089Sfabient switch (pm->pm_event) { 2286206089Sfabient case PMC_EV_IAP_EVENT_B7H_01H: 2287206089Sfabient wrmsr(IA_OFFCORE_RSP0, pm->pm_md.pm_iap.pm_iap_rsp); 2288206089Sfabient break; 2289206089Sfabient case PMC_EV_IAP_EVENT_BBH_01H: 2290206089Sfabient wrmsr(IA_OFFCORE_RSP1, pm->pm_md.pm_iap.pm_iap_rsp); 2291206089Sfabient break; 2292206089Sfabient default: 2293206089Sfabient break; 2294206089Sfabient } 2295206089Sfabient 2296185363Sjkoshy wrmsr(IAP_EVSEL0 + ri, evsel | IAP_EN); 2297185363Sjkoshy 2298185363Sjkoshy if (core_cputype == PMC_CPU_INTEL_CORE) 2299185363Sjkoshy return (0); 2300185363Sjkoshy 2301185363Sjkoshy do { 2302185363Sjkoshy cc->pc_resync = 0; 2303185363Sjkoshy cc->pc_globalctrl |= (1ULL << ri); 2304185363Sjkoshy wrmsr(IA_GLOBAL_CTRL, cc->pc_globalctrl); 2305185363Sjkoshy } while (cc->pc_resync != 0); 2306185363Sjkoshy 2307185363Sjkoshy return (0); 2308185363Sjkoshy} 2309185363Sjkoshy 2310185363Sjkoshystatic int 2311185363Sjkoshyiap_stop_pmc(int cpu, int ri) 2312185363Sjkoshy{ 2313185363Sjkoshy struct pmc *pm; 2314185363Sjkoshy struct core_cpu *cc; 2315210012Sgnn uint64_t msr; 2316185363Sjkoshy 2317185363Sjkoshy KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), 2318185363Sjkoshy ("[core,%d] illegal cpu value %d", __LINE__, cpu)); 2319185363Sjkoshy KASSERT(ri >= 0 && ri < core_iap_npmc, 2320185363Sjkoshy ("[core,%d] illegal row index %d", __LINE__, ri)); 2321185363Sjkoshy 2322185363Sjkoshy cc = core_pcpu[cpu]; 2323185363Sjkoshy pm = cc->pc_corepmcs[ri].phw_pmc; 2324185363Sjkoshy 2325185363Sjkoshy KASSERT(pm, 2326185363Sjkoshy ("[core,%d] cpu%d ri%d no configured PMC to stop", __LINE__, 2327185363Sjkoshy cpu, ri)); 2328185363Sjkoshy 2329185363Sjkoshy PMCDBG(MDP,STO,1, "iap-stop cpu=%d ri=%d", cpu, ri); 2330185363Sjkoshy 2331210621Sgnn msr = rdmsr(IAP_EVSEL0 + ri) & ~IAP_EVSEL_MASK; 2332210621Sgnn wrmsr(IAP_EVSEL0 + ri, msr); /* stop hw */ 2333185363Sjkoshy 2334185363Sjkoshy if (core_cputype == PMC_CPU_INTEL_CORE) 2335185363Sjkoshy return (0); 2336185363Sjkoshy 2337210621Sgnn msr = 0; 2338185363Sjkoshy do { 2339185363Sjkoshy cc->pc_resync = 0; 2340185363Sjkoshy cc->pc_globalctrl &= ~(1ULL << ri); 2341210621Sgnn msr = rdmsr(IA_GLOBAL_CTRL) & ~IA_GLOBAL_CTRL_MASK; 2342185363Sjkoshy wrmsr(IA_GLOBAL_CTRL, cc->pc_globalctrl); 2343185363Sjkoshy } while (cc->pc_resync != 0); 2344185363Sjkoshy 2345185363Sjkoshy return (0); 2346185363Sjkoshy} 2347185363Sjkoshy 2348185363Sjkoshystatic int 2349185363Sjkoshyiap_write_pmc(int cpu, int ri, pmc_value_t v) 2350185363Sjkoshy{ 2351185363Sjkoshy struct pmc *pm; 2352185363Sjkoshy struct core_cpu *cc; 2353185363Sjkoshy 2354185363Sjkoshy KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), 2355185363Sjkoshy ("[core,%d] illegal cpu value %d", __LINE__, cpu)); 2356185363Sjkoshy KASSERT(ri >= 0 && ri < core_iap_npmc, 2357185363Sjkoshy ("[core,%d] illegal row index %d", __LINE__, ri)); 2358185363Sjkoshy 2359185363Sjkoshy cc = core_pcpu[cpu]; 2360185363Sjkoshy pm = cc->pc_corepmcs[ri].phw_pmc; 2361185363Sjkoshy 2362185363Sjkoshy KASSERT(pm, 2363185363Sjkoshy ("[core,%d] cpu%d ri%d no configured PMC to stop", __LINE__, 2364185363Sjkoshy cpu, ri)); 2365185363Sjkoshy 2366185363Sjkoshy PMCDBG(MDP,WRI,1, "iap-write cpu=%d ri=%d msr=0x%x v=%jx", cpu, ri, 2367185363Sjkoshy IAP_PMC0 + ri, v); 2368185363Sjkoshy 2369185363Sjkoshy if (PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm))) 2370185363Sjkoshy v = iap_reload_count_to_perfctr_value(v); 2371185363Sjkoshy 2372185363Sjkoshy /* 2373185363Sjkoshy * Write the new value to the counter. The counter will be in 2374185363Sjkoshy * a stopped state when the pcd_write() entry point is called. 2375185363Sjkoshy */ 2376185363Sjkoshy 2377210012Sgnn wrmsr(IAP_PMC0 + ri, v & ((1ULL << core_iap_width) - 1)); 2378185363Sjkoshy 2379185363Sjkoshy return (0); 2380185363Sjkoshy} 2381185363Sjkoshy 2382185363Sjkoshy 2383185363Sjkoshystatic void 2384185363Sjkoshyiap_initialize(struct pmc_mdep *md, int maxcpu, int npmc, int pmcwidth, 2385185363Sjkoshy int flags) 2386185363Sjkoshy{ 2387185363Sjkoshy struct pmc_classdep *pcd; 2388185363Sjkoshy 2389185363Sjkoshy KASSERT(md != NULL, ("[iap,%d] md is NULL", __LINE__)); 2390185363Sjkoshy 2391185363Sjkoshy PMCDBG(MDP,INI,1, "%s", "iap-initialize"); 2392185363Sjkoshy 2393185363Sjkoshy /* Remember the set of architectural events supported. */ 2394185363Sjkoshy core_architectural_events = ~flags; 2395185363Sjkoshy 2396185363Sjkoshy pcd = &md->pmd_classdep[PMC_MDEP_CLASS_INDEX_IAP]; 2397185363Sjkoshy 2398185363Sjkoshy pcd->pcd_caps = IAP_PMC_CAPS; 2399185363Sjkoshy pcd->pcd_class = PMC_CLASS_IAP; 2400185363Sjkoshy pcd->pcd_num = npmc; 2401185363Sjkoshy pcd->pcd_ri = md->pmd_npmc; 2402185363Sjkoshy pcd->pcd_width = pmcwidth; 2403185363Sjkoshy 2404185363Sjkoshy pcd->pcd_allocate_pmc = iap_allocate_pmc; 2405185363Sjkoshy pcd->pcd_config_pmc = iap_config_pmc; 2406185363Sjkoshy pcd->pcd_describe = iap_describe; 2407185363Sjkoshy pcd->pcd_get_config = iap_get_config; 2408185363Sjkoshy pcd->pcd_get_msr = iap_get_msr; 2409185363Sjkoshy pcd->pcd_pcpu_fini = core_pcpu_fini; 2410185363Sjkoshy pcd->pcd_pcpu_init = core_pcpu_init; 2411185363Sjkoshy pcd->pcd_read_pmc = iap_read_pmc; 2412185363Sjkoshy pcd->pcd_release_pmc = iap_release_pmc; 2413185363Sjkoshy pcd->pcd_start_pmc = iap_start_pmc; 2414185363Sjkoshy pcd->pcd_stop_pmc = iap_stop_pmc; 2415185363Sjkoshy pcd->pcd_write_pmc = iap_write_pmc; 2416185363Sjkoshy 2417185363Sjkoshy md->pmd_npmc += npmc; 2418185363Sjkoshy} 2419185363Sjkoshy 2420185363Sjkoshystatic int 2421185363Sjkoshycore_intr(int cpu, struct trapframe *tf) 2422185363Sjkoshy{ 2423185363Sjkoshy pmc_value_t v; 2424185363Sjkoshy struct pmc *pm; 2425185363Sjkoshy struct core_cpu *cc; 2426185363Sjkoshy int error, found_interrupt, ri; 2427210621Sgnn uint64_t msr; 2428185363Sjkoshy 2429185363Sjkoshy PMCDBG(MDP,INT, 1, "cpu=%d tf=0x%p um=%d", cpu, (void *) tf, 2430185363Sjkoshy TRAPF_USERMODE(tf)); 2431185363Sjkoshy 2432186177Sjkoshy found_interrupt = 0; 2433185363Sjkoshy cc = core_pcpu[cpu]; 2434185363Sjkoshy 2435185363Sjkoshy for (ri = 0; ri < core_iap_npmc; ri++) { 2436185363Sjkoshy 2437185363Sjkoshy if ((pm = cc->pc_corepmcs[ri].phw_pmc) == NULL || 2438185363Sjkoshy !PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm))) 2439185363Sjkoshy continue; 2440185363Sjkoshy 2441186177Sjkoshy if (!iap_pmc_has_overflowed(ri)) 2442186177Sjkoshy continue; 2443186177Sjkoshy 2444185363Sjkoshy found_interrupt = 1; 2445185363Sjkoshy 2446185363Sjkoshy if (pm->pm_state != PMC_STATE_RUNNING) 2447185363Sjkoshy continue; 2448185363Sjkoshy 2449236238Sfabient error = pmc_process_interrupt(cpu, PMC_HR, pm, tf, 2450185363Sjkoshy TRAPF_USERMODE(tf)); 2451185363Sjkoshy 2452185363Sjkoshy v = pm->pm_sc.pm_reloadcount; 2453185363Sjkoshy v = iaf_reload_count_to_perfctr_value(v); 2454185363Sjkoshy 2455185363Sjkoshy /* 2456185363Sjkoshy * Stop the counter, reload it but only restart it if 2457185363Sjkoshy * the PMC is not stalled. 2458185363Sjkoshy */ 2459210621Sgnn msr = rdmsr(IAP_EVSEL0 + ri) & ~IAP_EVSEL_MASK; 2460210621Sgnn wrmsr(IAP_EVSEL0 + ri, msr); 2461185363Sjkoshy wrmsr(IAP_PMC0 + ri, v); 2462185363Sjkoshy 2463185363Sjkoshy if (error) 2464185363Sjkoshy continue; 2465185363Sjkoshy 2466250038Shiren wrmsr(IAP_EVSEL0 + ri, msr | (pm->pm_md.pm_iap.pm_iap_evsel | 2467210621Sgnn IAP_EN)); 2468185363Sjkoshy } 2469185363Sjkoshy 2470185363Sjkoshy if (found_interrupt) 2471196224Sjhb lapic_reenable_pmc(); 2472185363Sjkoshy 2473185363Sjkoshy atomic_add_int(found_interrupt ? &pmc_stats.pm_intr_processed : 2474185363Sjkoshy &pmc_stats.pm_intr_ignored, 1); 2475185363Sjkoshy 2476185363Sjkoshy return (found_interrupt); 2477185363Sjkoshy} 2478185363Sjkoshy 2479185363Sjkoshystatic int 2480185363Sjkoshycore2_intr(int cpu, struct trapframe *tf) 2481185363Sjkoshy{ 2482185363Sjkoshy int error, found_interrupt, n; 2483210621Sgnn uint64_t flag, intrstatus, intrenable, msr; 2484185363Sjkoshy struct pmc *pm; 2485185363Sjkoshy struct core_cpu *cc; 2486185363Sjkoshy pmc_value_t v; 2487185363Sjkoshy 2488185363Sjkoshy PMCDBG(MDP,INT, 1, "cpu=%d tf=0x%p um=%d", cpu, (void *) tf, 2489185363Sjkoshy TRAPF_USERMODE(tf)); 2490185363Sjkoshy 2491185363Sjkoshy /* 2492185363Sjkoshy * The IA_GLOBAL_STATUS (MSR 0x38E) register indicates which 2493185363Sjkoshy * PMCs have a pending PMI interrupt. We take a 'snapshot' of 2494185363Sjkoshy * the current set of interrupting PMCs and process these 2495185363Sjkoshy * after stopping them. 2496185363Sjkoshy */ 2497185363Sjkoshy intrstatus = rdmsr(IA_GLOBAL_STATUS); 2498185363Sjkoshy intrenable = intrstatus & core_pmcmask; 2499185363Sjkoshy 2500185363Sjkoshy PMCDBG(MDP,INT, 1, "cpu=%d intrstatus=%jx", cpu, 2501185363Sjkoshy (uintmax_t) intrstatus); 2502185363Sjkoshy 2503186177Sjkoshy found_interrupt = 0; 2504185363Sjkoshy cc = core_pcpu[cpu]; 2505186177Sjkoshy 2506185363Sjkoshy KASSERT(cc != NULL, ("[core,%d] null pcpu", __LINE__)); 2507185363Sjkoshy 2508185363Sjkoshy cc->pc_globalctrl &= ~intrenable; 2509185363Sjkoshy cc->pc_resync = 1; /* MSRs now potentially out of sync. */ 2510185363Sjkoshy 2511185363Sjkoshy /* 2512185363Sjkoshy * Stop PMCs and clear overflow status bits. 2513185363Sjkoshy */ 2514210621Sgnn msr = rdmsr(IA_GLOBAL_CTRL) & ~IA_GLOBAL_CTRL_MASK; 2515210621Sgnn wrmsr(IA_GLOBAL_CTRL, msr); 2516185363Sjkoshy wrmsr(IA_GLOBAL_OVF_CTRL, intrenable | 2517185363Sjkoshy IA_GLOBAL_STATUS_FLAG_OVFBUF | 2518185363Sjkoshy IA_GLOBAL_STATUS_FLAG_CONDCHG); 2519185363Sjkoshy 2520185363Sjkoshy /* 2521185363Sjkoshy * Look for interrupts from fixed function PMCs. 2522185363Sjkoshy */ 2523185363Sjkoshy for (n = 0, flag = (1ULL << IAF_OFFSET); n < core_iaf_npmc; 2524185363Sjkoshy n++, flag <<= 1) { 2525185363Sjkoshy 2526185363Sjkoshy if ((intrstatus & flag) == 0) 2527185363Sjkoshy continue; 2528185363Sjkoshy 2529185363Sjkoshy found_interrupt = 1; 2530185363Sjkoshy 2531185363Sjkoshy pm = cc->pc_corepmcs[n + core_iaf_ri].phw_pmc; 2532185363Sjkoshy if (pm == NULL || pm->pm_state != PMC_STATE_RUNNING || 2533185363Sjkoshy !PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm))) 2534185363Sjkoshy continue; 2535185363Sjkoshy 2536236238Sfabient error = pmc_process_interrupt(cpu, PMC_HR, pm, tf, 2537185363Sjkoshy TRAPF_USERMODE(tf)); 2538206089Sfabient if (error) 2539206089Sfabient intrenable &= ~flag; 2540185363Sjkoshy 2541185363Sjkoshy v = iaf_reload_count_to_perfctr_value(pm->pm_sc.pm_reloadcount); 2542185363Sjkoshy 2543185363Sjkoshy /* Reload sampling count. */ 2544185363Sjkoshy wrmsr(IAF_CTR0 + n, v); 2545185363Sjkoshy 2546250038Shiren PMCDBG(MDP,INT, 1, "iaf-intr cpu=%d error=%d v=%jx(%jx)", cpu, 2547250038Shiren error, (uintmax_t) v, (uintmax_t) rdpmc(IAF_RI_TO_MSR(n))); 2548185363Sjkoshy } 2549185363Sjkoshy 2550185363Sjkoshy /* 2551185363Sjkoshy * Process interrupts from the programmable counters. 2552185363Sjkoshy */ 2553185363Sjkoshy for (n = 0, flag = 1; n < core_iap_npmc; n++, flag <<= 1) { 2554185363Sjkoshy if ((intrstatus & flag) == 0) 2555185363Sjkoshy continue; 2556185363Sjkoshy 2557185363Sjkoshy found_interrupt = 1; 2558185363Sjkoshy 2559185363Sjkoshy pm = cc->pc_corepmcs[n].phw_pmc; 2560185363Sjkoshy if (pm == NULL || pm->pm_state != PMC_STATE_RUNNING || 2561185363Sjkoshy !PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm))) 2562185363Sjkoshy continue; 2563185363Sjkoshy 2564236238Sfabient error = pmc_process_interrupt(cpu, PMC_HR, pm, tf, 2565185363Sjkoshy TRAPF_USERMODE(tf)); 2566185363Sjkoshy if (error) 2567185363Sjkoshy intrenable &= ~flag; 2568185363Sjkoshy 2569185363Sjkoshy v = iap_reload_count_to_perfctr_value(pm->pm_sc.pm_reloadcount); 2570185363Sjkoshy 2571185363Sjkoshy PMCDBG(MDP,INT, 1, "iap-intr cpu=%d error=%d v=%jx", cpu, error, 2572185363Sjkoshy (uintmax_t) v); 2573185363Sjkoshy 2574185363Sjkoshy /* Reload sampling count. */ 2575185363Sjkoshy wrmsr(IAP_PMC0 + n, v); 2576185363Sjkoshy } 2577185363Sjkoshy 2578185363Sjkoshy /* 2579185363Sjkoshy * Reenable all non-stalled PMCs. 2580185363Sjkoshy */ 2581185363Sjkoshy PMCDBG(MDP,INT, 1, "cpu=%d intrenable=%jx", cpu, 2582185363Sjkoshy (uintmax_t) intrenable); 2583185363Sjkoshy 2584185363Sjkoshy cc->pc_globalctrl |= intrenable; 2585185363Sjkoshy 2586210621Sgnn wrmsr(IA_GLOBAL_CTRL, cc->pc_globalctrl & IA_GLOBAL_CTRL_MASK); 2587185363Sjkoshy 2588185363Sjkoshy PMCDBG(MDP,INT, 1, "cpu=%d fixedctrl=%jx globalctrl=%jx status=%jx " 2589185363Sjkoshy "ovf=%jx", cpu, (uintmax_t) rdmsr(IAF_CTRL), 2590185363Sjkoshy (uintmax_t) rdmsr(IA_GLOBAL_CTRL), 2591185363Sjkoshy (uintmax_t) rdmsr(IA_GLOBAL_STATUS), 2592185363Sjkoshy (uintmax_t) rdmsr(IA_GLOBAL_OVF_CTRL)); 2593185363Sjkoshy 2594185363Sjkoshy if (found_interrupt) 2595196224Sjhb lapic_reenable_pmc(); 2596185363Sjkoshy 2597185363Sjkoshy atomic_add_int(found_interrupt ? &pmc_stats.pm_intr_processed : 2598185363Sjkoshy &pmc_stats.pm_intr_ignored, 1); 2599185363Sjkoshy 2600185363Sjkoshy return (found_interrupt); 2601185363Sjkoshy} 2602185363Sjkoshy 2603185363Sjkoshyint 2604185363Sjkoshypmc_core_initialize(struct pmc_mdep *md, int maxcpu) 2605185363Sjkoshy{ 2606185363Sjkoshy int cpuid[CORE_CPUID_REQUEST_SIZE]; 2607185363Sjkoshy int ipa_version, flags, nflags; 2608185363Sjkoshy 2609185363Sjkoshy do_cpuid(CORE_CPUID_REQUEST, cpuid); 2610185363Sjkoshy 2611185363Sjkoshy ipa_version = cpuid[CORE_CPUID_EAX] & 0xFF; 2612185363Sjkoshy 2613185363Sjkoshy PMCDBG(MDP,INI,1,"core-init cputype=%d ncpu=%d ipa-version=%d", 2614185363Sjkoshy md->pmd_cputype, maxcpu, ipa_version); 2615185363Sjkoshy 2616250373Shiren if (ipa_version < 1 || ipa_version > 3) { 2617250373Shiren /* Unknown PMC architecture. */ 2618250373Shiren printf("hwpc_core: unknown PMC architecture: %d\n", 2619250373Shiren ipa_version); 2620185363Sjkoshy return (EPROGMISMATCH); 2621250373Shiren } 2622185363Sjkoshy 2623185363Sjkoshy core_cputype = md->pmd_cputype; 2624185363Sjkoshy 2625185363Sjkoshy core_pmcmask = 0; 2626185363Sjkoshy 2627185363Sjkoshy /* 2628185363Sjkoshy * Initialize programmable counters. 2629185363Sjkoshy */ 2630185363Sjkoshy KASSERT(ipa_version >= 1, 2631185363Sjkoshy ("[core,%d] ipa_version %d too small", __LINE__, ipa_version)); 2632185363Sjkoshy 2633185363Sjkoshy core_iap_npmc = (cpuid[CORE_CPUID_EAX] >> 8) & 0xFF; 2634185363Sjkoshy core_iap_width = (cpuid[CORE_CPUID_EAX] >> 16) & 0xFF; 2635185363Sjkoshy 2636185363Sjkoshy core_pmcmask |= ((1ULL << core_iap_npmc) - 1); 2637185363Sjkoshy 2638185363Sjkoshy nflags = (cpuid[CORE_CPUID_EAX] >> 24) & 0xFF; 2639185363Sjkoshy flags = cpuid[CORE_CPUID_EBX] & ((1 << nflags) - 1); 2640185363Sjkoshy 2641185363Sjkoshy iap_initialize(md, maxcpu, core_iap_npmc, core_iap_width, flags); 2642185363Sjkoshy 2643185363Sjkoshy /* 2644185363Sjkoshy * Initialize fixed function counters, if present. 2645185363Sjkoshy */ 2646185363Sjkoshy if (core_cputype != PMC_CPU_INTEL_CORE) { 2647185363Sjkoshy KASSERT(ipa_version >= 2, 2648185363Sjkoshy ("[core,%d] ipa_version %d too small", __LINE__, 2649185363Sjkoshy ipa_version)); 2650185363Sjkoshy 2651185363Sjkoshy core_iaf_ri = core_iap_npmc; 2652185363Sjkoshy core_iaf_npmc = cpuid[CORE_CPUID_EDX] & 0x1F; 2653185363Sjkoshy core_iaf_width = (cpuid[CORE_CPUID_EDX] >> 5) & 0xFF; 2654185363Sjkoshy 2655212224Sfabient iaf_initialize(md, maxcpu, core_iaf_npmc, core_iaf_width); 2656212224Sfabient core_pmcmask |= ((1ULL << core_iaf_npmc) - 1) << IAF_OFFSET; 2657185363Sjkoshy } 2658185363Sjkoshy 2659185363Sjkoshy PMCDBG(MDP,INI,1,"core-init pmcmask=0x%jx iafri=%d", core_pmcmask, 2660185363Sjkoshy core_iaf_ri); 2661185363Sjkoshy 2662185363Sjkoshy core_pcpu = malloc(sizeof(struct core_cpu **) * maxcpu, M_PMC, 2663185363Sjkoshy M_ZERO | M_WAITOK); 2664185363Sjkoshy 2665185363Sjkoshy /* 2666185363Sjkoshy * Choose the appropriate interrupt handler. 2667185363Sjkoshy */ 2668185363Sjkoshy if (ipa_version == 1) 2669185363Sjkoshy md->pmd_intr = core_intr; 2670185363Sjkoshy else 2671185363Sjkoshy md->pmd_intr = core2_intr; 2672185363Sjkoshy 2673185363Sjkoshy md->pmd_pcpu_fini = NULL; 2674185363Sjkoshy md->pmd_pcpu_init = NULL; 2675185363Sjkoshy 2676185363Sjkoshy return (0); 2677185363Sjkoshy} 2678185363Sjkoshy 2679185363Sjkoshyvoid 2680185363Sjkoshypmc_core_finalize(struct pmc_mdep *md) 2681185363Sjkoshy{ 2682185363Sjkoshy PMCDBG(MDP,INI,1, "%s", "core-finalize"); 2683185363Sjkoshy 2684185363Sjkoshy free(core_pcpu, M_PMC); 2685185363Sjkoshy core_pcpu = NULL; 2686185363Sjkoshy} 2687