msf2-soc.c (0db949f1810f4d497762d57d8db6f219c0607529) msf2-soc.c (db873cc5d1a4aaa67eea87768d504b2f89d88738)
1/*
2 * SmartFusion2 SoC emulation.
3 *
4 * Copyright (c) 2017-2020 Subbaraya Sundeep <sundeep.lkml@gmail.com>
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights

--- 57 unchanged lines hidden (view full) ---

66 }
67}
68
69static void m2sxxx_soc_initfn(Object *obj)
70{
71 MSF2State *s = MSF2_SOC(obj);
72 int i;
73
1/*
2 * SmartFusion2 SoC emulation.
3 *
4 * Copyright (c) 2017-2020 Subbaraya Sundeep <sundeep.lkml@gmail.com>
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights

--- 57 unchanged lines hidden (view full) ---

66 }
67}
68
69static void m2sxxx_soc_initfn(Object *obj)
70{
71 MSF2State *s = MSF2_SOC(obj);
72 int i;
73
74 sysbus_init_child_obj(obj, "armv7m", &s->armv7m, sizeof(s->armv7m),
75 TYPE_ARMV7M);
74 object_initialize_child(obj, "armv7m", &s->armv7m, TYPE_ARMV7M);
76
75
77 sysbus_init_child_obj(obj, "sysreg", &s->sysreg, sizeof(s->sysreg),
78 TYPE_MSF2_SYSREG);
76 object_initialize_child(obj, "sysreg", &s->sysreg, TYPE_MSF2_SYSREG);
79
77
80 sysbus_init_child_obj(obj, "timer", &s->timer, sizeof(s->timer),
81 TYPE_MSS_TIMER);
78 object_initialize_child(obj, "timer", &s->timer, TYPE_MSS_TIMER);
82
83 for (i = 0; i < MSF2_NUM_SPIS; i++) {
79
80 for (i = 0; i < MSF2_NUM_SPIS; i++) {
84 sysbus_init_child_obj(obj, "spi[*]", &s->spi[i], sizeof(s->spi[i]),
85 TYPE_MSS_SPI);
81 object_initialize_child(obj, "spi[*]", &s->spi[i], TYPE_MSS_SPI);
86 }
87
82 }
83
88 sysbus_init_child_obj(obj, "emac", &s->emac, sizeof(s->emac),
89 TYPE_MSS_EMAC);
84 object_initialize_child(obj, "emac", &s->emac, TYPE_MSS_EMAC);
90 if (nd_table[0].used) {
91 qemu_check_nic_model(&nd_table[0], TYPE_MSS_EMAC);
92 qdev_set_nic_properties(DEVICE(&s->emac), &nd_table[0]);
93 }
94}
95
96static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
97{

--- 27 unchanged lines hidden (view full) ---

125 memory_region_add_subregion(system_memory, SRAM_BASE_ADDRESS, sram);
126
127 armv7m = DEVICE(&s->armv7m);
128 qdev_prop_set_uint32(armv7m, "num-irq", 81);
129 qdev_prop_set_string(armv7m, "cpu-type", s->cpu_type);
130 qdev_prop_set_bit(armv7m, "enable-bitband", true);
131 object_property_set_link(OBJECT(&s->armv7m), OBJECT(get_system_memory()),
132 "memory", &error_abort);
85 if (nd_table[0].used) {
86 qemu_check_nic_model(&nd_table[0], TYPE_MSS_EMAC);
87 qdev_set_nic_properties(DEVICE(&s->emac), &nd_table[0]);
88 }
89}
90
91static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
92{

--- 27 unchanged lines hidden (view full) ---

120 memory_region_add_subregion(system_memory, SRAM_BASE_ADDRESS, sram);
121
122 armv7m = DEVICE(&s->armv7m);
123 qdev_prop_set_uint32(armv7m, "num-irq", 81);
124 qdev_prop_set_string(armv7m, "cpu-type", s->cpu_type);
125 qdev_prop_set_bit(armv7m, "enable-bitband", true);
126 object_property_set_link(OBJECT(&s->armv7m), OBJECT(get_system_memory()),
127 "memory", &error_abort);
133 object_property_set_bool(OBJECT(&s->armv7m), true, "realized", &err);
128 sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), &err);
134 if (err != NULL) {
135 error_propagate(errp, err);
136 return;
137 }
138
139 if (!s->m3clk) {
140 error_setg(errp, "Invalid m3clk value");
141 error_append_hint(errp, "m3clk can not be zero\n");

--- 11 unchanged lines hidden (view full) ---

153 qdev_get_gpio_in(armv7m, uart_irq[i]),
154 115200, serial_hd(i), DEVICE_NATIVE_ENDIAN);
155 }
156 }
157
158 dev = DEVICE(&s->timer);
159 /* APB0 clock is the timer input clock */
160 qdev_prop_set_uint32(dev, "clock-frequency", s->m3clk / s->apb0div);
129 if (err != NULL) {
130 error_propagate(errp, err);
131 return;
132 }
133
134 if (!s->m3clk) {
135 error_setg(errp, "Invalid m3clk value");
136 error_append_hint(errp, "m3clk can not be zero\n");

--- 11 unchanged lines hidden (view full) ---

148 qdev_get_gpio_in(armv7m, uart_irq[i]),
149 115200, serial_hd(i), DEVICE_NATIVE_ENDIAN);
150 }
151 }
152
153 dev = DEVICE(&s->timer);
154 /* APB0 clock is the timer input clock */
155 qdev_prop_set_uint32(dev, "clock-frequency", s->m3clk / s->apb0div);
161 object_property_set_bool(OBJECT(&s->timer), true, "realized", &err);
156 sysbus_realize(SYS_BUS_DEVICE(&s->timer), &err);
162 if (err != NULL) {
163 error_propagate(errp, err);
164 return;
165 }
166 busdev = SYS_BUS_DEVICE(dev);
167 sysbus_mmio_map(busdev, 0, MSF2_TIMER_BASE);
168 sysbus_connect_irq(busdev, 0,
169 qdev_get_gpio_in(armv7m, timer_irq[0]));
170 sysbus_connect_irq(busdev, 1,
171 qdev_get_gpio_in(armv7m, timer_irq[1]));
172
173 dev = DEVICE(&s->sysreg);
174 qdev_prop_set_uint32(dev, "apb0divisor", s->apb0div);
175 qdev_prop_set_uint32(dev, "apb1divisor", s->apb1div);
157 if (err != NULL) {
158 error_propagate(errp, err);
159 return;
160 }
161 busdev = SYS_BUS_DEVICE(dev);
162 sysbus_mmio_map(busdev, 0, MSF2_TIMER_BASE);
163 sysbus_connect_irq(busdev, 0,
164 qdev_get_gpio_in(armv7m, timer_irq[0]));
165 sysbus_connect_irq(busdev, 1,
166 qdev_get_gpio_in(armv7m, timer_irq[1]));
167
168 dev = DEVICE(&s->sysreg);
169 qdev_prop_set_uint32(dev, "apb0divisor", s->apb0div);
170 qdev_prop_set_uint32(dev, "apb1divisor", s->apb1div);
176 object_property_set_bool(OBJECT(&s->sysreg), true, "realized", &err);
171 sysbus_realize(SYS_BUS_DEVICE(&s->sysreg), &err);
177 if (err != NULL) {
178 error_propagate(errp, err);
179 return;
180 }
181 busdev = SYS_BUS_DEVICE(dev);
182 sysbus_mmio_map(busdev, 0, MSF2_SYSREG_BASE);
183
184 for (i = 0; i < MSF2_NUM_SPIS; i++) {
185 gchar *bus_name;
186
172 if (err != NULL) {
173 error_propagate(errp, err);
174 return;
175 }
176 busdev = SYS_BUS_DEVICE(dev);
177 sysbus_mmio_map(busdev, 0, MSF2_SYSREG_BASE);
178
179 for (i = 0; i < MSF2_NUM_SPIS; i++) {
180 gchar *bus_name;
181
187 object_property_set_bool(OBJECT(&s->spi[i]), true, "realized", &err);
182 sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
188 if (err != NULL) {
189 error_propagate(errp, err);
190 return;
191 }
192
193 sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 0, spi_addr[i]);
194 sysbus_connect_irq(SYS_BUS_DEVICE(&s->spi[i]), 0,
195 qdev_get_gpio_in(armv7m, spi_irq[i]));
196
197 /* Alias controller SPI bus to the SoC itself */
198 bus_name = g_strdup_printf("spi%d", i);
199 object_property_add_alias(OBJECT(s), bus_name,
200 OBJECT(&s->spi[i]), "spi");
201 g_free(bus_name);
202 }
203
204 dev = DEVICE(&s->emac);
205 object_property_set_link(OBJECT(&s->emac), OBJECT(get_system_memory()),
206 "ahb-bus", &error_abort);
183 if (err != NULL) {
184 error_propagate(errp, err);
185 return;
186 }
187
188 sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 0, spi_addr[i]);
189 sysbus_connect_irq(SYS_BUS_DEVICE(&s->spi[i]), 0,
190 qdev_get_gpio_in(armv7m, spi_irq[i]));
191
192 /* Alias controller SPI bus to the SoC itself */
193 bus_name = g_strdup_printf("spi%d", i);
194 object_property_add_alias(OBJECT(s), bus_name,
195 OBJECT(&s->spi[i]), "spi");
196 g_free(bus_name);
197 }
198
199 dev = DEVICE(&s->emac);
200 object_property_set_link(OBJECT(&s->emac), OBJECT(get_system_memory()),
201 "ahb-bus", &error_abort);
207 object_property_set_bool(OBJECT(&s->emac), true, "realized", &err);
202 sysbus_realize(SYS_BUS_DEVICE(&s->emac), &err);
208 if (err != NULL) {
209 error_propagate(errp, err);
210 return;
211 }
212 busdev = SYS_BUS_DEVICE(dev);
213 sysbus_mmio_map(busdev, 0, MSF2_EMAC_BASE);
214 sysbus_connect_irq(busdev, 0,
215 qdev_get_gpio_in(armv7m, MSF2_EMAC_IRQ));

--- 54 unchanged lines hidden ---
203 if (err != NULL) {
204 error_propagate(errp, err);
205 return;
206 }
207 busdev = SYS_BUS_DEVICE(dev);
208 sysbus_mmio_map(busdev, 0, MSF2_EMAC_BASE);
209 sysbus_connect_irq(busdev, 0,
210 qdev_get_gpio_in(armv7m, MSF2_EMAC_IRQ));

--- 54 unchanged lines hidden ---