// SPDX-License-Identifier: MIT
/*
 * Copyright © 2018-2019 Intel Corporation
 *
 * Autogenerated file by GPU Top : https://github.com/rib/gputop
 * DO NOT EDIT manually!
 */

#include <linux/sysfs.h>

#include "i915_drv.h"
#include "i915_oa_cnl.h"

static const struct i915_oa_reg b_counter_config_test_oa[] = {
	{ _MMIO(0x2740), 0x00000000 },
	{ _MMIO(0x2710), 0x00000000 },
	{ _MMIO(0x2714), 0xf0800000 },
	{ _MMIO(0x2720), 0x00000000 },
	{ _MMIO(0x2724), 0xf0800000 },
	{ _MMIO(0x2770), 0x00000004 },
	{ _MMIO(0x2774), 0x0000ffff },
	{ _MMIO(0x2778), 0x00000003 },
	{ _MMIO(0x277c), 0x0000ffff },
	{ _MMIO(0x2780), 0x00000007 },
	{ _MMIO(0x2784), 0x0000ffff },
	{ _MMIO(0x2788), 0x00100002 },
	{ _MMIO(0x278c), 0x0000fff7 },
	{ _MMIO(0x2790), 0x00100002 },
	{ _MMIO(0x2794), 0x0000ffcf },
	{ _MMIO(0x2798), 0x00100082 },
	{ _MMIO(0x279c), 0x0000ffef },
	{ _MMIO(0x27a0), 0x001000c2 },
	{ _MMIO(0x27a4), 0x0000ffe7 },
	{ _MMIO(0x27a8), 0x00100001 },
	{ _MMIO(0x27ac), 0x0000ffe7 },
};

static const struct i915_oa_reg flex_eu_config_test_oa[] = {
};

static const struct i915_oa_reg mux_config_test_oa[] = {
	{ _MMIO(0xd04), 0x00000200 },
	{ _MMIO(0x9884), 0x00000007 },
	{ _MMIO(0x9888), 0x17060000 },
	{ _MMIO(0x9840), 0x00000000 },
	{ _MMIO(0x9884), 0x00000007 },
	{ _MMIO(0x9888), 0x13034000 },
	{ _MMIO(0x9884), 0x00000007 },
	{ _MMIO(0x9888), 0x07060066 },
	{ _MMIO(0x9884), 0x00000007 },
	{ _MMIO(0x9888), 0x05060000 },
	{ _MMIO(0x9884), 0x00000007 },
	{ _MMIO(0x9888), 0x0f080040 },
	{ _MMIO(0x9884), 0x00000007 },
	{ _MMIO(0x9888), 0x07091000 },
	{ _MMIO(0x9884), 0x00000007 },
	{ _MMIO(0x9888), 0x0f041000 },
	{ _MMIO(0x9884), 0x00000007 },
	{ _MMIO(0x9888), 0x1d004000 },
	{ _MMIO(0x9884), 0x00000007 },
	{ _MMIO(0x9888), 0x35000000 },
	{ _MMIO(0x9884), 0x00000007 },
	{ _MMIO(0x9888), 0x49000000 },
	{ _MMIO(0x9884), 0x00000007 },
	{ _MMIO(0x9888), 0x3d000000 },
	{ _MMIO(0x9884), 0x00000007 },
	{ _MMIO(0x9888), 0x31000000 },
};

static ssize_t
show_test_oa_id(struct device *kdev, struct device_attribute *attr, char *buf)
{
	return sprintf(buf, "1\n");
}

void
i915_perf_load_test_config_cnl(struct drm_i915_private *dev_priv)
{
	strlcpy(dev_priv->perf.test_config.uuid,
		"db41edd4-d8e7-4730-ad11-b9a2d6833503",
		sizeof(dev_priv->perf.test_config.uuid));
	dev_priv->perf.test_config.id = 1;

	dev_priv->perf.test_config.mux_regs = mux_config_test_oa;
	dev_priv->perf.test_config.mux_regs_len = ARRAY_SIZE(mux_config_test_oa);

	dev_priv->perf.test_config.b_counter_regs = b_counter_config_test_oa;
	dev_priv->perf.test_config.b_counter_regs_len = ARRAY_SIZE(b_counter_config_test_oa);

	dev_priv->perf.test_config.flex_regs = flex_eu_config_test_oa;
	dev_priv->perf.test_config.flex_regs_len = ARRAY_SIZE(flex_eu_config_test_oa);

	dev_priv->perf.test_config.sysfs_metric.name = "db41edd4-d8e7-4730-ad11-b9a2d6833503";
	dev_priv->perf.test_config.sysfs_metric.attrs = dev_priv->perf.test_config.attrs;

	dev_priv->perf.test_config.attrs[0] = &dev_priv->perf.test_config.sysfs_metric_id.attr;

	dev_priv->perf.test_config.sysfs_metric_id.attr.name = "id";
	dev_priv->perf.test_config.sysfs_metric_id.attr.mode = 0444;
	dev_priv->perf.test_config.sysfs_metric_id.show = show_test_oa_id;
}
