blob: e4c978551fc6235d36982feb178df3dc272d242e [file] [log] [blame]
Stefan Reinauerd56981f2007-10-22 10:07:46 +00001#include <console/console.h>
Stefan Reinauer4a3bb762004-06-28 11:57:31 +00002#include <device/device.h>
Stefan Reinauerd56981f2007-10-22 10:07:46 +00003#include <device/pci.h>
4#include <device/pci_ids.h>
5#include <device/pci_ops.h>
Stefan Reinauer65e9bc12009-03-13 17:00:46 +00006#include <pc80/keyboard.h>
Stefan Reinauerd56981f2007-10-22 10:07:46 +00007#include <arch/io.h>
Stefan Reinauer4a3bb762004-06-28 11:57:31 +00008#include "chip.h"
9
Ronald G. Minnich rminnich4a8523a2009-04-07 02:18:13 +000010/* not sure how these are routed in qemu */
11static const unsigned char enetIrqs[4] = { 11, 0, 0, 0 };
12
Kevin O'Connor31b2e8f2010-09-06 20:20:47 +000013static void qemu_nb_init(device_t dev)
Stefan Reinauerd56981f2007-10-22 10:07:46 +000014{
Kevin O'Connor31b2e8f2010-09-06 20:20:47 +000015 /* Map memory at 0xc0000 - 0xfffff */
16 int i;
17 uint8_t v = pci_read_config8(dev, 0x59);
18 v |= 0x30;
19 pci_write_config8(dev, 0x59, v);
20 for (i=0; i<6; i++)
21 pci_write_config8(dev, 0x5a + i, 0x33);
Aaron Lwe2342f8b2008-05-06 15:02:22 +000022
Stefan Reinauer65e9bc12009-03-13 17:00:46 +000023 /* This sneaked in here, because Qemu does not
24 * emulate a SuperIO chip
25 */
Stefan Reinauer740b5872010-02-23 20:31:37 +000026 pc_keyboard_init(0);
Ronald G. Minnich rminnich4a8523a2009-04-07 02:18:13 +000027
Stefan Reinauer14e22772010-04-27 06:56:47 +000028 /* The PIRQ table is not working well for interrupt routing purposes.
29 * so we'll just set the IRQ directly.
Ronald G. Minnich rminnich4a8523a2009-04-07 02:18:13 +000030 */
Stefan Reinauerc02b4fc2010-03-22 11:42:32 +000031 printk(BIOS_INFO, "setting ethernet\n");
Ronald G. Minnich rminnich4a8523a2009-04-07 02:18:13 +000032 pci_assign_irqs(0, 3, enetIrqs);
Stefan Reinauerd56981f2007-10-22 10:07:46 +000033}
34
Kevin O'Connor31b2e8f2010-09-06 20:20:47 +000035static struct device_operations nb_operations = {
36 .read_resources = pci_dev_read_resources,
37 .set_resources = pci_dev_set_resources,
38 .enable_resources = pci_dev_enable_resources,
39 .init = qemu_nb_init,
40 .ops_pci = 0,
41};
42
43static const struct pci_driver nb_driver __pci_driver = {
44 .ops = &nb_operations,
45 .vendor = 0x8086,
46 .device = 0x1237,
47};
48
49static void qemu_init(device_t dev)
50{
51 /* The VGA OPROM already lives at 0xc0000,
52 * force coreboot to use it.
53 */
54 dev->on_mainboard = 1;
55
56 /* Now do the usual initialization */
57 pci_dev_init(dev);
58}
59
Stefan Reinauerd56981f2007-10-22 10:07:46 +000060static struct device_operations vga_operations = {
61 .read_resources = pci_dev_read_resources,
62 .set_resources = pci_dev_set_resources,
63 .enable_resources = pci_dev_enable_resources,
Ronald G. Minnich rminnich4a8523a2009-04-07 02:18:13 +000064 .init = qemu_init,
Stefan Reinauerd56981f2007-10-22 10:07:46 +000065 .ops_pci = 0,
66};
67
Stefan Reinauerf1cf1f72007-10-24 09:08:58 +000068static const struct pci_driver vga_driver __pci_driver = {
Stefan Reinauerd56981f2007-10-22 10:07:46 +000069 .ops = &vga_operations,
70 .vendor = 0x1013,
71 .device = 0x00b8,
72};
73
Carl-Daniel Hailfinger7ad11e82009-02-18 20:41:57 +000074struct chip_operations mainboard_ops = {
Uwe Hermanna7aa29b2006-11-05 18:50:49 +000075 CHIP_NAME("QEMU Mainboard")
Stefan Reinauer4a3bb762004-06-28 11:57:31 +000076};
77