From: Jiri Gaisler <jiri@gaisler.com>
To: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: sparclinux@vger.kernel.org,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
wli@holomorphy.com
Subject: Re: [1/7] LEON SPARC V8 processor support for linux-2.6.10
Date: Wed, 05 Jan 2005 16:04:19 +0000 [thread overview]
Message-ID: <41DC1003.8090000@gaisler.com> (raw)
In-Reply-To: <1104877412.17166.49.camel@localhost.localdomain>
[-- Attachment #1: Type: text/plain, Size: 846 bytes --]
linux-2.6.10: Kernel patches, updated.
[1/7] diff2.6.10_include_asm_sparc.diff: diff for include/asm-sparc
Alan Cox wrote:
> On Maw, 2005-01-04 at 19:03, Jiri Gaisler wrote
>
>>+ * The license and distribution terms for this file may be
>>+ * found in the file LICENSE in this distribution or at
>>+ * http://www.rtems.com/license/LICENSE.
>
>
> Legalese hat on
>
> Please don't do this. Suppose the file changes or the site goes away.
> Include a copy of the license in the patch set directly.
>
> .
>
--
--------------------------------------------------------------------------
Gaisler Research, 1:a Långgatan 19, 413 27 Goteborg, Sweden, +46-317758650
fax: +46-31421407 email: info@gaisler.com, home page: www.gaisler.com
--------------------------------------------------------------------------
[-- Attachment #2: diff2.6.10_include_asm_sparc.diff --]
[-- Type: text/plain, Size: 21260 bytes --]
diff -Naur ../linux-2.6.10/include/asm-sparc/amba.h linux-2.6.10/include/asm-sparc/amba.h
--- ../linux-2.6.10/include/asm-sparc/amba.h 1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.10/include/asm-sparc/amba.h 2005-01-05 16:43:52.000000000 +0100
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) Gaisler Research, 2004 (Konrad Eisele <eiselekd@web.de>)
+ */
+
+#ifndef _LEON3_AMBA_H__
+#define _LEON3_AMBA_H__
+
+#define LEON3_IO_AREA 0xfff00000
+#define LEON3_CONF_AREA 0xff000
+#define LEON3_AHB_SLAVE_CONF_AREA (1 << 11)
+
+#define LEON3_AHB_CONF_WORDS 8
+#define LEON3_APB_CONF_WORDS 2
+#define LEON3_AHB_MASTERS 8
+#define LEON3_AHB_SLAVES 8
+#define LEON3_APB_SLAVES 16
+#define LEON3_APBUARTS 8
+
+/* Vendor codes */
+#define VENDOR_GAISLER 1
+#define VENDOR_PENDER 2
+#define VENDOR_ESA 4
+#define VENDOR_OPENCORES 8
+
+/* Gaisler Research device id's */
+#define GAISLER_LEON3 0x003
+#define GAISLER_LEON3DSU 0x004
+#define GAISLER_ETHAHB 0x005
+#define GAISLER_APBMST 0x006
+#define GAISLER_AHBUART 0x007
+#define GAISLER_SRCTRL 0x008
+#define GAISLER_SDCTRL 0x009
+#define GAISLER_APBUART 0x00C
+#define GAISLER_IRQMP 0x00D
+#define GAISLER_AHBRAM 0x00E
+#define GAISLER_GPTIMER 0x011
+#define GAISLER_PCITRG 0x012
+#define GAISLER_PCISBRG 0x013
+#define GAISLER_PCIFBRG 0x014
+#define GAISLER_PCITRACE 0x015
+#define GAISLER_PCIDMA 0x016
+#define GAISLER_AHBTRACE 0x017
+#define GAISLER_ETHDSU 0x018
+
+#define GAISLER_L2TIME 0xffd /* internal device: leon2 timer */
+#define GAISLER_L2C 0xffe /* internal device: leon2compat */
+#define GAISLER_PLUGPLAY 0xfff /* internal device: plug & play configarea */
+
+
+#ifndef __ASSEMBLER__
+
+extern inline char *gaisler_device_str(int id) {
+ switch(id) {
+ case GAISLER_LEON3: return "GAISLER_LEON3";
+ case GAISLER_LEON3DSU: return "GAISLER_LEON3DSU";
+ case GAISLER_ETHAHB: return "GAISLER_ETHAHB";
+ case GAISLER_APBMST: return "GAISLER_APBMST";
+ case GAISLER_AHBUART: return "GAISLER_AHBUART";
+ case GAISLER_SRCTRL: return "GAISLER_SRCTRL";
+ case GAISLER_SDCTRL: return "GAISLER_SDCTRL";
+ case GAISLER_APBUART: return "GAISLER_APBUART";
+ case GAISLER_IRQMP: return "GAISLER_IRQMP";
+ case GAISLER_AHBRAM: return "GAISLER_AHBRAM";
+ case GAISLER_GPTIMER: return "GAISLER_GPTIMER";
+ case GAISLER_PCITRG: return "GAISLER_PCITRG";
+ case GAISLER_PCISBRG: return "GAISLER_PCISBRG";
+ case GAISLER_PCIFBRG: return "GAISLER_PCIFBRG";
+ case GAISLER_PCITRACE: return "GAISLER_PCITRACE";
+ case GAISLER_AHBTRACE: return "GAISLER_AHBTRACE";
+ case GAISLER_ETHDSU: return "GAISLER_ETHDSU";
+
+ case GAISLER_L2TIME: return "GAISLER_L2TIME";
+ case GAISLER_L2C: return "GAISLER_L2C";
+ case GAISLER_PLUGPLAY: return "GAISLER_PLUGPLAY";
+
+ default: break;
+ }
+ return 0;
+}
+
+#endif
+
+/* European Space Agency device id's */
+#define ESA_LEON2 0x2
+#define ESA_MCTRL 0xF
+
+
+#ifndef __ASSEMBLER__
+
+extern inline char *esa_device_str(int id) {
+ switch(id) {
+ case ESA_LEON2: return "ESA_LEON2";
+ case ESA_MCTRL: return "ESA_MCTRL";
+ default: break;
+ }
+ return 0;
+}
+
+#endif
+
+/* Opencores device id's */
+#define OPENCORES_PCIBR 0x4
+#define OPENCORES_ETHMAC 0x5
+
+
+#ifndef __ASSEMBLER__
+
+extern inline char *opencores_device_str(int id) {
+ switch(id) {
+ case OPENCORES_PCIBR: return "OPENCORES_PCIBR";
+ case OPENCORES_ETHMAC: return "OPENCORES_ETHMAC";
+ default: break;
+ }
+ return 0;
+}
+
+extern inline char *device_id2str(int vendor, int id) {
+ switch(vendor) {
+ case VENDOR_GAISLER: return gaisler_device_str(id);
+ case VENDOR_ESA: return esa_device_str(id);
+ case VENDOR_OPENCORES: return opencores_device_str(id);
+ case VENDOR_PENDER:
+ default: break;
+ }
+ return 0;
+}
+
+extern inline char *vendor_id2str(int vendor) {
+ switch(vendor) {
+ case VENDOR_GAISLER: return "VENDOR_GAISLER";
+ case VENDOR_ESA: return "VENDOR_ESA";
+ case VENDOR_OPENCORES: return "VENDOR_OPENCORES";
+ case VENDOR_PENDER: return "VENDOR_PENDER";
+ default: break;
+ }
+ return 0;
+}
+
+#endif
+
+/* Vendor codes */
+
+
+
+/*
+ *
+ * Macros for manipulating Configuration registers
+ *
+ */
+
+#define LEON3_BYPASS_LOAD_PA(x) (leon_load_reg ((unsigned long)(x)))
+#define LEON3_BYPASS_STORE_PA(x,v) (leon_store_reg ((unsigned long)(x),(unsigned long)(v)))
+
+#define amba_get_confword(tab, index, word) (LEON3_BYPASS_LOAD_PA((tab).addr[(index)]+(word)))
+
+#define amba_vendor(x) (((x) >> 24) & 0xff)
+
+#define amba_device(x) (((x) >> 12) & 0xfff)
+
+#define amba_ahb_get_membar(tab, index, nr) (LEON3_BYPASS_LOAD_PA((tab).addr[(index)]+4+(nr)))
+
+#define amba_apb_get_membar(tab, index) (LEON3_BYPASS_LOAD_PA((tab).addr[(index)]+1))
+
+#define amba_membar_start(mbar) (((mbar) & 0xfff00000) & (((mbar) & 0xfff0) << 16))
+
+#define amba_iobar_start(base, iobar) ((base) | ((((iobar) & 0xfff00000)>>12) & (((iobar) & 0xfff0)<<4)) )
+
+#define amba_irq(conf) ((conf) & 0xf)
+
+#define amba_membar_type(mbar) ((mbar) & 0xf)
+
+#define AMBA_TYPE_APBIO 0x1
+#define AMBA_TYPE_MEM 0x2
+#define AMBA_TYPE_AHBIO 0x3
+
+#define AMBA_TYPE_AHBIO_ADDR(addr) (LEON3_IO_AREA | ((addr) >> 12))
+#endif
+
diff -Naur ../linux-2.6.10/include/asm-sparc/asi.h linux-2.6.10/include/asm-sparc/asi.h
--- ../linux-2.6.10/include/asm-sparc/asi.h 2004-12-24 22:34:44.000000000 +0100
+++ linux-2.6.10/include/asm-sparc/asi.h 2005-01-03 11:36:34.000000000 +0100
@@ -108,4 +108,10 @@
#define ASI_M_ACTION 0x4c /* Breakpoint Action Register (GNU/Viking) */
+/* FIXME: non-standard Leon ASI definition */
+#ifdef CONFIG_LEON
+#undef ASI_M_MMUREGS
+#define ASI_M_MMUREGS 0x19
+#endif /* CONFIG_LEON */
+
#endif /* _SPARC_ASI_H */
diff -Naur ../linux-2.6.10/include/asm-sparc/leon.h linux-2.6.10/include/asm-sparc/leon.h
--- ../linux-2.6.10/include/asm-sparc/leon.h 1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.10/include/asm-sparc/leon.h 2005-01-05 16:44:06.000000000 +0100
@@ -0,0 +1,270 @@
+/*
+ * Copyright (C) Gaisler Research, 2004 (Konrad Eisele <eiselekd@web.de>)
+ * Copyright (C) 2004 Stefan Holst (mail@s-holst.de), Uni-Stuttgart
+ */
+
+#ifndef LEON_H_INCLUDE
+#define LEON_H_INCLUDE
+
+#if defined(CONFIG_LEON) || defined(CONFIG_LEON_3)
+
+#include <linux/config.h>
+#include <asm/vaddrs.h>
+
+/* memory mapped leon control registers */
+#define LEON_PREGS 0x80000000
+#define LEON_MCFG1 0x00
+#define LEON_MCFG2 0x04
+#define LEON_ECTRL 0x08
+#define LEON_FADDR 0x0c
+#define LEON_MSTAT 0x10
+#define LEON_CCTRL 0x14
+#define LEON_PWDOWN 0x18
+#define LEON_WPROT1 0x1C
+#define LEON_WPROT2 0x20
+#define LEON_LCONF 0x24
+#define LEON_TCNT0 0x40
+#define LEON_TRLD0 0x44
+#define LEON_TCTRL0 0x48
+#define LEON_TCNT1 0x50
+#define LEON_TRLD1 0x54
+#define LEON_TCTRL1 0x58
+#define LEON_SCNT 0x60
+#define LEON_SRLD 0x64
+#define LEON_UART0 0x70
+#define LEON_UDATA0 0x70
+#define LEON_USTAT0 0x74
+#define LEON_UCTRL0 0x78
+#define LEON_USCAL0 0x7c
+#define LEON_UART1 0x80
+#define LEON_UDATA1 0x80
+#define LEON_USTAT1 0x84
+#define LEON_UCTRL1 0x88
+#define LEON_USCAL1 0x8c
+#define LEON_IMASK 0x90
+#define LEON_IPEND 0x94
+#define LEON_IFORCE 0x98
+#define LEON_ICLEAR 0x9c
+#define LEON_IOREG 0xA0
+#define LEON_IODIR 0xA4
+#define LEON_IOICONF 0xA8
+#define LEON_IPEND2 0xB0
+#define LEON_IMASK2 0xB4
+#define LEON_ISTAT2 0xB8
+#define LEON_ICLEAR2 0xBC
+
+#ifndef CONFIG_LEON_3
+
+/* ASI codes */
+#define ASI_LEON_PCI 0x04
+#define ASI_LEON_IFLUSH 0x05
+#define ASI_LEON_DFLUSH 0x06
+#define ASI_LEON_ITAG 0x0c
+#define ASI_LEON_IDATA 0x0d
+#define ASI_LEON_DTAG 0x0e
+#define ASI_LEON_DDATA 0x0f
+#define ASI_LEON_MMUFLUSH 0x18
+#define ASI_LEON_MMUREGS 0x19
+#define ASI_LEON_BYPASS 0x1c
+#define ASI_LEON_FLUSH_PAGE 0x10
+/*
+#define ASI_LEON_FLUSH_SEGMENT 0x11
+#define ASI_LEON_FLUSH_REGION 0x12
+*/
+#define ASI_LEON_FLUSH_CTX 0x13
+#define ASI_LEON_DCTX 0x14
+#define ASI_LEON_ICTX 0x15
+#define ASI_MMU_DIAG 0x1d
+
+#else
+
+#define ASI_LEON_IFLUSH 0x10
+#define ASI_LEON_DFLUSH 0x11
+
+#define ASI_LEON_MMUFLUSH 0x18
+#define ASI_LEON_MMUREGS 0x19
+#define ASI_LEON_BYPASS 0x1c
+#define ASI_LEON_FLUSH_PAGE 0x10
+
+/*
+constant ASI_SYSR : asi_type := "00010"; -- 0x02
+constant ASI_UINST : asi_type := "01000"; -- 0x08
+constant ASI_SINST : asi_type := "01001"; -- 0x09
+constant ASI_UDATA : asi_type := "01010"; -- 0x0A
+constant ASI_SDATA : asi_type := "01011"; -- 0x0B
+constant ASI_ITAG : asi_type := "01100"; -- 0x0C
+constant ASI_IDATA : asi_type := "01101"; -- 0x0D
+constant ASI_DTAG : asi_type := "01110"; -- 0x0E
+constant ASI_DDATA : asi_type := "01111"; -- 0x0F
+constant ASI_IFLUSH : asi_type := "10000"; -- 0x10
+constant ASI_DFLUSH : asi_type := "10001"; -- 0x11
+
+constant ASI_FLUSH_PAGE : std_logic_vector(4 downto 0) := "10000"; -- 0x10 i/dcache flush page
+constant ASI_FLUSH_CTX : std_logic_vector(4 downto 0) := "10011"; -- 0x13 i/dcache flush ctx
+
+constant ASI_DCTX : std_logic_vector(4 downto 0) := "10100"; -- 0x14 dcache ctx
+constant ASI_ICTX : std_logic_vector(4 downto 0) := "10101"; -- 0x15 icache ctx
+
+constant ASI_MMUFLUSHPROBE : std_logic_vector(4 downto 0) := "11000"; -- 0x18 i/dtlb flush/(probe)
+constant ASI_MMUREGS : std_logic_vector(4 downto 0) := "11001"; -- 0x19 mmu regs access
+constant ASI_MMU_BP : std_logic_vector(4 downto 0) := "11100"; -- 0x1c mmu Bypass
+constant ASI_MMU_DIAG : std_logic_vector(4 downto 0) := "11101"; -- 0x1d mmu diagnostic
+constant ASI_MMU_DSU : std_logic_vector(4 downto 0) := "11111"; -- 0x1f mmu diagnostic
+*/
+#endif
+
+/* mmu register access, ASI_LEON_MMUREGS */
+#define LEON_CNR_CTRL 0x000
+#define LEON_CNR_CTXP 0x100
+#define LEON_CNR_CTX 0x200
+#define LEON_CNR_F 0x300
+#define LEON_CNR_FADDR 0x400
+
+#define LEON_CNR_CTX_NCTX 256 /*number of MMU ctx*/
+
+#define LEON_CNR_CTRL_TLBDIS 0x80000000
+
+#define LEON_MMUTLB_ENT_MAX 64
+
+/*
+ * diagnostic access from mmutlb.vhd:
+ * 0: pte address
+ * 4: pte
+ * 8: additional flags
+ */
+#define LEON_DIAGF_LVL 0x3
+#define LEON_DIAGF_WR 0x8
+#define LEON_DIAGF_WR_SHIFT 3
+#define LEON_DIAGF_HIT 0x10
+#define LEON_DIAGF_HIT_SHIFT 4
+#define LEON_DIAGF_CTX 0x1fe0
+#define LEON_DIAGF_CTX_SHIFT 5
+#define LEON_DIAGF_VALID 0x2000
+#define LEON_DIAGF_VALID_SHIFT 13
+
+
+/*
+ * Interrupt Sources
+ *
+ * The interrupt source numbers directly map to the trap type and to
+ * the bits used in the Interrupt Clear, Interrupt Force, Interrupt Mask,
+ * and the Interrupt Pending Registers.
+ */
+#define LEON_INTERRUPT_CORRECTABLE_MEMORY_ERROR 1
+#define LEON_INTERRUPT_UART_1_RX_TX 2
+#define LEON_INTERRUPT_UART_0_RX_TX 3
+#define LEON_INTERRUPT_EXTERNAL_0 4
+#define LEON_INTERRUPT_EXTERNAL_1 5
+#define LEON_INTERRUPT_EXTERNAL_2 6
+#define LEON_INTERRUPT_EXTERNAL_3 7
+#define LEON_INTERRUPT_TIMER1 8
+#define LEON_INTERRUPT_TIMER2 9
+#define LEON_INTERRUPT_EMPTY1 10
+#define LEON_INTERRUPT_EMPTY2 11
+#define LEON_INTERRUPT_OPEN_ETH 12
+#define LEON_INTERRUPT_EMPTY4 13
+#define LEON_INTERRUPT_EMPTY5 14
+#define LEON_INTERRUPT_EMPTY6 15
+
+/* irq masks */
+#define LEON_HARD_INT(x) (1 << (x)) /* irq 0-15 */
+#define LEON_IRQMASK_R 0x0000fffe /* bit 15- 1 of lregs.irqmask */
+#define LEON_IRQPRIO_R 0xfffe0000 /* bit 31-17 of lregs.irqmask */
+
+/* leon uart register definitions */
+#define LEON_OFF_UDATA 0x0
+#define LEON_OFF_USTAT 0x4
+#define LEON_OFF_UCTRL 0x8
+#define LEON_OFF_USCAL 0xc
+
+#define LEON_UCTRL_RE 0x01
+#define LEON_UCTRL_TE 0x02
+#define LEON_UCTRL_RI 0x04
+#define LEON_UCTRL_TI 0x08
+#define LEON_UCTRL_PS 0x10
+#define LEON_UCTRL_PE 0x20
+#define LEON_UCTRL_FL 0x40
+#define LEON_UCTRL_LB 0x80
+
+#define LEON_USTAT_DR 0x01
+#define LEON_USTAT_TS 0x02
+#define LEON_USTAT_TH 0x04
+#define LEON_USTAT_BR 0x08
+#define LEON_USTAT_OV 0x10
+#define LEON_USTAT_PE 0x20
+#define LEON_USTAT_FE 0x40
+
+#define LEON_MCFG2_SRAMDIS 0x00002000
+#define LEON_MCFG2_SDRAMEN 0x00004000
+#define LEON_MCFG2_SRAMBANKSZ 0x00001e00 /* [12-9] */
+#define LEON_MCFG2_SRAMBANKSZ_SHIFT 9
+#define LEON_MCFG2_SDRAMBANKSZ 0x03800000 /* [25-23] */
+#define LEON_MCFG2_SDRAMBANKSZ_SHIFT 23
+
+#define LEON_TCNT0_MASK 0x7fffff
+
+#define LEON_USTAT_ERROR (LEON_USTAT_OV|LEON_USTAT_PE|LEON_USTAT_FE) /*no break yet*/
+
+#ifdef CONFIG_OPEN_ETH
+#define LEON_ETH_BASE_ADD ((unsigned long)LEON_VA_ETHERMAC)
+/* map leon on ethermac adress space at pa 0xb0000000 */
+#define LEON_VA_ETHERMAC DVMA_VADDR
+#endif
+
+#ifndef __ASSEMBLY__
+
+/* do a physical address bypass write, i.e. for 0x80000000 */
+static __inline__ void leon_store_reg(unsigned long paddr,unsigned long value)
+{
+ __asm__ __volatile__("sta %0, [%1] %2\n\t": :
+ "r" (value), "r" (paddr),
+ "i" (ASI_LEON_BYPASS) : "memory");
+}
+
+/* do a physical address bypass load, i.e. for 0x80000000 */
+static __inline__ unsigned long leon_load_reg(unsigned long paddr)
+{
+ unsigned long retval;
+ __asm__ __volatile__("lda [%1] %2, %0\n\t" :
+ "=r" (retval) :
+ "r" (paddr), "i" (ASI_LEON_BYPASS));
+ return retval;
+}
+
+extern __inline__ void leon_srmmu_disabletlb(void)
+{
+ unsigned int retval;
+ __asm__ __volatile__("lda [%%g0] %2, %0\n\t" : "=r" (retval) : "r" (0), "i" (ASI_LEON_MMUREGS));
+ retval |= LEON_CNR_CTRL_TLBDIS;
+ __asm__ __volatile__("sta %0, [%%g0] %2\n\t" : : "r" (retval), "r" (0), "i" (ASI_LEON_MMUREGS) : "memory");
+}
+
+extern __inline__ void leon_srmmu_enabletlb(void)
+{
+ unsigned int retval;
+ __asm__ __volatile__("lda [%%g0] %2, %0\n\t" : "=r" (retval) : "r" (0), "i" (ASI_LEON_MMUREGS));
+ retval = retval & ~LEON_CNR_CTRL_TLBDIS;
+ __asm__ __volatile__("sta %0, [%%g0] %2\n\t" : : "r" (retval), "r" (0), "i" (ASI_LEON_MMUREGS) : "memory");
+}
+
+#define LEON_BYPASS_LOAD_PA(x) leon_load_reg ((unsigned long)(x))
+#define LEON_BYPASS_STORE_PA(x,v) leon_store_reg((unsigned long)(x),(unsigned long)(v))
+#define LEON_REGLOAD_PA(x) leon_load_reg ((unsigned long)(x)+LEON_PREGS)
+#define LEON_REGSTORE_PA(x,v) leon_store_reg((unsigned long)(x)+LEON_PREGS,(unsigned long)(v))
+#define LEON_REGSTORE_OR_PA(x,v) LEON_REGSTORE_PA(x,LEON_REGLOAD_PA(x)|(unsigned long)(v))
+#define LEON_REGSTORE_AND_PA(x,v) LEON_REGSTORE_PA(x,LEON_REGLOAD_PA(x)&(unsigned long)(v))
+
+extern unsigned long srmmu_swprobe(unsigned long vaddr,unsigned long *paddr);
+extern void leon_inherit_prom_mappings(unsigned long start,unsigned long end);
+
+#define LEONSETUP_MEM_BASEADDR 0x40000000
+
+#endif /* !ASM */
+
+#ifdef CONFIG_LEON_3
+#include <asm/leon3.h>
+#endif
+
+#endif //defined(CONFIG_LEON) || defined(CONFIG_LEON_3)
+
+#endif
diff -Naur ../linux-2.6.10/include/asm-sparc/leon3.h linux-2.6.10/include/asm-sparc/leon3.h
--- ../linux-2.6.10/include/asm-sparc/leon3.h 1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.10/include/asm-sparc/leon3.h 2005-01-05 16:44:10.000000000 +0100
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) Gaisler Research, 2004 (Konrad Eisele <eiselekd@web.de>)
+ */
+
+#ifndef _INCLUDE_LEON_3_h_
+#define _INCLUDE_LEON_3_h_
+
+#include <asm/amba.h>
+
+#ifndef __ASSEMBLER__
+
+/*
+ * The following defines the bits in the LEON UART Status Registers.
+ */
+
+#define LEON_REG_UART_STATUS_DR 0x00000001 /* Data Ready */
+#define LEON_REG_UART_STATUS_TSE 0x00000002 /* TX Send Register Empty */
+#define LEON_REG_UART_STATUS_THE 0x00000004 /* TX Hold Register Empty */
+#define LEON_REG_UART_STATUS_BR 0x00000008 /* Break Error */
+#define LEON_REG_UART_STATUS_OE 0x00000010 /* RX Overrun Error */
+#define LEON_REG_UART_STATUS_PE 0x00000020 /* RX Parity Error */
+#define LEON_REG_UART_STATUS_FE 0x00000040 /* RX Framing Error */
+#define LEON_REG_UART_STATUS_ERR 0x00000078 /* Error Mask */
+
+
+/*
+ * The following defines the bits in the LEON UART Ctrl Registers.
+ */
+
+#define LEON_REG_UART_CTRL_RE 0x00000001 /* Receiver enable */
+#define LEON_REG_UART_CTRL_TE 0x00000002 /* Transmitter enable */
+#define LEON_REG_UART_CTRL_RI 0x00000004 /* Receiver interrupt enable */
+#define LEON_REG_UART_CTRL_TI 0x00000008 /* Transmitter interrupt enable */
+#define LEON_REG_UART_CTRL_PS 0x00000010 /* Parity select */
+#define LEON_REG_UART_CTRL_PE 0x00000020 /* Parity enable */
+#define LEON_REG_UART_CTRL_FL 0x00000040 /* Flow control enable */
+#define LEON_REG_UART_CTRL_LB 0x00000080 /* Loop Back enable */
+
+#define LEON3_GPTIMER_EN 1
+#define LEON3_GPTIMER_RL 2
+#define LEON3_GPTIMER_LD 4
+#define LEON3_GPTIMER_IRQEN 8
+
+
+typedef struct {
+ volatile unsigned int ilevel;
+ volatile unsigned int ipend;
+ volatile unsigned int iforce;
+ volatile unsigned int iclear;
+ volatile unsigned int notused00;
+ volatile unsigned int notused01;
+ volatile unsigned int notused02;
+ volatile unsigned int notused03;
+ volatile unsigned int notused10;
+ volatile unsigned int notused11;
+ volatile unsigned int notused12;
+ volatile unsigned int notused13;
+ volatile unsigned int notused20;
+ volatile unsigned int notused21;
+ volatile unsigned int notused22;
+ volatile unsigned int notused23;
+ volatile unsigned int mask[16];
+} LEON3_IrqCtrl_Regs_Map;
+
+typedef struct {
+ volatile unsigned int data;
+ volatile unsigned int status;
+ volatile unsigned int ctrl;
+ volatile unsigned int scaler;
+} LEON3_APBUART_Regs_Map;
+
+
+typedef struct {
+ volatile unsigned int val;
+ volatile unsigned int rld;
+ volatile unsigned int ctrl;
+ volatile unsigned int unused;
+} LEON3_GpTimerElem_Regs_Map;
+
+typedef struct {
+ volatile unsigned int scalar;
+ volatile unsigned int scalar_reload;
+ volatile unsigned int config;
+ volatile unsigned int unused;
+ volatile LEON3_GpTimerElem_Regs_Map e[8];
+} LEON3_GpTimer_Regs_Map;
+
+/*
+ * Types and structure used for AMBA Plug & Play bus scanning
+ */
+
+typedef struct amba_device_table {
+ int devnr; /* numbrer of devices on AHB or APB bus */
+ unsigned int *addr[16]; /* addresses to the devices configuration tables */
+ unsigned int allocbits[1]; /* 0=unallocated, 1=allocated driver */
+} amba_device_table;
+
+typedef struct amba_confarea_type {
+ amba_device_table ahbmst;
+ amba_device_table ahbslv;
+ amba_device_table apbslv;
+ unsigned int apbmst;
+} amba_confarea_type;
+
+extern unsigned long amba_find_apbslv_addr(unsigned long vendor, unsigned long device, unsigned long *irq);
+
+// collect apb slaves
+typedef struct amba_apb_device {
+ unsigned int start, irq;
+} amba_apb_device;
+extern int amba_get_free_apbslv_devices (int vendor, int device, amba_apb_device *dev,int nr);
+
+// collect ahb slaves
+typedef struct amba_ahb_device {
+ unsigned int start[4], irq;
+} amba_ahb_device;
+extern int amba_get_free_ahbslv_devices (int vendor, int device, amba_ahb_device *dev,int nr);
+
+#endif //!__ASSEMBLER__
+
+
+#endif
+
diff -Naur ../linux-2.6.10/include/asm-sparc/machines.h linux-2.6.10/include/asm-sparc/machines.h
--- ../linux-2.6.10/include/asm-sparc/machines.h 2004-12-24 22:33:49.000000000 +0100
+++ linux-2.6.10/include/asm-sparc/machines.h 2005-01-03 11:36:34.000000000 +0100
@@ -15,7 +15,7 @@
/* Current number of machines we know about that has an IDPROM
* machtype entry including one entry for the 0x80 OBP machines.
*/
-#define NUM_SUN_MACHINES 15
+#define NUM_SUN_MACHINES 16
extern struct Sun_Machine_Models Sun_Machines[NUM_SUN_MACHINES];
@@ -32,6 +32,7 @@
#define SM_ARCH_MASK 0xf0
#define SM_SUN4 0x20
+#define M_LEON2 0x30
#define SM_SUN4C 0x50
#define SM_SUN4M 0x70
#define SM_SUN4M_OBP 0x80
@@ -43,6 +44,9 @@
#define SM_4_330 0x03 /* Sun 4/300 series */
#define SM_4_470 0x04 /* Sun 4/400 series */
+/* Leon machines */
+#define M_LEON2_SOC 0x01 /* Leon2 SoC */
+
/* Sun4c machines Full Name - PROM NAME */
#define SM_4C_SS1 0x01 /* Sun4c SparcStation 1 - Sun 4/60 */
#define SM_4C_IPC 0x02 /* Sun4c SparcStation IPC - Sun 4/40 */
diff -Naur ../linux-2.6.10/include/asm-sparc/system.h linux-2.6.10/include/asm-sparc/system.h
--- ../linux-2.6.10/include/asm-sparc/system.h 2004-12-24 22:35:23.000000000 +0100
+++ linux-2.6.10/include/asm-sparc/system.h 2005-01-03 11:36:34.000000000 +0100
@@ -29,6 +29,7 @@
sun4u = 0x05, /* V8 ploos ploos */
sun_unknown = 0x06,
ap1000 = 0x07, /* almost a sun4m */
+ sparc_leon = 0x08, /* Leon2 SoC */
};
/* Really, userland should not be looking at any of this... */
diff -Naur ../linux-2.6.10/include/asm-sparc/vaddrs.h linux-2.6.10/include/asm-sparc/vaddrs.h
--- ../linux-2.6.10/include/asm-sparc/vaddrs.h 2004-12-24 22:33:49.000000000 +0100
+++ linux-2.6.10/include/asm-sparc/vaddrs.h 2005-01-03 16:38:41.000000000 +0100
@@ -17,7 +17,11 @@
#define SRMMU_NOCACHE_VADDR (KERNBASE + SRMMU_MAXMEM)
/* = 0x0fc000000 */
/* XXX Empiricals - this needs to go away - KMW */
+#if defined(CONFIG_LEON) || defined(CONFIG_LEON_3)
+#define SRMMU_MIN_NOCACHE_PAGES (128)
+#else
#define SRMMU_MIN_NOCACHE_PAGES (550)
+#endif
#define SRMMU_MAX_NOCACHE_PAGES (1280)
/* The following constant is used in mm/srmmu.c::srmmu_nocache_calcsize()
WARNING: multiple messages have this Message-ID (diff)
From: Jiri Gaisler <jiri@gaisler.com>
To: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: sparclinux@vger.kernel.org,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
wli@holomorphy.com
Subject: Re: [1/7] LEON SPARC V8 processor support for linux-2.6.10
Date: Wed, 05 Jan 2005 17:04:19 +0100 [thread overview]
Message-ID: <41DC1003.8090000@gaisler.com> (raw)
In-Reply-To: <1104877412.17166.49.camel@localhost.localdomain>
[-- Attachment #1: Type: text/plain, Size: 818 bytes --]
linux-2.6.10: Kernel patches, updated.
[1/7] diff2.6.10_include_asm_sparc.diff: diff for include/asm-sparc
Alan Cox wrote:
> On Maw, 2005-01-04 at 19:03, Jiri Gaisler wrote
>
>>+ * The license and distribution terms for this file may be
>>+ * found in the file LICENSE in this distribution or at
>>+ * http://www.rtems.com/license/LICENSE.
>
>
> Legalese hat on
>
> Please don't do this. Suppose the file changes or the site goes away.
> Include a copy of the license in the patch set directly.
>
> .
>
--
--------------------------------------------------------------------------
Gaisler Research, 1:a Långgatan 19, 413 27 Goteborg, Sweden, +46-317758650
fax: +46-31421407 email: info@gaisler.com, home page: www.gaisler.com
--------------------------------------------------------------------------
[-- Attachment #2: diff2.6.10_include_asm_sparc.diff --]
[-- Type: text/plain, Size: 21260 bytes --]
diff -Naur ../linux-2.6.10/include/asm-sparc/amba.h linux-2.6.10/include/asm-sparc/amba.h
--- ../linux-2.6.10/include/asm-sparc/amba.h 1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.10/include/asm-sparc/amba.h 2005-01-05 16:43:52.000000000 +0100
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) Gaisler Research, 2004 (Konrad Eisele <eiselekd@web.de>)
+ */
+
+#ifndef _LEON3_AMBA_H__
+#define _LEON3_AMBA_H__
+
+#define LEON3_IO_AREA 0xfff00000
+#define LEON3_CONF_AREA 0xff000
+#define LEON3_AHB_SLAVE_CONF_AREA (1 << 11)
+
+#define LEON3_AHB_CONF_WORDS 8
+#define LEON3_APB_CONF_WORDS 2
+#define LEON3_AHB_MASTERS 8
+#define LEON3_AHB_SLAVES 8
+#define LEON3_APB_SLAVES 16
+#define LEON3_APBUARTS 8
+
+/* Vendor codes */
+#define VENDOR_GAISLER 1
+#define VENDOR_PENDER 2
+#define VENDOR_ESA 4
+#define VENDOR_OPENCORES 8
+
+/* Gaisler Research device id's */
+#define GAISLER_LEON3 0x003
+#define GAISLER_LEON3DSU 0x004
+#define GAISLER_ETHAHB 0x005
+#define GAISLER_APBMST 0x006
+#define GAISLER_AHBUART 0x007
+#define GAISLER_SRCTRL 0x008
+#define GAISLER_SDCTRL 0x009
+#define GAISLER_APBUART 0x00C
+#define GAISLER_IRQMP 0x00D
+#define GAISLER_AHBRAM 0x00E
+#define GAISLER_GPTIMER 0x011
+#define GAISLER_PCITRG 0x012
+#define GAISLER_PCISBRG 0x013
+#define GAISLER_PCIFBRG 0x014
+#define GAISLER_PCITRACE 0x015
+#define GAISLER_PCIDMA 0x016
+#define GAISLER_AHBTRACE 0x017
+#define GAISLER_ETHDSU 0x018
+
+#define GAISLER_L2TIME 0xffd /* internal device: leon2 timer */
+#define GAISLER_L2C 0xffe /* internal device: leon2compat */
+#define GAISLER_PLUGPLAY 0xfff /* internal device: plug & play configarea */
+
+
+#ifndef __ASSEMBLER__
+
+extern inline char *gaisler_device_str(int id) {
+ switch(id) {
+ case GAISLER_LEON3: return "GAISLER_LEON3";
+ case GAISLER_LEON3DSU: return "GAISLER_LEON3DSU";
+ case GAISLER_ETHAHB: return "GAISLER_ETHAHB";
+ case GAISLER_APBMST: return "GAISLER_APBMST";
+ case GAISLER_AHBUART: return "GAISLER_AHBUART";
+ case GAISLER_SRCTRL: return "GAISLER_SRCTRL";
+ case GAISLER_SDCTRL: return "GAISLER_SDCTRL";
+ case GAISLER_APBUART: return "GAISLER_APBUART";
+ case GAISLER_IRQMP: return "GAISLER_IRQMP";
+ case GAISLER_AHBRAM: return "GAISLER_AHBRAM";
+ case GAISLER_GPTIMER: return "GAISLER_GPTIMER";
+ case GAISLER_PCITRG: return "GAISLER_PCITRG";
+ case GAISLER_PCISBRG: return "GAISLER_PCISBRG";
+ case GAISLER_PCIFBRG: return "GAISLER_PCIFBRG";
+ case GAISLER_PCITRACE: return "GAISLER_PCITRACE";
+ case GAISLER_AHBTRACE: return "GAISLER_AHBTRACE";
+ case GAISLER_ETHDSU: return "GAISLER_ETHDSU";
+
+ case GAISLER_L2TIME: return "GAISLER_L2TIME";
+ case GAISLER_L2C: return "GAISLER_L2C";
+ case GAISLER_PLUGPLAY: return "GAISLER_PLUGPLAY";
+
+ default: break;
+ }
+ return 0;
+}
+
+#endif
+
+/* European Space Agency device id's */
+#define ESA_LEON2 0x2
+#define ESA_MCTRL 0xF
+
+
+#ifndef __ASSEMBLER__
+
+extern inline char *esa_device_str(int id) {
+ switch(id) {
+ case ESA_LEON2: return "ESA_LEON2";
+ case ESA_MCTRL: return "ESA_MCTRL";
+ default: break;
+ }
+ return 0;
+}
+
+#endif
+
+/* Opencores device id's */
+#define OPENCORES_PCIBR 0x4
+#define OPENCORES_ETHMAC 0x5
+
+
+#ifndef __ASSEMBLER__
+
+extern inline char *opencores_device_str(int id) {
+ switch(id) {
+ case OPENCORES_PCIBR: return "OPENCORES_PCIBR";
+ case OPENCORES_ETHMAC: return "OPENCORES_ETHMAC";
+ default: break;
+ }
+ return 0;
+}
+
+extern inline char *device_id2str(int vendor, int id) {
+ switch(vendor) {
+ case VENDOR_GAISLER: return gaisler_device_str(id);
+ case VENDOR_ESA: return esa_device_str(id);
+ case VENDOR_OPENCORES: return opencores_device_str(id);
+ case VENDOR_PENDER:
+ default: break;
+ }
+ return 0;
+}
+
+extern inline char *vendor_id2str(int vendor) {
+ switch(vendor) {
+ case VENDOR_GAISLER: return "VENDOR_GAISLER";
+ case VENDOR_ESA: return "VENDOR_ESA";
+ case VENDOR_OPENCORES: return "VENDOR_OPENCORES";
+ case VENDOR_PENDER: return "VENDOR_PENDER";
+ default: break;
+ }
+ return 0;
+}
+
+#endif
+
+/* Vendor codes */
+
+
+
+/*
+ *
+ * Macros for manipulating Configuration registers
+ *
+ */
+
+#define LEON3_BYPASS_LOAD_PA(x) (leon_load_reg ((unsigned long)(x)))
+#define LEON3_BYPASS_STORE_PA(x,v) (leon_store_reg ((unsigned long)(x),(unsigned long)(v)))
+
+#define amba_get_confword(tab, index, word) (LEON3_BYPASS_LOAD_PA((tab).addr[(index)]+(word)))
+
+#define amba_vendor(x) (((x) >> 24) & 0xff)
+
+#define amba_device(x) (((x) >> 12) & 0xfff)
+
+#define amba_ahb_get_membar(tab, index, nr) (LEON3_BYPASS_LOAD_PA((tab).addr[(index)]+4+(nr)))
+
+#define amba_apb_get_membar(tab, index) (LEON3_BYPASS_LOAD_PA((tab).addr[(index)]+1))
+
+#define amba_membar_start(mbar) (((mbar) & 0xfff00000) & (((mbar) & 0xfff0) << 16))
+
+#define amba_iobar_start(base, iobar) ((base) | ((((iobar) & 0xfff00000)>>12) & (((iobar) & 0xfff0)<<4)) )
+
+#define amba_irq(conf) ((conf) & 0xf)
+
+#define amba_membar_type(mbar) ((mbar) & 0xf)
+
+#define AMBA_TYPE_APBIO 0x1
+#define AMBA_TYPE_MEM 0x2
+#define AMBA_TYPE_AHBIO 0x3
+
+#define AMBA_TYPE_AHBIO_ADDR(addr) (LEON3_IO_AREA | ((addr) >> 12))
+#endif
+
diff -Naur ../linux-2.6.10/include/asm-sparc/asi.h linux-2.6.10/include/asm-sparc/asi.h
--- ../linux-2.6.10/include/asm-sparc/asi.h 2004-12-24 22:34:44.000000000 +0100
+++ linux-2.6.10/include/asm-sparc/asi.h 2005-01-03 11:36:34.000000000 +0100
@@ -108,4 +108,10 @@
#define ASI_M_ACTION 0x4c /* Breakpoint Action Register (GNU/Viking) */
+/* FIXME: non-standard Leon ASI definition */
+#ifdef CONFIG_LEON
+#undef ASI_M_MMUREGS
+#define ASI_M_MMUREGS 0x19
+#endif /* CONFIG_LEON */
+
#endif /* _SPARC_ASI_H */
diff -Naur ../linux-2.6.10/include/asm-sparc/leon.h linux-2.6.10/include/asm-sparc/leon.h
--- ../linux-2.6.10/include/asm-sparc/leon.h 1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.10/include/asm-sparc/leon.h 2005-01-05 16:44:06.000000000 +0100
@@ -0,0 +1,270 @@
+/*
+ * Copyright (C) Gaisler Research, 2004 (Konrad Eisele <eiselekd@web.de>)
+ * Copyright (C) 2004 Stefan Holst (mail@s-holst.de), Uni-Stuttgart
+ */
+
+#ifndef LEON_H_INCLUDE
+#define LEON_H_INCLUDE
+
+#if defined(CONFIG_LEON) || defined(CONFIG_LEON_3)
+
+#include <linux/config.h>
+#include <asm/vaddrs.h>
+
+/* memory mapped leon control registers */
+#define LEON_PREGS 0x80000000
+#define LEON_MCFG1 0x00
+#define LEON_MCFG2 0x04
+#define LEON_ECTRL 0x08
+#define LEON_FADDR 0x0c
+#define LEON_MSTAT 0x10
+#define LEON_CCTRL 0x14
+#define LEON_PWDOWN 0x18
+#define LEON_WPROT1 0x1C
+#define LEON_WPROT2 0x20
+#define LEON_LCONF 0x24
+#define LEON_TCNT0 0x40
+#define LEON_TRLD0 0x44
+#define LEON_TCTRL0 0x48
+#define LEON_TCNT1 0x50
+#define LEON_TRLD1 0x54
+#define LEON_TCTRL1 0x58
+#define LEON_SCNT 0x60
+#define LEON_SRLD 0x64
+#define LEON_UART0 0x70
+#define LEON_UDATA0 0x70
+#define LEON_USTAT0 0x74
+#define LEON_UCTRL0 0x78
+#define LEON_USCAL0 0x7c
+#define LEON_UART1 0x80
+#define LEON_UDATA1 0x80
+#define LEON_USTAT1 0x84
+#define LEON_UCTRL1 0x88
+#define LEON_USCAL1 0x8c
+#define LEON_IMASK 0x90
+#define LEON_IPEND 0x94
+#define LEON_IFORCE 0x98
+#define LEON_ICLEAR 0x9c
+#define LEON_IOREG 0xA0
+#define LEON_IODIR 0xA4
+#define LEON_IOICONF 0xA8
+#define LEON_IPEND2 0xB0
+#define LEON_IMASK2 0xB4
+#define LEON_ISTAT2 0xB8
+#define LEON_ICLEAR2 0xBC
+
+#ifndef CONFIG_LEON_3
+
+/* ASI codes */
+#define ASI_LEON_PCI 0x04
+#define ASI_LEON_IFLUSH 0x05
+#define ASI_LEON_DFLUSH 0x06
+#define ASI_LEON_ITAG 0x0c
+#define ASI_LEON_IDATA 0x0d
+#define ASI_LEON_DTAG 0x0e
+#define ASI_LEON_DDATA 0x0f
+#define ASI_LEON_MMUFLUSH 0x18
+#define ASI_LEON_MMUREGS 0x19
+#define ASI_LEON_BYPASS 0x1c
+#define ASI_LEON_FLUSH_PAGE 0x10
+/*
+#define ASI_LEON_FLUSH_SEGMENT 0x11
+#define ASI_LEON_FLUSH_REGION 0x12
+*/
+#define ASI_LEON_FLUSH_CTX 0x13
+#define ASI_LEON_DCTX 0x14
+#define ASI_LEON_ICTX 0x15
+#define ASI_MMU_DIAG 0x1d
+
+#else
+
+#define ASI_LEON_IFLUSH 0x10
+#define ASI_LEON_DFLUSH 0x11
+
+#define ASI_LEON_MMUFLUSH 0x18
+#define ASI_LEON_MMUREGS 0x19
+#define ASI_LEON_BYPASS 0x1c
+#define ASI_LEON_FLUSH_PAGE 0x10
+
+/*
+constant ASI_SYSR : asi_type := "00010"; -- 0x02
+constant ASI_UINST : asi_type := "01000"; -- 0x08
+constant ASI_SINST : asi_type := "01001"; -- 0x09
+constant ASI_UDATA : asi_type := "01010"; -- 0x0A
+constant ASI_SDATA : asi_type := "01011"; -- 0x0B
+constant ASI_ITAG : asi_type := "01100"; -- 0x0C
+constant ASI_IDATA : asi_type := "01101"; -- 0x0D
+constant ASI_DTAG : asi_type := "01110"; -- 0x0E
+constant ASI_DDATA : asi_type := "01111"; -- 0x0F
+constant ASI_IFLUSH : asi_type := "10000"; -- 0x10
+constant ASI_DFLUSH : asi_type := "10001"; -- 0x11
+
+constant ASI_FLUSH_PAGE : std_logic_vector(4 downto 0) := "10000"; -- 0x10 i/dcache flush page
+constant ASI_FLUSH_CTX : std_logic_vector(4 downto 0) := "10011"; -- 0x13 i/dcache flush ctx
+
+constant ASI_DCTX : std_logic_vector(4 downto 0) := "10100"; -- 0x14 dcache ctx
+constant ASI_ICTX : std_logic_vector(4 downto 0) := "10101"; -- 0x15 icache ctx
+
+constant ASI_MMUFLUSHPROBE : std_logic_vector(4 downto 0) := "11000"; -- 0x18 i/dtlb flush/(probe)
+constant ASI_MMUREGS : std_logic_vector(4 downto 0) := "11001"; -- 0x19 mmu regs access
+constant ASI_MMU_BP : std_logic_vector(4 downto 0) := "11100"; -- 0x1c mmu Bypass
+constant ASI_MMU_DIAG : std_logic_vector(4 downto 0) := "11101"; -- 0x1d mmu diagnostic
+constant ASI_MMU_DSU : std_logic_vector(4 downto 0) := "11111"; -- 0x1f mmu diagnostic
+*/
+#endif
+
+/* mmu register access, ASI_LEON_MMUREGS */
+#define LEON_CNR_CTRL 0x000
+#define LEON_CNR_CTXP 0x100
+#define LEON_CNR_CTX 0x200
+#define LEON_CNR_F 0x300
+#define LEON_CNR_FADDR 0x400
+
+#define LEON_CNR_CTX_NCTX 256 /*number of MMU ctx*/
+
+#define LEON_CNR_CTRL_TLBDIS 0x80000000
+
+#define LEON_MMUTLB_ENT_MAX 64
+
+/*
+ * diagnostic access from mmutlb.vhd:
+ * 0: pte address
+ * 4: pte
+ * 8: additional flags
+ */
+#define LEON_DIAGF_LVL 0x3
+#define LEON_DIAGF_WR 0x8
+#define LEON_DIAGF_WR_SHIFT 3
+#define LEON_DIAGF_HIT 0x10
+#define LEON_DIAGF_HIT_SHIFT 4
+#define LEON_DIAGF_CTX 0x1fe0
+#define LEON_DIAGF_CTX_SHIFT 5
+#define LEON_DIAGF_VALID 0x2000
+#define LEON_DIAGF_VALID_SHIFT 13
+
+
+/*
+ * Interrupt Sources
+ *
+ * The interrupt source numbers directly map to the trap type and to
+ * the bits used in the Interrupt Clear, Interrupt Force, Interrupt Mask,
+ * and the Interrupt Pending Registers.
+ */
+#define LEON_INTERRUPT_CORRECTABLE_MEMORY_ERROR 1
+#define LEON_INTERRUPT_UART_1_RX_TX 2
+#define LEON_INTERRUPT_UART_0_RX_TX 3
+#define LEON_INTERRUPT_EXTERNAL_0 4
+#define LEON_INTERRUPT_EXTERNAL_1 5
+#define LEON_INTERRUPT_EXTERNAL_2 6
+#define LEON_INTERRUPT_EXTERNAL_3 7
+#define LEON_INTERRUPT_TIMER1 8
+#define LEON_INTERRUPT_TIMER2 9
+#define LEON_INTERRUPT_EMPTY1 10
+#define LEON_INTERRUPT_EMPTY2 11
+#define LEON_INTERRUPT_OPEN_ETH 12
+#define LEON_INTERRUPT_EMPTY4 13
+#define LEON_INTERRUPT_EMPTY5 14
+#define LEON_INTERRUPT_EMPTY6 15
+
+/* irq masks */
+#define LEON_HARD_INT(x) (1 << (x)) /* irq 0-15 */
+#define LEON_IRQMASK_R 0x0000fffe /* bit 15- 1 of lregs.irqmask */
+#define LEON_IRQPRIO_R 0xfffe0000 /* bit 31-17 of lregs.irqmask */
+
+/* leon uart register definitions */
+#define LEON_OFF_UDATA 0x0
+#define LEON_OFF_USTAT 0x4
+#define LEON_OFF_UCTRL 0x8
+#define LEON_OFF_USCAL 0xc
+
+#define LEON_UCTRL_RE 0x01
+#define LEON_UCTRL_TE 0x02
+#define LEON_UCTRL_RI 0x04
+#define LEON_UCTRL_TI 0x08
+#define LEON_UCTRL_PS 0x10
+#define LEON_UCTRL_PE 0x20
+#define LEON_UCTRL_FL 0x40
+#define LEON_UCTRL_LB 0x80
+
+#define LEON_USTAT_DR 0x01
+#define LEON_USTAT_TS 0x02
+#define LEON_USTAT_TH 0x04
+#define LEON_USTAT_BR 0x08
+#define LEON_USTAT_OV 0x10
+#define LEON_USTAT_PE 0x20
+#define LEON_USTAT_FE 0x40
+
+#define LEON_MCFG2_SRAMDIS 0x00002000
+#define LEON_MCFG2_SDRAMEN 0x00004000
+#define LEON_MCFG2_SRAMBANKSZ 0x00001e00 /* [12-9] */
+#define LEON_MCFG2_SRAMBANKSZ_SHIFT 9
+#define LEON_MCFG2_SDRAMBANKSZ 0x03800000 /* [25-23] */
+#define LEON_MCFG2_SDRAMBANKSZ_SHIFT 23
+
+#define LEON_TCNT0_MASK 0x7fffff
+
+#define LEON_USTAT_ERROR (LEON_USTAT_OV|LEON_USTAT_PE|LEON_USTAT_FE) /*no break yet*/
+
+#ifdef CONFIG_OPEN_ETH
+#define LEON_ETH_BASE_ADD ((unsigned long)LEON_VA_ETHERMAC)
+/* map leon on ethermac adress space at pa 0xb0000000 */
+#define LEON_VA_ETHERMAC DVMA_VADDR
+#endif
+
+#ifndef __ASSEMBLY__
+
+/* do a physical address bypass write, i.e. for 0x80000000 */
+static __inline__ void leon_store_reg(unsigned long paddr,unsigned long value)
+{
+ __asm__ __volatile__("sta %0, [%1] %2\n\t": :
+ "r" (value), "r" (paddr),
+ "i" (ASI_LEON_BYPASS) : "memory");
+}
+
+/* do a physical address bypass load, i.e. for 0x80000000 */
+static __inline__ unsigned long leon_load_reg(unsigned long paddr)
+{
+ unsigned long retval;
+ __asm__ __volatile__("lda [%1] %2, %0\n\t" :
+ "=r" (retval) :
+ "r" (paddr), "i" (ASI_LEON_BYPASS));
+ return retval;
+}
+
+extern __inline__ void leon_srmmu_disabletlb(void)
+{
+ unsigned int retval;
+ __asm__ __volatile__("lda [%%g0] %2, %0\n\t" : "=r" (retval) : "r" (0), "i" (ASI_LEON_MMUREGS));
+ retval |= LEON_CNR_CTRL_TLBDIS;
+ __asm__ __volatile__("sta %0, [%%g0] %2\n\t" : : "r" (retval), "r" (0), "i" (ASI_LEON_MMUREGS) : "memory");
+}
+
+extern __inline__ void leon_srmmu_enabletlb(void)
+{
+ unsigned int retval;
+ __asm__ __volatile__("lda [%%g0] %2, %0\n\t" : "=r" (retval) : "r" (0), "i" (ASI_LEON_MMUREGS));
+ retval = retval & ~LEON_CNR_CTRL_TLBDIS;
+ __asm__ __volatile__("sta %0, [%%g0] %2\n\t" : : "r" (retval), "r" (0), "i" (ASI_LEON_MMUREGS) : "memory");
+}
+
+#define LEON_BYPASS_LOAD_PA(x) leon_load_reg ((unsigned long)(x))
+#define LEON_BYPASS_STORE_PA(x,v) leon_store_reg((unsigned long)(x),(unsigned long)(v))
+#define LEON_REGLOAD_PA(x) leon_load_reg ((unsigned long)(x)+LEON_PREGS)
+#define LEON_REGSTORE_PA(x,v) leon_store_reg((unsigned long)(x)+LEON_PREGS,(unsigned long)(v))
+#define LEON_REGSTORE_OR_PA(x,v) LEON_REGSTORE_PA(x,LEON_REGLOAD_PA(x)|(unsigned long)(v))
+#define LEON_REGSTORE_AND_PA(x,v) LEON_REGSTORE_PA(x,LEON_REGLOAD_PA(x)&(unsigned long)(v))
+
+extern unsigned long srmmu_swprobe(unsigned long vaddr,unsigned long *paddr);
+extern void leon_inherit_prom_mappings(unsigned long start,unsigned long end);
+
+#define LEONSETUP_MEM_BASEADDR 0x40000000
+
+#endif /* !ASM */
+
+#ifdef CONFIG_LEON_3
+#include <asm/leon3.h>
+#endif
+
+#endif //defined(CONFIG_LEON) || defined(CONFIG_LEON_3)
+
+#endif
diff -Naur ../linux-2.6.10/include/asm-sparc/leon3.h linux-2.6.10/include/asm-sparc/leon3.h
--- ../linux-2.6.10/include/asm-sparc/leon3.h 1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.10/include/asm-sparc/leon3.h 2005-01-05 16:44:10.000000000 +0100
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) Gaisler Research, 2004 (Konrad Eisele <eiselekd@web.de>)
+ */
+
+#ifndef _INCLUDE_LEON_3_h_
+#define _INCLUDE_LEON_3_h_
+
+#include <asm/amba.h>
+
+#ifndef __ASSEMBLER__
+
+/*
+ * The following defines the bits in the LEON UART Status Registers.
+ */
+
+#define LEON_REG_UART_STATUS_DR 0x00000001 /* Data Ready */
+#define LEON_REG_UART_STATUS_TSE 0x00000002 /* TX Send Register Empty */
+#define LEON_REG_UART_STATUS_THE 0x00000004 /* TX Hold Register Empty */
+#define LEON_REG_UART_STATUS_BR 0x00000008 /* Break Error */
+#define LEON_REG_UART_STATUS_OE 0x00000010 /* RX Overrun Error */
+#define LEON_REG_UART_STATUS_PE 0x00000020 /* RX Parity Error */
+#define LEON_REG_UART_STATUS_FE 0x00000040 /* RX Framing Error */
+#define LEON_REG_UART_STATUS_ERR 0x00000078 /* Error Mask */
+
+
+/*
+ * The following defines the bits in the LEON UART Ctrl Registers.
+ */
+
+#define LEON_REG_UART_CTRL_RE 0x00000001 /* Receiver enable */
+#define LEON_REG_UART_CTRL_TE 0x00000002 /* Transmitter enable */
+#define LEON_REG_UART_CTRL_RI 0x00000004 /* Receiver interrupt enable */
+#define LEON_REG_UART_CTRL_TI 0x00000008 /* Transmitter interrupt enable */
+#define LEON_REG_UART_CTRL_PS 0x00000010 /* Parity select */
+#define LEON_REG_UART_CTRL_PE 0x00000020 /* Parity enable */
+#define LEON_REG_UART_CTRL_FL 0x00000040 /* Flow control enable */
+#define LEON_REG_UART_CTRL_LB 0x00000080 /* Loop Back enable */
+
+#define LEON3_GPTIMER_EN 1
+#define LEON3_GPTIMER_RL 2
+#define LEON3_GPTIMER_LD 4
+#define LEON3_GPTIMER_IRQEN 8
+
+
+typedef struct {
+ volatile unsigned int ilevel;
+ volatile unsigned int ipend;
+ volatile unsigned int iforce;
+ volatile unsigned int iclear;
+ volatile unsigned int notused00;
+ volatile unsigned int notused01;
+ volatile unsigned int notused02;
+ volatile unsigned int notused03;
+ volatile unsigned int notused10;
+ volatile unsigned int notused11;
+ volatile unsigned int notused12;
+ volatile unsigned int notused13;
+ volatile unsigned int notused20;
+ volatile unsigned int notused21;
+ volatile unsigned int notused22;
+ volatile unsigned int notused23;
+ volatile unsigned int mask[16];
+} LEON3_IrqCtrl_Regs_Map;
+
+typedef struct {
+ volatile unsigned int data;
+ volatile unsigned int status;
+ volatile unsigned int ctrl;
+ volatile unsigned int scaler;
+} LEON3_APBUART_Regs_Map;
+
+
+typedef struct {
+ volatile unsigned int val;
+ volatile unsigned int rld;
+ volatile unsigned int ctrl;
+ volatile unsigned int unused;
+} LEON3_GpTimerElem_Regs_Map;
+
+typedef struct {
+ volatile unsigned int scalar;
+ volatile unsigned int scalar_reload;
+ volatile unsigned int config;
+ volatile unsigned int unused;
+ volatile LEON3_GpTimerElem_Regs_Map e[8];
+} LEON3_GpTimer_Regs_Map;
+
+/*
+ * Types and structure used for AMBA Plug & Play bus scanning
+ */
+
+typedef struct amba_device_table {
+ int devnr; /* numbrer of devices on AHB or APB bus */
+ unsigned int *addr[16]; /* addresses to the devices configuration tables */
+ unsigned int allocbits[1]; /* 0=unallocated, 1=allocated driver */
+} amba_device_table;
+
+typedef struct amba_confarea_type {
+ amba_device_table ahbmst;
+ amba_device_table ahbslv;
+ amba_device_table apbslv;
+ unsigned int apbmst;
+} amba_confarea_type;
+
+extern unsigned long amba_find_apbslv_addr(unsigned long vendor, unsigned long device, unsigned long *irq);
+
+// collect apb slaves
+typedef struct amba_apb_device {
+ unsigned int start, irq;
+} amba_apb_device;
+extern int amba_get_free_apbslv_devices (int vendor, int device, amba_apb_device *dev,int nr);
+
+// collect ahb slaves
+typedef struct amba_ahb_device {
+ unsigned int start[4], irq;
+} amba_ahb_device;
+extern int amba_get_free_ahbslv_devices (int vendor, int device, amba_ahb_device *dev,int nr);
+
+#endif //!__ASSEMBLER__
+
+
+#endif
+
diff -Naur ../linux-2.6.10/include/asm-sparc/machines.h linux-2.6.10/include/asm-sparc/machines.h
--- ../linux-2.6.10/include/asm-sparc/machines.h 2004-12-24 22:33:49.000000000 +0100
+++ linux-2.6.10/include/asm-sparc/machines.h 2005-01-03 11:36:34.000000000 +0100
@@ -15,7 +15,7 @@
/* Current number of machines we know about that has an IDPROM
* machtype entry including one entry for the 0x80 OBP machines.
*/
-#define NUM_SUN_MACHINES 15
+#define NUM_SUN_MACHINES 16
extern struct Sun_Machine_Models Sun_Machines[NUM_SUN_MACHINES];
@@ -32,6 +32,7 @@
#define SM_ARCH_MASK 0xf0
#define SM_SUN4 0x20
+#define M_LEON2 0x30
#define SM_SUN4C 0x50
#define SM_SUN4M 0x70
#define SM_SUN4M_OBP 0x80
@@ -43,6 +44,9 @@
#define SM_4_330 0x03 /* Sun 4/300 series */
#define SM_4_470 0x04 /* Sun 4/400 series */
+/* Leon machines */
+#define M_LEON2_SOC 0x01 /* Leon2 SoC */
+
/* Sun4c machines Full Name - PROM NAME */
#define SM_4C_SS1 0x01 /* Sun4c SparcStation 1 - Sun 4/60 */
#define SM_4C_IPC 0x02 /* Sun4c SparcStation IPC - Sun 4/40 */
diff -Naur ../linux-2.6.10/include/asm-sparc/system.h linux-2.6.10/include/asm-sparc/system.h
--- ../linux-2.6.10/include/asm-sparc/system.h 2004-12-24 22:35:23.000000000 +0100
+++ linux-2.6.10/include/asm-sparc/system.h 2005-01-03 11:36:34.000000000 +0100
@@ -29,6 +29,7 @@
sun4u = 0x05, /* V8 ploos ploos */
sun_unknown = 0x06,
ap1000 = 0x07, /* almost a sun4m */
+ sparc_leon = 0x08, /* Leon2 SoC */
};
/* Really, userland should not be looking at any of this... */
diff -Naur ../linux-2.6.10/include/asm-sparc/vaddrs.h linux-2.6.10/include/asm-sparc/vaddrs.h
--- ../linux-2.6.10/include/asm-sparc/vaddrs.h 2004-12-24 22:33:49.000000000 +0100
+++ linux-2.6.10/include/asm-sparc/vaddrs.h 2005-01-03 16:38:41.000000000 +0100
@@ -17,7 +17,11 @@
#define SRMMU_NOCACHE_VADDR (KERNBASE + SRMMU_MAXMEM)
/* = 0x0fc000000 */
/* XXX Empiricals - this needs to go away - KMW */
+#if defined(CONFIG_LEON) || defined(CONFIG_LEON_3)
+#define SRMMU_MIN_NOCACHE_PAGES (128)
+#else
#define SRMMU_MIN_NOCACHE_PAGES (550)
+#endif
#define SRMMU_MAX_NOCACHE_PAGES (1280)
/* The following constant is used in mm/srmmu.c::srmmu_nocache_calcsize()
next prev parent reply other threads:[~2005-01-05 16:04 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-01-04 19:03 [1/7] LEON SPARC V8 processor support for linux-2.6.10 Jiri Gaisler
2005-01-04 19:03 ` Jiri Gaisler
2005-01-05 0:01 ` Alan Cox
2005-01-05 16:04 ` Jiri Gaisler [this message]
2005-01-05 16:04 ` Jiri Gaisler
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=41DC1003.8090000@gaisler.com \
--to=jiri@gaisler.com \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=linux-kernel@vger.kernel.org \
--cc=sparclinux@vger.kernel.org \
--cc=wli@holomorphy.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.