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