/*
 * pfmlib_intel_ivb_unc.c : Intel IvyBridge C-Box uncore PMU
 *
 * Contributed by Stephane Eranian <eranian@gmail.com>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
 * of the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
 * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
/* private headers */
#include "pfmlib_priv.h"
#include "pfmlib_intel_x86_priv.h"

#define INTEL_SNB_UNC_ATTRS \
	(_INTEL_X86_ATTR_I|_INTEL_X86_ATTR_E|_INTEL_X86_ATTR_C)

/* same event table as SNB */
#include "events/intel_snb_unc_events.h"

static int
pfm_ivb_unc_detect(void *this)
{
	int ret;

	ret = pfm_intel_x86_detect();
	if (ret != PFM_SUCCESS)
		return ret;

	if (pfm_intel_x86_cfg.family != 6)
		return PFM_ERR_NOTSUPP;

	switch (pfm_intel_x86_cfg.model) {
		case 58: /* IvyBridge */
			break;
		default:
			return PFM_ERR_NOTSUPP;
	}
	return PFM_SUCCESS;
}

#define IVB_UNC_CBOX(n, p) \
pfmlib_pmu_t intel_ivb_unc_cbo##n##_support={ \
	.desc			= "Intel Ivy Bridge C-box"#n" uncore", \
	.name			= "ivb_unc_cbo"#n, \
	.perf_name		= "uncore_cbox_"#n, \
	.pmu			= PFM_PMU_INTEL_IVB_UNC_CB##n, \
	.pme_count		= LIBPFM_ARRAY_SIZE(intel_snb_unc_##p##_pe), \
	.type			= PFM_PMU_TYPE_UNCORE, \
	.num_cntrs		= 2, \
	.num_fixed_cntrs	= 1, \
	.max_encoding		= 1,\
	.pe			= intel_snb_unc_##p##_pe, \
	.atdesc			= intel_x86_mods, \
	.flags			= PFMLIB_PMU_FL_RAW_UMASK\
				| PFMLIB_PMU_FL_NO_SMPL,\
	.pmu_detect		= pfm_ivb_unc_detect, \
	.get_event_encoding[PFM_OS_NONE] = pfm_intel_x86_get_encoding, \
	 PFMLIB_ENCODE_PERF(pfm_intel_nhm_unc_get_perf_encoding), \
	 PFMLIB_OS_DETECT(pfm_intel_x86_perf_detect), \
	.get_event_first	= pfm_intel_x86_get_event_first, \
	.get_event_next		= pfm_intel_x86_get_event_next, \
	.event_is_valid		= pfm_intel_x86_event_is_valid, \
	.validate_table		= pfm_intel_x86_validate_table, \
	.get_event_info		= pfm_intel_x86_get_event_info, \
	.get_event_attr_info	= pfm_intel_x86_get_event_attr_info, \
	 PFMLIB_VALID_PERF_PATTRS(pfm_intel_x86_perf_validate_pattrs),\
	.get_event_nattrs	= pfm_intel_x86_get_event_nattrs,\
}

IVB_UNC_CBOX(0, cbo0);
IVB_UNC_CBOX(1, cbo);
IVB_UNC_CBOX(2, cbo);
IVB_UNC_CBOX(3, cbo);
