Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6
This commit is contained in:
commit
582fd48761
7 changed files with 90 additions and 37 deletions
|
@ -21,6 +21,10 @@ config GENERIC_ISA_DMA
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
||||||
|
config GENERIC_IOMAP
|
||||||
|
bool
|
||||||
|
default y
|
||||||
|
|
||||||
source "init/Kconfig"
|
source "init/Kconfig"
|
||||||
|
|
||||||
menu "General machine setup"
|
menu "General machine setup"
|
||||||
|
|
|
@ -5,6 +5,7 @@ CONFIG_MMU=y
|
||||||
CONFIG_UID16=y
|
CONFIG_UID16=y
|
||||||
CONFIG_HIGHMEM=y
|
CONFIG_HIGHMEM=y
|
||||||
CONFIG_GENERIC_ISA_DMA=y
|
CONFIG_GENERIC_ISA_DMA=y
|
||||||
|
CONFIG_GENERIC_IOMAP=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# Code maturity level options
|
# Code maturity level options
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
/* This is trivial with the new code... */
|
/* This is trivial with the new code... */
|
||||||
.globl do_fpdis
|
.globl do_fpdis
|
||||||
do_fpdis:
|
do_fpdis:
|
||||||
sethi %hi(TSTATE_PEF), %g4 ! IEU0
|
sethi %hi(TSTATE_PEF), %g4
|
||||||
rdpr %tstate, %g5
|
rdpr %tstate, %g5
|
||||||
andcc %g5, %g4, %g0
|
andcc %g5, %g4, %g0
|
||||||
be,pt %xcc, 1f
|
be,pt %xcc, 1f
|
||||||
|
@ -50,18 +50,18 @@ do_fpdis:
|
||||||
add %g0, %g0, %g0
|
add %g0, %g0, %g0
|
||||||
ba,a,pt %xcc, rtrap_clr_l6
|
ba,a,pt %xcc, rtrap_clr_l6
|
||||||
|
|
||||||
1: ldub [%g6 + TI_FPSAVED], %g5 ! Load Group
|
1: ldub [%g6 + TI_FPSAVED], %g5
|
||||||
wr %g0, FPRS_FEF, %fprs ! LSU Group+4bubbles
|
wr %g0, FPRS_FEF, %fprs
|
||||||
andcc %g5, FPRS_FEF, %g0 ! IEU1 Group
|
andcc %g5, FPRS_FEF, %g0
|
||||||
be,a,pt %icc, 1f ! CTI
|
be,a,pt %icc, 1f
|
||||||
clr %g7 ! IEU0
|
clr %g7
|
||||||
ldx [%g6 + TI_GSR], %g7 ! Load Group
|
ldx [%g6 + TI_GSR], %g7
|
||||||
1: andcc %g5, FPRS_DL, %g0 ! IEU1
|
1: andcc %g5, FPRS_DL, %g0
|
||||||
bne,pn %icc, 2f ! CTI
|
bne,pn %icc, 2f
|
||||||
fzero %f0 ! FPA
|
fzero %f0
|
||||||
andcc %g5, FPRS_DU, %g0 ! IEU1 Group
|
andcc %g5, FPRS_DU, %g0
|
||||||
bne,pn %icc, 1f ! CTI
|
bne,pn %icc, 1f
|
||||||
fzero %f2 ! FPA
|
fzero %f2
|
||||||
faddd %f0, %f2, %f4
|
faddd %f0, %f2, %f4
|
||||||
fmuld %f0, %f2, %f6
|
fmuld %f0, %f2, %f6
|
||||||
faddd %f0, %f2, %f8
|
faddd %f0, %f2, %f8
|
||||||
|
@ -104,8 +104,10 @@ do_fpdis:
|
||||||
add %g6, TI_FPREGS + 0xc0, %g2
|
add %g6, TI_FPREGS + 0xc0, %g2
|
||||||
faddd %f0, %f2, %f8
|
faddd %f0, %f2, %f8
|
||||||
fmuld %f0, %f2, %f10
|
fmuld %f0, %f2, %f10
|
||||||
ldda [%g1] ASI_BLK_S, %f32 ! grrr, where is ASI_BLK_NUCLEUS 8-(
|
membar #Sync
|
||||||
|
ldda [%g1] ASI_BLK_S, %f32
|
||||||
ldda [%g2] ASI_BLK_S, %f48
|
ldda [%g2] ASI_BLK_S, %f48
|
||||||
|
membar #Sync
|
||||||
faddd %f0, %f2, %f12
|
faddd %f0, %f2, %f12
|
||||||
fmuld %f0, %f2, %f14
|
fmuld %f0, %f2, %f14
|
||||||
faddd %f0, %f2, %f16
|
faddd %f0, %f2, %f16
|
||||||
|
@ -116,7 +118,6 @@ do_fpdis:
|
||||||
fmuld %f0, %f2, %f26
|
fmuld %f0, %f2, %f26
|
||||||
faddd %f0, %f2, %f28
|
faddd %f0, %f2, %f28
|
||||||
fmuld %f0, %f2, %f30
|
fmuld %f0, %f2, %f30
|
||||||
membar #Sync
|
|
||||||
b,pt %xcc, fpdis_exit
|
b,pt %xcc, fpdis_exit
|
||||||
nop
|
nop
|
||||||
2: andcc %g5, FPRS_DU, %g0
|
2: andcc %g5, FPRS_DU, %g0
|
||||||
|
@ -133,8 +134,10 @@ do_fpdis:
|
||||||
add %g6, TI_FPREGS + 0x40, %g2
|
add %g6, TI_FPREGS + 0x40, %g2
|
||||||
faddd %f32, %f34, %f36
|
faddd %f32, %f34, %f36
|
||||||
fmuld %f32, %f34, %f38
|
fmuld %f32, %f34, %f38
|
||||||
ldda [%g1] ASI_BLK_S, %f0 ! grrr, where is ASI_BLK_NUCLEUS 8-(
|
membar #Sync
|
||||||
|
ldda [%g1] ASI_BLK_S, %f0
|
||||||
ldda [%g2] ASI_BLK_S, %f16
|
ldda [%g2] ASI_BLK_S, %f16
|
||||||
|
membar #Sync
|
||||||
faddd %f32, %f34, %f40
|
faddd %f32, %f34, %f40
|
||||||
fmuld %f32, %f34, %f42
|
fmuld %f32, %f34, %f42
|
||||||
faddd %f32, %f34, %f44
|
faddd %f32, %f34, %f44
|
||||||
|
@ -147,7 +150,6 @@ do_fpdis:
|
||||||
fmuld %f32, %f34, %f58
|
fmuld %f32, %f34, %f58
|
||||||
faddd %f32, %f34, %f60
|
faddd %f32, %f34, %f60
|
||||||
fmuld %f32, %f34, %f62
|
fmuld %f32, %f34, %f62
|
||||||
membar #Sync
|
|
||||||
ba,pt %xcc, fpdis_exit
|
ba,pt %xcc, fpdis_exit
|
||||||
nop
|
nop
|
||||||
3: mov SECONDARY_CONTEXT, %g3
|
3: mov SECONDARY_CONTEXT, %g3
|
||||||
|
@ -158,7 +160,8 @@ do_fpdis:
|
||||||
stxa %g2, [%g3] ASI_DMMU
|
stxa %g2, [%g3] ASI_DMMU
|
||||||
membar #Sync
|
membar #Sync
|
||||||
mov 0x40, %g2
|
mov 0x40, %g2
|
||||||
ldda [%g1] ASI_BLK_S, %f0 ! grrr, where is ASI_BLK_NUCLEUS 8-(
|
membar #Sync
|
||||||
|
ldda [%g1] ASI_BLK_S, %f0
|
||||||
ldda [%g1 + %g2] ASI_BLK_S, %f16
|
ldda [%g1 + %g2] ASI_BLK_S, %f16
|
||||||
add %g1, 0x80, %g1
|
add %g1, 0x80, %g1
|
||||||
ldda [%g1] ASI_BLK_S, %f32
|
ldda [%g1] ASI_BLK_S, %f32
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include <asm/ebus.h>
|
#include <asm/ebus.h>
|
||||||
|
#include <asm/isa.h>
|
||||||
#include <asm/auxio.h>
|
#include <asm/auxio.h>
|
||||||
|
|
||||||
#include <linux/unistd.h>
|
#include <linux/unistd.h>
|
||||||
|
@ -100,46 +101,83 @@ again:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init has_button_interrupt(struct linux_ebus_device *edev)
|
static int __init has_button_interrupt(unsigned int irq, int prom_node)
|
||||||
{
|
{
|
||||||
if (edev->irqs[0] == PCI_IRQ_NONE)
|
if (irq == PCI_IRQ_NONE)
|
||||||
return 0;
|
return 0;
|
||||||
if (!prom_node_has_property(edev->prom_node, "button"))
|
if (!prom_node_has_property(prom_node, "button"))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init power_init(void)
|
static int __init power_probe_ebus(struct resource **resp, unsigned int *irq_p, int *prom_node_p)
|
||||||
{
|
{
|
||||||
struct linux_ebus *ebus;
|
struct linux_ebus *ebus;
|
||||||
struct linux_ebus_device *edev;
|
struct linux_ebus_device *edev;
|
||||||
|
|
||||||
|
for_each_ebus(ebus) {
|
||||||
|
for_each_ebusdev(edev, ebus) {
|
||||||
|
if (!strcmp(edev->prom_name, "power")) {
|
||||||
|
*resp = &edev->resource[0];
|
||||||
|
*irq_p = edev->irqs[0];
|
||||||
|
*prom_node_p = edev->prom_node;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __init power_probe_isa(struct resource **resp, unsigned int *irq_p, int *prom_node_p)
|
||||||
|
{
|
||||||
|
struct sparc_isa_bridge *isa_bus;
|
||||||
|
struct sparc_isa_device *isa_dev;
|
||||||
|
|
||||||
|
for_each_isa(isa_bus) {
|
||||||
|
for_each_isadev(isa_dev, isa_bus) {
|
||||||
|
if (!strcmp(isa_dev->prom_name, "power")) {
|
||||||
|
*resp = &isa_dev->resource;
|
||||||
|
*irq_p = isa_dev->irq;
|
||||||
|
*prom_node_p = isa_dev->prom_node;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init power_init(void)
|
||||||
|
{
|
||||||
|
struct resource *res = NULL;
|
||||||
|
unsigned int irq;
|
||||||
|
int prom_node;
|
||||||
static int invoked;
|
static int invoked;
|
||||||
|
|
||||||
if (invoked)
|
if (invoked)
|
||||||
return;
|
return;
|
||||||
invoked = 1;
|
invoked = 1;
|
||||||
|
|
||||||
for_each_ebus(ebus) {
|
if (!power_probe_ebus(&res, &irq, &prom_node))
|
||||||
for_each_ebusdev(edev, ebus) {
|
goto found;
|
||||||
if (!strcmp(edev->prom_name, "power"))
|
|
||||||
goto found;
|
if (!power_probe_isa(&res, &irq, &prom_node))
|
||||||
}
|
goto found;
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
found:
|
found:
|
||||||
power_reg = ioremap(edev->resource[0].start, 0x4);
|
power_reg = ioremap(res->start, 0x4);
|
||||||
printk("power: Control reg at %p ... ", power_reg);
|
printk("power: Control reg at %p ... ", power_reg);
|
||||||
poweroff_method = machine_halt; /* able to use the standard halt */
|
poweroff_method = machine_halt; /* able to use the standard halt */
|
||||||
if (has_button_interrupt(edev)) {
|
if (has_button_interrupt(irq, prom_node)) {
|
||||||
if (kernel_thread(powerd, NULL, CLONE_FS) < 0) {
|
if (kernel_thread(powerd, NULL, CLONE_FS) < 0) {
|
||||||
printk("Failed to start power daemon.\n");
|
printk("Failed to start power daemon.\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
printk("powerd running.\n");
|
printk("powerd running.\n");
|
||||||
|
|
||||||
if (request_irq(edev->irqs[0],
|
if (request_irq(irq,
|
||||||
power_handler, SA_SHIRQ, "power", NULL) < 0)
|
power_handler, SA_SHIRQ, "power", NULL) < 0)
|
||||||
printk("power: Error, cannot register IRQ handler.\n");
|
printk("power: Error, cannot register IRQ handler.\n");
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -312,32 +312,33 @@ kern_fpucheck: ldub [%g6 + TI_FPDEPTH], %l5
|
||||||
wr %g1, FPRS_FEF, %fprs
|
wr %g1, FPRS_FEF, %fprs
|
||||||
ldx [%o1 + %o5], %g1
|
ldx [%o1 + %o5], %g1
|
||||||
add %g6, TI_XFSR, %o1
|
add %g6, TI_XFSR, %o1
|
||||||
membar #StoreLoad | #LoadLoad
|
|
||||||
sll %o0, 8, %o2
|
sll %o0, 8, %o2
|
||||||
add %g6, TI_FPREGS, %o3
|
add %g6, TI_FPREGS, %o3
|
||||||
brz,pn %l6, 1f
|
brz,pn %l6, 1f
|
||||||
add %g6, TI_FPREGS+0x40, %o4
|
add %g6, TI_FPREGS+0x40, %o4
|
||||||
|
|
||||||
|
membar #Sync
|
||||||
ldda [%o3 + %o2] ASI_BLK_P, %f0
|
ldda [%o3 + %o2] ASI_BLK_P, %f0
|
||||||
ldda [%o4 + %o2] ASI_BLK_P, %f16
|
ldda [%o4 + %o2] ASI_BLK_P, %f16
|
||||||
|
membar #Sync
|
||||||
1: andcc %l2, FPRS_DU, %g0
|
1: andcc %l2, FPRS_DU, %g0
|
||||||
be,pn %icc, 1f
|
be,pn %icc, 1f
|
||||||
wr %g1, 0, %gsr
|
wr %g1, 0, %gsr
|
||||||
add %o2, 0x80, %o2
|
add %o2, 0x80, %o2
|
||||||
|
membar #Sync
|
||||||
ldda [%o3 + %o2] ASI_BLK_P, %f32
|
ldda [%o3 + %o2] ASI_BLK_P, %f32
|
||||||
ldda [%o4 + %o2] ASI_BLK_P, %f48
|
ldda [%o4 + %o2] ASI_BLK_P, %f48
|
||||||
|
|
||||||
1: membar #Sync
|
1: membar #Sync
|
||||||
ldx [%o1 + %o5], %fsr
|
ldx [%o1 + %o5], %fsr
|
||||||
2: stb %l5, [%g6 + TI_FPDEPTH]
|
2: stb %l5, [%g6 + TI_FPDEPTH]
|
||||||
ba,pt %xcc, rt_continue
|
ba,pt %xcc, rt_continue
|
||||||
nop
|
nop
|
||||||
5: wr %g0, FPRS_FEF, %fprs
|
5: wr %g0, FPRS_FEF, %fprs
|
||||||
membar #StoreLoad | #LoadLoad
|
|
||||||
sll %o0, 8, %o2
|
sll %o0, 8, %o2
|
||||||
|
|
||||||
add %g6, TI_FPREGS+0x80, %o3
|
add %g6, TI_FPREGS+0x80, %o3
|
||||||
add %g6, TI_FPREGS+0xc0, %o4
|
add %g6, TI_FPREGS+0xc0, %o4
|
||||||
|
membar #Sync
|
||||||
ldda [%o3 + %o2] ASI_BLK_P, %f32
|
ldda [%o3 + %o2] ASI_BLK_P, %f32
|
||||||
ldda [%o4 + %o2] ASI_BLK_P, %f48
|
ldda [%o4 + %o2] ASI_BLK_P, %f48
|
||||||
membar #Sync
|
membar #Sync
|
||||||
|
|
|
@ -59,15 +59,17 @@ vis1: ldub [%g6 + TI_FPSAVED], %g3
|
||||||
be,pn %icc, 9b
|
be,pn %icc, 9b
|
||||||
add %g6, TI_FPREGS, %g2
|
add %g6, TI_FPREGS, %g2
|
||||||
andcc %o5, FPRS_DL, %g0
|
andcc %o5, FPRS_DL, %g0
|
||||||
membar #StoreStore | #LoadStore
|
|
||||||
|
|
||||||
be,pn %icc, 4f
|
be,pn %icc, 4f
|
||||||
add %g6, TI_FPREGS+0x40, %g3
|
add %g6, TI_FPREGS+0x40, %g3
|
||||||
|
membar #Sync
|
||||||
stda %f0, [%g2 + %g1] ASI_BLK_P
|
stda %f0, [%g2 + %g1] ASI_BLK_P
|
||||||
stda %f16, [%g3 + %g1] ASI_BLK_P
|
stda %f16, [%g3 + %g1] ASI_BLK_P
|
||||||
|
membar #Sync
|
||||||
andcc %o5, FPRS_DU, %g0
|
andcc %o5, FPRS_DU, %g0
|
||||||
be,pn %icc, 5f
|
be,pn %icc, 5f
|
||||||
4: add %g1, 128, %g1
|
4: add %g1, 128, %g1
|
||||||
|
membar #Sync
|
||||||
stda %f32, [%g2 + %g1] ASI_BLK_P
|
stda %f32, [%g2 + %g1] ASI_BLK_P
|
||||||
|
|
||||||
stda %f48, [%g3 + %g1] ASI_BLK_P
|
stda %f48, [%g3 + %g1] ASI_BLK_P
|
||||||
|
@ -87,7 +89,7 @@ vis1: ldub [%g6 + TI_FPSAVED], %g3
|
||||||
sll %g1, 5, %g1
|
sll %g1, 5, %g1
|
||||||
add %g6, TI_FPREGS+0xc0, %g3
|
add %g6, TI_FPREGS+0xc0, %g3
|
||||||
wr %g0, FPRS_FEF, %fprs
|
wr %g0, FPRS_FEF, %fprs
|
||||||
membar #StoreStore | #LoadStore
|
membar #Sync
|
||||||
stda %f32, [%g2 + %g1] ASI_BLK_P
|
stda %f32, [%g2 + %g1] ASI_BLK_P
|
||||||
stda %f48, [%g3 + %g1] ASI_BLK_P
|
stda %f48, [%g3 + %g1] ASI_BLK_P
|
||||||
membar #Sync
|
membar #Sync
|
||||||
|
@ -128,8 +130,8 @@ VISenterhalf:
|
||||||
be,pn %icc, 4f
|
be,pn %icc, 4f
|
||||||
add %g6, TI_FPREGS, %g2
|
add %g6, TI_FPREGS, %g2
|
||||||
|
|
||||||
membar #StoreStore | #LoadStore
|
|
||||||
add %g6, TI_FPREGS+0x40, %g3
|
add %g6, TI_FPREGS+0x40, %g3
|
||||||
|
membar #Sync
|
||||||
stda %f0, [%g2 + %g1] ASI_BLK_P
|
stda %f0, [%g2 + %g1] ASI_BLK_P
|
||||||
stda %f16, [%g3 + %g1] ASI_BLK_P
|
stda %f16, [%g3 + %g1] ASI_BLK_P
|
||||||
membar #Sync
|
membar #Sync
|
||||||
|
|
|
@ -288,6 +288,9 @@ static void p9100_init_one(struct sbus_dev *sdev)
|
||||||
all->par.physbase = sdev->reg_addrs[2].phys_addr;
|
all->par.physbase = sdev->reg_addrs[2].phys_addr;
|
||||||
|
|
||||||
sbusfb_fill_var(&all->info.var, sdev->prom_node, 8);
|
sbusfb_fill_var(&all->info.var, sdev->prom_node, 8);
|
||||||
|
all->info.var.red.length = 8;
|
||||||
|
all->info.var.green.length = 8;
|
||||||
|
all->info.var.blue.length = 8;
|
||||||
|
|
||||||
linebytes = prom_getintdefault(sdev->prom_node, "linebytes",
|
linebytes = prom_getintdefault(sdev->prom_node, "linebytes",
|
||||||
all->info.var.xres);
|
all->info.var.xres);
|
||||||
|
@ -323,6 +326,7 @@ static void p9100_init_one(struct sbus_dev *sdev)
|
||||||
kfree(all);
|
kfree(all);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
fb_set_cmap(&all->info.cmap, &all->info);
|
||||||
|
|
||||||
list_add(&all->list, &p9100_list);
|
list_add(&all->list, &p9100_list);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue