2007-06-06 10:52:38 +04:00
/*
* Copyright ( C ) 2007 Lemote , Inc . & Institute of Computing Technology
* Author : Fuxin Zhang , zhangfx @ 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 .
*/
# include <linux/pci.h>
2009-07-02 19:23:03 +04:00
# include <pci.h>
# include <loongson.h>
2007-06-06 10:52:38 +04:00
2009-07-02 19:26:45 +04:00
static struct resource loongson_pci_mem_resource = {
. name = " pci memory space " ,
. start = LOONGSON_PCI_MEM_START ,
. end = LOONGSON_PCI_MEM_END ,
2007-06-06 10:52:38 +04:00
. flags = IORESOURCE_MEM ,
} ;
2009-07-02 19:26:45 +04:00
static struct resource loongson_pci_io_resource = {
. name = " pci io space " ,
. start = LOONGSON_PCI_IO_START ,
2007-06-06 10:52:38 +04:00
. end = IO_SPACE_LIMIT ,
. flags = IORESOURCE_IO ,
} ;
2009-07-02 19:26:45 +04:00
static struct pci_controller loongson_pci_controller = {
2009-10-16 10:17:19 +04:00
. pci_ops = & loongson_pci_ops ,
2009-07-02 19:26:45 +04:00
. io_resource = & loongson_pci_io_resource ,
. mem_resource = & loongson_pci_mem_resource ,
2007-06-06 10:52:38 +04:00
. mem_offset = 0x00000000UL ,
. io_offset = 0x00000000UL ,
} ;
2009-07-02 19:23:30 +04:00
static void __init setup_pcimap ( void )
2007-06-06 10:52:38 +04:00
{
/*
2009-07-02 19:23:30 +04:00
* local to PCI mapping for CPU accessing PCI space
2007-06-06 10:52:38 +04:00
* CPU address space [ 256 M , 448 M ] is window for accessing pci space
2009-07-02 19:23:30 +04:00
* we set pcimap_lo [ 0 , 1 , 2 ] to map it to pci space [ 0 M , 64 M ] , [ 320 M , 448 M ]
*
* pcimap : PCI_MAP2 PCI_Mem_Lo2 PCI_Mem_Lo1 PCI_Mem_Lo0
* [ < 2 G ] [ 384 M , 448 M ] [ 320 M , 384 M ] [ 0 M , 64 M ]
2007-06-06 10:52:38 +04:00
*/
2009-10-16 10:17:19 +04:00
LOONGSON_PCIMAP = LOONGSON_PCIMAP_PCIMAP_2 |
LOONGSON_PCIMAP_WIN ( 2 , LOONGSON_PCILO2_BASE ) |
LOONGSON_PCIMAP_WIN ( 1 , LOONGSON_PCILO1_BASE ) |
LOONGSON_PCIMAP_WIN ( 0 , 0 ) ;
2007-06-06 10:52:38 +04:00
/*
2009-07-02 19:23:30 +04:00
* PCI - DMA to local mapping : [ 2 G , 2 G + 256 M ] - > [ 0 M , 256 M ]
2007-06-06 10:52:38 +04:00
*/
2009-10-16 10:17:19 +04:00
LOONGSON_PCIBASE0 = 0x80000000ul ; /* base: 2G -> mmap: 0M */
2009-07-02 19:23:30 +04:00
/* size: 256M, burst transmission, pre-fetch enable, 64bit */
LOONGSON_PCI_HIT0_SEL_L = 0xc000000cul ;
LOONGSON_PCI_HIT0_SEL_H = 0xfffffffful ;
LOONGSON_PCI_HIT1_SEL_L = 0x00000006ul ; /* set this BAR as invalid */
LOONGSON_PCI_HIT1_SEL_H = 0x00000000ul ;
LOONGSON_PCI_HIT2_SEL_L = 0x00000006ul ; /* set this BAR as invalid */
LOONGSON_PCI_HIT2_SEL_H = 0x00000000ul ;
/* avoid deadlock of PCI reading/writing lock operation */
LOONGSON_PCI_ISR4C = 0xd2000001ul ;
2007-06-06 10:52:38 +04:00
2009-07-02 19:23:30 +04:00
/* can not change gnt to break pci transfer when device's gnt not
deassert for some broken device */
LOONGSON_PXARB_CFG = 0x00fe0105ul ;
2009-11-06 13:45:05 +03:00
2009-11-11 08:39:12 +03:00
# ifdef CONFIG_CPU_SUPPORTS_ADDRWINCFG
2009-11-06 13:45:05 +03:00
/*
* set cpu addr window2 to map CPU address space to PCI address space
*/
LOONGSON_ADDRWIN_CPUTOPCI ( ADDRWIN_WIN2 , LOONGSON_CPU_MEM_SRC ,
LOONGSON_PCI_MEM_DST , MMAP_CPUTOPCI_SIZE ) ;
# endif
2007-06-06 10:52:38 +04:00
}
static int __init pcibios_init ( void )
{
2009-07-02 19:23:30 +04:00
setup_pcimap ( ) ;
2008-10-28 02:33:24 +03:00
2009-07-02 19:26:45 +04:00
loongson_pci_controller . io_map_base = mips_io_port_base ;
2008-10-28 02:33:24 +03:00
2009-07-02 19:26:45 +04:00
register_pci_controller ( & loongson_pci_controller ) ;
2007-06-06 10:52:38 +04:00
return 0 ;
}
arch_initcall ( pcibios_init ) ;