/*      $NetBSD: adm5120reg.h,v 1.2 2008/04/28 20:23:27 martin Exp $    */

/*-
* Copyright (c) 2007 Ruslan Ermilov and Vsevolod Lobko.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above
*    copyright notice, this list of conditions and the following
*    disclaimer in the documentation and/or other materials provided
*    with the distribution.
* 3. The names of the authors may not be used to endorse or promote
*    products derived from this software without specific prior
*    written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
* OF SUCH DAMAGE.
*/
/*-
* Copyright (c) 2001 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Jason R. Thorpe.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/

#ifndef _ADM5120REG_H_
#define _ADM5120REG_H_

/*
* Memory map and register definitions for the Alchemy Semiconductor Pb1000.
*/

/* Last byte of physical address space. */
#define ADM5120_TOP                     0x1fffffff
#define ADM5120_BOTTOM                  0x0

/* Flash addresses */
#define ADM5120_BASE_SRAM0              0x1fc00000

/* UARTs */
#define ADM5120_BASE_UART1              0x12800000
#define ADM5120_BASE_UART0              0x12600000

/* ICU */
#define ADM5120_BASE_ICU                0x12200000
#define         ICU_STATUS_REG          0x00
#define         ICU_RAW_STATUS_REG      0x04
#define         ICU_ENABLE_REG          0x08
#define         ICU_DISABLE_REG         0x0c
#define         ICU_SOFT_REG            0x10
#define         ICU_MODE_REG            0x14
#define         ICU_FIQ_STATUS_REG      0x18
#define         ICU_TESTSRC_REG         0x1c
#define         ICU_SRCSEL_REG          0x20
#define         ICU_LEVEL_REG           0x24
#define         ICU_INT_MASK            0x3ff

/* Switch */
#define ADM5120_BASE_SWITCH             0x12000000
#define         SW_CODE_REG             0x00
#define                 CLKS_MASK               0x00300000
#define                 CLKS_175MHZ             0x00000000
#define                 CLKS_200MHZ             0x00100000
#define         SW_SFTRES_REG           0x04
#define         SW_MEMCONT_REG          0x1c
#define                 SDRAM_SIZE_4MBYTES      0x0001
#define                 SDRAM_SIZE_8MBYTES      0x0002
#define                 SDRAM_SIZE_16MBYTES     0x0003
#define                 SDRAM_SIZE_64MBYTES     0x0004
#define                 SDRAM_SIZE_128MBYTES    0x0005
#define                 SDRAM_SIZE_MASK         0x0007
#define                 SRAM0_SIZE_SHIFT        8
#define                 SRAM1_SIZE_SHIFT        16
#define                 SRAM_MASK               0x0007
#define                 SRAM_SSIZE              0x40000

#define ADM5120_BASE_PCI_CONFDATA       0x115ffff8
#define ADM5120_BASE_PCI_CONFADDR       0x115ffff0
#define ADM5120_BASE_PCI_IO             0x11500000
#define ADM5120_BASE_PCI_MEM            0x11400000
#define ADM5120_BASE_USB                0x11200000
#define ADM5120_BASE_MPMC               0x11000000
#define ADM5120_BASE_EXTIO1             0x10e00000
#define ADM5120_BASE_EXTIO0             0x10c00000
#define ADM5120_BASE_RSVD0              0x10800000
#define ADM5120_BASE_SRAM1              0x10000000

#define _REG_READ(b, o) *((volatile uint32_t *)MIPS_PHYS_TO_KSEG1((b) + (o)))
#define SW_READ(o)      _REG_READ(ADM5120_BASE_SWITCH, o)

#define _REG_WRITE(b, o, v)     (_REG_READ(b, o)) = (v)
#define SW_WRITE(o, v)  _REG_WRITE(ADM5120_BASE_SWITCH,o, v)

/* USB */

/* Watchdog Timers: base address is switch controller */

#define ADM5120_WDOG0                   0x00c0
#define ADM5120_WDOG1                   0x00c4

#define ADM5120_WDOG0_WTTR      __BIT(31)       /* 0: do not reset,
                                                * 1: reset on wdog expiration
                                                */
#define ADM5120_WDOG1_WDE       __BIT(31)       /* 0: deactivate,
                                                * 1: drop all CPU-bound
                                                * packets, disable flow
                                                * control on all ports.
                                                */
