bool                    symbol_ipc;
        bool                    total_cycles_mode;
        struct block_report     *block_reports;
+       int                     nr_block_reports;
 };
 
 static int report__config(const char *var, const char *value, void *cb)
        report__output_resort(rep);
 
        if (rep->total_cycles_mode) {
+               int block_hpps[6] = {
+                       PERF_HPP_REPORT__BLOCK_TOTAL_CYCLES_PCT,
+                       PERF_HPP_REPORT__BLOCK_LBR_CYCLES,
+                       PERF_HPP_REPORT__BLOCK_CYCLES_PCT,
+                       PERF_HPP_REPORT__BLOCK_AVG_CYCLES,
+                       PERF_HPP_REPORT__BLOCK_RANGE,
+                       PERF_HPP_REPORT__BLOCK_DSO,
+               };
+
                rep->block_reports = block_info__create_report(session->evlist,
-                                                              rep->total_cycles);
+                                                              rep->total_cycles,
+                                                              block_hpps, 6,
+                                                              &rep->nr_block_reports);
                if (!rep->block_reports)
                        return -1;
        }
                zfree(&report.ptime_range);
        }
 
-       if (report.block_reports)
-               zfree(&report.block_reports);
+       if (report.block_reports) {
+               block_info__free_report(report.block_reports,
+                                       report.nr_block_reports);
+               report.block_reports = NULL;
+       }
 
        zstd_fini(&(session->zstd_data));
        perf_session__delete(session);
 
 }
 
 static void register_block_columns(struct perf_hpp_list *hpp_list,
-                                  struct block_fmt *block_fmts)
+                                  struct block_fmt *block_fmts,
+                                  int *block_hpps, int nr_hpps)
 {
-       for (int i = 0; i < PERF_HPP_REPORT__BLOCK_MAX_INDEX; i++)
-               hpp_register(&block_fmts[i], i, hpp_list);
+       for (int i = 0; i < nr_hpps; i++)
+               hpp_register(&block_fmts[i], block_hpps[i], hpp_list);
 }
 
-static void init_block_hist(struct block_hist *bh, struct block_fmt *block_fmts)
+static void init_block_hist(struct block_hist *bh, struct block_fmt *block_fmts,
+                           int *block_hpps, int nr_hpps)
 {
        __hists__init(&bh->block_hists, &bh->block_list);
        perf_hpp_list__init(&bh->block_list);
        bh->block_list.nr_header_lines = 1;
 
-       register_block_columns(&bh->block_list, block_fmts);
+       register_block_columns(&bh->block_list, block_fmts,
+                              block_hpps, nr_hpps);
 
-       perf_hpp_list__register_sort_field(&bh->block_list,
-               &block_fmts[PERF_HPP_REPORT__BLOCK_TOTAL_CYCLES_PCT].fmt);
+       /* Sort by the first fmt */
+       perf_hpp_list__register_sort_field(&bh->block_list, &block_fmts[0].fmt);
 }
 
-static void process_block_report(struct hists *hists,
-                                struct block_report *block_report,
-                                u64 total_cycles)
+static int process_block_report(struct hists *hists,
+                               struct block_report *block_report,
+                               u64 total_cycles, int *block_hpps,
+                               int nr_hpps)
 {
        struct rb_node *next = rb_first_cached(&hists->entries);
        struct block_hist *bh = &block_report->hist;
        struct hist_entry *he;
 
-       init_block_hist(bh, block_report->fmts);
+       if (nr_hpps > PERF_HPP_REPORT__BLOCK_MAX_INDEX)
+               return -1;
+
+       block_report->nr_fmts = nr_hpps;
+       init_block_hist(bh, block_report->fmts, block_hpps, nr_hpps);
 
        while (next) {
                he = rb_entry(next, struct hist_entry, rb_node);
                next = rb_next(&he->rb_node);
        }
 
-       for (int i = 0; i < PERF_HPP_REPORT__BLOCK_MAX_INDEX; i++) {
+       for (int i = 0; i < nr_hpps; i++) {
                block_report->fmts[i].total_cycles = total_cycles;
                block_report->fmts[i].block_cycles = block_report->cycles;
        }
 
        hists__output_resort(&bh->block_hists, NULL);
+       return 0;
 }
 
 struct block_report *block_info__create_report(struct evlist *evlist,
-                                              u64 total_cycles)
+                                              u64 total_cycles,
+                                              int *block_hpps, int nr_hpps,
+                                              int *nr_reps)
 {
        struct block_report *block_reports;
        int nr_hists = evlist->core.nr_entries, i = 0;
        evlist__for_each_entry(evlist, pos) {
                struct hists *hists = evsel__hists(pos);
 
-               process_block_report(hists, &block_reports[i], total_cycles);
+               process_block_report(hists, &block_reports[i], total_cycles,
+                                    block_hpps, nr_hpps);
                i++;
        }
 
+       *nr_reps = nr_hists;
        return block_reports;
 }
 
+void block_info__free_report(struct block_report *reps, int nr_reps)
+{
+       for (int i = 0; i < nr_reps; i++)
+               hists__delete_entries(&reps[i].hist.block_hists);
+
+       free(reps);
+}
+
 int report__browse_block_hists(struct block_hist *bh, float min_percent,
                               struct evsel *evsel, struct perf_env *env,
                               struct annotation_options *annotation_opts)
                symbol_conf.report_individual_block = true;
                hists__fprintf(&bh->block_hists, true, 0, 0, min_percent,
                               stdout, true);
-               hists__delete_entries(&bh->block_hists);
                return 0;
        case 1:
                symbol_conf.report_individual_block = true;
                ret = block_hists_tui_browse(bh, evsel, min_percent,
                                             env, annotation_opts);
-               hists__delete_entries(&bh->block_hists);
                return ret;
        default:
                return -1;