Skip to content

Commit

Permalink
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/…
Browse files Browse the repository at this point in the history
…davem/sparc-2.6

* 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6:
  [VIDEO] sunxvr500fb: Fix pseudo_palette array size
  [VIDEO] sunxvr2500fb: Fix pseudo_palette array size
  [VIDEO] ffb: The pseudo_palette is only 16 elements long
  [VIDEO]: Fix section mismatch warning in promcon.
  [ATA]: Back out bogus (SPARC64 && !PCI) Kconfig depends.
  [SPARC64]: Fill in gaps in non-PCI dma_*() NOP implementation.
  [SPARC64]: Fix {mc,smt}_capable().
  [SPARC64]: Make core and sibling groups equal on UltraSPARC-IV.
  [SPARC64]: Proper multi-core scheduling support.
  [SPARC64]: Provide mmu statistics via sysfs.
  [SPARC64]: Fix service channel hypervisor function names.
  [SPARC64]: Export basic cpu properties via sysfs.
  [SPARC64]: Move topology init code into new file, sysfs.c
  • Loading branch information
Linus Torvalds committed Jun 7, 2007
2 parents 143a275 + e7e8cc5 commit 7244d54
Show file tree
Hide file tree
Showing 18 changed files with 543 additions and 62 deletions.
9 changes: 9 additions & 0 deletions arch/sparc64/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,15 @@ config SCHED_SMT
when dealing with UltraSPARC cpus at a cost of slightly increased
overhead in some places. If unsure say N here.

config SCHED_MC
bool "Multi-core scheduler support"
depends on SMP
default y
help
Multi-core scheduler support improves the CPU scheduler's decision
making when dealing with multi-core CPU chips at a cost of slightly
increased overhead in some places. If unsure say N here.

source "kernel/Kconfig.preempt"

config CMDLINE_BOOL
Expand Down
4 changes: 2 additions & 2 deletions arch/sparc64/kernel/Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# $Id: Makefile,v 1.70 2002/02/09 19:49:30 davem Exp $
#
# Makefile for the linux kernel.
#

Expand All @@ -8,7 +8,7 @@ EXTRA_CFLAGS := -Werror
extra-y := head.o init_task.o vmlinux.lds

obj-y := process.o setup.o cpu.o idprom.o \
traps.o auxio.o una_asm.o \
traps.o auxio.o una_asm.o sysfs.o \
irq.o ptrace.o time.o sys_sparc.o signal.o \
unaligned.o central.o pci.o starfire.o semaphore.o \
power.o sbus.o iommu_common.o sparc64_ksyms.o chmc.o \
Expand Down
62 changes: 42 additions & 20 deletions arch/sparc64/kernel/entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -2514,9 +2514,9 @@ sun4v_ncs_request:
nop
.size sun4v_ncs_request, .-sun4v_ncs_request

.globl sun4v_scv_send
.type sun4v_scv_send,#function
sun4v_scv_send:
.globl sun4v_svc_send
.type sun4v_svc_send,#function
sun4v_svc_send:
save %sp, -192, %sp
mov %i0, %o0
mov %i1, %o1
Expand All @@ -2526,11 +2526,11 @@ sun4v_scv_send:
stx %o1, [%i3]
ret
restore
.size sun4v_scv_send, .-sun4v_scv_send
.size sun4v_svc_send, .-sun4v_svc_send

.globl sun4v_scv_recv
.type sun4v_scv_recv,#function
sun4v_scv_recv:
.globl sun4v_svc_recv
.type sun4v_svc_recv,#function
sun4v_svc_recv:
save %sp, -192, %sp
mov %i0, %o0
mov %i1, %o1
Expand All @@ -2540,33 +2540,55 @@ sun4v_scv_recv:
stx %o1, [%i3]
ret
restore
.size sun4v_scv_recv, .-sun4v_scv_recv
.size sun4v_svc_recv, .-sun4v_svc_recv

.globl sun4v_scv_getstatus
.type sun4v_scv_getstatus,#function
sun4v_scv_getstatus:
.globl sun4v_svc_getstatus
.type sun4v_svc_getstatus,#function
sun4v_svc_getstatus:
mov HV_FAST_SVC_GETSTATUS, %o5
mov %o1, %o4
ta HV_FAST_TRAP
stx %o1, [%o4]
retl
nop
.size sun4v_scv_getstatus, .-sun4v_scv_getstatus
.size sun4v_svc_getstatus, .-sun4v_svc_getstatus

.globl sun4v_scv_setstatus
.type sun4v_scv_setstatus,#function
sun4v_scv_setstatus:
.globl sun4v_svc_setstatus
.type sun4v_svc_setstatus,#function
sun4v_svc_setstatus:
mov HV_FAST_SVC_SETSTATUS, %o5
ta HV_FAST_TRAP
retl
nop
.size sun4v_scv_setstatus, .-sun4v_scv_setstatus
.size sun4v_svc_setstatus, .-sun4v_svc_setstatus

.globl sun4v_scv_clrstatus
.type sun4v_scv_clrstatus,#function
sun4v_scv_clrstatus:
.globl sun4v_svc_clrstatus
.type sun4v_svc_clrstatus,#function
sun4v_svc_clrstatus:
mov HV_FAST_SVC_CLRSTATUS, %o5
ta HV_FAST_TRAP
retl
nop
.size sun4v_scv_clrstatus, .-sun4v_scv_clrstatus
.size sun4v_svc_clrstatus, .-sun4v_svc_clrstatus

