freebsd-dev/sys/sparc64/sbus/sbusreg.h

146 lines
7.1 KiB
C
Raw Normal View History

/*-
* Copyright (c) 1996-1999 Eduardo Horvath
*
* 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
*
* from: NetBSD: sbusreg.h,v 1.7 1999/06/07 05:28:03 eeh Exp
*
* $FreeBSD$
*/
#ifndef _SPARC64_SBUS_SBUSREG_H_
#define _SPARC64_SBUS_SBUSREG_H_
/*
* Sbus device addresses are obtained from the FORTH PROMs. They come
* in `absolute' and `relative' address flavors, so we have to handle both.
* Relative addresses do *not* include the slot number.
*/
#define SBUS_BASE 0xf8000000
#define SBUS_ADDR(slot, off) (SBUS_BASE + ((slot) << 25) + (off))
#define SBUS_ABS(a) ((unsigned)(a) >= SBUS_BASE)
#define SBUS_ABS_TO_SLOT(a) (((a) - SBUS_BASE) >> 25)
#define SBUS_ABS_TO_OFFSET(a) (((a) - SBUS_BASE) & 0x1ffffff)
/*
* Sun4u S-bus definitions. Here's where we deal w/the machine
* dependencies of sysio.
*
* SYSIO implements or is the interface to several things:
*
* o The SBUS interface itself
* o The IOMMU
* o The DVMA units
* o The interrupt controller
* o The counter/timers
*
* Since it has registers to control lots of different things
* as well as several on-board SBUS devices and external SBUS
* slots scattered throughout its address space, it's a pain.
*
* One good point, however, is that all registers are 64-bit.
*/
#define SBR_UPA_PORTID 0x0000 /* UPA port ID register */
#define SBR_UPA_CONFIG 0x0008 /* UPA config register */
#define SBR_CS 0x0010 /* SYSIO control/status register */
#define SBR_ECCC 0x0020 /* ECC control register */
#define SBR_UE_AFS 0x0030 /* Uncorrectable Error AFSR */
#define SBR_UE_AFA 0x0038 /* Uncorrectable Error AFAR */
#define SBR_CE_AFS 0x0040 /* Correctable Error AFSR */
#define SBR_CE_AFA 0x0048 /* Correctable Error AFAR */
#define SBR_PM_CTL 0x0100 /* Performance monitor control reg */
#define SBR_PM_COUNT 0x0108 /* Performance monitor counter reg */
#define SBR_CTL 0x2000 /* SBUS Control Register */
#define SBR_AFS 0x2010 /* SBUS AFSR */
#define SBR_AFA 0x2018 /* SBUS AFAR */
#define SBR_CONFIG0 0x2020 /* SBUS Slot 0 config register */
#define SBR_CONFIG1 0x2028 /* SBUS Slot 1 config register */
#define SBR_CONFIG2 0x2030 /* SBUS Slot 2 config register */
#define SBR_CONFIG3 0x2038 /* SBUS Slot 3 config register */
#define SBR_CONFIG13 0x2040 /* Slot 13 config register <audio> */
#define SBR_CONFIG14 0x2048 /* Slot 14 config register <macio> */
#define SBR_CONFIG15 0x2050 /* Slot 15 config register <slavio> */
#define SBR_IOMMU 0x2400 /* IOMMU register block */
#define SBR_STRBUF 0x2800 /* stream buffer register block */
#define SBR_SLOT0_INT_MAP 0x2c00 /* SBUS slot 0 interrupt map reg */
#define SBR_SLOT1_INT_MAP 0x2c08 /* SBUS slot 1 interrupt map reg */
#define SBR_SLOT2_INT_MAP 0x2c10 /* SBUS slot 2 interrupt map reg */
#define SBR_SLOT3_INT_MAP 0x2c18 /* SBUS slot 3 interrupt map reg */
#define SBR_INTR_RETRY_TIM 0x2c20 /* interrupt retry timer reg */
#define SBR_SCSI_INT_MAP 0x3000 /* SCSI interrupt map reg */
#define SBR_ETHER_INT_MAP 0x3008 /* ethernet interrupt map reg */
#define SBR_BPP_INT_MAP 0x3010 /* parallel interrupt map reg */
#define SBR_AUDIO_INT_MAP 0x3018 /* audio interrupt map reg */
#define SBR_POWER_INT_MAP 0x3020 /* power fail interrupt map reg */
#define SBR_SKBDMS_INT_MAP 0x3028 /* serial/kbd/mouse interrupt map reg */
#define SBR_FD_INT_MAP 0x3030 /* floppy interrupt map reg */
#define SBR_THERM_INT_MAP 0x3038 /* thermal warn interrupt map reg */
#define SBR_KBD_INT_MAP 0x3040 /* kbd [unused] interrupt map reg */
#define SBR_MOUSE_INT_MAP 0x3048 /* mouse [unused] interrupt map reg */
#define SBR_SERIAL_INT_MAP 0x3050 /* second serial interrupt map reg */
#define SBR_TIMER0_INT_MAP 0x3060 /* timer 0 interrupt map reg */
#define SBR_TIMER1_INT_MAP 0x3068 /* timer 1 interrupt map reg */
#define SBR_UE_INT_MAP 0x3070 /* UE interrupt map reg */
#define SBR_CE_INT_MAP 0x3078 /* CE interrupt map reg */
#define SBR_ASYNC_INT_MAP 0x3080 /* SBUS error interrupt map reg */
#define SBR_PWRMGT_INT_MAP 0x3088 /* power mgmt wake interrupt map reg */
#define SBR_UPAGR_INT_MAP 0x3090 /* UPA graphics interrupt map reg */
#define SBR_RESERVED_INT_MAP 0x3098 /* reserved interrupt map reg */
/*
* Note: clear interrupt 0 registers are not really used
*/
#define SBR_SLOT0_INT_CLR 0x3400 /* SBUS slot 0 clear int regs 0..7 */
#define SBR_SLOT1_INT_CLR 0x3440 /* SBUS slot 1 clear int regs 0..7 */
#define SBR_SLOT2_INT_CLR 0x3480 /* SBUS slot 2 clear int regs 0..7 */
#define SBR_SLOT3_INT_CLR 0x34c0 /* SBUS slot 3 clear int regs 0..7 */
#define SBR_SCSI_INT_CLR 0x3800 /* SCSI clear int reg */
#define SBR_ETHER_INT_CLR 0x3808 /* ethernet clear int reg */
#define SBR_BPP_INT_CLR 0x3810 /* parallel clear int reg */
#define SBR_AUDIO_INT_CLR 0x3818 /* audio clear int reg */
#define SBR_POWER_INT_CLR 0x3820 /* power fail clear int reg */
#define SBR_SKBDMS_INT_CLR 0x3828 /* serial/kbd/mouse clear int reg */
#define SBR_FD_INT_CLR 0x3830 /* floppy clear int reg */
#define SBR_THERM_INT_CLR 0x3838 /* thermal warn clear int reg */
#define SBR_KBD_INT_CLR 0x3840 /* kbd [unused] clear int reg */
#define SBR_MOUSE_INT_CLR 0x3848 /* mouse [unused] clear int reg */
#define SBR_SERIAL_INT_CLR 0x3850 /* second serial clear int reg */
#define SBR_TIMER0_INT_CLR 0x3860 /* timer 0 clear int reg */
#define SBR_TIMER1_INT_CLR 0x3868 /* timer 1 clear int reg */
#define SBR_UE_INT_CLR 0x3870 /* UE clear int reg */
#define SBR_CE_INT_CLR 0x3878 /* CE clear int reg */
#define SBR_ASYNC_INT_CLR 0x3880 /* SBUS error clr interrupt reg */
#define SBR_PWRMGT_INT_CLR 0x3888 /* power mgmt wake clr interrupt reg */
#define SBR_TC0 0x3c00 /* timer/counter 0 */
#define SBR_TC1 0x3c10 /* timer/counter 1 */
#define SBR_IOMMU_SVADIAG 0x4400 /* SBUS virtual addr diag reg */
#define SBR_IOMMU_QUEUE_DIAG 0x4500 /* IOMMU LRU queue diag 0..15 */
#define SBR_IOMMU_TLB_TAG_DIAG 0x4580 /* TLB tag diag 0..15 */
#define SBR_IOMMU_TLB_DATA_DIAG 0x4600 /* TLB data RAM diag 0..31 */
#define SBR_INT_DIAG 0x4800 /* SBUS int state diag reg */
#define SBR_OBIO_DIAG 0x4808 /* OBIO and misc int state diag reg */
#define SBR_STRBUF_DIAG 0x5000 /* Streaming buffer diag regs */
o Revamp the sparc64 interrupt code in order to be able to interface with the INTR_FILTER-enabled MI code. Basically this consists of registering an interrupt controller (of which there can be multiple and optionally different ones either per host-to-foo bridge or shared amongst host-to-foo bridges in any one machine) along with an interrupt vector as specific argument for all the interrupt vectors used by a given host-to-foo bridge (roughly similar to registering interrupt sources on amd64 and i386), providing functions to enable, clear and disable the interrupts of the children beneath the bridge. This also includes: - No longer entering a critical section in tl0_intr() and tl1_intr() for executing interrupt handlers but rather let the handlers enter it themselves so in the case of intr_event_handle() we don't enter a nested critical section. - Adding infrastructure for binding delivery of interrupt vectors to specific CPUs which later on can be interfaced with the code from amd64/i386 for binding interrupts to specific CPUs. - Getting rid of the wrapper hack introduced along the lines of the API changes for INTR_FILTER which as a side-effect caused interrupts associated with ithread handlers only to get the elevated priority of those associated with filters ("fast handlers") (this removes the hack also in the non-INTR_FILTER case). - Disabling (by not clearing) an interrupt in the interrupt controller until all associated handlers have been executed, which is crucial for the typical locking strategy of NIC drivers in order to work correctly in case of shared interrupts. This was a more or less theoretical problem on sparc64 though, as shared interrupts are rather uncommon there except for the on-board SCCs and UARTs. Note that due to the behavior of at least of some of the interrupt controllers used on sparc64 an enable+EOI instead of a disable+EOI approach (as implied by the INTR_FILTER MI code and implemented on other architectures) is used as the latter can cause lost interrupts or in the worst case interrupt starvation. o Correct a typo in sbus_alloc_resource() which caused (pass-through) allocations to only work down to the grandchildren of the bus, which wasn't a real problem so far as we don't support any devices which are great-grandchildren or greater of a U2S bridge, yet. o In fhc(4) use bus_{read,write}_4() instead of bus_space_{read,write}_4() in order to get rid of sc_bh and sc_bt in the fhc_softc. Also get rid of some other unneeded members in fhc_softc. Reviewed by: marcel (earlier version) Approved by: re (kensmith)
2007-09-06 19:16:30 +00:00
/* INO defines */
#define SBUS_MAX_INO 0x3f
- Divorce the IOTSBs, which so far where handled via a global list instead of per IOMMU, so we no longer need to program all of them identically in systems having multiple IOMMUs. This continues the rototilling of the nexus(4) done about 5 months ago, which amongst others changed nexus(4) and the drivers for host-to-foo bridges to provide bus_get_dma_tag methods, allowing to handle DMA tags in a hierarchical way and to link them with devices. This still doesn't move the silicon bug workarounds for Sabre (and in the uncommitted schizo(4) for Tomatillo) bridges into special bus_dma_tag_create() and bus_dmamap_sync() methods though, as w/o fully newbus'ified bus_dma_tag_create() and bus_dma_tag_destroy() this still requires too much hackery, i.e. per-child parent DMA tags in the parent driver. - Let the host-to-foo drivers supply the maximum physical address of the IOMMU accompanying the bridges. Previously iommu(4) hard- coded an upper limit of 16GB, which actually only applies to the IOMMUs of the Hummingbird and Sabre bridges. The Psycho variants as well as the U2S in fact can can translate to up to 2TB, i.e. translate to 41-bit physical addresses. According to the recently available Tomatillo documentation these bridges even translate to 43-bit physical addresses and hints at the Schizo bridges doing 43 bits as well. This fixes the issue the FreeBSD 6.0 todo list item "Max RAM on sparc64" was refering to and pretty much obsoletes the lack of support for bounce buffers on sparc64. Thanks to Nathan Whitehorn for pointing me at the Tomatillo manual. Approved by: re (kensmith)
2007-08-05 11:56:44 +00:00
/* Width of the physical addresses the IOMMU translates to */
#define SBUS_IOMMU_BITS 41
- Divorce the IOTSBs, which so far where handled via a global list instead of per IOMMU, so we no longer need to program all of them identically in systems having multiple IOMMUs. This continues the rototilling of the nexus(4) done about 5 months ago, which amongst others changed nexus(4) and the drivers for host-to-foo bridges to provide bus_get_dma_tag methods, allowing to handle DMA tags in a hierarchical way and to link them with devices. This still doesn't move the silicon bug workarounds for Sabre (and in the uncommitted schizo(4) for Tomatillo) bridges into special bus_dma_tag_create() and bus_dmamap_sync() methods though, as w/o fully newbus'ified bus_dma_tag_create() and bus_dma_tag_destroy() this still requires too much hackery, i.e. per-child parent DMA tags in the parent driver. - Let the host-to-foo drivers supply the maximum physical address of the IOMMU accompanying the bridges. Previously iommu(4) hard- coded an upper limit of 16GB, which actually only applies to the IOMMUs of the Hummingbird and Sabre bridges. The Psycho variants as well as the U2S in fact can can translate to up to 2TB, i.e. translate to 41-bit physical addresses. According to the recently available Tomatillo documentation these bridges even translate to 43-bit physical addresses and hints at the Schizo bridges doing 43 bits as well. This fixes the issue the FreeBSD 6.0 todo list item "Max RAM on sparc64" was refering to and pretty much obsoletes the lack of support for bounce buffers on sparc64. Thanks to Nathan Whitehorn for pointing me at the Tomatillo manual. Approved by: re (kensmith)
2007-08-05 11:56:44 +00:00
#endif /* _SPARC64_SBUS_SBUSREG_H_ */