1 #define pr_fmt(fmt) "ddrfreq: " fmt
5 #include <linux/cpufreq.h>
6 #include <linux/delay.h>
7 #include <linux/freezer.h>
9 #include <linux/kthread.h>
10 #include <linux/miscdevice.h>
11 #include <linux/module.h>
12 #include <linux/reboot.h>
13 #include <linux/slab.h>
14 #include <linux/uaccess.h>
15 #include <linux/sched/rt.h>
18 #include <linux/input.h>
19 #include <asm/cacheflush.h>
20 #include <asm/tlbflush.h>
21 #include <linux/vmalloc.h>
22 #include <linux/rockchip/common.h>
23 #include <linux/rockchip/dvfs.h>
24 #include <dt-bindings/clock/ddr.h>
26 #include <linux/rockchip/grf.h>
27 #include <linux/rockchip/iomap.h>
28 static struct dvfs_node *clk_cpu_dvfs_node = NULL;
29 static int ddr_boost = 0;
34 DEBUG_VIDEO_STATE = 1U << 1,
35 DEBUG_SUSPEND = 1U << 2,
36 DEBUG_VERBOSE = 1U << 3,
38 static int debug_mask = DEBUG_DDR;
40 module_param(debug_mask, int, S_IRUGO | S_IWUSR | S_IWGRP);
41 #define dprintk(mask, fmt, ...) do { if (mask & debug_mask) pr_info(fmt, ##__VA_ARGS__); } while (0)
43 #define MHZ (1000*1000)
47 struct dvfs_node *clk_dvfs_node;
48 unsigned long normal_rate;
49 unsigned long video_rate;
50 unsigned long dualview_rate;
51 unsigned long idle_rate;
52 unsigned long suspend_rate;
53 unsigned long reboot_rate;
55 bool auto_self_refresh;
57 unsigned long sys_status;
58 struct task_struct *task;
59 wait_queue_head_t wait;
61 static struct ddr ddr;
63 module_param_named(sys_status, ddr.sys_status, ulong, S_IRUGO);
64 module_param_named(auto_self_refresh, ddr.auto_self_refresh, bool, S_IRUGO);
65 module_param_named(mode, ddr.mode, charp, S_IRUGO);
67 static noinline void ddrfreq_set_sys_status(int status)
69 ddr.sys_status |= status;
73 static noinline void ddrfreq_clear_sys_status(int status)
75 ddr.sys_status &= ~status;
79 static void ddrfreq_mode(bool auto_self_refresh, unsigned long *target_rate, char *name)
81 unsigned int min_rate, max_rate;
85 if (auto_self_refresh != ddr.auto_self_refresh) {
86 ddr_set_auto_self_refresh(auto_self_refresh);
87 ddr.auto_self_refresh = auto_self_refresh;
88 dprintk(DEBUG_DDR, "change auto self refresh to %d when %s\n", auto_self_refresh, name);
90 if (*target_rate != dvfs_clk_get_rate(ddr.clk_dvfs_node)) {
91 freq_limit_en = dvfs_clk_get_limit(clk_cpu_dvfs_node, &min_rate, &max_rate);
92 dvfs_clk_enable_limit(clk_cpu_dvfs_node, 600000000, -1);
93 if (dvfs_clk_set_rate(ddr.clk_dvfs_node, *target_rate) == 0) {
94 *target_rate = dvfs_clk_get_rate(ddr.clk_dvfs_node);
95 dprintk(DEBUG_DDR, "change freq to %lu MHz when %s\n", *target_rate / MHZ, name);
98 dvfs_clk_enable_limit(clk_cpu_dvfs_node, min_rate, max_rate);
100 dvfs_clk_disable_limit(clk_cpu_dvfs_node);
105 static void ddr_freq_input_event(struct input_handle *handle, unsigned int type,
106 unsigned int code, int value)
112 static int ddr_freq_input_connect(struct input_handler *handler,
113 struct input_dev *dev, const struct input_device_id *id)
115 struct input_handle *handle;
118 handle = kzalloc(sizeof(struct input_handle), GFP_KERNEL);
123 handle->handler = handler;
124 handle->name = "ddr_freq";
126 error = input_register_handle(handle);
130 error = input_open_device(handle);
136 input_unregister_handle(handle);
142 static void ddr_freq_input_disconnect(struct input_handle *handle)
144 input_close_device(handle);
145 input_unregister_handle(handle);
149 static const struct input_device_id ddr_freq_ids[] = {
152 .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
153 INPUT_DEVICE_ID_MATCH_ABSBIT,
154 .evbit = { BIT_MASK(EV_ABS) },
155 .absbit = { [BIT_WORD(ABS_MT_POSITION_X)] =
156 BIT_MASK(ABS_MT_POSITION_X) |
157 BIT_MASK(ABS_MT_POSITION_Y) },
161 .flags = INPUT_DEVICE_ID_MATCH_KEYBIT |
162 INPUT_DEVICE_ID_MATCH_ABSBIT,
163 .keybit = { [BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH) },
164 .absbit = { [BIT_WORD(ABS_X)] =
165 BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) },
169 .flags = INPUT_DEVICE_ID_MATCH_EVBIT,
170 .evbit = { BIT_MASK(EV_KEY) },
175 static struct input_handler ddr_freq_input_handler = {
176 .event = ddr_freq_input_event,
177 .connect = ddr_freq_input_connect,
178 .disconnect = ddr_freq_input_disconnect,
180 .id_table = ddr_freq_ids,
183 enum ddr_bandwidth_id{
194 #define DDR_BOOST_HOLD_MS 300
195 #define HIGH_LOAD_HOLD_MS 300
196 #define HIGH_LOAD_DELAY_MS 0
197 #define LOW_LOAD_DELAY_MS 200
198 #define DDR_BOOST_HOLD (DDR_BOOST_HOLD_MS/ddrbw_work_delay_ms)
199 #define HIGH_LOAD_HOLD (DDR_BOOST_HOLD_MS/ddrbw_work_delay_ms)
200 #define HIGH_LOAD_DELAY (HIGH_LOAD_DELAY_MS/ddrbw_work_delay_ms)
201 #define LOW_LOAD_DELAY (LOW_LOAD_DELAY_MS/ddrbw_work_delay_ms)
202 #define DDR_RATE_NORMAL 240000000
203 #define DDR_RATE_BOOST 324000000
204 #define DDR_RATE_HIGH_LOAD 533000000
205 #define DDR_RATE_1080P 240000000
206 #define DDR_RATE_4K 300000000
207 #define HIGH_LOAD_NORMAL 70
208 #define HGIH_LOAD_VIDEO 50
210 static struct workqueue_struct *ddr_freq_wq;
211 static u32 high_load = HIGH_LOAD_NORMAL;
212 static u32 ddrbw_work_delay_ms = 20;
213 static u32 ddr_rate_normal = DDR_RATE_NORMAL;
214 static u32 ddr_rate_boost = DDR_RATE_BOOST;
215 static u32 ddr_rate_high_load = DDR_RATE_HIGH_LOAD;
218 //#define ddr_monitor_start() grf_writel(0xc000c000,RK3288_GRF_SOC_CON4)
219 #define ddr_monitor_start() grf_writel((((readl_relaxed(RK_PMU_VIRT + 0x9c)>>13)&7)==3)?0xc000c000:0xe000e000,RK3288_GRF_SOC_CON4)
220 #define ddr_monitor_stop() grf_writel(0xc0000000,RK3288_GRF_SOC_CON4)
222 #define grf_readl(offset) readl_relaxed(RK_GRF_VIRT + offset)
223 #define grf_writel(v, offset) do { writel_relaxed(v, RK_GRF_VIRT + offset); dsb(); } while (0)
226 void ddr_bandwidth_get(u32 *ch0_eff, u32 *ch1_eff)
228 u32 ddr_bw_val[2][ddrbw_id_end];
232 for(j = 0; j < 2; j++) {
233 for(i = 0; i < ddrbw_eff; i++ ){
234 ddr_bw_val[j][i] = grf_readl(RK3288_GRF_SOC_STATUS11+i*4+j*16);
238 temp64 = ((u64)ddr_bw_val[0][0]+ddr_bw_val[0][1])*4*100;
239 do_div(temp64, ddr_bw_val[0][ddrbw_time_num]);
240 ddr_bw_val[0][ddrbw_eff] = temp64;
243 temp64 = ((u64)ddr_bw_val[1][0]+ddr_bw_val[1][1])*4*100;
244 do_div(temp64, ddr_bw_val[1][ddrbw_time_num]);
245 ddr_bw_val[1][ddrbw_eff] = temp64;
250 static void ddrbw_work_fn(struct work_struct *work)
253 u32 ch0_eff, ch1_eff;
254 static u32 ddr_boost_hold=0, high_load_hold=0;
255 static u32 high_load_delay = 0, low_load_delay = 0;
258 ddr_bandwidth_get(&ch0_eff, &ch1_eff);
262 //dvfs_clk_set_rate(ddr.clk_dvfs_node, DDR_BOOST_RATE);
263 if (!high_load_hold && !low_load_delay) {
264 rate = ddr_rate_boost;
265 ddrfreq_mode(false, &rate, "boost");
266 ddr_boost_hold = DDR_BOOST_HOLD;
268 } else if(!ddr_boost_hold && ((ch0_eff>high_load)||(ch1_eff>high_load))){
269 low_load_delay = LOW_LOAD_DELAY;
270 if (!high_load_delay) {
271 //dvfs_clk_set_rate(ddr.clk_dvfs_node, HIGH_LOAD_RATE);
272 rate = ddr_rate_high_load;
273 ddrfreq_mode(false, &rate, "high load");
274 high_load_hold = HIGH_LOAD_HOLD;
279 if (ddr_boost_hold) {
281 } else if (high_load_hold) {
284 high_load_delay = HIGH_LOAD_DELAY;
285 //dvfs_clk_set_rate(ddr.clk_dvfs_node, DDR_NORMAL_RATE);
286 if (!low_load_delay) {
287 rate = ddr_rate_normal;
288 ddrfreq_mode(false, &rate, "normal");
297 queue_delayed_work_on(0, ddr_freq_wq, to_delayed_work(work), HZ*ddrbw_work_delay_ms/1000);
300 static DECLARE_DELAYED_WORK(ddrbw_work, ddrbw_work_fn);
302 static noinline void ddrfreq_work(unsigned long sys_status)
304 static struct clk *cpu = NULL;
305 static struct clk *gpu = NULL;
306 unsigned long s = sys_status;
309 cpu = clk_get(NULL, "cpu");
311 gpu = clk_get(NULL, "gpu");
313 dprintk(DEBUG_VERBOSE, "sys_status %02lx\n", sys_status);
316 cancel_delayed_work_sync(&ddrbw_work);
318 if (ddr.reboot_rate && (s & SYS_STATUS_REBOOT)) {
319 ddrfreq_mode(false, &ddr.reboot_rate, "shutdown/reboot");
320 } else if (ddr.suspend_rate && (s & SYS_STATUS_SUSPEND)) {
321 ddrfreq_mode(true, &ddr.suspend_rate, "suspend");
322 } else if (ddr.dualview_rate &&
323 (s & SYS_STATUS_LCDC0) && (s & SYS_STATUS_LCDC1)) {
324 ddrfreq_mode(false, &ddr.dualview_rate, "dual-view");
325 } else if (ddr.video_rate &&
326 ((s & SYS_STATUS_VIDEO_720P)||(s & SYS_STATUS_VIDEO_1080P))) {
327 ddrfreq_mode(false, &ddr.video_rate, "video");
328 } else if (ddr.idle_rate
329 && !(s & SYS_STATUS_GPU)
330 && !(s & SYS_STATUS_RGA)
331 && !(s & SYS_STATUS_CIF0)
332 && !(s & SYS_STATUS_CIF1)
333 && (clk_get_rate(cpu) < 816 * MHZ)
334 && (clk_get_rate(gpu) <= 200 * MHZ)
336 ddrfreq_mode(false, &ddr.idle_rate, "idle");
339 queue_delayed_work_on(0, ddr_freq_wq, &ddrbw_work, 0);
341 ddrfreq_mode(false, &ddr.normal_rate, "normal");
345 static int ddrfreq_task(void *data)
350 unsigned long status = ddr.sys_status;
351 ddrfreq_work(status);
352 wait_event_freezable(ddr.wait, (status != ddr.sys_status) || kthread_should_stop());
353 } while (!kthread_should_stop());
358 static int video_state_release(struct inode *inode, struct file *file)
360 dprintk(DEBUG_VIDEO_STATE, "video_state release\n");
361 ddrfreq_clear_sys_status(SYS_STATUS_VIDEO);
365 #define VIDEO_LOW_RESOLUTION (1080*720)
366 static ssize_t video_state_write(struct file *file, const char __user *buffer,
367 size_t count, loff_t *ppos)
372 char *buf = vzalloc(count);
373 uint32_t v_width=0,v_height=0,v_sync=0;
384 if (copy_from_user(cookie_pot, buffer, count)) {
389 dprintk(DEBUG_VIDEO_STATE, "video_state write %s,len %d\n", cookie_pot,count);
392 if( (count>=3) && (cookie_pot[2]=='w') )
394 strsep(&cookie_pot,",");
395 strsep(&cookie_pot,"=");
396 p=strsep(&cookie_pot,",");
397 v_width = simple_strtol(p,NULL,10);
398 strsep(&cookie_pot,"=");
399 p=strsep(&cookie_pot,",");
400 v_height= simple_strtol(p,NULL,10);
401 strsep(&cookie_pot,"=");
402 p=strsep(&cookie_pot,",");
403 v_sync= simple_strtol(p,NULL,10);
404 dprintk(DEBUG_VIDEO_STATE, "video_state %c,width=%d,height=%d,sync=%d\n", state,v_width,v_height,v_sync);
409 high_load = HIGH_LOAD_NORMAL;
410 ddr_rate_normal = DDR_RATE_NORMAL;
411 ddr_rate_high_load = DDR_RATE_HIGH_LOAD;
413 ddrfreq_clear_sys_status(SYS_STATUS_VIDEO);
416 high_load = HGIH_LOAD_VIDEO;
417 ddr_rate_normal = DDR_RATE_1080P;
418 ddr_rate_high_load = DDR_RATE_4K;
419 if( (v_width == 0) && (v_height == 0)){
421 ddrfreq_set_sys_status(SYS_STATUS_VIDEO_1080P);
424 //if(ddr.video_low_rate && ((v_width*v_height) <= VIDEO_LOW_RESOLUTION) )
425 // ddrfreq_set_sys_status(SYS_STATUS_VIDEO_720P);
428 ddrfreq_set_sys_status(SYS_STATUS_VIDEO_1080P);
432 ddrfreq_clear_sys_status(SYS_STATUS_VIDEO);
444 static const struct file_operations video_state_fops = {
445 .owner = THIS_MODULE,
446 .release= video_state_release,
447 .write = video_state_write,
450 static struct miscdevice video_state_dev = {
451 .fops = &video_state_fops,
452 .name = "video_state",
453 .minor = MISC_DYNAMIC_MINOR,
456 static int ddrfreq_clk_event(int status, unsigned long event)
459 case PRE_RATE_CHANGE:
460 ddrfreq_set_sys_status(status);
462 case POST_RATE_CHANGE:
463 case ABORT_RATE_CHANGE:
464 ddrfreq_clear_sys_status(status);
470 #define CLK_NOTIFIER(name, status) \
471 static int ddrfreq_clk_##name##_event(struct notifier_block *this, unsigned long event, void *ptr) \
473 return ddrfreq_clk_event(SYS_STATUS_##status, event); \
475 static struct notifier_block ddrfreq_clk_##name##_notifier = { .notifier_call = ddrfreq_clk_##name##_event };
477 #define REGISTER_CLK_NOTIFIER(name) \
479 struct clk *clk = clk_get(NULL, #name); \
480 clk_notifier_register(clk, &ddrfreq_clk_##name##_notifier); \
484 #define UNREGISTER_CLK_NOTIFIER(name) \
486 struct clk *clk = clk_get(NULL, #name); \
487 clk_notifier_unregister(clk, &ddrfreq_clk_##name##_notifier); \
491 CLK_NOTIFIER(pd_gpu, GPU);
492 CLK_NOTIFIER(pd_rga, RGA);
493 CLK_NOTIFIER(pd_cif0, CIF0);
494 CLK_NOTIFIER(pd_cif1, CIF1);
495 CLK_NOTIFIER(pd_lcdc0, LCDC0);
496 CLK_NOTIFIER(pd_lcdc1, LCDC1);
498 static int ddrfreq_reboot_notifier_event(struct notifier_block *this, unsigned long event, void *ptr)
500 u32 timeout = 1000; // 10s
501 ddrfreq_set_sys_status(SYS_STATUS_REBOOT);
502 while (dvfs_clk_get_rate(ddr.clk_dvfs_node) != ddr.reboot_rate && --timeout) {
506 pr_err("failed to set ddr clk from %luMHz to %luMHz when shutdown/reboot\n", dvfs_clk_get_rate(ddr.clk_dvfs_node) / MHZ, ddr.reboot_rate / MHZ);
511 static struct notifier_block ddrfreq_reboot_notifier = {
512 .notifier_call = ddrfreq_reboot_notifier_event,
515 int of_init_ddr_freq_table(void)
517 struct device_node *clk_ddr_dev_node;
518 const struct property *prop;
522 clk_ddr_dev_node = of_find_node_by_name(NULL, "clk_ddr");
523 if (IS_ERR_OR_NULL(clk_ddr_dev_node)) {
524 pr_err("%s: get clk ddr dev node err\n", __func__);
525 return PTR_ERR(clk_ddr_dev_node);
528 prop = of_find_property(clk_ddr_dev_node, "auto_freq", NULL);
529 if (prop && prop->value)
530 ddr.auto_freq = be32_to_cpup(prop->value);
532 prop = of_find_property(clk_ddr_dev_node, "freq_table", NULL);
538 nr = prop->length / sizeof(u32);
540 pr_err("%s: Invalid freq list\n", __func__);
546 unsigned long status = be32_to_cpup(val++);
547 unsigned long rate = be32_to_cpup(val++) * 1000;
549 if (status & SYS_STATUS_NORMAL)
550 ddr.normal_rate = rate;
551 if (status & SYS_STATUS_SUSPEND)
552 ddr.suspend_rate = rate;
553 if ((status & SYS_STATUS_VIDEO_720P)||(status & SYS_STATUS_VIDEO_720P))
554 ddr.video_rate = rate;
555 if ((status & SYS_STATUS_LCDC0)&&(status & SYS_STATUS_LCDC1))
556 ddr.dualview_rate = rate;
557 if (status & SYS_STATUS_IDLE)
559 if (status & SYS_STATUS_REBOOT)
560 ddr.reboot_rate= rate;
567 #if 0//defined(CONFIG_RK_PM_TESTS)
568 static void ddrfreq_tst_init(void);
571 static int ddr_freq_suspend_notifier_call(struct notifier_block *self,
572 unsigned long action, void *data)
574 struct fb_event *event = data;
575 int blank_mode = *((int *)event->data);
577 if (action == FB_EARLY_EVENT_BLANK) {
578 switch (blank_mode) {
579 case FB_BLANK_UNBLANK:
580 ddrfreq_clear_sys_status(SYS_STATUS_SUSPEND);
586 else if (action == FB_EVENT_BLANK) {
587 switch (blank_mode) {
588 case FB_BLANK_POWERDOWN:
589 ddrfreq_set_sys_status(SYS_STATUS_SUSPEND);
599 static struct notifier_block ddr_freq_suspend_notifier = {
600 .notifier_call = ddr_freq_suspend_notifier_call,
606 static int ddrfreq_init(void)
608 struct sched_param param = { .sched_priority = MAX_RT_PRIO - 1 };
610 #if 0//defined(CONFIG_RK_PM_TESTS)
613 clk_cpu_dvfs_node = clk_get_dvfs_node("clk_core");
614 if (!clk_cpu_dvfs_node){
618 memset(&ddr, 0x00, sizeof(ddr));
619 ddr.clk_dvfs_node = clk_get_dvfs_node("clk_ddr");
620 if (!ddr.clk_dvfs_node){
624 clk_enable_dvfs(ddr.clk_dvfs_node);
626 ddr_freq_wq = alloc_workqueue("ddr_freq", WQ_NON_REENTRANT | WQ_MEM_RECLAIM | WQ_HIGHPRI | WQ_FREEZABLE, 1);
628 init_waitqueue_head(&ddr.wait);
631 ddr.normal_rate = dvfs_clk_get_rate(ddr.clk_dvfs_node);
632 ddr.suspend_rate = ddr.normal_rate;
633 ddr.reboot_rate = ddr.normal_rate;
635 of_init_ddr_freq_table();
637 ret = input_register_handler(&ddr_freq_input_handler);
639 ddr.auto_freq = false;
642 //REGISTER_CLK_NOTIFIER(pd_gpu);
643 //REGISTER_CLK_NOTIFIER(pd_rga);
644 //REGISTER_CLK_NOTIFIER(pd_cif0);
645 //REGISTER_CLK_NOTIFIER(pd_cif1);
648 if (ddr.dualview_rate) {
649 //REGISTER_CLK_NOTIFIER(pd_lcdc0);
650 //REGISTER_CLK_NOTIFIER(pd_lcdc1);
653 ret = misc_register(&video_state_dev);
655 pr_err("failed to register video_state misc device! error %d\n", ret);
660 ddr.task = kthread_create(ddrfreq_task, NULL, "ddrfreqd");
661 if (IS_ERR(ddr.task)) {
662 ret = PTR_ERR(ddr.task);
663 pr_err("failed to create kthread! error %d\n", ret);
667 sched_setscheduler_nocheck(ddr.task, SCHED_FIFO, ¶m);
668 get_task_struct(ddr.task);
669 kthread_bind(ddr.task, 0);
670 wake_up_process(ddr.task);
672 fb_register_client(&ddr_freq_suspend_notifier);
673 register_reboot_notifier(&ddrfreq_reboot_notifier);
675 pr_info("verion 1.0 20140228\n");
676 dprintk(DEBUG_DDR, "normal %luMHz video %luMHz dualview %luMHz idle %luMHz suspend %luMHz reboot %luMHz\n",
677 ddr.normal_rate / MHZ, ddr.video_rate / MHZ, ddr.dualview_rate / MHZ, ddr.idle_rate / MHZ, ddr.suspend_rate / MHZ, ddr.reboot_rate / MHZ);
682 misc_deregister(&video_state_dev);
685 //UNREGISTER_CLK_NOTIFIER(pd_gpu);
686 //UNREGISTER_CLK_NOTIFIER(pd_rga);
687 //UNREGISTER_CLK_NOTIFIER(pd_cif0);
688 //UNREGISTER_CLK_NOTIFIER(pd_cif1);
690 if (ddr.dualview_rate) {
691 //UNREGISTER_CLK_NOTIFIER(pd_lcdc0);
692 //UNREGISTER_CLK_NOTIFIER(pd_lcdc1);
697 late_initcall(ddrfreq_init);
699 /****************************ddr bandwith tst************************************/
700 #if 0//defined(CONFIG_RK_PM_TESTS)
702 #define USE_NORMAL_TIME
704 #ifdef USE_NORMAL_TIME
705 static struct timer_list ddrbw_timer;
707 static struct hrtimer ddrbw_hrtimer;
709 enum ddr_bandwidth_id{
717 #define grf_readl(offset) readl_relaxed(RK_GRF_VIRT + offset)
718 #define grf_writel(v, offset) do { writel_relaxed(v, RK_GRF_VIRT + offset); dsb(); } while (0)
720 static u32 ddr_bw_show_st=0;
722 #define ddr_monitor_start() grf_writel(0xc000c000,RK3288_GRF_SOC_CON4)
723 #define ddr_monitor_end() grf_writel(0xc0000000,RK3288_GRF_SOC_CON4)
725 static ssize_t ddrbw_dyn_show(struct kobject *kobj, struct kobj_attribute *attr,
732 static ssize_t ddrbw_dyn_store(struct kobject *kobj, struct kobj_attribute *attr,
733 const char *buf, size_t n)
737 if((strncmp(buf, "start", strlen("start")) == 0)) {
741 #ifdef USE_NORMAL_TIME
742 mod_timer(&ddrbw_timer, jiffies + msecs_to_jiffies(500));
744 hrtimer_start(&ddrbw_hrtimer, ktime_set(0, 5 * 1000 * 1000*1000), HRTIMER_MODE_REL);
747 } else if((strncmp(buf, "stop", strlen("stop")) == 0)) {
755 static void ddr_bandwidth_get(void)
757 u32 ddr_bw_val[2][ddrbw_id_end];
763 for(i=0;i<ddrbw_eff;i++)
765 ddr_bw_val[j][i]=grf_readl(RK3288_GRF_SOC_STATUS11+i*4+j*16);
767 ddr_monitor_end();//stop
770 temp64=((u64)ddr_bw_val[0][0]+ddr_bw_val[0][1])*8*100;
772 // printk("ch0 %llu\n",temp64);
774 do_div(temp64,ddr_bw_val[0][ddrbw_time_num]);
775 ddr_bw_val[0][ddrbw_eff]= temp64;
776 temp64=((u64)ddr_bw_val[1][0]+ddr_bw_val[1][1])*8*100;
778 //printk("ch1 %llu\n",temp64);
780 do_div(temp64,ddr_bw_val[1][ddrbw_time_num]);
781 ddr_bw_val[1][ddrbw_eff]= temp64;
783 printk("ddrch0,wr,rd,act,time,percent(%x,%x,%x,%x,%d)\n",
784 ddr_bw_val[0][0],ddr_bw_val[0][1],ddr_bw_val[0][2],ddr_bw_val[0][3],ddr_bw_val[0][4]);
785 printk("ddrch1,wr,rd,act,time,percent(%x,%x,%x,%x,%d)\n",
786 ddr_bw_val[1][0],ddr_bw_val[1][1],ddr_bw_val[1][2],ddr_bw_val[1][3],ddr_bw_val[1][4]);
790 #ifdef USE_NORMAL_TIME
791 static void ddrbw_timer_fn(unsigned long data)
797 mod_timer(&ddrbw_timer, jiffies + msecs_to_jiffies(500));
801 struct hrtimer ddrbw_hrtimer;
802 static enum hrtimer_restart ddrbw_hrtimer_timer_func(struct hrtimer *timer)
807 hrtimer_start(timer, ktime_set(0, 1 * 1000 * 1000), HRTIMER_MODE_REL);
812 struct ddrfreq_attribute {
813 struct attribute attr;
814 ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr,
816 ssize_t (*store)(struct kobject *kobj, struct kobj_attribute *attr,
817 const char *buf, size_t n);
820 static struct ddrfreq_attribute ddrfreq_attrs[] = {
821 /* node_name permision show_func store_func */
822 __ATTR(ddrbw, S_IRUSR | S_IRGRP | S_IWUSR,ddrbw_dyn_show, ddrbw_dyn_store),
824 int rk_pm_tests_kobj_atrradd(const struct attribute *attr);
826 static void ddrfreq_tst_init(void)
829 #ifdef USE_NORMAL_TIME
830 init_timer(&ddrbw_timer);
831 //ddrbw_timer.expires = jiffies+msecs_to_jiffies(1);
832 ddrbw_timer.function = ddrbw_timer_fn;
833 //mod_timer(&ddrbw_timer,jiffies+msecs_to_jiffies(1));
835 hrtimer_init(&ddrbw_hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
836 ddrbw_hrtimer.function = ddrbw_hrtimer_timer_func;
837 //hrtimer_start(&ddrbw_hrtimer,ktime_set(0, 5*1000*1000),HRTIMER_MODE_REL);
839 printk("*****%s*****\n",__FUNCTION__);
841 ret = rk_pm_tests_kobj_atrradd(&ddrfreq_attrs[0].attr);
843 printk("create ddrfreq sysfs node error\n");