1 #include <linux/types.h>
3 #include <linux/kernel.h>
4 #include <linux/init.h>
5 #include <linux/delay.h>
7 #include <asm/addrspace.h>
8 #include <linux/vmalloc.h>
10 #include <ifxmips_irq.h>
11 #include <ifxmips_cgu.h>
13 #define IFXMIPS_PCI_MEM_BASE 0x18000000
14 #define IFXMIPS_PCI_MEM_SIZE 0x02000000
15 #define IFXMIPS_PCI_IO_BASE 0x1AE00000
16 #define IFXMIPS_PCI_IO_SIZE 0x00200000
18 extern int ifxmips_pci_read_config_dword(struct pci_bus
*bus
, unsigned int devfn
, int where
, int size
, u32
*val
);
19 extern int ifxmips_pci_write_config_dword(struct pci_bus
*bus
, unsigned int devfn
, int where
, int size
, u32 val
);
21 struct pci_ops ifxmips_pci_ops
=
23 .read
= ifxmips_pci_read_config_dword
,
24 .write
= ifxmips_pci_write_config_dword
27 static struct resource pci_io_resource
=
29 .name
= "io pci IO space",
30 .start
= IFXMIPS_PCI_IO_BASE
,
31 .end
= IFXMIPS_PCI_IO_BASE
+ IFXMIPS_PCI_IO_SIZE
- 1,
32 .flags
= IORESOURCE_IO
35 static struct resource pci_mem_resource
=
37 .name
= "ext pci memory space",
38 .start
= IFXMIPS_PCI_MEM_BASE
,
39 .end
= IFXMIPS_PCI_MEM_BASE
+ IFXMIPS_PCI_MEM_SIZE
- 1,
40 .flags
= IORESOURCE_MEM
43 static struct pci_controller ifxmips_pci_controller
=
45 .pci_ops
= &ifxmips_pci_ops
,
46 .mem_resource
= &pci_mem_resource
,
47 .mem_offset
= 0x00000000UL
,
48 .io_resource
= &pci_io_resource
,
49 .io_offset
= 0x00000000UL
,
52 /* the cpu can can generate the 33Mhz or rely on an external clock the cgu needs the
53 proper setting, otherwise the cpu hangs. we have no way of runtime detecting this */
54 u32 ifxmips_pci_mapped_cfg
;
55 int ifxmips_pci_external_clock
= 0;
57 /* Since the PCI REQ pins can be reused for other functionality, make it possible
58 to exclude those from interpretation by the PCI controller */
59 int ifxmips_pci_req_mask
= 0xf;
62 ifxmips_pci_set_external_clk(char *str
)
64 printk("cgu: setting up external pci clock\n");
65 ifxmips_pci_external_clock
= 1;
68 __setup("pci_external_clk", ifxmips_pci_set_external_clk
);
71 pcibios_plat_dev_init(struct pci_dev
*dev
)
75 pci_read_config_byte(dev
, PCI_INTERRUPT_PIN
, &pin
);
81 //falling edge level triggered:0x4, low level:0xc, rising edge:0x2
82 ifxmips_w32(ifxmips_r32(IFXMIPS_EBU_PCC_CON
) | 0xc, IFXMIPS_EBU_PCC_CON
);
83 ifxmips_w32(ifxmips_r32(IFXMIPS_EBU_PCC_IEN
) | 0x10, IFXMIPS_EBU_PCC_IEN
);
88 printk ("WARNING: interrupt pin %d not supported yet!\n", pin
);
90 printk ("WARNING: invalid interrupt pin %d\n", pin
);
96 static u32
calc_bar11mask(void)
100 /* BAR11MASK value depends on available memory on system. */
101 mem
= num_physpages
* PAGE_SIZE
;
102 bar11mask
= (0x0ffffff0 & ~((1 << (fls(mem
) -1)) -1)) | 8;
108 ifxmips_pci_startup(void)
112 cgu_setup_pci_clk(ifxmips_pci_external_clock
);
114 ifxmips_w32(ifxmips_r32(IFXMIPS_GPIO_P1_OUT
) | (1 << 5), IFXMIPS_GPIO_P1_OUT
);
115 ifxmips_w32(ifxmips_r32(IFXMIPS_GPIO_P1_OD
) | (1 << 5), IFXMIPS_GPIO_P1_OD
);
116 ifxmips_w32(ifxmips_r32(IFXMIPS_GPIO_P1_DIR
) | (1 << 5), IFXMIPS_GPIO_P1_DIR
);
117 ifxmips_w32(ifxmips_r32(IFXMIPS_GPIO_P1_ALTSEL1
) & ~(1 << 5), IFXMIPS_GPIO_P1_ALTSEL1
);
118 ifxmips_w32(ifxmips_r32(IFXMIPS_GPIO_P1_ALTSEL0
) & ~(1 << 5), IFXMIPS_GPIO_P1_ALTSEL0
);
119 ifxmips_w32(ifxmips_r32(IFXMIPS_GPIO_P1_DIR
) & ~0x2000, IFXMIPS_GPIO_P1_DIR
);
120 ifxmips_w32(ifxmips_r32(IFXMIPS_GPIO_P1_DIR
) | 0x4000, IFXMIPS_GPIO_P1_DIR
);
121 ifxmips_w32(ifxmips_r32(IFXMIPS_GPIO_P1_ALTSEL1
) & ~0x6000, IFXMIPS_GPIO_P1_ALTSEL1
);
122 ifxmips_w32(ifxmips_r32(IFXMIPS_GPIO_P1_ALTSEL0
) | 0x6000, IFXMIPS_GPIO_P1_ALTSEL0
);
123 /* enable auto-switching between PCI and EBU */
124 ifxmips_w32(0xa, PCI_CR_CLK_CTRL
);
125 /* busy, i.e. configuration is not done, PCI access has to be retried */
126 ifxmips_w32(ifxmips_r32(PCI_CR_PCI_MOD
) & ~(1 << 24), PCI_CR_PCI_MOD
);
128 /* BUS Master/IO/MEM access */
129 ifxmips_w32(ifxmips_r32(PCI_CS_STS_CMD
) | 7, PCI_CS_STS_CMD
);
131 /* enable external 2 PCI masters */
132 temp_buffer
= ifxmips_r32(PCI_CR_PC_ARB
);
133 temp_buffer
&= (~(ifxmips_pci_req_mask
<< 16));
134 /* enable internal arbiter */
135 temp_buffer
|= (1 << INTERNAL_ARB_ENABLE_BIT
);
136 /* enable internal PCI master reqest */
137 temp_buffer
&= (~(3 << PCI_MASTER0_REQ_MASK_2BITS
));
139 /* enable EBU reqest */
140 temp_buffer
&= (~(3 << PCI_MASTER1_REQ_MASK_2BITS
));
142 /* enable all external masters request */
143 temp_buffer
&= (~(3 << PCI_MASTER2_REQ_MASK_2BITS
));
144 ifxmips_w32(temp_buffer
, PCI_CR_PC_ARB
);
147 ifxmips_w32(0x18000000, PCI_CR_FCI_ADDR_MAP0
);
148 ifxmips_w32(0x18400000, PCI_CR_FCI_ADDR_MAP1
);
149 ifxmips_w32(0x18800000, PCI_CR_FCI_ADDR_MAP2
);
150 ifxmips_w32(0x18c00000, PCI_CR_FCI_ADDR_MAP3
);
151 ifxmips_w32(0x19000000, PCI_CR_FCI_ADDR_MAP4
);
152 ifxmips_w32(0x19400000, PCI_CR_FCI_ADDR_MAP5
);
153 ifxmips_w32(0x19800000, PCI_CR_FCI_ADDR_MAP6
);
154 ifxmips_w32(0x19c00000, PCI_CR_FCI_ADDR_MAP7
);
155 ifxmips_w32(0x1ae00000, PCI_CR_FCI_ADDR_MAP11hg
);
156 ifxmips_w32(calc_bar11mask(), PCI_CR_BAR11MASK
);
157 ifxmips_w32(0, PCI_CR_PCI_ADDR_MAP11
);
158 ifxmips_w32(0, PCI_CS_BASE_ADDR1
);
159 #ifdef CONFIG_SWAP_IO_SPACE
160 /* both TX and RX endian swap are enabled */
161 ifxmips_w32(ifxmips_r32(PCI_CR_PCI_EOI
) | 3, PCI_CR_PCI_EOI
);
164 /*TODO: disable BAR2 & BAR3 - why was this in the origianl infineon code */
165 ifxmips_w32(ifxmips_r32(PCI_CR_BAR12MASK
) | 0x80000000, PCI_CR_BAR12MASK
);
166 ifxmips_w32(ifxmips_r32(PCI_CR_BAR13MASK
) | 0x80000000, PCI_CR_BAR13MASK
);
167 /*use 8 dw burst length */
168 ifxmips_w32(0x303, PCI_CR_FCI_BURST_LENGTH
);
169 ifxmips_w32(ifxmips_r32(PCI_CR_PCI_MOD
) | (1 << 24), PCI_CR_PCI_MOD
);
171 ifxmips_w32(ifxmips_r32(IFXMIPS_GPIO_P1_OUT
) & ~(1 << 5), IFXMIPS_GPIO_P1_OUT
);
174 ifxmips_w32(ifxmips_r32(IFXMIPS_GPIO_P1_OUT
) | (1 << 5), IFXMIPS_GPIO_P1_OUT
);
178 pcibios_map_irq(const struct pci_dev
*dev
, u8 slot
, u8 pin
){
182 /* IDSEL = AD29 --> USB Host Controller */
183 return (INT_NUM_IM1_IRL0
+ 17);
185 /* IDSEL = AD30 --> mini PCI connector */
186 return (INT_NUM_IM0_IRL0
+ 22);
188 printk("Warning: no IRQ found for PCI device in slot %d, pin %d\n", slot
, pin
);
196 extern int pci_probe_only
;
199 printk("PCI: Probing PCI hardware on host bus 0.\n");
200 ifxmips_pci_startup ();
201 ifxmips_pci_mapped_cfg
= (u32
)ioremap_nocache(0x17000000, 0x800 * 16);
202 printk("IFXMips PCI mapped to 0x%08lX\n", (unsigned long)ifxmips_pci_mapped_cfg
);
203 ifxmips_pci_controller
.io_map_base
= (unsigned long)ioremap(IFXMIPS_PCI_IO_BASE
, IFXMIPS_PCI_IO_SIZE
- 1);
204 printk("IFXMips PCI I/O mapped to 0x%08lX\n", (unsigned long)ifxmips_pci_controller
.io_map_base
);
205 register_pci_controller(&ifxmips_pci_controller
);
209 arch_initcall(pcibios_init
);