162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2022 Amlogic, Inc. All rights reserved.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef __MESON_DDR_PMU_H__
762306a36Sopenharmony_ci#define __MESON_DDR_PMU_H__
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#define MAX_CHANNEL_NUM		8
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cienum {
1262306a36Sopenharmony_ci	ALL_CHAN_COUNTER_ID,
1362306a36Sopenharmony_ci	CHAN1_COUNTER_ID,
1462306a36Sopenharmony_ci	CHAN2_COUNTER_ID,
1562306a36Sopenharmony_ci	CHAN3_COUNTER_ID,
1662306a36Sopenharmony_ci	CHAN4_COUNTER_ID,
1762306a36Sopenharmony_ci	CHAN5_COUNTER_ID,
1862306a36Sopenharmony_ci	CHAN6_COUNTER_ID,
1962306a36Sopenharmony_ci	CHAN7_COUNTER_ID,
2062306a36Sopenharmony_ci	CHAN8_COUNTER_ID,
2162306a36Sopenharmony_ci	COUNTER_MAX_ID,
2262306a36Sopenharmony_ci};
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cistruct dmc_info;
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistruct dmc_counter {
2762306a36Sopenharmony_ci	u64 all_cnt;	/* The count of all requests come in/out ddr controller */
2862306a36Sopenharmony_ci	union {
2962306a36Sopenharmony_ci		u64 all_req;
3062306a36Sopenharmony_ci		struct {
3162306a36Sopenharmony_ci			u64 all_idle_cnt;
3262306a36Sopenharmony_ci			u64 all_16bit_cnt;
3362306a36Sopenharmony_ci		};
3462306a36Sopenharmony_ci	};
3562306a36Sopenharmony_ci	u64 channel_cnt[MAX_CHANNEL_NUM]; /* To save a DMC bandwidth-monitor channel counter */
3662306a36Sopenharmony_ci};
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistruct dmc_hw_info {
3962306a36Sopenharmony_ci	void (*enable)(struct dmc_info *info);
4062306a36Sopenharmony_ci	void (*disable)(struct dmc_info *info);
4162306a36Sopenharmony_ci	/* Bind an axi line to a bandwidth-monitor channel */
4262306a36Sopenharmony_ci	void (*set_axi_filter)(struct dmc_info *info, int axi_id, int chann);
4362306a36Sopenharmony_ci	int (*irq_handler)(struct dmc_info *info,
4462306a36Sopenharmony_ci			   struct dmc_counter *counter);
4562306a36Sopenharmony_ci	void (*get_counters)(struct dmc_info *info,
4662306a36Sopenharmony_ci			     struct dmc_counter *counter);
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	int dmc_nr;			/* The number of dmc controller */
4962306a36Sopenharmony_ci	int chann_nr;			/* The number of dmc bandwidth monitor channels */
5062306a36Sopenharmony_ci	struct attribute **fmt_attr;
5162306a36Sopenharmony_ci	const u64 capability[2];
5262306a36Sopenharmony_ci};
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cistruct dmc_info {
5562306a36Sopenharmony_ci	const struct dmc_hw_info *hw_info;
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci	void __iomem *ddr_reg[4];
5862306a36Sopenharmony_ci	unsigned long timer_value;	/* Timer value in TIMER register */
5962306a36Sopenharmony_ci	void __iomem *pll_reg;
6062306a36Sopenharmony_ci	int irq_num;			/* irq vector number */
6162306a36Sopenharmony_ci};
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ciint meson_ddr_pmu_create(struct platform_device *pdev);
6462306a36Sopenharmony_ciint meson_ddr_pmu_remove(struct platform_device *pdev);
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci#endif /* __MESON_DDR_PMU_H__ */
67