Merge commit 'v2.6.38-rc4' into x86/numa
Merge reason: Merge latest fixes before applying new patch. Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
commit
b366801c95
|
@ -603,3 +603,19 @@ Why: The adm9240, w83792d and w83793 hardware monitoring drivers have
|
|||
Who: Jean Delvare <khali@linux-fr.org>
|
||||
|
||||
----------------------------
|
||||
|
||||
What: noswapaccount kernel command line parameter
|
||||
When: 2.6.40
|
||||
Why: The original implementation of memsw feature enabled by
|
||||
CONFIG_CGROUP_MEM_RES_CTLR_SWAP could be disabled by the noswapaccount
|
||||
kernel parameter (introduced in 2.6.29-rc1). Later on, this decision
|
||||
turned out to be not ideal because we cannot have the feature compiled
|
||||
in and disabled by default and let only interested to enable it
|
||||
(e.g. general distribution kernels might need it). Therefore we have
|
||||
added swapaccount[=0|1] parameter (introduced in 2.6.37) which provides
|
||||
the both possibilities. If we remove noswapaccount we will have
|
||||
less command line parameters with the same functionality and we
|
||||
can also cleanup the parameter handling a bit ().
|
||||
Who: Michal Hocko <mhocko@suse.cz>
|
||||
|
||||
----------------------------
|
||||
|
|
|
@ -460,6 +460,8 @@ Note, a technical ChangeLog aimed at kernel hackers is in fs/ntfs/ChangeLog.
|
|||
2.1.30:
|
||||
- Fix writev() (it kept writing the first segment over and over again
|
||||
instead of moving onto subsequent segments).
|
||||
- Fix crash in ntfs_mft_record_alloc() when mapping the new extent mft
|
||||
record failed.
|
||||
2.1.29:
|
||||
- Fix a deadlock when mounting read-write.
|
||||
2.1.28:
|
||||
|
|
|
@ -187,7 +187,7 @@ tcp_cookie_size - INTEGER
|
|||
tcp_dsack - BOOLEAN
|
||||
Allows TCP to send "duplicate" SACKs.
|
||||
|
||||
tcp_ecn - BOOLEAN
|
||||
tcp_ecn - INTEGER
|
||||
Enable Explicit Congestion Notification (ECN) in TCP. ECN is only
|
||||
used when both ends of the TCP flow support it. It is useful to
|
||||
avoid losses due to congestion (when the bottleneck router supports
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
Version 15 of schedstats dropped counters for some sched_yield:
|
||||
yld_exp_empty, yld_act_empty and yld_both_empty. Otherwise, it is
|
||||
identical to version 14.
|
||||
|
||||
Version 14 of schedstats includes support for sched_domains, which hit the
|
||||
mainline kernel in 2.6.20 although it is identical to the stats from version
|
||||
12 which was in the kernel from 2.6.13-2.6.19 (version 13 never saw a kernel
|
||||
|
@ -28,32 +32,25 @@ to write their own scripts, the fields are described here.
|
|||
|
||||
CPU statistics
|
||||
--------------
|
||||
cpu<N> 1 2 3 4 5 6 7 8 9 10 11 12
|
||||
cpu<N> 1 2 3 4 5 6 7 8 9
|
||||
|
||||
NOTE: In the sched_yield() statistics, the active queue is considered empty
|
||||
if it has only one process in it, since obviously the process calling
|
||||
sched_yield() is that process.
|
||||
|
||||
First four fields are sched_yield() statistics:
|
||||
1) # of times both the active and the expired queue were empty
|
||||
2) # of times just the active queue was empty
|
||||
3) # of times just the expired queue was empty
|
||||
4) # of times sched_yield() was called
|
||||
First field is a sched_yield() statistic:
|
||||
1) # of times sched_yield() was called
|
||||
|
||||
Next three are schedule() statistics:
|
||||
5) # of times we switched to the expired queue and reused it
|
||||
6) # of times schedule() was called
|
||||
7) # of times schedule() left the processor idle
|
||||
2) # of times we switched to the expired queue and reused it
|
||||
3) # of times schedule() was called
|
||||
4) # of times schedule() left the processor idle
|
||||
|
||||
Next two are try_to_wake_up() statistics:
|
||||
8) # of times try_to_wake_up() was called
|
||||
9) # of times try_to_wake_up() was called to wake up the local cpu
|
||||
5) # of times try_to_wake_up() was called
|
||||
6) # of times try_to_wake_up() was called to wake up the local cpu
|
||||
|
||||
Next three are statistics describing scheduling latency:
|
||||
10) sum of all time spent running by tasks on this processor (in jiffies)
|
||||
11) sum of all time spent waiting to run by tasks on this processor (in
|
||||
7) sum of all time spent running by tasks on this processor (in jiffies)
|
||||
8) sum of all time spent waiting to run by tasks on this processor (in
|
||||
jiffies)
|
||||
12) # of timeslices run on this cpu
|
||||
9) # of timeslices run on this cpu
|
||||
|
||||
|
||||
Domain statistics
|
||||
|
|
|
@ -296,6 +296,7 @@ Conexant 5066
|
|||
=============
|
||||
laptop Basic Laptop config (default)
|
||||
hp-laptop HP laptops, e g G60
|
||||
asus Asus K52JU, Lenovo G560
|
||||
dell-laptop Dell laptops
|
||||
dell-vostro Dell Vostro
|
||||
olpc-xo-1_5 OLPC XO 1.5
|
||||
|
|
45
MAINTAINERS
45
MAINTAINERS
|
@ -978,6 +978,8 @@ S: Maintained
|
|||
F: arch/arm/plat-samsung/
|
||||
F: arch/arm/plat-s3c24xx/
|
||||
F: arch/arm/plat-s5p/
|
||||
F: drivers/*/*s3c2410*
|
||||
F: drivers/*/*/*s3c2410*
|
||||
|
||||
ARM/S3C2410 ARM ARCHITECTURE
|
||||
M: Ben Dooks <ben-linux@fluff.org>
|
||||
|
@ -3139,6 +3141,12 @@ S: Maintained
|
|||
F: net/ieee802154/
|
||||
F: drivers/ieee802154/
|
||||
|
||||
IKANOS/ADI EAGLE ADSL USB DRIVER
|
||||
M: Matthieu Castet <castet.matthieu@free.fr>
|
||||
M: Stanislaw Gruszka <stf_xl@wp.pl>
|
||||
S: Maintained
|
||||
F: drivers/usb/atm/ueagle-atm.c
|
||||
|
||||
INTEGRITY MEASUREMENT ARCHITECTURE (IMA)
|
||||
M: Mimi Zohar <zohar@us.ibm.com>
|
||||
S: Supported
|
||||
|
@ -5543,12 +5551,11 @@ S: Supported
|
|||
F: drivers/scsi/be2iscsi/
|
||||
|
||||
SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER
|
||||
M: Sathya Perla <sathyap@serverengines.com>
|
||||
M: Subbu Seetharaman <subbus@serverengines.com>
|
||||
M: Sarveshwar Bandi <sarveshwarb@serverengines.com>
|
||||
M: Ajit Khaparde <ajitk@serverengines.com>
|
||||
M: Sathya Perla <sathya.perla@emulex.com>
|
||||
M: Subbu Seetharaman <subbu.seetharaman@emulex.com>
|
||||
M: Ajit Khaparde <ajit.khaparde@emulex.com>
|
||||
L: netdev@vger.kernel.org
|
||||
W: http://www.serverengines.com
|
||||
W: http://www.emulex.com
|
||||
S: Supported
|
||||
F: drivers/net/benet/
|
||||
|
||||
|
@ -5608,18 +5615,20 @@ F: include/linux/sfi*.h
|
|||
|
||||
SIMTEC EB110ATX (Chalice CATS)
|
||||
P: Ben Dooks
|
||||
M: Vincent Sanders <support@simtec.co.uk>
|
||||
P: Vincent Sanders <vince@simtec.co.uk>
|
||||
M: Simtec Linux Team <linux@simtec.co.uk>
|
||||
W: http://www.simtec.co.uk/products/EB110ATX/
|
||||
S: Supported
|
||||
|
||||
SIMTEC EB2410ITX (BAST)
|
||||
P: Ben Dooks
|
||||
M: Vincent Sanders <support@simtec.co.uk>
|
||||
P: Vincent Sanders <vince@simtec.co.uk>
|
||||
M: Simtec Linux Team <linux@simtec.co.uk>
|
||||
W: http://www.simtec.co.uk/products/EB2410ITX/
|
||||
S: Supported
|
||||
F: arch/arm/mach-s3c2410/
|
||||
F: drivers/*/*s3c2410*
|
||||
F: drivers/*/*/*s3c2410*
|
||||
F: arch/arm/mach-s3c2410/mach-bast.c
|
||||
F: arch/arm/mach-s3c2410/bast-ide.c
|
||||
F: arch/arm/mach-s3c2410/bast-irq.c
|
||||
|
||||
TI DAVINCI MACHINE SUPPORT
|
||||
M: Kevin Hilman <khilman@deeprootsystems.com>
|
||||
|
@ -6594,6 +6603,16 @@ S: Maintained
|
|||
F: drivers/char/virtio_console.c
|
||||
F: include/linux/virtio_console.h
|
||||
|
||||
VIRTIO CORE, NET AND BLOCK DRIVERS
|
||||
M: Rusty Russell <rusty@rustcorp.com.au>
|
||||
M: "Michael S. Tsirkin" <mst@redhat.com>
|
||||
L: virtualization@lists.linux-foundation.org
|
||||
S: Maintained
|
||||
F: drivers/virtio/
|
||||
F: drivers/net/virtio_net.c
|
||||
F: drivers/block/virtio_blk.c
|
||||
F: include/linux/virtio_*.h
|
||||
|
||||
VIRTIO HOST (VHOST)
|
||||
M: "Michael S. Tsirkin" <mst@redhat.com>
|
||||
L: kvm@vger.kernel.org
|
||||
|
@ -6767,12 +6786,12 @@ S: Maintained
|
|||
F: drivers/net/wireless/wl1251/*
|
||||
|
||||
WL1271 WIRELESS DRIVER
|
||||
M: Luciano Coelho <luciano.coelho@nokia.com>
|
||||
M: Luciano Coelho <coelho@ti.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
W: http://wireless.kernel.org
|
||||
W: http://wireless.kernel.org/en/users/Drivers/wl12xx
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/luca/wl12xx.git
|
||||
S: Maintained
|
||||
F: drivers/net/wireless/wl12xx/wl1271*
|
||||
F: drivers/net/wireless/wl12xx/
|
||||
F: include/linux/wl12xx.h
|
||||
|
||||
WL3501 WIRELESS PCMCIA CARD DRIVER
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 38
|
||||
EXTRAVERSION = -rc2
|
||||
EXTRAVERSION = -rc4
|
||||
NAME = Flesh-Eating Bats with Fangs
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -95,6 +95,15 @@ static inline void __iomem *__typesafe_io(unsigned long addr)
|
|||
return (void __iomem *)addr;
|
||||
}
|
||||
|
||||
/* IO barriers */
|
||||
#ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE
|
||||
#define __iormb() rmb()
|
||||
#define __iowmb() wmb()
|
||||
#else
|
||||
#define __iormb() do { } while (0)
|
||||
#define __iowmb() do { } while (0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Now, pick up the machine-defined IO definitions
|
||||
*/
|
||||
|
@ -125,17 +134,17 @@ static inline void __iomem *__typesafe_io(unsigned long addr)
|
|||
* The {in,out}[bwl] macros are for emulating x86-style PCI/ISA IO space.
|
||||
*/
|
||||
#ifdef __io
|
||||
#define outb(v,p) __raw_writeb(v,__io(p))
|
||||
#define outw(v,p) __raw_writew((__force __u16) \
|
||||
cpu_to_le16(v),__io(p))
|
||||
#define outl(v,p) __raw_writel((__force __u32) \
|
||||
cpu_to_le32(v),__io(p))
|
||||
#define outb(v,p) ({ __iowmb(); __raw_writeb(v,__io(p)); })
|
||||
#define outw(v,p) ({ __iowmb(); __raw_writew((__force __u16) \
|
||||
cpu_to_le16(v),__io(p)); })
|
||||
#define outl(v,p) ({ __iowmb(); __raw_writel((__force __u32) \
|
||||
cpu_to_le32(v),__io(p)); })
|
||||
|
||||
#define inb(p) ({ __u8 __v = __raw_readb(__io(p)); __v; })
|
||||
#define inb(p) ({ __u8 __v = __raw_readb(__io(p)); __iormb(); __v; })
|
||||
#define inw(p) ({ __u16 __v = le16_to_cpu((__force __le16) \
|
||||
__raw_readw(__io(p))); __v; })
|
||||
__raw_readw(__io(p))); __iormb(); __v; })
|
||||
#define inl(p) ({ __u32 __v = le32_to_cpu((__force __le32) \
|
||||
__raw_readl(__io(p))); __v; })
|
||||
__raw_readl(__io(p))); __iormb(); __v; })
|
||||
|
||||
#define outsb(p,d,l) __raw_writesb(__io(p),d,l)
|
||||
#define outsw(p,d,l) __raw_writesw(__io(p),d,l)
|
||||
|
@ -192,14 +201,6 @@ extern void _memset_io(volatile void __iomem *, int, size_t);
|
|||
#define writel_relaxed(v,c) ((void)__raw_writel((__force u32) \
|
||||
cpu_to_le32(v),__mem_pci(c)))
|
||||
|
||||
#ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE
|
||||
#define __iormb() rmb()
|
||||
#define __iowmb() wmb()
|
||||
#else
|
||||
#define __iormb() do { } while (0)
|
||||
#define __iowmb() do { } while (0)
|
||||
#endif
|
||||
|
||||
#define readb(c) ({ u8 __v = readb_relaxed(c); __iormb(); __v; })
|
||||
#define readw(c) ({ u16 __v = readw_relaxed(c); __iormb(); __v; })
|
||||
#define readl(c) ({ u32 __v = readl_relaxed(c); __iormb(); __v; })
|
||||
|
|
|
@ -392,24 +392,22 @@ ENDPROC(__turn_mmu_on)
|
|||
|
||||
#ifdef CONFIG_SMP_ON_UP
|
||||
__fixup_smp:
|
||||
mov r4, #0x00070000
|
||||
orr r3, r4, #0xff000000 @ mask 0xff070000
|
||||
orr r4, r4, #0x41000000 @ val 0x41070000
|
||||
and r0, r9, r3
|
||||
teq r0, r4 @ ARM CPU and ARMv6/v7?
|
||||
and r3, r9, #0x000f0000 @ architecture version
|
||||
teq r3, #0x000f0000 @ CPU ID supported?
|
||||
bne __fixup_smp_on_up @ no, assume UP
|
||||
|
||||
orr r3, r3, #0x0000ff00
|
||||
orr r3, r3, #0x000000f0 @ mask 0xff07fff0
|
||||
bic r3, r9, #0x00ff0000
|
||||
bic r3, r3, #0x0000000f @ mask 0xff00fff0
|
||||
mov r4, #0x41000000
|
||||
orr r4, r4, #0x0000b000
|
||||
orr r4, r4, #0x00000020 @ val 0x4107b020
|
||||
and r0, r9, r3
|
||||
teq r0, r4 @ ARM 11MPCore?
|
||||
orr r4, r4, #0x00000020 @ val 0x4100b020
|
||||
teq r3, r4 @ ARM 11MPCore?
|
||||
moveq pc, lr @ yes, assume SMP
|
||||
|
||||
mrc p15, 0, r0, c0, c0, 5 @ read MPIDR
|
||||
tst r0, #1 << 31
|
||||
movne pc, lr @ bit 31 => SMP
|
||||
and r0, r0, #0xc0000000 @ multiprocessing extensions and
|
||||
teq r0, #0x80000000 @ not part of a uniprocessor system?
|
||||
moveq pc, lr @ yes, assume SMP
|
||||
|
||||
__fixup_smp_on_up:
|
||||
adr r0, 1f
|
||||
|
|
|
@ -838,7 +838,7 @@ EXPORT_SYMBOL(ep93xx_i2s_release);
|
|||
static struct resource ep93xx_ac97_resources[] = {
|
||||
{
|
||||
.start = EP93XX_AAC_PHYS_BASE,
|
||||
.end = EP93XX_AAC_PHYS_BASE + 0xb0 - 1,
|
||||
.end = EP93XX_AAC_PHYS_BASE + 0xac - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
|
|
|
@ -17,8 +17,8 @@
|
|||
/* For NetWinder debugging */
|
||||
.macro addruart, rp, rv
|
||||
mov \rp, #0x000003f8
|
||||
orr \rv, \rp, #0x7c000000 @ physical
|
||||
orr \rp, \rp, #0xff000000 @ virtual
|
||||
orr \rv, \rp, #0xff000000 @ virtual
|
||||
orr \rp, \rp, #0x7c000000 @ physical
|
||||
.endm
|
||||
|
||||
#define UART_SHIFT 0
|
||||
|
|
|
@ -180,7 +180,7 @@ static const uint32_t mx25pdk_keymap[] = {
|
|||
KEY(3, 3, KEY_POWER),
|
||||
};
|
||||
|
||||
static const struct matrix_keymap_data mx25pdk_keymap_data __initdata = {
|
||||
static const struct matrix_keymap_data mx25pdk_keymap_data __initconst = {
|
||||
.keymap = mx25pdk_keymap,
|
||||
.keymap_size = ARRAY_SIZE(mx25pdk_keymap),
|
||||
};
|
||||
|
|
|
@ -432,7 +432,7 @@ static struct clocksource clocksource_ixp4xx = {
|
|||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||
};
|
||||
|
||||
unsigned long ixp4xx_timer_freq = FREQ;
|
||||
unsigned long ixp4xx_timer_freq = IXP4XX_TIMER_FREQ;
|
||||
EXPORT_SYMBOL(ixp4xx_timer_freq);
|
||||
static void __init ixp4xx_clocksource_init(void)
|
||||
{
|
||||
|
@ -496,7 +496,7 @@ static struct clock_event_device clockevent_ixp4xx = {
|
|||
|
||||
static void __init ixp4xx_clockevent_init(void)
|
||||
{
|
||||
clockevent_ixp4xx.mult = div_sc(FREQ, NSEC_PER_SEC,
|
||||
clockevent_ixp4xx.mult = div_sc(IXP4XX_TIMER_FREQ, NSEC_PER_SEC,
|
||||
clockevent_ixp4xx.shift);
|
||||
clockevent_ixp4xx.max_delta_ns =
|
||||
clockevent_delta2ns(0xfffffffe, &clockevent_ixp4xx);
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
* 66.66... MHz. We do a convulted calculation of CLOCK_TICK_RATE b/c the
|
||||
* timer register ignores the bottom 2 bits of the LATCH value.
|
||||
*/
|
||||
#define FREQ 66666000
|
||||
#define CLOCK_TICK_RATE (((FREQ / HZ & ~IXP4XX_OST_RELOAD_MASK) + 1) * HZ)
|
||||
#define IXP4XX_TIMER_FREQ 66666000
|
||||
#define CLOCK_TICK_RATE \
|
||||
(((IXP4XX_TIMER_FREQ / HZ & ~IXP4XX_OST_RELOAD_MASK) + 1) * HZ)
|
||||
|
||||
|
|
|
@ -265,6 +265,11 @@ void qmgr_release_queue(unsigned int queue)
|
|||
qmgr_queue_descs[queue], queue);
|
||||
qmgr_queue_descs[queue][0] = '\x0';
|
||||
#endif
|
||||
|
||||
while ((addr = qmgr_get_entry(queue)))
|
||||
printk(KERN_ERR "qmgr: released queue %i not empty: 0x%08X\n",
|
||||
queue, addr);
|
||||
|
||||
__raw_writel(0, &qmgr_regs->sram[queue]);
|
||||
|
||||
used_sram_bitmap[0] &= ~mask[0];
|
||||
|
@ -275,10 +280,6 @@ void qmgr_release_queue(unsigned int queue)
|
|||
spin_unlock_irq(&qmgr_lock);
|
||||
|
||||
module_put(THIS_MODULE);
|
||||
|
||||
while ((addr = qmgr_get_entry(queue)))
|
||||
printk(KERN_ERR "qmgr: released queue %i not empty: 0x%08X\n",
|
||||
queue, addr);
|
||||
}
|
||||
|
||||
static int qmgr_init(void)
|
||||
|
|
|
@ -304,7 +304,7 @@ static int name##_set_rate(struct clk *clk, unsigned long rate) \
|
|||
reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_##dr); \
|
||||
reg &= ~BM_CLKCTRL_##dr##_DIV; \
|
||||
reg |= div << BP_CLKCTRL_##dr##_DIV; \
|
||||
if (reg | (1 << clk->enable_shift)) { \
|
||||
if (reg & (1 << clk->enable_shift)) { \
|
||||
pr_err("%s: clock is gated\n", __func__); \
|
||||
return -EINVAL; \
|
||||
} \
|
||||
|
@ -347,7 +347,7 @@ static int name##_set_parent(struct clk *clk, struct clk *parent) \
|
|||
{ \
|
||||
if (parent != clk->parent) { \
|
||||
__raw_writel(BM_CLKCTRL_CLKSEQ_BYPASS_##bit, \
|
||||
HW_CLKCTRL_CLKSEQ_TOG); \
|
||||
CLKCTRL_BASE_ADDR + HW_CLKCTRL_CLKSEQ_TOG); \
|
||||
clk->parent = parent; \
|
||||
} \
|
||||
\
|
||||
|
|
|
@ -355,12 +355,12 @@ static int name##_set_rate(struct clk *clk, unsigned long rate) \
|
|||
} else { \
|
||||
reg &= ~BM_CLKCTRL_##dr##_DIV; \
|
||||
reg |= div << BP_CLKCTRL_##dr##_DIV; \
|
||||
if (reg | (1 << clk->enable_shift)) { \
|
||||
if (reg & (1 << clk->enable_shift)) { \
|
||||
pr_err("%s: clock is gated\n", __func__); \
|
||||
return -EINVAL; \
|
||||
} \
|
||||
} \
|
||||
__raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_CPU); \
|
||||
__raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_##dr); \
|
||||
\
|
||||
for (i = 10000; i; i--) \
|
||||
if (!(__raw_readl(CLKCTRL_BASE_ADDR + \
|
||||
|
@ -483,7 +483,7 @@ static int name##_set_parent(struct clk *clk, struct clk *parent) \
|
|||
{ \
|
||||
if (parent != clk->parent) { \
|
||||
__raw_writel(BM_CLKCTRL_CLKSEQ_BYPASS_##bit, \
|
||||
HW_CLKCTRL_CLKSEQ_TOG); \
|
||||
CLKCTRL_BASE_ADDR + HW_CLKCTRL_CLKSEQ_TOG); \
|
||||
clk->parent = parent; \
|
||||
} \
|
||||
\
|
||||
|
@ -609,7 +609,6 @@ static struct clk_lookup lookups[] = {
|
|||
_REGISTER_CLOCK("duart", NULL, uart_clk)
|
||||
_REGISTER_CLOCK("imx28-fec.0", NULL, fec_clk)
|
||||
_REGISTER_CLOCK("imx28-fec.1", NULL, fec_clk)
|
||||
_REGISTER_CLOCK("fec.0", NULL, fec_clk)
|
||||
_REGISTER_CLOCK("rtc", NULL, rtc_clk)
|
||||
_REGISTER_CLOCK("pll2", NULL, pll2_clk)
|
||||
_REGISTER_CLOCK(NULL, "hclk", hbus_clk)
|
||||
|
|
|
@ -57,7 +57,6 @@ static void __clk_disable(struct clk *clk)
|
|||
if (clk->disable)
|
||||
clk->disable(clk);
|
||||
__clk_disable(clk->parent);
|
||||
__clk_disable(clk->secondary);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -68,7 +67,6 @@ static int __clk_enable(struct clk *clk)
|
|||
|
||||
if (clk->usecount++ == 0) {
|
||||
__clk_enable(clk->parent);
|
||||
__clk_enable(clk->secondary);
|
||||
|
||||
if (clk->enable)
|
||||
clk->enable(clk);
|
||||
|
|
|
@ -139,6 +139,8 @@ static void mxs_gpio_irq_handler(u32 irq, struct irq_desc *desc)
|
|||
struct mxs_gpio_port *port = (struct mxs_gpio_port *)get_irq_data(irq);
|
||||
u32 gpio_irq_no_base = port->virtual_irq_start;
|
||||
|
||||
desc->irq_data.chip->irq_ack(&desc->irq_data);
|
||||
|
||||
irq_stat = __raw_readl(port->base + PINCTRL_IRQSTAT(port->id)) &
|
||||
__raw_readl(port->base + PINCTRL_IRQEN(port->id));
|
||||
|
||||
|
|
|
@ -29,8 +29,6 @@ struct clk {
|
|||
int id;
|
||||
/* Source clock this clk depends on */
|
||||
struct clk *parent;
|
||||
/* Secondary clock to enable/disable with this clock */
|
||||
struct clk *secondary;
|
||||
/* Reference count of clock enable/disable */
|
||||
__s8 usecount;
|
||||
/* Register bit position for clock's enable/disable control. */
|
||||
|
|
|
@ -14,19 +14,6 @@
|
|||
#include <mach/irqs.h>
|
||||
#include <asm/hardware/gic.h>
|
||||
|
||||
/*
|
||||
* We use __glue to avoid errors with multiple definitions of
|
||||
* .globl omap_irq_flags as it's included from entry-armv.S but not
|
||||
* from entry-common.S.
|
||||
*/
|
||||
#ifdef __glue
|
||||
.pushsection .data
|
||||
.globl omap_irq_flags
|
||||
omap_irq_flags:
|
||||
.word 0
|
||||
.popsection
|
||||
#endif
|
||||
|
||||
.macro disable_fiq
|
||||
.endm
|
||||
|
||||
|
|
|
@ -57,6 +57,7 @@ struct omap_irq_bank {
|
|||
unsigned long wake_enable;
|
||||
};
|
||||
|
||||
u32 omap_irq_flags;
|
||||
static unsigned int irq_bank_count;
|
||||
static struct omap_irq_bank *irq_banks;
|
||||
|
||||
|
@ -176,7 +177,6 @@ static struct irq_chip omap_irq_chip = {
|
|||
|
||||
void __init omap_init_irq(void)
|
||||
{
|
||||
extern unsigned int omap_irq_flags;
|
||||
int i, j;
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
|
||||
|
|
|
@ -37,7 +37,7 @@ int omap_lcd_dma_running(void)
|
|||
* On OMAP1510, internal LCD controller will start the transfer
|
||||
* when it gets enabled, so assume DMA running if LCD enabled.
|
||||
*/
|
||||
if (cpu_is_omap1510())
|
||||
if (cpu_is_omap15xx())
|
||||
if (omap_readw(OMAP_LCDC_CONTROL) & OMAP_LCDC_CTRL_LCD_EN)
|
||||
return 1;
|
||||
|
||||
|
@ -95,7 +95,7 @@ EXPORT_SYMBOL(omap_set_lcd_dma_single_transfer);
|
|||
|
||||
void omap_set_lcd_dma_b1_rotation(int rotate)
|
||||
{
|
||||
if (cpu_is_omap1510()) {
|
||||
if (cpu_is_omap15xx()) {
|
||||
printk(KERN_ERR "DMA rotation is not supported in 1510 mode\n");
|
||||
BUG();
|
||||
return;
|
||||
|
@ -106,7 +106,7 @@ EXPORT_SYMBOL(omap_set_lcd_dma_b1_rotation);
|
|||
|
||||
void omap_set_lcd_dma_b1_mirror(int mirror)
|
||||
{
|
||||
if (cpu_is_omap1510()) {
|
||||
if (cpu_is_omap15xx()) {
|
||||
printk(KERN_ERR "DMA mirror is not supported in 1510 mode\n");
|
||||
BUG();
|
||||
}
|
||||
|
@ -116,7 +116,7 @@ EXPORT_SYMBOL(omap_set_lcd_dma_b1_mirror);
|
|||
|
||||
void omap_set_lcd_dma_b1_vxres(unsigned long vxres)
|
||||
{
|
||||
if (cpu_is_omap1510()) {
|
||||
if (cpu_is_omap15xx()) {
|
||||
printk(KERN_ERR "DMA virtual resulotion is not supported "
|
||||
"in 1510 mode\n");
|
||||
BUG();
|
||||
|
@ -127,7 +127,7 @@ EXPORT_SYMBOL(omap_set_lcd_dma_b1_vxres);
|
|||
|
||||
void omap_set_lcd_dma_b1_scale(unsigned int xscale, unsigned int yscale)
|
||||
{
|
||||
if (cpu_is_omap1510()) {
|
||||
if (cpu_is_omap15xx()) {
|
||||
printk(KERN_ERR "DMA scale is not supported in 1510 mode\n");
|
||||
BUG();
|
||||
}
|
||||
|
@ -177,7 +177,7 @@ static void set_b1_regs(void)
|
|||
bottom = PIXADDR(lcd_dma.xres - 1, lcd_dma.yres - 1);
|
||||
/* 1510 DMA requires the bottom address to be 2 more
|
||||
* than the actual last memory access location. */
|
||||
if (cpu_is_omap1510() &&
|
||||
if (cpu_is_omap15xx() &&
|
||||
lcd_dma.data_type == OMAP_DMA_DATA_TYPE_S32)
|
||||
bottom += 2;
|
||||
ei = PIXSTEP(0, 0, 1, 0);
|
||||
|
@ -241,7 +241,7 @@ static void set_b1_regs(void)
|
|||
return; /* Suppress warning about uninitialized vars */
|
||||
}
|
||||
|
||||
if (cpu_is_omap1510()) {
|
||||
if (cpu_is_omap15xx()) {
|
||||
omap_writew(top >> 16, OMAP1510_DMA_LCD_TOP_F1_U);
|
||||
omap_writew(top, OMAP1510_DMA_LCD_TOP_F1_L);
|
||||
omap_writew(bottom >> 16, OMAP1510_DMA_LCD_BOT_F1_U);
|
||||
|
@ -343,7 +343,7 @@ void omap_free_lcd_dma(void)
|
|||
BUG();
|
||||
return;
|
||||
}
|
||||
if (!cpu_is_omap1510())
|
||||
if (!cpu_is_omap15xx())
|
||||
omap_writew(omap_readw(OMAP1610_DMA_LCD_CCR) & ~1,
|
||||
OMAP1610_DMA_LCD_CCR);
|
||||
lcd_dma.reserved = 0;
|
||||
|
@ -360,7 +360,7 @@ void omap_enable_lcd_dma(void)
|
|||
* connected. Otherwise the OMAP internal controller will
|
||||
* start the transfer when it gets enabled.
|
||||
*/
|
||||
if (cpu_is_omap1510() || !lcd_dma.ext_ctrl)
|
||||
if (cpu_is_omap15xx() || !lcd_dma.ext_ctrl)
|
||||
return;
|
||||
|
||||
w = omap_readw(OMAP1610_DMA_LCD_CTRL);
|
||||
|
@ -378,14 +378,14 @@ EXPORT_SYMBOL(omap_enable_lcd_dma);
|
|||
void omap_setup_lcd_dma(void)
|
||||
{
|
||||
BUG_ON(lcd_dma.active);
|
||||
if (!cpu_is_omap1510()) {
|
||||
if (!cpu_is_omap15xx()) {
|
||||
/* Set some reasonable defaults */
|
||||
omap_writew(0x5440, OMAP1610_DMA_LCD_CCR);
|
||||
omap_writew(0x9102, OMAP1610_DMA_LCD_CSDP);
|
||||
omap_writew(0x0004, OMAP1610_DMA_LCD_LCH_CTRL);
|
||||
}
|
||||
set_b1_regs();
|
||||
if (!cpu_is_omap1510()) {
|
||||
if (!cpu_is_omap15xx()) {
|
||||
u16 w;
|
||||
|
||||
w = omap_readw(OMAP1610_DMA_LCD_CCR);
|
||||
|
@ -407,7 +407,7 @@ void omap_stop_lcd_dma(void)
|
|||
u16 w;
|
||||
|
||||
lcd_dma.active = 0;
|
||||
if (cpu_is_omap1510() || !lcd_dma.ext_ctrl)
|
||||
if (cpu_is_omap15xx() || !lcd_dma.ext_ctrl)
|
||||
return;
|
||||
|
||||
w = omap_readw(OMAP1610_DMA_LCD_CCR);
|
||||
|
|
|
@ -44,7 +44,6 @@
|
|||
#include <linux/clocksource.h>
|
||||
#include <linux/clockchips.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
#include <asm/system.h>
|
||||
#include <mach/hardware.h>
|
||||
|
|
|
@ -115,9 +115,6 @@ static struct omap2_hsmmc_info mmc[] = {
|
|||
|
||||
static int devkit8000_panel_enable_lcd(struct omap_dss_device *dssdev)
|
||||
{
|
||||
twl_i2c_write_u8(TWL4030_MODULE_GPIO, 0x80, REG_GPIODATADIR1);
|
||||
twl_i2c_write_u8(TWL4030_MODULE_LED, 0x0, 0x0);
|
||||
|
||||
if (gpio_is_valid(dssdev->reset_gpio))
|
||||
gpio_set_value_cansleep(dssdev->reset_gpio, 1);
|
||||
return 0;
|
||||
|
@ -247,6 +244,8 @@ static struct gpio_led gpio_leds[];
|
|||
static int devkit8000_twl_gpio_setup(struct device *dev,
|
||||
unsigned gpio, unsigned ngpio)
|
||||
{
|
||||
int ret;
|
||||
|
||||
omap_mux_init_gpio(29, OMAP_PIN_INPUT);
|
||||
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
|
||||
mmc[0].gpio_cd = gpio + 0;
|
||||
|
@ -255,17 +254,23 @@ static int devkit8000_twl_gpio_setup(struct device *dev,
|
|||
/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
|
||||
gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
|
||||
|
||||
/* gpio + 1 is "LCD_PWREN" (out, active high) */
|
||||
devkit8000_lcd_device.reset_gpio = gpio + 1;
|
||||
gpio_request(devkit8000_lcd_device.reset_gpio, "LCD_PWREN");
|
||||
/* Disable until needed */
|
||||
gpio_direction_output(devkit8000_lcd_device.reset_gpio, 0);
|
||||
/* TWL4030_GPIO_MAX + 0 is "LCD_PWREN" (out, active high) */
|
||||
devkit8000_lcd_device.reset_gpio = gpio + TWL4030_GPIO_MAX + 0;
|
||||
ret = gpio_request_one(devkit8000_lcd_device.reset_gpio,
|
||||
GPIOF_DIR_OUT | GPIOF_INIT_LOW, "LCD_PWREN");
|
||||
if (ret < 0) {
|
||||
devkit8000_lcd_device.reset_gpio = -EINVAL;
|
||||
printk(KERN_ERR "Failed to request GPIO for LCD_PWRN\n");
|
||||
}
|
||||
|
||||
/* gpio + 7 is "DVI_PD" (out, active low) */
|
||||
devkit8000_dvi_device.reset_gpio = gpio + 7;
|
||||
gpio_request(devkit8000_dvi_device.reset_gpio, "DVI PowerDown");
|
||||
/* Disable until needed */
|
||||
gpio_direction_output(devkit8000_dvi_device.reset_gpio, 0);
|
||||
ret = gpio_request_one(devkit8000_dvi_device.reset_gpio,
|
||||
GPIOF_DIR_OUT | GPIOF_INIT_LOW, "DVI PowerDown");
|
||||
if (ret < 0) {
|
||||
devkit8000_dvi_device.reset_gpio = -EINVAL;
|
||||
printk(KERN_ERR "Failed to request GPIO for DVI PowerDown\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -409,8 +409,6 @@ static void __init omap4_panda_init(void)
|
|||
platform_add_devices(panda_devices, ARRAY_SIZE(panda_devices));
|
||||
omap_serial_init();
|
||||
omap4_twl6030_hsmmc_init(mmc);
|
||||
/* OMAP4 Panda uses internal transceiver so register nop transceiver */
|
||||
usb_nop_xceiv_register();
|
||||
omap4_ehci_init();
|
||||
usb_musb_init(&musb_board_data);
|
||||
}
|
||||
|
|
|
@ -40,9 +40,6 @@ static struct regulator_consumer_supply rm680_vemmc_consumers[] = {
|
|||
static struct regulator_init_data rm680_vemmc = {
|
||||
.constraints = {
|
||||
.name = "rm680_vemmc",
|
||||
.min_uV = 2900000,
|
||||
.max_uV = 2900000,
|
||||
.apply_uV = 1,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS
|
||||
|
|
|
@ -264,7 +264,7 @@ static int __init omap2_system_dma_init_dev(struct omap_hwmod *oh, void *unused)
|
|||
if (IS_ERR(od)) {
|
||||
pr_err("%s: Cant build omap_device for %s:%s.\n",
|
||||
__func__, name, oh->name);
|
||||
return IS_ERR(od);
|
||||
return PTR_ERR(od);
|
||||
}
|
||||
|
||||
mem = platform_get_resource(&od->pdev, IORESOURCE_MEM, 0);
|
||||
|
|
|
@ -38,20 +38,6 @@
|
|||
*/
|
||||
|
||||
#ifdef MULTI_OMAP2
|
||||
|
||||
/*
|
||||
* We use __glue to avoid errors with multiple definitions of
|
||||
* .globl omap_irq_base as it's included from entry-armv.S but not
|
||||
* from entry-common.S.
|
||||
*/
|
||||
#ifdef __glue
|
||||
.pushsection .data
|
||||
.globl omap_irq_base
|
||||
omap_irq_base:
|
||||
.word 0
|
||||
.popsection
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Configure the interrupt base on the first interrupt.
|
||||
* See also omap_irq_base_init for setting omap_irq_base.
|
||||
|
|
|
@ -314,14 +314,13 @@ static int _set_hwmod_postsetup_state(struct omap_hwmod *oh, void *data)
|
|||
return omap_hwmod_set_postsetup_state(oh, *(u8 *)data);
|
||||
}
|
||||
|
||||
void __iomem *omap_irq_base;
|
||||
|
||||
/*
|
||||
* Initialize asm_irq_base for entry-macro.S
|
||||
*/
|
||||
static inline void omap_irq_base_init(void)
|
||||
{
|
||||
extern void __iomem *omap_irq_base;
|
||||
|
||||
#ifdef MULTI_OMAP2
|
||||
if (cpu_is_omap24xx())
|
||||
omap_irq_base = OMAP2_L4_IO_ADDRESS(OMAP24XX_IC_BASE);
|
||||
else if (cpu_is_omap34xx())
|
||||
|
@ -330,7 +329,6 @@ static inline void omap_irq_base_init(void)
|
|||
omap_irq_base = OMAP2_L4_IO_ADDRESS(OMAP44XX_GIC_CPU_BASE);
|
||||
else
|
||||
pr_err("Could not initialize omap_irq_base\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
void __init omap2_init_common_infrastructure(void)
|
||||
|
|
|
@ -160,7 +160,7 @@ static int __init _omap_mux_get_by_name(struct omap_mux_partition *partition,
|
|||
struct omap_mux *mux = NULL;
|
||||
struct omap_mux_entry *e;
|
||||
const char *mode_name;
|
||||
int found = 0, found_mode, mode0_len = 0;
|
||||
int found = 0, found_mode = 0, mode0_len = 0;
|
||||
struct list_head *muxmodes = &partition->muxmodes;
|
||||
|
||||
mode_name = strchr(muxname, '.');
|
||||
|
@ -1000,6 +1000,7 @@ int __init omap_mux_init(const char *name, u32 flags,
|
|||
if (!partition->base) {
|
||||
pr_err("%s: Could not ioremap mux partition at 0x%08x\n",
|
||||
__func__, partition->phys);
|
||||
kfree(partition);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
|
|
@ -168,9 +168,10 @@ static void omap3_core_restore_context(void)
|
|||
* once during boot sequence, but this works as we are not using secure
|
||||
* services.
|
||||
*/
|
||||
static void omap3_save_secure_ram_context(u32 target_mpu_state)
|
||||
static void omap3_save_secure_ram_context(void)
|
||||
{
|
||||
u32 ret;
|
||||
int mpu_next_state = pwrdm_read_next_pwrst(mpu_pwrdm);
|
||||
|
||||
if (omap_type() != OMAP2_DEVICE_TYPE_GP) {
|
||||
/*
|
||||
|
@ -181,7 +182,7 @@ static void omap3_save_secure_ram_context(u32 target_mpu_state)
|
|||
pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON);
|
||||
ret = _omap_save_secure_sram((u32 *)
|
||||
__pa(omap3_secure_ram_storage));
|
||||
pwrdm_set_next_pwrst(mpu_pwrdm, target_mpu_state);
|
||||
pwrdm_set_next_pwrst(mpu_pwrdm, mpu_next_state);
|
||||
/* Following is for error tracking, it should not happen */
|
||||
if (ret) {
|
||||
printk(KERN_ERR "save_secure_sram() returns %08x\n",
|
||||
|
@ -1094,7 +1095,7 @@ static int __init omap3_pm_init(void)
|
|||
local_fiq_disable();
|
||||
|
||||
omap_dma_global_context_save();
|
||||
omap3_save_secure_ram_context(PWRDM_POWER_ON);
|
||||
omap3_save_secure_ram_context();
|
||||
omap_dma_global_context_restore();
|
||||
|
||||
local_irq_enable();
|
||||
|
|
|
@ -780,8 +780,7 @@ static int omap_sr_autocomp_show(void *data, u64 *val)
|
|||
struct omap_sr *sr_info = (struct omap_sr *) data;
|
||||
|
||||
if (!sr_info) {
|
||||
pr_warning("%s: omap_sr struct for sr_%s not found\n",
|
||||
__func__, sr_info->voltdm->name);
|
||||
pr_warning("%s: omap_sr struct not found\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -795,8 +794,7 @@ static int omap_sr_autocomp_store(void *data, u64 val)
|
|||
struct omap_sr *sr_info = (struct omap_sr *) data;
|
||||
|
||||
if (!sr_info) {
|
||||
pr_warning("%s: omap_sr struct for sr_%s not found\n",
|
||||
__func__, sr_info->voltdm->name);
|
||||
pr_warning("%s: omap_sr struct not found\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -834,7 +832,8 @@ static int __init omap_sr_probe(struct platform_device *pdev)
|
|||
|
||||
if (!pdata) {
|
||||
dev_err(&pdev->dev, "%s: platform data missing\n", __func__);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto err_free_devinfo;
|
||||
}
|
||||
|
||||
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
|
@ -966,7 +965,7 @@ static int __devexit omap_sr_remove(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
sr_info = _sr_lookup(pdata->voltdm);
|
||||
if (!sr_info) {
|
||||
if (IS_ERR(sr_info)) {
|
||||
dev_warn(&pdev->dev, "%s: omap_sr struct not found\n",
|
||||
__func__);
|
||||
return -EINVAL;
|
||||
|
|
|
@ -471,6 +471,7 @@ static void __init vdd_debugfs_init(struct omap_vdd_info *vdd)
|
|||
strcat(name, vdd->voltdm.name);
|
||||
|
||||
vdd->debug_dir = debugfs_create_dir(name, voltage_dir);
|
||||
kfree(name);
|
||||
if (IS_ERR(vdd->debug_dir)) {
|
||||
pr_warning("%s: Unable to create debugfs directory for"
|
||||
" vdd_%s\n", __func__, vdd->voltdm.name);
|
||||
|
|
|
@ -207,9 +207,9 @@ static int tegra_gpio_irq_set_type(struct irq_data *d, unsigned int type)
|
|||
spin_unlock_irqrestore(&bank->lvl_lock[port], flags);
|
||||
|
||||
if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
|
||||
__set_irq_handler_unlocked(irq, handle_level_irq);
|
||||
__set_irq_handler_unlocked(d->irq, handle_level_irq);
|
||||
else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
|
||||
__set_irq_handler_unlocked(irq, handle_edge_irq);
|
||||
__set_irq_handler_unlocked(d->irq, handle_edge_irq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
#ifndef __MACH_CLK_H
|
||||
#define __MACH_CLK_H
|
||||
|
||||
struct clk;
|
||||
|
||||
void tegra_periph_reset_deassert(struct clk *c);
|
||||
void tegra_periph_reset_assert(struct clk *c);
|
||||
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
#ifndef __MACH_CLKDEV_H
|
||||
#define __MACH_CLKDEV_H
|
||||
|
||||
struct clk;
|
||||
|
||||
static inline int __clk_get(struct clk *clk)
|
||||
{
|
||||
return 1;
|
||||
|
|
|
@ -46,24 +46,24 @@
|
|||
#define ICTLR_COP_IER_CLR 0x38
|
||||
#define ICTLR_COP_IEP_CLASS 0x3c
|
||||
|
||||
static void (*gic_mask_irq)(struct irq_data *d);
|
||||
static void (*gic_unmask_irq)(struct irq_data *d);
|
||||
static void (*tegra_gic_mask_irq)(struct irq_data *d);
|
||||
static void (*tegra_gic_unmask_irq)(struct irq_data *d);
|
||||
|
||||
#define irq_to_ictlr(irq) (((irq)-32) >> 5)
|
||||
#define irq_to_ictlr(irq) (((irq) - 32) >> 5)
|
||||
static void __iomem *tegra_ictlr_base = IO_ADDRESS(TEGRA_PRIMARY_ICTLR_BASE);
|
||||
#define ictlr_to_virt(ictlr) (tegra_ictlr_base + (ictlr)*0x100)
|
||||
#define ictlr_to_virt(ictlr) (tegra_ictlr_base + (ictlr) * 0x100)
|
||||
|
||||
static void tegra_mask(struct irq_data *d)
|
||||
{
|
||||
void __iomem *addr = ictlr_to_virt(irq_to_ictlr(d->irq));
|
||||
gic_mask_irq(d);
|
||||
writel(1<<(d->irq&31), addr+ICTLR_CPU_IER_CLR);
|
||||
tegra_gic_mask_irq(d);
|
||||
writel(1 << (d->irq & 31), addr+ICTLR_CPU_IER_CLR);
|
||||
}
|
||||
|
||||
static void tegra_unmask(struct irq_data *d)
|
||||
{
|
||||
void __iomem *addr = ictlr_to_virt(irq_to_ictlr(d->irq));
|
||||
gic_unmask_irq(d);
|
||||
tegra_gic_unmask_irq(d);
|
||||
writel(1<<(d->irq&31), addr+ICTLR_CPU_IER_SET);
|
||||
}
|
||||
|
||||
|
@ -98,8 +98,8 @@ void __init tegra_init_irq(void)
|
|||
IO_ADDRESS(TEGRA_ARM_PERIF_BASE + 0x100));
|
||||
|
||||
gic = get_irq_chip(29);
|
||||
gic_unmask_irq = gic->irq_unmask;
|
||||
gic_mask_irq = gic->irq_mask;
|
||||
tegra_gic_unmask_irq = gic->irq_unmask;
|
||||
tegra_gic_mask_irq = gic->irq_mask;
|
||||
tegra_irq.irq_ack = gic->irq_ack;
|
||||
#ifdef CONFIG_SMP
|
||||
tegra_irq.irq_set_affinity = gic->irq_set_affinity;
|
||||
|
|
|
@ -297,6 +297,12 @@ void __init arm_memblock_init(struct meminfo *mi, struct machine_desc *mdesc)
|
|||
memblock_reserve(__pa(_stext), _end - _stext);
|
||||
#endif
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
if (phys_initrd_size &&
|
||||
memblock_is_region_reserved(phys_initrd_start, phys_initrd_size)) {
|
||||
pr_err("INITRD: 0x%08lx+0x%08lx overlaps in-use memory region - disabling initrd\n",
|
||||
phys_initrd_start, phys_initrd_size);
|
||||
phys_initrd_start = phys_initrd_size = 0;
|
||||
}
|
||||
if (phys_initrd_size) {
|
||||
memblock_reserve(phys_initrd_start, phys_initrd_size);
|
||||
|
||||
|
|
|
@ -95,6 +95,7 @@ static __inline__ void __arch_decomp_setup(unsigned long arch_id)
|
|||
case MACH_TYPE_MX35_3DS:
|
||||
case MACH_TYPE_PCM043:
|
||||
case MACH_TYPE_LILLY1131:
|
||||
case MACH_TYPE_VPR200:
|
||||
uart_base = MX3X_UART1_BASE_ADDR;
|
||||
break;
|
||||
case MACH_TYPE_MAGX_ZN5:
|
||||
|
@ -102,6 +103,7 @@ static __inline__ void __arch_decomp_setup(unsigned long arch_id)
|
|||
break;
|
||||
case MACH_TYPE_MX51_BABBAGE:
|
||||
case MACH_TYPE_EUKREA_CPUIMX51SD:
|
||||
case MACH_TYPE_MX51_3DS:
|
||||
uart_base = MX51_UART1_BASE_ADDR;
|
||||
break;
|
||||
case MACH_TYPE_MX50_RDP:
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#
|
||||
# http://www.arm.linux.org.uk/developer/machines/?action=new
|
||||
#
|
||||
# Last update: Sun Dec 12 23:24:27 2010
|
||||
# Last update: Mon Feb 7 08:59:27 2011
|
||||
#
|
||||
# machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number
|
||||
#
|
||||
|
@ -2240,7 +2240,7 @@ arm_ultimator2 MACH_ARM_ULTIMATOR2 ARM_ULTIMATOR2 2250
|
|||
vs_v210 MACH_VS_V210 VS_V210 2252
|
||||
vs_v212 MACH_VS_V212 VS_V212 2253
|
||||
hmt MACH_HMT HMT 2254
|
||||
suen3 MACH_SUEN3 SUEN3 2255
|
||||
km_kirkwood MACH_KM_KIRKWOOD KM_KIRKWOOD 2255
|
||||
vesper MACH_VESPER VESPER 2256
|
||||
str9 MACH_STR9 STR9 2257
|
||||
omap3_wl_ff MACH_OMAP3_WL_FF OMAP3_WL_FF 2258
|
||||
|
@ -2987,7 +2987,7 @@ pxwnas_500_1000 MACH_PXWNAS_500_1000 PXWNAS_500_1000 3001
|
|||
ea20 MACH_EA20 EA20 3002
|
||||
awm2 MACH_AWM2 AWM2 3003
|
||||
ti8148evm MACH_TI8148EVM TI8148EVM 3004
|
||||
tegra_seaboard MACH_TEGRA_SEABOARD TEGRA_SEABOARD 3005
|
||||
seaboard MACH_SEABOARD SEABOARD 3005
|
||||
linkstation_chlv2 MACH_LINKSTATION_CHLV2 LINKSTATION_CHLV2 3006
|
||||
tera_pro2_rack MACH_TERA_PRO2_RACK TERA_PRO2_RACK 3007
|
||||
rubys MACH_RUBYS RUBYS 3008
|
||||
|
@ -3190,7 +3190,7 @@ synergy MACH_SYNERGY SYNERGY 3205
|
|||
ics_if_voip MACH_ICS_IF_VOIP ICS_IF_VOIP 3206
|
||||
wlf_cragg_6410 MACH_WLF_CRAGG_6410 WLF_CRAGG_6410 3207
|
||||
punica MACH_PUNICA PUNICA 3208
|
||||
sbc_nt250 MACH_SBC_NT250 SBC_NT250 3209
|
||||
trimslice MACH_TRIMSLICE TRIMSLICE 3209
|
||||
mx27_wmultra MACH_MX27_WMULTRA MX27_WMULTRA 3210
|
||||
mackerel MACH_MACKEREL MACKEREL 3211
|
||||
fa9x27 MACH_FA9X27 FA9X27 3213
|
||||
|
@ -3219,3 +3219,100 @@ pivicc MACH_PIVICC PIVICC 3235
|
|||
pcm048 MACH_PCM048 PCM048 3236
|
||||
dds MACH_DDS DDS 3237
|
||||
chalten_xa1 MACH_CHALTEN_XA1 CHALTEN_XA1 3238
|
||||
ts48xx MACH_TS48XX TS48XX 3239
|
||||
tonga2_tfttimer MACH_TONGA2_TFTTIMER TONGA2_TFTTIMER 3240
|
||||
whistler MACH_WHISTLER WHISTLER 3241
|
||||
asl_phoenix MACH_ASL_PHOENIX ASL_PHOENIX 3242
|
||||
at91sam9263otlite MACH_AT91SAM9263OTLITE AT91SAM9263OTLITE 3243
|
||||
ddplug MACH_DDPLUG DDPLUG 3244
|
||||
d2plug MACH_D2PLUG D2PLUG 3245
|
||||
kzm9d MACH_KZM9D KZM9D 3246
|
||||
verdi_lte MACH_VERDI_LTE VERDI_LTE 3247
|
||||
nanozoom MACH_NANOZOOM NANOZOOM 3248
|
||||
dm3730_som_lv MACH_DM3730_SOM_LV DM3730_SOM_LV 3249
|
||||
dm3730_torpedo MACH_DM3730_TORPEDO DM3730_TORPEDO 3250
|
||||
anchovy MACH_ANCHOVY ANCHOVY 3251
|
||||
re2rev20 MACH_RE2REV20 RE2REV20 3253
|
||||
re2rev21 MACH_RE2REV21 RE2REV21 3254
|
||||
cns21xx MACH_CNS21XX CNS21XX 3255
|
||||
rider MACH_RIDER RIDER 3257
|
||||
nsk330 MACH_NSK330 NSK330 3258
|
||||
cns2133evb MACH_CNS2133EVB CNS2133EVB 3259
|
||||
z3_816x_mod MACH_Z3_816X_MOD Z3_816X_MOD 3260
|
||||
z3_814x_mod MACH_Z3_814X_MOD Z3_814X_MOD 3261
|
||||
beect MACH_BEECT BEECT 3262
|
||||
dma_thunderbug MACH_DMA_THUNDERBUG DMA_THUNDERBUG 3263
|
||||
omn_at91sam9g20 MACH_OMN_AT91SAM9G20 OMN_AT91SAM9G20 3264
|
||||
mx25_e2s_uc MACH_MX25_E2S_UC MX25_E2S_UC 3265
|
||||
mione MACH_MIONE MIONE 3266
|
||||
top9000_tcu MACH_TOP9000_TCU TOP9000_TCU 3267
|
||||
top9000_bsl MACH_TOP9000_BSL TOP9000_BSL 3268
|
||||
kingdom MACH_KINGDOM KINGDOM 3269
|
||||
armadillo460 MACH_ARMADILLO460 ARMADILLO460 3270
|
||||
lq2 MACH_LQ2 LQ2 3271
|
||||
sweda_tms2 MACH_SWEDA_TMS2 SWEDA_TMS2 3272
|
||||
mx53_loco MACH_MX53_LOCO MX53_LOCO 3273
|
||||
acer_a8 MACH_ACER_A8 ACER_A8 3275
|
||||
acer_gauguin MACH_ACER_GAUGUIN ACER_GAUGUIN 3276
|
||||
guppy MACH_GUPPY GUPPY 3277
|
||||
mx61_ard MACH_MX61_ARD MX61_ARD 3278
|
||||
tx53 MACH_TX53 TX53 3279
|
||||
omapl138_case_a3 MACH_OMAPL138_CASE_A3 OMAPL138_CASE_A3 3280
|
||||
uemd MACH_UEMD UEMD 3281
|
||||
ccwmx51mut MACH_CCWMX51MUT CCWMX51MUT 3282
|
||||
rockhopper MACH_ROCKHOPPER ROCKHOPPER 3283
|
||||
nookcolor MACH_NOOKCOLOR NOOKCOLOR 3284
|
||||
hkdkc100 MACH_HKDKC100 HKDKC100 3285
|
||||
ts42xx MACH_TS42XX TS42XX 3286
|
||||
aebl MACH_AEBL AEBL 3287
|
||||
wario MACH_WARIO WARIO 3288
|
||||
gfs_spm MACH_GFS_SPM GFS_SPM 3289
|
||||
cm_t3730 MACH_CM_T3730 CM_T3730 3290
|
||||
isc3 MACH_ISC3 ISC3 3291
|
||||
rascal MACH_RASCAL RASCAL 3292
|
||||
hrefv60 MACH_HREFV60 HREFV60 3293
|
||||
tpt_2_0 MACH_TPT_2_0 TPT_2_0 3294
|
||||
pyramid_td MACH_PYRAMID_TD PYRAMID_TD 3295
|
||||
splendor MACH_SPLENDOR SPLENDOR 3296
|
||||
guf_planet MACH_GUF_PLANET GUF_PLANET 3297
|
||||
msm8x60_qt MACH_MSM8X60_QT MSM8X60_QT 3298
|
||||
htc_hd_mini MACH_HTC_HD_MINI HTC_HD_MINI 3299
|
||||
athene MACH_ATHENE ATHENE 3300
|
||||
deep_r_ek_1 MACH_DEEP_R_EK_1 DEEP_R_EK_1 3301
|
||||
vivow_ct MACH_VIVOW_CT VIVOW_CT 3302
|
||||
nery_1000 MACH_NERY_1000 NERY_1000 3303
|
||||
rfl109145_ssrv MACH_RFL109145_SSRV RFL109145_SSRV 3304
|
||||
nmh MACH_NMH NMH 3305
|
||||
wn802t MACH_WN802T WN802T 3306
|
||||
dragonet MACH_DRAGONET DRAGONET 3307
|
||||
geneva_b MACH_GENEVA_B GENEVA_B 3308
|
||||
at91sam9263desk16l MACH_AT91SAM9263DESK16L AT91SAM9263DESK16L 3309
|
||||
bcmhana_sv MACH_BCMHANA_SV BCMHANA_SV 3310
|
||||
bcmhana_tablet MACH_BCMHANA_TABLET BCMHANA_TABLET 3311
|
||||
koi MACH_KOI KOI 3312
|
||||
ts4800 MACH_TS4800 TS4800 3313
|
||||
tqma9263 MACH_TQMA9263 TQMA9263 3314
|
||||
holiday MACH_HOLIDAY HOLIDAY 3315
|
||||
dma_6410 MACH_DMA6410 DMA6410 3316
|
||||
pcats_overlay MACH_PCATS_OVERLAY PCATS_OVERLAY 3317
|
||||
hwgw6410 MACH_HWGW6410 HWGW6410 3318
|
||||
shenzhou MACH_SHENZHOU SHENZHOU 3319
|
||||
cwme9210 MACH_CWME9210 CWME9210 3320
|
||||
cwme9210js MACH_CWME9210JS CWME9210JS 3321
|
||||
pgs_v1 MACH_PGS_SITARA PGS_SITARA 3322
|
||||
colibri_tegra2 MACH_COLIBRI_TEGRA2 COLIBRI_TEGRA2 3323
|
||||
w21 MACH_W21 W21 3324
|
||||
polysat1 MACH_POLYSAT1 POLYSAT1 3325
|
||||
dataway MACH_DATAWAY DATAWAY 3326
|
||||
cobral138 MACH_COBRAL138 COBRAL138 3327
|
||||
roverpcs8 MACH_ROVERPCS8 ROVERPCS8 3328
|
||||
marvelc MACH_MARVELC MARVELC 3329
|
||||
navefihid MACH_NAVEFIHID NAVEFIHID 3330
|
||||
dm365_cv100 MACH_DM365_CV100 DM365_CV100 3331
|
||||
able MACH_ABLE ABLE 3332
|
||||
legacy MACH_LEGACY LEGACY 3333
|
||||
icong MACH_ICONG ICONG 3334
|
||||
rover_g8 MACH_ROVER_G8 ROVER_G8 3335
|
||||
t5388p MACH_T5388P T5388P 3336
|
||||
dingo MACH_DINGO DINGO 3337
|
||||
goflexhome MACH_GOFLEXHOME GOFLEXHOME 3338
|
||||
|
|
|
@ -80,7 +80,7 @@ asmlinkage unsigned int do_IRQ(int irq, struct pt_regs *regs)
|
|||
#ifdef CONFIG_DEBUG_STACKOVERFLOW
|
||||
/* FIXME M32R */
|
||||
#endif
|
||||
__do_IRQ(irq);
|
||||
generic_handle_irq(irq);
|
||||
irq_exit();
|
||||
set_irq_regs(old_regs);
|
||||
|
||||
|
|
|
@ -77,8 +77,18 @@ real_start:
|
|||
We ensure r7 points to a valid FDT, just in case the bootloader
|
||||
is broken or non-existent */
|
||||
beqi r7, no_fdt_arg /* NULL pointer? don't copy */
|
||||
lw r11, r0, r7 /* Does r7 point to a */
|
||||
rsubi r11, r11, OF_DT_HEADER /* valid FDT? */
|
||||
/* Does r7 point to a valid FDT? Load HEADER magic number */
|
||||
/* Run time Big/Little endian platform */
|
||||
/* Save 1 as word and load byte - 0 - BIG, 1 - LITTLE */
|
||||
addik r11, r0, 0x1 /* BIG/LITTLE checking value */
|
||||
/* __bss_start will be zeroed later - it is just temp location */
|
||||
swi r11, r0, TOPHYS(__bss_start)
|
||||
lbui r11, r0, TOPHYS(__bss_start)
|
||||
beqid r11, big_endian /* DO NOT break delay stop dependency */
|
||||
lw r11, r0, r7 /* Big endian load in delay slot */
|
||||
lwr r11, r0, r7 /* Little endian load */
|
||||
big_endian:
|
||||
rsubi r11, r11, OF_DT_HEADER /* Check FDT header */
|
||||
beqi r11, _prepare_copy_fdt
|
||||
or r7, r0, r0 /* clear R7 when not valid DTB */
|
||||
bnei r11, no_fdt_arg /* No - get out of here */
|
||||
|
|
|
@ -147,10 +147,6 @@
|
|||
#if CONFIG_XILINX_MICROBLAZE0_USE_BARREL > 0
|
||||
#define BSRLI(rD, rA, imm) \
|
||||
bsrli rD, rA, imm
|
||||
#elif CONFIG_XILINX_MICROBLAZE0_USE_DIV > 0
|
||||
#define BSRLI(rD, rA, imm) \
|
||||
ori rD, r0, (1 << imm); \
|
||||
idivu rD, rD, rA
|
||||
#else
|
||||
#define BSRLI(rD, rA, imm) BSRLI ## imm (rD, rA)
|
||||
/* Only the used shift constants defined here - add more if needed */
|
||||
|
|
|
@ -29,6 +29,10 @@
|
|||
* between mem locations with size of xfer spec'd in bytes
|
||||
*/
|
||||
|
||||
#ifdef __MICROBLAZEEL__
|
||||
#error Microblaze LE not support ASM optimized lib func. Disable OPT_LIB_ASM.
|
||||
#endif
|
||||
|
||||
#include <linux/linkage.h>
|
||||
.text
|
||||
.globl memcpy
|
||||
|
|
|
@ -40,8 +40,8 @@
|
|||
|
||||
/* MAS registers bit definitions */
|
||||
|
||||
#define MAS0_TLBSEL(x) ((x << 28) & 0x30000000)
|
||||
#define MAS0_ESEL(x) ((x << 16) & 0x0FFF0000)
|
||||
#define MAS0_TLBSEL(x) (((x) << 28) & 0x30000000)
|
||||
#define MAS0_ESEL(x) (((x) << 16) & 0x0FFF0000)
|
||||
#define MAS0_NV(x) ((x) & 0x00000FFF)
|
||||
#define MAS0_HES 0x00004000
|
||||
#define MAS0_WQ_ALLWAYS 0x00000000
|
||||
|
@ -50,12 +50,12 @@
|
|||
|
||||
#define MAS1_VALID 0x80000000
|
||||
#define MAS1_IPROT 0x40000000
|
||||
#define MAS1_TID(x) ((x << 16) & 0x3FFF0000)
|
||||
#define MAS1_TID(x) (((x) << 16) & 0x3FFF0000)
|
||||
#define MAS1_IND 0x00002000
|
||||
#define MAS1_TS 0x00001000
|
||||
#define MAS1_TSIZE_MASK 0x00000f80
|
||||
#define MAS1_TSIZE_SHIFT 7
|
||||
#define MAS1_TSIZE(x) ((x << MAS1_TSIZE_SHIFT) & MAS1_TSIZE_MASK)
|
||||
#define MAS1_TSIZE(x) (((x) << MAS1_TSIZE_SHIFT) & MAS1_TSIZE_MASK)
|
||||
|
||||
#define MAS2_EPN 0xFFFFF000
|
||||
#define MAS2_X0 0x00000040
|
||||
|
|
|
@ -101,7 +101,7 @@ extern phys_addr_t kernstart_addr;
|
|||
|
||||
#ifdef CONFIG_FLATMEM
|
||||
#define ARCH_PFN_OFFSET (MEMORY_START >> PAGE_SHIFT)
|
||||
#define pfn_valid(pfn) ((pfn) >= ARCH_PFN_OFFSET && (pfn) < (ARCH_PFN_OFFSET + max_mapnr))
|
||||
#define pfn_valid(pfn) ((pfn) >= ARCH_PFN_OFFSET && (pfn) < max_mapnr)
|
||||
#endif
|
||||
|
||||
#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#include <asm/mmu.h>
|
||||
|
||||
_GLOBAL(__setup_cpu_603)
|
||||
mflr r4
|
||||
mflr r5
|
||||
BEGIN_MMU_FTR_SECTION
|
||||
li r10,0
|
||||
mtspr SPRN_SPRG_603_LRU,r10 /* init SW LRU tracking */
|
||||
|
@ -27,60 +27,60 @@ BEGIN_FTR_SECTION
|
|||
bl __init_fpu_registers
|
||||
END_FTR_SECTION_IFCLR(CPU_FTR_FPU_UNAVAILABLE)
|
||||
bl setup_common_caches
|
||||
mtlr r4
|
||||
mtlr r5
|
||||
blr
|
||||
_GLOBAL(__setup_cpu_604)
|
||||
mflr r4
|
||||
mflr r5
|
||||
bl setup_common_caches
|
||||
bl setup_604_hid0
|
||||
mtlr r4
|
||||
mtlr r5
|
||||
blr
|
||||
_GLOBAL(__setup_cpu_750)
|
||||
mflr r4
|
||||
mflr r5
|
||||
bl __init_fpu_registers
|
||||
bl setup_common_caches
|
||||
bl setup_750_7400_hid0
|
||||
mtlr r4
|
||||
mtlr r5
|
||||
blr
|
||||
_GLOBAL(__setup_cpu_750cx)
|
||||
mflr r4
|
||||
mflr r5
|
||||
bl __init_fpu_registers
|
||||
bl setup_common_caches
|
||||
bl setup_750_7400_hid0
|
||||
bl setup_750cx
|
||||
mtlr r4
|
||||
mtlr r5
|
||||
blr
|
||||
_GLOBAL(__setup_cpu_750fx)
|
||||
mflr r4
|
||||
mflr r5
|
||||
bl __init_fpu_registers
|
||||
bl setup_common_caches
|
||||
bl setup_750_7400_hid0
|
||||
bl setup_750fx
|
||||
mtlr r4
|
||||
mtlr r5
|
||||
blr
|
||||
_GLOBAL(__setup_cpu_7400)
|
||||
mflr r4
|
||||
mflr r5
|
||||
bl __init_fpu_registers
|
||||
bl setup_7400_workarounds
|
||||
bl setup_common_caches
|
||||
bl setup_750_7400_hid0
|
||||
mtlr r4
|
||||
mtlr r5
|
||||
blr
|
||||
_GLOBAL(__setup_cpu_7410)
|
||||
mflr r4
|
||||
mflr r5
|
||||
bl __init_fpu_registers
|
||||
bl setup_7410_workarounds
|
||||
bl setup_common_caches
|
||||
bl setup_750_7400_hid0
|
||||
li r3,0
|
||||
mtspr SPRN_L2CR2,r3
|
||||
mtlr r4
|
||||
mtlr r5
|
||||
blr
|
||||
_GLOBAL(__setup_cpu_745x)
|
||||
mflr r4
|
||||
mflr r5
|
||||
bl setup_common_caches
|
||||
bl setup_745x_specifics
|
||||
mtlr r4
|
||||
mtlr r5
|
||||
blr
|
||||
|
||||
/* Enable caches for 603's, 604, 750 & 7400 */
|
||||
|
@ -194,10 +194,10 @@ setup_750cx:
|
|||
cror 4*cr0+eq,4*cr0+eq,4*cr1+eq
|
||||
cror 4*cr0+eq,4*cr0+eq,4*cr2+eq
|
||||
bnelr
|
||||
lwz r6,CPU_SPEC_FEATURES(r5)
|
||||
lwz r6,CPU_SPEC_FEATURES(r4)
|
||||
li r7,CPU_FTR_CAN_NAP
|
||||
andc r6,r6,r7
|
||||
stw r6,CPU_SPEC_FEATURES(r5)
|
||||
stw r6,CPU_SPEC_FEATURES(r4)
|
||||
blr
|
||||
|
||||
/* 750fx specific
|
||||
|
@ -225,12 +225,12 @@ BEGIN_FTR_SECTION
|
|||
andis. r11,r11,L3CR_L3E@h
|
||||
beq 1f
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_L3CR)
|
||||
lwz r6,CPU_SPEC_FEATURES(r5)
|
||||
lwz r6,CPU_SPEC_FEATURES(r4)
|
||||
andi. r0,r6,CPU_FTR_L3_DISABLE_NAP
|
||||
beq 1f
|
||||
li r7,CPU_FTR_CAN_NAP
|
||||
andc r6,r6,r7
|
||||
stw r6,CPU_SPEC_FEATURES(r5)
|
||||
stw r6,CPU_SPEC_FEATURES(r4)
|
||||
1:
|
||||
mfspr r11,SPRN_HID0
|
||||
|
||||
|
|
|
@ -2076,8 +2076,8 @@ static void __init setup_cpu_spec(unsigned long offset, struct cpu_spec *s)
|
|||
* pointer on ppc64 and booke as we are running at 0 in real mode
|
||||
* on ppc64 and reloc_offset is always 0 on booke.
|
||||
*/
|
||||
if (s->cpu_setup) {
|
||||
s->cpu_setup(offset, s);
|
||||
if (t->cpu_setup) {
|
||||
t->cpu_setup(offset, t);
|
||||
}
|
||||
#endif /* CONFIG_PPC64 || CONFIG_BOOKE */
|
||||
}
|
||||
|
|
|
@ -186,7 +186,7 @@ static void unmap_cpu_from_node(unsigned long cpu)
|
|||
dbg("removing cpu %lu from node %d\n", cpu, node);
|
||||
|
||||
if (cpumask_test_cpu(cpu, node_to_cpumask_map[node])) {
|
||||
cpumask_set_cpu(cpu, node_to_cpumask_map[node]);
|
||||
cpumask_clear_cpu(cpu, node_to_cpumask_map[node]);
|
||||
} else {
|
||||
printk(KERN_ERR "WARNING: cpu %lu not found in node %d\n",
|
||||
cpu, node);
|
||||
|
@ -1289,10 +1289,9 @@ u64 memory_hotplug_max(void)
|
|||
}
|
||||
#endif /* CONFIG_MEMORY_HOTPLUG */
|
||||
|
||||
/* Vrtual Processor Home Node (VPHN) support */
|
||||
/* Virtual Processor Home Node (VPHN) support */
|
||||
#ifdef CONFIG_PPC_SPLPAR
|
||||
#define VPHN_NR_CHANGE_CTRS (8)
|
||||
static u8 vphn_cpu_change_counts[NR_CPUS][VPHN_NR_CHANGE_CTRS];
|
||||
static u8 vphn_cpu_change_counts[NR_CPUS][MAX_DISTANCE_REF_POINTS];
|
||||
static cpumask_t cpu_associativity_changes_mask;
|
||||
static int vphn_enabled;
|
||||
static void set_topology_timer(void);
|
||||
|
@ -1303,16 +1302,18 @@ static void set_topology_timer(void);
|
|||
*/
|
||||
static void setup_cpu_associativity_change_counters(void)
|
||||
{
|
||||
int cpu = 0;
|
||||
int cpu;
|
||||
|
||||
/* The VPHN feature supports a maximum of 8 reference points */
|
||||
BUILD_BUG_ON(MAX_DISTANCE_REF_POINTS > 8);
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
int i = 0;
|
||||
int i;
|
||||
u8 *counts = vphn_cpu_change_counts[cpu];
|
||||
volatile u8 *hypervisor_counts = lppaca[cpu].vphn_assoc_counts;
|
||||
|
||||
for (i = 0; i < VPHN_NR_CHANGE_CTRS; i++) {
|
||||
for (i = 0; i < distance_ref_points_depth; i++)
|
||||
counts[i] = hypervisor_counts[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1329,7 +1330,7 @@ static void setup_cpu_associativity_change_counters(void)
|
|||
*/
|
||||
static int update_cpu_associativity_changes_mask(void)
|
||||
{
|
||||
int cpu = 0, nr_cpus = 0;
|
||||
int cpu, nr_cpus = 0;
|
||||
cpumask_t *changes = &cpu_associativity_changes_mask;
|
||||
|
||||
cpumask_clear(changes);
|
||||
|
@ -1339,8 +1340,8 @@ static int update_cpu_associativity_changes_mask(void)
|
|||
u8 *counts = vphn_cpu_change_counts[cpu];
|
||||
volatile u8 *hypervisor_counts = lppaca[cpu].vphn_assoc_counts;
|
||||
|
||||
for (i = 0; i < VPHN_NR_CHANGE_CTRS; i++) {
|
||||
if (hypervisor_counts[i] > counts[i]) {
|
||||
for (i = 0; i < distance_ref_points_depth; i++) {
|
||||
if (hypervisor_counts[i] != counts[i]) {
|
||||
counts[i] = hypervisor_counts[i];
|
||||
changed = 1;
|
||||
}
|
||||
|
@ -1354,8 +1355,11 @@ static int update_cpu_associativity_changes_mask(void)
|
|||
return nr_cpus;
|
||||
}
|
||||
|
||||
/* 6 64-bit registers unpacked into 12 32-bit associativity values */
|
||||
#define VPHN_ASSOC_BUFSIZE (6*sizeof(u64)/sizeof(u32))
|
||||
/*
|
||||
* 6 64-bit registers unpacked into 12 32-bit associativity values. To form
|
||||
* the complete property we have to add the length in the first cell.
|
||||
*/
|
||||
#define VPHN_ASSOC_BUFSIZE (6*sizeof(u64)/sizeof(u32) + 1)
|
||||
|
||||
/*
|
||||
* Convert the associativity domain numbers returned from the hypervisor
|
||||
|
@ -1363,15 +1367,14 @@ static int update_cpu_associativity_changes_mask(void)
|
|||
*/
|
||||
static int vphn_unpack_associativity(const long *packed, unsigned int *unpacked)
|
||||
{
|
||||
int i = 0;
|
||||
int nr_assoc_doms = 0;
|
||||
int i, nr_assoc_doms = 0;
|
||||
const u16 *field = (const u16*) packed;
|
||||
|
||||
#define VPHN_FIELD_UNUSED (0xffff)
|
||||
#define VPHN_FIELD_MSB (0x8000)
|
||||
#define VPHN_FIELD_MASK (~VPHN_FIELD_MSB)
|
||||
|
||||
for (i = 0; i < VPHN_ASSOC_BUFSIZE; i++) {
|
||||
for (i = 1; i < VPHN_ASSOC_BUFSIZE; i++) {
|
||||
if (*field == VPHN_FIELD_UNUSED) {
|
||||
/* All significant fields processed, and remaining
|
||||
* fields contain the reserved value of all 1's.
|
||||
|
@ -1379,14 +1382,12 @@ static int vphn_unpack_associativity(const long *packed, unsigned int *unpacked)
|
|||
*/
|
||||
unpacked[i] = *((u32*)field);
|
||||
field += 2;
|
||||
}
|
||||
else if (*field & VPHN_FIELD_MSB) {
|
||||
} else if (*field & VPHN_FIELD_MSB) {
|
||||
/* Data is in the lower 15 bits of this field */
|
||||
unpacked[i] = *field & VPHN_FIELD_MASK;
|
||||
field++;
|
||||
nr_assoc_doms++;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
/* Data is in the lower 15 bits of this field
|
||||
* concatenated with the next 16 bit field
|
||||
*/
|
||||
|
@ -1396,6 +1397,9 @@ static int vphn_unpack_associativity(const long *packed, unsigned int *unpacked)
|
|||
}
|
||||
}
|
||||
|
||||
/* The first cell contains the length of the property */
|
||||
unpacked[0] = nr_assoc_doms;
|
||||
|
||||
return nr_assoc_doms;
|
||||
}
|
||||
|
||||
|
@ -1405,7 +1409,7 @@ static int vphn_unpack_associativity(const long *packed, unsigned int *unpacked)
|
|||
*/
|
||||
static long hcall_vphn(unsigned long cpu, unsigned int *associativity)
|
||||
{
|
||||
long rc = 0;
|
||||
long rc;
|
||||
long retbuf[PLPAR_HCALL9_BUFSIZE] = {0};
|
||||
u64 flags = 1;
|
||||
int hwcpu = get_hard_smp_processor_id(cpu);
|
||||
|
@ -1419,7 +1423,7 @@ static long hcall_vphn(unsigned long cpu, unsigned int *associativity)
|
|||
static long vphn_get_associativity(unsigned long cpu,
|
||||
unsigned int *associativity)
|
||||
{
|
||||
long rc = 0;
|
||||
long rc;
|
||||
|
||||
rc = hcall_vphn(cpu, associativity);
|
||||
|
||||
|
@ -1445,9 +1449,9 @@ static long vphn_get_associativity(unsigned long cpu,
|
|||
*/
|
||||
int arch_update_cpu_topology(void)
|
||||
{
|
||||
int cpu = 0, nid = 0, old_nid = 0;
|
||||
int cpu, nid, old_nid;
|
||||
unsigned int associativity[VPHN_ASSOC_BUFSIZE] = {0};
|
||||
struct sys_device *sysdev = NULL;
|
||||
struct sys_device *sysdev;
|
||||
|
||||
for_each_cpu_mask(cpu, cpu_associativity_changes_mask) {
|
||||
vphn_get_associativity(cpu, associativity);
|
||||
|
@ -1512,7 +1516,8 @@ int start_topology_update(void)
|
|||
{
|
||||
int rc = 0;
|
||||
|
||||
if (firmware_has_feature(FW_FEATURE_VPHN)) {
|
||||
if (firmware_has_feature(FW_FEATURE_VPHN) &&
|
||||
get_lppaca()->shared_proc) {
|
||||
vphn_enabled = 1;
|
||||
setup_cpu_associativity_change_counters();
|
||||
init_timer_deferrable(&topology_timer);
|
||||
|
|
|
@ -713,6 +713,13 @@ EXPORT_SYMBOL(arch_free_page);
|
|||
/* NB: reg/unreg are called while guarded with the tracepoints_mutex */
|
||||
extern long hcall_tracepoint_refcount;
|
||||
|
||||
/*
|
||||
* Since the tracing code might execute hcalls we need to guard against
|
||||
* recursion. One example of this are spinlocks calling H_YIELD on
|
||||
* shared processor partitions.
|
||||
*/
|
||||
static DEFINE_PER_CPU(unsigned int, hcall_trace_depth);
|
||||
|
||||
void hcall_tracepoint_regfunc(void)
|
||||
{
|
||||
hcall_tracepoint_refcount++;
|
||||
|
@ -725,12 +732,42 @@ void hcall_tracepoint_unregfunc(void)
|
|||
|
||||
void __trace_hcall_entry(unsigned long opcode, unsigned long *args)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int *depth;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
depth = &__get_cpu_var(hcall_trace_depth);
|
||||
|
||||
if (*depth)
|
||||
goto out;
|
||||
|
||||
(*depth)++;
|
||||
trace_hcall_entry(opcode, args);
|
||||
(*depth)--;
|
||||
|
||||
out:
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
void __trace_hcall_exit(long opcode, unsigned long retval,
|
||||
unsigned long *retbuf)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int *depth;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
depth = &__get_cpu_var(hcall_trace_depth);
|
||||
|
||||
if (*depth)
|
||||
goto out;
|
||||
|
||||
(*depth)++;
|
||||
trace_hcall_exit(opcode, retval, retbuf);
|
||||
(*depth)--;
|
||||
|
||||
out:
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -406,7 +406,7 @@ config QDIO
|
|||
If unsure, say Y.
|
||||
|
||||
config CHSC_SCH
|
||||
def_tristate y
|
||||
def_tristate m
|
||||
prompt "Support for CHSC subchannels"
|
||||
help
|
||||
This driver allows usage of CHSC subchannels. A CHSC subchannel
|
||||
|
|
|
@ -1,29 +1,8 @@
|
|||
#ifndef _S390_CACHEFLUSH_H
|
||||
#define _S390_CACHEFLUSH_H
|
||||
|
||||
/* Keep includes the same across arches. */
|
||||
#include <linux/mm.h>
|
||||
|
||||
/* Caches aren't brain-dead on the s390. */
|
||||
#define flush_cache_all() do { } while (0)
|
||||
#define flush_cache_mm(mm) do { } while (0)
|
||||
#define flush_cache_dup_mm(mm) do { } while (0)
|
||||
#define flush_cache_range(vma, start, end) do { } while (0)
|
||||
#define flush_cache_page(vma, vmaddr, pfn) do { } while (0)
|
||||
#define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 0
|
||||
#define flush_dcache_page(page) do { } while (0)
|
||||
#define flush_dcache_mmap_lock(mapping) do { } while (0)
|
||||
#define flush_dcache_mmap_unlock(mapping) do { } while (0)
|
||||
#define flush_icache_range(start, end) do { } while (0)
|
||||
#define flush_icache_page(vma,pg) do { } while (0)
|
||||
#define flush_icache_user_range(vma,pg,adr,len) do { } while (0)
|
||||
#define flush_cache_vmap(start, end) do { } while (0)
|
||||
#define flush_cache_vunmap(start, end) do { } while (0)
|
||||
|
||||
#define copy_to_user_page(vma, page, vaddr, dst, src, len) \
|
||||
memcpy(dst, src, len)
|
||||
#define copy_from_user_page(vma, page, vaddr, dst, src, len) \
|
||||
memcpy(dst, src, len)
|
||||
#include <asm-generic/cacheflush.h>
|
||||
|
||||
#ifdef CONFIG_DEBUG_PAGEALLOC
|
||||
void kernel_map_pages(struct page *page, int numpages, int enable);
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/mm.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/swap.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/pgalloc.h>
|
||||
|
|
|
@ -125,9 +125,9 @@ static size_t copy_in_user_std(size_t size, void __user *to,
|
|||
unsigned long tmp1;
|
||||
|
||||
asm volatile(
|
||||
" sacf 256\n"
|
||||
" "AHI" %0,-1\n"
|
||||
" jo 5f\n"
|
||||
" sacf 256\n"
|
||||
" bras %3,3f\n"
|
||||
"0:"AHI" %0,257\n"
|
||||
"1: mvc 0(1,%1),0(%2)\n"
|
||||
|
@ -142,9 +142,8 @@ static size_t copy_in_user_std(size_t size, void __user *to,
|
|||
"3:"AHI" %0,-256\n"
|
||||
" jnm 2b\n"
|
||||
"4: ex %0,1b-0b(%3)\n"
|
||||
" sacf 0\n"
|
||||
"5: "SLR" %0,%0\n"
|
||||
"6:\n"
|
||||
"6: sacf 0\n"
|
||||
EX_TABLE(1b,6b) EX_TABLE(2b,0b) EX_TABLE(4b,0b)
|
||||
: "+a" (size), "+a" (to), "+a" (from), "=a" (tmp1)
|
||||
: : "cc", "memory");
|
||||
|
@ -156,9 +155,9 @@ static size_t clear_user_std(size_t size, void __user *to)
|
|||
unsigned long tmp1, tmp2;
|
||||
|
||||
asm volatile(
|
||||
" sacf 256\n"
|
||||
" "AHI" %0,-1\n"
|
||||
" jo 5f\n"
|
||||
" sacf 256\n"
|
||||
" bras %3,3f\n"
|
||||
" xc 0(1,%1),0(%1)\n"
|
||||
"0:"AHI" %0,257\n"
|
||||
|
@ -178,9 +177,8 @@ static size_t clear_user_std(size_t size, void __user *to)
|
|||
"3:"AHI" %0,-256\n"
|
||||
" jnm 2b\n"
|
||||
"4: ex %0,0(%3)\n"
|
||||
" sacf 0\n"
|
||||
"5: "SLR" %0,%0\n"
|
||||
"6:\n"
|
||||
"6: sacf 0\n"
|
||||
EX_TABLE(1b,6b) EX_TABLE(2b,0b) EX_TABLE(4b,0b)
|
||||
: "+a" (size), "+a" (to), "=a" (tmp1), "=a" (tmp2)
|
||||
: : "cc", "memory");
|
||||
|
|
|
@ -336,7 +336,8 @@ void page_table_free(struct mm_struct *mm, unsigned long *table)
|
|||
page->flags ^= bits;
|
||||
if (page->flags & FRAG_MASK) {
|
||||
/* Page now has some free pgtable fragments. */
|
||||
list_move(&page->lru, &mm->context.pgtable_list);
|
||||
if (!list_empty(&page->lru))
|
||||
list_move(&page->lru, &mm->context.pgtable_list);
|
||||
page = NULL;
|
||||
} else
|
||||
/* All fragments of the 4K page have been freed. */
|
||||
|
|
|
@ -36,8 +36,6 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
|
|||
unsigned cpu = smp_processor_id();
|
||||
|
||||
if (likely(prev != next)) {
|
||||
/* stop flush ipis for the previous mm */
|
||||
cpumask_clear_cpu(cpu, mm_cpumask(prev));
|
||||
#ifdef CONFIG_SMP
|
||||
percpu_write(cpu_tlbstate.state, TLBSTATE_OK);
|
||||
percpu_write(cpu_tlbstate.active_mm, next);
|
||||
|
@ -47,6 +45,9 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
|
|||
/* Re-load page tables */
|
||||
load_cr3(next->pgd);
|
||||
|
||||
/* stop flush ipis for the previous mm */
|
||||
cpumask_clear_cpu(cpu, mm_cpumask(prev));
|
||||
|
||||
/*
|
||||
* load the LDT, if the LDT is different:
|
||||
*/
|
||||
|
|
|
@ -43,10 +43,7 @@ DECLARE_EARLY_PER_CPU(int, x86_cpu_to_logical_apicid);
|
|||
#endif
|
||||
|
||||
/* Static state in head.S used to set up a CPU */
|
||||
extern struct {
|
||||
void *sp;
|
||||
unsigned short ss;
|
||||
} stack_start;
|
||||
extern unsigned long stack_start; /* Initial stack pointer address */
|
||||
|
||||
struct smp_ops {
|
||||
void (*smp_prepare_boot_cpu)(void);
|
||||
|
|
|
@ -12,10 +12,8 @@
|
|||
#include <linux/cpumask.h>
|
||||
#include <asm/segment.h>
|
||||
#include <asm/desc.h>
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
#include <asm/pgtable.h>
|
||||
#endif
|
||||
#include <asm/cacheflush.h>
|
||||
|
||||
#include "realmode/wakeup.h"
|
||||
#include "sleep.h"
|
||||
|
@ -100,7 +98,7 @@ int acpi_save_state_mem(void)
|
|||
#else /* CONFIG_64BIT */
|
||||
header->trampoline_segment = setup_trampoline() >> 4;
|
||||
#ifdef CONFIG_SMP
|
||||
stack_start.sp = temp_stack + sizeof(temp_stack);
|
||||
stack_start = (unsigned long)temp_stack + sizeof(temp_stack);
|
||||
early_gdt_descr.address =
|
||||
(unsigned long)get_cpu_gdt_table(smp_processor_id());
|
||||
initial_gs = per_cpu_offset(smp_processor_id());
|
||||
|
@ -149,6 +147,15 @@ void __init acpi_reserve_wakeup_memory(void)
|
|||
memblock_x86_reserve_range(mem, mem + WAKEUP_SIZE, "ACPI WAKEUP");
|
||||
}
|
||||
|
||||
int __init acpi_configure_wakeup_memory(void)
|
||||
{
|
||||
if (acpi_realmode)
|
||||
set_memory_x(acpi_realmode, WAKEUP_SIZE >> PAGE_SHIFT);
|
||||
|
||||
return 0;
|
||||
}
|
||||
arch_initcall(acpi_configure_wakeup_memory);
|
||||
|
||||
|
||||
static int __init acpi_sleep_setup(char *str)
|
||||
{
|
||||
|
|
|
@ -793,13 +793,21 @@ void set_mtrr_aps_delayed_init(void)
|
|||
}
|
||||
|
||||
/*
|
||||
* MTRR initialization for all AP's
|
||||
* Delayed MTRR initialization for all AP's
|
||||
*/
|
||||
void mtrr_aps_init(void)
|
||||
{
|
||||
if (!use_intel())
|
||||
return;
|
||||
|
||||
/*
|
||||
* Check if someone has requested the delay of AP MTRR initialization,
|
||||
* by doing set_mtrr_aps_delayed_init(), prior to this point. If not,
|
||||
* then we are done.
|
||||
*/
|
||||
if (!mtrr_aps_delayed_init)
|
||||
return;
|
||||
|
||||
set_mtrr(~0U, 0, 0, 0);
|
||||
mtrr_aps_delayed_init = false;
|
||||
}
|
||||
|
|
|
@ -682,7 +682,7 @@ static int p4_validate_raw_event(struct perf_event *event)
|
|||
* if an event is shared accross the logical threads
|
||||
* the user needs special permissions to be able to use it
|
||||
*/
|
||||
if (p4_event_bind_map[v].shared) {
|
||||
if (p4_ht_active() && p4_event_bind_map[v].shared) {
|
||||
if (perf_paranoid_cpu() && !capable(CAP_SYS_ADMIN))
|
||||
return -EACCES;
|
||||
}
|
||||
|
@ -727,7 +727,8 @@ static int p4_hw_config(struct perf_event *event)
|
|||
event->hw.config = p4_set_ht_bit(event->hw.config);
|
||||
|
||||
if (event->attr.type == PERF_TYPE_RAW) {
|
||||
|
||||
struct p4_event_bind *bind;
|
||||
unsigned int esel;
|
||||
/*
|
||||
* Clear bits we reserve to be managed by kernel itself
|
||||
* and never allowed from a user space
|
||||
|
@ -743,6 +744,13 @@ static int p4_hw_config(struct perf_event *event)
|
|||
* bits since we keep additional info here (for cache events and etc)
|
||||
*/
|
||||
event->hw.config |= event->attr.config;
|
||||
bind = p4_config_get_bind(event->attr.config);
|
||||
if (!bind) {
|
||||
rc = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
esel = P4_OPCODE_ESEL(bind->opcode);
|
||||
event->hw.config |= p4_config_pack_cccr(P4_CCCR_ESEL(esel));
|
||||
}
|
||||
|
||||
rc = x86_setup_perfctr(event);
|
||||
|
|
|
@ -85,6 +85,8 @@ RESERVE_BRK(pagetables, INIT_MAP_SIZE)
|
|||
*/
|
||||
__HEAD
|
||||
ENTRY(startup_32)
|
||||
movl pa(stack_start),%ecx
|
||||
|
||||
/* test KEEP_SEGMENTS flag to see if the bootloader is asking
|
||||
us to not reload segments */
|
||||
testb $(1<<6), BP_loadflags(%esi)
|
||||
|
@ -99,7 +101,9 @@ ENTRY(startup_32)
|
|||
movl %eax,%es
|
||||
movl %eax,%fs
|
||||
movl %eax,%gs
|
||||
movl %eax,%ss
|
||||
2:
|
||||
leal -__PAGE_OFFSET(%ecx),%esp
|
||||
|
||||
/*
|
||||
* Clear BSS first so that there are no surprises...
|
||||
|
@ -145,8 +149,6 @@ ENTRY(startup_32)
|
|||
* _brk_end is set up to point to the first "safe" location.
|
||||
* Mappings are created both at virtual address 0 (identity mapping)
|
||||
* and PAGE_OFFSET for up to _end.
|
||||
*
|
||||
* Note that the stack is not yet set up!
|
||||
*/
|
||||
#ifdef CONFIG_X86_PAE
|
||||
|
||||
|
@ -282,6 +284,9 @@ ENTRY(startup_32_smp)
|
|||
movl %eax,%es
|
||||
movl %eax,%fs
|
||||
movl %eax,%gs
|
||||
movl pa(stack_start),%ecx
|
||||
movl %eax,%ss
|
||||
leal -__PAGE_OFFSET(%ecx),%esp
|
||||
#endif /* CONFIG_SMP */
|
||||
default_entry:
|
||||
|
||||
|
@ -347,8 +352,8 @@ default_entry:
|
|||
movl %eax,%cr0 /* ..and set paging (PG) bit */
|
||||
ljmp $__BOOT_CS,$1f /* Clear prefetch and normalize %eip */
|
||||
1:
|
||||
/* Set up the stack pointer */
|
||||
lss stack_start,%esp
|
||||
/* Shift the stack pointer to a virtual address */
|
||||
addl $__PAGE_OFFSET, %esp
|
||||
|
||||
/*
|
||||
* Initialize eflags. Some BIOS's leave bits like NT set. This would
|
||||
|
@ -360,9 +365,7 @@ default_entry:
|
|||
|
||||
#ifdef CONFIG_SMP
|
||||
cmpb $0, ready
|
||||
jz 1f /* Initial CPU cleans BSS */
|
||||
jmp checkCPUtype
|
||||
1:
|
||||
jnz checkCPUtype
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
/*
|
||||
|
@ -470,14 +473,7 @@ is386: movl $2,%ecx # set MP
|
|||
|
||||
cld # gcc2 wants the direction flag cleared at all times
|
||||
pushl $0 # fake return address for unwinder
|
||||
#ifdef CONFIG_SMP
|
||||
movb ready, %cl
|
||||
movb $1, ready
|
||||
cmpb $0,%cl # the first CPU calls start_kernel
|
||||
je 1f
|
||||
movl (stack_start), %esp
|
||||
1:
|
||||
#endif /* CONFIG_SMP */
|
||||
jmp *(initial_code)
|
||||
|
||||
/*
|
||||
|
@ -670,15 +666,15 @@ ENTRY(initial_page_table)
|
|||
#endif
|
||||
|
||||
.data
|
||||
.balign 4
|
||||
ENTRY(stack_start)
|
||||
.long init_thread_union+THREAD_SIZE
|
||||
.long __BOOT_DS
|
||||
|
||||
ready: .byte 0
|
||||
|
||||
early_recursion_flag:
|
||||
.long 0
|
||||
|
||||
ready: .byte 0
|
||||
|
||||
int_msg:
|
||||
.asciz "Unknown interrupt or fault at: %p %p %p\n"
|
||||
|
||||
|
|
|
@ -577,7 +577,7 @@ wakeup_secondary_cpu_via_init(int phys_apicid, unsigned long start_eip)
|
|||
* target processor state.
|
||||
*/
|
||||
startup_ipi_hook(phys_apicid, (unsigned long) start_secondary,
|
||||
(unsigned long)stack_start.sp);
|
||||
stack_start);
|
||||
|
||||
/*
|
||||
* Run STARTUP IPI loop.
|
||||
|
@ -724,7 +724,7 @@ do_rest:
|
|||
#endif
|
||||
early_gdt_descr.address = (unsigned long)get_cpu_gdt_table(cpu);
|
||||
initial_code = (unsigned long)start_secondary;
|
||||
stack_start.sp = (void *) c_idle.idle->thread.sp;
|
||||
stack_start = c_idle.idle->thread.sp;
|
||||
|
||||
/* start_ip had better be page-aligned! */
|
||||
start_ip = setup_trampoline();
|
||||
|
|
|
@ -256,7 +256,6 @@ static inline pgprot_t static_protections(pgprot_t prot, unsigned long address,
|
|||
unsigned long pfn)
|
||||
{
|
||||
pgprot_t forbidden = __pgprot(0);
|
||||
pgprot_t required = __pgprot(0);
|
||||
|
||||
/*
|
||||
* The BIOS area between 640k and 1Mb needs to be executable for
|
||||
|
@ -282,12 +281,6 @@ static inline pgprot_t static_protections(pgprot_t prot, unsigned long address,
|
|||
if (within(pfn, __pa((unsigned long)__start_rodata) >> PAGE_SHIFT,
|
||||
__pa((unsigned long)__end_rodata) >> PAGE_SHIFT))
|
||||
pgprot_val(forbidden) |= _PAGE_RW;
|
||||
/*
|
||||
* .data and .bss should always be writable.
|
||||
*/
|
||||
if (within(address, (unsigned long)_sdata, (unsigned long)_edata) ||
|
||||
within(address, (unsigned long)__bss_start, (unsigned long)__bss_stop))
|
||||
pgprot_val(required) |= _PAGE_RW;
|
||||
|
||||
#if defined(CONFIG_X86_64) && defined(CONFIG_DEBUG_RODATA)
|
||||
/*
|
||||
|
@ -327,7 +320,6 @@ static inline pgprot_t static_protections(pgprot_t prot, unsigned long address,
|
|||
#endif
|
||||
|
||||
prot = __pgprot(pgprot_val(prot) & ~pgprot_val(forbidden));
|
||||
prot = __pgprot(pgprot_val(prot) | pgprot_val(required));
|
||||
|
||||
return prot;
|
||||
}
|
||||
|
|
|
@ -260,6 +260,7 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
|||
{ PCI_VDEVICE(INTEL, 0x1d02), board_ahci }, /* PBG AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x1d04), board_ahci }, /* PBG RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x1d06), board_ahci }, /* PBG RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x2323), board_ahci }, /* DH89xxCC AHCI */
|
||||
|
||||
/* JMicron 360/1/3/5/6, match class to avoid IDE function */
|
||||
{ PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
|
||||
|
@ -379,6 +380,8 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
|||
{ PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv }, /* 6145 */
|
||||
{ PCI_VDEVICE(MARVELL, 0x6121), board_ahci_mv }, /* 6121 */
|
||||
{ PCI_DEVICE(0x1b4b, 0x9123),
|
||||
.class = PCI_CLASS_STORAGE_SATA_AHCI,
|
||||
.class_mask = 0xffffff,
|
||||
.driver_data = board_ahci_yes_fbs }, /* 88se9128 */
|
||||
|
||||
/* Promise */
|
||||
|
|
|
@ -4138,6 +4138,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
|||
* device and controller are SATA.
|
||||
*/
|
||||
{ "PIONEER DVD-RW DVRTD08", "1.00", ATA_HORKAGE_NOSETXFER },
|
||||
{ "PIONEER DVD-RW DVR-212D", "1.28", ATA_HORKAGE_NOSETXFER },
|
||||
|
||||
/* End Marker */
|
||||
{ }
|
||||
|
|
|
@ -1099,9 +1099,9 @@ static int ata_scsi_dev_config(struct scsi_device *sdev,
|
|||
struct request_queue *q = sdev->request_queue;
|
||||
void *buf;
|
||||
|
||||
/* set the min alignment and padding */
|
||||
blk_queue_update_dma_alignment(sdev->request_queue,
|
||||
ATA_DMA_PAD_SZ - 1);
|
||||
sdev->sector_size = ATA_SECT_SIZE;
|
||||
|
||||
/* set DMA padding */
|
||||
blk_queue_update_dma_pad(sdev->request_queue,
|
||||
ATA_DMA_PAD_SZ - 1);
|
||||
|
||||
|
@ -1115,13 +1115,25 @@ static int ata_scsi_dev_config(struct scsi_device *sdev,
|
|||
|
||||
blk_queue_dma_drain(q, atapi_drain_needed, buf, ATAPI_MAX_DRAIN);
|
||||
} else {
|
||||
/* ATA devices must be sector aligned */
|
||||
sdev->sector_size = ata_id_logical_sector_size(dev->id);
|
||||
blk_queue_update_dma_alignment(sdev->request_queue,
|
||||
sdev->sector_size - 1);
|
||||
sdev->manage_start_stop = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* ata_pio_sectors() expects buffer for each sector to not cross
|
||||
* page boundary. Enforce it by requiring buffers to be sector
|
||||
* aligned, which works iff sector_size is not larger than
|
||||
* PAGE_SIZE. ATAPI devices also need the alignment as
|
||||
* IDENTIFY_PACKET is executed as ATA_PROT_PIO.
|
||||
*/
|
||||
if (sdev->sector_size > PAGE_SIZE)
|
||||
ata_dev_printk(dev, KERN_WARNING,
|
||||
"sector_size=%u > PAGE_SIZE, PIO may malfunction\n",
|
||||
sdev->sector_size);
|
||||
|
||||
blk_queue_update_dma_alignment(sdev->request_queue,
|
||||
sdev->sector_size - 1);
|
||||
|
||||
if (dev->flags & ATA_DFLAG_AN)
|
||||
set_bit(SDEV_EVT_MEDIA_CHANGE, sdev->supported_events);
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
#include <linux/libata.h>
|
||||
|
||||
#define DRV_NAME "pata_hpt366"
|
||||
#define DRV_VERSION "0.6.9"
|
||||
#define DRV_VERSION "0.6.10"
|
||||
|
||||
struct hpt_clock {
|
||||
u8 xfer_mode;
|
||||
|
@ -160,8 +160,8 @@ static int hpt_dma_blacklisted(const struct ata_device *dev, char *modestr,
|
|||
|
||||
while (list[i] != NULL) {
|
||||
if (!strcmp(list[i], model_num)) {
|
||||
printk(KERN_WARNING DRV_NAME ": %s is not supported for %s.\n",
|
||||
modestr, list[i]);
|
||||
pr_warning(DRV_NAME ": %s is not supported for %s.\n",
|
||||
modestr, list[i]);
|
||||
return 1;
|
||||
}
|
||||
i++;
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
#include <linux/libata.h>
|
||||
|
||||
#define DRV_NAME "pata_hpt37x"
|
||||
#define DRV_VERSION "0.6.18"
|
||||
#define DRV_VERSION "0.6.22"
|
||||
|
||||
struct hpt_clock {
|
||||
u8 xfer_speed;
|
||||
|
@ -229,8 +229,8 @@ static int hpt_dma_blacklisted(const struct ata_device *dev, char *modestr,
|
|||
|
||||
while (list[i] != NULL) {
|
||||
if (!strcmp(list[i], model_num)) {
|
||||
printk(KERN_WARNING DRV_NAME ": %s is not supported for %s.\n",
|
||||
modestr, list[i]);
|
||||
pr_warning(DRV_NAME ": %s is not supported for %s.\n",
|
||||
modestr, list[i]);
|
||||
return 1;
|
||||
}
|
||||
i++;
|
||||
|
@ -642,7 +642,6 @@ static struct ata_port_operations hpt372_port_ops = {
|
|||
static struct ata_port_operations hpt374_fn1_port_ops = {
|
||||
.inherits = &hpt372_port_ops,
|
||||
.cable_detect = hpt374_fn1_cable_detect,
|
||||
.prereset = hpt37x_pre_reset,
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -803,7 +802,7 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
|||
.udma_mask = ATA_UDMA6,
|
||||
.port_ops = &hpt302_port_ops
|
||||
};
|
||||
/* HPT374 - UDMA100, function 1 uses different prereset method */
|
||||
/* HPT374 - UDMA100, function 1 uses different cable_detect method */
|
||||
static const struct ata_port_info info_hpt374_fn0 = {
|
||||
.flags = ATA_FLAG_SLAVE_POSS,
|
||||
.pio_mask = ATA_PIO4,
|
||||
|
@ -838,7 +837,8 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
|||
if (rc)
|
||||
return rc;
|
||||
|
||||
if (dev->device == PCI_DEVICE_ID_TTI_HPT366) {
|
||||
switch (dev->device) {
|
||||
case PCI_DEVICE_ID_TTI_HPT366:
|
||||
/* May be a later chip in disguise. Check */
|
||||
/* Older chips are in the HPT366 driver. Ignore them */
|
||||
if (rev < 3)
|
||||
|
@ -863,54 +863,50 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
|||
chip_table = &hpt372;
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR "pata_hpt37x: Unknown HPT366 subtype, "
|
||||
pr_err(DRV_NAME ": Unknown HPT366 subtype, "
|
||||
"please report (%d).\n", rev);
|
||||
return -ENODEV;
|
||||
}
|
||||
} else {
|
||||
switch (dev->device) {
|
||||
case PCI_DEVICE_ID_TTI_HPT372:
|
||||
/* 372N if rev >= 2 */
|
||||
if (rev >= 2)
|
||||
return -ENODEV;
|
||||
ppi[0] = &info_hpt372;
|
||||
chip_table = &hpt372a;
|
||||
break;
|
||||
case PCI_DEVICE_ID_TTI_HPT302:
|
||||
/* 302N if rev > 1 */
|
||||
if (rev > 1)
|
||||
return -ENODEV;
|
||||
ppi[0] = &info_hpt302;
|
||||
/* Check this */
|
||||
chip_table = &hpt302;
|
||||
break;
|
||||
case PCI_DEVICE_ID_TTI_HPT371:
|
||||
if (rev > 1)
|
||||
return -ENODEV;
|
||||
ppi[0] = &info_hpt302;
|
||||
chip_table = &hpt371;
|
||||
/*
|
||||
* Single channel device, master is not present
|
||||
* but the BIOS (or us for non x86) must mark it
|
||||
* absent
|
||||
*/
|
||||
pci_read_config_byte(dev, 0x50, &mcr1);
|
||||
mcr1 &= ~0x04;
|
||||
pci_write_config_byte(dev, 0x50, mcr1);
|
||||
break;
|
||||
case PCI_DEVICE_ID_TTI_HPT374:
|
||||
chip_table = &hpt374;
|
||||
if (!(PCI_FUNC(dev->devfn) & 1))
|
||||
*ppi = &info_hpt374_fn0;
|
||||
else
|
||||
*ppi = &info_hpt374_fn1;
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR
|
||||
"pata_hpt37x: PCI table is bogus, please report (%d).\n",
|
||||
dev->device);
|
||||
return -ENODEV;
|
||||
}
|
||||
break;
|
||||
case PCI_DEVICE_ID_TTI_HPT372:
|
||||
/* 372N if rev >= 2 */
|
||||
if (rev >= 2)
|
||||
return -ENODEV;
|
||||
ppi[0] = &info_hpt372;
|
||||
chip_table = &hpt372a;
|
||||
break;
|
||||
case PCI_DEVICE_ID_TTI_HPT302:
|
||||
/* 302N if rev > 1 */
|
||||
if (rev > 1)
|
||||
return -ENODEV;
|
||||
ppi[0] = &info_hpt302;
|
||||
/* Check this */
|
||||
chip_table = &hpt302;
|
||||
break;
|
||||
case PCI_DEVICE_ID_TTI_HPT371:
|
||||
if (rev > 1)
|
||||
return -ENODEV;
|
||||
ppi[0] = &info_hpt302;
|
||||
chip_table = &hpt371;
|
||||
/*
|
||||
* Single channel device, master is not present but the BIOS
|
||||
* (or us for non x86) must mark it absent
|
||||
*/
|
||||
pci_read_config_byte(dev, 0x50, &mcr1);
|
||||
mcr1 &= ~0x04;
|
||||
pci_write_config_byte(dev, 0x50, mcr1);
|
||||
break;
|
||||
case PCI_DEVICE_ID_TTI_HPT374:
|
||||
chip_table = &hpt374;
|
||||
if (!(PCI_FUNC(dev->devfn) & 1))
|
||||
*ppi = &info_hpt374_fn0;
|
||||
else
|
||||
*ppi = &info_hpt374_fn1;
|
||||
break;
|
||||
default:
|
||||
pr_err(DRV_NAME ": PCI table is bogus, please report (%d).\n",
|
||||
dev->device);
|
||||
return -ENODEV;
|
||||
}
|
||||
/* Ok so this is a chip we support */
|
||||
|
||||
|
@ -957,8 +953,7 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
|||
u8 sr;
|
||||
u32 total = 0;
|
||||
|
||||
printk(KERN_WARNING
|
||||
"pata_hpt37x: BIOS has not set timing clocks.\n");
|
||||
pr_warning(DRV_NAME ": BIOS has not set timing clocks.\n");
|
||||
|
||||
/* This is the process the HPT371 BIOS is reported to use */
|
||||
for (i = 0; i < 128; i++) {
|
||||
|
@ -1014,7 +1009,7 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
|||
(f_high << 16) | f_low | 0x100);
|
||||
}
|
||||
if (adjust == 8) {
|
||||
printk(KERN_ERR "pata_hpt37x: DPLL did not stabilize!\n");
|
||||
pr_err(DRV_NAME ": DPLL did not stabilize!\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
if (dpll == 3)
|
||||
|
@ -1022,8 +1017,8 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
|||
else
|
||||
private_data = (void *)hpt37x_timings_50;
|
||||
|
||||
printk(KERN_INFO "pata_hpt37x: bus clock %dMHz, using %dMHz DPLL.\n",
|
||||
MHz[clock_slot], MHz[dpll]);
|
||||
pr_info(DRV_NAME ": bus clock %dMHz, using %dMHz DPLL.\n",
|
||||
MHz[clock_slot], MHz[dpll]);
|
||||
} else {
|
||||
private_data = (void *)chip_table->clocks[clock_slot];
|
||||
/*
|
||||
|
@ -1036,8 +1031,9 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
|||
ppi[0] = &info_hpt370_33;
|
||||
if (clock_slot < 2 && ppi[0] == &info_hpt370a)
|
||||
ppi[0] = &info_hpt370a_33;
|
||||
printk(KERN_INFO "pata_hpt37x: %s using %dMHz bus clock.\n",
|
||||
chip_table->name, MHz[clock_slot]);
|
||||
|
||||
pr_info(DRV_NAME ": %s using %dMHz bus clock.\n",
|
||||
chip_table->name, MHz[clock_slot]);
|
||||
}
|
||||
|
||||
/* Now kick off ATA set up */
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
#include <linux/libata.h>
|
||||
|
||||
#define DRV_NAME "pata_hpt3x2n"
|
||||
#define DRV_VERSION "0.3.13"
|
||||
#define DRV_VERSION "0.3.14"
|
||||
|
||||
enum {
|
||||
HPT_PCI_FAST = (1 << 31),
|
||||
|
@ -418,7 +418,7 @@ static int hpt3x2n_pci_clock(struct pci_dev *pdev)
|
|||
u16 sr;
|
||||
u32 total = 0;
|
||||
|
||||
printk(KERN_WARNING "pata_hpt3x2n: BIOS clock data not set.\n");
|
||||
pr_warning(DRV_NAME ": BIOS clock data not set.\n");
|
||||
|
||||
/* This is the process the HPT371 BIOS is reported to use */
|
||||
for (i = 0; i < 128; i++) {
|
||||
|
@ -528,8 +528,7 @@ hpt372n:
|
|||
ppi[0] = &info_hpt372n;
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR
|
||||
"pata_hpt3x2n: PCI table is bogus please report (%d).\n",
|
||||
pr_err(DRV_NAME ": PCI table is bogus, please report (%d).\n",
|
||||
dev->device);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
@ -579,12 +578,11 @@ hpt372n:
|
|||
pci_write_config_dword(dev, 0x5C, (f_high << 16) | f_low);
|
||||
}
|
||||
if (adjust == 8) {
|
||||
printk(KERN_ERR "pata_hpt3x2n: DPLL did not stabilize!\n");
|
||||
pr_err(DRV_NAME ": DPLL did not stabilize!\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
printk(KERN_INFO "pata_hpt37x: bus clock %dMHz, using 66MHz DPLL.\n",
|
||||
pci_mhz);
|
||||
pr_info(DRV_NAME ": bus clock %dMHz, using 66MHz DPLL.\n", pci_mhz);
|
||||
|
||||
/*
|
||||
* Set our private data up. We only need a few flags
|
||||
|
|
|
@ -610,7 +610,7 @@ static struct scsi_host_template mpc52xx_ata_sht = {
|
|||
};
|
||||
|
||||
static struct ata_port_operations mpc52xx_ata_port_ops = {
|
||||
.inherits = &ata_sff_port_ops,
|
||||
.inherits = &ata_bmdma_port_ops,
|
||||
.sff_dev_select = mpc52xx_ata_dev_select,
|
||||
.set_piomode = mpc52xx_ata_set_piomode,
|
||||
.set_dmamode = mpc52xx_ata_set_dmamode,
|
||||
|
|
|
@ -50,7 +50,7 @@ config AGP_ATI
|
|||
|
||||
config AGP_AMD
|
||||
tristate "AMD Irongate, 761, and 762 chipset support"
|
||||
depends on AGP && (X86_32 || ALPHA)
|
||||
depends on AGP && X86_32
|
||||
help
|
||||
This option gives you AGP support for the GLX component of
|
||||
X on AMD Irongate, 761, and 762 chipsets.
|
||||
|
|
|
@ -41,22 +41,8 @@ static int amd_create_page_map(struct amd_page_map *page_map)
|
|||
if (page_map->real == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
#ifndef CONFIG_X86
|
||||
SetPageReserved(virt_to_page(page_map->real));
|
||||
global_cache_flush();
|
||||
page_map->remapped = ioremap_nocache(virt_to_phys(page_map->real),
|
||||
PAGE_SIZE);
|
||||
if (page_map->remapped == NULL) {
|
||||
ClearPageReserved(virt_to_page(page_map->real));
|
||||
free_page((unsigned long) page_map->real);
|
||||
page_map->real = NULL;
|
||||
return -ENOMEM;
|
||||
}
|
||||
global_cache_flush();
|
||||
#else
|
||||
set_memory_uc((unsigned long)page_map->real, 1);
|
||||
page_map->remapped = page_map->real;
|
||||
#endif
|
||||
|
||||
for (i = 0; i < PAGE_SIZE / sizeof(unsigned long); i++) {
|
||||
writel(agp_bridge->scratch_page, page_map->remapped+i);
|
||||
|
@ -68,12 +54,7 @@ static int amd_create_page_map(struct amd_page_map *page_map)
|
|||
|
||||
static void amd_free_page_map(struct amd_page_map *page_map)
|
||||
{
|
||||
#ifndef CONFIG_X86
|
||||
iounmap(page_map->remapped);
|
||||
ClearPageReserved(virt_to_page(page_map->real));
|
||||
#else
|
||||
set_memory_wb((unsigned long)page_map->real, 1);
|
||||
#endif
|
||||
free_page((unsigned long) page_map->real);
|
||||
}
|
||||
|
||||
|
|
|
@ -773,21 +773,15 @@ static int __devinit agp_intel_probe(struct pci_dev *pdev,
|
|||
|
||||
dev_info(&pdev->dev, "Intel %s Chipset\n", intel_agp_chipsets[i].name);
|
||||
|
||||
/*
|
||||
* If the device has not been properly setup, the following will catch
|
||||
* the problem and should stop the system from crashing.
|
||||
* 20030610 - hamish@zot.org
|
||||
*/
|
||||
if (pci_enable_device(pdev)) {
|
||||
dev_err(&pdev->dev, "can't enable PCI device\n");
|
||||
agp_put_bridge(bridge);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/*
|
||||
* The following fixes the case where the BIOS has "forgotten" to
|
||||
* provide an address range for the GART.
|
||||
* 20030610 - hamish@zot.org
|
||||
* This happens before pci_enable_device() intentionally;
|
||||
* calling pci_enable_device() before assigning the resource
|
||||
* will result in the GART being disabled on machines with such
|
||||
* BIOSs (the GART ends up with a BAR starting at 0, which
|
||||
* conflicts a lot of other devices).
|
||||
*/
|
||||
r = &pdev->resource[0];
|
||||
if (!r->start && r->end) {
|
||||
|
@ -798,6 +792,17 @@ static int __devinit agp_intel_probe(struct pci_dev *pdev,
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If the device has not been properly setup, the following will catch
|
||||
* the problem and should stop the system from crashing.
|
||||
* 20030610 - hamish@zot.org
|
||||
*/
|
||||
if (pci_enable_device(pdev)) {
|
||||
dev_err(&pdev->dev, "can't enable PCI device\n");
|
||||
agp_put_bridge(bridge);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* Fill in the mode register */
|
||||
if (cap_ptr) {
|
||||
pci_read_config_dword(pdev,
|
||||
|
|
|
@ -2674,3 +2674,23 @@ out:
|
|||
mutex_unlock(&dev->mode_config.mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void drm_mode_config_reset(struct drm_device *dev)
|
||||
{
|
||||
struct drm_crtc *crtc;
|
||||
struct drm_encoder *encoder;
|
||||
struct drm_connector *connector;
|
||||
|
||||
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
|
||||
if (crtc->funcs->reset)
|
||||
crtc->funcs->reset(crtc);
|
||||
|
||||
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head)
|
||||
if (encoder->funcs->reset)
|
||||
encoder->funcs->reset(encoder);
|
||||
|
||||
list_for_each_entry(connector, &dev->mode_config.connector_list, head)
|
||||
if (connector->funcs->reset)
|
||||
connector->funcs->reset(connector);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_mode_config_reset);
|
||||
|
|
|
@ -343,13 +343,12 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
|
|||
struct drm_encoder *encoder;
|
||||
bool ret = true;
|
||||
|
||||
adjusted_mode = drm_mode_duplicate(dev, mode);
|
||||
|
||||
crtc->enabled = drm_helper_crtc_in_use(crtc);
|
||||
|
||||
if (!crtc->enabled)
|
||||
return true;
|
||||
|
||||
adjusted_mode = drm_mode_duplicate(dev, mode);
|
||||
|
||||
saved_hwmode = crtc->hwmode;
|
||||
saved_mode = crtc->mode;
|
||||
saved_x = crtc->x;
|
||||
|
@ -437,10 +436,9 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
|
|||
*/
|
||||
drm_calc_timestamping_constants(crtc);
|
||||
|
||||
/* XXX free adjustedmode */
|
||||
drm_mode_destroy(dev, adjusted_mode);
|
||||
/* FIXME: add subpixel order */
|
||||
done:
|
||||
drm_mode_destroy(dev, adjusted_mode);
|
||||
if (!ret) {
|
||||
crtc->hwmode = saved_hwmode;
|
||||
crtc->mode = saved_mode;
|
||||
|
@ -497,14 +495,17 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
|
|||
|
||||
crtc_funcs = set->crtc->helper_private;
|
||||
|
||||
if (!set->mode)
|
||||
set->fb = NULL;
|
||||
|
||||
if (set->fb) {
|
||||
DRM_DEBUG_KMS("[CRTC:%d] [FB:%d] #connectors=%d (x y) (%i %i)\n",
|
||||
set->crtc->base.id, set->fb->base.id,
|
||||
(int)set->num_connectors, set->x, set->y);
|
||||
} else {
|
||||
DRM_DEBUG_KMS("[CRTC:%d] [NOFB] #connectors=%d (x y) (%i %i)\n",
|
||||
set->crtc->base.id, (int)set->num_connectors,
|
||||
set->x, set->y);
|
||||
DRM_DEBUG_KMS("[CRTC:%d] [NOFB]\n", set->crtc->base.id);
|
||||
set->mode = NULL;
|
||||
set->num_connectors = 0;
|
||||
}
|
||||
|
||||
dev = set->crtc->dev;
|
||||
|
@ -649,8 +650,8 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
|
|||
mode_changed = true;
|
||||
|
||||
if (mode_changed) {
|
||||
set->crtc->enabled = (set->mode != NULL);
|
||||
if (set->mode != NULL) {
|
||||
set->crtc->enabled = drm_helper_crtc_in_use(set->crtc);
|
||||
if (set->crtc->enabled) {
|
||||
DRM_DEBUG_KMS("attempting to set mode from"
|
||||
" userspace\n");
|
||||
drm_mode_debug_printmodeline(set->mode);
|
||||
|
@ -665,6 +666,12 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
|
|||
ret = -EINVAL;
|
||||
goto fail;
|
||||
}
|
||||
DRM_DEBUG_KMS("Setting connector DPMS state to on\n");
|
||||
for (i = 0; i < set->num_connectors; i++) {
|
||||
DRM_DEBUG_KMS("\t[CONNECTOR:%d:%s] set DPMS on\n", set->connectors[i]->base.id,
|
||||
drm_get_connector_name(set->connectors[i]));
|
||||
set->connectors[i]->dpms = DRM_MODE_DPMS_ON;
|
||||
}
|
||||
}
|
||||
drm_helper_disable_unused_functions(dev);
|
||||
} else if (fb_changed) {
|
||||
|
@ -681,12 +688,6 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
|
|||
goto fail;
|
||||
}
|
||||
}
|
||||
DRM_DEBUG_KMS("Setting connector DPMS state to on\n");
|
||||
for (i = 0; i < set->num_connectors; i++) {
|
||||
DRM_DEBUG_KMS("\t[CONNECTOR:%d:%s] set DPMS on\n", set->connectors[i]->base.id,
|
||||
drm_get_connector_name(set->connectors[i]));
|
||||
set->connectors[i]->dpms = DRM_MODE_DPMS_ON;
|
||||
}
|
||||
|
||||
kfree(save_connectors);
|
||||
kfree(save_encoders);
|
||||
|
|
|
@ -1250,7 +1250,7 @@ void drm_handle_vblank_events(struct drm_device *dev, int crtc)
|
|||
* Drivers should call this routine in their vblank interrupt handlers to
|
||||
* update the vblank counter and send any signals that may be pending.
|
||||
*/
|
||||
void drm_handle_vblank(struct drm_device *dev, int crtc)
|
||||
bool drm_handle_vblank(struct drm_device *dev, int crtc)
|
||||
{
|
||||
u32 vblcount;
|
||||
s64 diff_ns;
|
||||
|
@ -1258,7 +1258,7 @@ void drm_handle_vblank(struct drm_device *dev, int crtc)
|
|||
unsigned long irqflags;
|
||||
|
||||
if (!dev->num_crtcs)
|
||||
return;
|
||||
return false;
|
||||
|
||||
/* Need timestamp lock to prevent concurrent execution with
|
||||
* vblank enable/disable, as this would cause inconsistent
|
||||
|
@ -1269,7 +1269,7 @@ void drm_handle_vblank(struct drm_device *dev, int crtc)
|
|||
/* Vblank irq handling disabled. Nothing to do. */
|
||||
if (!dev->vblank_enabled[crtc]) {
|
||||
spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Fetch corresponding timestamp for this vblank interval from
|
||||
|
@ -1311,5 +1311,6 @@ void drm_handle_vblank(struct drm_device *dev, int crtc)
|
|||
drm_handle_vblank_events(dev, crtc);
|
||||
|
||||
spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags);
|
||||
return true;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_handle_vblank);
|
||||
|
|
|
@ -354,6 +354,7 @@ static int i915_drm_thaw(struct drm_device *dev)
|
|||
error = i915_gem_init_ringbuffer(dev);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
|
||||
drm_mode_config_reset(dev);
|
||||
drm_irq_install(dev);
|
||||
|
||||
/* Resume the modeset for every activated CRTC */
|
||||
|
@ -542,6 +543,7 @@ int i915_reset(struct drm_device *dev, u8 flags)
|
|||
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
drm_irq_uninstall(dev);
|
||||
drm_mode_config_reset(dev);
|
||||
drm_irq_install(dev);
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
}
|
||||
|
@ -566,6 +568,14 @@ int i915_reset(struct drm_device *dev, u8 flags)
|
|||
static int __devinit
|
||||
i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
{
|
||||
/* Only bind to function 0 of the device. Early generations
|
||||
* used function 1 as a placeholder for multi-head. This causes
|
||||
* us confusion instead, especially on the systems where both
|
||||
* functions have the same PCI-ID!
|
||||
*/
|
||||
if (PCI_FUNC(pdev->devfn))
|
||||
return -ENODEV;
|
||||
|
||||
return drm_get_pci_dev(pdev, ent, &driver);
|
||||
}
|
||||
|
||||
|
|
|
@ -1196,18 +1196,18 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)
|
|||
intel_finish_page_flip_plane(dev, 1);
|
||||
}
|
||||
|
||||
if (pipea_stats & vblank_status) {
|
||||
if (pipea_stats & vblank_status &&
|
||||
drm_handle_vblank(dev, 0)) {
|
||||
vblank++;
|
||||
drm_handle_vblank(dev, 0);
|
||||
if (!dev_priv->flip_pending_is_done) {
|
||||
i915_pageflip_stall_check(dev, 0);
|
||||
intel_finish_page_flip(dev, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (pipeb_stats & vblank_status) {
|
||||
if (pipeb_stats & vblank_status &&
|
||||
drm_handle_vblank(dev, 1)) {
|
||||
vblank++;
|
||||
drm_handle_vblank(dev, 1);
|
||||
if (!dev_priv->flip_pending_is_done) {
|
||||
i915_pageflip_stall_check(dev, 1);
|
||||
intel_finish_page_flip(dev, 1);
|
||||
|
|
|
@ -535,6 +535,15 @@ static int intel_crt_set_property(struct drm_connector *connector,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void intel_crt_reset(struct drm_connector *connector)
|
||||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct intel_crt *crt = intel_attached_crt(connector);
|
||||
|
||||
if (HAS_PCH_SPLIT(dev))
|
||||
crt->force_hotplug_required = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Routines for controlling stuff on the analog port
|
||||
*/
|
||||
|
@ -548,6 +557,7 @@ static const struct drm_encoder_helper_funcs intel_crt_helper_funcs = {
|
|||
};
|
||||
|
||||
static const struct drm_connector_funcs intel_crt_connector_funcs = {
|
||||
.reset = intel_crt_reset,
|
||||
.dpms = drm_helper_connector_dpms,
|
||||
.detect = intel_crt_detect,
|
||||
.fill_modes = drm_helper_probe_single_connector_modes,
|
||||
|
|
|
@ -5551,6 +5551,18 @@ cleanup_work:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void intel_crtc_reset(struct drm_crtc *crtc)
|
||||
{
|
||||
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
||||
|
||||
/* Reset flags back to the 'unknown' status so that they
|
||||
* will be correctly set on the initial modeset.
|
||||
*/
|
||||
intel_crtc->cursor_addr = 0;
|
||||
intel_crtc->dpms_mode = -1;
|
||||
intel_crtc->active = true; /* force the pipe off on setup_init_config */
|
||||
}
|
||||
|
||||
static struct drm_crtc_helper_funcs intel_helper_funcs = {
|
||||
.dpms = intel_crtc_dpms,
|
||||
.mode_fixup = intel_crtc_mode_fixup,
|
||||
|
@ -5562,6 +5574,7 @@ static struct drm_crtc_helper_funcs intel_helper_funcs = {
|
|||
};
|
||||
|
||||
static const struct drm_crtc_funcs intel_crtc_funcs = {
|
||||
.reset = intel_crtc_reset,
|
||||
.cursor_set = intel_crtc_cursor_set,
|
||||
.cursor_move = intel_crtc_cursor_move,
|
||||
.gamma_set = intel_crtc_gamma_set,
|
||||
|
@ -5652,9 +5665,7 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
|
|||
dev_priv->plane_to_crtc_mapping[intel_crtc->plane] = &intel_crtc->base;
|
||||
dev_priv->pipe_to_crtc_mapping[intel_crtc->pipe] = &intel_crtc->base;
|
||||
|
||||
intel_crtc->cursor_addr = 0;
|
||||
intel_crtc->dpms_mode = -1;
|
||||
intel_crtc->active = true; /* force the pipe off on setup_init_config */
|
||||
intel_crtc_reset(&intel_crtc->base);
|
||||
|
||||
if (HAS_PCH_SPLIT(dev)) {
|
||||
intel_helper_funcs.prepare = ironlake_crtc_prepare;
|
||||
|
|
|
@ -473,20 +473,6 @@ static bool intel_sdvo_write_cmd(struct intel_sdvo *intel_sdvo, u8 cmd,
|
|||
return false;
|
||||
}
|
||||
|
||||
i = 3;
|
||||
while (status == SDVO_CMD_STATUS_PENDING && i--) {
|
||||
if (!intel_sdvo_read_byte(intel_sdvo,
|
||||
SDVO_I2C_CMD_STATUS,
|
||||
&status))
|
||||
return false;
|
||||
}
|
||||
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
||||
DRM_DEBUG_KMS("command returns response %s [%d]\n",
|
||||
status <= SDVO_CMD_STATUS_SCALING_NOT_SUPP ? cmd_status_names[status] : "???",
|
||||
status);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -497,6 +483,8 @@ static bool intel_sdvo_read_response(struct intel_sdvo *intel_sdvo,
|
|||
u8 status;
|
||||
int i;
|
||||
|
||||
DRM_DEBUG_KMS("%s: R: ", SDVO_NAME(intel_sdvo));
|
||||
|
||||
/*
|
||||
* The documentation states that all commands will be
|
||||
* processed within 15µs, and that we need only poll
|
||||
|
@ -505,14 +493,19 @@ static bool intel_sdvo_read_response(struct intel_sdvo *intel_sdvo,
|
|||
*
|
||||
* Check 5 times in case the hardware failed to read the docs.
|
||||
*/
|
||||
do {
|
||||
if (!intel_sdvo_read_byte(intel_sdvo,
|
||||
SDVO_I2C_CMD_STATUS,
|
||||
&status))
|
||||
goto log_fail;
|
||||
|
||||
while (status == SDVO_CMD_STATUS_PENDING && retry--) {
|
||||
udelay(15);
|
||||
if (!intel_sdvo_read_byte(intel_sdvo,
|
||||
SDVO_I2C_CMD_STATUS,
|
||||
&status))
|
||||
return false;
|
||||
} while (status == SDVO_CMD_STATUS_PENDING && --retry);
|
||||
goto log_fail;
|
||||
}
|
||||
|
||||
DRM_DEBUG_KMS("%s: R: ", SDVO_NAME(intel_sdvo));
|
||||
if (status <= SDVO_CMD_STATUS_SCALING_NOT_SUPP)
|
||||
DRM_LOG_KMS("(%s)", cmd_status_names[status]);
|
||||
else
|
||||
|
@ -533,7 +526,7 @@ static bool intel_sdvo_read_response(struct intel_sdvo *intel_sdvo,
|
|||
return true;
|
||||
|
||||
log_fail:
|
||||
DRM_LOG_KMS("\n");
|
||||
DRM_LOG_KMS("... failed\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -550,6 +543,7 @@ static int intel_sdvo_get_pixel_multiplier(struct drm_display_mode *mode)
|
|||
static bool intel_sdvo_set_control_bus_switch(struct intel_sdvo *intel_sdvo,
|
||||
u8 ddc_bus)
|
||||
{
|
||||
/* This must be the immediately preceding write before the i2c xfer */
|
||||
return intel_sdvo_write_cmd(intel_sdvo,
|
||||
SDVO_CMD_SET_CONTROL_BUS_SWITCH,
|
||||
&ddc_bus, 1);
|
||||
|
@ -557,7 +551,10 @@ static bool intel_sdvo_set_control_bus_switch(struct intel_sdvo *intel_sdvo,
|
|||
|
||||
static bool intel_sdvo_set_value(struct intel_sdvo *intel_sdvo, u8 cmd, const void *data, int len)
|
||||
{
|
||||
return intel_sdvo_write_cmd(intel_sdvo, cmd, data, len);
|
||||
if (!intel_sdvo_write_cmd(intel_sdvo, cmd, data, len))
|
||||
return false;
|
||||
|
||||
return intel_sdvo_read_response(intel_sdvo, NULL, 0);
|
||||
}
|
||||
|
||||
static bool
|
||||
|
@ -859,18 +856,21 @@ static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo)
|
|||
|
||||
intel_dip_infoframe_csum(&avi_if);
|
||||
|
||||
if (!intel_sdvo_write_cmd(intel_sdvo, SDVO_CMD_SET_HBUF_INDEX,
|
||||
if (!intel_sdvo_set_value(intel_sdvo,
|
||||
SDVO_CMD_SET_HBUF_INDEX,
|
||||
set_buf_index, 2))
|
||||
return false;
|
||||
|
||||
for (i = 0; i < sizeof(avi_if); i += 8) {
|
||||
if (!intel_sdvo_write_cmd(intel_sdvo, SDVO_CMD_SET_HBUF_DATA,
|
||||
if (!intel_sdvo_set_value(intel_sdvo,
|
||||
SDVO_CMD_SET_HBUF_DATA,
|
||||
data, 8))
|
||||
return false;
|
||||
data++;
|
||||
}
|
||||
|
||||
return intel_sdvo_write_cmd(intel_sdvo, SDVO_CMD_SET_HBUF_TXRATE,
|
||||
return intel_sdvo_set_value(intel_sdvo,
|
||||
SDVO_CMD_SET_HBUF_TXRATE,
|
||||
&tx_rate, 1);
|
||||
}
|
||||
|
||||
|
|
|
@ -443,7 +443,7 @@ nouveau_hwmon_fini(struct drm_device *dev)
|
|||
struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
|
||||
|
||||
if (pm->hwmon) {
|
||||
sysfs_remove_group(&pm->hwmon->kobj, &hwmon_attrgroup);
|
||||
sysfs_remove_group(&dev->pdev->dev.kobj, &hwmon_attrgroup);
|
||||
hwmon_device_unregister(pm->hwmon);
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -283,8 +283,7 @@ nv50_evo_create(struct drm_device *dev)
|
|||
nv50_evo_channel_del(&dev_priv->evo);
|
||||
return ret;
|
||||
}
|
||||
} else
|
||||
if (dev_priv->chipset != 0x50) {
|
||||
} else {
|
||||
ret = nv50_evo_dmaobj_new(evo, 0x3d, NvEvoFB16, 0x70, 0x19,
|
||||
0, 0xffffffff, 0x00010000);
|
||||
if (ret) {
|
||||
|
|
|
@ -555,6 +555,7 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
|
|||
dp_clock = dig_connector->dp_clock;
|
||||
}
|
||||
}
|
||||
/* this might work properly with the new pll algo */
|
||||
#if 0 /* doesn't work properly on some laptops */
|
||||
/* use recommended ref_div for ss */
|
||||
if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
|
||||
|
@ -572,6 +573,11 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
|
|||
adjusted_clock = mode->clock * 2;
|
||||
if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
|
||||
pll->flags |= RADEON_PLL_PREFER_CLOSEST_LOWER;
|
||||
/* rv515 needs more testing with this option */
|
||||
if (rdev->family != CHIP_RV515) {
|
||||
if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
|
||||
pll->flags |= RADEON_PLL_IS_LCD;
|
||||
}
|
||||
} else {
|
||||
if (encoder->encoder_type != DRM_MODE_ENCODER_DAC)
|
||||
pll->flags |= RADEON_PLL_NO_ODD_POST_DIV;
|
||||
|
@ -951,8 +957,16 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode
|
|||
/* adjust pixel clock as needed */
|
||||
adjusted_clock = atombios_adjust_pll(crtc, mode, pll, ss_enabled, &ss);
|
||||
|
||||
radeon_compute_pll(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div,
|
||||
&ref_div, &post_div);
|
||||
/* rv515 seems happier with the old algo */
|
||||
if (rdev->family == CHIP_RV515)
|
||||
radeon_compute_pll_legacy(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div,
|
||||
&ref_div, &post_div);
|
||||
else if (ASIC_IS_AVIVO(rdev))
|
||||
radeon_compute_pll_avivo(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div,
|
||||
&ref_div, &post_div);
|
||||
else
|
||||
radeon_compute_pll_legacy(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div,
|
||||
&ref_div, &post_div);
|
||||
|
||||
atombios_crtc_program_ss(crtc, ATOM_DISABLE, radeon_crtc->pll_id, &ss);
|
||||
|
||||
|
|
|
@ -97,26 +97,29 @@ u32 evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
|
|||
}
|
||||
|
||||
/* get temperature in millidegrees */
|
||||
u32 evergreen_get_temp(struct radeon_device *rdev)
|
||||
int evergreen_get_temp(struct radeon_device *rdev)
|
||||
{
|
||||
u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >>
|
||||
ASIC_T_SHIFT;
|
||||
u32 actual_temp = 0;
|
||||
|
||||
if ((temp >> 10) & 1)
|
||||
actual_temp = 0;
|
||||
else if ((temp >> 9) & 1)
|
||||
if (temp & 0x400)
|
||||
actual_temp = -256;
|
||||
else if (temp & 0x200)
|
||||
actual_temp = 255;
|
||||
else
|
||||
actual_temp = (temp >> 1) & 0xff;
|
||||
else if (temp & 0x100) {
|
||||
actual_temp = temp & 0x1ff;
|
||||
actual_temp |= ~0x1ff;
|
||||
} else
|
||||
actual_temp = temp & 0xff;
|
||||
|
||||
return actual_temp * 1000;
|
||||
return (actual_temp * 1000) / 2;
|
||||
}
|
||||
|
||||
u32 sumo_get_temp(struct radeon_device *rdev)
|
||||
int sumo_get_temp(struct radeon_device *rdev)
|
||||
{
|
||||
u32 temp = RREG32(CG_THERMAL_STATUS) & 0xff;
|
||||
u32 actual_temp = (temp >> 1) & 0xff;
|
||||
int actual_temp = temp - 49;
|
||||
|
||||
return actual_temp * 1000;
|
||||
}
|
||||
|
@ -1182,6 +1185,18 @@ static void evergreen_mc_program(struct radeon_device *rdev)
|
|||
/*
|
||||
* CP.
|
||||
*/
|
||||
void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
|
||||
{
|
||||
/* set to DX10/11 mode */
|
||||
radeon_ring_write(rdev, PACKET3(PACKET3_MODE_CONTROL, 0));
|
||||
radeon_ring_write(rdev, 1);
|
||||
/* FIXME: implement */
|
||||
radeon_ring_write(rdev, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
|
||||
radeon_ring_write(rdev, ib->gpu_addr & 0xFFFFFFFC);
|
||||
radeon_ring_write(rdev, upper_32_bits(ib->gpu_addr) & 0xFF);
|
||||
radeon_ring_write(rdev, ib->length_dw);
|
||||
}
|
||||
|
||||
|
||||
static int evergreen_cp_load_microcode(struct radeon_device *rdev)
|
||||
{
|
||||
|
@ -1233,7 +1248,7 @@ static int evergreen_cp_start(struct radeon_device *rdev)
|
|||
cp_me = 0xff;
|
||||
WREG32(CP_ME_CNTL, cp_me);
|
||||
|
||||
r = radeon_ring_lock(rdev, evergreen_default_size + 15);
|
||||
r = radeon_ring_lock(rdev, evergreen_default_size + 19);
|
||||
if (r) {
|
||||
DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
|
||||
return r;
|
||||
|
@ -1266,6 +1281,11 @@ static int evergreen_cp_start(struct radeon_device *rdev)
|
|||
radeon_ring_write(rdev, 0xffffffff);
|
||||
radeon_ring_write(rdev, 0xffffffff);
|
||||
|
||||
radeon_ring_write(rdev, 0xc0026900);
|
||||
radeon_ring_write(rdev, 0x00000316);
|
||||
radeon_ring_write(rdev, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
|
||||
radeon_ring_write(rdev, 0x00000010); /* */
|
||||
|
||||
radeon_ring_unlock_commit(rdev);
|
||||
|
||||
return 0;
|
||||
|
@ -2072,6 +2092,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
|
|||
WREG32(VGT_CACHE_INVALIDATION, vgt_cache_invalidation);
|
||||
|
||||
WREG32(VGT_GS_VERTEX_REUSE, 16);
|
||||
WREG32(PA_SU_LINE_STIPPLE_VALUE, 0);
|
||||
WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
|
||||
|
||||
WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, 14);
|
||||
|
|
|
@ -232,7 +232,7 @@ draw_auto(struct radeon_device *rdev)
|
|||
|
||||
}
|
||||
|
||||
/* emits 34 */
|
||||
/* emits 36 */
|
||||
static void
|
||||
set_default_state(struct radeon_device *rdev)
|
||||
{
|
||||
|
@ -499,6 +499,10 @@ set_default_state(struct radeon_device *rdev)
|
|||
radeon_ring_write(rdev, 0x00000000);
|
||||
radeon_ring_write(rdev, 0x00000000);
|
||||
|
||||
/* set to DX10/11 mode */
|
||||
radeon_ring_write(rdev, PACKET3(PACKET3_MODE_CONTROL, 0));
|
||||
radeon_ring_write(rdev, 1);
|
||||
|
||||
/* emit an IB pointing at default state */
|
||||
dwords = ALIGN(rdev->r600_blit.state_len, 0x10);
|
||||
gpu_addr = rdev->r600_blit.shader_gpu_addr + rdev->r600_blit.state_offset;
|
||||
|
@ -679,7 +683,7 @@ int evergreen_blit_prepare_copy(struct radeon_device *rdev, int size_bytes)
|
|||
/* calculate number of loops correctly */
|
||||
ring_size = num_loops * dwords_per_loop;
|
||||
/* set default + shaders */
|
||||
ring_size += 50; /* shaders + def state */
|
||||
ring_size += 52; /* shaders + def state */
|
||||
ring_size += 10; /* fence emit for VB IB */
|
||||
ring_size += 5; /* done copy */
|
||||
ring_size += 10; /* fence emit for done copy */
|
||||
|
@ -687,7 +691,7 @@ int evergreen_blit_prepare_copy(struct radeon_device *rdev, int size_bytes)
|
|||
if (r)
|
||||
return r;
|
||||
|
||||
set_default_state(rdev); /* 34 */
|
||||
set_default_state(rdev); /* 36 */
|
||||
set_shaders(rdev); /* 16 */
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -240,6 +240,7 @@
|
|||
#define FORCE_EOV_MAX_CLK_CNT(x) ((x) << 0)
|
||||
#define FORCE_EOV_MAX_REZ_CNT(x) ((x) << 16)
|
||||
#define PA_SC_LINE_STIPPLE 0x28A0C
|
||||
#define PA_SU_LINE_STIPPLE_VALUE 0x8A60
|
||||
#define PA_SC_LINE_STIPPLE_STATE 0x8B10
|
||||
|
||||
#define SCRATCH_REG0 0x8500
|
||||
|
@ -652,6 +653,7 @@
|
|||
#define PACKET3_DISPATCH_DIRECT 0x15
|
||||
#define PACKET3_DISPATCH_INDIRECT 0x16
|
||||
#define PACKET3_INDIRECT_BUFFER_END 0x17
|
||||
#define PACKET3_MODE_CONTROL 0x18
|
||||
#define PACKET3_SET_PREDICATION 0x20
|
||||
#define PACKET3_REG_RMW 0x21
|
||||
#define PACKET3_COND_EXEC 0x22
|
||||
|
|
|
@ -97,12 +97,16 @@ void r600_irq_disable(struct radeon_device *rdev);
|
|||
static void r600_pcie_gen2_enable(struct radeon_device *rdev);
|
||||
|
||||
/* get temperature in millidegrees */
|
||||
u32 rv6xx_get_temp(struct radeon_device *rdev)
|
||||
int rv6xx_get_temp(struct radeon_device *rdev)
|
||||
{
|
||||
u32 temp = (RREG32(CG_THERMAL_STATUS) & ASIC_T_MASK) >>
|
||||
ASIC_T_SHIFT;
|
||||
int actual_temp = temp & 0xff;
|
||||
|
||||
return temp * 1000;
|
||||
if (temp & 0x100)
|
||||
actual_temp -= 256;
|
||||
|
||||
return actual_temp * 1000;
|
||||
}
|
||||
|
||||
void r600_pm_get_dynpm_state(struct radeon_device *rdev)
|
||||
|
|
|
@ -179,10 +179,10 @@ void radeon_combios_get_power_modes(struct radeon_device *rdev);
|
|||
void radeon_atombios_get_power_modes(struct radeon_device *rdev);
|
||||
void radeon_atom_set_voltage(struct radeon_device *rdev, u16 level);
|
||||
void rs690_pm_info(struct radeon_device *rdev);
|
||||
extern u32 rv6xx_get_temp(struct radeon_device *rdev);
|
||||
extern u32 rv770_get_temp(struct radeon_device *rdev);
|
||||
extern u32 evergreen_get_temp(struct radeon_device *rdev);
|
||||
extern u32 sumo_get_temp(struct radeon_device *rdev);
|
||||
extern int rv6xx_get_temp(struct radeon_device *rdev);
|
||||
extern int rv770_get_temp(struct radeon_device *rdev);
|
||||
extern int evergreen_get_temp(struct radeon_device *rdev);
|
||||
extern int sumo_get_temp(struct radeon_device *rdev);
|
||||
|
||||
/*
|
||||
* Fences.
|
||||
|
@ -812,8 +812,7 @@ struct radeon_pm {
|
|||
fixed20_12 sclk;
|
||||
fixed20_12 mclk;
|
||||
fixed20_12 needed_bandwidth;
|
||||
/* XXX: use a define for num power modes */
|
||||
struct radeon_power_state power_state[8];
|
||||
struct radeon_power_state *power_state;
|
||||
/* number of valid power states */
|
||||
int num_power_states;
|
||||
int current_power_state_index;
|
||||
|
|
|
@ -759,7 +759,7 @@ static struct radeon_asic evergreen_asic = {
|
|||
.gart_tlb_flush = &evergreen_pcie_gart_tlb_flush,
|
||||
.gart_set_page = &rs600_gart_set_page,
|
||||
.ring_test = &r600_ring_test,
|
||||
.ring_ib_execute = &r600_ring_ib_execute,
|
||||
.ring_ib_execute = &evergreen_ring_ib_execute,
|
||||
.irq_set = &evergreen_irq_set,
|
||||
.irq_process = &evergreen_irq_process,
|
||||
.get_vblank_counter = &evergreen_get_vblank_counter,
|
||||
|
@ -805,7 +805,7 @@ static struct radeon_asic sumo_asic = {
|
|||
.gart_tlb_flush = &evergreen_pcie_gart_tlb_flush,
|
||||
.gart_set_page = &rs600_gart_set_page,
|
||||
.ring_test = &r600_ring_test,
|
||||
.ring_ib_execute = &r600_ring_ib_execute,
|
||||
.ring_ib_execute = &evergreen_ring_ib_execute,
|
||||
.irq_set = &evergreen_irq_set,
|
||||
.irq_process = &evergreen_irq_process,
|
||||
.get_vblank_counter = &evergreen_get_vblank_counter,
|
||||
|
@ -848,7 +848,7 @@ static struct radeon_asic btc_asic = {
|
|||
.gart_tlb_flush = &evergreen_pcie_gart_tlb_flush,
|
||||
.gart_set_page = &rs600_gart_set_page,
|
||||
.ring_test = &r600_ring_test,
|
||||
.ring_ib_execute = &r600_ring_ib_execute,
|
||||
.ring_ib_execute = &evergreen_ring_ib_execute,
|
||||
.irq_set = &evergreen_irq_set,
|
||||
.irq_process = &evergreen_irq_process,
|
||||
.get_vblank_counter = &evergreen_get_vblank_counter,
|
||||
|
|
|
@ -355,6 +355,7 @@ int evergreen_resume(struct radeon_device *rdev);
|
|||
bool evergreen_gpu_is_lockup(struct radeon_device *rdev);
|
||||
int evergreen_asic_reset(struct radeon_device *rdev);
|
||||
void evergreen_bandwidth_update(struct radeon_device *rdev);
|
||||
void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
|
||||
int evergreen_copy_blit(struct radeon_device *rdev,
|
||||
uint64_t src_offset, uint64_t dst_offset,
|
||||
unsigned num_pages, struct radeon_fence *fence);
|
||||
|
|
|
@ -1163,16 +1163,6 @@ bool radeon_atom_get_clock_info(struct drm_device *dev)
|
|||
p1pll->pll_out_min = 64800;
|
||||
else
|
||||
p1pll->pll_out_min = 20000;
|
||||
} else if (p1pll->pll_out_min > 64800) {
|
||||
/* Limiting the pll output range is a good thing generally as
|
||||
* it limits the number of possible pll combinations for a given
|
||||
* frequency presumably to the ones that work best on each card.
|
||||
* However, certain duallink DVI monitors seem to like
|
||||
* pll combinations that would be limited by this at least on
|
||||
* pre-DCE 3.0 r6xx hardware. This might need to be adjusted per
|
||||
* family.
|
||||
*/
|
||||
p1pll->pll_out_min = 64800;
|
||||
}
|
||||
|
||||
p1pll->pll_in_min =
|
||||
|
@ -1987,6 +1977,9 @@ static int radeon_atombios_parse_power_table_1_3(struct radeon_device *rdev)
|
|||
num_modes = power_info->info.ucNumOfPowerModeEntries;
|
||||
if (num_modes > ATOM_MAX_NUMBEROF_POWER_BLOCK)
|
||||
num_modes = ATOM_MAX_NUMBEROF_POWER_BLOCK;
|
||||
rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) * num_modes, GFP_KERNEL);
|
||||
if (!rdev->pm.power_state)
|
||||
return state_index;
|
||||
/* last mode is usually default, array is low to high */
|
||||
for (i = 0; i < num_modes; i++) {
|
||||
rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE;
|
||||
|
@ -2338,6 +2331,10 @@ static int radeon_atombios_parse_power_table_4_5(struct radeon_device *rdev)
|
|||
power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
|
||||
|
||||
radeon_atombios_add_pplib_thermal_controller(rdev, &power_info->pplib.sThermalController);
|
||||
rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) *
|
||||
power_info->pplib.ucNumStates, GFP_KERNEL);
|
||||
if (!rdev->pm.power_state)
|
||||
return state_index;
|
||||
/* first mode is usually default, followed by low to high */
|
||||
for (i = 0; i < power_info->pplib.ucNumStates; i++) {
|
||||
mode_index = 0;
|
||||
|
@ -2418,6 +2415,10 @@ static int radeon_atombios_parse_power_table_6(struct radeon_device *rdev)
|
|||
non_clock_info_array = (struct NonClockInfoArray *)
|
||||
(mode_info->atom_context->bios + data_offset +
|
||||
power_info->pplib.usNonClockInfoArrayOffset);
|
||||
rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) *
|
||||
state_array->ucNumEntries, GFP_KERNEL);
|
||||
if (!rdev->pm.power_state)
|
||||
return state_index;
|
||||
for (i = 0; i < state_array->ucNumEntries; i++) {
|
||||
mode_index = 0;
|
||||
power_state = (union pplib_power_state *)&state_array->states[i];
|
||||
|
@ -2491,19 +2492,22 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
|
|||
break;
|
||||
}
|
||||
} else {
|
||||
/* add the default mode */
|
||||
rdev->pm.power_state[state_index].type =
|
||||
POWER_STATE_TYPE_DEFAULT;
|
||||
rdev->pm.power_state[state_index].num_clock_modes = 1;
|
||||
rdev->pm.power_state[state_index].clock_info[0].mclk = rdev->clock.default_mclk;
|
||||
rdev->pm.power_state[state_index].clock_info[0].sclk = rdev->clock.default_sclk;
|
||||
rdev->pm.power_state[state_index].default_clock_mode =
|
||||
&rdev->pm.power_state[state_index].clock_info[0];
|
||||
rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE;
|
||||
rdev->pm.power_state[state_index].pcie_lanes = 16;
|
||||
rdev->pm.default_power_state_index = state_index;
|
||||
rdev->pm.power_state[state_index].flags = 0;
|
||||
state_index++;
|
||||
rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state), GFP_KERNEL);
|
||||
if (rdev->pm.power_state) {
|
||||
/* add the default mode */
|
||||
rdev->pm.power_state[state_index].type =
|
||||
POWER_STATE_TYPE_DEFAULT;
|
||||
rdev->pm.power_state[state_index].num_clock_modes = 1;
|
||||
rdev->pm.power_state[state_index].clock_info[0].mclk = rdev->clock.default_mclk;
|
||||
rdev->pm.power_state[state_index].clock_info[0].sclk = rdev->clock.default_sclk;
|
||||
rdev->pm.power_state[state_index].default_clock_mode =
|
||||
&rdev->pm.power_state[state_index].clock_info[0];
|
||||
rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE;
|
||||
rdev->pm.power_state[state_index].pcie_lanes = 16;
|
||||
rdev->pm.default_power_state_index = state_index;
|
||||
rdev->pm.power_state[state_index].flags = 0;
|
||||
state_index++;
|
||||
}
|
||||
}
|
||||
|
||||
rdev->pm.num_power_states = state_index;
|
||||
|
@ -2619,7 +2623,7 @@ void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev)
|
|||
bios_2_scratch &= ~ATOM_S2_VRI_BRIGHT_ENABLE;
|
||||
|
||||
/* tell the bios not to handle mode switching */
|
||||
bios_6_scratch |= (ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH | ATOM_S6_ACC_MODE);
|
||||
bios_6_scratch |= ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH;
|
||||
|
||||
if (rdev->family >= CHIP_R600) {
|
||||
WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch);
|
||||
|
@ -2670,10 +2674,13 @@ void radeon_atom_output_lock(struct drm_encoder *encoder, bool lock)
|
|||
else
|
||||
bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH);
|
||||
|
||||
if (lock)
|
||||
if (lock) {
|
||||
bios_6_scratch |= ATOM_S6_CRITICAL_STATE;
|
||||
else
|
||||
bios_6_scratch &= ~ATOM_S6_ACC_MODE;
|
||||
} else {
|
||||
bios_6_scratch &= ~ATOM_S6_CRITICAL_STATE;
|
||||
bios_6_scratch |= ATOM_S6_ACC_MODE;
|
||||
}
|
||||
|
||||
if (rdev->family >= CHIP_R600)
|
||||
WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
|
||||
|
|
|
@ -2442,6 +2442,17 @@ void radeon_combios_get_power_modes(struct radeon_device *rdev)
|
|||
|
||||
rdev->pm.default_power_state_index = -1;
|
||||
|
||||
/* allocate 2 power states */
|
||||
rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) * 2, GFP_KERNEL);
|
||||
if (!rdev->pm.power_state) {
|
||||
rdev->pm.default_power_state_index = state_index;
|
||||
rdev->pm.num_power_states = 0;
|
||||
|
||||
rdev->pm.current_power_state_index = rdev->pm.default_power_state_index;
|
||||
rdev->pm.current_clock_mode_index = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
if (rdev->flags & RADEON_IS_MOBILITY) {
|
||||
offset = combios_get_table_offset(dev, COMBIOS_POWERPLAY_INFO_TABLE);
|
||||
if (offset) {
|
||||
|
|
|
@ -780,6 +780,115 @@ static int radeon_ddc_dump(struct drm_connector *connector)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* avivo */
|
||||
static void avivo_get_fb_div(struct radeon_pll *pll,
|
||||
u32 target_clock,
|
||||
u32 post_div,
|
||||
u32 ref_div,
|
||||
u32 *fb_div,
|
||||
u32 *frac_fb_div)
|
||||
{
|
||||
u32 tmp = post_div * ref_div;
|
||||
|
||||
tmp *= target_clock;
|
||||
*fb_div = tmp / pll->reference_freq;
|
||||
*frac_fb_div = tmp % pll->reference_freq;
|
||||
}
|
||||
|
||||
static u32 avivo_get_post_div(struct radeon_pll *pll,
|
||||
u32 target_clock)
|
||||
{
|
||||
u32 vco, post_div, tmp;
|
||||
|
||||
if (pll->flags & RADEON_PLL_USE_POST_DIV)
|
||||
return pll->post_div;
|
||||
|
||||
if (pll->flags & RADEON_PLL_PREFER_MINM_OVER_MAXP) {
|
||||
if (pll->flags & RADEON_PLL_IS_LCD)
|
||||
vco = pll->lcd_pll_out_min;
|
||||
else
|
||||
vco = pll->pll_out_min;
|
||||
} else {
|
||||
if (pll->flags & RADEON_PLL_IS_LCD)
|
||||
vco = pll->lcd_pll_out_max;
|
||||
else
|
||||
vco = pll->pll_out_max;
|
||||
}
|
||||
|
||||
post_div = vco / target_clock;
|
||||
tmp = vco % target_clock;
|
||||
|
||||
if (pll->flags & RADEON_PLL_PREFER_MINM_OVER_MAXP) {
|
||||
if (tmp)
|
||||
post_div++;
|
||||
} else {
|
||||
if (!tmp)
|
||||
post_div--;
|
||||
}
|
||||
|
||||
return post_div;
|
||||
}
|
||||
|
||||
#define MAX_TOLERANCE 10
|
||||
|
||||
void radeon_compute_pll_avivo(struct radeon_pll *pll,
|
||||
u32 freq,
|
||||
u32 *dot_clock_p,
|
||||
u32 *fb_div_p,
|
||||
u32 *frac_fb_div_p,
|
||||
u32 *ref_div_p,
|
||||
u32 *post_div_p)
|
||||
{
|
||||
u32 target_clock = freq / 10;
|
||||
u32 post_div = avivo_get_post_div(pll, target_clock);
|
||||
u32 ref_div = pll->min_ref_div;
|
||||
u32 fb_div = 0, frac_fb_div = 0, tmp;
|
||||
|
||||
if (pll->flags & RADEON_PLL_USE_REF_DIV)
|
||||
ref_div = pll->reference_div;
|
||||
|
||||
if (pll->flags & RADEON_PLL_USE_FRAC_FB_DIV) {
|
||||
avivo_get_fb_div(pll, target_clock, post_div, ref_div, &fb_div, &frac_fb_div);
|
||||
frac_fb_div = (100 * frac_fb_div) / pll->reference_freq;
|
||||
if (frac_fb_div >= 5) {
|
||||
frac_fb_div -= 5;
|
||||
frac_fb_div = frac_fb_div / 10;
|
||||
frac_fb_div++;
|
||||
}
|
||||
if (frac_fb_div >= 10) {
|
||||
fb_div++;
|
||||
frac_fb_div = 0;
|
||||
}
|
||||
} else {
|
||||
while (ref_div <= pll->max_ref_div) {
|
||||
avivo_get_fb_div(pll, target_clock, post_div, ref_div,
|
||||
&fb_div, &frac_fb_div);
|
||||
if (frac_fb_div >= (pll->reference_freq / 2))
|
||||
fb_div++;
|
||||
frac_fb_div = 0;
|
||||
tmp = (pll->reference_freq * fb_div) / (post_div * ref_div);
|
||||
tmp = (tmp * 10000) / target_clock;
|
||||
|
||||
if (tmp > (10000 + MAX_TOLERANCE))
|
||||
ref_div++;
|
||||
else if (tmp >= (10000 - MAX_TOLERANCE))
|
||||
break;
|
||||
else
|
||||
ref_div++;
|
||||
}
|
||||
}
|
||||
|
||||
*dot_clock_p = ((pll->reference_freq * fb_div * 10) + (pll->reference_freq * frac_fb_div)) /
|
||||
(ref_div * post_div * 10);
|
||||
*fb_div_p = fb_div;
|
||||
*frac_fb_div_p = frac_fb_div;
|
||||
*ref_div_p = ref_div;
|
||||
*post_div_p = post_div;
|
||||
DRM_DEBUG_KMS("%d, pll dividers - fb: %d.%d ref: %d, post %d\n",
|
||||
*dot_clock_p, fb_div, frac_fb_div, ref_div, post_div);
|
||||
}
|
||||
|
||||
/* pre-avivo */
|
||||
static inline uint32_t radeon_div(uint64_t n, uint32_t d)
|
||||
{
|
||||
uint64_t mod;
|
||||
|
@ -790,13 +899,13 @@ static inline uint32_t radeon_div(uint64_t n, uint32_t d)
|
|||
return n;
|
||||
}
|
||||
|
||||
void radeon_compute_pll(struct radeon_pll *pll,
|
||||
uint64_t freq,
|
||||
uint32_t *dot_clock_p,
|
||||
uint32_t *fb_div_p,
|
||||
uint32_t *frac_fb_div_p,
|
||||
uint32_t *ref_div_p,
|
||||
uint32_t *post_div_p)
|
||||
void radeon_compute_pll_legacy(struct radeon_pll *pll,
|
||||
uint64_t freq,
|
||||
uint32_t *dot_clock_p,
|
||||
uint32_t *fb_div_p,
|
||||
uint32_t *frac_fb_div_p,
|
||||
uint32_t *ref_div_p,
|
||||
uint32_t *post_div_p)
|
||||
{
|
||||
uint32_t min_ref_div = pll->min_ref_div;
|
||||
uint32_t max_ref_div = pll->max_ref_div;
|
||||
|
@ -826,6 +935,9 @@ void radeon_compute_pll(struct radeon_pll *pll,
|
|||
pll_out_max = pll->pll_out_max;
|
||||
}
|
||||
|
||||
if (pll_out_min > 64800)
|
||||
pll_out_min = 64800;
|
||||
|
||||
if (pll->flags & RADEON_PLL_USE_REF_DIV)
|
||||
min_ref_div = max_ref_div = pll->reference_div;
|
||||
else {
|
||||
|
@ -849,7 +961,7 @@ void radeon_compute_pll(struct radeon_pll *pll,
|
|||
max_fractional_feed_div = pll->max_frac_feedback_div;
|
||||
}
|
||||
|
||||
for (post_div = max_post_div; post_div >= min_post_div; --post_div) {
|
||||
for (post_div = min_post_div; post_div <= max_post_div; ++post_div) {
|
||||
uint32_t ref_div;
|
||||
|
||||
if ((pll->flags & RADEON_PLL_NO_ODD_POST_DIV) && (post_div & 1))
|
||||
|
@ -965,6 +1077,10 @@ void radeon_compute_pll(struct radeon_pll *pll,
|
|||
*frac_fb_div_p = best_frac_feedback_div;
|
||||
*ref_div_p = best_ref_div;
|
||||
*post_div_p = best_post_div;
|
||||
DRM_DEBUG_KMS("%d %d, pll dividers - fb: %d.%d ref: %d, post %d\n",
|
||||
freq, best_freq / 1000, best_feedback_div, best_frac_feedback_div,
|
||||
best_ref_div, best_post_div);
|
||||
|
||||
}
|
||||
|
||||
static void radeon_user_framebuffer_destroy(struct drm_framebuffer *fb)
|
||||
|
|
|
@ -1063,7 +1063,7 @@ atombios_set_edp_panel_power(struct drm_connector *connector, int action)
|
|||
if (!ASIC_IS_DCE4(rdev))
|
||||
return;
|
||||
|
||||
if ((action != ATOM_TRANSMITTER_ACTION_POWER_ON) ||
|
||||
if ((action != ATOM_TRANSMITTER_ACTION_POWER_ON) &&
|
||||
(action != ATOM_TRANSMITTER_ACTION_POWER_OFF))
|
||||
return;
|
||||
|
||||
|
|
|
@ -778,9 +778,9 @@ static void radeon_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode)
|
|||
DRM_DEBUG_KMS("\n");
|
||||
|
||||
if (!use_bios_divs) {
|
||||
radeon_compute_pll(pll, mode->clock,
|
||||
&freq, &feedback_div, &frac_fb_div,
|
||||
&reference_div, &post_divider);
|
||||
radeon_compute_pll_legacy(pll, mode->clock,
|
||||
&freq, &feedback_div, &frac_fb_div,
|
||||
&reference_div, &post_divider);
|
||||
|
||||
for (post_div = &post_divs[0]; post_div->divider; ++post_div) {
|
||||
if (post_div->divider == post_divider)
|
||||
|
|
|
@ -149,6 +149,7 @@ struct radeon_tmds_pll {
|
|||
#define RADEON_PLL_PREFER_CLOSEST_LOWER (1 << 11)
|
||||
#define RADEON_PLL_USE_POST_DIV (1 << 12)
|
||||
#define RADEON_PLL_IS_LCD (1 << 13)
|
||||
#define RADEON_PLL_PREFER_MINM_OVER_MAXP (1 << 14)
|
||||
|
||||
struct radeon_pll {
|
||||
/* reference frequency */
|
||||
|
@ -510,13 +511,21 @@ extern bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev,
|
|||
struct radeon_atom_ss *ss,
|
||||
int id, u32 clock);
|
||||
|
||||
extern void radeon_compute_pll(struct radeon_pll *pll,
|
||||
uint64_t freq,
|
||||
uint32_t *dot_clock_p,
|
||||
uint32_t *fb_div_p,
|
||||
uint32_t *frac_fb_div_p,
|
||||
uint32_t *ref_div_p,
|
||||
uint32_t *post_div_p);
|
||||
extern void radeon_compute_pll_legacy(struct radeon_pll *pll,
|
||||
uint64_t freq,
|
||||
uint32_t *dot_clock_p,
|
||||
uint32_t *fb_div_p,
|
||||
uint32_t *frac_fb_div_p,
|
||||
uint32_t *ref_div_p,
|
||||
uint32_t *post_div_p);
|
||||
|
||||
extern void radeon_compute_pll_avivo(struct radeon_pll *pll,
|
||||
u32 freq,
|
||||
u32 *dot_clock_p,
|
||||
u32 *fb_div_p,
|
||||
u32 *frac_fb_div_p,
|
||||
u32 *ref_div_p,
|
||||
u32 *post_div_p);
|
||||
|
||||
extern void radeon_setup_encoder_clones(struct drm_device *dev);
|
||||
|
||||
|
|
|
@ -430,7 +430,7 @@ static ssize_t radeon_hwmon_show_temp(struct device *dev,
|
|||
{
|
||||
struct drm_device *ddev = pci_get_drvdata(to_pci_dev(dev));
|
||||
struct radeon_device *rdev = ddev->dev_private;
|
||||
u32 temp;
|
||||
int temp;
|
||||
|
||||
switch (rdev->pm.int_thermal_type) {
|
||||
case THERMAL_TYPE_RV6XX:
|
||||
|
@ -646,6 +646,9 @@ void radeon_pm_fini(struct radeon_device *rdev)
|
|||
#endif
|
||||
}
|
||||
|
||||
if (rdev->pm.power_state)
|
||||
kfree(rdev->pm.power_state);
|
||||
|
||||
radeon_hwmon_fini(rdev);
|
||||
}
|
||||
|
||||
|
|
|
@ -78,18 +78,23 @@ u32 rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
|
|||
}
|
||||
|
||||
/* get temperature in millidegrees */
|
||||
u32 rv770_get_temp(struct radeon_device *rdev)
|
||||
int rv770_get_temp(struct radeon_device *rdev)
|
||||
{
|
||||
u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >>
|
||||
ASIC_T_SHIFT;
|
||||
u32 actual_temp = 0;
|
||||
int actual_temp;
|
||||
|
||||
if ((temp >> 9) & 1)
|
||||
actual_temp = 0;
|
||||
else
|
||||
actual_temp = (temp >> 1) & 0xff;
|
||||
if (temp & 0x400)
|
||||
actual_temp = -256;
|
||||
else if (temp & 0x200)
|
||||
actual_temp = 255;
|
||||
else if (temp & 0x100) {
|
||||
actual_temp = temp & 0x1ff;
|
||||
actual_temp |= ~0x1ff;
|
||||
} else
|
||||
actual_temp = temp & 0xff;
|
||||
|
||||
return actual_temp * 1000;
|
||||
return (actual_temp * 1000) / 2;
|
||||
}
|
||||
|
||||
void rv770_pm_misc(struct radeon_device *rdev)
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue