18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file oprof_start.h
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * The GUI start main class
48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Copyright 2002 OProfile authors
68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Read the file COPYING
78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author Philippe Elie
98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author John Levon
108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#ifndef OPROF_START_H
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define OPROF_START_H
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <vector>
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <map>
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <set>
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "ui/oprof_start.base.h"
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "oprof_start_config.h"
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_events.h"
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass QIntValidator;
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass QListViewItem;
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass QTimerEvent;
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// a struct describing a particular event type
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct op_event_descr {
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	op_event_descr();
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// bit mask of allowed counters
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	uint counter_mask;
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// hardware event number
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	u32 val;
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// unit mask values if applicable
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	op_unit_mask const * unit;
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// name of event
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::string name;
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// description of event
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::string help_str;
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// minimum counter value
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	uint min_count;
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass oprof_start : public oprof_start_base
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	Q_OBJECT
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddpublic:
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	oprof_start();
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprotected slots:
548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// select the kernel image filename
558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void choose_kernel_filename();
568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// flush profiler
578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void on_flush_profiler_data();
588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// start profiler
598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void on_start_profiler();
608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// stop profiler
618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void on_stop_profiler();
628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// events selection change
638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void event_selected();
648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// the mouse is over an event
658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void event_over(QListViewItem *);
668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// state of separate_kernel_cb changed
678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void on_separate_kernel_cb_changed(int);
688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// reset sample files
698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void on_reset_sample_files();
708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// close the dialog
728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void accept();
738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// WM hide event
758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void closeEvent(QCloseEvent * e);
768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// timer event
788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void timerEvent(QTimerEvent * e);
798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprivate:
818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// the counter combo has been activated
828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void fill_events_listbox();
838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// fill the event details and gui setup
858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void fill_events();
868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// find an event description by name
888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	op_event_descr const & locate_event(std::string const & name) const;
898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// update config on user change
918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void record_selected_event_config();
928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// update config and validate
938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool record_config();
948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// calculate unit mask for given event and unit mask part
968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void get_unit_mask_part(op_event_descr const & descr, uint num, bool selected, uint & mask);
978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// calculate unit mask for given event
988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	uint get_unit_mask(op_event_descr const & descr);
998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// set the unit mask widgets for given event
1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void setup_unit_masks(op_event_descr const & descr);
1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return the maximum perf counter value for the current cpu type
1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	uint max_perf_count() const;
1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// show an event's settings
1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void display_event(op_event_descr const & descrp);
1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// hide unit mask widgets
1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void hide_masks(void);
1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// read the events set in daemonrc
1128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void read_set_events();
1138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// use the default event
1148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void setup_default_event();
1158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// load the extra config file
1168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void load_config_file();
1178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// save the config
1188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool save_config();
1198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// redraw the event list by changing icon status
1218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void draw_event_list();
1228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return true if item is selectable or already selected
1248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool is_selectable_event(QListViewItem * item);
1258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// try to alloc counters for the selected_events
1278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool alloc_selected_events() const;
1288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// validator for event count
1308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	QIntValidator* event_count_validator;
1318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// all available events for this hardware
1338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::vector<op_event_descr> v_events;
1348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// current event configs for each counter
1368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	typedef std::map<std::string, event_setting> event_setting_map;
1378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	event_setting_map event_cfgs;
1388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// The currently selected events. We must track this because
1408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// with multiple selection listbox QT doesn't allow to know
1418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// what is the last selected item. events_selected() update it
1428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::set<QListViewItem *> selected_events;
1438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	QListViewItem * current_event;
1448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// current config
1468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	config_setting config;
1478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// the expansion of "~" directory
1498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::string user_dir;
1508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// CPU type
1528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	op_cpu cpu_type;
1538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// CPU speed in MHz
1558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	double cpu_speed;
1568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// total number of available HW counters
1588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	uint op_nr_counters;
1598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// Total number of samples for this run
1618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	unsigned long total_nr_interrupts;
1628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
1638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif // OPROF_START_H
165