3 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com)
5 * Derived from arch/i386/kernel/pci-pc.c
6 * (c) 1999--2000 Martin Mares <mj@suse.cz>
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public Licence
10 * as published by the Free Software Foundation; either version
11 * 2 of the Licence, or (at your option) any later version.
13 #include <linux/types.h>
14 #include <linux/kernel.h>
15 #include <linux/sched.h>
16 #include <linux/pci.h>
17 #include <linux/init.h>
18 #include <linux/ioport.h>
19 #include <linux/delay.h>
20 #include <linux/irq.h>
23 #include "pci-asb2305.h"
25 unsigned int pci_probe
= 1;
27 int pcibios_last_bus
= -1;
28 struct pci_ops
*pci_root_ops
;
31 * The accessible PCI window does not cover the entire CPU address space, but
32 * there are devices we want to access outside of that window, so we need to
33 * insert specific PCI bus resources instead of using the platform-level bus
34 * resources directly for the PCI root bus.
36 * These are configured and inserted by pcibios_init().
38 static struct resource pci_ioport_resource
= {
42 .flags
= IORESOURCE_IO
,
45 static struct resource pci_iomem_resource
= {
49 .flags
= IORESOURCE_MEM
,
53 * Functions for accessing PCI configuration space
56 #define CONFIG_CMD(bus, devfn, where) \
57 (0x80000000 | (bus->number << 16) | (devfn << 8) | (where & ~3))
59 #define MEM_PAGING_REG (*(volatile __u32 *) 0xBFFFFFF4)
60 #define CONFIG_ADDRESS (*(volatile __u32 *) 0xBFFFFFF8)
61 #define CONFIG_DATAL(X) (*(volatile __u32 *) 0xBFFFFFFC)
62 #define CONFIG_DATAW(X) (*(volatile __u16 *) (0xBFFFFFFC + ((X) & 2)))
63 #define CONFIG_DATAB(X) (*(volatile __u8 *) (0xBFFFFFFC + ((X) & 3)))
65 #define BRIDGEREGB(X) (*(volatile __u8 *) (0xBE040000 + (X)))
66 #define BRIDGEREGW(X) (*(volatile __u16 *) (0xBE040000 + (X)))
67 #define BRIDGEREGL(X) (*(volatile __u32 *) (0xBE040000 + (X)))
69 static inline int __query(const struct pci_bus
*bus
, unsigned int devfn
)
72 return bus
->number
== 0 && (devfn
== PCI_DEVFN(0, 0));
73 return bus
->number
== 1;
74 return bus
->number
== 0 &&
75 (devfn
== PCI_DEVFN(2, 0) || devfn
== PCI_DEVFN(3, 0));
83 static int pci_ampci_read_config_byte(struct pci_bus
*bus
, unsigned int devfn
,
84 int where
, u32
*_value
)
88 if (bus
->number
== 0 && devfn
== PCI_DEVFN(0, 0)) {
89 value
= BRIDGEREGB(where
);
90 __pcbdebug("=> %02hx", &BRIDGEREGL(where
), value
);
92 CONFIG_ADDRESS
= CONFIG_CMD(bus
, devfn
, where
);
93 rawval
= CONFIG_ADDRESS
;
94 value
= CONFIG_DATAB(where
);
95 if (__query(bus
, devfn
))
96 __pcidebug("=> %02hx", bus
, devfn
, where
, value
);
100 return PCIBIOS_SUCCESSFUL
;
103 static int pci_ampci_read_config_word(struct pci_bus
*bus
, unsigned int devfn
,
104 int where
, u32
*_value
)
108 if (bus
->number
== 0 && devfn
== PCI_DEVFN(0, 0)) {
109 value
= BRIDGEREGW(where
);
110 __pcbdebug("=> %04hx", &BRIDGEREGL(where
), value
);
112 CONFIG_ADDRESS
= CONFIG_CMD(bus
, devfn
, where
);
113 rawval
= CONFIG_ADDRESS
;
114 value
= CONFIG_DATAW(where
);
115 if (__query(bus
, devfn
))
116 __pcidebug("=> %04hx", bus
, devfn
, where
, value
);
120 return PCIBIOS_SUCCESSFUL
;
123 static int pci_ampci_read_config_dword(struct pci_bus
*bus
, unsigned int devfn
,
124 int where
, u32
*_value
)
128 if (bus
->number
== 0 && devfn
== PCI_DEVFN(0, 0)) {
129 value
= BRIDGEREGL(where
);
130 __pcbdebug("=> %08x", &BRIDGEREGL(where
), value
);
132 CONFIG_ADDRESS
= CONFIG_CMD(bus
, devfn
, where
);
133 rawval
= CONFIG_ADDRESS
;
134 value
= CONFIG_DATAL(where
);
135 if (__query(bus
, devfn
))
136 __pcidebug("=> %08x", bus
, devfn
, where
, value
);
140 return PCIBIOS_SUCCESSFUL
;
143 static int pci_ampci_write_config_byte(struct pci_bus
*bus
, unsigned int devfn
,
148 if (bus
->number
== 0 && devfn
== PCI_DEVFN(0, 0)) {
149 __pcbdebug("<= %02x", &BRIDGEREGB(where
), value
);
150 BRIDGEREGB(where
) = value
;
152 if (bus
->number
== 0 &&
153 (devfn
== PCI_DEVFN(2, 0) || devfn
== PCI_DEVFN(3, 0))
155 __pcidebug("<= %02x", bus
, devfn
, where
, value
);
156 CONFIG_ADDRESS
= CONFIG_CMD(bus
, devfn
, where
);
157 rawval
= CONFIG_ADDRESS
;
158 CONFIG_DATAB(where
) = value
;
160 return PCIBIOS_SUCCESSFUL
;
163 static int pci_ampci_write_config_word(struct pci_bus
*bus
, unsigned int devfn
,
164 int where
, u16 value
)
168 if (bus
->number
== 0 && devfn
== PCI_DEVFN(0, 0)) {
169 __pcbdebug("<= %04hx", &BRIDGEREGW(where
), value
);
170 BRIDGEREGW(where
) = value
;
172 if (__query(bus
, devfn
))
173 __pcidebug("<= %04hx", bus
, devfn
, where
, value
);
174 CONFIG_ADDRESS
= CONFIG_CMD(bus
, devfn
, where
);
175 rawval
= CONFIG_ADDRESS
;
176 CONFIG_DATAW(where
) = value
;
178 return PCIBIOS_SUCCESSFUL
;
181 static int pci_ampci_write_config_dword(struct pci_bus
*bus
, unsigned int devfn
,
182 int where
, u32 value
)
186 if (bus
->number
== 0 && devfn
== PCI_DEVFN(0, 0)) {
187 __pcbdebug("<= %08x", &BRIDGEREGL(where
), value
);
188 BRIDGEREGL(where
) = value
;
190 if (__query(bus
, devfn
))
191 __pcidebug("<= %08x", bus
, devfn
, where
, value
);
192 CONFIG_ADDRESS
= CONFIG_CMD(bus
, devfn
, where
);
193 rawval
= CONFIG_ADDRESS
;
194 CONFIG_DATAL(where
) = value
;
196 return PCIBIOS_SUCCESSFUL
;
199 static int pci_ampci_read_config(struct pci_bus
*bus
, unsigned int devfn
,
200 int where
, int size
, u32
*val
)
204 return pci_ampci_read_config_byte(bus
, devfn
, where
, val
);
206 return pci_ampci_read_config_word(bus
, devfn
, where
, val
);
208 return pci_ampci_read_config_dword(bus
, devfn
, where
, val
);
215 static int pci_ampci_write_config(struct pci_bus
*bus
, unsigned int devfn
,
216 int where
, int size
, u32 val
)
220 return pci_ampci_write_config_byte(bus
, devfn
, where
, val
);
222 return pci_ampci_write_config_word(bus
, devfn
, where
, val
);
224 return pci_ampci_write_config_dword(bus
, devfn
, where
, val
);
231 static struct pci_ops pci_direct_ampci
= {
232 pci_ampci_read_config
,
233 pci_ampci_write_config
,
237 * Before we decide to use direct hardware access mechanisms, we try to do some
238 * trivial checks to ensure it at least _seems_ to be working -- we just test
239 * whether bus 00 contains a host bridge (this is similar to checking
240 * techniques used in XFree86, but ours should be more reliable since we
241 * attempt to make use of direct access hints provided by the PCI BIOS).
243 * This should be close to trivial, but it isn't, because there are buggy
244 * chipsets (yes, you guessed it, by Intel and Compaq) that have no class ID.
246 static int __init
pci_sanity_check(struct pci_ops
*o
)
248 struct pci_bus bus
; /* Fake bus and device */
253 if ((!o
->read(&bus
, 0, PCI_CLASS_DEVICE
, 2, &x
) &&
254 (x
== PCI_CLASS_BRIDGE_HOST
|| x
== PCI_CLASS_DISPLAY_VGA
)) ||
255 (!o
->read(&bus
, 0, PCI_VENDOR_ID
, 2, &x
) &&
256 (x
== PCI_VENDOR_ID_INTEL
|| x
== PCI_VENDOR_ID_COMPAQ
)))
259 printk(KERN_ERR
"PCI: Sanity check failed\n");
263 static int __init
pci_check_direct(void)
267 local_irq_save(flags
);
270 * Check if access works.
272 if (pci_sanity_check(&pci_direct_ampci
)) {
273 local_irq_restore(flags
);
274 printk(KERN_INFO
"PCI: Using configuration ampci\n");
275 request_mem_region(0xBE040000, 256, "AMPCI bridge");
276 request_mem_region(0xBFFFFFF4, 12, "PCI ampci");
277 request_mem_region(0xBC000000, 32 * 1024 * 1024, "PCI SRAM");
281 local_irq_restore(flags
);
285 static int is_valid_resource(struct pci_dev
*dev
, int idx
)
287 unsigned int i
, type_mask
= IORESOURCE_IO
| IORESOURCE_MEM
;
288 struct resource
*devr
= &dev
->resource
[idx
], *busr
;
291 pci_bus_for_each_resource(dev
->bus
, busr
, i
) {
292 if (!busr
|| (busr
->flags
^ devr
->flags
) & type_mask
)
296 devr
->start
>= busr
->start
&&
297 devr
->end
<= busr
->end
)
305 static void pcibios_fixup_device_resources(struct pci_dev
*dev
)
309 if (dev
->bus
->number
!= 0)
312 limit
= (dev
->hdr_type
== PCI_HEADER_TYPE_NORMAL
) ?
313 PCI_BRIDGE_RESOURCES
: PCI_NUM_RESOURCES
;
315 for (i
= 0; i
< limit
; i
++) {
316 if (!dev
->resource
[i
].flags
)
319 if (is_valid_resource(dev
, i
))
320 pci_claim_resource(dev
, i
);
325 * Called after each bus is probed, but before its children
328 void pcibios_fixup_bus(struct pci_bus
*bus
)
333 pci_read_bridge_bases(bus
);
334 pcibios_fixup_device_resources(bus
->self
);
337 list_for_each_entry(dev
, &bus
->devices
, bus_list
)
338 pcibios_fixup_device_resources(dev
);
342 * Initialization. Try all known PCI access methods. Note that we support
343 * using both PCI BIOS and direct access: in such cases, we use I/O ports
344 * to access config space, but we still keep BIOS order of cards to be
345 * compatible with 2.0.X. This should go away some day.
347 static int __init
pcibios_init(void)
349 resource_size_t io_offset
, mem_offset
;
350 LIST_HEAD(resources
);
352 ioport_resource
.start
= 0xA0000000;
353 ioport_resource
.end
= 0xDFFFFFFF;
354 iomem_resource
.start
= 0xA0000000;
355 iomem_resource
.end
= 0xDFFFFFFF;
357 if (insert_resource(&iomem_resource
, &pci_iomem_resource
) < 0)
358 panic("Unable to insert PCI IOMEM resource\n");
359 if (insert_resource(&ioport_resource
, &pci_ioport_resource
) < 0)
360 panic("Unable to insert PCI IOPORT resource\n");
365 if (pci_check_direct() < 0) {
366 printk(KERN_WARNING
"PCI: No PCI bus detected\n");
370 printk(KERN_INFO
"PCI: Probing PCI hardware [mempage %08x]\n",
373 io_offset
= pci_ioport_resource
.start
-
374 (pci_ioport_resource
.start
& 0x00ffffff);
375 mem_offset
= pci_iomem_resource
.start
-
376 ((pci_iomem_resource
.start
& 0x03ffffff) | MEM_PAGING_REG
);
378 pci_add_resource_offset(&resources
, &pci_ioport_resource
, io_offset
);
379 pci_add_resource_offset(&resources
, &pci_iomem_resource
, mem_offset
);
380 pci_scan_root_bus(NULL
, 0, &pci_direct_ampci
, NULL
, &resources
);
383 pcibios_fixup_irqs();
384 pcibios_resource_survey();
388 arch_initcall(pcibios_init
);
390 char *__init
pcibios_setup(char *str
)
392 if (!strcmp(str
, "off")) {
396 } else if (!strncmp(str
, "lastbus=", 8)) {
397 pcibios_last_bus
= simple_strtol(str
+8, NULL
, 0);
404 int pcibios_enable_device(struct pci_dev
*dev
, int mask
)
408 err
= pci_enable_resources(dev
, mask
);
410 pcibios_enable_irq(dev
);
415 * disable the ethernet chipset
417 static void __init
unit_disable_pcnet(struct pci_bus
*bus
, struct pci_ops
*o
)
423 o
->read (bus
, PCI_DEVFN(2, 0), PCI_VENDOR_ID
, 4, &x
);
424 o
->read (bus
, PCI_DEVFN(2, 0), PCI_COMMAND
, 2, &x
);
425 x
|= PCI_COMMAND_MASTER
|
426 PCI_COMMAND_IO
| PCI_COMMAND_MEMORY
|
427 PCI_COMMAND_SERR
| PCI_COMMAND_PARITY
;
428 o
->write(bus
, PCI_DEVFN(2, 0), PCI_COMMAND
, 2, x
);
429 o
->read (bus
, PCI_DEVFN(2, 0), PCI_COMMAND
, 2, &x
);
430 o
->write(bus
, PCI_DEVFN(2, 0), PCI_BASE_ADDRESS_0
, 4, 0x00030001);
431 o
->read (bus
, PCI_DEVFN(2, 0), PCI_BASE_ADDRESS_0
, 4, &x
);
433 #define RDP (*(volatile u32 *) 0xBE030010)
434 #define RAP (*(volatile u32 *) 0xBE030014)
435 #define __set_RAP(X) do { RAP = (X); x = RAP; } while (0)
436 #define __set_RDP(X) do { RDP = (X); x = RDP; } while (0)
437 #define __get_RDP() ({ RDP & 0xffff; })
440 __set_RDP(0x0004); /* CSR0 = STOP */
442 __set_RAP(88); /* check CSR88 indicates an Am79C973 */
443 BUG_ON(__get_RDP() != 0x5003);
445 for (x
= 0; x
< 100; x
++)
448 __set_RDP(0x0004); /* CSR0 = STOP */
452 * initialise the unit hardware
454 asmlinkage
void __init
unit_pci_init(void)
456 struct pci_bus bus
; /* Fake bus and device */
457 struct pci_ops
*o
= &pci_direct_ampci
;
460 set_intr_level(XIRQ1
, NUM2GxICR_LEVEL(CONFIG_PCI_IRQ_LEVEL
));
462 memset(&bus
, 0, sizeof(bus
));
464 MEM_PAGING_REG
= 0xE8000000;
466 /* we need to set up the bridge _now_ or we won't be able to access the
467 * PCI config registers
469 BRIDGEREGW(PCI_COMMAND
) |=
470 PCI_COMMAND_SERR
| PCI_COMMAND_PARITY
|
471 PCI_COMMAND_MEMORY
| PCI_COMMAND_IO
| PCI_COMMAND_MASTER
;
472 BRIDGEREGW(PCI_STATUS
) = 0xF800;
473 BRIDGEREGB(PCI_LATENCY_TIMER
) = 0x10;
474 BRIDGEREGL(PCI_BASE_ADDRESS_0
) = 0x80000000;
475 BRIDGEREGB(PCI_INTERRUPT_LINE
) = 1;
476 BRIDGEREGL(0x48) = 0x98000000; /* AMPCI base addr */
477 BRIDGEREGB(0x41) = 0x00; /* secondary bus
479 BRIDGEREGB(0x42) = 0x01; /* subordinate bus
481 BRIDGEREGB(0x44) = 0x01;
482 BRIDGEREGL(0x50) = 0x00000001;
483 BRIDGEREGL(0x58) = 0x00001002;
484 BRIDGEREGL(0x5C) = 0x00000011;
486 /* we also need to set up the PCI-PCI bridge */
489 /* IO: 0x00000000-0x00020000 */
490 o
->read (&bus
, PCI_DEVFN(3, 0), PCI_COMMAND
, 2, &x
);
491 x
|= PCI_COMMAND_MASTER
|
492 PCI_COMMAND_IO
| PCI_COMMAND_MEMORY
|
493 PCI_COMMAND_SERR
| PCI_COMMAND_PARITY
;
494 o
->write(&bus
, PCI_DEVFN(3, 0), PCI_COMMAND
, 2, x
);
496 o
->read (&bus
, PCI_DEVFN(3, 0), PCI_IO_BASE
, 1, &x
);
497 o
->read (&bus
, PCI_DEVFN(3, 0), PCI_IO_BASE_UPPER16
, 4, &x
);
498 o
->read (&bus
, PCI_DEVFN(3, 0), PCI_MEMORY_BASE
, 4, &x
);
499 o
->read (&bus
, PCI_DEVFN(3, 0), PCI_PREF_MEMORY_BASE
, 4, &x
);
501 o
->write(&bus
, PCI_DEVFN(3, 0), PCI_IO_BASE
, 1, 0x01);
502 o
->read (&bus
, PCI_DEVFN(3, 0), PCI_IO_BASE
, 1, &x
);
503 o
->write(&bus
, PCI_DEVFN(3, 0), PCI_IO_BASE_UPPER16
, 4, 0x00020000);
504 o
->read (&bus
, PCI_DEVFN(3, 0), PCI_IO_BASE_UPPER16
, 4, &x
);
505 o
->write(&bus
, PCI_DEVFN(3, 0), PCI_MEMORY_BASE
, 4, 0xEBB0EA00);
506 o
->read (&bus
, PCI_DEVFN(3, 0), PCI_MEMORY_BASE
, 4, &x
);
507 o
->write(&bus
, PCI_DEVFN(3, 0), PCI_PREF_MEMORY_BASE
, 4, 0xE9F0E800);
508 o
->read (&bus
, PCI_DEVFN(3, 0), PCI_PREF_MEMORY_BASE
, 4, &x
);
510 unit_disable_pcnet(&bus
, o
);