diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-07-09 19:04:31 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-07-09 19:04:31 -0400 |
commit | 2e17c5a97e231f3cb426f4b7895eab5be5c5442e (patch) | |
tree | 80871817427250200d6931a45ccb4833c4add74a /arch/x86 | |
parent | 5f097cd249f00683442c3e265d6f27d80fc83563 (diff) | |
parent | 774d8e34e46506222bb5e2888e3ef42b2775715f (diff) |
Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux
Pull drm updates from Dave Airlie:
"Okay this is the big one, I was stalled on the fbdev pull req as I
stupidly let fbdev guys merge a patch I required to fix a warning with
some patches I had, they ended up merging the patch from the wrong
place, but the warning should be fixed. In future I'll just take the
patch myself!
Outside drm:
There are some snd changes for the HDMI audio interactions on haswell,
they've been acked for inclusion via my tree. This relies on the
wound/wait tree from Ingo which is already merged.
Major changes:
AMD finally released the dynamic power management code for all their
GPUs from r600->present day, this is great, off by default for now but
also a huge amount of code, in fact it is most of this pull request.
Since it landed there has been a lot of community testing and Alex has
sent a lot of fixes for any bugs found so far. I suspect radeon might
now be the biggest kernel driver ever :-P p.s. radeon.dpm=1 to enable
dynamic powermanagement for anyone.
New drivers:
Renesas r-car display unit.
Other highlights:
- core: GEM CMA prime support, use new w/w mutexs for TTM
reservations, cursor hotspot, doc updates
- dvo chips: chrontel 7010B support
- i915: Haswell (fbc, ips, vecs, watermarks, audio powerwell),
Valleyview (enabled by default, rc6), lots of pll reworking, 30bpp
support (this time for sure)
- nouveau: async buffer object deletion, context/register init
updates, kernel vp2 engine support, GF117 support, GK110 accel
support (with external nvidia ucode), context cleanups.
- exynos: memory leak fixes, Add S3C64XX SoC series support, device
tree updates, common clock framework support,
- qxl: cursor hotspot support, multi-monitor support, suspend/resume
support
- mgag200: hw cursor support, g200 mode limiting
- shmobile: prime support
- tegra: fixes mostly
I've been banging on this quite a lot due to the size of it, and it
seems to okay on everything I've tested it on."
* 'drm-next' of git://people.freedesktop.org/~airlied/linux: (811 commits)
drm/radeon/dpm: implement vblank_too_short callback for si
drm/radeon/dpm: implement vblank_too_short callback for cayman
drm/radeon/dpm: implement vblank_too_short callback for btc
drm/radeon/dpm: implement vblank_too_short callback for evergreen
drm/radeon/dpm: implement vblank_too_short callback for 7xx
drm/radeon/dpm: add checks against vblank time
drm/radeon/dpm: add helper to calculate vblank time
drm/radeon: remove stray line in old pm code
drm/radeon/dpm: fix display_gap programming on rv7xx
drm/nvc0/gr: fix gpc firmware regression
drm/nouveau: fix minor thinko causing bo moves to not be async on kepler
drm/radeon/dpm: implement force performance level for TN
drm/radeon/dpm: implement force performance level for ON/LN
drm/radeon/dpm: implement force performance level for SI
drm/radeon/dpm: implement force performance level for cayman
drm/radeon/dpm: implement force performance levels for 7xx/eg/btc
drm/radeon/dpm: add infrastructure to force performance levels
drm/radeon: fix surface setup on r1xx
drm/radeon: add support for 3d perf states on older asics
drm/radeon: set default clocks for SI when DPM is disabled
...
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/include/asm/io.h | 7 | ||||
-rw-r--r-- | arch/x86/include/asm/mtrr.h | 10 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/mtrr/main.c | 71 |
3 files changed, 87 insertions, 1 deletions
diff --git a/arch/x86/include/asm/io.h b/arch/x86/include/asm/io.h index d8e8eefbe24c..34f69cb9350a 100644 --- a/arch/x86/include/asm/io.h +++ b/arch/x86/include/asm/io.h | |||
@@ -345,4 +345,11 @@ extern bool xen_biovec_phys_mergeable(const struct bio_vec *vec1, | |||
345 | 345 | ||
346 | #define IO_SPACE_LIMIT 0xffff | 346 | #define IO_SPACE_LIMIT 0xffff |
347 | 347 | ||
348 | #ifdef CONFIG_MTRR | ||
349 | extern int __must_check arch_phys_wc_add(unsigned long base, | ||
350 | unsigned long size); | ||
351 | extern void arch_phys_wc_del(int handle); | ||
352 | #define arch_phys_wc_add arch_phys_wc_add | ||
353 | #endif | ||
354 | |||
348 | #endif /* _ASM_X86_IO_H */ | 355 | #endif /* _ASM_X86_IO_H */ |
diff --git a/arch/x86/include/asm/mtrr.h b/arch/x86/include/asm/mtrr.h index e235582f9930..f768f6298419 100644 --- a/arch/x86/include/asm/mtrr.h +++ b/arch/x86/include/asm/mtrr.h | |||
@@ -26,7 +26,10 @@ | |||
26 | #include <uapi/asm/mtrr.h> | 26 | #include <uapi/asm/mtrr.h> |
27 | 27 | ||
28 | 28 | ||
29 | /* The following functions are for use by other drivers */ | 29 | /* |
30 | * The following functions are for use by other drivers that cannot use | ||
31 | * arch_phys_wc_add and arch_phys_wc_del. | ||
32 | */ | ||
30 | # ifdef CONFIG_MTRR | 33 | # ifdef CONFIG_MTRR |
31 | extern u8 mtrr_type_lookup(u64 addr, u64 end); | 34 | extern u8 mtrr_type_lookup(u64 addr, u64 end); |
32 | extern void mtrr_save_fixed_ranges(void *); | 35 | extern void mtrr_save_fixed_ranges(void *); |
@@ -45,6 +48,7 @@ extern void mtrr_aps_init(void); | |||
45 | extern void mtrr_bp_restore(void); | 48 | extern void mtrr_bp_restore(void); |
46 | extern int mtrr_trim_uncached_memory(unsigned long end_pfn); | 49 | extern int mtrr_trim_uncached_memory(unsigned long end_pfn); |
47 | extern int amd_special_default_mtrr(void); | 50 | extern int amd_special_default_mtrr(void); |
51 | extern int phys_wc_to_mtrr_index(int handle); | ||
48 | # else | 52 | # else |
49 | static inline u8 mtrr_type_lookup(u64 addr, u64 end) | 53 | static inline u8 mtrr_type_lookup(u64 addr, u64 end) |
50 | { | 54 | { |
@@ -80,6 +84,10 @@ static inline int mtrr_trim_uncached_memory(unsigned long end_pfn) | |||
80 | static inline void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi) | 84 | static inline void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi) |
81 | { | 85 | { |
82 | } | 86 | } |
87 | static inline int phys_wc_to_mtrr_index(int handle) | ||
88 | { | ||
89 | return -1; | ||
90 | } | ||
83 | 91 | ||
84 | #define mtrr_ap_init() do {} while (0) | 92 | #define mtrr_ap_init() do {} while (0) |
85 | #define mtrr_bp_init() do {} while (0) | 93 | #define mtrr_bp_init() do {} while (0) |
diff --git a/arch/x86/kernel/cpu/mtrr/main.c b/arch/x86/kernel/cpu/mtrr/main.c index ca22b73aaa25..f961de9964c7 100644 --- a/arch/x86/kernel/cpu/mtrr/main.c +++ b/arch/x86/kernel/cpu/mtrr/main.c | |||
@@ -51,9 +51,13 @@ | |||
51 | #include <asm/e820.h> | 51 | #include <asm/e820.h> |
52 | #include <asm/mtrr.h> | 52 | #include <asm/mtrr.h> |
53 | #include <asm/msr.h> | 53 | #include <asm/msr.h> |
54 | #include <asm/pat.h> | ||
54 | 55 | ||
55 | #include "mtrr.h" | 56 | #include "mtrr.h" |
56 | 57 | ||
58 | /* arch_phys_wc_add returns an MTRR register index plus this offset. */ | ||
59 | #define MTRR_TO_PHYS_WC_OFFSET 1000 | ||
60 | |||
57 | u32 num_var_ranges; | 61 | u32 num_var_ranges; |
58 | 62 | ||
59 | unsigned int mtrr_usage_table[MTRR_MAX_VAR_RANGES]; | 63 | unsigned int mtrr_usage_table[MTRR_MAX_VAR_RANGES]; |
@@ -525,6 +529,73 @@ int mtrr_del(int reg, unsigned long base, unsigned long size) | |||
525 | } | 529 | } |
526 | EXPORT_SYMBOL(mtrr_del); | 530 | EXPORT_SYMBOL(mtrr_del); |
527 | 531 | ||
532 | /** | ||
533 | * arch_phys_wc_add - add a WC MTRR and handle errors if PAT is unavailable | ||
534 | * @base: Physical base address | ||
535 | * @size: Size of region | ||
536 | * | ||
537 | * If PAT is available, this does nothing. If PAT is unavailable, it | ||
538 | * attempts to add a WC MTRR covering size bytes starting at base and | ||
539 | * logs an error if this fails. | ||
540 | * | ||
541 | * Drivers must store the return value to pass to mtrr_del_wc_if_needed, | ||
542 | * but drivers should not try to interpret that return value. | ||
543 | */ | ||
544 | int arch_phys_wc_add(unsigned long base, unsigned long size) | ||
545 | { | ||
546 | int ret; | ||
547 | |||
548 | if (pat_enabled) | ||
549 | return 0; /* Success! (We don't need to do anything.) */ | ||
550 | |||
551 | ret = mtrr_add(base, size, MTRR_TYPE_WRCOMB, true); | ||
552 | if (ret < 0) { | ||
553 | pr_warn("Failed to add WC MTRR for [%p-%p]; performance may suffer.", | ||
554 | (void *)base, (void *)(base + size - 1)); | ||
555 | return ret; | ||
556 | } | ||
557 | return ret + MTRR_TO_PHYS_WC_OFFSET; | ||
558 | } | ||
559 | EXPORT_SYMBOL(arch_phys_wc_add); | ||
560 | |||
561 | /* | ||
562 | * arch_phys_wc_del - undoes arch_phys_wc_add | ||
563 | * @handle: Return value from arch_phys_wc_add | ||
564 | * | ||
565 | * This cleans up after mtrr_add_wc_if_needed. | ||
566 | * | ||
567 | * The API guarantees that mtrr_del_wc_if_needed(error code) and | ||
568 | * mtrr_del_wc_if_needed(0) do nothing. | ||
569 | */ | ||
570 | void arch_phys_wc_del(int handle) | ||
571 | { | ||
572 | if (handle >= 1) { | ||
573 | WARN_ON(handle < MTRR_TO_PHYS_WC_OFFSET); | ||
574 | mtrr_del(handle - MTRR_TO_PHYS_WC_OFFSET, 0, 0); | ||
575 | } | ||
576 | } | ||
577 | EXPORT_SYMBOL(arch_phys_wc_del); | ||
578 | |||
579 | /* | ||
580 | * phys_wc_to_mtrr_index - translates arch_phys_wc_add's return value | ||
581 | * @handle: Return value from arch_phys_wc_add | ||
582 | * | ||
583 | * This will turn the return value from arch_phys_wc_add into an mtrr | ||
584 | * index suitable for debugging. | ||
585 | * | ||
586 | * Note: There is no legitimate use for this function, except possibly | ||
587 | * in printk line. Alas there is an illegitimate use in some ancient | ||
588 | * drm ioctls. | ||
589 | */ | ||
590 | int phys_wc_to_mtrr_index(int handle) | ||
591 | { | ||
592 | if (handle < MTRR_TO_PHYS_WC_OFFSET) | ||
593 | return -1; | ||
594 | else | ||
595 | return handle - MTRR_TO_PHYS_WC_OFFSET; | ||
596 | } | ||
597 | EXPORT_SYMBOL_GPL(phys_wc_to_mtrr_index); | ||
598 | |||
528 | /* | 599 | /* |
529 | * HACK ALERT! | 600 | * HACK ALERT! |
530 | * These should be called implicitly, but we can't yet until all the initcall | 601 | * These should be called implicitly, but we can't yet until all the initcall |