Add a driver for the `Fire' JBus to PCIe bridges found in at least

the Sun Fire V215/V245 and Sun Ultra 25/45 machines. This driver also
already includes all the code to support the `Oberon' Uranus to PCIe
bridges found in the Fujitsu-Siemens based Mx000 machines but due to
lack of access to such a system for testing, probing of these bridges
is currently disabled.
Unfortunately, the event queue mechanism of these bridges for MSIs/
MSI-Xs matches our current MD and MI interrupt frameworks like square
pegs fit into round holes so for now we are generous and use one event
queue per MSI, which limits us to 35 MSIs/MSI-Xs per Host-PCIe-bridge
(we use one event queue for the PCIe error messages). This seems
tolerable as long as most devices just use one MSI/MSI-X anyway.
Adding knowledge about MSIs/MSI-Xs to the MD interrupt code should
allow us to decouple the 1:1 mapping at the cost of no longer being
able to bind MSIs/MSI-Xs to specific CPUs as we currently have no
reliable way to quiesce a device during the transition of its MSIs/
MSI-Xs to another event queue. This would still require the problem
of interrupt storms generated by devices which have no one-shot
behavior or can't/don't mask interrupts while the filter/handler is
executed (like the older PCIe NICs supported by bge(4)) to be solved
though.

Committed from:	26C3
This commit is contained in:
Marius Strobl 2009-12-27 16:55:44 +00:00
parent a55743484e
commit 5cb5104246
4 changed files with 3226 additions and 0 deletions

View File

@ -8,6 +8,8 @@ SUN4U opt_global.h
ATKBD_DFLT_KEYMAP opt_atkbd.h
FIRE_DEBUG opt_fire.h
# Debug IOMMU inserts/removes using diagnostic accesses. This is very loud.
IOMMU_DIAG opt_iommu.h

2122
sys/sparc64/pci/fire.c Normal file

File diff suppressed because it is too large Load Diff

1004
sys/sparc64/pci/firereg.h Normal file

File diff suppressed because it is too large Load Diff

98
sys/sparc64/pci/firevar.h Normal file
View File

@ -0,0 +1,98 @@
/*-
* Copyright (c) 2009 by Marius Strobl <marius@FreeBSD.org>.
* 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,
* without modification, immediately at the beginning of the file.
* 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 AUTHOR 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 AUTHOR 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.
*
* $FreeBSD$
*/
#ifndef _SPARC64_PCI_FIREVAR_H_
#define _SPARC64_PCI_FIREVAR_H_
struct fire_softc {
struct iommu_state sc_is;
struct bus_dma_methods sc_dma_methods;
struct mtx sc_msi_mtx;
struct mtx sc_pcib_mtx;
struct resource *sc_mem_res[FIRE_NREG];
struct resource *sc_irq_res[FIRE_NINTR];
void *sc_ihand[FIRE_NINTR];
struct rman sc_pci_mem_rman;
struct rman sc_pci_io_rman;
bus_space_handle_t sc_pci_bh[FIRE_NRANGE];
bus_space_tag_t sc_pci_cfgt;
bus_space_tag_t sc_pci_iot;
bus_space_tag_t sc_pci_memt;
bus_dma_tag_t sc_pci_dmat;
device_t sc_dev;
uint64_t *sc_msiq;
u_char *sc_msi_bitmap;
uint32_t *sc_msi_msiq_table;
u_char *sc_msiq_bitmap;
uint64_t sc_msi_addr32;
uint64_t sc_msi_addr64;
uint32_t sc_msi_count;
uint32_t sc_msi_first;
uint32_t sc_msi_data_mask;
uint32_t sc_msix_data_width;
uint32_t sc_msiq_count;
uint32_t sc_msiq_size;
uint32_t sc_msiq_first;
uint32_t sc_msiq_ino_first;
phandle_t sc_node;
u_int sc_mode;
#define FIRE_MODE_FIRE 0
#define FIRE_MODE_OBERON 1
u_int sc_flags;
#define FIRE_MSIX (1 << 0)
uint32_t sc_ign;
uint32_t sc_stats_ilu_err;
uint32_t sc_stats_jbc_ce_async;
uint32_t sc_stats_jbc_unsol_int;
uint32_t sc_stats_jbc_unsol_rd;
uint32_t sc_stats_mmu_err;
uint32_t sc_stats_tlu_ce;
uint32_t sc_stats_tlu_oe_non_fatal;
uint32_t sc_stats_tlu_oe_rx_err;
uint32_t sc_stats_tlu_oe_tx_err;
uint32_t sc_stats_ubc_dmardue;
uint8_t sc_pci_secbus;
uint8_t sc_pci_subbus;
struct ofw_bus_iinfo sc_pci_iinfo;
};
#endif /* !_SPARC64_PCI_FIREVAR_H_ */