From: xxx Date: Wed, 2 Apr 2014 04:46:43 +0000 (+0800) Subject: add ddr tst node X-Git-Tag: firefly_0821_release~5643 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=5f05421abf52bda32a290f47ec6c85f6d1e4750f;p=firefly-linux-kernel-4.4.55.git add ddr tst node --- diff --git a/arch/arm/mach-rockchip/ddr_freq.c b/arch/arm/mach-rockchip/ddr_freq.c index 3dee44c44d3e..09ca42d54f8a 100755 --- a/arch/arm/mach-rockchip/ddr_freq.c +++ b/arch/arm/mach-rockchip/ddr_freq.c @@ -19,6 +19,9 @@ #include #include #include +#include +#include +#include enum { DEBUG_DDR = 1U << 0, @@ -344,12 +347,16 @@ int of_init_ddr_freq_table(void) return 0; } - +#if defined(CONFIG_RK_PM_TESTS) +static void ddrfreq_tst_init(void); +#endif static int ddrfreq_init(void) { struct sched_param param = { .sched_priority = MAX_RT_PRIO - 1 }; int ret; - +#if defined(CONFIG_RK_PM_TESTS) + ddrfreq_tst_init(); +#endif ddr.clk_dvfs_node = clk_get_dvfs_node("clk_ddr"); if (!ddr.clk_dvfs_node){ return -EINVAL; @@ -434,3 +441,154 @@ err: return ret; } late_initcall(ddrfreq_init); + +/****************************ddr bandwith tst************************************/ +#if defined(CONFIG_RK_PM_TESTS) + +#define USE_NORMAL_TIME + +#ifdef USE_NORMAL_TIME +static struct timer_list ddrbw_timer; +#else +static struct hrtimer ddrbw_hrtimer; +#endif +enum ddr_bandwidth_id{ + ddrbw_wr_num=0, + ddrbw_rd_num, + ddrbw_act_num, + ddrbw_time_num, + ddrbw_eff, + ddrbw_id_end +}; +#define grf_readl(offset) readl_relaxed(RK_GRF_VIRT + offset) +#define grf_writel(v, offset) do { writel_relaxed(v, RK_GRF_VIRT + offset); dsb(); } while (0) + +static u32 ddr_bw_show_st=0; + +#define ddr_monitor_start() grf_writel(0xc000c000,RK3288_GRF_SOC_CON4) +#define ddr_monitor_end() grf_writel(0xc0000000,RK3288_GRF_SOC_CON4) + +static ssize_t ddrbw_dyn_show(struct kobject *kobj, struct kobj_attribute *attr, + char *buf) +{ + char *s = buf; + return (s - buf); +} + +static ssize_t ddrbw_dyn_store(struct kobject *kobj, struct kobj_attribute *attr, + const char *buf, size_t n) +{ + //const char *pbuf; + + if((strncmp(buf, "start", strlen("start")) == 0)) { + ddr_bw_show_st=1; + ddr_monitor_start(); + + #ifdef USE_NORMAL_TIME + mod_timer(&ddrbw_timer, jiffies + msecs_to_jiffies(500)); + #else + hrtimer_start(&ddrbw_hrtimer, ktime_set(0, 5 * 1000 * 1000*1000), HRTIMER_MODE_REL); + #endif + + } else if((strncmp(buf, "stop", strlen("stop")) == 0)) { + ddr_bw_show_st=0; + ddr_monitor_end(); + } + + return n; +} + +static void ddr_bandwidth_get(void) +{ + u32 ddr_bw_val[2][ddrbw_id_end]; + int i,j; + u64 temp64; + + + for(j=0;j<2;j++) + for(i=0;iname); + return ret; + } + return ret; } static int __init rk_pm_tests_init(void) { int i, ret = 0; - pm_tests_kobj = kobject_create_and_add("pm_tests", NULL); + struct kobject * pm_kobj; + pm_kobj =get_rk_pm_tests_kobj(); - if (!pm_tests_kobj) + if (!pm_kobj) return -ENOMEM; for (i = 0; i < ARRAY_SIZE(pm_attrs); i++) { - ret = sysfs_create_file(pm_tests_kobj, &pm_attrs[i].attr); + ret = sysfs_create_file(pm_kobj, &pm_attrs[i].attr); if (ret != 0) { PM_ERR("create index %d error\n", i); return ret;