* [PATCH 0/7] oprofile, x86: updates for AMD family 12h and 14h systems
@ 2010-10-08 13:56 Robert Richter
2010-10-08 13:56 ` [PATCH 1/7] oprofile, x86: Add support for AMD family 12h Robert Richter
` (7 more replies)
0 siblings, 8 replies; 9+ messages in thread
From: Robert Richter @ 2010-10-08 13:56 UTC (permalink / raw)
To: Ingo Molnar; +Cc: LKML, oprofile-list, Suravee Suthikulpanit
This patch set adds support for AMD family 12h and 14h systems. Main
part here is the support of new IBS features (branch target address
reporting and periodic op counter extension).
Please review. If the patches are fine I will apply them to the
oprofile git repostitory on kernel.org. They depend on the APIC
patches I send out earlier.
Suravee will send updates to the oprofile userland soon.
Thanks,
-Robert
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/7] oprofile, x86: Add support for AMD family 12h
2010-10-08 13:56 [PATCH 0/7] oprofile, x86: updates for AMD family 12h and 14h systems Robert Richter
@ 2010-10-08 13:56 ` Robert Richter
2010-10-08 13:56 ` [PATCH 2/7] oprofile, x86: Add support for AMD family 14h Robert Richter
` (6 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Robert Richter @ 2010-10-08 13:56 UTC (permalink / raw)
To: Ingo Molnar; +Cc: LKML, oprofile-list, Suravee Suthikulpanit, Robert Richter
This patch adds support for AMD family 12h (Llano) cpus.
Signed-off-by: Robert Richter <robert.richter@amd.com>
---
arch/x86/oprofile/nmi_int.c | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c
index bd1489c..0b0d1d6 100644
--- a/arch/x86/oprofile/nmi_int.c
+++ b/arch/x86/oprofile/nmi_int.c
@@ -726,6 +726,9 @@ int __init op_nmi_init(struct oprofile_operations *ops)
case 0x11:
cpu_type = "x86-64/family11h";
break;
+ case 0x12:
+ cpu_type = "x86-64/family12h";
+ break;
default:
return -ENODEV;
}
--
1.7.2.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/7] oprofile, x86: Add support for AMD family 14h
2010-10-08 13:56 [PATCH 0/7] oprofile, x86: updates for AMD family 12h and 14h systems Robert Richter
2010-10-08 13:56 ` [PATCH 1/7] oprofile, x86: Add support for AMD family 12h Robert Richter
@ 2010-10-08 13:56 ` Robert Richter
2010-10-08 13:56 ` [PATCH 3/7] oprofile, x86: Check IBS capability bits 1 and 2 Robert Richter
` (5 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Robert Richter @ 2010-10-08 13:56 UTC (permalink / raw)
To: Ingo Molnar; +Cc: LKML, oprofile-list, Suravee Suthikulpanit, Robert Richter
This patch adds support for AMD family 14h (Ontario/Zacate) cpus.
Signed-off-by: Robert Richter <robert.richter@amd.com>
---
arch/x86/oprofile/nmi_int.c | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c
index 0b0d1d6..4e8baad 100644
--- a/arch/x86/oprofile/nmi_int.c
+++ b/arch/x86/oprofile/nmi_int.c
@@ -729,6 +729,9 @@ int __init op_nmi_init(struct oprofile_operations *ops)
case 0x12:
cpu_type = "x86-64/family12h";
break;
+ case 0x14:
+ cpu_type = "x86-64/family14h";
+ break;
default:
return -ENODEV;
}
--
1.7.2.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/7] oprofile, x86: Check IBS capability bits 1 and 2
2010-10-08 13:56 [PATCH 0/7] oprofile, x86: updates for AMD family 12h and 14h systems Robert Richter
2010-10-08 13:56 ` [PATCH 1/7] oprofile, x86: Add support for AMD family 12h Robert Richter
2010-10-08 13:56 ` [PATCH 2/7] oprofile, x86: Add support for AMD family 14h Robert Richter
@ 2010-10-08 13:56 ` Robert Richter
2010-10-08 13:56 ` [PATCH 4/7] oprofile, x86: Remove duplicate check for IBS_CAPS_OPCNT Robert Richter
` (4 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Robert Richter @ 2010-10-08 13:56 UTC (permalink / raw)
To: Ingo Molnar; +Cc: LKML, oprofile-list, Suravee Suthikulpanit, Robert Richter
There are IBS CPUID feature flags in CPUID Fn8000_001B to detect if
the cpu supports IBS fetch sampling (FetchSam) and/or IBS execution
sampling (OpSam). This patch adds checks if the both features are
available.
Spec:
http://support.amd.com/us/Processor_TechDocs/31116.pdf
Signed-off-by: Robert Richter <robert.richter@amd.com>
---
arch/x86/oprofile/op_model_amd.c | 59 ++++++++++++++++++++++++-------------
1 files changed, 38 insertions(+), 21 deletions(-)
diff --git a/arch/x86/oprofile/op_model_amd.c b/arch/x86/oprofile/op_model_amd.c
index b67a6b5..96852d5 100644
--- a/arch/x86/oprofile/op_model_amd.c
+++ b/arch/x86/oprofile/op_model_amd.c
@@ -70,9 +70,22 @@ static u64 ibs_op_ctl;
* Same bit mask as for IBS cpuid feature flags (Fn8000_001B_EAX), but
* bit 0 is used to indicate the existence of IBS.
*/
-#define IBS_CAPS_AVAIL (1LL<<0)
-#define IBS_CAPS_RDWROPCNT (1LL<<3)
-#define IBS_CAPS_OPCNT (1LL<<4)
+#define IBS_CAPS_AVAIL (1U<<0)
+#define IBS_CAPS_FETCHSAM (1U<<1)
+#define IBS_CAPS_OPSAM (1U<<2)
+#define IBS_CAPS_RDWROPCNT (1U<<3)
+#define IBS_CAPS_OPCNT (1U<<4)
+
+#define IBS_CAPS_DEFAULT (IBS_CAPS_AVAIL \
+ | IBS_CAPS_FETCHSAM \
+ | IBS_CAPS_OPSAM)
+
+/*
+ * IBS APIC setup
+ */
+#define IBSCTL 0x1cc
+#define IBSCTL_LVT_OFFSET_VALID (1ULL<<8)
+#define IBSCTL_LVT_OFFSET_MASK 0x0F
/*
* IBS randomization macros
@@ -92,12 +105,12 @@ static u32 get_ibs_caps(void)
/* check IBS cpuid feature flags */
max_level = cpuid_eax(0x80000000);
if (max_level < IBS_CPUID_FEATURES)
- return IBS_CAPS_AVAIL;
+ return IBS_CAPS_DEFAULT;
ibs_caps = cpuid_eax(IBS_CPUID_FEATURES);
if (!(ibs_caps & IBS_CAPS_AVAIL))
/* cpuid flags not valid */
- return IBS_CAPS_AVAIL;
+ return IBS_CAPS_DEFAULT;
return ibs_caps;
}
@@ -527,22 +540,26 @@ static int setup_ibs_files(struct super_block *sb, struct dentry *root)
ibs_config.op_enabled = 0;
ibs_config.dispatched_ops = 0;
- dir = oprofilefs_mkdir(sb, root, "ibs_fetch");
- oprofilefs_create_ulong(sb, dir, "enable",
- &ibs_config.fetch_enabled);
- oprofilefs_create_ulong(sb, dir, "max_count",
- &ibs_config.max_cnt_fetch);
- oprofilefs_create_ulong(sb, dir, "rand_enable",
- &ibs_config.rand_en);
-
- dir = oprofilefs_mkdir(sb, root, "ibs_op");
- oprofilefs_create_ulong(sb, dir, "enable",
- &ibs_config.op_enabled);
- oprofilefs_create_ulong(sb, dir, "max_count",
- &ibs_config.max_cnt_op);
- if (ibs_caps & IBS_CAPS_OPCNT)
- oprofilefs_create_ulong(sb, dir, "dispatched_ops",
- &ibs_config.dispatched_ops);
+ if (ibs_caps & IBS_CAPS_FETCHSAM) {
+ dir = oprofilefs_mkdir(sb, root, "ibs_fetch");
+ oprofilefs_create_ulong(sb, dir, "enable",
+ &ibs_config.fetch_enabled);
+ oprofilefs_create_ulong(sb, dir, "max_count",
+ &ibs_config.max_cnt_fetch);
+ oprofilefs_create_ulong(sb, dir, "rand_enable",
+ &ibs_config.rand_en);
+ }
+
+ if (ibs_caps & IBS_CAPS_OPSAM) {
+ dir = oprofilefs_mkdir(sb, root, "ibs_op");
+ oprofilefs_create_ulong(sb, dir, "enable",
+ &ibs_config.op_enabled);
+ oprofilefs_create_ulong(sb, dir, "max_count",
+ &ibs_config.max_cnt_op);
+ if (ibs_caps & IBS_CAPS_OPCNT)
+ oprofilefs_create_ulong(sb, dir, "dispatched_ops",
+ &ibs_config.dispatched_ops);
+ }
return 0;
}
--
1.7.2.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 4/7] oprofile, x86: Remove duplicate check for IBS_CAPS_OPCNT
2010-10-08 13:56 [PATCH 0/7] oprofile, x86: updates for AMD family 12h and 14h systems Robert Richter
` (2 preceding siblings ...)
2010-10-08 13:56 ` [PATCH 3/7] oprofile, x86: Check IBS capability bits 1 and 2 Robert Richter
@ 2010-10-08 13:56 ` Robert Richter
2010-10-08 13:56 ` [PATCH 5/7] oprofile, x86: Introduce struct ibs_state Robert Richter
` (3 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Robert Richter @ 2010-10-08 13:56 UTC (permalink / raw)
To: Ingo Molnar; +Cc: LKML, oprofile-list, Suravee Suthikulpanit, Robert Richter
Since oprofile is setting up ibs_op/dispatched_ops in the fs only if
the feature is available, its corresponding variable
ibs_config.dispatched_ops is only set, if the feature is
available. Thus the check is duplicate and can be removed.
Signed-off-by: Robert Richter <robert.richter@amd.com>
---
arch/x86/oprofile/op_model_amd.c | 3 +--
1 files changed, 1 insertions(+), 2 deletions(-)
diff --git a/arch/x86/oprofile/op_model_amd.c b/arch/x86/oprofile/op_model_amd.c
index 96852d5..d5e9dab 100644
--- a/arch/x86/oprofile/op_model_amd.c
+++ b/arch/x86/oprofile/op_model_amd.c
@@ -257,8 +257,7 @@ static inline void op_amd_start_ibs(void)
ibs_op_ctl = min(ibs_op_ctl + IBS_RANDOM_MAXCNT_OFFSET,
IBS_OP_MAX_CNT);
}
- if (ibs_caps & IBS_CAPS_OPCNT && ibs_config.dispatched_ops)
- ibs_op_ctl |= IBS_OP_CNT_CTL;
+ ibs_op_ctl |= ibs_config.dispatched_ops ? IBS_OP_CNT_CTL : 0;
ibs_op_ctl |= IBS_OP_ENABLE;
val = op_amd_randomize_ibs_op(ibs_op_ctl);
wrmsrl(MSR_AMD64_IBSOPCTL, val);
--
1.7.2.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 5/7] oprofile, x86: Introduce struct ibs_state
2010-10-08 13:56 [PATCH 0/7] oprofile, x86: updates for AMD family 12h and 14h systems Robert Richter
` (3 preceding siblings ...)
2010-10-08 13:56 ` [PATCH 4/7] oprofile, x86: Remove duplicate check for IBS_CAPS_OPCNT Robert Richter
@ 2010-10-08 13:56 ` Robert Richter
2010-10-08 13:56 ` [PATCH 6/7] oprofile, x86: Add support for IBS branch target address reporting Robert Richter
` (2 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Robert Richter @ 2010-10-08 13:56 UTC (permalink / raw)
To: Ingo Molnar; +Cc: LKML, oprofile-list, Suravee Suthikulpanit, Robert Richter
This patch introduces struct ibs_state that will extended by additinal
members in follow-on patches.
Signed-off-by: Robert Richter <robert.richter@amd.com>
---
arch/x86/oprofile/op_model_amd.c | 29 ++++++++++++++++++-----------
1 files changed, 18 insertions(+), 11 deletions(-)
diff --git a/arch/x86/oprofile/op_model_amd.c b/arch/x86/oprofile/op_model_amd.c
index d5e9dab..9d45097 100644
--- a/arch/x86/oprofile/op_model_amd.c
+++ b/arch/x86/oprofile/op_model_amd.c
@@ -48,7 +48,7 @@ static unsigned long reset_value[NUM_VIRT_COUNTERS];
static u32 ibs_caps;
-struct op_ibs_config {
+struct ibs_config {
unsigned long op_enabled;
unsigned long fetch_enabled;
unsigned long max_cnt_fetch;
@@ -57,8 +57,12 @@ struct op_ibs_config {
unsigned long dispatched_ops;
};
-static struct op_ibs_config ibs_config;
-static u64 ibs_op_ctl;
+struct ibs_state {
+ u64 ibs_op_ctl;
+};
+
+static struct ibs_config ibs_config;
+static struct ibs_state ibs_state;
/*
* IBS cpuid feature detection
@@ -219,7 +223,7 @@ op_amd_handle_ibs(struct pt_regs * const regs,
oprofile_write_commit(&entry);
/* reenable the IRQ */
- ctl = op_amd_randomize_ibs_op(ibs_op_ctl);
+ ctl = op_amd_randomize_ibs_op(ibs_state.ibs_op_ctl);
wrmsrl(MSR_AMD64_IBSOPCTL, ctl);
}
}
@@ -232,6 +236,8 @@ static inline void op_amd_start_ibs(void)
if (!ibs_caps)
return;
+ memset(&ibs_state, 0, sizeof(ibs_state));
+
if (ibs_config.fetch_enabled) {
val = (ibs_config.max_cnt_fetch >> 4) & IBS_FETCH_MAX_CNT;
val |= ibs_config.rand_en ? IBS_FETCH_RAND_EN : 0;
@@ -240,13 +246,13 @@ static inline void op_amd_start_ibs(void)
}
if (ibs_config.op_enabled) {
- ibs_op_ctl = ibs_config.max_cnt_op >> 4;
+ val = ibs_config.max_cnt_op >> 4;
if (!(ibs_caps & IBS_CAPS_RDWROPCNT)) {
/*
* IbsOpCurCnt not supported. See
* op_amd_randomize_ibs_op() for details.
*/
- ibs_op_ctl = clamp(ibs_op_ctl, 0x0081ULL, 0xFF80ULL);
+ val = clamp(val, 0x0081ULL, 0xFF80ULL);
} else {
/*
* The start value is randomized with a
@@ -254,12 +260,13 @@ static inline void op_amd_start_ibs(void)
* with the half of the randomized range. Also
* avoid underflows.
*/
- ibs_op_ctl = min(ibs_op_ctl + IBS_RANDOM_MAXCNT_OFFSET,
- IBS_OP_MAX_CNT);
+ val = min(val + IBS_RANDOM_MAXCNT_OFFSET,
+ IBS_OP_MAX_CNT);
}
- ibs_op_ctl |= ibs_config.dispatched_ops ? IBS_OP_CNT_CTL : 0;
- ibs_op_ctl |= IBS_OP_ENABLE;
- val = op_amd_randomize_ibs_op(ibs_op_ctl);
+ val |= ibs_config.dispatched_ops ? IBS_OP_CNT_CTL : 0;
+ val |= IBS_OP_ENABLE;
+ ibs_state.ibs_op_ctl = val;
+ val = op_amd_randomize_ibs_op(ibs_state.ibs_op_ctl);
wrmsrl(MSR_AMD64_IBSOPCTL, val);
}
}
--
1.7.2.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 6/7] oprofile, x86: Add support for IBS branch target address reporting
2010-10-08 13:56 [PATCH 0/7] oprofile, x86: updates for AMD family 12h and 14h systems Robert Richter
` (4 preceding siblings ...)
2010-10-08 13:56 ` [PATCH 5/7] oprofile, x86: Introduce struct ibs_state Robert Richter
@ 2010-10-08 13:56 ` Robert Richter
2010-10-08 13:56 ` [PATCH 7/7] oprofile, x86: Add support for IBS periodic op counter extension Robert Richter
2010-10-15 13:55 ` [PATCH 0/7] oprofile, x86: updates for AMD family 12h and 14h systems Robert Richter
7 siblings, 0 replies; 9+ messages in thread
From: Robert Richter @ 2010-10-08 13:56 UTC (permalink / raw)
To: Ingo Molnar; +Cc: LKML, oprofile-list, Suravee Suthikulpanit, Robert Richter
This patch adds support for IBS branch target address reporting. A new
MSR (MSRC001_103B IBS Branch Target Address) has been added that
provides the logical address in canonical form for the branch
target. The size of the IBS sample that is transferred to the userland
has been increased.
For backward compatibility, the userland daemon must explicit enable
the feature by writing to the oprofilefs file
ibs_op/branch_target
After enabling branch target address reporting, the userland daemon
must handle the extended size of the IBS sample.
Signed-off-by: Robert Richter <robert.richter@amd.com>
---
arch/x86/include/asm/msr-index.h | 1 +
arch/x86/oprofile/op_model_amd.c | 26 ++++++++++++++++++++------
2 files changed, 21 insertions(+), 6 deletions(-)
diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h
index 986f779..91ba8e6 100644
--- a/arch/x86/include/asm/msr-index.h
+++ b/arch/x86/include/asm/msr-index.h
@@ -121,6 +121,7 @@
#define MSR_AMD64_IBSDCLINAD 0xc0011038
#define MSR_AMD64_IBSDCPHYSAD 0xc0011039
#define MSR_AMD64_IBSCTL 0xc001103a
+#define MSR_AMD64_IBSBRTARGET 0xc001103b
/* Fam 10h MSRs */
#define MSR_FAM10H_MMIO_CONF_BASE 0xc0010058
diff --git a/arch/x86/oprofile/op_model_amd.c b/arch/x86/oprofile/op_model_amd.c
index 9d45097..9de33fa 100644
--- a/arch/x86/oprofile/op_model_amd.c
+++ b/arch/x86/oprofile/op_model_amd.c
@@ -55,10 +55,13 @@ struct ibs_config {
unsigned long max_cnt_op;
unsigned long rand_en;
unsigned long dispatched_ops;
+ unsigned long branch_target;
};
struct ibs_state {
- u64 ibs_op_ctl;
+ u64 ibs_op_ctl;
+ int branch_target;
+ unsigned long sample_size;
};
static struct ibs_config ibs_config;
@@ -79,6 +82,7 @@ static struct ibs_state ibs_state;
#define IBS_CAPS_OPSAM (1U<<2)
#define IBS_CAPS_RDWROPCNT (1U<<3)
#define IBS_CAPS_OPCNT (1U<<4)
+#define IBS_CAPS_BRNTRGT (1U<<5)
#define IBS_CAPS_DEFAULT (IBS_CAPS_AVAIL \
| IBS_CAPS_FETCHSAM \
@@ -207,8 +211,8 @@ op_amd_handle_ibs(struct pt_regs * const regs,
rdmsrl(MSR_AMD64_IBSOPCTL, ctl);
if (ctl & IBS_OP_VAL) {
rdmsrl(MSR_AMD64_IBSOPRIP, val);
- oprofile_write_reserve(&entry, regs, val,
- IBS_OP_CODE, IBS_OP_SIZE);
+ oprofile_write_reserve(&entry, regs, val, IBS_OP_CODE,
+ ibs_state.sample_size);
oprofile_add_data64(&entry, val);
rdmsrl(MSR_AMD64_IBSOPDATA, val);
oprofile_add_data64(&entry, val);
@@ -220,6 +224,10 @@ op_amd_handle_ibs(struct pt_regs * const regs,
oprofile_add_data64(&entry, val);
rdmsrl(MSR_AMD64_IBSDCPHYSAD, val);
oprofile_add_data64(&entry, val);
+ if (ibs_state.branch_target) {
+ rdmsrl(MSR_AMD64_IBSBRTARGET, val);
+ oprofile_add_data(&entry, (unsigned long)val);
+ }
oprofile_write_commit(&entry);
/* reenable the IRQ */
@@ -266,6 +274,11 @@ static inline void op_amd_start_ibs(void)
val |= ibs_config.dispatched_ops ? IBS_OP_CNT_CTL : 0;
val |= IBS_OP_ENABLE;
ibs_state.ibs_op_ctl = val;
+ ibs_state.sample_size = IBS_OP_SIZE;
+ if (ibs_config.branch_target) {
+ ibs_state.branch_target = 1;
+ ibs_state.sample_size++;
+ }
val = op_amd_randomize_ibs_op(ibs_state.ibs_op_ctl);
wrmsrl(MSR_AMD64_IBSOPCTL, val);
}
@@ -540,11 +553,9 @@ static int setup_ibs_files(struct super_block *sb, struct dentry *root)
/* model specific files */
/* setup some reasonable defaults */
+ memset(&ibs_config, 0, sizeof(ibs_config));
ibs_config.max_cnt_fetch = 250000;
- ibs_config.fetch_enabled = 0;
ibs_config.max_cnt_op = 250000;
- ibs_config.op_enabled = 0;
- ibs_config.dispatched_ops = 0;
if (ibs_caps & IBS_CAPS_FETCHSAM) {
dir = oprofilefs_mkdir(sb, root, "ibs_fetch");
@@ -565,6 +576,9 @@ static int setup_ibs_files(struct super_block *sb, struct dentry *root)
if (ibs_caps & IBS_CAPS_OPCNT)
oprofilefs_create_ulong(sb, dir, "dispatched_ops",
&ibs_config.dispatched_ops);
+ if (ibs_caps & IBS_CAPS_BRNTRGT)
+ oprofilefs_create_ulong(sb, dir, "branch_target",
+ &ibs_config.branch_target);
}
return 0;
--
1.7.2.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 7/7] oprofile, x86: Add support for IBS periodic op counter extension
2010-10-08 13:56 [PATCH 0/7] oprofile, x86: updates for AMD family 12h and 14h systems Robert Richter
` (5 preceding siblings ...)
2010-10-08 13:56 ` [PATCH 6/7] oprofile, x86: Add support for IBS branch target address reporting Robert Richter
@ 2010-10-08 13:56 ` Robert Richter
2010-10-15 13:55 ` [PATCH 0/7] oprofile, x86: updates for AMD family 12h and 14h systems Robert Richter
7 siblings, 0 replies; 9+ messages in thread
From: Robert Richter @ 2010-10-08 13:56 UTC (permalink / raw)
To: Ingo Molnar; +Cc: LKML, oprofile-list, Suravee Suthikulpanit, Robert Richter
The count value for IBS op sampling has been extended by 7 bits. The
feature is reflected in bit 6 (OpCntExt) of the IBS capability
register (CPUID Fn8000_001B_EAX).
Signed-off-by: Robert Richter <robert.richter@amd.com>
---
arch/x86/include/asm/perf_event.h | 19 ++++++++++---------
arch/x86/oprofile/op_model_amd.c | 22 +++++++++++++++++++---
2 files changed, 29 insertions(+), 12 deletions(-)
diff --git a/arch/x86/include/asm/perf_event.h b/arch/x86/include/asm/perf_event.h
index 6e742cc..550e26b 100644
--- a/arch/x86/include/asm/perf_event.h
+++ b/arch/x86/include/asm/perf_event.h
@@ -111,17 +111,18 @@ union cpuid10_edx {
#define X86_PMC_IDX_FIXED_BTS (X86_PMC_IDX_FIXED + 16)
/* IbsFetchCtl bits/masks */
-#define IBS_FETCH_RAND_EN (1ULL<<57)
-#define IBS_FETCH_VAL (1ULL<<49)
-#define IBS_FETCH_ENABLE (1ULL<<48)
-#define IBS_FETCH_CNT 0xFFFF0000ULL
-#define IBS_FETCH_MAX_CNT 0x0000FFFFULL
+#define IBS_FETCH_RAND_EN (1ULL<<57)
+#define IBS_FETCH_VAL (1ULL<<49)
+#define IBS_FETCH_ENABLE (1ULL<<48)
+#define IBS_FETCH_CNT 0xFFFF0000ULL
+#define IBS_FETCH_MAX_CNT 0x0000FFFFULL
/* IbsOpCtl bits */
-#define IBS_OP_CNT_CTL (1ULL<<19)
-#define IBS_OP_VAL (1ULL<<18)
-#define IBS_OP_ENABLE (1ULL<<17)
-#define IBS_OP_MAX_CNT 0x0000FFFFULL
+#define IBS_OP_CNT_CTL (1ULL<<19)
+#define IBS_OP_VAL (1ULL<<18)
+#define IBS_OP_ENABLE (1ULL<<17)
+#define IBS_OP_MAX_CNT 0x0000FFFFULL
+#define IBS_OP_MAX_CNT_EXT 0x007FFFFFULL /* not a register bit mask */
#ifdef CONFIG_PERF_EVENTS
extern void init_hw_perf_events(void);
diff --git a/arch/x86/oprofile/op_model_amd.c b/arch/x86/oprofile/op_model_amd.c
index 9de33fa..65f0a1e 100644
--- a/arch/x86/oprofile/op_model_amd.c
+++ b/arch/x86/oprofile/op_model_amd.c
@@ -83,6 +83,7 @@ static struct ibs_state ibs_state;
#define IBS_CAPS_RDWROPCNT (1U<<3)
#define IBS_CAPS_OPCNT (1U<<4)
#define IBS_CAPS_BRNTRGT (1U<<5)
+#define IBS_CAPS_OPCNTEXT (1U<<6)
#define IBS_CAPS_DEFAULT (IBS_CAPS_AVAIL \
| IBS_CAPS_FETCHSAM \
@@ -246,8 +247,16 @@ static inline void op_amd_start_ibs(void)
memset(&ibs_state, 0, sizeof(ibs_state));
+ /*
+ * Note: Since the max count settings may out of range we
+ * write back the actual used values so that userland can read
+ * it.
+ */
+
if (ibs_config.fetch_enabled) {
- val = (ibs_config.max_cnt_fetch >> 4) & IBS_FETCH_MAX_CNT;
+ val = ibs_config.max_cnt_fetch >> 4;
+ val = min(val, IBS_FETCH_MAX_CNT);
+ ibs_config.max_cnt_fetch = val << 4;
val |= ibs_config.rand_en ? IBS_FETCH_RAND_EN : 0;
val |= IBS_FETCH_ENABLE;
wrmsrl(MSR_AMD64_IBSFETCHCTL, val);
@@ -261,6 +270,7 @@ static inline void op_amd_start_ibs(void)
* op_amd_randomize_ibs_op() for details.
*/
val = clamp(val, 0x0081ULL, 0xFF80ULL);
+ ibs_config.max_cnt_op = val << 4;
} else {
/*
* The start value is randomized with a
@@ -268,9 +278,15 @@ static inline void op_amd_start_ibs(void)
* with the half of the randomized range. Also
* avoid underflows.
*/
- val = min(val + IBS_RANDOM_MAXCNT_OFFSET,
- IBS_OP_MAX_CNT);
+ val += IBS_RANDOM_MAXCNT_OFFSET;
+ if (ibs_caps & IBS_CAPS_OPCNTEXT)
+ val = min(val, IBS_OP_MAX_CNT_EXT);
+ else
+ val = min(val, IBS_OP_MAX_CNT);
+ ibs_config.max_cnt_op =
+ (val - IBS_RANDOM_MAXCNT_OFFSET) << 4;
}
+ val = ((val & ~IBS_OP_MAX_CNT) << 4) | (val & IBS_OP_MAX_CNT);
val |= ibs_config.dispatched_ops ? IBS_OP_CNT_CTL : 0;
val |= IBS_OP_ENABLE;
ibs_state.ibs_op_ctl = val;
--
1.7.2.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 0/7] oprofile, x86: updates for AMD family 12h and 14h systems
2010-10-08 13:56 [PATCH 0/7] oprofile, x86: updates for AMD family 12h and 14h systems Robert Richter
` (6 preceding siblings ...)
2010-10-08 13:56 ` [PATCH 7/7] oprofile, x86: Add support for IBS periodic op counter extension Robert Richter
@ 2010-10-15 13:55 ` Robert Richter
7 siblings, 0 replies; 9+ messages in thread
From: Robert Richter @ 2010-10-15 13:55 UTC (permalink / raw)
To: Ingo Molnar; +Cc: Suravee Suthikulpanit, LKML, oprofile-list
On 08.10.10 15:56:25, Robert Richter wrote:
> This patch set adds support for AMD family 12h and 14h systems. Main
> part here is the support of new IBS features (branch target address
> reporting and periodic op counter extension).
>
> Please review. If the patches are fine I will apply them to the
> oprofile git repostitory on kernel.org. They depend on the APIC
> patches I send out earlier.
>
> Suravee will send updates to the oprofile userland soon.
I applied the patches to the oprofile/x86 branch.
-Robert
--
Advanced Micro Devices, Inc.
Operating System Research Center
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2010-10-15 13:55 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-10-08 13:56 [PATCH 0/7] oprofile, x86: updates for AMD family 12h and 14h systems Robert Richter
2010-10-08 13:56 ` [PATCH 1/7] oprofile, x86: Add support for AMD family 12h Robert Richter
2010-10-08 13:56 ` [PATCH 2/7] oprofile, x86: Add support for AMD family 14h Robert Richter
2010-10-08 13:56 ` [PATCH 3/7] oprofile, x86: Check IBS capability bits 1 and 2 Robert Richter
2010-10-08 13:56 ` [PATCH 4/7] oprofile, x86: Remove duplicate check for IBS_CAPS_OPCNT Robert Richter
2010-10-08 13:56 ` [PATCH 5/7] oprofile, x86: Introduce struct ibs_state Robert Richter
2010-10-08 13:56 ` [PATCH 6/7] oprofile, x86: Add support for IBS branch target address reporting Robert Richter
2010-10-08 13:56 ` [PATCH 7/7] oprofile, x86: Add support for IBS periodic op counter extension Robert Richter
2010-10-15 13:55 ` [PATCH 0/7] oprofile, x86: updates for AMD family 12h and 14h systems Robert Richter
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).