#define ADM5120_WDOG_WTS_MASK   __BITS(30, 16)  /* Watchdog Timer Set:
                                                * timer expires when it
                                                * reaches WTS.  Units of
                                                * 10ms.
                                                */
#define ADM5120_WDOG_RSVD       __BIT(15)
#define ADM5120_WDOG_WT_MASK    __BITS(14, 0)   /* Watchdog Timer:
                                                * counts up, write to clear.
                                                */

/* GPIO: base address is switch controller */
#define ADM5120_GPIO0                   0x00b8

#define ADM5120_GPIO0_OV        __BITS(31, 24)  /* rw: output value */
#define ADM5120_GPIO0_OE        __BITS(23, 16)  /* rw: output enable,
                                                * bit[n] = 0 -> input
                                                * bit[n] = 1 -> output
                                                */
#define ADM5120_GPIO0_IV        __BITS(15, 8)   /* ro: input value */
#define ADM5120_GPIO0_RSVD      __BITS(7, 0)    /* rw: reserved */

#define ADM5120_GPIO2                   0x00bc
#define ADM5120_GPIO2_EW        __BIT(6)        /* 1: enable wait state pin,
                                                * pin GPIO[0], for GPIO[1]
                                                * or GPIO[3] Chip Select:
                                                * memory controller waits for
                                                * WAIT# inactive (high).
                                                */
#define ADM5120_GPIO2_CSX1      __BIT(5)        /* 1: GPIO[3:4] act as
                                                * Chip Select for
                                                * External I/O 1 (CSX1)
                                                * and External Interrupt 1
                                                * (INTX1), respectively.
                                                * 0: CSX1/INTX1 disabled
                                                */
#define ADM5120_GPIO2_CSX0      __BIT(4)        /* 1: GPIO[1:2] act as
                                                * Chip Select for
                                                * External I/O 0 (CSX0)
                                                * and External Interrupt 0
                                                * (INTX0), respectively.
                                                * 0: CSX0/INTX0 disabled
                                                */

/* MultiPort Memory Controller (MPMC) */

#define ADM5120_MPMC_CONTROL    0x000
#define ADM5120_MPMC_CONTROL_DWB        __BIT(3)        /* write 1 to
                                                        * drain write
                                                        * buffers.  write 0
                                                        * for normal buffer
                                                        * operation.
                                                        */
#define ADM5120_MPMC_CONTROL_LPM        __BIT(2)        /* 1: activate low-power
                                                        * mode.  SDRAM is
                                                        * still refreshed.
                                                        */
#define ADM5120_MPMC_CONTROL_AM         __BIT(1)        /* 1: address mirror:
                                                        * static memory
                                                        * chip select 0
                                                        * is mapped to chip
                                                        * select 1.
                                                        */
#define ADM5120_MPMC_CONTROL_ME         __BIT(0)        /* 0: disable MPMC.
                                                        * DRAM is not
                                                        * refreshed.
                                                        * 1: enable MPMC.
                                                        */

#define ADM5120_MPMC_STATUS     0x004
#define ADM5120_MPMC_STATUS_SRA         __BIT(2)        /* read-only
                                                        * MPMC operating mode
                                                        * indication,
                                                        * 1: self-refresh
                                                        * acknowledge
                                                        * 0: normal mode
                                                        */
#define ADM5120_MPMC_STATUS_WBS         __BIT(1)        /* read-only
                                                        * write-buffer status,
                                                        * 0: buffers empty
                                                        * 1: contain data
                                                        */
#define ADM5120_MPMC_STATUS_BU          __BIT(0)        /* read-only MPMC
                                                        * "busy" indication,
                                                        * 0: MPMC idle
                                                        * 1: MPMC is performing
                                                        * memory transactions
                                                        */

#define ADM5120_MPMC_SEW        0x080
#define ADM5120_MPMC_SEW_RSVD   __BITS(31, 10)
#define ADM5120_MPMC_SEW_EWTO   __BITS(9, 0)    /* timeout access after
                                                * 16 * (n + 1) clock cycles
                                                * (XXX which clock?)
                                                */

