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