- use the clk_summary file of CCF for showing clocks - add option to show active or all clocks
Signed-off-by: Sanjay Singh Rawat sanjay.rawat@linaro.org --- clocks.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++------------ display.c | 3 +++ display.h | 1 + 3 files changed, 54 insertions(+), 12 deletions(-)
diff --git a/clocks.c b/clocks.c index 95acf57..a0510b4 100644 --- a/clocks.c +++ b/clocks.c @@ -287,9 +287,8 @@ static int clock_print_header(void) int ret;
if(clock_fw == CCF) { - if (asprintf(&buf, "%-35s %-10s %-12s %-10s %-11s %-15s %-14s %-14s", - "Name", "Flags", "Rate", "Usecount", "Children", "Prepare_Count", - "Enable_Count", "Notifier_Count") < 0) + if (asprintf(&buf, "%-30s %-10s %-12s %-10s (clock toggle key-'c')", + "Name", "Enable_Count", "Prepare_Count", "Rate") < 0) return -1; } else { @@ -297,23 +296,57 @@ static int clock_print_header(void) "Name", "Flags", "Rate", "Usecount", "Children") < 0) return -1; } - ret = display_column_name(buf); - free(buf);
return ret; }
+/* + * Display clocks by refering the clk_summary file of CCF + */ +static int display_clk_summary() +{ + FILE *fp; + char line[256]; + int afterheader; + char clock[30]; + int enable_cnt,prepare_cnt,rate; + + afterheader = 0; + fp = fopen("/sys/kernel/debug/clk/clk_summary","r"); + if (fp == NULL) { + printf("error: failed to open clock tree file\n"); + return -1; + } + + while (NULL != fgets(line,256,fp)) { + if (afterheader > 1) { + sscanf(line,"%s %d %d %d",clock,&enable_cnt,&prepare_cnt,&rate); + if (active_clks) { + if (enable_cnt) + display_print_line(CLOCK,afterheader, + line,0,clock_tree); + } + else + display_print_line(CLOCK,afterheader,line,1,clock_tree); + } + afterheader++; + } + return 0; +} + static int clock_print_info(struct tree *tree) { int ret, line = 0;
display_reset_cursor(CLOCK); - clock_print_header();
- ret = tree_for_each(tree, clock_print_info_cb, &line); + if (clock_fw == CCF) + ret = display_clk_summary(); + else + ret = tree_for_each(tree, clock_print_info_cb, &line);
display_refresh_pad(CLOCK);
@@ -426,8 +459,10 @@ int clock_init(void)
sprintf(clk_dir_path[CCF], "%s/clk", clk_dir_path[CCF]); sprintf(clk_dir_path[OCF], "%s/clock", clk_dir_path[OCF]); + if (!access(clk_dir_path[CCF], F_OK)) { clock_fw = CCF; + active_clks = true; strcpy(clk_dir_path[MAX],clk_dir_path[CCF]); } else if(!access(clk_dir_path[OCF], F_OK)) { @@ -437,12 +472,15 @@ int clock_init(void) else return -1;
- clock_tree = tree_load(clk_dir_path[MAX], NULL, false); - if (!clock_tree) - return -1; + /* Not preparing tree for CCF, will use the clk_summary file */ + if(clock_fw != CCF) { + clock_tree = tree_load(clk_dir_path[MAX], NULL, false); + if (!clock_tree) + return -1;
- if (fill_clock_tree()) - return -1; + if (fill_clock_tree()) + return -1; + }
return display_register(CLOCK, &clock_ops); } diff --git a/display.c b/display.c index e9f4bf6..98544e6 100644 --- a/display.c +++ b/display.c @@ -416,6 +416,9 @@ static int display_keystroke(int fd, void *data) case 'r': case 'R': return display_refresh(current_win, true); + case 'c': + active_clks = active_clks ? false : true; + return display_refresh(current_win, true); default: return 0; } diff --git a/display.h b/display.h index 6362a48..24c9d59 100644 --- a/display.h +++ b/display.h @@ -33,4 +33,5 @@ extern int display_init(int wdefault); extern int display_register(int win, struct display_ops *ops); extern int display_column_name(const char *line);
+bool active_clks; #define NAME_MAX 255
Sebastian,
Could you help Sanjay with verification of this feature?
Regards, Amit
On Sun, May 5, 2013 at 1:57 AM, Sanjay Singh Rawat sanjay.rawat@linaro.org wrote:
- use the clk_summary file of CCF for showing clocks
- add option to show active or all clocks
Signed-off-by: Sanjay Singh Rawat sanjay.rawat@linaro.org
clocks.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++------------ display.c | 3 +++ display.h | 1 + 3 files changed, 54 insertions(+), 12 deletions(-)
diff --git a/clocks.c b/clocks.c index 95acf57..a0510b4 100644 --- a/clocks.c +++ b/clocks.c @@ -287,9 +287,8 @@ static int clock_print_header(void) int ret;
if(clock_fw == CCF) {
if (asprintf(&buf, "%-35s %-10s %-12s %-10s %-11s %-15s %-14s %-14s",
"Name", "Flags", "Rate", "Usecount", "Children", "Prepare_Count",
"Enable_Count", "Notifier_Count") < 0)
if (asprintf(&buf, "%-30s %-10s %-12s %-10s (clock toggle key-'c')",
"Name", "Enable_Count", "Prepare_Count", "Rate") < 0) return -1; } else {
@@ -297,23 +296,57 @@ static int clock_print_header(void) "Name", "Flags", "Rate", "Usecount", "Children") < 0) return -1; }
ret = display_column_name(buf);
free(buf); return ret;
}
+/*
- Display clocks by refering the clk_summary file of CCF
- */
+static int display_clk_summary() +{
FILE *fp;
char line[256];
int afterheader;
char clock[30];
int enable_cnt,prepare_cnt,rate;
afterheader = 0;
fp = fopen("/sys/kernel/debug/clk/clk_summary","r");
if (fp == NULL) {
printf("error: failed to open clock tree file\n");
return -1;
}
while (NULL != fgets(line,256,fp)) {
if (afterheader > 1) {
sscanf(line,"%s %d %d %d",clock,&enable_cnt,&prepare_cnt,&rate);
if (active_clks) {
if (enable_cnt)
display_print_line(CLOCK,afterheader,
line,0,clock_tree);
}
else
display_print_line(CLOCK,afterheader,line,1,clock_tree);
}
afterheader++;
}
return 0;
+}
static int clock_print_info(struct tree *tree) { int ret, line = 0;
display_reset_cursor(CLOCK);
clock_print_header();
ret = tree_for_each(tree, clock_print_info_cb, &line);
if (clock_fw == CCF)
ret = display_clk_summary();
else
ret = tree_for_each(tree, clock_print_info_cb, &line); display_refresh_pad(CLOCK);
@@ -426,8 +459,10 @@ int clock_init(void)
sprintf(clk_dir_path[CCF], "%s/clk", clk_dir_path[CCF]); sprintf(clk_dir_path[OCF], "%s/clock", clk_dir_path[OCF]);
if (!access(clk_dir_path[CCF], F_OK)) { clock_fw = CCF;
active_clks = true; strcpy(clk_dir_path[MAX],clk_dir_path[CCF]); } else if(!access(clk_dir_path[OCF], F_OK)) {
@@ -437,12 +472,15 @@ int clock_init(void) else return -1;
clock_tree = tree_load(clk_dir_path[MAX], NULL, false);
if (!clock_tree)
return -1;
/* Not preparing tree for CCF, will use the clk_summary file */
if(clock_fw != CCF) {
clock_tree = tree_load(clk_dir_path[MAX], NULL, false);
if (!clock_tree)
return -1;
if (fill_clock_tree())
return -1;
if (fill_clock_tree())
return -1;
} return display_register(CLOCK, &clock_ops);
} diff --git a/display.c b/display.c index e9f4bf6..98544e6 100644 --- a/display.c +++ b/display.c @@ -416,6 +416,9 @@ static int display_keystroke(int fd, void *data) case 'r': case 'R': return display_refresh(current_win, true);
case 'c':
active_clks = active_clks ? false : true;
return display_refresh(current_win, true); default: return 0; }
diff --git a/display.h b/display.h index 6362a48..24c9d59 100644 --- a/display.h +++ b/display.h @@ -33,4 +33,5 @@ extern int display_init(int wdefault); extern int display_register(int win, struct display_ops *ops); extern int display_column_name(const char *line);
+bool active_clks;
#define NAME_MAX 255
1.7.9.5
linaro-dev mailing list linaro-dev@lists.linaro.org http://lists.linaro.org/mailman/listinfo/linaro-dev
Quoting Sanjay Singh Rawat (2013-05-04 13:27:58)
- use the clk_summary file of CCF for showing clocks
- add option to show active or all clocks
Signed-off-by: Sanjay Singh Rawat sanjay.rawat@linaro.org
clk_dump gives a JSON-formatted description of the clock tree, so it is a bit more machine readable than clk_summary. Also if you wanted to actually represent a tree structure then clk_dump would be a better starting point than using clk_summary, which does not include parent-child relationship information.
Regards, Mike
clocks.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++------------ display.c | 3 +++ display.h | 1 + 3 files changed, 54 insertions(+), 12 deletions(-)
diff --git a/clocks.c b/clocks.c index 95acf57..a0510b4 100644 --- a/clocks.c +++ b/clocks.c @@ -287,9 +287,8 @@ static int clock_print_header(void) int ret; if(clock_fw == CCF) {
if (asprintf(&buf, "%-35s %-10s %-12s %-10s %-11s %-15s %-14s %-14s",
"Name", "Flags", "Rate", "Usecount", "Children", "Prepare_Count",
"Enable_Count", "Notifier_Count") < 0)
if (asprintf(&buf, "%-30s %-10s %-12s %-10s (clock toggle key-'c')",
"Name", "Enable_Count", "Prepare_Count", "Rate") < 0) return -1; } else {
@@ -297,23 +296,57 @@ static int clock_print_header(void) "Name", "Flags", "Rate", "Usecount", "Children") < 0) return -1; }
ret = display_column_name(buf);
free(buf);
return ret; } +/*
- Display clocks by refering the clk_summary file of CCF
- */
+static int display_clk_summary() +{
FILE *fp;
char line[256];
int afterheader;
char clock[30];
int enable_cnt,prepare_cnt,rate;
afterheader = 0;
fp = fopen("/sys/kernel/debug/clk/clk_summary","r");
if (fp == NULL) {
printf("error: failed to open clock tree file\n");
return -1;
}
while (NULL != fgets(line,256,fp)) {
if (afterheader > 1) {
sscanf(line,"%s %d %d %d",clock,&enable_cnt,&prepare_cnt,&rate);
if (active_clks) {
if (enable_cnt)
display_print_line(CLOCK,afterheader,
line,0,clock_tree);
}
else
display_print_line(CLOCK,afterheader,line,1,clock_tree);
}
afterheader++;
}
return 0;
+}
static int clock_print_info(struct tree *tree) { int ret, line = 0; display_reset_cursor(CLOCK);
clock_print_header();
ret = tree_for_each(tree, clock_print_info_cb, &line);
if (clock_fw == CCF)
ret = display_clk_summary();
else
ret = tree_for_each(tree, clock_print_info_cb, &line);
display_refresh_pad(CLOCK); @@ -426,8 +459,10 @@ int clock_init(void) sprintf(clk_dir_path[CCF], "%s/clk", clk_dir_path[CCF]); sprintf(clk_dir_path[OCF], "%s/clock", clk_dir_path[OCF]);
if (!access(clk_dir_path[CCF], F_OK)) { clock_fw = CCF;
active_clks = true; strcpy(clk_dir_path[MAX],clk_dir_path[CCF]); } else if(!access(clk_dir_path[OCF], F_OK)) {
@@ -437,12 +472,15 @@ int clock_init(void) else return -1;
clock_tree = tree_load(clk_dir_path[MAX], NULL, false);
if (!clock_tree)
return -1;
/* Not preparing tree for CCF, will use the clk_summary file */
if(clock_fw != CCF) {
clock_tree = tree_load(clk_dir_path[MAX], NULL, false);
if (!clock_tree)
return -1;
if (fill_clock_tree())
return -1;
if (fill_clock_tree())
return -1;
}
return display_register(CLOCK, &clock_ops); } diff --git a/display.c b/display.c index e9f4bf6..98544e6 100644 --- a/display.c +++ b/display.c @@ -416,6 +416,9 @@ static int display_keystroke(int fd, void *data) case 'r': case 'R': return display_refresh(current_win, true);
case 'c':
active_clks = active_clks ? false : true;
return display_refresh(current_win, true); default: return 0; }
diff --git a/display.h b/display.h index 6362a48..24c9d59 100644 --- a/display.h +++ b/display.h @@ -33,4 +33,5 @@ extern int display_init(int wdefault); extern int display_register(int win, struct display_ops *ops); extern int display_column_name(const char *line); +bool active_clks;
#define NAME_MAX 255
1.7.9.5
linaro-dev mailing list linaro-dev@lists.linaro.org http://lists.linaro.org/mailman/listinfo/linaro-dev
On Monday 06 May 2013 09:36 PM, Mike Turquette wrote:
Quoting Sanjay Singh Rawat (2013-05-04 13:27:58)
- use the clk_summary file of CCF for showing clocks
- add option to show active or all clocks
Signed-off-by: Sanjay Singh Rawat sanjay.rawat@linaro.org
clk_dump gives a JSON-formatted description of the clock tree, so it is a bit more machine readable than clk_summary. Also if you wanted to actually represent a tree structure then clk_dump would be a better starting point than using clk_summary, which does not include parent-child relationship information.
Regards, Mike
thanks Mike - The way the clocks are displayed with this patch, the alignment takes care of the parent/child relationship. - The format of the content doesn't matter here IIUC, as anyway we have to parse the content and show it in the clock window.
clocks.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++------------ display.c | 3 +++ display.h | 1 + 3 files changed, 54 insertions(+), 12 deletions(-)
diff --git a/clocks.c b/clocks.c index 95acf57..a0510b4 100644 --- a/clocks.c +++ b/clocks.c @@ -287,9 +287,8 @@ static int clock_print_header(void) int ret;
if(clock_fw == CCF) {
if (asprintf(&buf, "%-35s %-10s %-12s %-10s %-11s %-15s %-14s %-14s",
"Name", "Flags", "Rate", "Usecount", "Children", "Prepare_Count",
"Enable_Count", "Notifier_Count") < 0)
if (asprintf(&buf, "%-30s %-10s %-12s %-10s (clock toggle key-'c')",
"Name", "Enable_Count", "Prepare_Count", "Rate") < 0) return -1; } else {
@@ -297,23 +296,57 @@ static int clock_print_header(void) "Name", "Flags", "Rate", "Usecount", "Children") < 0) return -1; }
ret = display_column_name(buf);
free(buf); return ret;
}
+/*
- Display clocks by refering the clk_summary file of CCF
- */
+static int display_clk_summary() +{
FILE *fp;
char line[256];
int afterheader;
char clock[30];
int enable_cnt,prepare_cnt,rate;
afterheader = 0;
fp = fopen("/sys/kernel/debug/clk/clk_summary","r");
if (fp == NULL) {
printf("error: failed to open clock tree file\n");
return -1;
}
while (NULL != fgets(line,256,fp)) {
if (afterheader > 1) {
sscanf(line,"%s %d %d %d",clock,&enable_cnt,&prepare_cnt,&rate);
if (active_clks) {
if (enable_cnt)
display_print_line(CLOCK,afterheader,
line,0,clock_tree);
}
else
display_print_line(CLOCK,afterheader,line,1,clock_tree);
}
afterheader++;
}
return 0;
+}
static int clock_print_info(struct tree *tree) { int ret, line = 0;
display_reset_cursor(CLOCK);
clock_print_header();
ret = tree_for_each(tree, clock_print_info_cb, &line);
if (clock_fw == CCF)
ret = display_clk_summary();
else
ret = tree_for_each(tree, clock_print_info_cb, &line); display_refresh_pad(CLOCK);
@@ -426,8 +459,10 @@ int clock_init(void)
sprintf(clk_dir_path[CCF], "%s/clk", clk_dir_path[CCF]); sprintf(clk_dir_path[OCF], "%s/clock", clk_dir_path[OCF]);
if (!access(clk_dir_path[CCF], F_OK)) { clock_fw = CCF;
active_clks = true; strcpy(clk_dir_path[MAX],clk_dir_path[CCF]); } else if(!access(clk_dir_path[OCF], F_OK)) {
@@ -437,12 +472,15 @@ int clock_init(void) else return -1;
clock_tree = tree_load(clk_dir_path[MAX], NULL, false);
if (!clock_tree)
return -1;
/* Not preparing tree for CCF, will use the clk_summary file */
if(clock_fw != CCF) {
clock_tree = tree_load(clk_dir_path[MAX], NULL, false);
if (!clock_tree)
return -1;
if (fill_clock_tree())
return -1;
if (fill_clock_tree())
return -1;
} return display_register(CLOCK, &clock_ops);
}
diff --git a/display.c b/display.c index e9f4bf6..98544e6 100644 --- a/display.c +++ b/display.c @@ -416,6 +416,9 @@ static int display_keystroke(int fd, void *data) case 'r': case 'R': return display_refresh(current_win, true);
case 'c':
active_clks = active_clks ? false : true;
return display_refresh(current_win, true); default: return 0; }
diff --git a/display.h b/display.h index 6362a48..24c9d59 100644 --- a/display.h +++ b/display.h @@ -33,4 +33,5 @@ extern int display_init(int wdefault); extern int display_register(int win, struct display_ops *ops); extern int display_column_name(const char *line);
+bool active_clks;
#define NAME_MAX 255
1.7.9.5
linaro-dev mailing list linaro-dev@lists.linaro.org http://lists.linaro.org/mailman/listinfo/linaro-dev
The original clock display in powerdebug would expand and collapse subtrees in the clock heirarchy using the enter key. If we continue along the lines you're following, you'll want to override the actions in clock_select to do nothing as they're currently trying to expand the subtree which is causing the segfault we see now.
You may instead want to change it so that the new active clock display works as you've done, but the unfiltered display works like the original version with expanded and collapsed subtrees. This will require a bit more rework, but as it stands, the addition of the active clock view substantially changes the behavior of the full clock view. Was this intentional?
Thanks,
Sebastian
On 7 May 2013 10:19, Sanjay Singh Rawat sanjay.rawat@linaro.org wrote:
On Monday 06 May 2013 09:36 PM, Mike Turquette wrote:
Quoting Sanjay Singh Rawat (2013-05-04 13:27:58)
- use the clk_summary file of CCF for showing clocks
- add option to show active or all clocks
Signed-off-by: Sanjay Singh Rawat sanjay.rawat@linaro.org
clk_dump gives a JSON-formatted description of the clock tree, so it is a bit more machine readable than clk_summary. Also if you wanted to actually represent a tree structure then clk_dump would be a better starting point than using clk_summary, which does not include parent-child relationship information.
Regards, Mike
thanks Mike
- The way the clocks are displayed with this patch, the alignment takes
care of the parent/child relationship.
- The format of the content doesn't matter here IIUC, as anyway we have to
parse the content and show it in the clock window.
clocks.c | 62 ++++++++++++++++++++++++++++++** +++++++++++++++++++-----------**- display.c | 3 +++ display.h | 1 + 3 files changed, 54 insertions(+), 12 deletions(-)
diff --git a/clocks.c b/clocks.c index 95acf57..a0510b4 100644 --- a/clocks.c +++ b/clocks.c @@ -287,9 +287,8 @@ static int clock_print_header(void) int ret;
if(clock_fw == CCF) {
if (asprintf(&buf, "%-35s %-10s %-12s %-10s %-11s %-15s
%-14s %-14s",
"Name", "Flags", "Rate", "Usecount", "Children",
"Prepare_Count",
"Enable_Count", "Notifier_Count") < 0)
if (asprintf(&buf, "%-30s %-10s %-12s %-10s (clock
toggle key-'c')",
"Name", "Enable_Count", "Prepare_Count", "Rate") <
return -1; } else {
@@ -297,23 +296,57 @@ static int clock_print_header(void) "Name", "Flags", "Rate", "Usecount", "Children") < 0) return -1; }
ret = display_column_name(buf);
free(buf); return ret;
}
+/*
- Display clocks by refering the clk_summary file of CCF
- */
+static int display_clk_summary() +{
FILE *fp;
char line[256];
int afterheader;
char clock[30];
int enable_cnt,prepare_cnt,rate;
afterheader = 0;
fp = fopen("/sys/kernel/debug/clk/**clk_summary","r");
if (fp == NULL) {
printf("error: failed to open clock tree file\n");
return -1;
}
while (NULL != fgets(line,256,fp)) {
if (afterheader > 1) {
sscanf(line,"%s %d %d %d",clock,&enable_cnt,&**
prepare_cnt,&rate);
if (active_clks) {
if (enable_cnt)
display_print_line(CLOCK,**
afterheader,
line,0,clock_tree);
}
else
display_print_line(CLOCK,**
afterheader,line,1,clock_tree)**;
}
afterheader++;
}
return 0;
+}
static int clock_print_info(struct tree *tree) { int ret, line = 0;
display_reset_cursor(CLOCK);
clock_print_header();
ret = tree_for_each(tree, clock_print_info_cb, &line);
if (clock_fw == CCF)
ret = display_clk_summary();
else
ret = tree_for_each(tree, clock_print_info_cb, &line); display_refresh_pad(CLOCK);
@@ -426,8 +459,10 @@ int clock_init(void)
sprintf(clk_dir_path[CCF], "%s/clk", clk_dir_path[CCF]); sprintf(clk_dir_path[OCF], "%s/clock", clk_dir_path[OCF]);
if (!access(clk_dir_path[CCF], F_OK)) { clock_fw = CCF;
active_clks = true; strcpy(clk_dir_path[MAX],clk_**dir_path[CCF]); } else if(!access(clk_dir_path[OCF], F_OK)) {
@@ -437,12 +472,15 @@ int clock_init(void) else return -1;
clock_tree = tree_load(clk_dir_path[MAX], NULL, false);
if (!clock_tree)
return -1;
/* Not preparing tree for CCF, will use the clk_summary file */
if(clock_fw != CCF) {
clock_tree = tree_load(clk_dir_path[MAX], NULL, false);
if (!clock_tree)
return -1;
if (fill_clock_tree())
return -1;
if (fill_clock_tree())
return -1;
} return display_register(CLOCK, &clock_ops);
}
diff --git a/display.c b/display.c index e9f4bf6..98544e6 100644 --- a/display.c +++ b/display.c @@ -416,6 +416,9 @@ static int display_keystroke(int fd, void *data) case 'r': case 'R': return display_refresh(current_win, true);
case 'c':
active_clks = active_clks ? false : true;
return display_refresh(current_win, true); default: return 0; }
diff --git a/display.h b/display.h index 6362a48..24c9d59 100644 --- a/display.h +++ b/display.h @@ -33,4 +33,5 @@ extern int display_init(int wdefault); extern int display_register(int win, struct display_ops *ops); extern int display_column_name(const char *line);
+bool active_clks;
#define NAME_MAX 255
1.7.9.5
______________________________**_________________ linaro-dev mailing list linaro-dev@lists.linaro.org http://lists.linaro.org/**mailman/listinfo/linaro-devhttp://lists.linaro.org/mailman/listinfo/linaro-dev
______________________________**_________________ linaro-dev mailing list linaro-dev@lists.linaro.org http://lists.linaro.org/**mailman/listinfo/linaro-devhttp://lists.linaro.org/mailman/listinfo/linaro-dev
Hi Sanjay,
Also, clock tree dump (using powerdebug -dc) does not show the clock info anymore with this change.
Thanks,
Sebastian
On 7 May 2013 15:05, Sebastian Capella sebastian.capella@linaro.org wrote:
The original clock display in powerdebug would expand and collapse subtrees in the clock heirarchy using the enter key. If we continue along the lines you're following, you'll want to override the actions in clock_select to do nothing as they're currently trying to expand the subtree which is causing the segfault we see now.
You may instead want to change it so that the new active clock display works as you've done, but the unfiltered display works like the original version with expanded and collapsed subtrees. This will require a bit more rework, but as it stands, the addition of the active clock view substantially changes the behavior of the full clock view. Was this intentional?
Thanks,
Sebastian
On 7 May 2013 10:19, Sanjay Singh Rawat sanjay.rawat@linaro.org wrote:
On Monday 06 May 2013 09:36 PM, Mike Turquette wrote:
Quoting Sanjay Singh Rawat (2013-05-04 13:27:58)
- use the clk_summary file of CCF for showing clocks
- add option to show active or all clocks
Signed-off-by: Sanjay Singh Rawat sanjay.rawat@linaro.org
clk_dump gives a JSON-formatted description of the clock tree, so it is a bit more machine readable than clk_summary. Also if you wanted to actually represent a tree structure then clk_dump would be a better starting point than using clk_summary, which does not include parent-child relationship information.
Regards, Mike
thanks Mike
- The way the clocks are displayed with this patch, the alignment takes
care of the parent/child relationship.
- The format of the content doesn't matter here IIUC, as anyway we have
to parse the content and show it in the clock window.
clocks.c | 62 ++++++++++++++++++++++++++++++** +++++++++++++++++++-----------**- display.c | 3 +++ display.h | 1 + 3 files changed, 54 insertions(+), 12 deletions(-)
diff --git a/clocks.c b/clocks.c index 95acf57..a0510b4 100644 --- a/clocks.c +++ b/clocks.c @@ -287,9 +287,8 @@ static int clock_print_header(void) int ret;
if(clock_fw == CCF) {
if (asprintf(&buf, "%-35s %-10s %-12s %-10s %-11s %-15s
%-14s %-14s",
"Name", "Flags", "Rate", "Usecount", "Children",
"Prepare_Count",
"Enable_Count", "Notifier_Count") < 0)
if (asprintf(&buf, "%-30s %-10s %-12s %-10s (clock
toggle key-'c')",
"Name", "Enable_Count", "Prepare_Count", "Rate") <
return -1; } else {
@@ -297,23 +296,57 @@ static int clock_print_header(void) "Name", "Flags", "Rate", "Usecount", "Children") < 0) return -1; }
ret = display_column_name(buf);
free(buf); return ret;
}
+/*
- Display clocks by refering the clk_summary file of CCF
- */
+static int display_clk_summary() +{
FILE *fp;
char line[256];
int afterheader;
char clock[30];
int enable_cnt,prepare_cnt,rate;
afterheader = 0;
fp = fopen("/sys/kernel/debug/clk/**clk_summary","r");
if (fp == NULL) {
printf("error: failed to open clock tree file\n");
return -1;
}
while (NULL != fgets(line,256,fp)) {
if (afterheader > 1) {
sscanf(line,"%s %d %d %d",clock,&enable_cnt,&*
*prepare_cnt,&rate);
if (active_clks) {
if (enable_cnt)
display_print_line(CLOCK,**
afterheader,
line,0,clock_tree);
}
else
display_print_line(CLOCK,**
afterheader,line,1,clock_tree)**;
}
afterheader++;
}
return 0;
+}
static int clock_print_info(struct tree *tree) { int ret, line = 0;
display_reset_cursor(CLOCK);
clock_print_header();
ret = tree_for_each(tree, clock_print_info_cb, &line);
if (clock_fw == CCF)
ret = display_clk_summary();
else
ret = tree_for_each(tree, clock_print_info_cb, &line); display_refresh_pad(CLOCK);
@@ -426,8 +459,10 @@ int clock_init(void)
sprintf(clk_dir_path[CCF], "%s/clk", clk_dir_path[CCF]); sprintf(clk_dir_path[OCF], "%s/clock", clk_dir_path[OCF]);
if (!access(clk_dir_path[CCF], F_OK)) { clock_fw = CCF;
active_clks = true; strcpy(clk_dir_path[MAX],clk_**dir_path[CCF]); } else if(!access(clk_dir_path[OCF], F_OK)) {
@@ -437,12 +472,15 @@ int clock_init(void) else return -1;
clock_tree = tree_load(clk_dir_path[MAX], NULL, false);
if (!clock_tree)
return -1;
/* Not preparing tree for CCF, will use the clk_summary file */
if(clock_fw != CCF) {
clock_tree = tree_load(clk_dir_path[MAX], NULL, false);
if (!clock_tree)
return -1;
if (fill_clock_tree())
return -1;
if (fill_clock_tree())
return -1;
} return display_register(CLOCK, &clock_ops);
}
diff --git a/display.c b/display.c index e9f4bf6..98544e6 100644 --- a/display.c +++ b/display.c @@ -416,6 +416,9 @@ static int display_keystroke(int fd, void *data) case 'r': case 'R': return display_refresh(current_win, true);
case 'c':
active_clks = active_clks ? false : true;
return display_refresh(current_win, true); default: return 0; }
diff --git a/display.h b/display.h index 6362a48..24c9d59 100644 --- a/display.h +++ b/display.h @@ -33,4 +33,5 @@ extern int display_init(int wdefault); extern int display_register(int win, struct display_ops *ops); extern int display_column_name(const char *line);
+bool active_clks;
#define NAME_MAX 255
1.7.9.5
______________________________**_________________ linaro-dev mailing list linaro-dev@lists.linaro.org http://lists.linaro.org/**mailman/listinfo/linaro-devhttp://lists.linaro.org/mailman/listinfo/linaro-dev
______________________________**_________________ linaro-dev mailing list linaro-dev@lists.linaro.org http://lists.linaro.org/**mailman/listinfo/linaro-devhttp://lists.linaro.org/mailman/listinfo/linaro-dev
thanks Sebastian
On Wednesday 08 May 2013 04:12 AM, Sebastian Capella wrote:
Hi Sanjay,
Also, clock tree dump (using powerdebug -dc) does not show the clock info anymore with this change.
Thanks,
Ack, will take care in next patch.
Sebastian
On 7 May 2013 15:05, Sebastian Capella <sebastian.capella@linaro.org mailto:sebastian.capella@linaro.org> wrote:
The original clock display in powerdebug would expand and collapse subtrees in the clock heirarchy using the enter key. If we continue along the lines you're following, you'll want to override the actions in clock_select to do nothing as they're currently trying to expand the subtree which is causing the segfault we see now.
ditto
You may instead want to change it so that the new active clock display works as you've done, but the unfiltered display works like the original version with expanded and collapsed subtrees. This will require a bit more rework, but as it stands, the addition of the active clock view substantially changes the behavior of the full clock view. Was this intentional?
The requirement as per the blueprint is to show *ONLY* the active clocks in the window. I thought it will be good to keep all clock info also, so added that part.
Thanks, Sebastian On 7 May 2013 10:19, Sanjay Singh Rawat <sanjay.rawat@linaro.org <mailto:sanjay.rawat@linaro.org>> wrote: On Monday 06 May 2013 09:36 PM, Mike Turquette wrote: Quoting Sanjay Singh Rawat (2013-05-04 13:27:58) - use the clk_summary file of CCF for showing clocks - add option to show active or all clocks Signed-off-by: Sanjay Singh Rawat <sanjay.rawat@linaro.org <mailto:sanjay.rawat@linaro.org>> clk_dump gives a JSON-formatted description of the clock tree, so it is a bit more machine readable than clk_summary. Also if you wanted to actually represent a tree structure then clk_dump would be a better starting point than using clk_summary, which does not include parent-child relationship information. Regards, Mike thanks Mike - The way the clocks are displayed with this patch, the alignment takes care of the parent/child relationship. - The format of the content doesn't matter here IIUC, as anyway we have to parse the content and show it in the clock window. --- clocks.c | 62 ++++++++++++++++++++++++++++++__+++++++++++++++++++-----------__- display.c | 3 +++ display.h | 1 + 3 files changed, 54 insertions(+), 12 deletions(-) diff --git a/clocks.c b/clocks.c index 95acf57..a0510b4 100644 --- a/clocks.c +++ b/clocks.c @@ -287,9 +287,8 @@ static int clock_print_header(void) int ret; if(clock_fw == CCF) { - if (asprintf(&buf, "%-35s %-10s %-12s %-10s %-11s %-15s %-14s %-14s", - "Name", "Flags", "Rate", "Usecount", "Children", "Prepare_Count", - "Enable_Count", "Notifier_Count") < 0) + if (asprintf(&buf, "%-30s %-10s %-12s %-10s (clock toggle key-'c')", + "Name", "Enable_Count", "Prepare_Count", "Rate") < 0) return -1; } else { @@ -297,23 +296,57 @@ static int clock_print_header(void) "Name", "Flags", "Rate", "Usecount", "Children") < 0) return -1; } - ret = display_column_name(buf); - free(buf); return ret; } +/* + * Display clocks by refering the clk_summary file of CCF + */ +static int display_clk_summary() +{ + FILE *fp; + char line[256]; + int afterheader; + char clock[30]; + int enable_cnt,prepare_cnt,rate; + + afterheader = 0; + fp = fopen("/sys/kernel/debug/clk/__clk_summary","r"); + if (fp == NULL) { + printf("error: failed to open clock tree file\n"); + return -1; + } + + while (NULL != fgets(line,256,fp)) { + if (afterheader > 1) { + sscanf(line,"%s %d %d %d",clock,&enable_cnt,&__prepare_cnt,&rate); + if (active_clks) { + if (enable_cnt) + display_print_line(CLOCK,__afterheader, + line,0,clock_tree); + } + else + display_print_line(CLOCK,__afterheader,line,1,clock_tree)__; + } + afterheader++; + } + return 0; +} + static int clock_print_info(struct tree *tree) { int ret, line = 0; display_reset_cursor(CLOCK); - clock_print_header(); - ret = tree_for_each(tree, clock_print_info_cb, &line); + if (clock_fw == CCF) + ret = display_clk_summary(); + else + ret = tree_for_each(tree, clock_print_info_cb, &line); display_refresh_pad(CLOCK); @@ -426,8 +459,10 @@ int clock_init(void) sprintf(clk_dir_path[CCF], "%s/clk", clk_dir_path[CCF]); sprintf(clk_dir_path[OCF], "%s/clock", clk_dir_path[OCF]); + if (!access(clk_dir_path[CCF], F_OK)) { clock_fw = CCF; + active_clks = true; strcpy(clk_dir_path[MAX],clk___dir_path[CCF]); } else if(!access(clk_dir_path[OCF], F_OK)) { @@ -437,12 +472,15 @@ int clock_init(void) else return -1; - clock_tree = tree_load(clk_dir_path[MAX], NULL, false); - if (!clock_tree) - return -1; + /* Not preparing tree for CCF, will use the clk_summary file */ + if(clock_fw != CCF) { + clock_tree = tree_load(clk_dir_path[MAX], NULL, false); + if (!clock_tree) + return -1; - if (fill_clock_tree()) - return -1; + if (fill_clock_tree()) + return -1; + } return display_register(CLOCK, &clock_ops); } diff --git a/display.c b/display.c index e9f4bf6..98544e6 100644 --- a/display.c +++ b/display.c @@ -416,6 +416,9 @@ static int display_keystroke(int fd, void *data) case 'r': case 'R': return display_refresh(current_win, true); + case 'c': + active_clks = active_clks ? false : true; + return display_refresh(current_win, true); default: return 0; } diff --git a/display.h b/display.h index 6362a48..24c9d59 100644 --- a/display.h +++ b/display.h @@ -33,4 +33,5 @@ extern int display_init(int wdefault); extern int display_register(int win, struct display_ops *ops); extern int display_column_name(const char *line); +bool active_clks; #define NAME_MAX 255 -- 1.7.9.5 _________________________________________________ linaro-dev mailing list linaro-dev@lists.linaro.org <mailto:linaro-dev@lists.linaro.org> http://lists.linaro.org/__mailman/listinfo/linaro-dev <http://lists.linaro.org/mailman/listinfo/linaro-dev> _________________________________________________ linaro-dev mailing list linaro-dev@lists.linaro.org <mailto:linaro-dev@lists.linaro.org> http://lists.linaro.org/__mailman/listinfo/linaro-dev <http://lists.linaro.org/mailman/listinfo/linaro-dev>