.globl sun4v_mmustat_conf
.type sun4v_mmustat_conf,#function
sun4v_mmustat_conf:
mov %o1, %o4
mov HV_FAST_MMUSTAT_CONF, %o5
ta HV_FAST_TRAP
stx %o1, [%o4]
retl
nop
.size sun4v_mmustat_conf, .-sun4v_mmustat_conf

.globl sun4v_mmustat_info
.type sun4v_mmustat_info,#function
sun4v_mmustat_info:
mov %o0, %o4
mov HV_FAST_MMUSTAT_INFO, %o5
ta HV_FAST_TRAP
stx %o1, [%o4]
retl
nop
.size sun4v_mmustat_info, .-sun4v_mmustat_info
53 changes: 53 additions & 0 deletions arch/sparc64/kernel/mdesc.c
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,53 @@ static void __init set_core_ids(void)
}
}

static void __init mark_proc_ids(struct mdesc_node *mp, int proc_id)
{
int i;

for (i = 0; i < mp->num_arcs; i++) {
struct mdesc_node *t = mp->arcs[i].arc;
const u64 *id;

if (strcmp(mp->arcs[i].name, "back"))
continue;

if (strcmp(t->name, "cpu"))
continue;

id = md_get_property(t, "id", NULL);
if (*id < NR_CPUS)
cpu_data(*id).proc_id = proc_id;
}
}

static void __init __set_proc_ids(const char *exec_unit_name)
{
struct mdesc_node *mp;
int idx;

idx = 0;
md_for_each_node_by_name(mp, exec_unit_name) {
const char *type;
int len;

type = md_get_property(mp, "type", &len);
if (!find_in_proplist(type, "int", len) &&
!find_in_proplist(type, "integer", len))
continue;

mark_proc_ids(mp, idx);

idx++;
}
}

static void __init set_proc_ids(void)
{
__set_proc_ids("exec_unit");
__set_proc_ids("exec-unit");
}

static void __init get_one_mondo_bits(const u64 *p, unsigned int *mask, unsigned char def)
{
u64 val;
Expand Down Expand Up @@ -574,9 +621,15 @@ static void __init mdesc_fill_in_cpu_data(void)
#endif

c->core_id = 0;
c->proc_id = -1;
}

#ifdef CONFIG_SMP
sparc64_multi_core = 1;
#endif

set_core_ids();
set_proc_ids();

smp_fill_in_sib_core_maps();
}
Expand Down
5 changes: 5 additions & 0 deletions arch/sparc64/kernel/prom.c
Original file line number Diff line number Diff line change
Expand Up @@ -1781,6 +1781,10 @@ static void __init of_fill_in_cpu_data(void)
}

cpu_data(cpuid).core_id = portid + 1;
cpu_data(cpuid).proc_id = portid;
#ifdef CONFIG_SMP
sparc64_multi_core = 1;
#endif
} else {
cpu_data(cpuid).dcache_size =
of_getintprop_default(dp, "dcache-size", 16 * 1024);
Expand All @@ -1799,6 +1803,7 @@ static void __init of_fill_in_cpu_data(void)
of_getintprop_default(dp, "ecache-line-size", 64);

cpu_data(cpuid).core_id = 0;
cpu_data(cpuid).proc_id = -1;
}

#ifdef CONFIG_SMP
Expand Down
19 changes: 0 additions & 19 deletions arch/sparc64/kernel/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -513,22 +513,3 @@ void sun_do_break(void)

int serial_console = -1;
int stop_a_enabled = 1;

static int __init topology_init(void)
{
int i, err;

err = -ENOMEM;

for_each_possible_cpu(i) {
struct cpu *p = kzalloc(sizeof(*p), GFP_KERNEL);
if (p) {
register_cpu(p, i);
err = 0;
}
}

return err;
}

subsys_initcall(topology_init);
21 changes: 20 additions & 1 deletion arch/sparc64/kernel/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,17 @@

extern void calibrate_delay(void);

int sparc64_multi_core __read_mostly;

/* Please don't make this stuff initdata!!! --DaveM */
unsigned char boot_cpu_id;

cpumask_t cpu_online_map __read_mostly = CPU_MASK_NONE;
cpumask_t phys_cpu_present_map __read_mostly = CPU_MASK_NONE;
cpumask_t cpu_sibling_map[NR_CPUS] __read_mostly =
{ [0 ... NR_CPUS-1] = CPU_MASK_NONE };
cpumask_t cpu_core_map[NR_CPUS] __read_mostly =
{ [0 ... NR_CPUS-1] = CPU_MASK_NONE };
static cpumask_t smp_commenced_mask;
static cpumask_t cpu_callout_map;

Expand Down Expand Up @@ -1217,13 +1221,28 @@ void __devinit smp_fill_in_sib_core_maps(void)
unsigned int j;

if (cpu_data(i).core_id == 0) {
cpu_set(i, cpu_sibling_map[i]);
cpu_set(i, cpu_core_map[i]);
continue;
}

for_each_possible_cpu(j) {
if (cpu_data(i).core_id ==
cpu_data(j).core_id)
cpu_set(j, cpu_core_map[i]);
}
}

for_each_possible_cpu(i) {
unsigned int j;

if (cpu_data(i).proc_id == -1) {
cpu_set(i, cpu_sibling_map[i]);
continue;
}

for_each_possible_cpu(j) {
if (cpu_data(i).proc_id ==
cpu_data(j).proc_id)
cpu_set(j, cpu_sibling_map[i]);
}
}
Expand Down
Loading

0 comments on commit 7244d54

Please sign in to comment.