#define ADM5120_MPMC_SC(__i)    (0x200 + 0x020 * (__i))
#define ADM5120_MPMC_SC_RSVD0   __BITS(31, 21)
#define ADM5120_MPMC_SC_WP      __BIT(20)       /* 1: write protect */
#define ADM5120_MPMC_SC_BE      __BIT(20)       /* 1: enable write buffer */
#define ADM5120_MPMC_SC_RSVD1   __BITS(18, 9)
#define ADM5120_MPMC_SC_EW      __BIT(8)        /* 1: enable extended wait;
                                                */
#define ADM5120_MPMC_SC_BLS     __BIT(7)        /* 0: byte line state pins
                                                * are active high on read,
                                                * active low on write.
                                                *
                                                * 1: byte line state pins
                                                * are active low on read and
                                                * on write.
                                                */
#define ADM5120_MPMC_SC_CCP     __BIT(6)        /* 0: chip select is active low,
                                                * 1: active high
                                                */
#define ADM5120_MPMC_SC_RSVD2   __BITS(5, 4)
#define ADM5120_MPMC_SC_PM      __BIT(3)        /* 0: page mode disabled,
                                                * 1: enable asynchronous
                                                * page mode four
                                                */
#define ADM5120_MPMC_SC_RSVD3   __BIT(2)
#define ADM5120_MPMC_SC_MW_MASK __BITS(1, 0)    /* memory width, bits */
#define ADM5120_MPMC_SC_MW_8B   __SHIFTIN(0, ADM5120_MPMC_SC_MW_MASK)
#define ADM5120_MPMC_SC_MW_16B  __SHIFTIN(1, ADM5120_MPMC_SC_MW_MASK)
#define ADM5120_MPMC_SC_MW_32B  __SHIFTIN(2, ADM5120_MPMC_SC_MW_MASK)
#define ADM5120_MPMC_SC_MW_RSVD __SHIFTIN(3, ADM5120_MPMC_SC_MW_MASK)

#define ADM5120_MPMC_SWW(__i)   (0x204 + 0x020 * (__i))
#define ADM5120_MPMC_SWW_RSVD   __BITS(31, 4)
#define ADM5120_MPMC_SWW_WWE    __BITS(3, 0)    /* delay (n + 1) * HCLK cycles
                                                * after asserting chip select
                                                * (CS) before asserting write
                                                * enable (WE)
                                                */

#define ADM5120_MPMC_SWO(__i)   (0x208 + 0x020 * (__i))
#define ADM5120_MPMC_SWO_RSVD   __BITS(31, 4)
#define ADM5120_MPMC_SWO_WOE    __BITS(3, 0)    /* delay n * HCLK cycles
                                                * after asserting chip select
                                                * before asserting output
                                                * enable (OE)
                                                */

#define ADM5120_MPMC_SWR(__i)   (0x20c + 0x020 * (__i))
#define ADM5120_MPMC_SWR_RSVD   __BITS(31, 5)
#define ADM5120_MPMC_SWR_NMRW   __BITS(4, 0)    /* read wait states for
                                                * either first page-mode
                                                * access or for non-page mode
                                                * read, (n + 1) * HCLK cycles
                                                */

#define ADM5120_MPMC_SWP(__i)   (0x210 + 0x020 * (__i))
#define ADM5120_MPMC_SWP_RSVD   __BITS(31, 5)
#define ADM5120_MPMC_SWP_WPS    __BITS(4, 0)    /* read wait states for
                                                * second and subsequent
                                                * page-mode read,
                                                * (n + 1) * HCLK cycles
                                                */

#define ADM5120_MPMC_SWWR(__i)  (0x214 + 0x020 * (__i))
#define ADM5120_MPMC_SWWR_RSVD  __BITS(31, 5)
#define ADM5120_MPMC_SWWR_WWS   __BITS(4, 0)    /* write wait states after
                                                * the first read (??),
                                                * (n + 2) * HCLK cycles
                                                */

#define ADM5120_MPMC_SWT(__i)   (0x218 + 0x020 * (__i))
#define ADM5120_MPMC_SWT_RSVD           __BITS(31, 4)
#define ADM5120_MPMC_SWT_WAITTURN       __BITS(3, 0)    /* bus turnaround time,
                                                        * (n + 1) * HCLK cycles
                                                        */

#endif /* _ADM5120REG_H_ */