root / hw / grlib.h @ df182043
History | View | Annotate | Download (3.7 kB)
1 | 0f3a4a01 | Fabien Chouteau | /*
|
---|---|---|---|
2 | 0f3a4a01 | Fabien Chouteau | * QEMU GRLIB Components
|
3 | 0f3a4a01 | Fabien Chouteau | *
|
4 | 0f3a4a01 | Fabien Chouteau | * Copyright (c) 2010-2011 AdaCore
|
5 | 0f3a4a01 | Fabien Chouteau | *
|
6 | 0f3a4a01 | Fabien Chouteau | * Permission is hereby granted, free of charge, to any person obtaining a copy
|
7 | 0f3a4a01 | Fabien Chouteau | * of this software and associated documentation files (the "Software"), to deal
|
8 | 0f3a4a01 | Fabien Chouteau | * in the Software without restriction, including without limitation the rights
|
9 | 0f3a4a01 | Fabien Chouteau | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10 | 0f3a4a01 | Fabien Chouteau | * copies of the Software, and to permit persons to whom the Software is
|
11 | 0f3a4a01 | Fabien Chouteau | * furnished to do so, subject to the following conditions:
|
12 | 0f3a4a01 | Fabien Chouteau | *
|
13 | 0f3a4a01 | Fabien Chouteau | * The above copyright notice and this permission notice shall be included in
|
14 | 0f3a4a01 | Fabien Chouteau | * all copies or substantial portions of the Software.
|
15 | 0f3a4a01 | Fabien Chouteau | *
|
16 | 0f3a4a01 | Fabien Chouteau | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17 | 0f3a4a01 | Fabien Chouteau | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18 | 0f3a4a01 | Fabien Chouteau | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
19 | 0f3a4a01 | Fabien Chouteau | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20 | 0f3a4a01 | Fabien Chouteau | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21 | 0f3a4a01 | Fabien Chouteau | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22 | 0f3a4a01 | Fabien Chouteau | * THE SOFTWARE.
|
23 | 0f3a4a01 | Fabien Chouteau | */
|
24 | 0f3a4a01 | Fabien Chouteau | |
25 | 0f3a4a01 | Fabien Chouteau | #ifndef _GRLIB_H_
|
26 | 0f3a4a01 | Fabien Chouteau | #define _GRLIB_H_
|
27 | 0f3a4a01 | Fabien Chouteau | |
28 | 0f3a4a01 | Fabien Chouteau | #include "qdev.h" |
29 | 0f3a4a01 | Fabien Chouteau | #include "sysbus.h" |
30 | 0f3a4a01 | Fabien Chouteau | |
31 | 0f3a4a01 | Fabien Chouteau | /* Emulation of GrLib device is base on the GRLIB IP Core User's Manual:
|
32 | 0f3a4a01 | Fabien Chouteau | * http://www.gaisler.com/products/grlib/grip.pdf
|
33 | 0f3a4a01 | Fabien Chouteau | */
|
34 | 0f3a4a01 | Fabien Chouteau | |
35 | 3f10bcbb | Fabien Chouteau | /* IRQMP */
|
36 | 3f10bcbb | Fabien Chouteau | |
37 | 3f10bcbb | Fabien Chouteau | typedef void (*set_pil_in_fn) (void *opaque, uint32_t pil_in); |
38 | 3f10bcbb | Fabien Chouteau | |
39 | 3f10bcbb | Fabien Chouteau | void grlib_irqmp_set_irq(void *opaque, int irq, int level); |
40 | 3f10bcbb | Fabien Chouteau | |
41 | 3f10bcbb | Fabien Chouteau | void grlib_irqmp_ack(DeviceState *dev, int intno); |
42 | 3f10bcbb | Fabien Chouteau | |
43 | 3f10bcbb | Fabien Chouteau | static inline |
44 | 3f10bcbb | Fabien Chouteau | DeviceState *grlib_irqmp_create(target_phys_addr_t base, |
45 | 3f10bcbb | Fabien Chouteau | CPUState *env, |
46 | 3f10bcbb | Fabien Chouteau | qemu_irq **cpu_irqs, |
47 | 3f10bcbb | Fabien Chouteau | uint32_t nr_irqs, |
48 | 3f10bcbb | Fabien Chouteau | set_pil_in_fn set_pil_in) |
49 | 3f10bcbb | Fabien Chouteau | { |
50 | 3f10bcbb | Fabien Chouteau | DeviceState *dev; |
51 | 3f10bcbb | Fabien Chouteau | |
52 | 3f10bcbb | Fabien Chouteau | assert(cpu_irqs != NULL);
|
53 | 3f10bcbb | Fabien Chouteau | |
54 | 3f10bcbb | Fabien Chouteau | dev = qdev_create(NULL, "grlib,irqmp"); |
55 | 3f10bcbb | Fabien Chouteau | qdev_prop_set_ptr(dev, "set_pil_in", set_pil_in);
|
56 | 3f10bcbb | Fabien Chouteau | qdev_prop_set_ptr(dev, "set_pil_in_opaque", env);
|
57 | 3f10bcbb | Fabien Chouteau | |
58 | 3f10bcbb | Fabien Chouteau | if (qdev_init(dev)) {
|
59 | 3f10bcbb | Fabien Chouteau | return NULL; |
60 | 3f10bcbb | Fabien Chouteau | } |
61 | 3f10bcbb | Fabien Chouteau | |
62 | 3f10bcbb | Fabien Chouteau | env->irq_manager = dev; |
63 | 3f10bcbb | Fabien Chouteau | |
64 | 3f10bcbb | Fabien Chouteau | sysbus_mmio_map(sysbus_from_qdev(dev), 0, base);
|
65 | 3f10bcbb | Fabien Chouteau | |
66 | 3f10bcbb | Fabien Chouteau | *cpu_irqs = qemu_allocate_irqs(grlib_irqmp_set_irq, |
67 | 3f10bcbb | Fabien Chouteau | dev, |
68 | 3f10bcbb | Fabien Chouteau | nr_irqs); |
69 | 3f10bcbb | Fabien Chouteau | |
70 | 3f10bcbb | Fabien Chouteau | return dev;
|
71 | 3f10bcbb | Fabien Chouteau | } |
72 | 3f10bcbb | Fabien Chouteau | |
73 | 0f3a4a01 | Fabien Chouteau | /* GPTimer */
|
74 | 0f3a4a01 | Fabien Chouteau | |
75 | 0f3a4a01 | Fabien Chouteau | static inline |
76 | 0f3a4a01 | Fabien Chouteau | DeviceState *grlib_gptimer_create(target_phys_addr_t base, |
77 | 0f3a4a01 | Fabien Chouteau | uint32_t nr_timers, |
78 | 0f3a4a01 | Fabien Chouteau | uint32_t freq, |
79 | 0f3a4a01 | Fabien Chouteau | qemu_irq *cpu_irqs, |
80 | 0f3a4a01 | Fabien Chouteau | int base_irq)
|
81 | 0f3a4a01 | Fabien Chouteau | { |
82 | 0f3a4a01 | Fabien Chouteau | DeviceState *dev; |
83 | 0f3a4a01 | Fabien Chouteau | int i;
|
84 | 0f3a4a01 | Fabien Chouteau | |
85 | 0f3a4a01 | Fabien Chouteau | dev = qdev_create(NULL, "grlib,gptimer"); |
86 | 0f3a4a01 | Fabien Chouteau | qdev_prop_set_uint32(dev, "nr-timers", nr_timers);
|
87 | 0f3a4a01 | Fabien Chouteau | qdev_prop_set_uint32(dev, "frequency", freq);
|
88 | 0f3a4a01 | Fabien Chouteau | qdev_prop_set_uint32(dev, "irq-line", base_irq);
|
89 | 0f3a4a01 | Fabien Chouteau | |
90 | 0f3a4a01 | Fabien Chouteau | if (qdev_init(dev)) {
|
91 | 0f3a4a01 | Fabien Chouteau | return NULL; |
92 | 0f3a4a01 | Fabien Chouteau | } |
93 | 0f3a4a01 | Fabien Chouteau | |
94 | 0f3a4a01 | Fabien Chouteau | sysbus_mmio_map(sysbus_from_qdev(dev), 0, base);
|
95 | 0f3a4a01 | Fabien Chouteau | |
96 | 0f3a4a01 | Fabien Chouteau | for (i = 0; i < nr_timers; i++) { |
97 | 0f3a4a01 | Fabien Chouteau | sysbus_connect_irq(sysbus_from_qdev(dev), i, cpu_irqs[base_irq + i]); |
98 | 0f3a4a01 | Fabien Chouteau | } |
99 | 0f3a4a01 | Fabien Chouteau | |
100 | 0f3a4a01 | Fabien Chouteau | return dev;
|
101 | 0f3a4a01 | Fabien Chouteau | } |
102 | 0f3a4a01 | Fabien Chouteau | |
103 | 8b1e1320 | Fabien Chouteau | /* APB UART */
|
104 | 8b1e1320 | Fabien Chouteau | |
105 | 8b1e1320 | Fabien Chouteau | static inline |
106 | 8b1e1320 | Fabien Chouteau | DeviceState *grlib_apbuart_create(target_phys_addr_t base, |
107 | 8b1e1320 | Fabien Chouteau | CharDriverState *serial, |
108 | 8b1e1320 | Fabien Chouteau | qemu_irq irq) |
109 | 8b1e1320 | Fabien Chouteau | { |
110 | 8b1e1320 | Fabien Chouteau | DeviceState *dev; |
111 | 8b1e1320 | Fabien Chouteau | |
112 | 8b1e1320 | Fabien Chouteau | dev = qdev_create(NULL, "grlib,apbuart"); |
113 | 8b1e1320 | Fabien Chouteau | qdev_prop_set_chr(dev, "chrdev", serial);
|
114 | 8b1e1320 | Fabien Chouteau | |
115 | 8b1e1320 | Fabien Chouteau | if (qdev_init(dev)) {
|
116 | 8b1e1320 | Fabien Chouteau | return NULL; |
117 | 8b1e1320 | Fabien Chouteau | } |
118 | 8b1e1320 | Fabien Chouteau | |
119 | 8b1e1320 | Fabien Chouteau | sysbus_mmio_map(sysbus_from_qdev(dev), 0, base);
|
120 | 8b1e1320 | Fabien Chouteau | |
121 | 8b1e1320 | Fabien Chouteau | sysbus_connect_irq(sysbus_from_qdev(dev), 0, irq);
|
122 | 8b1e1320 | Fabien Chouteau | |
123 | 8b1e1320 | Fabien Chouteau | return dev;
|
124 | 8b1e1320 | Fabien Chouteau | } |
125 | 8b1e1320 | Fabien Chouteau | |
126 | 0f3a4a01 | Fabien Chouteau | #endif /* ! _GRLIB_H_ */ |