-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MIPS: Loongson 3: Add HT-linked PCI support
Loongson family machines use Hyper-Transport bus for inter-core connection and device connection. The PCI bus is a subordinate linked at HT1. With LEFI firmware interface, We don't need fixup for PCI irq routing (except providing a VBIOS of the integrated GPU). Signed-off-by: Huacai Chen <chenhc@lemote.com> Signed-off-by: Hongliang Tao <taohl@lemote.com> Signed-off-by: Hua Yan <yanh@lemote.com> Tested-by: Alex Smith <alex.smith@imgtec.com> Reviewed-by: Alex Smith <alex.smith@imgtec.com> Cc: John Crispin <john@phrozen.org> Cc: Steven J. Hill <Steven.Hill@imgtec.com> Cc: Aurelien Jarno <aurelien@aurel32.net> Cc: linux-mips@linux-mips.org Cc: Fuxin Zhang <zhangfx@lemote.com> Cc: Zhangjin Wu <wuzhangjin@gmail.com> Patchwork: https://patchwork.linux-mips.org/patch/6633 Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
- Loading branch information
Huacai Chen
authored and
Ralf Baechle
committed
Mar 31, 2014
1 parent
1a08f15
commit c7d3555
Showing
5 changed files
with
180 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
/* | ||
* fixup-loongson3.c | ||
* | ||
* Copyright (C) 2012 Lemote, Inc. | ||
* Author: Xiang Yu, xiangy@lemote.com | ||
* Chen Huacai, chenhc@lemote.com | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License as published by the | ||
* Free Software Foundation; either version 2 of the License, or (at your | ||
* option) any later version. | ||
* | ||
* THIS SOFTWARE IS PROVIDED ``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. | ||
* | ||
*/ | ||
|
||
#include <linux/pci.h> | ||
#include <boot_param.h> | ||
|
||
static void print_fixup_info(const struct pci_dev *pdev) | ||
{ | ||
dev_info(&pdev->dev, "Device %x:%x, irq %d\n", | ||
pdev->vendor, pdev->device, pdev->irq); | ||
} | ||
|
||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) | ||
{ | ||
print_fixup_info(dev); | ||
return dev->irq; | ||
} | ||
|
||
static void pci_fixup_radeon(struct pci_dev *pdev) | ||
{ | ||
if (pdev->resource[PCI_ROM_RESOURCE].start) | ||
return; | ||
|
||
if (!loongson_sysconf.vgabios_addr) | ||
return; | ||
|
||
pdev->resource[PCI_ROM_RESOURCE].start = | ||
loongson_sysconf.vgabios_addr; | ||
pdev->resource[PCI_ROM_RESOURCE].end = | ||
loongson_sysconf.vgabios_addr + 256*1024 - 1; | ||
pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_COPY; | ||
|
||
dev_info(&pdev->dev, "BAR %d: assigned %pR for Radeon ROM\n", | ||
PCI_ROM_RESOURCE, &pdev->resource[PCI_ROM_RESOURCE]); | ||
} | ||
|
||
DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_ATI, PCI_ANY_ID, | ||
PCI_CLASS_DISPLAY_VGA, 8, pci_fixup_radeon); | ||
|
||
/* Do platform specific device initialization at pci_enable_device() time */ | ||
int pcibios_plat_dev_init(struct pci_dev *dev) | ||
{ | ||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
#include <linux/types.h> | ||
#include <linux/pci.h> | ||
#include <linux/kernel.h> | ||
|
||
#include <asm/mips-boards/bonito64.h> | ||
|
||
#include <loongson.h> | ||
|
||
#define PCI_ACCESS_READ 0 | ||
#define PCI_ACCESS_WRITE 1 | ||
|
||
#define HT1LO_PCICFG_BASE 0x1a000000 | ||
#define HT1LO_PCICFG_BASE_TP1 0x1b000000 | ||
|
||
static int loongson3_pci_config_access(unsigned char access_type, | ||
struct pci_bus *bus, unsigned int devfn, | ||
int where, u32 *data) | ||
{ | ||
unsigned char busnum = bus->number; | ||
u_int64_t addr, type; | ||
void *addrp; | ||
int device = PCI_SLOT(devfn); | ||
int function = PCI_FUNC(devfn); | ||
int reg = where & ~3; | ||
|
||
addr = (busnum << 16) | (device << 11) | (function << 8) | reg; | ||
if (busnum == 0) { | ||
if (device > 31) | ||
return PCIBIOS_DEVICE_NOT_FOUND; | ||
addrp = (void *)(TO_UNCAC(HT1LO_PCICFG_BASE) | (addr & 0xffff)); | ||
type = 0; | ||
|
||
} else { | ||
addrp = (void *)(TO_UNCAC(HT1LO_PCICFG_BASE_TP1) | (addr)); | ||
type = 0x10000; | ||
} | ||
|
||
if (access_type == PCI_ACCESS_WRITE) | ||
writel(*data, addrp); | ||
else { | ||
*data = readl(addrp); | ||
if (*data == 0xffffffff) { | ||
*data = -1; | ||
return PCIBIOS_DEVICE_NOT_FOUND; | ||
} | ||
} | ||
return PCIBIOS_SUCCESSFUL; | ||
} | ||
|
||
static int loongson3_pci_pcibios_read(struct pci_bus *bus, unsigned int devfn, | ||
int where, int size, u32 *val) | ||
{ | ||
u32 data = 0; | ||
int ret = loongson3_pci_config_access(PCI_ACCESS_READ, | ||
bus, devfn, where, &data); | ||
|
||
if (ret != PCIBIOS_SUCCESSFUL) | ||
return ret; | ||
|
||
if (size == 1) | ||
*val = (data >> ((where & 3) << 3)) & 0xff; | ||
else if (size == 2) | ||
*val = (data >> ((where & 3) << 3)) & 0xffff; | ||
else | ||
*val = data; | ||
|
||
return PCIBIOS_SUCCESSFUL; | ||
} | ||
|
||
static int loongson3_pci_pcibios_write(struct pci_bus *bus, unsigned int devfn, | ||
int where, int size, u32 val) | ||
{ | ||
u32 data = 0; | ||
int ret; | ||
|
||
if (size == 4) | ||
data = val; | ||
else { | ||
ret = loongson3_pci_config_access(PCI_ACCESS_READ, | ||
bus, devfn, where, &data); | ||
if (ret != PCIBIOS_SUCCESSFUL) | ||
return ret; | ||
|
||
if (size == 1) | ||
data = (data & ~(0xff << ((where & 3) << 3))) | | ||
(val << ((where & 3) << 3)); | ||
else if (size == 2) | ||
data = (data & ~(0xffff << ((where & 3) << 3))) | | ||
(val << ((where & 3) << 3)); | ||
} | ||
|
||
ret = loongson3_pci_config_access(PCI_ACCESS_WRITE, | ||
bus, devfn, where, &data); | ||
|
||
return ret; | ||
} | ||
|
||
struct pci_ops loongson_pci_ops = { | ||
.read = loongson3_pci_pcibios_read, | ||
.write = loongson3_pci_pcibios_write | ||
}; |