diff options
227 files changed, 4250 insertions, 1839 deletions
diff --git a/Documentation/arm/memory.txt b/Documentation/arm/memory.txt index 43cb1004d35f..9d58c7c5eddd 100644 --- a/Documentation/arm/memory.txt +++ b/Documentation/arm/memory.txt | |||
| @@ -21,6 +21,8 @@ ffff8000 ffffffff copy_user_page / clear_user_page use. | |||
| 21 | For SA11xx and Xscale, this is used to | 21 | For SA11xx and Xscale, this is used to |
| 22 | setup a minicache mapping. | 22 | setup a minicache mapping. |
| 23 | 23 | ||
| 24 | ffff4000 ffffffff cache aliasing on ARMv6 and later CPUs. | ||
| 25 | |||
| 24 | ffff1000 ffff7fff Reserved. | 26 | ffff1000 ffff7fff Reserved. |
| 25 | Platforms must not use this address range. | 27 | Platforms must not use this address range. |
| 26 | 28 | ||
diff --git a/Documentation/ioctl/ioctl-number.txt b/Documentation/ioctl/ioctl-number.txt index 7bb0d934b6d8..dbea4f95fc85 100644 --- a/Documentation/ioctl/ioctl-number.txt +++ b/Documentation/ioctl/ioctl-number.txt | |||
| @@ -139,6 +139,7 @@ Code Seq# Include File Comments | |||
| 139 | 'm' all linux/synclink.h conflict! | 139 | 'm' all linux/synclink.h conflict! |
| 140 | 'm' 00-1F net/irda/irmod.h conflict! | 140 | 'm' 00-1F net/irda/irmod.h conflict! |
| 141 | 'n' 00-7F linux/ncp_fs.h | 141 | 'n' 00-7F linux/ncp_fs.h |
| 142 | 'n' 80-8F linux/nilfs2_fs.h NILFS2 | ||
| 142 | 'n' E0-FF video/matrox.h matroxfb | 143 | 'n' E0-FF video/matrox.h matroxfb |
| 143 | 'o' 00-1F fs/ocfs2/ocfs2_fs.h OCFS2 | 144 | 'o' 00-1F fs/ocfs2/ocfs2_fs.h OCFS2 |
| 144 | 'o' 00-03 include/mtd/ubi-user.h conflict! (OCFS2 and UBI overlaps) | 145 | 'o' 00-03 include/mtd/ubi-user.h conflict! (OCFS2 and UBI overlaps) |
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index dd1a6d4bb747..7936b801fe6a 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
| @@ -1115,6 +1115,10 @@ and is between 256 and 4096 characters. It is defined in the file | |||
| 1115 | libata.dma=4 Compact Flash DMA only | 1115 | libata.dma=4 Compact Flash DMA only |
| 1116 | Combinations also work, so libata.dma=3 enables DMA | 1116 | Combinations also work, so libata.dma=3 enables DMA |
| 1117 | for disks and CDROMs, but not CFs. | 1117 | for disks and CDROMs, but not CFs. |
| 1118 | |||
| 1119 | libata.ignore_hpa= [LIBATA] Ignore HPA limit | ||
| 1120 | libata.ignore_hpa=0 keep BIOS limits (default) | ||
| 1121 | libata.ignore_hpa=1 ignore limits, using full disk | ||
| 1118 | 1122 | ||
| 1119 | libata.noacpi [LIBATA] Disables use of ACPI in libata suspend/resume | 1123 | libata.noacpi [LIBATA] Disables use of ACPI in libata suspend/resume |
| 1120 | when set. | 1124 | when set. |
diff --git a/Documentation/lockdep-design.txt b/Documentation/lockdep-design.txt index e20d913d5914..abf768c681e2 100644 --- a/Documentation/lockdep-design.txt +++ b/Documentation/lockdep-design.txt | |||
| @@ -30,9 +30,9 @@ State | |||
| 30 | The validator tracks lock-class usage history into 4n + 1 separate state bits: | 30 | The validator tracks lock-class usage history into 4n + 1 separate state bits: |
| 31 | 31 | ||
| 32 | - 'ever held in STATE context' | 32 | - 'ever held in STATE context' |
| 33 | - 'ever head as readlock in STATE context' | 33 | - 'ever held as readlock in STATE context' |
| 34 | - 'ever head with STATE enabled' | 34 | - 'ever held with STATE enabled' |
| 35 | - 'ever head as readlock with STATE enabled' | 35 | - 'ever held as readlock with STATE enabled' |
| 36 | 36 | ||
| 37 | Where STATE can be either one of (kernel/lockdep_states.h) | 37 | Where STATE can be either one of (kernel/lockdep_states.h) |
| 38 | - hardirq | 38 | - hardirq |
diff --git a/arch/arm/boot/compressed/misc.c b/arch/arm/boot/compressed/misc.c index 9e6e512f0117..17153b54613b 100644 --- a/arch/arm/boot/compressed/misc.c +++ b/arch/arm/boot/compressed/misc.c | |||
| @@ -29,7 +29,6 @@ unsigned int __machine_arch_type; | |||
| 29 | 29 | ||
| 30 | static void putstr(const char *ptr); | 30 | static void putstr(const char *ptr); |
| 31 | 31 | ||
| 32 | #include <linux/compiler.h> | ||
| 33 | #include <mach/uncompress.h> | 32 | #include <mach/uncompress.h> |
| 34 | 33 | ||
| 35 | #ifdef CONFIG_DEBUG_ICEDCC | 34 | #ifdef CONFIG_DEBUG_ICEDCC |
diff --git a/arch/arm/common/clkdev.c b/arch/arm/common/clkdev.c index f37afd9422f3..aae5bc01acc8 100644 --- a/arch/arm/common/clkdev.c +++ b/arch/arm/common/clkdev.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <linux/err.h> | 17 | #include <linux/err.h> |
| 18 | #include <linux/string.h> | 18 | #include <linux/string.h> |
| 19 | #include <linux/mutex.h> | 19 | #include <linux/mutex.h> |
| 20 | #include <linux/clk.h> | ||
| 20 | 21 | ||
| 21 | #include <asm/clkdev.h> | 22 | #include <asm/clkdev.h> |
| 22 | #include <mach/clkdev.h> | 23 | #include <mach/clkdev.h> |
diff --git a/arch/arm/configs/mx27_defconfig b/arch/arm/configs/mx27_defconfig index 083516cd0d7f..75263a83741c 100644 --- a/arch/arm/configs/mx27_defconfig +++ b/arch/arm/configs/mx27_defconfig | |||
| @@ -1,15 +1,15 @@ | |||
| 1 | # | 1 | # |
| 2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
| 3 | # Linux kernel version: 2.6.30-rc1 | 3 | # Linux kernel version: 2.6.31-rc4 |
| 4 | # Wed Apr 8 10:18:06 2009 | 4 | # Fri Jul 24 16:08:06 2009 |
| 5 | # | 5 | # |
| 6 | CONFIG_ARM=y | 6 | CONFIG_ARM=y |
| 7 | CONFIG_HAVE_PWM=y | ||
| 7 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y | 8 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y |
| 8 | CONFIG_GENERIC_GPIO=y | 9 | CONFIG_GENERIC_GPIO=y |
| 9 | CONFIG_GENERIC_TIME=y | 10 | CONFIG_GENERIC_TIME=y |
| 10 | CONFIG_GENERIC_CLOCKEVENTS=y | 11 | CONFIG_GENERIC_CLOCKEVENTS=y |
| 11 | CONFIG_MMU=y | 12 | CONFIG_MMU=y |
| 12 | # CONFIG_NO_IOPORT is not set | ||
| 13 | CONFIG_GENERIC_HARDIRQS=y | 13 | CONFIG_GENERIC_HARDIRQS=y |
| 14 | CONFIG_STACKTRACE_SUPPORT=y | 14 | CONFIG_STACKTRACE_SUPPORT=y |
| 15 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | 15 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y |
| @@ -18,14 +18,13 @@ CONFIG_TRACE_IRQFLAGS_SUPPORT=y | |||
| 18 | CONFIG_HARDIRQS_SW_RESEND=y | 18 | CONFIG_HARDIRQS_SW_RESEND=y |
| 19 | CONFIG_GENERIC_IRQ_PROBE=y | 19 | CONFIG_GENERIC_IRQ_PROBE=y |
| 20 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | 20 | CONFIG_RWSEM_GENERIC_SPINLOCK=y |
| 21 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
| 22 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
| 23 | CONFIG_GENERIC_HWEIGHT=y | 21 | CONFIG_GENERIC_HWEIGHT=y |
| 24 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 22 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
| 25 | CONFIG_ARCH_MTD_XIP=y | 23 | CONFIG_ARCH_MTD_XIP=y |
| 26 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | 24 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y |
| 27 | CONFIG_VECTORS_BASE=0xffff0000 | 25 | CONFIG_VECTORS_BASE=0xffff0000 |
| 28 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 26 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
| 27 | CONFIG_CONSTRUCTORS=y | ||
| 29 | 28 | ||
| 30 | # | 29 | # |
| 31 | # General setup | 30 | # General setup |
| @@ -85,7 +84,12 @@ CONFIG_TIMERFD=y | |||
| 85 | CONFIG_EVENTFD=y | 84 | CONFIG_EVENTFD=y |
| 86 | CONFIG_SHMEM=y | 85 | CONFIG_SHMEM=y |
| 87 | CONFIG_AIO=y | 86 | CONFIG_AIO=y |
| 87 | |||
| 88 | # | ||
| 89 | # Performance Counters | ||
| 90 | # | ||
| 88 | CONFIG_VM_EVENT_COUNTERS=y | 91 | CONFIG_VM_EVENT_COUNTERS=y |
| 92 | # CONFIG_STRIP_ASM_SYMS is not set | ||
| 89 | # CONFIG_COMPAT_BRK is not set | 93 | # CONFIG_COMPAT_BRK is not set |
| 90 | CONFIG_SLAB=y | 94 | CONFIG_SLAB=y |
| 91 | # CONFIG_SLUB is not set | 95 | # CONFIG_SLUB is not set |
| @@ -99,6 +103,12 @@ CONFIG_KPROBES=y | |||
| 99 | CONFIG_KRETPROBES=y | 103 | CONFIG_KRETPROBES=y |
| 100 | CONFIG_HAVE_KPROBES=y | 104 | CONFIG_HAVE_KPROBES=y |
| 101 | CONFIG_HAVE_KRETPROBES=y | 105 | CONFIG_HAVE_KRETPROBES=y |
| 106 | CONFIG_HAVE_CLK=y | ||
| 107 | |||
| 108 | # | ||
| 109 | # GCOV-based kernel profiling | ||
| 110 | # | ||
| 111 | # CONFIG_GCOV_KERNEL is not set | ||
| 102 | # CONFIG_SLOW_WORK is not set | 112 | # CONFIG_SLOW_WORK is not set |
| 103 | CONFIG_HAVE_GENERIC_DMA_COHERENT=y | 113 | CONFIG_HAVE_GENERIC_DMA_COHERENT=y |
| 104 | CONFIG_SLABINFO=y | 114 | CONFIG_SLABINFO=y |
| @@ -111,7 +121,7 @@ CONFIG_MODULE_UNLOAD=y | |||
| 111 | # CONFIG_MODVERSIONS is not set | 121 | # CONFIG_MODVERSIONS is not set |
| 112 | # CONFIG_MODULE_SRCVERSION_ALL is not set | 122 | # CONFIG_MODULE_SRCVERSION_ALL is not set |
| 113 | CONFIG_BLOCK=y | 123 | CONFIG_BLOCK=y |
| 114 | # CONFIG_LBD is not set | 124 | CONFIG_LBDAF=y |
| 115 | # CONFIG_BLK_DEV_BSG is not set | 125 | # CONFIG_BLK_DEV_BSG is not set |
| 116 | # CONFIG_BLK_DEV_INTEGRITY is not set | 126 | # CONFIG_BLK_DEV_INTEGRITY is not set |
| 117 | 127 | ||
| @@ -138,13 +148,14 @@ CONFIG_FREEZER=y | |||
| 138 | # CONFIG_ARCH_VERSATILE is not set | 148 | # CONFIG_ARCH_VERSATILE is not set |
| 139 | # CONFIG_ARCH_AT91 is not set | 149 | # CONFIG_ARCH_AT91 is not set |
| 140 | # CONFIG_ARCH_CLPS711X is not set | 150 | # CONFIG_ARCH_CLPS711X is not set |
| 151 | # CONFIG_ARCH_GEMINI is not set | ||
| 141 | # CONFIG_ARCH_EBSA110 is not set | 152 | # CONFIG_ARCH_EBSA110 is not set |
| 142 | # CONFIG_ARCH_EP93XX is not set | 153 | # CONFIG_ARCH_EP93XX is not set |
| 143 | # CONFIG_ARCH_GEMINI is not set | ||
| 144 | # CONFIG_ARCH_FOOTBRIDGE is not set | 154 | # CONFIG_ARCH_FOOTBRIDGE is not set |
| 155 | CONFIG_ARCH_MXC=y | ||
| 156 | # CONFIG_ARCH_STMP3XXX is not set | ||
| 145 | # CONFIG_ARCH_NETX is not set | 157 | # CONFIG_ARCH_NETX is not set |
| 146 | # CONFIG_ARCH_H720X is not set | 158 | # CONFIG_ARCH_H720X is not set |
| 147 | # CONFIG_ARCH_IMX is not set | ||
| 148 | # CONFIG_ARCH_IOP13XX is not set | 159 | # CONFIG_ARCH_IOP13XX is not set |
| 149 | # CONFIG_ARCH_IOP32X is not set | 160 | # CONFIG_ARCH_IOP32X is not set |
| 150 | # CONFIG_ARCH_IOP33X is not set | 161 | # CONFIG_ARCH_IOP33X is not set |
| @@ -153,25 +164,25 @@ CONFIG_FREEZER=y | |||
| 153 | # CONFIG_ARCH_IXP4XX is not set | 164 | # CONFIG_ARCH_IXP4XX is not set |
| 154 | # CONFIG_ARCH_L7200 is not set | 165 | # CONFIG_ARCH_L7200 is not set |
| 155 | # CONFIG_ARCH_KIRKWOOD is not set | 166 | # CONFIG_ARCH_KIRKWOOD is not set |
| 156 | # CONFIG_ARCH_KS8695 is not set | ||
| 157 | # CONFIG_ARCH_NS9XXX is not set | ||
| 158 | # CONFIG_ARCH_LOKI is not set | 167 | # CONFIG_ARCH_LOKI is not set |
| 159 | # CONFIG_ARCH_MV78XX0 is not set | 168 | # CONFIG_ARCH_MV78XX0 is not set |
| 160 | CONFIG_ARCH_MXC=y | ||
| 161 | # CONFIG_ARCH_ORION5X is not set | 169 | # CONFIG_ARCH_ORION5X is not set |
| 170 | # CONFIG_ARCH_MMP is not set | ||
| 171 | # CONFIG_ARCH_KS8695 is not set | ||
| 172 | # CONFIG_ARCH_NS9XXX is not set | ||
| 173 | # CONFIG_ARCH_W90X900 is not set | ||
| 162 | # CONFIG_ARCH_PNX4008 is not set | 174 | # CONFIG_ARCH_PNX4008 is not set |
| 163 | # CONFIG_ARCH_PXA is not set | 175 | # CONFIG_ARCH_PXA is not set |
| 164 | # CONFIG_ARCH_MMP is not set | 176 | # CONFIG_ARCH_MSM is not set |
| 165 | # CONFIG_ARCH_RPC is not set | 177 | # CONFIG_ARCH_RPC is not set |
| 166 | # CONFIG_ARCH_SA1100 is not set | 178 | # CONFIG_ARCH_SA1100 is not set |
| 167 | # CONFIG_ARCH_S3C2410 is not set | 179 | # CONFIG_ARCH_S3C2410 is not set |
| 168 | # CONFIG_ARCH_S3C64XX is not set | 180 | # CONFIG_ARCH_S3C64XX is not set |
| 169 | # CONFIG_ARCH_SHARK is not set | 181 | # CONFIG_ARCH_SHARK is not set |
| 170 | # CONFIG_ARCH_LH7A40X is not set | 182 | # CONFIG_ARCH_LH7A40X is not set |
| 183 | # CONFIG_ARCH_U300 is not set | ||
| 171 | # CONFIG_ARCH_DAVINCI is not set | 184 | # CONFIG_ARCH_DAVINCI is not set |
| 172 | # CONFIG_ARCH_OMAP is not set | 185 | # CONFIG_ARCH_OMAP is not set |
| 173 | # CONFIG_ARCH_MSM is not set | ||
| 174 | # CONFIG_ARCH_W90X900 is not set | ||
| 175 | 186 | ||
| 176 | # | 187 | # |
| 177 | # Freescale MXC Implementations | 188 | # Freescale MXC Implementations |
| @@ -188,6 +199,8 @@ CONFIG_MACH_MX27=y | |||
| 188 | CONFIG_MACH_MX27ADS=y | 199 | CONFIG_MACH_MX27ADS=y |
| 189 | CONFIG_MACH_PCM038=y | 200 | CONFIG_MACH_PCM038=y |
| 190 | CONFIG_MACH_PCM970_BASEBOARD=y | 201 | CONFIG_MACH_PCM970_BASEBOARD=y |
| 202 | CONFIG_MACH_MX27_3DS=y | ||
| 203 | CONFIG_MACH_MX27LITE=y | ||
| 191 | CONFIG_MXC_IRQ_PRIOR=y | 204 | CONFIG_MXC_IRQ_PRIOR=y |
| 192 | CONFIG_MXC_PWM=y | 205 | CONFIG_MXC_PWM=y |
| 193 | 206 | ||
| @@ -213,7 +226,6 @@ CONFIG_ARM_THUMB=y | |||
| 213 | # CONFIG_CPU_DCACHE_DISABLE is not set | 226 | # CONFIG_CPU_DCACHE_DISABLE is not set |
| 214 | # CONFIG_CPU_DCACHE_WRITETHROUGH is not set | 227 | # CONFIG_CPU_DCACHE_WRITETHROUGH is not set |
| 215 | # CONFIG_CPU_CACHE_ROUND_ROBIN is not set | 228 | # CONFIG_CPU_CACHE_ROUND_ROBIN is not set |
| 216 | # CONFIG_OUTER_CACHE is not set | ||
| 217 | CONFIG_COMMON_CLKDEV=y | 229 | CONFIG_COMMON_CLKDEV=y |
| 218 | 230 | ||
| 219 | # | 231 | # |
| @@ -238,7 +250,6 @@ CONFIG_PREEMPT=y | |||
| 238 | CONFIG_HZ=100 | 250 | CONFIG_HZ=100 |
| 239 | CONFIG_AEABI=y | 251 | CONFIG_AEABI=y |
| 240 | CONFIG_OABI_COMPAT=y | 252 | CONFIG_OABI_COMPAT=y |
| 241 | CONFIG_ARCH_FLATMEM_HAS_HOLES=y | ||
| 242 | # CONFIG_ARCH_SPARSEMEM_DEFAULT is not set | 253 | # CONFIG_ARCH_SPARSEMEM_DEFAULT is not set |
| 243 | # CONFIG_ARCH_SELECT_MEMORY_MODEL is not set | 254 | # CONFIG_ARCH_SELECT_MEMORY_MODEL is not set |
| 244 | # CONFIG_HIGHMEM is not set | 255 | # CONFIG_HIGHMEM is not set |
| @@ -253,10 +264,11 @@ CONFIG_SPLIT_PTLOCK_CPUS=4096 | |||
| 253 | # CONFIG_PHYS_ADDR_T_64BIT is not set | 264 | # CONFIG_PHYS_ADDR_T_64BIT is not set |
| 254 | CONFIG_ZONE_DMA_FLAG=0 | 265 | CONFIG_ZONE_DMA_FLAG=0 |
| 255 | CONFIG_VIRT_TO_BUS=y | 266 | CONFIG_VIRT_TO_BUS=y |
| 256 | CONFIG_UNEVICTABLE_LRU=y | ||
| 257 | CONFIG_HAVE_MLOCK=y | 267 | CONFIG_HAVE_MLOCK=y |
| 258 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y | 268 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y |
| 269 | CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 | ||
| 259 | CONFIG_ALIGNMENT_TRAP=y | 270 | CONFIG_ALIGNMENT_TRAP=y |
| 271 | # CONFIG_UACCESS_WITH_MEMCPY is not set | ||
| 260 | 272 | ||
| 261 | # | 273 | # |
| 262 | # Boot options | 274 | # Boot options |
| @@ -361,6 +373,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
| 361 | # CONFIG_ECONET is not set | 373 | # CONFIG_ECONET is not set |
| 362 | # CONFIG_WAN_ROUTER is not set | 374 | # CONFIG_WAN_ROUTER is not set |
| 363 | # CONFIG_PHONET is not set | 375 | # CONFIG_PHONET is not set |
| 376 | # CONFIG_IEEE802154 is not set | ||
| 364 | # CONFIG_NET_SCHED is not set | 377 | # CONFIG_NET_SCHED is not set |
| 365 | # CONFIG_DCB is not set | 378 | # CONFIG_DCB is not set |
| 366 | 379 | ||
| @@ -474,7 +487,16 @@ CONFIG_MTD_PHYSMAP=y | |||
| 474 | # CONFIG_MTD_DOC2000 is not set | 487 | # CONFIG_MTD_DOC2000 is not set |
| 475 | # CONFIG_MTD_DOC2001 is not set | 488 | # CONFIG_MTD_DOC2001 is not set |
| 476 | # CONFIG_MTD_DOC2001PLUS is not set | 489 | # CONFIG_MTD_DOC2001PLUS is not set |
| 477 | # CONFIG_MTD_NAND is not set | 490 | CONFIG_MTD_NAND=y |
| 491 | # CONFIG_MTD_NAND_VERIFY_WRITE is not set | ||
| 492 | # CONFIG_MTD_NAND_ECC_SMC is not set | ||
| 493 | # CONFIG_MTD_NAND_MUSEUM_IDS is not set | ||
| 494 | # CONFIG_MTD_NAND_GPIO is not set | ||
| 495 | CONFIG_MTD_NAND_IDS=y | ||
| 496 | # CONFIG_MTD_NAND_DISKONCHIP is not set | ||
| 497 | # CONFIG_MTD_NAND_NANDSIM is not set | ||
| 498 | # CONFIG_MTD_NAND_PLATFORM is not set | ||
| 499 | CONFIG_MTD_NAND_MXC=y | ||
| 478 | # CONFIG_MTD_ONENAND is not set | 500 | # CONFIG_MTD_ONENAND is not set |
| 479 | 501 | ||
| 480 | # | 502 | # |
| @@ -485,7 +507,15 @@ CONFIG_MTD_PHYSMAP=y | |||
| 485 | # | 507 | # |
| 486 | # UBI - Unsorted block images | 508 | # UBI - Unsorted block images |
| 487 | # | 509 | # |
| 488 | # CONFIG_MTD_UBI is not set | 510 | CONFIG_MTD_UBI=y |
| 511 | CONFIG_MTD_UBI_WL_THRESHOLD=4096 | ||
| 512 | CONFIG_MTD_UBI_BEB_RESERVE=1 | ||
| 513 | # CONFIG_MTD_UBI_GLUEBI is not set | ||
| 514 | |||
| 515 | # | ||
| 516 | # UBI debugging options | ||
| 517 | # | ||
| 518 | # CONFIG_MTD_UBI_DEBUG is not set | ||
| 489 | # CONFIG_PARPORT is not set | 519 | # CONFIG_PARPORT is not set |
| 490 | CONFIG_BLK_DEV=y | 520 | CONFIG_BLK_DEV=y |
| 491 | # CONFIG_BLK_DEV_COW_COMMON is not set | 521 | # CONFIG_BLK_DEV_COW_COMMON is not set |
| @@ -494,7 +524,21 @@ CONFIG_BLK_DEV=y | |||
| 494 | # CONFIG_BLK_DEV_RAM is not set | 524 | # CONFIG_BLK_DEV_RAM is not set |
| 495 | # CONFIG_CDROM_PKTCDVD is not set | 525 | # CONFIG_CDROM_PKTCDVD is not set |
| 496 | # CONFIG_ATA_OVER_ETH is not set | 526 | # CONFIG_ATA_OVER_ETH is not set |
| 497 | # CONFIG_MISC_DEVICES is not set | 527 | # CONFIG_MG_DISK is not set |
| 528 | CONFIG_MISC_DEVICES=y | ||
| 529 | # CONFIG_ICS932S401 is not set | ||
| 530 | # CONFIG_ENCLOSURE_SERVICES is not set | ||
| 531 | # CONFIG_ISL29003 is not set | ||
| 532 | # CONFIG_C2PORT is not set | ||
| 533 | |||
| 534 | # | ||
| 535 | # EEPROM support | ||
| 536 | # | ||
| 537 | CONFIG_EEPROM_AT24=y | ||
| 538 | # CONFIG_EEPROM_AT25 is not set | ||
| 539 | # CONFIG_EEPROM_LEGACY is not set | ||
| 540 | # CONFIG_EEPROM_MAX6875 is not set | ||
| 541 | # CONFIG_EEPROM_93CX6 is not set | ||
| 498 | CONFIG_HAVE_IDE=y | 542 | CONFIG_HAVE_IDE=y |
| 499 | # CONFIG_IDE is not set | 543 | # CONFIG_IDE is not set |
| 500 | 544 | ||
| @@ -508,7 +552,6 @@ CONFIG_HAVE_IDE=y | |||
| 508 | # CONFIG_ATA is not set | 552 | # CONFIG_ATA is not set |
| 509 | # CONFIG_MD is not set | 553 | # CONFIG_MD is not set |
| 510 | CONFIG_NETDEVICES=y | 554 | CONFIG_NETDEVICES=y |
| 511 | CONFIG_COMPAT_NET_DEV_OPS=y | ||
| 512 | # CONFIG_DUMMY is not set | 555 | # CONFIG_DUMMY is not set |
| 513 | # CONFIG_BONDING is not set | 556 | # CONFIG_BONDING is not set |
| 514 | # CONFIG_MACVLAN is not set | 557 | # CONFIG_MACVLAN is not set |
| @@ -534,6 +577,8 @@ CONFIG_NET_ETHERNET=y | |||
| 534 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | 577 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set |
| 535 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | 578 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set |
| 536 | # CONFIG_B44 is not set | 579 | # CONFIG_B44 is not set |
| 580 | # CONFIG_KS8842 is not set | ||
| 581 | # CONFIG_KS8851 is not set | ||
| 537 | CONFIG_FEC=y | 582 | CONFIG_FEC=y |
| 538 | # CONFIG_FEC2 is not set | 583 | # CONFIG_FEC2 is not set |
| 539 | # CONFIG_NETDEV_1000 is not set | 584 | # CONFIG_NETDEV_1000 is not set |
| @@ -580,6 +625,11 @@ CONFIG_INPUT_EVDEV=y | |||
| 580 | # CONFIG_INPUT_TABLET is not set | 625 | # CONFIG_INPUT_TABLET is not set |
| 581 | CONFIG_INPUT_TOUCHSCREEN=y | 626 | CONFIG_INPUT_TOUCHSCREEN=y |
| 582 | # CONFIG_TOUCHSCREEN_ADS7846 is not set | 627 | # CONFIG_TOUCHSCREEN_ADS7846 is not set |
| 628 | # CONFIG_TOUCHSCREEN_AD7877 is not set | ||
| 629 | # CONFIG_TOUCHSCREEN_AD7879_I2C is not set | ||
| 630 | # CONFIG_TOUCHSCREEN_AD7879_SPI is not set | ||
| 631 | # CONFIG_TOUCHSCREEN_AD7879 is not set | ||
| 632 | # CONFIG_TOUCHSCREEN_EETI is not set | ||
| 583 | # CONFIG_TOUCHSCREEN_FUJITSU is not set | 633 | # CONFIG_TOUCHSCREEN_FUJITSU is not set |
| 584 | # CONFIG_TOUCHSCREEN_GUNZE is not set | 634 | # CONFIG_TOUCHSCREEN_GUNZE is not set |
| 585 | # CONFIG_TOUCHSCREEN_ELO is not set | 635 | # CONFIG_TOUCHSCREEN_ELO is not set |
| @@ -592,6 +642,7 @@ CONFIG_INPUT_TOUCHSCREEN=y | |||
| 592 | # CONFIG_TOUCHSCREEN_TOUCHWIN is not set | 642 | # CONFIG_TOUCHSCREEN_TOUCHWIN is not set |
| 593 | # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set | 643 | # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set |
| 594 | # CONFIG_TOUCHSCREEN_TSC2007 is not set | 644 | # CONFIG_TOUCHSCREEN_TSC2007 is not set |
| 645 | # CONFIG_TOUCHSCREEN_W90X900 is not set | ||
| 595 | # CONFIG_INPUT_MISC is not set | 646 | # CONFIG_INPUT_MISC is not set |
| 596 | 647 | ||
| 597 | # | 648 | # |
| @@ -644,6 +695,7 @@ CONFIG_I2C_HELPER_AUTO=y | |||
| 644 | # | 695 | # |
| 645 | # I2C system bus drivers (mostly embedded / system-on-chip) | 696 | # I2C system bus drivers (mostly embedded / system-on-chip) |
| 646 | # | 697 | # |
| 698 | # CONFIG_I2C_DESIGNWARE is not set | ||
| 647 | # CONFIG_I2C_GPIO is not set | 699 | # CONFIG_I2C_GPIO is not set |
| 648 | CONFIG_I2C_IMX=y | 700 | CONFIG_I2C_IMX=y |
| 649 | # CONFIG_I2C_OCORES is not set | 701 | # CONFIG_I2C_OCORES is not set |
| @@ -668,7 +720,6 @@ CONFIG_I2C_IMX=y | |||
| 668 | # CONFIG_SENSORS_PCF8574 is not set | 720 | # CONFIG_SENSORS_PCF8574 is not set |
| 669 | # CONFIG_PCF8575 is not set | 721 | # CONFIG_PCF8575 is not set |
| 670 | # CONFIG_SENSORS_PCA9539 is not set | 722 | # CONFIG_SENSORS_PCA9539 is not set |
| 671 | # CONFIG_SENSORS_MAX6875 is not set | ||
| 672 | # CONFIG_SENSORS_TSL2550 is not set | 723 | # CONFIG_SENSORS_TSL2550 is not set |
| 673 | # CONFIG_I2C_DEBUG_CORE is not set | 724 | # CONFIG_I2C_DEBUG_CORE is not set |
| 674 | # CONFIG_I2C_DEBUG_ALGO is not set | 725 | # CONFIG_I2C_DEBUG_ALGO is not set |
| @@ -719,6 +770,7 @@ CONFIG_W1=y | |||
| 719 | # | 770 | # |
| 720 | # CONFIG_W1_MASTER_DS2482 is not set | 771 | # CONFIG_W1_MASTER_DS2482 is not set |
| 721 | CONFIG_W1_MASTER_MXC=y | 772 | CONFIG_W1_MASTER_MXC=y |
| 773 | # CONFIG_W1_MASTER_DS1WM is not set | ||
| 722 | # CONFIG_W1_MASTER_GPIO is not set | 774 | # CONFIG_W1_MASTER_GPIO is not set |
| 723 | 775 | ||
| 724 | # | 776 | # |
| @@ -753,54 +805,16 @@ CONFIG_SSB_POSSIBLE=y | |||
| 753 | # CONFIG_TPS65010 is not set | 805 | # CONFIG_TPS65010 is not set |
| 754 | # CONFIG_TWL4030_CORE is not set | 806 | # CONFIG_TWL4030_CORE is not set |
| 755 | # CONFIG_MFD_TMIO is not set | 807 | # CONFIG_MFD_TMIO is not set |
| 808 | # CONFIG_MFD_T7L66XB is not set | ||
| 809 | # CONFIG_MFD_TC6387XB is not set | ||
| 756 | # CONFIG_MFD_TC6393XB is not set | 810 | # CONFIG_MFD_TC6393XB is not set |
| 757 | # CONFIG_PMIC_DA903X is not set | 811 | # CONFIG_PMIC_DA903X is not set |
| 758 | # CONFIG_MFD_WM8400 is not set | 812 | # CONFIG_MFD_WM8400 is not set |
| 759 | # CONFIG_MFD_WM8350_I2C is not set | 813 | # CONFIG_MFD_WM8350_I2C is not set |
| 760 | # CONFIG_MFD_PCF50633 is not set | 814 | # CONFIG_MFD_PCF50633 is not set |
| 761 | 815 | # CONFIG_AB3100_CORE is not set | |
| 762 | # | 816 | # CONFIG_EZX_PCAP is not set |
| 763 | # Multimedia devices | 817 | # CONFIG_MEDIA_SUPPORT is not set |
| 764 | # | ||
| 765 | |||
| 766 | # | ||
| 767 | # Multimedia core support | ||
| 768 | # | ||
| 769 | CONFIG_VIDEO_DEV=y | ||
| 770 | CONFIG_VIDEO_V4L2_COMMON=y | ||
| 771 | CONFIG_VIDEO_ALLOW_V4L1=y | ||
| 772 | CONFIG_VIDEO_V4L1_COMPAT=y | ||
| 773 | # CONFIG_DVB_CORE is not set | ||
| 774 | CONFIG_VIDEO_MEDIA=y | ||
| 775 | |||
| 776 | # | ||
| 777 | # Multimedia drivers | ||
| 778 | # | ||
| 779 | # CONFIG_MEDIA_ATTACH is not set | ||
| 780 | CONFIG_MEDIA_TUNER=y | ||
| 781 | # CONFIG_MEDIA_TUNER_CUSTOMISE is not set | ||
| 782 | CONFIG_MEDIA_TUNER_SIMPLE=y | ||
| 783 | CONFIG_MEDIA_TUNER_TDA8290=y | ||
| 784 | CONFIG_MEDIA_TUNER_TDA9887=y | ||
| 785 | CONFIG_MEDIA_TUNER_TEA5761=y | ||
| 786 | CONFIG_MEDIA_TUNER_TEA5767=y | ||
| 787 | CONFIG_MEDIA_TUNER_MT20XX=y | ||
| 788 | CONFIG_MEDIA_TUNER_XC2028=y | ||
| 789 | CONFIG_MEDIA_TUNER_XC5000=y | ||
| 790 | CONFIG_MEDIA_TUNER_MC44S803=y | ||
| 791 | CONFIG_VIDEO_V4L2=y | ||
| 792 | CONFIG_VIDEO_V4L1=y | ||
| 793 | CONFIG_VIDEO_CAPTURE_DRIVERS=y | ||
| 794 | # CONFIG_VIDEO_ADV_DEBUG is not set | ||
| 795 | # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set | ||
| 796 | CONFIG_VIDEO_HELPER_CHIPS_AUTO=y | ||
| 797 | # CONFIG_VIDEO_VIVI is not set | ||
| 798 | # CONFIG_VIDEO_CPIA is not set | ||
| 799 | # CONFIG_VIDEO_SAA5246A is not set | ||
| 800 | # CONFIG_VIDEO_SAA5249 is not set | ||
| 801 | # CONFIG_SOC_CAMERA is not set | ||
| 802 | # CONFIG_RADIO_ADAPTERS is not set | ||
| 803 | # CONFIG_DAB is not set | ||
| 804 | 818 | ||
| 805 | # | 819 | # |
| 806 | # Graphics support | 820 | # Graphics support |
| @@ -917,6 +931,7 @@ CONFIG_RTC_DRV_PCF8563=y | |||
| 917 | # CONFIG_RTC_DRV_S35390A is not set | 931 | # CONFIG_RTC_DRV_S35390A is not set |
| 918 | # CONFIG_RTC_DRV_FM3130 is not set | 932 | # CONFIG_RTC_DRV_FM3130 is not set |
| 919 | # CONFIG_RTC_DRV_RX8581 is not set | 933 | # CONFIG_RTC_DRV_RX8581 is not set |
| 934 | # CONFIG_RTC_DRV_RX8025 is not set | ||
| 920 | 935 | ||
| 921 | # | 936 | # |
| 922 | # SPI RTC drivers | 937 | # SPI RTC drivers |
| @@ -962,12 +977,15 @@ CONFIG_RTC_DRV_PCF8563=y | |||
| 962 | # CONFIG_REISERFS_FS is not set | 977 | # CONFIG_REISERFS_FS is not set |
| 963 | # CONFIG_JFS_FS is not set | 978 | # CONFIG_JFS_FS is not set |
| 964 | # CONFIG_FS_POSIX_ACL is not set | 979 | # CONFIG_FS_POSIX_ACL is not set |
| 965 | CONFIG_FILE_LOCKING=y | ||
| 966 | # CONFIG_XFS_FS is not set | 980 | # CONFIG_XFS_FS is not set |
| 981 | # CONFIG_GFS2_FS is not set | ||
| 967 | # CONFIG_OCFS2_FS is not set | 982 | # CONFIG_OCFS2_FS is not set |
| 968 | # CONFIG_BTRFS_FS is not set | 983 | # CONFIG_BTRFS_FS is not set |
| 984 | CONFIG_FILE_LOCKING=y | ||
| 985 | CONFIG_FSNOTIFY=y | ||
| 969 | # CONFIG_DNOTIFY is not set | 986 | # CONFIG_DNOTIFY is not set |
| 970 | # CONFIG_INOTIFY is not set | 987 | # CONFIG_INOTIFY is not set |
| 988 | CONFIG_INOTIFY_USER=y | ||
| 971 | # CONFIG_QUOTA is not set | 989 | # CONFIG_QUOTA is not set |
| 972 | # CONFIG_AUTOFS_FS is not set | 990 | # CONFIG_AUTOFS_FS is not set |
| 973 | # CONFIG_AUTOFS4_FS is not set | 991 | # CONFIG_AUTOFS4_FS is not set |
| @@ -1021,6 +1039,12 @@ CONFIG_JFFS2_ZLIB=y | |||
| 1021 | # CONFIG_JFFS2_LZO is not set | 1039 | # CONFIG_JFFS2_LZO is not set |
| 1022 | CONFIG_JFFS2_RTIME=y | 1040 | CONFIG_JFFS2_RTIME=y |
| 1023 | # CONFIG_JFFS2_RUBIN is not set | 1041 | # CONFIG_JFFS2_RUBIN is not set |
| 1042 | CONFIG_UBIFS_FS=y | ||
| 1043 | # CONFIG_UBIFS_FS_XATTR is not set | ||
| 1044 | # CONFIG_UBIFS_FS_ADVANCED_COMPR is not set | ||
| 1045 | CONFIG_UBIFS_FS_LZO=y | ||
| 1046 | CONFIG_UBIFS_FS_ZLIB=y | ||
| 1047 | # CONFIG_UBIFS_FS_DEBUG is not set | ||
| 1024 | # CONFIG_CRAMFS is not set | 1048 | # CONFIG_CRAMFS is not set |
| 1025 | # CONFIG_SQUASHFS is not set | 1049 | # CONFIG_SQUASHFS is not set |
| 1026 | # CONFIG_VXFS_FS is not set | 1050 | # CONFIG_VXFS_FS is not set |
| @@ -1119,25 +1143,11 @@ CONFIG_SYSCTL_SYSCALL_CHECK=y | |||
| 1119 | CONFIG_NOP_TRACER=y | 1143 | CONFIG_NOP_TRACER=y |
| 1120 | CONFIG_HAVE_FUNCTION_TRACER=y | 1144 | CONFIG_HAVE_FUNCTION_TRACER=y |
| 1121 | CONFIG_RING_BUFFER=y | 1145 | CONFIG_RING_BUFFER=y |
| 1146 | CONFIG_EVENT_TRACING=y | ||
| 1147 | CONFIG_CONTEXT_SWITCH_TRACER=y | ||
| 1122 | CONFIG_TRACING=y | 1148 | CONFIG_TRACING=y |
| 1123 | CONFIG_TRACING_SUPPORT=y | 1149 | CONFIG_TRACING_SUPPORT=y |
| 1124 | 1150 | # CONFIG_FTRACE is not set | |
| 1125 | # | ||
| 1126 | # Tracers | ||
| 1127 | # | ||
| 1128 | # CONFIG_FUNCTION_TRACER is not set | ||
| 1129 | # CONFIG_IRQSOFF_TRACER is not set | ||
| 1130 | # CONFIG_PREEMPT_TRACER is not set | ||
| 1131 | # CONFIG_SCHED_TRACER is not set | ||
| 1132 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | ||
| 1133 | # CONFIG_EVENT_TRACER is not set | ||
| 1134 | # CONFIG_BOOT_TRACER is not set | ||
| 1135 | # CONFIG_TRACE_BRANCH_PROFILING is not set | ||
| 1136 | # CONFIG_STACK_TRACER is not set | ||
| 1137 | # CONFIG_KMEMTRACE is not set | ||
| 1138 | # CONFIG_WORKQUEUE_TRACER is not set | ||
| 1139 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
| 1140 | # CONFIG_FTRACE_STARTUP_TEST is not set | ||
| 1141 | # CONFIG_DYNAMIC_DEBUG is not set | 1151 | # CONFIG_DYNAMIC_DEBUG is not set |
| 1142 | # CONFIG_SAMPLES is not set | 1152 | # CONFIG_SAMPLES is not set |
| 1143 | CONFIG_HAVE_ARCH_KGDB=y | 1153 | CONFIG_HAVE_ARCH_KGDB=y |
| @@ -1151,16 +1161,104 @@ CONFIG_ARM_UNWIND=y | |||
| 1151 | # CONFIG_SECURITY is not set | 1161 | # CONFIG_SECURITY is not set |
| 1152 | # CONFIG_SECURITYFS is not set | 1162 | # CONFIG_SECURITYFS is not set |
| 1153 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | 1163 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set |
| 1154 | # CONFIG_CRYPTO is not set | 1164 | CONFIG_CRYPTO=y |
| 1165 | |||
| 1166 | # | ||
| 1167 | # Crypto core or helper | ||
| 1168 | # | ||
| 1169 | # CONFIG_CRYPTO_FIPS is not set | ||
| 1170 | CONFIG_CRYPTO_ALGAPI=y | ||
| 1171 | CONFIG_CRYPTO_ALGAPI2=y | ||
| 1172 | # CONFIG_CRYPTO_MANAGER is not set | ||
| 1173 | # CONFIG_CRYPTO_MANAGER2 is not set | ||
| 1174 | # CONFIG_CRYPTO_GF128MUL is not set | ||
| 1175 | # CONFIG_CRYPTO_NULL is not set | ||
| 1176 | # CONFIG_CRYPTO_CRYPTD is not set | ||
| 1177 | # CONFIG_CRYPTO_AUTHENC is not set | ||
| 1178 | # CONFIG_CRYPTO_TEST is not set | ||
| 1179 | |||
| 1180 | # | ||
| 1181 | # Authenticated Encryption with Associated Data | ||
| 1182 | # | ||
| 1183 | # CONFIG_CRYPTO_CCM is not set | ||
| 1184 | # CONFIG_CRYPTO_GCM is not set | ||
| 1185 | # CONFIG_CRYPTO_SEQIV is not set | ||
| 1186 | |||
| 1187 | # | ||
| 1188 | # Block modes | ||
| 1189 | # | ||
| 1190 | # CONFIG_CRYPTO_CBC is not set | ||
| 1191 | # CONFIG_CRYPTO_CTR is not set | ||
| 1192 | # CONFIG_CRYPTO_CTS is not set | ||
| 1193 | # CONFIG_CRYPTO_ECB is not set | ||
| 1194 | # CONFIG_CRYPTO_LRW is not set | ||
| 1195 | # CONFIG_CRYPTO_PCBC is not set | ||
| 1196 | # CONFIG_CRYPTO_XTS is not set | ||
| 1197 | |||
| 1198 | # | ||
| 1199 | # Hash modes | ||
| 1200 | # | ||
| 1201 | # CONFIG_CRYPTO_HMAC is not set | ||
| 1202 | # CONFIG_CRYPTO_XCBC is not set | ||
| 1203 | |||
| 1204 | # | ||
| 1205 | # Digest | ||
| 1206 | # | ||
| 1207 | # CONFIG_CRYPTO_CRC32C is not set | ||
| 1208 | # CONFIG_CRYPTO_MD4 is not set | ||
| 1209 | # CONFIG_CRYPTO_MD5 is not set | ||
| 1210 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
| 1211 | # CONFIG_CRYPTO_RMD128 is not set | ||
| 1212 | # CONFIG_CRYPTO_RMD160 is not set | ||
| 1213 | # CONFIG_CRYPTO_RMD256 is not set | ||
| 1214 | # CONFIG_CRYPTO_RMD320 is not set | ||
| 1215 | # CONFIG_CRYPTO_SHA1 is not set | ||
| 1216 | # CONFIG_CRYPTO_SHA256 is not set | ||
| 1217 | # CONFIG_CRYPTO_SHA512 is not set | ||
| 1218 | # CONFIG_CRYPTO_TGR192 is not set | ||
| 1219 | # CONFIG_CRYPTO_WP512 is not set | ||
| 1220 | |||
| 1221 | # | ||
| 1222 | # Ciphers | ||
| 1223 | # | ||
| 1224 | # CONFIG_CRYPTO_AES is not set | ||
| 1225 | # CONFIG_CRYPTO_ANUBIS is not set | ||
| 1226 | # CONFIG_CRYPTO_ARC4 is not set | ||
| 1227 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
| 1228 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
| 1229 | # CONFIG_CRYPTO_CAST5 is not set | ||
| 1230 | # CONFIG_CRYPTO_CAST6 is not set | ||
| 1231 | # CONFIG_CRYPTO_DES is not set | ||
| 1232 | # CONFIG_CRYPTO_FCRYPT is not set | ||
| 1233 | # CONFIG_CRYPTO_KHAZAD is not set | ||
| 1234 | # CONFIG_CRYPTO_SALSA20 is not set | ||
| 1235 | # CONFIG_CRYPTO_SEED is not set | ||
| 1236 | # CONFIG_CRYPTO_SERPENT is not set | ||
| 1237 | # CONFIG_CRYPTO_TEA is not set | ||
| 1238 | # CONFIG_CRYPTO_TWOFISH is not set | ||
| 1239 | |||
| 1240 | # | ||
| 1241 | # Compression | ||
| 1242 | # | ||
| 1243 | CONFIG_CRYPTO_DEFLATE=y | ||
| 1244 | # CONFIG_CRYPTO_ZLIB is not set | ||
| 1245 | CONFIG_CRYPTO_LZO=y | ||
| 1246 | |||
| 1247 | # | ||
| 1248 | # Random Number Generation | ||
| 1249 | # | ||
| 1250 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | ||
| 1251 | CONFIG_CRYPTO_HW=y | ||
| 1155 | CONFIG_BINARY_PRINTF=y | 1252 | CONFIG_BINARY_PRINTF=y |
| 1156 | 1253 | ||
| 1157 | # | 1254 | # |
| 1158 | # Library routines | 1255 | # Library routines |
| 1159 | # | 1256 | # |
| 1160 | CONFIG_BITREVERSE=y | 1257 | CONFIG_BITREVERSE=y |
| 1258 | CONFIG_RATIONAL=y | ||
| 1161 | CONFIG_GENERIC_FIND_LAST_BIT=y | 1259 | CONFIG_GENERIC_FIND_LAST_BIT=y |
| 1162 | # CONFIG_CRC_CCITT is not set | 1260 | # CONFIG_CRC_CCITT is not set |
| 1163 | # CONFIG_CRC16 is not set | 1261 | CONFIG_CRC16=y |
| 1164 | # CONFIG_CRC_T10DIF is not set | 1262 | # CONFIG_CRC_T10DIF is not set |
| 1165 | # CONFIG_CRC_ITU_T is not set | 1263 | # CONFIG_CRC_ITU_T is not set |
| 1166 | CONFIG_CRC32=y | 1264 | CONFIG_CRC32=y |
| @@ -1168,6 +1266,8 @@ CONFIG_CRC32=y | |||
| 1168 | # CONFIG_LIBCRC32C is not set | 1266 | # CONFIG_LIBCRC32C is not set |
| 1169 | CONFIG_ZLIB_INFLATE=y | 1267 | CONFIG_ZLIB_INFLATE=y |
| 1170 | CONFIG_ZLIB_DEFLATE=y | 1268 | CONFIG_ZLIB_DEFLATE=y |
| 1269 | CONFIG_LZO_COMPRESS=y | ||
| 1270 | CONFIG_LZO_DECOMPRESS=y | ||
| 1171 | CONFIG_HAS_IOMEM=y | 1271 | CONFIG_HAS_IOMEM=y |
| 1172 | CONFIG_HAS_IOPORT=y | 1272 | CONFIG_HAS_IOPORT=y |
| 1173 | CONFIG_HAS_DMA=y | 1273 | CONFIG_HAS_DMA=y |
diff --git a/arch/arm/configs/mx3_defconfig b/arch/arm/configs/mx3_defconfig index 20ada526f6de..a4f9a2a8149c 100644 --- a/arch/arm/configs/mx3_defconfig +++ b/arch/arm/configs/mx3_defconfig | |||
| @@ -1,15 +1,15 @@ | |||
| 1 | # | 1 | # |
| 2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
| 3 | # Linux kernel version: 2.6.30-rc1 | 3 | # Linux kernel version: 2.6.31-rc4 |
| 4 | # Wed Apr 8 11:06:37 2009 | 4 | # Tue Jul 28 14:11:34 2009 |
| 5 | # | 5 | # |
| 6 | CONFIG_ARM=y | 6 | CONFIG_ARM=y |
| 7 | CONFIG_HAVE_PWM=y | ||
| 7 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y | 8 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y |
| 8 | CONFIG_GENERIC_GPIO=y | 9 | CONFIG_GENERIC_GPIO=y |
| 9 | CONFIG_GENERIC_TIME=y | 10 | CONFIG_GENERIC_TIME=y |
| 10 | CONFIG_GENERIC_CLOCKEVENTS=y | 11 | CONFIG_GENERIC_CLOCKEVENTS=y |
| 11 | CONFIG_MMU=y | 12 | CONFIG_MMU=y |
| 12 | # CONFIG_NO_IOPORT is not set | ||
| 13 | CONFIG_GENERIC_HARDIRQS=y | 13 | CONFIG_GENERIC_HARDIRQS=y |
| 14 | CONFIG_STACKTRACE_SUPPORT=y | 14 | CONFIG_STACKTRACE_SUPPORT=y |
| 15 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | 15 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y |
| @@ -18,14 +18,13 @@ CONFIG_TRACE_IRQFLAGS_SUPPORT=y | |||
| 18 | CONFIG_HARDIRQS_SW_RESEND=y | 18 | CONFIG_HARDIRQS_SW_RESEND=y |
| 19 | CONFIG_GENERIC_IRQ_PROBE=y | 19 | CONFIG_GENERIC_IRQ_PROBE=y |
| 20 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | 20 | CONFIG_RWSEM_GENERIC_SPINLOCK=y |
| 21 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
| 22 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
| 23 | CONFIG_GENERIC_HWEIGHT=y | 21 | CONFIG_GENERIC_HWEIGHT=y |
| 24 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 22 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
| 25 | CONFIG_ARCH_MTD_XIP=y | 23 | CONFIG_ARCH_MTD_XIP=y |
| 26 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | 24 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y |
| 27 | CONFIG_VECTORS_BASE=0xffff0000 | 25 | CONFIG_VECTORS_BASE=0xffff0000 |
| 28 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 26 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
| 27 | CONFIG_CONSTRUCTORS=y | ||
| 29 | 28 | ||
| 30 | # | 29 | # |
| 31 | # General setup | 30 | # General setup |
| @@ -86,7 +85,12 @@ CONFIG_TIMERFD=y | |||
| 86 | CONFIG_EVENTFD=y | 85 | CONFIG_EVENTFD=y |
| 87 | CONFIG_SHMEM=y | 86 | CONFIG_SHMEM=y |
| 88 | CONFIG_AIO=y | 87 | CONFIG_AIO=y |
| 88 | |||
| 89 | # | ||
| 90 | # Performance Counters | ||
| 91 | # | ||
| 89 | CONFIG_VM_EVENT_COUNTERS=y | 92 | CONFIG_VM_EVENT_COUNTERS=y |
| 93 | # CONFIG_STRIP_ASM_SYMS is not set | ||
| 90 | CONFIG_COMPAT_BRK=y | 94 | CONFIG_COMPAT_BRK=y |
| 91 | CONFIG_SLAB=y | 95 | CONFIG_SLAB=y |
| 92 | # CONFIG_SLUB is not set | 96 | # CONFIG_SLUB is not set |
| @@ -97,6 +101,11 @@ CONFIG_HAVE_OPROFILE=y | |||
| 97 | # CONFIG_KPROBES is not set | 101 | # CONFIG_KPROBES is not set |
| 98 | CONFIG_HAVE_KPROBES=y | 102 | CONFIG_HAVE_KPROBES=y |
| 99 | CONFIG_HAVE_KRETPROBES=y | 103 | CONFIG_HAVE_KRETPROBES=y |
| 104 | CONFIG_HAVE_CLK=y | ||
| 105 | |||
| 106 | # | ||
| 107 | # GCOV-based kernel profiling | ||
| 108 | # | ||
| 100 | # CONFIG_SLOW_WORK is not set | 109 | # CONFIG_SLOW_WORK is not set |
| 101 | CONFIG_HAVE_GENERIC_DMA_COHERENT=y | 110 | CONFIG_HAVE_GENERIC_DMA_COHERENT=y |
| 102 | CONFIG_SLABINFO=y | 111 | CONFIG_SLABINFO=y |
| @@ -109,7 +118,7 @@ CONFIG_MODULE_FORCE_UNLOAD=y | |||
| 109 | CONFIG_MODVERSIONS=y | 118 | CONFIG_MODVERSIONS=y |
| 110 | # CONFIG_MODULE_SRCVERSION_ALL is not set | 119 | # CONFIG_MODULE_SRCVERSION_ALL is not set |
| 111 | CONFIG_BLOCK=y | 120 | CONFIG_BLOCK=y |
| 112 | # CONFIG_LBD is not set | 121 | CONFIG_LBDAF=y |
| 113 | # CONFIG_BLK_DEV_BSG is not set | 122 | # CONFIG_BLK_DEV_BSG is not set |
| 114 | # CONFIG_BLK_DEV_INTEGRITY is not set | 123 | # CONFIG_BLK_DEV_INTEGRITY is not set |
| 115 | 124 | ||
| @@ -136,13 +145,14 @@ CONFIG_FREEZER=y | |||
| 136 | # CONFIG_ARCH_VERSATILE is not set | 145 | # CONFIG_ARCH_VERSATILE is not set |
| 137 | # CONFIG_ARCH_AT91 is not set | 146 | # CONFIG_ARCH_AT91 is not set |
| 138 | # CONFIG_ARCH_CLPS711X is not set | 147 | # CONFIG_ARCH_CLPS711X is not set |
| 148 | # CONFIG_ARCH_GEMINI is not set | ||
| 139 | # CONFIG_ARCH_EBSA110 is not set | 149 | # CONFIG_ARCH_EBSA110 is not set |
| 140 | # CONFIG_ARCH_EP93XX is not set | 150 | # CONFIG_ARCH_EP93XX is not set |
| 141 | # CONFIG_ARCH_GEMINI is not set | ||
| 142 | # CONFIG_ARCH_FOOTBRIDGE is not set | 151 | # CONFIG_ARCH_FOOTBRIDGE is not set |
| 152 | CONFIG_ARCH_MXC=y | ||
| 153 | # CONFIG_ARCH_STMP3XXX is not set | ||
| 143 | # CONFIG_ARCH_NETX is not set | 154 | # CONFIG_ARCH_NETX is not set |
| 144 | # CONFIG_ARCH_H720X is not set | 155 | # CONFIG_ARCH_H720X is not set |
| 145 | # CONFIG_ARCH_IMX is not set | ||
| 146 | # CONFIG_ARCH_IOP13XX is not set | 156 | # CONFIG_ARCH_IOP13XX is not set |
| 147 | # CONFIG_ARCH_IOP32X is not set | 157 | # CONFIG_ARCH_IOP32X is not set |
| 148 | # CONFIG_ARCH_IOP33X is not set | 158 | # CONFIG_ARCH_IOP33X is not set |
| @@ -151,25 +161,25 @@ CONFIG_FREEZER=y | |||
| 151 | # CONFIG_ARCH_IXP4XX is not set | 161 | # CONFIG_ARCH_IXP4XX is not set |
| 152 | # CONFIG_ARCH_L7200 is not set | 162 | # CONFIG_ARCH_L7200 is not set |
| 153 | # CONFIG_ARCH_KIRKWOOD is not set | 163 | # CONFIG_ARCH_KIRKWOOD is not set |
| 154 | # CONFIG_ARCH_KS8695 is not set | ||
| 155 | # CONFIG_ARCH_NS9XXX is not set | ||
| 156 | # CONFIG_ARCH_LOKI is not set | 164 | # CONFIG_ARCH_LOKI is not set |
| 157 | # CONFIG_ARCH_MV78XX0 is not set | 165 | # CONFIG_ARCH_MV78XX0 is not set |
| 158 | CONFIG_ARCH_MXC=y | ||
| 159 | # CONFIG_ARCH_ORION5X is not set | 166 | # CONFIG_ARCH_ORION5X is not set |
| 167 | # CONFIG_ARCH_MMP is not set | ||
| 168 | # CONFIG_ARCH_KS8695 is not set | ||
| 169 | # CONFIG_ARCH_NS9XXX is not set | ||
| 170 | # CONFIG_ARCH_W90X900 is not set | ||
| 160 | # CONFIG_ARCH_PNX4008 is not set | 171 | # CONFIG_ARCH_PNX4008 is not set |
| 161 | # CONFIG_ARCH_PXA is not set | 172 | # CONFIG_ARCH_PXA is not set |
| 162 | # CONFIG_ARCH_MMP is not set | 173 | # CONFIG_ARCH_MSM is not set |
| 163 | # CONFIG_ARCH_RPC is not set | 174 | # CONFIG_ARCH_RPC is not set |
| 164 | # CONFIG_ARCH_SA1100 is not set | 175 | # CONFIG_ARCH_SA1100 is not set |
| 165 | # CONFIG_ARCH_S3C2410 is not set | 176 | # CONFIG_ARCH_S3C2410 is not set |
| 166 | # CONFIG_ARCH_S3C64XX is not set | 177 | # CONFIG_ARCH_S3C64XX is not set |
| 167 | # CONFIG_ARCH_SHARK is not set | 178 | # CONFIG_ARCH_SHARK is not set |
| 168 | # CONFIG_ARCH_LH7A40X is not set | 179 | # CONFIG_ARCH_LH7A40X is not set |
| 180 | # CONFIG_ARCH_U300 is not set | ||
| 169 | # CONFIG_ARCH_DAVINCI is not set | 181 | # CONFIG_ARCH_DAVINCI is not set |
| 170 | # CONFIG_ARCH_OMAP is not set | 182 | # CONFIG_ARCH_OMAP is not set |
| 171 | # CONFIG_ARCH_MSM is not set | ||
| 172 | # CONFIG_ARCH_W90X900 is not set | ||
| 173 | 183 | ||
| 174 | # | 184 | # |
| 175 | # Freescale MXC Implementations | 185 | # Freescale MXC Implementations |
| @@ -178,6 +188,7 @@ CONFIG_ARCH_MXC=y | |||
| 178 | # CONFIG_ARCH_MX2 is not set | 188 | # CONFIG_ARCH_MX2 is not set |
| 179 | CONFIG_ARCH_MX3=y | 189 | CONFIG_ARCH_MX3=y |
| 180 | CONFIG_ARCH_MX31=y | 190 | CONFIG_ARCH_MX31=y |
| 191 | CONFIG_ARCH_MX35=y | ||
| 181 | 192 | ||
| 182 | # | 193 | # |
| 183 | # MX3 platforms: | 194 | # MX3 platforms: |
| @@ -185,12 +196,19 @@ CONFIG_ARCH_MX31=y | |||
| 185 | CONFIG_MACH_MX31ADS=y | 196 | CONFIG_MACH_MX31ADS=y |
| 186 | CONFIG_MACH_MX31ADS_WM1133_EV1=y | 197 | CONFIG_MACH_MX31ADS_WM1133_EV1=y |
| 187 | CONFIG_MACH_PCM037=y | 198 | CONFIG_MACH_PCM037=y |
| 199 | CONFIG_MACH_PCM037_EET=y | ||
| 188 | CONFIG_MACH_MX31LITE=y | 200 | CONFIG_MACH_MX31LITE=y |
| 189 | CONFIG_MACH_MX31_3DS=y | 201 | CONFIG_MACH_MX31_3DS=y |
| 190 | CONFIG_MACH_MX31MOBOARD=y | 202 | CONFIG_MACH_MX31MOBOARD=y |
| 203 | CONFIG_MACH_MX31LILLY=y | ||
| 191 | CONFIG_MACH_QONG=y | 204 | CONFIG_MACH_QONG=y |
| 205 | CONFIG_MACH_PCM043=y | ||
| 206 | CONFIG_MACH_ARMADILLO5X0=y | ||
| 207 | CONFIG_MACH_MX35_3DS=y | ||
| 192 | CONFIG_MXC_IRQ_PRIOR=y | 208 | CONFIG_MXC_IRQ_PRIOR=y |
| 193 | CONFIG_MXC_PWM=y | 209 | CONFIG_MXC_PWM=y |
| 210 | CONFIG_ARCH_HAS_RNGA=y | ||
| 211 | CONFIG_ARCH_MXC_IOMUX_V3=y | ||
| 194 | 212 | ||
| 195 | # | 213 | # |
| 196 | # Processor Type | 214 | # Processor Type |
| @@ -218,6 +236,7 @@ CONFIG_ARM_THUMB=y | |||
| 218 | # CONFIG_CPU_BPREDICT_DISABLE is not set | 236 | # CONFIG_CPU_BPREDICT_DISABLE is not set |
| 219 | CONFIG_OUTER_CACHE=y | 237 | CONFIG_OUTER_CACHE=y |
| 220 | CONFIG_CACHE_L2X0=y | 238 | CONFIG_CACHE_L2X0=y |
| 239 | # CONFIG_ARM_ERRATA_411920 is not set | ||
| 221 | CONFIG_COMMON_CLKDEV=y | 240 | CONFIG_COMMON_CLKDEV=y |
| 222 | 241 | ||
| 223 | # | 242 | # |
| @@ -242,7 +261,6 @@ CONFIG_PREEMPT=y | |||
| 242 | CONFIG_HZ=100 | 261 | CONFIG_HZ=100 |
| 243 | CONFIG_AEABI=y | 262 | CONFIG_AEABI=y |
| 244 | CONFIG_OABI_COMPAT=y | 263 | CONFIG_OABI_COMPAT=y |
| 245 | CONFIG_ARCH_FLATMEM_HAS_HOLES=y | ||
| 246 | # CONFIG_ARCH_SPARSEMEM_DEFAULT is not set | 264 | # CONFIG_ARCH_SPARSEMEM_DEFAULT is not set |
| 247 | # CONFIG_ARCH_SELECT_MEMORY_MODEL is not set | 265 | # CONFIG_ARCH_SELECT_MEMORY_MODEL is not set |
| 248 | # CONFIG_HIGHMEM is not set | 266 | # CONFIG_HIGHMEM is not set |
| @@ -257,10 +275,11 @@ CONFIG_SPLIT_PTLOCK_CPUS=4 | |||
| 257 | # CONFIG_PHYS_ADDR_T_64BIT is not set | 275 | # CONFIG_PHYS_ADDR_T_64BIT is not set |
| 258 | CONFIG_ZONE_DMA_FLAG=0 | 276 | CONFIG_ZONE_DMA_FLAG=0 |
| 259 | CONFIG_VIRT_TO_BUS=y | 277 | CONFIG_VIRT_TO_BUS=y |
| 260 | CONFIG_UNEVICTABLE_LRU=y | ||
| 261 | CONFIG_HAVE_MLOCK=y | 278 | CONFIG_HAVE_MLOCK=y |
| 262 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y | 279 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y |
| 280 | CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 | ||
| 263 | CONFIG_ALIGNMENT_TRAP=y | 281 | CONFIG_ALIGNMENT_TRAP=y |
| 282 | # CONFIG_UACCESS_WITH_MEMCPY is not set | ||
| 264 | 283 | ||
| 265 | # | 284 | # |
| 266 | # Boot options | 285 | # Boot options |
| @@ -362,6 +381,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
| 362 | # CONFIG_ECONET is not set | 381 | # CONFIG_ECONET is not set |
| 363 | # CONFIG_WAN_ROUTER is not set | 382 | # CONFIG_WAN_ROUTER is not set |
| 364 | # CONFIG_PHONET is not set | 383 | # CONFIG_PHONET is not set |
| 384 | # CONFIG_IEEE802154 is not set | ||
| 365 | # CONFIG_NET_SCHED is not set | 385 | # CONFIG_NET_SCHED is not set |
| 366 | # CONFIG_DCB is not set | 386 | # CONFIG_DCB is not set |
| 367 | 387 | ||
| @@ -465,7 +485,16 @@ CONFIG_MTD_PHYSMAP=y | |||
| 465 | # CONFIG_MTD_DOC2000 is not set | 485 | # CONFIG_MTD_DOC2000 is not set |
| 466 | # CONFIG_MTD_DOC2001 is not set | 486 | # CONFIG_MTD_DOC2001 is not set |
| 467 | # CONFIG_MTD_DOC2001PLUS is not set | 487 | # CONFIG_MTD_DOC2001PLUS is not set |
| 468 | # CONFIG_MTD_NAND is not set | 488 | CONFIG_MTD_NAND=y |
| 489 | # CONFIG_MTD_NAND_VERIFY_WRITE is not set | ||
| 490 | # CONFIG_MTD_NAND_ECC_SMC is not set | ||
| 491 | # CONFIG_MTD_NAND_MUSEUM_IDS is not set | ||
| 492 | # CONFIG_MTD_NAND_GPIO is not set | ||
| 493 | CONFIG_MTD_NAND_IDS=y | ||
| 494 | # CONFIG_MTD_NAND_DISKONCHIP is not set | ||
| 495 | # CONFIG_MTD_NAND_NANDSIM is not set | ||
| 496 | # CONFIG_MTD_NAND_PLATFORM is not set | ||
| 497 | CONFIG_MTD_NAND_MXC=y | ||
| 469 | # CONFIG_MTD_ONENAND is not set | 498 | # CONFIG_MTD_ONENAND is not set |
| 470 | 499 | ||
| 471 | # | 500 | # |
| @@ -476,10 +505,30 @@ CONFIG_MTD_PHYSMAP=y | |||
| 476 | # | 505 | # |
| 477 | # UBI - Unsorted block images | 506 | # UBI - Unsorted block images |
| 478 | # | 507 | # |
| 479 | # CONFIG_MTD_UBI is not set | 508 | CONFIG_MTD_UBI=y |
| 509 | CONFIG_MTD_UBI_WL_THRESHOLD=4096 | ||
| 510 | CONFIG_MTD_UBI_BEB_RESERVE=1 | ||
| 511 | # CONFIG_MTD_UBI_GLUEBI is not set | ||
| 512 | |||
| 513 | # | ||
| 514 | # UBI debugging options | ||
| 515 | # | ||
| 516 | # CONFIG_MTD_UBI_DEBUG is not set | ||
| 480 | # CONFIG_PARPORT is not set | 517 | # CONFIG_PARPORT is not set |
| 481 | # CONFIG_BLK_DEV is not set | 518 | # CONFIG_BLK_DEV is not set |
| 482 | # CONFIG_MISC_DEVICES is not set | 519 | CONFIG_MISC_DEVICES=y |
| 520 | # CONFIG_ICS932S401 is not set | ||
| 521 | # CONFIG_ENCLOSURE_SERVICES is not set | ||
| 522 | # CONFIG_ISL29003 is not set | ||
| 523 | # CONFIG_C2PORT is not set | ||
| 524 | |||
| 525 | # | ||
| 526 | # EEPROM support | ||
| 527 | # | ||
| 528 | CONFIG_EEPROM_AT24=y | ||
| 529 | # CONFIG_EEPROM_LEGACY is not set | ||
| 530 | # CONFIG_EEPROM_MAX6875 is not set | ||
| 531 | # CONFIG_EEPROM_93CX6 is not set | ||
| 483 | CONFIG_HAVE_IDE=y | 532 | CONFIG_HAVE_IDE=y |
| 484 | # CONFIG_IDE is not set | 533 | # CONFIG_IDE is not set |
| 485 | 534 | ||
| @@ -493,7 +542,6 @@ CONFIG_HAVE_IDE=y | |||
| 493 | # CONFIG_ATA is not set | 542 | # CONFIG_ATA is not set |
| 494 | # CONFIG_MD is not set | 543 | # CONFIG_MD is not set |
| 495 | CONFIG_NETDEVICES=y | 544 | CONFIG_NETDEVICES=y |
| 496 | CONFIG_COMPAT_NET_DEV_OPS=y | ||
| 497 | # CONFIG_DUMMY is not set | 545 | # CONFIG_DUMMY is not set |
| 498 | # CONFIG_BONDING is not set | 546 | # CONFIG_BONDING is not set |
| 499 | # CONFIG_MACVLAN is not set | 547 | # CONFIG_MACVLAN is not set |
| @@ -528,7 +576,7 @@ CONFIG_MII=y | |||
| 528 | # CONFIG_ETHOC is not set | 576 | # CONFIG_ETHOC is not set |
| 529 | # CONFIG_SMC911X is not set | 577 | # CONFIG_SMC911X is not set |
| 530 | CONFIG_SMSC911X=y | 578 | CONFIG_SMSC911X=y |
| 531 | # CONFIG_DNET is not set | 579 | CONFIG_DNET=y |
| 532 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | 580 | # CONFIG_IBM_NEW_EMAC_ZMII is not set |
| 533 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | 581 | # CONFIG_IBM_NEW_EMAC_RGMII is not set |
| 534 | # CONFIG_IBM_NEW_EMAC_TAH is not set | 582 | # CONFIG_IBM_NEW_EMAC_TAH is not set |
| @@ -537,8 +585,10 @@ CONFIG_SMSC911X=y | |||
| 537 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | 585 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set |
| 538 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | 586 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set |
| 539 | # CONFIG_B44 is not set | 587 | # CONFIG_B44 is not set |
| 540 | CONFIG_CS89x0=y | 588 | # CONFIG_CS89x0 is not set |
| 541 | CONFIG_CS89x0_NONISA_IRQ=y | 589 | # CONFIG_KS8842 is not set |
| 590 | CONFIG_FEC=y | ||
| 591 | # CONFIG_FEC2 is not set | ||
| 542 | # CONFIG_NETDEV_1000 is not set | 592 | # CONFIG_NETDEV_1000 is not set |
| 543 | # CONFIG_NETDEV_10000 is not set | 593 | # CONFIG_NETDEV_10000 is not set |
| 544 | 594 | ||
| @@ -609,6 +659,7 @@ CONFIG_I2C_HELPER_AUTO=y | |||
| 609 | # | 659 | # |
| 610 | # I2C system bus drivers (mostly embedded / system-on-chip) | 660 | # I2C system bus drivers (mostly embedded / system-on-chip) |
| 611 | # | 661 | # |
| 662 | # CONFIG_I2C_DESIGNWARE is not set | ||
| 612 | # CONFIG_I2C_GPIO is not set | 663 | # CONFIG_I2C_GPIO is not set |
| 613 | CONFIG_I2C_IMX=y | 664 | CONFIG_I2C_IMX=y |
| 614 | # CONFIG_I2C_OCORES is not set | 665 | # CONFIG_I2C_OCORES is not set |
| @@ -633,7 +684,6 @@ CONFIG_I2C_IMX=y | |||
| 633 | # CONFIG_SENSORS_PCF8574 is not set | 684 | # CONFIG_SENSORS_PCF8574 is not set |
| 634 | # CONFIG_PCF8575 is not set | 685 | # CONFIG_PCF8575 is not set |
| 635 | # CONFIG_SENSORS_PCA9539 is not set | 686 | # CONFIG_SENSORS_PCA9539 is not set |
| 636 | # CONFIG_SENSORS_MAX6875 is not set | ||
| 637 | # CONFIG_SENSORS_TSL2550 is not set | 687 | # CONFIG_SENSORS_TSL2550 is not set |
| 638 | # CONFIG_I2C_DEBUG_CORE is not set | 688 | # CONFIG_I2C_DEBUG_CORE is not set |
| 639 | # CONFIG_I2C_DEBUG_ALGO is not set | 689 | # CONFIG_I2C_DEBUG_ALGO is not set |
| @@ -669,6 +719,7 @@ CONFIG_W1=y | |||
| 669 | # | 719 | # |
| 670 | # CONFIG_W1_MASTER_DS2482 is not set | 720 | # CONFIG_W1_MASTER_DS2482 is not set |
| 671 | CONFIG_W1_MASTER_MXC=y | 721 | CONFIG_W1_MASTER_MXC=y |
| 722 | # CONFIG_W1_MASTER_DS1WM is not set | ||
| 672 | # CONFIG_W1_MASTER_GPIO is not set | 723 | # CONFIG_W1_MASTER_GPIO is not set |
| 673 | 724 | ||
| 674 | # | 725 | # |
| @@ -703,6 +754,8 @@ CONFIG_SSB_POSSIBLE=y | |||
| 703 | # CONFIG_TPS65010 is not set | 754 | # CONFIG_TPS65010 is not set |
| 704 | # CONFIG_TWL4030_CORE is not set | 755 | # CONFIG_TWL4030_CORE is not set |
| 705 | # CONFIG_MFD_TMIO is not set | 756 | # CONFIG_MFD_TMIO is not set |
| 757 | # CONFIG_MFD_T7L66XB is not set | ||
| 758 | # CONFIG_MFD_TC6387XB is not set | ||
| 706 | # CONFIG_MFD_TC6393XB is not set | 759 | # CONFIG_MFD_TC6393XB is not set |
| 707 | # CONFIG_PMIC_DA903X is not set | 760 | # CONFIG_PMIC_DA903X is not set |
| 708 | # CONFIG_MFD_WM8400 is not set | 761 | # CONFIG_MFD_WM8400 is not set |
| @@ -711,10 +764,8 @@ CONFIG_MFD_WM8350_CONFIG_MODE_0=y | |||
| 711 | CONFIG_MFD_WM8352_CONFIG_MODE_0=y | 764 | CONFIG_MFD_WM8352_CONFIG_MODE_0=y |
| 712 | CONFIG_MFD_WM8350_I2C=y | 765 | CONFIG_MFD_WM8350_I2C=y |
| 713 | # CONFIG_MFD_PCF50633 is not set | 766 | # CONFIG_MFD_PCF50633 is not set |
| 714 | 767 | # CONFIG_AB3100_CORE is not set | |
| 715 | # | 768 | CONFIG_MEDIA_SUPPORT=y |
| 716 | # Multimedia devices | ||
| 717 | # | ||
| 718 | 769 | ||
| 719 | # | 770 | # |
| 720 | # Multimedia core support | 771 | # Multimedia core support |
| @@ -758,8 +809,10 @@ CONFIG_SOC_CAMERA_MT9T031=y | |||
| 758 | CONFIG_SOC_CAMERA_MT9V022=y | 809 | CONFIG_SOC_CAMERA_MT9V022=y |
| 759 | CONFIG_SOC_CAMERA_TW9910=y | 810 | CONFIG_SOC_CAMERA_TW9910=y |
| 760 | # CONFIG_SOC_CAMERA_PLATFORM is not set | 811 | # CONFIG_SOC_CAMERA_PLATFORM is not set |
| 761 | # CONFIG_SOC_CAMERA_OV772X is not set | 812 | CONFIG_SOC_CAMERA_OV772X=y |
| 813 | CONFIG_MX3_VIDEO=y | ||
| 762 | CONFIG_VIDEO_MX3=y | 814 | CONFIG_VIDEO_MX3=y |
| 815 | # CONFIG_VIDEO_SH_MOBILE_CEU is not set | ||
| 763 | # CONFIG_RADIO_ADAPTERS is not set | 816 | # CONFIG_RADIO_ADAPTERS is not set |
| 764 | # CONFIG_DAB is not set | 817 | # CONFIG_DAB is not set |
| 765 | 818 | ||
| @@ -847,8 +900,11 @@ CONFIG_REGULATOR=y | |||
| 847 | # CONFIG_REGULATOR_DEBUG is not set | 900 | # CONFIG_REGULATOR_DEBUG is not set |
| 848 | # CONFIG_REGULATOR_FIXED_VOLTAGE is not set | 901 | # CONFIG_REGULATOR_FIXED_VOLTAGE is not set |
| 849 | # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set | 902 | # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set |
| 903 | # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set | ||
| 850 | # CONFIG_REGULATOR_BQ24022 is not set | 904 | # CONFIG_REGULATOR_BQ24022 is not set |
| 905 | # CONFIG_REGULATOR_MAX1586 is not set | ||
| 851 | CONFIG_REGULATOR_WM8350=y | 906 | CONFIG_REGULATOR_WM8350=y |
| 907 | # CONFIG_REGULATOR_LP3971 is not set | ||
| 852 | # CONFIG_UIO is not set | 908 | # CONFIG_UIO is not set |
| 853 | # CONFIG_STAGING is not set | 909 | # CONFIG_STAGING is not set |
| 854 | 910 | ||
| @@ -861,10 +917,12 @@ CONFIG_REGULATOR_WM8350=y | |||
| 861 | # CONFIG_REISERFS_FS is not set | 917 | # CONFIG_REISERFS_FS is not set |
| 862 | # CONFIG_JFS_FS is not set | 918 | # CONFIG_JFS_FS is not set |
| 863 | # CONFIG_FS_POSIX_ACL is not set | 919 | # CONFIG_FS_POSIX_ACL is not set |
| 864 | CONFIG_FILE_LOCKING=y | ||
| 865 | # CONFIG_XFS_FS is not set | 920 | # CONFIG_XFS_FS is not set |
| 921 | # CONFIG_GFS2_FS is not set | ||
| 866 | # CONFIG_OCFS2_FS is not set | 922 | # CONFIG_OCFS2_FS is not set |
| 867 | # CONFIG_BTRFS_FS is not set | 923 | # CONFIG_BTRFS_FS is not set |
| 924 | CONFIG_FILE_LOCKING=y | ||
| 925 | CONFIG_FSNOTIFY=y | ||
| 868 | # CONFIG_DNOTIFY is not set | 926 | # CONFIG_DNOTIFY is not set |
| 869 | CONFIG_INOTIFY=y | 927 | CONFIG_INOTIFY=y |
| 870 | CONFIG_INOTIFY_USER=y | 928 | CONFIG_INOTIFY_USER=y |
| @@ -921,6 +979,12 @@ CONFIG_JFFS2_ZLIB=y | |||
| 921 | # CONFIG_JFFS2_LZO is not set | 979 | # CONFIG_JFFS2_LZO is not set |
| 922 | CONFIG_JFFS2_RTIME=y | 980 | CONFIG_JFFS2_RTIME=y |
| 923 | # CONFIG_JFFS2_RUBIN is not set | 981 | # CONFIG_JFFS2_RUBIN is not set |
| 982 | CONFIG_UBIFS_FS=y | ||
| 983 | # CONFIG_UBIFS_FS_XATTR is not set | ||
| 984 | # CONFIG_UBIFS_FS_ADVANCED_COMPR is not set | ||
| 985 | CONFIG_UBIFS_FS_LZO=y | ||
| 986 | CONFIG_UBIFS_FS_ZLIB=y | ||
| 987 | # CONFIG_UBIFS_FS_DEBUG is not set | ||
| 924 | # CONFIG_CRAMFS is not set | 988 | # CONFIG_CRAMFS is not set |
| 925 | # CONFIG_SQUASHFS is not set | 989 | # CONFIG_SQUASHFS is not set |
| 926 | # CONFIG_VXFS_FS is not set | 990 | # CONFIG_VXFS_FS is not set |
| @@ -937,6 +1001,7 @@ CONFIG_NFS_FS=y | |||
| 937 | CONFIG_NFS_V3=y | 1001 | CONFIG_NFS_V3=y |
| 938 | # CONFIG_NFS_V3_ACL is not set | 1002 | # CONFIG_NFS_V3_ACL is not set |
| 939 | CONFIG_NFS_V4=y | 1003 | CONFIG_NFS_V4=y |
| 1004 | # CONFIG_NFS_V4_1 is not set | ||
| 940 | CONFIG_ROOT_NFS=y | 1005 | CONFIG_ROOT_NFS=y |
| 941 | # CONFIG_NFSD is not set | 1006 | # CONFIG_NFSD is not set |
| 942 | CONFIG_LOCKD=y | 1007 | CONFIG_LOCKD=y |
| @@ -979,22 +1044,7 @@ CONFIG_FRAME_WARN=1024 | |||
| 979 | CONFIG_SYSCTL_SYSCALL_CHECK=y | 1044 | CONFIG_SYSCTL_SYSCALL_CHECK=y |
| 980 | CONFIG_HAVE_FUNCTION_TRACER=y | 1045 | CONFIG_HAVE_FUNCTION_TRACER=y |
| 981 | CONFIG_TRACING_SUPPORT=y | 1046 | CONFIG_TRACING_SUPPORT=y |
| 982 | 1047 | # CONFIG_FTRACE is not set | |
| 983 | # | ||
| 984 | # Tracers | ||
| 985 | # | ||
| 986 | # CONFIG_FUNCTION_TRACER is not set | ||
| 987 | # CONFIG_IRQSOFF_TRACER is not set | ||
| 988 | # CONFIG_PREEMPT_TRACER is not set | ||
| 989 | # CONFIG_SCHED_TRACER is not set | ||
| 990 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | ||
| 991 | # CONFIG_EVENT_TRACER is not set | ||
| 992 | # CONFIG_BOOT_TRACER is not set | ||
| 993 | # CONFIG_TRACE_BRANCH_PROFILING is not set | ||
| 994 | # CONFIG_STACK_TRACER is not set | ||
| 995 | # CONFIG_KMEMTRACE is not set | ||
| 996 | # CONFIG_WORKQUEUE_TRACER is not set | ||
| 997 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
| 998 | # CONFIG_SAMPLES is not set | 1048 | # CONFIG_SAMPLES is not set |
| 999 | CONFIG_HAVE_ARCH_KGDB=y | 1049 | CONFIG_HAVE_ARCH_KGDB=y |
| 1000 | CONFIG_ARM_UNWIND=y | 1050 | CONFIG_ARM_UNWIND=y |
| @@ -1094,9 +1144,9 @@ CONFIG_CRYPTO_DES=y | |||
| 1094 | # | 1144 | # |
| 1095 | # Compression | 1145 | # Compression |
| 1096 | # | 1146 | # |
| 1097 | # CONFIG_CRYPTO_DEFLATE is not set | 1147 | CONFIG_CRYPTO_DEFLATE=y |
| 1098 | # CONFIG_CRYPTO_ZLIB is not set | 1148 | # CONFIG_CRYPTO_ZLIB is not set |
| 1099 | # CONFIG_CRYPTO_LZO is not set | 1149 | CONFIG_CRYPTO_LZO=y |
| 1100 | 1150 | ||
| 1101 | # | 1151 | # |
| 1102 | # Random Number Generation | 1152 | # Random Number Generation |
| @@ -1109,9 +1159,10 @@ CONFIG_CRYPTO_HW=y | |||
| 1109 | # Library routines | 1159 | # Library routines |
| 1110 | # | 1160 | # |
| 1111 | CONFIG_BITREVERSE=y | 1161 | CONFIG_BITREVERSE=y |
| 1162 | CONFIG_RATIONAL=y | ||
| 1112 | CONFIG_GENERIC_FIND_LAST_BIT=y | 1163 | CONFIG_GENERIC_FIND_LAST_BIT=y |
| 1113 | # CONFIG_CRC_CCITT is not set | 1164 | # CONFIG_CRC_CCITT is not set |
| 1114 | # CONFIG_CRC16 is not set | 1165 | CONFIG_CRC16=y |
| 1115 | # CONFIG_CRC_T10DIF is not set | 1166 | # CONFIG_CRC_T10DIF is not set |
| 1116 | # CONFIG_CRC_ITU_T is not set | 1167 | # CONFIG_CRC_ITU_T is not set |
| 1117 | CONFIG_CRC32=y | 1168 | CONFIG_CRC32=y |
| @@ -1119,6 +1170,8 @@ CONFIG_CRC32=y | |||
| 1119 | # CONFIG_LIBCRC32C is not set | 1170 | # CONFIG_LIBCRC32C is not set |
| 1120 | CONFIG_ZLIB_INFLATE=y | 1171 | CONFIG_ZLIB_INFLATE=y |
| 1121 | CONFIG_ZLIB_DEFLATE=y | 1172 | CONFIG_ZLIB_DEFLATE=y |
| 1173 | CONFIG_LZO_COMPRESS=y | ||
| 1174 | CONFIG_LZO_DECOMPRESS=y | ||
| 1122 | CONFIG_HAS_IOMEM=y | 1175 | CONFIG_HAS_IOMEM=y |
| 1123 | CONFIG_HAS_IOPORT=y | 1176 | CONFIG_HAS_IOPORT=y |
| 1124 | CONFIG_HAS_DMA=y | 1177 | CONFIG_HAS_DMA=y |
diff --git a/arch/arm/configs/omap3_evm_defconfig b/arch/arm/configs/omap3_evm_defconfig index 28be17fbc157..d5ff4776cd0a 100644 --- a/arch/arm/configs/omap3_evm_defconfig +++ b/arch/arm/configs/omap3_evm_defconfig | |||
| @@ -1107,7 +1107,7 @@ CONFIG_USB_ZERO=m | |||
| 1107 | CONFIG_USB_OTG_UTILS=y | 1107 | CONFIG_USB_OTG_UTILS=y |
| 1108 | # CONFIG_USB_GPIO_VBUS is not set | 1108 | # CONFIG_USB_GPIO_VBUS is not set |
| 1109 | # CONFIG_ISP1301_OMAP is not set | 1109 | # CONFIG_ISP1301_OMAP is not set |
| 1110 | CONFIG_TWL4030_USB=y | 1110 | # CONFIG_TWL4030_USB is not set |
| 1111 | # CONFIG_NOP_USB_XCEIV is not set | 1111 | # CONFIG_NOP_USB_XCEIV is not set |
| 1112 | CONFIG_MMC=y | 1112 | CONFIG_MMC=y |
| 1113 | # CONFIG_MMC_DEBUG is not set | 1113 | # CONFIG_MMC_DEBUG is not set |
diff --git a/arch/arm/include/asm/atomic.h b/arch/arm/include/asm/atomic.h index 9e07fe507029..9ed2377fe8e5 100644 --- a/arch/arm/include/asm/atomic.h +++ b/arch/arm/include/asm/atomic.h | |||
| @@ -159,8 +159,6 @@ static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr) | |||
| 159 | 159 | ||
| 160 | #else /* ARM_ARCH_6 */ | 160 | #else /* ARM_ARCH_6 */ |
| 161 | 161 | ||
| 162 | #include <asm/system.h> | ||
| 163 | |||
| 164 | #ifdef CONFIG_SMP | 162 | #ifdef CONFIG_SMP |
| 165 | #error SMP not supported on pre-ARMv6 CPUs | 163 | #error SMP not supported on pre-ARMv6 CPUs |
| 166 | #endif | 164 | #endif |
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 366e5097a41a..8c3de1a350b5 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S | |||
| @@ -148,7 +148,7 @@ trace: | |||
| 148 | sub r0, r0, #MCOUNT_INSN_SIZE | 148 | sub r0, r0, #MCOUNT_INSN_SIZE |
| 149 | mov lr, pc | 149 | mov lr, pc |
| 150 | mov pc, r2 | 150 | mov pc, r2 |
| 151 | mov lr, r1 @ restore lr | 151 | ldr lr, [fp, #-4] @ restore lr |
| 152 | ldmia sp!, {r0-r3, pc} | 152 | ldmia sp!, {r0-r3, pc} |
| 153 | 153 | ||
| 154 | #endif /* CONFIG_DYNAMIC_FTRACE */ | 154 | #endif /* CONFIG_DYNAMIC_FTRACE */ |
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 93bb4247b7ed..f6bc5d442782 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c | |||
| @@ -133,7 +133,7 @@ sys_sigaction(int sig, const struct old_sigaction __user *act, | |||
| 133 | } | 133 | } |
| 134 | 134 | ||
| 135 | #ifdef CONFIG_CRUNCH | 135 | #ifdef CONFIG_CRUNCH |
| 136 | static int preserve_crunch_context(struct crunch_sigframe *frame) | 136 | static int preserve_crunch_context(struct crunch_sigframe __user *frame) |
| 137 | { | 137 | { |
| 138 | char kbuf[sizeof(*frame) + 8]; | 138 | char kbuf[sizeof(*frame) + 8]; |
| 139 | struct crunch_sigframe *kframe; | 139 | struct crunch_sigframe *kframe; |
| @@ -146,7 +146,7 @@ static int preserve_crunch_context(struct crunch_sigframe *frame) | |||
| 146 | return __copy_to_user(frame, kframe, sizeof(*frame)); | 146 | return __copy_to_user(frame, kframe, sizeof(*frame)); |
| 147 | } | 147 | } |
| 148 | 148 | ||
| 149 | static int restore_crunch_context(struct crunch_sigframe *frame) | 149 | static int restore_crunch_context(struct crunch_sigframe __user *frame) |
| 150 | { | 150 | { |
| 151 | char kbuf[sizeof(*frame) + 8]; | 151 | char kbuf[sizeof(*frame) + 8]; |
| 152 | struct crunch_sigframe *kframe; | 152 | struct crunch_sigframe *kframe; |
diff --git a/arch/arm/mach-davinci/board-dm355-evm.c b/arch/arm/mach-davinci/board-dm355-evm.c index 5ac2f565d860..d6ab64ccd496 100644 --- a/arch/arm/mach-davinci/board-dm355-evm.c +++ b/arch/arm/mach-davinci/board-dm355-evm.c | |||
| @@ -37,7 +37,6 @@ | |||
| 37 | #include <mach/serial.h> | 37 | #include <mach/serial.h> |
| 38 | #include <mach/nand.h> | 38 | #include <mach/nand.h> |
| 39 | #include <mach/mmc.h> | 39 | #include <mach/mmc.h> |
| 40 | #include <mach/common.h> | ||
| 41 | 40 | ||
| 42 | #define DAVINCI_ASYNC_EMIF_CONTROL_BASE 0x01e10000 | 41 | #define DAVINCI_ASYNC_EMIF_CONTROL_BASE 0x01e10000 |
| 43 | #define DAVINCI_ASYNC_EMIF_DATA_CE0_BASE 0x02000000 | 42 | #define DAVINCI_ASYNC_EMIF_DATA_CE0_BASE 0x02000000 |
diff --git a/arch/arm/mach-davinci/board-dm355-leopard.c b/arch/arm/mach-davinci/board-dm355-leopard.c index 28c9008df4f4..84ad5d161a87 100644 --- a/arch/arm/mach-davinci/board-dm355-leopard.c +++ b/arch/arm/mach-davinci/board-dm355-leopard.c | |||
| @@ -36,7 +36,6 @@ | |||
| 36 | #include <mach/serial.h> | 36 | #include <mach/serial.h> |
| 37 | #include <mach/nand.h> | 37 | #include <mach/nand.h> |
| 38 | #include <mach/mmc.h> | 38 | #include <mach/mmc.h> |
| 39 | #include <mach/common.h> | ||
| 40 | 39 | ||
| 41 | #define DAVINCI_ASYNC_EMIF_CONTROL_BASE 0x01e10000 | 40 | #define DAVINCI_ASYNC_EMIF_CONTROL_BASE 0x01e10000 |
| 42 | #define DAVINCI_ASYNC_EMIF_DATA_CE0_BASE 0x02000000 | 41 | #define DAVINCI_ASYNC_EMIF_DATA_CE0_BASE 0x02000000 |
diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c b/arch/arm/mach-davinci/board-dm644x-evm.c index d9d40450bdc5..56c8cd01de9a 100644 --- a/arch/arm/mach-davinci/board-dm644x-evm.c +++ b/arch/arm/mach-davinci/board-dm644x-evm.c | |||
| @@ -45,7 +45,6 @@ | |||
| 45 | #include <mach/nand.h> | 45 | #include <mach/nand.h> |
| 46 | #include <mach/mmc.h> | 46 | #include <mach/mmc.h> |
| 47 | #include <mach/emac.h> | 47 | #include <mach/emac.h> |
| 48 | #include <mach/common.h> | ||
| 49 | 48 | ||
| 50 | #define DM644X_EVM_PHY_MASK (0x2) | 49 | #define DM644X_EVM_PHY_MASK (0x2) |
| 51 | #define DM644X_EVM_MDIO_FREQUENCY (2200000) /* PHY bus frequency */ | 50 | #define DM644X_EVM_MDIO_FREQUENCY (2200000) /* PHY bus frequency */ |
diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c b/arch/arm/mach-davinci/board-dm646x-evm.c index e17de6352624..8657e72debc1 100644 --- a/arch/arm/mach-davinci/board-dm646x-evm.c +++ b/arch/arm/mach-davinci/board-dm646x-evm.c | |||
| @@ -47,7 +47,6 @@ | |||
| 47 | #include <mach/i2c.h> | 47 | #include <mach/i2c.h> |
| 48 | #include <mach/mmc.h> | 48 | #include <mach/mmc.h> |
| 49 | #include <mach/emac.h> | 49 | #include <mach/emac.h> |
| 50 | #include <mach/common.h> | ||
| 51 | 50 | ||
| 52 | #define DM646X_EVM_PHY_MASK (0x2) | 51 | #define DM646X_EVM_PHY_MASK (0x2) |
| 53 | #define DM646X_EVM_MDIO_FREQUENCY (2200000) /* PHY bus frequency */ | 52 | #define DM646X_EVM_MDIO_FREQUENCY (2200000) /* PHY bus frequency */ |
diff --git a/arch/arm/mach-davinci/board-sffsdr.c b/arch/arm/mach-davinci/board-sffsdr.c index 748a8e48541e..7acdfd8ac071 100644 --- a/arch/arm/mach-davinci/board-sffsdr.c +++ b/arch/arm/mach-davinci/board-sffsdr.c | |||
| @@ -52,7 +52,6 @@ | |||
| 52 | #include <mach/serial.h> | 52 | #include <mach/serial.h> |
| 53 | #include <mach/psc.h> | 53 | #include <mach/psc.h> |
| 54 | #include <mach/mux.h> | 54 | #include <mach/mux.h> |
| 55 | #include <mach/common.h> | ||
| 56 | 55 | ||
| 57 | #define SFFSDR_PHY_MASK (0x2) | 56 | #define SFFSDR_PHY_MASK (0x2) |
| 58 | #define SFFSDR_MDIO_FREQUENCY (2200000) /* PHY bus frequency */ | 57 | #define SFFSDR_MDIO_FREQUENCY (2200000) /* PHY bus frequency */ |
diff --git a/arch/arm/mach-ep93xx/include/mach/ts72xx.h b/arch/arm/mach-ep93xx/include/mach/ts72xx.h index 34ddec081c40..411734422c1d 100644 --- a/arch/arm/mach-ep93xx/include/mach/ts72xx.h +++ b/arch/arm/mach-ep93xx/include/mach/ts72xx.h | |||
| @@ -41,9 +41,6 @@ | |||
| 41 | #define TS72XX_OPTIONS2_TS9420_BOOT 0x02 | 41 | #define TS72XX_OPTIONS2_TS9420_BOOT 0x02 |
| 42 | 42 | ||
| 43 | 43 | ||
| 44 | #define TS72XX_NOR_PHYS_BASE 0x60000000 | ||
| 45 | #define TS72XX_NOR2_PHYS_BASE 0x62000000 | ||
| 46 | |||
| 47 | #define TS72XX_NAND1_DATA_PHYS_BASE 0x60000000 | 44 | #define TS72XX_NAND1_DATA_PHYS_BASE 0x60000000 |
| 48 | #define TS72XX_NAND2_DATA_PHYS_BASE 0x70000000 | 45 | #define TS72XX_NAND2_DATA_PHYS_BASE 0x70000000 |
| 49 | #define TS72XX_NAND_DATA_VIRT_BASE 0xfebfc000 | 46 | #define TS72XX_NAND_DATA_VIRT_BASE 0xfebfc000 |
diff --git a/arch/arm/mach-ep93xx/ts72xx.c b/arch/arm/mach-ep93xx/ts72xx.c index 7ee024d34829..aaf1371412af 100644 --- a/arch/arm/mach-ep93xx/ts72xx.c +++ b/arch/arm/mach-ep93xx/ts72xx.c | |||
| @@ -112,13 +112,16 @@ static void __init ts72xx_map_io(void) | |||
| 112 | } | 112 | } |
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | /************************************************************************* | ||
| 116 | * NOR flash (TS-7200 only) | ||
| 117 | *************************************************************************/ | ||
| 115 | static struct physmap_flash_data ts72xx_flash_data = { | 118 | static struct physmap_flash_data ts72xx_flash_data = { |
| 116 | .width = 1, | 119 | .width = 2, |
| 117 | }; | 120 | }; |
| 118 | 121 | ||
| 119 | static struct resource ts72xx_flash_resource = { | 122 | static struct resource ts72xx_flash_resource = { |
| 120 | .start = TS72XX_NOR_PHYS_BASE, | 123 | .start = EP93XX_CS6_PHYS_BASE, |
| 121 | .end = TS72XX_NOR_PHYS_BASE + SZ_16M - 1, | 124 | .end = EP93XX_CS6_PHYS_BASE + SZ_16M - 1, |
| 122 | .flags = IORESOURCE_MEM, | 125 | .flags = IORESOURCE_MEM, |
| 123 | }; | 126 | }; |
| 124 | 127 | ||
| @@ -132,6 +135,12 @@ static struct platform_device ts72xx_flash = { | |||
| 132 | .resource = &ts72xx_flash_resource, | 135 | .resource = &ts72xx_flash_resource, |
| 133 | }; | 136 | }; |
| 134 | 137 | ||
| 138 | static void __init ts72xx_register_flash(void) | ||
| 139 | { | ||
| 140 | if (board_is_ts7200()) | ||
| 141 | platform_device_register(&ts72xx_flash); | ||
| 142 | } | ||
| 143 | |||
| 135 | static unsigned char ts72xx_rtc_readbyte(unsigned long addr) | 144 | static unsigned char ts72xx_rtc_readbyte(unsigned long addr) |
| 136 | { | 145 | { |
| 137 | __raw_writeb(addr, TS72XX_RTC_INDEX_VIRT_BASE); | 146 | __raw_writeb(addr, TS72XX_RTC_INDEX_VIRT_BASE); |
| @@ -165,8 +174,7 @@ static struct ep93xx_eth_data ts72xx_eth_data = { | |||
| 165 | static void __init ts72xx_init_machine(void) | 174 | static void __init ts72xx_init_machine(void) |
| 166 | { | 175 | { |
| 167 | ep93xx_init_devices(); | 176 | ep93xx_init_devices(); |
| 168 | if (board_is_ts7200()) | 177 | ts72xx_register_flash(); |
| 169 | platform_device_register(&ts72xx_flash); | ||
| 170 | platform_device_register(&ts72xx_rtc_device); | 178 | platform_device_register(&ts72xx_rtc_device); |
| 171 | 179 | ||
| 172 | ep93xx_register_eth(&ts72xx_eth_data, 1); | 180 | ep93xx_register_eth(&ts72xx_eth_data, 1); |
diff --git a/arch/arm/mach-ks8695/include/mach/hardware.h b/arch/arm/mach-ks8695/include/mach/hardware.h index 1d640d075b7e..e0f911d9e021 100644 --- a/arch/arm/mach-ks8695/include/mach/hardware.h +++ b/arch/arm/mach-ks8695/include/mach/hardware.h | |||
| @@ -17,6 +17,11 @@ | |||
| 17 | #include <asm/sizes.h> | 17 | #include <asm/sizes.h> |
| 18 | 18 | ||
| 19 | /* | 19 | /* |
| 20 | * Clocks are derived from MCLK, which is 25Mhz | ||
| 21 | */ | ||
| 22 | #define KS8695_CLOCK_RATE 25000000 | ||
| 23 | |||
| 24 | /* | ||
| 20 | * Physical RAM address. | 25 | * Physical RAM address. |
| 21 | */ | 26 | */ |
| 22 | #define KS8695_SDRAM_PA 0x00000000 | 27 | #define KS8695_SDRAM_PA 0x00000000 |
diff --git a/arch/arm/mach-ks8695/include/mach/timex.h b/arch/arm/mach-ks8695/include/mach/timex.h index 4682e350369b..10f716371bd3 100644 --- a/arch/arm/mach-ks8695/include/mach/timex.h +++ b/arch/arm/mach-ks8695/include/mach/timex.h | |||
| @@ -14,7 +14,8 @@ | |||
| 14 | #ifndef __ASM_ARCH_TIMEX_H | 14 | #ifndef __ASM_ARCH_TIMEX_H |
| 15 | #define __ASM_ARCH_TIMEX_H | 15 | #define __ASM_ARCH_TIMEX_H |
| 16 | 16 | ||
| 17 | /* timers are derived from MCLK, which is 25MHz */ | 17 | #include <mach/hardware.h> |
| 18 | #define CLOCK_TICK_RATE 25000000 | 18 | |
| 19 | #define CLOCK_TICK_RATE KS8695_CLOCK_RATE | ||
| 19 | 20 | ||
| 20 | #endif | 21 | #endif |
diff --git a/arch/arm/mach-ks8695/pci.c b/arch/arm/mach-ks8695/pci.c index f5ebcc0fcab9..78499667eb7b 100644 --- a/arch/arm/mach-ks8695/pci.c +++ b/arch/arm/mach-ks8695/pci.c | |||
| @@ -245,6 +245,9 @@ static int ks8695_pci_fault(unsigned long addr, unsigned int fsr, struct pt_regs | |||
| 245 | 245 | ||
| 246 | static void __init ks8695_pci_preinit(void) | 246 | static void __init ks8695_pci_preinit(void) |
| 247 | { | 247 | { |
| 248 | /* make software reset to avoid freeze if PCI bus was messed up */ | ||
| 249 | __raw_writel(0x80000000, KS8695_PCI_VA + KS8695_PBCS); | ||
| 250 | |||
| 248 | /* stage 1 initialization, subid, subdevice = 0x0001 */ | 251 | /* stage 1 initialization, subid, subdevice = 0x0001 */ |
| 249 | __raw_writel(0x00010001, KS8695_PCI_VA + KS8695_CRCSID); | 252 | __raw_writel(0x00010001, KS8695_PCI_VA + KS8695_CRCSID); |
| 250 | 253 | ||
diff --git a/arch/arm/mach-omap1/mcbsp.c b/arch/arm/mach-omap1/mcbsp.c index a2d7814896be..505d98cfe508 100644 --- a/arch/arm/mach-omap1/mcbsp.c +++ b/arch/arm/mach-omap1/mcbsp.c | |||
| @@ -19,7 +19,6 @@ | |||
| 19 | 19 | ||
| 20 | #include <mach/irqs.h> | 20 | #include <mach/irqs.h> |
| 21 | #include <mach/dma.h> | 21 | #include <mach/dma.h> |
| 22 | #include <mach/irqs.h> | ||
| 23 | #include <mach/mux.h> | 22 | #include <mach/mux.h> |
| 24 | #include <mach/cpu.h> | 23 | #include <mach/cpu.h> |
| 25 | #include <mach/mcbsp.h> | 24 | #include <mach/mcbsp.h> |
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index d3cc145814d0..cf3dd771a678 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <linux/spi/spi.h> | 25 | #include <linux/spi/spi.h> |
| 26 | #include <linux/spi/ads7846.h> | 26 | #include <linux/spi/ads7846.h> |
| 27 | #include <linux/i2c/twl4030.h> | 27 | #include <linux/i2c/twl4030.h> |
| 28 | #include <linux/usb/otg.h> | ||
| 28 | 29 | ||
| 29 | #include <mach/hardware.h> | 30 | #include <mach/hardware.h> |
| 30 | #include <asm/mach-types.h> | 31 | #include <asm/mach-types.h> |
| @@ -307,6 +308,10 @@ static void __init omap3_evm_init(void) | |||
| 307 | ARRAY_SIZE(omap3evm_spi_board_info)); | 308 | ARRAY_SIZE(omap3evm_spi_board_info)); |
| 308 | 309 | ||
| 309 | omap_serial_init(); | 310 | omap_serial_init(); |
| 311 | #ifdef CONFIG_NOP_USB_XCEIV | ||
| 312 | /* OMAP3EVM uses ISP1504 phy and so register nop transceiver */ | ||
| 313 | usb_nop_xceiv_register(); | ||
| 314 | #endif | ||
| 310 | usb_musb_init(); | 315 | usb_musb_init(); |
| 311 | ads7846_dev_init(); | 316 | ads7846_dev_init(); |
| 312 | } | 317 | } |
diff --git a/arch/arm/mach-omap2/mcbsp.c b/arch/arm/mach-omap2/mcbsp.c index a5c0f0435cd6..99b6e1546311 100644 --- a/arch/arm/mach-omap2/mcbsp.c +++ b/arch/arm/mach-omap2/mcbsp.c | |||
| @@ -19,7 +19,6 @@ | |||
| 19 | 19 | ||
| 20 | #include <mach/irqs.h> | 20 | #include <mach/irqs.h> |
| 21 | #include <mach/dma.h> | 21 | #include <mach/dma.h> |
| 22 | #include <mach/irqs.h> | ||
| 23 | #include <mach/mux.h> | 22 | #include <mach/mux.h> |
| 24 | #include <mach/cpu.h> | 23 | #include <mach/cpu.h> |
| 25 | #include <mach/mcbsp.h> | 24 | #include <mach/mcbsp.h> |
diff --git a/arch/arm/mach-omap2/usb-musb.c b/arch/arm/mach-omap2/usb-musb.c index d85296dc896c..739e59e8025c 100644 --- a/arch/arm/mach-omap2/usb-musb.c +++ b/arch/arm/mach-omap2/usb-musb.c | |||
| @@ -155,20 +155,6 @@ static struct platform_device musb_device = { | |||
| 155 | .resource = musb_resources, | 155 | .resource = musb_resources, |
| 156 | }; | 156 | }; |
| 157 | 157 | ||
| 158 | #ifdef CONFIG_NOP_USB_XCEIV | ||
| 159 | static u64 nop_xceiv_dmamask = DMA_BIT_MASK(32); | ||
| 160 | |||
| 161 | static struct platform_device nop_xceiv_device = { | ||
| 162 | .name = "nop_usb_xceiv", | ||
| 163 | .id = -1, | ||
| 164 | .dev = { | ||
| 165 | .dma_mask = &nop_xceiv_dmamask, | ||
| 166 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 167 | .platform_data = NULL, | ||
| 168 | }, | ||
| 169 | }; | ||
| 170 | #endif | ||
| 171 | |||
| 172 | void __init usb_musb_init(void) | 158 | void __init usb_musb_init(void) |
| 173 | { | 159 | { |
| 174 | if (cpu_is_omap243x()) | 160 | if (cpu_is_omap243x()) |
| @@ -183,13 +169,6 @@ void __init usb_musb_init(void) | |||
| 183 | */ | 169 | */ |
| 184 | musb_plat.clock = "ick"; | 170 | musb_plat.clock = "ick"; |
| 185 | 171 | ||
| 186 | #ifdef CONFIG_NOP_USB_XCEIV | ||
| 187 | if (platform_device_register(&nop_xceiv_device) < 0) { | ||
| 188 | printk(KERN_ERR "Unable to register NOP-XCEIV device\n"); | ||
| 189 | return; | ||
| 190 | } | ||
| 191 | #endif | ||
| 192 | |||
| 193 | if (platform_device_register(&musb_device) < 0) { | 172 | if (platform_device_register(&musb_device) < 0) { |
| 194 | printk(KERN_ERR "Unable to register HS-USB (MUSB) device\n"); | 173 | printk(KERN_ERR "Unable to register HS-USB (MUSB) device\n"); |
| 195 | return; | 174 | return; |
diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c index 63b10d9bb1d3..9cd09465a0e8 100644 --- a/arch/arm/mach-pxa/em-x270.c +++ b/arch/arm/mach-pxa/em-x270.c | |||
| @@ -1141,12 +1141,16 @@ struct power_supply_info em_x270_psy_info = { | |||
| 1141 | 1141 | ||
| 1142 | static void em_x270_battery_low(void) | 1142 | static void em_x270_battery_low(void) |
| 1143 | { | 1143 | { |
| 1144 | #if defined(CONFIG_APM_EMULATION) | ||
| 1144 | apm_queue_event(APM_LOW_BATTERY); | 1145 | apm_queue_event(APM_LOW_BATTERY); |
| 1146 | #endif | ||
| 1145 | } | 1147 | } |
| 1146 | 1148 | ||
| 1147 | static void em_x270_battery_critical(void) | 1149 | static void em_x270_battery_critical(void) |
| 1148 | { | 1150 | { |
| 1151 | #if defined(CONFIG_APM_EMULATION) | ||
| 1149 | apm_queue_event(APM_CRITICAL_SUSPEND); | 1152 | apm_queue_event(APM_CRITICAL_SUSPEND); |
| 1153 | #endif | ||
| 1150 | } | 1154 | } |
| 1151 | 1155 | ||
| 1152 | struct da9030_battery_info em_x270_batterty_info = { | 1156 | struct da9030_battery_info em_x270_batterty_info = { |
diff --git a/arch/arm/mach-pxa/palmld.c b/arch/arm/mach-pxa/palmld.c index ed70f281dd09..169fcc18154e 100644 --- a/arch/arm/mach-pxa/palmld.c +++ b/arch/arm/mach-pxa/palmld.c | |||
| @@ -128,6 +128,10 @@ static unsigned long palmld_pin_config[] __initdata = { | |||
| 128 | GPIO38_GPIO, /* wifi ready */ | 128 | GPIO38_GPIO, /* wifi ready */ |
| 129 | GPIO81_GPIO, /* wifi reset */ | 129 | GPIO81_GPIO, /* wifi reset */ |
| 130 | 130 | ||
| 131 | /* FFUART */ | ||
| 132 | GPIO34_FFUART_RXD, | ||
| 133 | GPIO39_FFUART_TXD, | ||
| 134 | |||
| 131 | /* HDD */ | 135 | /* HDD */ |
| 132 | GPIO98_GPIO, /* HDD reset */ | 136 | GPIO98_GPIO, /* HDD reset */ |
| 133 | GPIO115_GPIO, /* HDD power */ | 137 | GPIO115_GPIO, /* HDD power */ |
diff --git a/arch/arm/mach-pxa/palmt5.c b/arch/arm/mach-pxa/palmt5.c index aae64a12a734..33f726ff55e5 100644 --- a/arch/arm/mach-pxa/palmt5.c +++ b/arch/arm/mach-pxa/palmt5.c | |||
| @@ -111,6 +111,10 @@ static unsigned long palmt5_pin_config[] __initdata = { | |||
| 111 | /* PWM */ | 111 | /* PWM */ |
| 112 | GPIO16_PWM0_OUT, | 112 | GPIO16_PWM0_OUT, |
| 113 | 113 | ||
| 114 | /* FFUART */ | ||
| 115 | GPIO34_FFUART_RXD, | ||
| 116 | GPIO39_FFUART_TXD, | ||
| 117 | |||
| 114 | /* MISC */ | 118 | /* MISC */ |
| 115 | GPIO10_GPIO, /* hotsync button */ | 119 | GPIO10_GPIO, /* hotsync button */ |
| 116 | GPIO90_GPIO, /* power detect */ | 120 | GPIO90_GPIO, /* power detect */ |
diff --git a/arch/arm/mach-pxa/palmtx.c b/arch/arm/mach-pxa/palmtx.c index 6c15d84bde53..83d020879581 100644 --- a/arch/arm/mach-pxa/palmtx.c +++ b/arch/arm/mach-pxa/palmtx.c | |||
| @@ -127,6 +127,10 @@ static unsigned long palmtx_pin_config[] __initdata = { | |||
| 127 | GPIO76_LCD_PCLK, | 127 | GPIO76_LCD_PCLK, |
| 128 | GPIO77_LCD_BIAS, | 128 | GPIO77_LCD_BIAS, |
| 129 | 129 | ||
| 130 | /* FFUART */ | ||
| 131 | GPIO34_FFUART_RXD, | ||
| 132 | GPIO39_FFUART_TXD, | ||
| 133 | |||
| 130 | /* MISC. */ | 134 | /* MISC. */ |
| 131 | GPIO10_GPIO, /* hotsync button */ | 135 | GPIO10_GPIO, /* hotsync button */ |
| 132 | GPIO12_GPIO, /* power detect */ | 136 | GPIO12_GPIO, /* power detect */ |
diff --git a/arch/arm/mach-pxa/treo680.c b/arch/arm/mach-pxa/treo680.c index a06f19edebb3..753ec4df17b9 100644 --- a/arch/arm/mach-pxa/treo680.c +++ b/arch/arm/mach-pxa/treo680.c | |||
| @@ -409,7 +409,7 @@ err1: | |||
| 409 | 409 | ||
| 410 | static void treo680_irda_shutdown(struct device *dev) | 410 | static void treo680_irda_shutdown(struct device *dev) |
| 411 | { | 411 | { |
| 412 | gpio_free(GPIO_NR_TREO680_AMP_EN); | 412 | gpio_free(GPIO_NR_TREO680_IR_EN); |
| 413 | } | 413 | } |
| 414 | 414 | ||
| 415 | static struct pxaficp_platform_data treo680_ficp_info = { | 415 | static struct pxaficp_platform_data treo680_ficp_info = { |
diff --git a/arch/arm/mach-pxa/zylonite_pxa300.c b/arch/arm/mach-pxa/zylonite_pxa300.c index cefd1c0a854a..84095440a878 100644 --- a/arch/arm/mach-pxa/zylonite_pxa300.c +++ b/arch/arm/mach-pxa/zylonite_pxa300.c | |||
| @@ -197,10 +197,12 @@ static void __init zylonite_detect_lcd_panel(void) | |||
| 197 | for (i = 0; i < NUM_LCD_DETECT_PINS; i++) { | 197 | for (i = 0; i < NUM_LCD_DETECT_PINS; i++) { |
| 198 | id = id << 1; | 198 | id = id << 1; |
| 199 | gpio = mfp_to_gpio(lcd_detect_pins[i]); | 199 | gpio = mfp_to_gpio(lcd_detect_pins[i]); |
| 200 | gpio_request(gpio, "LCD_ID_PINS"); | ||
| 200 | gpio_direction_input(gpio); | 201 | gpio_direction_input(gpio); |
| 201 | 202 | ||
| 202 | if (gpio_get_value(gpio)) | 203 | if (gpio_get_value(gpio)) |
| 203 | id = id | 0x1; | 204 | id = id | 0x1; |
| 205 | gpio_free(gpio); | ||
| 204 | } | 206 | } |
| 205 | 207 | ||
| 206 | /* lcd id, flush out bit 1 */ | 208 | /* lcd id, flush out bit 1 */ |
diff --git a/arch/arm/mach-pxa/zylonite_pxa320.c b/arch/arm/mach-pxa/zylonite_pxa320.c index cc5a22833605..60d08f23f5e4 100644 --- a/arch/arm/mach-pxa/zylonite_pxa320.c +++ b/arch/arm/mach-pxa/zylonite_pxa320.c | |||
| @@ -176,10 +176,12 @@ static void __init zylonite_detect_lcd_panel(void) | |||
| 176 | for (i = 0; i < NUM_LCD_DETECT_PINS; i++) { | 176 | for (i = 0; i < NUM_LCD_DETECT_PINS; i++) { |
| 177 | id = id << 1; | 177 | id = id << 1; |
| 178 | gpio = mfp_to_gpio(lcd_detect_pins[i]); | 178 | gpio = mfp_to_gpio(lcd_detect_pins[i]); |
| 179 | gpio_request(gpio, "LCD_ID_PINS"); | ||
| 179 | gpio_direction_input(gpio); | 180 | gpio_direction_input(gpio); |
| 180 | 181 | ||
| 181 | if (gpio_get_value(gpio)) | 182 | if (gpio_get_value(gpio)) |
| 182 | id = id | 0x1; | 183 | id = id | 0x1; |
| 184 | gpio_free(gpio); | ||
| 183 | } | 185 | } |
| 184 | 186 | ||
| 185 | /* lcd id, flush out bit 1 */ | 187 | /* lcd id, flush out bit 1 */ |
diff --git a/arch/arm/mach-s3c2410/include/mach/gpio-core.h b/arch/arm/mach-s3c2410/include/mach/gpio-core.h index 8fe192081d3a..f8b879a7973c 100644 --- a/arch/arm/mach-s3c2410/include/mach/gpio-core.h +++ b/arch/arm/mach-s3c2410/include/mach/gpio-core.h | |||
| @@ -28,7 +28,7 @@ static inline struct s3c_gpio_chip *s3c_gpiolib_getchip(unsigned int pin) | |||
| 28 | return NULL; | 28 | return NULL; |
| 29 | 29 | ||
| 30 | chip = &s3c24xx_gpios[pin/32]; | 30 | chip = &s3c24xx_gpios[pin/32]; |
| 31 | return (S3C2410_GPIO_OFFSET(pin) > chip->chip.ngpio) ? chip : NULL; | 31 | return (S3C2410_GPIO_OFFSET(pin) < chip->chip.ngpio) ? chip : NULL; |
| 32 | } | 32 | } |
| 33 | 33 | ||
| 34 | #endif /* __ASM_ARCH_GPIO_CORE_H */ | 34 | #endif /* __ASM_ARCH_GPIO_CORE_H */ |
diff --git a/arch/arm/plat-s3c24xx/pwm.c b/arch/arm/plat-s3c24xx/pwm.c index 0120b760315b..82a6d4de02a3 100644 --- a/arch/arm/plat-s3c24xx/pwm.c +++ b/arch/arm/plat-s3c24xx/pwm.c | |||
| @@ -246,6 +246,10 @@ int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns) | |||
| 246 | 246 | ||
| 247 | tcmp = duty_ns / tin_ns; | 247 | tcmp = duty_ns / tin_ns; |
| 248 | tcmp = tcnt - tcmp; | 248 | tcmp = tcnt - tcmp; |
| 249 | /* the pwm hw only checks the compare register after a decrement, | ||
| 250 | so the pin never toggles if tcmp = tcnt */ | ||
| 251 | if (tcmp == tcnt) | ||
| 252 | tcmp--; | ||
| 249 | 253 | ||
| 250 | pwm_dbg(pwm, "tin_ns=%lu, tcmp=%ld/%lu\n", tin_ns, tcmp, tcnt); | 254 | pwm_dbg(pwm, "tin_ns=%lu, tcmp=%ld/%lu\n", tin_ns, tcmp, tcnt); |
| 251 | 255 | ||
diff --git a/arch/arm/plat-s3c64xx/pm.c b/arch/arm/plat-s3c64xx/pm.c index 07a6516a4f3c..47632fc7eb66 100644 --- a/arch/arm/plat-s3c64xx/pm.c +++ b/arch/arm/plat-s3c64xx/pm.c | |||
| @@ -117,8 +117,6 @@ void s3c_pm_save_core(void) | |||
| 117 | * this. | 117 | * this. |
| 118 | */ | 118 | */ |
| 119 | 119 | ||
| 120 | #include <plat/regs-gpio.h> | ||
| 121 | |||
| 122 | static void s3c64xx_cpu_suspend(void) | 120 | static void s3c64xx_cpu_suspend(void) |
| 123 | { | 121 | { |
| 124 | unsigned long tmp; | 122 | unsigned long tmp; |
diff --git a/arch/arm/plat-s3c64xx/s3c6400-clock.c b/arch/arm/plat-s3c64xx/s3c6400-clock.c index 1debc1f9f987..febac1950d8e 100644 --- a/arch/arm/plat-s3c64xx/s3c6400-clock.c +++ b/arch/arm/plat-s3c64xx/s3c6400-clock.c | |||
| @@ -153,7 +153,7 @@ static unsigned long s3c64xx_clk_arm_round_rate(struct clk *clk, | |||
| 153 | u32 div; | 153 | u32 div; |
| 154 | 154 | ||
| 155 | if (parent < rate) | 155 | if (parent < rate) |
| 156 | return rate; | 156 | return parent; |
| 157 | 157 | ||
| 158 | div = (parent / rate) - 1; | 158 | div = (parent / rate) - 1; |
| 159 | if (div > armclk_mask) | 159 | if (div > armclk_mask) |
| @@ -175,7 +175,7 @@ static int s3c64xx_clk_arm_set_rate(struct clk *clk, unsigned long rate) | |||
| 175 | div = clk_get_rate(clk->parent) / rate; | 175 | div = clk_get_rate(clk->parent) / rate; |
| 176 | 176 | ||
| 177 | val = __raw_readl(S3C_CLK_DIV0); | 177 | val = __raw_readl(S3C_CLK_DIV0); |
| 178 | val &= armclk_mask; | 178 | val &= ~armclk_mask; |
| 179 | val |= (div - 1); | 179 | val |= (div - 1); |
| 180 | __raw_writel(val, S3C_CLK_DIV0); | 180 | __raw_writel(val, S3C_CLK_DIV0); |
| 181 | 181 | ||
diff --git a/arch/arm/plat-stmp3xxx/pinmux.c b/arch/arm/plat-stmp3xxx/pinmux.c index d41200382208..6d6b1a468eda 100644 --- a/arch/arm/plat-stmp3xxx/pinmux.c +++ b/arch/arm/plat-stmp3xxx/pinmux.c | |||
| @@ -22,7 +22,6 @@ | |||
| 22 | #include <linux/sysdev.h> | 22 | #include <linux/sysdev.h> |
| 23 | #include <linux/string.h> | 23 | #include <linux/string.h> |
| 24 | #include <linux/bitops.h> | 24 | #include <linux/bitops.h> |
| 25 | #include <linux/sysdev.h> | ||
| 26 | #include <linux/irq.h> | 25 | #include <linux/irq.h> |
| 27 | 26 | ||
| 28 | #include <mach/hardware.h> | 27 | #include <mach/hardware.h> |
diff --git a/arch/ia64/Makefile b/arch/ia64/Makefile index 58a7e46affda..e7cbaa02cd0b 100644 --- a/arch/ia64/Makefile +++ b/arch/ia64/Makefile | |||
| @@ -41,11 +41,6 @@ $(error Sorry, you need a newer version of the assember, one that is built from | |||
| 41 | ftp://ftp.hpl.hp.com/pub/linux-ia64/gas-030124.tar.gz) | 41 | ftp://ftp.hpl.hp.com/pub/linux-ia64/gas-030124.tar.gz) |
| 42 | endif | 42 | endif |
| 43 | 43 | ||
| 44 | ifeq ($(call cc-version),0304) | ||
| 45 | cflags-$(CONFIG_ITANIUM) += -mtune=merced | ||
| 46 | cflags-$(CONFIG_MCKINLEY) += -mtune=mckinley | ||
| 47 | endif | ||
| 48 | |||
| 49 | KBUILD_CFLAGS += $(cflags-y) | 44 | KBUILD_CFLAGS += $(cflags-y) |
| 50 | head-y := arch/ia64/kernel/head.o arch/ia64/kernel/init_task.o | 45 | head-y := arch/ia64/kernel/head.o arch/ia64/kernel/init_task.o |
| 51 | 46 | ||
diff --git a/arch/ia64/include/asm/bitops.h b/arch/ia64/include/asm/bitops.h index e2ca80037335..57a2787bc9fb 100644 --- a/arch/ia64/include/asm/bitops.h +++ b/arch/ia64/include/asm/bitops.h | |||
| @@ -286,7 +286,7 @@ __test_and_clear_bit(int nr, volatile void * addr) | |||
| 286 | { | 286 | { |
| 287 | __u32 *p = (__u32 *) addr + (nr >> 5); | 287 | __u32 *p = (__u32 *) addr + (nr >> 5); |
| 288 | __u32 m = 1 << (nr & 31); | 288 | __u32 m = 1 << (nr & 31); |
| 289 | int oldbitset = *p & m; | 289 | int oldbitset = (*p & m) != 0; |
| 290 | 290 | ||
| 291 | *p &= ~m; | 291 | *p &= ~m; |
| 292 | return oldbitset; | 292 | return oldbitset; |
diff --git a/arch/ia64/include/asm/pgtable.h b/arch/ia64/include/asm/pgtable.h index 0a9cc73d35c7..8840a690d1e7 100644 --- a/arch/ia64/include/asm/pgtable.h +++ b/arch/ia64/include/asm/pgtable.h | |||
| @@ -155,7 +155,6 @@ | |||
| 155 | #include <linux/bitops.h> | 155 | #include <linux/bitops.h> |
| 156 | #include <asm/cacheflush.h> | 156 | #include <asm/cacheflush.h> |
| 157 | #include <asm/mmu_context.h> | 157 | #include <asm/mmu_context.h> |
| 158 | #include <asm/processor.h> | ||
| 159 | 158 | ||
| 160 | /* | 159 | /* |
| 161 | * Next come the mappings that determine how mmap() protection bits | 160 | * Next come the mappings that determine how mmap() protection bits |
diff --git a/arch/ia64/kernel/ia64_ksyms.c b/arch/ia64/kernel/ia64_ksyms.c index 2d311864e359..8ebccb589e1c 100644 --- a/arch/ia64/kernel/ia64_ksyms.c +++ b/arch/ia64/kernel/ia64_ksyms.c | |||
| @@ -21,6 +21,7 @@ EXPORT_SYMBOL(csum_ipv6_magic); | |||
| 21 | 21 | ||
| 22 | #include <asm/page.h> | 22 | #include <asm/page.h> |
| 23 | EXPORT_SYMBOL(clear_page); | 23 | EXPORT_SYMBOL(clear_page); |
| 24 | EXPORT_SYMBOL(copy_page); | ||
| 24 | 25 | ||
| 25 | #ifdef CONFIG_VIRTUAL_MEM_MAP | 26 | #ifdef CONFIG_VIRTUAL_MEM_MAP |
| 26 | #include <linux/bootmem.h> | 27 | #include <linux/bootmem.h> |
| @@ -60,9 +61,6 @@ EXPORT_SYMBOL(__udivdi3); | |||
| 60 | EXPORT_SYMBOL(__moddi3); | 61 | EXPORT_SYMBOL(__moddi3); |
| 61 | EXPORT_SYMBOL(__umoddi3); | 62 | EXPORT_SYMBOL(__umoddi3); |
| 62 | 63 | ||
| 63 | #include <asm/page.h> | ||
| 64 | EXPORT_SYMBOL(copy_page); | ||
| 65 | |||
| 66 | #if defined(CONFIG_MD_RAID456) || defined(CONFIG_MD_RAID456_MODULE) | 64 | #if defined(CONFIG_MD_RAID456) || defined(CONFIG_MD_RAID456_MODULE) |
| 67 | extern void xor_ia64_2(void); | 65 | extern void xor_ia64_2(void); |
| 68 | extern void xor_ia64_3(void); | 66 | extern void xor_ia64_3(void); |
diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c index c48b03f2b61d..dab4d393908c 100644 --- a/arch/ia64/kernel/iosapic.c +++ b/arch/ia64/kernel/iosapic.c | |||
| @@ -1072,6 +1072,10 @@ iosapic_init (unsigned long phys_addr, unsigned int gsi_base) | |||
| 1072 | } | 1072 | } |
| 1073 | 1073 | ||
| 1074 | addr = ioremap(phys_addr, 0); | 1074 | addr = ioremap(phys_addr, 0); |
| 1075 | if (addr == NULL) { | ||
| 1076 | spin_unlock_irqrestore(&iosapic_lock, flags); | ||
| 1077 | return -ENOMEM; | ||
| 1078 | } | ||
| 1075 | ver = iosapic_version(addr); | 1079 | ver = iosapic_version(addr); |
| 1076 | if ((err = iosapic_check_gsi_range(gsi_base, ver))) { | 1080 | if ((err = iosapic_check_gsi_range(gsi_base, ver))) { |
| 1077 | iounmap(addr); | 1081 | iounmap(addr); |
diff --git a/arch/ia64/kernel/pci-dma.c b/arch/ia64/kernel/pci-dma.c index 05695962fe44..f6b1ff0aea76 100644 --- a/arch/ia64/kernel/pci-dma.c +++ b/arch/ia64/kernel/pci-dma.c | |||
| @@ -69,11 +69,6 @@ iommu_dma_init(void) | |||
| 69 | 69 | ||
| 70 | int iommu_dma_supported(struct device *dev, u64 mask) | 70 | int iommu_dma_supported(struct device *dev, u64 mask) |
| 71 | { | 71 | { |
| 72 | struct dma_map_ops *ops = platform_dma_get_ops(dev); | ||
| 73 | |||
| 74 | if (ops->dma_supported) | ||
| 75 | return ops->dma_supported(dev, mask); | ||
| 76 | |||
| 77 | /* Copied from i386. Doesn't make much sense, because it will | 72 | /* Copied from i386. Doesn't make much sense, because it will |
| 78 | only work for pci_alloc_coherent. | 73 | only work for pci_alloc_coherent. |
| 79 | The caller just has to use GFP_DMA in this case. */ | 74 | The caller just has to use GFP_DMA in this case. */ |
diff --git a/arch/ia64/kernel/topology.c b/arch/ia64/kernel/topology.c index bc80dff1df7a..8f060352e129 100644 --- a/arch/ia64/kernel/topology.c +++ b/arch/ia64/kernel/topology.c | |||
| @@ -372,6 +372,10 @@ static int __cpuinit cache_add_dev(struct sys_device * sys_dev) | |||
| 372 | retval = kobject_init_and_add(&all_cpu_cache_info[cpu].kobj, | 372 | retval = kobject_init_and_add(&all_cpu_cache_info[cpu].kobj, |
| 373 | &cache_ktype_percpu_entry, &sys_dev->kobj, | 373 | &cache_ktype_percpu_entry, &sys_dev->kobj, |
| 374 | "%s", "cache"); | 374 | "%s", "cache"); |
| 375 | if (unlikely(retval < 0)) { | ||
| 376 | cpu_cache_sysfs_exit(cpu); | ||
| 377 | return retval; | ||
| 378 | } | ||
| 375 | 379 | ||
| 376 | for (i = 0; i < all_cpu_cache_info[cpu].num_cache_leaves; i++) { | 380 | for (i = 0; i < all_cpu_cache_info[cpu].num_cache_leaves; i++) { |
| 377 | this_object = LEAF_KOBJECT_PTR(cpu,i); | 381 | this_object = LEAF_KOBJECT_PTR(cpu,i); |
| @@ -385,7 +389,7 @@ static int __cpuinit cache_add_dev(struct sys_device * sys_dev) | |||
| 385 | } | 389 | } |
| 386 | kobject_put(&all_cpu_cache_info[cpu].kobj); | 390 | kobject_put(&all_cpu_cache_info[cpu].kobj); |
| 387 | cpu_cache_sysfs_exit(cpu); | 391 | cpu_cache_sysfs_exit(cpu); |
| 388 | break; | 392 | return retval; |
| 389 | } | 393 | } |
| 390 | kobject_uevent(&(this_object->kobj), KOBJ_ADD); | 394 | kobject_uevent(&(this_object->kobj), KOBJ_ADD); |
| 391 | } | 395 | } |
diff --git a/arch/ia64/kvm/mmio.c b/arch/ia64/kvm/mmio.c index 21f63fffc379..9bf55afd08d0 100644 --- a/arch/ia64/kvm/mmio.c +++ b/arch/ia64/kvm/mmio.c | |||
| @@ -247,7 +247,8 @@ void emulate_io_inst(struct kvm_vcpu *vcpu, u64 padr, u64 ma) | |||
| 247 | vcpu_get_fpreg(vcpu, inst.M9.f2, &v); | 247 | vcpu_get_fpreg(vcpu, inst.M9.f2, &v); |
| 248 | /* Write high word. FIXME: this is a kludge! */ | 248 | /* Write high word. FIXME: this is a kludge! */ |
| 249 | v.u.bits[1] &= 0x3ffff; | 249 | v.u.bits[1] &= 0x3ffff; |
| 250 | mmio_access(vcpu, padr + 8, &v.u.bits[1], 8, ma, IOREQ_WRITE); | 250 | mmio_access(vcpu, padr + 8, (u64 *)&v.u.bits[1], 8, |
| 251 | ma, IOREQ_WRITE); | ||
| 251 | data = v.u.bits[0]; | 252 | data = v.u.bits[0]; |
| 252 | size = 3; | 253 | size = 3; |
| 253 | } else if (inst.M10.major == 7 && inst.M10.x6 == 0x3B) { | 254 | } else if (inst.M10.major == 7 && inst.M10.x6 == 0x3B) { |
| @@ -265,7 +266,8 @@ void emulate_io_inst(struct kvm_vcpu *vcpu, u64 padr, u64 ma) | |||
| 265 | 266 | ||
| 266 | /* Write high word.FIXME: this is a kludge! */ | 267 | /* Write high word.FIXME: this is a kludge! */ |
| 267 | v.u.bits[1] &= 0x3ffff; | 268 | v.u.bits[1] &= 0x3ffff; |
| 268 | mmio_access(vcpu, padr + 8, &v.u.bits[1], 8, ma, IOREQ_WRITE); | 269 | mmio_access(vcpu, padr + 8, (u64 *)&v.u.bits[1], |
| 270 | 8, ma, IOREQ_WRITE); | ||
| 269 | data = v.u.bits[0]; | 271 | data = v.u.bits[0]; |
| 270 | size = 3; | 272 | size = 3; |
| 271 | } else if (inst.M10.major == 7 && inst.M10.x6 == 0x31) { | 273 | } else if (inst.M10.major == 7 && inst.M10.x6 == 0x31) { |
diff --git a/arch/ia64/kvm/vcpu.c b/arch/ia64/kvm/vcpu.c index 46b02cbcc874..cc406d064a09 100644 --- a/arch/ia64/kvm/vcpu.c +++ b/arch/ia64/kvm/vcpu.c | |||
| @@ -461,7 +461,7 @@ void setreg(unsigned long regnum, unsigned long val, | |||
| 461 | u64 vcpu_get_gr(struct kvm_vcpu *vcpu, unsigned long reg) | 461 | u64 vcpu_get_gr(struct kvm_vcpu *vcpu, unsigned long reg) |
| 462 | { | 462 | { |
| 463 | struct kvm_pt_regs *regs = vcpu_regs(vcpu); | 463 | struct kvm_pt_regs *regs = vcpu_regs(vcpu); |
| 464 | u64 val; | 464 | unsigned long val; |
| 465 | 465 | ||
| 466 | if (!reg) | 466 | if (!reg) |
| 467 | return 0; | 467 | return 0; |
| @@ -469,7 +469,7 @@ u64 vcpu_get_gr(struct kvm_vcpu *vcpu, unsigned long reg) | |||
| 469 | return val; | 469 | return val; |
| 470 | } | 470 | } |
| 471 | 471 | ||
| 472 | void vcpu_set_gr(struct kvm_vcpu *vcpu, u64 reg, u64 value, int nat) | 472 | void vcpu_set_gr(struct kvm_vcpu *vcpu, unsigned long reg, u64 value, int nat) |
| 473 | { | 473 | { |
| 474 | struct kvm_pt_regs *regs = vcpu_regs(vcpu); | 474 | struct kvm_pt_regs *regs = vcpu_regs(vcpu); |
| 475 | long sof = (regs->cr_ifs) & 0x7f; | 475 | long sof = (regs->cr_ifs) & 0x7f; |
| @@ -1072,7 +1072,7 @@ void kvm_ttag(struct kvm_vcpu *vcpu, INST64 inst) | |||
| 1072 | vcpu_set_gr(vcpu, inst.M46.r1, tag, 0); | 1072 | vcpu_set_gr(vcpu, inst.M46.r1, tag, 0); |
| 1073 | } | 1073 | } |
| 1074 | 1074 | ||
| 1075 | int vcpu_tpa(struct kvm_vcpu *vcpu, u64 vadr, u64 *padr) | 1075 | int vcpu_tpa(struct kvm_vcpu *vcpu, u64 vadr, unsigned long *padr) |
| 1076 | { | 1076 | { |
| 1077 | struct thash_data *data; | 1077 | struct thash_data *data; |
| 1078 | union ia64_isr visr, pt_isr; | 1078 | union ia64_isr visr, pt_isr; |
diff --git a/arch/ia64/kvm/vcpu.h b/arch/ia64/kvm/vcpu.h index 042af92ced83..360724d3ae69 100644 --- a/arch/ia64/kvm/vcpu.h +++ b/arch/ia64/kvm/vcpu.h | |||
| @@ -686,14 +686,15 @@ static inline int highest_inservice_irq(struct kvm_vcpu *vcpu) | |||
| 686 | return highest_bits((int *)&(VMX(vcpu, insvc[0]))); | 686 | return highest_bits((int *)&(VMX(vcpu, insvc[0]))); |
| 687 | } | 687 | } |
| 688 | 688 | ||
| 689 | extern void vcpu_get_fpreg(struct kvm_vcpu *vcpu, u64 reg, | 689 | extern void vcpu_get_fpreg(struct kvm_vcpu *vcpu, unsigned long reg, |
| 690 | struct ia64_fpreg *val); | 690 | struct ia64_fpreg *val); |
| 691 | extern void vcpu_set_fpreg(struct kvm_vcpu *vcpu, u64 reg, | 691 | extern void vcpu_set_fpreg(struct kvm_vcpu *vcpu, unsigned long reg, |
| 692 | struct ia64_fpreg *val); | 692 | struct ia64_fpreg *val); |
| 693 | extern u64 vcpu_get_gr(struct kvm_vcpu *vcpu, u64 reg); | 693 | extern u64 vcpu_get_gr(struct kvm_vcpu *vcpu, unsigned long reg); |
| 694 | extern void vcpu_set_gr(struct kvm_vcpu *vcpu, u64 reg, u64 val, int nat); | 694 | extern void vcpu_set_gr(struct kvm_vcpu *vcpu, unsigned long reg, |
| 695 | extern u64 vcpu_get_psr(struct kvm_vcpu *vcpu); | 695 | u64 val, int nat); |
| 696 | extern void vcpu_set_psr(struct kvm_vcpu *vcpu, u64 val); | 696 | extern unsigned long vcpu_get_psr(struct kvm_vcpu *vcpu); |
| 697 | extern void vcpu_set_psr(struct kvm_vcpu *vcpu, unsigned long val); | ||
| 697 | extern u64 vcpu_thash(struct kvm_vcpu *vcpu, u64 vadr); | 698 | extern u64 vcpu_thash(struct kvm_vcpu *vcpu, u64 vadr); |
| 698 | extern void vcpu_bsw0(struct kvm_vcpu *vcpu); | 699 | extern void vcpu_bsw0(struct kvm_vcpu *vcpu); |
| 699 | extern void thash_vhpt_insert(struct kvm_vcpu *v, u64 pte, | 700 | extern void thash_vhpt_insert(struct kvm_vcpu *v, u64 pte, |
diff --git a/arch/mn10300/include/asm/pci.h b/arch/mn10300/include/asm/pci.h index 35d2ed6396f6..19aecc90f7a4 100644 --- a/arch/mn10300/include/asm/pci.h +++ b/arch/mn10300/include/asm/pci.h | |||
| @@ -59,7 +59,6 @@ void pcibios_penalize_isa_irq(int irq); | |||
| 59 | #include <linux/slab.h> | 59 | #include <linux/slab.h> |
| 60 | #include <asm/scatterlist.h> | 60 | #include <asm/scatterlist.h> |
| 61 | #include <linux/string.h> | 61 | #include <linux/string.h> |
| 62 | #include <linux/mm.h> | ||
| 63 | #include <asm/io.h> | 62 | #include <asm/io.h> |
| 64 | 63 | ||
| 65 | struct pci_dev; | 64 | struct pci_dev; |
diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index dfdf13c9fefd..fddc3ed715fa 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h | |||
| @@ -34,7 +34,7 @@ | |||
| 34 | #define KVM_COALESCED_MMIO_PAGE_OFFSET 1 | 34 | #define KVM_COALESCED_MMIO_PAGE_OFFSET 1 |
| 35 | 35 | ||
| 36 | /* We don't currently support large pages. */ | 36 | /* We don't currently support large pages. */ |
| 37 | #define KVM_PAGES_PER_HPAGE (1<<31) | 37 | #define KVM_PAGES_PER_HPAGE (1UL << 31) |
| 38 | 38 | ||
| 39 | struct kvm; | 39 | struct kvm; |
| 40 | struct kvm_run; | 40 | struct kvm_run; |
diff --git a/arch/powerpc/kernel/dma.c b/arch/powerpc/kernel/dma.c index 20a60d661ba8..ccf129d47d84 100644 --- a/arch/powerpc/kernel/dma.c +++ b/arch/powerpc/kernel/dma.c | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | 7 | ||
| 8 | #include <linux/device.h> | 8 | #include <linux/device.h> |
| 9 | #include <linux/dma-mapping.h> | 9 | #include <linux/dma-mapping.h> |
| 10 | #include <linux/lmb.h> | ||
| 10 | #include <asm/bug.h> | 11 | #include <asm/bug.h> |
| 11 | #include <asm/abs_addr.h> | 12 | #include <asm/abs_addr.h> |
| 12 | 13 | ||
| @@ -90,11 +91,10 @@ static void dma_direct_unmap_sg(struct device *dev, struct scatterlist *sg, | |||
| 90 | static int dma_direct_dma_supported(struct device *dev, u64 mask) | 91 | static int dma_direct_dma_supported(struct device *dev, u64 mask) |
| 91 | { | 92 | { |
| 92 | #ifdef CONFIG_PPC64 | 93 | #ifdef CONFIG_PPC64 |
| 93 | /* Could be improved to check for memory though it better be | 94 | /* Could be improved so platforms can set the limit in case |
| 94 | * done via some global so platforms can set the limit in case | ||
| 95 | * they have limited DMA windows | 95 | * they have limited DMA windows |
| 96 | */ | 96 | */ |
| 97 | return mask >= DMA_BIT_MASK(32); | 97 | return mask >= (lmb_end_of_DRAM() - 1); |
| 98 | #else | 98 | #else |
| 99 | return 1; | 99 | return 1; |
| 100 | #endif | 100 | #endif |
diff --git a/arch/powerpc/kernel/mpc7450-pmu.c b/arch/powerpc/kernel/mpc7450-pmu.c index c244133c67a6..cc466d039af6 100644 --- a/arch/powerpc/kernel/mpc7450-pmu.c +++ b/arch/powerpc/kernel/mpc7450-pmu.c | |||
| @@ -407,7 +407,8 @@ struct power_pmu mpc7450_pmu = { | |||
| 407 | 407 | ||
| 408 | static int init_mpc7450_pmu(void) | 408 | static int init_mpc7450_pmu(void) |
| 409 | { | 409 | { |
| 410 | if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc/7450")) | 410 | if (!cur_cpu_spec->oprofile_cpu_type || |
| 411 | strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc/7450")) | ||
| 411 | return -ENODEV; | 412 | return -ENODEV; |
| 412 | 413 | ||
| 413 | return register_power_pmu(&mpc7450_pmu); | 414 | return register_power_pmu(&mpc7450_pmu); |
diff --git a/arch/powerpc/kernel/perf_counter.c b/arch/powerpc/kernel/perf_counter.c index 809fdf94b95f..70e1f57f7dd8 100644 --- a/arch/powerpc/kernel/perf_counter.c +++ b/arch/powerpc/kernel/perf_counter.c | |||
| @@ -518,6 +518,8 @@ void hw_perf_disable(void) | |||
| 518 | struct cpu_hw_counters *cpuhw; | 518 | struct cpu_hw_counters *cpuhw; |
| 519 | unsigned long flags; | 519 | unsigned long flags; |
| 520 | 520 | ||
| 521 | if (!ppmu) | ||
| 522 | return; | ||
| 521 | local_irq_save(flags); | 523 | local_irq_save(flags); |
| 522 | cpuhw = &__get_cpu_var(cpu_hw_counters); | 524 | cpuhw = &__get_cpu_var(cpu_hw_counters); |
| 523 | 525 | ||
| @@ -572,6 +574,8 @@ void hw_perf_enable(void) | |||
| 572 | int n_lim; | 574 | int n_lim; |
| 573 | int idx; | 575 | int idx; |
| 574 | 576 | ||
| 577 | if (!ppmu) | ||
| 578 | return; | ||
| 575 | local_irq_save(flags); | 579 | local_irq_save(flags); |
| 576 | cpuhw = &__get_cpu_var(cpu_hw_counters); | 580 | cpuhw = &__get_cpu_var(cpu_hw_counters); |
| 577 | if (!cpuhw->disabled) { | 581 | if (!cpuhw->disabled) { |
| @@ -737,6 +741,8 @@ int hw_perf_group_sched_in(struct perf_counter *group_leader, | |||
| 737 | long i, n, n0; | 741 | long i, n, n0; |
| 738 | struct perf_counter *sub; | 742 | struct perf_counter *sub; |
| 739 | 743 | ||
| 744 | if (!ppmu) | ||
| 745 | return 0; | ||
| 740 | cpuhw = &__get_cpu_var(cpu_hw_counters); | 746 | cpuhw = &__get_cpu_var(cpu_hw_counters); |
| 741 | n0 = cpuhw->n_counters; | 747 | n0 = cpuhw->n_counters; |
| 742 | n = collect_events(group_leader, ppmu->n_counter - n0, | 748 | n = collect_events(group_leader, ppmu->n_counter - n0, |
| @@ -1281,6 +1287,8 @@ void hw_perf_counter_setup(int cpu) | |||
| 1281 | { | 1287 | { |
| 1282 | struct cpu_hw_counters *cpuhw = &per_cpu(cpu_hw_counters, cpu); | 1288 | struct cpu_hw_counters *cpuhw = &per_cpu(cpu_hw_counters, cpu); |
| 1283 | 1289 | ||
| 1290 | if (!ppmu) | ||
| 1291 | return; | ||
| 1284 | memset(cpuhw, 0, sizeof(*cpuhw)); | 1292 | memset(cpuhw, 0, sizeof(*cpuhw)); |
| 1285 | cpuhw->mmcr[0] = MMCR0_FC; | 1293 | cpuhw->mmcr[0] = MMCR0_FC; |
| 1286 | } | 1294 | } |
diff --git a/arch/powerpc/kernel/power4-pmu.c b/arch/powerpc/kernel/power4-pmu.c index db90b0c5c27b..3c90a3d9173e 100644 --- a/arch/powerpc/kernel/power4-pmu.c +++ b/arch/powerpc/kernel/power4-pmu.c | |||
| @@ -606,7 +606,8 @@ static struct power_pmu power4_pmu = { | |||
| 606 | 606 | ||
| 607 | static int init_power4_pmu(void) | 607 | static int init_power4_pmu(void) |
| 608 | { | 608 | { |
| 609 | if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power4")) | 609 | if (!cur_cpu_spec->oprofile_cpu_type || |
| 610 | strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power4")) | ||
| 610 | return -ENODEV; | 611 | return -ENODEV; |
| 611 | 612 | ||
| 612 | return register_power_pmu(&power4_pmu); | 613 | return register_power_pmu(&power4_pmu); |
diff --git a/arch/powerpc/kernel/power5+-pmu.c b/arch/powerpc/kernel/power5+-pmu.c index f4adca8e98a4..31918af3e355 100644 --- a/arch/powerpc/kernel/power5+-pmu.c +++ b/arch/powerpc/kernel/power5+-pmu.c | |||
| @@ -678,8 +678,9 @@ static struct power_pmu power5p_pmu = { | |||
| 678 | 678 | ||
| 679 | static int init_power5p_pmu(void) | 679 | static int init_power5p_pmu(void) |
| 680 | { | 680 | { |
| 681 | if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5+") | 681 | if (!cur_cpu_spec->oprofile_cpu_type || |
| 682 | && strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5++")) | 682 | (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5+") |
| 683 | && strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5++"))) | ||
| 683 | return -ENODEV; | 684 | return -ENODEV; |
| 684 | 685 | ||
| 685 | return register_power_pmu(&power5p_pmu); | 686 | return register_power_pmu(&power5p_pmu); |
diff --git a/arch/powerpc/kernel/power5-pmu.c b/arch/powerpc/kernel/power5-pmu.c index 29b2c6c0e83a..867f6f663963 100644 --- a/arch/powerpc/kernel/power5-pmu.c +++ b/arch/powerpc/kernel/power5-pmu.c | |||
| @@ -618,7 +618,8 @@ static struct power_pmu power5_pmu = { | |||
| 618 | 618 | ||
| 619 | static int init_power5_pmu(void) | 619 | static int init_power5_pmu(void) |
| 620 | { | 620 | { |
| 621 | if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5")) | 621 | if (!cur_cpu_spec->oprofile_cpu_type || |
| 622 | strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5")) | ||
| 622 | return -ENODEV; | 623 | return -ENODEV; |
| 623 | 624 | ||
| 624 | return register_power_pmu(&power5_pmu); | 625 | return register_power_pmu(&power5_pmu); |
diff --git a/arch/powerpc/kernel/power6-pmu.c b/arch/powerpc/kernel/power6-pmu.c index 09ae5bf5bda7..fa21890531da 100644 --- a/arch/powerpc/kernel/power6-pmu.c +++ b/arch/powerpc/kernel/power6-pmu.c | |||
| @@ -537,7 +537,8 @@ static struct power_pmu power6_pmu = { | |||
| 537 | 537 | ||
| 538 | static int init_power6_pmu(void) | 538 | static int init_power6_pmu(void) |
| 539 | { | 539 | { |
| 540 | if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power6")) | 540 | if (!cur_cpu_spec->oprofile_cpu_type || |
| 541 | strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power6")) | ||
| 541 | return -ENODEV; | 542 | return -ENODEV; |
| 542 | 543 | ||
| 543 | return register_power_pmu(&power6_pmu); | 544 | return register_power_pmu(&power6_pmu); |
diff --git a/arch/powerpc/kernel/power7-pmu.c b/arch/powerpc/kernel/power7-pmu.c index 5a9f5cbd40a4..388cf57ad827 100644 --- a/arch/powerpc/kernel/power7-pmu.c +++ b/arch/powerpc/kernel/power7-pmu.c | |||
| @@ -366,7 +366,8 @@ static struct power_pmu power7_pmu = { | |||
| 366 | 366 | ||
| 367 | static int init_power7_pmu(void) | 367 | static int init_power7_pmu(void) |
| 368 | { | 368 | { |
| 369 | if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power7")) | 369 | if (!cur_cpu_spec->oprofile_cpu_type || |
| 370 | strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power7")) | ||
| 370 | return -ENODEV; | 371 | return -ENODEV; |
| 371 | 372 | ||
| 372 | return register_power_pmu(&power7_pmu); | 373 | return register_power_pmu(&power7_pmu); |
diff --git a/arch/powerpc/kernel/ppc970-pmu.c b/arch/powerpc/kernel/ppc970-pmu.c index 833097ac45dc..75dccb71a043 100644 --- a/arch/powerpc/kernel/ppc970-pmu.c +++ b/arch/powerpc/kernel/ppc970-pmu.c | |||
| @@ -488,8 +488,9 @@ static struct power_pmu ppc970_pmu = { | |||
| 488 | 488 | ||
| 489 | static int init_ppc970_pmu(void) | 489 | static int init_ppc970_pmu(void) |
| 490 | { | 490 | { |
| 491 | if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/970") | 491 | if (!cur_cpu_spec->oprofile_cpu_type || |
| 492 | && strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/970MP")) | 492 | (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/970") |
| 493 | && strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/970MP"))) | ||
| 493 | return -ENODEV; | 494 | return -ENODEV; |
| 494 | 495 | ||
| 495 | return register_power_pmu(&ppc970_pmu); | 496 | return register_power_pmu(&ppc970_pmu); |
diff --git a/arch/s390/kernel/early.c b/arch/s390/kernel/early.c index 8d15314381e0..cae14c499511 100644 --- a/arch/s390/kernel/early.c +++ b/arch/s390/kernel/early.c | |||
| @@ -208,6 +208,9 @@ static noinline __init void detect_machine_type(void) | |||
| 208 | machine_flags |= MACHINE_FLAG_KVM; | 208 | machine_flags |= MACHINE_FLAG_KVM; |
| 209 | else | 209 | else |
| 210 | machine_flags |= MACHINE_FLAG_VM; | 210 | machine_flags |= MACHINE_FLAG_VM; |
| 211 | |||
| 212 | /* Store machine flags for setting up lowcore early */ | ||
| 213 | S390_lowcore.machine_flags = machine_flags; | ||
| 211 | } | 214 | } |
| 212 | 215 | ||
| 213 | static __init void early_pgm_check_handler(void) | 216 | static __init void early_pgm_check_handler(void) |
diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c index f04f5301b1b4..4d613415c435 100644 --- a/arch/s390/kvm/interrupt.c +++ b/arch/s390/kvm/interrupt.c | |||
| @@ -386,7 +386,7 @@ no_timer: | |||
| 386 | } | 386 | } |
| 387 | __unset_cpu_idle(vcpu); | 387 | __unset_cpu_idle(vcpu); |
| 388 | __set_current_state(TASK_RUNNING); | 388 | __set_current_state(TASK_RUNNING); |
| 389 | remove_wait_queue(&vcpu->wq, &wait); | 389 | remove_wait_queue(&vcpu->arch.local_int.wq, &wait); |
| 390 | spin_unlock_bh(&vcpu->arch.local_int.lock); | 390 | spin_unlock_bh(&vcpu->arch.local_int.lock); |
| 391 | spin_unlock(&vcpu->arch.local_int.float_int->lock); | 391 | spin_unlock(&vcpu->arch.local_int.float_int->lock); |
| 392 | hrtimer_try_to_cancel(&vcpu->arch.ckc_timer); | 392 | hrtimer_try_to_cancel(&vcpu->arch.ckc_timer); |
diff --git a/arch/s390/kvm/sigp.c b/arch/s390/kvm/sigp.c index 36678835034d..0ef81d6776e9 100644 --- a/arch/s390/kvm/sigp.c +++ b/arch/s390/kvm/sigp.c | |||
| @@ -169,7 +169,7 @@ static int __sigp_set_prefix(struct kvm_vcpu *vcpu, u16 cpu_addr, u32 address, | |||
| 169 | unsigned long *reg) | 169 | unsigned long *reg) |
| 170 | { | 170 | { |
| 171 | struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int; | 171 | struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int; |
| 172 | struct kvm_s390_local_interrupt *li; | 172 | struct kvm_s390_local_interrupt *li = NULL; |
| 173 | struct kvm_s390_interrupt_info *inti; | 173 | struct kvm_s390_interrupt_info *inti; |
| 174 | int rc; | 174 | int rc; |
| 175 | u8 tmp; | 175 | u8 tmp; |
| @@ -189,9 +189,10 @@ static int __sigp_set_prefix(struct kvm_vcpu *vcpu, u16 cpu_addr, u32 address, | |||
| 189 | return 2; /* busy */ | 189 | return 2; /* busy */ |
| 190 | 190 | ||
| 191 | spin_lock(&fi->lock); | 191 | spin_lock(&fi->lock); |
| 192 | li = fi->local_int[cpu_addr]; | 192 | if (cpu_addr < KVM_MAX_VCPUS) |
| 193 | li = fi->local_int[cpu_addr]; | ||
| 193 | 194 | ||
| 194 | if ((cpu_addr >= KVM_MAX_VCPUS) || (li == NULL)) { | 195 | if (li == NULL) { |
| 195 | rc = 1; /* incorrect state */ | 196 | rc = 1; /* incorrect state */ |
| 196 | *reg &= SIGP_STAT_INCORRECT_STATE; | 197 | *reg &= SIGP_STAT_INCORRECT_STATE; |
| 197 | kfree(inti); | 198 | kfree(inti); |
diff --git a/arch/x86/kernel/apic/x2apic_cluster.c b/arch/x86/kernel/apic/x2apic_cluster.c index 2ed4e2bb3b32..a5371ec36776 100644 --- a/arch/x86/kernel/apic/x2apic_cluster.c +++ b/arch/x86/kernel/apic/x2apic_cluster.c | |||
| @@ -17,11 +17,13 @@ static int x2apic_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | |||
| 17 | return x2apic_enabled(); | 17 | return x2apic_enabled(); |
| 18 | } | 18 | } |
| 19 | 19 | ||
| 20 | /* Start with all IRQs pointing to boot CPU. IRQ balancing will shift them. */ | 20 | /* |
| 21 | 21 | * need to use more than cpu 0, because we need more vectors when | |
| 22 | * MSI-X are used. | ||
| 23 | */ | ||
| 22 | static const struct cpumask *x2apic_target_cpus(void) | 24 | static const struct cpumask *x2apic_target_cpus(void) |
| 23 | { | 25 | { |
| 24 | return cpumask_of(0); | 26 | return cpu_online_mask; |
| 25 | } | 27 | } |
| 26 | 28 | ||
| 27 | /* | 29 | /* |
diff --git a/arch/x86/kernel/apic/x2apic_phys.c b/arch/x86/kernel/apic/x2apic_phys.c index 0b631c6a2e00..a8989aadc99a 100644 --- a/arch/x86/kernel/apic/x2apic_phys.c +++ b/arch/x86/kernel/apic/x2apic_phys.c | |||
| @@ -27,11 +27,13 @@ static int x2apic_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | |||
| 27 | return 0; | 27 | return 0; |
| 28 | } | 28 | } |
| 29 | 29 | ||
| 30 | /* Start with all IRQs pointing to boot CPU. IRQ balancing will shift them. */ | 30 | /* |
| 31 | 31 | * need to use more than cpu 0, because we need more vectors when | |
| 32 | * MSI-X are used. | ||
| 33 | */ | ||
| 32 | static const struct cpumask *x2apic_target_cpus(void) | 34 | static const struct cpumask *x2apic_target_cpus(void) |
| 33 | { | 35 | { |
| 34 | return cpumask_of(0); | 36 | return cpu_online_mask; |
| 35 | } | 37 | } |
| 36 | 38 | ||
| 37 | static void x2apic_vector_allocation_domain(int cpu, struct cpumask *retmask) | 39 | static void x2apic_vector_allocation_domain(int cpu, struct cpumask *retmask) |
diff --git a/arch/x86/kernel/efi.c b/arch/x86/kernel/efi.c index 19ccf6d0dccf..fe26ba3e3451 100644 --- a/arch/x86/kernel/efi.c +++ b/arch/x86/kernel/efi.c | |||
| @@ -354,7 +354,7 @@ void __init efi_init(void) | |||
| 354 | */ | 354 | */ |
| 355 | c16 = tmp = early_ioremap(efi.systab->fw_vendor, 2); | 355 | c16 = tmp = early_ioremap(efi.systab->fw_vendor, 2); |
| 356 | if (c16) { | 356 | if (c16) { |
| 357 | for (i = 0; i < sizeof(vendor) && *c16; ++i) | 357 | for (i = 0; i < sizeof(vendor) - 1 && *c16; ++i) |
| 358 | vendor[i] = *c16++; | 358 | vendor[i] = *c16++; |
| 359 | vendor[i] = '\0'; | 359 | vendor[i] = '\0'; |
| 360 | } else | 360 | } else |
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 834c9da8bf9d..9eb897603705 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
| @@ -405,7 +405,7 @@ EXPORT_SYMBOL(machine_real_restart); | |||
| 405 | #endif /* CONFIG_X86_32 */ | 405 | #endif /* CONFIG_X86_32 */ |
| 406 | 406 | ||
| 407 | /* | 407 | /* |
| 408 | * Apple MacBook5,2 (2009 MacBook) needs reboot=p | 408 | * Some Apple MacBook and MacBookPro's needs reboot=p to be able to reboot |
| 409 | */ | 409 | */ |
| 410 | static int __init set_pci_reboot(const struct dmi_system_id *d) | 410 | static int __init set_pci_reboot(const struct dmi_system_id *d) |
| 411 | { | 411 | { |
| @@ -426,6 +426,14 @@ static struct dmi_system_id __initdata pci_reboot_dmi_table[] = { | |||
| 426 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5,2"), | 426 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5,2"), |
| 427 | }, | 427 | }, |
| 428 | }, | 428 | }, |
| 429 | { /* Handle problems with rebooting on Apple MacBookPro5,1 */ | ||
| 430 | .callback = set_pci_reboot, | ||
| 431 | .ident = "Apple MacBookPro5,1", | ||
| 432 | .matches = { | ||
| 433 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
| 434 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,1"), | ||
| 435 | }, | ||
| 436 | }, | ||
| 429 | { } | 437 | { } |
| 430 | }; | 438 | }; |
| 431 | 439 | ||
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 6e1a368d21d4..71f4368b357e 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c | |||
| @@ -275,15 +275,20 @@ static unsigned long pit_calibrate_tsc(u32 latch, unsigned long ms, int loopmin) | |||
| 275 | * use the TSC value at the transitions to calculate a pretty | 275 | * use the TSC value at the transitions to calculate a pretty |
| 276 | * good value for the TSC frequencty. | 276 | * good value for the TSC frequencty. |
| 277 | */ | 277 | */ |
| 278 | static inline int pit_verify_msb(unsigned char val) | ||
| 279 | { | ||
| 280 | /* Ignore LSB */ | ||
| 281 | inb(0x42); | ||
| 282 | return inb(0x42) == val; | ||
| 283 | } | ||
| 284 | |||
| 278 | static inline int pit_expect_msb(unsigned char val, u64 *tscp, unsigned long *deltap) | 285 | static inline int pit_expect_msb(unsigned char val, u64 *tscp, unsigned long *deltap) |
| 279 | { | 286 | { |
| 280 | int count; | 287 | int count; |
| 281 | u64 tsc = 0; | 288 | u64 tsc = 0; |
| 282 | 289 | ||
| 283 | for (count = 0; count < 50000; count++) { | 290 | for (count = 0; count < 50000; count++) { |
| 284 | /* Ignore LSB */ | 291 | if (!pit_verify_msb(val)) |
| 285 | inb(0x42); | ||
| 286 | if (inb(0x42) != val) | ||
| 287 | break; | 292 | break; |
| 288 | tsc = get_cycles(); | 293 | tsc = get_cycles(); |
| 289 | } | 294 | } |
| @@ -336,8 +341,7 @@ static unsigned long quick_pit_calibrate(void) | |||
| 336 | * to do that is to just read back the 16-bit counter | 341 | * to do that is to just read back the 16-bit counter |
| 337 | * once from the PIT. | 342 | * once from the PIT. |
| 338 | */ | 343 | */ |
| 339 | inb(0x42); | 344 | pit_verify_msb(0); |
| 340 | inb(0x42); | ||
| 341 | 345 | ||
| 342 | if (pit_expect_msb(0xff, &tsc, &d1)) { | 346 | if (pit_expect_msb(0xff, &tsc, &d1)) { |
| 343 | for (i = 1; i <= MAX_QUICK_PIT_ITERATIONS; i++) { | 347 | for (i = 1; i <= MAX_QUICK_PIT_ITERATIONS; i++) { |
| @@ -348,8 +352,19 @@ static unsigned long quick_pit_calibrate(void) | |||
| 348 | * Iterate until the error is less than 500 ppm | 352 | * Iterate until the error is less than 500 ppm |
| 349 | */ | 353 | */ |
| 350 | delta -= tsc; | 354 | delta -= tsc; |
| 351 | if (d1+d2 < delta >> 11) | 355 | if (d1+d2 >= delta >> 11) |
| 352 | goto success; | 356 | continue; |
| 357 | |||
| 358 | /* | ||
| 359 | * Check the PIT one more time to verify that | ||
| 360 | * all TSC reads were stable wrt the PIT. | ||
| 361 | * | ||
| 362 | * This also guarantees serialization of the | ||
| 363 | * last cycle read ('d2') in pit_expect_msb. | ||
| 364 | */ | ||
| 365 | if (!pit_verify_msb(0xfe - i)) | ||
| 366 | break; | ||
| 367 | goto success; | ||
| 353 | } | 368 | } |
| 354 | } | 369 | } |
| 355 | printk("Fast TSC calibration failed\n"); | 370 | printk("Fast TSC calibration failed\n"); |
diff --git a/arch/x86/kernel/vmi_32.c b/arch/x86/kernel/vmi_32.c index b263423fbe2a..95a7289e4b0c 100644 --- a/arch/x86/kernel/vmi_32.c +++ b/arch/x86/kernel/vmi_32.c | |||
| @@ -441,7 +441,7 @@ vmi_startup_ipi_hook(int phys_apicid, unsigned long start_eip, | |||
| 441 | ap.ds = __USER_DS; | 441 | ap.ds = __USER_DS; |
| 442 | ap.es = __USER_DS; | 442 | ap.es = __USER_DS; |
| 443 | ap.fs = __KERNEL_PERCPU; | 443 | ap.fs = __KERNEL_PERCPU; |
| 444 | ap.gs = 0; | 444 | ap.gs = __KERNEL_STACK_CANARY; |
| 445 | 445 | ||
| 446 | ap.eflags = 0; | 446 | ap.eflags = 0; |
| 447 | 447 | ||
diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c index 4d6f0d293ee2..21f68e00524f 100644 --- a/arch/x86/kvm/i8254.c +++ b/arch/x86/kvm/i8254.c | |||
| @@ -104,6 +104,9 @@ static s64 __kpit_elapsed(struct kvm *kvm) | |||
| 104 | ktime_t remaining; | 104 | ktime_t remaining; |
| 105 | struct kvm_kpit_state *ps = &kvm->arch.vpit->pit_state; | 105 | struct kvm_kpit_state *ps = &kvm->arch.vpit->pit_state; |
| 106 | 106 | ||
| 107 | if (!ps->pit_timer.period) | ||
| 108 | return 0; | ||
| 109 | |||
| 107 | /* | 110 | /* |
| 108 | * The Counter does not stop when it reaches zero. In | 111 | * The Counter does not stop when it reaches zero. In |
| 109 | * Modes 0, 1, 4, and 5 the Counter ``wraps around'' to | 112 | * Modes 0, 1, 4, and 5 the Counter ``wraps around'' to |
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 7030b5f911bf..0ef5bb2b4043 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
| @@ -489,16 +489,20 @@ static unsigned long *gfn_to_rmap(struct kvm *kvm, gfn_t gfn, int lpage) | |||
| 489 | * | 489 | * |
| 490 | * If rmapp bit zero is one, (then rmap & ~1) points to a struct kvm_rmap_desc | 490 | * If rmapp bit zero is one, (then rmap & ~1) points to a struct kvm_rmap_desc |
| 491 | * containing more mappings. | 491 | * containing more mappings. |
| 492 | * | ||
| 493 | * Returns the number of rmap entries before the spte was added or zero if | ||
| 494 | * the spte was not added. | ||
| 495 | * | ||
| 492 | */ | 496 | */ |
| 493 | static void rmap_add(struct kvm_vcpu *vcpu, u64 *spte, gfn_t gfn, int lpage) | 497 | static int rmap_add(struct kvm_vcpu *vcpu, u64 *spte, gfn_t gfn, int lpage) |
| 494 | { | 498 | { |
| 495 | struct kvm_mmu_page *sp; | 499 | struct kvm_mmu_page *sp; |
| 496 | struct kvm_rmap_desc *desc; | 500 | struct kvm_rmap_desc *desc; |
| 497 | unsigned long *rmapp; | 501 | unsigned long *rmapp; |
| 498 | int i; | 502 | int i, count = 0; |
| 499 | 503 | ||
| 500 | if (!is_rmap_pte(*spte)) | 504 | if (!is_rmap_pte(*spte)) |
| 501 | return; | 505 | return count; |
| 502 | gfn = unalias_gfn(vcpu->kvm, gfn); | 506 | gfn = unalias_gfn(vcpu->kvm, gfn); |
| 503 | sp = page_header(__pa(spte)); | 507 | sp = page_header(__pa(spte)); |
| 504 | sp->gfns[spte - sp->spt] = gfn; | 508 | sp->gfns[spte - sp->spt] = gfn; |
| @@ -515,8 +519,10 @@ static void rmap_add(struct kvm_vcpu *vcpu, u64 *spte, gfn_t gfn, int lpage) | |||
| 515 | } else { | 519 | } else { |
| 516 | rmap_printk("rmap_add: %p %llx many->many\n", spte, *spte); | 520 | rmap_printk("rmap_add: %p %llx many->many\n", spte, *spte); |
| 517 | desc = (struct kvm_rmap_desc *)(*rmapp & ~1ul); | 521 | desc = (struct kvm_rmap_desc *)(*rmapp & ~1ul); |
| 518 | while (desc->shadow_ptes[RMAP_EXT-1] && desc->more) | 522 | while (desc->shadow_ptes[RMAP_EXT-1] && desc->more) { |
| 519 | desc = desc->more; | 523 | desc = desc->more; |
| 524 | count += RMAP_EXT; | ||
| 525 | } | ||
| 520 | if (desc->shadow_ptes[RMAP_EXT-1]) { | 526 | if (desc->shadow_ptes[RMAP_EXT-1]) { |
| 521 | desc->more = mmu_alloc_rmap_desc(vcpu); | 527 | desc->more = mmu_alloc_rmap_desc(vcpu); |
| 522 | desc = desc->more; | 528 | desc = desc->more; |
| @@ -525,6 +531,7 @@ static void rmap_add(struct kvm_vcpu *vcpu, u64 *spte, gfn_t gfn, int lpage) | |||
| 525 | ; | 531 | ; |
| 526 | desc->shadow_ptes[i] = spte; | 532 | desc->shadow_ptes[i] = spte; |
| 527 | } | 533 | } |
| 534 | return count; | ||
| 528 | } | 535 | } |
| 529 | 536 | ||
| 530 | static void rmap_desc_remove_entry(unsigned long *rmapp, | 537 | static void rmap_desc_remove_entry(unsigned long *rmapp, |
| @@ -754,6 +761,19 @@ static int kvm_age_rmapp(struct kvm *kvm, unsigned long *rmapp) | |||
| 754 | return young; | 761 | return young; |
| 755 | } | 762 | } |
| 756 | 763 | ||
| 764 | #define RMAP_RECYCLE_THRESHOLD 1000 | ||
| 765 | |||
| 766 | static void rmap_recycle(struct kvm_vcpu *vcpu, gfn_t gfn, int lpage) | ||
| 767 | { | ||
| 768 | unsigned long *rmapp; | ||
| 769 | |||
| 770 | gfn = unalias_gfn(vcpu->kvm, gfn); | ||
| 771 | rmapp = gfn_to_rmap(vcpu->kvm, gfn, lpage); | ||
| 772 | |||
| 773 | kvm_unmap_rmapp(vcpu->kvm, rmapp); | ||
| 774 | kvm_flush_remote_tlbs(vcpu->kvm); | ||
| 775 | } | ||
| 776 | |||
| 757 | int kvm_age_hva(struct kvm *kvm, unsigned long hva) | 777 | int kvm_age_hva(struct kvm *kvm, unsigned long hva) |
| 758 | { | 778 | { |
| 759 | return kvm_handle_hva(kvm, hva, kvm_age_rmapp); | 779 | return kvm_handle_hva(kvm, hva, kvm_age_rmapp); |
| @@ -1407,24 +1427,25 @@ static int kvm_mmu_zap_page(struct kvm *kvm, struct kvm_mmu_page *sp) | |||
| 1407 | */ | 1427 | */ |
| 1408 | void kvm_mmu_change_mmu_pages(struct kvm *kvm, unsigned int kvm_nr_mmu_pages) | 1428 | void kvm_mmu_change_mmu_pages(struct kvm *kvm, unsigned int kvm_nr_mmu_pages) |
| 1409 | { | 1429 | { |
| 1430 | int used_pages; | ||
| 1431 | |||
| 1432 | used_pages = kvm->arch.n_alloc_mmu_pages - kvm->arch.n_free_mmu_pages; | ||
| 1433 | used_pages = max(0, used_pages); | ||
| 1434 | |||
| 1410 | /* | 1435 | /* |
| 1411 | * If we set the number of mmu pages to be smaller be than the | 1436 | * If we set the number of mmu pages to be smaller be than the |
| 1412 | * number of actived pages , we must to free some mmu pages before we | 1437 | * number of actived pages , we must to free some mmu pages before we |
| 1413 | * change the value | 1438 | * change the value |
| 1414 | */ | 1439 | */ |
| 1415 | 1440 | ||
| 1416 | if ((kvm->arch.n_alloc_mmu_pages - kvm->arch.n_free_mmu_pages) > | 1441 | if (used_pages > kvm_nr_mmu_pages) { |
| 1417 | kvm_nr_mmu_pages) { | 1442 | while (used_pages > kvm_nr_mmu_pages) { |
| 1418 | int n_used_mmu_pages = kvm->arch.n_alloc_mmu_pages | ||
| 1419 | - kvm->arch.n_free_mmu_pages; | ||
| 1420 | |||
| 1421 | while (n_used_mmu_pages > kvm_nr_mmu_pages) { | ||
| 1422 | struct kvm_mmu_page *page; | 1443 | struct kvm_mmu_page *page; |
| 1423 | 1444 | ||
| 1424 | page = container_of(kvm->arch.active_mmu_pages.prev, | 1445 | page = container_of(kvm->arch.active_mmu_pages.prev, |
| 1425 | struct kvm_mmu_page, link); | 1446 | struct kvm_mmu_page, link); |
| 1426 | kvm_mmu_zap_page(kvm, page); | 1447 | kvm_mmu_zap_page(kvm, page); |
| 1427 | n_used_mmu_pages--; | 1448 | used_pages--; |
| 1428 | } | 1449 | } |
| 1429 | kvm->arch.n_free_mmu_pages = 0; | 1450 | kvm->arch.n_free_mmu_pages = 0; |
| 1430 | } | 1451 | } |
| @@ -1740,6 +1761,7 @@ static void mmu_set_spte(struct kvm_vcpu *vcpu, u64 *shadow_pte, | |||
| 1740 | { | 1761 | { |
| 1741 | int was_rmapped = 0; | 1762 | int was_rmapped = 0; |
| 1742 | int was_writeble = is_writeble_pte(*shadow_pte); | 1763 | int was_writeble = is_writeble_pte(*shadow_pte); |
| 1764 | int rmap_count; | ||
| 1743 | 1765 | ||
| 1744 | pgprintk("%s: spte %llx access %x write_fault %d" | 1766 | pgprintk("%s: spte %llx access %x write_fault %d" |
| 1745 | " user_fault %d gfn %lx\n", | 1767 | " user_fault %d gfn %lx\n", |
| @@ -1781,9 +1803,11 @@ static void mmu_set_spte(struct kvm_vcpu *vcpu, u64 *shadow_pte, | |||
| 1781 | 1803 | ||
| 1782 | page_header_update_slot(vcpu->kvm, shadow_pte, gfn); | 1804 | page_header_update_slot(vcpu->kvm, shadow_pte, gfn); |
| 1783 | if (!was_rmapped) { | 1805 | if (!was_rmapped) { |
| 1784 | rmap_add(vcpu, shadow_pte, gfn, largepage); | 1806 | rmap_count = rmap_add(vcpu, shadow_pte, gfn, largepage); |
| 1785 | if (!is_rmap_pte(*shadow_pte)) | 1807 | if (!is_rmap_pte(*shadow_pte)) |
| 1786 | kvm_release_pfn_clean(pfn); | 1808 | kvm_release_pfn_clean(pfn); |
| 1809 | if (rmap_count > RMAP_RECYCLE_THRESHOLD) | ||
| 1810 | rmap_recycle(vcpu, gfn, largepage); | ||
| 1787 | } else { | 1811 | } else { |
| 1788 | if (was_writeble) | 1812 | if (was_writeble) |
| 1789 | kvm_release_pfn_dirty(pfn); | 1813 | kvm_release_pfn_dirty(pfn); |
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 71510e07e69e..b1f658ad2f06 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
| @@ -711,6 +711,7 @@ static void svm_vcpu_load(struct kvm_vcpu *vcpu, int cpu) | |||
| 711 | svm->vmcb->control.tsc_offset += delta; | 711 | svm->vmcb->control.tsc_offset += delta; |
| 712 | vcpu->cpu = cpu; | 712 | vcpu->cpu = cpu; |
| 713 | kvm_migrate_timers(vcpu); | 713 | kvm_migrate_timers(vcpu); |
| 714 | svm->asid_generation = 0; | ||
| 714 | } | 715 | } |
| 715 | 716 | ||
| 716 | for (i = 0; i < NR_HOST_SAVE_USER_MSRS; i++) | 717 | for (i = 0; i < NR_HOST_SAVE_USER_MSRS; i++) |
| @@ -1031,7 +1032,6 @@ static void new_asid(struct vcpu_svm *svm, struct svm_cpu_data *svm_data) | |||
| 1031 | svm->vmcb->control.tlb_ctl = TLB_CONTROL_FLUSH_ALL_ASID; | 1032 | svm->vmcb->control.tlb_ctl = TLB_CONTROL_FLUSH_ALL_ASID; |
| 1032 | } | 1033 | } |
| 1033 | 1034 | ||
| 1034 | svm->vcpu.cpu = svm_data->cpu; | ||
| 1035 | svm->asid_generation = svm_data->asid_generation; | 1035 | svm->asid_generation = svm_data->asid_generation; |
| 1036 | svm->vmcb->control.asid = svm_data->next_asid++; | 1036 | svm->vmcb->control.asid = svm_data->next_asid++; |
| 1037 | } | 1037 | } |
| @@ -2300,8 +2300,8 @@ static void pre_svm_run(struct vcpu_svm *svm) | |||
| 2300 | struct svm_cpu_data *svm_data = per_cpu(svm_data, cpu); | 2300 | struct svm_cpu_data *svm_data = per_cpu(svm_data, cpu); |
| 2301 | 2301 | ||
| 2302 | svm->vmcb->control.tlb_ctl = TLB_CONTROL_DO_NOTHING; | 2302 | svm->vmcb->control.tlb_ctl = TLB_CONTROL_DO_NOTHING; |
| 2303 | if (svm->vcpu.cpu != cpu || | 2303 | /* FIXME: handle wraparound of asid_generation */ |
| 2304 | svm->asid_generation != svm_data->asid_generation) | 2304 | if (svm->asid_generation != svm_data->asid_generation) |
| 2305 | new_asid(svm, svm_data); | 2305 | new_asid(svm, svm_data); |
| 2306 | } | 2306 | } |
| 2307 | 2307 | ||
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 356a0ce85c68..29f912927a58 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
| @@ -3157,8 +3157,8 @@ static void handle_invalid_guest_state(struct kvm_vcpu *vcpu, | |||
| 3157 | struct vcpu_vmx *vmx = to_vmx(vcpu); | 3157 | struct vcpu_vmx *vmx = to_vmx(vcpu); |
| 3158 | enum emulation_result err = EMULATE_DONE; | 3158 | enum emulation_result err = EMULATE_DONE; |
| 3159 | 3159 | ||
| 3160 | preempt_enable(); | ||
| 3161 | local_irq_enable(); | 3160 | local_irq_enable(); |
| 3161 | preempt_enable(); | ||
| 3162 | 3162 | ||
| 3163 | while (!guest_state_valid(vcpu)) { | 3163 | while (!guest_state_valid(vcpu)) { |
| 3164 | err = emulate_instruction(vcpu, kvm_run, 0, 0, 0); | 3164 | err = emulate_instruction(vcpu, kvm_run, 0, 0, 0); |
| @@ -3168,7 +3168,7 @@ static void handle_invalid_guest_state(struct kvm_vcpu *vcpu, | |||
| 3168 | 3168 | ||
| 3169 | if (err != EMULATE_DONE) { | 3169 | if (err != EMULATE_DONE) { |
| 3170 | kvm_report_emulation_failure(vcpu, "emulation failure"); | 3170 | kvm_report_emulation_failure(vcpu, "emulation failure"); |
| 3171 | return; | 3171 | break; |
| 3172 | } | 3172 | } |
| 3173 | 3173 | ||
| 3174 | if (signal_pending(current)) | 3174 | if (signal_pending(current)) |
| @@ -3177,8 +3177,8 @@ static void handle_invalid_guest_state(struct kvm_vcpu *vcpu, | |||
| 3177 | schedule(); | 3177 | schedule(); |
| 3178 | } | 3178 | } |
| 3179 | 3179 | ||
| 3180 | local_irq_disable(); | ||
| 3181 | preempt_disable(); | 3180 | preempt_disable(); |
| 3181 | local_irq_disable(); | ||
| 3182 | 3182 | ||
| 3183 | vmx->invalid_state_emulation_result = err; | 3183 | vmx->invalid_state_emulation_result = err; |
| 3184 | } | 3184 | } |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index fe5474aec41a..3d4529011828 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
| @@ -704,11 +704,48 @@ static bool msr_mtrr_valid(unsigned msr) | |||
| 704 | return false; | 704 | return false; |
| 705 | } | 705 | } |
| 706 | 706 | ||
| 707 | static bool valid_pat_type(unsigned t) | ||
| 708 | { | ||
| 709 | return t < 8 && (1 << t) & 0xf3; /* 0, 1, 4, 5, 6, 7 */ | ||
| 710 | } | ||
| 711 | |||
| 712 | static bool valid_mtrr_type(unsigned t) | ||
| 713 | { | ||
| 714 | return t < 8 && (1 << t) & 0x73; /* 0, 1, 4, 5, 6 */ | ||
| 715 | } | ||
| 716 | |||
| 717 | static bool mtrr_valid(struct kvm_vcpu *vcpu, u32 msr, u64 data) | ||
| 718 | { | ||
| 719 | int i; | ||
| 720 | |||
| 721 | if (!msr_mtrr_valid(msr)) | ||
| 722 | return false; | ||
| 723 | |||
| 724 | if (msr == MSR_IA32_CR_PAT) { | ||
| 725 | for (i = 0; i < 8; i++) | ||
| 726 | if (!valid_pat_type((data >> (i * 8)) & 0xff)) | ||
| 727 | return false; | ||
| 728 | return true; | ||
| 729 | } else if (msr == MSR_MTRRdefType) { | ||
| 730 | if (data & ~0xcff) | ||
| 731 | return false; | ||
| 732 | return valid_mtrr_type(data & 0xff); | ||
| 733 | } else if (msr >= MSR_MTRRfix64K_00000 && msr <= MSR_MTRRfix4K_F8000) { | ||
| 734 | for (i = 0; i < 8 ; i++) | ||
| 735 | if (!valid_mtrr_type((data >> (i * 8)) & 0xff)) | ||
| 736 | return false; | ||
| 737 | return true; | ||
| 738 | } | ||
| 739 | |||
| 740 | /* variable MTRRs */ | ||
| 741 | return valid_mtrr_type(data & 0xff); | ||
| 742 | } | ||
| 743 | |||
| 707 | static int set_msr_mtrr(struct kvm_vcpu *vcpu, u32 msr, u64 data) | 744 | static int set_msr_mtrr(struct kvm_vcpu *vcpu, u32 msr, u64 data) |
| 708 | { | 745 | { |
| 709 | u64 *p = (u64 *)&vcpu->arch.mtrr_state.fixed_ranges; | 746 | u64 *p = (u64 *)&vcpu->arch.mtrr_state.fixed_ranges; |
| 710 | 747 | ||
| 711 | if (!msr_mtrr_valid(msr)) | 748 | if (!mtrr_valid(vcpu, msr, data)) |
| 712 | return 1; | 749 | return 1; |
| 713 | 750 | ||
| 714 | if (msr == MSR_MTRRdefType) { | 751 | if (msr == MSR_MTRRdefType) { |
| @@ -1079,14 +1116,13 @@ long kvm_arch_dev_ioctl(struct file *filp, | |||
| 1079 | if (copy_to_user(user_msr_list, &msr_list, sizeof msr_list)) | 1116 | if (copy_to_user(user_msr_list, &msr_list, sizeof msr_list)) |
| 1080 | goto out; | 1117 | goto out; |
| 1081 | r = -E2BIG; | 1118 | r = -E2BIG; |
| 1082 | if (n < num_msrs_to_save) | 1119 | if (n < msr_list.nmsrs) |
| 1083 | goto out; | 1120 | goto out; |
| 1084 | r = -EFAULT; | 1121 | r = -EFAULT; |
| 1085 | if (copy_to_user(user_msr_list->indices, &msrs_to_save, | 1122 | if (copy_to_user(user_msr_list->indices, &msrs_to_save, |
| 1086 | num_msrs_to_save * sizeof(u32))) | 1123 | num_msrs_to_save * sizeof(u32))) |
| 1087 | goto out; | 1124 | goto out; |
| 1088 | if (copy_to_user(user_msr_list->indices | 1125 | if (copy_to_user(user_msr_list->indices + num_msrs_to_save, |
| 1089 | + num_msrs_to_save * sizeof(u32), | ||
| 1090 | &emulated_msrs, | 1126 | &emulated_msrs, |
| 1091 | ARRAY_SIZE(emulated_msrs) * sizeof(u32))) | 1127 | ARRAY_SIZE(emulated_msrs) * sizeof(u32))) |
| 1092 | goto out; | 1128 | goto out; |
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 958c1fa41900..fe3eba5d6b3e 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -219,6 +219,8 @@ enum { | |||
| 219 | AHCI_HFLAG_SECT255 = (1 << 8), /* max 255 sectors */ | 219 | AHCI_HFLAG_SECT255 = (1 << 8), /* max 255 sectors */ |
| 220 | AHCI_HFLAG_YES_NCQ = (1 << 9), /* force NCQ cap on */ | 220 | AHCI_HFLAG_YES_NCQ = (1 << 9), /* force NCQ cap on */ |
| 221 | AHCI_HFLAG_NO_SUSPEND = (1 << 10), /* don't suspend */ | 221 | AHCI_HFLAG_NO_SUSPEND = (1 << 10), /* don't suspend */ |
| 222 | AHCI_HFLAG_SRST_TOUT_IS_OFFLINE = (1 << 11), /* treat SRST timeout as | ||
| 223 | link offline */ | ||
| 222 | 224 | ||
| 223 | /* ap->flags bits */ | 225 | /* ap->flags bits */ |
| 224 | 226 | ||
| @@ -1663,6 +1665,7 @@ static int ahci_do_softreset(struct ata_link *link, unsigned int *class, | |||
| 1663 | int (*check_ready)(struct ata_link *link)) | 1665 | int (*check_ready)(struct ata_link *link)) |
| 1664 | { | 1666 | { |
| 1665 | struct ata_port *ap = link->ap; | 1667 | struct ata_port *ap = link->ap; |
| 1668 | struct ahci_host_priv *hpriv = ap->host->private_data; | ||
| 1666 | const char *reason = NULL; | 1669 | const char *reason = NULL; |
| 1667 | unsigned long now, msecs; | 1670 | unsigned long now, msecs; |
| 1668 | struct ata_taskfile tf; | 1671 | struct ata_taskfile tf; |
| @@ -1701,12 +1704,21 @@ static int ahci_do_softreset(struct ata_link *link, unsigned int *class, | |||
| 1701 | 1704 | ||
| 1702 | /* wait for link to become ready */ | 1705 | /* wait for link to become ready */ |
| 1703 | rc = ata_wait_after_reset(link, deadline, check_ready); | 1706 | rc = ata_wait_after_reset(link, deadline, check_ready); |
| 1704 | /* link occupied, -ENODEV too is an error */ | 1707 | if (rc == -EBUSY && hpriv->flags & AHCI_HFLAG_SRST_TOUT_IS_OFFLINE) { |
| 1705 | if (rc) { | 1708 | /* |
| 1709 | * Workaround for cases where link online status can't | ||
| 1710 | * be trusted. Treat device readiness timeout as link | ||
| 1711 | * offline. | ||
| 1712 | */ | ||
| 1713 | ata_link_printk(link, KERN_INFO, | ||
| 1714 | "device not ready, treating as offline\n"); | ||
| 1715 | *class = ATA_DEV_NONE; | ||
| 1716 | } else if (rc) { | ||
| 1717 | /* link occupied, -ENODEV too is an error */ | ||
| 1706 | reason = "device not ready"; | 1718 | reason = "device not ready"; |
| 1707 | goto fail; | 1719 | goto fail; |
| 1708 | } | 1720 | } else |
| 1709 | *class = ahci_dev_classify(ap); | 1721 | *class = ahci_dev_classify(ap); |
| 1710 | 1722 | ||
| 1711 | DPRINTK("EXIT, class=%u\n", *class); | 1723 | DPRINTK("EXIT, class=%u\n", *class); |
| 1712 | return 0; | 1724 | return 0; |
| @@ -1773,7 +1785,8 @@ static int ahci_sb600_softreset(struct ata_link *link, unsigned int *class, | |||
| 1773 | irq_sts = readl(port_mmio + PORT_IRQ_STAT); | 1785 | irq_sts = readl(port_mmio + PORT_IRQ_STAT); |
| 1774 | if (irq_sts & PORT_IRQ_BAD_PMP) { | 1786 | if (irq_sts & PORT_IRQ_BAD_PMP) { |
| 1775 | ata_link_printk(link, KERN_WARNING, | 1787 | ata_link_printk(link, KERN_WARNING, |
| 1776 | "failed due to HW bug, retry pmp=0\n"); | 1788 | "applying SB600 PMP SRST workaround " |
| 1789 | "and retrying\n"); | ||
| 1777 | rc = ahci_do_softreset(link, class, 0, deadline, | 1790 | rc = ahci_do_softreset(link, class, 0, deadline, |
| 1778 | ahci_check_ready); | 1791 | ahci_check_ready); |
| 1779 | } | 1792 | } |
| @@ -2726,6 +2739,56 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) | |||
| 2726 | return !ver || strcmp(ver, dmi->driver_data) < 0; | 2739 | return !ver || strcmp(ver, dmi->driver_data) < 0; |
| 2727 | } | 2740 | } |
| 2728 | 2741 | ||
| 2742 | static bool ahci_broken_online(struct pci_dev *pdev) | ||
| 2743 | { | ||
| 2744 | #define ENCODE_BUSDEVFN(bus, slot, func) \ | ||
| 2745 | (void *)(unsigned long)(((bus) << 8) | PCI_DEVFN((slot), (func))) | ||
| 2746 | static const struct dmi_system_id sysids[] = { | ||
| 2747 | /* | ||
| 2748 | * There are several gigabyte boards which use | ||
| 2749 | * SIMG5723s configured as hardware RAID. Certain | ||
| 2750 | * 5723 firmware revisions shipped there keep the link | ||
| 2751 | * online but fail to answer properly to SRST or | ||
| 2752 | * IDENTIFY when no device is attached downstream | ||
| 2753 | * causing libata to retry quite a few times leading | ||
| 2754 | * to excessive detection delay. | ||
| 2755 | * | ||
| 2756 | * As these firmwares respond to the second reset try | ||
| 2757 | * with invalid device signature, considering unknown | ||
| 2758 | * sig as offline works around the problem acceptably. | ||
| 2759 | */ | ||
| 2760 | { | ||
| 2761 | .ident = "EP45-DQ6", | ||
| 2762 | .matches = { | ||
| 2763 | DMI_MATCH(DMI_BOARD_VENDOR, | ||
| 2764 | "Gigabyte Technology Co., Ltd."), | ||
| 2765 | DMI_MATCH(DMI_BOARD_NAME, "EP45-DQ6"), | ||
| 2766 | }, | ||
| 2767 | .driver_data = ENCODE_BUSDEVFN(0x0a, 0x00, 0), | ||
| 2768 | }, | ||
| 2769 | { | ||
| 2770 | .ident = "EP45-DS5", | ||
| 2771 | .matches = { | ||
| 2772 | DMI_MATCH(DMI_BOARD_VENDOR, | ||
| 2773 | "Gigabyte Technology Co., Ltd."), | ||
| 2774 | DMI_MATCH(DMI_BOARD_NAME, "EP45-DS5"), | ||
| 2775 | }, | ||
| 2776 | .driver_data = ENCODE_BUSDEVFN(0x03, 0x00, 0), | ||
| 2777 | }, | ||
| 2778 | { } /* terminate list */ | ||
| 2779 | }; | ||
| 2780 | #undef ENCODE_BUSDEVFN | ||
| 2781 | const struct dmi_system_id *dmi = dmi_first_match(sysids); | ||
| 2782 | unsigned int val; | ||
| 2783 | |||
| 2784 | if (!dmi) | ||
| 2785 | return false; | ||
| 2786 | |||
| 2787 | val = (unsigned long)dmi->driver_data; | ||
| 2788 | |||
| 2789 | return pdev->bus->number == (val >> 8) && pdev->devfn == (val & 0xff); | ||
| 2790 | } | ||
| 2791 | |||
| 2729 | static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | 2792 | static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) |
| 2730 | { | 2793 | { |
| 2731 | static int printed_version; | 2794 | static int printed_version; |
| @@ -2841,6 +2904,12 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 2841 | "BIOS update required for suspend/resume\n"); | 2904 | "BIOS update required for suspend/resume\n"); |
| 2842 | } | 2905 | } |
| 2843 | 2906 | ||
| 2907 | if (ahci_broken_online(pdev)) { | ||
| 2908 | hpriv->flags |= AHCI_HFLAG_SRST_TOUT_IS_OFFLINE; | ||
| 2909 | dev_info(&pdev->dev, | ||
| 2910 | "online status unreliable, applying workaround\n"); | ||
| 2911 | } | ||
| 2912 | |||
| 2844 | /* CAP.NP sometimes indicate the index of the last enabled | 2913 | /* CAP.NP sometimes indicate the index of the last enabled |
| 2845 | * port, at other times, that of the last possible port, so | 2914 | * port, at other times, that of the last possible port, so |
| 2846 | * determining the maximum port number requires looking at | 2915 | * determining the maximum port number requires looking at |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 8ac98ff16d7d..072ba5ea138f 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
| @@ -4302,6 +4302,9 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
| 4302 | { "WDC WD2500JD-00HBB0", "WD-WMAL71490727", ATA_HORKAGE_BROKEN_HPA }, | 4302 | { "WDC WD2500JD-00HBB0", "WD-WMAL71490727", ATA_HORKAGE_BROKEN_HPA }, |
| 4303 | { "MAXTOR 6L080L4", "A93.0500", ATA_HORKAGE_BROKEN_HPA }, | 4303 | { "MAXTOR 6L080L4", "A93.0500", ATA_HORKAGE_BROKEN_HPA }, |
| 4304 | 4304 | ||
| 4305 | /* this one allows HPA unlocking but fails IOs on the area */ | ||
| 4306 | { "OCZ-VERTEX", "1.30", ATA_HORKAGE_BROKEN_HPA }, | ||
| 4307 | |||
| 4305 | /* Devices which report 1 sector over size HPA */ | 4308 | /* Devices which report 1 sector over size HPA */ |
| 4306 | { "ST340823A", NULL, ATA_HORKAGE_HPA_SIZE, }, | 4309 | { "ST340823A", NULL, ATA_HORKAGE_HPA_SIZE, }, |
| 4307 | { "ST320413A", NULL, ATA_HORKAGE_HPA_SIZE, }, | 4310 | { "ST320413A", NULL, ATA_HORKAGE_HPA_SIZE, }, |
diff --git a/drivers/ata/pata_at91.c b/drivers/ata/pata_at91.c index 5702affcb325..41c94b1ae493 100644 --- a/drivers/ata/pata_at91.c +++ b/drivers/ata/pata_at91.c | |||
| @@ -250,7 +250,7 @@ static int __devinit pata_at91_probe(struct platform_device *pdev) | |||
| 250 | ata_port_desc(ap, "no IRQ, using PIO polling"); | 250 | ata_port_desc(ap, "no IRQ, using PIO polling"); |
| 251 | } | 251 | } |
| 252 | 252 | ||
| 253 | info = kzalloc(sizeof(*info), GFP_KERNEL); | 253 | info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL); |
| 254 | 254 | ||
| 255 | if (!info) { | 255 | if (!info) { |
| 256 | dev_err(dev, "failed to allocate memory for private data\n"); | 256 | dev_err(dev, "failed to allocate memory for private data\n"); |
| @@ -275,7 +275,7 @@ static int __devinit pata_at91_probe(struct platform_device *pdev) | |||
| 275 | if (!info->ide_addr) { | 275 | if (!info->ide_addr) { |
| 276 | dev_err(dev, "failed to map IO base\n"); | 276 | dev_err(dev, "failed to map IO base\n"); |
| 277 | ret = -ENOMEM; | 277 | ret = -ENOMEM; |
| 278 | goto err_ide_ioremap; | 278 | goto err_put; |
| 279 | } | 279 | } |
| 280 | 280 | ||
| 281 | info->alt_addr = devm_ioremap(dev, | 281 | info->alt_addr = devm_ioremap(dev, |
| @@ -284,7 +284,7 @@ static int __devinit pata_at91_probe(struct platform_device *pdev) | |||
| 284 | if (!info->alt_addr) { | 284 | if (!info->alt_addr) { |
| 285 | dev_err(dev, "failed to map CTL base\n"); | 285 | dev_err(dev, "failed to map CTL base\n"); |
| 286 | ret = -ENOMEM; | 286 | ret = -ENOMEM; |
| 287 | goto err_alt_ioremap; | 287 | goto err_put; |
| 288 | } | 288 | } |
| 289 | 289 | ||
| 290 | ap->ioaddr.cmd_addr = info->ide_addr; | 290 | ap->ioaddr.cmd_addr = info->ide_addr; |
| @@ -303,13 +303,8 @@ static int __devinit pata_at91_probe(struct platform_device *pdev) | |||
| 303 | irq ? ata_sff_interrupt : NULL, | 303 | irq ? ata_sff_interrupt : NULL, |
| 304 | irq_flags, &pata_at91_sht); | 304 | irq_flags, &pata_at91_sht); |
| 305 | 305 | ||
| 306 | err_alt_ioremap: | 306 | err_put: |
| 307 | devm_iounmap(dev, info->ide_addr); | ||
| 308 | |||
| 309 | err_ide_ioremap: | ||
| 310 | clk_put(info->mck); | 307 | clk_put(info->mck); |
| 311 | kfree(info); | ||
| 312 | |||
| 313 | return ret; | 308 | return ret; |
| 314 | } | 309 | } |
| 315 | 310 | ||
| @@ -317,7 +312,6 @@ static int __devexit pata_at91_remove(struct platform_device *pdev) | |||
| 317 | { | 312 | { |
| 318 | struct ata_host *host = dev_get_drvdata(&pdev->dev); | 313 | struct ata_host *host = dev_get_drvdata(&pdev->dev); |
| 319 | struct at91_ide_info *info; | 314 | struct at91_ide_info *info; |
| 320 | struct device *dev = &pdev->dev; | ||
| 321 | 315 | ||
| 322 | if (!host) | 316 | if (!host) |
| 323 | return 0; | 317 | return 0; |
| @@ -328,11 +322,8 @@ static int __devexit pata_at91_remove(struct platform_device *pdev) | |||
| 328 | if (!info) | 322 | if (!info) |
| 329 | return 0; | 323 | return 0; |
| 330 | 324 | ||
| 331 | devm_iounmap(dev, info->ide_addr); | ||
| 332 | devm_iounmap(dev, info->alt_addr); | ||
| 333 | clk_put(info->mck); | 325 | clk_put(info->mck); |
| 334 | 326 | ||
| 335 | kfree(info); | ||
| 336 | return 0; | 327 | return 0; |
| 337 | } | 328 | } |
| 338 | 329 | ||
diff --git a/drivers/ata/pata_atiixp.c b/drivers/ata/pata_atiixp.c index bec0b8ade66d..45915566e4e9 100644 --- a/drivers/ata/pata_atiixp.c +++ b/drivers/ata/pata_atiixp.c | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_atiixp.c - ATI PATA for new ATA layer | 2 | * pata_atiixp.c - ATI PATA for new ATA layer |
| 3 | * (C) 2005 Red Hat Inc | 3 | * (C) 2005 Red Hat Inc |
| 4 | * (C) 2009 Bartlomiej Zolnierkiewicz | ||
| 4 | * | 5 | * |
| 5 | * Based on | 6 | * Based on |
| 6 | * | 7 | * |
| @@ -61,20 +62,19 @@ static void atiixp_set_pio_timing(struct ata_port *ap, struct ata_device *adev, | |||
| 61 | 62 | ||
| 62 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 63 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
| 63 | int dn = 2 * ap->port_no + adev->devno; | 64 | int dn = 2 * ap->port_no + adev->devno; |
| 64 | |||
| 65 | /* Check this is correct - the order is odd in both drivers */ | ||
| 66 | int timing_shift = (16 * ap->port_no) + 8 * (adev->devno ^ 1); | 65 | int timing_shift = (16 * ap->port_no) + 8 * (adev->devno ^ 1); |
| 67 | u16 pio_mode_data, pio_timing_data; | 66 | u32 pio_timing_data; |
| 67 | u16 pio_mode_data; | ||
| 68 | 68 | ||
| 69 | pci_read_config_word(pdev, ATIIXP_IDE_PIO_MODE, &pio_mode_data); | 69 | pci_read_config_word(pdev, ATIIXP_IDE_PIO_MODE, &pio_mode_data); |
| 70 | pio_mode_data &= ~(0x7 << (4 * dn)); | 70 | pio_mode_data &= ~(0x7 << (4 * dn)); |
| 71 | pio_mode_data |= pio << (4 * dn); | 71 | pio_mode_data |= pio << (4 * dn); |
| 72 | pci_write_config_word(pdev, ATIIXP_IDE_PIO_MODE, pio_mode_data); | 72 | pci_write_config_word(pdev, ATIIXP_IDE_PIO_MODE, pio_mode_data); |
| 73 | 73 | ||
| 74 | pci_read_config_word(pdev, ATIIXP_IDE_PIO_TIMING, &pio_timing_data); | 74 | pci_read_config_dword(pdev, ATIIXP_IDE_PIO_TIMING, &pio_timing_data); |
| 75 | pio_timing_data &= ~(0xFF << timing_shift); | 75 | pio_timing_data &= ~(0xFF << timing_shift); |
| 76 | pio_timing_data |= (pio_timings[pio] << timing_shift); | 76 | pio_timing_data |= (pio_timings[pio] << timing_shift); |
| 77 | pci_write_config_word(pdev, ATIIXP_IDE_PIO_TIMING, pio_timing_data); | 77 | pci_write_config_dword(pdev, ATIIXP_IDE_PIO_TIMING, pio_timing_data); |
| 78 | } | 78 | } |
| 79 | 79 | ||
| 80 | /** | 80 | /** |
| @@ -119,16 +119,17 @@ static void atiixp_set_dmamode(struct ata_port *ap, struct ata_device *adev) | |||
| 119 | udma_mode_data |= dma << (4 * dn); | 119 | udma_mode_data |= dma << (4 * dn); |
| 120 | pci_write_config_word(pdev, ATIIXP_IDE_UDMA_MODE, udma_mode_data); | 120 | pci_write_config_word(pdev, ATIIXP_IDE_UDMA_MODE, udma_mode_data); |
| 121 | } else { | 121 | } else { |
| 122 | u16 mwdma_timing_data; | ||
| 123 | /* Check this is correct - the order is odd in both drivers */ | ||
| 124 | int timing_shift = (16 * ap->port_no) + 8 * (adev->devno ^ 1); | 122 | int timing_shift = (16 * ap->port_no) + 8 * (adev->devno ^ 1); |
| 123 | u32 mwdma_timing_data; | ||
| 125 | 124 | ||
| 126 | dma -= XFER_MW_DMA_0; | 125 | dma -= XFER_MW_DMA_0; |
| 127 | 126 | ||
| 128 | pci_read_config_word(pdev, ATIIXP_IDE_MWDMA_TIMING, &mwdma_timing_data); | 127 | pci_read_config_dword(pdev, ATIIXP_IDE_MWDMA_TIMING, |
| 128 | &mwdma_timing_data); | ||
| 129 | mwdma_timing_data &= ~(0xFF << timing_shift); | 129 | mwdma_timing_data &= ~(0xFF << timing_shift); |
| 130 | mwdma_timing_data |= (mwdma_timings[dma] << timing_shift); | 130 | mwdma_timing_data |= (mwdma_timings[dma] << timing_shift); |
| 131 | pci_write_config_word(pdev, ATIIXP_IDE_MWDMA_TIMING, mwdma_timing_data); | 131 | pci_write_config_dword(pdev, ATIIXP_IDE_MWDMA_TIMING, |
| 132 | mwdma_timing_data); | ||
| 132 | } | 133 | } |
| 133 | /* | 134 | /* |
| 134 | * We must now look at the PIO mode situation. We may need to | 135 | * We must now look at the PIO mode situation. We may need to |
diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c index b2d11f300c39..86a40582999c 100644 --- a/drivers/ata/sata_nv.c +++ b/drivers/ata/sata_nv.c | |||
| @@ -602,6 +602,7 @@ MODULE_VERSION(DRV_VERSION); | |||
| 602 | 602 | ||
| 603 | static int adma_enabled; | 603 | static int adma_enabled; |
| 604 | static int swncq_enabled = 1; | 604 | static int swncq_enabled = 1; |
| 605 | static int msi_enabled; | ||
| 605 | 606 | ||
| 606 | static void nv_adma_register_mode(struct ata_port *ap) | 607 | static void nv_adma_register_mode(struct ata_port *ap) |
| 607 | { | 608 | { |
| @@ -2459,6 +2460,11 @@ static int nv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 2459 | } else if (type == SWNCQ) | 2460 | } else if (type == SWNCQ) |
| 2460 | nv_swncq_host_init(host); | 2461 | nv_swncq_host_init(host); |
| 2461 | 2462 | ||
| 2463 | if (msi_enabled) { | ||
| 2464 | dev_printk(KERN_NOTICE, &pdev->dev, "Using MSI\n"); | ||
| 2465 | pci_enable_msi(pdev); | ||
| 2466 | } | ||
| 2467 | |||
| 2462 | pci_set_master(pdev); | 2468 | pci_set_master(pdev); |
| 2463 | return ata_host_activate(host, pdev->irq, ipriv->irq_handler, | 2469 | return ata_host_activate(host, pdev->irq, ipriv->irq_handler, |
| 2464 | IRQF_SHARED, ipriv->sht); | 2470 | IRQF_SHARED, ipriv->sht); |
| @@ -2558,4 +2564,6 @@ module_param_named(adma, adma_enabled, bool, 0444); | |||
| 2558 | MODULE_PARM_DESC(adma, "Enable use of ADMA (Default: false)"); | 2564 | MODULE_PARM_DESC(adma, "Enable use of ADMA (Default: false)"); |
| 2559 | module_param_named(swncq, swncq_enabled, bool, 0444); | 2565 | module_param_named(swncq, swncq_enabled, bool, 0444); |
| 2560 | MODULE_PARM_DESC(swncq, "Enable use of SWNCQ (Default: true)"); | 2566 | MODULE_PARM_DESC(swncq, "Enable use of SWNCQ (Default: true)"); |
| 2567 | module_param_named(msi, msi_enabled, bool, 0444); | ||
| 2568 | MODULE_PARM_DESC(msi, "Enable use of MSI (Default: false)"); | ||
| 2561 | 2569 | ||
diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 81cb01bfc356..456594bd97bc 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c | |||
| @@ -483,9 +483,6 @@ int platform_driver_register(struct platform_driver *drv) | |||
| 483 | drv->driver.remove = platform_drv_remove; | 483 | drv->driver.remove = platform_drv_remove; |
| 484 | if (drv->shutdown) | 484 | if (drv->shutdown) |
| 485 | drv->driver.shutdown = platform_drv_shutdown; | 485 | drv->driver.shutdown = platform_drv_shutdown; |
| 486 | if (drv->suspend || drv->resume) | ||
| 487 | pr_warning("Platform driver '%s' needs updating - please use " | ||
| 488 | "dev_pm_ops\n", drv->driver.name); | ||
| 489 | 486 | ||
| 490 | return driver_register(&drv->driver); | 487 | return driver_register(&drv->driver); |
| 491 | } | 488 | } |
diff --git a/drivers/char/pty.c b/drivers/char/pty.c index 6e6942c45f5b..d083c73d784a 100644 --- a/drivers/char/pty.c +++ b/drivers/char/pty.c | |||
| @@ -144,6 +144,8 @@ static int pty_write(struct tty_struct *tty, const unsigned char *buf, | |||
| 144 | 144 | ||
| 145 | static int pty_write_room(struct tty_struct *tty) | 145 | static int pty_write_room(struct tty_struct *tty) |
| 146 | { | 146 | { |
| 147 | if (tty->stopped) | ||
| 148 | return 0; | ||
| 147 | return pty_space(tty->link); | 149 | return pty_space(tty->link); |
| 148 | } | 150 | } |
| 149 | 151 | ||
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index b4a3dbcebe9b..f85aaf21e783 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
| @@ -566,7 +566,7 @@ int drm_wait_vblank(struct drm_device *dev, void *data, | |||
| 566 | 566 | ||
| 567 | ret = drm_vblank_get(dev, crtc); | 567 | ret = drm_vblank_get(dev, crtc); |
| 568 | if (ret) { | 568 | if (ret) { |
| 569 | DRM_ERROR("failed to acquire vblank counter, %d\n", ret); | 569 | DRM_DEBUG("failed to acquire vblank counter, %d\n", ret); |
| 570 | return ret; | 570 | return ret; |
| 571 | } | 571 | } |
| 572 | seq = drm_vblank_count(dev, crtc); | 572 | seq = drm_vblank_count(dev, crtc); |
diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c index 54f492a488a9..7914097b09c6 100644 --- a/drivers/gpu/drm/drm_modes.c +++ b/drivers/gpu/drm/drm_modes.c | |||
| @@ -566,6 +566,8 @@ void drm_mode_connector_list_update(struct drm_connector *connector) | |||
| 566 | found_it = 1; | 566 | found_it = 1; |
| 567 | /* if equal delete the probed mode */ | 567 | /* if equal delete the probed mode */ |
| 568 | mode->status = pmode->status; | 568 | mode->status = pmode->status; |
| 569 | /* Merge type bits together */ | ||
| 570 | mode->type |= pmode->type; | ||
| 569 | list_del(&pmode->head); | 571 | list_del(&pmode->head); |
| 570 | drm_mode_destroy(connector->dev, pmode); | 572 | drm_mode_destroy(connector->dev, pmode); |
| 571 | break; | 573 | break; |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 8c4783180bf6..50d1f782768c 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
| @@ -1186,6 +1186,13 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 1186 | if (ret) | 1186 | if (ret) |
| 1187 | goto out_iomapfree; | 1187 | goto out_iomapfree; |
| 1188 | 1188 | ||
| 1189 | dev_priv->wq = create_workqueue("i915"); | ||
| 1190 | if (dev_priv->wq == NULL) { | ||
| 1191 | DRM_ERROR("Failed to create our workqueue.\n"); | ||
| 1192 | ret = -ENOMEM; | ||
| 1193 | goto out_iomapfree; | ||
| 1194 | } | ||
| 1195 | |||
| 1189 | /* enable GEM by default */ | 1196 | /* enable GEM by default */ |
| 1190 | dev_priv->has_gem = 1; | 1197 | dev_priv->has_gem = 1; |
| 1191 | 1198 | ||
| @@ -1211,7 +1218,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 1211 | if (!I915_NEED_GFX_HWS(dev)) { | 1218 | if (!I915_NEED_GFX_HWS(dev)) { |
| 1212 | ret = i915_init_phys_hws(dev); | 1219 | ret = i915_init_phys_hws(dev); |
| 1213 | if (ret != 0) | 1220 | if (ret != 0) |
| 1214 | goto out_iomapfree; | 1221 | goto out_workqueue_free; |
| 1215 | } | 1222 | } |
| 1216 | 1223 | ||
| 1217 | i915_get_mem_freq(dev); | 1224 | i915_get_mem_freq(dev); |
| @@ -1245,7 +1252,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 1245 | ret = i915_load_modeset_init(dev, prealloc_size, agp_size); | 1252 | ret = i915_load_modeset_init(dev, prealloc_size, agp_size); |
| 1246 | if (ret < 0) { | 1253 | if (ret < 0) { |
| 1247 | DRM_ERROR("failed to init modeset\n"); | 1254 | DRM_ERROR("failed to init modeset\n"); |
| 1248 | goto out_rmmap; | 1255 | goto out_workqueue_free; |
| 1249 | } | 1256 | } |
| 1250 | } | 1257 | } |
| 1251 | 1258 | ||
| @@ -1256,6 +1263,8 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 1256 | 1263 | ||
| 1257 | return 0; | 1264 | return 0; |
| 1258 | 1265 | ||
| 1266 | out_workqueue_free: | ||
| 1267 | destroy_workqueue(dev_priv->wq); | ||
| 1259 | out_iomapfree: | 1268 | out_iomapfree: |
| 1260 | io_mapping_free(dev_priv->mm.gtt_mapping); | 1269 | io_mapping_free(dev_priv->mm.gtt_mapping); |
| 1261 | out_rmmap: | 1270 | out_rmmap: |
| @@ -1269,6 +1278,8 @@ int i915_driver_unload(struct drm_device *dev) | |||
| 1269 | { | 1278 | { |
| 1270 | struct drm_i915_private *dev_priv = dev->dev_private; | 1279 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 1271 | 1280 | ||
| 1281 | destroy_workqueue(dev_priv->wq); | ||
| 1282 | |||
| 1272 | io_mapping_free(dev_priv->mm.gtt_mapping); | 1283 | io_mapping_free(dev_priv->mm.gtt_mapping); |
| 1273 | if (dev_priv->mm.gtt_mtrr >= 0) { | 1284 | if (dev_priv->mm.gtt_mtrr >= 0) { |
| 1274 | mtrr_del(dev_priv->mm.gtt_mtrr, dev->agp->base, | 1285 | mtrr_del(dev_priv->mm.gtt_mtrr, dev->agp->base, |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index d08752875885..7537f57d8a87 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -219,6 +219,7 @@ typedef struct drm_i915_private { | |||
| 219 | unsigned int lvds_vbt:1; | 219 | unsigned int lvds_vbt:1; |
| 220 | unsigned int int_crt_support:1; | 220 | unsigned int int_crt_support:1; |
| 221 | unsigned int lvds_use_ssc:1; | 221 | unsigned int lvds_use_ssc:1; |
| 222 | unsigned int edp_support:1; | ||
| 222 | int lvds_ssc_freq; | 223 | int lvds_ssc_freq; |
| 223 | 224 | ||
| 224 | struct drm_i915_fence_reg fence_regs[16]; /* assume 965 */ | 225 | struct drm_i915_fence_reg fence_regs[16]; /* assume 965 */ |
| @@ -229,6 +230,8 @@ typedef struct drm_i915_private { | |||
| 229 | 230 | ||
| 230 | spinlock_t error_lock; | 231 | spinlock_t error_lock; |
| 231 | struct drm_i915_error_state *first_error; | 232 | struct drm_i915_error_state *first_error; |
| 233 | struct work_struct error_work; | ||
| 234 | struct workqueue_struct *wq; | ||
| 232 | 235 | ||
| 233 | /* Register state */ | 236 | /* Register state */ |
| 234 | u8 saveLBB; | 237 | u8 saveLBB; |
| @@ -888,6 +891,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller); | |||
| 888 | IS_I915GM(dev))) | 891 | IS_I915GM(dev))) |
| 889 | #define SUPPORTS_INTEGRATED_HDMI(dev) (IS_G4X(dev) || IS_IGDNG(dev)) | 892 | #define SUPPORTS_INTEGRATED_HDMI(dev) (IS_G4X(dev) || IS_IGDNG(dev)) |
| 890 | #define SUPPORTS_INTEGRATED_DP(dev) (IS_G4X(dev) || IS_IGDNG(dev)) | 893 | #define SUPPORTS_INTEGRATED_DP(dev) (IS_G4X(dev) || IS_IGDNG(dev)) |
| 894 | #define SUPPORTS_EDP(dev) (IS_IGDNG_M(dev)) | ||
| 891 | #define I915_HAS_HOTPLUG(dev) (IS_I945G(dev) || IS_I945GM(dev) || IS_I965G(dev)) | 895 | #define I915_HAS_HOTPLUG(dev) (IS_I945G(dev) || IS_I945GM(dev) || IS_I965G(dev)) |
| 892 | /* dsparb controlled by hw only */ | 896 | /* dsparb controlled by hw only */ |
| 893 | #define DSPARB_HWCONTROL(dev) (IS_G4X(dev) || IS_IGDNG(dev)) | 897 | #define DSPARB_HWCONTROL(dev) (IS_G4X(dev) || IS_IGDNG(dev)) |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 5bf420378b6d..140bee142fc2 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -1570,7 +1570,7 @@ i915_add_request(struct drm_device *dev, struct drm_file *file_priv, | |||
| 1570 | } | 1570 | } |
| 1571 | 1571 | ||
| 1572 | if (was_empty && !dev_priv->mm.suspended) | 1572 | if (was_empty && !dev_priv->mm.suspended) |
| 1573 | schedule_delayed_work(&dev_priv->mm.retire_work, HZ); | 1573 | queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, HZ); |
| 1574 | return seqno; | 1574 | return seqno; |
| 1575 | } | 1575 | } |
| 1576 | 1576 | ||
| @@ -1719,7 +1719,7 @@ i915_gem_retire_work_handler(struct work_struct *work) | |||
| 1719 | i915_gem_retire_requests(dev); | 1719 | i915_gem_retire_requests(dev); |
| 1720 | if (!dev_priv->mm.suspended && | 1720 | if (!dev_priv->mm.suspended && |
| 1721 | !list_empty(&dev_priv->mm.request_list)) | 1721 | !list_empty(&dev_priv->mm.request_list)) |
| 1722 | schedule_delayed_work(&dev_priv->mm.retire_work, HZ); | 1722 | queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, HZ); |
| 1723 | mutex_unlock(&dev->struct_mutex); | 1723 | mutex_unlock(&dev->struct_mutex); |
| 1724 | } | 1724 | } |
| 1725 | 1725 | ||
diff --git a/drivers/gpu/drm/i915/i915_gem_debugfs.c b/drivers/gpu/drm/i915/i915_gem_debugfs.c index 9a44bfcb8139..cb3b97405fbf 100644 --- a/drivers/gpu/drm/i915/i915_gem_debugfs.c +++ b/drivers/gpu/drm/i915/i915_gem_debugfs.c | |||
| @@ -343,6 +343,8 @@ static int i915_error_state(struct seq_file *m, void *unused) | |||
| 343 | 343 | ||
| 344 | error = dev_priv->first_error; | 344 | error = dev_priv->first_error; |
| 345 | 345 | ||
| 346 | seq_printf(m, "Time: %ld s %ld us\n", error->time.tv_sec, | ||
| 347 | error->time.tv_usec); | ||
| 346 | seq_printf(m, "EIR: 0x%08x\n", error->eir); | 348 | seq_printf(m, "EIR: 0x%08x\n", error->eir); |
| 347 | seq_printf(m, " PGTBL_ER: 0x%08x\n", error->pgtbl_er); | 349 | seq_printf(m, " PGTBL_ER: 0x%08x\n", error->pgtbl_er); |
| 348 | seq_printf(m, " INSTPM: 0x%08x\n", error->instpm); | 350 | seq_printf(m, " INSTPM: 0x%08x\n", error->instpm); |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 7ba23a69a0c0..7ebc84c2881e 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -190,7 +190,7 @@ u32 i915_get_vblank_counter(struct drm_device *dev, int pipe) | |||
| 190 | low_frame = pipe ? PIPEBFRAMEPIXEL : PIPEAFRAMEPIXEL; | 190 | low_frame = pipe ? PIPEBFRAMEPIXEL : PIPEAFRAMEPIXEL; |
| 191 | 191 | ||
| 192 | if (!i915_pipe_enabled(dev, pipe)) { | 192 | if (!i915_pipe_enabled(dev, pipe)) { |
| 193 | DRM_ERROR("trying to get vblank count for disabled pipe %d\n", pipe); | 193 | DRM_DEBUG("trying to get vblank count for disabled pipe %d\n", pipe); |
| 194 | return 0; | 194 | return 0; |
| 195 | } | 195 | } |
| 196 | 196 | ||
| @@ -219,7 +219,7 @@ u32 gm45_get_vblank_counter(struct drm_device *dev, int pipe) | |||
| 219 | int reg = pipe ? PIPEB_FRMCOUNT_GM45 : PIPEA_FRMCOUNT_GM45; | 219 | int reg = pipe ? PIPEB_FRMCOUNT_GM45 : PIPEA_FRMCOUNT_GM45; |
| 220 | 220 | ||
| 221 | if (!i915_pipe_enabled(dev, pipe)) { | 221 | if (!i915_pipe_enabled(dev, pipe)) { |
| 222 | DRM_ERROR("trying to get vblank count for disabled pipe %d\n", pipe); | 222 | DRM_DEBUG("trying to get vblank count for disabled pipe %d\n", pipe); |
| 223 | return 0; | 223 | return 0; |
| 224 | } | 224 | } |
| 225 | 225 | ||
| @@ -290,6 +290,35 @@ irqreturn_t igdng_irq_handler(struct drm_device *dev) | |||
| 290 | return ret; | 290 | return ret; |
| 291 | } | 291 | } |
| 292 | 292 | ||
| 293 | /** | ||
| 294 | * i915_error_work_func - do process context error handling work | ||
| 295 | * @work: work struct | ||
| 296 | * | ||
| 297 | * Fire an error uevent so userspace can see that a hang or error | ||
| 298 | * was detected. | ||
| 299 | */ | ||
| 300 | static void i915_error_work_func(struct work_struct *work) | ||
| 301 | { | ||
| 302 | drm_i915_private_t *dev_priv = container_of(work, drm_i915_private_t, | ||
| 303 | error_work); | ||
| 304 | struct drm_device *dev = dev_priv->dev; | ||
| 305 | char *event_string = "ERROR=1"; | ||
| 306 | char *envp[] = { event_string, NULL }; | ||
| 307 | |||
| 308 | DRM_DEBUG("generating error event\n"); | ||
| 309 | |||
| 310 | kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, envp); | ||
| 311 | } | ||
| 312 | |||
| 313 | /** | ||
| 314 | * i915_capture_error_state - capture an error record for later analysis | ||
| 315 | * @dev: drm device | ||
| 316 | * | ||
| 317 | * Should be called when an error is detected (either a hang or an error | ||
| 318 | * interrupt) to capture error state from the time of the error. Fills | ||
| 319 | * out a structure which becomes available in debugfs for user level tools | ||
| 320 | * to pick up. | ||
| 321 | */ | ||
| 293 | static void i915_capture_error_state(struct drm_device *dev) | 322 | static void i915_capture_error_state(struct drm_device *dev) |
| 294 | { | 323 | { |
| 295 | struct drm_i915_private *dev_priv = dev->dev_private; | 324 | struct drm_i915_private *dev_priv = dev->dev_private; |
| @@ -325,12 +354,137 @@ static void i915_capture_error_state(struct drm_device *dev) | |||
| 325 | error->acthd = I915_READ(ACTHD_I965); | 354 | error->acthd = I915_READ(ACTHD_I965); |
| 326 | } | 355 | } |
| 327 | 356 | ||
| 357 | do_gettimeofday(&error->time); | ||
| 358 | |||
| 328 | dev_priv->first_error = error; | 359 | dev_priv->first_error = error; |
| 329 | 360 | ||
| 330 | out: | 361 | out: |
| 331 | spin_unlock_irqrestore(&dev_priv->error_lock, flags); | 362 | spin_unlock_irqrestore(&dev_priv->error_lock, flags); |
| 332 | } | 363 | } |
| 333 | 364 | ||
| 365 | /** | ||
| 366 | * i915_handle_error - handle an error interrupt | ||
| 367 | * @dev: drm device | ||
| 368 | * | ||
| 369 | * Do some basic checking of regsiter state at error interrupt time and | ||
| 370 | * dump it to the syslog. Also call i915_capture_error_state() to make | ||
| 371 | * sure we get a record and make it available in debugfs. Fire a uevent | ||
| 372 | * so userspace knows something bad happened (should trigger collection | ||
| 373 | * of a ring dump etc.). | ||
| 374 | */ | ||
| 375 | static void i915_handle_error(struct drm_device *dev) | ||
| 376 | { | ||
| 377 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 378 | u32 eir = I915_READ(EIR); | ||
| 379 | u32 pipea_stats = I915_READ(PIPEASTAT); | ||
| 380 | u32 pipeb_stats = I915_READ(PIPEBSTAT); | ||
| 381 | |||
| 382 | i915_capture_error_state(dev); | ||
| 383 | |||
| 384 | printk(KERN_ERR "render error detected, EIR: 0x%08x\n", | ||
| 385 | eir); | ||
| 386 | |||
| 387 | if (IS_G4X(dev)) { | ||
| 388 | if (eir & (GM45_ERROR_MEM_PRIV | GM45_ERROR_CP_PRIV)) { | ||
| 389 | u32 ipeir = I915_READ(IPEIR_I965); | ||
| 390 | |||
| 391 | printk(KERN_ERR " IPEIR: 0x%08x\n", | ||
| 392 | I915_READ(IPEIR_I965)); | ||
| 393 | printk(KERN_ERR " IPEHR: 0x%08x\n", | ||
| 394 | I915_READ(IPEHR_I965)); | ||
| 395 | printk(KERN_ERR " INSTDONE: 0x%08x\n", | ||
| 396 | I915_READ(INSTDONE_I965)); | ||
| 397 | printk(KERN_ERR " INSTPS: 0x%08x\n", | ||
| 398 | I915_READ(INSTPS)); | ||
| 399 | printk(KERN_ERR " INSTDONE1: 0x%08x\n", | ||
| 400 | I915_READ(INSTDONE1)); | ||
| 401 | printk(KERN_ERR " ACTHD: 0x%08x\n", | ||
| 402 | I915_READ(ACTHD_I965)); | ||
| 403 | I915_WRITE(IPEIR_I965, ipeir); | ||
| 404 | (void)I915_READ(IPEIR_I965); | ||
| 405 | } | ||
| 406 | if (eir & GM45_ERROR_PAGE_TABLE) { | ||
| 407 | u32 pgtbl_err = I915_READ(PGTBL_ER); | ||
| 408 | printk(KERN_ERR "page table error\n"); | ||
| 409 | printk(KERN_ERR " PGTBL_ER: 0x%08x\n", | ||
| 410 | pgtbl_err); | ||
| 411 | I915_WRITE(PGTBL_ER, pgtbl_err); | ||
| 412 | (void)I915_READ(PGTBL_ER); | ||
| 413 | } | ||
| 414 | } | ||
| 415 | |||
| 416 | if (IS_I9XX(dev)) { | ||
| 417 | if (eir & I915_ERROR_PAGE_TABLE) { | ||
| 418 | u32 pgtbl_err = I915_READ(PGTBL_ER); | ||
| 419 | printk(KERN_ERR "page table error\n"); | ||
| 420 | printk(KERN_ERR " PGTBL_ER: 0x%08x\n", | ||
| 421 | pgtbl_err); | ||
| 422 | I915_WRITE(PGTBL_ER, pgtbl_err); | ||
| 423 | (void)I915_READ(PGTBL_ER); | ||
| 424 | } | ||
| 425 | } | ||
| 426 | |||
| 427 | if (eir & I915_ERROR_MEMORY_REFRESH) { | ||
| 428 | printk(KERN_ERR "memory refresh error\n"); | ||
| 429 | printk(KERN_ERR "PIPEASTAT: 0x%08x\n", | ||
| 430 | pipea_stats); | ||
| 431 | printk(KERN_ERR "PIPEBSTAT: 0x%08x\n", | ||
| 432 | pipeb_stats); | ||
| 433 | /* pipestat has already been acked */ | ||
| 434 | } | ||
| 435 | if (eir & I915_ERROR_INSTRUCTION) { | ||
| 436 | printk(KERN_ERR "instruction error\n"); | ||
| 437 | printk(KERN_ERR " INSTPM: 0x%08x\n", | ||
| 438 | I915_READ(INSTPM)); | ||
| 439 | if (!IS_I965G(dev)) { | ||
| 440 | u32 ipeir = I915_READ(IPEIR); | ||
| 441 | |||
| 442 | printk(KERN_ERR " IPEIR: 0x%08x\n", | ||
| 443 | I915_READ(IPEIR)); | ||
| 444 | printk(KERN_ERR " IPEHR: 0x%08x\n", | ||
| 445 | I915_READ(IPEHR)); | ||
| 446 | printk(KERN_ERR " INSTDONE: 0x%08x\n", | ||
| 447 | I915_READ(INSTDONE)); | ||
| 448 | printk(KERN_ERR " ACTHD: 0x%08x\n", | ||
| 449 | I915_READ(ACTHD)); | ||
| 450 | I915_WRITE(IPEIR, ipeir); | ||
| 451 | (void)I915_READ(IPEIR); | ||
| 452 | } else { | ||
| 453 | u32 ipeir = I915_READ(IPEIR_I965); | ||
| 454 | |||
| 455 | printk(KERN_ERR " IPEIR: 0x%08x\n", | ||
| 456 | I915_READ(IPEIR_I965)); | ||
| 457 | printk(KERN_ERR " IPEHR: 0x%08x\n", | ||
| 458 | I915_READ(IPEHR_I965)); | ||
| 459 | printk(KERN_ERR " INSTDONE: 0x%08x\n", | ||
| 460 | I915_READ(INSTDONE_I965)); | ||
| 461 | printk(KERN_ERR " INSTPS: 0x%08x\n", | ||
| 462 | I915_READ(INSTPS)); | ||
| 463 | printk(KERN_ERR " INSTDONE1: 0x%08x\n", | ||
| 464 | I915_READ(INSTDONE1)); | ||
| 465 | printk(KERN_ERR " ACTHD: 0x%08x\n", | ||
| 466 | I915_READ(ACTHD_I965)); | ||
| 467 | I915_WRITE(IPEIR_I965, ipeir); | ||
| 468 | (void)I915_READ(IPEIR_I965); | ||
| 469 | } | ||
| 470 | } | ||
| 471 | |||
| 472 | I915_WRITE(EIR, eir); | ||
| 473 | (void)I915_READ(EIR); | ||
| 474 | eir = I915_READ(EIR); | ||
| 475 | if (eir) { | ||
| 476 | /* | ||
| 477 | * some errors might have become stuck, | ||
| 478 | * mask them. | ||
| 479 | */ | ||
| 480 | DRM_ERROR("EIR stuck: 0x%08x, masking\n", eir); | ||
| 481 | I915_WRITE(EMR, I915_READ(EMR) | eir); | ||
| 482 | I915_WRITE(IIR, I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT); | ||
| 483 | } | ||
| 484 | |||
| 485 | queue_work(dev_priv->wq, &dev_priv->error_work); | ||
| 486 | } | ||
| 487 | |||
| 334 | irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) | 488 | irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) |
| 335 | { | 489 | { |
| 336 | struct drm_device *dev = (struct drm_device *) arg; | 490 | struct drm_device *dev = (struct drm_device *) arg; |
| @@ -372,6 +526,9 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) | |||
| 372 | pipea_stats = I915_READ(PIPEASTAT); | 526 | pipea_stats = I915_READ(PIPEASTAT); |
| 373 | pipeb_stats = I915_READ(PIPEBSTAT); | 527 | pipeb_stats = I915_READ(PIPEBSTAT); |
| 374 | 528 | ||
| 529 | if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) | ||
| 530 | i915_handle_error(dev); | ||
| 531 | |||
| 375 | /* | 532 | /* |
| 376 | * Clear the PIPE(A|B)STAT regs before the IIR | 533 | * Clear the PIPE(A|B)STAT regs before the IIR |
| 377 | */ | 534 | */ |
| @@ -403,86 +560,13 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) | |||
| 403 | DRM_DEBUG("hotplug event received, stat 0x%08x\n", | 560 | DRM_DEBUG("hotplug event received, stat 0x%08x\n", |
| 404 | hotplug_status); | 561 | hotplug_status); |
| 405 | if (hotplug_status & dev_priv->hotplug_supported_mask) | 562 | if (hotplug_status & dev_priv->hotplug_supported_mask) |
| 406 | schedule_work(&dev_priv->hotplug_work); | 563 | queue_work(dev_priv->wq, |
| 564 | &dev_priv->hotplug_work); | ||
| 407 | 565 | ||
| 408 | I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status); | 566 | I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status); |
| 409 | I915_READ(PORT_HOTPLUG_STAT); | 567 | I915_READ(PORT_HOTPLUG_STAT); |
| 410 | } | 568 | } |
| 411 | 569 | ||
| 412 | if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) { | ||
| 413 | u32 eir = I915_READ(EIR); | ||
| 414 | |||
| 415 | i915_capture_error_state(dev); | ||
| 416 | |||
| 417 | printk(KERN_ERR "render error detected, EIR: 0x%08x\n", | ||
| 418 | eir); | ||
| 419 | if (eir & I915_ERROR_PAGE_TABLE) { | ||
| 420 | u32 pgtbl_err = I915_READ(PGTBL_ER); | ||
| 421 | printk(KERN_ERR "page table error\n"); | ||
| 422 | printk(KERN_ERR " PGTBL_ER: 0x%08x\n", | ||
| 423 | pgtbl_err); | ||
| 424 | I915_WRITE(PGTBL_ER, pgtbl_err); | ||
| 425 | (void)I915_READ(PGTBL_ER); | ||
| 426 | } | ||
| 427 | if (eir & I915_ERROR_MEMORY_REFRESH) { | ||
| 428 | printk(KERN_ERR "memory refresh error\n"); | ||
| 429 | printk(KERN_ERR "PIPEASTAT: 0x%08x\n", | ||
| 430 | pipea_stats); | ||
| 431 | printk(KERN_ERR "PIPEBSTAT: 0x%08x\n", | ||
| 432 | pipeb_stats); | ||
| 433 | /* pipestat has already been acked */ | ||
| 434 | } | ||
| 435 | if (eir & I915_ERROR_INSTRUCTION) { | ||
| 436 | printk(KERN_ERR "instruction error\n"); | ||
| 437 | printk(KERN_ERR " INSTPM: 0x%08x\n", | ||
| 438 | I915_READ(INSTPM)); | ||
| 439 | if (!IS_I965G(dev)) { | ||
| 440 | u32 ipeir = I915_READ(IPEIR); | ||
| 441 | |||
| 442 | printk(KERN_ERR " IPEIR: 0x%08x\n", | ||
| 443 | I915_READ(IPEIR)); | ||
| 444 | printk(KERN_ERR " IPEHR: 0x%08x\n", | ||
| 445 | I915_READ(IPEHR)); | ||
| 446 | printk(KERN_ERR " INSTDONE: 0x%08x\n", | ||
| 447 | I915_READ(INSTDONE)); | ||
| 448 | printk(KERN_ERR " ACTHD: 0x%08x\n", | ||
| 449 | I915_READ(ACTHD)); | ||
| 450 | I915_WRITE(IPEIR, ipeir); | ||
| 451 | (void)I915_READ(IPEIR); | ||
| 452 | } else { | ||
| 453 | u32 ipeir = I915_READ(IPEIR_I965); | ||
| 454 | |||
| 455 | printk(KERN_ERR " IPEIR: 0x%08x\n", | ||
| 456 | I915_READ(IPEIR_I965)); | ||
| 457 | printk(KERN_ERR " IPEHR: 0x%08x\n", | ||
| 458 | I915_READ(IPEHR_I965)); | ||
| 459 | printk(KERN_ERR " INSTDONE: 0x%08x\n", | ||
| 460 | I915_READ(INSTDONE_I965)); | ||
| 461 | printk(KERN_ERR " INSTPS: 0x%08x\n", | ||
| 462 | I915_READ(INSTPS)); | ||
| 463 | printk(KERN_ERR " INSTDONE1: 0x%08x\n", | ||
| 464 | I915_READ(INSTDONE1)); | ||
| 465 | printk(KERN_ERR " ACTHD: 0x%08x\n", | ||
| 466 | I915_READ(ACTHD_I965)); | ||
| 467 | I915_WRITE(IPEIR_I965, ipeir); | ||
| 468 | (void)I915_READ(IPEIR_I965); | ||
| 469 | } | ||
| 470 | } | ||
| 471 | |||
| 472 | I915_WRITE(EIR, eir); | ||
| 473 | (void)I915_READ(EIR); | ||
| 474 | eir = I915_READ(EIR); | ||
| 475 | if (eir) { | ||
| 476 | /* | ||
| 477 | * some errors might have become stuck, | ||
| 478 | * mask them. | ||
| 479 | */ | ||
| 480 | DRM_ERROR("EIR stuck: 0x%08x, masking\n", eir); | ||
| 481 | I915_WRITE(EMR, I915_READ(EMR) | eir); | ||
| 482 | I915_WRITE(IIR, I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT); | ||
| 483 | } | ||
| 484 | } | ||
| 485 | |||
| 486 | I915_WRITE(IIR, iir); | 570 | I915_WRITE(IIR, iir); |
| 487 | new_iir = I915_READ(IIR); /* Flush posted writes */ | 571 | new_iir = I915_READ(IIR); /* Flush posted writes */ |
| 488 | 572 | ||
| @@ -830,6 +914,7 @@ void i915_driver_irq_preinstall(struct drm_device * dev) | |||
| 830 | atomic_set(&dev_priv->irq_received, 0); | 914 | atomic_set(&dev_priv->irq_received, 0); |
| 831 | 915 | ||
| 832 | INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func); | 916 | INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func); |
| 917 | INIT_WORK(&dev_priv->error_work, i915_error_work_func); | ||
| 833 | 918 | ||
| 834 | if (IS_IGDNG(dev)) { | 919 | if (IS_IGDNG(dev)) { |
| 835 | igdng_irq_preinstall(dev); | 920 | igdng_irq_preinstall(dev); |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 6c0858484094..2955083aa471 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
| @@ -1395,6 +1395,7 @@ | |||
| 1395 | #define TV_V_CHROMA_42 0x684a8 | 1395 | #define TV_V_CHROMA_42 0x684a8 |
| 1396 | 1396 | ||
| 1397 | /* Display Port */ | 1397 | /* Display Port */ |
| 1398 | #define DP_A 0x64000 /* eDP */ | ||
| 1398 | #define DP_B 0x64100 | 1399 | #define DP_B 0x64100 |
| 1399 | #define DP_C 0x64200 | 1400 | #define DP_C 0x64200 |
| 1400 | #define DP_D 0x64300 | 1401 | #define DP_D 0x64300 |
| @@ -1437,13 +1438,22 @@ | |||
| 1437 | /* Mystic DPCD version 1.1 special mode */ | 1438 | /* Mystic DPCD version 1.1 special mode */ |
| 1438 | #define DP_ENHANCED_FRAMING (1 << 18) | 1439 | #define DP_ENHANCED_FRAMING (1 << 18) |
| 1439 | 1440 | ||
| 1441 | /* eDP */ | ||
| 1442 | #define DP_PLL_FREQ_270MHZ (0 << 16) | ||
| 1443 | #define DP_PLL_FREQ_160MHZ (1 << 16) | ||
| 1444 | #define DP_PLL_FREQ_MASK (3 << 16) | ||
| 1445 | |||
| 1440 | /** locked once port is enabled */ | 1446 | /** locked once port is enabled */ |
| 1441 | #define DP_PORT_REVERSAL (1 << 15) | 1447 | #define DP_PORT_REVERSAL (1 << 15) |
| 1442 | 1448 | ||
| 1449 | /* eDP */ | ||
| 1450 | #define DP_PLL_ENABLE (1 << 14) | ||
| 1451 | |||
| 1443 | /** sends the clock on lane 15 of the PEG for debug */ | 1452 | /** sends the clock on lane 15 of the PEG for debug */ |
| 1444 | #define DP_CLOCK_OUTPUT_ENABLE (1 << 13) | 1453 | #define DP_CLOCK_OUTPUT_ENABLE (1 << 13) |
| 1445 | 1454 | ||
| 1446 | #define DP_SCRAMBLING_DISABLE (1 << 12) | 1455 | #define DP_SCRAMBLING_DISABLE (1 << 12) |
| 1456 | #define DP_SCRAMBLING_DISABLE_IGDNG (1 << 7) | ||
| 1447 | 1457 | ||
| 1448 | /** limit RGB values to avoid confusing TVs */ | 1458 | /** limit RGB values to avoid confusing TVs */ |
| 1449 | #define DP_COLOR_RANGE_16_235 (1 << 8) | 1459 | #define DP_COLOR_RANGE_16_235 (1 << 8) |
| @@ -1463,6 +1473,13 @@ | |||
| 1463 | * is 20 bytes in each direction, hence the 5 fixed | 1473 | * is 20 bytes in each direction, hence the 5 fixed |
| 1464 | * data registers | 1474 | * data registers |
| 1465 | */ | 1475 | */ |
| 1476 | #define DPA_AUX_CH_CTL 0x64010 | ||
| 1477 | #define DPA_AUX_CH_DATA1 0x64014 | ||
| 1478 | #define DPA_AUX_CH_DATA2 0x64018 | ||
| 1479 | #define DPA_AUX_CH_DATA3 0x6401c | ||
| 1480 | #define DPA_AUX_CH_DATA4 0x64020 | ||
| 1481 | #define DPA_AUX_CH_DATA5 0x64024 | ||
| 1482 | |||
| 1466 | #define DPB_AUX_CH_CTL 0x64110 | 1483 | #define DPB_AUX_CH_CTL 0x64110 |
| 1467 | #define DPB_AUX_CH_DATA1 0x64114 | 1484 | #define DPB_AUX_CH_DATA1 0x64114 |
| 1468 | #define DPB_AUX_CH_DATA2 0x64118 | 1485 | #define DPB_AUX_CH_DATA2 0x64118 |
| @@ -1618,7 +1635,7 @@ | |||
| 1618 | #define I830_FIFO_LINE_SIZE 32 | 1635 | #define I830_FIFO_LINE_SIZE 32 |
| 1619 | #define I945_FIFO_SIZE 127 /* 945 & 965 */ | 1636 | #define I945_FIFO_SIZE 127 /* 945 & 965 */ |
| 1620 | #define I915_FIFO_SIZE 95 | 1637 | #define I915_FIFO_SIZE 95 |
| 1621 | #define I855GM_FIFO_SIZE 255 | 1638 | #define I855GM_FIFO_SIZE 127 /* In cachelines */ |
| 1622 | #define I830_FIFO_SIZE 95 | 1639 | #define I830_FIFO_SIZE 95 |
| 1623 | #define I915_MAX_WM 0x3f | 1640 | #define I915_MAX_WM 0x3f |
| 1624 | 1641 | ||
| @@ -1848,6 +1865,8 @@ | |||
| 1848 | #define PFA_CTL_1 0x68080 | 1865 | #define PFA_CTL_1 0x68080 |
| 1849 | #define PFB_CTL_1 0x68880 | 1866 | #define PFB_CTL_1 0x68880 |
| 1850 | #define PF_ENABLE (1<<31) | 1867 | #define PF_ENABLE (1<<31) |
| 1868 | #define PFA_WIN_SZ 0x68074 | ||
| 1869 | #define PFB_WIN_SZ 0x68874 | ||
| 1851 | 1870 | ||
| 1852 | /* legacy palette */ | 1871 | /* legacy palette */ |
| 1853 | #define LGC_PALETTE_A 0x4a000 | 1872 | #define LGC_PALETTE_A 0x4a000 |
| @@ -2208,4 +2227,28 @@ | |||
| 2208 | #define PCH_PP_OFF_DELAYS 0xc720c | 2227 | #define PCH_PP_OFF_DELAYS 0xc720c |
| 2209 | #define PCH_PP_DIVISOR 0xc7210 | 2228 | #define PCH_PP_DIVISOR 0xc7210 |
| 2210 | 2229 | ||
| 2230 | #define PCH_DP_B 0xe4100 | ||
| 2231 | #define PCH_DPB_AUX_CH_CTL 0xe4110 | ||
| 2232 | #define PCH_DPB_AUX_CH_DATA1 0xe4114 | ||
| 2233 | #define PCH_DPB_AUX_CH_DATA2 0xe4118 | ||
| 2234 | #define PCH_DPB_AUX_CH_DATA3 0xe411c | ||
| 2235 | #define PCH_DPB_AUX_CH_DATA4 0xe4120 | ||
| 2236 | #define PCH_DPB_AUX_CH_DATA5 0xe4124 | ||
| 2237 | |||
| 2238 | #define PCH_DP_C 0xe4200 | ||
| 2239 | #define PCH_DPC_AUX_CH_CTL 0xe4210 | ||
| 2240 | #define PCH_DPC_AUX_CH_DATA1 0xe4214 | ||
| 2241 | #define PCH_DPC_AUX_CH_DATA2 0xe4218 | ||
| 2242 | #define PCH_DPC_AUX_CH_DATA3 0xe421c | ||
| 2243 | #define PCH_DPC_AUX_CH_DATA4 0xe4220 | ||
| 2244 | #define PCH_DPC_AUX_CH_DATA5 0xe4224 | ||
| 2245 | |||
| 2246 | #define PCH_DP_D 0xe4300 | ||
| 2247 | #define PCH_DPD_AUX_CH_CTL 0xe4310 | ||
| 2248 | #define PCH_DPD_AUX_CH_DATA1 0xe4314 | ||
| 2249 | #define PCH_DPD_AUX_CH_DATA2 0xe4318 | ||
| 2250 | #define PCH_DPD_AUX_CH_DATA3 0xe431c | ||
| 2251 | #define PCH_DPD_AUX_CH_DATA4 0xe4320 | ||
| 2252 | #define PCH_DPD_AUX_CH_DATA5 0xe4324 | ||
| 2253 | |||
| 2211 | #endif /* _I915_REG_H_ */ | 2254 | #endif /* _I915_REG_H_ */ |
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c index 9e1d16e5c3ea..1d04e1904ac6 100644 --- a/drivers/gpu/drm/i915/i915_suspend.c +++ b/drivers/gpu/drm/i915/i915_suspend.c | |||
| @@ -598,7 +598,7 @@ int i915_restore_state(struct drm_device *dev) | |||
| 598 | 598 | ||
| 599 | for (i = 0; i < 16; i++) { | 599 | for (i = 0; i < 16; i++) { |
| 600 | I915_WRITE(SWF00 + (i << 2), dev_priv->saveSWF0[i]); | 600 | I915_WRITE(SWF00 + (i << 2), dev_priv->saveSWF0[i]); |
| 601 | I915_WRITE(SWF10 + (i << 2), dev_priv->saveSWF1[i+7]); | 601 | I915_WRITE(SWF10 + (i << 2), dev_priv->saveSWF1[i]); |
| 602 | } | 602 | } |
| 603 | for (i = 0; i < 3; i++) | 603 | for (i = 0; i < 3; i++) |
| 604 | I915_WRITE(SWF30 + (i << 2), dev_priv->saveSWF2[i]); | 604 | I915_WRITE(SWF30 + (i << 2), dev_priv->saveSWF2[i]); |
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c index 7cc447191028..300aee3296c2 100644 --- a/drivers/gpu/drm/i915/intel_bios.c +++ b/drivers/gpu/drm/i915/intel_bios.c | |||
| @@ -97,14 +97,13 @@ static void | |||
| 97 | parse_lfp_panel_data(struct drm_i915_private *dev_priv, | 97 | parse_lfp_panel_data(struct drm_i915_private *dev_priv, |
| 98 | struct bdb_header *bdb) | 98 | struct bdb_header *bdb) |
| 99 | { | 99 | { |
| 100 | struct drm_device *dev = dev_priv->dev; | ||
| 101 | struct bdb_lvds_options *lvds_options; | 100 | struct bdb_lvds_options *lvds_options; |
| 102 | struct bdb_lvds_lfp_data *lvds_lfp_data; | 101 | struct bdb_lvds_lfp_data *lvds_lfp_data; |
| 103 | struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs; | 102 | struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs; |
| 104 | struct bdb_lvds_lfp_data_entry *entry; | 103 | struct bdb_lvds_lfp_data_entry *entry; |
| 105 | struct lvds_dvo_timing *dvo_timing; | 104 | struct lvds_dvo_timing *dvo_timing; |
| 106 | struct drm_display_mode *panel_fixed_mode; | 105 | struct drm_display_mode *panel_fixed_mode; |
| 107 | int lfp_data_size; | 106 | int lfp_data_size, dvo_timing_offset; |
| 108 | 107 | ||
| 109 | /* Defaults if we can't find VBT info */ | 108 | /* Defaults if we can't find VBT info */ |
| 110 | dev_priv->lvds_dither = 0; | 109 | dev_priv->lvds_dither = 0; |
| @@ -133,14 +132,16 @@ parse_lfp_panel_data(struct drm_i915_private *dev_priv, | |||
| 133 | entry = (struct bdb_lvds_lfp_data_entry *) | 132 | entry = (struct bdb_lvds_lfp_data_entry *) |
| 134 | ((uint8_t *)lvds_lfp_data->data + (lfp_data_size * | 133 | ((uint8_t *)lvds_lfp_data->data + (lfp_data_size * |
| 135 | lvds_options->panel_type)); | 134 | lvds_options->panel_type)); |
| 135 | dvo_timing_offset = lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset - | ||
| 136 | lvds_lfp_data_ptrs->ptr[0].fp_timing_offset; | ||
| 136 | 137 | ||
| 137 | /* On IGDNG mobile, LVDS data block removes panel fitting registers. | 138 | /* |
| 138 | So dec 2 dword from dvo_timing offset */ | 139 | * the size of fp_timing varies on the different platform. |
| 139 | if (IS_IGDNG(dev)) | 140 | * So calculate the DVO timing relative offset in LVDS data |
| 140 | dvo_timing = (struct lvds_dvo_timing *) | 141 | * entry to get the DVO timing entry |
| 141 | ((u8 *)&entry->dvo_timing - 8); | 142 | */ |
| 142 | else | 143 | dvo_timing = (struct lvds_dvo_timing *) |
| 143 | dvo_timing = &entry->dvo_timing; | 144 | ((unsigned char *)entry + dvo_timing_offset); |
| 144 | 145 | ||
| 145 | panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL); | 146 | panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL); |
| 146 | 147 | ||
| @@ -295,6 +296,25 @@ parse_sdvo_device_mapping(struct drm_i915_private *dev_priv, | |||
| 295 | } | 296 | } |
| 296 | return; | 297 | return; |
| 297 | } | 298 | } |
| 299 | |||
| 300 | static void | ||
| 301 | parse_driver_features(struct drm_i915_private *dev_priv, | ||
| 302 | struct bdb_header *bdb) | ||
| 303 | { | ||
| 304 | struct drm_device *dev = dev_priv->dev; | ||
| 305 | struct bdb_driver_features *driver; | ||
| 306 | |||
| 307 | /* set default for chips without eDP */ | ||
| 308 | if (!SUPPORTS_EDP(dev)) { | ||
| 309 | dev_priv->edp_support = 0; | ||
| 310 | return; | ||
| 311 | } | ||
| 312 | |||
| 313 | driver = find_section(bdb, BDB_DRIVER_FEATURES); | ||
| 314 | if (driver && driver->lvds_config == BDB_DRIVER_FEATURE_EDP) | ||
| 315 | dev_priv->edp_support = 1; | ||
| 316 | } | ||
| 317 | |||
| 298 | /** | 318 | /** |
| 299 | * intel_init_bios - initialize VBIOS settings & find VBT | 319 | * intel_init_bios - initialize VBIOS settings & find VBT |
| 300 | * @dev: DRM device | 320 | * @dev: DRM device |
| @@ -345,6 +365,8 @@ intel_init_bios(struct drm_device *dev) | |||
| 345 | parse_lfp_panel_data(dev_priv, bdb); | 365 | parse_lfp_panel_data(dev_priv, bdb); |
| 346 | parse_sdvo_panel_data(dev_priv, bdb); | 366 | parse_sdvo_panel_data(dev_priv, bdb); |
| 347 | parse_sdvo_device_mapping(dev_priv, bdb); | 367 | parse_sdvo_device_mapping(dev_priv, bdb); |
| 368 | parse_driver_features(dev_priv, bdb); | ||
| 369 | |||
| 348 | pci_unmap_rom(pdev, bios); | 370 | pci_unmap_rom(pdev, bios); |
| 349 | 371 | ||
| 350 | return 0; | 372 | return 0; |
diff --git a/drivers/gpu/drm/i915/intel_bios.h b/drivers/gpu/drm/i915/intel_bios.h index fe72e1c225d8..0f8e5f69ac7a 100644 --- a/drivers/gpu/drm/i915/intel_bios.h +++ b/drivers/gpu/drm/i915/intel_bios.h | |||
| @@ -381,6 +381,51 @@ struct bdb_sdvo_lvds_options { | |||
| 381 | } __attribute__((packed)); | 381 | } __attribute__((packed)); |
| 382 | 382 | ||
| 383 | 383 | ||
| 384 | #define BDB_DRIVER_FEATURE_NO_LVDS 0 | ||
| 385 | #define BDB_DRIVER_FEATURE_INT_LVDS 1 | ||
| 386 | #define BDB_DRIVER_FEATURE_SDVO_LVDS 2 | ||
| 387 | #define BDB_DRIVER_FEATURE_EDP 3 | ||
| 388 | |||
| 389 | struct bdb_driver_features { | ||
| 390 | u8 boot_dev_algorithm:1; | ||
| 391 | u8 block_display_switch:1; | ||
| 392 | u8 allow_display_switch:1; | ||
| 393 | u8 hotplug_dvo:1; | ||
| 394 | u8 dual_view_zoom:1; | ||
| 395 | u8 int15h_hook:1; | ||
| 396 | u8 sprite_in_clone:1; | ||
| 397 | u8 primary_lfp_id:1; | ||
| 398 | |||
| 399 | u16 boot_mode_x; | ||
| 400 | u16 boot_mode_y; | ||
| 401 | u8 boot_mode_bpp; | ||
| 402 | u8 boot_mode_refresh; | ||
| 403 | |||
| 404 | u16 enable_lfp_primary:1; | ||
| 405 | u16 selective_mode_pruning:1; | ||
| 406 | u16 dual_frequency:1; | ||
| 407 | u16 render_clock_freq:1; /* 0: high freq; 1: low freq */ | ||
| 408 | u16 nt_clone_support:1; | ||
| 409 | u16 power_scheme_ui:1; /* 0: CUI; 1: 3rd party */ | ||
| 410 | u16 sprite_display_assign:1; /* 0: secondary; 1: primary */ | ||
| 411 | u16 cui_aspect_scaling:1; | ||
| 412 | u16 preserve_aspect_ratio:1; | ||
| 413 | u16 sdvo_device_power_down:1; | ||
| 414 | u16 crt_hotplug:1; | ||
| 415 | u16 lvds_config:2; | ||
| 416 | u16 tv_hotplug:1; | ||
| 417 | u16 hdmi_config:2; | ||
| 418 | |||
| 419 | u8 static_display:1; | ||
| 420 | u8 reserved2:7; | ||
| 421 | u16 legacy_crt_max_x; | ||
| 422 | u16 legacy_crt_max_y; | ||
| 423 | u8 legacy_crt_max_refresh; | ||
| 424 | |||
| 425 | u8 hdmi_termination; | ||
| 426 | u8 custom_vbt_version; | ||
| 427 | } __attribute__((packed)); | ||
| 428 | |||
| 384 | bool intel_init_bios(struct drm_device *dev); | 429 | bool intel_init_bios(struct drm_device *dev); |
| 385 | 430 | ||
| 386 | /* | 431 | /* |
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index d6a1a6e5539a..4cf8e2e88a40 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c | |||
| @@ -156,6 +156,9 @@ static bool intel_igdng_crt_detect_hotplug(struct drm_connector *connector) | |||
| 156 | 156 | ||
| 157 | temp = adpa = I915_READ(PCH_ADPA); | 157 | temp = adpa = I915_READ(PCH_ADPA); |
| 158 | 158 | ||
| 159 | adpa &= ~ADPA_DAC_ENABLE; | ||
| 160 | I915_WRITE(PCH_ADPA, adpa); | ||
| 161 | |||
| 159 | adpa &= ~ADPA_CRT_HOTPLUG_MASK; | 162 | adpa &= ~ADPA_CRT_HOTPLUG_MASK; |
| 160 | 163 | ||
| 161 | adpa |= (ADPA_CRT_HOTPLUG_PERIOD_128 | | 164 | adpa |= (ADPA_CRT_HOTPLUG_PERIOD_128 | |
| @@ -169,13 +172,14 @@ static bool intel_igdng_crt_detect_hotplug(struct drm_connector *connector) | |||
| 169 | DRM_DEBUG("pch crt adpa 0x%x", adpa); | 172 | DRM_DEBUG("pch crt adpa 0x%x", adpa); |
| 170 | I915_WRITE(PCH_ADPA, adpa); | 173 | I915_WRITE(PCH_ADPA, adpa); |
| 171 | 174 | ||
| 172 | /* This might not be needed as not specified in spec...*/ | 175 | while ((I915_READ(PCH_ADPA) & ADPA_CRT_HOTPLUG_FORCE_TRIGGER) != 0) |
| 173 | udelay(1000); | 176 | ; |
| 174 | 177 | ||
| 175 | /* Check the status to see if both blue and green are on now */ | 178 | /* Check the status to see if both blue and green are on now */ |
| 176 | adpa = I915_READ(PCH_ADPA); | 179 | adpa = I915_READ(PCH_ADPA); |
| 177 | if ((adpa & ADPA_CRT_HOTPLUG_MONITOR_MASK) == | 180 | adpa &= ADPA_CRT_HOTPLUG_MONITOR_MASK; |
| 178 | ADPA_CRT_HOTPLUG_MONITOR_COLOR) | 181 | if ((adpa == ADPA_CRT_HOTPLUG_MONITOR_COLOR) || |
| 182 | (adpa == ADPA_CRT_HOTPLUG_MONITOR_MONO)) | ||
| 179 | ret = true; | 183 | ret = true; |
| 180 | else | 184 | else |
| 181 | ret = false; | 185 | ret = false; |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 508838ee31e0..d6fce2133413 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -34,6 +34,8 @@ | |||
| 34 | 34 | ||
| 35 | #include "drm_crtc_helper.h" | 35 | #include "drm_crtc_helper.h" |
| 36 | 36 | ||
| 37 | #define HAS_eDP (intel_pipe_has_type(crtc, INTEL_OUTPUT_EDP)) | ||
| 38 | |||
| 37 | bool intel_pipe_has_type (struct drm_crtc *crtc, int type); | 39 | bool intel_pipe_has_type (struct drm_crtc *crtc, int type); |
| 38 | static void intel_update_watermarks(struct drm_device *dev); | 40 | static void intel_update_watermarks(struct drm_device *dev); |
| 39 | 41 | ||
| @@ -88,7 +90,7 @@ struct intel_limit { | |||
| 88 | #define I8XX_P2_SLOW 4 | 90 | #define I8XX_P2_SLOW 4 |
| 89 | #define I8XX_P2_FAST 2 | 91 | #define I8XX_P2_FAST 2 |
| 90 | #define I8XX_P2_LVDS_SLOW 14 | 92 | #define I8XX_P2_LVDS_SLOW 14 |
| 91 | #define I8XX_P2_LVDS_FAST 14 /* No fast option */ | 93 | #define I8XX_P2_LVDS_FAST 7 |
| 92 | #define I8XX_P2_SLOW_LIMIT 165000 | 94 | #define I8XX_P2_SLOW_LIMIT 165000 |
| 93 | 95 | ||
| 94 | #define I9XX_DOT_MIN 20000 | 96 | #define I9XX_DOT_MIN 20000 |
| @@ -268,6 +270,9 @@ intel_igdng_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, | |||
| 268 | static bool | 270 | static bool |
| 269 | intel_find_pll_g4x_dp(const intel_limit_t *, struct drm_crtc *crtc, | 271 | intel_find_pll_g4x_dp(const intel_limit_t *, struct drm_crtc *crtc, |
| 270 | int target, int refclk, intel_clock_t *best_clock); | 272 | int target, int refclk, intel_clock_t *best_clock); |
| 273 | static bool | ||
| 274 | intel_find_pll_igdng_dp(const intel_limit_t *, struct drm_crtc *crtc, | ||
| 275 | int target, int refclk, intel_clock_t *best_clock); | ||
| 271 | 276 | ||
| 272 | static const intel_limit_t intel_limits_i8xx_dvo = { | 277 | static const intel_limit_t intel_limits_i8xx_dvo = { |
| 273 | .dot = { .min = I8XX_DOT_MIN, .max = I8XX_DOT_MAX }, | 278 | .dot = { .min = I8XX_DOT_MIN, .max = I8XX_DOT_MAX }, |
| @@ -598,6 +603,23 @@ bool intel_pipe_has_type (struct drm_crtc *crtc, int type) | |||
| 598 | return false; | 603 | return false; |
| 599 | } | 604 | } |
| 600 | 605 | ||
| 606 | struct drm_connector * | ||
| 607 | intel_pipe_get_output (struct drm_crtc *crtc) | ||
| 608 | { | ||
| 609 | struct drm_device *dev = crtc->dev; | ||
| 610 | struct drm_mode_config *mode_config = &dev->mode_config; | ||
| 611 | struct drm_connector *l_entry, *ret = NULL; | ||
| 612 | |||
| 613 | list_for_each_entry(l_entry, &mode_config->connector_list, head) { | ||
| 614 | if (l_entry->encoder && | ||
| 615 | l_entry->encoder->crtc == crtc) { | ||
| 616 | ret = l_entry; | ||
| 617 | break; | ||
| 618 | } | ||
| 619 | } | ||
| 620 | return ret; | ||
| 621 | } | ||
| 622 | |||
| 601 | #define INTELPllInvalid(s) do { /* DRM_DEBUG(s); */ return false; } while (0) | 623 | #define INTELPllInvalid(s) do { /* DRM_DEBUG(s); */ return false; } while (0) |
| 602 | /** | 624 | /** |
| 603 | * Returns whether the given set of divisors are valid for a given refclk with | 625 | * Returns whether the given set of divisors are valid for a given refclk with |
| @@ -645,7 +667,7 @@ intel_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, | |||
| 645 | int err = target; | 667 | int err = target; |
| 646 | 668 | ||
| 647 | if (IS_I9XX(dev) && intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) && | 669 | if (IS_I9XX(dev) && intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) && |
| 648 | (I915_READ(LVDS) & LVDS_PORT_EN) != 0) { | 670 | (I915_READ(LVDS)) != 0) { |
| 649 | /* | 671 | /* |
| 650 | * For LVDS, if the panel is on, just rely on its current | 672 | * For LVDS, if the panel is on, just rely on its current |
| 651 | * settings for dual-channel. We haven't figured out how to | 673 | * settings for dual-channel. We haven't figured out how to |
| @@ -752,6 +774,30 @@ intel_g4x_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, | |||
| 752 | } | 774 | } |
| 753 | 775 | ||
| 754 | static bool | 776 | static bool |
| 777 | intel_find_pll_igdng_dp(const intel_limit_t *limit, struct drm_crtc *crtc, | ||
| 778 | int target, int refclk, intel_clock_t *best_clock) | ||
| 779 | { | ||
| 780 | struct drm_device *dev = crtc->dev; | ||
| 781 | intel_clock_t clock; | ||
| 782 | if (target < 200000) { | ||
| 783 | clock.n = 1; | ||
| 784 | clock.p1 = 2; | ||
| 785 | clock.p2 = 10; | ||
| 786 | clock.m1 = 12; | ||
| 787 | clock.m2 = 9; | ||
| 788 | } else { | ||
| 789 | clock.n = 2; | ||
| 790 | clock.p1 = 1; | ||
| 791 | clock.p2 = 10; | ||
| 792 | clock.m1 = 14; | ||
| 793 | clock.m2 = 8; | ||
| 794 | } | ||
| 795 | intel_clock(dev, refclk, &clock); | ||
| 796 | memcpy(best_clock, &clock, sizeof(intel_clock_t)); | ||
| 797 | return true; | ||
| 798 | } | ||
| 799 | |||
| 800 | static bool | ||
| 755 | intel_igdng_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, | 801 | intel_igdng_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, |
| 756 | int target, int refclk, intel_clock_t *best_clock) | 802 | int target, int refclk, intel_clock_t *best_clock) |
| 757 | { | 803 | { |
| @@ -763,6 +809,14 @@ intel_igdng_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, | |||
| 763 | int err_most = 47; | 809 | int err_most = 47; |
| 764 | found = false; | 810 | found = false; |
| 765 | 811 | ||
| 812 | /* eDP has only 2 clock choice, no n/m/p setting */ | ||
| 813 | if (HAS_eDP) | ||
| 814 | return true; | ||
| 815 | |||
| 816 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT)) | ||
| 817 | return intel_find_pll_igdng_dp(limit, crtc, target, | ||
| 818 | refclk, best_clock); | ||
| 819 | |||
| 766 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { | 820 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { |
| 767 | if ((I915_READ(LVDS) & LVDS_CLKB_POWER_MASK) == | 821 | if ((I915_READ(LVDS) & LVDS_CLKB_POWER_MASK) == |
| 768 | LVDS_CLKB_POWER_UP) | 822 | LVDS_CLKB_POWER_UP) |
| @@ -998,6 +1052,90 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y, | |||
| 998 | return 0; | 1052 | return 0; |
| 999 | } | 1053 | } |
| 1000 | 1054 | ||
| 1055 | /* Disable the VGA plane that we never use */ | ||
| 1056 | static void i915_disable_vga (struct drm_device *dev) | ||
| 1057 | { | ||
| 1058 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 1059 | u8 sr1; | ||
| 1060 | u32 vga_reg; | ||
| 1061 | |||
| 1062 | if (IS_IGDNG(dev)) | ||
| 1063 | vga_reg = CPU_VGACNTRL; | ||
| 1064 | else | ||
| 1065 | vga_reg = VGACNTRL; | ||
| 1066 | |||
| 1067 | if (I915_READ(vga_reg) & VGA_DISP_DISABLE) | ||
| 1068 | return; | ||
| 1069 | |||
| 1070 | I915_WRITE8(VGA_SR_INDEX, 1); | ||
| 1071 | sr1 = I915_READ8(VGA_SR_DATA); | ||
| 1072 | I915_WRITE8(VGA_SR_DATA, sr1 | (1 << 5)); | ||
| 1073 | udelay(100); | ||
| 1074 | |||
| 1075 | I915_WRITE(vga_reg, VGA_DISP_DISABLE); | ||
| 1076 | } | ||
| 1077 | |||
| 1078 | static void igdng_disable_pll_edp (struct drm_crtc *crtc) | ||
| 1079 | { | ||
| 1080 | struct drm_device *dev = crtc->dev; | ||
| 1081 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 1082 | u32 dpa_ctl; | ||
| 1083 | |||
| 1084 | DRM_DEBUG("\n"); | ||
| 1085 | dpa_ctl = I915_READ(DP_A); | ||
| 1086 | dpa_ctl &= ~DP_PLL_ENABLE; | ||
| 1087 | I915_WRITE(DP_A, dpa_ctl); | ||
| 1088 | } | ||
| 1089 | |||
| 1090 | static void igdng_enable_pll_edp (struct drm_crtc *crtc) | ||
| 1091 | { | ||
| 1092 | struct drm_device *dev = crtc->dev; | ||
| 1093 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 1094 | u32 dpa_ctl; | ||
| 1095 | |||
| 1096 | dpa_ctl = I915_READ(DP_A); | ||
| 1097 | dpa_ctl |= DP_PLL_ENABLE; | ||
| 1098 | I915_WRITE(DP_A, dpa_ctl); | ||
| 1099 | udelay(200); | ||
| 1100 | } | ||
| 1101 | |||
| 1102 | |||
| 1103 | static void igdng_set_pll_edp (struct drm_crtc *crtc, int clock) | ||
| 1104 | { | ||
| 1105 | struct drm_device *dev = crtc->dev; | ||
| 1106 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 1107 | u32 dpa_ctl; | ||
| 1108 | |||
| 1109 | DRM_DEBUG("eDP PLL enable for clock %d\n", clock); | ||
| 1110 | dpa_ctl = I915_READ(DP_A); | ||
| 1111 | dpa_ctl &= ~DP_PLL_FREQ_MASK; | ||
| 1112 | |||
| 1113 | if (clock < 200000) { | ||
| 1114 | u32 temp; | ||
| 1115 | dpa_ctl |= DP_PLL_FREQ_160MHZ; | ||
| 1116 | /* workaround for 160Mhz: | ||
| 1117 | 1) program 0x4600c bits 15:0 = 0x8124 | ||
| 1118 | 2) program 0x46010 bit 0 = 1 | ||
| 1119 | 3) program 0x46034 bit 24 = 1 | ||
| 1120 | 4) program 0x64000 bit 14 = 1 | ||
| 1121 | */ | ||
| 1122 | temp = I915_READ(0x4600c); | ||
| 1123 | temp &= 0xffff0000; | ||
| 1124 | I915_WRITE(0x4600c, temp | 0x8124); | ||
| 1125 | |||
| 1126 | temp = I915_READ(0x46010); | ||
| 1127 | I915_WRITE(0x46010, temp | 1); | ||
| 1128 | |||
| 1129 | temp = I915_READ(0x46034); | ||
| 1130 | I915_WRITE(0x46034, temp | (1 << 24)); | ||
| 1131 | } else { | ||
| 1132 | dpa_ctl |= DP_PLL_FREQ_270MHZ; | ||
| 1133 | } | ||
| 1134 | I915_WRITE(DP_A, dpa_ctl); | ||
| 1135 | |||
| 1136 | udelay(500); | ||
| 1137 | } | ||
| 1138 | |||
| 1001 | static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) | 1139 | static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) |
| 1002 | { | 1140 | { |
| 1003 | struct drm_device *dev = crtc->dev; | 1141 | struct drm_device *dev = crtc->dev; |
| @@ -1015,6 +1153,7 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 1015 | int fdi_rx_imr_reg = (pipe == 0) ? FDI_RXA_IMR : FDI_RXB_IMR; | 1153 | int fdi_rx_imr_reg = (pipe == 0) ? FDI_RXA_IMR : FDI_RXB_IMR; |
| 1016 | int transconf_reg = (pipe == 0) ? TRANSACONF : TRANSBCONF; | 1154 | int transconf_reg = (pipe == 0) ? TRANSACONF : TRANSBCONF; |
| 1017 | int pf_ctl_reg = (pipe == 0) ? PFA_CTL_1 : PFB_CTL_1; | 1155 | int pf_ctl_reg = (pipe == 0) ? PFA_CTL_1 : PFB_CTL_1; |
| 1156 | int pf_win_size = (pipe == 0) ? PFA_WIN_SZ : PFB_WIN_SZ; | ||
| 1018 | int cpu_htot_reg = (pipe == 0) ? HTOTAL_A : HTOTAL_B; | 1157 | int cpu_htot_reg = (pipe == 0) ? HTOTAL_A : HTOTAL_B; |
| 1019 | int cpu_hblank_reg = (pipe == 0) ? HBLANK_A : HBLANK_B; | 1158 | int cpu_hblank_reg = (pipe == 0) ? HBLANK_A : HBLANK_B; |
| 1020 | int cpu_hsync_reg = (pipe == 0) ? HSYNC_A : HSYNC_B; | 1159 | int cpu_hsync_reg = (pipe == 0) ? HSYNC_A : HSYNC_B; |
| @@ -1028,7 +1167,7 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 1028 | int trans_vblank_reg = (pipe == 0) ? TRANS_VBLANK_A : TRANS_VBLANK_B; | 1167 | int trans_vblank_reg = (pipe == 0) ? TRANS_VBLANK_A : TRANS_VBLANK_B; |
| 1029 | int trans_vsync_reg = (pipe == 0) ? TRANS_VSYNC_A : TRANS_VSYNC_B; | 1168 | int trans_vsync_reg = (pipe == 0) ? TRANS_VSYNC_A : TRANS_VSYNC_B; |
| 1030 | u32 temp; | 1169 | u32 temp; |
| 1031 | int tries = 5, j; | 1170 | int tries = 5, j, n; |
| 1032 | 1171 | ||
| 1033 | /* XXX: When our outputs are all unaware of DPMS modes other than off | 1172 | /* XXX: When our outputs are all unaware of DPMS modes other than off |
| 1034 | * and on, we should map those modes to DRM_MODE_DPMS_OFF in the CRTC. | 1173 | * and on, we should map those modes to DRM_MODE_DPMS_OFF in the CRTC. |
| @@ -1038,27 +1177,32 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 1038 | case DRM_MODE_DPMS_STANDBY: | 1177 | case DRM_MODE_DPMS_STANDBY: |
| 1039 | case DRM_MODE_DPMS_SUSPEND: | 1178 | case DRM_MODE_DPMS_SUSPEND: |
| 1040 | DRM_DEBUG("crtc %d dpms on\n", pipe); | 1179 | DRM_DEBUG("crtc %d dpms on\n", pipe); |
| 1041 | /* enable PCH DPLL */ | 1180 | if (HAS_eDP) { |
| 1042 | temp = I915_READ(pch_dpll_reg); | 1181 | /* enable eDP PLL */ |
| 1043 | if ((temp & DPLL_VCO_ENABLE) == 0) { | 1182 | igdng_enable_pll_edp(crtc); |
| 1044 | I915_WRITE(pch_dpll_reg, temp | DPLL_VCO_ENABLE); | 1183 | } else { |
| 1045 | I915_READ(pch_dpll_reg); | 1184 | /* enable PCH DPLL */ |
| 1046 | } | 1185 | temp = I915_READ(pch_dpll_reg); |
| 1047 | 1186 | if ((temp & DPLL_VCO_ENABLE) == 0) { | |
| 1048 | /* enable PCH FDI RX PLL, wait warmup plus DMI latency */ | 1187 | I915_WRITE(pch_dpll_reg, temp | DPLL_VCO_ENABLE); |
| 1049 | temp = I915_READ(fdi_rx_reg); | 1188 | I915_READ(pch_dpll_reg); |
| 1050 | I915_WRITE(fdi_rx_reg, temp | FDI_RX_PLL_ENABLE | | 1189 | } |
| 1051 | FDI_SEL_PCDCLK | | ||
| 1052 | FDI_DP_PORT_WIDTH_X4); /* default 4 lanes */ | ||
| 1053 | I915_READ(fdi_rx_reg); | ||
| 1054 | udelay(200); | ||
| 1055 | 1190 | ||
| 1056 | /* Enable CPU FDI TX PLL, always on for IGDNG */ | 1191 | /* enable PCH FDI RX PLL, wait warmup plus DMI latency */ |
| 1057 | temp = I915_READ(fdi_tx_reg); | 1192 | temp = I915_READ(fdi_rx_reg); |
| 1058 | if ((temp & FDI_TX_PLL_ENABLE) == 0) { | 1193 | I915_WRITE(fdi_rx_reg, temp | FDI_RX_PLL_ENABLE | |
| 1059 | I915_WRITE(fdi_tx_reg, temp | FDI_TX_PLL_ENABLE); | 1194 | FDI_SEL_PCDCLK | |
| 1060 | I915_READ(fdi_tx_reg); | 1195 | FDI_DP_PORT_WIDTH_X4); /* default 4 lanes */ |
| 1061 | udelay(100); | 1196 | I915_READ(fdi_rx_reg); |
| 1197 | udelay(200); | ||
| 1198 | |||
| 1199 | /* Enable CPU FDI TX PLL, always on for IGDNG */ | ||
| 1200 | temp = I915_READ(fdi_tx_reg); | ||
| 1201 | if ((temp & FDI_TX_PLL_ENABLE) == 0) { | ||
| 1202 | I915_WRITE(fdi_tx_reg, temp | FDI_TX_PLL_ENABLE); | ||
| 1203 | I915_READ(fdi_tx_reg); | ||
| 1204 | udelay(100); | ||
| 1205 | } | ||
| 1062 | } | 1206 | } |
| 1063 | 1207 | ||
| 1064 | /* Enable CPU pipe */ | 1208 | /* Enable CPU pipe */ |
| @@ -1077,122 +1221,126 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 1077 | I915_WRITE(dspbase_reg, I915_READ(dspbase_reg)); | 1221 | I915_WRITE(dspbase_reg, I915_READ(dspbase_reg)); |
| 1078 | } | 1222 | } |
| 1079 | 1223 | ||
| 1080 | /* enable CPU FDI TX and PCH FDI RX */ | 1224 | if (!HAS_eDP) { |
| 1081 | temp = I915_READ(fdi_tx_reg); | 1225 | /* enable CPU FDI TX and PCH FDI RX */ |
| 1082 | temp |= FDI_TX_ENABLE; | 1226 | temp = I915_READ(fdi_tx_reg); |
| 1083 | temp |= FDI_DP_PORT_WIDTH_X4; /* default */ | 1227 | temp |= FDI_TX_ENABLE; |
| 1084 | temp &= ~FDI_LINK_TRAIN_NONE; | 1228 | temp |= FDI_DP_PORT_WIDTH_X4; /* default */ |
| 1085 | temp |= FDI_LINK_TRAIN_PATTERN_1; | 1229 | temp &= ~FDI_LINK_TRAIN_NONE; |
| 1086 | I915_WRITE(fdi_tx_reg, temp); | 1230 | temp |= FDI_LINK_TRAIN_PATTERN_1; |
| 1087 | I915_READ(fdi_tx_reg); | 1231 | I915_WRITE(fdi_tx_reg, temp); |
| 1232 | I915_READ(fdi_tx_reg); | ||
| 1088 | 1233 | ||
| 1089 | temp = I915_READ(fdi_rx_reg); | 1234 | temp = I915_READ(fdi_rx_reg); |
| 1090 | temp &= ~FDI_LINK_TRAIN_NONE; | 1235 | temp &= ~FDI_LINK_TRAIN_NONE; |
| 1091 | temp |= FDI_LINK_TRAIN_PATTERN_1; | 1236 | temp |= FDI_LINK_TRAIN_PATTERN_1; |
| 1092 | I915_WRITE(fdi_rx_reg, temp | FDI_RX_ENABLE); | 1237 | I915_WRITE(fdi_rx_reg, temp | FDI_RX_ENABLE); |
| 1093 | I915_READ(fdi_rx_reg); | 1238 | I915_READ(fdi_rx_reg); |
| 1094 | 1239 | ||
| 1095 | udelay(150); | 1240 | udelay(150); |
| 1096 | 1241 | ||
| 1097 | /* Train FDI. */ | 1242 | /* Train FDI. */ |
| 1098 | /* umask FDI RX Interrupt symbol_lock and bit_lock bit | 1243 | /* umask FDI RX Interrupt symbol_lock and bit_lock bit |
| 1099 | for train result */ | 1244 | for train result */ |
| 1100 | temp = I915_READ(fdi_rx_imr_reg); | 1245 | temp = I915_READ(fdi_rx_imr_reg); |
| 1101 | temp &= ~FDI_RX_SYMBOL_LOCK; | 1246 | temp &= ~FDI_RX_SYMBOL_LOCK; |
| 1102 | temp &= ~FDI_RX_BIT_LOCK; | 1247 | temp &= ~FDI_RX_BIT_LOCK; |
| 1103 | I915_WRITE(fdi_rx_imr_reg, temp); | 1248 | I915_WRITE(fdi_rx_imr_reg, temp); |
| 1104 | I915_READ(fdi_rx_imr_reg); | 1249 | I915_READ(fdi_rx_imr_reg); |
| 1105 | udelay(150); | 1250 | udelay(150); |
| 1106 | 1251 | ||
| 1107 | temp = I915_READ(fdi_rx_iir_reg); | 1252 | temp = I915_READ(fdi_rx_iir_reg); |
| 1108 | DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); | 1253 | DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); |
| 1109 | 1254 | ||
| 1110 | if ((temp & FDI_RX_BIT_LOCK) == 0) { | 1255 | if ((temp & FDI_RX_BIT_LOCK) == 0) { |
| 1111 | for (j = 0; j < tries; j++) { | 1256 | for (j = 0; j < tries; j++) { |
| 1112 | temp = I915_READ(fdi_rx_iir_reg); | 1257 | temp = I915_READ(fdi_rx_iir_reg); |
| 1113 | DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); | 1258 | DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); |
| 1114 | if (temp & FDI_RX_BIT_LOCK) | 1259 | if (temp & FDI_RX_BIT_LOCK) |
| 1115 | break; | 1260 | break; |
| 1116 | udelay(200); | 1261 | udelay(200); |
| 1117 | } | 1262 | } |
| 1118 | if (j != tries) | 1263 | if (j != tries) |
| 1264 | I915_WRITE(fdi_rx_iir_reg, | ||
| 1265 | temp | FDI_RX_BIT_LOCK); | ||
| 1266 | else | ||
| 1267 | DRM_DEBUG("train 1 fail\n"); | ||
| 1268 | } else { | ||
| 1119 | I915_WRITE(fdi_rx_iir_reg, | 1269 | I915_WRITE(fdi_rx_iir_reg, |
| 1120 | temp | FDI_RX_BIT_LOCK); | 1270 | temp | FDI_RX_BIT_LOCK); |
| 1121 | else | 1271 | DRM_DEBUG("train 1 ok 2!\n"); |
| 1122 | DRM_DEBUG("train 1 fail\n"); | 1272 | } |
| 1123 | } else { | 1273 | temp = I915_READ(fdi_tx_reg); |
| 1124 | I915_WRITE(fdi_rx_iir_reg, | 1274 | temp &= ~FDI_LINK_TRAIN_NONE; |
| 1125 | temp | FDI_RX_BIT_LOCK); | 1275 | temp |= FDI_LINK_TRAIN_PATTERN_2; |
| 1126 | DRM_DEBUG("train 1 ok 2!\n"); | 1276 | I915_WRITE(fdi_tx_reg, temp); |
| 1127 | } | 1277 | |
| 1128 | temp = I915_READ(fdi_tx_reg); | 1278 | temp = I915_READ(fdi_rx_reg); |
| 1129 | temp &= ~FDI_LINK_TRAIN_NONE; | 1279 | temp &= ~FDI_LINK_TRAIN_NONE; |
| 1130 | temp |= FDI_LINK_TRAIN_PATTERN_2; | 1280 | temp |= FDI_LINK_TRAIN_PATTERN_2; |
| 1131 | I915_WRITE(fdi_tx_reg, temp); | 1281 | I915_WRITE(fdi_rx_reg, temp); |
| 1132 | |||
| 1133 | temp = I915_READ(fdi_rx_reg); | ||
| 1134 | temp &= ~FDI_LINK_TRAIN_NONE; | ||
| 1135 | temp |= FDI_LINK_TRAIN_PATTERN_2; | ||
| 1136 | I915_WRITE(fdi_rx_reg, temp); | ||
| 1137 | 1282 | ||
| 1138 | udelay(150); | 1283 | udelay(150); |
| 1139 | 1284 | ||
| 1140 | temp = I915_READ(fdi_rx_iir_reg); | 1285 | temp = I915_READ(fdi_rx_iir_reg); |
| 1141 | DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); | 1286 | DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); |
| 1142 | 1287 | ||
| 1143 | if ((temp & FDI_RX_SYMBOL_LOCK) == 0) { | 1288 | if ((temp & FDI_RX_SYMBOL_LOCK) == 0) { |
| 1144 | for (j = 0; j < tries; j++) { | 1289 | for (j = 0; j < tries; j++) { |
| 1145 | temp = I915_READ(fdi_rx_iir_reg); | 1290 | temp = I915_READ(fdi_rx_iir_reg); |
| 1146 | DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); | 1291 | DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); |
| 1147 | if (temp & FDI_RX_SYMBOL_LOCK) | 1292 | if (temp & FDI_RX_SYMBOL_LOCK) |
| 1148 | break; | 1293 | break; |
| 1149 | udelay(200); | 1294 | udelay(200); |
| 1150 | } | 1295 | } |
| 1151 | if (j != tries) { | 1296 | if (j != tries) { |
| 1297 | I915_WRITE(fdi_rx_iir_reg, | ||
| 1298 | temp | FDI_RX_SYMBOL_LOCK); | ||
| 1299 | DRM_DEBUG("train 2 ok 1!\n"); | ||
| 1300 | } else | ||
| 1301 | DRM_DEBUG("train 2 fail\n"); | ||
| 1302 | } else { | ||
| 1152 | I915_WRITE(fdi_rx_iir_reg, | 1303 | I915_WRITE(fdi_rx_iir_reg, |
| 1153 | temp | FDI_RX_SYMBOL_LOCK); | 1304 | temp | FDI_RX_SYMBOL_LOCK); |
| 1154 | DRM_DEBUG("train 2 ok 1!\n"); | 1305 | DRM_DEBUG("train 2 ok 2!\n"); |
| 1155 | } else | 1306 | } |
| 1156 | DRM_DEBUG("train 2 fail\n"); | 1307 | DRM_DEBUG("train done\n"); |
| 1157 | } else { | ||
| 1158 | I915_WRITE(fdi_rx_iir_reg, temp | FDI_RX_SYMBOL_LOCK); | ||
| 1159 | DRM_DEBUG("train 2 ok 2!\n"); | ||
| 1160 | } | ||
| 1161 | DRM_DEBUG("train done\n"); | ||
| 1162 | 1308 | ||
| 1163 | /* set transcoder timing */ | 1309 | /* set transcoder timing */ |
| 1164 | I915_WRITE(trans_htot_reg, I915_READ(cpu_htot_reg)); | 1310 | I915_WRITE(trans_htot_reg, I915_READ(cpu_htot_reg)); |
| 1165 | I915_WRITE(trans_hblank_reg, I915_READ(cpu_hblank_reg)); | 1311 | I915_WRITE(trans_hblank_reg, I915_READ(cpu_hblank_reg)); |
| 1166 | I915_WRITE(trans_hsync_reg, I915_READ(cpu_hsync_reg)); | 1312 | I915_WRITE(trans_hsync_reg, I915_READ(cpu_hsync_reg)); |
| 1167 | 1313 | ||
| 1168 | I915_WRITE(trans_vtot_reg, I915_READ(cpu_vtot_reg)); | 1314 | I915_WRITE(trans_vtot_reg, I915_READ(cpu_vtot_reg)); |
| 1169 | I915_WRITE(trans_vblank_reg, I915_READ(cpu_vblank_reg)); | 1315 | I915_WRITE(trans_vblank_reg, I915_READ(cpu_vblank_reg)); |
| 1170 | I915_WRITE(trans_vsync_reg, I915_READ(cpu_vsync_reg)); | 1316 | I915_WRITE(trans_vsync_reg, I915_READ(cpu_vsync_reg)); |
| 1171 | 1317 | ||
| 1172 | /* enable PCH transcoder */ | 1318 | /* enable PCH transcoder */ |
| 1173 | temp = I915_READ(transconf_reg); | 1319 | temp = I915_READ(transconf_reg); |
| 1174 | I915_WRITE(transconf_reg, temp | TRANS_ENABLE); | 1320 | I915_WRITE(transconf_reg, temp | TRANS_ENABLE); |
| 1175 | I915_READ(transconf_reg); | 1321 | I915_READ(transconf_reg); |
| 1176 | 1322 | ||
| 1177 | while ((I915_READ(transconf_reg) & TRANS_STATE_ENABLE) == 0) | 1323 | while ((I915_READ(transconf_reg) & TRANS_STATE_ENABLE) == 0) |
| 1178 | ; | 1324 | ; |
| 1179 | 1325 | ||
| 1180 | /* enable normal */ | 1326 | /* enable normal */ |
| 1181 | 1327 | ||
| 1182 | temp = I915_READ(fdi_tx_reg); | 1328 | temp = I915_READ(fdi_tx_reg); |
| 1183 | temp &= ~FDI_LINK_TRAIN_NONE; | 1329 | temp &= ~FDI_LINK_TRAIN_NONE; |
| 1184 | I915_WRITE(fdi_tx_reg, temp | FDI_LINK_TRAIN_NONE | | 1330 | I915_WRITE(fdi_tx_reg, temp | FDI_LINK_TRAIN_NONE | |
| 1185 | FDI_TX_ENHANCE_FRAME_ENABLE); | 1331 | FDI_TX_ENHANCE_FRAME_ENABLE); |
| 1186 | I915_READ(fdi_tx_reg); | 1332 | I915_READ(fdi_tx_reg); |
| 1187 | 1333 | ||
| 1188 | temp = I915_READ(fdi_rx_reg); | 1334 | temp = I915_READ(fdi_rx_reg); |
| 1189 | temp &= ~FDI_LINK_TRAIN_NONE; | 1335 | temp &= ~FDI_LINK_TRAIN_NONE; |
| 1190 | I915_WRITE(fdi_rx_reg, temp | FDI_LINK_TRAIN_NONE | | 1336 | I915_WRITE(fdi_rx_reg, temp | FDI_LINK_TRAIN_NONE | |
| 1191 | FDI_RX_ENHANCE_FRAME_ENABLE); | 1337 | FDI_RX_ENHANCE_FRAME_ENABLE); |
| 1192 | I915_READ(fdi_rx_reg); | 1338 | I915_READ(fdi_rx_reg); |
| 1193 | 1339 | ||
| 1194 | /* wait one idle pattern time */ | 1340 | /* wait one idle pattern time */ |
| 1195 | udelay(100); | 1341 | udelay(100); |
| 1342 | |||
| 1343 | } | ||
| 1196 | 1344 | ||
| 1197 | intel_crtc_load_lut(crtc); | 1345 | intel_crtc_load_lut(crtc); |
| 1198 | 1346 | ||
| @@ -1200,8 +1348,7 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 1200 | case DRM_MODE_DPMS_OFF: | 1348 | case DRM_MODE_DPMS_OFF: |
| 1201 | DRM_DEBUG("crtc %d dpms off\n", pipe); | 1349 | DRM_DEBUG("crtc %d dpms off\n", pipe); |
| 1202 | 1350 | ||
| 1203 | /* Disable the VGA plane that we never use */ | 1351 | i915_disable_vga(dev); |
| 1204 | I915_WRITE(CPU_VGACNTRL, VGA_DISP_DISABLE); | ||
| 1205 | 1352 | ||
| 1206 | /* Disable display plane */ | 1353 | /* Disable display plane */ |
| 1207 | temp = I915_READ(dspcntr_reg); | 1354 | temp = I915_READ(dspcntr_reg); |
| @@ -1217,17 +1364,23 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 1217 | if ((temp & PIPEACONF_ENABLE) != 0) { | 1364 | if ((temp & PIPEACONF_ENABLE) != 0) { |
| 1218 | I915_WRITE(pipeconf_reg, temp & ~PIPEACONF_ENABLE); | 1365 | I915_WRITE(pipeconf_reg, temp & ~PIPEACONF_ENABLE); |
| 1219 | I915_READ(pipeconf_reg); | 1366 | I915_READ(pipeconf_reg); |
| 1367 | n = 0; | ||
| 1220 | /* wait for cpu pipe off, pipe state */ | 1368 | /* wait for cpu pipe off, pipe state */ |
| 1221 | while ((I915_READ(pipeconf_reg) & I965_PIPECONF_ACTIVE) != 0) | 1369 | while ((I915_READ(pipeconf_reg) & I965_PIPECONF_ACTIVE) != 0) { |
| 1222 | ; | 1370 | n++; |
| 1371 | if (n < 60) { | ||
| 1372 | udelay(500); | ||
| 1373 | continue; | ||
| 1374 | } else { | ||
| 1375 | DRM_DEBUG("pipe %d off delay\n", pipe); | ||
| 1376 | break; | ||
| 1377 | } | ||
| 1378 | } | ||
| 1223 | } else | 1379 | } else |
| 1224 | DRM_DEBUG("crtc %d is disabled\n", pipe); | 1380 | DRM_DEBUG("crtc %d is disabled\n", pipe); |
| 1225 | 1381 | ||
| 1226 | /* IGDNG-A : disable cpu panel fitter ? */ | 1382 | if (HAS_eDP) { |
| 1227 | temp = I915_READ(pf_ctl_reg); | 1383 | igdng_disable_pll_edp(crtc); |
| 1228 | if ((temp & PF_ENABLE) != 0) { | ||
| 1229 | I915_WRITE(pf_ctl_reg, temp & ~PF_ENABLE); | ||
| 1230 | I915_READ(pf_ctl_reg); | ||
| 1231 | } | 1384 | } |
| 1232 | 1385 | ||
| 1233 | /* disable CPU FDI tx and PCH FDI rx */ | 1386 | /* disable CPU FDI tx and PCH FDI rx */ |
| @@ -1239,6 +1392,8 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 1239 | I915_WRITE(fdi_rx_reg, temp & ~FDI_RX_ENABLE); | 1392 | I915_WRITE(fdi_rx_reg, temp & ~FDI_RX_ENABLE); |
| 1240 | I915_READ(fdi_rx_reg); | 1393 | I915_READ(fdi_rx_reg); |
| 1241 | 1394 | ||
| 1395 | udelay(100); | ||
| 1396 | |||
| 1242 | /* still set train pattern 1 */ | 1397 | /* still set train pattern 1 */ |
| 1243 | temp = I915_READ(fdi_tx_reg); | 1398 | temp = I915_READ(fdi_tx_reg); |
| 1244 | temp &= ~FDI_LINK_TRAIN_NONE; | 1399 | temp &= ~FDI_LINK_TRAIN_NONE; |
| @@ -1250,14 +1405,25 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 1250 | temp |= FDI_LINK_TRAIN_PATTERN_1; | 1405 | temp |= FDI_LINK_TRAIN_PATTERN_1; |
| 1251 | I915_WRITE(fdi_rx_reg, temp); | 1406 | I915_WRITE(fdi_rx_reg, temp); |
| 1252 | 1407 | ||
| 1408 | udelay(100); | ||
| 1409 | |||
| 1253 | /* disable PCH transcoder */ | 1410 | /* disable PCH transcoder */ |
| 1254 | temp = I915_READ(transconf_reg); | 1411 | temp = I915_READ(transconf_reg); |
| 1255 | if ((temp & TRANS_ENABLE) != 0) { | 1412 | if ((temp & TRANS_ENABLE) != 0) { |
| 1256 | I915_WRITE(transconf_reg, temp & ~TRANS_ENABLE); | 1413 | I915_WRITE(transconf_reg, temp & ~TRANS_ENABLE); |
| 1257 | I915_READ(transconf_reg); | 1414 | I915_READ(transconf_reg); |
| 1415 | n = 0; | ||
| 1258 | /* wait for PCH transcoder off, transcoder state */ | 1416 | /* wait for PCH transcoder off, transcoder state */ |
| 1259 | while ((I915_READ(transconf_reg) & TRANS_STATE_ENABLE) != 0) | 1417 | while ((I915_READ(transconf_reg) & TRANS_STATE_ENABLE) != 0) { |
| 1260 | ; | 1418 | n++; |
| 1419 | if (n < 60) { | ||
| 1420 | udelay(500); | ||
| 1421 | continue; | ||
| 1422 | } else { | ||
| 1423 | DRM_DEBUG("transcoder %d off delay\n", pipe); | ||
| 1424 | break; | ||
| 1425 | } | ||
| 1426 | } | ||
| 1261 | } | 1427 | } |
| 1262 | 1428 | ||
| 1263 | /* disable PCH DPLL */ | 1429 | /* disable PCH DPLL */ |
| @@ -1275,6 +1441,22 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 1275 | I915_READ(fdi_rx_reg); | 1441 | I915_READ(fdi_rx_reg); |
| 1276 | } | 1442 | } |
| 1277 | 1443 | ||
| 1444 | /* Disable CPU FDI TX PLL */ | ||
| 1445 | temp = I915_READ(fdi_tx_reg); | ||
| 1446 | if ((temp & FDI_TX_PLL_ENABLE) != 0) { | ||
| 1447 | I915_WRITE(fdi_tx_reg, temp & ~FDI_TX_PLL_ENABLE); | ||
| 1448 | I915_READ(fdi_tx_reg); | ||
| 1449 | udelay(100); | ||
| 1450 | } | ||
| 1451 | |||
| 1452 | /* Disable PF */ | ||
| 1453 | temp = I915_READ(pf_ctl_reg); | ||
| 1454 | if ((temp & PF_ENABLE) != 0) { | ||
| 1455 | I915_WRITE(pf_ctl_reg, temp & ~PF_ENABLE); | ||
| 1456 | I915_READ(pf_ctl_reg); | ||
| 1457 | } | ||
| 1458 | I915_WRITE(pf_win_size, 0); | ||
| 1459 | |||
| 1278 | /* Wait for the clocks to turn off. */ | 1460 | /* Wait for the clocks to turn off. */ |
| 1279 | udelay(150); | 1461 | udelay(150); |
| 1280 | break; | 1462 | break; |
| @@ -1342,7 +1524,7 @@ static void i9xx_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 1342 | //intel_crtc_dpms_video(crtc, FALSE); TODO | 1524 | //intel_crtc_dpms_video(crtc, FALSE); TODO |
| 1343 | 1525 | ||
| 1344 | /* Disable the VGA plane that we never use */ | 1526 | /* Disable the VGA plane that we never use */ |
| 1345 | I915_WRITE(VGACNTRL, VGA_DISP_DISABLE); | 1527 | i915_disable_vga(dev); |
| 1346 | 1528 | ||
| 1347 | /* Disable display plane */ | 1529 | /* Disable display plane */ |
| 1348 | temp = I915_READ(dspcntr_reg); | 1530 | temp = I915_READ(dspcntr_reg); |
| @@ -1623,48 +1805,72 @@ static struct intel_watermark_params igd_cursor_hplloff_wm = { | |||
| 1623 | IGD_FIFO_LINE_SIZE | 1805 | IGD_FIFO_LINE_SIZE |
| 1624 | }; | 1806 | }; |
| 1625 | static struct intel_watermark_params i945_wm_info = { | 1807 | static struct intel_watermark_params i945_wm_info = { |
| 1626 | I915_FIFO_LINE_SIZE, | 1808 | I945_FIFO_SIZE, |
| 1627 | I915_MAX_WM, | 1809 | I915_MAX_WM, |
| 1628 | 1, | 1810 | 1, |
| 1629 | 0, | 1811 | 2, |
| 1630 | IGD_FIFO_LINE_SIZE | 1812 | I915_FIFO_LINE_SIZE |
| 1631 | }; | 1813 | }; |
| 1632 | static struct intel_watermark_params i915_wm_info = { | 1814 | static struct intel_watermark_params i915_wm_info = { |
| 1633 | I945_FIFO_SIZE, | 1815 | I915_FIFO_SIZE, |
| 1634 | I915_MAX_WM, | 1816 | I915_MAX_WM, |
| 1635 | 1, | 1817 | 1, |
| 1636 | 0, | 1818 | 2, |
| 1637 | I915_FIFO_LINE_SIZE | 1819 | I915_FIFO_LINE_SIZE |
| 1638 | }; | 1820 | }; |
| 1639 | static struct intel_watermark_params i855_wm_info = { | 1821 | static struct intel_watermark_params i855_wm_info = { |
| 1640 | I855GM_FIFO_SIZE, | 1822 | I855GM_FIFO_SIZE, |
| 1641 | I915_MAX_WM, | 1823 | I915_MAX_WM, |
| 1642 | 1, | 1824 | 1, |
| 1643 | 0, | 1825 | 2, |
| 1644 | I830_FIFO_LINE_SIZE | 1826 | I830_FIFO_LINE_SIZE |
| 1645 | }; | 1827 | }; |
| 1646 | static struct intel_watermark_params i830_wm_info = { | 1828 | static struct intel_watermark_params i830_wm_info = { |
| 1647 | I830_FIFO_SIZE, | 1829 | I830_FIFO_SIZE, |
| 1648 | I915_MAX_WM, | 1830 | I915_MAX_WM, |
| 1649 | 1, | 1831 | 1, |
| 1650 | 0, | 1832 | 2, |
| 1651 | I830_FIFO_LINE_SIZE | 1833 | I830_FIFO_LINE_SIZE |
| 1652 | }; | 1834 | }; |
| 1653 | 1835 | ||
| 1836 | /** | ||
| 1837 | * intel_calculate_wm - calculate watermark level | ||
| 1838 | * @clock_in_khz: pixel clock | ||
| 1839 | * @wm: chip FIFO params | ||
| 1840 | * @pixel_size: display pixel size | ||
| 1841 | * @latency_ns: memory latency for the platform | ||
| 1842 | * | ||
| 1843 | * Calculate the watermark level (the level at which the display plane will | ||
| 1844 | * start fetching from memory again). Each chip has a different display | ||
| 1845 | * FIFO size and allocation, so the caller needs to figure that out and pass | ||
| 1846 | * in the correct intel_watermark_params structure. | ||
| 1847 | * | ||
| 1848 | * As the pixel clock runs, the FIFO will be drained at a rate that depends | ||
| 1849 | * on the pixel size. When it reaches the watermark level, it'll start | ||
| 1850 | * fetching FIFO line sized based chunks from memory until the FIFO fills | ||
| 1851 | * past the watermark point. If the FIFO drains completely, a FIFO underrun | ||
| 1852 | * will occur, and a display engine hang could result. | ||
| 1853 | */ | ||
| 1654 | static unsigned long intel_calculate_wm(unsigned long clock_in_khz, | 1854 | static unsigned long intel_calculate_wm(unsigned long clock_in_khz, |
| 1655 | struct intel_watermark_params *wm, | 1855 | struct intel_watermark_params *wm, |
| 1656 | int pixel_size, | 1856 | int pixel_size, |
| 1657 | unsigned long latency_ns) | 1857 | unsigned long latency_ns) |
| 1658 | { | 1858 | { |
| 1659 | unsigned long bytes_required, wm_size; | 1859 | long entries_required, wm_size; |
| 1860 | |||
| 1861 | entries_required = (clock_in_khz * pixel_size * latency_ns) / 1000000; | ||
| 1862 | entries_required /= wm->cacheline_size; | ||
| 1660 | 1863 | ||
| 1661 | bytes_required = (clock_in_khz * pixel_size * latency_ns) / 1000000; | 1864 | DRM_DEBUG("FIFO entries required for mode: %d\n", entries_required); |
| 1662 | bytes_required /= wm->cacheline_size; | ||
| 1663 | wm_size = wm->fifo_size - bytes_required - wm->guard_size; | ||
| 1664 | 1865 | ||
| 1665 | if (wm_size > wm->max_wm) | 1866 | wm_size = wm->fifo_size - (entries_required + wm->guard_size); |
| 1867 | |||
| 1868 | DRM_DEBUG("FIFO watermark level: %d\n", wm_size); | ||
| 1869 | |||
| 1870 | /* Don't promote wm_size to unsigned... */ | ||
| 1871 | if (wm_size > (long)wm->max_wm) | ||
| 1666 | wm_size = wm->max_wm; | 1872 | wm_size = wm->max_wm; |
| 1667 | if (wm_size == 0) | 1873 | if (wm_size <= 0) |
| 1668 | wm_size = wm->default_wm; | 1874 | wm_size = wm->default_wm; |
| 1669 | return wm_size; | 1875 | return wm_size; |
| 1670 | } | 1876 | } |
| @@ -1799,8 +2005,40 @@ static void igd_enable_cxsr(struct drm_device *dev, unsigned long clock, | |||
| 1799 | return; | 2005 | return; |
| 1800 | } | 2006 | } |
| 1801 | 2007 | ||
| 1802 | const static int latency_ns = 5000; /* default for non-igd platforms */ | 2008 | const static int latency_ns = 3000; /* default for non-igd platforms */ |
| 1803 | 2009 | ||
| 2010 | static int intel_get_fifo_size(struct drm_device *dev, int plane) | ||
| 2011 | { | ||
| 2012 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 2013 | uint32_t dsparb = I915_READ(DSPARB); | ||
| 2014 | int size; | ||
| 2015 | |||
| 2016 | if (IS_I9XX(dev)) { | ||
| 2017 | if (plane == 0) | ||
| 2018 | size = dsparb & 0x7f; | ||
| 2019 | else | ||
| 2020 | size = ((dsparb >> DSPARB_CSTART_SHIFT) & 0x7f) - | ||
| 2021 | (dsparb & 0x7f); | ||
| 2022 | } else if (IS_I85X(dev)) { | ||
| 2023 | if (plane == 0) | ||
| 2024 | size = dsparb & 0x1ff; | ||
| 2025 | else | ||
| 2026 | size = ((dsparb >> DSPARB_BEND_SHIFT) & 0x1ff) - | ||
| 2027 | (dsparb & 0x1ff); | ||
| 2028 | size >>= 1; /* Convert to cachelines */ | ||
| 2029 | } else if (IS_845G(dev)) { | ||
| 2030 | size = dsparb & 0x7f; | ||
| 2031 | size >>= 2; /* Convert to cachelines */ | ||
| 2032 | } else { | ||
| 2033 | size = dsparb & 0x7f; | ||
| 2034 | size >>= 1; /* Convert to cachelines */ | ||
| 2035 | } | ||
| 2036 | |||
| 2037 | DRM_DEBUG("FIFO size - (0x%08x) %s: %d\n", dsparb, plane ? "B" : "A", | ||
| 2038 | size); | ||
| 2039 | |||
| 2040 | return size; | ||
| 2041 | } | ||
| 1804 | 2042 | ||
| 1805 | static void i965_update_wm(struct drm_device *dev) | 2043 | static void i965_update_wm(struct drm_device *dev) |
| 1806 | { | 2044 | { |
| @@ -1817,101 +2055,89 @@ static void i9xx_update_wm(struct drm_device *dev, int planea_clock, | |||
| 1817 | int planeb_clock, int sr_hdisplay, int pixel_size) | 2055 | int planeb_clock, int sr_hdisplay, int pixel_size) |
| 1818 | { | 2056 | { |
| 1819 | struct drm_i915_private *dev_priv = dev->dev_private; | 2057 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 1820 | uint32_t fwater_lo = I915_READ(FW_BLC) & MM_FIFO_WATERMARK; | 2058 | uint32_t fwater_lo; |
| 1821 | uint32_t fwater_hi = I915_READ(FW_BLC2) & LM_FIFO_WATERMARK; | 2059 | uint32_t fwater_hi; |
| 1822 | int bsize, asize, cwm, bwm = 1, awm = 1, srwm = 1; | 2060 | int total_size, cacheline_size, cwm, srwm = 1; |
| 1823 | uint32_t dsparb = I915_READ(DSPARB); | 2061 | int planea_wm, planeb_wm; |
| 1824 | int planea_entries, planeb_entries; | 2062 | struct intel_watermark_params planea_params, planeb_params; |
| 1825 | struct intel_watermark_params *wm_params; | ||
| 1826 | unsigned long line_time_us; | 2063 | unsigned long line_time_us; |
| 1827 | int sr_clock, sr_entries = 0; | 2064 | int sr_clock, sr_entries = 0; |
| 1828 | 2065 | ||
| 2066 | /* Create copies of the base settings for each pipe */ | ||
| 1829 | if (IS_I965GM(dev) || IS_I945GM(dev)) | 2067 | if (IS_I965GM(dev) || IS_I945GM(dev)) |
| 1830 | wm_params = &i945_wm_info; | 2068 | planea_params = planeb_params = i945_wm_info; |
| 1831 | else if (IS_I9XX(dev)) | 2069 | else if (IS_I9XX(dev)) |
| 1832 | wm_params = &i915_wm_info; | 2070 | planea_params = planeb_params = i915_wm_info; |
| 1833 | else | 2071 | else |
| 1834 | wm_params = &i855_wm_info; | 2072 | planea_params = planeb_params = i855_wm_info; |
| 1835 | |||
| 1836 | planea_entries = intel_calculate_wm(planea_clock, wm_params, | ||
| 1837 | pixel_size, latency_ns); | ||
| 1838 | planeb_entries = intel_calculate_wm(planeb_clock, wm_params, | ||
| 1839 | pixel_size, latency_ns); | ||
| 1840 | |||
| 1841 | DRM_DEBUG("FIFO entries - A: %d, B: %d\n", planea_entries, | ||
| 1842 | planeb_entries); | ||
| 1843 | 2073 | ||
| 1844 | if (IS_I9XX(dev)) { | 2074 | /* Grab a couple of global values before we overwrite them */ |
| 1845 | asize = dsparb & 0x7f; | 2075 | total_size = planea_params.fifo_size; |
| 1846 | bsize = (dsparb >> DSPARB_CSTART_SHIFT) & 0x7f; | 2076 | cacheline_size = planea_params.cacheline_size; |
| 1847 | } else { | ||
| 1848 | asize = dsparb & 0x1ff; | ||
| 1849 | bsize = (dsparb >> DSPARB_BEND_SHIFT) & 0x1ff; | ||
| 1850 | } | ||
| 1851 | DRM_DEBUG("FIFO size - A: %d, B: %d\n", asize, bsize); | ||
| 1852 | 2077 | ||
| 1853 | /* Two extra entries for padding */ | 2078 | /* Update per-plane FIFO sizes */ |
| 1854 | awm = asize - (planea_entries + 2); | 2079 | planea_params.fifo_size = intel_get_fifo_size(dev, 0); |
| 1855 | bwm = bsize - (planeb_entries + 2); | 2080 | planeb_params.fifo_size = intel_get_fifo_size(dev, 1); |
| 1856 | 2081 | ||
| 1857 | /* Sanity check against potentially bad FIFO allocations */ | 2082 | planea_wm = intel_calculate_wm(planea_clock, &planea_params, |
| 1858 | if (awm <= 0) { | 2083 | pixel_size, latency_ns); |
| 1859 | /* pipe is on but has too few FIFO entries */ | 2084 | planeb_wm = intel_calculate_wm(planeb_clock, &planeb_params, |
| 1860 | if (planea_entries != 0) | 2085 | pixel_size, latency_ns); |
| 1861 | DRM_DEBUG("plane A needs more FIFO entries\n"); | 2086 | DRM_DEBUG("FIFO watermarks - A: %d, B: %d\n", planea_wm, planeb_wm); |
| 1862 | awm = 1; | ||
| 1863 | } | ||
| 1864 | if (bwm <= 0) { | ||
| 1865 | if (planeb_entries != 0) | ||
| 1866 | DRM_DEBUG("plane B needs more FIFO entries\n"); | ||
| 1867 | bwm = 1; | ||
| 1868 | } | ||
| 1869 | 2087 | ||
| 1870 | /* | 2088 | /* |
| 1871 | * Overlay gets an aggressive default since video jitter is bad. | 2089 | * Overlay gets an aggressive default since video jitter is bad. |
| 1872 | */ | 2090 | */ |
| 1873 | cwm = 2; | 2091 | cwm = 2; |
| 1874 | 2092 | ||
| 1875 | /* Calc sr entries for one pipe configs */ | 2093 | /* Calc sr entries for one plane configs */ |
| 1876 | if (!planea_clock || !planeb_clock) { | 2094 | if (sr_hdisplay && (!planea_clock || !planeb_clock)) { |
| 2095 | /* self-refresh has much higher latency */ | ||
| 2096 | const static int sr_latency_ns = 6000; | ||
| 2097 | |||
| 1877 | sr_clock = planea_clock ? planea_clock : planeb_clock; | 2098 | sr_clock = planea_clock ? planea_clock : planeb_clock; |
| 1878 | line_time_us = (sr_hdisplay * 1000) / sr_clock; | 2099 | line_time_us = ((sr_hdisplay * 1000) / sr_clock); |
| 1879 | sr_entries = (((latency_ns / line_time_us) + 1) * pixel_size * | 2100 | |
| 1880 | sr_hdisplay) / 1000; | 2101 | /* Use ns/us then divide to preserve precision */ |
| 1881 | sr_entries = roundup(sr_entries / wm_params->cacheline_size, 1); | 2102 | sr_entries = (((sr_latency_ns / line_time_us) + 1) * |
| 1882 | if (sr_entries < wm_params->fifo_size) | 2103 | pixel_size * sr_hdisplay) / 1000; |
| 1883 | srwm = wm_params->fifo_size - sr_entries; | 2104 | sr_entries = roundup(sr_entries / cacheline_size, 1); |
| 2105 | DRM_DEBUG("self-refresh entries: %d\n", sr_entries); | ||
| 2106 | srwm = total_size - sr_entries; | ||
| 2107 | if (srwm < 0) | ||
| 2108 | srwm = 1; | ||
| 2109 | if (IS_I9XX(dev)) | ||
| 2110 | I915_WRITE(FW_BLC_SELF, (srwm & 0x3f)); | ||
| 1884 | } | 2111 | } |
| 1885 | 2112 | ||
| 1886 | DRM_DEBUG("Setting FIFO watermarks - A: %d, B: %d, C: %d, SR %d\n", | 2113 | DRM_DEBUG("Setting FIFO watermarks - A: %d, B: %d, C: %d, SR %d\n", |
| 1887 | awm, bwm, cwm, srwm); | 2114 | planea_wm, planeb_wm, cwm, srwm); |
| 1888 | 2115 | ||
| 1889 | fwater_lo = fwater_lo | ((bwm & 0x3f) << 16) | (awm & 0x3f); | 2116 | fwater_lo = ((planeb_wm & 0x3f) << 16) | (planea_wm & 0x3f); |
| 1890 | fwater_hi = fwater_hi | (cwm & 0x1f); | 2117 | fwater_hi = (cwm & 0x1f); |
| 2118 | |||
| 2119 | /* Set request length to 8 cachelines per fetch */ | ||
| 2120 | fwater_lo = fwater_lo | (1 << 24) | (1 << 8); | ||
| 2121 | fwater_hi = fwater_hi | (1 << 8); | ||
| 1891 | 2122 | ||
| 1892 | I915_WRITE(FW_BLC, fwater_lo); | 2123 | I915_WRITE(FW_BLC, fwater_lo); |
| 1893 | I915_WRITE(FW_BLC2, fwater_hi); | 2124 | I915_WRITE(FW_BLC2, fwater_hi); |
| 1894 | if (IS_I9XX(dev)) | ||
| 1895 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN | (srwm & 0x3f)); | ||
| 1896 | } | 2125 | } |
| 1897 | 2126 | ||
| 1898 | static void i830_update_wm(struct drm_device *dev, int planea_clock, | 2127 | static void i830_update_wm(struct drm_device *dev, int planea_clock, |
| 1899 | int pixel_size) | 2128 | int pixel_size) |
| 1900 | { | 2129 | { |
| 1901 | struct drm_i915_private *dev_priv = dev->dev_private; | 2130 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 1902 | uint32_t dsparb = I915_READ(DSPARB); | 2131 | uint32_t fwater_lo = I915_READ(FW_BLC) & ~0xfff; |
| 1903 | uint32_t fwater_lo = I915_READ(FW_BLC) & MM_FIFO_WATERMARK; | 2132 | int planea_wm; |
| 1904 | unsigned int asize, awm; | ||
| 1905 | int planea_entries; | ||
| 1906 | |||
| 1907 | planea_entries = intel_calculate_wm(planea_clock, &i830_wm_info, | ||
| 1908 | pixel_size, latency_ns); | ||
| 1909 | 2133 | ||
| 1910 | asize = dsparb & 0x7f; | 2134 | i830_wm_info.fifo_size = intel_get_fifo_size(dev, 0); |
| 1911 | 2135 | ||
| 1912 | awm = asize - planea_entries; | 2136 | planea_wm = intel_calculate_wm(planea_clock, &i830_wm_info, |
| 2137 | pixel_size, latency_ns); | ||
| 2138 | fwater_lo |= (3<<8) | planea_wm; | ||
| 1913 | 2139 | ||
| 1914 | fwater_lo = fwater_lo | awm; | 2140 | DRM_DEBUG("Setting FIFO watermarks - A: %d\n", planea_wm); |
| 1915 | 2141 | ||
| 1916 | I915_WRITE(FW_BLC, fwater_lo); | 2142 | I915_WRITE(FW_BLC, fwater_lo); |
| 1917 | } | 2143 | } |
| @@ -1984,7 +2210,7 @@ static void intel_update_watermarks(struct drm_device *dev) | |||
| 1984 | if (enabled <= 0) | 2210 | if (enabled <= 0) |
| 1985 | return; | 2211 | return; |
| 1986 | 2212 | ||
| 1987 | /* Single pipe configs can enable self refresh */ | 2213 | /* Single plane configs can enable self refresh */ |
| 1988 | if (enabled == 1 && IS_IGD(dev)) | 2214 | if (enabled == 1 && IS_IGD(dev)) |
| 1989 | igd_enable_cxsr(dev, sr_clock, pixel_size); | 2215 | igd_enable_cxsr(dev, sr_clock, pixel_size); |
| 1990 | else if (IS_IGD(dev)) | 2216 | else if (IS_IGD(dev)) |
| @@ -2028,6 +2254,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
| 2028 | u32 dpll = 0, fp = 0, dspcntr, pipeconf; | 2254 | u32 dpll = 0, fp = 0, dspcntr, pipeconf; |
| 2029 | bool ok, is_sdvo = false, is_dvo = false; | 2255 | bool ok, is_sdvo = false, is_dvo = false; |
| 2030 | bool is_crt = false, is_lvds = false, is_tv = false, is_dp = false; | 2256 | bool is_crt = false, is_lvds = false, is_tv = false, is_dp = false; |
| 2257 | bool is_edp = false; | ||
| 2031 | struct drm_mode_config *mode_config = &dev->mode_config; | 2258 | struct drm_mode_config *mode_config = &dev->mode_config; |
| 2032 | struct drm_connector *connector; | 2259 | struct drm_connector *connector; |
| 2033 | const intel_limit_t *limit; | 2260 | const intel_limit_t *limit; |
| @@ -2043,6 +2270,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
| 2043 | int lvds_reg = LVDS; | 2270 | int lvds_reg = LVDS; |
| 2044 | u32 temp; | 2271 | u32 temp; |
| 2045 | int sdvo_pixel_multiply; | 2272 | int sdvo_pixel_multiply; |
| 2273 | int target_clock; | ||
| 2046 | 2274 | ||
| 2047 | drm_vblank_pre_modeset(dev, pipe); | 2275 | drm_vblank_pre_modeset(dev, pipe); |
| 2048 | 2276 | ||
| @@ -2074,6 +2302,9 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
| 2074 | case INTEL_OUTPUT_DISPLAYPORT: | 2302 | case INTEL_OUTPUT_DISPLAYPORT: |
| 2075 | is_dp = true; | 2303 | is_dp = true; |
| 2076 | break; | 2304 | break; |
| 2305 | case INTEL_OUTPUT_EDP: | ||
| 2306 | is_edp = true; | ||
| 2307 | break; | ||
| 2077 | } | 2308 | } |
| 2078 | 2309 | ||
| 2079 | num_outputs++; | 2310 | num_outputs++; |
| @@ -2125,11 +2356,29 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
| 2125 | } | 2356 | } |
| 2126 | 2357 | ||
| 2127 | /* FDI link */ | 2358 | /* FDI link */ |
| 2128 | if (IS_IGDNG(dev)) | 2359 | if (IS_IGDNG(dev)) { |
| 2129 | igdng_compute_m_n(3, 4, /* lane num 4 */ | 2360 | int lane, link_bw; |
| 2130 | adjusted_mode->clock, | 2361 | /* eDP doesn't require FDI link, so just set DP M/N |
| 2131 | 270000, /* lane clock */ | 2362 | according to current link config */ |
| 2132 | &m_n); | 2363 | if (is_edp) { |
| 2364 | struct drm_connector *edp; | ||
| 2365 | target_clock = mode->clock; | ||
| 2366 | edp = intel_pipe_get_output(crtc); | ||
| 2367 | intel_edp_link_config(to_intel_output(edp), | ||
| 2368 | &lane, &link_bw); | ||
| 2369 | } else { | ||
| 2370 | /* DP over FDI requires target mode clock | ||
| 2371 | instead of link clock */ | ||
| 2372 | if (is_dp) | ||
| 2373 | target_clock = mode->clock; | ||
| 2374 | else | ||
| 2375 | target_clock = adjusted_mode->clock; | ||
| 2376 | lane = 4; | ||
| 2377 | link_bw = 270000; | ||
| 2378 | } | ||
| 2379 | igdng_compute_m_n(3, lane, target_clock, | ||
| 2380 | link_bw, &m_n); | ||
| 2381 | } | ||
| 2133 | 2382 | ||
| 2134 | if (IS_IGD(dev)) | 2383 | if (IS_IGD(dev)) |
| 2135 | fp = (1 << clock.n) << 16 | clock.m1 << 8 | clock.m2; | 2384 | fp = (1 << clock.n) << 16 | clock.m1 << 8 | clock.m2; |
| @@ -2250,29 +2499,15 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
| 2250 | dpll_reg = pch_dpll_reg; | 2499 | dpll_reg = pch_dpll_reg; |
| 2251 | } | 2500 | } |
| 2252 | 2501 | ||
| 2253 | if (dpll & DPLL_VCO_ENABLE) { | 2502 | if (is_edp) { |
| 2503 | igdng_disable_pll_edp(crtc); | ||
| 2504 | } else if ((dpll & DPLL_VCO_ENABLE)) { | ||
| 2254 | I915_WRITE(fp_reg, fp); | 2505 | I915_WRITE(fp_reg, fp); |
| 2255 | I915_WRITE(dpll_reg, dpll & ~DPLL_VCO_ENABLE); | 2506 | I915_WRITE(dpll_reg, dpll & ~DPLL_VCO_ENABLE); |
| 2256 | I915_READ(dpll_reg); | 2507 | I915_READ(dpll_reg); |
| 2257 | udelay(150); | 2508 | udelay(150); |
| 2258 | } | 2509 | } |
| 2259 | 2510 | ||
| 2260 | if (IS_IGDNG(dev)) { | ||
| 2261 | /* enable PCH clock reference source */ | ||
| 2262 | /* XXX need to change the setting for other outputs */ | ||
| 2263 | u32 temp; | ||
| 2264 | temp = I915_READ(PCH_DREF_CONTROL); | ||
| 2265 | temp &= ~DREF_NONSPREAD_SOURCE_MASK; | ||
| 2266 | temp |= DREF_NONSPREAD_CK505_ENABLE; | ||
| 2267 | temp &= ~DREF_SSC_SOURCE_MASK; | ||
| 2268 | temp |= DREF_SSC_SOURCE_ENABLE; | ||
| 2269 | temp &= ~DREF_SSC1_ENABLE; | ||
| 2270 | /* if no eDP, disable source output to CPU */ | ||
| 2271 | temp &= ~DREF_CPU_SOURCE_OUTPUT_MASK; | ||
| 2272 | temp |= DREF_CPU_SOURCE_OUTPUT_DISABLE; | ||
| 2273 | I915_WRITE(PCH_DREF_CONTROL, temp); | ||
| 2274 | } | ||
| 2275 | |||
| 2276 | /* The LVDS pin pair needs to be on before the DPLLs are enabled. | 2511 | /* The LVDS pin pair needs to be on before the DPLLs are enabled. |
| 2277 | * This is an exception to the general rule that mode_set doesn't turn | 2512 | * This is an exception to the general rule that mode_set doesn't turn |
| 2278 | * things on. | 2513 | * things on. |
| @@ -2304,23 +2539,25 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
| 2304 | if (is_dp) | 2539 | if (is_dp) |
| 2305 | intel_dp_set_m_n(crtc, mode, adjusted_mode); | 2540 | intel_dp_set_m_n(crtc, mode, adjusted_mode); |
| 2306 | 2541 | ||
| 2307 | I915_WRITE(fp_reg, fp); | 2542 | if (!is_edp) { |
| 2308 | I915_WRITE(dpll_reg, dpll); | 2543 | I915_WRITE(fp_reg, fp); |
| 2309 | I915_READ(dpll_reg); | ||
| 2310 | /* Wait for the clocks to stabilize. */ | ||
| 2311 | udelay(150); | ||
| 2312 | |||
| 2313 | if (IS_I965G(dev) && !IS_IGDNG(dev)) { | ||
| 2314 | sdvo_pixel_multiply = adjusted_mode->clock / mode->clock; | ||
| 2315 | I915_WRITE(dpll_md_reg, (0 << DPLL_MD_UDI_DIVIDER_SHIFT) | | ||
| 2316 | ((sdvo_pixel_multiply - 1) << DPLL_MD_UDI_MULTIPLIER_SHIFT)); | ||
| 2317 | } else { | ||
| 2318 | /* write it again -- the BIOS does, after all */ | ||
| 2319 | I915_WRITE(dpll_reg, dpll); | 2544 | I915_WRITE(dpll_reg, dpll); |
| 2545 | I915_READ(dpll_reg); | ||
| 2546 | /* Wait for the clocks to stabilize. */ | ||
| 2547 | udelay(150); | ||
| 2548 | |||
| 2549 | if (IS_I965G(dev) && !IS_IGDNG(dev)) { | ||
| 2550 | sdvo_pixel_multiply = adjusted_mode->clock / mode->clock; | ||
| 2551 | I915_WRITE(dpll_md_reg, (0 << DPLL_MD_UDI_DIVIDER_SHIFT) | | ||
| 2552 | ((sdvo_pixel_multiply - 1) << DPLL_MD_UDI_MULTIPLIER_SHIFT)); | ||
| 2553 | } else { | ||
| 2554 | /* write it again -- the BIOS does, after all */ | ||
| 2555 | I915_WRITE(dpll_reg, dpll); | ||
| 2556 | } | ||
| 2557 | I915_READ(dpll_reg); | ||
| 2558 | /* Wait for the clocks to stabilize. */ | ||
| 2559 | udelay(150); | ||
| 2320 | } | 2560 | } |
| 2321 | I915_READ(dpll_reg); | ||
| 2322 | /* Wait for the clocks to stabilize. */ | ||
| 2323 | udelay(150); | ||
| 2324 | 2561 | ||
| 2325 | I915_WRITE(htot_reg, (adjusted_mode->crtc_hdisplay - 1) | | 2562 | I915_WRITE(htot_reg, (adjusted_mode->crtc_hdisplay - 1) | |
| 2326 | ((adjusted_mode->crtc_htotal - 1) << 16)); | 2563 | ((adjusted_mode->crtc_htotal - 1) << 16)); |
| @@ -2350,10 +2587,14 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
| 2350 | I915_WRITE(link_m1_reg, m_n.link_m); | 2587 | I915_WRITE(link_m1_reg, m_n.link_m); |
| 2351 | I915_WRITE(link_n1_reg, m_n.link_n); | 2588 | I915_WRITE(link_n1_reg, m_n.link_n); |
| 2352 | 2589 | ||
| 2353 | /* enable FDI RX PLL too */ | 2590 | if (is_edp) { |
| 2354 | temp = I915_READ(fdi_rx_reg); | 2591 | igdng_set_pll_edp(crtc, adjusted_mode->clock); |
| 2355 | I915_WRITE(fdi_rx_reg, temp | FDI_RX_PLL_ENABLE); | 2592 | } else { |
| 2356 | udelay(200); | 2593 | /* enable FDI RX PLL too */ |
| 2594 | temp = I915_READ(fdi_rx_reg); | ||
| 2595 | I915_WRITE(fdi_rx_reg, temp | FDI_RX_PLL_ENABLE); | ||
| 2596 | udelay(200); | ||
| 2597 | } | ||
| 2357 | } | 2598 | } |
| 2358 | 2599 | ||
| 2359 | I915_WRITE(pipeconf_reg, pipeconf); | 2600 | I915_WRITE(pipeconf_reg, pipeconf); |
| @@ -2951,12 +3192,17 @@ static void intel_setup_outputs(struct drm_device *dev) | |||
| 2951 | if (IS_IGDNG(dev)) { | 3192 | if (IS_IGDNG(dev)) { |
| 2952 | int found; | 3193 | int found; |
| 2953 | 3194 | ||
| 3195 | if (IS_MOBILE(dev) && (I915_READ(DP_A) & DP_DETECTED)) | ||
| 3196 | intel_dp_init(dev, DP_A); | ||
| 3197 | |||
| 2954 | if (I915_READ(HDMIB) & PORT_DETECTED) { | 3198 | if (I915_READ(HDMIB) & PORT_DETECTED) { |
| 2955 | /* check SDVOB */ | 3199 | /* check SDVOB */ |
| 2956 | /* found = intel_sdvo_init(dev, HDMIB); */ | 3200 | /* found = intel_sdvo_init(dev, HDMIB); */ |
| 2957 | found = 0; | 3201 | found = 0; |
| 2958 | if (!found) | 3202 | if (!found) |
| 2959 | intel_hdmi_init(dev, HDMIB); | 3203 | intel_hdmi_init(dev, HDMIB); |
| 3204 | if (!found && (I915_READ(PCH_DP_B) & DP_DETECTED)) | ||
| 3205 | intel_dp_init(dev, PCH_DP_B); | ||
| 2960 | } | 3206 | } |
| 2961 | 3207 | ||
| 2962 | if (I915_READ(HDMIC) & PORT_DETECTED) | 3208 | if (I915_READ(HDMIC) & PORT_DETECTED) |
| @@ -2965,6 +3211,12 @@ static void intel_setup_outputs(struct drm_device *dev) | |||
| 2965 | if (I915_READ(HDMID) & PORT_DETECTED) | 3211 | if (I915_READ(HDMID) & PORT_DETECTED) |
| 2966 | intel_hdmi_init(dev, HDMID); | 3212 | intel_hdmi_init(dev, HDMID); |
| 2967 | 3213 | ||
| 3214 | if (I915_READ(PCH_DP_C) & DP_DETECTED) | ||
| 3215 | intel_dp_init(dev, PCH_DP_C); | ||
| 3216 | |||
| 3217 | if (I915_READ(PCH_DP_D) & DP_DETECTED) | ||
| 3218 | intel_dp_init(dev, PCH_DP_D); | ||
| 3219 | |||
| 2968 | } else if (IS_I9XX(dev)) { | 3220 | } else if (IS_I9XX(dev)) { |
| 2969 | int found; | 3221 | int found; |
| 2970 | u32 reg; | 3222 | u32 reg; |
| @@ -3039,6 +3291,10 @@ static void intel_setup_outputs(struct drm_device *dev) | |||
| 3039 | (1 << 1)); | 3291 | (1 << 1)); |
| 3040 | clone_mask = (1 << INTEL_OUTPUT_DISPLAYPORT); | 3292 | clone_mask = (1 << INTEL_OUTPUT_DISPLAYPORT); |
| 3041 | break; | 3293 | break; |
| 3294 | case INTEL_OUTPUT_EDP: | ||
| 3295 | crtc_mask = (1 << 1); | ||
| 3296 | clone_mask = (1 << INTEL_OUTPUT_EDP); | ||
| 3297 | break; | ||
| 3042 | } | 3298 | } |
| 3043 | encoder->possible_crtcs = crtc_mask; | 3299 | encoder->possible_crtcs = crtc_mask; |
| 3044 | encoder->possible_clones = intel_connector_clones(dev, clone_mask); | 3300 | encoder->possible_clones = intel_connector_clones(dev, clone_mask); |
| @@ -3148,6 +3404,9 @@ void intel_modeset_init(struct drm_device *dev) | |||
| 3148 | if (IS_I965G(dev)) { | 3404 | if (IS_I965G(dev)) { |
| 3149 | dev->mode_config.max_width = 8192; | 3405 | dev->mode_config.max_width = 8192; |
| 3150 | dev->mode_config.max_height = 8192; | 3406 | dev->mode_config.max_height = 8192; |
| 3407 | } else if (IS_I9XX(dev)) { | ||
| 3408 | dev->mode_config.max_width = 4096; | ||
| 3409 | dev->mode_config.max_height = 4096; | ||
| 3151 | } else { | 3410 | } else { |
| 3152 | dev->mode_config.max_width = 2048; | 3411 | dev->mode_config.max_width = 2048; |
| 3153 | dev->mode_config.max_height = 2048; | 3412 | dev->mode_config.max_height = 2048; |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 6770ae88370d..a6ff15ac548a 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -40,6 +40,8 @@ | |||
| 40 | 40 | ||
| 41 | #define DP_LINK_CONFIGURATION_SIZE 9 | 41 | #define DP_LINK_CONFIGURATION_SIZE 9 |
| 42 | 42 | ||
| 43 | #define IS_eDP(i) ((i)->type == INTEL_OUTPUT_EDP) | ||
| 44 | |||
| 43 | struct intel_dp_priv { | 45 | struct intel_dp_priv { |
| 44 | uint32_t output_reg; | 46 | uint32_t output_reg; |
| 45 | uint32_t DP; | 47 | uint32_t DP; |
| @@ -63,6 +65,19 @@ intel_dp_link_train(struct intel_output *intel_output, uint32_t DP, | |||
| 63 | static void | 65 | static void |
| 64 | intel_dp_link_down(struct intel_output *intel_output, uint32_t DP); | 66 | intel_dp_link_down(struct intel_output *intel_output, uint32_t DP); |
| 65 | 67 | ||
| 68 | void | ||
| 69 | intel_edp_link_config (struct intel_output *intel_output, | ||
| 70 | int *lane_num, int *link_bw) | ||
| 71 | { | ||
| 72 | struct intel_dp_priv *dp_priv = intel_output->dev_priv; | ||
| 73 | |||
| 74 | *lane_num = dp_priv->lane_count; | ||
| 75 | if (dp_priv->link_bw == DP_LINK_BW_1_62) | ||
| 76 | *link_bw = 162000; | ||
| 77 | else if (dp_priv->link_bw == DP_LINK_BW_2_7) | ||
| 78 | *link_bw = 270000; | ||
| 79 | } | ||
| 80 | |||
| 66 | static int | 81 | static int |
| 67 | intel_dp_max_lane_count(struct intel_output *intel_output) | 82 | intel_dp_max_lane_count(struct intel_output *intel_output) |
| 68 | { | 83 | { |
| @@ -206,7 +221,13 @@ intel_dp_aux_ch(struct intel_output *intel_output, | |||
| 206 | * and would like to run at 2MHz. So, take the | 221 | * and would like to run at 2MHz. So, take the |
| 207 | * hrawclk value and divide by 2 and use that | 222 | * hrawclk value and divide by 2 and use that |
| 208 | */ | 223 | */ |
| 209 | aux_clock_divider = intel_hrawclk(dev) / 2; | 224 | if (IS_eDP(intel_output)) |
| 225 | aux_clock_divider = 225; /* eDP input clock at 450Mhz */ | ||
| 226 | else if (IS_IGDNG(dev)) | ||
| 227 | aux_clock_divider = 62; /* IGDNG: input clock fixed at 125Mhz */ | ||
| 228 | else | ||
| 229 | aux_clock_divider = intel_hrawclk(dev) / 2; | ||
| 230 | |||
| 210 | /* Must try at least 3 times according to DP spec */ | 231 | /* Must try at least 3 times according to DP spec */ |
| 211 | for (try = 0; try < 5; try++) { | 232 | for (try = 0; try < 5; try++) { |
| 212 | /* Load the send data into the aux channel data registers */ | 233 | /* Load the send data into the aux channel data registers */ |
| @@ -236,7 +257,7 @@ intel_dp_aux_ch(struct intel_output *intel_output, | |||
| 236 | } | 257 | } |
| 237 | 258 | ||
| 238 | /* Clear done status and any errors */ | 259 | /* Clear done status and any errors */ |
| 239 | I915_WRITE(ch_ctl, (ctl | | 260 | I915_WRITE(ch_ctl, (status | |
| 240 | DP_AUX_CH_CTL_DONE | | 261 | DP_AUX_CH_CTL_DONE | |
| 241 | DP_AUX_CH_CTL_TIME_OUT_ERROR | | 262 | DP_AUX_CH_CTL_TIME_OUT_ERROR | |
| 242 | DP_AUX_CH_CTL_RECEIVE_ERROR)); | 263 | DP_AUX_CH_CTL_RECEIVE_ERROR)); |
| @@ -295,7 +316,7 @@ intel_dp_aux_native_write(struct intel_output *intel_output, | |||
| 295 | return -1; | 316 | return -1; |
| 296 | msg[0] = AUX_NATIVE_WRITE << 4; | 317 | msg[0] = AUX_NATIVE_WRITE << 4; |
| 297 | msg[1] = address >> 8; | 318 | msg[1] = address >> 8; |
| 298 | msg[2] = address; | 319 | msg[2] = address & 0xff; |
| 299 | msg[3] = send_bytes - 1; | 320 | msg[3] = send_bytes - 1; |
| 300 | memcpy(&msg[4], send, send_bytes); | 321 | memcpy(&msg[4], send, send_bytes); |
| 301 | msg_bytes = send_bytes + 4; | 322 | msg_bytes = send_bytes + 4; |
| @@ -387,8 +408,8 @@ intel_dp_i2c_init(struct intel_output *intel_output, const char *name) | |||
| 387 | memset(&dp_priv->adapter, '\0', sizeof (dp_priv->adapter)); | 408 | memset(&dp_priv->adapter, '\0', sizeof (dp_priv->adapter)); |
| 388 | dp_priv->adapter.owner = THIS_MODULE; | 409 | dp_priv->adapter.owner = THIS_MODULE; |
| 389 | dp_priv->adapter.class = I2C_CLASS_DDC; | 410 | dp_priv->adapter.class = I2C_CLASS_DDC; |
| 390 | strncpy (dp_priv->adapter.name, name, sizeof dp_priv->adapter.name - 1); | 411 | strncpy (dp_priv->adapter.name, name, sizeof(dp_priv->adapter.name) - 1); |
| 391 | dp_priv->adapter.name[sizeof dp_priv->adapter.name - 1] = '\0'; | 412 | dp_priv->adapter.name[sizeof(dp_priv->adapter.name) - 1] = '\0'; |
| 392 | dp_priv->adapter.algo_data = &dp_priv->algo; | 413 | dp_priv->adapter.algo_data = &dp_priv->algo; |
| 393 | dp_priv->adapter.dev.parent = &intel_output->base.kdev; | 414 | dp_priv->adapter.dev.parent = &intel_output->base.kdev; |
| 394 | 415 | ||
| @@ -493,22 +514,40 @@ intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode, | |||
| 493 | intel_dp_compute_m_n(3, lane_count, | 514 | intel_dp_compute_m_n(3, lane_count, |
| 494 | mode->clock, adjusted_mode->clock, &m_n); | 515 | mode->clock, adjusted_mode->clock, &m_n); |
| 495 | 516 | ||
| 496 | if (intel_crtc->pipe == 0) { | 517 | if (IS_IGDNG(dev)) { |
| 497 | I915_WRITE(PIPEA_GMCH_DATA_M, | 518 | if (intel_crtc->pipe == 0) { |
| 498 | ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | | 519 | I915_WRITE(TRANSA_DATA_M1, |
| 499 | m_n.gmch_m); | 520 | ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | |
| 500 | I915_WRITE(PIPEA_GMCH_DATA_N, | 521 | m_n.gmch_m); |
| 501 | m_n.gmch_n); | 522 | I915_WRITE(TRANSA_DATA_N1, m_n.gmch_n); |
| 502 | I915_WRITE(PIPEA_DP_LINK_M, m_n.link_m); | 523 | I915_WRITE(TRANSA_DP_LINK_M1, m_n.link_m); |
| 503 | I915_WRITE(PIPEA_DP_LINK_N, m_n.link_n); | 524 | I915_WRITE(TRANSA_DP_LINK_N1, m_n.link_n); |
| 525 | } else { | ||
| 526 | I915_WRITE(TRANSB_DATA_M1, | ||
| 527 | ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | | ||
| 528 | m_n.gmch_m); | ||
| 529 | I915_WRITE(TRANSB_DATA_N1, m_n.gmch_n); | ||
| 530 | I915_WRITE(TRANSB_DP_LINK_M1, m_n.link_m); | ||
| 531 | I915_WRITE(TRANSB_DP_LINK_N1, m_n.link_n); | ||
| 532 | } | ||
| 504 | } else { | 533 | } else { |
| 505 | I915_WRITE(PIPEB_GMCH_DATA_M, | 534 | if (intel_crtc->pipe == 0) { |
| 506 | ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | | 535 | I915_WRITE(PIPEA_GMCH_DATA_M, |
| 507 | m_n.gmch_m); | 536 | ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | |
| 508 | I915_WRITE(PIPEB_GMCH_DATA_N, | 537 | m_n.gmch_m); |
| 509 | m_n.gmch_n); | 538 | I915_WRITE(PIPEA_GMCH_DATA_N, |
| 510 | I915_WRITE(PIPEB_DP_LINK_M, m_n.link_m); | 539 | m_n.gmch_n); |
| 511 | I915_WRITE(PIPEB_DP_LINK_N, m_n.link_n); | 540 | I915_WRITE(PIPEA_DP_LINK_M, m_n.link_m); |
| 541 | I915_WRITE(PIPEA_DP_LINK_N, m_n.link_n); | ||
| 542 | } else { | ||
| 543 | I915_WRITE(PIPEB_GMCH_DATA_M, | ||
| 544 | ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | | ||
| 545 | m_n.gmch_m); | ||
| 546 | I915_WRITE(PIPEB_GMCH_DATA_N, | ||
| 547 | m_n.gmch_n); | ||
| 548 | I915_WRITE(PIPEB_DP_LINK_M, m_n.link_m); | ||
| 549 | I915_WRITE(PIPEB_DP_LINK_N, m_n.link_n); | ||
| 550 | } | ||
| 512 | } | 551 | } |
| 513 | } | 552 | } |
| 514 | 553 | ||
| @@ -556,8 +595,38 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, | |||
| 556 | 595 | ||
| 557 | if (intel_crtc->pipe == 1) | 596 | if (intel_crtc->pipe == 1) |
| 558 | dp_priv->DP |= DP_PIPEB_SELECT; | 597 | dp_priv->DP |= DP_PIPEB_SELECT; |
| 598 | |||
| 599 | if (IS_eDP(intel_output)) { | ||
| 600 | /* don't miss out required setting for eDP */ | ||
| 601 | dp_priv->DP |= DP_PLL_ENABLE; | ||
| 602 | if (adjusted_mode->clock < 200000) | ||
| 603 | dp_priv->DP |= DP_PLL_FREQ_160MHZ; | ||
| 604 | else | ||
| 605 | dp_priv->DP |= DP_PLL_FREQ_270MHZ; | ||
| 606 | } | ||
| 559 | } | 607 | } |
| 560 | 608 | ||
| 609 | static void igdng_edp_backlight_on (struct drm_device *dev) | ||
| 610 | { | ||
| 611 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 612 | u32 pp; | ||
| 613 | |||
| 614 | DRM_DEBUG("\n"); | ||
| 615 | pp = I915_READ(PCH_PP_CONTROL); | ||
| 616 | pp |= EDP_BLC_ENABLE; | ||
| 617 | I915_WRITE(PCH_PP_CONTROL, pp); | ||
| 618 | } | ||
| 619 | |||
| 620 | static void igdng_edp_backlight_off (struct drm_device *dev) | ||
| 621 | { | ||
| 622 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 623 | u32 pp; | ||
| 624 | |||
| 625 | DRM_DEBUG("\n"); | ||
| 626 | pp = I915_READ(PCH_PP_CONTROL); | ||
| 627 | pp &= ~EDP_BLC_ENABLE; | ||
| 628 | I915_WRITE(PCH_PP_CONTROL, pp); | ||
| 629 | } | ||
| 561 | 630 | ||
| 562 | static void | 631 | static void |
| 563 | intel_dp_dpms(struct drm_encoder *encoder, int mode) | 632 | intel_dp_dpms(struct drm_encoder *encoder, int mode) |
| @@ -569,11 +638,17 @@ intel_dp_dpms(struct drm_encoder *encoder, int mode) | |||
| 569 | uint32_t dp_reg = I915_READ(dp_priv->output_reg); | 638 | uint32_t dp_reg = I915_READ(dp_priv->output_reg); |
| 570 | 639 | ||
| 571 | if (mode != DRM_MODE_DPMS_ON) { | 640 | if (mode != DRM_MODE_DPMS_ON) { |
| 572 | if (dp_reg & DP_PORT_EN) | 641 | if (dp_reg & DP_PORT_EN) { |
| 573 | intel_dp_link_down(intel_output, dp_priv->DP); | 642 | intel_dp_link_down(intel_output, dp_priv->DP); |
| 643 | if (IS_eDP(intel_output)) | ||
| 644 | igdng_edp_backlight_off(dev); | ||
| 645 | } | ||
| 574 | } else { | 646 | } else { |
| 575 | if (!(dp_reg & DP_PORT_EN)) | 647 | if (!(dp_reg & DP_PORT_EN)) { |
| 576 | intel_dp_link_train(intel_output, dp_priv->DP, dp_priv->link_configuration); | 648 | intel_dp_link_train(intel_output, dp_priv->DP, dp_priv->link_configuration); |
| 649 | if (IS_eDP(intel_output)) | ||
| 650 | igdng_edp_backlight_on(dev); | ||
| 651 | } | ||
| 577 | } | 652 | } |
| 578 | dp_priv->dpms_mode = mode; | 653 | dp_priv->dpms_mode = mode; |
| 579 | } | 654 | } |
| @@ -935,6 +1010,23 @@ intel_dp_link_down(struct intel_output *intel_output, uint32_t DP) | |||
| 935 | struct drm_i915_private *dev_priv = dev->dev_private; | 1010 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 936 | struct intel_dp_priv *dp_priv = intel_output->dev_priv; | 1011 | struct intel_dp_priv *dp_priv = intel_output->dev_priv; |
| 937 | 1012 | ||
| 1013 | DRM_DEBUG("\n"); | ||
| 1014 | |||
| 1015 | if (IS_eDP(intel_output)) { | ||
| 1016 | DP &= ~DP_PLL_ENABLE; | ||
| 1017 | I915_WRITE(dp_priv->output_reg, DP); | ||
| 1018 | POSTING_READ(dp_priv->output_reg); | ||
| 1019 | udelay(100); | ||
| 1020 | } | ||
| 1021 | |||
| 1022 | DP &= ~DP_LINK_TRAIN_MASK; | ||
| 1023 | I915_WRITE(dp_priv->output_reg, DP | DP_LINK_TRAIN_PAT_IDLE); | ||
| 1024 | POSTING_READ(dp_priv->output_reg); | ||
| 1025 | |||
| 1026 | udelay(17000); | ||
| 1027 | |||
| 1028 | if (IS_eDP(intel_output)) | ||
| 1029 | DP |= DP_LINK_TRAIN_OFF; | ||
| 938 | I915_WRITE(dp_priv->output_reg, DP & ~DP_PORT_EN); | 1030 | I915_WRITE(dp_priv->output_reg, DP & ~DP_PORT_EN); |
| 939 | POSTING_READ(dp_priv->output_reg); | 1031 | POSTING_READ(dp_priv->output_reg); |
| 940 | } | 1032 | } |
| @@ -978,6 +1070,24 @@ intel_dp_check_link_status(struct intel_output *intel_output) | |||
| 978 | intel_dp_link_train(intel_output, dp_priv->DP, dp_priv->link_configuration); | 1070 | intel_dp_link_train(intel_output, dp_priv->DP, dp_priv->link_configuration); |
| 979 | } | 1071 | } |
| 980 | 1072 | ||
| 1073 | static enum drm_connector_status | ||
| 1074 | igdng_dp_detect(struct drm_connector *connector) | ||
| 1075 | { | ||
| 1076 | struct intel_output *intel_output = to_intel_output(connector); | ||
| 1077 | struct intel_dp_priv *dp_priv = intel_output->dev_priv; | ||
| 1078 | enum drm_connector_status status; | ||
| 1079 | |||
| 1080 | status = connector_status_disconnected; | ||
| 1081 | if (intel_dp_aux_native_read(intel_output, | ||
| 1082 | 0x000, dp_priv->dpcd, | ||
| 1083 | sizeof (dp_priv->dpcd)) == sizeof (dp_priv->dpcd)) | ||
| 1084 | { | ||
| 1085 | if (dp_priv->dpcd[0] != 0) | ||
| 1086 | status = connector_status_connected; | ||
| 1087 | } | ||
| 1088 | return status; | ||
| 1089 | } | ||
| 1090 | |||
| 981 | /** | 1091 | /** |
| 982 | * Uses CRT_HOTPLUG_EN and CRT_HOTPLUG_STAT to detect DP connection. | 1092 | * Uses CRT_HOTPLUG_EN and CRT_HOTPLUG_STAT to detect DP connection. |
| 983 | * | 1093 | * |
| @@ -996,6 +1106,9 @@ intel_dp_detect(struct drm_connector *connector) | |||
| 996 | 1106 | ||
| 997 | dp_priv->has_audio = false; | 1107 | dp_priv->has_audio = false; |
| 998 | 1108 | ||
| 1109 | if (IS_IGDNG(dev)) | ||
| 1110 | return igdng_dp_detect(connector); | ||
| 1111 | |||
| 999 | temp = I915_READ(PORT_HOTPLUG_EN); | 1112 | temp = I915_READ(PORT_HOTPLUG_EN); |
| 1000 | 1113 | ||
| 1001 | I915_WRITE(PORT_HOTPLUG_EN, | 1114 | I915_WRITE(PORT_HOTPLUG_EN, |
| @@ -1039,11 +1152,27 @@ intel_dp_detect(struct drm_connector *connector) | |||
| 1039 | static int intel_dp_get_modes(struct drm_connector *connector) | 1152 | static int intel_dp_get_modes(struct drm_connector *connector) |
| 1040 | { | 1153 | { |
| 1041 | struct intel_output *intel_output = to_intel_output(connector); | 1154 | struct intel_output *intel_output = to_intel_output(connector); |
| 1155 | struct drm_device *dev = intel_output->base.dev; | ||
| 1156 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 1157 | int ret; | ||
| 1042 | 1158 | ||
| 1043 | /* We should parse the EDID data and find out if it has an audio sink | 1159 | /* We should parse the EDID data and find out if it has an audio sink |
| 1044 | */ | 1160 | */ |
| 1045 | 1161 | ||
| 1046 | return intel_ddc_get_modes(intel_output); | 1162 | ret = intel_ddc_get_modes(intel_output); |
| 1163 | if (ret) | ||
| 1164 | return ret; | ||
| 1165 | |||
| 1166 | /* if eDP has no EDID, try to use fixed panel mode from VBT */ | ||
| 1167 | if (IS_eDP(intel_output)) { | ||
| 1168 | if (dev_priv->panel_fixed_mode != NULL) { | ||
| 1169 | struct drm_display_mode *mode; | ||
| 1170 | mode = drm_mode_duplicate(dev, dev_priv->panel_fixed_mode); | ||
| 1171 | drm_mode_probed_add(connector, mode); | ||
| 1172 | return 1; | ||
| 1173 | } | ||
| 1174 | } | ||
| 1175 | return 0; | ||
| 1047 | } | 1176 | } |
| 1048 | 1177 | ||
| 1049 | static void | 1178 | static void |
| @@ -1106,6 +1235,7 @@ intel_dp_init(struct drm_device *dev, int output_reg) | |||
| 1106 | struct drm_connector *connector; | 1235 | struct drm_connector *connector; |
| 1107 | struct intel_output *intel_output; | 1236 | struct intel_output *intel_output; |
| 1108 | struct intel_dp_priv *dp_priv; | 1237 | struct intel_dp_priv *dp_priv; |
| 1238 | const char *name = NULL; | ||
| 1109 | 1239 | ||
| 1110 | intel_output = kcalloc(sizeof(struct intel_output) + | 1240 | intel_output = kcalloc(sizeof(struct intel_output) + |
| 1111 | sizeof(struct intel_dp_priv), 1, GFP_KERNEL); | 1241 | sizeof(struct intel_dp_priv), 1, GFP_KERNEL); |
| @@ -1119,7 +1249,10 @@ intel_dp_init(struct drm_device *dev, int output_reg) | |||
| 1119 | DRM_MODE_CONNECTOR_DisplayPort); | 1249 | DRM_MODE_CONNECTOR_DisplayPort); |
| 1120 | drm_connector_helper_add(connector, &intel_dp_connector_helper_funcs); | 1250 | drm_connector_helper_add(connector, &intel_dp_connector_helper_funcs); |
| 1121 | 1251 | ||
| 1122 | intel_output->type = INTEL_OUTPUT_DISPLAYPORT; | 1252 | if (output_reg == DP_A) |
| 1253 | intel_output->type = INTEL_OUTPUT_EDP; | ||
| 1254 | else | ||
| 1255 | intel_output->type = INTEL_OUTPUT_DISPLAYPORT; | ||
| 1123 | 1256 | ||
| 1124 | connector->interlace_allowed = true; | 1257 | connector->interlace_allowed = true; |
| 1125 | connector->doublescan_allowed = 0; | 1258 | connector->doublescan_allowed = 0; |
| @@ -1139,12 +1272,41 @@ intel_dp_init(struct drm_device *dev, int output_reg) | |||
| 1139 | drm_sysfs_connector_add(connector); | 1272 | drm_sysfs_connector_add(connector); |
| 1140 | 1273 | ||
| 1141 | /* Set up the DDC bus. */ | 1274 | /* Set up the DDC bus. */ |
| 1142 | intel_dp_i2c_init(intel_output, | 1275 | switch (output_reg) { |
| 1143 | (output_reg == DP_B) ? "DPDDC-B" : | 1276 | case DP_A: |
| 1144 | (output_reg == DP_C) ? "DPDDC-C" : "DPDDC-D"); | 1277 | name = "DPDDC-A"; |
| 1278 | break; | ||
| 1279 | case DP_B: | ||
| 1280 | case PCH_DP_B: | ||
| 1281 | name = "DPDDC-B"; | ||
| 1282 | break; | ||
| 1283 | case DP_C: | ||
| 1284 | case PCH_DP_C: | ||
| 1285 | name = "DPDDC-C"; | ||
| 1286 | break; | ||
| 1287 | case DP_D: | ||
| 1288 | case PCH_DP_D: | ||
| 1289 | name = "DPDDC-D"; | ||
| 1290 | break; | ||
| 1291 | } | ||
| 1292 | |||
| 1293 | intel_dp_i2c_init(intel_output, name); | ||
| 1294 | |||
| 1145 | intel_output->ddc_bus = &dp_priv->adapter; | 1295 | intel_output->ddc_bus = &dp_priv->adapter; |
| 1146 | intel_output->hot_plug = intel_dp_hot_plug; | 1296 | intel_output->hot_plug = intel_dp_hot_plug; |
| 1147 | 1297 | ||
| 1298 | if (output_reg == DP_A) { | ||
| 1299 | /* initialize panel mode from VBT if available for eDP */ | ||
| 1300 | if (dev_priv->lfp_lvds_vbt_mode) { | ||
| 1301 | dev_priv->panel_fixed_mode = | ||
| 1302 | drm_mode_duplicate(dev, dev_priv->lfp_lvds_vbt_mode); | ||
| 1303 | if (dev_priv->panel_fixed_mode) { | ||
| 1304 | dev_priv->panel_fixed_mode->type |= | ||
| 1305 | DRM_MODE_TYPE_PREFERRED; | ||
| 1306 | } | ||
| 1307 | } | ||
| 1308 | } | ||
| 1309 | |||
| 1148 | /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written | 1310 | /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written |
| 1149 | * 0xd. Failure to do so will result in spurious interrupts being | 1311 | * 0xd. Failure to do so will result in spurious interrupts being |
| 1150 | * generated on the port when a cable is not attached. | 1312 | * generated on the port when a cable is not attached. |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 004541c935a8..d6f92ea1b553 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
| @@ -55,6 +55,7 @@ | |||
| 55 | #define INTEL_OUTPUT_TVOUT 5 | 55 | #define INTEL_OUTPUT_TVOUT 5 |
| 56 | #define INTEL_OUTPUT_HDMI 6 | 56 | #define INTEL_OUTPUT_HDMI 6 |
| 57 | #define INTEL_OUTPUT_DISPLAYPORT 7 | 57 | #define INTEL_OUTPUT_DISPLAYPORT 7 |
| 58 | #define INTEL_OUTPUT_EDP 8 | ||
| 58 | 59 | ||
| 59 | #define INTEL_DVO_CHIP_NONE 0 | 60 | #define INTEL_DVO_CHIP_NONE 0 |
| 60 | #define INTEL_DVO_CHIP_LVDS 1 | 61 | #define INTEL_DVO_CHIP_LVDS 1 |
| @@ -121,6 +122,8 @@ extern void intel_dp_init(struct drm_device *dev, int dp_reg); | |||
| 121 | void | 122 | void |
| 122 | intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode, | 123 | intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode, |
| 123 | struct drm_display_mode *adjusted_mode); | 124 | struct drm_display_mode *adjusted_mode); |
| 125 | extern void intel_edp_link_config (struct intel_output *, int *, int *); | ||
| 126 | |||
| 124 | 127 | ||
| 125 | extern void intel_crtc_load_lut(struct drm_crtc *crtc); | 128 | extern void intel_crtc_load_lut(struct drm_crtc *crtc); |
| 126 | extern void intel_encoder_prepare (struct drm_encoder *encoder); | 129 | extern void intel_encoder_prepare (struct drm_encoder *encoder); |
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index 9e30daae37dc..1842290cded3 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
| @@ -130,16 +130,17 @@ static bool intel_hdmi_mode_fixup(struct drm_encoder *encoder, | |||
| 130 | } | 130 | } |
| 131 | 131 | ||
| 132 | static enum drm_connector_status | 132 | static enum drm_connector_status |
| 133 | intel_hdmi_edid_detect(struct drm_connector *connector) | 133 | intel_hdmi_detect(struct drm_connector *connector) |
| 134 | { | 134 | { |
| 135 | struct intel_output *intel_output = to_intel_output(connector); | 135 | struct intel_output *intel_output = to_intel_output(connector); |
| 136 | struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv; | 136 | struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv; |
| 137 | struct edid *edid = NULL; | 137 | struct edid *edid = NULL; |
| 138 | enum drm_connector_status status = connector_status_disconnected; | 138 | enum drm_connector_status status = connector_status_disconnected; |
| 139 | 139 | ||
| 140 | hdmi_priv->has_hdmi_sink = false; | ||
| 140 | edid = drm_get_edid(&intel_output->base, | 141 | edid = drm_get_edid(&intel_output->base, |
| 141 | intel_output->ddc_bus); | 142 | intel_output->ddc_bus); |
| 142 | hdmi_priv->has_hdmi_sink = false; | 143 | |
| 143 | if (edid) { | 144 | if (edid) { |
| 144 | if (edid->input & DRM_EDID_INPUT_DIGITAL) { | 145 | if (edid->input & DRM_EDID_INPUT_DIGITAL) { |
| 145 | status = connector_status_connected; | 146 | status = connector_status_connected; |
| @@ -148,65 +149,8 @@ intel_hdmi_edid_detect(struct drm_connector *connector) | |||
| 148 | intel_output->base.display_info.raw_edid = NULL; | 149 | intel_output->base.display_info.raw_edid = NULL; |
| 149 | kfree(edid); | 150 | kfree(edid); |
| 150 | } | 151 | } |
| 151 | return status; | ||
| 152 | } | ||
| 153 | |||
| 154 | static enum drm_connector_status | ||
| 155 | igdng_hdmi_detect(struct drm_connector *connector) | ||
| 156 | { | ||
| 157 | struct intel_output *intel_output = to_intel_output(connector); | ||
| 158 | struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv; | ||
| 159 | |||
| 160 | /* FIXME hotplug detect */ | ||
| 161 | |||
| 162 | hdmi_priv->has_hdmi_sink = false; | ||
| 163 | return intel_hdmi_edid_detect(connector); | ||
| 164 | } | ||
| 165 | 152 | ||
| 166 | static enum drm_connector_status | 153 | return status; |
| 167 | intel_hdmi_detect(struct drm_connector *connector) | ||
| 168 | { | ||
| 169 | struct drm_device *dev = connector->dev; | ||
| 170 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 171 | struct intel_output *intel_output = to_intel_output(connector); | ||
| 172 | struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv; | ||
| 173 | u32 temp, bit; | ||
| 174 | |||
| 175 | if (IS_IGDNG(dev)) | ||
| 176 | return igdng_hdmi_detect(connector); | ||
| 177 | |||
| 178 | temp = I915_READ(PORT_HOTPLUG_EN); | ||
| 179 | |||
| 180 | switch (hdmi_priv->sdvox_reg) { | ||
| 181 | case SDVOB: | ||
| 182 | temp |= HDMIB_HOTPLUG_INT_EN; | ||
| 183 | break; | ||
| 184 | case SDVOC: | ||
| 185 | temp |= HDMIC_HOTPLUG_INT_EN; | ||
| 186 | break; | ||
| 187 | default: | ||
| 188 | return connector_status_unknown; | ||
| 189 | } | ||
| 190 | |||
| 191 | I915_WRITE(PORT_HOTPLUG_EN, temp); | ||
| 192 | |||
| 193 | POSTING_READ(PORT_HOTPLUG_EN); | ||
| 194 | |||
| 195 | switch (hdmi_priv->sdvox_reg) { | ||
| 196 | case SDVOB: | ||
| 197 | bit = HDMIB_HOTPLUG_INT_STATUS; | ||
| 198 | break; | ||
| 199 | case SDVOC: | ||
| 200 | bit = HDMIC_HOTPLUG_INT_STATUS; | ||
| 201 | break; | ||
| 202 | default: | ||
| 203 | return connector_status_unknown; | ||
| 204 | } | ||
| 205 | |||
| 206 | if ((I915_READ(PORT_HOTPLUG_STAT) & bit) != 0) | ||
| 207 | return intel_hdmi_edid_detect(connector); | ||
| 208 | else | ||
| 209 | return connector_status_disconnected; | ||
| 210 | } | 154 | } |
| 211 | 155 | ||
| 212 | static int intel_hdmi_get_modes(struct drm_connector *connector) | 156 | static int intel_hdmi_get_modes(struct drm_connector *connector) |
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index 9ab38efffecf..3f445a80c552 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
| @@ -780,6 +780,14 @@ static const struct dmi_system_id intel_no_lvds[] = { | |||
| 780 | }, | 780 | }, |
| 781 | { | 781 | { |
| 782 | .callback = intel_no_lvds_dmi_callback, | 782 | .callback = intel_no_lvds_dmi_callback, |
| 783 | .ident = "AOpen Mini PC MP915", | ||
| 784 | .matches = { | ||
| 785 | DMI_MATCH(DMI_BOARD_VENDOR, "AOpen"), | ||
| 786 | DMI_MATCH(DMI_BOARD_NAME, "i915GMx-F"), | ||
| 787 | }, | ||
| 788 | }, | ||
| 789 | { | ||
| 790 | .callback = intel_no_lvds_dmi_callback, | ||
| 783 | .ident = "Aopen i945GTt-VFA", | 791 | .ident = "Aopen i945GTt-VFA", |
| 784 | .matches = { | 792 | .matches = { |
| 785 | DMI_MATCH(DMI_PRODUCT_VERSION, "AO00001JW"), | 793 | DMI_MATCH(DMI_PRODUCT_VERSION, "AO00001JW"), |
| @@ -884,6 +892,10 @@ void intel_lvds_init(struct drm_device *dev) | |||
| 884 | if (IS_IGDNG(dev)) { | 892 | if (IS_IGDNG(dev)) { |
| 885 | if ((I915_READ(PCH_LVDS) & LVDS_DETECTED) == 0) | 893 | if ((I915_READ(PCH_LVDS) & LVDS_DETECTED) == 0) |
| 886 | return; | 894 | return; |
| 895 | if (dev_priv->edp_support) { | ||
| 896 | DRM_DEBUG("disable LVDS for eDP support\n"); | ||
| 897 | return; | ||
| 898 | } | ||
| 887 | gpio = PCH_GPIOC; | 899 | gpio = PCH_GPIOC; |
| 888 | } | 900 | } |
| 889 | 901 | ||
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 4f0c30948bc4..5371d9332554 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | #include "drm.h" | 31 | #include "drm.h" |
| 32 | #include "drm_crtc.h" | 32 | #include "drm_crtc.h" |
| 33 | #include "intel_drv.h" | 33 | #include "intel_drv.h" |
| 34 | #include "drm_edid.h" | ||
| 34 | #include "i915_drm.h" | 35 | #include "i915_drm.h" |
| 35 | #include "i915_drv.h" | 36 | #include "i915_drv.h" |
| 36 | #include "intel_sdvo_regs.h" | 37 | #include "intel_sdvo_regs.h" |
| @@ -55,6 +56,12 @@ struct intel_sdvo_priv { | |||
| 55 | /* Pixel clock limitations reported by the SDVO device, in kHz */ | 56 | /* Pixel clock limitations reported by the SDVO device, in kHz */ |
| 56 | int pixel_clock_min, pixel_clock_max; | 57 | int pixel_clock_min, pixel_clock_max; |
| 57 | 58 | ||
| 59 | /* | ||
| 60 | * For multiple function SDVO device, | ||
| 61 | * this is for current attached outputs. | ||
| 62 | */ | ||
| 63 | uint16_t attached_output; | ||
| 64 | |||
| 58 | /** | 65 | /** |
| 59 | * This is set if we're going to treat the device as TV-out. | 66 | * This is set if we're going to treat the device as TV-out. |
| 60 | * | 67 | * |
| @@ -114,6 +121,9 @@ struct intel_sdvo_priv { | |||
| 114 | u32 save_SDVOX; | 121 | u32 save_SDVOX; |
| 115 | }; | 122 | }; |
| 116 | 123 | ||
| 124 | static bool | ||
| 125 | intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags); | ||
| 126 | |||
| 117 | /** | 127 | /** |
| 118 | * Writes the SDVOB or SDVOC with the given value, but always writes both | 128 | * Writes the SDVOB or SDVOC with the given value, but always writes both |
| 119 | * SDVOB and SDVOC to work around apparent hardware issues (according to | 129 | * SDVOB and SDVOC to work around apparent hardware issues (according to |
| @@ -1435,41 +1445,96 @@ void intel_sdvo_set_hotplug(struct drm_connector *connector, int on) | |||
| 1435 | intel_sdvo_read_response(intel_output, &response, 2); | 1445 | intel_sdvo_read_response(intel_output, &response, 2); |
| 1436 | } | 1446 | } |
| 1437 | 1447 | ||
| 1438 | static void | 1448 | static bool |
| 1439 | intel_sdvo_hdmi_sink_detect(struct drm_connector *connector) | 1449 | intel_sdvo_multifunc_encoder(struct intel_output *intel_output) |
| 1450 | { | ||
| 1451 | struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; | ||
| 1452 | int caps = 0; | ||
| 1453 | |||
| 1454 | if (sdvo_priv->caps.output_flags & | ||
| 1455 | (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) | ||
| 1456 | caps++; | ||
| 1457 | if (sdvo_priv->caps.output_flags & | ||
| 1458 | (SDVO_OUTPUT_RGB0 | SDVO_OUTPUT_RGB1)) | ||
| 1459 | caps++; | ||
| 1460 | if (sdvo_priv->caps.output_flags & | ||
| 1461 | (SDVO_OUTPUT_SVID0 | SDVO_OUTPUT_SVID0)) | ||
| 1462 | caps++; | ||
| 1463 | if (sdvo_priv->caps.output_flags & | ||
| 1464 | (SDVO_OUTPUT_CVBS0 | SDVO_OUTPUT_CVBS1)) | ||
| 1465 | caps++; | ||
| 1466 | if (sdvo_priv->caps.output_flags & | ||
| 1467 | (SDVO_OUTPUT_YPRPB0 | SDVO_OUTPUT_YPRPB1)) | ||
| 1468 | caps++; | ||
| 1469 | |||
| 1470 | if (sdvo_priv->caps.output_flags & | ||
| 1471 | (SDVO_OUTPUT_SCART0 | SDVO_OUTPUT_SCART1)) | ||
| 1472 | caps++; | ||
| 1473 | |||
| 1474 | if (sdvo_priv->caps.output_flags & | ||
| 1475 | (SDVO_OUTPUT_LVDS0 | SDVO_OUTPUT_LVDS1)) | ||
| 1476 | caps++; | ||
| 1477 | |||
| 1478 | return (caps > 1); | ||
| 1479 | } | ||
| 1480 | |||
| 1481 | enum drm_connector_status | ||
| 1482 | intel_sdvo_hdmi_sink_detect(struct drm_connector *connector, u16 response) | ||
| 1440 | { | 1483 | { |
| 1441 | struct intel_output *intel_output = to_intel_output(connector); | 1484 | struct intel_output *intel_output = to_intel_output(connector); |
| 1442 | struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; | 1485 | struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; |
| 1486 | enum drm_connector_status status = connector_status_connected; | ||
| 1443 | struct edid *edid = NULL; | 1487 | struct edid *edid = NULL; |
| 1444 | 1488 | ||
| 1445 | edid = drm_get_edid(&intel_output->base, | 1489 | edid = drm_get_edid(&intel_output->base, |
| 1446 | intel_output->ddc_bus); | 1490 | intel_output->ddc_bus); |
| 1447 | if (edid != NULL) { | 1491 | if (edid != NULL) { |
| 1448 | sdvo_priv->is_hdmi = drm_detect_hdmi_monitor(edid); | 1492 | /* Don't report the output as connected if it's a DVI-I |
| 1493 | * connector with a non-digital EDID coming out. | ||
| 1494 | */ | ||
| 1495 | if (response & (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) { | ||
| 1496 | if (edid->input & DRM_EDID_INPUT_DIGITAL) | ||
| 1497 | sdvo_priv->is_hdmi = | ||
| 1498 | drm_detect_hdmi_monitor(edid); | ||
| 1499 | else | ||
| 1500 | status = connector_status_disconnected; | ||
| 1501 | } | ||
| 1502 | |||
| 1449 | kfree(edid); | 1503 | kfree(edid); |
| 1450 | intel_output->base.display_info.raw_edid = NULL; | 1504 | intel_output->base.display_info.raw_edid = NULL; |
| 1451 | } | 1505 | |
| 1506 | } else if (response & (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) | ||
| 1507 | status = connector_status_disconnected; | ||
| 1508 | |||
| 1509 | return status; | ||
| 1452 | } | 1510 | } |
| 1453 | 1511 | ||
| 1454 | static enum drm_connector_status intel_sdvo_detect(struct drm_connector *connector) | 1512 | static enum drm_connector_status intel_sdvo_detect(struct drm_connector *connector) |
| 1455 | { | 1513 | { |
| 1456 | u8 response[2]; | 1514 | uint16_t response; |
| 1457 | u8 status; | 1515 | u8 status; |
| 1458 | struct intel_output *intel_output = to_intel_output(connector); | 1516 | struct intel_output *intel_output = to_intel_output(connector); |
| 1517 | struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; | ||
| 1459 | 1518 | ||
| 1460 | intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_ATTACHED_DISPLAYS, NULL, 0); | 1519 | intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_ATTACHED_DISPLAYS, NULL, 0); |
| 1461 | status = intel_sdvo_read_response(intel_output, &response, 2); | 1520 | status = intel_sdvo_read_response(intel_output, &response, 2); |
| 1462 | 1521 | ||
| 1463 | DRM_DEBUG("SDVO response %d %d\n", response[0], response[1]); | 1522 | DRM_DEBUG("SDVO response %d %d\n", response & 0xff, response >> 8); |
| 1464 | 1523 | ||
| 1465 | if (status != SDVO_CMD_STATUS_SUCCESS) | 1524 | if (status != SDVO_CMD_STATUS_SUCCESS) |
| 1466 | return connector_status_unknown; | 1525 | return connector_status_unknown; |
| 1467 | 1526 | ||
| 1468 | if ((response[0] != 0) || (response[1] != 0)) { | 1527 | if (response == 0) |
| 1469 | intel_sdvo_hdmi_sink_detect(connector); | ||
| 1470 | return connector_status_connected; | ||
| 1471 | } else | ||
| 1472 | return connector_status_disconnected; | 1528 | return connector_status_disconnected; |
| 1529 | |||
| 1530 | if (intel_sdvo_multifunc_encoder(intel_output) && | ||
| 1531 | sdvo_priv->attached_output != response) { | ||
| 1532 | if (sdvo_priv->controlled_output != response && | ||
| 1533 | intel_sdvo_output_setup(intel_output, response) != true) | ||
| 1534 | return connector_status_unknown; | ||
| 1535 | sdvo_priv->attached_output = response; | ||
| 1536 | } | ||
| 1537 | return intel_sdvo_hdmi_sink_detect(connector, response); | ||
| 1473 | } | 1538 | } |
| 1474 | 1539 | ||
| 1475 | static void intel_sdvo_get_ddc_modes(struct drm_connector *connector) | 1540 | static void intel_sdvo_get_ddc_modes(struct drm_connector *connector) |
| @@ -1866,16 +1931,101 @@ intel_sdvo_get_slave_addr(struct drm_device *dev, int output_device) | |||
| 1866 | return 0x72; | 1931 | return 0x72; |
| 1867 | } | 1932 | } |
| 1868 | 1933 | ||
| 1934 | static bool | ||
| 1935 | intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags) | ||
| 1936 | { | ||
| 1937 | struct drm_connector *connector = &intel_output->base; | ||
| 1938 | struct drm_encoder *encoder = &intel_output->enc; | ||
| 1939 | struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; | ||
| 1940 | bool ret = true, registered = false; | ||
| 1941 | |||
| 1942 | sdvo_priv->is_tv = false; | ||
| 1943 | intel_output->needs_tv_clock = false; | ||
| 1944 | sdvo_priv->is_lvds = false; | ||
| 1945 | |||
| 1946 | if (device_is_registered(&connector->kdev)) { | ||
| 1947 | drm_sysfs_connector_remove(connector); | ||
| 1948 | registered = true; | ||
| 1949 | } | ||
| 1950 | |||
| 1951 | if (flags & | ||
| 1952 | (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) { | ||
| 1953 | if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_TMDS0) | ||
| 1954 | sdvo_priv->controlled_output = SDVO_OUTPUT_TMDS0; | ||
| 1955 | else | ||
| 1956 | sdvo_priv->controlled_output = SDVO_OUTPUT_TMDS1; | ||
| 1957 | |||
| 1958 | encoder->encoder_type = DRM_MODE_ENCODER_TMDS; | ||
| 1959 | connector->connector_type = DRM_MODE_CONNECTOR_DVID; | ||
| 1960 | |||
| 1961 | if (intel_sdvo_get_supp_encode(intel_output, | ||
| 1962 | &sdvo_priv->encode) && | ||
| 1963 | intel_sdvo_get_digital_encoding_mode(intel_output) && | ||
| 1964 | sdvo_priv->is_hdmi) { | ||
| 1965 | /* enable hdmi encoding mode if supported */ | ||
| 1966 | intel_sdvo_set_encode(intel_output, SDVO_ENCODE_HDMI); | ||
| 1967 | intel_sdvo_set_colorimetry(intel_output, | ||
| 1968 | SDVO_COLORIMETRY_RGB256); | ||
| 1969 | connector->connector_type = DRM_MODE_CONNECTOR_HDMIA; | ||
| 1970 | } | ||
| 1971 | } else if (flags & SDVO_OUTPUT_SVID0) { | ||
| 1972 | |||
| 1973 | sdvo_priv->controlled_output = SDVO_OUTPUT_SVID0; | ||
| 1974 | encoder->encoder_type = DRM_MODE_ENCODER_TVDAC; | ||
| 1975 | connector->connector_type = DRM_MODE_CONNECTOR_SVIDEO; | ||
| 1976 | sdvo_priv->is_tv = true; | ||
| 1977 | intel_output->needs_tv_clock = true; | ||
| 1978 | } else if (flags & SDVO_OUTPUT_RGB0) { | ||
| 1979 | |||
| 1980 | sdvo_priv->controlled_output = SDVO_OUTPUT_RGB0; | ||
| 1981 | encoder->encoder_type = DRM_MODE_ENCODER_DAC; | ||
| 1982 | connector->connector_type = DRM_MODE_CONNECTOR_VGA; | ||
| 1983 | } else if (flags & SDVO_OUTPUT_RGB1) { | ||
| 1984 | |||
| 1985 | sdvo_priv->controlled_output = SDVO_OUTPUT_RGB1; | ||
| 1986 | encoder->encoder_type = DRM_MODE_ENCODER_DAC; | ||
| 1987 | connector->connector_type = DRM_MODE_CONNECTOR_VGA; | ||
| 1988 | } else if (flags & SDVO_OUTPUT_LVDS0) { | ||
| 1989 | |||
| 1990 | sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS0; | ||
| 1991 | encoder->encoder_type = DRM_MODE_ENCODER_LVDS; | ||
| 1992 | connector->connector_type = DRM_MODE_CONNECTOR_LVDS; | ||
| 1993 | sdvo_priv->is_lvds = true; | ||
| 1994 | } else if (flags & SDVO_OUTPUT_LVDS1) { | ||
| 1995 | |||
| 1996 | sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS1; | ||
| 1997 | encoder->encoder_type = DRM_MODE_ENCODER_LVDS; | ||
| 1998 | connector->connector_type = DRM_MODE_CONNECTOR_LVDS; | ||
| 1999 | sdvo_priv->is_lvds = true; | ||
| 2000 | } else { | ||
| 2001 | |||
| 2002 | unsigned char bytes[2]; | ||
| 2003 | |||
| 2004 | sdvo_priv->controlled_output = 0; | ||
| 2005 | memcpy(bytes, &sdvo_priv->caps.output_flags, 2); | ||
| 2006 | DRM_DEBUG_KMS(I915_SDVO, | ||
| 2007 | "%s: Unknown SDVO output type (0x%02x%02x)\n", | ||
| 2008 | SDVO_NAME(sdvo_priv), | ||
| 2009 | bytes[0], bytes[1]); | ||
| 2010 | ret = false; | ||
| 2011 | } | ||
| 2012 | |||
| 2013 | if (ret && registered) | ||
| 2014 | ret = drm_sysfs_connector_add(connector) == 0 ? true : false; | ||
| 2015 | |||
| 2016 | |||
| 2017 | return ret; | ||
| 2018 | |||
| 2019 | } | ||
| 2020 | |||
| 1869 | bool intel_sdvo_init(struct drm_device *dev, int output_device) | 2021 | bool intel_sdvo_init(struct drm_device *dev, int output_device) |
| 1870 | { | 2022 | { |
| 1871 | struct drm_connector *connector; | 2023 | struct drm_connector *connector; |
| 1872 | struct intel_output *intel_output; | 2024 | struct intel_output *intel_output; |
| 1873 | struct intel_sdvo_priv *sdvo_priv; | 2025 | struct intel_sdvo_priv *sdvo_priv; |
| 1874 | 2026 | ||
| 1875 | int connector_type; | ||
| 1876 | u8 ch[0x40]; | 2027 | u8 ch[0x40]; |
| 1877 | int i; | 2028 | int i; |
| 1878 | int encoder_type; | ||
| 1879 | 2029 | ||
| 1880 | intel_output = kcalloc(sizeof(struct intel_output)+sizeof(struct intel_sdvo_priv), 1, GFP_KERNEL); | 2030 | intel_output = kcalloc(sizeof(struct intel_output)+sizeof(struct intel_sdvo_priv), 1, GFP_KERNEL); |
| 1881 | if (!intel_output) { | 2031 | if (!intel_output) { |
| @@ -1925,88 +2075,28 @@ bool intel_sdvo_init(struct drm_device *dev, int output_device) | |||
| 1925 | intel_output->ddc_bus->algo = &intel_sdvo_i2c_bit_algo; | 2075 | intel_output->ddc_bus->algo = &intel_sdvo_i2c_bit_algo; |
| 1926 | 2076 | ||
| 1927 | /* In defaut case sdvo lvds is false */ | 2077 | /* In defaut case sdvo lvds is false */ |
| 1928 | sdvo_priv->is_lvds = false; | ||
| 1929 | intel_sdvo_get_capabilities(intel_output, &sdvo_priv->caps); | 2078 | intel_sdvo_get_capabilities(intel_output, &sdvo_priv->caps); |
| 1930 | 2079 | ||
| 1931 | if (sdvo_priv->caps.output_flags & | 2080 | if (intel_sdvo_output_setup(intel_output, |
| 1932 | (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) { | 2081 | sdvo_priv->caps.output_flags) != true) { |
| 1933 | if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_TMDS0) | 2082 | DRM_DEBUG("SDVO output failed to setup on SDVO%c\n", |
| 1934 | sdvo_priv->controlled_output = SDVO_OUTPUT_TMDS0; | 2083 | output_device == SDVOB ? 'B' : 'C'); |
| 1935 | else | ||
| 1936 | sdvo_priv->controlled_output = SDVO_OUTPUT_TMDS1; | ||
| 1937 | |||
| 1938 | encoder_type = DRM_MODE_ENCODER_TMDS; | ||
| 1939 | connector_type = DRM_MODE_CONNECTOR_DVID; | ||
| 1940 | |||
| 1941 | if (intel_sdvo_get_supp_encode(intel_output, | ||
| 1942 | &sdvo_priv->encode) && | ||
| 1943 | intel_sdvo_get_digital_encoding_mode(intel_output) && | ||
| 1944 | sdvo_priv->is_hdmi) { | ||
| 1945 | /* enable hdmi encoding mode if supported */ | ||
| 1946 | intel_sdvo_set_encode(intel_output, SDVO_ENCODE_HDMI); | ||
| 1947 | intel_sdvo_set_colorimetry(intel_output, | ||
| 1948 | SDVO_COLORIMETRY_RGB256); | ||
| 1949 | connector_type = DRM_MODE_CONNECTOR_HDMIA; | ||
| 1950 | } | ||
| 1951 | } | ||
| 1952 | else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_SVID0) | ||
| 1953 | { | ||
| 1954 | sdvo_priv->controlled_output = SDVO_OUTPUT_SVID0; | ||
| 1955 | encoder_type = DRM_MODE_ENCODER_TVDAC; | ||
| 1956 | connector_type = DRM_MODE_CONNECTOR_SVIDEO; | ||
| 1957 | sdvo_priv->is_tv = true; | ||
| 1958 | intel_output->needs_tv_clock = true; | ||
| 1959 | } | ||
| 1960 | else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_RGB0) | ||
| 1961 | { | ||
| 1962 | sdvo_priv->controlled_output = SDVO_OUTPUT_RGB0; | ||
| 1963 | encoder_type = DRM_MODE_ENCODER_DAC; | ||
| 1964 | connector_type = DRM_MODE_CONNECTOR_VGA; | ||
| 1965 | } | ||
| 1966 | else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_RGB1) | ||
| 1967 | { | ||
| 1968 | sdvo_priv->controlled_output = SDVO_OUTPUT_RGB1; | ||
| 1969 | encoder_type = DRM_MODE_ENCODER_DAC; | ||
| 1970 | connector_type = DRM_MODE_CONNECTOR_VGA; | ||
| 1971 | } | ||
| 1972 | else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_LVDS0) | ||
| 1973 | { | ||
| 1974 | sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS0; | ||
| 1975 | encoder_type = DRM_MODE_ENCODER_LVDS; | ||
| 1976 | connector_type = DRM_MODE_CONNECTOR_LVDS; | ||
| 1977 | sdvo_priv->is_lvds = true; | ||
| 1978 | } | ||
| 1979 | else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_LVDS1) | ||
| 1980 | { | ||
| 1981 | sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS1; | ||
| 1982 | encoder_type = DRM_MODE_ENCODER_LVDS; | ||
| 1983 | connector_type = DRM_MODE_CONNECTOR_LVDS; | ||
| 1984 | sdvo_priv->is_lvds = true; | ||
| 1985 | } | ||
| 1986 | else | ||
| 1987 | { | ||
| 1988 | unsigned char bytes[2]; | ||
| 1989 | |||
| 1990 | sdvo_priv->controlled_output = 0; | ||
| 1991 | memcpy (bytes, &sdvo_priv->caps.output_flags, 2); | ||
| 1992 | DRM_DEBUG_KMS(I915_SDVO, | ||
| 1993 | "%s: Unknown SDVO output type (0x%02x%02x)\n", | ||
| 1994 | SDVO_NAME(sdvo_priv), | ||
| 1995 | bytes[0], bytes[1]); | ||
| 1996 | encoder_type = DRM_MODE_ENCODER_NONE; | ||
| 1997 | connector_type = DRM_MODE_CONNECTOR_Unknown; | ||
| 1998 | goto err_i2c; | 2084 | goto err_i2c; |
| 1999 | } | 2085 | } |
| 2000 | 2086 | ||
| 2087 | |||
| 2001 | connector = &intel_output->base; | 2088 | connector = &intel_output->base; |
| 2002 | drm_connector_init(dev, connector, &intel_sdvo_connector_funcs, | 2089 | drm_connector_init(dev, connector, &intel_sdvo_connector_funcs, |
| 2003 | connector_type); | 2090 | connector->connector_type); |
| 2091 | |||
| 2004 | drm_connector_helper_add(connector, &intel_sdvo_connector_helper_funcs); | 2092 | drm_connector_helper_add(connector, &intel_sdvo_connector_helper_funcs); |
| 2005 | connector->interlace_allowed = 0; | 2093 | connector->interlace_allowed = 0; |
| 2006 | connector->doublescan_allowed = 0; | 2094 | connector->doublescan_allowed = 0; |
| 2007 | connector->display_info.subpixel_order = SubPixelHorizontalRGB; | 2095 | connector->display_info.subpixel_order = SubPixelHorizontalRGB; |
| 2008 | 2096 | ||
| 2009 | drm_encoder_init(dev, &intel_output->enc, &intel_sdvo_enc_funcs, encoder_type); | 2097 | drm_encoder_init(dev, &intel_output->enc, |
| 2098 | &intel_sdvo_enc_funcs, intel_output->enc.encoder_type); | ||
| 2099 | |||
| 2010 | drm_encoder_helper_add(&intel_output->enc, &intel_sdvo_helper_funcs); | 2100 | drm_encoder_helper_add(&intel_output->enc, &intel_sdvo_helper_funcs); |
| 2011 | 2101 | ||
| 2012 | drm_mode_connector_attach_encoder(&intel_output->base, &intel_output->enc); | 2102 | drm_mode_connector_attach_encoder(&intel_output->base, &intel_output->enc); |
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c index a43c98e3f077..da4ab4dc1630 100644 --- a/drivers/gpu/drm/i915/intel_tv.c +++ b/drivers/gpu/drm/i915/intel_tv.c | |||
| @@ -1490,6 +1490,27 @@ static struct input_res { | |||
| 1490 | {"1920x1080", 1920, 1080}, | 1490 | {"1920x1080", 1920, 1080}, |
| 1491 | }; | 1491 | }; |
| 1492 | 1492 | ||
| 1493 | /* | ||
| 1494 | * Chose preferred mode according to line number of TV format | ||
| 1495 | */ | ||
| 1496 | static void | ||
| 1497 | intel_tv_chose_preferred_modes(struct drm_connector *connector, | ||
| 1498 | struct drm_display_mode *mode_ptr) | ||
| 1499 | { | ||
| 1500 | struct intel_output *intel_output = to_intel_output(connector); | ||
| 1501 | const struct tv_mode *tv_mode = intel_tv_mode_find(intel_output); | ||
| 1502 | |||
| 1503 | if (tv_mode->nbr_end < 480 && mode_ptr->vdisplay == 480) | ||
| 1504 | mode_ptr->type |= DRM_MODE_TYPE_PREFERRED; | ||
| 1505 | else if (tv_mode->nbr_end > 480) { | ||
| 1506 | if (tv_mode->progressive == true && tv_mode->nbr_end < 720) { | ||
| 1507 | if (mode_ptr->vdisplay == 720) | ||
| 1508 | mode_ptr->type |= DRM_MODE_TYPE_PREFERRED; | ||
| 1509 | } else if (mode_ptr->vdisplay == 1080) | ||
| 1510 | mode_ptr->type |= DRM_MODE_TYPE_PREFERRED; | ||
| 1511 | } | ||
| 1512 | } | ||
| 1513 | |||
| 1493 | /** | 1514 | /** |
| 1494 | * Stub get_modes function. | 1515 | * Stub get_modes function. |
| 1495 | * | 1516 | * |
| @@ -1544,6 +1565,7 @@ intel_tv_get_modes(struct drm_connector *connector) | |||
| 1544 | mode_ptr->clock = (int) tmp; | 1565 | mode_ptr->clock = (int) tmp; |
| 1545 | 1566 | ||
| 1546 | mode_ptr->type = DRM_MODE_TYPE_DRIVER; | 1567 | mode_ptr->type = DRM_MODE_TYPE_DRIVER; |
| 1568 | intel_tv_chose_preferred_modes(connector, mode_ptr); | ||
| 1547 | drm_mode_probed_add(connector, mode_ptr); | 1569 | drm_mode_probed_add(connector, mode_ptr); |
| 1548 | count++; | 1570 | count++; |
| 1549 | } | 1571 | } |
diff --git a/drivers/gpu/drm/radeon/r600_cp.c b/drivers/gpu/drm/radeon/r600_cp.c index 146f3570af8e..20f17908b036 100644 --- a/drivers/gpu/drm/radeon/r600_cp.c +++ b/drivers/gpu/drm/radeon/r600_cp.c | |||
| @@ -384,8 +384,9 @@ static void r600_cp_load_microcode(drm_radeon_private_t *dev_priv) | |||
| 384 | DRM_INFO("Loading RV670 PFP Microcode\n"); | 384 | DRM_INFO("Loading RV670 PFP Microcode\n"); |
| 385 | for (i = 0; i < PFP_UCODE_SIZE; i++) | 385 | for (i = 0; i < PFP_UCODE_SIZE; i++) |
| 386 | RADEON_WRITE(R600_CP_PFP_UCODE_DATA, RV670_pfp_microcode[i]); | 386 | RADEON_WRITE(R600_CP_PFP_UCODE_DATA, RV670_pfp_microcode[i]); |
| 387 | } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780)) { | 387 | } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780) || |
| 388 | DRM_INFO("Loading RS780 CP Microcode\n"); | 388 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS880)) { |
| 389 | DRM_INFO("Loading RS780/RS880 CP Microcode\n"); | ||
| 389 | for (i = 0; i < PM4_UCODE_SIZE; i++) { | 390 | for (i = 0; i < PM4_UCODE_SIZE; i++) { |
| 390 | RADEON_WRITE(R600_CP_ME_RAM_DATA, | 391 | RADEON_WRITE(R600_CP_ME_RAM_DATA, |
| 391 | RS780_cp_microcode[i][0]); | 392 | RS780_cp_microcode[i][0]); |
| @@ -396,7 +397,7 @@ static void r600_cp_load_microcode(drm_radeon_private_t *dev_priv) | |||
| 396 | } | 397 | } |
| 397 | 398 | ||
| 398 | RADEON_WRITE(R600_CP_PFP_UCODE_ADDR, 0); | 399 | RADEON_WRITE(R600_CP_PFP_UCODE_ADDR, 0); |
| 399 | DRM_INFO("Loading RS780 PFP Microcode\n"); | 400 | DRM_INFO("Loading RS780/RS880 PFP Microcode\n"); |
| 400 | for (i = 0; i < PFP_UCODE_SIZE; i++) | 401 | for (i = 0; i < PFP_UCODE_SIZE; i++) |
| 401 | RADEON_WRITE(R600_CP_PFP_UCODE_DATA, RS780_pfp_microcode[i]); | 402 | RADEON_WRITE(R600_CP_PFP_UCODE_DATA, RS780_pfp_microcode[i]); |
| 402 | } | 403 | } |
| @@ -783,6 +784,7 @@ static void r600_gfx_init(struct drm_device *dev, | |||
| 783 | break; | 784 | break; |
| 784 | case CHIP_RV610: | 785 | case CHIP_RV610: |
| 785 | case CHIP_RS780: | 786 | case CHIP_RS780: |
| 787 | case CHIP_RS880: | ||
| 786 | case CHIP_RV620: | 788 | case CHIP_RV620: |
| 787 | dev_priv->r600_max_pipes = 1; | 789 | dev_priv->r600_max_pipes = 1; |
| 788 | dev_priv->r600_max_tile_pipes = 1; | 790 | dev_priv->r600_max_tile_pipes = 1; |
| @@ -917,7 +919,8 @@ static void r600_gfx_init(struct drm_device *dev, | |||
| 917 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV630) || | 919 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV630) || |
| 918 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV610) || | 920 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV610) || |
| 919 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV620) || | 921 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV620) || |
| 920 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780)) | 922 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780) || |
| 923 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS880)) | ||
| 921 | RADEON_WRITE(R600_DB_DEBUG, R600_PREZ_MUST_WAIT_FOR_POSTZ_DONE); | 924 | RADEON_WRITE(R600_DB_DEBUG, R600_PREZ_MUST_WAIT_FOR_POSTZ_DONE); |
| 922 | else | 925 | else |
| 923 | RADEON_WRITE(R600_DB_DEBUG, 0); | 926 | RADEON_WRITE(R600_DB_DEBUG, 0); |
| @@ -935,7 +938,8 @@ static void r600_gfx_init(struct drm_device *dev, | |||
| 935 | sq_ms_fifo_sizes = RADEON_READ(R600_SQ_MS_FIFO_SIZES); | 938 | sq_ms_fifo_sizes = RADEON_READ(R600_SQ_MS_FIFO_SIZES); |
| 936 | if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV610) || | 939 | if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV610) || |
| 937 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV620) || | 940 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV620) || |
| 938 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780)) { | 941 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780) || |
| 942 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS880)) { | ||
| 939 | sq_ms_fifo_sizes = (R600_CACHE_FIFO_SIZE(0xa) | | 943 | sq_ms_fifo_sizes = (R600_CACHE_FIFO_SIZE(0xa) | |
| 940 | R600_FETCH_FIFO_HIWATER(0xa) | | 944 | R600_FETCH_FIFO_HIWATER(0xa) | |
| 941 | R600_DONE_FIFO_HIWATER(0xe0) | | 945 | R600_DONE_FIFO_HIWATER(0xe0) | |
| @@ -978,7 +982,8 @@ static void r600_gfx_init(struct drm_device *dev, | |||
| 978 | R600_NUM_ES_STACK_ENTRIES(0)); | 982 | R600_NUM_ES_STACK_ENTRIES(0)); |
| 979 | } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV610) || | 983 | } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV610) || |
| 980 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV620) || | 984 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV620) || |
| 981 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780)) { | 985 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780) || |
| 986 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS880)) { | ||
| 982 | /* no vertex cache */ | 987 | /* no vertex cache */ |
| 983 | sq_config &= ~R600_VC_ENABLE; | 988 | sq_config &= ~R600_VC_ENABLE; |
| 984 | 989 | ||
| @@ -1035,7 +1040,8 @@ static void r600_gfx_init(struct drm_device *dev, | |||
| 1035 | 1040 | ||
| 1036 | if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV610) || | 1041 | if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV610) || |
| 1037 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV620) || | 1042 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV620) || |
| 1038 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780)) | 1043 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780) || |
| 1044 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS880)) | ||
| 1039 | RADEON_WRITE(R600_VGT_CACHE_INVALIDATION, R600_CACHE_INVALIDATION(R600_TC_ONLY)); | 1045 | RADEON_WRITE(R600_VGT_CACHE_INVALIDATION, R600_CACHE_INVALIDATION(R600_TC_ONLY)); |
| 1040 | else | 1046 | else |
| 1041 | RADEON_WRITE(R600_VGT_CACHE_INVALIDATION, R600_CACHE_INVALIDATION(R600_VC_AND_TC)); | 1047 | RADEON_WRITE(R600_VGT_CACHE_INVALIDATION, R600_CACHE_INVALIDATION(R600_VC_AND_TC)); |
| @@ -1078,6 +1084,7 @@ static void r600_gfx_init(struct drm_device *dev, | |||
| 1078 | break; | 1084 | break; |
| 1079 | case CHIP_RV610: | 1085 | case CHIP_RV610: |
| 1080 | case CHIP_RS780: | 1086 | case CHIP_RS780: |
| 1087 | case CHIP_RS880: | ||
| 1081 | case CHIP_RV620: | 1088 | case CHIP_RV620: |
| 1082 | gs_prim_buffer_depth = 32; | 1089 | gs_prim_buffer_depth = 32; |
| 1083 | break; | 1090 | break; |
| @@ -1123,6 +1130,7 @@ static void r600_gfx_init(struct drm_device *dev, | |||
| 1123 | switch (dev_priv->flags & RADEON_FAMILY_MASK) { | 1130 | switch (dev_priv->flags & RADEON_FAMILY_MASK) { |
| 1124 | case CHIP_RV610: | 1131 | case CHIP_RV610: |
| 1125 | case CHIP_RS780: | 1132 | case CHIP_RS780: |
| 1133 | case CHIP_RS880: | ||
| 1126 | case CHIP_RV620: | 1134 | case CHIP_RV620: |
| 1127 | tc_cntl = R600_TC_L2_SIZE(8); | 1135 | tc_cntl = R600_TC_L2_SIZE(8); |
| 1128 | break; | 1136 | break; |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index a162ade74b7f..9ff6dcb97f9d 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -152,7 +152,9 @@ int radeon_mc_setup(struct radeon_device *rdev) | |||
| 152 | } | 152 | } |
| 153 | } else { | 153 | } else { |
| 154 | rdev->mc.vram_location = 0; | 154 | rdev->mc.vram_location = 0; |
| 155 | rdev->mc.gtt_location = rdev->mc.mc_vram_size; | 155 | tmp = rdev->mc.mc_vram_size; |
| 156 | tmp = (tmp + rdev->mc.gtt_size - 1) & ~(rdev->mc.gtt_size - 1); | ||
| 157 | rdev->mc.gtt_location = tmp; | ||
| 156 | } | 158 | } |
| 157 | DRM_INFO("radeon: VRAM %uM\n", rdev->mc.real_vram_size >> 20); | 159 | DRM_INFO("radeon: VRAM %uM\n", rdev->mc.real_vram_size >> 20); |
| 158 | DRM_INFO("radeon: VRAM from 0x%08X to 0x%08X\n", | 160 | DRM_INFO("radeon: VRAM from 0x%08X to 0x%08X\n", |
diff --git a/drivers/gpu/drm/radeon/radeon_drv.h b/drivers/gpu/drm/radeon/radeon_drv.h index 127d0456f628..3933f8216a34 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.h +++ b/drivers/gpu/drm/radeon/radeon_drv.h | |||
| @@ -143,6 +143,7 @@ enum radeon_family { | |||
| 143 | CHIP_RV635, | 143 | CHIP_RV635, |
| 144 | CHIP_RV670, | 144 | CHIP_RV670, |
| 145 | CHIP_RS780, | 145 | CHIP_RS780, |
| 146 | CHIP_RS880, | ||
| 146 | CHIP_RV770, | 147 | CHIP_RV770, |
| 147 | CHIP_RV730, | 148 | CHIP_RV730, |
| 148 | CHIP_RV710, | 149 | CHIP_RV710, |
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c index dd9ac2fed6d6..e98cae3bf4a6 100644 --- a/drivers/gpu/drm/radeon/radeon_object.c +++ b/drivers/gpu/drm/radeon/radeon_object.c | |||
| @@ -106,7 +106,7 @@ static inline uint32_t radeon_object_flags_from_domain(uint32_t domain) | |||
| 106 | flags |= TTM_PL_FLAG_VRAM | TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED; | 106 | flags |= TTM_PL_FLAG_VRAM | TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED; |
| 107 | } | 107 | } |
| 108 | if (domain & RADEON_GEM_DOMAIN_GTT) { | 108 | if (domain & RADEON_GEM_DOMAIN_GTT) { |
| 109 | flags |= TTM_PL_FLAG_TT | TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED; | 109 | flags |= TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING; |
| 110 | } | 110 | } |
| 111 | if (domain & RADEON_GEM_DOMAIN_CPU) { | 111 | if (domain & RADEON_GEM_DOMAIN_CPU) { |
| 112 | flags |= TTM_PL_FLAG_SYSTEM | TTM_PL_MASK_CACHING; | 112 | flags |= TTM_PL_FLAG_SYSTEM | TTM_PL_MASK_CACHING; |
diff --git a/drivers/input/keyboard/matrix_keypad.c b/drivers/input/keyboard/matrix_keypad.c index e9b2e7cb05be..541b981ff075 100644 --- a/drivers/input/keyboard/matrix_keypad.c +++ b/drivers/input/keyboard/matrix_keypad.c | |||
| @@ -27,6 +27,7 @@ struct matrix_keypad { | |||
| 27 | const struct matrix_keypad_platform_data *pdata; | 27 | const struct matrix_keypad_platform_data *pdata; |
| 28 | struct input_dev *input_dev; | 28 | struct input_dev *input_dev; |
| 29 | unsigned short *keycodes; | 29 | unsigned short *keycodes; |
| 30 | unsigned int row_shift; | ||
| 30 | 31 | ||
| 31 | uint32_t last_key_state[MATRIX_MAX_COLS]; | 32 | uint32_t last_key_state[MATRIX_MAX_COLS]; |
| 32 | struct delayed_work work; | 33 | struct delayed_work work; |
| @@ -136,7 +137,7 @@ static void matrix_keypad_scan(struct work_struct *work) | |||
| 136 | if ((bits_changed & (1 << row)) == 0) | 137 | if ((bits_changed & (1 << row)) == 0) |
| 137 | continue; | 138 | continue; |
| 138 | 139 | ||
| 139 | code = (row << 4) + col; | 140 | code = MATRIX_SCAN_CODE(row, col, keypad->row_shift); |
| 140 | input_event(input_dev, EV_MSC, MSC_SCAN, code); | 141 | input_event(input_dev, EV_MSC, MSC_SCAN, code); |
| 141 | input_report_key(input_dev, | 142 | input_report_key(input_dev, |
| 142 | keypad->keycodes[code], | 143 | keypad->keycodes[code], |
| @@ -317,6 +318,7 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev) | |||
| 317 | struct matrix_keypad *keypad; | 318 | struct matrix_keypad *keypad; |
| 318 | struct input_dev *input_dev; | 319 | struct input_dev *input_dev; |
| 319 | unsigned short *keycodes; | 320 | unsigned short *keycodes; |
| 321 | unsigned int row_shift; | ||
| 320 | int i; | 322 | int i; |
| 321 | int err; | 323 | int err; |
| 322 | 324 | ||
| @@ -332,14 +334,11 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev) | |||
| 332 | return -EINVAL; | 334 | return -EINVAL; |
| 333 | } | 335 | } |
| 334 | 336 | ||
| 335 | if (!keymap_data->max_keymap_size) { | 337 | row_shift = get_count_order(pdata->num_col_gpios); |
| 336 | dev_err(&pdev->dev, "invalid keymap data supplied\n"); | ||
| 337 | return -EINVAL; | ||
| 338 | } | ||
| 339 | 338 | ||
| 340 | keypad = kzalloc(sizeof(struct matrix_keypad), GFP_KERNEL); | 339 | keypad = kzalloc(sizeof(struct matrix_keypad), GFP_KERNEL); |
| 341 | keycodes = kzalloc(keymap_data->max_keymap_size * | 340 | keycodes = kzalloc((pdata->num_row_gpios << row_shift) * |
| 342 | sizeof(keypad->keycodes), | 341 | sizeof(*keycodes), |
| 343 | GFP_KERNEL); | 342 | GFP_KERNEL); |
| 344 | input_dev = input_allocate_device(); | 343 | input_dev = input_allocate_device(); |
| 345 | if (!keypad || !keycodes || !input_dev) { | 344 | if (!keypad || !keycodes || !input_dev) { |
| @@ -350,6 +349,7 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev) | |||
| 350 | keypad->input_dev = input_dev; | 349 | keypad->input_dev = input_dev; |
| 351 | keypad->pdata = pdata; | 350 | keypad->pdata = pdata; |
| 352 | keypad->keycodes = keycodes; | 351 | keypad->keycodes = keycodes; |
| 352 | keypad->row_shift = row_shift; | ||
| 353 | keypad->stopped = true; | 353 | keypad->stopped = true; |
| 354 | INIT_DELAYED_WORK(&keypad->work, matrix_keypad_scan); | 354 | INIT_DELAYED_WORK(&keypad->work, matrix_keypad_scan); |
| 355 | spin_lock_init(&keypad->lock); | 355 | spin_lock_init(&keypad->lock); |
| @@ -363,7 +363,7 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev) | |||
| 363 | 363 | ||
| 364 | input_dev->keycode = keycodes; | 364 | input_dev->keycode = keycodes; |
| 365 | input_dev->keycodesize = sizeof(*keycodes); | 365 | input_dev->keycodesize = sizeof(*keycodes); |
| 366 | input_dev->keycodemax = keymap_data->max_keymap_size; | 366 | input_dev->keycodemax = pdata->num_row_gpios << keypad->row_shift; |
| 367 | 367 | ||
| 368 | for (i = 0; i < keymap_data->keymap_size; i++) { | 368 | for (i = 0; i < keymap_data->keymap_size; i++) { |
| 369 | unsigned int key = keymap_data->keymap[i]; | 369 | unsigned int key = keymap_data->keymap[i]; |
| @@ -371,7 +371,7 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev) | |||
| 371 | unsigned int col = KEY_COL(key); | 371 | unsigned int col = KEY_COL(key); |
| 372 | unsigned short code = KEY_VAL(key); | 372 | unsigned short code = KEY_VAL(key); |
| 373 | 373 | ||
| 374 | keycodes[(row << 4) + col] = code; | 374 | keycodes[MATRIX_SCAN_CODE(row, col, row_shift)] = code; |
| 375 | __set_bit(code, input_dev->keybit); | 375 | __set_bit(code, input_dev->keybit); |
| 376 | } | 376 | } |
| 377 | __clear_bit(KEY_RESERVED, input_dev->keybit); | 377 | __clear_bit(KEY_RESERVED, input_dev->keybit); |
diff --git a/drivers/input/misc/wistron_btns.c b/drivers/input/misc/wistron_btns.c index 26e17a9a22eb..27ee976eb54c 100644 --- a/drivers/input/misc/wistron_btns.c +++ b/drivers/input/misc/wistron_btns.c | |||
| @@ -611,6 +611,20 @@ static struct key_entry keymap_wistron_generic[] __initdata = { | |||
| 611 | { KE_END, 0 } | 611 | { KE_END, 0 } |
| 612 | }; | 612 | }; |
| 613 | 613 | ||
| 614 | static struct key_entry keymap_prestigio[] __initdata = { | ||
| 615 | { KE_KEY, 0x11, {KEY_PROG1} }, | ||
| 616 | { KE_KEY, 0x12, {KEY_PROG2} }, | ||
| 617 | { KE_WIFI, 0x30 }, | ||
| 618 | { KE_KEY, 0x22, {KEY_REWIND} }, | ||
| 619 | { KE_KEY, 0x23, {KEY_FORWARD} }, | ||
| 620 | { KE_KEY, 0x24, {KEY_PLAYPAUSE} }, | ||
| 621 | { KE_KEY, 0x25, {KEY_STOPCD} }, | ||
| 622 | { KE_KEY, 0x31, {KEY_MAIL} }, | ||
| 623 | { KE_KEY, 0x36, {KEY_WWW} }, | ||
| 624 | { KE_END, 0 } | ||
| 625 | }; | ||
| 626 | |||
| 627 | |||
| 614 | /* | 628 | /* |
| 615 | * If your machine is not here (which is currently rather likely), please send | 629 | * If your machine is not here (which is currently rather likely), please send |
| 616 | * a list of buttons and their key codes (reported when loading this module | 630 | * a list of buttons and their key codes (reported when loading this module |
| @@ -971,6 +985,8 @@ static int __init select_keymap(void) | |||
| 971 | if (keymap_name != NULL) { | 985 | if (keymap_name != NULL) { |
| 972 | if (strcmp (keymap_name, "1557/MS2141") == 0) | 986 | if (strcmp (keymap_name, "1557/MS2141") == 0) |
| 973 | keymap = keymap_wistron_ms2141; | 987 | keymap = keymap_wistron_ms2141; |
| 988 | else if (strcmp (keymap_name, "prestigio") == 0) | ||
| 989 | keymap = keymap_prestigio; | ||
| 974 | else if (strcmp (keymap_name, "generic") == 0) | 990 | else if (strcmp (keymap_name, "generic") == 0) |
| 975 | keymap = keymap_wistron_generic; | 991 | keymap = keymap_wistron_generic; |
| 976 | else { | 992 | else { |
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index 924e8ed7f2cf..ae04d8a494e5 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
| @@ -78,6 +78,14 @@ static struct dmi_system_id __initdata i8042_dmi_noloop_table[] = { | |||
| 78 | }, | 78 | }, |
| 79 | }, | 79 | }, |
| 80 | { | 80 | { |
| 81 | .ident = "ASUS G1S", | ||
| 82 | .matches = { | ||
| 83 | DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc."), | ||
| 84 | DMI_MATCH(DMI_BOARD_NAME, "G1S"), | ||
| 85 | DMI_MATCH(DMI_BOARD_VERSION, "1.0"), | ||
| 86 | }, | ||
| 87 | }, | ||
| 88 | { | ||
| 81 | /* AUX LOOP command does not raise AUX IRQ */ | 89 | /* AUX LOOP command does not raise AUX IRQ */ |
| 82 | .ident = "ASUS P65UP5", | 90 | .ident = "ASUS P65UP5", |
| 83 | .matches = { | 91 | .matches = { |
diff --git a/drivers/mmc/host/sdhci-of.c b/drivers/mmc/host/sdhci-of.c index 908844327db0..1e8aa590bb39 100644 --- a/drivers/mmc/host/sdhci-of.c +++ b/drivers/mmc/host/sdhci-of.c | |||
| @@ -234,7 +234,7 @@ static int __devinit sdhci_of_probe(struct of_device *ofdev, | |||
| 234 | return -ENODEV; | 234 | return -ENODEV; |
| 235 | 235 | ||
| 236 | host = sdhci_alloc_host(&ofdev->dev, sizeof(*of_host)); | 236 | host = sdhci_alloc_host(&ofdev->dev, sizeof(*of_host)); |
| 237 | if (!host) | 237 | if (IS_ERR(host)) |
| 238 | return -ENOMEM; | 238 | return -ENOMEM; |
| 239 | 239 | ||
| 240 | of_host = sdhci_priv(host); | 240 | of_host = sdhci_priv(host); |
diff --git a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig index 0b98654d8eed..7a58bd5522fd 100644 --- a/drivers/mtd/maps/Kconfig +++ b/drivers/mtd/maps/Kconfig | |||
| @@ -284,13 +284,6 @@ config MTD_L440GX | |||
| 284 | 284 | ||
| 285 | BE VERY CAREFUL. | 285 | BE VERY CAREFUL. |
| 286 | 286 | ||
| 287 | config MTD_SBC8240 | ||
| 288 | tristate "Flash device on SBC8240" | ||
| 289 | depends on MTD_JEDECPROBE && 8260 | ||
| 290 | help | ||
| 291 | Flash access on the SBC8240 board from Wind River. See | ||
| 292 | <http://www.windriver.com/products/sbc8240/> | ||
| 293 | |||
| 294 | config MTD_TQM8XXL | 287 | config MTD_TQM8XXL |
| 295 | tristate "CFI Flash device mapped on TQM8XXL" | 288 | tristate "CFI Flash device mapped on TQM8XXL" |
| 296 | depends on MTD_CFI && TQM8xxL | 289 | depends on MTD_CFI && TQM8xxL |
diff --git a/drivers/mtd/maps/Makefile b/drivers/mtd/maps/Makefile index 8bae7f9850c0..5beb0662d724 100644 --- a/drivers/mtd/maps/Makefile +++ b/drivers/mtd/maps/Makefile | |||
| @@ -50,7 +50,6 @@ obj-$(CONFIG_MTD_UCLINUX) += uclinux.o | |||
| 50 | obj-$(CONFIG_MTD_NETtel) += nettel.o | 50 | obj-$(CONFIG_MTD_NETtel) += nettel.o |
| 51 | obj-$(CONFIG_MTD_SCB2_FLASH) += scb2_flash.o | 51 | obj-$(CONFIG_MTD_SCB2_FLASH) += scb2_flash.o |
| 52 | obj-$(CONFIG_MTD_H720X) += h720x-flash.o | 52 | obj-$(CONFIG_MTD_H720X) += h720x-flash.o |
| 53 | obj-$(CONFIG_MTD_SBC8240) += sbc8240.o | ||
| 54 | obj-$(CONFIG_MTD_IXP4XX) += ixp4xx.o | 53 | obj-$(CONFIG_MTD_IXP4XX) += ixp4xx.o |
| 55 | obj-$(CONFIG_MTD_IXP2000) += ixp2000.o | 54 | obj-$(CONFIG_MTD_IXP2000) += ixp2000.o |
| 56 | obj-$(CONFIG_MTD_WRSBC8260) += wr_sbc82xx_flash.o | 55 | obj-$(CONFIG_MTD_WRSBC8260) += wr_sbc82xx_flash.o |
diff --git a/drivers/mtd/maps/sbc8240.c b/drivers/mtd/maps/sbc8240.c deleted file mode 100644 index d5374cdcb163..000000000000 --- a/drivers/mtd/maps/sbc8240.c +++ /dev/null | |||
| @@ -1,250 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Handle mapping of the flash memory access routines on the SBC8240 board. | ||
| 3 | * | ||
| 4 | * Carolyn Smith, Tektronix, Inc. | ||
| 5 | * | ||
| 6 | * This code is GPLed | ||
| 7 | */ | ||
| 8 | |||
| 9 | /* | ||
| 10 | * The SBC8240 has 2 flash banks. | ||
| 11 | * Bank 0 is a 512 KiB AMD AM29F040B; 8 x 64 KiB sectors. | ||
| 12 | * It contains the U-Boot code (7 sectors) and the environment (1 sector). | ||
| 13 | * Bank 1 is 4 x 1 MiB AMD AM29LV800BT; 15 x 64 KiB sectors, 1 x 32 KiB sector, | ||
| 14 | * 2 x 8 KiB sectors, 1 x 16 KiB sectors. | ||
| 15 | * Both parts are JEDEC compatible. | ||
| 16 | */ | ||
| 17 | |||
| 18 | #include <linux/module.h> | ||
| 19 | #include <linux/types.h> | ||
| 20 | #include <linux/kernel.h> | ||
| 21 | #include <asm/io.h> | ||
| 22 | |||
| 23 | #include <linux/mtd/mtd.h> | ||
| 24 | #include <linux/mtd/map.h> | ||
| 25 | #include <linux/mtd/cfi.h> | ||
| 26 | |||
| 27 | #ifdef CONFIG_MTD_PARTITIONS | ||
| 28 | #include <linux/mtd/partitions.h> | ||
| 29 | #endif | ||
| 30 | |||
| 31 | #define DEBUG | ||
| 32 | |||
| 33 | #ifdef DEBUG | ||
| 34 | # define debugk(fmt,args...) printk(fmt ,##args) | ||
| 35 | #else | ||
| 36 | # define debugk(fmt,args...) | ||
| 37 | #endif | ||
| 38 | |||
| 39 | |||
| 40 | #define WINDOW_ADDR0 0xFFF00000 /* 512 KiB */ | ||
| 41 | #define WINDOW_SIZE0 0x00080000 | ||
| 42 | #define BUSWIDTH0 1 | ||
| 43 | |||
| 44 | #define WINDOW_ADDR1 0xFF000000 /* 4 MiB */ | ||
| 45 | #define WINDOW_SIZE1 0x00400000 | ||
| 46 | #define BUSWIDTH1 8 | ||
| 47 | |||
| 48 | #define MSG_PREFIX "sbc8240:" /* prefix for our printk()'s */ | ||
| 49 | #define MTDID "sbc8240-%d" /* for mtdparts= partitioning */ | ||
| 50 | |||
| 51 | |||
| 52 | static struct map_info sbc8240_map[2] = { | ||
| 53 | { | ||
| 54 | .name = "sbc8240 Flash Bank #0", | ||
| 55 | .size = WINDOW_SIZE0, | ||
| 56 | .bankwidth = BUSWIDTH0, | ||
| 57 | }, | ||
| 58 | { | ||
| 59 | .name = "sbc8240 Flash Bank #1", | ||
| 60 | .size = WINDOW_SIZE1, | ||
| 61 | .bankwidth = BUSWIDTH1, | ||
| 62 | } | ||
| 63 | }; | ||
| 64 | |||
| 65 | #define NUM_FLASH_BANKS ARRAY_SIZE(sbc8240_map) | ||
| 66 | |||
| 67 | /* | ||
| 68 | * The following defines the partition layout of SBC8240 boards. | ||
| 69 | * | ||
| 70 | * See include/linux/mtd/partitions.h for definition of the | ||
| 71 | * mtd_partition structure. | ||
| 72 | * | ||
| 73 | * The *_max_flash_size is the maximum possible mapped flash size | ||
| 74 | * which is not necessarily the actual flash size. It must correspond | ||
| 75 | * to the value specified in the mapping definition defined by the | ||
| 76 | * "struct map_desc *_io_desc" for the corresponding machine. | ||
| 77 | */ | ||
| 78 | |||
| 79 | #ifdef CONFIG_MTD_PARTITIONS | ||
| 80 | |||
| 81 | static struct mtd_partition sbc8240_uboot_partitions [] = { | ||
| 82 | /* Bank 0 */ | ||
| 83 | { | ||
| 84 | .name = "U-boot", /* U-Boot Firmware */ | ||
| 85 | .offset = 0, | ||
| 86 | .size = 0x00070000, /* 7 x 64 KiB sectors */ | ||
| 87 | .mask_flags = MTD_WRITEABLE, /* force read-only */ | ||
| 88 | }, | ||
| 89 | { | ||
| 90 | .name = "environment", /* U-Boot environment */ | ||
| 91 | .offset = 0x00070000, | ||
| 92 | .size = 0x00010000, /* 1 x 64 KiB sector */ | ||
| 93 | }, | ||
| 94 | }; | ||
| 95 | |||
| 96 | static struct mtd_partition sbc8240_fs_partitions [] = { | ||
| 97 | { | ||
| 98 | .name = "jffs", /* JFFS filesystem */ | ||
| 99 | .offset = 0, | ||
| 100 | .size = 0x003C0000, /* 4 * 15 * 64KiB */ | ||
| 101 | }, | ||
| 102 | { | ||
| 103 | .name = "tmp32", | ||
| 104 | .offset = 0x003C0000, | ||
| 105 | .size = 0x00020000, /* 4 * 32KiB */ | ||
| 106 | }, | ||
| 107 | { | ||
| 108 | .name = "tmp8a", | ||
| 109 | .offset = 0x003E0000, | ||
| 110 | .size = 0x00008000, /* 4 * 8KiB */ | ||
| 111 | }, | ||
| 112 | { | ||
| 113 | .name = "tmp8b", | ||
| 114 | .offset = 0x003E8000, | ||
| 115 | .size = 0x00008000, /* 4 * 8KiB */ | ||
| 116 | }, | ||
| 117 | { | ||
| 118 | .name = "tmp16", | ||
| 119 | .offset = 0x003F0000, | ||
| 120 | .size = 0x00010000, /* 4 * 16KiB */ | ||
| 121 | } | ||
| 122 | }; | ||
| 123 | |||
| 124 | /* trivial struct to describe partition information */ | ||
| 125 | struct mtd_part_def | ||
| 126 | { | ||
| 127 | int nums; | ||
| 128 | unsigned char *type; | ||
| 129 | struct mtd_partition* mtd_part; | ||
| 130 | }; | ||
| 131 | |||
| 132 | static struct mtd_info *sbc8240_mtd[NUM_FLASH_BANKS]; | ||
| 133 | static struct mtd_part_def sbc8240_part_banks[NUM_FLASH_BANKS]; | ||
| 134 | |||
| 135 | |||
| 136 | #endif /* CONFIG_MTD_PARTITIONS */ | ||
| 137 | |||
| 138 | |||
| 139 | static int __init init_sbc8240_mtd (void) | ||
| 140 | { | ||
| 141 | static struct _cjs { | ||
| 142 | u_long addr; | ||
| 143 | u_long size; | ||
| 144 | } pt[NUM_FLASH_BANKS] = { | ||
| 145 | { | ||
| 146 | .addr = WINDOW_ADDR0, | ||
| 147 | .size = WINDOW_SIZE0 | ||
| 148 | }, | ||
| 149 | { | ||
| 150 | .addr = WINDOW_ADDR1, | ||
| 151 | .size = WINDOW_SIZE1 | ||
| 152 | }, | ||
| 153 | }; | ||
| 154 | |||
| 155 | int devicesfound = 0; | ||
| 156 | int i,j; | ||
| 157 | |||
| 158 | for (i = 0; i < NUM_FLASH_BANKS; i++) { | ||
| 159 | printk (KERN_NOTICE MSG_PREFIX | ||
| 160 | "Probing 0x%08lx at 0x%08lx\n", pt[i].size, pt[i].addr); | ||
| 161 | |||
| 162 | sbc8240_map[i].map_priv_1 = | ||
| 163 | (unsigned long) ioremap (pt[i].addr, pt[i].size); | ||
| 164 | if (!sbc8240_map[i].map_priv_1) { | ||
| 165 | printk (MSG_PREFIX "failed to ioremap\n"); | ||
| 166 | for (j = 0; j < i; j++) { | ||
| 167 | iounmap((void *) sbc8240_map[j].map_priv_1); | ||
| 168 | sbc8240_map[j].map_priv_1 = 0; | ||
| 169 | } | ||
| 170 | return -EIO; | ||
| 171 | } | ||
| 172 | simple_map_init(&sbc8240_mtd[i]); | ||
| 173 | |||
| 174 | sbc8240_mtd[i] = do_map_probe("jedec_probe", &sbc8240_map[i]); | ||
| 175 | |||
| 176 | if (sbc8240_mtd[i]) { | ||
| 177 | sbc8240_mtd[i]->module = THIS_MODULE; | ||
| 178 | devicesfound++; | ||
| 179 | } else { | ||
| 180 | if (sbc8240_map[i].map_priv_1) { | ||
| 181 | iounmap((void *) sbc8240_map[i].map_priv_1); | ||
| 182 | sbc8240_map[i].map_priv_1 = 0; | ||
| 183 | } | ||
| 184 | } | ||
| 185 | } | ||
| 186 | |||
| 187 | if (!devicesfound) { | ||
| 188 | printk(KERN_NOTICE MSG_PREFIX | ||
| 189 | "No suppported flash chips found!\n"); | ||
| 190 | return -ENXIO; | ||
| 191 | } | ||
| 192 | |||
| 193 | #ifdef CONFIG_MTD_PARTITIONS | ||
| 194 | sbc8240_part_banks[0].mtd_part = sbc8240_uboot_partitions; | ||
| 195 | sbc8240_part_banks[0].type = "static image"; | ||
| 196 | sbc8240_part_banks[0].nums = ARRAY_SIZE(sbc8240_uboot_partitions); | ||
| 197 | sbc8240_part_banks[1].mtd_part = sbc8240_fs_partitions; | ||
| 198 | sbc8240_part_banks[1].type = "static file system"; | ||
| 199 | sbc8240_part_banks[1].nums = ARRAY_SIZE(sbc8240_fs_partitions); | ||
| 200 | |||
| 201 | for (i = 0; i < NUM_FLASH_BANKS; i++) { | ||
| 202 | |||
| 203 | if (!sbc8240_mtd[i]) continue; | ||
| 204 | if (sbc8240_part_banks[i].nums == 0) { | ||
| 205 | printk (KERN_NOTICE MSG_PREFIX | ||
| 206 | "No partition info available, registering whole device\n"); | ||
| 207 | add_mtd_device(sbc8240_mtd[i]); | ||
| 208 | } else { | ||
| 209 | printk (KERN_NOTICE MSG_PREFIX | ||
| 210 | "Using %s partition definition\n", sbc8240_part_banks[i].mtd_part->name); | ||
| 211 | add_mtd_partitions (sbc8240_mtd[i], | ||
| 212 | sbc8240_part_banks[i].mtd_part, | ||
| 213 | sbc8240_part_banks[i].nums); | ||
| 214 | } | ||
| 215 | } | ||
| 216 | #else | ||
| 217 | printk(KERN_NOTICE MSG_PREFIX | ||
| 218 | "Registering %d flash banks at once\n", devicesfound); | ||
| 219 | |||
| 220 | for (i = 0; i < devicesfound; i++) { | ||
| 221 | add_mtd_device(sbc8240_mtd[i]); | ||
| 222 | } | ||
| 223 | #endif /* CONFIG_MTD_PARTITIONS */ | ||
| 224 | |||
| 225 | return devicesfound == 0 ? -ENXIO : 0; | ||
| 226 | } | ||
| 227 | |||
| 228 | static void __exit cleanup_sbc8240_mtd (void) | ||
| 229 | { | ||
| 230 | int i; | ||
| 231 | |||
| 232 | for (i = 0; i < NUM_FLASH_BANKS; i++) { | ||
| 233 | if (sbc8240_mtd[i]) { | ||
| 234 | del_mtd_device (sbc8240_mtd[i]); | ||
| 235 | map_destroy (sbc8240_mtd[i]); | ||
| 236 | } | ||
| 237 | if (sbc8240_map[i].map_priv_1) { | ||
| 238 | iounmap ((void *) sbc8240_map[i].map_priv_1); | ||
| 239 | sbc8240_map[i].map_priv_1 = 0; | ||
| 240 | } | ||
| 241 | } | ||
| 242 | } | ||
| 243 | |||
| 244 | module_init (init_sbc8240_mtd); | ||
| 245 | module_exit (cleanup_sbc8240_mtd); | ||
| 246 | |||
| 247 | MODULE_LICENSE ("GPL"); | ||
| 248 | MODULE_AUTHOR ("Carolyn Smith <carolyn.smith@tektronix.com>"); | ||
| 249 | MODULE_DESCRIPTION ("MTD map driver for SBC8240 boards"); | ||
| 250 | |||
diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c index c3f62654b6df..7baba40c1ed2 100644 --- a/drivers/mtd/mtd_blkdevs.c +++ b/drivers/mtd/mtd_blkdevs.c | |||
| @@ -144,7 +144,7 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode) | |||
| 144 | struct mtd_blktrans_ops *tr = dev->tr; | 144 | struct mtd_blktrans_ops *tr = dev->tr; |
| 145 | int ret = -ENODEV; | 145 | int ret = -ENODEV; |
| 146 | 146 | ||
| 147 | if (!try_module_get(dev->mtd->owner)) | 147 | if (!get_mtd_device(NULL, dev->mtd->index)) |
| 148 | goto out; | 148 | goto out; |
| 149 | 149 | ||
| 150 | if (!try_module_get(tr->owner)) | 150 | if (!try_module_get(tr->owner)) |
| @@ -158,7 +158,7 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode) | |||
| 158 | ret = 0; | 158 | ret = 0; |
| 159 | if (tr->open && (ret = tr->open(dev))) { | 159 | if (tr->open && (ret = tr->open(dev))) { |
| 160 | dev->mtd->usecount--; | 160 | dev->mtd->usecount--; |
| 161 | module_put(dev->mtd->owner); | 161 | put_mtd_device(dev->mtd); |
| 162 | out_tr: | 162 | out_tr: |
| 163 | module_put(tr->owner); | 163 | module_put(tr->owner); |
| 164 | } | 164 | } |
| @@ -177,7 +177,7 @@ static int blktrans_release(struct gendisk *disk, fmode_t mode) | |||
| 177 | 177 | ||
| 178 | if (!ret) { | 178 | if (!ret) { |
| 179 | dev->mtd->usecount--; | 179 | dev->mtd->usecount--; |
| 180 | module_put(dev->mtd->owner); | 180 | put_mtd_device(dev->mtd); |
| 181 | module_put(tr->owner); | 181 | module_put(tr->owner); |
| 182 | } | 182 | } |
| 183 | 183 | ||
diff --git a/drivers/mtd/mtdblock.c b/drivers/mtd/mtdblock.c index 208c6faa0358..77db5ce24d92 100644 --- a/drivers/mtd/mtdblock.c +++ b/drivers/mtd/mtdblock.c | |||
| @@ -29,6 +29,8 @@ static struct mtdblk_dev { | |||
| 29 | enum { STATE_EMPTY, STATE_CLEAN, STATE_DIRTY } cache_state; | 29 | enum { STATE_EMPTY, STATE_CLEAN, STATE_DIRTY } cache_state; |
| 30 | } *mtdblks[MAX_MTD_DEVICES]; | 30 | } *mtdblks[MAX_MTD_DEVICES]; |
| 31 | 31 | ||
| 32 | static struct mutex mtdblks_lock; | ||
| 33 | |||
| 32 | /* | 34 | /* |
| 33 | * Cache stuff... | 35 | * Cache stuff... |
| 34 | * | 36 | * |
| @@ -270,15 +272,19 @@ static int mtdblock_open(struct mtd_blktrans_dev *mbd) | |||
| 270 | 272 | ||
| 271 | DEBUG(MTD_DEBUG_LEVEL1,"mtdblock_open\n"); | 273 | DEBUG(MTD_DEBUG_LEVEL1,"mtdblock_open\n"); |
| 272 | 274 | ||
| 275 | mutex_lock(&mtdblks_lock); | ||
| 273 | if (mtdblks[dev]) { | 276 | if (mtdblks[dev]) { |
| 274 | mtdblks[dev]->count++; | 277 | mtdblks[dev]->count++; |
| 278 | mutex_unlock(&mtdblks_lock); | ||
| 275 | return 0; | 279 | return 0; |
| 276 | } | 280 | } |
| 277 | 281 | ||
| 278 | /* OK, it's not open. Create cache info for it */ | 282 | /* OK, it's not open. Create cache info for it */ |
| 279 | mtdblk = kzalloc(sizeof(struct mtdblk_dev), GFP_KERNEL); | 283 | mtdblk = kzalloc(sizeof(struct mtdblk_dev), GFP_KERNEL); |
| 280 | if (!mtdblk) | 284 | if (!mtdblk) { |
| 285 | mutex_unlock(&mtdblks_lock); | ||
| 281 | return -ENOMEM; | 286 | return -ENOMEM; |
| 287 | } | ||
| 282 | 288 | ||
| 283 | mtdblk->count = 1; | 289 | mtdblk->count = 1; |
| 284 | mtdblk->mtd = mtd; | 290 | mtdblk->mtd = mtd; |
| @@ -291,6 +297,7 @@ static int mtdblock_open(struct mtd_blktrans_dev *mbd) | |||
| 291 | } | 297 | } |
| 292 | 298 | ||
| 293 | mtdblks[dev] = mtdblk; | 299 | mtdblks[dev] = mtdblk; |
| 300 | mutex_unlock(&mtdblks_lock); | ||
| 294 | 301 | ||
| 295 | DEBUG(MTD_DEBUG_LEVEL1, "ok\n"); | 302 | DEBUG(MTD_DEBUG_LEVEL1, "ok\n"); |
| 296 | 303 | ||
| @@ -304,6 +311,8 @@ static int mtdblock_release(struct mtd_blktrans_dev *mbd) | |||
| 304 | 311 | ||
| 305 | DEBUG(MTD_DEBUG_LEVEL1, "mtdblock_release\n"); | 312 | DEBUG(MTD_DEBUG_LEVEL1, "mtdblock_release\n"); |
| 306 | 313 | ||
| 314 | mutex_lock(&mtdblks_lock); | ||
| 315 | |||
| 307 | mutex_lock(&mtdblk->cache_mutex); | 316 | mutex_lock(&mtdblk->cache_mutex); |
| 308 | write_cached_data(mtdblk); | 317 | write_cached_data(mtdblk); |
| 309 | mutex_unlock(&mtdblk->cache_mutex); | 318 | mutex_unlock(&mtdblk->cache_mutex); |
| @@ -316,6 +325,9 @@ static int mtdblock_release(struct mtd_blktrans_dev *mbd) | |||
| 316 | vfree(mtdblk->cache_data); | 325 | vfree(mtdblk->cache_data); |
| 317 | kfree(mtdblk); | 326 | kfree(mtdblk); |
| 318 | } | 327 | } |
| 328 | |||
| 329 | mutex_unlock(&mtdblks_lock); | ||
| 330 | |||
| 319 | DEBUG(MTD_DEBUG_LEVEL1, "ok\n"); | 331 | DEBUG(MTD_DEBUG_LEVEL1, "ok\n"); |
| 320 | 332 | ||
| 321 | return 0; | 333 | return 0; |
| @@ -376,6 +388,8 @@ static struct mtd_blktrans_ops mtdblock_tr = { | |||
| 376 | 388 | ||
| 377 | static int __init init_mtdblock(void) | 389 | static int __init init_mtdblock(void) |
| 378 | { | 390 | { |
| 391 | mutex_init(&mtdblks_lock); | ||
| 392 | |||
| 379 | return register_mtd_blktrans(&mtdblock_tr); | 393 | return register_mtd_blktrans(&mtdblock_tr); |
| 380 | } | 394 | } |
| 381 | 395 | ||
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c index fac54a3fa3f1..00ebf7af7467 100644 --- a/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c | |||
| @@ -65,8 +65,8 @@ static void mtd_release(struct device *dev) | |||
| 65 | static int mtd_cls_suspend(struct device *dev, pm_message_t state) | 65 | static int mtd_cls_suspend(struct device *dev, pm_message_t state) |
| 66 | { | 66 | { |
| 67 | struct mtd_info *mtd = dev_to_mtd(dev); | 67 | struct mtd_info *mtd = dev_to_mtd(dev); |
| 68 | 68 | ||
| 69 | if (mtd->suspend) | 69 | if (mtd && mtd->suspend) |
| 70 | return mtd->suspend(mtd); | 70 | return mtd->suspend(mtd); |
| 71 | else | 71 | else |
| 72 | return 0; | 72 | return 0; |
| @@ -76,7 +76,7 @@ static int mtd_cls_resume(struct device *dev) | |||
| 76 | { | 76 | { |
| 77 | struct mtd_info *mtd = dev_to_mtd(dev); | 77 | struct mtd_info *mtd = dev_to_mtd(dev); |
| 78 | 78 | ||
| 79 | if (mtd->resume) | 79 | if (mtd && mtd->resume) |
| 80 | mtd->resume(mtd); | 80 | mtd->resume(mtd); |
| 81 | return 0; | 81 | return 0; |
| 82 | } | 82 | } |
| @@ -298,6 +298,7 @@ int add_mtd_device(struct mtd_info *mtd) | |||
| 298 | mtd->dev.class = &mtd_class; | 298 | mtd->dev.class = &mtd_class; |
| 299 | mtd->dev.devt = MTD_DEVT(i); | 299 | mtd->dev.devt = MTD_DEVT(i); |
| 300 | dev_set_name(&mtd->dev, "mtd%d", i); | 300 | dev_set_name(&mtd->dev, "mtd%d", i); |
| 301 | dev_set_drvdata(&mtd->dev, mtd); | ||
| 301 | if (device_register(&mtd->dev) != 0) { | 302 | if (device_register(&mtd->dev) != 0) { |
| 302 | mtd_table[i] = NULL; | 303 | mtd_table[i] = NULL; |
| 303 | break; | 304 | break; |
diff --git a/drivers/mtd/onenand/omap2.c b/drivers/mtd/onenand/omap2.c index 38d656b9b2ee..0108ed42e877 100644 --- a/drivers/mtd/onenand/omap2.c +++ b/drivers/mtd/onenand/omap2.c | |||
| @@ -266,7 +266,7 @@ static inline int omap2_onenand_bufferram_offset(struct mtd_info *mtd, int area) | |||
| 266 | 266 | ||
| 267 | if (ONENAND_CURRENT_BUFFERRAM(this)) { | 267 | if (ONENAND_CURRENT_BUFFERRAM(this)) { |
| 268 | if (area == ONENAND_DATARAM) | 268 | if (area == ONENAND_DATARAM) |
| 269 | return mtd->writesize; | 269 | return this->writesize; |
| 270 | if (area == ONENAND_SPARERAM) | 270 | if (area == ONENAND_SPARERAM) |
| 271 | return mtd->oobsize; | 271 | return mtd->oobsize; |
| 272 | } | 272 | } |
| @@ -770,6 +770,7 @@ static int __devexit omap2_onenand_remove(struct platform_device *pdev) | |||
| 770 | } | 770 | } |
| 771 | iounmap(c->onenand.base); | 771 | iounmap(c->onenand.base); |
| 772 | release_mem_region(c->phys_base, ONENAND_IO_SIZE); | 772 | release_mem_region(c->phys_base, ONENAND_IO_SIZE); |
| 773 | gpmc_cs_free(c->gpmc_cs); | ||
| 773 | kfree(c); | 774 | kfree(c); |
| 774 | 775 | ||
| 775 | return 0; | 776 | return 0; |
diff --git a/drivers/mtd/ubi/eba.c b/drivers/mtd/ubi/eba.c index 0f2034c3ed2f..e4d9ef0c965a 100644 --- a/drivers/mtd/ubi/eba.c +++ b/drivers/mtd/ubi/eba.c | |||
| @@ -1254,6 +1254,7 @@ out_free: | |||
| 1254 | if (!ubi->volumes[i]) | 1254 | if (!ubi->volumes[i]) |
| 1255 | continue; | 1255 | continue; |
| 1256 | kfree(ubi->volumes[i]->eba_tbl); | 1256 | kfree(ubi->volumes[i]->eba_tbl); |
| 1257 | ubi->volumes[i]->eba_tbl = NULL; | ||
| 1257 | } | 1258 | } |
| 1258 | return err; | 1259 | return err; |
| 1259 | } | 1260 | } |
diff --git a/drivers/mtd/ubi/scan.c b/drivers/mtd/ubi/scan.c index a423131b6171..b847745394b4 100644 --- a/drivers/mtd/ubi/scan.c +++ b/drivers/mtd/ubi/scan.c | |||
| @@ -781,11 +781,22 @@ static int process_eb(struct ubi_device *ubi, struct ubi_scan_info *si, | |||
| 781 | return -EINVAL; | 781 | return -EINVAL; |
| 782 | } | 782 | } |
| 783 | 783 | ||
| 784 | /* | ||
| 785 | * Make sure that all PEBs have the same image sequence number. | ||
| 786 | * This allows us to detect situations when users flash UBI | ||
| 787 | * images incorrectly, so that the flash has the new UBI image | ||
| 788 | * and leftovers from the old one. This feature was added | ||
| 789 | * relatively recently, and the sequence number was always | ||
| 790 | * zero, because old UBI implementations always set it to zero. | ||
| 791 | * For this reasons, we do not panic if some PEBs have zero | ||
| 792 | * sequence number, while other PEBs have non-zero sequence | ||
| 793 | * number. | ||
| 794 | */ | ||
| 784 | image_seq = be32_to_cpu(ech->image_seq); | 795 | image_seq = be32_to_cpu(ech->image_seq); |
| 785 | if (!si->image_seq_set) { | 796 | if (!si->image_seq_set) { |
| 786 | ubi->image_seq = image_seq; | 797 | ubi->image_seq = image_seq; |
| 787 | si->image_seq_set = 1; | 798 | si->image_seq_set = 1; |
| 788 | } else if (ubi->image_seq != image_seq) { | 799 | } else if (ubi->image_seq && ubi->image_seq != image_seq) { |
| 789 | ubi_err("bad image sequence number %d in PEB %d, " | 800 | ubi_err("bad image sequence number %d in PEB %d, " |
| 790 | "expected %d", image_seq, pnum, ubi->image_seq); | 801 | "expected %d", image_seq, pnum, ubi->image_seq); |
| 791 | ubi_dbg_dump_ec_hdr(ech); | 802 | ubi_dbg_dump_ec_hdr(ech); |
diff --git a/drivers/pci/hotplug/sgi_hotplug.c b/drivers/pci/hotplug/sgi_hotplug.c index a4494d78e7c2..8aebe1e9d3d6 100644 --- a/drivers/pci/hotplug/sgi_hotplug.c +++ b/drivers/pci/hotplug/sgi_hotplug.c | |||
| @@ -90,11 +90,10 @@ static struct hotplug_slot_ops sn_hotplug_slot_ops = { | |||
| 90 | 90 | ||
| 91 | static DEFINE_MUTEX(sn_hotplug_mutex); | 91 | static DEFINE_MUTEX(sn_hotplug_mutex); |
| 92 | 92 | ||
| 93 | static ssize_t path_show (struct hotplug_slot *bss_hotplug_slot, | 93 | static ssize_t path_show(struct pci_slot *pci_slot, char *buf) |
| 94 | char *buf) | ||
| 95 | { | 94 | { |
| 96 | int retval = -ENOENT; | 95 | int retval = -ENOENT; |
| 97 | struct slot *slot = bss_hotplug_slot->private; | 96 | struct slot *slot = pci_slot->hotplug->private; |
| 98 | 97 | ||
| 99 | if (!slot) | 98 | if (!slot) |
| 100 | return retval; | 99 | return retval; |
| @@ -103,7 +102,7 @@ static ssize_t path_show (struct hotplug_slot *bss_hotplug_slot, | |||
| 103 | return retval; | 102 | return retval; |
| 104 | } | 103 | } |
| 105 | 104 | ||
| 106 | static struct hotplug_slot_attribute sn_slot_path_attr = __ATTR_RO(path); | 105 | static struct pci_slot_attribute sn_slot_path_attr = __ATTR_RO(path); |
| 107 | 106 | ||
| 108 | static int sn_pci_slot_valid(struct pci_bus *pci_bus, int device) | 107 | static int sn_pci_slot_valid(struct pci_bus *pci_bus, int device) |
| 109 | { | 108 | { |
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index ebc9b8dca881..2314ad7ee5fe 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c | |||
| @@ -1505,7 +1505,6 @@ static int domain_context_mapping_one(struct dmar_domain *domain, int segment, | |||
| 1505 | } | 1505 | } |
| 1506 | 1506 | ||
| 1507 | set_bit(num, iommu->domain_ids); | 1507 | set_bit(num, iommu->domain_ids); |
| 1508 | set_bit(iommu->seq_id, &domain->iommu_bmp); | ||
| 1509 | iommu->domains[num] = domain; | 1508 | iommu->domains[num] = domain; |
| 1510 | id = num; | 1509 | id = num; |
| 1511 | } | 1510 | } |
| @@ -1648,6 +1647,14 @@ static int domain_context_mapped(struct pci_dev *pdev) | |||
| 1648 | tmp->devfn); | 1647 | tmp->devfn); |
| 1649 | } | 1648 | } |
| 1650 | 1649 | ||
| 1650 | /* Returns a number of VTD pages, but aligned to MM page size */ | ||
| 1651 | static inline unsigned long aligned_nrpages(unsigned long host_addr, | ||
| 1652 | size_t size) | ||
| 1653 | { | ||
| 1654 | host_addr &= ~PAGE_MASK; | ||
| 1655 | return PAGE_ALIGN(host_addr + size) >> VTD_PAGE_SHIFT; | ||
| 1656 | } | ||
| 1657 | |||
| 1651 | static int __domain_mapping(struct dmar_domain *domain, unsigned long iov_pfn, | 1658 | static int __domain_mapping(struct dmar_domain *domain, unsigned long iov_pfn, |
| 1652 | struct scatterlist *sg, unsigned long phys_pfn, | 1659 | struct scatterlist *sg, unsigned long phys_pfn, |
| 1653 | unsigned long nr_pages, int prot) | 1660 | unsigned long nr_pages, int prot) |
| @@ -1675,7 +1682,7 @@ static int __domain_mapping(struct dmar_domain *domain, unsigned long iov_pfn, | |||
| 1675 | uint64_t tmp; | 1682 | uint64_t tmp; |
| 1676 | 1683 | ||
| 1677 | if (!sg_res) { | 1684 | if (!sg_res) { |
| 1678 | sg_res = (sg->offset + sg->length + VTD_PAGE_SIZE - 1) >> VTD_PAGE_SHIFT; | 1685 | sg_res = aligned_nrpages(sg->offset, sg->length); |
| 1679 | sg->dma_address = ((dma_addr_t)iov_pfn << VTD_PAGE_SHIFT) + sg->offset; | 1686 | sg->dma_address = ((dma_addr_t)iov_pfn << VTD_PAGE_SHIFT) + sg->offset; |
| 1680 | sg->dma_length = sg->length; | 1687 | sg->dma_length = sg->length; |
| 1681 | pteval = page_to_phys(sg_page(sg)) | prot; | 1688 | pteval = page_to_phys(sg_page(sg)) | prot; |
| @@ -2415,14 +2422,6 @@ error: | |||
| 2415 | return ret; | 2422 | return ret; |
| 2416 | } | 2423 | } |
| 2417 | 2424 | ||
| 2418 | /* Returns a number of VTD pages, but aligned to MM page size */ | ||
| 2419 | static inline unsigned long aligned_nrpages(unsigned long host_addr, | ||
| 2420 | size_t size) | ||
| 2421 | { | ||
| 2422 | host_addr &= ~PAGE_MASK; | ||
| 2423 | return PAGE_ALIGN(host_addr + size) >> VTD_PAGE_SHIFT; | ||
| 2424 | } | ||
| 2425 | |||
| 2426 | /* This takes a number of _MM_ pages, not VTD pages */ | 2425 | /* This takes a number of _MM_ pages, not VTD pages */ |
| 2427 | static struct iova *intel_alloc_iova(struct device *dev, | 2426 | static struct iova *intel_alloc_iova(struct device *dev, |
| 2428 | struct dmar_domain *domain, | 2427 | struct dmar_domain *domain, |
| @@ -2551,6 +2550,7 @@ static dma_addr_t __intel_map_single(struct device *hwdev, phys_addr_t paddr, | |||
| 2551 | int prot = 0; | 2550 | int prot = 0; |
| 2552 | int ret; | 2551 | int ret; |
| 2553 | struct intel_iommu *iommu; | 2552 | struct intel_iommu *iommu; |
| 2553 | unsigned long paddr_pfn = paddr >> PAGE_SHIFT; | ||
| 2554 | 2554 | ||
| 2555 | BUG_ON(dir == DMA_NONE); | 2555 | BUG_ON(dir == DMA_NONE); |
| 2556 | 2556 | ||
| @@ -2585,7 +2585,7 @@ static dma_addr_t __intel_map_single(struct device *hwdev, phys_addr_t paddr, | |||
| 2585 | * is not a big problem | 2585 | * is not a big problem |
| 2586 | */ | 2586 | */ |
| 2587 | ret = domain_pfn_mapping(domain, mm_to_dma_pfn(iova->pfn_lo), | 2587 | ret = domain_pfn_mapping(domain, mm_to_dma_pfn(iova->pfn_lo), |
| 2588 | paddr >> VTD_PAGE_SHIFT, size, prot); | 2588 | mm_to_dma_pfn(paddr_pfn), size, prot); |
| 2589 | if (ret) | 2589 | if (ret) |
| 2590 | goto error; | 2590 | goto error; |
| 2591 | 2591 | ||
| @@ -2875,7 +2875,7 @@ static int intel_map_sg(struct device *hwdev, struct scatterlist *sglist, int ne | |||
| 2875 | 2875 | ||
| 2876 | start_vpfn = mm_to_dma_pfn(iova->pfn_lo); | 2876 | start_vpfn = mm_to_dma_pfn(iova->pfn_lo); |
| 2877 | 2877 | ||
| 2878 | ret = domain_sg_mapping(domain, start_vpfn, sglist, mm_to_dma_pfn(size), prot); | 2878 | ret = domain_sg_mapping(domain, start_vpfn, sglist, size, prot); |
| 2879 | if (unlikely(ret)) { | 2879 | if (unlikely(ret)) { |
| 2880 | /* clear the page */ | 2880 | /* clear the page */ |
| 2881 | dma_pte_clear_range(domain, start_vpfn, | 2881 | dma_pte_clear_range(domain, start_vpfn, |
| @@ -3408,6 +3408,7 @@ static int md_domain_init(struct dmar_domain *domain, int guest_width) | |||
| 3408 | 3408 | ||
| 3409 | domain->iommu_count = 0; | 3409 | domain->iommu_count = 0; |
| 3410 | domain->iommu_coherency = 0; | 3410 | domain->iommu_coherency = 0; |
| 3411 | domain->iommu_snooping = 0; | ||
| 3411 | domain->max_addr = 0; | 3412 | domain->max_addr = 0; |
| 3412 | 3413 | ||
| 3413 | /* always allocate the top pgd */ | 3414 | /* always allocate the top pgd */ |
diff --git a/drivers/serial/s3c2400.c b/drivers/serial/s3c2400.c index fb00ed5296e6..fed1a9a1ffb4 100644 --- a/drivers/serial/s3c2400.c +++ b/drivers/serial/s3c2400.c | |||
| @@ -76,7 +76,7 @@ static int s3c2400_serial_probe(struct platform_device *dev) | |||
| 76 | return s3c24xx_serial_probe(dev, &s3c2400_uart_inf); | 76 | return s3c24xx_serial_probe(dev, &s3c2400_uart_inf); |
| 77 | } | 77 | } |
| 78 | 78 | ||
| 79 | static struct platform_driver s3c2400_serial_drv = { | 79 | static struct platform_driver s3c2400_serial_driver = { |
| 80 | .probe = s3c2400_serial_probe, | 80 | .probe = s3c2400_serial_probe, |
| 81 | .remove = __devexit_p(s3c24xx_serial_remove), | 81 | .remove = __devexit_p(s3c24xx_serial_remove), |
| 82 | .driver = { | 82 | .driver = { |
| @@ -85,16 +85,16 @@ static struct platform_driver s3c2400_serial_drv = { | |||
| 85 | }, | 85 | }, |
| 86 | }; | 86 | }; |
| 87 | 87 | ||
| 88 | s3c24xx_console_init(&s3c2400_serial_drv, &s3c2400_uart_inf); | 88 | s3c24xx_console_init(&s3c2400_serial_driver, &s3c2400_uart_inf); |
| 89 | 89 | ||
| 90 | static inline int s3c2400_serial_init(void) | 90 | static inline int s3c2400_serial_init(void) |
| 91 | { | 91 | { |
| 92 | return s3c24xx_serial_init(&s3c2400_serial_drv, &s3c2400_uart_inf); | 92 | return s3c24xx_serial_init(&s3c2400_serial_driver, &s3c2400_uart_inf); |
| 93 | } | 93 | } |
| 94 | 94 | ||
| 95 | static inline void s3c2400_serial_exit(void) | 95 | static inline void s3c2400_serial_exit(void) |
| 96 | { | 96 | { |
| 97 | platform_driver_unregister(&s3c2400_serial_drv); | 97 | platform_driver_unregister(&s3c2400_serial_driver); |
| 98 | } | 98 | } |
| 99 | 99 | ||
| 100 | module_init(s3c2400_serial_init); | 100 | module_init(s3c2400_serial_init); |
diff --git a/drivers/serial/s3c2410.c b/drivers/serial/s3c2410.c index b5d7cbcba2ae..c99f0821cae3 100644 --- a/drivers/serial/s3c2410.c +++ b/drivers/serial/s3c2410.c | |||
| @@ -88,7 +88,7 @@ static int s3c2410_serial_probe(struct platform_device *dev) | |||
| 88 | return s3c24xx_serial_probe(dev, &s3c2410_uart_inf); | 88 | return s3c24xx_serial_probe(dev, &s3c2410_uart_inf); |
| 89 | } | 89 | } |
| 90 | 90 | ||
| 91 | static struct platform_driver s3c2410_serial_drv = { | 91 | static struct platform_driver s3c2410_serial_driver = { |
| 92 | .probe = s3c2410_serial_probe, | 92 | .probe = s3c2410_serial_probe, |
| 93 | .remove = __devexit_p(s3c24xx_serial_remove), | 93 | .remove = __devexit_p(s3c24xx_serial_remove), |
| 94 | .driver = { | 94 | .driver = { |
| @@ -97,16 +97,16 @@ static struct platform_driver s3c2410_serial_drv = { | |||
| 97 | }, | 97 | }, |
| 98 | }; | 98 | }; |
| 99 | 99 | ||
| 100 | s3c24xx_console_init(&s3c2410_serial_drv, &s3c2410_uart_inf); | 100 | s3c24xx_console_init(&s3c2410_serial_driver, &s3c2410_uart_inf); |
| 101 | 101 | ||
| 102 | static int __init s3c2410_serial_init(void) | 102 | static int __init s3c2410_serial_init(void) |
| 103 | { | 103 | { |
| 104 | return s3c24xx_serial_init(&s3c2410_serial_drv, &s3c2410_uart_inf); | 104 | return s3c24xx_serial_init(&s3c2410_serial_driver, &s3c2410_uart_inf); |
| 105 | } | 105 | } |
| 106 | 106 | ||
| 107 | static void __exit s3c2410_serial_exit(void) | 107 | static void __exit s3c2410_serial_exit(void) |
| 108 | { | 108 | { |
| 109 | platform_driver_unregister(&s3c2410_serial_drv); | 109 | platform_driver_unregister(&s3c2410_serial_driver); |
| 110 | } | 110 | } |
| 111 | 111 | ||
| 112 | module_init(s3c2410_serial_init); | 112 | module_init(s3c2410_serial_init); |
diff --git a/drivers/serial/s3c2412.c b/drivers/serial/s3c2412.c index 11dcb90bdfef..6e057d8809d3 100644 --- a/drivers/serial/s3c2412.c +++ b/drivers/serial/s3c2412.c | |||
| @@ -121,7 +121,7 @@ static int s3c2412_serial_probe(struct platform_device *dev) | |||
| 121 | return s3c24xx_serial_probe(dev, &s3c2412_uart_inf); | 121 | return s3c24xx_serial_probe(dev, &s3c2412_uart_inf); |
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | static struct platform_driver s3c2412_serial_drv = { | 124 | static struct platform_driver s3c2412_serial_driver = { |
| 125 | .probe = s3c2412_serial_probe, | 125 | .probe = s3c2412_serial_probe, |
| 126 | .remove = __devexit_p(s3c24xx_serial_remove), | 126 | .remove = __devexit_p(s3c24xx_serial_remove), |
| 127 | .driver = { | 127 | .driver = { |
| @@ -130,16 +130,16 @@ static struct platform_driver s3c2412_serial_drv = { | |||
| 130 | }, | 130 | }, |
| 131 | }; | 131 | }; |
| 132 | 132 | ||
| 133 | s3c24xx_console_init(&s3c2412_serial_drv, &s3c2412_uart_inf); | 133 | s3c24xx_console_init(&s3c2412_serial_driver, &s3c2412_uart_inf); |
| 134 | 134 | ||
| 135 | static inline int s3c2412_serial_init(void) | 135 | static inline int s3c2412_serial_init(void) |
| 136 | { | 136 | { |
| 137 | return s3c24xx_serial_init(&s3c2412_serial_drv, &s3c2412_uart_inf); | 137 | return s3c24xx_serial_init(&s3c2412_serial_driver, &s3c2412_uart_inf); |
| 138 | } | 138 | } |
| 139 | 139 | ||
| 140 | static inline void s3c2412_serial_exit(void) | 140 | static inline void s3c2412_serial_exit(void) |
| 141 | { | 141 | { |
| 142 | platform_driver_unregister(&s3c2412_serial_drv); | 142 | platform_driver_unregister(&s3c2412_serial_driver); |
| 143 | } | 143 | } |
| 144 | 144 | ||
| 145 | module_init(s3c2412_serial_init); | 145 | module_init(s3c2412_serial_init); |
diff --git a/drivers/serial/s3c2440.c b/drivers/serial/s3c2440.c index 06c5b0cc47a3..69ff5d340f04 100644 --- a/drivers/serial/s3c2440.c +++ b/drivers/serial/s3c2440.c | |||
| @@ -151,7 +151,7 @@ static int s3c2440_serial_probe(struct platform_device *dev) | |||
| 151 | return s3c24xx_serial_probe(dev, &s3c2440_uart_inf); | 151 | return s3c24xx_serial_probe(dev, &s3c2440_uart_inf); |
| 152 | } | 152 | } |
| 153 | 153 | ||
| 154 | static struct platform_driver s3c2440_serial_drv = { | 154 | static struct platform_driver s3c2440_serial_driver = { |
| 155 | .probe = s3c2440_serial_probe, | 155 | .probe = s3c2440_serial_probe, |
| 156 | .remove = __devexit_p(s3c24xx_serial_remove), | 156 | .remove = __devexit_p(s3c24xx_serial_remove), |
| 157 | .driver = { | 157 | .driver = { |
| @@ -160,16 +160,16 @@ static struct platform_driver s3c2440_serial_drv = { | |||
| 160 | }, | 160 | }, |
| 161 | }; | 161 | }; |
| 162 | 162 | ||
| 163 | s3c24xx_console_init(&s3c2440_serial_drv, &s3c2440_uart_inf); | 163 | s3c24xx_console_init(&s3c2440_serial_driver, &s3c2440_uart_inf); |
| 164 | 164 | ||
| 165 | static int __init s3c2440_serial_init(void) | 165 | static int __init s3c2440_serial_init(void) |
| 166 | { | 166 | { |
| 167 | return s3c24xx_serial_init(&s3c2440_serial_drv, &s3c2440_uart_inf); | 167 | return s3c24xx_serial_init(&s3c2440_serial_driver, &s3c2440_uart_inf); |
| 168 | } | 168 | } |
| 169 | 169 | ||
| 170 | static void __exit s3c2440_serial_exit(void) | 170 | static void __exit s3c2440_serial_exit(void) |
| 171 | { | 171 | { |
| 172 | platform_driver_unregister(&s3c2440_serial_drv); | 172 | platform_driver_unregister(&s3c2440_serial_driver); |
| 173 | } | 173 | } |
| 174 | 174 | ||
| 175 | module_init(s3c2440_serial_init); | 175 | module_init(s3c2440_serial_init); |
diff --git a/drivers/serial/s3c24a0.c b/drivers/serial/s3c24a0.c index 786a067d62ac..26c49e18bdd1 100644 --- a/drivers/serial/s3c24a0.c +++ b/drivers/serial/s3c24a0.c | |||
| @@ -92,7 +92,7 @@ static int s3c24a0_serial_probe(struct platform_device *dev) | |||
| 92 | return s3c24xx_serial_probe(dev, &s3c24a0_uart_inf); | 92 | return s3c24xx_serial_probe(dev, &s3c24a0_uart_inf); |
| 93 | } | 93 | } |
| 94 | 94 | ||
| 95 | static struct platform_driver s3c24a0_serial_drv = { | 95 | static struct platform_driver s3c24a0_serial_driver = { |
| 96 | .probe = s3c24a0_serial_probe, | 96 | .probe = s3c24a0_serial_probe, |
| 97 | .remove = __devexit_p(s3c24xx_serial_remove), | 97 | .remove = __devexit_p(s3c24xx_serial_remove), |
| 98 | .driver = { | 98 | .driver = { |
| @@ -101,16 +101,16 @@ static struct platform_driver s3c24a0_serial_drv = { | |||
| 101 | }, | 101 | }, |
| 102 | }; | 102 | }; |
| 103 | 103 | ||
| 104 | s3c24xx_console_init(&s3c24a0_serial_drv, &s3c24a0_uart_inf); | 104 | s3c24xx_console_init(&s3c24a0_serial_driver, &s3c24a0_uart_inf); |
| 105 | 105 | ||
| 106 | static int __init s3c24a0_serial_init(void) | 106 | static int __init s3c24a0_serial_init(void) |
| 107 | { | 107 | { |
| 108 | return s3c24xx_serial_init(&s3c24a0_serial_drv, &s3c24a0_uart_inf); | 108 | return s3c24xx_serial_init(&s3c24a0_serial_driver, &s3c24a0_uart_inf); |
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | static void __exit s3c24a0_serial_exit(void) | 111 | static void __exit s3c24a0_serial_exit(void) |
| 112 | { | 112 | { |
| 113 | platform_driver_unregister(&s3c24a0_serial_drv); | 113 | platform_driver_unregister(&s3c24a0_serial_driver); |
| 114 | } | 114 | } |
| 115 | 115 | ||
| 116 | module_init(s3c24a0_serial_init); | 116 | module_init(s3c24a0_serial_init); |
diff --git a/drivers/serial/s3c6400.c b/drivers/serial/s3c6400.c index 48f1a3781f0d..4be92ab50058 100644 --- a/drivers/serial/s3c6400.c +++ b/drivers/serial/s3c6400.c | |||
| @@ -122,7 +122,7 @@ static int s3c6400_serial_probe(struct platform_device *dev) | |||
| 122 | return s3c24xx_serial_probe(dev, &s3c6400_uart_inf); | 122 | return s3c24xx_serial_probe(dev, &s3c6400_uart_inf); |
| 123 | } | 123 | } |
| 124 | 124 | ||
| 125 | static struct platform_driver s3c6400_serial_drv = { | 125 | static struct platform_driver s3c6400_serial_driver = { |
| 126 | .probe = s3c6400_serial_probe, | 126 | .probe = s3c6400_serial_probe, |
| 127 | .remove = __devexit_p(s3c24xx_serial_remove), | 127 | .remove = __devexit_p(s3c24xx_serial_remove), |
| 128 | .driver = { | 128 | .driver = { |
| @@ -131,16 +131,16 @@ static struct platform_driver s3c6400_serial_drv = { | |||
| 131 | }, | 131 | }, |
| 132 | }; | 132 | }; |
| 133 | 133 | ||
| 134 | s3c24xx_console_init(&s3c6400_serial_drv, &s3c6400_uart_inf); | 134 | s3c24xx_console_init(&s3c6400_serial_driver, &s3c6400_uart_inf); |
| 135 | 135 | ||
| 136 | static int __init s3c6400_serial_init(void) | 136 | static int __init s3c6400_serial_init(void) |
| 137 | { | 137 | { |
| 138 | return s3c24xx_serial_init(&s3c6400_serial_drv, &s3c6400_uart_inf); | 138 | return s3c24xx_serial_init(&s3c6400_serial_driver, &s3c6400_uart_inf); |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | static void __exit s3c6400_serial_exit(void) | 141 | static void __exit s3c6400_serial_exit(void) |
| 142 | { | 142 | { |
| 143 | platform_driver_unregister(&s3c6400_serial_drv); | 143 | platform_driver_unregister(&s3c6400_serial_driver); |
| 144 | } | 144 | } |
| 145 | 145 | ||
| 146 | module_init(s3c6400_serial_init); | 146 | module_init(s3c6400_serial_init); |
diff --git a/drivers/serial/serial_ks8695.c b/drivers/serial/serial_ks8695.c index 998e89dc5aaf..e0665630e4da 100644 --- a/drivers/serial/serial_ks8695.c +++ b/drivers/serial/serial_ks8695.c | |||
| @@ -549,7 +549,7 @@ static struct uart_port ks8695uart_ports[SERIAL_KS8695_NR] = { | |||
| 549 | .mapbase = KS8695_UART_VA, | 549 | .mapbase = KS8695_UART_VA, |
| 550 | .iotype = SERIAL_IO_MEM, | 550 | .iotype = SERIAL_IO_MEM, |
| 551 | .irq = KS8695_IRQ_UART_TX, | 551 | .irq = KS8695_IRQ_UART_TX, |
| 552 | .uartclk = CLOCK_TICK_RATE * 16, | 552 | .uartclk = KS8695_CLOCK_RATE * 16, |
| 553 | .fifosize = 16, | 553 | .fifosize = 16, |
| 554 | .ops = &ks8695uart_pops, | 554 | .ops = &ks8695uart_pops, |
| 555 | .flags = ASYNC_BOOT_AUTOCONF, | 555 | .flags = ASYNC_BOOT_AUTOCONF, |
diff --git a/drivers/staging/b3dfg/Kconfig b/drivers/staging/b3dfg/Kconfig index 524231047de5..9e6573cf97d3 100644 --- a/drivers/staging/b3dfg/Kconfig +++ b/drivers/staging/b3dfg/Kconfig | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | config B3DFG | 1 | config B3DFG |
| 2 | tristate "Brontes 3d Frame Framegrabber" | 2 | tristate "Brontes 3d Frame Framegrabber" |
| 3 | depends on PCI | ||
| 3 | default n | 4 | default n |
| 4 | ---help--- | 5 | ---help--- |
| 5 | This driver provides support for the Brontes 3d Framegrabber | 6 | This driver provides support for the Brontes 3d Framegrabber |
diff --git a/drivers/staging/heci/Kconfig b/drivers/staging/heci/Kconfig index ae8d588d3a27..c7206f8bcd93 100644 --- a/drivers/staging/heci/Kconfig +++ b/drivers/staging/heci/Kconfig | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | config HECI | 1 | config HECI |
| 2 | tristate "Intel Management Engine Interface (MEI) Support" | 2 | tristate "Intel Management Engine Interface (MEI) Support" |
| 3 | depends on PCI | ||
| 3 | ---help--- | 4 | ---help--- |
| 4 | The Intel Management Engine Interface (Intel MEI) driver allows | 5 | The Intel Management Engine Interface (Intel MEI) driver allows |
| 5 | applications to access the Active Management Technology | 6 | applications to access the Active Management Technology |
diff --git a/drivers/staging/rspiusb/rspiusb.c b/drivers/staging/rspiusb/rspiusb.c index 2f8155c1968b..04e2f92c0f62 100644 --- a/drivers/staging/rspiusb/rspiusb.c +++ b/drivers/staging/rspiusb/rspiusb.c | |||
| @@ -716,6 +716,8 @@ static int MapUserBuffer(struct ioctl_struct *io, struct device_extension *pdx) | |||
| 716 | pdx->PixelUrb[frameInfo][i]->transfer_flags = | 716 | pdx->PixelUrb[frameInfo][i]->transfer_flags = |
| 717 | URB_NO_TRANSFER_DMA_MAP | URB_NO_INTERRUPT; | 717 | URB_NO_TRANSFER_DMA_MAP | URB_NO_INTERRUPT; |
| 718 | } | 718 | } |
| 719 | if (i == 0) | ||
| 720 | return -EINVAL; | ||
| 719 | /* only interrupt when last URB completes */ | 721 | /* only interrupt when last URB completes */ |
| 720 | pdx->PixelUrb[frameInfo][--i]->transfer_flags &= ~URB_NO_INTERRUPT; | 722 | pdx->PixelUrb[frameInfo][--i]->transfer_flags &= ~URB_NO_INTERRUPT; |
| 721 | pdx->pendedPixelUrbs[frameInfo] = | 723 | pdx->pendedPixelUrbs[frameInfo] = |
diff --git a/drivers/staging/rt2860/rt_linux.h b/drivers/staging/rt2860/rt_linux.h index 85175c182432..25b53ac3f820 100644 --- a/drivers/staging/rt2860/rt_linux.h +++ b/drivers/staging/rt2860/rt_linux.h | |||
| @@ -43,9 +43,6 @@ | |||
| 43 | #include "rtmp_type.h" | 43 | #include "rtmp_type.h" |
| 44 | #include <linux/module.h> | 44 | #include <linux/module.h> |
| 45 | #include <linux/kernel.h> | 45 | #include <linux/kernel.h> |
| 46 | #if !defined(RT2860) && !defined(RT30xx) | ||
| 47 | #include <linux/kthread.h> | ||
| 48 | #endif | ||
| 49 | 46 | ||
| 50 | #include <linux/spinlock.h> | 47 | #include <linux/spinlock.h> |
| 51 | #include <linux/init.h> | 48 | #include <linux/init.h> |
| @@ -166,9 +163,7 @@ typedef int (*HARD_START_XMIT_FUNC)(struct sk_buff *skb, struct net_device *net_ | |||
| 166 | 163 | ||
| 167 | #ifndef RT30xx | 164 | #ifndef RT30xx |
| 168 | typedef struct pid * THREAD_PID; | 165 | typedef struct pid * THREAD_PID; |
| 169 | #ifdef RT2860 | ||
| 170 | #define THREAD_PID_INIT_VALUE NULL | 166 | #define THREAD_PID_INIT_VALUE NULL |
| 171 | #endif | ||
| 172 | #define GET_PID(_v) find_get_pid(_v) | 167 | #define GET_PID(_v) find_get_pid(_v) |
| 173 | #define GET_PID_NUMBER(_v) pid_nr(_v) | 168 | #define GET_PID_NUMBER(_v) pid_nr(_v) |
| 174 | #define CHECK_PID_LEGALITY(_pid) if (pid_nr(_pid) >= 0) | 169 | #define CHECK_PID_LEGALITY(_pid) if (pid_nr(_pid) >= 0) |
| @@ -188,12 +183,12 @@ struct os_cookie { | |||
| 188 | dma_addr_t pAd_pa; | 183 | dma_addr_t pAd_pa; |
| 189 | #endif | 184 | #endif |
| 190 | #ifdef RT2870 | 185 | #ifdef RT2870 |
| 191 | struct usb_device *pUsb_Dev; | 186 | struct usb_device *pUsb_Dev; |
| 192 | 187 | ||
| 193 | #ifndef RT30xx | 188 | #ifndef RT30xx |
| 194 | struct task_struct *MLMEThr_task; | 189 | THREAD_PID MLMEThr_pid; |
| 195 | struct task_struct *RTUSBCmdThr_task; | 190 | THREAD_PID RTUSBCmdThr_pid; |
| 196 | struct task_struct *TimerQThr_task; | 191 | THREAD_PID TimerQThr_pid; |
| 197 | #endif | 192 | #endif |
| 198 | #ifdef RT30xx | 193 | #ifdef RT30xx |
| 199 | struct pid *MLMEThr_pid; | 194 | struct pid *MLMEThr_pid; |
diff --git a/drivers/staging/rt2870/2870_main_dev.c b/drivers/staging/rt2870/2870_main_dev.c index dd01c64fbf61..a4e8696ca39c 100644 --- a/drivers/staging/rt2870/2870_main_dev.c +++ b/drivers/staging/rt2870/2870_main_dev.c | |||
| @@ -235,7 +235,7 @@ INT MlmeThread( | |||
| 235 | DBGPRINT(RT_DEBUG_TRACE,( "<---%s\n",__func__)); | 235 | DBGPRINT(RT_DEBUG_TRACE,( "<---%s\n",__func__)); |
| 236 | 236 | ||
| 237 | #ifndef RT30xx | 237 | #ifndef RT30xx |
| 238 | pObj->MLMEThr_task = NULL; | 238 | pObj->MLMEThr_pid = THREAD_PID_INIT_VALUE; |
| 239 | #endif | 239 | #endif |
| 240 | #ifdef RT30xx | 240 | #ifdef RT30xx |
| 241 | pObj->MLMEThr_pid = NULL; | 241 | pObj->MLMEThr_pid = NULL; |
| @@ -348,7 +348,7 @@ INT RTUSBCmdThread( | |||
| 348 | DBGPRINT(RT_DEBUG_TRACE,( "<---RTUSBCmdThread\n")); | 348 | DBGPRINT(RT_DEBUG_TRACE,( "<---RTUSBCmdThread\n")); |
| 349 | 349 | ||
| 350 | #ifndef RT30xx | 350 | #ifndef RT30xx |
| 351 | pObj->RTUSBCmdThr_task = NULL; | 351 | pObj->RTUSBCmdThr_pid = THREAD_PID_INIT_VALUE; |
| 352 | #endif | 352 | #endif |
| 353 | #ifdef RT30xx | 353 | #ifdef RT30xx |
| 354 | pObj->RTUSBCmdThr_pid = NULL; | 354 | pObj->RTUSBCmdThr_pid = NULL; |
| @@ -447,7 +447,7 @@ INT TimerQThread( | |||
| 447 | DBGPRINT(RT_DEBUG_TRACE,( "<---%s\n",__func__)); | 447 | DBGPRINT(RT_DEBUG_TRACE,( "<---%s\n",__func__)); |
| 448 | 448 | ||
| 449 | #ifndef RT30xx | 449 | #ifndef RT30xx |
| 450 | pObj->TimerQThr_task = NULL; | 450 | pObj->TimerQThr_pid = THREAD_PID_INIT_VALUE; |
| 451 | #endif | 451 | #endif |
| 452 | #ifdef RT30xx | 452 | #ifdef RT30xx |
| 453 | pObj->TimerQThr_pid = NULL; | 453 | pObj->TimerQThr_pid = NULL; |
| @@ -883,46 +883,69 @@ VOID RT28xxThreadTerminate( | |||
| 883 | 883 | ||
| 884 | // Terminate Threads | 884 | // Terminate Threads |
| 885 | #ifndef RT30xx | 885 | #ifndef RT30xx |
| 886 | BUG_ON(pObj->TimerQThr_task == NULL); | 886 | CHECK_PID_LEGALITY(pObj->TimerQThr_pid) |
| 887 | CHECK_PID_LEGALITY(task_pid(pObj->TimerQThr_task)) | ||
| 888 | { | 887 | { |
| 889 | POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; | 888 | POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; |
| 890 | 889 | ||
| 891 | printk(KERN_DEBUG "Terminate the TimerQThr pid=%d!\n", | 890 | printk("Terminate the TimerQThr_pid=%d!\n", GET_PID_NUMBER(pObj->TimerQThr_pid)); |
| 892 | pid_nr(task_pid(pObj->TimerQThr_task))); | ||
| 893 | mb(); | 891 | mb(); |
| 894 | pAd->TimerFunc_kill = 1; | 892 | pAd->TimerFunc_kill = 1; |
| 895 | mb(); | 893 | mb(); |
| 896 | kthread_stop(pObj->TimerQThr_task); | 894 | ret = KILL_THREAD_PID(pObj->TimerQThr_pid, SIGTERM, 1); |
| 897 | pObj->TimerQThr_task = NULL; | 895 | if (ret) |
| 896 | { | ||
| 897 | printk(KERN_WARNING "%s: unable to stop TimerQThread, pid=%d, ret=%d!\n", | ||
| 898 | pAd->net_dev->name, GET_PID_NUMBER(pObj->TimerQThr_pid), ret); | ||
| 899 | } | ||
| 900 | else | ||
| 901 | { | ||
| 902 | wait_for_completion(&pAd->TimerQComplete); | ||
| 903 | pObj->TimerQThr_pid = THREAD_PID_INIT_VALUE; | ||
| 904 | } | ||
| 898 | } | 905 | } |
| 899 | 906 | ||
| 900 | BUG_ON(pObj->MLMEThr_task == NULL); | 907 | CHECK_PID_LEGALITY(pObj->MLMEThr_pid) |
| 901 | CHECK_PID_LEGALITY(task_pid(pObj->MLMEThr_task)) | ||
| 902 | { | 908 | { |
| 903 | printk(KERN_DEBUG "Terminate the MLMEThr pid=%d!\n", | 909 | printk("Terminate the MLMEThr_pid=%d!\n", GET_PID_NUMBER(pObj->MLMEThr_pid)); |
| 904 | pid_nr(task_pid(pObj->MLMEThr_task))); | ||
| 905 | mb(); | 910 | mb(); |
| 906 | pAd->mlme_kill = 1; | 911 | pAd->mlme_kill = 1; |
| 907 | //RT28XX_MLME_HANDLER(pAd); | 912 | //RT28XX_MLME_HANDLER(pAd); |
| 908 | mb(); | 913 | mb(); |
| 909 | kthread_stop(pObj->MLMEThr_task); | 914 | ret = KILL_THREAD_PID(pObj->MLMEThr_pid, SIGTERM, 1); |
| 910 | pObj->MLMEThr_task = NULL; | 915 | if (ret) |
| 916 | { | ||
| 917 | printk (KERN_WARNING "%s: unable to Mlme thread, pid=%d, ret=%d!\n", | ||
| 918 | pAd->net_dev->name, GET_PID_NUMBER(pObj->MLMEThr_pid), ret); | ||
| 919 | } | ||
| 920 | else | ||
| 921 | { | ||
| 922 | //wait_for_completion (&pAd->notify); | ||
| 923 | wait_for_completion (&pAd->mlmeComplete); | ||
| 924 | pObj->MLMEThr_pid = THREAD_PID_INIT_VALUE; | ||
| 925 | } | ||
| 911 | } | 926 | } |
| 912 | 927 | ||
| 913 | BUG_ON(pObj->RTUSBCmdThr_task == NULL); | 928 | CHECK_PID_LEGALITY(pObj->RTUSBCmdThr_pid) |
| 914 | CHECK_PID_LEGALITY(task_pid(pObj->RTUSBCmdThr_task)) | ||
| 915 | { | 929 | { |
| 916 | printk(KERN_DEBUG "Terminate the RTUSBCmdThr pid=%d!\n", | 930 | printk("Terminate the RTUSBCmdThr_pid=%d!\n", GET_PID_NUMBER(pObj->RTUSBCmdThr_pid)); |
| 917 | pid_nr(task_pid(pObj->RTUSBCmdThr_task))); | ||
| 918 | mb(); | 931 | mb(); |
| 919 | NdisAcquireSpinLock(&pAd->CmdQLock); | 932 | NdisAcquireSpinLock(&pAd->CmdQLock); |
| 920 | pAd->CmdQ.CmdQState = RT2870_THREAD_STOPED; | 933 | pAd->CmdQ.CmdQState = RT2870_THREAD_STOPED; |
| 921 | NdisReleaseSpinLock(&pAd->CmdQLock); | 934 | NdisReleaseSpinLock(&pAd->CmdQLock); |
| 922 | mb(); | 935 | mb(); |
| 923 | //RTUSBCMDUp(pAd); | 936 | //RTUSBCMDUp(pAd); |
| 924 | kthread_stop(pObj->RTUSBCmdThr_task); | 937 | ret = KILL_THREAD_PID(pObj->RTUSBCmdThr_pid, SIGTERM, 1); |
| 925 | pObj->RTUSBCmdThr_task = NULL; | 938 | if (ret) |
| 939 | { | ||
| 940 | printk(KERN_WARNING "%s: unable to RTUSBCmd thread, pid=%d, ret=%d!\n", | ||
| 941 | pAd->net_dev->name, GET_PID_NUMBER(pObj->RTUSBCmdThr_pid), ret); | ||
| 942 | } | ||
| 943 | else | ||
| 944 | { | ||
| 945 | //wait_for_completion (&pAd->notify); | ||
| 946 | wait_for_completion (&pAd->CmdQComplete); | ||
| 947 | pObj->RTUSBCmdThr_pid = THREAD_PID_INIT_VALUE; | ||
| 948 | } | ||
| 926 | } | 949 | } |
| 927 | #endif | 950 | #endif |
| 928 | #ifdef RT30xx | 951 | #ifdef RT30xx |
| @@ -1045,7 +1068,7 @@ BOOLEAN RT28XXChipsetCheck( | |||
| 1045 | dev_p->descriptor.idProduct == rtusb_usb_id[i].idProduct) | 1068 | dev_p->descriptor.idProduct == rtusb_usb_id[i].idProduct) |
| 1046 | { | 1069 | { |
| 1047 | #ifndef RT30xx | 1070 | #ifndef RT30xx |
| 1048 | printk(KERN_DEBUG "rt2870: idVendor = 0x%x, idProduct = 0x%x\n", | 1071 | printk("rt2870: idVendor = 0x%x, idProduct = 0x%x\n", |
| 1049 | #endif | 1072 | #endif |
| 1050 | #ifdef RT30xx | 1073 | #ifdef RT30xx |
| 1051 | printk("rt2870: idVendor = 0x%x, idProduct = 0x%x\n", | 1074 | printk("rt2870: idVendor = 0x%x, idProduct = 0x%x\n", |
diff --git a/drivers/staging/rt2870/common/2870_rtmp_init.c b/drivers/staging/rt2870/common/2870_rtmp_init.c index 0f4c8af97e47..80909e9ab5ae 100644 --- a/drivers/staging/rt2870/common/2870_rtmp_init.c +++ b/drivers/staging/rt2870/common/2870_rtmp_init.c | |||
| @@ -700,8 +700,8 @@ NDIS_STATUS AdapterBlockAllocateMemory( | |||
| 700 | usb_dev = pObj->pUsb_Dev; | 700 | usb_dev = pObj->pUsb_Dev; |
| 701 | 701 | ||
| 702 | #ifndef RT30xx | 702 | #ifndef RT30xx |
| 703 | pObj->MLMEThr_task = NULL; | 703 | pObj->MLMEThr_pid = THREAD_PID_INIT_VALUE; |
| 704 | pObj->RTUSBCmdThr_task = NULL; | 704 | pObj->RTUSBCmdThr_pid = THREAD_PID_INIT_VALUE; |
| 705 | #endif | 705 | #endif |
| 706 | #ifdef RT30xx | 706 | #ifdef RT30xx |
| 707 | pObj->MLMEThr_pid = NULL; | 707 | pObj->MLMEThr_pid = NULL; |
| @@ -743,7 +743,7 @@ NDIS_STATUS CreateThreads( | |||
| 743 | PRTMP_ADAPTER pAd = net_dev->ml_priv; | 743 | PRTMP_ADAPTER pAd = net_dev->ml_priv; |
| 744 | POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; | 744 | POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; |
| 745 | #ifndef RT30xx | 745 | #ifndef RT30xx |
| 746 | struct task_struct *tsk; | 746 | pid_t pid_number = -1; |
| 747 | #endif | 747 | #endif |
| 748 | #ifdef RT30xx | 748 | #ifdef RT30xx |
| 749 | pid_t pid_number; | 749 | pid_t pid_number; |
| @@ -762,10 +762,10 @@ NDIS_STATUS CreateThreads( | |||
| 762 | 762 | ||
| 763 | // Creat MLME Thread | 763 | // Creat MLME Thread |
| 764 | #ifndef RT30xx | 764 | #ifndef RT30xx |
| 765 | pObj->MLMEThr_task = NULL; | 765 | pObj->MLMEThr_pid= THREAD_PID_INIT_VALUE; |
| 766 | tsk = kthread_run(MlmeThread, pAd, "%s", pAd->net_dev->name); | 766 | pid_number = kernel_thread(MlmeThread, pAd, CLONE_VM); |
| 767 | 767 | if (pid_number < 0) | |
| 768 | if (IS_ERR(tsk)) { | 768 | { |
| 769 | #endif | 769 | #endif |
| 770 | #ifdef RT30xx | 770 | #ifdef RT30xx |
| 771 | pObj->MLMEThr_pid = NULL; | 771 | pObj->MLMEThr_pid = NULL; |
| @@ -778,7 +778,7 @@ NDIS_STATUS CreateThreads( | |||
| 778 | } | 778 | } |
| 779 | 779 | ||
| 780 | #ifndef RT30xx | 780 | #ifndef RT30xx |
| 781 | pObj->MLMEThr_task = tsk; | 781 | pObj->MLMEThr_pid = GET_PID(pid_number); |
| 782 | #endif | 782 | #endif |
| 783 | #ifdef RT30xx | 783 | #ifdef RT30xx |
| 784 | pObj->MLMEThr_pid = find_get_pid(pid_number); | 784 | pObj->MLMEThr_pid = find_get_pid(pid_number); |
| @@ -788,10 +788,9 @@ NDIS_STATUS CreateThreads( | |||
| 788 | 788 | ||
| 789 | // Creat Command Thread | 789 | // Creat Command Thread |
| 790 | #ifndef RT30xx | 790 | #ifndef RT30xx |
| 791 | pObj->RTUSBCmdThr_task = NULL; | 791 | pObj->RTUSBCmdThr_pid= THREAD_PID_INIT_VALUE; |
| 792 | tsk = kthread_run(RTUSBCmdThread, pAd, "%s", pAd->net_dev->name); | 792 | pid_number = kernel_thread(RTUSBCmdThread, pAd, CLONE_VM); |
| 793 | 793 | if (pid_number < 0) | |
| 794 | if (IS_ERR(tsk) < 0) | ||
| 795 | #endif | 794 | #endif |
| 796 | #ifdef RT30xx | 795 | #ifdef RT30xx |
| 797 | pObj->RTUSBCmdThr_pid = NULL; | 796 | pObj->RTUSBCmdThr_pid = NULL; |
| @@ -804,7 +803,7 @@ NDIS_STATUS CreateThreads( | |||
| 804 | } | 803 | } |
| 805 | 804 | ||
| 806 | #ifndef RT30xx | 805 | #ifndef RT30xx |
| 807 | pObj->RTUSBCmdThr_task = tsk; | 806 | pObj->RTUSBCmdThr_pid = GET_PID(pid_number); |
| 808 | #endif | 807 | #endif |
| 809 | #ifdef RT30xx | 808 | #ifdef RT30xx |
| 810 | pObj->RTUSBCmdThr_pid = find_get_pid(pid_number); | 809 | pObj->RTUSBCmdThr_pid = find_get_pid(pid_number); |
| @@ -812,9 +811,9 @@ NDIS_STATUS CreateThreads( | |||
| 812 | wait_for_completion(&(pAd->CmdQComplete)); | 811 | wait_for_completion(&(pAd->CmdQComplete)); |
| 813 | 812 | ||
| 814 | #ifndef RT30xx | 813 | #ifndef RT30xx |
| 815 | pObj->TimerQThr_task = NULL; | 814 | pObj->TimerQThr_pid= THREAD_PID_INIT_VALUE; |
| 816 | tsk = kthread_run(TimerQThread, pAd, "%s", pAd->net_dev->name); | 815 | pid_number = kernel_thread(TimerQThread, pAd, CLONE_VM); |
| 817 | if (IS_ERR(tsk) < 0) | 816 | if (pid_number < 0) |
| 818 | #endif | 817 | #endif |
| 819 | #ifdef RT30xx | 818 | #ifdef RT30xx |
| 820 | pObj->TimerQThr_pid = NULL; | 819 | pObj->TimerQThr_pid = NULL; |
| @@ -826,7 +825,7 @@ NDIS_STATUS CreateThreads( | |||
| 826 | return NDIS_STATUS_FAILURE; | 825 | return NDIS_STATUS_FAILURE; |
| 827 | } | 826 | } |
| 828 | #ifndef RT30xx | 827 | #ifndef RT30xx |
| 829 | pObj->TimerQThr_task = tsk; | 828 | pObj->TimerQThr_pid = GET_PID(pid_number); |
| 830 | #endif | 829 | #endif |
| 831 | #ifdef RT30xx | 830 | #ifdef RT30xx |
| 832 | pObj->TimerQThr_pid = find_get_pid(pid_number); | 831 | pObj->TimerQThr_pid = find_get_pid(pid_number); |
diff --git a/drivers/staging/rt2870/common/rtusb_io.c b/drivers/staging/rt2870/common/rtusb_io.c index fd1b0c18f2a0..704b5c2d5091 100644 --- a/drivers/staging/rt2870/common/rtusb_io.c +++ b/drivers/staging/rt2870/common/rtusb_io.c | |||
| @@ -984,8 +984,7 @@ NDIS_STATUS RTUSBEnqueueCmdFromNdis( | |||
| 984 | POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; | 984 | POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; |
| 985 | 985 | ||
| 986 | #ifndef RT30xx | 986 | #ifndef RT30xx |
| 987 | BUG_ON(pObj->RTUSBCmdThr_task == NULL); | 987 | CHECK_PID_LEGALITY(pObj->RTUSBCmdThr_pid) |
| 988 | CHECK_PID_LEGALITY(task_pid(pObj->RTUSBCmdThr_task)) | ||
| 989 | #endif | 988 | #endif |
| 990 | #ifdef RT30xx | 989 | #ifdef RT30xx |
| 991 | if (pObj->RTUSBCmdThr_pid < 0) | 990 | if (pObj->RTUSBCmdThr_pid < 0) |
diff --git a/drivers/staging/rt2870/rt2870.h b/drivers/staging/rt2870/rt2870.h index 29e3b53e52a1..2b8872b2fd9d 100644 --- a/drivers/staging/rt2870/rt2870.h +++ b/drivers/staging/rt2870/rt2870.h | |||
| @@ -79,6 +79,7 @@ | |||
| 79 | { \ | 79 | { \ |
| 80 | {USB_DEVICE(0x148F,0x2770)}, /* Ralink */ \ | 80 | {USB_DEVICE(0x148F,0x2770)}, /* Ralink */ \ |
| 81 | {USB_DEVICE(0x1737,0x0071)}, /* Linksys WUSB600N */ \ | 81 | {USB_DEVICE(0x1737,0x0071)}, /* Linksys WUSB600N */ \ |
| 82 | {USB_DEVICE(0x1737,0x0070)}, /* Linksys */ \ | ||
| 82 | {USB_DEVICE(0x148F,0x2870)}, /* Ralink */ \ | 83 | {USB_DEVICE(0x148F,0x2870)}, /* Ralink */ \ |
| 83 | {USB_DEVICE(0x148F,0x3070)}, /* Ralink */ \ | 84 | {USB_DEVICE(0x148F,0x3070)}, /* Ralink */ \ |
| 84 | {USB_DEVICE(0x0B05,0x1731)}, /* Asus */ \ | 85 | {USB_DEVICE(0x0B05,0x1731)}, /* Asus */ \ |
| @@ -93,12 +94,14 @@ | |||
| 93 | {USB_DEVICE(0x14B2,0x3C06)}, /* Conceptronic */ \ | 94 | {USB_DEVICE(0x14B2,0x3C06)}, /* Conceptronic */ \ |
| 94 | {USB_DEVICE(0x14B2,0x3C28)}, /* Conceptronic */ \ | 95 | {USB_DEVICE(0x14B2,0x3C28)}, /* Conceptronic */ \ |
| 95 | {USB_DEVICE(0x2019,0xED06)}, /* Planex Communications, Inc. */ \ | 96 | {USB_DEVICE(0x2019,0xED06)}, /* Planex Communications, Inc. */ \ |
| 97 | {USB_DEVICE(0x2019,0xED14)}, /* Planex Communications, Inc. */ \ | ||
| 96 | {USB_DEVICE(0x2019,0xAB25)}, /* Planex Communications, Inc. RT3070 */ \ | 98 | {USB_DEVICE(0x2019,0xAB25)}, /* Planex Communications, Inc. RT3070 */ \ |
| 97 | {USB_DEVICE(0x07D1,0x3C09)}, /* D-Link */ \ | 99 | {USB_DEVICE(0x07D1,0x3C09)}, /* D-Link */ \ |
| 98 | {USB_DEVICE(0x07D1,0x3C11)}, /* D-Link */ \ | 100 | {USB_DEVICE(0x07D1,0x3C11)}, /* D-Link */ \ |
| 99 | {USB_DEVICE(0x14B2,0x3C07)}, /* AL */ \ | 101 | {USB_DEVICE(0x14B2,0x3C07)}, /* AL */ \ |
| 100 | {USB_DEVICE(0x14B2,0x3C12)}, /* AL */ \ | 102 | {USB_DEVICE(0x14B2,0x3C12)}, /* AL */ \ |
| 101 | {USB_DEVICE(0x050D,0x8053)}, /* Belkin */ \ | 103 | {USB_DEVICE(0x050D,0x8053)}, /* Belkin */ \ |
| 104 | {USB_DEVICE(0x050D,0x815C)}, /* Belkin */ \ | ||
| 102 | {USB_DEVICE(0x14B2,0x3C23)}, /* Airlink */ \ | 105 | {USB_DEVICE(0x14B2,0x3C23)}, /* Airlink */ \ |
| 103 | {USB_DEVICE(0x14B2,0x3C27)}, /* Airlink */ \ | 106 | {USB_DEVICE(0x14B2,0x3C27)}, /* Airlink */ \ |
| 104 | {USB_DEVICE(0x07AA,0x002F)}, /* Corega */ \ | 107 | {USB_DEVICE(0x07AA,0x002F)}, /* Corega */ \ |
| @@ -587,16 +590,14 @@ VOID RTUSBBulkRxComplete(purbb_t pUrb, struct pt_regs *pt_regs); | |||
| 587 | #define RTUSBMlmeUp(pAd) \ | 590 | #define RTUSBMlmeUp(pAd) \ |
| 588 | { \ | 591 | { \ |
| 589 | POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; \ | 592 | POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; \ |
| 590 | BUG_ON(pObj->MLMEThr_task == NULL); \ | 593 | CHECK_PID_LEGALITY(pObj->MLMEThr_pid) \ |
| 591 | CHECK_PID_LEGALITY(task_pid(pObj->MLMEThr_task)) \ | ||
| 592 | up(&(pAd->mlme_semaphore)); \ | 594 | up(&(pAd->mlme_semaphore)); \ |
| 593 | } | 595 | } |
| 594 | 596 | ||
| 595 | #define RTUSBCMDUp(pAd) \ | 597 | #define RTUSBCMDUp(pAd) \ |
| 596 | { \ | 598 | { \ |
| 597 | POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; \ | 599 | POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; \ |
| 598 | BUG_ON(pObj->RTUSBCmdThr_task == NULL); \ | 600 | CHECK_PID_LEGALITY(pObj->RTUSBCmdThr_pid) \ |
| 599 | CHECK_PID_LEGALITY(task_pid(pObj->RTUSBCmdThr_task)) \ | ||
| 600 | up(&(pAd->RTUSBCmd_semaphore)); \ | 601 | up(&(pAd->RTUSBCmd_semaphore)); \ |
| 601 | } | 602 | } |
| 602 | #endif | 603 | #endif |
diff --git a/drivers/staging/rtl8192su/ieee80211.h b/drivers/staging/rtl8192su/ieee80211.h index 0edb09a536f9..ea9739318037 100644 --- a/drivers/staging/rtl8192su/ieee80211.h +++ b/drivers/staging/rtl8192su/ieee80211.h | |||
| @@ -2645,7 +2645,7 @@ extern int ieee80211_encrypt_fragment( | |||
| 2645 | struct sk_buff *frag, | 2645 | struct sk_buff *frag, |
| 2646 | int hdr_len); | 2646 | int hdr_len); |
| 2647 | 2647 | ||
| 2648 | extern int ieee80211_xmit(struct sk_buff *skb, | 2648 | extern int rtl8192_ieee80211_xmit(struct sk_buff *skb, |
| 2649 | struct net_device *dev); | 2649 | struct net_device *dev); |
| 2650 | extern void ieee80211_txb_free(struct ieee80211_txb *); | 2650 | extern void ieee80211_txb_free(struct ieee80211_txb *); |
| 2651 | 2651 | ||
diff --git a/drivers/staging/rtl8192su/ieee80211/ieee80211.h b/drivers/staging/rtl8192su/ieee80211/ieee80211.h index 720bfcbfadc1..5e3a2cbed2b1 100644 --- a/drivers/staging/rtl8192su/ieee80211/ieee80211.h +++ b/drivers/staging/rtl8192su/ieee80211/ieee80211.h | |||
| @@ -2645,7 +2645,7 @@ extern int ieee80211_encrypt_fragment( | |||
| 2645 | struct sk_buff *frag, | 2645 | struct sk_buff *frag, |
| 2646 | int hdr_len); | 2646 | int hdr_len); |
| 2647 | 2647 | ||
| 2648 | extern int ieee80211_xmit(struct sk_buff *skb, | 2648 | extern int rtl8192_ieee80211_xmit(struct sk_buff *skb, |
| 2649 | struct net_device *dev); | 2649 | struct net_device *dev); |
| 2650 | extern void ieee80211_txb_free(struct ieee80211_txb *); | 2650 | extern void ieee80211_txb_free(struct ieee80211_txb *); |
| 2651 | 2651 | ||
diff --git a/drivers/staging/rtl8192su/ieee80211/ieee80211_tx.c b/drivers/staging/rtl8192su/ieee80211/ieee80211_tx.c index 7294572b990f..cba12b84be5c 100644 --- a/drivers/staging/rtl8192su/ieee80211/ieee80211_tx.c +++ b/drivers/staging/rtl8192su/ieee80211/ieee80211_tx.c | |||
| @@ -618,7 +618,7 @@ void ieee80211_query_seqnum(struct ieee80211_device*ieee, struct sk_buff* skb, u | |||
| 618 | } | 618 | } |
| 619 | } | 619 | } |
| 620 | 620 | ||
| 621 | int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) | 621 | int rtl8192_ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) |
| 622 | { | 622 | { |
| 623 | #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)) | 623 | #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)) |
| 624 | struct ieee80211_device *ieee = netdev_priv(dev); | 624 | struct ieee80211_device *ieee = netdev_priv(dev); |
| @@ -943,5 +943,6 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 943 | return 1; | 943 | return 1; |
| 944 | 944 | ||
| 945 | } | 945 | } |
| 946 | EXPORT_SYMBOL(rtl8192_ieee80211_xmit); | ||
| 946 | 947 | ||
| 947 | EXPORT_SYMBOL(ieee80211_txb_free); | 948 | EXPORT_SYMBOL(ieee80211_txb_free); |
diff --git a/drivers/staging/rtl8192su/r8192U_core.c b/drivers/staging/rtl8192su/r8192U_core.c index 4ab250743e81..70f81a8f1291 100644 --- a/drivers/staging/rtl8192su/r8192U_core.c +++ b/drivers/staging/rtl8192su/r8192U_core.c | |||
| @@ -12142,7 +12142,7 @@ static const struct net_device_ops rtl8192_netdev_ops = { | |||
| 12142 | .ndo_set_mac_address = r8192_set_mac_adr, | 12142 | .ndo_set_mac_address = r8192_set_mac_adr, |
| 12143 | .ndo_validate_addr = eth_validate_addr, | 12143 | .ndo_validate_addr = eth_validate_addr, |
| 12144 | .ndo_change_mtu = eth_change_mtu, | 12144 | .ndo_change_mtu = eth_change_mtu, |
| 12145 | .ndo_start_xmit = ieee80211_xmit, | 12145 | .ndo_start_xmit = rtl8192_ieee80211_xmit, |
| 12146 | }; | 12146 | }; |
| 12147 | 12147 | ||
| 12148 | #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) | 12148 | #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index e1f89416ef8c..2bfc41ece0e1 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
| @@ -387,7 +387,6 @@ static void acm_rx_tasklet(unsigned long _acm) | |||
| 387 | struct acm_ru *rcv; | 387 | struct acm_ru *rcv; |
| 388 | unsigned long flags; | 388 | unsigned long flags; |
| 389 | unsigned char throttled; | 389 | unsigned char throttled; |
| 390 | struct usb_host_endpoint *ep; | ||
| 391 | 390 | ||
| 392 | dbg("Entering acm_rx_tasklet"); | 391 | dbg("Entering acm_rx_tasklet"); |
| 393 | 392 | ||
| @@ -463,14 +462,12 @@ urbs: | |||
| 463 | 462 | ||
| 464 | rcv->buffer = buf; | 463 | rcv->buffer = buf; |
| 465 | 464 | ||
| 466 | ep = (usb_pipein(acm->rx_endpoint) ? acm->dev->ep_in : acm->dev->ep_out) | 465 | if (acm->is_int_ep) |
| 467 | [usb_pipeendpoint(acm->rx_endpoint)]; | ||
| 468 | if (usb_endpoint_xfer_int(&ep->desc)) | ||
| 469 | usb_fill_int_urb(rcv->urb, acm->dev, | 466 | usb_fill_int_urb(rcv->urb, acm->dev, |
| 470 | acm->rx_endpoint, | 467 | acm->rx_endpoint, |
| 471 | buf->base, | 468 | buf->base, |
| 472 | acm->readsize, | 469 | acm->readsize, |
| 473 | acm_read_bulk, rcv, ep->desc.bInterval); | 470 | acm_read_bulk, rcv, acm->bInterval); |
| 474 | else | 471 | else |
| 475 | usb_fill_bulk_urb(rcv->urb, acm->dev, | 472 | usb_fill_bulk_urb(rcv->urb, acm->dev, |
| 476 | acm->rx_endpoint, | 473 | acm->rx_endpoint, |
| @@ -1183,6 +1180,9 @@ made_compressed_probe: | |||
| 1183 | spin_lock_init(&acm->read_lock); | 1180 | spin_lock_init(&acm->read_lock); |
| 1184 | mutex_init(&acm->mutex); | 1181 | mutex_init(&acm->mutex); |
| 1185 | acm->rx_endpoint = usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress); | 1182 | acm->rx_endpoint = usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress); |
| 1183 | acm->is_int_ep = usb_endpoint_xfer_int(epread); | ||
| 1184 | if (acm->is_int_ep) | ||
| 1185 | acm->bInterval = epread->bInterval; | ||
| 1186 | tty_port_init(&acm->port); | 1186 | tty_port_init(&acm->port); |
| 1187 | acm->port.ops = &acm_port_ops; | 1187 | acm->port.ops = &acm_port_ops; |
| 1188 | 1188 | ||
diff --git a/drivers/usb/class/cdc-acm.h b/drivers/usb/class/cdc-acm.h index 1602324808ba..c4a0ee8ffccf 100644 --- a/drivers/usb/class/cdc-acm.h +++ b/drivers/usb/class/cdc-acm.h | |||
| @@ -126,6 +126,8 @@ struct acm { | |||
| 126 | unsigned int ctrl_caps; /* control capabilities from the class specific header */ | 126 | unsigned int ctrl_caps; /* control capabilities from the class specific header */ |
| 127 | unsigned int susp_count; /* number of suspended interfaces */ | 127 | unsigned int susp_count; /* number of suspended interfaces */ |
| 128 | int combined_interfaces:1; /* control and data collapsed */ | 128 | int combined_interfaces:1; /* control and data collapsed */ |
| 129 | int is_int_ep:1; /* interrupt endpoints contrary to spec used */ | ||
| 130 | u8 bInterval; | ||
| 129 | struct acm_wb *delayed_wb; /* write queued for a device about to be woken */ | 131 | struct acm_wb *delayed_wb; /* write queued for a device about to be woken */ |
| 130 | }; | 132 | }; |
| 131 | 133 | ||
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index 38b8bce782d6..4247eccf858c 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c | |||
| @@ -595,7 +595,7 @@ static int usbdev_open(struct inode *inode, struct file *file) | |||
| 595 | if (!ps) | 595 | if (!ps) |
| 596 | goto out; | 596 | goto out; |
| 597 | 597 | ||
| 598 | ret = -ENOENT; | 598 | ret = -ENODEV; |
| 599 | 599 | ||
| 600 | /* usbdev device-node */ | 600 | /* usbdev device-node */ |
| 601 | if (imajor(inode) == USB_DEVICE_MAJOR) | 601 | if (imajor(inode) == USB_DEVICE_MAJOR) |
| @@ -1321,7 +1321,8 @@ static int get_urb32(struct usbdevfs_urb *kurb, | |||
| 1321 | struct usbdevfs_urb32 __user *uurb) | 1321 | struct usbdevfs_urb32 __user *uurb) |
| 1322 | { | 1322 | { |
| 1323 | __u32 uptr; | 1323 | __u32 uptr; |
| 1324 | if (get_user(kurb->type, &uurb->type) || | 1324 | if (!access_ok(VERIFY_READ, uurb, sizeof(*uurb)) || |
| 1325 | __get_user(kurb->type, &uurb->type) || | ||
| 1325 | __get_user(kurb->endpoint, &uurb->endpoint) || | 1326 | __get_user(kurb->endpoint, &uurb->endpoint) || |
| 1326 | __get_user(kurb->status, &uurb->status) || | 1327 | __get_user(kurb->status, &uurb->status) || |
| 1327 | __get_user(kurb->flags, &uurb->flags) || | 1328 | __get_user(kurb->flags, &uurb->flags) || |
| @@ -1536,8 +1537,9 @@ static int proc_ioctl_compat(struct dev_state *ps, compat_uptr_t arg) | |||
| 1536 | u32 udata; | 1537 | u32 udata; |
| 1537 | 1538 | ||
| 1538 | uioc = compat_ptr((long)arg); | 1539 | uioc = compat_ptr((long)arg); |
| 1539 | if (get_user(ctrl.ifno, &uioc->ifno) || | 1540 | if (!access_ok(VERIFY_READ, uioc, sizeof(*uioc)) || |
| 1540 | get_user(ctrl.ioctl_code, &uioc->ioctl_code) || | 1541 | __get_user(ctrl.ifno, &uioc->ifno) || |
| 1542 | __get_user(ctrl.ioctl_code, &uioc->ioctl_code) || | ||
| 1541 | __get_user(udata, &uioc->data)) | 1543 | __get_user(udata, &uioc->data)) |
| 1542 | return -EFAULT; | 1544 | return -EFAULT; |
| 1543 | ctrl.data = compat_ptr(udata); | 1545 | ctrl.data = compat_ptr(udata); |
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 7d03549c3339..11c627ce6022 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
| @@ -903,7 +903,8 @@ static int ehci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) | |||
| 903 | /* already started */ | 903 | /* already started */ |
| 904 | break; | 904 | break; |
| 905 | case QH_STATE_IDLE: | 905 | case QH_STATE_IDLE: |
| 906 | WARN_ON(1); | 906 | /* QH might be waiting for a Clear-TT-Buffer */ |
| 907 | qh_completions(ehci, qh); | ||
| 907 | break; | 908 | break; |
| 908 | } | 909 | } |
| 909 | break; | 910 | break; |
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c index 9a1384747f3b..7673554fa64d 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c | |||
| @@ -375,12 +375,11 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
| 375 | */ | 375 | */ |
| 376 | if ((token & QTD_STS_XACT) && | 376 | if ((token & QTD_STS_XACT) && |
| 377 | QTD_CERR(token) == 0 && | 377 | QTD_CERR(token) == 0 && |
| 378 | --qh->xacterrs > 0 && | 378 | ++qh->xacterrs < QH_XACTERR_MAX && |
| 379 | !urb->unlinked) { | 379 | !urb->unlinked) { |
| 380 | ehci_dbg(ehci, | 380 | ehci_dbg(ehci, |
| 381 | "detected XactErr len %zu/%zu retry %d\n", | 381 | "detected XactErr len %zu/%zu retry %d\n", |
| 382 | qtd->length - QTD_LENGTH(token), qtd->length, | 382 | qtd->length - QTD_LENGTH(token), qtd->length, qh->xacterrs); |
| 383 | QH_XACTERR_MAX - qh->xacterrs); | ||
| 384 | 383 | ||
| 385 | /* reset the token in the qtd and the | 384 | /* reset the token in the qtd and the |
| 386 | * qh overlay (which still contains | 385 | * qh overlay (which still contains |
| @@ -494,7 +493,7 @@ halt: | |||
| 494 | last = qtd; | 493 | last = qtd; |
| 495 | 494 | ||
| 496 | /* reinit the xacterr counter for the next qtd */ | 495 | /* reinit the xacterr counter for the next qtd */ |
| 497 | qh->xacterrs = QH_XACTERR_MAX; | 496 | qh->xacterrs = 0; |
| 498 | } | 497 | } |
| 499 | 498 | ||
| 500 | /* last urb's completion might still need calling */ | 499 | /* last urb's completion might still need calling */ |
| @@ -940,7 +939,8 @@ static void qh_link_async (struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
| 940 | head->qh_next.qh = qh; | 939 | head->qh_next.qh = qh; |
| 941 | head->hw_next = dma; | 940 | head->hw_next = dma; |
| 942 | 941 | ||
| 943 | qh->xacterrs = QH_XACTERR_MAX; | 942 | qh_get(qh); |
| 943 | qh->xacterrs = 0; | ||
| 944 | qh->qh_state = QH_STATE_LINKED; | 944 | qh->qh_state = QH_STATE_LINKED; |
| 945 | /* qtd completions reported later by interrupt */ | 945 | /* qtd completions reported later by interrupt */ |
| 946 | } | 946 | } |
| @@ -1080,7 +1080,7 @@ submit_async ( | |||
| 1080 | * the HC and TT handle it when the TT has a buffer ready. | 1080 | * the HC and TT handle it when the TT has a buffer ready. |
| 1081 | */ | 1081 | */ |
| 1082 | if (likely (qh->qh_state == QH_STATE_IDLE)) | 1082 | if (likely (qh->qh_state == QH_STATE_IDLE)) |
| 1083 | qh_link_async (ehci, qh_get (qh)); | 1083 | qh_link_async(ehci, qh); |
| 1084 | done: | 1084 | done: |
| 1085 | spin_unlock_irqrestore (&ehci->lock, flags); | 1085 | spin_unlock_irqrestore (&ehci->lock, flags); |
| 1086 | if (unlikely (qh == NULL)) | 1086 | if (unlikely (qh == NULL)) |
| @@ -1115,8 +1115,6 @@ static void end_unlink_async (struct ehci_hcd *ehci) | |||
| 1115 | && HC_IS_RUNNING (ehci_to_hcd(ehci)->state)) | 1115 | && HC_IS_RUNNING (ehci_to_hcd(ehci)->state)) |
| 1116 | qh_link_async (ehci, qh); | 1116 | qh_link_async (ehci, qh); |
| 1117 | else { | 1117 | else { |
| 1118 | qh_put (qh); // refcount from async list | ||
| 1119 | |||
| 1120 | /* it's not free to turn the async schedule on/off; leave it | 1118 | /* it's not free to turn the async schedule on/off; leave it |
| 1121 | * active but idle for a while once it empties. | 1119 | * active but idle for a while once it empties. |
| 1122 | */ | 1120 | */ |
| @@ -1124,6 +1122,7 @@ static void end_unlink_async (struct ehci_hcd *ehci) | |||
| 1124 | && ehci->async->qh_next.qh == NULL) | 1122 | && ehci->async->qh_next.qh == NULL) |
| 1125 | timer_action (ehci, TIMER_ASYNC_OFF); | 1123 | timer_action (ehci, TIMER_ASYNC_OFF); |
| 1126 | } | 1124 | } |
| 1125 | qh_put(qh); /* refcount from async list */ | ||
| 1127 | 1126 | ||
| 1128 | if (next) { | 1127 | if (next) { |
| 1129 | ehci->reclaim = NULL; | 1128 | ehci->reclaim = NULL; |
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index 74f7f83b29ad..edd61ee90323 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c | |||
| @@ -542,6 +542,7 @@ static int qh_link_periodic (struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
| 542 | } | 542 | } |
| 543 | } | 543 | } |
| 544 | qh->qh_state = QH_STATE_LINKED; | 544 | qh->qh_state = QH_STATE_LINKED; |
| 545 | qh->xacterrs = 0; | ||
| 545 | qh_get (qh); | 546 | qh_get (qh); |
| 546 | 547 | ||
| 547 | /* update per-qh bandwidth for usbfs */ | 548 | /* update per-qh bandwidth for usbfs */ |
diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig index 70073b157f0a..803adcb5ac1d 100644 --- a/drivers/usb/musb/Kconfig +++ b/drivers/usb/musb/Kconfig | |||
| @@ -12,6 +12,7 @@ config USB_MUSB_HDRC | |||
| 12 | depends on !SUPERH | 12 | depends on !SUPERH |
| 13 | select NOP_USB_XCEIV if ARCH_DAVINCI | 13 | select NOP_USB_XCEIV if ARCH_DAVINCI |
| 14 | select TWL4030_USB if MACH_OMAP_3430SDP | 14 | select TWL4030_USB if MACH_OMAP_3430SDP |
| 15 | select NOP_USB_XCEIV if MACH_OMAP3EVM | ||
| 15 | select USB_OTG_UTILS | 16 | select USB_OTG_UTILS |
| 16 | tristate 'Inventra Highspeed Dual Role Controller (TI, ADI, ...)' | 17 | tristate 'Inventra Highspeed Dual Role Controller (TI, ADI, ...)' |
| 17 | help | 18 | help |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index b574878c78b2..8fec5d4455c9 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
| @@ -699,6 +699,9 @@ static struct usb_device_id id_table_combined [] = { | |||
| 699 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | 699 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
| 700 | { USB_DEVICE(LARSENBRUSGAARD_VID, LB_ALTITRACK_PID) }, | 700 | { USB_DEVICE(LARSENBRUSGAARD_VID, LB_ALTITRACK_PID) }, |
| 701 | { USB_DEVICE(GN_OTOMETRICS_VID, AURICAL_USB_PID) }, | 701 | { USB_DEVICE(GN_OTOMETRICS_VID, AURICAL_USB_PID) }, |
| 702 | { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) }, | ||
| 703 | { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID), | ||
| 704 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
| 702 | { }, /* Optional parameter entry */ | 705 | { }, /* Optional parameter entry */ |
| 703 | { } /* Terminating entry */ | 706 | { } /* Terminating entry */ |
| 704 | }; | 707 | }; |
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h index 24dbd99e87d7..8c92b88166ae 100644 --- a/drivers/usb/serial/ftdi_sio.h +++ b/drivers/usb/serial/ftdi_sio.h | |||
| @@ -954,6 +954,20 @@ | |||
| 954 | #define AURICAL_USB_PID 0x0010 /* Aurical USB Audiometer */ | 954 | #define AURICAL_USB_PID 0x0010 /* Aurical USB Audiometer */ |
| 955 | 955 | ||
| 956 | /* | 956 | /* |
| 957 | * Bayer Ascensia Contour blood glucose meter USB-converter cable. | ||
| 958 | * http://winglucofacts.com/cables/ | ||
| 959 | */ | ||
| 960 | #define BAYER_VID 0x1A79 | ||
| 961 | #define BAYER_CONTOUR_CABLE_PID 0x6001 | ||
| 962 | |||
| 963 | /* | ||
| 964 | * Marvell OpenRD Base, Client | ||
| 965 | * http://www.open-rd.org | ||
| 966 | * OpenRD Base, Client use VID 0x0403 | ||
| 967 | */ | ||
| 968 | #define MARVELL_OPENRD_PID 0x9e90 | ||
| 969 | |||
| 970 | /* | ||
| 957 | * BmRequestType: 1100 0000b | 971 | * BmRequestType: 1100 0000b |
| 958 | * bRequest: FTDI_E2_READ | 972 | * bRequest: FTDI_E2_READ |
| 959 | * wValue: 0 | 973 | * wValue: 0 |
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index 7d15bfa7c2db..3e86815b2705 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c | |||
| @@ -95,6 +95,7 @@ static struct usb_device_id id_table [] = { | |||
| 95 | { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) }, | 95 | { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) }, |
| 96 | { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) }, | 96 | { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) }, |
| 97 | { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) }, | 97 | { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) }, |
| 98 | { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) }, | ||
| 98 | { } /* Terminating entry */ | 99 | { } /* Terminating entry */ |
| 99 | }; | 100 | }; |
| 100 | 101 | ||
diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h index 12aac7d2462d..ee9505e1dd92 100644 --- a/drivers/usb/serial/pl2303.h +++ b/drivers/usb/serial/pl2303.h | |||
| @@ -126,3 +126,7 @@ | |||
| 126 | /* Cressi Edy (diving computer) PC interface */ | 126 | /* Cressi Edy (diving computer) PC interface */ |
| 127 | #define CRESSI_VENDOR_ID 0x04b8 | 127 | #define CRESSI_VENDOR_ID 0x04b8 |
| 128 | #define CRESSI_EDY_PRODUCT_ID 0x0521 | 128 | #define CRESSI_EDY_PRODUCT_ID 0x0521 |
| 129 | |||
| 130 | /* Sony, USB data cable for CMD-Jxx mobile phones */ | ||
| 131 | #define SONY_VENDOR_ID 0x054c | ||
| 132 | #define SONY_QN3USB_PRODUCT_ID 0x0437 | ||
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index 1b9c5dd0fb27..7477d411959f 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
| @@ -838,6 +838,13 @@ UNUSUAL_DEV( 0x066f, 0x8000, 0x0001, 0x0001, | |||
| 838 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 838 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
| 839 | US_FL_FIX_CAPACITY ), | 839 | US_FL_FIX_CAPACITY ), |
| 840 | 840 | ||
| 841 | /* Reported by Rogerio Brito <rbrito@ime.usp.br> */ | ||
| 842 | UNUSUAL_DEV( 0x067b, 0x2317, 0x0001, 0x001, | ||
| 843 | "Prolific Technology, Inc.", | ||
| 844 | "Mass Storage Device", | ||
| 845 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
| 846 | US_FL_NOT_LOCKABLE ), | ||
| 847 | |||
| 841 | /* Reported by Richard -=[]=- <micro_flyer@hotmail.com> */ | 848 | /* Reported by Richard -=[]=- <micro_flyer@hotmail.com> */ |
| 842 | /* Change to bcdDeviceMin (0x0100 to 0x0001) reported by | 849 | /* Change to bcdDeviceMin (0x0100 to 0x0001) reported by |
| 843 | * Thomas Bartosik <tbartdev@gmx-topmail.de> */ | 850 | * Thomas Bartosik <tbartdev@gmx-topmail.de> */ |
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c index 471a9a60376a..3a44695b9c09 100644 --- a/drivers/video/console/fbcon.c +++ b/drivers/video/console/fbcon.c | |||
| @@ -1082,7 +1082,6 @@ static void fbcon_init(struct vc_data *vc, int init) | |||
| 1082 | new_rows = FBCON_SWAP(ops->rotate, info->var.yres, info->var.xres); | 1082 | new_rows = FBCON_SWAP(ops->rotate, info->var.yres, info->var.xres); |
| 1083 | new_cols /= vc->vc_font.width; | 1083 | new_cols /= vc->vc_font.width; |
| 1084 | new_rows /= vc->vc_font.height; | 1084 | new_rows /= vc->vc_font.height; |
| 1085 | vc_resize(vc, new_cols, new_rows); | ||
| 1086 | 1085 | ||
| 1087 | /* | 1086 | /* |
| 1088 | * We must always set the mode. The mode of the previous console | 1087 | * We must always set the mode. The mode of the previous console |
| @@ -1111,10 +1110,11 @@ static void fbcon_init(struct vc_data *vc, int init) | |||
| 1111 | * vc_{cols,rows}, but we must not set those if we are only | 1110 | * vc_{cols,rows}, but we must not set those if we are only |
| 1112 | * resizing the console. | 1111 | * resizing the console. |
| 1113 | */ | 1112 | */ |
| 1114 | if (!init) { | 1113 | if (init) { |
| 1115 | vc->vc_cols = new_cols; | 1114 | vc->vc_cols = new_cols; |
| 1116 | vc->vc_rows = new_rows; | 1115 | vc->vc_rows = new_rows; |
| 1117 | } | 1116 | } else |
| 1117 | vc_resize(vc, new_cols, new_rows); | ||
| 1118 | 1118 | ||
| 1119 | if (logo) | 1119 | if (logo) |
| 1120 | fbcon_prepare_logo(vc, info, cols, rows, new_cols, new_rows); | 1120 | fbcon_prepare_logo(vc, info, cols, rows, new_cols, new_rows); |
diff --git a/drivers/video/console/fbcon_rotate.h b/drivers/video/console/fbcon_rotate.h index 75be5ce53dc5..e233444cda66 100644 --- a/drivers/video/console/fbcon_rotate.h +++ b/drivers/video/console/fbcon_rotate.h | |||
| @@ -45,7 +45,7 @@ static inline void rotate_ud(const char *in, char *out, u32 width, u32 height) | |||
| 45 | width = (width + 7) & ~7; | 45 | width = (width + 7) & ~7; |
| 46 | 46 | ||
| 47 | for (i = 0; i < height; i++) { | 47 | for (i = 0; i < height; i++) { |
| 48 | for (j = 0; j < width; j++) { | 48 | for (j = 0; j < width - shift; j++) { |
| 49 | if (pattern_test_bit(j, i, width, in)) | 49 | if (pattern_test_bit(j, i, width, in)) |
| 50 | pattern_set_bit(width - (1 + j + shift), | 50 | pattern_set_bit(width - (1 + j + shift), |
| 51 | height - (1 + i), | 51 | height - (1 + i), |
diff --git a/drivers/video/mx3fb.c b/drivers/video/mx3fb.c index f8778cde2183..054ef29be479 100644 --- a/drivers/video/mx3fb.c +++ b/drivers/video/mx3fb.c | |||
| @@ -669,7 +669,8 @@ static uint32_t bpp_to_pixfmt(int bpp) | |||
| 669 | } | 669 | } |
| 670 | 670 | ||
| 671 | static int mx3fb_blank(int blank, struct fb_info *fbi); | 671 | static int mx3fb_blank(int blank, struct fb_info *fbi); |
| 672 | static int mx3fb_map_video_memory(struct fb_info *fbi, unsigned int mem_len); | 672 | static int mx3fb_map_video_memory(struct fb_info *fbi, unsigned int mem_len, |
| 673 | bool lock); | ||
| 673 | static int mx3fb_unmap_video_memory(struct fb_info *fbi); | 674 | static int mx3fb_unmap_video_memory(struct fb_info *fbi); |
| 674 | 675 | ||
| 675 | /** | 676 | /** |
| @@ -711,12 +712,7 @@ static void mx3fb_dma_done(void *arg) | |||
| 711 | complete(&mx3_fbi->flip_cmpl); | 712 | complete(&mx3_fbi->flip_cmpl); |
| 712 | } | 713 | } |
| 713 | 714 | ||
| 714 | /** | 715 | static int __set_par(struct fb_info *fbi, bool lock) |
| 715 | * mx3fb_set_par() - set framebuffer parameters and change the operating mode. | ||
| 716 | * @fbi: framebuffer information pointer. | ||
| 717 | * @return: 0 on success or negative error code on failure. | ||
| 718 | */ | ||
| 719 | static int mx3fb_set_par(struct fb_info *fbi) | ||
| 720 | { | 716 | { |
| 721 | u32 mem_len; | 717 | u32 mem_len; |
| 722 | struct ipu_di_signal_cfg sig_cfg; | 718 | struct ipu_di_signal_cfg sig_cfg; |
| @@ -727,10 +723,6 @@ static int mx3fb_set_par(struct fb_info *fbi) | |||
| 727 | struct idmac_video_param *video = &ichan->params.video; | 723 | struct idmac_video_param *video = &ichan->params.video; |
| 728 | struct scatterlist *sg = mx3_fbi->sg; | 724 | struct scatterlist *sg = mx3_fbi->sg; |
| 729 | 725 | ||
| 730 | dev_dbg(mx3fb->dev, "%s [%c]\n", __func__, list_empty(&ichan->queue) ? '-' : '+'); | ||
| 731 | |||
| 732 | mutex_lock(&mx3_fbi->mutex); | ||
| 733 | |||
| 734 | /* Total cleanup */ | 726 | /* Total cleanup */ |
| 735 | if (mx3_fbi->txd) | 727 | if (mx3_fbi->txd) |
| 736 | sdc_disable_channel(mx3_fbi); | 728 | sdc_disable_channel(mx3_fbi); |
| @@ -742,10 +734,8 @@ static int mx3fb_set_par(struct fb_info *fbi) | |||
| 742 | if (fbi->fix.smem_start) | 734 | if (fbi->fix.smem_start) |
| 743 | mx3fb_unmap_video_memory(fbi); | 735 | mx3fb_unmap_video_memory(fbi); |
| 744 | 736 | ||
| 745 | if (mx3fb_map_video_memory(fbi, mem_len) < 0) { | 737 | if (mx3fb_map_video_memory(fbi, mem_len, lock) < 0) |
| 746 | mutex_unlock(&mx3_fbi->mutex); | ||
| 747 | return -ENOMEM; | 738 | return -ENOMEM; |
| 748 | } | ||
| 749 | } | 739 | } |
| 750 | 740 | ||
| 751 | sg_init_table(&sg[0], 1); | 741 | sg_init_table(&sg[0], 1); |
| @@ -791,7 +781,6 @@ static int mx3fb_set_par(struct fb_info *fbi) | |||
| 791 | fbi->var.vsync_len, | 781 | fbi->var.vsync_len, |
| 792 | fbi->var.lower_margin + | 782 | fbi->var.lower_margin + |
| 793 | fbi->var.vsync_len, sig_cfg) != 0) { | 783 | fbi->var.vsync_len, sig_cfg) != 0) { |
| 794 | mutex_unlock(&mx3_fbi->mutex); | ||
| 795 | dev_err(fbi->device, | 784 | dev_err(fbi->device, |
| 796 | "mx3fb: Error initializing panel.\n"); | 785 | "mx3fb: Error initializing panel.\n"); |
| 797 | return -EINVAL; | 786 | return -EINVAL; |
| @@ -810,9 +799,30 @@ static int mx3fb_set_par(struct fb_info *fbi) | |||
| 810 | if (mx3_fbi->blank == FB_BLANK_UNBLANK) | 799 | if (mx3_fbi->blank == FB_BLANK_UNBLANK) |
| 811 | sdc_enable_channel(mx3_fbi); | 800 | sdc_enable_channel(mx3_fbi); |
| 812 | 801 | ||
| 802 | return 0; | ||
| 803 | } | ||
| 804 | |||
| 805 | /** | ||
| 806 | * mx3fb_set_par() - set framebuffer parameters and change the operating mode. | ||
| 807 | * @fbi: framebuffer information pointer. | ||
| 808 | * @return: 0 on success or negative error code on failure. | ||
| 809 | */ | ||
| 810 | static int mx3fb_set_par(struct fb_info *fbi) | ||
| 811 | { | ||
| 812 | struct mx3fb_info *mx3_fbi = fbi->par; | ||
| 813 | struct mx3fb_data *mx3fb = mx3_fbi->mx3fb; | ||
| 814 | struct idmac_channel *ichan = mx3_fbi->idmac_channel; | ||
| 815 | int ret; | ||
| 816 | |||
| 817 | dev_dbg(mx3fb->dev, "%s [%c]\n", __func__, list_empty(&ichan->queue) ? '-' : '+'); | ||
| 818 | |||
| 819 | mutex_lock(&mx3_fbi->mutex); | ||
| 820 | |||
| 821 | ret = __set_par(fbi, true); | ||
| 822 | |||
| 813 | mutex_unlock(&mx3_fbi->mutex); | 823 | mutex_unlock(&mx3_fbi->mutex); |
| 814 | 824 | ||
| 815 | return 0; | 825 | return ret; |
| 816 | } | 826 | } |
| 817 | 827 | ||
| 818 | /** | 828 | /** |
| @@ -966,21 +976,11 @@ static int mx3fb_setcolreg(unsigned int regno, unsigned int red, | |||
| 966 | return ret; | 976 | return ret; |
| 967 | } | 977 | } |
| 968 | 978 | ||
| 969 | /** | 979 | static void __blank(int blank, struct fb_info *fbi) |
| 970 | * mx3fb_blank() - blank the display. | ||
| 971 | */ | ||
| 972 | static int mx3fb_blank(int blank, struct fb_info *fbi) | ||
| 973 | { | 980 | { |
| 974 | struct mx3fb_info *mx3_fbi = fbi->par; | 981 | struct mx3fb_info *mx3_fbi = fbi->par; |
| 975 | struct mx3fb_data *mx3fb = mx3_fbi->mx3fb; | 982 | struct mx3fb_data *mx3fb = mx3_fbi->mx3fb; |
| 976 | 983 | ||
| 977 | dev_dbg(fbi->device, "%s, blank = %d, base %p, len %u\n", __func__, | ||
| 978 | blank, fbi->screen_base, fbi->fix.smem_len); | ||
| 979 | |||
| 980 | if (mx3_fbi->blank == blank) | ||
| 981 | return 0; | ||
| 982 | |||
| 983 | mutex_lock(&mx3_fbi->mutex); | ||
| 984 | mx3_fbi->blank = blank; | 984 | mx3_fbi->blank = blank; |
| 985 | 985 | ||
| 986 | switch (blank) { | 986 | switch (blank) { |
| @@ -999,6 +999,23 @@ static int mx3fb_blank(int blank, struct fb_info *fbi) | |||
| 999 | sdc_set_brightness(mx3fb, mx3fb->backlight_level); | 999 | sdc_set_brightness(mx3fb, mx3fb->backlight_level); |
| 1000 | break; | 1000 | break; |
| 1001 | } | 1001 | } |
| 1002 | } | ||
| 1003 | |||
| 1004 | /** | ||
| 1005 | * mx3fb_blank() - blank the display. | ||
| 1006 | */ | ||
| 1007 | static int mx3fb_blank(int blank, struct fb_info *fbi) | ||
| 1008 | { | ||
| 1009 | struct mx3fb_info *mx3_fbi = fbi->par; | ||
| 1010 | |||
| 1011 | dev_dbg(fbi->device, "%s, blank = %d, base %p, len %u\n", __func__, | ||
| 1012 | blank, fbi->screen_base, fbi->fix.smem_len); | ||
| 1013 | |||
| 1014 | if (mx3_fbi->blank == blank) | ||
| 1015 | return 0; | ||
| 1016 | |||
| 1017 | mutex_lock(&mx3_fbi->mutex); | ||
| 1018 | __blank(blank, fbi); | ||
| 1002 | mutex_unlock(&mx3_fbi->mutex); | 1019 | mutex_unlock(&mx3_fbi->mutex); |
| 1003 | 1020 | ||
| 1004 | return 0; | 1021 | return 0; |
| @@ -1198,6 +1215,7 @@ static int mx3fb_resume(struct platform_device *pdev) | |||
| 1198 | * mx3fb_map_video_memory() - allocates the DRAM memory for the frame buffer. | 1215 | * mx3fb_map_video_memory() - allocates the DRAM memory for the frame buffer. |
| 1199 | * @fbi: framebuffer information pointer | 1216 | * @fbi: framebuffer information pointer |
| 1200 | * @mem_len: length of mapped memory | 1217 | * @mem_len: length of mapped memory |
| 1218 | * @lock: do not lock during initialisation | ||
| 1201 | * @return: Error code indicating success or failure | 1219 | * @return: Error code indicating success or failure |
| 1202 | * | 1220 | * |
| 1203 | * This buffer is remapped into a non-cached, non-buffered, memory region to | 1221 | * This buffer is remapped into a non-cached, non-buffered, memory region to |
| @@ -1205,7 +1223,8 @@ static int mx3fb_resume(struct platform_device *pdev) | |||
| 1205 | * area is remapped, all virtual memory access to the video memory should occur | 1223 | * area is remapped, all virtual memory access to the video memory should occur |
| 1206 | * at the new region. | 1224 | * at the new region. |
| 1207 | */ | 1225 | */ |
| 1208 | static int mx3fb_map_video_memory(struct fb_info *fbi, unsigned int mem_len) | 1226 | static int mx3fb_map_video_memory(struct fb_info *fbi, unsigned int mem_len, |
| 1227 | bool lock) | ||
| 1209 | { | 1228 | { |
| 1210 | int retval = 0; | 1229 | int retval = 0; |
| 1211 | dma_addr_t addr; | 1230 | dma_addr_t addr; |
| @@ -1221,10 +1240,12 @@ static int mx3fb_map_video_memory(struct fb_info *fbi, unsigned int mem_len) | |||
| 1221 | goto err0; | 1240 | goto err0; |
| 1222 | } | 1241 | } |
| 1223 | 1242 | ||
| 1224 | mutex_lock(&fbi->mm_lock); | 1243 | if (lock) |
| 1244 | mutex_lock(&fbi->mm_lock); | ||
| 1225 | fbi->fix.smem_start = addr; | 1245 | fbi->fix.smem_start = addr; |
| 1226 | fbi->fix.smem_len = mem_len; | 1246 | fbi->fix.smem_len = mem_len; |
| 1227 | mutex_unlock(&fbi->mm_lock); | 1247 | if (lock) |
| 1248 | mutex_unlock(&fbi->mm_lock); | ||
| 1228 | 1249 | ||
| 1229 | dev_dbg(fbi->device, "allocated fb @ p=0x%08x, v=0x%p, size=%d.\n", | 1250 | dev_dbg(fbi->device, "allocated fb @ p=0x%08x, v=0x%p, size=%d.\n", |
| 1230 | (uint32_t) fbi->fix.smem_start, fbi->screen_base, fbi->fix.smem_len); | 1251 | (uint32_t) fbi->fix.smem_start, fbi->screen_base, fbi->fix.smem_len); |
| @@ -1365,6 +1386,11 @@ static int init_fb_chan(struct mx3fb_data *mx3fb, struct idmac_channel *ichan) | |||
| 1365 | init_completion(&mx3fbi->flip_cmpl); | 1386 | init_completion(&mx3fbi->flip_cmpl); |
| 1366 | disable_irq(ichan->eof_irq); | 1387 | disable_irq(ichan->eof_irq); |
| 1367 | dev_dbg(mx3fb->dev, "disabling irq %d\n", ichan->eof_irq); | 1388 | dev_dbg(mx3fb->dev, "disabling irq %d\n", ichan->eof_irq); |
| 1389 | ret = __set_par(fbi, false); | ||
| 1390 | if (ret < 0) | ||
| 1391 | goto esetpar; | ||
| 1392 | |||
| 1393 | __blank(FB_BLANK_UNBLANK, fbi); | ||
| 1368 | 1394 | ||
| 1369 | dev_info(dev, "registered, using mode %s\n", fb_mode); | 1395 | dev_info(dev, "registered, using mode %s\n", fb_mode); |
| 1370 | 1396 | ||
diff --git a/drivers/video/via/hw.c b/drivers/video/via/hw.c index fcd53ceb88fa..c8960003f47d 100644 --- a/drivers/video/via/hw.c +++ b/drivers/video/via/hw.c | |||
| @@ -2407,14 +2407,14 @@ int viafb_setmode(int vmode_index, int hor_res, int ver_res, int video_bpp, | |||
| 2407 | viafb_dvi_set_mode(viafb_get_mode_index | 2407 | viafb_dvi_set_mode(viafb_get_mode_index |
| 2408 | (viaparinfo->tmds_setting_info->h_active, | 2408 | (viaparinfo->tmds_setting_info->h_active, |
| 2409 | viaparinfo->tmds_setting_info-> | 2409 | viaparinfo->tmds_setting_info-> |
| 2410 | v_active, 1), | 2410 | v_active), |
| 2411 | video_bpp1, viaparinfo-> | 2411 | video_bpp1, viaparinfo-> |
| 2412 | tmds_setting_info->iga_path); | 2412 | tmds_setting_info->iga_path); |
| 2413 | } else { | 2413 | } else { |
| 2414 | viafb_dvi_set_mode(viafb_get_mode_index | 2414 | viafb_dvi_set_mode(viafb_get_mode_index |
| 2415 | (viaparinfo->tmds_setting_info->h_active, | 2415 | (viaparinfo->tmds_setting_info->h_active, |
| 2416 | viaparinfo-> | 2416 | viaparinfo-> |
| 2417 | tmds_setting_info->v_active, 0), | 2417 | tmds_setting_info->v_active), |
| 2418 | video_bpp, viaparinfo-> | 2418 | video_bpp, viaparinfo-> |
| 2419 | tmds_setting_info->iga_path); | 2419 | tmds_setting_info->iga_path); |
| 2420 | } | 2420 | } |
diff --git a/drivers/video/via/lcd.c b/drivers/video/via/lcd.c index 6c7290a6a447..78c6b3387947 100644 --- a/drivers/video/via/lcd.c +++ b/drivers/video/via/lcd.c | |||
| @@ -580,10 +580,7 @@ static void load_lcd_k400_patch_tbl(int set_hres, int set_vres, | |||
| 580 | int reg_num = 0; | 580 | int reg_num = 0; |
| 581 | struct io_reg *lcd_patch_reg = NULL; | 581 | struct io_reg *lcd_patch_reg = NULL; |
| 582 | 582 | ||
| 583 | if (viaparinfo->lvds_setting_info->iga_path == IGA2) | 583 | vmode_index = viafb_get_mode_index(set_hres, set_vres); |
| 584 | vmode_index = viafb_get_mode_index(set_hres, set_vres, 1); | ||
| 585 | else | ||
| 586 | vmode_index = viafb_get_mode_index(set_hres, set_vres, 0); | ||
| 587 | switch (panel_id) { | 584 | switch (panel_id) { |
| 588 | /* LCD 800x600 */ | 585 | /* LCD 800x600 */ |
| 589 | case LCD_PANEL_ID1_800X600: | 586 | case LCD_PANEL_ID1_800X600: |
| @@ -761,10 +758,7 @@ static void load_lcd_p880_patch_tbl(int set_hres, int set_vres, | |||
| 761 | int reg_num = 0; | 758 | int reg_num = 0; |
| 762 | struct io_reg *lcd_patch_reg = NULL; | 759 | struct io_reg *lcd_patch_reg = NULL; |
| 763 | 760 | ||
| 764 | if (viaparinfo->lvds_setting_info->iga_path == IGA2) | 761 | vmode_index = viafb_get_mode_index(set_hres, set_vres); |
| 765 | vmode_index = viafb_get_mode_index(set_hres, set_vres, 1); | ||
| 766 | else | ||
| 767 | vmode_index = viafb_get_mode_index(set_hres, set_vres, 0); | ||
| 768 | 762 | ||
| 769 | switch (panel_id) { | 763 | switch (panel_id) { |
| 770 | case LCD_PANEL_ID5_1400X1050: | 764 | case LCD_PANEL_ID5_1400X1050: |
| @@ -832,10 +826,7 @@ static void load_lcd_patch_regs(int set_hres, int set_vres, | |||
| 832 | { | 826 | { |
| 833 | int vmode_index; | 827 | int vmode_index; |
| 834 | 828 | ||
| 835 | if (viaparinfo->lvds_setting_info->iga_path == IGA2) | 829 | vmode_index = viafb_get_mode_index(set_hres, set_vres); |
| 836 | vmode_index = viafb_get_mode_index(set_hres, set_vres, 1); | ||
| 837 | else | ||
| 838 | vmode_index = viafb_get_mode_index(set_hres, set_vres, 0); | ||
| 839 | 830 | ||
| 840 | viafb_unlock_crt(); | 831 | viafb_unlock_crt(); |
| 841 | 832 | ||
diff --git a/drivers/video/via/viafbdev.c b/drivers/video/via/viafbdev.c index a0fec298216e..72833f3334b5 100644 --- a/drivers/video/via/viafbdev.c +++ b/drivers/video/via/viafbdev.c | |||
| @@ -32,7 +32,6 @@ static u32 pseudo_pal[17]; | |||
| 32 | /* video mode */ | 32 | /* video mode */ |
| 33 | static char *viafb_mode = "640x480"; | 33 | static char *viafb_mode = "640x480"; |
| 34 | static char *viafb_mode1 = "640x480"; | 34 | static char *viafb_mode1 = "640x480"; |
| 35 | static int viafb_resMode = VIA_RES_640X480; | ||
| 36 | 35 | ||
| 37 | /* Added for specifying active devices.*/ | 36 | /* Added for specifying active devices.*/ |
| 38 | char *viafb_active_dev = ""; | 37 | char *viafb_active_dev = ""; |
| @@ -56,47 +55,47 @@ static void viafb_get_video_device(u32 *video_dev_info); | |||
| 56 | 55 | ||
| 57 | /* Mode information */ | 56 | /* Mode information */ |
| 58 | static const struct viafb_modeinfo viafb_modentry[] = { | 57 | static const struct viafb_modeinfo viafb_modentry[] = { |
| 59 | {480, 640, VIA_RES_480X640, "480x640"}, | 58 | {480, 640, VIA_RES_480X640}, |
| 60 | {640, 480, VIA_RES_640X480, "640x480"}, | 59 | {640, 480, VIA_RES_640X480}, |
| 61 | {800, 480, VIA_RES_800X480, "800x480"}, | 60 | {800, 480, VIA_RES_800X480}, |
| 62 | {800, 600, VIA_RES_800X600, "800x600"}, | 61 | {800, 600, VIA_RES_800X600}, |
| 63 | {1024, 768, VIA_RES_1024X768, "1024x768"}, | 62 | {1024, 768, VIA_RES_1024X768}, |
| 64 | {1152, 864, VIA_RES_1152X864, "1152x864"}, | 63 | {1152, 864, VIA_RES_1152X864}, |
| 65 | {1280, 1024, VIA_RES_1280X1024, "1280x1024"}, | 64 | {1280, 1024, VIA_RES_1280X1024}, |
| 66 | {1600, 1200, VIA_RES_1600X1200, "1600x1200"}, | 65 | {1600, 1200, VIA_RES_1600X1200}, |
| 67 | {1440, 1050, VIA_RES_1440X1050, "1440x1050"}, | 66 | {1440, 1050, VIA_RES_1440X1050}, |
| 68 | {1280, 768, VIA_RES_1280X768, "1280x768"}, | 67 | {1280, 768, VIA_RES_1280X768,}, |
| 69 | {1280, 800, VIA_RES_1280X800, "1280x800"}, | 68 | {1280, 800, VIA_RES_1280X800}, |
| 70 | {1280, 960, VIA_RES_1280X960, "1280x960"}, | 69 | {1280, 960, VIA_RES_1280X960}, |
| 71 | {1920, 1440, VIA_RES_1920X1440, "1920x1440"}, | 70 | {1920, 1440, VIA_RES_1920X1440}, |
| 72 | {848, 480, VIA_RES_848X480, "848x480"}, | 71 | {848, 480, VIA_RES_848X480}, |
| 73 | {1400, 1050, VIA_RES_1400X1050, "1400x1050"}, | 72 | {1400, 1050, VIA_RES_1400X1050}, |
| 74 | {720, 480, VIA_RES_720X480, "720x480"}, | 73 | {720, 480, VIA_RES_720X480}, |
| 75 | {720, 576, VIA_RES_720X576, "720x576"}, | 74 | {720, 576, VIA_RES_720X576}, |
| 76 | {1024, 512, VIA_RES_1024X512, "1024x512"}, | 75 | {1024, 512, VIA_RES_1024X512}, |
| 77 | {1024, 576, VIA_RES_1024X576, "1024x576"}, | 76 | {1024, 576, VIA_RES_1024X576}, |
| 78 | {1024, 600, VIA_RES_1024X600, "1024x600"}, | 77 | {1024, 600, VIA_RES_1024X600}, |
| 79 | {1280, 720, VIA_RES_1280X720, "1280x720"}, | 78 | {1280, 720, VIA_RES_1280X720}, |
| 80 | {1920, 1080, VIA_RES_1920X1080, "1920x1080"}, | 79 | {1920, 1080, VIA_RES_1920X1080}, |
| 81 | {1366, 768, VIA_RES_1368X768, "1368x768"}, | 80 | {1366, 768, VIA_RES_1368X768}, |
| 82 | {1680, 1050, VIA_RES_1680X1050, "1680x1050"}, | 81 | {1680, 1050, VIA_RES_1680X1050}, |
| 83 | {960, 600, VIA_RES_960X600, "960x600"}, | 82 | {960, 600, VIA_RES_960X600}, |
| 84 | {1000, 600, VIA_RES_1000X600, "1000x600"}, | 83 | {1000, 600, VIA_RES_1000X600}, |
| 85 | {1024, 576, VIA_RES_1024X576, "1024x576"}, | 84 | {1024, 576, VIA_RES_1024X576}, |
| 86 | {1024, 600, VIA_RES_1024X600, "1024x600"}, | 85 | {1024, 600, VIA_RES_1024X600}, |
| 87 | {1088, 612, VIA_RES_1088X612, "1088x612"}, | 86 | {1088, 612, VIA_RES_1088X612}, |
| 88 | {1152, 720, VIA_RES_1152X720, "1152x720"}, | 87 | {1152, 720, VIA_RES_1152X720}, |
| 89 | {1200, 720, VIA_RES_1200X720, "1200x720"}, | 88 | {1200, 720, VIA_RES_1200X720}, |
| 90 | {1280, 600, VIA_RES_1280X600, "1280x600"}, | 89 | {1280, 600, VIA_RES_1280X600}, |
| 91 | {1360, 768, VIA_RES_1360X768, "1360x768"}, | 90 | {1360, 768, VIA_RES_1360X768}, |
| 92 | {1440, 900, VIA_RES_1440X900, "1440x900"}, | 91 | {1440, 900, VIA_RES_1440X900}, |
| 93 | {1600, 900, VIA_RES_1600X900, "1600x900"}, | 92 | {1600, 900, VIA_RES_1600X900}, |
| 94 | {1600, 1024, VIA_RES_1600X1024, "1600x1024"}, | 93 | {1600, 1024, VIA_RES_1600X1024}, |
| 95 | {1792, 1344, VIA_RES_1792X1344, "1792x1344"}, | 94 | {1792, 1344, VIA_RES_1792X1344}, |
| 96 | {1856, 1392, VIA_RES_1856X1392, "1856x1392"}, | 95 | {1856, 1392, VIA_RES_1856X1392}, |
| 97 | {1920, 1200, VIA_RES_1920X1200, "1920x1200"}, | 96 | {1920, 1200, VIA_RES_1920X1200}, |
| 98 | {2048, 1536, VIA_RES_2048X1536, "2048x1536"}, | 97 | {2048, 1536, VIA_RES_2048X1536}, |
| 99 | {0, 0, VIA_RES_INVALID, "640x480"} | 98 | {0, 0, VIA_RES_INVALID} |
| 100 | }; | 99 | }; |
| 101 | 100 | ||
| 102 | static struct fb_ops viafb_ops; | 101 | static struct fb_ops viafb_ops; |
| @@ -177,7 +176,7 @@ static int viafb_check_var(struct fb_var_screeninfo *var, | |||
| 177 | if (var->vmode & FB_VMODE_INTERLACED || var->vmode & FB_VMODE_DOUBLE) | 176 | if (var->vmode & FB_VMODE_INTERLACED || var->vmode & FB_VMODE_DOUBLE) |
| 178 | return -EINVAL; | 177 | return -EINVAL; |
| 179 | 178 | ||
| 180 | vmode_index = viafb_get_mode_index(var->xres, var->yres, 0); | 179 | vmode_index = viafb_get_mode_index(var->xres, var->yres); |
| 181 | if (vmode_index == VIA_RES_INVALID) { | 180 | if (vmode_index == VIA_RES_INVALID) { |
| 182 | DEBUG_MSG(KERN_INFO | 181 | DEBUG_MSG(KERN_INFO |
| 183 | "viafb: Mode %dx%dx%d not supported!!\n", | 182 | "viafb: Mode %dx%dx%d not supported!!\n", |
| @@ -233,14 +232,14 @@ static int viafb_set_par(struct fb_info *info) | |||
| 233 | viafb_update_device_setting(info->var.xres, info->var.yres, | 232 | viafb_update_device_setting(info->var.xres, info->var.yres, |
| 234 | info->var.bits_per_pixel, viafb_refresh, 0); | 233 | info->var.bits_per_pixel, viafb_refresh, 0); |
| 235 | 234 | ||
| 236 | vmode_index = viafb_get_mode_index(info->var.xres, info->var.yres, 0); | 235 | vmode_index = viafb_get_mode_index(info->var.xres, info->var.yres); |
| 237 | 236 | ||
| 238 | if (viafb_SAMM_ON == 1) { | 237 | if (viafb_SAMM_ON == 1) { |
| 239 | DEBUG_MSG(KERN_INFO | 238 | DEBUG_MSG(KERN_INFO |
| 240 | "viafb_second_xres = %d, viafb_second_yres = %d, bpp = %d\n", | 239 | "viafb_second_xres = %d, viafb_second_yres = %d, bpp = %d\n", |
| 241 | viafb_second_xres, viafb_second_yres, viafb_bpp1); | 240 | viafb_second_xres, viafb_second_yres, viafb_bpp1); |
| 242 | vmode_index1 = viafb_get_mode_index(viafb_second_xres, | 241 | vmode_index1 = viafb_get_mode_index(viafb_second_xres, |
| 243 | viafb_second_yres, 1); | 242 | viafb_second_yres); |
| 244 | DEBUG_MSG(KERN_INFO "->viafb_SAMM_ON: index=%d\n", | 243 | DEBUG_MSG(KERN_INFO "->viafb_SAMM_ON: index=%d\n", |
| 245 | vmode_index1); | 244 | vmode_index1); |
| 246 | 245 | ||
| @@ -1262,7 +1261,7 @@ static int viafb_sync(struct fb_info *info) | |||
| 1262 | return 0; | 1261 | return 0; |
| 1263 | } | 1262 | } |
| 1264 | 1263 | ||
| 1265 | int viafb_get_mode_index(int hres, int vres, int flag) | 1264 | int viafb_get_mode_index(int hres, int vres) |
| 1266 | { | 1265 | { |
| 1267 | u32 i; | 1266 | u32 i; |
| 1268 | DEBUG_MSG(KERN_INFO "viafb_get_mode_index!\n"); | 1267 | DEBUG_MSG(KERN_INFO "viafb_get_mode_index!\n"); |
| @@ -1272,13 +1271,7 @@ int viafb_get_mode_index(int hres, int vres, int flag) | |||
| 1272 | viafb_modentry[i].yres == vres) | 1271 | viafb_modentry[i].yres == vres) |
| 1273 | break; | 1272 | break; |
| 1274 | 1273 | ||
| 1275 | viafb_resMode = viafb_modentry[i].mode_index; | 1274 | return viafb_modentry[i].mode_index; |
| 1276 | if (flag) | ||
| 1277 | viafb_mode1 = viafb_modentry[i].mode_res; | ||
| 1278 | else | ||
| 1279 | viafb_mode = viafb_modentry[i].mode_res; | ||
| 1280 | |||
| 1281 | return viafb_resMode; | ||
| 1282 | } | 1275 | } |
| 1283 | 1276 | ||
| 1284 | static void check_available_device_to_enable(int device_id) | 1277 | static void check_available_device_to_enable(int device_id) |
| @@ -2199,7 +2192,7 @@ static int __devinit via_pci_probe(void) | |||
| 2199 | strict_strtoul(tmpc, 0, &default_xres); | 2192 | strict_strtoul(tmpc, 0, &default_xres); |
| 2200 | strict_strtoul(tmpm, 0, &default_yres); | 2193 | strict_strtoul(tmpm, 0, &default_yres); |
| 2201 | 2194 | ||
| 2202 | vmode_index = viafb_get_mode_index(default_xres, default_yres, 0); | 2195 | vmode_index = viafb_get_mode_index(default_xres, default_yres); |
| 2203 | DEBUG_MSG(KERN_INFO "0->index=%d\n", vmode_index); | 2196 | DEBUG_MSG(KERN_INFO "0->index=%d\n", vmode_index); |
| 2204 | 2197 | ||
| 2205 | if (viafb_SAMM_ON == 1) { | 2198 | if (viafb_SAMM_ON == 1) { |
diff --git a/drivers/video/via/viafbdev.h b/drivers/video/via/viafbdev.h index a4158e872878..227b000feb38 100644 --- a/drivers/video/via/viafbdev.h +++ b/drivers/video/via/viafbdev.h | |||
| @@ -81,7 +81,6 @@ struct viafb_modeinfo { | |||
| 81 | u32 xres; | 81 | u32 xres; |
| 82 | u32 yres; | 82 | u32 yres; |
| 83 | int mode_index; | 83 | int mode_index; |
| 84 | char *mode_res; | ||
| 85 | }; | 84 | }; |
| 86 | extern unsigned int viafb_second_virtual_yres; | 85 | extern unsigned int viafb_second_virtual_yres; |
| 87 | extern unsigned int viafb_second_virtual_xres; | 86 | extern unsigned int viafb_second_virtual_xres; |
| @@ -102,7 +101,7 @@ extern int strict_strtoul(const char *cp, unsigned int base, | |||
| 102 | void viafb_memory_pitch_patch(struct fb_info *info); | 101 | void viafb_memory_pitch_patch(struct fb_info *info); |
| 103 | void viafb_fill_var_timing_info(struct fb_var_screeninfo *var, int refresh, | 102 | void viafb_fill_var_timing_info(struct fb_var_screeninfo *var, int refresh, |
| 104 | int mode_index); | 103 | int mode_index); |
| 105 | int viafb_get_mode_index(int hres, int vres, int flag); | 104 | int viafb_get_mode_index(int hres, int vres); |
| 106 | u8 viafb_gpio_i2c_read_lvds(struct lvds_setting_information | 105 | u8 viafb_gpio_i2c_read_lvds(struct lvds_setting_information |
| 107 | *plvds_setting_info, struct lvds_chip_information | 106 | *plvds_setting_info, struct lvds_chip_information |
| 108 | *plvds_chip_info, u8 index); | 107 | *plvds_chip_info, u8 index); |
diff --git a/drivers/w1/masters/omap_hdq.c b/drivers/w1/masters/omap_hdq.c index a7e3b706b9d3..0d92969404c3 100644 --- a/drivers/w1/masters/omap_hdq.c +++ b/drivers/w1/masters/omap_hdq.c | |||
| @@ -687,6 +687,7 @@ static int omap_hdq_remove(struct platform_device *pdev) | |||
| 687 | 687 | ||
| 688 | if (hdq_data->hdq_usecount) { | 688 | if (hdq_data->hdq_usecount) { |
| 689 | dev_dbg(&pdev->dev, "removed when use count is not zero\n"); | 689 | dev_dbg(&pdev->dev, "removed when use count is not zero\n"); |
| 690 | mutex_unlock(&hdq_data->hdq_mutex); | ||
| 690 | return -EBUSY; | 691 | return -EBUSY; |
| 691 | } | 692 | } |
| 692 | 693 | ||
diff --git a/drivers/watchdog/ks8695_wdt.c b/drivers/watchdog/ks8695_wdt.c index 00b03eb43bf0..e1c82769b08e 100644 --- a/drivers/watchdog/ks8695_wdt.c +++ b/drivers/watchdog/ks8695_wdt.c | |||
| @@ -66,7 +66,7 @@ static inline void ks8695_wdt_stop(void) | |||
| 66 | static inline void ks8695_wdt_start(void) | 66 | static inline void ks8695_wdt_start(void) |
| 67 | { | 67 | { |
| 68 | unsigned long tmcon; | 68 | unsigned long tmcon; |
| 69 | unsigned long tval = wdt_time * CLOCK_TICK_RATE; | 69 | unsigned long tval = wdt_time * KS8695_CLOCK_RATE; |
| 70 | 70 | ||
| 71 | spin_lock(&ks8695_lock); | 71 | spin_lock(&ks8695_lock); |
| 72 | /* disable timer0 */ | 72 | /* disable timer0 */ |
| @@ -103,7 +103,7 @@ static inline void ks8695_wdt_reload(void) | |||
| 103 | static int ks8695_wdt_settimeout(int new_time) | 103 | static int ks8695_wdt_settimeout(int new_time) |
| 104 | { | 104 | { |
| 105 | /* | 105 | /* |
| 106 | * All counting occurs at SLOW_CLOCK / 128 = 0.256 Hz | 106 | * All counting occurs at KS8695_CLOCK_RATE / 128 = 0.256 Hz |
| 107 | * | 107 | * |
| 108 | * Since WDV is a 16-bit counter, the maximum period is | 108 | * Since WDV is a 16-bit counter, the maximum period is |
| 109 | * 65536 / 0.256 = 256 seconds. | 109 | * 65536 / 0.256 = 256 seconds. |
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c index 697f6b5f1313..e92f229e3c6e 100644 --- a/fs/binfmt_flat.c +++ b/fs/binfmt_flat.c | |||
| @@ -828,15 +828,22 @@ static int load_flat_shared_library(int id, struct lib_info *libs) | |||
| 828 | if (IS_ERR(bprm.file)) | 828 | if (IS_ERR(bprm.file)) |
| 829 | return res; | 829 | return res; |
| 830 | 830 | ||
| 831 | bprm.cred = prepare_exec_creds(); | ||
| 832 | res = -ENOMEM; | ||
| 833 | if (!bprm.cred) | ||
| 834 | goto out; | ||
| 835 | |||
| 831 | res = prepare_binprm(&bprm); | 836 | res = prepare_binprm(&bprm); |
| 832 | 837 | ||
| 833 | if (res <= (unsigned long)-4096) | 838 | if (res <= (unsigned long)-4096) |
| 834 | res = load_flat_file(&bprm, libs, id, NULL); | 839 | res = load_flat_file(&bprm, libs, id, NULL); |
| 835 | if (bprm.file) { | 840 | |
| 836 | allow_write_access(bprm.file); | 841 | abort_creds(bprm.cred); |
| 837 | fput(bprm.file); | 842 | |
| 838 | bprm.file = NULL; | 843 | out: |
| 839 | } | 844 | allow_write_access(bprm.file); |
| 845 | fput(bprm.file); | ||
| 846 | |||
| 840 | return(res); | 847 | return(res); |
| 841 | } | 848 | } |
| 842 | 849 | ||
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index dc84daee6bc4..72a2b9c28e9f 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -265,10 +265,6 @@ static int caching_kthread(void *data) | |||
| 265 | 265 | ||
| 266 | atomic_inc(&block_group->space_info->caching_threads); | 266 | atomic_inc(&block_group->space_info->caching_threads); |
| 267 | last = max_t(u64, block_group->key.objectid, BTRFS_SUPER_INFO_OFFSET); | 267 | last = max_t(u64, block_group->key.objectid, BTRFS_SUPER_INFO_OFFSET); |
| 268 | again: | ||
| 269 | /* need to make sure the commit_root doesn't disappear */ | ||
| 270 | down_read(&fs_info->extent_commit_sem); | ||
| 271 | |||
| 272 | /* | 268 | /* |
| 273 | * We don't want to deadlock with somebody trying to allocate a new | 269 | * We don't want to deadlock with somebody trying to allocate a new |
| 274 | * extent for the extent root while also trying to search the extent | 270 | * extent for the extent root while also trying to search the extent |
| @@ -282,6 +278,10 @@ again: | |||
| 282 | key.objectid = last; | 278 | key.objectid = last; |
| 283 | key.offset = 0; | 279 | key.offset = 0; |
| 284 | btrfs_set_key_type(&key, BTRFS_EXTENT_ITEM_KEY); | 280 | btrfs_set_key_type(&key, BTRFS_EXTENT_ITEM_KEY); |
| 281 | again: | ||
| 282 | /* need to make sure the commit_root doesn't disappear */ | ||
| 283 | down_read(&fs_info->extent_commit_sem); | ||
| 284 | |||
| 285 | ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, path, 0, 0); | 285 | ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, path, 0, 0); |
| 286 | if (ret < 0) | 286 | if (ret < 0) |
| 287 | goto err; | 287 | goto err; |
| @@ -304,6 +304,19 @@ again: | |||
| 304 | 304 | ||
| 305 | if (need_resched() || | 305 | if (need_resched() || |
| 306 | btrfs_transaction_in_commit(fs_info)) { | 306 | btrfs_transaction_in_commit(fs_info)) { |
| 307 | leaf = path->nodes[0]; | ||
| 308 | |||
| 309 | /* this shouldn't happen, but if the | ||
| 310 | * leaf is empty just move on. | ||
| 311 | */ | ||
| 312 | if (btrfs_header_nritems(leaf) == 0) | ||
| 313 | break; | ||
| 314 | /* | ||
| 315 | * we need to copy the key out so that | ||
| 316 | * we are sure the next search advances | ||
| 317 | * us forward in the btree. | ||
| 318 | */ | ||
| 319 | btrfs_item_key_to_cpu(leaf, &key, 0); | ||
| 307 | btrfs_release_path(fs_info->extent_root, path); | 320 | btrfs_release_path(fs_info->extent_root, path); |
| 308 | up_read(&fs_info->extent_commit_sem); | 321 | up_read(&fs_info->extent_commit_sem); |
| 309 | schedule_timeout(1); | 322 | schedule_timeout(1); |
diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index af99b78b288e..5edcee3a617f 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c | |||
| @@ -414,11 +414,29 @@ static noinline int remove_from_bitmap(struct btrfs_block_group_cache *block_gro | |||
| 414 | u64 *offset, u64 *bytes) | 414 | u64 *offset, u64 *bytes) |
| 415 | { | 415 | { |
| 416 | u64 end; | 416 | u64 end; |
| 417 | u64 search_start, search_bytes; | ||
| 418 | int ret; | ||
| 417 | 419 | ||
| 418 | again: | 420 | again: |
| 419 | end = bitmap_info->offset + | 421 | end = bitmap_info->offset + |
| 420 | (u64)(BITS_PER_BITMAP * block_group->sectorsize) - 1; | 422 | (u64)(BITS_PER_BITMAP * block_group->sectorsize) - 1; |
| 421 | 423 | ||
| 424 | /* | ||
| 425 | * XXX - this can go away after a few releases. | ||
| 426 | * | ||
| 427 | * since the only user of btrfs_remove_free_space is the tree logging | ||
| 428 | * stuff, and the only way to test that is under crash conditions, we | ||
| 429 | * want to have this debug stuff here just in case somethings not | ||
| 430 | * working. Search the bitmap for the space we are trying to use to | ||
| 431 | * make sure its actually there. If its not there then we need to stop | ||
| 432 | * because something has gone wrong. | ||
| 433 | */ | ||
| 434 | search_start = *offset; | ||
| 435 | search_bytes = *bytes; | ||
| 436 | ret = search_bitmap(block_group, bitmap_info, &search_start, | ||
| 437 | &search_bytes); | ||
| 438 | BUG_ON(ret < 0 || search_start != *offset); | ||
| 439 | |||
| 422 | if (*offset > bitmap_info->offset && *offset + *bytes > end) { | 440 | if (*offset > bitmap_info->offset && *offset + *bytes > end) { |
| 423 | bitmap_clear_bits(block_group, bitmap_info, *offset, | 441 | bitmap_clear_bits(block_group, bitmap_info, *offset, |
| 424 | end - *offset + 1); | 442 | end - *offset + 1); |
| @@ -430,6 +448,7 @@ again: | |||
| 430 | } | 448 | } |
| 431 | 449 | ||
| 432 | if (*bytes) { | 450 | if (*bytes) { |
| 451 | struct rb_node *next = rb_next(&bitmap_info->offset_index); | ||
| 433 | if (!bitmap_info->bytes) { | 452 | if (!bitmap_info->bytes) { |
| 434 | unlink_free_space(block_group, bitmap_info); | 453 | unlink_free_space(block_group, bitmap_info); |
| 435 | kfree(bitmap_info->bitmap); | 454 | kfree(bitmap_info->bitmap); |
| @@ -438,16 +457,36 @@ again: | |||
| 438 | recalculate_thresholds(block_group); | 457 | recalculate_thresholds(block_group); |
| 439 | } | 458 | } |
| 440 | 459 | ||
| 441 | bitmap_info = tree_search_offset(block_group, | 460 | /* |
| 442 | offset_to_bitmap(block_group, | 461 | * no entry after this bitmap, but we still have bytes to |
| 443 | *offset), | 462 | * remove, so something has gone wrong. |
| 444 | 1, 0); | 463 | */ |
| 445 | if (!bitmap_info) | 464 | if (!next) |
| 446 | return -EINVAL; | 465 | return -EINVAL; |
| 447 | 466 | ||
| 467 | bitmap_info = rb_entry(next, struct btrfs_free_space, | ||
| 468 | offset_index); | ||
| 469 | |||
| 470 | /* | ||
| 471 | * if the next entry isn't a bitmap we need to return to let the | ||
| 472 | * extent stuff do its work. | ||
| 473 | */ | ||
| 448 | if (!bitmap_info->bitmap) | 474 | if (!bitmap_info->bitmap) |
| 449 | return -EAGAIN; | 475 | return -EAGAIN; |
| 450 | 476 | ||
| 477 | /* | ||
| 478 | * Ok the next item is a bitmap, but it may not actually hold | ||
| 479 | * the information for the rest of this free space stuff, so | ||
| 480 | * look for it, and if we don't find it return so we can try | ||
| 481 | * everything over again. | ||
| 482 | */ | ||
| 483 | search_start = *offset; | ||
| 484 | search_bytes = *bytes; | ||
| 485 | ret = search_bitmap(block_group, bitmap_info, &search_start, | ||
| 486 | &search_bytes); | ||
| 487 | if (ret < 0 || search_start != *offset) | ||
| 488 | return -EAGAIN; | ||
| 489 | |||
| 451 | goto again; | 490 | goto again; |
| 452 | } else if (!bitmap_info->bytes) { | 491 | } else if (!bitmap_info->bytes) { |
| 453 | unlink_free_space(block_group, bitmap_info); | 492 | unlink_free_space(block_group, bitmap_info); |
| @@ -644,8 +683,17 @@ int btrfs_remove_free_space(struct btrfs_block_group_cache *block_group, | |||
| 644 | again: | 683 | again: |
| 645 | info = tree_search_offset(block_group, offset, 0, 0); | 684 | info = tree_search_offset(block_group, offset, 0, 0); |
| 646 | if (!info) { | 685 | if (!info) { |
| 647 | WARN_ON(1); | 686 | /* |
| 648 | goto out_lock; | 687 | * oops didn't find an extent that matched the space we wanted |
| 688 | * to remove, look for a bitmap instead | ||
| 689 | */ | ||
| 690 | info = tree_search_offset(block_group, | ||
| 691 | offset_to_bitmap(block_group, offset), | ||
| 692 | 1, 0); | ||
| 693 | if (!info) { | ||
| 694 | WARN_ON(1); | ||
| 695 | goto out_lock; | ||
| 696 | } | ||
| 649 | } | 697 | } |
| 650 | 698 | ||
| 651 | if (info->bytes < bytes && rb_next(&info->offset_index)) { | 699 | if (info->bytes < bytes && rb_next(&info->offset_index)) { |
| @@ -957,8 +1005,15 @@ static u64 btrfs_alloc_from_bitmap(struct btrfs_block_group_cache *block_group, | |||
| 957 | if (cluster->block_group != block_group) | 1005 | if (cluster->block_group != block_group) |
| 958 | goto out; | 1006 | goto out; |
| 959 | 1007 | ||
| 960 | entry = tree_search_offset(block_group, search_start, 0, 0); | 1008 | /* |
| 961 | 1009 | * search_start is the beginning of the bitmap, but at some point it may | |
| 1010 | * be a good idea to point to the actual start of the free area in the | ||
| 1011 | * bitmap, so do the offset_to_bitmap trick anyway, and set bitmap_only | ||
| 1012 | * to 1 to make sure we get the bitmap entry | ||
| 1013 | */ | ||
| 1014 | entry = tree_search_offset(block_group, | ||
| 1015 | offset_to_bitmap(block_group, search_start), | ||
| 1016 | 1, 0); | ||
| 962 | if (!entry || !entry->bitmap) | 1017 | if (!entry || !entry->bitmap) |
| 963 | goto out; | 1018 | goto out; |
| 964 | 1019 | ||
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 56fe83fa60c4..272b9b2bea86 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -4785,8 +4785,7 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 4785 | * and the replacement file is large. Start IO on it now so | 4785 | * and the replacement file is large. Start IO on it now so |
| 4786 | * we don't add too much work to the end of the transaction | 4786 | * we don't add too much work to the end of the transaction |
| 4787 | */ | 4787 | */ |
| 4788 | if (new_inode && old_inode && S_ISREG(old_inode->i_mode) && | 4788 | if (new_inode && S_ISREG(old_inode->i_mode) && new_inode->i_size && |
| 4789 | new_inode->i_size && | ||
| 4790 | old_inode->i_size > BTRFS_ORDERED_OPERATIONS_FLUSH_LIMIT) | 4789 | old_inode->i_size > BTRFS_ORDERED_OPERATIONS_FLUSH_LIMIT) |
| 4791 | filemap_flush(old_inode->i_mapping); | 4790 | filemap_flush(old_inode->i_mapping); |
| 4792 | 4791 | ||
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index e71264d1c2c9..c04f7f212602 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c | |||
| @@ -2553,8 +2553,13 @@ int relocate_inode_pages(struct inode *inode, u64 start, u64 len) | |||
| 2553 | last_index = (start + len - 1) >> PAGE_CACHE_SHIFT; | 2553 | last_index = (start + len - 1) >> PAGE_CACHE_SHIFT; |
| 2554 | 2554 | ||
| 2555 | /* make sure the dirty trick played by the caller work */ | 2555 | /* make sure the dirty trick played by the caller work */ |
| 2556 | ret = invalidate_inode_pages2_range(inode->i_mapping, | 2556 | while (1) { |
| 2557 | first_index, last_index); | 2557 | ret = invalidate_inode_pages2_range(inode->i_mapping, |
| 2558 | first_index, last_index); | ||
| 2559 | if (ret != -EBUSY) | ||
| 2560 | break; | ||
| 2561 | schedule_timeout(HZ/10); | ||
| 2562 | } | ||
| 2558 | if (ret) | 2563 | if (ret) |
| 2559 | goto out_unlock; | 2564 | goto out_unlock; |
| 2560 | 2565 | ||
diff --git a/fs/btrfs/zlib.c b/fs/btrfs/zlib.c index ecfbce836d32..3e2b90eaa239 100644 --- a/fs/btrfs/zlib.c +++ b/fs/btrfs/zlib.c | |||
| @@ -208,7 +208,7 @@ int btrfs_zlib_compress_pages(struct address_space *mapping, | |||
| 208 | *total_in = 0; | 208 | *total_in = 0; |
| 209 | 209 | ||
| 210 | workspace = find_zlib_workspace(); | 210 | workspace = find_zlib_workspace(); |
| 211 | if (!workspace) | 211 | if (IS_ERR(workspace)) |
| 212 | return -1; | 212 | return -1; |
| 213 | 213 | ||
| 214 | if (Z_OK != zlib_deflateInit(&workspace->def_strm, 3)) { | 214 | if (Z_OK != zlib_deflateInit(&workspace->def_strm, 3)) { |
| @@ -366,7 +366,7 @@ int btrfs_zlib_decompress_biovec(struct page **pages_in, | |||
| 366 | char *kaddr; | 366 | char *kaddr; |
| 367 | 367 | ||
| 368 | workspace = find_zlib_workspace(); | 368 | workspace = find_zlib_workspace(); |
| 369 | if (!workspace) | 369 | if (IS_ERR(workspace)) |
| 370 | return -ENOMEM; | 370 | return -ENOMEM; |
| 371 | 371 | ||
| 372 | data_in = kmap(pages_in[page_in_index]); | 372 | data_in = kmap(pages_in[page_in_index]); |
| @@ -547,7 +547,7 @@ int btrfs_zlib_decompress(unsigned char *data_in, | |||
| 547 | return -ENOMEM; | 547 | return -ENOMEM; |
| 548 | 548 | ||
| 549 | workspace = find_zlib_workspace(); | 549 | workspace = find_zlib_workspace(); |
| 550 | if (!workspace) | 550 | if (IS_ERR(workspace)) |
| 551 | return -ENOMEM; | 551 | return -ENOMEM; |
| 552 | 552 | ||
| 553 | workspace->inf_strm.next_in = data_in; | 553 | workspace->inf_strm.next_in = data_in; |
diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c index f28f070a60fc..f91fd51b32e3 100644 --- a/fs/compat_ioctl.c +++ b/fs/compat_ioctl.c | |||
| @@ -1905,6 +1905,7 @@ COMPATIBLE_IOCTL(FIONCLEX) | |||
| 1905 | COMPATIBLE_IOCTL(FIOASYNC) | 1905 | COMPATIBLE_IOCTL(FIOASYNC) |
| 1906 | COMPATIBLE_IOCTL(FIONBIO) | 1906 | COMPATIBLE_IOCTL(FIONBIO) |
| 1907 | COMPATIBLE_IOCTL(FIONREAD) /* This is also TIOCINQ */ | 1907 | COMPATIBLE_IOCTL(FIONREAD) /* This is also TIOCINQ */ |
| 1908 | COMPATIBLE_IOCTL(FS_IOC_FIEMAP) | ||
| 1908 | /* 0x00 */ | 1909 | /* 0x00 */ |
| 1909 | COMPATIBLE_IOCTL(FIBMAP) | 1910 | COMPATIBLE_IOCTL(FIBMAP) |
| 1910 | COMPATIBLE_IOCTL(FIGETBSZ) | 1911 | COMPATIBLE_IOCTL(FIGETBSZ) |
diff --git a/fs/inode.c b/fs/inode.c index 901bad1e5f12..ae7b67e48661 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
| @@ -120,12 +120,11 @@ static void wake_up_inode(struct inode *inode) | |||
| 120 | * These are initializations that need to be done on every inode | 120 | * These are initializations that need to be done on every inode |
| 121 | * allocation as the fields are not initialised by slab allocation. | 121 | * allocation as the fields are not initialised by slab allocation. |
| 122 | */ | 122 | */ |
| 123 | struct inode *inode_init_always(struct super_block *sb, struct inode *inode) | 123 | int inode_init_always(struct super_block *sb, struct inode *inode) |
| 124 | { | 124 | { |
| 125 | static const struct address_space_operations empty_aops; | 125 | static const struct address_space_operations empty_aops; |
| 126 | static struct inode_operations empty_iops; | 126 | static struct inode_operations empty_iops; |
| 127 | static const struct file_operations empty_fops; | 127 | static const struct file_operations empty_fops; |
| 128 | |||
| 129 | struct address_space *const mapping = &inode->i_data; | 128 | struct address_space *const mapping = &inode->i_data; |
| 130 | 129 | ||
| 131 | inode->i_sb = sb; | 130 | inode->i_sb = sb; |
| @@ -152,7 +151,7 @@ struct inode *inode_init_always(struct super_block *sb, struct inode *inode) | |||
| 152 | inode->dirtied_when = 0; | 151 | inode->dirtied_when = 0; |
| 153 | 152 | ||
| 154 | if (security_inode_alloc(inode)) | 153 | if (security_inode_alloc(inode)) |
| 155 | goto out_free_inode; | 154 | goto out; |
| 156 | 155 | ||
| 157 | /* allocate and initialize an i_integrity */ | 156 | /* allocate and initialize an i_integrity */ |
| 158 | if (ima_inode_alloc(inode)) | 157 | if (ima_inode_alloc(inode)) |
| @@ -198,16 +197,12 @@ struct inode *inode_init_always(struct super_block *sb, struct inode *inode) | |||
| 198 | inode->i_fsnotify_mask = 0; | 197 | inode->i_fsnotify_mask = 0; |
| 199 | #endif | 198 | #endif |
| 200 | 199 | ||
| 201 | return inode; | 200 | return 0; |
| 202 | 201 | ||
| 203 | out_free_security: | 202 | out_free_security: |
| 204 | security_inode_free(inode); | 203 | security_inode_free(inode); |
| 205 | out_free_inode: | 204 | out: |
| 206 | if (inode->i_sb->s_op->destroy_inode) | 205 | return -ENOMEM; |
| 207 | inode->i_sb->s_op->destroy_inode(inode); | ||
| 208 | else | ||
| 209 | kmem_cache_free(inode_cachep, (inode)); | ||
| 210 | return NULL; | ||
| 211 | } | 206 | } |
| 212 | EXPORT_SYMBOL(inode_init_always); | 207 | EXPORT_SYMBOL(inode_init_always); |
| 213 | 208 | ||
| @@ -220,12 +215,21 @@ static struct inode *alloc_inode(struct super_block *sb) | |||
| 220 | else | 215 | else |
| 221 | inode = kmem_cache_alloc(inode_cachep, GFP_KERNEL); | 216 | inode = kmem_cache_alloc(inode_cachep, GFP_KERNEL); |
| 222 | 217 | ||
| 223 | if (inode) | 218 | if (!inode) |
| 224 | return inode_init_always(sb, inode); | 219 | return NULL; |
| 225 | return NULL; | 220 | |
| 221 | if (unlikely(inode_init_always(sb, inode))) { | ||
| 222 | if (inode->i_sb->s_op->destroy_inode) | ||
| 223 | inode->i_sb->s_op->destroy_inode(inode); | ||
| 224 | else | ||
| 225 | kmem_cache_free(inode_cachep, inode); | ||
| 226 | return NULL; | ||
| 227 | } | ||
| 228 | |||
| 229 | return inode; | ||
| 226 | } | 230 | } |
| 227 | 231 | ||
| 228 | void destroy_inode(struct inode *inode) | 232 | void __destroy_inode(struct inode *inode) |
| 229 | { | 233 | { |
| 230 | BUG_ON(inode_has_buffers(inode)); | 234 | BUG_ON(inode_has_buffers(inode)); |
| 231 | ima_inode_free(inode); | 235 | ima_inode_free(inode); |
| @@ -237,13 +241,17 @@ void destroy_inode(struct inode *inode) | |||
| 237 | if (inode->i_default_acl && inode->i_default_acl != ACL_NOT_CACHED) | 241 | if (inode->i_default_acl && inode->i_default_acl != ACL_NOT_CACHED) |
| 238 | posix_acl_release(inode->i_default_acl); | 242 | posix_acl_release(inode->i_default_acl); |
| 239 | #endif | 243 | #endif |
| 244 | } | ||
| 245 | EXPORT_SYMBOL(__destroy_inode); | ||
| 246 | |||
| 247 | void destroy_inode(struct inode *inode) | ||
| 248 | { | ||
| 249 | __destroy_inode(inode); | ||
| 240 | if (inode->i_sb->s_op->destroy_inode) | 250 | if (inode->i_sb->s_op->destroy_inode) |
| 241 | inode->i_sb->s_op->destroy_inode(inode); | 251 | inode->i_sb->s_op->destroy_inode(inode); |
| 242 | else | 252 | else |
| 243 | kmem_cache_free(inode_cachep, (inode)); | 253 | kmem_cache_free(inode_cachep, (inode)); |
| 244 | } | 254 | } |
| 245 | EXPORT_SYMBOL(destroy_inode); | ||
| 246 | |||
| 247 | 255 | ||
| 248 | /* | 256 | /* |
| 249 | * These are initializations that only need to be done | 257 | * These are initializations that only need to be done |
diff --git a/fs/jffs2/file.c b/fs/jffs2/file.c index 5edc2bf20581..23c947539864 100644 --- a/fs/jffs2/file.c +++ b/fs/jffs2/file.c | |||
| @@ -99,7 +99,7 @@ static int jffs2_do_readpage_nolock (struct inode *inode, struct page *pg) | |||
| 99 | kunmap(pg); | 99 | kunmap(pg); |
| 100 | 100 | ||
| 101 | D2(printk(KERN_DEBUG "readpage finished\n")); | 101 | D2(printk(KERN_DEBUG "readpage finished\n")); |
| 102 | return 0; | 102 | return ret; |
| 103 | } | 103 | } |
| 104 | 104 | ||
| 105 | int jffs2_do_readpage_unlock(struct inode *inode, struct page *pg) | 105 | int jffs2_do_readpage_unlock(struct inode *inode, struct page *pg) |
diff --git a/fs/namespace.c b/fs/namespace.c index 277c28a63ead..7230787d18b0 100644 --- a/fs/namespace.c +++ b/fs/namespace.c | |||
| @@ -316,7 +316,8 @@ EXPORT_SYMBOL_GPL(mnt_clone_write); | |||
| 316 | */ | 316 | */ |
| 317 | int mnt_want_write_file(struct file *file) | 317 | int mnt_want_write_file(struct file *file) |
| 318 | { | 318 | { |
| 319 | if (!(file->f_mode & FMODE_WRITE)) | 319 | struct inode *inode = file->f_dentry->d_inode; |
| 320 | if (!(file->f_mode & FMODE_WRITE) || special_file(inode->i_mode)) | ||
| 320 | return mnt_want_write(file->f_path.mnt); | 321 | return mnt_want_write(file->f_path.mnt); |
| 321 | else | 322 | else |
| 322 | return mnt_clone_write(file->f_path.mnt); | 323 | return mnt_clone_write(file->f_path.mnt); |
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index 489fc01a3204..e4e089a8f294 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c | |||
| @@ -255,7 +255,7 @@ static void nfs_direct_read_release(void *calldata) | |||
| 255 | 255 | ||
| 256 | if (put_dreq(dreq)) | 256 | if (put_dreq(dreq)) |
| 257 | nfs_direct_complete(dreq); | 257 | nfs_direct_complete(dreq); |
| 258 | nfs_readdata_release(calldata); | 258 | nfs_readdata_free(data); |
| 259 | } | 259 | } |
| 260 | 260 | ||
| 261 | static const struct rpc_call_ops nfs_read_direct_ops = { | 261 | static const struct rpc_call_ops nfs_read_direct_ops = { |
| @@ -314,14 +314,14 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_direct_req *dreq, | |||
| 314 | data->npages, 1, 0, data->pagevec, NULL); | 314 | data->npages, 1, 0, data->pagevec, NULL); |
| 315 | up_read(¤t->mm->mmap_sem); | 315 | up_read(¤t->mm->mmap_sem); |
| 316 | if (result < 0) { | 316 | if (result < 0) { |
| 317 | nfs_readdata_release(data); | 317 | nfs_readdata_free(data); |
| 318 | break; | 318 | break; |
| 319 | } | 319 | } |
| 320 | if ((unsigned)result < data->npages) { | 320 | if ((unsigned)result < data->npages) { |
| 321 | bytes = result * PAGE_SIZE; | 321 | bytes = result * PAGE_SIZE; |
| 322 | if (bytes <= pgbase) { | 322 | if (bytes <= pgbase) { |
| 323 | nfs_direct_release_pages(data->pagevec, result); | 323 | nfs_direct_release_pages(data->pagevec, result); |
| 324 | nfs_readdata_release(data); | 324 | nfs_readdata_free(data); |
| 325 | break; | 325 | break; |
| 326 | } | 326 | } |
| 327 | bytes -= pgbase; | 327 | bytes -= pgbase; |
| @@ -334,7 +334,7 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_direct_req *dreq, | |||
| 334 | data->inode = inode; | 334 | data->inode = inode; |
| 335 | data->cred = msg.rpc_cred; | 335 | data->cred = msg.rpc_cred; |
| 336 | data->args.fh = NFS_FH(inode); | 336 | data->args.fh = NFS_FH(inode); |
| 337 | data->args.context = get_nfs_open_context(ctx); | 337 | data->args.context = ctx; |
| 338 | data->args.offset = pos; | 338 | data->args.offset = pos; |
| 339 | data->args.pgbase = pgbase; | 339 | data->args.pgbase = pgbase; |
| 340 | data->args.pages = data->pagevec; | 340 | data->args.pages = data->pagevec; |
| @@ -441,7 +441,7 @@ static void nfs_direct_free_writedata(struct nfs_direct_req *dreq) | |||
| 441 | struct nfs_write_data *data = list_entry(dreq->rewrite_list.next, struct nfs_write_data, pages); | 441 | struct nfs_write_data *data = list_entry(dreq->rewrite_list.next, struct nfs_write_data, pages); |
| 442 | list_del(&data->pages); | 442 | list_del(&data->pages); |
| 443 | nfs_direct_release_pages(data->pagevec, data->npages); | 443 | nfs_direct_release_pages(data->pagevec, data->npages); |
| 444 | nfs_writedata_release(data); | 444 | nfs_writedata_free(data); |
| 445 | } | 445 | } |
| 446 | } | 446 | } |
| 447 | 447 | ||
| @@ -534,7 +534,7 @@ static void nfs_direct_commit_release(void *calldata) | |||
| 534 | 534 | ||
| 535 | dprintk("NFS: %5u commit returned %d\n", data->task.tk_pid, status); | 535 | dprintk("NFS: %5u commit returned %d\n", data->task.tk_pid, status); |
| 536 | nfs_direct_write_complete(dreq, data->inode); | 536 | nfs_direct_write_complete(dreq, data->inode); |
| 537 | nfs_commitdata_release(calldata); | 537 | nfs_commit_free(data); |
| 538 | } | 538 | } |
| 539 | 539 | ||
| 540 | static const struct rpc_call_ops nfs_commit_direct_ops = { | 540 | static const struct rpc_call_ops nfs_commit_direct_ops = { |
| @@ -570,7 +570,7 @@ static void nfs_direct_commit_schedule(struct nfs_direct_req *dreq) | |||
| 570 | data->args.fh = NFS_FH(data->inode); | 570 | data->args.fh = NFS_FH(data->inode); |
| 571 | data->args.offset = 0; | 571 | data->args.offset = 0; |
| 572 | data->args.count = 0; | 572 | data->args.count = 0; |
| 573 | data->args.context = get_nfs_open_context(dreq->ctx); | 573 | data->args.context = dreq->ctx; |
| 574 | data->res.count = 0; | 574 | data->res.count = 0; |
| 575 | data->res.fattr = &data->fattr; | 575 | data->res.fattr = &data->fattr; |
| 576 | data->res.verf = &data->verf; | 576 | data->res.verf = &data->verf; |
| @@ -734,14 +734,14 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_direct_req *dreq, | |||
| 734 | data->npages, 0, 0, data->pagevec, NULL); | 734 | data->npages, 0, 0, data->pagevec, NULL); |
| 735 | up_read(¤t->mm->mmap_sem); | 735 | up_read(¤t->mm->mmap_sem); |
| 736 | if (result < 0) { | 736 | if (result < 0) { |
| 737 | nfs_writedata_release(data); | 737 | nfs_writedata_free(data); |
| 738 | break; | 738 | break; |
| 739 | } | 739 | } |
| 740 | if ((unsigned)result < data->npages) { | 740 | if ((unsigned)result < data->npages) { |
| 741 | bytes = result * PAGE_SIZE; | 741 | bytes = result * PAGE_SIZE; |
| 742 | if (bytes <= pgbase) { | 742 | if (bytes <= pgbase) { |
| 743 | nfs_direct_release_pages(data->pagevec, result); | 743 | nfs_direct_release_pages(data->pagevec, result); |
| 744 | nfs_writedata_release(data); | 744 | nfs_writedata_free(data); |
| 745 | break; | 745 | break; |
| 746 | } | 746 | } |
| 747 | bytes -= pgbase; | 747 | bytes -= pgbase; |
| @@ -756,7 +756,7 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_direct_req *dreq, | |||
| 756 | data->inode = inode; | 756 | data->inode = inode; |
| 757 | data->cred = msg.rpc_cred; | 757 | data->cred = msg.rpc_cred; |
| 758 | data->args.fh = NFS_FH(inode); | 758 | data->args.fh = NFS_FH(inode); |
| 759 | data->args.context = get_nfs_open_context(ctx); | 759 | data->args.context = ctx; |
| 760 | data->args.offset = pos; | 760 | data->args.offset = pos; |
| 761 | data->args.pgbase = pgbase; | 761 | data->args.pgbase = pgbase; |
| 762 | data->args.pages = data->pagevec; | 762 | data->args.pages = data->pagevec; |
diff --git a/fs/nfs/read.c b/fs/nfs/read.c index 73ea5e8d66ce..12c9e66d3f1d 100644 --- a/fs/nfs/read.c +++ b/fs/nfs/read.c | |||
| @@ -60,17 +60,15 @@ struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount) | |||
| 60 | return p; | 60 | return p; |
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | static void nfs_readdata_free(struct nfs_read_data *p) | 63 | void nfs_readdata_free(struct nfs_read_data *p) |
| 64 | { | 64 | { |
| 65 | if (p && (p->pagevec != &p->page_array[0])) | 65 | if (p && (p->pagevec != &p->page_array[0])) |
| 66 | kfree(p->pagevec); | 66 | kfree(p->pagevec); |
| 67 | mempool_free(p, nfs_rdata_mempool); | 67 | mempool_free(p, nfs_rdata_mempool); |
| 68 | } | 68 | } |
| 69 | 69 | ||
| 70 | void nfs_readdata_release(void *data) | 70 | static void nfs_readdata_release(struct nfs_read_data *rdata) |
| 71 | { | 71 | { |
| 72 | struct nfs_read_data *rdata = data; | ||
| 73 | |||
| 74 | put_nfs_open_context(rdata->args.context); | 72 | put_nfs_open_context(rdata->args.context); |
| 75 | nfs_readdata_free(rdata); | 73 | nfs_readdata_free(rdata); |
| 76 | } | 74 | } |
diff --git a/fs/nfs/write.c b/fs/nfs/write.c index 0a0a2ff767c3..a34fae21fe10 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c | |||
| @@ -87,17 +87,15 @@ struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount) | |||
| 87 | return p; | 87 | return p; |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | static void nfs_writedata_free(struct nfs_write_data *p) | 90 | void nfs_writedata_free(struct nfs_write_data *p) |
| 91 | { | 91 | { |
| 92 | if (p && (p->pagevec != &p->page_array[0])) | 92 | if (p && (p->pagevec != &p->page_array[0])) |
| 93 | kfree(p->pagevec); | 93 | kfree(p->pagevec); |
| 94 | mempool_free(p, nfs_wdata_mempool); | 94 | mempool_free(p, nfs_wdata_mempool); |
| 95 | } | 95 | } |
| 96 | 96 | ||
| 97 | void nfs_writedata_release(void *data) | 97 | static void nfs_writedata_release(struct nfs_write_data *wdata) |
| 98 | { | 98 | { |
| 99 | struct nfs_write_data *wdata = data; | ||
| 100 | |||
| 101 | put_nfs_open_context(wdata->args.context); | 99 | put_nfs_open_context(wdata->args.context); |
| 102 | nfs_writedata_free(wdata); | 100 | nfs_writedata_free(wdata); |
| 103 | } | 101 | } |
diff --git a/fs/proc/base.c b/fs/proc/base.c index 3ce5ae9e3d2d..175db258942f 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
| @@ -234,23 +234,20 @@ static int check_mem_permission(struct task_struct *task) | |||
| 234 | 234 | ||
| 235 | struct mm_struct *mm_for_maps(struct task_struct *task) | 235 | struct mm_struct *mm_for_maps(struct task_struct *task) |
| 236 | { | 236 | { |
| 237 | struct mm_struct *mm = get_task_mm(task); | 237 | struct mm_struct *mm; |
| 238 | if (!mm) | 238 | |
| 239 | if (mutex_lock_killable(&task->cred_guard_mutex)) | ||
| 239 | return NULL; | 240 | return NULL; |
| 240 | down_read(&mm->mmap_sem); | 241 | |
| 241 | task_lock(task); | 242 | mm = get_task_mm(task); |
| 242 | if (task->mm != mm) | 243 | if (mm && mm != current->mm && |
| 243 | goto out; | 244 | !ptrace_may_access(task, PTRACE_MODE_READ)) { |
| 244 | if (task->mm != current->mm && | 245 | mmput(mm); |
| 245 | __ptrace_may_access(task, PTRACE_MODE_READ) < 0) | 246 | mm = NULL; |
| 246 | goto out; | 247 | } |
| 247 | task_unlock(task); | 248 | mutex_unlock(&task->cred_guard_mutex); |
| 249 | |||
| 248 | return mm; | 250 | return mm; |
| 249 | out: | ||
| 250 | task_unlock(task); | ||
| 251 | up_read(&mm->mmap_sem); | ||
| 252 | mmput(mm); | ||
| 253 | return NULL; | ||
| 254 | } | 251 | } |
| 255 | 252 | ||
| 256 | static int proc_pid_cmdline(struct task_struct *task, char * buffer) | 253 | static int proc_pid_cmdline(struct task_struct *task, char * buffer) |
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 6f61b7cc32e0..9bd8be1d235c 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c | |||
| @@ -119,6 +119,7 @@ static void *m_start(struct seq_file *m, loff_t *pos) | |||
| 119 | mm = mm_for_maps(priv->task); | 119 | mm = mm_for_maps(priv->task); |
| 120 | if (!mm) | 120 | if (!mm) |
| 121 | return NULL; | 121 | return NULL; |
| 122 | down_read(&mm->mmap_sem); | ||
| 122 | 123 | ||
| 123 | tail_vma = get_gate_vma(priv->task); | 124 | tail_vma = get_gate_vma(priv->task); |
| 124 | priv->tail_vma = tail_vma; | 125 | priv->tail_vma = tail_vma; |
diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c index 64a72e2e7650..8f5c05d3dbd3 100644 --- a/fs/proc/task_nommu.c +++ b/fs/proc/task_nommu.c | |||
| @@ -189,6 +189,7 @@ static void *m_start(struct seq_file *m, loff_t *pos) | |||
| 189 | priv->task = NULL; | 189 | priv->task = NULL; |
| 190 | return NULL; | 190 | return NULL; |
| 191 | } | 191 | } |
| 192 | down_read(&mm->mmap_sem); | ||
| 192 | 193 | ||
| 193 | /* start from the Nth VMA */ | 194 | /* start from the Nth VMA */ |
| 194 | for (p = rb_first(&mm->mm_rb); p; p = rb_next(p)) | 195 | for (p = rb_first(&mm->mm_rb); p; p = rb_next(p)) |
diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index 5fcec6f020a7..34ec86923f7e 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c | |||
| @@ -64,6 +64,10 @@ xfs_inode_alloc( | |||
| 64 | ip = kmem_zone_alloc(xfs_inode_zone, KM_SLEEP); | 64 | ip = kmem_zone_alloc(xfs_inode_zone, KM_SLEEP); |
| 65 | if (!ip) | 65 | if (!ip) |
| 66 | return NULL; | 66 | return NULL; |
| 67 | if (inode_init_always(mp->m_super, VFS_I(ip))) { | ||
| 68 | kmem_zone_free(xfs_inode_zone, ip); | ||
| 69 | return NULL; | ||
| 70 | } | ||
| 67 | 71 | ||
| 68 | ASSERT(atomic_read(&ip->i_iocount) == 0); | 72 | ASSERT(atomic_read(&ip->i_iocount) == 0); |
| 69 | ASSERT(atomic_read(&ip->i_pincount) == 0); | 73 | ASSERT(atomic_read(&ip->i_pincount) == 0); |
| @@ -105,17 +109,6 @@ xfs_inode_alloc( | |||
| 105 | #ifdef XFS_DIR2_TRACE | 109 | #ifdef XFS_DIR2_TRACE |
| 106 | ip->i_dir_trace = ktrace_alloc(XFS_DIR2_KTRACE_SIZE, KM_NOFS); | 110 | ip->i_dir_trace = ktrace_alloc(XFS_DIR2_KTRACE_SIZE, KM_NOFS); |
| 107 | #endif | 111 | #endif |
| 108 | /* | ||
| 109 | * Now initialise the VFS inode. We do this after the xfs_inode | ||
| 110 | * initialisation as internal failures will result in ->destroy_inode | ||
| 111 | * being called and that will pass down through the reclaim path and | ||
| 112 | * free the XFS inode. This path requires the XFS inode to already be | ||
| 113 | * initialised. Hence if this call fails, the xfs_inode has already | ||
| 114 | * been freed and we should not reference it at all in the error | ||
| 115 | * handling. | ||
| 116 | */ | ||
| 117 | if (!inode_init_always(mp->m_super, VFS_I(ip))) | ||
| 118 | return NULL; | ||
| 119 | 112 | ||
| 120 | /* prevent anyone from using this yet */ | 113 | /* prevent anyone from using this yet */ |
| 121 | VFS_I(ip)->i_state = I_NEW|I_LOCK; | 114 | VFS_I(ip)->i_state = I_NEW|I_LOCK; |
| @@ -123,6 +116,71 @@ xfs_inode_alloc( | |||
| 123 | return ip; | 116 | return ip; |
| 124 | } | 117 | } |
| 125 | 118 | ||
| 119 | STATIC void | ||
| 120 | xfs_inode_free( | ||
| 121 | struct xfs_inode *ip) | ||
| 122 | { | ||
| 123 | switch (ip->i_d.di_mode & S_IFMT) { | ||
| 124 | case S_IFREG: | ||
| 125 | case S_IFDIR: | ||
| 126 | case S_IFLNK: | ||
| 127 | xfs_idestroy_fork(ip, XFS_DATA_FORK); | ||
| 128 | break; | ||
| 129 | } | ||
| 130 | |||
| 131 | if (ip->i_afp) | ||
| 132 | xfs_idestroy_fork(ip, XFS_ATTR_FORK); | ||
| 133 | |||
| 134 | #ifdef XFS_INODE_TRACE | ||
| 135 | ktrace_free(ip->i_trace); | ||
| 136 | #endif | ||
| 137 | #ifdef XFS_BMAP_TRACE | ||
| 138 | ktrace_free(ip->i_xtrace); | ||
| 139 | #endif | ||
| 140 | #ifdef XFS_BTREE_TRACE | ||
| 141 | ktrace_free(ip->i_btrace); | ||
| 142 | #endif | ||
| 143 | #ifdef XFS_RW_TRACE | ||
| 144 | ktrace_free(ip->i_rwtrace); | ||
| 145 | #endif | ||
| 146 | #ifdef XFS_ILOCK_TRACE | ||
| 147 | ktrace_free(ip->i_lock_trace); | ||
| 148 | #endif | ||
| 149 | #ifdef XFS_DIR2_TRACE | ||
| 150 | ktrace_free(ip->i_dir_trace); | ||
| 151 | #endif | ||
| 152 | |||
| 153 | if (ip->i_itemp) { | ||
| 154 | /* | ||
| 155 | * Only if we are shutting down the fs will we see an | ||
| 156 | * inode still in the AIL. If it is there, we should remove | ||
| 157 | * it to prevent a use-after-free from occurring. | ||
| 158 | */ | ||
| 159 | xfs_log_item_t *lip = &ip->i_itemp->ili_item; | ||
| 160 | struct xfs_ail *ailp = lip->li_ailp; | ||
| 161 | |||
| 162 | ASSERT(((lip->li_flags & XFS_LI_IN_AIL) == 0) || | ||
| 163 | XFS_FORCED_SHUTDOWN(ip->i_mount)); | ||
| 164 | if (lip->li_flags & XFS_LI_IN_AIL) { | ||
| 165 | spin_lock(&ailp->xa_lock); | ||
| 166 | if (lip->li_flags & XFS_LI_IN_AIL) | ||
| 167 | xfs_trans_ail_delete(ailp, lip); | ||
| 168 | else | ||
| 169 | spin_unlock(&ailp->xa_lock); | ||
| 170 | } | ||
| 171 | xfs_inode_item_destroy(ip); | ||
| 172 | ip->i_itemp = NULL; | ||
| 173 | } | ||
| 174 | |||
| 175 | /* asserts to verify all state is correct here */ | ||
| 176 | ASSERT(atomic_read(&ip->i_iocount) == 0); | ||
| 177 | ASSERT(atomic_read(&ip->i_pincount) == 0); | ||
| 178 | ASSERT(!spin_is_locked(&ip->i_flags_lock)); | ||
| 179 | ASSERT(completion_done(&ip->i_flush)); | ||
| 180 | |||
| 181 | kmem_zone_free(xfs_inode_zone, ip); | ||
| 182 | } | ||
| 183 | |||
| 126 | /* | 184 | /* |
| 127 | * Check the validity of the inode we just found it the cache | 185 | * Check the validity of the inode we just found it the cache |
| 128 | */ | 186 | */ |
| @@ -167,7 +225,7 @@ xfs_iget_cache_hit( | |||
| 167 | * errors cleanly, then tag it so it can be set up correctly | 225 | * errors cleanly, then tag it so it can be set up correctly |
| 168 | * later. | 226 | * later. |
| 169 | */ | 227 | */ |
| 170 | if (!inode_init_always(mp->m_super, VFS_I(ip))) { | 228 | if (inode_init_always(mp->m_super, VFS_I(ip))) { |
| 171 | error = ENOMEM; | 229 | error = ENOMEM; |
| 172 | goto out_error; | 230 | goto out_error; |
| 173 | } | 231 | } |
| @@ -299,7 +357,8 @@ out_preload_end: | |||
| 299 | if (lock_flags) | 357 | if (lock_flags) |
| 300 | xfs_iunlock(ip, lock_flags); | 358 | xfs_iunlock(ip, lock_flags); |
| 301 | out_destroy: | 359 | out_destroy: |
| 302 | xfs_destroy_inode(ip); | 360 | __destroy_inode(VFS_I(ip)); |
| 361 | xfs_inode_free(ip); | ||
| 303 | return error; | 362 | return error; |
| 304 | } | 363 | } |
| 305 | 364 | ||
| @@ -504,62 +563,7 @@ xfs_ireclaim( | |||
| 504 | xfs_qm_dqdetach(ip); | 563 | xfs_qm_dqdetach(ip); |
| 505 | xfs_iunlock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); | 564 | xfs_iunlock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); |
| 506 | 565 | ||
| 507 | switch (ip->i_d.di_mode & S_IFMT) { | 566 | xfs_inode_free(ip); |
| 508 | case S_IFREG: | ||
| 509 | case S_IFDIR: | ||
| 510 | case S_IFLNK: | ||
| 511 | xfs_idestroy_fork(ip, XFS_DATA_FORK); | ||
| 512 | break; | ||
| 513 | } | ||
| 514 | |||
| 515 | if (ip->i_afp) | ||
| 516 | xfs_idestroy_fork(ip, XFS_ATTR_FORK); | ||
| 517 | |||
| 518 | #ifdef XFS_INODE_TRACE | ||
| 519 | ktrace_free(ip->i_trace); | ||
| 520 | #endif | ||
| 521 | #ifdef XFS_BMAP_TRACE | ||
| 522 | ktrace_free(ip->i_xtrace); | ||
| 523 | #endif | ||
| 524 | #ifdef XFS_BTREE_TRACE | ||
| 525 | ktrace_free(ip->i_btrace); | ||
| 526 | #endif | ||
| 527 | #ifdef XFS_RW_TRACE | ||
| 528 | ktrace_free(ip->i_rwtrace); | ||
| 529 | #endif | ||
| 530 | #ifdef XFS_ILOCK_TRACE | ||
| 531 | ktrace_free(ip->i_lock_trace); | ||
| 532 | #endif | ||
| 533 | #ifdef XFS_DIR2_TRACE | ||
| 534 | ktrace_free(ip->i_dir_trace); | ||
| 535 | #endif | ||
| 536 | if (ip->i_itemp) { | ||
| 537 | /* | ||
| 538 | * Only if we are shutting down the fs will we see an | ||
| 539 | * inode still in the AIL. If it is there, we should remove | ||
| 540 | * it to prevent a use-after-free from occurring. | ||
| 541 | */ | ||
| 542 | xfs_log_item_t *lip = &ip->i_itemp->ili_item; | ||
| 543 | struct xfs_ail *ailp = lip->li_ailp; | ||
| 544 | |||
| 545 | ASSERT(((lip->li_flags & XFS_LI_IN_AIL) == 0) || | ||
| 546 | XFS_FORCED_SHUTDOWN(ip->i_mount)); | ||
| 547 | if (lip->li_flags & XFS_LI_IN_AIL) { | ||
| 548 | spin_lock(&ailp->xa_lock); | ||
| 549 | if (lip->li_flags & XFS_LI_IN_AIL) | ||
| 550 | xfs_trans_ail_delete(ailp, lip); | ||
| 551 | else | ||
| 552 | spin_unlock(&ailp->xa_lock); | ||
| 553 | } | ||
| 554 | xfs_inode_item_destroy(ip); | ||
| 555 | ip->i_itemp = NULL; | ||
| 556 | } | ||
| 557 | /* asserts to verify all state is correct here */ | ||
| 558 | ASSERT(atomic_read(&ip->i_iocount) == 0); | ||
| 559 | ASSERT(atomic_read(&ip->i_pincount) == 0); | ||
| 560 | ASSERT(!spin_is_locked(&ip->i_flags_lock)); | ||
| 561 | ASSERT(completion_done(&ip->i_flush)); | ||
| 562 | kmem_zone_free(xfs_inode_zone, ip); | ||
| 563 | } | 567 | } |
| 564 | 568 | ||
| 565 | /* | 569 | /* |
diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 1804f866a71d..65f24a3cc992 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h | |||
| @@ -310,23 +310,6 @@ static inline struct inode *VFS_I(struct xfs_inode *ip) | |||
| 310 | } | 310 | } |
| 311 | 311 | ||
| 312 | /* | 312 | /* |
| 313 | * Get rid of a partially initialized inode. | ||
| 314 | * | ||
| 315 | * We have to go through destroy_inode to make sure allocations | ||
| 316 | * from init_inode_always like the security data are undone. | ||
| 317 | * | ||
| 318 | * We mark the inode bad so that it takes the short cut in | ||
| 319 | * the reclaim path instead of going through the flush path | ||
| 320 | * which doesn't make sense for an inode that has never seen the | ||
| 321 | * light of day. | ||
| 322 | */ | ||
| 323 | static inline void xfs_destroy_inode(struct xfs_inode *ip) | ||
| 324 | { | ||
| 325 | make_bad_inode(VFS_I(ip)); | ||
| 326 | return destroy_inode(VFS_I(ip)); | ||
| 327 | } | ||
| 328 | |||
| 329 | /* | ||
| 330 | * i_flags helper functions | 313 | * i_flags helper functions |
| 331 | */ | 314 | */ |
| 332 | static inline void | 315 | static inline void |
diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h index 9d4c00491547..853508499d20 100644 --- a/include/drm/drm_pciids.h +++ b/include/drm/drm_pciids.h | |||
| @@ -370,6 +370,11 @@ | |||
| 370 | {0x1002, 0x9614, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | 370 | {0x1002, 0x9614, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ |
| 371 | {0x1002, 0x9615, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | 371 | {0x1002, 0x9615, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ |
| 372 | {0x1002, 0x9616, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | 372 | {0x1002, 0x9616, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ |
| 373 | {0x1002, 0x9710, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS880|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 374 | {0x1002, 0x9711, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS880|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 375 | {0x1002, 0x9712, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS880|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 376 | {0x1002, 0x9713, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS880|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 377 | {0x1002, 0x9714, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS880|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 373 | {0, 0, 0} | 378 | {0, 0, 0} |
| 374 | 379 | ||
| 375 | #define r128_PCI_IDS \ | 380 | #define r128_PCI_IDS \ |
diff --git a/include/linux/decompress/generic.h b/include/linux/decompress/generic.h index 6dfb856327bb..0c7111a55a1a 100644 --- a/include/linux/decompress/generic.h +++ b/include/linux/decompress/generic.h | |||
| @@ -1,31 +1,37 @@ | |||
| 1 | #ifndef DECOMPRESS_GENERIC_H | 1 | #ifndef DECOMPRESS_GENERIC_H |
| 2 | #define DECOMPRESS_GENERIC_H | 2 | #define DECOMPRESS_GENERIC_H |
| 3 | 3 | ||
| 4 | /* Minimal chunksize to be read. | ||
| 5 | *Bzip2 prefers at least 4096 | ||
| 6 | *Lzma prefers 0x10000 */ | ||
| 7 | #define COMPR_IOBUF_SIZE 4096 | ||
| 8 | |||
| 9 | typedef int (*decompress_fn) (unsigned char *inbuf, int len, | 4 | typedef int (*decompress_fn) (unsigned char *inbuf, int len, |
| 10 | int(*fill)(void*, unsigned int), | 5 | int(*fill)(void*, unsigned int), |
| 11 | int(*writebb)(void*, unsigned int), | 6 | int(*flush)(void*, unsigned int), |
| 12 | unsigned char *output, | 7 | unsigned char *outbuf, |
| 13 | int *posp, | 8 | int *posp, |
| 14 | void(*error)(char *x)); | 9 | void(*error)(char *x)); |
| 15 | 10 | ||
| 16 | /* inbuf - input buffer | 11 | /* inbuf - input buffer |
| 17 | *len - len of pre-read data in inbuf | 12 | *len - len of pre-read data in inbuf |
| 18 | *fill - function to fill inbuf if empty | 13 | *fill - function to fill inbuf when empty |
| 19 | *writebb - function to write out outbug | 14 | *flush - function to write out outbuf |
| 15 | *outbuf - output buffer | ||
| 20 | *posp - if non-null, input position (number of bytes read) will be | 16 | *posp - if non-null, input position (number of bytes read) will be |
| 21 | * returned here | 17 | * returned here |
| 22 | * | 18 | * |
| 23 | *If len != 0, the inbuf is initialized (with as much data), and fill | 19 | *If len != 0, inbuf should contain all the necessary input data, and fill |
| 24 | *should not be called | 20 | *should be NULL |
| 25 | *If len = 0, the inbuf is allocated, but empty. Its size is IOBUF_SIZE | 21 | *If len = 0, inbuf can be NULL, in which case the decompressor will allocate |
| 26 | *fill should be called (repeatedly...) to read data, at most IOBUF_SIZE | 22 | *the input buffer. If inbuf != NULL it must be at least XXX_IOBUF_SIZE bytes. |
| 23 | *fill will be called (repeatedly...) to read data, at most XXX_IOBUF_SIZE | ||
| 24 | *bytes should be read per call. Replace XXX with the appropriate decompressor | ||
| 25 | *name, i.e. LZMA_IOBUF_SIZE. | ||
| 26 | * | ||
| 27 | *If flush = NULL, outbuf must be large enough to buffer all the expected | ||
| 28 | *output. If flush != NULL, the output buffer will be allocated by the | ||
| 29 | *decompressor (outbuf = NULL), and the flush function will be called to | ||
| 30 | *flush the output buffer at the appropriate time (decompressor and stream | ||
| 31 | *dependent). | ||
| 27 | */ | 32 | */ |
| 28 | 33 | ||
| 34 | |||
| 29 | /* Utility routine to detect the decompression method */ | 35 | /* Utility routine to detect the decompression method */ |
| 30 | decompress_fn decompress_method(const unsigned char *inbuf, int len, | 36 | decompress_fn decompress_method(const unsigned char *inbuf, int len, |
| 31 | const char **name); | 37 | const char **name); |
diff --git a/include/linux/fs.h b/include/linux/fs.h index a36ffa5a77a4..67888a9e0655 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -2137,7 +2137,7 @@ extern loff_t default_llseek(struct file *file, loff_t offset, int origin); | |||
| 2137 | 2137 | ||
| 2138 | extern loff_t vfs_llseek(struct file *file, loff_t offset, int origin); | 2138 | extern loff_t vfs_llseek(struct file *file, loff_t offset, int origin); |
| 2139 | 2139 | ||
| 2140 | extern struct inode * inode_init_always(struct super_block *, struct inode *); | 2140 | extern int inode_init_always(struct super_block *, struct inode *); |
| 2141 | extern void inode_init_once(struct inode *); | 2141 | extern void inode_init_once(struct inode *); |
| 2142 | extern void inode_add_to_lists(struct super_block *, struct inode *); | 2142 | extern void inode_add_to_lists(struct super_block *, struct inode *); |
| 2143 | extern void iput(struct inode *); | 2143 | extern void iput(struct inode *); |
| @@ -2164,6 +2164,7 @@ extern void __iget(struct inode * inode); | |||
| 2164 | extern void iget_failed(struct inode *); | 2164 | extern void iget_failed(struct inode *); |
| 2165 | extern void clear_inode(struct inode *); | 2165 | extern void clear_inode(struct inode *); |
| 2166 | extern void destroy_inode(struct inode *); | 2166 | extern void destroy_inode(struct inode *); |
| 2167 | extern void __destroy_inode(struct inode *); | ||
| 2167 | extern struct inode *new_inode(struct super_block *); | 2168 | extern struct inode *new_inode(struct super_block *); |
| 2168 | extern int should_remove_suid(struct dentry *); | 2169 | extern int should_remove_suid(struct dentry *); |
| 2169 | extern int file_remove_suid(struct file *); | 2170 | extern int file_remove_suid(struct file *); |
diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h index 5c093ffc655b..a81170de7f6b 100644 --- a/include/linux/ftrace_event.h +++ b/include/linux/ftrace_event.h | |||
| @@ -89,7 +89,9 @@ enum print_line_t { | |||
| 89 | TRACE_TYPE_NO_CONSUME = 3 /* Handled but ask to not consume */ | 89 | TRACE_TYPE_NO_CONSUME = 3 /* Handled but ask to not consume */ |
| 90 | }; | 90 | }; |
| 91 | 91 | ||
| 92 | 92 | void tracing_generic_entry_update(struct trace_entry *entry, | |
| 93 | unsigned long flags, | ||
| 94 | int pc); | ||
| 93 | struct ring_buffer_event * | 95 | struct ring_buffer_event * |
| 94 | trace_current_buffer_lock_reserve(int type, unsigned long len, | 96 | trace_current_buffer_lock_reserve(int type, unsigned long len, |
| 95 | unsigned long flags, int pc); | 97 | unsigned long flags, int pc); |
| @@ -119,11 +121,9 @@ struct ftrace_event_call { | |||
| 119 | void *filter; | 121 | void *filter; |
| 120 | void *mod; | 122 | void *mod; |
| 121 | 123 | ||
| 122 | #ifdef CONFIG_EVENT_PROFILE | 124 | atomic_t profile_count; |
| 123 | atomic_t profile_count; | 125 | int (*profile_enable)(struct ftrace_event_call *); |
| 124 | int (*profile_enable)(struct ftrace_event_call *); | 126 | void (*profile_disable)(struct ftrace_event_call *); |
| 125 | void (*profile_disable)(struct ftrace_event_call *); | ||
| 126 | #endif | ||
| 127 | }; | 127 | }; |
| 128 | 128 | ||
| 129 | #define MAX_FILTER_PRED 32 | 129 | #define MAX_FILTER_PRED 32 |
diff --git a/include/linux/input/matrix_keypad.h b/include/linux/input/matrix_keypad.h index 7964516c6954..15d5903af2dd 100644 --- a/include/linux/input/matrix_keypad.h +++ b/include/linux/input/matrix_keypad.h | |||
| @@ -15,12 +15,13 @@ | |||
| 15 | #define KEY_COL(k) (((k) >> 16) & 0xff) | 15 | #define KEY_COL(k) (((k) >> 16) & 0xff) |
| 16 | #define KEY_VAL(k) ((k) & 0xffff) | 16 | #define KEY_VAL(k) ((k) & 0xffff) |
| 17 | 17 | ||
| 18 | #define MATRIX_SCAN_CODE(row, col, row_shift) (((row) << (row_shift)) + (col)) | ||
| 19 | |||
| 18 | /** | 20 | /** |
| 19 | * struct matrix_keymap_data - keymap for matrix keyboards | 21 | * struct matrix_keymap_data - keymap for matrix keyboards |
| 20 | * @keymap: pointer to array of uint32 values encoded with KEY() macro | 22 | * @keymap: pointer to array of uint32 values encoded with KEY() macro |
| 21 | * representing keymap | 23 | * representing keymap |
| 22 | * @keymap_size: number of entries (initialized) in this keymap | 24 | * @keymap_size: number of entries (initialized) in this keymap |
| 23 | * @max_keymap_size: maximum size of keymap supported by the device | ||
| 24 | * | 25 | * |
| 25 | * This structure is supposed to be used by platform code to supply | 26 | * This structure is supposed to be used by platform code to supply |
| 26 | * keymaps to drivers that implement matrix-like keypads/keyboards. | 27 | * keymaps to drivers that implement matrix-like keypads/keyboards. |
| @@ -28,14 +29,13 @@ | |||
| 28 | struct matrix_keymap_data { | 29 | struct matrix_keymap_data { |
| 29 | const uint32_t *keymap; | 30 | const uint32_t *keymap; |
| 30 | unsigned int keymap_size; | 31 | unsigned int keymap_size; |
| 31 | unsigned int max_keymap_size; | ||
| 32 | }; | 32 | }; |
| 33 | 33 | ||
| 34 | /** | 34 | /** |
| 35 | * struct matrix_keypad_platform_data - platform-dependent keypad data | 35 | * struct matrix_keypad_platform_data - platform-dependent keypad data |
| 36 | * @keymap_data: pointer to &matrix_keymap_data | 36 | * @keymap_data: pointer to &matrix_keymap_data |
| 37 | * @row_gpios: array of gpio numbers reporesenting rows | 37 | * @row_gpios: pointer to array of gpio numbers representing rows |
| 38 | * @col_gpios: array of gpio numbers reporesenting colums | 38 | * @col_gpios: pointer to array of gpio numbers reporesenting colums |
| 39 | * @num_row_gpios: actual number of row gpios used by device | 39 | * @num_row_gpios: actual number of row gpios used by device |
| 40 | * @num_col_gpios: actual number of col gpios used by device | 40 | * @num_col_gpios: actual number of col gpios used by device |
| 41 | * @col_scan_delay_us: delay, measured in microseconds, that is | 41 | * @col_scan_delay_us: delay, measured in microseconds, that is |
| @@ -48,8 +48,9 @@ struct matrix_keymap_data { | |||
| 48 | struct matrix_keypad_platform_data { | 48 | struct matrix_keypad_platform_data { |
| 49 | const struct matrix_keymap_data *keymap_data; | 49 | const struct matrix_keymap_data *keymap_data; |
| 50 | 50 | ||
| 51 | unsigned int row_gpios[MATRIX_MAX_ROWS]; | 51 | const unsigned int *row_gpios; |
| 52 | unsigned int col_gpios[MATRIX_MAX_COLS]; | 52 | const unsigned int *col_gpios; |
| 53 | |||
| 53 | unsigned int num_row_gpios; | 54 | unsigned int num_row_gpios; |
| 54 | unsigned int num_col_gpios; | 55 | unsigned int num_col_gpios; |
| 55 | 56 | ||
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 16713dc672e4..3060bdc35ffe 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
| @@ -110,6 +110,7 @@ struct kvm_memory_slot { | |||
| 110 | 110 | ||
| 111 | struct kvm_kernel_irq_routing_entry { | 111 | struct kvm_kernel_irq_routing_entry { |
| 112 | u32 gsi; | 112 | u32 gsi; |
| 113 | u32 type; | ||
| 113 | int (*set)(struct kvm_kernel_irq_routing_entry *e, | 114 | int (*set)(struct kvm_kernel_irq_routing_entry *e, |
| 114 | struct kvm *kvm, int level); | 115 | struct kvm *kvm, int level); |
| 115 | union { | 116 | union { |
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index 5675b63a0631..0f32a9b6ff55 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h | |||
| @@ -251,7 +251,7 @@ struct mtd_info { | |||
| 251 | 251 | ||
| 252 | static inline struct mtd_info *dev_to_mtd(struct device *dev) | 252 | static inline struct mtd_info *dev_to_mtd(struct device *dev) |
| 253 | { | 253 | { |
| 254 | return dev ? container_of(dev, struct mtd_info, dev) : NULL; | 254 | return dev ? dev_get_drvdata(dev) : NULL; |
| 255 | } | 255 | } |
| 256 | 256 | ||
| 257 | static inline uint32_t mtd_div_by_eb(uint64_t sz, struct mtd_info *mtd) | 257 | static inline uint32_t mtd_div_by_eb(uint64_t sz, struct mtd_info *mtd) |
diff --git a/include/linux/mtd/partitions.h b/include/linux/mtd/partitions.h index af6dcb992bc3..b70313d33ff8 100644 --- a/include/linux/mtd/partitions.h +++ b/include/linux/mtd/partitions.h | |||
| @@ -47,6 +47,8 @@ struct mtd_partition { | |||
| 47 | #define MTDPART_SIZ_FULL (0) | 47 | #define MTDPART_SIZ_FULL (0) |
| 48 | 48 | ||
| 49 | 49 | ||
| 50 | struct mtd_info; | ||
| 51 | |||
| 50 | int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int); | 52 | int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int); |
| 51 | int del_mtd_partitions(struct mtd_info *); | 53 | int del_mtd_partitions(struct mtd_info *); |
| 52 | 54 | ||
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index fdffb413b192..f6b90240dd41 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h | |||
| @@ -473,7 +473,6 @@ extern int nfs_writepages(struct address_space *, struct writeback_control *); | |||
| 473 | extern int nfs_flush_incompatible(struct file *file, struct page *page); | 473 | extern int nfs_flush_incompatible(struct file *file, struct page *page); |
| 474 | extern int nfs_updatepage(struct file *, struct page *, unsigned int, unsigned int); | 474 | extern int nfs_updatepage(struct file *, struct page *, unsigned int, unsigned int); |
| 475 | extern int nfs_writeback_done(struct rpc_task *, struct nfs_write_data *); | 475 | extern int nfs_writeback_done(struct rpc_task *, struct nfs_write_data *); |
| 476 | extern void nfs_writedata_release(void *); | ||
| 477 | 476 | ||
| 478 | /* | 477 | /* |
| 479 | * Try to write back everything synchronously (but check the | 478 | * Try to write back everything synchronously (but check the |
| @@ -488,7 +487,6 @@ extern int nfs_wb_page_cancel(struct inode *inode, struct page* page); | |||
| 488 | extern int nfs_commit_inode(struct inode *, int); | 487 | extern int nfs_commit_inode(struct inode *, int); |
| 489 | extern struct nfs_write_data *nfs_commitdata_alloc(void); | 488 | extern struct nfs_write_data *nfs_commitdata_alloc(void); |
| 490 | extern void nfs_commit_free(struct nfs_write_data *wdata); | 489 | extern void nfs_commit_free(struct nfs_write_data *wdata); |
| 491 | extern void nfs_commitdata_release(void *wdata); | ||
| 492 | #else | 490 | #else |
| 493 | static inline int | 491 | static inline int |
| 494 | nfs_commit_inode(struct inode *inode, int how) | 492 | nfs_commit_inode(struct inode *inode, int how) |
| @@ -507,6 +505,7 @@ nfs_have_writebacks(struct inode *inode) | |||
| 507 | * Allocate nfs_write_data structures | 505 | * Allocate nfs_write_data structures |
| 508 | */ | 506 | */ |
| 509 | extern struct nfs_write_data *nfs_writedata_alloc(unsigned int npages); | 507 | extern struct nfs_write_data *nfs_writedata_alloc(unsigned int npages); |
| 508 | extern void nfs_writedata_free(struct nfs_write_data *); | ||
| 510 | 509 | ||
| 511 | /* | 510 | /* |
| 512 | * linux/fs/nfs/read.c | 511 | * linux/fs/nfs/read.c |
| @@ -515,7 +514,6 @@ extern int nfs_readpage(struct file *, struct page *); | |||
| 515 | extern int nfs_readpages(struct file *, struct address_space *, | 514 | extern int nfs_readpages(struct file *, struct address_space *, |
| 516 | struct list_head *, unsigned); | 515 | struct list_head *, unsigned); |
| 517 | extern int nfs_readpage_result(struct rpc_task *, struct nfs_read_data *); | 516 | extern int nfs_readpage_result(struct rpc_task *, struct nfs_read_data *); |
| 518 | extern void nfs_readdata_release(void *data); | ||
| 519 | extern int nfs_readpage_async(struct nfs_open_context *, struct inode *, | 517 | extern int nfs_readpage_async(struct nfs_open_context *, struct inode *, |
| 520 | struct page *); | 518 | struct page *); |
| 521 | 519 | ||
| @@ -523,6 +521,7 @@ extern int nfs_readpage_async(struct nfs_open_context *, struct inode *, | |||
| 523 | * Allocate nfs_read_data structures | 521 | * Allocate nfs_read_data structures |
| 524 | */ | 522 | */ |
| 525 | extern struct nfs_read_data *nfs_readdata_alloc(unsigned int npages); | 523 | extern struct nfs_read_data *nfs_readdata_alloc(unsigned int npages); |
| 524 | extern void nfs_readdata_free(struct nfs_read_data *); | ||
| 526 | 525 | ||
| 527 | /* | 526 | /* |
| 528 | * linux/fs/nfs3proc.c | 527 | * linux/fs/nfs3proc.c |
diff --git a/include/linux/nodemask.h b/include/linux/nodemask.h index 829b94b156f2..b359c4a9ec9e 100644 --- a/include/linux/nodemask.h +++ b/include/linux/nodemask.h | |||
| @@ -82,6 +82,12 @@ | |||
| 82 | * to generate slightly worse code. So use a simple one-line #define | 82 | * to generate slightly worse code. So use a simple one-line #define |
| 83 | * for node_isset(), instead of wrapping an inline inside a macro, the | 83 | * for node_isset(), instead of wrapping an inline inside a macro, the |
| 84 | * way we do the other calls. | 84 | * way we do the other calls. |
| 85 | * | ||
| 86 | * NODEMASK_SCRATCH | ||
| 87 | * When doing above logical AND, OR, XOR, Remap operations the callers tend to | ||
| 88 | * need temporary nodemask_t's on the stack. But if NODES_SHIFT is large, | ||
| 89 | * nodemask_t's consume too much stack space. NODEMASK_SCRATCH is a helper | ||
| 90 | * for such situations. See below and CPUMASK_ALLOC also. | ||
| 85 | */ | 91 | */ |
| 86 | 92 | ||
| 87 | #include <linux/kernel.h> | 93 | #include <linux/kernel.h> |
| @@ -473,4 +479,26 @@ static inline int num_node_state(enum node_states state) | |||
| 473 | #define for_each_node(node) for_each_node_state(node, N_POSSIBLE) | 479 | #define for_each_node(node) for_each_node_state(node, N_POSSIBLE) |
| 474 | #define for_each_online_node(node) for_each_node_state(node, N_ONLINE) | 480 | #define for_each_online_node(node) for_each_node_state(node, N_ONLINE) |
| 475 | 481 | ||
| 482 | /* | ||
| 483 | * For nodemask scrach area.(See CPUMASK_ALLOC() in cpumask.h) | ||
| 484 | */ | ||
| 485 | |||
| 486 | #if NODES_SHIFT > 8 /* nodemask_t > 64 bytes */ | ||
| 487 | #define NODEMASK_ALLOC(x, m) struct x *m = kmalloc(sizeof(*m), GFP_KERNEL) | ||
| 488 | #define NODEMASK_FREE(m) kfree(m) | ||
| 489 | #else | ||
| 490 | #define NODEMASK_ALLOC(x, m) struct x _m, *m = &_m | ||
| 491 | #define NODEMASK_FREE(m) | ||
| 492 | #endif | ||
| 493 | |||
| 494 | /* A example struture for using NODEMASK_ALLOC, used in mempolicy. */ | ||
| 495 | struct nodemask_scratch { | ||
| 496 | nodemask_t mask1; | ||
| 497 | nodemask_t mask2; | ||
| 498 | }; | ||
| 499 | |||
| 500 | #define NODEMASK_SCRATCH(x) NODEMASK_ALLOC(nodemask_scratch, x) | ||
| 501 | #define NODEMASK_SCRATCH_FREE(x) NODEMASK_FREE(x) | ||
| 502 | |||
| 503 | |||
| 476 | #endif /* __LINUX_NODEMASK_H */ | 504 | #endif /* __LINUX_NODEMASK_H */ |
diff --git a/include/linux/perf_counter.h b/include/linux/perf_counter.h index e604e6ef72dd..a9d823a93fe8 100644 --- a/include/linux/perf_counter.h +++ b/include/linux/perf_counter.h | |||
| @@ -121,8 +121,9 @@ enum perf_counter_sample_format { | |||
| 121 | PERF_SAMPLE_CPU = 1U << 7, | 121 | PERF_SAMPLE_CPU = 1U << 7, |
| 122 | PERF_SAMPLE_PERIOD = 1U << 8, | 122 | PERF_SAMPLE_PERIOD = 1U << 8, |
| 123 | PERF_SAMPLE_STREAM_ID = 1U << 9, | 123 | PERF_SAMPLE_STREAM_ID = 1U << 9, |
| 124 | PERF_SAMPLE_RAW = 1U << 10, | ||
| 124 | 125 | ||
| 125 | PERF_SAMPLE_MAX = 1U << 10, /* non-ABI */ | 126 | PERF_SAMPLE_MAX = 1U << 11, /* non-ABI */ |
| 126 | }; | 127 | }; |
| 127 | 128 | ||
| 128 | /* | 129 | /* |
| @@ -368,6 +369,8 @@ enum perf_event_type { | |||
| 368 | * | 369 | * |
| 369 | * { u64 nr, | 370 | * { u64 nr, |
| 370 | * u64 ips[nr]; } && PERF_SAMPLE_CALLCHAIN | 371 | * u64 ips[nr]; } && PERF_SAMPLE_CALLCHAIN |
| 372 | * { u32 size; | ||
| 373 | * char data[size];}&& PERF_SAMPLE_RAW | ||
| 371 | * }; | 374 | * }; |
| 372 | */ | 375 | */ |
| 373 | PERF_EVENT_SAMPLE = 9, | 376 | PERF_EVENT_SAMPLE = 9, |
| @@ -413,6 +416,11 @@ struct perf_callchain_entry { | |||
| 413 | __u64 ip[PERF_MAX_STACK_DEPTH]; | 416 | __u64 ip[PERF_MAX_STACK_DEPTH]; |
| 414 | }; | 417 | }; |
| 415 | 418 | ||
| 419 | struct perf_raw_record { | ||
| 420 | u32 size; | ||
| 421 | void *data; | ||
| 422 | }; | ||
| 423 | |||
| 416 | struct task_struct; | 424 | struct task_struct; |
| 417 | 425 | ||
| 418 | /** | 426 | /** |
| @@ -681,6 +689,7 @@ struct perf_sample_data { | |||
| 681 | struct pt_regs *regs; | 689 | struct pt_regs *regs; |
| 682 | u64 addr; | 690 | u64 addr; |
| 683 | u64 period; | 691 | u64 period; |
| 692 | struct perf_raw_record *raw; | ||
| 684 | }; | 693 | }; |
| 685 | 694 | ||
| 686 | extern int perf_counter_overflow(struct perf_counter *counter, int nmi, | 695 | extern int perf_counter_overflow(struct perf_counter *counter, int nmi, |
diff --git a/include/trace/ftrace.h b/include/trace/ftrace.h index 1867553c61e5..f64fbaae781a 100644 --- a/include/trace/ftrace.h +++ b/include/trace/ftrace.h | |||
| @@ -144,6 +144,9 @@ | |||
| 144 | #undef TP_fast_assign | 144 | #undef TP_fast_assign |
| 145 | #define TP_fast_assign(args...) args | 145 | #define TP_fast_assign(args...) args |
| 146 | 146 | ||
| 147 | #undef TP_perf_assign | ||
| 148 | #define TP_perf_assign(args...) | ||
| 149 | |||
| 147 | #undef TRACE_EVENT | 150 | #undef TRACE_EVENT |
| 148 | #define TRACE_EVENT(call, proto, args, tstruct, func, print) \ | 151 | #define TRACE_EVENT(call, proto, args, tstruct, func, print) \ |
| 149 | static int \ | 152 | static int \ |
| @@ -345,6 +348,56 @@ static inline int ftrace_get_offsets_##call( \ | |||
| 345 | 348 | ||
| 346 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | 349 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) |
| 347 | 350 | ||
| 351 | #ifdef CONFIG_EVENT_PROFILE | ||
| 352 | |||
| 353 | /* | ||
| 354 | * Generate the functions needed for tracepoint perf_counter support. | ||
| 355 | * | ||
| 356 | * NOTE: The insertion profile callback (ftrace_profile_<call>) is defined later | ||
| 357 | * | ||
| 358 | * static int ftrace_profile_enable_<call>(struct ftrace_event_call *event_call) | ||
| 359 | * { | ||
| 360 | * int ret = 0; | ||
| 361 | * | ||
| 362 | * if (!atomic_inc_return(&event_call->profile_count)) | ||
| 363 | * ret = register_trace_<call>(ftrace_profile_<call>); | ||
| 364 | * | ||
| 365 | * return ret; | ||
| 366 | * } | ||
| 367 | * | ||
| 368 | * static void ftrace_profile_disable_<call>(struct ftrace_event_call *event_call) | ||
| 369 | * { | ||
| 370 | * if (atomic_add_negative(-1, &event->call->profile_count)) | ||
| 371 | * unregister_trace_<call>(ftrace_profile_<call>); | ||
| 372 | * } | ||
| 373 | * | ||
| 374 | */ | ||
| 375 | |||
| 376 | #undef TRACE_EVENT | ||
| 377 | #define TRACE_EVENT(call, proto, args, tstruct, assign, print) \ | ||
| 378 | \ | ||
| 379 | static void ftrace_profile_##call(proto); \ | ||
| 380 | \ | ||
| 381 | static int ftrace_profile_enable_##call(struct ftrace_event_call *event_call) \ | ||
| 382 | { \ | ||
| 383 | int ret = 0; \ | ||
| 384 | \ | ||
| 385 | if (!atomic_inc_return(&event_call->profile_count)) \ | ||
| 386 | ret = register_trace_##call(ftrace_profile_##call); \ | ||
| 387 | \ | ||
| 388 | return ret; \ | ||
| 389 | } \ | ||
| 390 | \ | ||
| 391 | static void ftrace_profile_disable_##call(struct ftrace_event_call *event_call)\ | ||
| 392 | { \ | ||
| 393 | if (atomic_add_negative(-1, &event_call->profile_count)) \ | ||
| 394 | unregister_trace_##call(ftrace_profile_##call); \ | ||
| 395 | } | ||
| 396 | |||
| 397 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | ||
| 398 | |||
| 399 | #endif | ||
| 400 | |||
| 348 | /* | 401 | /* |
| 349 | * Stage 4 of the trace events. | 402 | * Stage 4 of the trace events. |
| 350 | * | 403 | * |
| @@ -447,28 +500,6 @@ static inline int ftrace_get_offsets_##call( \ | |||
| 447 | #define TP_FMT(fmt, args...) fmt "\n", ##args | 500 | #define TP_FMT(fmt, args...) fmt "\n", ##args |
| 448 | 501 | ||
| 449 | #ifdef CONFIG_EVENT_PROFILE | 502 | #ifdef CONFIG_EVENT_PROFILE |
| 450 | #define _TRACE_PROFILE(call, proto, args) \ | ||
| 451 | static void ftrace_profile_##call(proto) \ | ||
| 452 | { \ | ||
| 453 | extern void perf_tpcounter_event(int); \ | ||
| 454 | perf_tpcounter_event(event_##call.id); \ | ||
| 455 | } \ | ||
| 456 | \ | ||
| 457 | static int ftrace_profile_enable_##call(struct ftrace_event_call *event_call) \ | ||
| 458 | { \ | ||
| 459 | int ret = 0; \ | ||
| 460 | \ | ||
| 461 | if (!atomic_inc_return(&event_call->profile_count)) \ | ||
| 462 | ret = register_trace_##call(ftrace_profile_##call); \ | ||
| 463 | \ | ||
| 464 | return ret; \ | ||
| 465 | } \ | ||
| 466 | \ | ||
| 467 | static void ftrace_profile_disable_##call(struct ftrace_event_call *event_call)\ | ||
| 468 | { \ | ||
| 469 | if (atomic_add_negative(-1, &event_call->profile_count)) \ | ||
| 470 | unregister_trace_##call(ftrace_profile_##call); \ | ||
| 471 | } | ||
| 472 | 503 | ||
| 473 | #define _TRACE_PROFILE_INIT(call) \ | 504 | #define _TRACE_PROFILE_INIT(call) \ |
| 474 | .profile_count = ATOMIC_INIT(-1), \ | 505 | .profile_count = ATOMIC_INIT(-1), \ |
| @@ -476,7 +507,6 @@ static void ftrace_profile_disable_##call(struct ftrace_event_call *event_call)\ | |||
| 476 | .profile_disable = ftrace_profile_disable_##call, | 507 | .profile_disable = ftrace_profile_disable_##call, |
| 477 | 508 | ||
| 478 | #else | 509 | #else |
| 479 | #define _TRACE_PROFILE(call, proto, args) | ||
| 480 | #define _TRACE_PROFILE_INIT(call) | 510 | #define _TRACE_PROFILE_INIT(call) |
| 481 | #endif | 511 | #endif |
| 482 | 512 | ||
| @@ -502,7 +532,6 @@ static void ftrace_profile_disable_##call(struct ftrace_event_call *event_call)\ | |||
| 502 | 532 | ||
| 503 | #undef TRACE_EVENT | 533 | #undef TRACE_EVENT |
| 504 | #define TRACE_EVENT(call, proto, args, tstruct, assign, print) \ | 534 | #define TRACE_EVENT(call, proto, args, tstruct, assign, print) \ |
| 505 | _TRACE_PROFILE(call, PARAMS(proto), PARAMS(args)) \ | ||
| 506 | \ | 535 | \ |
| 507 | static struct ftrace_event_call event_##call; \ | 536 | static struct ftrace_event_call event_##call; \ |
| 508 | \ | 537 | \ |
| @@ -586,6 +615,110 @@ __attribute__((section("_ftrace_events"))) event_##call = { \ | |||
| 586 | 615 | ||
| 587 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | 616 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) |
| 588 | 617 | ||
| 589 | #undef _TRACE_PROFILE | 618 | /* |
| 619 | * Define the insertion callback to profile events | ||
| 620 | * | ||
| 621 | * The job is very similar to ftrace_raw_event_<call> except that we don't | ||
| 622 | * insert in the ring buffer but in a perf counter. | ||
| 623 | * | ||
| 624 | * static void ftrace_profile_<call>(proto) | ||
| 625 | * { | ||
| 626 | * struct ftrace_data_offsets_<call> __maybe_unused __data_offsets; | ||
| 627 | * struct ftrace_event_call *event_call = &event_<call>; | ||
| 628 | * extern void perf_tpcounter_event(int, u64, u64, void *, int); | ||
| 629 | * struct ftrace_raw_##call *entry; | ||
| 630 | * u64 __addr = 0, __count = 1; | ||
| 631 | * unsigned long irq_flags; | ||
| 632 | * int __entry_size; | ||
| 633 | * int __data_size; | ||
| 634 | * int pc; | ||
| 635 | * | ||
| 636 | * local_save_flags(irq_flags); | ||
| 637 | * pc = preempt_count(); | ||
| 638 | * | ||
| 639 | * __data_size = ftrace_get_offsets_<call>(&__data_offsets, args); | ||
| 640 | * | ||
| 641 | * // Below we want to get the aligned size by taking into account | ||
| 642 | * // the u32 field that will later store the buffer size | ||
| 643 | * __entry_size = ALIGN(__data_size + sizeof(*entry) + sizeof(u32), | ||
| 644 | * sizeof(u64)); | ||
| 645 | * __entry_size -= sizeof(u32); | ||
| 646 | * | ||
| 647 | * do { | ||
| 648 | * char raw_data[__entry_size]; <- allocate our sample in the stack | ||
| 649 | * struct trace_entry *ent; | ||
| 650 | * | ||
| 651 | * zero dead bytes from alignment to avoid stack leak to userspace: | ||
| 652 | * | ||
| 653 | * *(u64 *)(&raw_data[__entry_size - sizeof(u64)]) = 0ULL; | ||
| 654 | * entry = (struct ftrace_raw_<call> *)raw_data; | ||
| 655 | * ent = &entry->ent; | ||
| 656 | * tracing_generic_entry_update(ent, irq_flags, pc); | ||
| 657 | * ent->type = event_call->id; | ||
| 658 | * | ||
| 659 | * <tstruct> <- do some jobs with dynamic arrays | ||
| 660 | * | ||
| 661 | * <assign> <- affect our values | ||
| 662 | * | ||
| 663 | * perf_tpcounter_event(event_call->id, __addr, __count, entry, | ||
| 664 | * __entry_size); <- submit them to perf counter | ||
| 665 | * } while (0); | ||
| 666 | * | ||
| 667 | * } | ||
| 668 | */ | ||
| 669 | |||
| 670 | #ifdef CONFIG_EVENT_PROFILE | ||
| 671 | |||
| 672 | #undef __perf_addr | ||
| 673 | #define __perf_addr(a) __addr = (a) | ||
| 674 | |||
| 675 | #undef __perf_count | ||
| 676 | #define __perf_count(c) __count = (c) | ||
| 677 | |||
| 678 | #undef TRACE_EVENT | ||
| 679 | #define TRACE_EVENT(call, proto, args, tstruct, assign, print) \ | ||
| 680 | static void ftrace_profile_##call(proto) \ | ||
| 681 | { \ | ||
| 682 | struct ftrace_data_offsets_##call __maybe_unused __data_offsets;\ | ||
| 683 | struct ftrace_event_call *event_call = &event_##call; \ | ||
| 684 | extern void perf_tpcounter_event(int, u64, u64, void *, int); \ | ||
| 685 | struct ftrace_raw_##call *entry; \ | ||
| 686 | u64 __addr = 0, __count = 1; \ | ||
| 687 | unsigned long irq_flags; \ | ||
| 688 | int __entry_size; \ | ||
| 689 | int __data_size; \ | ||
| 690 | int pc; \ | ||
| 691 | \ | ||
| 692 | local_save_flags(irq_flags); \ | ||
| 693 | pc = preempt_count(); \ | ||
| 694 | \ | ||
| 695 | __data_size = ftrace_get_offsets_##call(&__data_offsets, args); \ | ||
| 696 | __entry_size = ALIGN(__data_size + sizeof(*entry) + sizeof(u32),\ | ||
| 697 | sizeof(u64)); \ | ||
| 698 | __entry_size -= sizeof(u32); \ | ||
| 699 | \ | ||
| 700 | do { \ | ||
| 701 | char raw_data[__entry_size]; \ | ||
| 702 | struct trace_entry *ent; \ | ||
| 703 | \ | ||
| 704 | *(u64 *)(&raw_data[__entry_size - sizeof(u64)]) = 0ULL; \ | ||
| 705 | entry = (struct ftrace_raw_##call *)raw_data; \ | ||
| 706 | ent = &entry->ent; \ | ||
| 707 | tracing_generic_entry_update(ent, irq_flags, pc); \ | ||
| 708 | ent->type = event_call->id; \ | ||
| 709 | \ | ||
| 710 | tstruct \ | ||
| 711 | \ | ||
| 712 | { assign; } \ | ||
| 713 | \ | ||
| 714 | perf_tpcounter_event(event_call->id, __addr, __count, entry,\ | ||
| 715 | __entry_size); \ | ||
| 716 | } while (0); \ | ||
| 717 | \ | ||
| 718 | } | ||
| 719 | |||
| 720 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | ||
| 721 | #endif /* CONFIG_EVENT_PROFILE */ | ||
| 722 | |||
| 590 | #undef _TRACE_PROFILE_INIT | 723 | #undef _TRACE_PROFILE_INIT |
| 591 | 724 | ||
diff --git a/kernel/fork.c b/kernel/fork.c index 466531eb92cc..021e1138556e 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -568,18 +568,18 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm) | |||
| 568 | * the value intact in a core dump, and to save the unnecessary | 568 | * the value intact in a core dump, and to save the unnecessary |
| 569 | * trouble otherwise. Userland only wants this done for a sys_exit. | 569 | * trouble otherwise. Userland only wants this done for a sys_exit. |
| 570 | */ | 570 | */ |
| 571 | if (tsk->clear_child_tid | 571 | if (tsk->clear_child_tid) { |
| 572 | && !(tsk->flags & PF_SIGNALED) | 572 | if (!(tsk->flags & PF_SIGNALED) && |
| 573 | && atomic_read(&mm->mm_users) > 1) { | 573 | atomic_read(&mm->mm_users) > 1) { |
| 574 | u32 __user * tidptr = tsk->clear_child_tid; | 574 | /* |
| 575 | * We don't check the error code - if userspace has | ||
| 576 | * not set up a proper pointer then tough luck. | ||
| 577 | */ | ||
| 578 | put_user(0, tsk->clear_child_tid); | ||
| 579 | sys_futex(tsk->clear_child_tid, FUTEX_WAKE, | ||
| 580 | 1, NULL, NULL, 0); | ||
| 581 | } | ||
| 575 | tsk->clear_child_tid = NULL; | 582 | tsk->clear_child_tid = NULL; |
| 576 | |||
| 577 | /* | ||
| 578 | * We don't check the error code - if userspace has | ||
| 579 | * not set up a proper pointer then tough luck. | ||
| 580 | */ | ||
| 581 | put_user(0, tidptr); | ||
| 582 | sys_futex(tidptr, FUTEX_WAKE, 1, NULL, NULL, 0); | ||
| 583 | } | 583 | } |
| 584 | } | 584 | } |
| 585 | 585 | ||
diff --git a/kernel/irq/numa_migrate.c b/kernel/irq/numa_migrate.c index 2f69bee57bf2..3fd30197da2e 100644 --- a/kernel/irq/numa_migrate.c +++ b/kernel/irq/numa_migrate.c | |||
| @@ -107,8 +107,8 @@ out_unlock: | |||
| 107 | 107 | ||
| 108 | struct irq_desc *move_irq_desc(struct irq_desc *desc, int node) | 108 | struct irq_desc *move_irq_desc(struct irq_desc *desc, int node) |
| 109 | { | 109 | { |
| 110 | /* those all static, do move them */ | 110 | /* those static or target node is -1, do not move them */ |
| 111 | if (desc->irq < NR_IRQS_LEGACY) | 111 | if (desc->irq < NR_IRQS_LEGACY || node == -1) |
| 112 | return desc; | 112 | return desc; |
| 113 | 113 | ||
| 114 | if (desc->node != node) | 114 | if (desc->node != node) |
diff --git a/kernel/lockdep_proc.c b/kernel/lockdep_proc.c index d7135aa2d2c4..e94caa666dba 100644 --- a/kernel/lockdep_proc.c +++ b/kernel/lockdep_proc.c | |||
| @@ -758,7 +758,8 @@ static int __init lockdep_proc_init(void) | |||
| 758 | &proc_lockdep_stats_operations); | 758 | &proc_lockdep_stats_operations); |
| 759 | 759 | ||
| 760 | #ifdef CONFIG_LOCK_STAT | 760 | #ifdef CONFIG_LOCK_STAT |
| 761 | proc_create("lock_stat", S_IRUSR, NULL, &proc_lock_stat_operations); | 761 | proc_create("lock_stat", S_IRUSR | S_IWUSR, NULL, |
| 762 | &proc_lock_stat_operations); | ||
| 762 | #endif | 763 | #endif |
| 763 | 764 | ||
| 764 | return 0; | 765 | return 0; |
diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c index 199ed4771315..b0b20a07f394 100644 --- a/kernel/perf_counter.c +++ b/kernel/perf_counter.c | |||
| @@ -1104,7 +1104,7 @@ static void perf_counter_sync_stat(struct perf_counter_context *ctx, | |||
| 1104 | __perf_counter_sync_stat(counter, next_counter); | 1104 | __perf_counter_sync_stat(counter, next_counter); |
| 1105 | 1105 | ||
| 1106 | counter = list_next_entry(counter, event_entry); | 1106 | counter = list_next_entry(counter, event_entry); |
| 1107 | next_counter = list_next_entry(counter, event_entry); | 1107 | next_counter = list_next_entry(next_counter, event_entry); |
| 1108 | } | 1108 | } |
| 1109 | } | 1109 | } |
| 1110 | 1110 | ||
| @@ -2714,6 +2714,18 @@ static void perf_counter_output(struct perf_counter *counter, int nmi, | |||
| 2714 | header.size += sizeof(u64); | 2714 | header.size += sizeof(u64); |
| 2715 | } | 2715 | } |
| 2716 | 2716 | ||
| 2717 | if (sample_type & PERF_SAMPLE_RAW) { | ||
| 2718 | int size = sizeof(u32); | ||
| 2719 | |||
| 2720 | if (data->raw) | ||
| 2721 | size += data->raw->size; | ||
| 2722 | else | ||
| 2723 | size += sizeof(u32); | ||
| 2724 | |||
| 2725 | WARN_ON_ONCE(size & (sizeof(u64)-1)); | ||
| 2726 | header.size += size; | ||
| 2727 | } | ||
| 2728 | |||
| 2717 | ret = perf_output_begin(&handle, counter, header.size, nmi, 1); | 2729 | ret = perf_output_begin(&handle, counter, header.size, nmi, 1); |
| 2718 | if (ret) | 2730 | if (ret) |
| 2719 | return; | 2731 | return; |
| @@ -2777,6 +2789,22 @@ static void perf_counter_output(struct perf_counter *counter, int nmi, | |||
| 2777 | } | 2789 | } |
| 2778 | } | 2790 | } |
| 2779 | 2791 | ||
| 2792 | if (sample_type & PERF_SAMPLE_RAW) { | ||
| 2793 | if (data->raw) { | ||
| 2794 | perf_output_put(&handle, data->raw->size); | ||
| 2795 | perf_output_copy(&handle, data->raw->data, data->raw->size); | ||
| 2796 | } else { | ||
| 2797 | struct { | ||
| 2798 | u32 size; | ||
| 2799 | u32 data; | ||
| 2800 | } raw = { | ||
| 2801 | .size = sizeof(u32), | ||
| 2802 | .data = 0, | ||
| 2803 | }; | ||
| 2804 | perf_output_put(&handle, raw); | ||
| 2805 | } | ||
| 2806 | } | ||
| 2807 | |||
| 2780 | perf_output_end(&handle); | 2808 | perf_output_end(&handle); |
| 2781 | } | 2809 | } |
| 2782 | 2810 | ||
| @@ -2840,7 +2868,8 @@ perf_counter_read_event(struct perf_counter *counter, | |||
| 2840 | */ | 2868 | */ |
| 2841 | 2869 | ||
| 2842 | struct perf_task_event { | 2870 | struct perf_task_event { |
| 2843 | struct task_struct *task; | 2871 | struct task_struct *task; |
| 2872 | struct perf_counter_context *task_ctx; | ||
| 2844 | 2873 | ||
| 2845 | struct { | 2874 | struct { |
| 2846 | struct perf_event_header header; | 2875 | struct perf_event_header header; |
| @@ -2900,24 +2929,23 @@ static void perf_counter_task_ctx(struct perf_counter_context *ctx, | |||
| 2900 | static void perf_counter_task_event(struct perf_task_event *task_event) | 2929 | static void perf_counter_task_event(struct perf_task_event *task_event) |
| 2901 | { | 2930 | { |
| 2902 | struct perf_cpu_context *cpuctx; | 2931 | struct perf_cpu_context *cpuctx; |
| 2903 | struct perf_counter_context *ctx; | 2932 | struct perf_counter_context *ctx = task_event->task_ctx; |
| 2904 | 2933 | ||
| 2905 | cpuctx = &get_cpu_var(perf_cpu_context); | 2934 | cpuctx = &get_cpu_var(perf_cpu_context); |
| 2906 | perf_counter_task_ctx(&cpuctx->ctx, task_event); | 2935 | perf_counter_task_ctx(&cpuctx->ctx, task_event); |
| 2907 | put_cpu_var(perf_cpu_context); | 2936 | put_cpu_var(perf_cpu_context); |
| 2908 | 2937 | ||
| 2909 | rcu_read_lock(); | 2938 | rcu_read_lock(); |
| 2910 | /* | 2939 | if (!ctx) |
| 2911 | * doesn't really matter which of the child contexts the | 2940 | ctx = rcu_dereference(task_event->task->perf_counter_ctxp); |
| 2912 | * events ends up in. | ||
| 2913 | */ | ||
| 2914 | ctx = rcu_dereference(current->perf_counter_ctxp); | ||
| 2915 | if (ctx) | 2941 | if (ctx) |
| 2916 | perf_counter_task_ctx(ctx, task_event); | 2942 | perf_counter_task_ctx(ctx, task_event); |
| 2917 | rcu_read_unlock(); | 2943 | rcu_read_unlock(); |
| 2918 | } | 2944 | } |
| 2919 | 2945 | ||
| 2920 | static void perf_counter_task(struct task_struct *task, int new) | 2946 | static void perf_counter_task(struct task_struct *task, |
| 2947 | struct perf_counter_context *task_ctx, | ||
| 2948 | int new) | ||
| 2921 | { | 2949 | { |
| 2922 | struct perf_task_event task_event; | 2950 | struct perf_task_event task_event; |
| 2923 | 2951 | ||
| @@ -2927,8 +2955,9 @@ static void perf_counter_task(struct task_struct *task, int new) | |||
| 2927 | return; | 2955 | return; |
| 2928 | 2956 | ||
| 2929 | task_event = (struct perf_task_event){ | 2957 | task_event = (struct perf_task_event){ |
| 2930 | .task = task, | 2958 | .task = task, |
| 2931 | .event = { | 2959 | .task_ctx = task_ctx, |
| 2960 | .event = { | ||
| 2932 | .header = { | 2961 | .header = { |
| 2933 | .type = new ? PERF_EVENT_FORK : PERF_EVENT_EXIT, | 2962 | .type = new ? PERF_EVENT_FORK : PERF_EVENT_EXIT, |
| 2934 | .misc = 0, | 2963 | .misc = 0, |
| @@ -2946,7 +2975,7 @@ static void perf_counter_task(struct task_struct *task, int new) | |||
| 2946 | 2975 | ||
| 2947 | void perf_counter_fork(struct task_struct *task) | 2976 | void perf_counter_fork(struct task_struct *task) |
| 2948 | { | 2977 | { |
| 2949 | perf_counter_task(task, 1); | 2978 | perf_counter_task(task, NULL, 1); |
| 2950 | } | 2979 | } |
| 2951 | 2980 | ||
| 2952 | /* | 2981 | /* |
| @@ -3335,87 +3364,81 @@ int perf_counter_overflow(struct perf_counter *counter, int nmi, | |||
| 3335 | * Generic software counter infrastructure | 3364 | * Generic software counter infrastructure |
| 3336 | */ | 3365 | */ |
| 3337 | 3366 | ||
| 3338 | static void perf_swcounter_update(struct perf_counter *counter) | 3367 | /* |
| 3368 | * We directly increment counter->count and keep a second value in | ||
| 3369 | * counter->hw.period_left to count intervals. This period counter | ||
| 3370 | * is kept in the range [-sample_period, 0] so that we can use the | ||
| 3371 | * sign as trigger. | ||
| 3372 | */ | ||
| 3373 | |||
| 3374 | static u64 perf_swcounter_set_period(struct perf_counter *counter) | ||
| 3339 | { | 3375 | { |
| 3340 | struct hw_perf_counter *hwc = &counter->hw; | 3376 | struct hw_perf_counter *hwc = &counter->hw; |
| 3341 | u64 prev, now; | 3377 | u64 period = hwc->last_period; |
| 3342 | s64 delta; | 3378 | u64 nr, offset; |
| 3379 | s64 old, val; | ||
| 3380 | |||
| 3381 | hwc->last_period = hwc->sample_period; | ||
| 3343 | 3382 | ||
| 3344 | again: | 3383 | again: |
| 3345 | prev = atomic64_read(&hwc->prev_count); | 3384 | old = val = atomic64_read(&hwc->period_left); |
| 3346 | now = atomic64_read(&hwc->count); | 3385 | if (val < 0) |
| 3347 | if (atomic64_cmpxchg(&hwc->prev_count, prev, now) != prev) | 3386 | return 0; |
| 3348 | goto again; | ||
| 3349 | 3387 | ||
| 3350 | delta = now - prev; | 3388 | nr = div64_u64(period + val, period); |
| 3389 | offset = nr * period; | ||
| 3390 | val -= offset; | ||
| 3391 | if (atomic64_cmpxchg(&hwc->period_left, old, val) != old) | ||
| 3392 | goto again; | ||
| 3351 | 3393 | ||
| 3352 | atomic64_add(delta, &counter->count); | 3394 | return nr; |
| 3353 | atomic64_sub(delta, &hwc->period_left); | ||
| 3354 | } | 3395 | } |
| 3355 | 3396 | ||
| 3356 | static void perf_swcounter_set_period(struct perf_counter *counter) | 3397 | static void perf_swcounter_overflow(struct perf_counter *counter, |
| 3398 | int nmi, struct perf_sample_data *data) | ||
| 3357 | { | 3399 | { |
| 3358 | struct hw_perf_counter *hwc = &counter->hw; | 3400 | struct hw_perf_counter *hwc = &counter->hw; |
| 3359 | s64 left = atomic64_read(&hwc->period_left); | 3401 | u64 overflow; |
| 3360 | s64 period = hwc->sample_period; | ||
| 3361 | 3402 | ||
| 3362 | if (unlikely(left <= -period)) { | 3403 | data->period = counter->hw.last_period; |
| 3363 | left = period; | 3404 | overflow = perf_swcounter_set_period(counter); |
| 3364 | atomic64_set(&hwc->period_left, left); | ||
| 3365 | hwc->last_period = period; | ||
| 3366 | } | ||
| 3367 | 3405 | ||
| 3368 | if (unlikely(left <= 0)) { | 3406 | if (hwc->interrupts == MAX_INTERRUPTS) |
| 3369 | left += period; | 3407 | return; |
| 3370 | atomic64_add(period, &hwc->period_left); | ||
| 3371 | hwc->last_period = period; | ||
| 3372 | } | ||
| 3373 | 3408 | ||
| 3374 | atomic64_set(&hwc->prev_count, -left); | 3409 | for (; overflow; overflow--) { |
| 3375 | atomic64_set(&hwc->count, -left); | 3410 | if (perf_counter_overflow(counter, nmi, data)) { |
| 3411 | /* | ||
| 3412 | * We inhibit the overflow from happening when | ||
| 3413 | * hwc->interrupts == MAX_INTERRUPTS. | ||
| 3414 | */ | ||
| 3415 | break; | ||
| 3416 | } | ||
| 3417 | } | ||
| 3376 | } | 3418 | } |
| 3377 | 3419 | ||
| 3378 | static enum hrtimer_restart perf_swcounter_hrtimer(struct hrtimer *hrtimer) | 3420 | static void perf_swcounter_unthrottle(struct perf_counter *counter) |
| 3379 | { | 3421 | { |
| 3380 | enum hrtimer_restart ret = HRTIMER_RESTART; | ||
| 3381 | struct perf_sample_data data; | ||
| 3382 | struct perf_counter *counter; | ||
| 3383 | u64 period; | ||
| 3384 | |||
| 3385 | counter = container_of(hrtimer, struct perf_counter, hw.hrtimer); | ||
| 3386 | counter->pmu->read(counter); | ||
| 3387 | |||
| 3388 | data.addr = 0; | ||
| 3389 | data.regs = get_irq_regs(); | ||
| 3390 | /* | 3422 | /* |
| 3391 | * In case we exclude kernel IPs or are somehow not in interrupt | 3423 | * Nothing to do, we already reset hwc->interrupts. |
| 3392 | * context, provide the next best thing, the user IP. | ||
| 3393 | */ | 3424 | */ |
| 3394 | if ((counter->attr.exclude_kernel || !data.regs) && | 3425 | } |
| 3395 | !counter->attr.exclude_user) | ||
| 3396 | data.regs = task_pt_regs(current); | ||
| 3397 | 3426 | ||
| 3398 | if (data.regs) { | 3427 | static void perf_swcounter_add(struct perf_counter *counter, u64 nr, |
| 3399 | if (perf_counter_overflow(counter, 0, &data)) | 3428 | int nmi, struct perf_sample_data *data) |
| 3400 | ret = HRTIMER_NORESTART; | 3429 | { |
| 3401 | } | 3430 | struct hw_perf_counter *hwc = &counter->hw; |
| 3402 | 3431 | ||
| 3403 | period = max_t(u64, 10000, counter->hw.sample_period); | 3432 | atomic64_add(nr, &counter->count); |
| 3404 | hrtimer_forward_now(hrtimer, ns_to_ktime(period)); | ||
| 3405 | 3433 | ||
| 3406 | return ret; | 3434 | if (!hwc->sample_period) |
| 3407 | } | 3435 | return; |
| 3408 | 3436 | ||
| 3409 | static void perf_swcounter_overflow(struct perf_counter *counter, | 3437 | if (!data->regs) |
| 3410 | int nmi, struct perf_sample_data *data) | 3438 | return; |
| 3411 | { | ||
| 3412 | data->period = counter->hw.last_period; | ||
| 3413 | 3439 | ||
| 3414 | perf_swcounter_update(counter); | 3440 | if (!atomic64_add_negative(nr, &hwc->period_left)) |
| 3415 | perf_swcounter_set_period(counter); | 3441 | perf_swcounter_overflow(counter, nmi, data); |
| 3416 | if (perf_counter_overflow(counter, nmi, data)) | ||
| 3417 | /* soft-disable the counter */ | ||
| 3418 | ; | ||
| 3419 | } | 3442 | } |
| 3420 | 3443 | ||
| 3421 | static int perf_swcounter_is_counting(struct perf_counter *counter) | 3444 | static int perf_swcounter_is_counting(struct perf_counter *counter) |
| @@ -3479,15 +3502,6 @@ static int perf_swcounter_match(struct perf_counter *counter, | |||
| 3479 | return 1; | 3502 | return 1; |
| 3480 | } | 3503 | } |
| 3481 | 3504 | ||
| 3482 | static void perf_swcounter_add(struct perf_counter *counter, u64 nr, | ||
| 3483 | int nmi, struct perf_sample_data *data) | ||
| 3484 | { | ||
| 3485 | int neg = atomic64_add_negative(nr, &counter->hw.count); | ||
| 3486 | |||
| 3487 | if (counter->hw.sample_period && !neg && data->regs) | ||
| 3488 | perf_swcounter_overflow(counter, nmi, data); | ||
| 3489 | } | ||
| 3490 | |||
| 3491 | static void perf_swcounter_ctx_event(struct perf_counter_context *ctx, | 3505 | static void perf_swcounter_ctx_event(struct perf_counter_context *ctx, |
| 3492 | enum perf_type_id type, | 3506 | enum perf_type_id type, |
| 3493 | u32 event, u64 nr, int nmi, | 3507 | u32 event, u64 nr, int nmi, |
| @@ -3566,27 +3580,66 @@ void __perf_swcounter_event(u32 event, u64 nr, int nmi, | |||
| 3566 | 3580 | ||
| 3567 | static void perf_swcounter_read(struct perf_counter *counter) | 3581 | static void perf_swcounter_read(struct perf_counter *counter) |
| 3568 | { | 3582 | { |
| 3569 | perf_swcounter_update(counter); | ||
| 3570 | } | 3583 | } |
| 3571 | 3584 | ||
| 3572 | static int perf_swcounter_enable(struct perf_counter *counter) | 3585 | static int perf_swcounter_enable(struct perf_counter *counter) |
| 3573 | { | 3586 | { |
| 3574 | perf_swcounter_set_period(counter); | 3587 | struct hw_perf_counter *hwc = &counter->hw; |
| 3588 | |||
| 3589 | if (hwc->sample_period) { | ||
| 3590 | hwc->last_period = hwc->sample_period; | ||
| 3591 | perf_swcounter_set_period(counter); | ||
| 3592 | } | ||
| 3575 | return 0; | 3593 | return 0; |
| 3576 | } | 3594 | } |
| 3577 | 3595 | ||
| 3578 | static void perf_swcounter_disable(struct perf_counter *counter) | 3596 | static void perf_swcounter_disable(struct perf_counter *counter) |
| 3579 | { | 3597 | { |
| 3580 | perf_swcounter_update(counter); | ||
| 3581 | } | 3598 | } |
| 3582 | 3599 | ||
| 3583 | static const struct pmu perf_ops_generic = { | 3600 | static const struct pmu perf_ops_generic = { |
| 3584 | .enable = perf_swcounter_enable, | 3601 | .enable = perf_swcounter_enable, |
| 3585 | .disable = perf_swcounter_disable, | 3602 | .disable = perf_swcounter_disable, |
| 3586 | .read = perf_swcounter_read, | 3603 | .read = perf_swcounter_read, |
| 3604 | .unthrottle = perf_swcounter_unthrottle, | ||
| 3587 | }; | 3605 | }; |
| 3588 | 3606 | ||
| 3589 | /* | 3607 | /* |
| 3608 | * hrtimer based swcounter callback | ||
| 3609 | */ | ||
| 3610 | |||
| 3611 | static enum hrtimer_restart perf_swcounter_hrtimer(struct hrtimer *hrtimer) | ||
| 3612 | { | ||
| 3613 | enum hrtimer_restart ret = HRTIMER_RESTART; | ||
| 3614 | struct perf_sample_data data; | ||
| 3615 | struct perf_counter *counter; | ||
| 3616 | u64 period; | ||
| 3617 | |||
| 3618 | counter = container_of(hrtimer, struct perf_counter, hw.hrtimer); | ||
| 3619 | counter->pmu->read(counter); | ||
| 3620 | |||
| 3621 | data.addr = 0; | ||
| 3622 | data.regs = get_irq_regs(); | ||
| 3623 | /* | ||
| 3624 | * In case we exclude kernel IPs or are somehow not in interrupt | ||
| 3625 | * context, provide the next best thing, the user IP. | ||
| 3626 | */ | ||
| 3627 | if ((counter->attr.exclude_kernel || !data.regs) && | ||
| 3628 | !counter->attr.exclude_user) | ||
| 3629 | data.regs = task_pt_regs(current); | ||
| 3630 | |||
| 3631 | if (data.regs) { | ||
| 3632 | if (perf_counter_overflow(counter, 0, &data)) | ||
| 3633 | ret = HRTIMER_NORESTART; | ||
| 3634 | } | ||
| 3635 | |||
| 3636 | period = max_t(u64, 10000, counter->hw.sample_period); | ||
| 3637 | hrtimer_forward_now(hrtimer, ns_to_ktime(period)); | ||
| 3638 | |||
| 3639 | return ret; | ||
| 3640 | } | ||
| 3641 | |||
| 3642 | /* | ||
| 3590 | * Software counter: cpu wall time clock | 3643 | * Software counter: cpu wall time clock |
| 3591 | */ | 3644 | */ |
| 3592 | 3645 | ||
| @@ -3703,17 +3756,24 @@ static const struct pmu perf_ops_task_clock = { | |||
| 3703 | }; | 3756 | }; |
| 3704 | 3757 | ||
| 3705 | #ifdef CONFIG_EVENT_PROFILE | 3758 | #ifdef CONFIG_EVENT_PROFILE |
| 3706 | void perf_tpcounter_event(int event_id) | 3759 | void perf_tpcounter_event(int event_id, u64 addr, u64 count, void *record, |
| 3760 | int entry_size) | ||
| 3707 | { | 3761 | { |
| 3762 | struct perf_raw_record raw = { | ||
| 3763 | .size = entry_size, | ||
| 3764 | .data = record, | ||
| 3765 | }; | ||
| 3766 | |||
| 3708 | struct perf_sample_data data = { | 3767 | struct perf_sample_data data = { |
| 3709 | .regs = get_irq_regs(), | 3768 | .regs = get_irq_regs(), |
| 3710 | .addr = 0, | 3769 | .addr = addr, |
| 3770 | .raw = &raw, | ||
| 3711 | }; | 3771 | }; |
| 3712 | 3772 | ||
| 3713 | if (!data.regs) | 3773 | if (!data.regs) |
| 3714 | data.regs = task_pt_regs(current); | 3774 | data.regs = task_pt_regs(current); |
| 3715 | 3775 | ||
| 3716 | do_perf_swcounter_event(PERF_TYPE_TRACEPOINT, event_id, 1, 1, &data); | 3776 | do_perf_swcounter_event(PERF_TYPE_TRACEPOINT, event_id, count, 1, &data); |
| 3717 | } | 3777 | } |
| 3718 | EXPORT_SYMBOL_GPL(perf_tpcounter_event); | 3778 | EXPORT_SYMBOL_GPL(perf_tpcounter_event); |
| 3719 | 3779 | ||
| @@ -3727,6 +3787,14 @@ static void tp_perf_counter_destroy(struct perf_counter *counter) | |||
| 3727 | 3787 | ||
| 3728 | static const struct pmu *tp_perf_counter_init(struct perf_counter *counter) | 3788 | static const struct pmu *tp_perf_counter_init(struct perf_counter *counter) |
| 3729 | { | 3789 | { |
| 3790 | /* | ||
| 3791 | * Raw tracepoint data is a severe data leak, only allow root to | ||
| 3792 | * have these. | ||
| 3793 | */ | ||
| 3794 | if ((counter->attr.sample_type & PERF_SAMPLE_RAW) && | ||
| 3795 | !capable(CAP_SYS_ADMIN)) | ||
| 3796 | return ERR_PTR(-EPERM); | ||
| 3797 | |||
| 3730 | if (ftrace_profile_enable(counter->attr.config)) | 3798 | if (ftrace_profile_enable(counter->attr.config)) |
| 3731 | return NULL; | 3799 | return NULL; |
| 3732 | 3800 | ||
| @@ -4269,7 +4337,7 @@ void perf_counter_exit_task(struct task_struct *child) | |||
| 4269 | unsigned long flags; | 4337 | unsigned long flags; |
| 4270 | 4338 | ||
| 4271 | if (likely(!child->perf_counter_ctxp)) { | 4339 | if (likely(!child->perf_counter_ctxp)) { |
| 4272 | perf_counter_task(child, 0); | 4340 | perf_counter_task(child, NULL, 0); |
| 4273 | return; | 4341 | return; |
| 4274 | } | 4342 | } |
| 4275 | 4343 | ||
| @@ -4289,6 +4357,7 @@ void perf_counter_exit_task(struct task_struct *child) | |||
| 4289 | * incremented the context's refcount before we do put_ctx below. | 4357 | * incremented the context's refcount before we do put_ctx below. |
| 4290 | */ | 4358 | */ |
| 4291 | spin_lock(&child_ctx->lock); | 4359 | spin_lock(&child_ctx->lock); |
| 4360 | child->perf_counter_ctxp = NULL; | ||
| 4292 | /* | 4361 | /* |
| 4293 | * If this context is a clone; unclone it so it can't get | 4362 | * If this context is a clone; unclone it so it can't get |
| 4294 | * swapped to another process while we're removing all | 4363 | * swapped to another process while we're removing all |
| @@ -4302,9 +4371,7 @@ void perf_counter_exit_task(struct task_struct *child) | |||
| 4302 | * won't get any samples after PERF_EVENT_EXIT. We can however still | 4371 | * won't get any samples after PERF_EVENT_EXIT. We can however still |
| 4303 | * get a few PERF_EVENT_READ events. | 4372 | * get a few PERF_EVENT_READ events. |
| 4304 | */ | 4373 | */ |
| 4305 | perf_counter_task(child, 0); | 4374 | perf_counter_task(child, child_ctx, 0); |
| 4306 | |||
| 4307 | child->perf_counter_ctxp = NULL; | ||
| 4308 | 4375 | ||
| 4309 | /* | 4376 | /* |
| 4310 | * We can recurse on the same lock type through: | 4377 | * We can recurse on the same lock type through: |
diff --git a/kernel/posix-cpu-timers.c b/kernel/posix-cpu-timers.c index bece7c0b67b2..e33a21cb9407 100644 --- a/kernel/posix-cpu-timers.c +++ b/kernel/posix-cpu-timers.c | |||
| @@ -521,11 +521,12 @@ void posix_cpu_timers_exit(struct task_struct *tsk) | |||
| 521 | } | 521 | } |
| 522 | void posix_cpu_timers_exit_group(struct task_struct *tsk) | 522 | void posix_cpu_timers_exit_group(struct task_struct *tsk) |
| 523 | { | 523 | { |
| 524 | struct task_cputime cputime; | 524 | struct signal_struct *const sig = tsk->signal; |
| 525 | 525 | ||
| 526 | thread_group_cputimer(tsk, &cputime); | ||
| 527 | cleanup_timers(tsk->signal->cpu_timers, | 526 | cleanup_timers(tsk->signal->cpu_timers, |
| 528 | cputime.utime, cputime.stime, cputime.sum_exec_runtime); | 527 | cputime_add(tsk->utime, sig->utime), |
| 528 | cputime_add(tsk->stime, sig->stime), | ||
| 529 | tsk->se.sum_exec_runtime + sig->sum_sched_runtime); | ||
| 529 | } | 530 | } |
| 530 | 531 | ||
| 531 | static void clear_dead_task(struct k_itimer *timer, union cpu_time_count now) | 532 | static void clear_dead_task(struct k_itimer *timer, union cpu_time_count now) |
diff --git a/kernel/rtmutex.c b/kernel/rtmutex.c index fcd107a78c5a..29bd4baf9e75 100644 --- a/kernel/rtmutex.c +++ b/kernel/rtmutex.c | |||
| @@ -1039,16 +1039,14 @@ int rt_mutex_start_proxy_lock(struct rt_mutex *lock, | |||
| 1039 | if (!rt_mutex_owner(lock) || try_to_steal_lock(lock, task)) { | 1039 | if (!rt_mutex_owner(lock) || try_to_steal_lock(lock, task)) { |
| 1040 | /* We got the lock for task. */ | 1040 | /* We got the lock for task. */ |
| 1041 | debug_rt_mutex_lock(lock); | 1041 | debug_rt_mutex_lock(lock); |
| 1042 | |||
| 1043 | rt_mutex_set_owner(lock, task, 0); | 1042 | rt_mutex_set_owner(lock, task, 0); |
| 1044 | 1043 | spin_unlock(&lock->wait_lock); | |
| 1045 | rt_mutex_deadlock_account_lock(lock, task); | 1044 | rt_mutex_deadlock_account_lock(lock, task); |
| 1046 | return 1; | 1045 | return 1; |
| 1047 | } | 1046 | } |
| 1048 | 1047 | ||
| 1049 | ret = task_blocks_on_rt_mutex(lock, waiter, task, detect_deadlock); | 1048 | ret = task_blocks_on_rt_mutex(lock, waiter, task, detect_deadlock); |
| 1050 | 1049 | ||
| 1051 | |||
| 1052 | if (ret && !waiter->task) { | 1050 | if (ret && !waiter->task) { |
| 1053 | /* | 1051 | /* |
| 1054 | * Reset the return value. We might have | 1052 | * Reset the return value. We might have |
diff --git a/kernel/smp.c b/kernel/smp.c index ad63d8501207..94188b8ecc33 100644 --- a/kernel/smp.c +++ b/kernel/smp.c | |||
| @@ -57,7 +57,7 @@ hotplug_cfd(struct notifier_block *nfb, unsigned long action, void *hcpu) | |||
| 57 | return NOTIFY_BAD; | 57 | return NOTIFY_BAD; |
| 58 | break; | 58 | break; |
| 59 | 59 | ||
| 60 | #ifdef CONFIG_CPU_HOTPLUG | 60 | #ifdef CONFIG_HOTPLUG_CPU |
| 61 | case CPU_UP_CANCELED: | 61 | case CPU_UP_CANCELED: |
| 62 | case CPU_UP_CANCELED_FROZEN: | 62 | case CPU_UP_CANCELED_FROZEN: |
| 63 | 63 | ||
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index bf27bb7a63e2..a330513d96ce 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c | |||
| @@ -735,6 +735,7 @@ ring_buffer_free(struct ring_buffer *buffer) | |||
| 735 | 735 | ||
| 736 | put_online_cpus(); | 736 | put_online_cpus(); |
| 737 | 737 | ||
| 738 | kfree(buffer->buffers); | ||
| 738 | free_cpumask_var(buffer->cpumask); | 739 | free_cpumask_var(buffer->cpumask); |
| 739 | 740 | ||
| 740 | kfree(buffer); | 741 | kfree(buffer); |
| @@ -1785,7 +1786,7 @@ void ring_buffer_discard_commit(struct ring_buffer *buffer, | |||
| 1785 | */ | 1786 | */ |
| 1786 | RB_WARN_ON(buffer, !local_read(&cpu_buffer->committing)); | 1787 | RB_WARN_ON(buffer, !local_read(&cpu_buffer->committing)); |
| 1787 | 1788 | ||
| 1788 | if (!rb_try_to_discard(cpu_buffer, event)) | 1789 | if (rb_try_to_discard(cpu_buffer, event)) |
| 1789 | goto out; | 1790 | goto out; |
| 1790 | 1791 | ||
| 1791 | /* | 1792 | /* |
| @@ -2383,7 +2384,6 @@ rb_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts) | |||
| 2383 | * the box. Return the padding, and we will release | 2384 | * the box. Return the padding, and we will release |
| 2384 | * the current locks, and try again. | 2385 | * the current locks, and try again. |
| 2385 | */ | 2386 | */ |
| 2386 | rb_advance_reader(cpu_buffer); | ||
| 2387 | return event; | 2387 | return event; |
| 2388 | 2388 | ||
| 2389 | case RINGBUF_TYPE_TIME_EXTEND: | 2389 | case RINGBUF_TYPE_TIME_EXTEND: |
| @@ -2486,7 +2486,7 @@ static inline int rb_ok_to_lock(void) | |||
| 2486 | * buffer too. A one time deal is all you get from reading | 2486 | * buffer too. A one time deal is all you get from reading |
| 2487 | * the ring buffer from an NMI. | 2487 | * the ring buffer from an NMI. |
| 2488 | */ | 2488 | */ |
| 2489 | if (likely(!in_nmi() && !oops_in_progress)) | 2489 | if (likely(!in_nmi())) |
| 2490 | return 1; | 2490 | return 1; |
| 2491 | 2491 | ||
| 2492 | tracing_off_permanent(); | 2492 | tracing_off_permanent(); |
| @@ -2519,6 +2519,8 @@ ring_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts) | |||
| 2519 | if (dolock) | 2519 | if (dolock) |
| 2520 | spin_lock(&cpu_buffer->reader_lock); | 2520 | spin_lock(&cpu_buffer->reader_lock); |
| 2521 | event = rb_buffer_peek(buffer, cpu, ts); | 2521 | event = rb_buffer_peek(buffer, cpu, ts); |
| 2522 | if (event && event->type_len == RINGBUF_TYPE_PADDING) | ||
| 2523 | rb_advance_reader(cpu_buffer); | ||
| 2522 | if (dolock) | 2524 | if (dolock) |
| 2523 | spin_unlock(&cpu_buffer->reader_lock); | 2525 | spin_unlock(&cpu_buffer->reader_lock); |
| 2524 | local_irq_restore(flags); | 2526 | local_irq_restore(flags); |
| @@ -2590,12 +2592,9 @@ ring_buffer_consume(struct ring_buffer *buffer, int cpu, u64 *ts) | |||
| 2590 | spin_lock(&cpu_buffer->reader_lock); | 2592 | spin_lock(&cpu_buffer->reader_lock); |
| 2591 | 2593 | ||
| 2592 | event = rb_buffer_peek(buffer, cpu, ts); | 2594 | event = rb_buffer_peek(buffer, cpu, ts); |
| 2593 | if (!event) | 2595 | if (event) |
| 2594 | goto out_unlock; | 2596 | rb_advance_reader(cpu_buffer); |
| 2595 | |||
| 2596 | rb_advance_reader(cpu_buffer); | ||
| 2597 | 2597 | ||
| 2598 | out_unlock: | ||
| 2599 | if (dolock) | 2598 | if (dolock) |
| 2600 | spin_unlock(&cpu_buffer->reader_lock); | 2599 | spin_unlock(&cpu_buffer->reader_lock); |
| 2601 | local_irq_restore(flags); | 2600 | local_irq_restore(flags); |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 8930e39b9d8c..c22b40f8f576 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -848,6 +848,7 @@ tracing_generic_entry_update(struct trace_entry *entry, unsigned long flags, | |||
| 848 | ((pc & SOFTIRQ_MASK) ? TRACE_FLAG_SOFTIRQ : 0) | | 848 | ((pc & SOFTIRQ_MASK) ? TRACE_FLAG_SOFTIRQ : 0) | |
| 849 | (need_resched() ? TRACE_FLAG_NEED_RESCHED : 0); | 849 | (need_resched() ? TRACE_FLAG_NEED_RESCHED : 0); |
| 850 | } | 850 | } |
| 851 | EXPORT_SYMBOL_GPL(tracing_generic_entry_update); | ||
| 851 | 852 | ||
| 852 | struct ring_buffer_event *trace_buffer_lock_reserve(struct trace_array *tr, | 853 | struct ring_buffer_event *trace_buffer_lock_reserve(struct trace_array *tr, |
| 853 | int type, | 854 | int type, |
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 3548ae5cc780..8b9f4f6e9559 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h | |||
| @@ -438,10 +438,6 @@ struct trace_entry *tracing_get_trace_entry(struct trace_array *tr, | |||
| 438 | struct trace_entry *trace_find_next_entry(struct trace_iterator *iter, | 438 | struct trace_entry *trace_find_next_entry(struct trace_iterator *iter, |
| 439 | int *ent_cpu, u64 *ent_ts); | 439 | int *ent_cpu, u64 *ent_ts); |
| 440 | 440 | ||
| 441 | void tracing_generic_entry_update(struct trace_entry *entry, | ||
| 442 | unsigned long flags, | ||
| 443 | int pc); | ||
| 444 | |||
| 445 | void default_wait_pipe(struct trace_iterator *iter); | 441 | void default_wait_pipe(struct trace_iterator *iter); |
| 446 | void poll_wait_pipe(struct trace_iterator *iter); | 442 | void poll_wait_pipe(struct trace_iterator *iter); |
| 447 | 443 | ||
diff --git a/kernel/trace/trace_event_profile.c b/kernel/trace/trace_event_profile.c index 5b5895afecfe..11ba5bb4ed0a 100644 --- a/kernel/trace/trace_event_profile.c +++ b/kernel/trace/trace_event_profile.c | |||
| @@ -14,7 +14,7 @@ int ftrace_profile_enable(int event_id) | |||
| 14 | 14 | ||
| 15 | mutex_lock(&event_mutex); | 15 | mutex_lock(&event_mutex); |
| 16 | list_for_each_entry(event, &ftrace_events, list) { | 16 | list_for_each_entry(event, &ftrace_events, list) { |
| 17 | if (event->id == event_id) { | 17 | if (event->id == event_id && event->profile_enable) { |
| 18 | ret = event->profile_enable(event); | 18 | ret = event->profile_enable(event); |
| 19 | break; | 19 | break; |
| 20 | } | 20 | } |
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 23d2972b22d6..e75276a49cf5 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c | |||
| @@ -940,7 +940,7 @@ event_create_dir(struct ftrace_event_call *call, struct dentry *d_events, | |||
| 940 | entry = trace_create_file("enable", 0644, call->dir, call, | 940 | entry = trace_create_file("enable", 0644, call->dir, call, |
| 941 | enable); | 941 | enable); |
| 942 | 942 | ||
| 943 | if (call->id) | 943 | if (call->id && call->profile_enable) |
| 944 | entry = trace_create_file("id", 0444, call->dir, call, | 944 | entry = trace_create_file("id", 0444, call->dir, call, |
| 945 | id); | 945 | id); |
| 946 | 946 | ||
diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c index 936c621bbf46..f32dc9d1ea7b 100644 --- a/kernel/trace/trace_events_filter.c +++ b/kernel/trace/trace_events_filter.c | |||
| @@ -624,9 +624,6 @@ static int filter_add_subsystem_pred(struct filter_parse_state *ps, | |||
| 624 | return -ENOSPC; | 624 | return -ENOSPC; |
| 625 | } | 625 | } |
| 626 | 626 | ||
| 627 | filter->preds[filter->n_preds] = pred; | ||
| 628 | filter->n_preds++; | ||
| 629 | |||
| 630 | list_for_each_entry(call, &ftrace_events, list) { | 627 | list_for_each_entry(call, &ftrace_events, list) { |
| 631 | 628 | ||
| 632 | if (!call->define_fields) | 629 | if (!call->define_fields) |
| @@ -643,6 +640,9 @@ static int filter_add_subsystem_pred(struct filter_parse_state *ps, | |||
| 643 | } | 640 | } |
| 644 | replace_filter_string(call->filter, filter_string); | 641 | replace_filter_string(call->filter, filter_string); |
| 645 | } | 642 | } |
| 643 | |||
| 644 | filter->preds[filter->n_preds] = pred; | ||
| 645 | filter->n_preds++; | ||
| 646 | out: | 646 | out: |
| 647 | return err; | 647 | return err; |
| 648 | } | 648 | } |
| @@ -1029,12 +1029,17 @@ static int replace_preds(struct event_subsystem *system, | |||
| 1029 | 1029 | ||
| 1030 | if (elt->op == OP_AND || elt->op == OP_OR) { | 1030 | if (elt->op == OP_AND || elt->op == OP_OR) { |
| 1031 | pred = create_logical_pred(elt->op); | 1031 | pred = create_logical_pred(elt->op); |
| 1032 | if (!pred) | ||
| 1033 | return -ENOMEM; | ||
| 1032 | if (call) { | 1034 | if (call) { |
| 1033 | err = filter_add_pred(ps, call, pred); | 1035 | err = filter_add_pred(ps, call, pred); |
| 1034 | filter_free_pred(pred); | 1036 | filter_free_pred(pred); |
| 1035 | } else | 1037 | } else { |
| 1036 | err = filter_add_subsystem_pred(ps, system, | 1038 | err = filter_add_subsystem_pred(ps, system, |
| 1037 | pred, filter_string); | 1039 | pred, filter_string); |
| 1040 | if (err) | ||
| 1041 | filter_free_pred(pred); | ||
| 1042 | } | ||
| 1038 | if (err) | 1043 | if (err) |
| 1039 | return err; | 1044 | return err; |
| 1040 | 1045 | ||
| @@ -1048,12 +1053,17 @@ static int replace_preds(struct event_subsystem *system, | |||
| 1048 | } | 1053 | } |
| 1049 | 1054 | ||
| 1050 | pred = create_pred(elt->op, operand1, operand2); | 1055 | pred = create_pred(elt->op, operand1, operand2); |
| 1056 | if (!pred) | ||
| 1057 | return -ENOMEM; | ||
| 1051 | if (call) { | 1058 | if (call) { |
| 1052 | err = filter_add_pred(ps, call, pred); | 1059 | err = filter_add_pred(ps, call, pred); |
| 1053 | filter_free_pred(pred); | 1060 | filter_free_pred(pred); |
| 1054 | } else | 1061 | } else { |
| 1055 | err = filter_add_subsystem_pred(ps, system, pred, | 1062 | err = filter_add_subsystem_pred(ps, system, pred, |
| 1056 | filter_string); | 1063 | filter_string); |
| 1064 | if (err) | ||
| 1065 | filter_free_pred(pred); | ||
| 1066 | } | ||
| 1057 | if (err) | 1067 | if (err) |
| 1058 | return err; | 1068 | return err; |
| 1059 | 1069 | ||
diff --git a/lib/decompress_bunzip2.c b/lib/decompress_bunzip2.c index 708e2a86d87b..600f473a5610 100644 --- a/lib/decompress_bunzip2.c +++ b/lib/decompress_bunzip2.c | |||
| @@ -45,12 +45,14 @@ | |||
| 45 | */ | 45 | */ |
| 46 | 46 | ||
| 47 | 47 | ||
| 48 | #ifndef STATIC | 48 | #ifdef STATIC |
| 49 | #define PREBOOT | ||
| 50 | #else | ||
| 49 | #include <linux/decompress/bunzip2.h> | 51 | #include <linux/decompress/bunzip2.h> |
| 50 | #endif /* !STATIC */ | 52 | #include <linux/slab.h> |
| 53 | #endif /* STATIC */ | ||
| 51 | 54 | ||
| 52 | #include <linux/decompress/mm.h> | 55 | #include <linux/decompress/mm.h> |
| 53 | #include <linux/slab.h> | ||
| 54 | 56 | ||
| 55 | #ifndef INT_MAX | 57 | #ifndef INT_MAX |
| 56 | #define INT_MAX 0x7fffffff | 58 | #define INT_MAX 0x7fffffff |
| @@ -681,9 +683,7 @@ STATIC int INIT bunzip2(unsigned char *buf, int len, | |||
| 681 | set_error_fn(error_fn); | 683 | set_error_fn(error_fn); |
| 682 | if (flush) | 684 | if (flush) |
| 683 | outbuf = malloc(BZIP2_IOBUF_SIZE); | 685 | outbuf = malloc(BZIP2_IOBUF_SIZE); |
| 684 | else | 686 | |
| 685 | len -= 4; /* Uncompressed size hack active in pre-boot | ||
| 686 | environment */ | ||
| 687 | if (!outbuf) { | 687 | if (!outbuf) { |
| 688 | error("Could not allocate output bufer"); | 688 | error("Could not allocate output bufer"); |
| 689 | return -1; | 689 | return -1; |
| @@ -733,4 +733,14 @@ exit_0: | |||
| 733 | return i; | 733 | return i; |
| 734 | } | 734 | } |
| 735 | 735 | ||
| 736 | #define decompress bunzip2 | 736 | #ifdef PREBOOT |
| 737 | STATIC int INIT decompress(unsigned char *buf, int len, | ||
| 738 | int(*fill)(void*, unsigned int), | ||
| 739 | int(*flush)(void*, unsigned int), | ||
| 740 | unsigned char *outbuf, | ||
| 741 | int *pos, | ||
| 742 | void(*error_fn)(char *x)) | ||
| 743 | { | ||
| 744 | return bunzip2(buf, len - 4, fill, flush, outbuf, pos, error_fn); | ||
| 745 | } | ||
| 746 | #endif | ||
diff --git a/lib/decompress_inflate.c b/lib/decompress_inflate.c index e36b296fc9f8..68dfce59c1b8 100644 --- a/lib/decompress_inflate.c +++ b/lib/decompress_inflate.c | |||
| @@ -19,13 +19,13 @@ | |||
| 19 | #include "zlib_inflate/inflate.h" | 19 | #include "zlib_inflate/inflate.h" |
| 20 | 20 | ||
| 21 | #include "zlib_inflate/infutil.h" | 21 | #include "zlib_inflate/infutil.h" |
| 22 | #include <linux/slab.h> | ||
| 22 | 23 | ||
| 23 | #endif /* STATIC */ | 24 | #endif /* STATIC */ |
| 24 | 25 | ||
| 25 | #include <linux/decompress/mm.h> | 26 | #include <linux/decompress/mm.h> |
| 26 | #include <linux/slab.h> | ||
| 27 | 27 | ||
| 28 | #define INBUF_LEN (16*1024) | 28 | #define GZIP_IOBUF_SIZE (16*1024) |
| 29 | 29 | ||
| 30 | /* Included from initramfs et al code */ | 30 | /* Included from initramfs et al code */ |
| 31 | STATIC int INIT gunzip(unsigned char *buf, int len, | 31 | STATIC int INIT gunzip(unsigned char *buf, int len, |
| @@ -55,7 +55,7 @@ STATIC int INIT gunzip(unsigned char *buf, int len, | |||
| 55 | if (buf) | 55 | if (buf) |
| 56 | zbuf = buf; | 56 | zbuf = buf; |
| 57 | else { | 57 | else { |
| 58 | zbuf = malloc(INBUF_LEN); | 58 | zbuf = malloc(GZIP_IOBUF_SIZE); |
| 59 | len = 0; | 59 | len = 0; |
| 60 | } | 60 | } |
| 61 | if (!zbuf) { | 61 | if (!zbuf) { |
| @@ -77,7 +77,7 @@ STATIC int INIT gunzip(unsigned char *buf, int len, | |||
| 77 | } | 77 | } |
| 78 | 78 | ||
| 79 | if (len == 0) | 79 | if (len == 0) |
| 80 | len = fill(zbuf, INBUF_LEN); | 80 | len = fill(zbuf, GZIP_IOBUF_SIZE); |
| 81 | 81 | ||
| 82 | /* verify the gzip header */ | 82 | /* verify the gzip header */ |
| 83 | if (len < 10 || | 83 | if (len < 10 || |
| @@ -113,7 +113,7 @@ STATIC int INIT gunzip(unsigned char *buf, int len, | |||
| 113 | while (rc == Z_OK) { | 113 | while (rc == Z_OK) { |
| 114 | if (strm->avail_in == 0) { | 114 | if (strm->avail_in == 0) { |
| 115 | /* TODO: handle case where both pos and fill are set */ | 115 | /* TODO: handle case where both pos and fill are set */ |
| 116 | len = fill(zbuf, INBUF_LEN); | 116 | len = fill(zbuf, GZIP_IOBUF_SIZE); |
| 117 | if (len < 0) { | 117 | if (len < 0) { |
| 118 | rc = -1; | 118 | rc = -1; |
| 119 | error("read error"); | 119 | error("read error"); |
diff --git a/lib/decompress_unlzma.c b/lib/decompress_unlzma.c index 32123a1340e6..0b954e04bd30 100644 --- a/lib/decompress_unlzma.c +++ b/lib/decompress_unlzma.c | |||
| @@ -29,12 +29,14 @@ | |||
| 29 | *Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | 29 | *Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
| 30 | */ | 30 | */ |
| 31 | 31 | ||
| 32 | #ifndef STATIC | 32 | #ifdef STATIC |
| 33 | #define PREBOOT | ||
| 34 | #else | ||
| 33 | #include <linux/decompress/unlzma.h> | 35 | #include <linux/decompress/unlzma.h> |
| 36 | #include <linux/slab.h> | ||
| 34 | #endif /* STATIC */ | 37 | #endif /* STATIC */ |
| 35 | 38 | ||
| 36 | #include <linux/decompress/mm.h> | 39 | #include <linux/decompress/mm.h> |
| 37 | #include <linux/slab.h> | ||
| 38 | 40 | ||
| 39 | #define MIN(a, b) (((a) < (b)) ? (a) : (b)) | 41 | #define MIN(a, b) (((a) < (b)) ? (a) : (b)) |
| 40 | 42 | ||
| @@ -543,9 +545,7 @@ STATIC inline int INIT unlzma(unsigned char *buf, int in_len, | |||
| 543 | int ret = -1; | 545 | int ret = -1; |
| 544 | 546 | ||
| 545 | set_error_fn(error_fn); | 547 | set_error_fn(error_fn); |
| 546 | if (!flush) | 548 | |
| 547 | in_len -= 4; /* Uncompressed size hack active in pre-boot | ||
| 548 | environment */ | ||
| 549 | if (buf) | 549 | if (buf) |
| 550 | inbuf = buf; | 550 | inbuf = buf; |
| 551 | else | 551 | else |
| @@ -645,4 +645,15 @@ exit_0: | |||
| 645 | return ret; | 645 | return ret; |
| 646 | } | 646 | } |
| 647 | 647 | ||
| 648 | #define decompress unlzma | 648 | #ifdef PREBOOT |
| 649 | STATIC int INIT decompress(unsigned char *buf, int in_len, | ||
| 650 | int(*fill)(void*, unsigned int), | ||
| 651 | int(*flush)(void*, unsigned int), | ||
| 652 | unsigned char *output, | ||
| 653 | int *posp, | ||
| 654 | void(*error_fn)(char *x) | ||
| 655 | ) | ||
| 656 | { | ||
| 657 | return unlzma(buf, in_len - 4, fill, flush, output, posp, error_fn); | ||
| 658 | } | ||
| 659 | #endif | ||
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index e08e2c4da63a..7dd9d9f80694 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
| @@ -191,25 +191,27 @@ static int mpol_new_bind(struct mempolicy *pol, const nodemask_t *nodes) | |||
| 191 | * Must be called holding task's alloc_lock to protect task's mems_allowed | 191 | * Must be called holding task's alloc_lock to protect task's mems_allowed |
| 192 | * and mempolicy. May also be called holding the mmap_semaphore for write. | 192 | * and mempolicy. May also be called holding the mmap_semaphore for write. |
| 193 | */ | 193 | */ |
| 194 | static int mpol_set_nodemask(struct mempolicy *pol, const nodemask_t *nodes) | 194 | static int mpol_set_nodemask(struct mempolicy *pol, |
| 195 | const nodemask_t *nodes, struct nodemask_scratch *nsc) | ||
| 195 | { | 196 | { |
| 196 | nodemask_t cpuset_context_nmask; | ||
| 197 | int ret; | 197 | int ret; |
| 198 | 198 | ||
| 199 | /* if mode is MPOL_DEFAULT, pol is NULL. This is right. */ | 199 | /* if mode is MPOL_DEFAULT, pol is NULL. This is right. */ |
| 200 | if (pol == NULL) | 200 | if (pol == NULL) |
| 201 | return 0; | 201 | return 0; |
| 202 | /* Check N_HIGH_MEMORY */ | ||
| 203 | nodes_and(nsc->mask1, | ||
| 204 | cpuset_current_mems_allowed, node_states[N_HIGH_MEMORY]); | ||
| 202 | 205 | ||
| 203 | VM_BUG_ON(!nodes); | 206 | VM_BUG_ON(!nodes); |
| 204 | if (pol->mode == MPOL_PREFERRED && nodes_empty(*nodes)) | 207 | if (pol->mode == MPOL_PREFERRED && nodes_empty(*nodes)) |
| 205 | nodes = NULL; /* explicit local allocation */ | 208 | nodes = NULL; /* explicit local allocation */ |
| 206 | else { | 209 | else { |
| 207 | if (pol->flags & MPOL_F_RELATIVE_NODES) | 210 | if (pol->flags & MPOL_F_RELATIVE_NODES) |
| 208 | mpol_relative_nodemask(&cpuset_context_nmask, nodes, | 211 | mpol_relative_nodemask(&nsc->mask2, nodes,&nsc->mask1); |
| 209 | &cpuset_current_mems_allowed); | ||
| 210 | else | 212 | else |
| 211 | nodes_and(cpuset_context_nmask, *nodes, | 213 | nodes_and(nsc->mask2, *nodes, nsc->mask1); |
| 212 | cpuset_current_mems_allowed); | 214 | |
| 213 | if (mpol_store_user_nodemask(pol)) | 215 | if (mpol_store_user_nodemask(pol)) |
| 214 | pol->w.user_nodemask = *nodes; | 216 | pol->w.user_nodemask = *nodes; |
| 215 | else | 217 | else |
| @@ -217,8 +219,10 @@ static int mpol_set_nodemask(struct mempolicy *pol, const nodemask_t *nodes) | |||
| 217 | cpuset_current_mems_allowed; | 219 | cpuset_current_mems_allowed; |
| 218 | } | 220 | } |
| 219 | 221 | ||
| 220 | ret = mpol_ops[pol->mode].create(pol, | 222 | if (nodes) |
| 221 | nodes ? &cpuset_context_nmask : NULL); | 223 | ret = mpol_ops[pol->mode].create(pol, &nsc->mask2); |
| 224 | else | ||
| 225 | ret = mpol_ops[pol->mode].create(pol, NULL); | ||
| 222 | return ret; | 226 | return ret; |
| 223 | } | 227 | } |
| 224 | 228 | ||
| @@ -620,12 +624,17 @@ static long do_set_mempolicy(unsigned short mode, unsigned short flags, | |||
| 620 | { | 624 | { |
| 621 | struct mempolicy *new, *old; | 625 | struct mempolicy *new, *old; |
| 622 | struct mm_struct *mm = current->mm; | 626 | struct mm_struct *mm = current->mm; |
| 627 | NODEMASK_SCRATCH(scratch); | ||
| 623 | int ret; | 628 | int ret; |
| 624 | 629 | ||
| 625 | new = mpol_new(mode, flags, nodes); | 630 | if (!scratch) |
| 626 | if (IS_ERR(new)) | 631 | return -ENOMEM; |
| 627 | return PTR_ERR(new); | ||
| 628 | 632 | ||
| 633 | new = mpol_new(mode, flags, nodes); | ||
| 634 | if (IS_ERR(new)) { | ||
| 635 | ret = PTR_ERR(new); | ||
| 636 | goto out; | ||
| 637 | } | ||
| 629 | /* | 638 | /* |
| 630 | * prevent changing our mempolicy while show_numa_maps() | 639 | * prevent changing our mempolicy while show_numa_maps() |
| 631 | * is using it. | 640 | * is using it. |
| @@ -635,13 +644,13 @@ static long do_set_mempolicy(unsigned short mode, unsigned short flags, | |||
| 635 | if (mm) | 644 | if (mm) |
| 636 | down_write(&mm->mmap_sem); | 645 | down_write(&mm->mmap_sem); |
| 637 | task_lock(current); | 646 | task_lock(current); |
| 638 | ret = mpol_set_nodemask(new, nodes); | 647 | ret = mpol_set_nodemask(new, nodes, scratch); |
| 639 | if (ret) { | 648 | if (ret) { |
| 640 | task_unlock(current); | 649 | task_unlock(current); |
| 641 | if (mm) | 650 | if (mm) |
| 642 | up_write(&mm->mmap_sem); | 651 | up_write(&mm->mmap_sem); |
| 643 | mpol_put(new); | 652 | mpol_put(new); |
| 644 | return ret; | 653 | goto out; |
| 645 | } | 654 | } |
| 646 | old = current->mempolicy; | 655 | old = current->mempolicy; |
| 647 | current->mempolicy = new; | 656 | current->mempolicy = new; |
| @@ -654,7 +663,10 @@ static long do_set_mempolicy(unsigned short mode, unsigned short flags, | |||
| 654 | up_write(&mm->mmap_sem); | 663 | up_write(&mm->mmap_sem); |
| 655 | 664 | ||
| 656 | mpol_put(old); | 665 | mpol_put(old); |
| 657 | return 0; | 666 | ret = 0; |
| 667 | out: | ||
| 668 | NODEMASK_SCRATCH_FREE(scratch); | ||
| 669 | return ret; | ||
| 658 | } | 670 | } |
| 659 | 671 | ||
| 660 | /* | 672 | /* |
| @@ -1014,12 +1026,20 @@ static long do_mbind(unsigned long start, unsigned long len, | |||
| 1014 | if (err) | 1026 | if (err) |
| 1015 | return err; | 1027 | return err; |
| 1016 | } | 1028 | } |
| 1017 | down_write(&mm->mmap_sem); | 1029 | { |
| 1018 | task_lock(current); | 1030 | NODEMASK_SCRATCH(scratch); |
| 1019 | err = mpol_set_nodemask(new, nmask); | 1031 | if (scratch) { |
| 1020 | task_unlock(current); | 1032 | down_write(&mm->mmap_sem); |
| 1033 | task_lock(current); | ||
| 1034 | err = mpol_set_nodemask(new, nmask, scratch); | ||
| 1035 | task_unlock(current); | ||
| 1036 | if (err) | ||
| 1037 | up_write(&mm->mmap_sem); | ||
| 1038 | } else | ||
| 1039 | err = -ENOMEM; | ||
| 1040 | NODEMASK_SCRATCH_FREE(scratch); | ||
| 1041 | } | ||
| 1021 | if (err) { | 1042 | if (err) { |
| 1022 | up_write(&mm->mmap_sem); | ||
| 1023 | mpol_put(new); | 1043 | mpol_put(new); |
| 1024 | return err; | 1044 | return err; |
| 1025 | } | 1045 | } |
| @@ -1891,6 +1911,7 @@ restart: | |||
| 1891 | * Install non-NULL @mpol in inode's shared policy rb-tree. | 1911 | * Install non-NULL @mpol in inode's shared policy rb-tree. |
| 1892 | * On entry, the current task has a reference on a non-NULL @mpol. | 1912 | * On entry, the current task has a reference on a non-NULL @mpol. |
| 1893 | * This must be released on exit. | 1913 | * This must be released on exit. |
| 1914 | * This is called at get_inode() calls and we can use GFP_KERNEL. | ||
| 1894 | */ | 1915 | */ |
| 1895 | void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol) | 1916 | void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol) |
| 1896 | { | 1917 | { |
| @@ -1902,19 +1923,24 @@ void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol) | |||
| 1902 | if (mpol) { | 1923 | if (mpol) { |
| 1903 | struct vm_area_struct pvma; | 1924 | struct vm_area_struct pvma; |
| 1904 | struct mempolicy *new; | 1925 | struct mempolicy *new; |
| 1926 | NODEMASK_SCRATCH(scratch); | ||
| 1905 | 1927 | ||
| 1928 | if (!scratch) | ||
| 1929 | return; | ||
| 1906 | /* contextualize the tmpfs mount point mempolicy */ | 1930 | /* contextualize the tmpfs mount point mempolicy */ |
| 1907 | new = mpol_new(mpol->mode, mpol->flags, &mpol->w.user_nodemask); | 1931 | new = mpol_new(mpol->mode, mpol->flags, &mpol->w.user_nodemask); |
| 1908 | if (IS_ERR(new)) { | 1932 | if (IS_ERR(new)) { |
| 1909 | mpol_put(mpol); /* drop our ref on sb mpol */ | 1933 | mpol_put(mpol); /* drop our ref on sb mpol */ |
| 1934 | NODEMASK_SCRATCH_FREE(scratch); | ||
| 1910 | return; /* no valid nodemask intersection */ | 1935 | return; /* no valid nodemask intersection */ |
| 1911 | } | 1936 | } |
| 1912 | 1937 | ||
| 1913 | task_lock(current); | 1938 | task_lock(current); |
| 1914 | ret = mpol_set_nodemask(new, &mpol->w.user_nodemask); | 1939 | ret = mpol_set_nodemask(new, &mpol->w.user_nodemask, scratch); |
| 1915 | task_unlock(current); | 1940 | task_unlock(current); |
| 1916 | mpol_put(mpol); /* drop our ref on sb mpol */ | 1941 | mpol_put(mpol); /* drop our ref on sb mpol */ |
| 1917 | if (ret) { | 1942 | if (ret) { |
| 1943 | NODEMASK_SCRATCH_FREE(scratch); | ||
| 1918 | mpol_put(new); | 1944 | mpol_put(new); |
| 1919 | return; | 1945 | return; |
| 1920 | } | 1946 | } |
| @@ -1924,6 +1950,7 @@ void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol) | |||
| 1924 | pvma.vm_end = TASK_SIZE; /* policy covers entire file */ | 1950 | pvma.vm_end = TASK_SIZE; /* policy covers entire file */ |
| 1925 | mpol_set_shared_policy(sp, &pvma, new); /* adds ref */ | 1951 | mpol_set_shared_policy(sp, &pvma, new); /* adds ref */ |
| 1926 | mpol_put(new); /* drop initial ref */ | 1952 | mpol_put(new); /* drop initial ref */ |
| 1953 | NODEMASK_SCRATCH_FREE(scratch); | ||
| 1927 | } | 1954 | } |
| 1928 | } | 1955 | } |
| 1929 | 1956 | ||
| @@ -2140,13 +2167,18 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context) | |||
| 2140 | err = 1; | 2167 | err = 1; |
| 2141 | else { | 2168 | else { |
| 2142 | int ret; | 2169 | int ret; |
| 2143 | 2170 | NODEMASK_SCRATCH(scratch); | |
| 2144 | task_lock(current); | 2171 | if (scratch) { |
| 2145 | ret = mpol_set_nodemask(new, &nodes); | 2172 | task_lock(current); |
| 2146 | task_unlock(current); | 2173 | ret = mpol_set_nodemask(new, &nodes, scratch); |
| 2147 | if (ret) | 2174 | task_unlock(current); |
| 2175 | } else | ||
| 2176 | ret = -ENOMEM; | ||
| 2177 | NODEMASK_SCRATCH_FREE(scratch); | ||
| 2178 | if (ret) { | ||
| 2148 | err = 1; | 2179 | err = 1; |
| 2149 | else if (no_context) { | 2180 | mpol_put(new); |
| 2181 | } else if (no_context) { | ||
| 2150 | /* save for contextualization */ | 2182 | /* save for contextualization */ |
| 2151 | new->w.user_nodemask = nodes; | 2183 | new->w.user_nodemask = nodes; |
| 2152 | } | 2184 | } |
diff --git a/mm/mempool.c b/mm/mempool.c index a46eb1b4bb66..32e75d400503 100644 --- a/mm/mempool.c +++ b/mm/mempool.c | |||
| @@ -303,14 +303,14 @@ EXPORT_SYMBOL(mempool_free_slab); | |||
| 303 | */ | 303 | */ |
| 304 | void *mempool_kmalloc(gfp_t gfp_mask, void *pool_data) | 304 | void *mempool_kmalloc(gfp_t gfp_mask, void *pool_data) |
| 305 | { | 305 | { |
| 306 | size_t size = (size_t)(long)pool_data; | 306 | size_t size = (size_t)pool_data; |
| 307 | return kmalloc(size, gfp_mask); | 307 | return kmalloc(size, gfp_mask); |
| 308 | } | 308 | } |
| 309 | EXPORT_SYMBOL(mempool_kmalloc); | 309 | EXPORT_SYMBOL(mempool_kmalloc); |
| 310 | 310 | ||
| 311 | void *mempool_kzalloc(gfp_t gfp_mask, void *pool_data) | 311 | void *mempool_kzalloc(gfp_t gfp_mask, void *pool_data) |
| 312 | { | 312 | { |
| 313 | size_t size = (size_t) pool_data; | 313 | size_t size = (size_t)pool_data; |
| 314 | return kzalloc(size, gfp_mask); | 314 | return kzalloc(size, gfp_mask); |
| 315 | } | 315 | } |
| 316 | EXPORT_SYMBOL(mempool_kzalloc); | 316 | EXPORT_SYMBOL(mempool_kzalloc); |
diff --git a/net/core/dev.c b/net/core/dev.c index 43e61ba7bd95..6a94475aee85 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -4007,9 +4007,7 @@ static void dev_unicast_flush(struct net_device *dev) | |||
| 4007 | 4007 | ||
| 4008 | static void dev_unicast_init(struct net_device *dev) | 4008 | static void dev_unicast_init(struct net_device *dev) |
| 4009 | { | 4009 | { |
| 4010 | netif_addr_lock_bh(dev); | ||
| 4011 | __hw_addr_init(&dev->uc); | 4010 | __hw_addr_init(&dev->uc); |
| 4012 | netif_addr_unlock_bh(dev); | ||
| 4013 | } | 4011 | } |
| 4014 | 4012 | ||
| 4015 | 4013 | ||
diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl index d29baa2e063a..911ba7ffab84 100755 --- a/scripts/recordmcount.pl +++ b/scripts/recordmcount.pl | |||
| @@ -393,7 +393,7 @@ while (<IN>) { | |||
| 393 | $read_function = 0; | 393 | $read_function = 0; |
| 394 | } | 394 | } |
| 395 | # print out any recorded offsets | 395 | # print out any recorded offsets |
| 396 | update_funcs() if ($text_found); | 396 | update_funcs() if (defined($ref_func)); |
| 397 | 397 | ||
| 398 | # reset all markers and arrays | 398 | # reset all markers and arrays |
| 399 | $text_found = 0; | 399 | $text_found = 0; |
| @@ -414,7 +414,10 @@ while (<IN>) { | |||
| 414 | $offset = hex $1; | 414 | $offset = hex $1; |
| 415 | } else { | 415 | } else { |
| 416 | # if we already have a function, and this is weak, skip it | 416 | # if we already have a function, and this is weak, skip it |
| 417 | if (!defined($ref_func) && !defined($weak{$text})) { | 417 | if (!defined($ref_func) && !defined($weak{$text}) && |
| 418 | # PPC64 can have symbols that start with .L and | ||
| 419 | # gcc considers these special. Don't use them! | ||
| 420 | $text !~ /^\.L/) { | ||
| 418 | $ref_func = $text; | 421 | $ref_func = $text; |
| 419 | $offset = hex $1; | 422 | $offset = hex $1; |
| 420 | } | 423 | } |
| @@ -441,7 +444,7 @@ while (<IN>) { | |||
| 441 | } | 444 | } |
| 442 | 445 | ||
| 443 | # dump out anymore offsets that may have been found | 446 | # dump out anymore offsets that may have been found |
| 444 | update_funcs() if ($text_found); | 447 | update_funcs() if (defined($ref_func)); |
| 445 | 448 | ||
| 446 | # If we did not find any mcount callers, we are done (do nothing). | 449 | # If we did not find any mcount callers, we are done (do nothing). |
| 447 | if (!$opened) { | 450 | if (!$opened) { |
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 15c2a08a66f1..1e8cfc4c2ed6 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
| @@ -1285,6 +1285,8 @@ static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dent | |||
| 1285 | rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX, | 1285 | rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX, |
| 1286 | context, len); | 1286 | context, len); |
| 1287 | if (rc == -ERANGE) { | 1287 | if (rc == -ERANGE) { |
| 1288 | kfree(context); | ||
| 1289 | |||
| 1288 | /* Need a larger buffer. Query for the right size. */ | 1290 | /* Need a larger buffer. Query for the right size. */ |
| 1289 | rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX, | 1291 | rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX, |
| 1290 | NULL, 0); | 1292 | NULL, 0); |
| @@ -1292,7 +1294,6 @@ static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dent | |||
| 1292 | dput(dentry); | 1294 | dput(dentry); |
| 1293 | goto out_unlock; | 1295 | goto out_unlock; |
| 1294 | } | 1296 | } |
| 1295 | kfree(context); | ||
| 1296 | len = rc; | 1297 | len = rc; |
| 1297 | context = kmalloc(len+1, GFP_NOFS); | 1298 | context = kmalloc(len+1, GFP_NOFS); |
| 1298 | if (!context) { | 1299 | if (!context) { |
diff --git a/tools/perf/Documentation/perf-examples.txt b/tools/perf/Documentation/perf-examples.txt new file mode 100644 index 000000000000..8eb6c489fb15 --- /dev/null +++ b/tools/perf/Documentation/perf-examples.txt | |||
| @@ -0,0 +1,225 @@ | |||
| 1 | |||
| 2 | ------------------------------ | ||
| 3 | ****** perf by examples ****** | ||
| 4 | ------------------------------ | ||
| 5 | |||
| 6 | [ From an e-mail by Ingo Molnar, http://lkml.org/lkml/2009/8/4/346 ] | ||
| 7 | |||
| 8 | |||
| 9 | First, discovery/enumeration of available counters can be done via | ||
| 10 | 'perf list': | ||
| 11 | |||
| 12 | titan:~> perf list | ||
| 13 | [...] | ||
| 14 | kmem:kmalloc [Tracepoint event] | ||
| 15 | kmem:kmem_cache_alloc [Tracepoint event] | ||
| 16 | kmem:kmalloc_node [Tracepoint event] | ||
| 17 | kmem:kmem_cache_alloc_node [Tracepoint event] | ||
| 18 | kmem:kfree [Tracepoint event] | ||
| 19 | kmem:kmem_cache_free [Tracepoint event] | ||
| 20 | kmem:mm_page_free_direct [Tracepoint event] | ||
| 21 | kmem:mm_pagevec_free [Tracepoint event] | ||
| 22 | kmem:mm_page_alloc [Tracepoint event] | ||
| 23 | kmem:mm_page_alloc_zone_locked [Tracepoint event] | ||
| 24 | kmem:mm_page_pcpu_drain [Tracepoint event] | ||
| 25 | kmem:mm_page_alloc_extfrag [Tracepoint event] | ||
| 26 | |||
| 27 | Then any (or all) of the above event sources can be activated and | ||
| 28 | measured. For example the page alloc/free properties of a 'hackbench | ||
| 29 | run' are: | ||
| 30 | |||
| 31 | titan:~> perf stat -e kmem:mm_page_pcpu_drain -e kmem:mm_page_alloc | ||
| 32 | -e kmem:mm_pagevec_free -e kmem:mm_page_free_direct ./hackbench 10 | ||
| 33 | Time: 0.575 | ||
| 34 | |||
| 35 | Performance counter stats for './hackbench 10': | ||
| 36 | |||
| 37 | 13857 kmem:mm_page_pcpu_drain | ||
| 38 | 27576 kmem:mm_page_alloc | ||
| 39 | 6025 kmem:mm_pagevec_free | ||
| 40 | 20934 kmem:mm_page_free_direct | ||
| 41 | |||
| 42 | 0.613972165 seconds time elapsed | ||
| 43 | |||
| 44 | You can observe the statistical properties as well, by using the | ||
| 45 | 'repeat the workload N times' feature of perf stat: | ||
| 46 | |||
| 47 | titan:~> perf stat --repeat 5 -e kmem:mm_page_pcpu_drain -e | ||
| 48 | kmem:mm_page_alloc -e kmem:mm_pagevec_free -e | ||
| 49 | kmem:mm_page_free_direct ./hackbench 10 | ||
| 50 | Time: 0.627 | ||
| 51 | Time: 0.644 | ||
| 52 | Time: 0.564 | ||
| 53 | Time: 0.559 | ||
| 54 | Time: 0.626 | ||
| 55 | |||
| 56 | Performance counter stats for './hackbench 10' (5 runs): | ||
| 57 | |||
| 58 | 12920 kmem:mm_page_pcpu_drain ( +- 3.359% ) | ||
| 59 | 25035 kmem:mm_page_alloc ( +- 3.783% ) | ||
| 60 | 6104 kmem:mm_pagevec_free ( +- 0.934% ) | ||
| 61 | 18376 kmem:mm_page_free_direct ( +- 4.941% ) | ||
| 62 | |||
| 63 | 0.643954516 seconds time elapsed ( +- 2.363% ) | ||
| 64 | |||
| 65 | Furthermore, these tracepoints can be used to sample the workload as | ||
| 66 | well. For example the page allocations done by a 'git gc' can be | ||
| 67 | captured the following way: | ||
| 68 | |||
| 69 | titan:~/git> perf record -f -e kmem:mm_page_alloc -c 1 ./git gc | ||
| 70 | Counting objects: 1148, done. | ||
| 71 | Delta compression using up to 2 threads. | ||
| 72 | Compressing objects: 100% (450/450), done. | ||
| 73 | Writing objects: 100% (1148/1148), done. | ||
| 74 | Total 1148 (delta 690), reused 1148 (delta 690) | ||
| 75 | [ perf record: Captured and wrote 0.267 MB perf.data (~11679 samples) ] | ||
| 76 | |||
| 77 | To check which functions generated page allocations: | ||
| 78 | |||
| 79 | titan:~/git> perf report | ||
| 80 | # Samples: 10646 | ||
| 81 | # | ||
| 82 | # Overhead Command Shared Object | ||
| 83 | # ........ ............... .......................... | ||
| 84 | # | ||
| 85 | 23.57% git-repack /lib64/libc-2.5.so | ||
| 86 | 21.81% git /lib64/libc-2.5.so | ||
| 87 | 14.59% git ./git | ||
| 88 | 11.79% git-repack ./git | ||
| 89 | 7.12% git /lib64/ld-2.5.so | ||
| 90 | 3.16% git-repack /lib64/libpthread-2.5.so | ||
| 91 | 2.09% git-repack /bin/bash | ||
| 92 | 1.97% rm /lib64/libc-2.5.so | ||
| 93 | 1.39% mv /lib64/ld-2.5.so | ||
| 94 | 1.37% mv /lib64/libc-2.5.so | ||
| 95 | 1.12% git-repack /lib64/ld-2.5.so | ||
| 96 | 0.95% rm /lib64/ld-2.5.so | ||
| 97 | 0.90% git-update-serv /lib64/libc-2.5.so | ||
| 98 | 0.73% git-update-serv /lib64/ld-2.5.so | ||
| 99 | 0.68% perf /lib64/libpthread-2.5.so | ||
| 100 | 0.64% git-repack /usr/lib64/libz.so.1.2.3 | ||
| 101 | |||
| 102 | Or to see it on a more finegrained level: | ||
| 103 | |||
| 104 | titan:~/git> perf report --sort comm,dso,symbol | ||
| 105 | # Samples: 10646 | ||
| 106 | # | ||
| 107 | # Overhead Command Shared Object Symbol | ||
| 108 | # ........ ............... .......................... ...... | ||
| 109 | # | ||
| 110 | 9.35% git-repack ./git [.] insert_obj_hash | ||
| 111 | 9.12% git ./git [.] insert_obj_hash | ||
| 112 | 7.31% git /lib64/libc-2.5.so [.] memcpy | ||
| 113 | 6.34% git-repack /lib64/libc-2.5.so [.] _int_malloc | ||
| 114 | 6.24% git-repack /lib64/libc-2.5.so [.] memcpy | ||
| 115 | 5.82% git-repack /lib64/libc-2.5.so [.] __GI___fork | ||
| 116 | 5.47% git /lib64/libc-2.5.so [.] _int_malloc | ||
| 117 | 2.99% git /lib64/libc-2.5.so [.] memset | ||
| 118 | |||
| 119 | Furthermore, call-graph sampling can be done too, of page | ||
| 120 | allocations - to see precisely what kind of page allocations there | ||
| 121 | are: | ||
| 122 | |||
| 123 | titan:~/git> perf record -f -g -e kmem:mm_page_alloc -c 1 ./git gc | ||
| 124 | Counting objects: 1148, done. | ||
| 125 | Delta compression using up to 2 threads. | ||
| 126 | Compressing objects: 100% (450/450), done. | ||
| 127 | Writing objects: 100% (1148/1148), done. | ||
| 128 | Total 1148 (delta 690), reused 1148 (delta 690) | ||
| 129 | [ perf record: Captured and wrote 0.963 MB perf.data (~42069 samples) ] | ||
| 130 | |||
| 131 | titan:~/git> perf report -g | ||
| 132 | # Samples: 10686 | ||
| 133 | # | ||
| 134 | # Overhead Command Shared Object | ||
| 135 | # ........ ............... .......................... | ||
| 136 | # | ||
| 137 | 23.25% git-repack /lib64/libc-2.5.so | ||
| 138 | | | ||
| 139 | |--50.00%-- _int_free | ||
| 140 | | | ||
| 141 | |--37.50%-- __GI___fork | ||
| 142 | | make_child | ||
| 143 | | | ||
| 144 | |--12.50%-- ptmalloc_unlock_all2 | ||
| 145 | | make_child | ||
| 146 | | | ||
| 147 | --6.25%-- __GI_strcpy | ||
| 148 | 21.61% git /lib64/libc-2.5.so | ||
| 149 | | | ||
| 150 | |--30.00%-- __GI_read | ||
| 151 | | | | ||
| 152 | | --83.33%-- git_config_from_file | ||
| 153 | | git_config | ||
| 154 | | | | ||
| 155 | [...] | ||
| 156 | |||
| 157 | Or you can observe the whole system's page allocations for 10 | ||
| 158 | seconds: | ||
| 159 | |||
| 160 | titan:~/git> perf stat -a -e kmem:mm_page_pcpu_drain -e | ||
| 161 | kmem:mm_page_alloc -e kmem:mm_pagevec_free -e | ||
| 162 | kmem:mm_page_free_direct sleep 10 | ||
| 163 | |||
| 164 | Performance counter stats for 'sleep 10': | ||
| 165 | |||
| 166 | 171585 kmem:mm_page_pcpu_drain | ||
| 167 | 322114 kmem:mm_page_alloc | ||
| 168 | 73623 kmem:mm_pagevec_free | ||
| 169 | 254115 kmem:mm_page_free_direct | ||
| 170 | |||
| 171 | 10.000591410 seconds time elapsed | ||
| 172 | |||
| 173 | Or observe how fluctuating the page allocations are, via statistical | ||
| 174 | analysis done over ten 1-second intervals: | ||
| 175 | |||
| 176 | titan:~/git> perf stat --repeat 10 -a -e kmem:mm_page_pcpu_drain -e | ||
| 177 | kmem:mm_page_alloc -e kmem:mm_pagevec_free -e | ||
| 178 | kmem:mm_page_free_direct sleep 1 | ||
| 179 | |||
| 180 | Performance counter stats for 'sleep 1' (10 runs): | ||
| 181 | |||
| 182 | 17254 kmem:mm_page_pcpu_drain ( +- 3.709% ) | ||
| 183 | 34394 kmem:mm_page_alloc ( +- 4.617% ) | ||
| 184 | 7509 kmem:mm_pagevec_free ( +- 4.820% ) | ||
| 185 | 25653 kmem:mm_page_free_direct ( +- 3.672% ) | ||
| 186 | |||
| 187 | 1.058135029 seconds time elapsed ( +- 3.089% ) | ||
| 188 | |||
| 189 | Or you can annotate the recorded 'git gc' run on a per symbol basis | ||
| 190 | and check which instructions/source-code generated page allocations: | ||
| 191 | |||
| 192 | titan:~/git> perf annotate __GI___fork | ||
| 193 | ------------------------------------------------ | ||
| 194 | Percent | Source code & Disassembly of libc-2.5.so | ||
| 195 | ------------------------------------------------ | ||
| 196 | : | ||
| 197 | : | ||
| 198 | : Disassembly of section .plt: | ||
| 199 | : Disassembly of section .text: | ||
| 200 | : | ||
| 201 | : 00000031a2e95560 <__fork>: | ||
| 202 | [...] | ||
| 203 | 0.00 : 31a2e95602: b8 38 00 00 00 mov $0x38,%eax | ||
| 204 | 0.00 : 31a2e95607: 0f 05 syscall | ||
| 205 | 83.42 : 31a2e95609: 48 3d 00 f0 ff ff cmp $0xfffffffffffff000,%rax | ||
| 206 | 0.00 : 31a2e9560f: 0f 87 4d 01 00 00 ja 31a2e95762 <__fork+0x202> | ||
| 207 | 0.00 : 31a2e95615: 85 c0 test %eax,%eax | ||
| 208 | |||
| 209 | ( this shows that 83.42% of __GI___fork's page allocations come from | ||
| 210 | the 0x38 system call it performs. ) | ||
| 211 | |||
| 212 | etc. etc. - a lot more is possible. I could list a dozen of | ||
| 213 | other different usecases straight away - neither of which is | ||
| 214 | possible via /proc/vmstat. | ||
| 215 | |||
| 216 | /proc/vmstat is not in the same league really, in terms of | ||
| 217 | expressive power of system analysis and performance | ||
| 218 | analysis. | ||
| 219 | |||
| 220 | All that the above results needed were those new tracepoints | ||
| 221 | in include/tracing/events/kmem.h. | ||
| 222 | |||
| 223 | Ingo | ||
| 224 | |||
| 225 | |||
diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt index 1dbc1eeb4c01..6be696b0a2bb 100644 --- a/tools/perf/Documentation/perf-record.txt +++ b/tools/perf/Documentation/perf-record.txt | |||
| @@ -29,13 +29,67 @@ OPTIONS | |||
| 29 | Select the PMU event. Selection can be a symbolic event name | 29 | Select the PMU event. Selection can be a symbolic event name |
| 30 | (use 'perf list' to list all events) or a raw PMU | 30 | (use 'perf list' to list all events) or a raw PMU |
| 31 | event (eventsel+umask) in the form of rNNN where NNN is a | 31 | event (eventsel+umask) in the form of rNNN where NNN is a |
| 32 | hexadecimal event descriptor. | 32 | hexadecimal event descriptor. |
| 33 | 33 | ||
| 34 | -a:: | 34 | -a:: |
| 35 | system-wide collection | 35 | System-wide collection. |
| 36 | 36 | ||
| 37 | -l:: | 37 | -l:: |
| 38 | scale counter values | 38 | Scale counter values. |
| 39 | |||
| 40 | -p:: | ||
| 41 | --pid=:: | ||
| 42 | Record events on existing pid. | ||
| 43 | |||
| 44 | -r:: | ||
| 45 | --realtime=:: | ||
| 46 | Collect data with this RT SCHED_FIFO priority. | ||
| 47 | -A:: | ||
| 48 | --append:: | ||
| 49 | Append to the output file to do incremental profiling. | ||
| 50 | |||
| 51 | -f:: | ||
| 52 | --force:: | ||
| 53 | Overwrite existing data file. | ||
| 54 | |||
| 55 | -c:: | ||
| 56 | --count=:: | ||
| 57 | Event period to sample. | ||
| 58 | |||
| 59 | -o:: | ||
| 60 | --output=:: | ||
| 61 | Output file name. | ||
| 62 | |||
| 63 | -i:: | ||
| 64 | --inherit:: | ||
| 65 | Child tasks inherit counters. | ||
| 66 | -F:: | ||
| 67 | --freq=:: | ||
| 68 | Profile at this frequency. | ||
| 69 | |||
| 70 | -m:: | ||
| 71 | --mmap-pages=:: | ||
| 72 | Number of mmap data pages. | ||
| 73 | |||
| 74 | -g:: | ||
| 75 | --call-graph:: | ||
| 76 | Do call-graph (stack chain/backtrace) recording. | ||
| 77 | |||
| 78 | -v:: | ||
| 79 | --verbose:: | ||
| 80 | Be more verbose (show counter open errors, etc). | ||
| 81 | |||
| 82 | -s:: | ||
| 83 | --stat:: | ||
| 84 | Per thread counts. | ||
| 85 | |||
| 86 | -d:: | ||
| 87 | --data:: | ||
| 88 | Sample addresses. | ||
| 89 | |||
| 90 | -n:: | ||
| 91 | --no-samples:: | ||
| 92 | Don't sample. | ||
| 39 | 93 | ||
| 40 | SEE ALSO | 94 | SEE ALSO |
| 41 | -------- | 95 | -------- |
diff --git a/tools/perf/Documentation/perf-stat.txt b/tools/perf/Documentation/perf-stat.txt index 0d74346d21ab..484080dd5b6f 100644 --- a/tools/perf/Documentation/perf-stat.txt +++ b/tools/perf/Documentation/perf-stat.txt | |||
| @@ -40,7 +40,7 @@ OPTIONS | |||
| 40 | -a:: | 40 | -a:: |
| 41 | system-wide collection | 41 | system-wide collection |
| 42 | 42 | ||
| 43 | -S:: | 43 | -c:: |
| 44 | scale counter values | 44 | scale counter values |
| 45 | 45 | ||
| 46 | EXAMPLES | 46 | EXAMPLES |
diff --git a/tools/perf/Documentation/perf-top.txt b/tools/perf/Documentation/perf-top.txt index 539d01289725..4a7d558dc309 100644 --- a/tools/perf/Documentation/perf-top.txt +++ b/tools/perf/Documentation/perf-top.txt | |||
| @@ -3,36 +3,122 @@ perf-top(1) | |||
| 3 | 3 | ||
| 4 | NAME | 4 | NAME |
| 5 | ---- | 5 | ---- |
| 6 | perf-top - Run a command and profile it | 6 | perf-top - System profiling tool. |
| 7 | 7 | ||
| 8 | SYNOPSIS | 8 | SYNOPSIS |
| 9 | -------- | 9 | -------- |
| 10 | [verse] | 10 | [verse] |
| 11 | 'perf top' [-e <EVENT> | --event=EVENT] [-l] [-a] <command> | 11 | 'perf top' [-e <EVENT> | --event=EVENT] [<options>] |
| 12 | 12 | ||
| 13 | DESCRIPTION | 13 | DESCRIPTION |
| 14 | ----------- | 14 | ----------- |
| 15 | This command runs a command and gathers a performance counter profile | 15 | This command generates and displays a performance counter profile in realtime. |
| 16 | from it. | ||
| 17 | 16 | ||
| 18 | 17 | ||
| 19 | OPTIONS | 18 | OPTIONS |
| 20 | ------- | 19 | ------- |
| 21 | <command>...:: | 20 | -a:: |
| 22 | Any command you can specify in a shell. | 21 | --all-cpus:: |
| 22 | System-wide collection. (default) | ||
| 23 | |||
| 24 | -c <count>:: | ||
| 25 | --count=<count>:: | ||
| 26 | Event period to sample. | ||
| 27 | |||
| 28 | -C <cpu>:: | ||
| 29 | --CPU=<cpu>:: | ||
| 30 | CPU to profile. | ||
| 31 | |||
| 32 | -d <seconds>:: | ||
| 33 | --delay=<seconds>:: | ||
| 34 | Number of seconds to delay between refreshes. | ||
| 23 | 35 | ||
| 24 | -e:: | 36 | -e <event>:: |
| 25 | --event=:: | 37 | --event=<event>:: |
| 26 | Select the PMU event. Selection can be a symbolic event name | 38 | Select the PMU event. Selection can be a symbolic event name |
| 27 | (use 'perf list' to list all events) or a raw PMU | 39 | (use 'perf list' to list all events) or a raw PMU |
| 28 | event (eventsel+umask) in the form of rNNN where NNN is a | 40 | event (eventsel+umask) in the form of rNNN where NNN is a |
| 29 | hexadecimal event descriptor. | 41 | hexadecimal event descriptor. |
| 30 | 42 | ||
| 31 | -a:: | 43 | -E <entries>:: |
| 32 | system-wide collection | 44 | --entries=<entries>:: |
| 45 | Display this many functions. | ||
| 46 | |||
| 47 | -f <count>:: | ||
| 48 | --count-filter=<count>:: | ||
| 49 | Only display functions with more events than this. | ||
| 50 | |||
| 51 | -F <freq>:: | ||
| 52 | --freq=<freq>:: | ||
| 53 | Profile at this frequency. | ||
| 54 | |||
| 55 | -i:: | ||
| 56 | --inherit:: | ||
| 57 | Child tasks inherit counters, only makes sens with -p option. | ||
| 58 | |||
| 59 | -k <path>:: | ||
| 60 | --vmlinux=<path>:: | ||
| 61 | Path to vmlinux. Required for annotation functionality. | ||
| 62 | |||
| 63 | -m <pages>:: | ||
| 64 | --mmap-pages=<pages>:: | ||
| 65 | Number of mmapped data pages. | ||
| 66 | |||
| 67 | -p <pid>:: | ||
| 68 | --pid=<pid>:: | ||
| 69 | Profile events on existing pid. | ||
| 70 | |||
| 71 | -r <priority>:: | ||
| 72 | --realtime=<priority>:: | ||
| 73 | Collect data with this RT SCHED_FIFO priority. | ||
| 74 | |||
| 75 | -s <symbol>:: | ||
| 76 | --sym-annotate=<symbol>:: | ||
| 77 | Annotate this symbol. Requires -k option. | ||
| 78 | |||
| 79 | -v:: | ||
| 80 | --verbose:: | ||
| 81 | Be more verbose (show counter open errors, etc). | ||
| 82 | |||
| 83 | -z:: | ||
| 84 | --zero:: | ||
| 85 | Zero history across display updates. | ||
| 86 | |||
| 87 | INTERACTIVE PROMPTING KEYS | ||
| 88 | -------------------------- | ||
| 89 | |||
| 90 | [d]:: | ||
| 91 | Display refresh delay. | ||
| 92 | |||
| 93 | [e]:: | ||
| 94 | Number of entries to display. | ||
| 95 | |||
| 96 | [E]:: | ||
| 97 | Event to display when multiple counters are active. | ||
| 98 | |||
| 99 | [f]:: | ||
| 100 | Profile display filter (>= hit count). | ||
| 101 | |||
| 102 | [F]:: | ||
| 103 | Annotation display filter (>= % of total). | ||
| 104 | |||
| 105 | [s]:: | ||
| 106 | Annotate symbol. | ||
| 107 | |||
| 108 | [S]:: | ||
| 109 | Stop annotation, return to full profile display. | ||
| 110 | |||
| 111 | [w]:: | ||
| 112 | Toggle between weighted sum and individual count[E]r profile. | ||
| 113 | |||
| 114 | [z]:: | ||
| 115 | Toggle event count zeroing across display updates. | ||
| 116 | |||
| 117 | [qQ]:: | ||
| 118 | Quit. | ||
| 119 | |||
| 120 | Pressing any unmapped key displays a menu, and prompts for input. | ||
| 33 | 121 | ||
| 34 | -l:: | ||
| 35 | scale counter values | ||
| 36 | 122 | ||
| 37 | SEE ALSO | 123 | SEE ALSO |
| 38 | -------- | 124 | -------- |
diff --git a/tools/perf/Makefile b/tools/perf/Makefile index 4b20fa47c3ab..60411e94113b 100644 --- a/tools/perf/Makefile +++ b/tools/perf/Makefile | |||
| @@ -158,8 +158,10 @@ uname_P := $(shell sh -c 'uname -p 2>/dev/null || echo not') | |||
| 158 | uname_V := $(shell sh -c 'uname -v 2>/dev/null || echo not') | 158 | uname_V := $(shell sh -c 'uname -v 2>/dev/null || echo not') |
| 159 | 159 | ||
| 160 | # If we're on a 64-bit kernel, use -m64 | 160 | # If we're on a 64-bit kernel, use -m64 |
| 161 | ifneq ($(patsubst %64,%,$(uname_M)),$(uname_M)) | 161 | ifndef NO_64BIT |
| 162 | M64 := -m64 | 162 | ifneq ($(patsubst %64,%,$(uname_M)),$(uname_M)) |
| 163 | M64 := -m64 | ||
| 164 | endif | ||
| 163 | endif | 165 | endif |
| 164 | 166 | ||
| 165 | # CFLAGS and LDFLAGS are for the users to override from the command line. | 167 | # CFLAGS and LDFLAGS are for the users to override from the command line. |
| @@ -345,7 +347,6 @@ BUILTIN_OBJS += builtin-stat.o | |||
| 345 | BUILTIN_OBJS += builtin-top.o | 347 | BUILTIN_OBJS += builtin-top.o |
| 346 | 348 | ||
| 347 | PERFLIBS = $(LIB_FILE) | 349 | PERFLIBS = $(LIB_FILE) |
| 348 | EXTLIBS = -lbfd -liberty | ||
| 349 | 350 | ||
| 350 | # | 351 | # |
| 351 | # Platform specific tweaks | 352 | # Platform specific tweaks |
| @@ -374,6 +375,32 @@ ifeq ($(uname_S),Darwin) | |||
| 374 | PTHREAD_LIBS = | 375 | PTHREAD_LIBS = |
| 375 | endif | 376 | endif |
| 376 | 377 | ||
| 378 | ifneq ($(shell sh -c "(echo '\#include <libelf.h>'; echo 'int main(void) { Elf * elf = elf_begin(0, ELF_C_READ_MMAP, 0); return (long)elf; }') | $(CC) -x c - $(ALL_CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -o /dev/null $(ALL_LDFLAGS) > /dev/null 2>&1 && echo y"), y) | ||
| 379 | msg := $(error No libelf.h/libelf found, please install libelf-dev/elfutils-libelf-devel); | ||
| 380 | endif | ||
| 381 | |||
| 382 | ifdef NO_DEMANGLE | ||
| 383 | BASIC_CFLAGS += -DNO_DEMANGLE | ||
| 384 | else | ||
| 385 | |||
| 386 | has_bfd := $(shell sh -c "(echo '\#include <bfd.h>'; echo 'int main(void) { bfd_demangle(0, 0, 0); return 0; }') | $(CC) -x c - $(ALL_CFLAGS) -o /dev/null $(ALL_LDFLAGS) -lbfd > /dev/null 2>&1 && echo y") | ||
| 387 | |||
| 388 | has_bfd_iberty := $(shell sh -c "(echo '\#include <bfd.h>'; echo 'int main(void) { bfd_demangle(0, 0, 0); return 0; }') | $(CC) -x c - $(ALL_CFLAGS) -o /dev/null $(ALL_LDFLAGS) -lbfd -liberty > /dev/null 2>&1 && echo y") | ||
| 389 | |||
| 390 | has_bfd_iberty_z := $(shell sh -c "(echo '\#include <bfd.h>'; echo 'int main(void) { bfd_demangle(0, 0, 0); return 0; }') | $(CC) -x c - $(ALL_CFLAGS) -o /dev/null $(ALL_LDFLAGS) -lbfd -liberty -lz > /dev/null 2>&1 && echo y") | ||
| 391 | |||
| 392 | ifeq ($(has_bfd),y) | ||
| 393 | EXTLIBS += -lbfd | ||
| 394 | else ifeq ($(has_bfd_iberty),y) | ||
| 395 | EXTLIBS += -lbfd -liberty | ||
| 396 | else ifeq ($(has_bfd_iberty_z),y) | ||
| 397 | EXTLIBS += -lbfd -liberty -lz | ||
| 398 | else | ||
| 399 | msg := $(warning No bfd.h/libbfd found, install binutils-dev[el] to gain symbol demangling) | ||
| 400 | BASIC_CFLAGS += -DNO_DEMANGLE | ||
| 401 | endif | ||
| 402 | endif | ||
| 403 | |||
| 377 | ifndef CC_LD_DYNPATH | 404 | ifndef CC_LD_DYNPATH |
| 378 | ifdef NO_R_TO_GCC_LINKER | 405 | ifdef NO_R_TO_GCC_LINKER |
| 379 | # Some gcc does not accept and pass -R to the linker to specify | 406 | # Some gcc does not accept and pass -R to the linker to specify |
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 6da09928130f..0345aad8eba5 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
| @@ -412,6 +412,7 @@ static void create_counter(int counter, int cpu, pid_t pid) | |||
| 412 | if (call_graph) | 412 | if (call_graph) |
| 413 | attr->sample_type |= PERF_SAMPLE_CALLCHAIN; | 413 | attr->sample_type |= PERF_SAMPLE_CALLCHAIN; |
| 414 | 414 | ||
| 415 | |||
| 415 | attr->mmap = track; | 416 | attr->mmap = track; |
| 416 | attr->comm = track; | 417 | attr->comm = track; |
| 417 | attr->inherit = (cpu < 0) && inherit; | 418 | attr->inherit = (cpu < 0) && inherit; |
| @@ -524,10 +525,14 @@ static int __cmd_record(int argc, const char **argv) | |||
| 524 | signal(SIGCHLD, sig_handler); | 525 | signal(SIGCHLD, sig_handler); |
| 525 | signal(SIGINT, sig_handler); | 526 | signal(SIGINT, sig_handler); |
| 526 | 527 | ||
| 527 | if (!stat(output_name, &st) && !force && !append_file) { | 528 | if (!stat(output_name, &st) && st.st_size) { |
| 528 | fprintf(stderr, "Error, output file %s exists, use -A to append or -f to overwrite.\n", | 529 | if (!force && !append_file) { |
| 529 | output_name); | 530 | fprintf(stderr, "Error, output file %s exists, use -A to append or -f to overwrite.\n", |
| 530 | exit(-1); | 531 | output_name); |
| 532 | exit(-1); | ||
| 533 | } | ||
| 534 | } else { | ||
| 535 | append_file = 0; | ||
| 531 | } | 536 | } |
| 532 | 537 | ||
| 533 | flags = O_CREAT|O_RDWR; | 538 | flags = O_CREAT|O_RDWR; |
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index ce4f28645e64..99274cec0adb 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c | |||
| @@ -31,7 +31,7 @@ | |||
| 31 | static char const *input_name = "perf.data"; | 31 | static char const *input_name = "perf.data"; |
| 32 | static char *vmlinux = NULL; | 32 | static char *vmlinux = NULL; |
| 33 | 33 | ||
| 34 | static char default_sort_order[] = "comm,dso"; | 34 | static char default_sort_order[] = "comm,dso,symbol"; |
| 35 | static char *sort_order = default_sort_order; | 35 | static char *sort_order = default_sort_order; |
| 36 | static char *dso_list_str, *comm_list_str, *sym_list_str, | 36 | static char *dso_list_str, *comm_list_str, *sym_list_str, |
| 37 | *col_width_list_str; | 37 | *col_width_list_str; |
| @@ -68,7 +68,7 @@ static int callchain; | |||
| 68 | 68 | ||
| 69 | static | 69 | static |
| 70 | struct callchain_param callchain_param = { | 70 | struct callchain_param callchain_param = { |
| 71 | .mode = CHAIN_GRAPH_ABS, | 71 | .mode = CHAIN_GRAPH_REL, |
| 72 | .min_percent = 0.5 | 72 | .min_percent = 0.5 |
| 73 | }; | 73 | }; |
| 74 | 74 | ||
| @@ -112,7 +112,9 @@ struct read_event { | |||
| 112 | struct perf_event_header header; | 112 | struct perf_event_header header; |
| 113 | u32 pid,tid; | 113 | u32 pid,tid; |
| 114 | u64 value; | 114 | u64 value; |
| 115 | u64 format[3]; | 115 | u64 time_enabled; |
| 116 | u64 time_running; | ||
| 117 | u64 id; | ||
| 116 | }; | 118 | }; |
| 117 | 119 | ||
| 118 | typedef union event_union { | 120 | typedef union event_union { |
| @@ -698,7 +700,8 @@ sort__sym_print(FILE *fp, struct hist_entry *self, unsigned int width __used) | |||
| 698 | size_t ret = 0; | 700 | size_t ret = 0; |
| 699 | 701 | ||
| 700 | if (verbose) | 702 | if (verbose) |
| 701 | ret += repsep_fprintf(fp, "%#018llx ", (u64)self->ip); | 703 | ret += repsep_fprintf(fp, "%#018llx %c ", (u64)self->ip, |
| 704 | dso__symtab_origin(self->dso)); | ||
| 702 | 705 | ||
| 703 | ret += repsep_fprintf(fp, "[%c] ", self->level); | 706 | ret += repsep_fprintf(fp, "[%c] ", self->level); |
| 704 | if (self->sym) { | 707 | if (self->sym) { |
| @@ -888,6 +891,21 @@ ipchain__fprintf_graph(FILE *fp, struct callchain_list *chain, int depth, | |||
| 888 | return ret; | 891 | return ret; |
| 889 | } | 892 | } |
| 890 | 893 | ||
| 894 | static struct symbol *rem_sq_bracket; | ||
| 895 | static struct callchain_list rem_hits; | ||
| 896 | |||
| 897 | static void init_rem_hits(void) | ||
| 898 | { | ||
| 899 | rem_sq_bracket = malloc(sizeof(*rem_sq_bracket) + 6); | ||
| 900 | if (!rem_sq_bracket) { | ||
| 901 | fprintf(stderr, "Not enough memory to display remaining hits\n"); | ||
| 902 | return; | ||
| 903 | } | ||
| 904 | |||
| 905 | strcpy(rem_sq_bracket->name, "[...]"); | ||
| 906 | rem_hits.sym = rem_sq_bracket; | ||
| 907 | } | ||
| 908 | |||
| 891 | static size_t | 909 | static size_t |
| 892 | callchain__fprintf_graph(FILE *fp, struct callchain_node *self, | 910 | callchain__fprintf_graph(FILE *fp, struct callchain_node *self, |
| 893 | u64 total_samples, int depth, int depth_mask) | 911 | u64 total_samples, int depth, int depth_mask) |
| @@ -897,25 +915,34 @@ callchain__fprintf_graph(FILE *fp, struct callchain_node *self, | |||
| 897 | struct callchain_list *chain; | 915 | struct callchain_list *chain; |
| 898 | int new_depth_mask = depth_mask; | 916 | int new_depth_mask = depth_mask; |
| 899 | u64 new_total; | 917 | u64 new_total; |
| 918 | u64 remaining; | ||
| 900 | size_t ret = 0; | 919 | size_t ret = 0; |
| 901 | int i; | 920 | int i; |
| 902 | 921 | ||
| 903 | if (callchain_param.mode == CHAIN_GRAPH_REL) | 922 | if (callchain_param.mode == CHAIN_GRAPH_REL) |
| 904 | new_total = self->cumul_hit; | 923 | new_total = self->children_hit; |
| 905 | else | 924 | else |
| 906 | new_total = total_samples; | 925 | new_total = total_samples; |
| 907 | 926 | ||
| 927 | remaining = new_total; | ||
| 928 | |||
| 908 | node = rb_first(&self->rb_root); | 929 | node = rb_first(&self->rb_root); |
| 909 | while (node) { | 930 | while (node) { |
| 931 | u64 cumul; | ||
| 932 | |||
| 910 | child = rb_entry(node, struct callchain_node, rb_node); | 933 | child = rb_entry(node, struct callchain_node, rb_node); |
| 934 | cumul = cumul_hits(child); | ||
| 935 | remaining -= cumul; | ||
| 911 | 936 | ||
| 912 | /* | 937 | /* |
| 913 | * The depth mask manages the output of pipes that show | 938 | * The depth mask manages the output of pipes that show |
| 914 | * the depth. We don't want to keep the pipes of the current | 939 | * the depth. We don't want to keep the pipes of the current |
| 915 | * level for the last child of this depth | 940 | * level for the last child of this depth. |
| 941 | * Except if we have remaining filtered hits. They will | ||
| 942 | * supersede the last child | ||
| 916 | */ | 943 | */ |
| 917 | next = rb_next(node); | 944 | next = rb_next(node); |
| 918 | if (!next) | 945 | if (!next && (callchain_param.mode != CHAIN_GRAPH_REL || !remaining)) |
| 919 | new_depth_mask &= ~(1 << (depth - 1)); | 946 | new_depth_mask &= ~(1 << (depth - 1)); |
| 920 | 947 | ||
| 921 | /* | 948 | /* |
| @@ -930,7 +957,7 @@ callchain__fprintf_graph(FILE *fp, struct callchain_node *self, | |||
| 930 | ret += ipchain__fprintf_graph(fp, chain, depth, | 957 | ret += ipchain__fprintf_graph(fp, chain, depth, |
| 931 | new_depth_mask, i++, | 958 | new_depth_mask, i++, |
| 932 | new_total, | 959 | new_total, |
| 933 | child->cumul_hit); | 960 | cumul); |
| 934 | } | 961 | } |
| 935 | ret += callchain__fprintf_graph(fp, child, new_total, | 962 | ret += callchain__fprintf_graph(fp, child, new_total, |
| 936 | depth + 1, | 963 | depth + 1, |
| @@ -938,6 +965,19 @@ callchain__fprintf_graph(FILE *fp, struct callchain_node *self, | |||
| 938 | node = next; | 965 | node = next; |
| 939 | } | 966 | } |
| 940 | 967 | ||
| 968 | if (callchain_param.mode == CHAIN_GRAPH_REL && | ||
| 969 | remaining && remaining != new_total) { | ||
| 970 | |||
| 971 | if (!rem_sq_bracket) | ||
| 972 | return ret; | ||
| 973 | |||
| 974 | new_depth_mask &= ~(1 << (depth - 1)); | ||
| 975 | |||
| 976 | ret += ipchain__fprintf_graph(fp, &rem_hits, depth, | ||
| 977 | new_depth_mask, 0, new_total, | ||
| 978 | remaining); | ||
| 979 | } | ||
| 980 | |||
| 941 | return ret; | 981 | return ret; |
| 942 | } | 982 | } |
| 943 | 983 | ||
| @@ -1358,6 +1398,8 @@ static size_t output__fprintf(FILE *fp, u64 total_samples) | |||
| 1358 | unsigned int width; | 1398 | unsigned int width; |
| 1359 | char *col_width = col_width_list_str; | 1399 | char *col_width = col_width_list_str; |
| 1360 | 1400 | ||
| 1401 | init_rem_hits(); | ||
| 1402 | |||
| 1361 | fprintf(fp, "# Samples: %Ld\n", (u64)total_samples); | 1403 | fprintf(fp, "# Samples: %Ld\n", (u64)total_samples); |
| 1362 | fprintf(fp, "#\n"); | 1404 | fprintf(fp, "#\n"); |
| 1363 | 1405 | ||
| @@ -1424,11 +1466,13 @@ print_entries: | |||
| 1424 | if (sort_order == default_sort_order && | 1466 | if (sort_order == default_sort_order && |
| 1425 | parent_pattern == default_parent_pattern) { | 1467 | parent_pattern == default_parent_pattern) { |
| 1426 | fprintf(fp, "#\n"); | 1468 | fprintf(fp, "#\n"); |
| 1427 | fprintf(fp, "# (For more details, try: perf report --sort comm,dso,symbol)\n"); | 1469 | fprintf(fp, "# (For a higher level overview, try: perf report --sort comm,dso)\n"); |
| 1428 | fprintf(fp, "#\n"); | 1470 | fprintf(fp, "#\n"); |
| 1429 | } | 1471 | } |
| 1430 | fprintf(fp, "\n"); | 1472 | fprintf(fp, "\n"); |
| 1431 | 1473 | ||
| 1474 | free(rem_sq_bracket); | ||
| 1475 | |||
| 1432 | return ret; | 1476 | return ret; |
| 1433 | } | 1477 | } |
| 1434 | 1478 | ||
| @@ -1690,14 +1734,37 @@ static void trace_event(event_t *event) | |||
| 1690 | dprintf(".\n"); | 1734 | dprintf(".\n"); |
| 1691 | } | 1735 | } |
| 1692 | 1736 | ||
| 1737 | static struct perf_header *header; | ||
| 1738 | |||
| 1739 | static struct perf_counter_attr *perf_header__find_attr(u64 id) | ||
| 1740 | { | ||
| 1741 | int i; | ||
| 1742 | |||
| 1743 | for (i = 0; i < header->attrs; i++) { | ||
| 1744 | struct perf_header_attr *attr = header->attr[i]; | ||
| 1745 | int j; | ||
| 1746 | |||
| 1747 | for (j = 0; j < attr->ids; j++) { | ||
| 1748 | if (attr->id[j] == id) | ||
| 1749 | return &attr->attr; | ||
| 1750 | } | ||
| 1751 | } | ||
| 1752 | |||
| 1753 | return NULL; | ||
| 1754 | } | ||
| 1755 | |||
| 1693 | static int | 1756 | static int |
| 1694 | process_read_event(event_t *event, unsigned long offset, unsigned long head) | 1757 | process_read_event(event_t *event, unsigned long offset, unsigned long head) |
| 1695 | { | 1758 | { |
| 1696 | dprintf("%p [%p]: PERF_EVENT_READ: %d %d %Lu\n", | 1759 | struct perf_counter_attr *attr = perf_header__find_attr(event->read.id); |
| 1760 | |||
| 1761 | dprintf("%p [%p]: PERF_EVENT_READ: %d %d %s %Lu\n", | ||
| 1697 | (void *)(offset + head), | 1762 | (void *)(offset + head), |
| 1698 | (void *)(long)(event->header.size), | 1763 | (void *)(long)(event->header.size), |
| 1699 | event->read.pid, | 1764 | event->read.pid, |
| 1700 | event->read.tid, | 1765 | event->read.tid, |
| 1766 | attr ? __event_name(attr->type, attr->config) | ||
| 1767 | : "FAIL", | ||
| 1701 | event->read.value); | 1768 | event->read.value); |
| 1702 | 1769 | ||
| 1703 | return 0; | 1770 | return 0; |
| @@ -1743,8 +1810,6 @@ process_event(event_t *event, unsigned long offset, unsigned long head) | |||
| 1743 | return 0; | 1810 | return 0; |
| 1744 | } | 1811 | } |
| 1745 | 1812 | ||
| 1746 | static struct perf_header *header; | ||
| 1747 | |||
| 1748 | static u64 perf_header__sample_type(void) | 1813 | static u64 perf_header__sample_type(void) |
| 1749 | { | 1814 | { |
| 1750 | u64 sample_type = 0; | 1815 | u64 sample_type = 0; |
| @@ -1812,6 +1877,13 @@ static int __cmd_report(void) | |||
| 1812 | " -g?\n"); | 1877 | " -g?\n"); |
| 1813 | exit(-1); | 1878 | exit(-1); |
| 1814 | } | 1879 | } |
| 1880 | } else if (callchain_param.mode != CHAIN_NONE && !callchain) { | ||
| 1881 | callchain = 1; | ||
| 1882 | if (register_callchain_param(&callchain_param) < 0) { | ||
| 1883 | fprintf(stderr, "Can't register callchain" | ||
| 1884 | " params\n"); | ||
| 1885 | exit(-1); | ||
| 1886 | } | ||
| 1815 | } | 1887 | } |
| 1816 | 1888 | ||
| 1817 | if (load_kernel() < 0) { | 1889 | if (load_kernel() < 0) { |
| @@ -1950,6 +2022,13 @@ parse_callchain_opt(const struct option *opt __used, const char *arg, | |||
| 1950 | else if (!strncmp(tok, "fractal", strlen(arg))) | 2022 | else if (!strncmp(tok, "fractal", strlen(arg))) |
| 1951 | callchain_param.mode = CHAIN_GRAPH_REL; | 2023 | callchain_param.mode = CHAIN_GRAPH_REL; |
| 1952 | 2024 | ||
| 2025 | else if (!strncmp(tok, "none", strlen(arg))) { | ||
| 2026 | callchain_param.mode = CHAIN_NONE; | ||
| 2027 | callchain = 0; | ||
| 2028 | |||
| 2029 | return 0; | ||
| 2030 | } | ||
| 2031 | |||
| 1953 | else | 2032 | else |
| 1954 | return -1; | 2033 | return -1; |
| 1955 | 2034 | ||
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index f9510eeeb6c7..b4b06c7903e1 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c | |||
| @@ -496,7 +496,7 @@ static const struct option options[] = { | |||
| 496 | "stat events on existing pid"), | 496 | "stat events on existing pid"), |
| 497 | OPT_BOOLEAN('a', "all-cpus", &system_wide, | 497 | OPT_BOOLEAN('a', "all-cpus", &system_wide, |
| 498 | "system-wide collection from all CPUs"), | 498 | "system-wide collection from all CPUs"), |
| 499 | OPT_BOOLEAN('S', "scale", &scale, | 499 | OPT_BOOLEAN('c', "scale", &scale, |
| 500 | "scale/normalize counters"), | 500 | "scale/normalize counters"), |
| 501 | OPT_BOOLEAN('v', "verbose", &verbose, | 501 | OPT_BOOLEAN('v', "verbose", &verbose, |
| 502 | "be more verbose (show counter open errors, etc)"), | 502 | "be more verbose (show counter open errors, etc)"), |
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index f139f1ab9333..7de28ce9ca26 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c | |||
| @@ -31,6 +31,8 @@ | |||
| 31 | #include <fcntl.h> | 31 | #include <fcntl.h> |
| 32 | 32 | ||
| 33 | #include <stdio.h> | 33 | #include <stdio.h> |
| 34 | #include <termios.h> | ||
| 35 | #include <unistd.h> | ||
| 34 | 36 | ||
| 35 | #include <errno.h> | 37 | #include <errno.h> |
| 36 | #include <time.h> | 38 | #include <time.h> |
| @@ -54,7 +56,7 @@ static int system_wide = 0; | |||
| 54 | 56 | ||
| 55 | static int default_interval = 100000; | 57 | static int default_interval = 100000; |
| 56 | 58 | ||
| 57 | static u64 count_filter = 5; | 59 | static int count_filter = 5; |
| 58 | static int print_entries = 15; | 60 | static int print_entries = 15; |
| 59 | 61 | ||
| 60 | static int target_pid = -1; | 62 | static int target_pid = -1; |
| @@ -69,15 +71,28 @@ static int freq = 0; | |||
| 69 | static int verbose = 0; | 71 | static int verbose = 0; |
| 70 | static char *vmlinux = NULL; | 72 | static char *vmlinux = NULL; |
| 71 | 73 | ||
| 72 | static char *sym_filter; | ||
| 73 | static unsigned long filter_start; | ||
| 74 | static unsigned long filter_end; | ||
| 75 | |||
| 76 | static int delay_secs = 2; | 74 | static int delay_secs = 2; |
| 77 | static int zero; | 75 | static int zero; |
| 78 | static int dump_symtab; | 76 | static int dump_symtab; |
| 79 | 77 | ||
| 80 | /* | 78 | /* |
| 79 | * Source | ||
| 80 | */ | ||
| 81 | |||
| 82 | struct source_line { | ||
| 83 | u64 eip; | ||
| 84 | unsigned long count[MAX_COUNTERS]; | ||
| 85 | char *line; | ||
| 86 | struct source_line *next; | ||
| 87 | }; | ||
| 88 | |||
| 89 | static char *sym_filter = NULL; | ||
| 90 | struct sym_entry *sym_filter_entry = NULL; | ||
| 91 | static int sym_pcnt_filter = 5; | ||
| 92 | static int sym_counter = 0; | ||
| 93 | static int display_weighted = -1; | ||
| 94 | |||
| 95 | /* | ||
| 81 | * Symbols | 96 | * Symbols |
| 82 | */ | 97 | */ |
| 83 | 98 | ||
| @@ -91,9 +106,237 @@ struct sym_entry { | |||
| 91 | unsigned long snap_count; | 106 | unsigned long snap_count; |
| 92 | double weight; | 107 | double weight; |
| 93 | int skip; | 108 | int skip; |
| 109 | struct source_line *source; | ||
| 110 | struct source_line *lines; | ||
| 111 | struct source_line **lines_tail; | ||
| 112 | pthread_mutex_t source_lock; | ||
| 94 | }; | 113 | }; |
| 95 | 114 | ||
| 96 | struct sym_entry *sym_filter_entry; | 115 | /* |
| 116 | * Source functions | ||
| 117 | */ | ||
| 118 | |||
| 119 | static void parse_source(struct sym_entry *syme) | ||
| 120 | { | ||
| 121 | struct symbol *sym; | ||
| 122 | struct module *module; | ||
| 123 | struct section *section = NULL; | ||
| 124 | FILE *file; | ||
| 125 | char command[PATH_MAX*2], *path = vmlinux; | ||
| 126 | u64 start, end, len; | ||
| 127 | |||
| 128 | if (!syme) | ||
| 129 | return; | ||
| 130 | |||
| 131 | if (syme->lines) { | ||
| 132 | pthread_mutex_lock(&syme->source_lock); | ||
| 133 | goto out_assign; | ||
| 134 | } | ||
| 135 | |||
| 136 | sym = (struct symbol *)(syme + 1); | ||
| 137 | module = sym->module; | ||
| 138 | |||
| 139 | if (module) | ||
| 140 | path = module->path; | ||
| 141 | if (!path) | ||
| 142 | return; | ||
| 143 | |||
| 144 | start = sym->obj_start; | ||
| 145 | if (!start) | ||
| 146 | start = sym->start; | ||
| 147 | |||
| 148 | if (module) { | ||
| 149 | section = module->sections->find_section(module->sections, ".text"); | ||
| 150 | if (section) | ||
| 151 | start -= section->vma; | ||
| 152 | } | ||
| 153 | |||
| 154 | end = start + sym->end - sym->start + 1; | ||
| 155 | len = sym->end - sym->start; | ||
| 156 | |||
| 157 | sprintf(command, "objdump --start-address=0x%016Lx --stop-address=0x%016Lx -dS %s", start, end, path); | ||
| 158 | |||
| 159 | file = popen(command, "r"); | ||
| 160 | if (!file) | ||
| 161 | return; | ||
| 162 | |||
| 163 | pthread_mutex_lock(&syme->source_lock); | ||
| 164 | syme->lines_tail = &syme->lines; | ||
| 165 | while (!feof(file)) { | ||
| 166 | struct source_line *src; | ||
| 167 | size_t dummy = 0; | ||
| 168 | char *c; | ||
| 169 | |||
| 170 | src = malloc(sizeof(struct source_line)); | ||
| 171 | assert(src != NULL); | ||
| 172 | memset(src, 0, sizeof(struct source_line)); | ||
| 173 | |||
| 174 | if (getline(&src->line, &dummy, file) < 0) | ||
| 175 | break; | ||
| 176 | if (!src->line) | ||
| 177 | break; | ||
| 178 | |||
| 179 | c = strchr(src->line, '\n'); | ||
| 180 | if (c) | ||
| 181 | *c = 0; | ||
| 182 | |||
| 183 | src->next = NULL; | ||
| 184 | *syme->lines_tail = src; | ||
| 185 | syme->lines_tail = &src->next; | ||
| 186 | |||
| 187 | if (strlen(src->line)>8 && src->line[8] == ':') { | ||
| 188 | src->eip = strtoull(src->line, NULL, 16); | ||
| 189 | if (section) | ||
| 190 | src->eip += section->vma; | ||
| 191 | } | ||
| 192 | if (strlen(src->line)>8 && src->line[16] == ':') { | ||
| 193 | src->eip = strtoull(src->line, NULL, 16); | ||
| 194 | if (section) | ||
| 195 | src->eip += section->vma; | ||
| 196 | } | ||
| 197 | } | ||
| 198 | pclose(file); | ||
| 199 | out_assign: | ||
| 200 | sym_filter_entry = syme; | ||
| 201 | pthread_mutex_unlock(&syme->source_lock); | ||
| 202 | } | ||
| 203 | |||
| 204 | static void __zero_source_counters(struct sym_entry *syme) | ||
| 205 | { | ||
| 206 | int i; | ||
| 207 | struct source_line *line; | ||
| 208 | |||
| 209 | line = syme->lines; | ||
| 210 | while (line) { | ||
| 211 | for (i = 0; i < nr_counters; i++) | ||
| 212 | line->count[i] = 0; | ||
| 213 | line = line->next; | ||
| 214 | } | ||
| 215 | } | ||
| 216 | |||
| 217 | static void record_precise_ip(struct sym_entry *syme, int counter, u64 ip) | ||
| 218 | { | ||
| 219 | struct source_line *line; | ||
| 220 | |||
| 221 | if (syme != sym_filter_entry) | ||
| 222 | return; | ||
| 223 | |||
| 224 | if (pthread_mutex_trylock(&syme->source_lock)) | ||
| 225 | return; | ||
| 226 | |||
| 227 | if (!syme->source) | ||
| 228 | goto out_unlock; | ||
| 229 | |||
| 230 | for (line = syme->lines; line; line = line->next) { | ||
| 231 | if (line->eip == ip) { | ||
| 232 | line->count[counter]++; | ||
| 233 | break; | ||
| 234 | } | ||
| 235 | if (line->eip > ip) | ||
| 236 | break; | ||
| 237 | } | ||
| 238 | out_unlock: | ||
| 239 | pthread_mutex_unlock(&syme->source_lock); | ||
| 240 | } | ||
| 241 | |||
| 242 | static void lookup_sym_source(struct sym_entry *syme) | ||
| 243 | { | ||
| 244 | struct symbol *symbol = (struct symbol *)(syme + 1); | ||
| 245 | struct source_line *line; | ||
| 246 | char pattern[PATH_MAX]; | ||
| 247 | char *idx; | ||
| 248 | |||
| 249 | sprintf(pattern, "<%s>:", symbol->name); | ||
| 250 | |||
| 251 | if (symbol->module) { | ||
| 252 | idx = strstr(pattern, "\t"); | ||
| 253 | if (idx) | ||
| 254 | *idx = 0; | ||
| 255 | } | ||
| 256 | |||
| 257 | pthread_mutex_lock(&syme->source_lock); | ||
| 258 | for (line = syme->lines; line; line = line->next) { | ||
| 259 | if (strstr(line->line, pattern)) { | ||
| 260 | syme->source = line; | ||
| 261 | break; | ||
| 262 | } | ||
| 263 | } | ||
| 264 | pthread_mutex_unlock(&syme->source_lock); | ||
| 265 | } | ||
| 266 | |||
| 267 | static void show_lines(struct source_line *queue, int count, int total) | ||
| 268 | { | ||
| 269 | int i; | ||
| 270 | struct source_line *line; | ||
| 271 | |||
| 272 | line = queue; | ||
| 273 | for (i = 0; i < count; i++) { | ||
| 274 | float pcnt = 100.0*(float)line->count[sym_counter]/(float)total; | ||
| 275 | |||
| 276 | printf("%8li %4.1f%%\t%s\n", line->count[sym_counter], pcnt, line->line); | ||
| 277 | line = line->next; | ||
| 278 | } | ||
| 279 | } | ||
| 280 | |||
| 281 | #define TRACE_COUNT 3 | ||
| 282 | |||
| 283 | static void show_details(struct sym_entry *syme) | ||
| 284 | { | ||
| 285 | struct symbol *symbol; | ||
| 286 | struct source_line *line; | ||
| 287 | struct source_line *line_queue = NULL; | ||
| 288 | int displayed = 0; | ||
| 289 | int line_queue_count = 0, total = 0, more = 0; | ||
| 290 | |||
| 291 | if (!syme) | ||
| 292 | return; | ||
| 293 | |||
| 294 | if (!syme->source) | ||
| 295 | lookup_sym_source(syme); | ||
| 296 | |||
| 297 | if (!syme->source) | ||
| 298 | return; | ||
| 299 | |||
| 300 | symbol = (struct symbol *)(syme + 1); | ||
| 301 | printf("Showing %s for %s\n", event_name(sym_counter), symbol->name); | ||
| 302 | printf(" Events Pcnt (>=%d%%)\n", sym_pcnt_filter); | ||
| 303 | |||
| 304 | pthread_mutex_lock(&syme->source_lock); | ||
| 305 | line = syme->source; | ||
| 306 | while (line) { | ||
| 307 | total += line->count[sym_counter]; | ||
| 308 | line = line->next; | ||
| 309 | } | ||
| 310 | |||
| 311 | line = syme->source; | ||
| 312 | while (line) { | ||
| 313 | float pcnt = 0.0; | ||
| 314 | |||
| 315 | if (!line_queue_count) | ||
| 316 | line_queue = line; | ||
| 317 | line_queue_count++; | ||
| 318 | |||
| 319 | if (line->count[sym_counter]) | ||
| 320 | pcnt = 100.0 * line->count[sym_counter] / (float)total; | ||
| 321 | if (pcnt >= (float)sym_pcnt_filter) { | ||
| 322 | if (displayed <= print_entries) | ||
| 323 | show_lines(line_queue, line_queue_count, total); | ||
| 324 | else more++; | ||
| 325 | displayed += line_queue_count; | ||
| 326 | line_queue_count = 0; | ||
| 327 | line_queue = NULL; | ||
| 328 | } else if (line_queue_count > TRACE_COUNT) { | ||
| 329 | line_queue = line_queue->next; | ||
| 330 | line_queue_count--; | ||
| 331 | } | ||
| 332 | |||
| 333 | line->count[sym_counter] = zero ? 0 : line->count[sym_counter] * 7 / 8; | ||
| 334 | line = line->next; | ||
| 335 | } | ||
| 336 | pthread_mutex_unlock(&syme->source_lock); | ||
| 337 | if (more) | ||
| 338 | printf("%d lines not displayed, maybe increase display entries [e]\n", more); | ||
| 339 | } | ||
| 97 | 340 | ||
| 98 | struct dso *kernel_dso; | 341 | struct dso *kernel_dso; |
| 99 | 342 | ||
| @@ -112,6 +355,9 @@ static double sym_weight(const struct sym_entry *sym) | |||
| 112 | double weight = sym->snap_count; | 355 | double weight = sym->snap_count; |
| 113 | int counter; | 356 | int counter; |
| 114 | 357 | ||
| 358 | if (!display_weighted) | ||
| 359 | return weight; | ||
| 360 | |||
| 115 | for (counter = 1; counter < nr_counters-1; counter++) | 361 | for (counter = 1; counter < nr_counters-1; counter++) |
| 116 | weight *= sym->count[counter]; | 362 | weight *= sym->count[counter]; |
| 117 | 363 | ||
| @@ -159,7 +405,7 @@ static void rb_insert_active_sym(struct rb_root *tree, struct sym_entry *se) | |||
| 159 | static void print_sym_table(void) | 405 | static void print_sym_table(void) |
| 160 | { | 406 | { |
| 161 | int printed = 0, j; | 407 | int printed = 0, j; |
| 162 | int counter; | 408 | int counter, snap = !display_weighted ? sym_counter : 0; |
| 163 | float samples_per_sec = samples/delay_secs; | 409 | float samples_per_sec = samples/delay_secs; |
| 164 | float ksamples_per_sec = (samples-userspace_samples)/delay_secs; | 410 | float ksamples_per_sec = (samples-userspace_samples)/delay_secs; |
| 165 | float sum_ksamples = 0.0; | 411 | float sum_ksamples = 0.0; |
| @@ -175,7 +421,7 @@ static void print_sym_table(void) | |||
| 175 | pthread_mutex_unlock(&active_symbols_lock); | 421 | pthread_mutex_unlock(&active_symbols_lock); |
| 176 | 422 | ||
| 177 | list_for_each_entry_safe_from(syme, n, &active_symbols, node) { | 423 | list_for_each_entry_safe_from(syme, n, &active_symbols, node) { |
| 178 | syme->snap_count = syme->count[0]; | 424 | syme->snap_count = syme->count[snap]; |
| 179 | if (syme->snap_count != 0) { | 425 | if (syme->snap_count != 0) { |
| 180 | syme->weight = sym_weight(syme); | 426 | syme->weight = sym_weight(syme); |
| 181 | rb_insert_active_sym(&tmp, syme); | 427 | rb_insert_active_sym(&tmp, syme); |
| @@ -195,7 +441,7 @@ static void print_sym_table(void) | |||
| 195 | samples_per_sec, | 441 | samples_per_sec, |
| 196 | 100.0 - (100.0*((samples_per_sec-ksamples_per_sec)/samples_per_sec))); | 442 | 100.0 - (100.0*((samples_per_sec-ksamples_per_sec)/samples_per_sec))); |
| 197 | 443 | ||
| 198 | if (nr_counters == 1) { | 444 | if (nr_counters == 1 || !display_weighted) { |
| 199 | printf("%Ld", (u64)attrs[0].sample_period); | 445 | printf("%Ld", (u64)attrs[0].sample_period); |
| 200 | if (freq) | 446 | if (freq) |
| 201 | printf("Hz "); | 447 | printf("Hz "); |
| @@ -203,7 +449,9 @@ static void print_sym_table(void) | |||
| 203 | printf(" "); | 449 | printf(" "); |
| 204 | } | 450 | } |
| 205 | 451 | ||
| 206 | for (counter = 0; counter < nr_counters; counter++) { | 452 | if (!display_weighted) |
| 453 | printf("%s", event_name(sym_counter)); | ||
| 454 | else for (counter = 0; counter < nr_counters; counter++) { | ||
| 207 | if (counter) | 455 | if (counter) |
| 208 | printf("/"); | 456 | printf("/"); |
| 209 | 457 | ||
| @@ -228,6 +476,11 @@ static void print_sym_table(void) | |||
| 228 | 476 | ||
| 229 | printf("------------------------------------------------------------------------------\n\n"); | 477 | printf("------------------------------------------------------------------------------\n\n"); |
| 230 | 478 | ||
| 479 | if (sym_filter_entry) { | ||
| 480 | show_details(sym_filter_entry); | ||
| 481 | return; | ||
| 482 | } | ||
| 483 | |||
| 231 | if (nr_counters == 1) | 484 | if (nr_counters == 1) |
| 232 | printf(" samples pcnt"); | 485 | printf(" samples pcnt"); |
| 233 | else | 486 | else |
| @@ -242,13 +495,13 @@ static void print_sym_table(void) | |||
| 242 | struct symbol *sym = (struct symbol *)(syme + 1); | 495 | struct symbol *sym = (struct symbol *)(syme + 1); |
| 243 | double pcnt; | 496 | double pcnt; |
| 244 | 497 | ||
| 245 | if (++printed > print_entries || syme->snap_count < count_filter) | 498 | if (++printed > print_entries || (int)syme->snap_count < count_filter) |
| 246 | continue; | 499 | continue; |
| 247 | 500 | ||
| 248 | pcnt = 100.0 - (100.0 * ((sum_ksamples - syme->snap_count) / | 501 | pcnt = 100.0 - (100.0 * ((sum_ksamples - syme->snap_count) / |
| 249 | sum_ksamples)); | 502 | sum_ksamples)); |
| 250 | 503 | ||
| 251 | if (nr_counters == 1) | 504 | if (nr_counters == 1 || !display_weighted) |
| 252 | printf("%20.2f - ", syme->weight); | 505 | printf("%20.2f - ", syme->weight); |
| 253 | else | 506 | else |
| 254 | printf("%9.1f %10ld - ", syme->weight, syme->snap_count); | 507 | printf("%9.1f %10ld - ", syme->weight, syme->snap_count); |
| @@ -261,19 +514,250 @@ static void print_sym_table(void) | |||
| 261 | } | 514 | } |
| 262 | } | 515 | } |
| 263 | 516 | ||
| 517 | static void prompt_integer(int *target, const char *msg) | ||
| 518 | { | ||
| 519 | char *buf = malloc(0), *p; | ||
| 520 | size_t dummy = 0; | ||
| 521 | int tmp; | ||
| 522 | |||
| 523 | fprintf(stdout, "\n%s: ", msg); | ||
| 524 | if (getline(&buf, &dummy, stdin) < 0) | ||
| 525 | return; | ||
| 526 | |||
| 527 | p = strchr(buf, '\n'); | ||
| 528 | if (p) | ||
| 529 | *p = 0; | ||
| 530 | |||
| 531 | p = buf; | ||
| 532 | while(*p) { | ||
| 533 | if (!isdigit(*p)) | ||
| 534 | goto out_free; | ||
| 535 | p++; | ||
| 536 | } | ||
| 537 | tmp = strtoul(buf, NULL, 10); | ||
| 538 | *target = tmp; | ||
| 539 | out_free: | ||
| 540 | free(buf); | ||
| 541 | } | ||
| 542 | |||
| 543 | static void prompt_percent(int *target, const char *msg) | ||
| 544 | { | ||
| 545 | int tmp = 0; | ||
| 546 | |||
| 547 | prompt_integer(&tmp, msg); | ||
| 548 | if (tmp >= 0 && tmp <= 100) | ||
| 549 | *target = tmp; | ||
| 550 | } | ||
| 551 | |||
| 552 | static void prompt_symbol(struct sym_entry **target, const char *msg) | ||
| 553 | { | ||
| 554 | char *buf = malloc(0), *p; | ||
| 555 | struct sym_entry *syme = *target, *n, *found = NULL; | ||
| 556 | size_t dummy = 0; | ||
| 557 | |||
| 558 | /* zero counters of active symbol */ | ||
| 559 | if (syme) { | ||
| 560 | pthread_mutex_lock(&syme->source_lock); | ||
| 561 | __zero_source_counters(syme); | ||
| 562 | *target = NULL; | ||
| 563 | pthread_mutex_unlock(&syme->source_lock); | ||
| 564 | } | ||
| 565 | |||
| 566 | fprintf(stdout, "\n%s: ", msg); | ||
| 567 | if (getline(&buf, &dummy, stdin) < 0) | ||
| 568 | goto out_free; | ||
| 569 | |||
| 570 | p = strchr(buf, '\n'); | ||
| 571 | if (p) | ||
| 572 | *p = 0; | ||
| 573 | |||
| 574 | pthread_mutex_lock(&active_symbols_lock); | ||
| 575 | syme = list_entry(active_symbols.next, struct sym_entry, node); | ||
| 576 | pthread_mutex_unlock(&active_symbols_lock); | ||
| 577 | |||
| 578 | list_for_each_entry_safe_from(syme, n, &active_symbols, node) { | ||
| 579 | struct symbol *sym = (struct symbol *)(syme + 1); | ||
| 580 | |||
| 581 | if (!strcmp(buf, sym->name)) { | ||
| 582 | found = syme; | ||
| 583 | break; | ||
| 584 | } | ||
| 585 | } | ||
| 586 | |||
| 587 | if (!found) { | ||
| 588 | fprintf(stderr, "Sorry, %s is not active.\n", sym_filter); | ||
| 589 | sleep(1); | ||
| 590 | return; | ||
| 591 | } else | ||
| 592 | parse_source(found); | ||
| 593 | |||
| 594 | out_free: | ||
| 595 | free(buf); | ||
| 596 | } | ||
| 597 | |||
| 598 | static void print_mapped_keys(void) | ||
| 599 | { | ||
| 600 | char *name = NULL; | ||
| 601 | |||
| 602 | if (sym_filter_entry) { | ||
| 603 | struct symbol *sym = (struct symbol *)(sym_filter_entry+1); | ||
| 604 | name = sym->name; | ||
| 605 | } | ||
| 606 | |||
| 607 | fprintf(stdout, "\nMapped keys:\n"); | ||
| 608 | fprintf(stdout, "\t[d] display refresh delay. \t(%d)\n", delay_secs); | ||
| 609 | fprintf(stdout, "\t[e] display entries (lines). \t(%d)\n", print_entries); | ||
| 610 | |||
| 611 | if (nr_counters > 1) | ||
| 612 | fprintf(stdout, "\t[E] active event counter. \t(%s)\n", event_name(sym_counter)); | ||
| 613 | |||
| 614 | fprintf(stdout, "\t[f] profile display filter (count). \t(%d)\n", count_filter); | ||
| 615 | |||
| 616 | if (vmlinux) { | ||
| 617 | fprintf(stdout, "\t[F] annotate display filter (percent). \t(%d%%)\n", sym_pcnt_filter); | ||
| 618 | fprintf(stdout, "\t[s] annotate symbol. \t(%s)\n", name?: "NULL"); | ||
| 619 | fprintf(stdout, "\t[S] stop annotation.\n"); | ||
| 620 | } | ||
| 621 | |||
| 622 | if (nr_counters > 1) | ||
| 623 | fprintf(stdout, "\t[w] toggle display weighted/count[E]r. \t(%d)\n", display_weighted ? 1 : 0); | ||
| 624 | |||
| 625 | fprintf(stdout, "\t[z] toggle sample zeroing. \t(%d)\n", zero ? 1 : 0); | ||
| 626 | fprintf(stdout, "\t[qQ] quit.\n"); | ||
| 627 | } | ||
| 628 | |||
| 629 | static int key_mapped(int c) | ||
| 630 | { | ||
| 631 | switch (c) { | ||
| 632 | case 'd': | ||
| 633 | case 'e': | ||
| 634 | case 'f': | ||
| 635 | case 'z': | ||
| 636 | case 'q': | ||
| 637 | case 'Q': | ||
| 638 | return 1; | ||
| 639 | case 'E': | ||
| 640 | case 'w': | ||
| 641 | return nr_counters > 1 ? 1 : 0; | ||
| 642 | case 'F': | ||
| 643 | case 's': | ||
| 644 | case 'S': | ||
| 645 | return vmlinux ? 1 : 0; | ||
| 646 | } | ||
| 647 | |||
| 648 | return 0; | ||
| 649 | } | ||
| 650 | |||
| 651 | static void handle_keypress(int c) | ||
| 652 | { | ||
| 653 | if (!key_mapped(c)) { | ||
| 654 | struct pollfd stdin_poll = { .fd = 0, .events = POLLIN }; | ||
| 655 | struct termios tc, save; | ||
| 656 | |||
| 657 | print_mapped_keys(); | ||
| 658 | fprintf(stdout, "\nEnter selection, or unmapped key to continue: "); | ||
| 659 | fflush(stdout); | ||
| 660 | |||
| 661 | tcgetattr(0, &save); | ||
| 662 | tc = save; | ||
| 663 | tc.c_lflag &= ~(ICANON | ECHO); | ||
| 664 | tc.c_cc[VMIN] = 0; | ||
| 665 | tc.c_cc[VTIME] = 0; | ||
| 666 | tcsetattr(0, TCSANOW, &tc); | ||
| 667 | |||
| 668 | poll(&stdin_poll, 1, -1); | ||
| 669 | c = getc(stdin); | ||
| 670 | |||
| 671 | tcsetattr(0, TCSAFLUSH, &save); | ||
| 672 | if (!key_mapped(c)) | ||
| 673 | return; | ||
| 674 | } | ||
| 675 | |||
| 676 | switch (c) { | ||
| 677 | case 'd': | ||
| 678 | prompt_integer(&delay_secs, "Enter display delay"); | ||
| 679 | break; | ||
| 680 | case 'e': | ||
| 681 | prompt_integer(&print_entries, "Enter display entries (lines)"); | ||
| 682 | break; | ||
| 683 | case 'E': | ||
| 684 | if (nr_counters > 1) { | ||
| 685 | int i; | ||
| 686 | |||
| 687 | fprintf(stderr, "\nAvailable events:"); | ||
| 688 | for (i = 0; i < nr_counters; i++) | ||
| 689 | fprintf(stderr, "\n\t%d %s", i, event_name(i)); | ||
| 690 | |||
| 691 | prompt_integer(&sym_counter, "Enter details event counter"); | ||
| 692 | |||
| 693 | if (sym_counter >= nr_counters) { | ||
| 694 | fprintf(stderr, "Sorry, no such event, using %s.\n", event_name(0)); | ||
| 695 | sym_counter = 0; | ||
| 696 | sleep(1); | ||
| 697 | } | ||
| 698 | } else sym_counter = 0; | ||
| 699 | break; | ||
| 700 | case 'f': | ||
| 701 | prompt_integer(&count_filter, "Enter display event count filter"); | ||
| 702 | break; | ||
| 703 | case 'F': | ||
| 704 | prompt_percent(&sym_pcnt_filter, "Enter details display event filter (percent)"); | ||
| 705 | break; | ||
| 706 | case 'q': | ||
| 707 | case 'Q': | ||
| 708 | printf("exiting.\n"); | ||
| 709 | exit(0); | ||
| 710 | case 's': | ||
| 711 | prompt_symbol(&sym_filter_entry, "Enter details symbol"); | ||
| 712 | break; | ||
| 713 | case 'S': | ||
| 714 | if (!sym_filter_entry) | ||
| 715 | break; | ||
| 716 | else { | ||
| 717 | struct sym_entry *syme = sym_filter_entry; | ||
| 718 | |||
| 719 | pthread_mutex_lock(&syme->source_lock); | ||
| 720 | sym_filter_entry = NULL; | ||
| 721 | __zero_source_counters(syme); | ||
| 722 | pthread_mutex_unlock(&syme->source_lock); | ||
| 723 | } | ||
| 724 | break; | ||
| 725 | case 'w': | ||
| 726 | display_weighted = ~display_weighted; | ||
| 727 | break; | ||
| 728 | case 'z': | ||
| 729 | zero = ~zero; | ||
| 730 | break; | ||
| 731 | } | ||
| 732 | } | ||
| 733 | |||
| 264 | static void *display_thread(void *arg __used) | 734 | static void *display_thread(void *arg __used) |
| 265 | { | 735 | { |
| 266 | struct pollfd stdin_poll = { .fd = 0, .events = POLLIN }; | 736 | struct pollfd stdin_poll = { .fd = 0, .events = POLLIN }; |
| 267 | int delay_msecs = delay_secs * 1000; | 737 | struct termios tc, save; |
| 738 | int delay_msecs, c; | ||
| 739 | |||
| 740 | tcgetattr(0, &save); | ||
| 741 | tc = save; | ||
| 742 | tc.c_lflag &= ~(ICANON | ECHO); | ||
| 743 | tc.c_cc[VMIN] = 0; | ||
| 744 | tc.c_cc[VTIME] = 0; | ||
| 268 | 745 | ||
| 269 | printf("PerfTop refresh period: %d seconds\n", delay_secs); | 746 | repeat: |
| 747 | delay_msecs = delay_secs * 1000; | ||
| 748 | tcsetattr(0, TCSANOW, &tc); | ||
| 749 | /* trash return*/ | ||
| 750 | getc(stdin); | ||
| 270 | 751 | ||
| 271 | do { | 752 | do { |
| 272 | print_sym_table(); | 753 | print_sym_table(); |
| 273 | } while (!poll(&stdin_poll, 1, delay_msecs) == 1); | 754 | } while (!poll(&stdin_poll, 1, delay_msecs) == 1); |
| 274 | 755 | ||
| 275 | printf("key pressed - exiting.\n"); | 756 | c = getc(stdin); |
| 276 | exit(0); | 757 | tcsetattr(0, TCSAFLUSH, &save); |
| 758 | |||
| 759 | handle_keypress(c); | ||
| 760 | goto repeat; | ||
| 277 | 761 | ||
| 278 | return NULL; | 762 | return NULL; |
| 279 | } | 763 | } |
| @@ -293,7 +777,6 @@ static const char *skip_symbols[] = { | |||
| 293 | 777 | ||
| 294 | static int symbol_filter(struct dso *self, struct symbol *sym) | 778 | static int symbol_filter(struct dso *self, struct symbol *sym) |
| 295 | { | 779 | { |
| 296 | static int filter_match; | ||
| 297 | struct sym_entry *syme; | 780 | struct sym_entry *syme; |
| 298 | const char *name = sym->name; | 781 | const char *name = sym->name; |
| 299 | int i; | 782 | int i; |
| @@ -315,6 +798,10 @@ static int symbol_filter(struct dso *self, struct symbol *sym) | |||
| 315 | return 1; | 798 | return 1; |
| 316 | 799 | ||
| 317 | syme = dso__sym_priv(self, sym); | 800 | syme = dso__sym_priv(self, sym); |
| 801 | pthread_mutex_init(&syme->source_lock, NULL); | ||
| 802 | if (!sym_filter_entry && sym_filter && !strcmp(name, sym_filter)) | ||
| 803 | sym_filter_entry = syme; | ||
| 804 | |||
| 318 | for (i = 0; skip_symbols[i]; i++) { | 805 | for (i = 0; skip_symbols[i]; i++) { |
| 319 | if (!strcmp(skip_symbols[i], name)) { | 806 | if (!strcmp(skip_symbols[i], name)) { |
| 320 | syme->skip = 1; | 807 | syme->skip = 1; |
| @@ -322,29 +809,6 @@ static int symbol_filter(struct dso *self, struct symbol *sym) | |||
| 322 | } | 809 | } |
| 323 | } | 810 | } |
| 324 | 811 | ||
| 325 | if (filter_match == 1) { | ||
| 326 | filter_end = sym->start; | ||
| 327 | filter_match = -1; | ||
| 328 | if (filter_end - filter_start > 10000) { | ||
| 329 | fprintf(stderr, | ||
| 330 | "hm, too large filter symbol <%s> - skipping.\n", | ||
| 331 | sym_filter); | ||
| 332 | fprintf(stderr, "symbol filter start: %016lx\n", | ||
| 333 | filter_start); | ||
| 334 | fprintf(stderr, " end: %016lx\n", | ||
| 335 | filter_end); | ||
| 336 | filter_end = filter_start = 0; | ||
| 337 | sym_filter = NULL; | ||
| 338 | sleep(1); | ||
| 339 | } | ||
| 340 | } | ||
| 341 | |||
| 342 | if (filter_match == 0 && sym_filter && !strcmp(name, sym_filter)) { | ||
| 343 | filter_match = 1; | ||
| 344 | filter_start = sym->start; | ||
| 345 | } | ||
| 346 | |||
| 347 | |||
| 348 | return 0; | 812 | return 0; |
| 349 | } | 813 | } |
| 350 | 814 | ||
| @@ -380,8 +844,6 @@ out_delete_dso: | |||
| 380 | return -1; | 844 | return -1; |
| 381 | } | 845 | } |
| 382 | 846 | ||
| 383 | #define TRACE_COUNT 3 | ||
| 384 | |||
| 385 | /* | 847 | /* |
| 386 | * Binary search in the histogram table and record the hit: | 848 | * Binary search in the histogram table and record the hit: |
| 387 | */ | 849 | */ |
| @@ -394,6 +856,7 @@ static void record_ip(u64 ip, int counter) | |||
| 394 | 856 | ||
| 395 | if (!syme->skip) { | 857 | if (!syme->skip) { |
| 396 | syme->count[counter]++; | 858 | syme->count[counter]++; |
| 859 | record_precise_ip(syme, counter, ip); | ||
| 397 | pthread_mutex_lock(&active_symbols_lock); | 860 | pthread_mutex_lock(&active_symbols_lock); |
| 398 | if (list_empty(&syme->node) || !syme->node.next) | 861 | if (list_empty(&syme->node) || !syme->node.next) |
| 399 | __list_insert_active_sym(syme); | 862 | __list_insert_active_sym(syme); |
| @@ -690,8 +1153,8 @@ static const struct option options[] = { | |||
| 690 | "put the counters into a counter group"), | 1153 | "put the counters into a counter group"), |
| 691 | OPT_BOOLEAN('i', "inherit", &inherit, | 1154 | OPT_BOOLEAN('i', "inherit", &inherit, |
| 692 | "child tasks inherit counters"), | 1155 | "child tasks inherit counters"), |
| 693 | OPT_STRING('s', "sym-filter", &sym_filter, "pattern", | 1156 | OPT_STRING('s', "sym-annotate", &sym_filter, "symbol name", |
| 694 | "only display symbols matchig this pattern"), | 1157 | "symbol to annotate - requires -k option"), |
| 695 | OPT_BOOLEAN('z', "zero", &zero, | 1158 | OPT_BOOLEAN('z', "zero", &zero, |
| 696 | "zero history across updates"), | 1159 | "zero history across updates"), |
| 697 | OPT_INTEGER('F', "freq", &freq, | 1160 | OPT_INTEGER('F', "freq", &freq, |
| @@ -734,6 +1197,7 @@ int cmd_top(int argc, const char **argv, const char *prefix __used) | |||
| 734 | delay_secs = 1; | 1197 | delay_secs = 1; |
| 735 | 1198 | ||
| 736 | parse_symbols(); | 1199 | parse_symbols(); |
| 1200 | parse_source(sym_filter_entry); | ||
| 737 | 1201 | ||
| 738 | /* | 1202 | /* |
| 739 | * Fill in the ones not specifically initialized via -c: | 1203 | * Fill in the ones not specifically initialized via -c: |
diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c index 9d3c8141b8c1..011473411642 100644 --- a/tools/perf/util/callchain.c +++ b/tools/perf/util/callchain.c | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include <stdio.h> | 13 | #include <stdio.h> |
| 14 | #include <stdbool.h> | 14 | #include <stdbool.h> |
| 15 | #include <errno.h> | 15 | #include <errno.h> |
| 16 | #include <math.h> | ||
| 16 | 17 | ||
| 17 | #include "callchain.h" | 18 | #include "callchain.h" |
| 18 | 19 | ||
| @@ -26,10 +27,14 @@ rb_insert_callchain(struct rb_root *root, struct callchain_node *chain, | |||
| 26 | struct rb_node **p = &root->rb_node; | 27 | struct rb_node **p = &root->rb_node; |
| 27 | struct rb_node *parent = NULL; | 28 | struct rb_node *parent = NULL; |
| 28 | struct callchain_node *rnode; | 29 | struct callchain_node *rnode; |
| 30 | u64 chain_cumul = cumul_hits(chain); | ||
| 29 | 31 | ||
| 30 | while (*p) { | 32 | while (*p) { |
| 33 | u64 rnode_cumul; | ||
| 34 | |||
| 31 | parent = *p; | 35 | parent = *p; |
| 32 | rnode = rb_entry(parent, struct callchain_node, rb_node); | 36 | rnode = rb_entry(parent, struct callchain_node, rb_node); |
| 37 | rnode_cumul = cumul_hits(rnode); | ||
| 33 | 38 | ||
| 34 | switch (mode) { | 39 | switch (mode) { |
| 35 | case CHAIN_FLAT: | 40 | case CHAIN_FLAT: |
| @@ -40,7 +45,7 @@ rb_insert_callchain(struct rb_root *root, struct callchain_node *chain, | |||
| 40 | break; | 45 | break; |
| 41 | case CHAIN_GRAPH_ABS: /* Falldown */ | 46 | case CHAIN_GRAPH_ABS: /* Falldown */ |
| 42 | case CHAIN_GRAPH_REL: | 47 | case CHAIN_GRAPH_REL: |
| 43 | if (rnode->cumul_hit < chain->cumul_hit) | 48 | if (rnode_cumul < chain_cumul) |
| 44 | p = &(*p)->rb_left; | 49 | p = &(*p)->rb_left; |
| 45 | else | 50 | else |
| 46 | p = &(*p)->rb_right; | 51 | p = &(*p)->rb_right; |
| @@ -87,7 +92,7 @@ static void __sort_chain_graph_abs(struct callchain_node *node, | |||
| 87 | 92 | ||
| 88 | chain_for_each_child(child, node) { | 93 | chain_for_each_child(child, node) { |
| 89 | __sort_chain_graph_abs(child, min_hit); | 94 | __sort_chain_graph_abs(child, min_hit); |
| 90 | if (child->cumul_hit >= min_hit) | 95 | if (cumul_hits(child) >= min_hit) |
| 91 | rb_insert_callchain(&node->rb_root, child, | 96 | rb_insert_callchain(&node->rb_root, child, |
| 92 | CHAIN_GRAPH_ABS); | 97 | CHAIN_GRAPH_ABS); |
| 93 | } | 98 | } |
| @@ -108,11 +113,11 @@ static void __sort_chain_graph_rel(struct callchain_node *node, | |||
| 108 | u64 min_hit; | 113 | u64 min_hit; |
| 109 | 114 | ||
| 110 | node->rb_root = RB_ROOT; | 115 | node->rb_root = RB_ROOT; |
| 111 | min_hit = node->cumul_hit * min_percent / 100.0; | 116 | min_hit = ceil(node->children_hit * min_percent); |
| 112 | 117 | ||
| 113 | chain_for_each_child(child, node) { | 118 | chain_for_each_child(child, node) { |
| 114 | __sort_chain_graph_rel(child, min_percent); | 119 | __sort_chain_graph_rel(child, min_percent); |
| 115 | if (child->cumul_hit >= min_hit) | 120 | if (cumul_hits(child) >= min_hit) |
| 116 | rb_insert_callchain(&node->rb_root, child, | 121 | rb_insert_callchain(&node->rb_root, child, |
| 117 | CHAIN_GRAPH_REL); | 122 | CHAIN_GRAPH_REL); |
| 118 | } | 123 | } |
| @@ -122,7 +127,7 @@ static void | |||
| 122 | sort_chain_graph_rel(struct rb_root *rb_root, struct callchain_node *chain_root, | 127 | sort_chain_graph_rel(struct rb_root *rb_root, struct callchain_node *chain_root, |
| 123 | u64 min_hit __used, struct callchain_param *param) | 128 | u64 min_hit __used, struct callchain_param *param) |
| 124 | { | 129 | { |
| 125 | __sort_chain_graph_rel(chain_root, param->min_percent); | 130 | __sort_chain_graph_rel(chain_root, param->min_percent / 100.0); |
| 126 | rb_root->rb_node = chain_root->rb_root.rb_node; | 131 | rb_root->rb_node = chain_root->rb_root.rb_node; |
| 127 | } | 132 | } |
| 128 | 133 | ||
| @@ -211,7 +216,8 @@ add_child(struct callchain_node *parent, struct ip_callchain *chain, | |||
| 211 | new = create_child(parent, false); | 216 | new = create_child(parent, false); |
| 212 | fill_node(new, chain, start, syms); | 217 | fill_node(new, chain, start, syms); |
| 213 | 218 | ||
| 214 | new->cumul_hit = new->hit = 1; | 219 | new->children_hit = 0; |
| 220 | new->hit = 1; | ||
| 215 | } | 221 | } |
| 216 | 222 | ||
| 217 | /* | 223 | /* |
| @@ -241,7 +247,8 @@ split_add_child(struct callchain_node *parent, struct ip_callchain *chain, | |||
| 241 | 247 | ||
| 242 | /* split the hits */ | 248 | /* split the hits */ |
| 243 | new->hit = parent->hit; | 249 | new->hit = parent->hit; |
| 244 | new->cumul_hit = parent->cumul_hit; | 250 | new->children_hit = parent->children_hit; |
| 251 | parent->children_hit = cumul_hits(new); | ||
| 245 | new->val_nr = parent->val_nr - idx_local; | 252 | new->val_nr = parent->val_nr - idx_local; |
| 246 | parent->val_nr = idx_local; | 253 | parent->val_nr = idx_local; |
| 247 | 254 | ||
| @@ -249,6 +256,7 @@ split_add_child(struct callchain_node *parent, struct ip_callchain *chain, | |||
| 249 | if (idx_total < chain->nr) { | 256 | if (idx_total < chain->nr) { |
| 250 | parent->hit = 0; | 257 | parent->hit = 0; |
| 251 | add_child(parent, chain, idx_total, syms); | 258 | add_child(parent, chain, idx_total, syms); |
| 259 | parent->children_hit++; | ||
| 252 | } else { | 260 | } else { |
| 253 | parent->hit = 1; | 261 | parent->hit = 1; |
| 254 | } | 262 | } |
| @@ -269,13 +277,13 @@ __append_chain_children(struct callchain_node *root, struct ip_callchain *chain, | |||
| 269 | unsigned int ret = __append_chain(rnode, chain, start, syms); | 277 | unsigned int ret = __append_chain(rnode, chain, start, syms); |
| 270 | 278 | ||
| 271 | if (!ret) | 279 | if (!ret) |
| 272 | goto cumul; | 280 | goto inc_children_hit; |
| 273 | } | 281 | } |
| 274 | /* nothing in children, add to the current node */ | 282 | /* nothing in children, add to the current node */ |
| 275 | add_child(root, chain, start, syms); | 283 | add_child(root, chain, start, syms); |
| 276 | 284 | ||
| 277 | cumul: | 285 | inc_children_hit: |
| 278 | root->cumul_hit++; | 286 | root->children_hit++; |
| 279 | } | 287 | } |
| 280 | 288 | ||
| 281 | static int | 289 | static int |
| @@ -317,8 +325,6 @@ __append_chain(struct callchain_node *root, struct ip_callchain *chain, | |||
| 317 | /* we match 100% of the path, increment the hit */ | 325 | /* we match 100% of the path, increment the hit */ |
| 318 | if (i - start == root->val_nr && i == chain->nr) { | 326 | if (i - start == root->val_nr && i == chain->nr) { |
| 319 | root->hit++; | 327 | root->hit++; |
| 320 | root->cumul_hit++; | ||
| 321 | |||
| 322 | return 0; | 328 | return 0; |
| 323 | } | 329 | } |
| 324 | 330 | ||
| @@ -331,5 +337,7 @@ __append_chain(struct callchain_node *root, struct ip_callchain *chain, | |||
| 331 | void append_chain(struct callchain_node *root, struct ip_callchain *chain, | 337 | void append_chain(struct callchain_node *root, struct ip_callchain *chain, |
| 332 | struct symbol **syms) | 338 | struct symbol **syms) |
| 333 | { | 339 | { |
| 340 | if (!chain->nr) | ||
| 341 | return; | ||
| 334 | __append_chain_children(root, chain, syms, 0); | 342 | __append_chain_children(root, chain, syms, 0); |
| 335 | } | 343 | } |
diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h index 7812122bea1d..a926ae4f5a16 100644 --- a/tools/perf/util/callchain.h +++ b/tools/perf/util/callchain.h | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #include "symbol.h" | 7 | #include "symbol.h" |
| 8 | 8 | ||
| 9 | enum chain_mode { | 9 | enum chain_mode { |
| 10 | CHAIN_NONE, | ||
| 10 | CHAIN_FLAT, | 11 | CHAIN_FLAT, |
| 11 | CHAIN_GRAPH_ABS, | 12 | CHAIN_GRAPH_ABS, |
| 12 | CHAIN_GRAPH_REL | 13 | CHAIN_GRAPH_REL |
| @@ -21,7 +22,7 @@ struct callchain_node { | |||
| 21 | struct rb_root rb_root; /* sorted tree of children */ | 22 | struct rb_root rb_root; /* sorted tree of children */ |
| 22 | unsigned int val_nr; | 23 | unsigned int val_nr; |
| 23 | u64 hit; | 24 | u64 hit; |
| 24 | u64 cumul_hit; /* hit + hits of children */ | 25 | u64 children_hit; |
| 25 | }; | 26 | }; |
| 26 | 27 | ||
| 27 | struct callchain_param; | 28 | struct callchain_param; |
| @@ -48,6 +49,11 @@ static inline void callchain_init(struct callchain_node *node) | |||
| 48 | INIT_LIST_HEAD(&node->val); | 49 | INIT_LIST_HEAD(&node->val); |
| 49 | } | 50 | } |
| 50 | 51 | ||
| 52 | static inline u64 cumul_hits(struct callchain_node *node) | ||
| 53 | { | ||
| 54 | return node->hit + node->children_hit; | ||
| 55 | } | ||
| 56 | |||
| 51 | int register_callchain_param(struct callchain_param *param); | 57 | int register_callchain_param(struct callchain_param *param); |
| 52 | void append_chain(struct callchain_node *root, struct ip_callchain *chain, | 58 | void append_chain(struct callchain_node *root, struct ip_callchain *chain, |
| 53 | struct symbol **syms); | 59 | struct symbol **syms); |
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 450384b3bbe5..b92a457ca32e 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c | |||
| @@ -185,6 +185,8 @@ static void do_read(int fd, void *buf, size_t size) | |||
| 185 | 185 | ||
| 186 | if (ret < 0) | 186 | if (ret < 0) |
| 187 | die("failed to read"); | 187 | die("failed to read"); |
| 188 | if (ret == 0) | ||
| 189 | die("failed to read: missing data"); | ||
| 188 | 190 | ||
| 189 | size -= ret; | 191 | size -= ret; |
| 190 | buf += ret; | 192 | buf += ret; |
| @@ -213,9 +215,10 @@ struct perf_header *perf_header__read(int fd) | |||
| 213 | 215 | ||
| 214 | for (i = 0; i < nr_attrs; i++) { | 216 | for (i = 0; i < nr_attrs; i++) { |
| 215 | struct perf_header_attr *attr; | 217 | struct perf_header_attr *attr; |
| 216 | off_t tmp = lseek(fd, 0, SEEK_CUR); | 218 | off_t tmp; |
| 217 | 219 | ||
| 218 | do_read(fd, &f_attr, sizeof(f_attr)); | 220 | do_read(fd, &f_attr, sizeof(f_attr)); |
| 221 | tmp = lseek(fd, 0, SEEK_CUR); | ||
| 219 | 222 | ||
| 220 | attr = perf_header_attr__new(&f_attr.attr); | 223 | attr = perf_header_attr__new(&f_attr.attr); |
| 221 | 224 | ||
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 7bdad8df22a6..4858d83b3b67 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c | |||
| @@ -121,13 +121,29 @@ static unsigned long hw_cache_stat[C(MAX)] = { | |||
| 121 | (strcmp(sys_dirent.d_name, ".")) && \ | 121 | (strcmp(sys_dirent.d_name, ".")) && \ |
| 122 | (strcmp(sys_dirent.d_name, ".."))) | 122 | (strcmp(sys_dirent.d_name, ".."))) |
| 123 | 123 | ||
| 124 | static int tp_event_has_id(struct dirent *sys_dir, struct dirent *evt_dir) | ||
| 125 | { | ||
| 126 | char evt_path[MAXPATHLEN]; | ||
| 127 | int fd; | ||
| 128 | |||
| 129 | snprintf(evt_path, MAXPATHLEN, "%s/%s/%s/id", debugfs_path, | ||
| 130 | sys_dir->d_name, evt_dir->d_name); | ||
| 131 | fd = open(evt_path, O_RDONLY); | ||
| 132 | if (fd < 0) | ||
| 133 | return -EINVAL; | ||
| 134 | close(fd); | ||
| 135 | |||
| 136 | return 0; | ||
| 137 | } | ||
| 138 | |||
| 124 | #define for_each_event(sys_dirent, evt_dir, evt_dirent, evt_next, file, st) \ | 139 | #define for_each_event(sys_dirent, evt_dir, evt_dirent, evt_next, file, st) \ |
| 125 | while (!readdir_r(evt_dir, &evt_dirent, &evt_next) && evt_next) \ | 140 | while (!readdir_r(evt_dir, &evt_dirent, &evt_next) && evt_next) \ |
| 126 | if (snprintf(file, MAXPATHLEN, "%s/%s/%s", debugfs_path, \ | 141 | if (snprintf(file, MAXPATHLEN, "%s/%s/%s", debugfs_path, \ |
| 127 | sys_dirent.d_name, evt_dirent.d_name) && \ | 142 | sys_dirent.d_name, evt_dirent.d_name) && \ |
| 128 | (!stat(file, &st)) && (S_ISDIR(st.st_mode)) && \ | 143 | (!stat(file, &st)) && (S_ISDIR(st.st_mode)) && \ |
| 129 | (strcmp(evt_dirent.d_name, ".")) && \ | 144 | (strcmp(evt_dirent.d_name, ".")) && \ |
| 130 | (strcmp(evt_dirent.d_name, ".."))) | 145 | (strcmp(evt_dirent.d_name, "..")) && \ |
| 146 | (!tp_event_has_id(&sys_dirent, &evt_dirent))) | ||
| 131 | 147 | ||
| 132 | #define MAX_EVENT_LENGTH 30 | 148 | #define MAX_EVENT_LENGTH 30 |
| 133 | 149 | ||
| @@ -223,9 +239,15 @@ char *event_name(int counter) | |||
| 223 | { | 239 | { |
| 224 | u64 config = attrs[counter].config; | 240 | u64 config = attrs[counter].config; |
| 225 | int type = attrs[counter].type; | 241 | int type = attrs[counter].type; |
| 242 | |||
| 243 | return __event_name(type, config); | ||
| 244 | } | ||
| 245 | |||
| 246 | char *__event_name(int type, u64 config) | ||
| 247 | { | ||
| 226 | static char buf[32]; | 248 | static char buf[32]; |
| 227 | 249 | ||
| 228 | if (attrs[counter].type == PERF_TYPE_RAW) { | 250 | if (type == PERF_TYPE_RAW) { |
| 229 | sprintf(buf, "raw 0x%llx", config); | 251 | sprintf(buf, "raw 0x%llx", config); |
| 230 | return buf; | 252 | return buf; |
| 231 | } | 253 | } |
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index 1ea5d09b6eb1..192a962e3a0f 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h | |||
| @@ -10,6 +10,7 @@ extern int nr_counters; | |||
| 10 | extern struct perf_counter_attr attrs[MAX_COUNTERS]; | 10 | extern struct perf_counter_attr attrs[MAX_COUNTERS]; |
| 11 | 11 | ||
| 12 | extern char *event_name(int ctr); | 12 | extern char *event_name(int ctr); |
| 13 | extern char *__event_name(int type, u64 config); | ||
| 13 | 14 | ||
| 14 | extern int parse_events(const struct option *opt, const char *str, int unset); | 15 | extern int parse_events(const struct option *opt, const char *str, int unset); |
| 15 | 16 | ||
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index b4fe0579bd6b..f1dcede14307 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c | |||
| @@ -6,7 +6,16 @@ | |||
| 6 | #include <libelf.h> | 6 | #include <libelf.h> |
| 7 | #include <gelf.h> | 7 | #include <gelf.h> |
| 8 | #include <elf.h> | 8 | #include <elf.h> |
| 9 | |||
| 10 | #ifndef NO_DEMANGLE | ||
| 9 | #include <bfd.h> | 11 | #include <bfd.h> |
| 12 | #else | ||
| 13 | static inline | ||
| 14 | char *bfd_demangle(void __used *v, const char __used *c, int __used i) | ||
| 15 | { | ||
| 16 | return NULL; | ||
| 17 | } | ||
| 18 | #endif | ||
| 10 | 19 | ||
| 11 | const char *sym_hist_filter; | 20 | const char *sym_hist_filter; |
| 12 | 21 | ||
| @@ -15,6 +24,16 @@ const char *sym_hist_filter; | |||
| 15 | #define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */ | 24 | #define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */ |
| 16 | #endif | 25 | #endif |
| 17 | 26 | ||
| 27 | enum dso_origin { | ||
| 28 | DSO__ORIG_KERNEL = 0, | ||
| 29 | DSO__ORIG_JAVA_JIT, | ||
| 30 | DSO__ORIG_FEDORA, | ||
| 31 | DSO__ORIG_UBUNTU, | ||
| 32 | DSO__ORIG_BUILDID, | ||
| 33 | DSO__ORIG_DSO, | ||
| 34 | DSO__ORIG_NOT_FOUND, | ||
| 35 | }; | ||
| 36 | |||
| 18 | static struct symbol *symbol__new(u64 start, u64 len, | 37 | static struct symbol *symbol__new(u64 start, u64 len, |
| 19 | const char *name, unsigned int priv_size, | 38 | const char *name, unsigned int priv_size, |
| 20 | u64 obj_start, int verbose) | 39 | u64 obj_start, int verbose) |
| @@ -72,6 +91,7 @@ struct dso *dso__new(const char *name, unsigned int sym_priv_size) | |||
| 72 | self->sym_priv_size = sym_priv_size; | 91 | self->sym_priv_size = sym_priv_size; |
| 73 | self->find_symbol = dso__find_symbol; | 92 | self->find_symbol = dso__find_symbol; |
| 74 | self->slen_calculated = 0; | 93 | self->slen_calculated = 0; |
| 94 | self->origin = DSO__ORIG_NOT_FOUND; | ||
| 75 | } | 95 | } |
| 76 | 96 | ||
| 77 | return self; | 97 | return self; |
| @@ -652,11 +672,85 @@ out_close: | |||
| 652 | return err; | 672 | return err; |
| 653 | } | 673 | } |
| 654 | 674 | ||
| 675 | #define BUILD_ID_SIZE 128 | ||
| 676 | |||
| 677 | static char *dso__read_build_id(struct dso *self, int verbose) | ||
| 678 | { | ||
| 679 | int i; | ||
| 680 | GElf_Ehdr ehdr; | ||
| 681 | GElf_Shdr shdr; | ||
| 682 | Elf_Data *build_id_data; | ||
| 683 | Elf_Scn *sec; | ||
| 684 | char *build_id = NULL, *bid; | ||
| 685 | unsigned char *raw; | ||
| 686 | Elf *elf; | ||
| 687 | int fd = open(self->name, O_RDONLY); | ||
| 688 | |||
| 689 | if (fd < 0) | ||
| 690 | goto out; | ||
| 691 | |||
| 692 | elf = elf_begin(fd, ELF_C_READ_MMAP, NULL); | ||
| 693 | if (elf == NULL) { | ||
| 694 | if (verbose) | ||
| 695 | fprintf(stderr, "%s: cannot read %s ELF file.\n", | ||
| 696 | __func__, self->name); | ||
| 697 | goto out_close; | ||
| 698 | } | ||
| 699 | |||
| 700 | if (gelf_getehdr(elf, &ehdr) == NULL) { | ||
| 701 | if (verbose) | ||
| 702 | fprintf(stderr, "%s: cannot get elf header.\n", __func__); | ||
| 703 | goto out_elf_end; | ||
| 704 | } | ||
| 705 | |||
| 706 | sec = elf_section_by_name(elf, &ehdr, &shdr, ".note.gnu.build-id", NULL); | ||
| 707 | if (sec == NULL) | ||
| 708 | goto out_elf_end; | ||
| 709 | |||
| 710 | build_id_data = elf_getdata(sec, NULL); | ||
| 711 | if (build_id_data == NULL) | ||
| 712 | goto out_elf_end; | ||
| 713 | build_id = malloc(BUILD_ID_SIZE); | ||
| 714 | if (build_id == NULL) | ||
| 715 | goto out_elf_end; | ||
| 716 | raw = build_id_data->d_buf + 16; | ||
| 717 | bid = build_id; | ||
| 718 | |||
| 719 | for (i = 0; i < 20; ++i) { | ||
| 720 | sprintf(bid, "%02x", *raw); | ||
| 721 | ++raw; | ||
| 722 | bid += 2; | ||
| 723 | } | ||
| 724 | if (verbose >= 2) | ||
| 725 | printf("%s(%s): %s\n", __func__, self->name, build_id); | ||
| 726 | out_elf_end: | ||
| 727 | elf_end(elf); | ||
| 728 | out_close: | ||
| 729 | close(fd); | ||
| 730 | out: | ||
| 731 | return build_id; | ||
| 732 | } | ||
| 733 | |||
| 734 | char dso__symtab_origin(const struct dso *self) | ||
| 735 | { | ||
| 736 | static const char origin[] = { | ||
| 737 | [DSO__ORIG_KERNEL] = 'k', | ||
| 738 | [DSO__ORIG_JAVA_JIT] = 'j', | ||
| 739 | [DSO__ORIG_FEDORA] = 'f', | ||
| 740 | [DSO__ORIG_UBUNTU] = 'u', | ||
| 741 | [DSO__ORIG_BUILDID] = 'b', | ||
| 742 | [DSO__ORIG_DSO] = 'd', | ||
| 743 | }; | ||
| 744 | |||
| 745 | if (self == NULL || self->origin == DSO__ORIG_NOT_FOUND) | ||
| 746 | return '!'; | ||
| 747 | return origin[self->origin]; | ||
| 748 | } | ||
| 749 | |||
| 655 | int dso__load(struct dso *self, symbol_filter_t filter, int verbose) | 750 | int dso__load(struct dso *self, symbol_filter_t filter, int verbose) |
| 656 | { | 751 | { |
| 657 | int size = strlen(self->name) + sizeof("/usr/lib/debug%s.debug"); | 752 | int size = PATH_MAX; |
| 658 | char *name = malloc(size); | 753 | char *name = malloc(size), *build_id = NULL; |
| 659 | int variant = 0; | ||
| 660 | int ret = -1; | 754 | int ret = -1; |
| 661 | int fd; | 755 | int fd; |
| 662 | 756 | ||
| @@ -665,26 +759,43 @@ int dso__load(struct dso *self, symbol_filter_t filter, int verbose) | |||
| 665 | 759 | ||
| 666 | self->adjust_symbols = 0; | 760 | self->adjust_symbols = 0; |
| 667 | 761 | ||
| 668 | if (strncmp(self->name, "/tmp/perf-", 10) == 0) | 762 | if (strncmp(self->name, "/tmp/perf-", 10) == 0) { |
| 669 | return dso__load_perf_map(self, filter, verbose); | 763 | ret = dso__load_perf_map(self, filter, verbose); |
| 764 | self->origin = ret > 0 ? DSO__ORIG_JAVA_JIT : | ||
| 765 | DSO__ORIG_NOT_FOUND; | ||
| 766 | return ret; | ||
| 767 | } | ||
| 768 | |||
| 769 | self->origin = DSO__ORIG_FEDORA - 1; | ||
| 670 | 770 | ||
| 671 | more: | 771 | more: |
| 672 | do { | 772 | do { |
| 673 | switch (variant) { | 773 | self->origin++; |
| 674 | case 0: /* Fedora */ | 774 | switch (self->origin) { |
| 775 | case DSO__ORIG_FEDORA: | ||
| 675 | snprintf(name, size, "/usr/lib/debug%s.debug", self->name); | 776 | snprintf(name, size, "/usr/lib/debug%s.debug", self->name); |
| 676 | break; | 777 | break; |
| 677 | case 1: /* Ubuntu */ | 778 | case DSO__ORIG_UBUNTU: |
| 678 | snprintf(name, size, "/usr/lib/debug%s", self->name); | 779 | snprintf(name, size, "/usr/lib/debug%s", self->name); |
| 679 | break; | 780 | break; |
| 680 | case 2: /* Sane people */ | 781 | case DSO__ORIG_BUILDID: |
| 782 | build_id = dso__read_build_id(self, verbose); | ||
| 783 | if (build_id != NULL) { | ||
| 784 | snprintf(name, size, | ||
| 785 | "/usr/lib/debug/.build-id/%.2s/%s.debug", | ||
| 786 | build_id, build_id + 2); | ||
| 787 | free(build_id); | ||
| 788 | break; | ||
| 789 | } | ||
| 790 | self->origin++; | ||
| 791 | /* Fall thru */ | ||
| 792 | case DSO__ORIG_DSO: | ||
| 681 | snprintf(name, size, "%s", self->name); | 793 | snprintf(name, size, "%s", self->name); |
| 682 | break; | 794 | break; |
| 683 | 795 | ||
| 684 | default: | 796 | default: |
| 685 | goto out; | 797 | goto out; |
| 686 | } | 798 | } |
| 687 | variant++; | ||
| 688 | 799 | ||
| 689 | fd = open(name, O_RDONLY); | 800 | fd = open(name, O_RDONLY); |
| 690 | } while (fd < 0); | 801 | } while (fd < 0); |
| @@ -820,6 +931,9 @@ int dso__load_kernel(struct dso *self, const char *vmlinux, | |||
| 820 | if (err <= 0) | 931 | if (err <= 0) |
| 821 | err = dso__load_kallsyms(self, filter, verbose); | 932 | err = dso__load_kallsyms(self, filter, verbose); |
| 822 | 933 | ||
| 934 | if (err > 0) | ||
| 935 | self->origin = DSO__ORIG_KERNEL; | ||
| 936 | |||
| 823 | return err; | 937 | return err; |
| 824 | } | 938 | } |
| 825 | 939 | ||
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h index 2f92b21c712d..1e003ec2f4b1 100644 --- a/tools/perf/util/symbol.h +++ b/tools/perf/util/symbol.h | |||
| @@ -26,6 +26,7 @@ struct dso { | |||
| 26 | unsigned int sym_priv_size; | 26 | unsigned int sym_priv_size; |
| 27 | unsigned char adjust_symbols; | 27 | unsigned char adjust_symbols; |
| 28 | unsigned char slen_calculated; | 28 | unsigned char slen_calculated; |
| 29 | unsigned char origin; | ||
| 29 | char name[0]; | 30 | char name[0]; |
| 30 | }; | 31 | }; |
| 31 | 32 | ||
| @@ -49,6 +50,7 @@ int dso__load_modules(struct dso *self, symbol_filter_t filter, int verbose); | |||
| 49 | int dso__load(struct dso *self, symbol_filter_t filter, int verbose); | 50 | int dso__load(struct dso *self, symbol_filter_t filter, int verbose); |
| 50 | 51 | ||
| 51 | size_t dso__fprintf(struct dso *self, FILE *fp); | 52 | size_t dso__fprintf(struct dso *self, FILE *fp); |
| 53 | char dso__symtab_origin(const struct dso *self); | ||
| 52 | 54 | ||
| 53 | void symbol__init(void); | 55 | void symbol__init(void); |
| 54 | #endif /* _PERF_SYMBOL_ */ | 56 | #endif /* _PERF_SYMBOL_ */ |
diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c index 1eddae94bab3..1150c6d5c7b8 100644 --- a/virt/kvm/ioapic.c +++ b/virt/kvm/ioapic.c | |||
| @@ -95,8 +95,6 @@ static int ioapic_service(struct kvm_ioapic *ioapic, unsigned int idx) | |||
| 95 | if (injected && pent->fields.trig_mode == IOAPIC_LEVEL_TRIG) | 95 | if (injected && pent->fields.trig_mode == IOAPIC_LEVEL_TRIG) |
| 96 | pent->fields.remote_irr = 1; | 96 | pent->fields.remote_irr = 1; |
| 97 | } | 97 | } |
| 98 | if (!pent->fields.trig_mode) | ||
| 99 | ioapic->irr &= ~(1 << idx); | ||
| 100 | 98 | ||
| 101 | return injected; | 99 | return injected; |
| 102 | } | 100 | } |
| @@ -136,7 +134,8 @@ static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val) | |||
| 136 | mask_after = ioapic->redirtbl[index].fields.mask; | 134 | mask_after = ioapic->redirtbl[index].fields.mask; |
| 137 | if (mask_before != mask_after) | 135 | if (mask_before != mask_after) |
| 138 | kvm_fire_mask_notifiers(ioapic->kvm, index, mask_after); | 136 | kvm_fire_mask_notifiers(ioapic->kvm, index, mask_after); |
| 139 | if (ioapic->irr & (1 << index)) | 137 | if (ioapic->redirtbl[index].fields.trig_mode == IOAPIC_LEVEL_TRIG |
| 138 | && ioapic->irr & (1 << index)) | ||
| 140 | ioapic_service(ioapic, index); | 139 | ioapic_service(ioapic, index); |
| 141 | break; | 140 | break; |
| 142 | } | 141 | } |
| @@ -184,9 +183,10 @@ int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int level) | |||
| 184 | if (!level) | 183 | if (!level) |
| 185 | ioapic->irr &= ~mask; | 184 | ioapic->irr &= ~mask; |
| 186 | else { | 185 | else { |
| 186 | int edge = (entry.fields.trig_mode == IOAPIC_EDGE_TRIG); | ||
| 187 | ioapic->irr |= mask; | 187 | ioapic->irr |= mask; |
| 188 | if ((!entry.fields.trig_mode && old_irr != ioapic->irr) | 188 | if ((edge && old_irr != ioapic->irr) || |
| 189 | || !entry.fields.remote_irr) | 189 | (!edge && !entry.fields.remote_irr)) |
| 190 | ret = ioapic_service(ioapic, irq); | 190 | ret = ioapic_service(ioapic, irq); |
| 191 | } | 191 | } |
| 192 | } | 192 | } |
diff --git a/virt/kvm/irq_comm.c b/virt/kvm/irq_comm.c index a8bd466d00cc..ddc17f0e2f35 100644 --- a/virt/kvm/irq_comm.c +++ b/virt/kvm/irq_comm.c | |||
| @@ -160,7 +160,8 @@ void kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin) | |||
| 160 | unsigned gsi = pin; | 160 | unsigned gsi = pin; |
| 161 | 161 | ||
| 162 | list_for_each_entry(e, &kvm->irq_routing, link) | 162 | list_for_each_entry(e, &kvm->irq_routing, link) |
| 163 | if (e->irqchip.irqchip == irqchip && | 163 | if (e->type == KVM_IRQ_ROUTING_IRQCHIP && |
| 164 | e->irqchip.irqchip == irqchip && | ||
| 164 | e->irqchip.pin == pin) { | 165 | e->irqchip.pin == pin) { |
| 165 | gsi = e->gsi; | 166 | gsi = e->gsi; |
| 166 | break; | 167 | break; |
| @@ -259,6 +260,7 @@ static int setup_routing_entry(struct kvm_kernel_irq_routing_entry *e, | |||
| 259 | int delta; | 260 | int delta; |
| 260 | 261 | ||
| 261 | e->gsi = ue->gsi; | 262 | e->gsi = ue->gsi; |
| 263 | e->type = ue->type; | ||
| 262 | switch (ue->type) { | 264 | switch (ue->type) { |
| 263 | case KVM_IRQ_ROUTING_IRQCHIP: | 265 | case KVM_IRQ_ROUTING_IRQCHIP: |
| 264 | delta = 0; | 266 | delta = 0; |
