From: Brad Peters <bpeters@redhat.com> Date: Fri, 8 Aug 2008 11:03:52 -0400 Subject: [ppc] adds DSCR support in sysfs Message-id: 489C6058.1010405@redhat.com O-Subject: Re: [PATCH RHEL5.3] Adds DSCR support in sysfs (the ability to disable data prefetching) Bugzilla: 439567 RH-Acked-by: David Howells <dhowells@redhat.com> RHBZ#: ====== https://bugzilla.redhat.com/show_bug.cgi?id=439567 Description: =========== New Feature / Power arch only This patch adds DSCR (Debug Status and Control Register) support. This adds the ability to turn off data prefetching from HW. It boosts specJBB by 10.7% on P6. kABI Status: ============ No symbols were harmed. Brew: ===== Built on all platforms. http://brewweb.devel.redhat.com/brew/taskinfo?taskID=1412286 Upstream Status: ================ http://patchwork.ozlabs.org/linuxppc/patch?id=8536 Test Status: ============ Confirmed new controls exist: > pwd /sys/devices/system/cpu [root@ibm-eclipz-nfsserv cpu]# find | grep dscr ./cpu3/dscr ./cpu2/dscr ./cpu1/dscr ./cpu0/dscr Brad Peters 8-1-08 Proposed Patch: =============== This patch is based on 2.6.18-99.el5 diff --git a/arch/powerpc/kernel/sysfs.c b/arch/powerpc/kernel/sysfs.c index 0edb176..86a3b0b 100644 --- a/arch/powerpc/kernel/sysfs.c +++ b/arch/powerpc/kernel/sysfs.c @@ -182,6 +182,7 @@ SYSFS_PMCSETUP(pmc7, SPRN_PMC7); SYSFS_PMCSETUP(pmc8, SPRN_PMC8); SYSFS_PMCSETUP(purr, SPRN_PURR); SYSFS_PMCSETUP(spurr, SPRN_SPURR); +SYSFS_PMCSETUP(dscr, SPRN_DSCR); static SYSDEV_ATTR(mmcr0, 0600, show_mmcr0, store_mmcr0); static SYSDEV_ATTR(mmcr1, 0600, show_mmcr1, store_mmcr1); @@ -196,6 +197,7 @@ static SYSDEV_ATTR(pmc7, 0600, show_pmc7, store_pmc7); static SYSDEV_ATTR(pmc8, 0600, show_pmc8, store_pmc8); static SYSDEV_ATTR(purr, 0600, show_purr, NULL); static SYSDEV_ATTR(spurr, 0600, show_spurr, NULL); +static SYSDEV_ATTR(dscr, 0600, show_dscr, store_dscr); static void register_cpu_online(unsigned int cpu) { @@ -236,6 +238,8 @@ static void register_cpu_online(unsigned int cpu) sysdev_create_file(s, &attr_purr); if (cpu_has_feature(CPU_FTR_SPURR)) sysdev_create_file(s, &attr_spurr); + if (cpu_has_feature(CPU_FTR_DSCR)) + sysdev_create_file(s, &attr_dscr); } #ifdef CONFIG_HOTPLUG_CPU @@ -280,6 +284,8 @@ static void unregister_cpu_online(unsigned int cpu) sysdev_remove_file(s, &attr_purr); if (cpu_has_feature(CPU_FTR_SPURR)) sysdev_remove_file(s, &attr_spurr); + if (cpu_has_feature(CPU_FTR_DSCR)) + sysdev_remove_file(s, &attr_dscr); } #endif /* CONFIG_HOTPLUG_CPU */ diff --git a/include/asm-powerpc/cputable.h b/include/asm-powerpc/cputable.h index ba105f6..d34313c 100644 --- a/include/asm-powerpc/cputable.h +++ b/include/asm-powerpc/cputable.h @@ -151,6 +151,7 @@ extern void do_feature_fixups(unsigned long value, void *fixup_start, #define CPU_FTR_PURR LONG_ASM_CONST(0x0000400000000000) #define CPU_FTR_CELL_TB_BUG LONG_ASM_CONST(0x0000800000000000) #define CPU_FTR_SPURR LONG_ASM_CONST(0x0001000000000000) +#define CPU_FTR_DSCR LONG_ASM_CONST(0x0002000000000000) #ifndef __ASSEMBLY__ @@ -334,7 +335,7 @@ extern void do_feature_fixups(unsigned long value, void *fixup_start, CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | \ CPU_FTR_MMCRA | CPU_FTR_SMT | \ CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \ - CPU_FTR_PURR | CPU_FTR_REAL_LE | CPU_FTR_SPURR) + CPU_FTR_PURR | CPU_FTR_REAL_LE | CPU_FTR_SPURR | CPU_FTR_DSCR) #define CPU_FTRS_CELL (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | \ CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ diff --git a/include/asm-powerpc/reg.h b/include/asm-powerpc/reg.h index bf86471..da93319 100644 --- a/include/asm-powerpc/reg.h +++ b/include/asm-powerpc/reg.h @@ -143,6 +143,7 @@ /* Special Purpose Registers (SPRNs)*/ #define SPRN_CTR 0x009 /* Count Register */ +#define SPRN_DSCR 0x011 /* Data Stream Control Register */ #define SPRN_CTRLF 0x088 #define SPRN_CTRLT 0x098 #define CTRL_CT 0xc0000000 /* current thread */