xref: /openbmc/qemu/hw/rx/rx62n.c (revision 1db2086e6a98c4e917d6618c97e730eaeb2a8ada)
10c80f50fSYoshinori Sato /*
20c80f50fSYoshinori Sato  * RX62N Microcontroller
30c80f50fSYoshinori Sato  *
40c80f50fSYoshinori Sato  * Datasheet: RX62N Group, RX621 Group User's Manual: Hardware
50c80f50fSYoshinori Sato  * (Rev.1.40 R01UH0033EJ0140)
60c80f50fSYoshinori Sato  *
70c80f50fSYoshinori Sato  * Copyright (c) 2019 Yoshinori Sato
8*1db2086eSPhilippe Mathieu-Daudé  * Copyright (c) 2020 Philippe Mathieu-Daudé
90c80f50fSYoshinori Sato  *
100c80f50fSYoshinori Sato  * This program is free software; you can redistribute it and/or modify it
110c80f50fSYoshinori Sato  * under the terms and conditions of the GNU General Public License,
120c80f50fSYoshinori Sato  * version 2 or later, as published by the Free Software Foundation.
130c80f50fSYoshinori Sato  *
140c80f50fSYoshinori Sato  * This program is distributed in the hope it will be useful, but WITHOUT
150c80f50fSYoshinori Sato  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
160c80f50fSYoshinori Sato  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
170c80f50fSYoshinori Sato  * more details.
180c80f50fSYoshinori Sato  *
190c80f50fSYoshinori Sato  * You should have received a copy of the GNU General Public License along with
200c80f50fSYoshinori Sato  * this program.  If not, see <http://www.gnu.org/licenses/>.
210c80f50fSYoshinori Sato  */
220c80f50fSYoshinori Sato 
230c80f50fSYoshinori Sato #include "qemu/osdep.h"
240c80f50fSYoshinori Sato #include "qapi/error.h"
257d272cb4SRichard Henderson #include "qemu/error-report.h"
260c80f50fSYoshinori Sato #include "hw/hw.h"
270c80f50fSYoshinori Sato #include "hw/rx/rx62n.h"
280c80f50fSYoshinori Sato #include "hw/loader.h"
290c80f50fSYoshinori Sato #include "hw/sysbus.h"
300c80f50fSYoshinori Sato #include "hw/qdev-properties.h"
310c80f50fSYoshinori Sato #include "sysemu/sysemu.h"
327d272cb4SRichard Henderson #include "sysemu/qtest.h"
330c80f50fSYoshinori Sato #include "cpu.h"
340c80f50fSYoshinori Sato 
350c80f50fSYoshinori Sato /*
360c80f50fSYoshinori Sato  * RX62N Internal Memory
370c80f50fSYoshinori Sato  */
380c80f50fSYoshinori Sato #define RX62N_IRAM_BASE     0x00000000
390c80f50fSYoshinori Sato #define RX62N_DFLASH_BASE   0x00100000
400c80f50fSYoshinori Sato #define RX62N_CFLASH_BASE   0xfff80000
410c80f50fSYoshinori Sato 
420c80f50fSYoshinori Sato /*
430c80f50fSYoshinori Sato  * RX62N Peripheral Address
440c80f50fSYoshinori Sato  * See users manual section 5
450c80f50fSYoshinori Sato  */
460c80f50fSYoshinori Sato #define RX62N_ICU_BASE  0x00087000
470c80f50fSYoshinori Sato #define RX62N_TMR_BASE  0x00088200
480c80f50fSYoshinori Sato #define RX62N_CMT_BASE  0x00088000
490c80f50fSYoshinori Sato #define RX62N_SCI_BASE  0x00088240
500c80f50fSYoshinori Sato 
510c80f50fSYoshinori Sato /*
520c80f50fSYoshinori Sato  * RX62N Peripheral IRQ
530c80f50fSYoshinori Sato  * See users manual section 11
540c80f50fSYoshinori Sato  */
550c80f50fSYoshinori Sato #define RX62N_TMR_IRQ   174
560c80f50fSYoshinori Sato #define RX62N_CMT_IRQ   28
570c80f50fSYoshinori Sato #define RX62N_SCI_IRQ   214
580c80f50fSYoshinori Sato 
59*1db2086eSPhilippe Mathieu-Daudé #define RX62N_XTAL_MIN_HZ  (8 * 1000 * 1000)
60*1db2086eSPhilippe Mathieu-Daudé #define RX62N_XTAL_MAX_HZ (14 * 1000 * 1000)
61*1db2086eSPhilippe Mathieu-Daudé #define RX62N_PCLK_MAX_HZ (50 * 1000 * 1000)
62*1db2086eSPhilippe Mathieu-Daudé 
63*1db2086eSPhilippe Mathieu-Daudé typedef struct RX62NClass {
64*1db2086eSPhilippe Mathieu-Daudé     /*< private >*/
65*1db2086eSPhilippe Mathieu-Daudé     DeviceClass parent_class;
66*1db2086eSPhilippe Mathieu-Daudé     /*< public >*/
67*1db2086eSPhilippe Mathieu-Daudé     const char *name;
68*1db2086eSPhilippe Mathieu-Daudé     uint64_t ram_size;
69*1db2086eSPhilippe Mathieu-Daudé     uint64_t rom_flash_size;
70*1db2086eSPhilippe Mathieu-Daudé     uint64_t data_flash_size;
71*1db2086eSPhilippe Mathieu-Daudé } RX62NClass;
72*1db2086eSPhilippe Mathieu-Daudé 
73*1db2086eSPhilippe Mathieu-Daudé #define RX62N_MCU_CLASS(klass) \
74*1db2086eSPhilippe Mathieu-Daudé     OBJECT_CLASS_CHECK(RX62NClass, (klass), TYPE_RX62N_MCU)
75*1db2086eSPhilippe Mathieu-Daudé #define RX62N_MCU_GET_CLASS(obj) \
76*1db2086eSPhilippe Mathieu-Daudé     OBJECT_GET_CLASS(RX62NClass, (obj), TYPE_RX62N_MCU)
77*1db2086eSPhilippe Mathieu-Daudé 
780c80f50fSYoshinori Sato /*
790c80f50fSYoshinori Sato  * IRQ -> IPR mapping table
800c80f50fSYoshinori Sato  * 0x00 - 0x91: IPR no (IPR00 to IPR91)
810c80f50fSYoshinori Sato  * 0xff: IPR not assigned
820c80f50fSYoshinori Sato  * See "11.3.1 Interrupt Vector Table" in hardware manual.
830c80f50fSYoshinori Sato  */
840c80f50fSYoshinori Sato static const uint8_t ipr_table[NR_IRQS] = {
850c80f50fSYoshinori Sato     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
860c80f50fSYoshinori Sato     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 15 */
870c80f50fSYoshinori Sato     0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0x02,
880c80f50fSYoshinori Sato     0xff, 0xff, 0xff, 0x03, 0x04, 0x05, 0x06, 0x07, /* 31 */
890c80f50fSYoshinori Sato     0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
900c80f50fSYoshinori Sato     0x10, 0x11, 0x12, 0x13, 0x14, 0x14, 0x14, 0x14, /* 47 */
910c80f50fSYoshinori Sato     0x15, 0x15, 0x15, 0x15, 0xff, 0xff, 0xff, 0xff,
920c80f50fSYoshinori Sato     0x18, 0x18, 0x18, 0x18, 0x18, 0x1d, 0x1e, 0x1f, /* 63 */
930c80f50fSYoshinori Sato     0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
940c80f50fSYoshinori Sato     0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 79 */
950c80f50fSYoshinori Sato     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
960c80f50fSYoshinori Sato     0xff, 0xff, 0x3a, 0x3b, 0x3c, 0xff, 0xff, 0xff, /* 95 */
970c80f50fSYoshinori Sato     0x40, 0xff, 0x44, 0x45, 0xff, 0xff, 0x48, 0xff,
980c80f50fSYoshinori Sato     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 111 */
990c80f50fSYoshinori Sato     0xff, 0xff, 0x51, 0x51, 0x51, 0x51, 0x52, 0x52,
1000c80f50fSYoshinori Sato     0x52, 0x53, 0x53, 0x54, 0x54, 0x55, 0x55, 0x56, /* 127 */
1010c80f50fSYoshinori Sato     0x56, 0x57, 0x57, 0x57, 0x57, 0x58, 0x59, 0x59,
1020c80f50fSYoshinori Sato     0x59, 0x59, 0x5a, 0x5b, 0x5b, 0x5b, 0x5c, 0x5c, /* 143 */
1030c80f50fSYoshinori Sato     0x5c, 0x5c, 0x5d, 0x5d, 0x5d, 0x5e, 0x5e, 0x5f,
1040c80f50fSYoshinori Sato     0x5f, 0x60, 0x60, 0x61, 0x61, 0x62, 0x62, 0x62, /* 159 */
1050c80f50fSYoshinori Sato     0x62, 0x63, 0x64, 0x64, 0x64, 0x64, 0x65, 0x66,
1060c80f50fSYoshinori Sato     0x66, 0x66, 0x67, 0x67, 0x67, 0x67, 0x68, 0x68, /* 175 */
1070c80f50fSYoshinori Sato     0x68, 0x69, 0x69, 0x69, 0x6a, 0x6a, 0x6a, 0x6b,
1080c80f50fSYoshinori Sato     0x6b, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 191 */
1090c80f50fSYoshinori Sato     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x71,
1100c80f50fSYoshinori Sato     0x72, 0x73, 0x74, 0x75, 0xff, 0xff, 0xff, 0xff, /* 207 */
1110c80f50fSYoshinori Sato     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80,
1120c80f50fSYoshinori Sato     0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x82, 0x82, /* 223 */
1130c80f50fSYoshinori Sato     0x82, 0x82, 0x83, 0x83, 0x83, 0x83, 0xff, 0xff,
1140c80f50fSYoshinori Sato     0xff, 0xff, 0x85, 0x85, 0x85, 0x85, 0x86, 0x86, /* 239 */
1150c80f50fSYoshinori Sato     0x86, 0x86, 0xff, 0xff, 0xff, 0xff, 0x88, 0x89,
1160c80f50fSYoshinori Sato     0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, /* 255 */
1170c80f50fSYoshinori Sato };
1180c80f50fSYoshinori Sato 
1190c80f50fSYoshinori Sato /*
1200c80f50fSYoshinori Sato  * Level triggerd IRQ list
1210c80f50fSYoshinori Sato  * Not listed IRQ is Edge trigger.
1220c80f50fSYoshinori Sato  * See "11.3.1 Interrupt Vector Table" in hardware manual.
1230c80f50fSYoshinori Sato  */
1240c80f50fSYoshinori Sato static const uint8_t levelirq[] = {
1250c80f50fSYoshinori Sato      16,  21,  32,  44,  47,  48,  51,  64,  65,  66,
1260c80f50fSYoshinori Sato      67,  68,  69,  70,  71,  72,  73,  74,  75,  76,
1270c80f50fSYoshinori Sato      77,  78,  79,  90,  91, 170, 171, 172, 173, 214,
1280c80f50fSYoshinori Sato     217, 218, 221, 222, 225, 226, 229, 234, 237, 238,
1290c80f50fSYoshinori Sato     241, 246, 249, 250, 253,
1300c80f50fSYoshinori Sato };
1310c80f50fSYoshinori Sato 
1320c80f50fSYoshinori Sato static void register_icu(RX62NState *s)
1330c80f50fSYoshinori Sato {
1340c80f50fSYoshinori Sato     int i;
1350c80f50fSYoshinori Sato     SysBusDevice *icu;
1360c80f50fSYoshinori Sato 
1370c80f50fSYoshinori Sato     object_initialize_child(OBJECT(s), "icu", &s->icu, TYPE_RX_ICU);
1380c80f50fSYoshinori Sato     icu = SYS_BUS_DEVICE(&s->icu);
1390c80f50fSYoshinori Sato     qdev_prop_set_uint32(DEVICE(icu), "len-ipr-map", NR_IRQS);
1400c80f50fSYoshinori Sato     for (i = 0; i < NR_IRQS; i++) {
1410c80f50fSYoshinori Sato         char propname[32];
1420c80f50fSYoshinori Sato         snprintf(propname, sizeof(propname), "ipr-map[%d]", i);
1430c80f50fSYoshinori Sato         qdev_prop_set_uint32(DEVICE(icu), propname, ipr_table[i]);
1440c80f50fSYoshinori Sato     }
1450c80f50fSYoshinori Sato     qdev_prop_set_uint32(DEVICE(icu), "len-trigger-level",
1460c80f50fSYoshinori Sato                          ARRAY_SIZE(levelirq));
1470c80f50fSYoshinori Sato     for (i = 0; i < ARRAY_SIZE(levelirq); i++) {
1480c80f50fSYoshinori Sato         char propname[32];
1490c80f50fSYoshinori Sato         snprintf(propname, sizeof(propname), "trigger-level[%d]", i);
1500c80f50fSYoshinori Sato         qdev_prop_set_uint32(DEVICE(icu), propname, levelirq[i]);
1510c80f50fSYoshinori Sato     }
1520c80f50fSYoshinori Sato 
1530c80f50fSYoshinori Sato     for (i = 0; i < NR_IRQS; i++) {
1540c80f50fSYoshinori Sato         s->irq[i] = qdev_get_gpio_in(DEVICE(icu), i);
1550c80f50fSYoshinori Sato     }
1560c80f50fSYoshinori Sato     sysbus_realize(icu, &error_abort);
1570c80f50fSYoshinori Sato     sysbus_connect_irq(icu, 0, qdev_get_gpio_in(DEVICE(&s->cpu), RX_CPU_IRQ));
1580c80f50fSYoshinori Sato     sysbus_connect_irq(icu, 1, qdev_get_gpio_in(DEVICE(&s->cpu), RX_CPU_FIR));
1590c80f50fSYoshinori Sato     sysbus_connect_irq(icu, 2, s->irq[SWI]);
1600c80f50fSYoshinori Sato     sysbus_mmio_map(SYS_BUS_DEVICE(icu), 0, RX62N_ICU_BASE);
1610c80f50fSYoshinori Sato }
1620c80f50fSYoshinori Sato 
1630c80f50fSYoshinori Sato static void register_tmr(RX62NState *s, int unit)
1640c80f50fSYoshinori Sato {
1650c80f50fSYoshinori Sato     SysBusDevice *tmr;
1660c80f50fSYoshinori Sato     int i, irqbase;
1670c80f50fSYoshinori Sato 
1680c80f50fSYoshinori Sato     object_initialize_child(OBJECT(s), "tmr[*]",
1690c80f50fSYoshinori Sato                             &s->tmr[unit], TYPE_RENESAS_TMR);
1700c80f50fSYoshinori Sato     tmr = SYS_BUS_DEVICE(&s->tmr[unit]);
171*1db2086eSPhilippe Mathieu-Daudé     qdev_prop_set_uint64(DEVICE(tmr), "input-freq", s->pclk_freq_hz);
1720c80f50fSYoshinori Sato     sysbus_realize(tmr, &error_abort);
1730c80f50fSYoshinori Sato 
1740c80f50fSYoshinori Sato     irqbase = RX62N_TMR_IRQ + TMR_NR_IRQ * unit;
1750c80f50fSYoshinori Sato     for (i = 0; i < TMR_NR_IRQ; i++) {
1760c80f50fSYoshinori Sato         sysbus_connect_irq(tmr, i, s->irq[irqbase + i]);
1770c80f50fSYoshinori Sato     }
1780c80f50fSYoshinori Sato     sysbus_mmio_map(tmr, 0, RX62N_TMR_BASE + unit * 0x10);
1790c80f50fSYoshinori Sato }
1800c80f50fSYoshinori Sato 
1810c80f50fSYoshinori Sato static void register_cmt(RX62NState *s, int unit)
1820c80f50fSYoshinori Sato {
1830c80f50fSYoshinori Sato     SysBusDevice *cmt;
1840c80f50fSYoshinori Sato     int i, irqbase;
1850c80f50fSYoshinori Sato 
1860c80f50fSYoshinori Sato     object_initialize_child(OBJECT(s), "cmt[*]",
1870c80f50fSYoshinori Sato                             &s->cmt[unit], TYPE_RENESAS_CMT);
1880c80f50fSYoshinori Sato     cmt = SYS_BUS_DEVICE(&s->cmt[unit]);
189*1db2086eSPhilippe Mathieu-Daudé     qdev_prop_set_uint64(DEVICE(cmt), "input-freq", s->pclk_freq_hz);
1900c80f50fSYoshinori Sato     sysbus_realize(cmt, &error_abort);
1910c80f50fSYoshinori Sato 
1920c80f50fSYoshinori Sato     irqbase = RX62N_CMT_IRQ + CMT_NR_IRQ * unit;
1930c80f50fSYoshinori Sato     for (i = 0; i < CMT_NR_IRQ; i++) {
1940c80f50fSYoshinori Sato         sysbus_connect_irq(cmt, i, s->irq[irqbase + i]);
1950c80f50fSYoshinori Sato     }
1960c80f50fSYoshinori Sato     sysbus_mmio_map(cmt, 0, RX62N_CMT_BASE + unit * 0x10);
1970c80f50fSYoshinori Sato }
1980c80f50fSYoshinori Sato 
1990c80f50fSYoshinori Sato static void register_sci(RX62NState *s, int unit)
2000c80f50fSYoshinori Sato {
2010c80f50fSYoshinori Sato     SysBusDevice *sci;
2020c80f50fSYoshinori Sato     int i, irqbase;
2030c80f50fSYoshinori Sato 
2040c80f50fSYoshinori Sato     object_initialize_child(OBJECT(s), "sci[*]",
2050c80f50fSYoshinori Sato                             &s->sci[unit], TYPE_RENESAS_SCI);
2060c80f50fSYoshinori Sato     sci = SYS_BUS_DEVICE(&s->sci[unit]);
2070c80f50fSYoshinori Sato     qdev_prop_set_chr(DEVICE(sci), "chardev", serial_hd(unit));
208*1db2086eSPhilippe Mathieu-Daudé     qdev_prop_set_uint64(DEVICE(sci), "input-freq", s->pclk_freq_hz);
2090c80f50fSYoshinori Sato     sysbus_realize(sci, &error_abort);
2100c80f50fSYoshinori Sato 
2110c80f50fSYoshinori Sato     irqbase = RX62N_SCI_IRQ + SCI_NR_IRQ * unit;
2120c80f50fSYoshinori Sato     for (i = 0; i < SCI_NR_IRQ; i++) {
2130c80f50fSYoshinori Sato         sysbus_connect_irq(sci, i, s->irq[irqbase + i]);
2140c80f50fSYoshinori Sato     }
2150c80f50fSYoshinori Sato     sysbus_mmio_map(sci, 0, RX62N_SCI_BASE + unit * 0x08);
2160c80f50fSYoshinori Sato }
2170c80f50fSYoshinori Sato 
2180c80f50fSYoshinori Sato static void rx62n_realize(DeviceState *dev, Error **errp)
2190c80f50fSYoshinori Sato {
2200c80f50fSYoshinori Sato     RX62NState *s = RX62N_MCU(dev);
221*1db2086eSPhilippe Mathieu-Daudé     RX62NClass *rxc = RX62N_MCU_GET_CLASS(dev);
222*1db2086eSPhilippe Mathieu-Daudé 
223*1db2086eSPhilippe Mathieu-Daudé     if (s->xtal_freq_hz == 0) {
224*1db2086eSPhilippe Mathieu-Daudé         error_setg(errp, "\"xtal-frequency-hz\" property must be provided.");
225*1db2086eSPhilippe Mathieu-Daudé         return;
226*1db2086eSPhilippe Mathieu-Daudé     }
227*1db2086eSPhilippe Mathieu-Daudé     /* XTAL range: 8-14 MHz */
228*1db2086eSPhilippe Mathieu-Daudé     if (s->xtal_freq_hz < RX62N_XTAL_MIN_HZ
229*1db2086eSPhilippe Mathieu-Daudé             || s->xtal_freq_hz > RX62N_XTAL_MAX_HZ) {
230*1db2086eSPhilippe Mathieu-Daudé         error_setg(errp, "\"xtal-frequency-hz\" property in incorrect range.");
231*1db2086eSPhilippe Mathieu-Daudé         return;
232*1db2086eSPhilippe Mathieu-Daudé     }
233*1db2086eSPhilippe Mathieu-Daudé     /* Use a 4x fixed multiplier */
234*1db2086eSPhilippe Mathieu-Daudé     s->pclk_freq_hz = 4 * s->xtal_freq_hz;
235*1db2086eSPhilippe Mathieu-Daudé     /* PCLK range: 8-50 MHz */
236*1db2086eSPhilippe Mathieu-Daudé     assert(s->pclk_freq_hz <= RX62N_PCLK_MAX_HZ);
2370c80f50fSYoshinori Sato 
2380c80f50fSYoshinori Sato     memory_region_init_ram(&s->iram, OBJECT(dev), "iram",
239*1db2086eSPhilippe Mathieu-Daudé                            rxc->ram_size, &error_abort);
2400c80f50fSYoshinori Sato     memory_region_add_subregion(s->sysmem, RX62N_IRAM_BASE, &s->iram);
2410c80f50fSYoshinori Sato     memory_region_init_rom(&s->d_flash, OBJECT(dev), "flash-data",
242*1db2086eSPhilippe Mathieu-Daudé                            rxc->data_flash_size, &error_abort);
2430c80f50fSYoshinori Sato     memory_region_add_subregion(s->sysmem, RX62N_DFLASH_BASE, &s->d_flash);
2440c80f50fSYoshinori Sato     memory_region_init_rom(&s->c_flash, OBJECT(dev), "flash-code",
245*1db2086eSPhilippe Mathieu-Daudé                            rxc->rom_flash_size, &error_abort);
2460c80f50fSYoshinori Sato     memory_region_add_subregion(s->sysmem, RX62N_CFLASH_BASE, &s->c_flash);
2470c80f50fSYoshinori Sato 
2480c80f50fSYoshinori Sato     if (!s->kernel) {
2497d272cb4SRichard Henderson         if (bios_name) {
2500c80f50fSYoshinori Sato             rom_add_file_fixed(bios_name, RX62N_CFLASH_BASE, 0);
2517d272cb4SRichard Henderson         }  else if (!qtest_enabled()) {
2527d272cb4SRichard Henderson             error_report("No bios or kernel specified");
2537d272cb4SRichard Henderson             exit(1);
2547d272cb4SRichard Henderson         }
2550c80f50fSYoshinori Sato     }
2560c80f50fSYoshinori Sato 
2570c80f50fSYoshinori Sato     /* Initialize CPU */
2580c80f50fSYoshinori Sato     object_initialize_child(OBJECT(s), "cpu", &s->cpu, TYPE_RX62N_CPU);
2590c80f50fSYoshinori Sato     qdev_realize(DEVICE(&s->cpu), NULL, &error_abort);
2600c80f50fSYoshinori Sato 
2610c80f50fSYoshinori Sato     register_icu(s);
2620c80f50fSYoshinori Sato     s->cpu.env.ack = qdev_get_gpio_in_named(DEVICE(&s->icu), "ack", 0);
2630c80f50fSYoshinori Sato     register_tmr(s, 0);
2640c80f50fSYoshinori Sato     register_tmr(s, 1);
2650c80f50fSYoshinori Sato     register_cmt(s, 0);
2660c80f50fSYoshinori Sato     register_cmt(s, 1);
2670c80f50fSYoshinori Sato     register_sci(s, 0);
2680c80f50fSYoshinori Sato }
2690c80f50fSYoshinori Sato 
2700c80f50fSYoshinori Sato static Property rx62n_properties[] = {
2710c80f50fSYoshinori Sato     DEFINE_PROP_LINK("main-bus", RX62NState, sysmem, TYPE_MEMORY_REGION,
2720c80f50fSYoshinori Sato                      MemoryRegion *),
2730c80f50fSYoshinori Sato     DEFINE_PROP_BOOL("load-kernel", RX62NState, kernel, false),
274*1db2086eSPhilippe Mathieu-Daudé     DEFINE_PROP_UINT32("xtal-frequency-hz", RX62NState, xtal_freq_hz, 0),
2750c80f50fSYoshinori Sato     DEFINE_PROP_END_OF_LIST(),
2760c80f50fSYoshinori Sato };
2770c80f50fSYoshinori Sato 
2780c80f50fSYoshinori Sato static void rx62n_class_init(ObjectClass *klass, void *data)
2790c80f50fSYoshinori Sato {
2800c80f50fSYoshinori Sato     DeviceClass *dc = DEVICE_CLASS(klass);
2810c80f50fSYoshinori Sato 
2820c80f50fSYoshinori Sato     dc->realize = rx62n_realize;
2830c80f50fSYoshinori Sato     device_class_set_props(dc, rx62n_properties);
2840c80f50fSYoshinori Sato }
2850c80f50fSYoshinori Sato 
286*1db2086eSPhilippe Mathieu-Daudé static void r5f562n7_class_init(ObjectClass *oc, void *data)
287*1db2086eSPhilippe Mathieu-Daudé {
288*1db2086eSPhilippe Mathieu-Daudé     RX62NClass *rxc = RX62N_MCU_CLASS(oc);
289*1db2086eSPhilippe Mathieu-Daudé 
290*1db2086eSPhilippe Mathieu-Daudé     rxc->ram_size = 64 * KiB;
291*1db2086eSPhilippe Mathieu-Daudé     rxc->rom_flash_size = 384 * KiB;
292*1db2086eSPhilippe Mathieu-Daudé     rxc->data_flash_size = 32 * KiB;
293*1db2086eSPhilippe Mathieu-Daudé };
294*1db2086eSPhilippe Mathieu-Daudé 
295*1db2086eSPhilippe Mathieu-Daudé static void r5f562n8_class_init(ObjectClass *oc, void *data)
296*1db2086eSPhilippe Mathieu-Daudé {
297*1db2086eSPhilippe Mathieu-Daudé     RX62NClass *rxc = RX62N_MCU_CLASS(oc);
298*1db2086eSPhilippe Mathieu-Daudé 
299*1db2086eSPhilippe Mathieu-Daudé     rxc->ram_size = 96 * KiB;
300*1db2086eSPhilippe Mathieu-Daudé     rxc->rom_flash_size = 512 * KiB;
301*1db2086eSPhilippe Mathieu-Daudé     rxc->data_flash_size = 32 * KiB;
302*1db2086eSPhilippe Mathieu-Daudé };
303*1db2086eSPhilippe Mathieu-Daudé 
304*1db2086eSPhilippe Mathieu-Daudé static const TypeInfo rx62n_types[] = {
305*1db2086eSPhilippe Mathieu-Daudé     {
306*1db2086eSPhilippe Mathieu-Daudé         .name           = TYPE_R5F562N7_MCU,
307*1db2086eSPhilippe Mathieu-Daudé         .parent         = TYPE_RX62N_MCU,
308*1db2086eSPhilippe Mathieu-Daudé         .class_init     = r5f562n7_class_init,
309*1db2086eSPhilippe Mathieu-Daudé     }, {
310*1db2086eSPhilippe Mathieu-Daudé         .name           = TYPE_R5F562N8_MCU,
311*1db2086eSPhilippe Mathieu-Daudé         .parent         = TYPE_RX62N_MCU,
312*1db2086eSPhilippe Mathieu-Daudé         .class_init     = r5f562n8_class_init,
313*1db2086eSPhilippe Mathieu-Daudé     }, {
3140c80f50fSYoshinori Sato         .name           = TYPE_RX62N_MCU,
3150c80f50fSYoshinori Sato         .parent         = TYPE_DEVICE,
3160c80f50fSYoshinori Sato         .instance_size  = sizeof(RX62NState),
317*1db2086eSPhilippe Mathieu-Daudé         .class_size     = sizeof(RX62NClass),
3180c80f50fSYoshinori Sato         .class_init     = rx62n_class_init,
319*1db2086eSPhilippe Mathieu-Daudé         .abstract       = true,
320*1db2086eSPhilippe Mathieu-Daudé      }
3210c80f50fSYoshinori Sato };
3220c80f50fSYoshinori Sato 
323*1db2086eSPhilippe Mathieu-Daudé DEFINE_TYPES(rx62n_types)
324