Statistics
| Branch: | Revision:

root / hw / grlib.h @ b443ae67

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_ */