Merge branch 'upstream-1.7' into tizen_qemu_1.7
[sdk/emulator/qemu.git] / tizen / src / hw / maru_board.c
1 /*
2  * TIZEN base board
3  *
4  * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
5  *
6  * Contact:
7  * YeongKyoon Lee <yeongkyoon.lee@samsung.com>
8  * SeokYeon Hwang <syeon.hwang@samsung.com>
9  * SangJin Kim <sangjin3.kim@samsung.com>
10  * KiTae Kim <kt920.kim@samsung.com>
11  * JinHyung Jo <jinhyung.jo@samsung.com>
12  * SungMin Ha <sungmin82.ha@samsung.com>
13  * MunKyu Im <munkyu.im@samsung.com>
14  * JiHye Kim <jihye1128.kim@samsung.com>
15  * GiWoong Kim <giwoong.kim@samsung.com>
16  * DongKyun Yun
17  * DoHyung Hong
18  * Hyunjun Son
19  *
20  * This program is free software; you can redistribute it and/or
21  * modify it under the terms of the GNU General Public License
22  * as published by the Free Software Foundation; either version 2
23  * of the License, or (at your option) any later version.
24  *
25  * This program is distributed in the hope that it will be useful,
26  * but WITHOUT ANY WARRANTY; without even the implied warranty of
27  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
28  * GNU General Public License for more details.
29  *
30  * You should have received a copy of the GNU General Public License
31  * along with this program; if not, write to the Free Software
32  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
33  *
34  * Contributors:
35  * - S-Core Co., Ltd
36  *
37  * x86 board from pc_piix.c...
38  * add some TIZEN-speciaized device...
39  */
40
41 #include <glib.h>
42
43 #include "hw/hw.h"
44 #include "hw/i386/pc.h"
45 #include "hw/i386/apic.h"
46 #include "hw/pci/pci.h"
47 #include "hw/pci/pci_ids.h"
48 #include "hw/usb.h"
49 #include "net/net.h"
50 #include "hw/boards.h"
51 #include "hw/ide.h"
52 #include "sysemu/kvm.h"
53 #include "hw/kvm/clock.h"
54 #include "sysemu/sysemu.h"
55 #include "hw/sysbus.h"
56 #include "hw/cpu/icc_bus.h"
57 #include "sysemu/arch_init.h"
58 #include "sysemu/blockdev.h"
59 #include "hw/i2c/smbus.h"
60 #include "hw/xen/xen.h"
61 #include "exec/memory.h"
62 #include "exec/address-spaces.h"
63 #include "hw/acpi/acpi.h"
64 #include "cpu.h"
65 #ifdef CONFIG_XEN
66 #  include <xen/hvm/hvm_info_table.h>
67 #endif
68
69 #include "maru_common.h"
70 #include "guest_debug.h"
71 #include "maru_pm.h"
72 #include "maru_brightness.h"
73 #include "maru_overlay.h"
74 #if defined(__linux__)
75 #include <X11/Xlib.h>
76 #endif
77 #include "vigs/vigs_device.h"
78 extern int enable_yagl;
79 extern const char *yagl_backend;
80 extern int enable_vigs;
81 extern const char *vigs_backend;
82 extern int enable_spice;
83
84 #define MAX_IDE_BUS 2
85
86 int codec_init(PCIBus *bus);
87 int maru_brill_codec_pci_device_init(PCIBus *bus);
88
89 static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 };
90 static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 };
91 static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
92
93 static bool has_pci_info = true;
94
95 MemoryRegion *global_ram_memory;
96
97 MemoryRegion *get_ram_memory(void)
98 {
99     return global_ram_memory;
100 }
101
102 /* maru specialized device init */
103 static void maru_device_init(void)
104 {
105     PCIBus *pci_bus = (PCIBus *) object_resolve_path_type("", TYPE_PCI_BUS, NULL);
106
107 #if defined(CONFIG_LINUX)
108     Display *display = XOpenDisplay(0);
109     if (!display && !enable_spice) {
110         fprintf(stderr, "Cannot open X display\n");
111         exit(1);
112     }
113 #else
114     void *display = NULL;
115 #endif
116     struct winsys_interface *vigs_wsi = NULL;
117
118     pci_maru_overlay_init(pci_bus);
119     pci_maru_brightness_init(pci_bus);
120     maru_brill_codec_pci_device_init(pci_bus);
121
122     if (enable_vigs) {
123         PCIDevice *pci_dev = pci_create(pci_bus, -1, "vigs");
124         qdev_prop_set_ptr(&pci_dev->qdev, "display", display);
125         qdev_init_nofail(&pci_dev->qdev);
126         vigs_wsi = DO_UPCAST(VIGSDevice, pci_dev, pci_dev)->wsi;
127     }
128
129     if (enable_yagl) {
130         PCIDevice *pci_dev = pci_create(pci_bus, -1, "yagl");
131         qdev_prop_set_ptr(&pci_dev->qdev, "display", display);
132         if (vigs_wsi &&
133             (strcmp(yagl_backend, "vigs") == 0) &&
134             (strcmp(vigs_backend, "gl") == 0)) {
135             qdev_prop_set_ptr(&pci_dev->qdev, "winsys_gl_interface", vigs_wsi);
136         }
137         qdev_init_nofail(&pci_dev->qdev);
138     }
139 }
140
141 extern void pc_init_pci(QEMUMachineInitArgs *args);
142 static void maru_x86_board_init(QEMUMachineInitArgs *args)
143 {
144     pc_init_pci(args);
145
146     has_pci_info = false;
147     maru_device_init();
148 }
149
150 static QEMUMachine maru_x86_machine = {
151     PC_DEFAULT_MACHINE_OPTIONS,
152     .name = "maru-x86-machine",
153     .alias = "maru-x86-machine",
154     .desc = "Maru Board (x86)",
155     .init = maru_x86_board_init,
156     .hot_add_cpu = pc_hot_add_cpu,
157 };
158
159 static void maru_machine_init(void)
160 {
161     qemu_register_machine(&maru_x86_machine);
162 }
163
164 machine_init(maru_machine_init);