Commit 693c84fd authored by William Lee Irwin III's avatar William Lee Irwin III Committed by Linus Torvalds

[PATCH] sparc32: sun4d update

Chris Newport and Thomas Bogendoerfer have been working to get the
sun4d port functional again. This patch updates 2.6.10-rc3 to a current
snapshot of their work. It does the following 3 things:

(1) add sun4d hook to sbus_bus_ranges_init()
(2) fix up pgd_offset() call in sun4d iommu code
(3) fix up sun4d's definition of current
Signed-off-by: default avatarChris Newport <crn@netunix.com>
Signed-off-by: default avatarThomas Bogendoerfer <tsbogend@alpha.franken.de>
Acked-by: default avatarWilliam Irwin <wli@holomorphy.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 0f86e14f
......@@ -122,8 +122,7 @@ void __init smp4d_callin(void)
/* Fix idle thread fields. */
__asm__ __volatile__("ld [%0], %%g6\n\t"
"sta %%g6, [%%g0] %1\n\t"
: : "r" (&current_set[cpuid]), "i" (ASI_M_VIKING_TMP2)
: : "r" (&current_set[cpuid])
: "memory" /* paranoid */);
cpu_leds[cpuid] = 0x9;
......@@ -460,25 +459,18 @@ void __init smp4d_blackbox_id(unsigned *addr)
void __init smp4d_blackbox_current(unsigned *addr)
{
/* We have a nice Linux current register :) */
int rd = addr[1] & 0x3e000000;
int rd = *addr & 0x3e000000;
addr[0] = 0x10800006; /* b .+24 */
addr[1] = 0xc0800820 | rd; /* lda [%g0] ASI_M_VIKING_TMP2, reg */
addr[0] = 0xc0800800 | rd; /* lda [%g0] ASI_M_VIKING_TMP1, reg */
addr[2] = 0x81282002 | rd | (rd >> 11); /* sll reg, 2, reg */
addr[4] = 0x01000000; /* nop */
}
void __init sun4d_init_smp(void)
{
int i;
extern unsigned int patchme_store_new_current[];
extern unsigned int t_nmi[], linux_trap_ipi15_sun4d[], linux_trap_ipi15_sun4m[];
/* Store current into Linux current register :) */
__asm__ __volatile__("sta %%g6, [%%g0] %0" : : "i"(ASI_M_VIKING_TMP2));
/* Patch switch_to */
patchme_store_new_current[0] = (patchme_store_new_current[0] & 0x3e000000) | 0xc0a00820;
/* Patch ipi15 trap table */
t_nmi[1] = t_nmi[1] + (linux_trap_ipi15_sun4d - linux_trap_ipi15_sun4m);
......
......@@ -196,7 +196,7 @@ static int iounit_map_dma_area(dma_addr_t *pba, unsigned long va, __u32 addr, in
pte_t *ptep;
long i;
pgdp = pgd_offset(init_task.mm, addr);
pgdp = pgd_offset(&init_mm, addr);
pmdp = pmd_offset(pgdp, addr);
ptep = pte_offset_map(pmdp, addr);
......
......@@ -34,7 +34,7 @@ prom_adjust_regs(struct linux_prom_registers *regp, int nregs,
}
}
static void
void
prom_adjust_ranges(struct linux_prom_ranges *ranges1, int nranges1,
struct linux_prom_ranges *ranges2, int nranges2)
{
......
......@@ -217,6 +217,8 @@ static void __init sbus_do_child_siblings(int start_node,
* prom_sbus_ranges_init(), with all sun4d stuff cut away.
* Ask DaveM what is going on here, how is sun4d supposed to work... XXX
*/
/* added back sun4d patch from Thomas Bogendoerfer - should be OK (crn) */
static void __init sbus_bus_ranges_init(int parent_node, struct sbus_bus *sbus)
{
int len;
......@@ -229,6 +231,18 @@ static void __init sbus_bus_ranges_init(int parent_node, struct sbus_bus *sbus)
return;
}
sbus->num_sbus_ranges = len / sizeof(struct linux_prom_ranges);
if (sparc_cpu_model == sun4d) {
struct linux_prom_ranges iounit_ranges[PROMREG_MAX];
int num_iounit_ranges;
len = prom_getproperty(parent_node, "ranges",
(char *) iounit_ranges,
sizeof (iounit_ranges));
if (len != -1) {
num_iounit_ranges = (len/sizeof(struct linux_prom_ranges));
prom_adjust_ranges (sbus->sbus_ranges, sbus->num_sbus_ranges, iounit_ranges, num_iounit_ranges);
}
}
}
static void __init __apply_ranges_to_regs(struct linux_prom_ranges *ranges,
......
......@@ -104,7 +104,8 @@
#define ASI_M_DCDR 0x39 /* Data Cache Diagnostics Register rw, ss */
#define ASI_M_VIKING_TMP1 0x40 /* Emulation temporary 1 on Viking */
#define ASI_M_VIKING_TMP2 0x41 /* Emulation temporary 2 on Viking */
/* only available on SuperSparc I */
/* #define ASI_M_VIKING_TMP2 0x41 */ /* Emulation temporary 2 on Viking */
#define ASI_M_ACTION 0x4c /* Breakpoint Action Register (GNU/Viking) */
......
......@@ -106,6 +106,8 @@ extern void sbus_set_sbus64(struct sbus_dev *, int);
/* These yield IOMMU mappings in consistent mode. */
extern void *sbus_alloc_consistent(struct sbus_dev *, long, u32 *dma_addrp);
extern void sbus_free_consistent(struct sbus_dev *, long, void *, u32);
void prom_adjust_ranges(struct linux_prom_ranges *, int,
struct linux_prom_ranges *, int);
#define SBUS_DMA_BIDIRECTIONAL DMA_BIDIRECTIONAL
#define SBUS_DMA_TODEVICE DMA_TO_DEVICE
......
......@@ -112,9 +112,12 @@
and %idreg, 0xc, %idreg; \
ld [%idreg + %dest_reg], %dest_reg;
/* Sliiick. We have a Linux current register :) -jj */
#define LOAD_CURRENT4D(dest_reg) \
lda [%g0] ASI_M_VIKING_TMP2, %dest_reg;
#define LOAD_CURRENT4D(dest_reg, idreg) \
lda [%g0] ASI_M_VIKING_TMP1, %idreg; \
sethi %hi(C_LABEL(current_set)), %dest_reg; \
sll %idreg, 2, %idreg; \
or %dest_reg, %lo(C_LABEL(current_set)), %dest_reg; \
ld [%idreg + %dest_reg], %dest_reg;
/* Blackbox - take care with this... - check smp4m and smp4d before changing this. */
#define LOAD_CURRENT(dest_reg, idreg) \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment