virt.c 76 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000
  1. /*
  2. * QEMU RISC-V VirtIO Board
  3. *
  4. * Copyright (c) 2017 SiFive, Inc.
  5. *
  6. * RISC-V machine with 16550a UART and VirtIO MMIO
  7. *
  8. * This program is free software; you can redistribute it and/or modify it
  9. * under the terms and conditions of the GNU General Public License,
  10. * version 2 or later, as published by the Free Software Foundation.
  11. *
  12. * This program is distributed in the hope it will be useful, but WITHOUT
  13. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  14. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  15. * more details.
  16. *
  17. * You should have received a copy of the GNU General Public License along with
  18. * this program. If not, see <http://www.gnu.org/licenses/>.
  19. */
  20. #include "qemu/osdep.h"
  21. #include "qemu/units.h"
  22. #include "qemu/error-report.h"
  23. #include "qemu/guest-random.h"
  24. #include "qapi/error.h"
  25. #include "hw/boards.h"
  26. #include "hw/loader.h"
  27. #include "hw/sysbus.h"
  28. #include "hw/qdev-properties.h"
  29. #include "hw/char/serial-mm.h"
  30. #include "target/riscv/cpu.h"
  31. #include "hw/core/sysbus-fdt.h"
  32. #include "target/riscv/pmu.h"
  33. #include "hw/riscv/riscv_hart.h"
  34. #include "hw/riscv/iommu.h"
  35. #include "hw/riscv/riscv-iommu-bits.h"
  36. #include "hw/riscv/virt.h"
  37. #include "hw/riscv/boot.h"
  38. #include "hw/riscv/numa.h"
  39. #include "kvm/kvm_riscv.h"
  40. #include "hw/firmware/smbios.h"
  41. #include "hw/intc/riscv_aclint.h"
  42. #include "hw/intc/riscv_aplic.h"
  43. #include "hw/intc/sifive_plic.h"
  44. #include "hw/misc/sifive_test.h"
  45. #include "hw/platform-bus.h"
  46. #include "chardev/char.h"
  47. #include "system/device_tree.h"
  48. #include "system/system.h"
  49. #include "system/tcg.h"
  50. #include "system/kvm.h"
  51. #include "system/tpm.h"
  52. #include "system/qtest.h"
  53. #include "hw/pci/pci.h"
  54. #include "hw/pci-host/gpex.h"
  55. #include "hw/display/ramfb.h"
  56. #include "hw/acpi/aml-build.h"
  57. #include "qapi/qapi-visit-common.h"
  58. #include "hw/virtio/virtio-iommu.h"
  59. #include "hw/uefi/var-service-api.h"
  60. /* KVM AIA only supports APLIC MSI. APLIC Wired is always emulated by QEMU. */
  61. static bool virt_use_kvm_aia_aplic_imsic(RISCVVirtAIAType aia_type)
  62. {
  63. bool msimode = aia_type == VIRT_AIA_TYPE_APLIC_IMSIC;
  64. return riscv_is_kvm_aia_aplic_imsic(msimode);
  65. }
  66. static bool virt_use_emulated_aplic(RISCVVirtAIAType aia_type)
  67. {
  68. bool msimode = aia_type == VIRT_AIA_TYPE_APLIC_IMSIC;
  69. return riscv_use_emulated_aplic(msimode);
  70. }
  71. static bool virt_aclint_allowed(void)
  72. {
  73. return tcg_enabled() || qtest_enabled();
  74. }
  75. static const MemMapEntry virt_memmap[] = {
  76. [VIRT_DEBUG] = { 0x0, 0x100 },
  77. [VIRT_MROM] = { 0x1000, 0xf000 },
  78. [VIRT_TEST] = { 0x100000, 0x1000 },
  79. [VIRT_RTC] = { 0x101000, 0x1000 },
  80. [VIRT_CLINT] = { 0x2000000, 0x10000 },
  81. [VIRT_ACLINT_SSWI] = { 0x2F00000, 0x4000 },
  82. [VIRT_PCIE_PIO] = { 0x3000000, 0x10000 },
  83. [VIRT_IOMMU_SYS] = { 0x3010000, 0x1000 },
  84. [VIRT_PLATFORM_BUS] = { 0x4000000, 0x2000000 },
  85. [VIRT_PLIC] = { 0xc000000, VIRT_PLIC_SIZE(VIRT_CPUS_MAX * 2) },
  86. [VIRT_APLIC_M] = { 0xc000000, APLIC_SIZE(VIRT_CPUS_MAX) },
  87. [VIRT_APLIC_S] = { 0xd000000, APLIC_SIZE(VIRT_CPUS_MAX) },
  88. [VIRT_UART0] = { 0x10000000, 0x100 },
  89. [VIRT_VIRTIO] = { 0x10001000, 0x1000 },
  90. [VIRT_FW_CFG] = { 0x10100000, 0x18 },
  91. [VIRT_FLASH] = { 0x20000000, 0x4000000 },
  92. [VIRT_IMSIC_M] = { 0x24000000, VIRT_IMSIC_MAX_SIZE },
  93. [VIRT_IMSIC_S] = { 0x28000000, VIRT_IMSIC_MAX_SIZE },
  94. [VIRT_PCIE_ECAM] = { 0x30000000, 0x10000000 },
  95. [VIRT_PCIE_MMIO] = { 0x40000000, 0x40000000 },
  96. [VIRT_DRAM] = { 0x80000000, 0x0 },
  97. };
  98. /* PCIe high mmio is fixed for RV32 */
  99. #define VIRT32_HIGH_PCIE_MMIO_BASE 0x300000000ULL
  100. #define VIRT32_HIGH_PCIE_MMIO_SIZE (4 * GiB)
  101. /* PCIe high mmio for RV64, size is fixed but base depends on top of RAM */
  102. #define VIRT64_HIGH_PCIE_MMIO_SIZE (16 * GiB)
  103. static MemMapEntry virt_high_pcie_memmap;
  104. #define VIRT_FLASH_SECTOR_SIZE (256 * KiB)
  105. static PFlashCFI01 *virt_flash_create1(RISCVVirtState *s,
  106. const char *name,
  107. const char *alias_prop_name)
  108. {
  109. /*
  110. * Create a single flash device. We use the same parameters as
  111. * the flash devices on the ARM virt board.
  112. */
  113. DeviceState *dev = qdev_new(TYPE_PFLASH_CFI01);
  114. qdev_prop_set_uint64(dev, "sector-length", VIRT_FLASH_SECTOR_SIZE);
  115. qdev_prop_set_uint8(dev, "width", 4);
  116. qdev_prop_set_uint8(dev, "device-width", 2);
  117. qdev_prop_set_bit(dev, "big-endian", false);
  118. qdev_prop_set_uint16(dev, "id0", 0x89);
  119. qdev_prop_set_uint16(dev, "id1", 0x18);
  120. qdev_prop_set_uint16(dev, "id2", 0x00);
  121. qdev_prop_set_uint16(dev, "id3", 0x00);
  122. qdev_prop_set_string(dev, "name", name);
  123. object_property_add_child(OBJECT(s), name, OBJECT(dev));
  124. object_property_add_alias(OBJECT(s), alias_prop_name,
  125. OBJECT(dev), "drive");
  126. return PFLASH_CFI01(dev);
  127. }
  128. static void virt_flash_create(RISCVVirtState *s)
  129. {
  130. s->flash[0] = virt_flash_create1(s, "virt.flash0", "pflash0");
  131. s->flash[1] = virt_flash_create1(s, "virt.flash1", "pflash1");
  132. }
  133. static void virt_flash_map1(PFlashCFI01 *flash,
  134. hwaddr base, hwaddr size,
  135. MemoryRegion *sysmem)
  136. {
  137. DeviceState *dev = DEVICE(flash);
  138. assert(QEMU_IS_ALIGNED(size, VIRT_FLASH_SECTOR_SIZE));
  139. assert(size / VIRT_FLASH_SECTOR_SIZE <= UINT32_MAX);
  140. qdev_prop_set_uint32(dev, "num-blocks", size / VIRT_FLASH_SECTOR_SIZE);
  141. sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
  142. memory_region_add_subregion(sysmem, base,
  143. sysbus_mmio_get_region(SYS_BUS_DEVICE(dev),
  144. 0));
  145. }
  146. static void virt_flash_map(RISCVVirtState *s,
  147. MemoryRegion *sysmem)
  148. {
  149. hwaddr flashsize = virt_memmap[VIRT_FLASH].size / 2;
  150. hwaddr flashbase = virt_memmap[VIRT_FLASH].base;
  151. virt_flash_map1(s->flash[0], flashbase, flashsize,
  152. sysmem);
  153. virt_flash_map1(s->flash[1], flashbase + flashsize, flashsize,
  154. sysmem);
  155. }
  156. static void create_pcie_irq_map(RISCVVirtState *s, void *fdt, char *nodename,
  157. uint32_t irqchip_phandle)
  158. {
  159. int pin, dev;
  160. uint32_t irq_map_stride = 0;
  161. uint32_t full_irq_map[PCI_NUM_PINS * PCI_NUM_PINS *
  162. FDT_MAX_INT_MAP_WIDTH] = {};
  163. uint32_t *irq_map = full_irq_map;
  164. /* This code creates a standard swizzle of interrupts such that
  165. * each device's first interrupt is based on it's PCI_SLOT number.
  166. * (See pci_swizzle_map_irq_fn())
  167. *
  168. * We only need one entry per interrupt in the table (not one per
  169. * possible slot) seeing the interrupt-map-mask will allow the table
  170. * to wrap to any number of devices.
  171. */
  172. for (dev = 0; dev < PCI_NUM_PINS; dev++) {
  173. int devfn = dev * 0x8;
  174. for (pin = 0; pin < PCI_NUM_PINS; pin++) {
  175. int irq_nr = PCIE_IRQ + ((pin + PCI_SLOT(devfn)) % PCI_NUM_PINS);
  176. int i = 0;
  177. /* Fill PCI address cells */
  178. irq_map[i] = cpu_to_be32(devfn << 8);
  179. i += FDT_PCI_ADDR_CELLS;
  180. /* Fill PCI Interrupt cells */
  181. irq_map[i] = cpu_to_be32(pin + 1);
  182. i += FDT_PCI_INT_CELLS;
  183. /* Fill interrupt controller phandle and cells */
  184. irq_map[i++] = cpu_to_be32(irqchip_phandle);
  185. irq_map[i++] = cpu_to_be32(irq_nr);
  186. if (s->aia_type != VIRT_AIA_TYPE_NONE) {
  187. irq_map[i++] = cpu_to_be32(0x4);
  188. }
  189. if (!irq_map_stride) {
  190. irq_map_stride = i;
  191. }
  192. irq_map += irq_map_stride;
  193. }
  194. }
  195. qemu_fdt_setprop(fdt, nodename, "interrupt-map", full_irq_map,
  196. PCI_NUM_PINS * PCI_NUM_PINS *
  197. irq_map_stride * sizeof(uint32_t));
  198. qemu_fdt_setprop_cells(fdt, nodename, "interrupt-map-mask",
  199. 0x1800, 0, 0, 0x7);
  200. }
  201. static void create_fdt_socket_cpus(RISCVVirtState *s, int socket,
  202. char *clust_name, uint32_t *phandle,
  203. uint32_t *intc_phandles)
  204. {
  205. int cpu;
  206. uint32_t cpu_phandle;
  207. MachineState *ms = MACHINE(s);
  208. bool is_32_bit = riscv_is_32bit(&s->soc[0]);
  209. uint8_t satp_mode_max;
  210. for (cpu = s->soc[socket].num_harts - 1; cpu >= 0; cpu--) {
  211. RISCVCPU *cpu_ptr = &s->soc[socket].harts[cpu];
  212. g_autofree char *cpu_name = NULL;
  213. g_autofree char *core_name = NULL;
  214. g_autofree char *intc_name = NULL;
  215. g_autofree char *sv_name = NULL;
  216. cpu_phandle = (*phandle)++;
  217. cpu_name = g_strdup_printf("/cpus/cpu@%d",
  218. s->soc[socket].hartid_base + cpu);
  219. qemu_fdt_add_subnode(ms->fdt, cpu_name);
  220. if (cpu_ptr->cfg.satp_mode.supported != 0) {
  221. satp_mode_max = satp_mode_max_from_map(cpu_ptr->cfg.satp_mode.map);
  222. sv_name = g_strdup_printf("riscv,%s",
  223. satp_mode_str(satp_mode_max, is_32_bit));
  224. qemu_fdt_setprop_string(ms->fdt, cpu_name, "mmu-type", sv_name);
  225. }
  226. riscv_isa_write_fdt(cpu_ptr, ms->fdt, cpu_name);
  227. if (cpu_ptr->cfg.ext_zicbom) {
  228. qemu_fdt_setprop_cell(ms->fdt, cpu_name, "riscv,cbom-block-size",
  229. cpu_ptr->cfg.cbom_blocksize);
  230. }
  231. if (cpu_ptr->cfg.ext_zicboz) {
  232. qemu_fdt_setprop_cell(ms->fdt, cpu_name, "riscv,cboz-block-size",
  233. cpu_ptr->cfg.cboz_blocksize);
  234. }
  235. if (cpu_ptr->cfg.ext_zicbop) {
  236. qemu_fdt_setprop_cell(ms->fdt, cpu_name, "riscv,cbop-block-size",
  237. cpu_ptr->cfg.cbop_blocksize);
  238. }
  239. qemu_fdt_setprop_string(ms->fdt, cpu_name, "compatible", "riscv");
  240. qemu_fdt_setprop_string(ms->fdt, cpu_name, "status", "okay");
  241. qemu_fdt_setprop_cell(ms->fdt, cpu_name, "reg",
  242. s->soc[socket].hartid_base + cpu);
  243. qemu_fdt_setprop_string(ms->fdt, cpu_name, "device_type", "cpu");
  244. riscv_socket_fdt_write_id(ms, cpu_name, socket);
  245. qemu_fdt_setprop_cell(ms->fdt, cpu_name, "phandle", cpu_phandle);
  246. intc_phandles[cpu] = (*phandle)++;
  247. intc_name = g_strdup_printf("%s/interrupt-controller", cpu_name);
  248. qemu_fdt_add_subnode(ms->fdt, intc_name);
  249. qemu_fdt_setprop_cell(ms->fdt, intc_name, "phandle",
  250. intc_phandles[cpu]);
  251. qemu_fdt_setprop_string(ms->fdt, intc_name, "compatible",
  252. "riscv,cpu-intc");
  253. qemu_fdt_setprop(ms->fdt, intc_name, "interrupt-controller", NULL, 0);
  254. qemu_fdt_setprop_cell(ms->fdt, intc_name, "#interrupt-cells", 1);
  255. core_name = g_strdup_printf("%s/core%d", clust_name, cpu);
  256. qemu_fdt_add_subnode(ms->fdt, core_name);
  257. qemu_fdt_setprop_cell(ms->fdt, core_name, "cpu", cpu_phandle);
  258. }
  259. }
  260. static void create_fdt_socket_memory(RISCVVirtState *s,
  261. const MemMapEntry *memmap, int socket)
  262. {
  263. g_autofree char *mem_name = NULL;
  264. uint64_t addr, size;
  265. MachineState *ms = MACHINE(s);
  266. addr = memmap[VIRT_DRAM].base + riscv_socket_mem_offset(ms, socket);
  267. size = riscv_socket_mem_size(ms, socket);
  268. mem_name = g_strdup_printf("/memory@%lx", (long)addr);
  269. qemu_fdt_add_subnode(ms->fdt, mem_name);
  270. qemu_fdt_setprop_cells(ms->fdt, mem_name, "reg",
  271. addr >> 32, addr, size >> 32, size);
  272. qemu_fdt_setprop_string(ms->fdt, mem_name, "device_type", "memory");
  273. riscv_socket_fdt_write_id(ms, mem_name, socket);
  274. }
  275. static void create_fdt_socket_clint(RISCVVirtState *s,
  276. const MemMapEntry *memmap, int socket,
  277. uint32_t *intc_phandles)
  278. {
  279. int cpu;
  280. g_autofree char *clint_name = NULL;
  281. g_autofree uint32_t *clint_cells = NULL;
  282. unsigned long clint_addr;
  283. MachineState *ms = MACHINE(s);
  284. static const char * const clint_compat[2] = {
  285. "sifive,clint0", "riscv,clint0"
  286. };
  287. clint_cells = g_new0(uint32_t, s->soc[socket].num_harts * 4);
  288. for (cpu = 0; cpu < s->soc[socket].num_harts; cpu++) {
  289. clint_cells[cpu * 4 + 0] = cpu_to_be32(intc_phandles[cpu]);
  290. clint_cells[cpu * 4 + 1] = cpu_to_be32(IRQ_M_SOFT);
  291. clint_cells[cpu * 4 + 2] = cpu_to_be32(intc_phandles[cpu]);
  292. clint_cells[cpu * 4 + 3] = cpu_to_be32(IRQ_M_TIMER);
  293. }
  294. clint_addr = memmap[VIRT_CLINT].base + (memmap[VIRT_CLINT].size * socket);
  295. clint_name = g_strdup_printf("/soc/clint@%lx", clint_addr);
  296. qemu_fdt_add_subnode(ms->fdt, clint_name);
  297. qemu_fdt_setprop_string_array(ms->fdt, clint_name, "compatible",
  298. (char **)&clint_compat,
  299. ARRAY_SIZE(clint_compat));
  300. qemu_fdt_setprop_cells(ms->fdt, clint_name, "reg",
  301. 0x0, clint_addr, 0x0, memmap[VIRT_CLINT].size);
  302. qemu_fdt_setprop(ms->fdt, clint_name, "interrupts-extended",
  303. clint_cells, s->soc[socket].num_harts * sizeof(uint32_t) * 4);
  304. riscv_socket_fdt_write_id(ms, clint_name, socket);
  305. }
  306. static void create_fdt_socket_aclint(RISCVVirtState *s,
  307. const MemMapEntry *memmap, int socket,
  308. uint32_t *intc_phandles)
  309. {
  310. int cpu;
  311. char *name;
  312. unsigned long addr, size;
  313. uint32_t aclint_cells_size;
  314. g_autofree uint32_t *aclint_mswi_cells = NULL;
  315. g_autofree uint32_t *aclint_sswi_cells = NULL;
  316. g_autofree uint32_t *aclint_mtimer_cells = NULL;
  317. MachineState *ms = MACHINE(s);
  318. aclint_mswi_cells = g_new0(uint32_t, s->soc[socket].num_harts * 2);
  319. aclint_mtimer_cells = g_new0(uint32_t, s->soc[socket].num_harts * 2);
  320. aclint_sswi_cells = g_new0(uint32_t, s->soc[socket].num_harts * 2);
  321. for (cpu = 0; cpu < s->soc[socket].num_harts; cpu++) {
  322. aclint_mswi_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
  323. aclint_mswi_cells[cpu * 2 + 1] = cpu_to_be32(IRQ_M_SOFT);
  324. aclint_mtimer_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
  325. aclint_mtimer_cells[cpu * 2 + 1] = cpu_to_be32(IRQ_M_TIMER);
  326. aclint_sswi_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
  327. aclint_sswi_cells[cpu * 2 + 1] = cpu_to_be32(IRQ_S_SOFT);
  328. }
  329. aclint_cells_size = s->soc[socket].num_harts * sizeof(uint32_t) * 2;
  330. if (s->aia_type != VIRT_AIA_TYPE_APLIC_IMSIC) {
  331. addr = memmap[VIRT_CLINT].base + (memmap[VIRT_CLINT].size * socket);
  332. name = g_strdup_printf("/soc/mswi@%lx", addr);
  333. qemu_fdt_add_subnode(ms->fdt, name);
  334. qemu_fdt_setprop_string(ms->fdt, name, "compatible",
  335. "riscv,aclint-mswi");
  336. qemu_fdt_setprop_cells(ms->fdt, name, "reg",
  337. 0x0, addr, 0x0, RISCV_ACLINT_SWI_SIZE);
  338. qemu_fdt_setprop(ms->fdt, name, "interrupts-extended",
  339. aclint_mswi_cells, aclint_cells_size);
  340. qemu_fdt_setprop(ms->fdt, name, "interrupt-controller", NULL, 0);
  341. qemu_fdt_setprop_cell(ms->fdt, name, "#interrupt-cells", 0);
  342. riscv_socket_fdt_write_id(ms, name, socket);
  343. g_free(name);
  344. }
  345. if (s->aia_type == VIRT_AIA_TYPE_APLIC_IMSIC) {
  346. addr = memmap[VIRT_CLINT].base +
  347. (RISCV_ACLINT_DEFAULT_MTIMER_SIZE * socket);
  348. size = RISCV_ACLINT_DEFAULT_MTIMER_SIZE;
  349. } else {
  350. addr = memmap[VIRT_CLINT].base + RISCV_ACLINT_SWI_SIZE +
  351. (memmap[VIRT_CLINT].size * socket);
  352. size = memmap[VIRT_CLINT].size - RISCV_ACLINT_SWI_SIZE;
  353. }
  354. name = g_strdup_printf("/soc/mtimer@%lx", addr);
  355. qemu_fdt_add_subnode(ms->fdt, name);
  356. qemu_fdt_setprop_string(ms->fdt, name, "compatible",
  357. "riscv,aclint-mtimer");
  358. qemu_fdt_setprop_cells(ms->fdt, name, "reg",
  359. 0x0, addr + RISCV_ACLINT_DEFAULT_MTIME,
  360. 0x0, size - RISCV_ACLINT_DEFAULT_MTIME,
  361. 0x0, addr + RISCV_ACLINT_DEFAULT_MTIMECMP,
  362. 0x0, RISCV_ACLINT_DEFAULT_MTIME);
  363. qemu_fdt_setprop(ms->fdt, name, "interrupts-extended",
  364. aclint_mtimer_cells, aclint_cells_size);
  365. riscv_socket_fdt_write_id(ms, name, socket);
  366. g_free(name);
  367. if (s->aia_type != VIRT_AIA_TYPE_APLIC_IMSIC) {
  368. addr = memmap[VIRT_ACLINT_SSWI].base +
  369. (memmap[VIRT_ACLINT_SSWI].size * socket);
  370. name = g_strdup_printf("/soc/sswi@%lx", addr);
  371. qemu_fdt_add_subnode(ms->fdt, name);
  372. qemu_fdt_setprop_string(ms->fdt, name, "compatible",
  373. "riscv,aclint-sswi");
  374. qemu_fdt_setprop_cells(ms->fdt, name, "reg",
  375. 0x0, addr, 0x0, memmap[VIRT_ACLINT_SSWI].size);
  376. qemu_fdt_setprop(ms->fdt, name, "interrupts-extended",
  377. aclint_sswi_cells, aclint_cells_size);
  378. qemu_fdt_setprop(ms->fdt, name, "interrupt-controller", NULL, 0);
  379. qemu_fdt_setprop_cell(ms->fdt, name, "#interrupt-cells", 0);
  380. riscv_socket_fdt_write_id(ms, name, socket);
  381. g_free(name);
  382. }
  383. }
  384. static void create_fdt_socket_plic(RISCVVirtState *s,
  385. const MemMapEntry *memmap, int socket,
  386. uint32_t *phandle, uint32_t *intc_phandles,
  387. uint32_t *plic_phandles)
  388. {
  389. int cpu;
  390. g_autofree char *plic_name = NULL;
  391. g_autofree uint32_t *plic_cells;
  392. unsigned long plic_addr;
  393. MachineState *ms = MACHINE(s);
  394. static const char * const plic_compat[2] = {
  395. "sifive,plic-1.0.0", "riscv,plic0"
  396. };
  397. plic_phandles[socket] = (*phandle)++;
  398. plic_addr = memmap[VIRT_PLIC].base + (memmap[VIRT_PLIC].size * socket);
  399. plic_name = g_strdup_printf("/soc/plic@%lx", plic_addr);
  400. qemu_fdt_add_subnode(ms->fdt, plic_name);
  401. qemu_fdt_setprop_cell(ms->fdt, plic_name,
  402. "#interrupt-cells", FDT_PLIC_INT_CELLS);
  403. qemu_fdt_setprop_cell(ms->fdt, plic_name,
  404. "#address-cells", FDT_PLIC_ADDR_CELLS);
  405. qemu_fdt_setprop_string_array(ms->fdt, plic_name, "compatible",
  406. (char **)&plic_compat,
  407. ARRAY_SIZE(plic_compat));
  408. qemu_fdt_setprop(ms->fdt, plic_name, "interrupt-controller", NULL, 0);
  409. if (kvm_enabled()) {
  410. plic_cells = g_new0(uint32_t, s->soc[socket].num_harts * 2);
  411. for (cpu = 0; cpu < s->soc[socket].num_harts; cpu++) {
  412. plic_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
  413. plic_cells[cpu * 2 + 1] = cpu_to_be32(IRQ_S_EXT);
  414. }
  415. qemu_fdt_setprop(ms->fdt, plic_name, "interrupts-extended",
  416. plic_cells,
  417. s->soc[socket].num_harts * sizeof(uint32_t) * 2);
  418. } else {
  419. plic_cells = g_new0(uint32_t, s->soc[socket].num_harts * 4);
  420. for (cpu = 0; cpu < s->soc[socket].num_harts; cpu++) {
  421. plic_cells[cpu * 4 + 0] = cpu_to_be32(intc_phandles[cpu]);
  422. plic_cells[cpu * 4 + 1] = cpu_to_be32(IRQ_M_EXT);
  423. plic_cells[cpu * 4 + 2] = cpu_to_be32(intc_phandles[cpu]);
  424. plic_cells[cpu * 4 + 3] = cpu_to_be32(IRQ_S_EXT);
  425. }
  426. qemu_fdt_setprop(ms->fdt, plic_name, "interrupts-extended",
  427. plic_cells,
  428. s->soc[socket].num_harts * sizeof(uint32_t) * 4);
  429. }
  430. qemu_fdt_setprop_cells(ms->fdt, plic_name, "reg",
  431. 0x0, plic_addr, 0x0, memmap[VIRT_PLIC].size);
  432. qemu_fdt_setprop_cell(ms->fdt, plic_name, "riscv,ndev",
  433. VIRT_IRQCHIP_NUM_SOURCES - 1);
  434. riscv_socket_fdt_write_id(ms, plic_name, socket);
  435. qemu_fdt_setprop_cell(ms->fdt, plic_name, "phandle",
  436. plic_phandles[socket]);
  437. if (!socket) {
  438. platform_bus_add_all_fdt_nodes(ms->fdt, plic_name,
  439. memmap[VIRT_PLATFORM_BUS].base,
  440. memmap[VIRT_PLATFORM_BUS].size,
  441. VIRT_PLATFORM_BUS_IRQ);
  442. }
  443. }
  444. uint32_t imsic_num_bits(uint32_t count)
  445. {
  446. uint32_t ret = 0;
  447. while (BIT(ret) < count) {
  448. ret++;
  449. }
  450. return ret;
  451. }
  452. static void create_fdt_one_imsic(RISCVVirtState *s, hwaddr base_addr,
  453. uint32_t *intc_phandles, uint32_t msi_phandle,
  454. bool m_mode, uint32_t imsic_guest_bits)
  455. {
  456. int cpu, socket;
  457. g_autofree char *imsic_name = NULL;
  458. MachineState *ms = MACHINE(s);
  459. int socket_count = riscv_socket_count(ms);
  460. uint32_t imsic_max_hart_per_socket, imsic_addr, imsic_size;
  461. g_autofree uint32_t *imsic_cells = NULL;
  462. g_autofree uint32_t *imsic_regs = NULL;
  463. static const char * const imsic_compat[2] = {
  464. "qemu,imsics", "riscv,imsics"
  465. };
  466. imsic_cells = g_new0(uint32_t, ms->smp.cpus * 2);
  467. imsic_regs = g_new0(uint32_t, socket_count * 4);
  468. for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
  469. imsic_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
  470. imsic_cells[cpu * 2 + 1] = cpu_to_be32(m_mode ? IRQ_M_EXT : IRQ_S_EXT);
  471. }
  472. imsic_max_hart_per_socket = 0;
  473. for (socket = 0; socket < socket_count; socket++) {
  474. imsic_addr = base_addr + socket * VIRT_IMSIC_GROUP_MAX_SIZE;
  475. imsic_size = IMSIC_HART_SIZE(imsic_guest_bits) *
  476. s->soc[socket].num_harts;
  477. imsic_regs[socket * 4 + 0] = 0;
  478. imsic_regs[socket * 4 + 1] = cpu_to_be32(imsic_addr);
  479. imsic_regs[socket * 4 + 2] = 0;
  480. imsic_regs[socket * 4 + 3] = cpu_to_be32(imsic_size);
  481. if (imsic_max_hart_per_socket < s->soc[socket].num_harts) {
  482. imsic_max_hart_per_socket = s->soc[socket].num_harts;
  483. }
  484. }
  485. imsic_name = g_strdup_printf("/soc/interrupt-controller@%lx",
  486. (unsigned long)base_addr);
  487. qemu_fdt_add_subnode(ms->fdt, imsic_name);
  488. qemu_fdt_setprop_string_array(ms->fdt, imsic_name, "compatible",
  489. (char **)&imsic_compat,
  490. ARRAY_SIZE(imsic_compat));
  491. qemu_fdt_setprop_cell(ms->fdt, imsic_name, "#interrupt-cells",
  492. FDT_IMSIC_INT_CELLS);
  493. qemu_fdt_setprop(ms->fdt, imsic_name, "interrupt-controller", NULL, 0);
  494. qemu_fdt_setprop(ms->fdt, imsic_name, "msi-controller", NULL, 0);
  495. qemu_fdt_setprop(ms->fdt, imsic_name, "interrupts-extended",
  496. imsic_cells, ms->smp.cpus * sizeof(uint32_t) * 2);
  497. qemu_fdt_setprop(ms->fdt, imsic_name, "reg", imsic_regs,
  498. socket_count * sizeof(uint32_t) * 4);
  499. qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,num-ids",
  500. VIRT_IRQCHIP_NUM_MSIS);
  501. if (imsic_guest_bits) {
  502. qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,guest-index-bits",
  503. imsic_guest_bits);
  504. }
  505. if (socket_count > 1) {
  506. qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,hart-index-bits",
  507. imsic_num_bits(imsic_max_hart_per_socket));
  508. qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,group-index-bits",
  509. imsic_num_bits(socket_count));
  510. qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,group-index-shift",
  511. IMSIC_MMIO_GROUP_MIN_SHIFT);
  512. }
  513. qemu_fdt_setprop_cell(ms->fdt, imsic_name, "phandle", msi_phandle);
  514. }
  515. static void create_fdt_imsic(RISCVVirtState *s, const MemMapEntry *memmap,
  516. uint32_t *phandle, uint32_t *intc_phandles,
  517. uint32_t *msi_m_phandle, uint32_t *msi_s_phandle)
  518. {
  519. *msi_m_phandle = (*phandle)++;
  520. *msi_s_phandle = (*phandle)++;
  521. if (!kvm_enabled()) {
  522. /* M-level IMSIC node */
  523. create_fdt_one_imsic(s, memmap[VIRT_IMSIC_M].base, intc_phandles,
  524. *msi_m_phandle, true, 0);
  525. }
  526. /* S-level IMSIC node */
  527. create_fdt_one_imsic(s, memmap[VIRT_IMSIC_S].base, intc_phandles,
  528. *msi_s_phandle, false,
  529. imsic_num_bits(s->aia_guests + 1));
  530. }
  531. /* Caller must free string after use */
  532. static char *fdt_get_aplic_nodename(unsigned long aplic_addr)
  533. {
  534. return g_strdup_printf("/soc/interrupt-controller@%lx", aplic_addr);
  535. }
  536. static void create_fdt_one_aplic(RISCVVirtState *s, int socket,
  537. unsigned long aplic_addr, uint32_t aplic_size,
  538. uint32_t msi_phandle,
  539. uint32_t *intc_phandles,
  540. uint32_t aplic_phandle,
  541. uint32_t aplic_child_phandle,
  542. bool m_mode, int num_harts)
  543. {
  544. int cpu;
  545. g_autofree char *aplic_name = fdt_get_aplic_nodename(aplic_addr);
  546. g_autofree uint32_t *aplic_cells = g_new0(uint32_t, num_harts * 2);
  547. MachineState *ms = MACHINE(s);
  548. static const char * const aplic_compat[2] = {
  549. "qemu,aplic", "riscv,aplic"
  550. };
  551. for (cpu = 0; cpu < num_harts; cpu++) {
  552. aplic_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
  553. aplic_cells[cpu * 2 + 1] = cpu_to_be32(m_mode ? IRQ_M_EXT : IRQ_S_EXT);
  554. }
  555. qemu_fdt_add_subnode(ms->fdt, aplic_name);
  556. qemu_fdt_setprop_string_array(ms->fdt, aplic_name, "compatible",
  557. (char **)&aplic_compat,
  558. ARRAY_SIZE(aplic_compat));
  559. qemu_fdt_setprop_cell(ms->fdt, aplic_name, "#address-cells",
  560. FDT_APLIC_ADDR_CELLS);
  561. qemu_fdt_setprop_cell(ms->fdt, aplic_name,
  562. "#interrupt-cells", FDT_APLIC_INT_CELLS);
  563. qemu_fdt_setprop(ms->fdt, aplic_name, "interrupt-controller", NULL, 0);
  564. if (s->aia_type == VIRT_AIA_TYPE_APLIC) {
  565. qemu_fdt_setprop(ms->fdt, aplic_name, "interrupts-extended",
  566. aplic_cells, num_harts * sizeof(uint32_t) * 2);
  567. } else {
  568. qemu_fdt_setprop_cell(ms->fdt, aplic_name, "msi-parent", msi_phandle);
  569. }
  570. qemu_fdt_setprop_cells(ms->fdt, aplic_name, "reg",
  571. 0x0, aplic_addr, 0x0, aplic_size);
  572. qemu_fdt_setprop_cell(ms->fdt, aplic_name, "riscv,num-sources",
  573. VIRT_IRQCHIP_NUM_SOURCES);
  574. if (aplic_child_phandle) {
  575. qemu_fdt_setprop_cell(ms->fdt, aplic_name, "riscv,children",
  576. aplic_child_phandle);
  577. qemu_fdt_setprop_cells(ms->fdt, aplic_name, "riscv,delegation",
  578. aplic_child_phandle, 0x1,
  579. VIRT_IRQCHIP_NUM_SOURCES);
  580. /*
  581. * DEPRECATED_9.1: Compat property kept temporarily
  582. * to allow old firmwares to work with AIA. Do *not*
  583. * use 'riscv,delegate' in new code: use
  584. * 'riscv,delegation' instead.
  585. */
  586. qemu_fdt_setprop_cells(ms->fdt, aplic_name, "riscv,delegate",
  587. aplic_child_phandle, 0x1,
  588. VIRT_IRQCHIP_NUM_SOURCES);
  589. }
  590. riscv_socket_fdt_write_id(ms, aplic_name, socket);
  591. qemu_fdt_setprop_cell(ms->fdt, aplic_name, "phandle", aplic_phandle);
  592. }
  593. static void create_fdt_socket_aplic(RISCVVirtState *s,
  594. const MemMapEntry *memmap, int socket,
  595. uint32_t msi_m_phandle,
  596. uint32_t msi_s_phandle,
  597. uint32_t *phandle,
  598. uint32_t *intc_phandles,
  599. uint32_t *aplic_phandles,
  600. int num_harts)
  601. {
  602. unsigned long aplic_addr;
  603. MachineState *ms = MACHINE(s);
  604. uint32_t aplic_m_phandle, aplic_s_phandle;
  605. aplic_m_phandle = (*phandle)++;
  606. aplic_s_phandle = (*phandle)++;
  607. if (!kvm_enabled()) {
  608. /* M-level APLIC node */
  609. aplic_addr = memmap[VIRT_APLIC_M].base +
  610. (memmap[VIRT_APLIC_M].size * socket);
  611. create_fdt_one_aplic(s, socket, aplic_addr, memmap[VIRT_APLIC_M].size,
  612. msi_m_phandle, intc_phandles,
  613. aplic_m_phandle, aplic_s_phandle,
  614. true, num_harts);
  615. }
  616. /* S-level APLIC node */
  617. aplic_addr = memmap[VIRT_APLIC_S].base +
  618. (memmap[VIRT_APLIC_S].size * socket);
  619. create_fdt_one_aplic(s, socket, aplic_addr, memmap[VIRT_APLIC_S].size,
  620. msi_s_phandle, intc_phandles,
  621. aplic_s_phandle, 0,
  622. false, num_harts);
  623. if (!socket) {
  624. g_autofree char *aplic_name = fdt_get_aplic_nodename(aplic_addr);
  625. platform_bus_add_all_fdt_nodes(ms->fdt, aplic_name,
  626. memmap[VIRT_PLATFORM_BUS].base,
  627. memmap[VIRT_PLATFORM_BUS].size,
  628. VIRT_PLATFORM_BUS_IRQ);
  629. }
  630. aplic_phandles[socket] = aplic_s_phandle;
  631. }
  632. static void create_fdt_pmu(RISCVVirtState *s)
  633. {
  634. g_autofree char *pmu_name = g_strdup_printf("/pmu");
  635. MachineState *ms = MACHINE(s);
  636. RISCVCPU hart = s->soc[0].harts[0];
  637. qemu_fdt_add_subnode(ms->fdt, pmu_name);
  638. qemu_fdt_setprop_string(ms->fdt, pmu_name, "compatible", "riscv,pmu");
  639. riscv_pmu_generate_fdt_node(ms->fdt, hart.pmu_avail_ctrs, pmu_name);
  640. }
  641. static void create_fdt_sockets(RISCVVirtState *s, const MemMapEntry *memmap,
  642. uint32_t *phandle,
  643. uint32_t *irq_mmio_phandle,
  644. uint32_t *irq_pcie_phandle,
  645. uint32_t *irq_virtio_phandle,
  646. uint32_t *msi_pcie_phandle)
  647. {
  648. int socket, phandle_pos;
  649. MachineState *ms = MACHINE(s);
  650. uint32_t msi_m_phandle = 0, msi_s_phandle = 0;
  651. uint32_t xplic_phandles[MAX_NODES];
  652. g_autofree uint32_t *intc_phandles = NULL;
  653. int socket_count = riscv_socket_count(ms);
  654. qemu_fdt_add_subnode(ms->fdt, "/cpus");
  655. qemu_fdt_setprop_cell(ms->fdt, "/cpus", "timebase-frequency",
  656. kvm_enabled() ?
  657. kvm_riscv_get_timebase_frequency(&s->soc->harts[0]) :
  658. RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ);
  659. qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#size-cells", 0x0);
  660. qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#address-cells", 0x1);
  661. qemu_fdt_add_subnode(ms->fdt, "/cpus/cpu-map");
  662. intc_phandles = g_new0(uint32_t, ms->smp.cpus);
  663. phandle_pos = ms->smp.cpus;
  664. for (socket = (socket_count - 1); socket >= 0; socket--) {
  665. g_autofree char *clust_name = NULL;
  666. phandle_pos -= s->soc[socket].num_harts;
  667. clust_name = g_strdup_printf("/cpus/cpu-map/cluster%d", socket);
  668. qemu_fdt_add_subnode(ms->fdt, clust_name);
  669. create_fdt_socket_cpus(s, socket, clust_name, phandle,
  670. &intc_phandles[phandle_pos]);
  671. create_fdt_socket_memory(s, memmap, socket);
  672. if (virt_aclint_allowed() && s->have_aclint) {
  673. create_fdt_socket_aclint(s, memmap, socket,
  674. &intc_phandles[phandle_pos]);
  675. } else if (tcg_enabled()) {
  676. create_fdt_socket_clint(s, memmap, socket,
  677. &intc_phandles[phandle_pos]);
  678. }
  679. }
  680. if (s->aia_type == VIRT_AIA_TYPE_APLIC_IMSIC) {
  681. create_fdt_imsic(s, memmap, phandle, intc_phandles,
  682. &msi_m_phandle, &msi_s_phandle);
  683. *msi_pcie_phandle = msi_s_phandle;
  684. }
  685. /*
  686. * With KVM AIA aplic-imsic, using an irqchip without split
  687. * mode, we'll use only one APLIC instance.
  688. */
  689. if (!virt_use_emulated_aplic(s->aia_type)) {
  690. create_fdt_socket_aplic(s, memmap, 0,
  691. msi_m_phandle, msi_s_phandle, phandle,
  692. &intc_phandles[0], xplic_phandles,
  693. ms->smp.cpus);
  694. *irq_mmio_phandle = xplic_phandles[0];
  695. *irq_virtio_phandle = xplic_phandles[0];
  696. *irq_pcie_phandle = xplic_phandles[0];
  697. } else {
  698. phandle_pos = ms->smp.cpus;
  699. for (socket = (socket_count - 1); socket >= 0; socket--) {
  700. phandle_pos -= s->soc[socket].num_harts;
  701. if (s->aia_type == VIRT_AIA_TYPE_NONE) {
  702. create_fdt_socket_plic(s, memmap, socket, phandle,
  703. &intc_phandles[phandle_pos],
  704. xplic_phandles);
  705. } else {
  706. create_fdt_socket_aplic(s, memmap, socket,
  707. msi_m_phandle, msi_s_phandle, phandle,
  708. &intc_phandles[phandle_pos],
  709. xplic_phandles,
  710. s->soc[socket].num_harts);
  711. }
  712. }
  713. for (socket = 0; socket < socket_count; socket++) {
  714. if (socket == 0) {
  715. *irq_mmio_phandle = xplic_phandles[socket];
  716. *irq_virtio_phandle = xplic_phandles[socket];
  717. *irq_pcie_phandle = xplic_phandles[socket];
  718. }
  719. if (socket == 1) {
  720. *irq_virtio_phandle = xplic_phandles[socket];
  721. *irq_pcie_phandle = xplic_phandles[socket];
  722. }
  723. if (socket == 2) {
  724. *irq_pcie_phandle = xplic_phandles[socket];
  725. }
  726. }
  727. }
  728. riscv_socket_fdt_write_distance_matrix(ms);
  729. }
  730. static void create_fdt_virtio(RISCVVirtState *s, const MemMapEntry *memmap,
  731. uint32_t irq_virtio_phandle)
  732. {
  733. int i;
  734. MachineState *ms = MACHINE(s);
  735. for (i = 0; i < VIRTIO_COUNT; i++) {
  736. g_autofree char *name = g_strdup_printf("/soc/virtio_mmio@%lx",
  737. (long)(memmap[VIRT_VIRTIO].base + i * memmap[VIRT_VIRTIO].size));
  738. qemu_fdt_add_subnode(ms->fdt, name);
  739. qemu_fdt_setprop_string(ms->fdt, name, "compatible", "virtio,mmio");
  740. qemu_fdt_setprop_cells(ms->fdt, name, "reg",
  741. 0x0, memmap[VIRT_VIRTIO].base + i * memmap[VIRT_VIRTIO].size,
  742. 0x0, memmap[VIRT_VIRTIO].size);
  743. qemu_fdt_setprop_cell(ms->fdt, name, "interrupt-parent",
  744. irq_virtio_phandle);
  745. if (s->aia_type == VIRT_AIA_TYPE_NONE) {
  746. qemu_fdt_setprop_cell(ms->fdt, name, "interrupts",
  747. VIRTIO_IRQ + i);
  748. } else {
  749. qemu_fdt_setprop_cells(ms->fdt, name, "interrupts",
  750. VIRTIO_IRQ + i, 0x4);
  751. }
  752. }
  753. }
  754. static void create_fdt_pcie(RISCVVirtState *s, const MemMapEntry *memmap,
  755. uint32_t irq_pcie_phandle,
  756. uint32_t msi_pcie_phandle,
  757. uint32_t iommu_sys_phandle)
  758. {
  759. g_autofree char *name = NULL;
  760. MachineState *ms = MACHINE(s);
  761. name = g_strdup_printf("/soc/pci@%lx",
  762. (long) memmap[VIRT_PCIE_ECAM].base);
  763. qemu_fdt_setprop_cell(ms->fdt, name, "#address-cells",
  764. FDT_PCI_ADDR_CELLS);
  765. qemu_fdt_setprop_cell(ms->fdt, name, "#interrupt-cells",
  766. FDT_PCI_INT_CELLS);
  767. qemu_fdt_setprop_cell(ms->fdt, name, "#size-cells", 0x2);
  768. qemu_fdt_setprop_string(ms->fdt, name, "compatible",
  769. "pci-host-ecam-generic");
  770. qemu_fdt_setprop_string(ms->fdt, name, "device_type", "pci");
  771. qemu_fdt_setprop_cell(ms->fdt, name, "linux,pci-domain", 0);
  772. qemu_fdt_setprop_cells(ms->fdt, name, "bus-range", 0,
  773. memmap[VIRT_PCIE_ECAM].size / PCIE_MMCFG_SIZE_MIN - 1);
  774. qemu_fdt_setprop(ms->fdt, name, "dma-coherent", NULL, 0);
  775. if (s->aia_type == VIRT_AIA_TYPE_APLIC_IMSIC) {
  776. qemu_fdt_setprop_cell(ms->fdt, name, "msi-parent", msi_pcie_phandle);
  777. }
  778. qemu_fdt_setprop_cells(ms->fdt, name, "reg", 0,
  779. memmap[VIRT_PCIE_ECAM].base, 0, memmap[VIRT_PCIE_ECAM].size);
  780. qemu_fdt_setprop_sized_cells(ms->fdt, name, "ranges",
  781. 1, FDT_PCI_RANGE_IOPORT, 2, 0,
  782. 2, memmap[VIRT_PCIE_PIO].base, 2, memmap[VIRT_PCIE_PIO].size,
  783. 1, FDT_PCI_RANGE_MMIO,
  784. 2, memmap[VIRT_PCIE_MMIO].base,
  785. 2, memmap[VIRT_PCIE_MMIO].base, 2, memmap[VIRT_PCIE_MMIO].size,
  786. 1, FDT_PCI_RANGE_MMIO_64BIT,
  787. 2, virt_high_pcie_memmap.base,
  788. 2, virt_high_pcie_memmap.base, 2, virt_high_pcie_memmap.size);
  789. if (virt_is_iommu_sys_enabled(s)) {
  790. qemu_fdt_setprop_cells(ms->fdt, name, "iommu-map",
  791. 0, iommu_sys_phandle, 0, 0, 0,
  792. iommu_sys_phandle, 0, 0xffff);
  793. }
  794. create_pcie_irq_map(s, ms->fdt, name, irq_pcie_phandle);
  795. }
  796. static void create_fdt_reset(RISCVVirtState *s, const MemMapEntry *memmap,
  797. uint32_t *phandle)
  798. {
  799. char *name;
  800. uint32_t test_phandle;
  801. MachineState *ms = MACHINE(s);
  802. test_phandle = (*phandle)++;
  803. name = g_strdup_printf("/soc/test@%lx",
  804. (long)memmap[VIRT_TEST].base);
  805. qemu_fdt_add_subnode(ms->fdt, name);
  806. {
  807. static const char * const compat[3] = {
  808. "sifive,test1", "sifive,test0", "syscon"
  809. };
  810. qemu_fdt_setprop_string_array(ms->fdt, name, "compatible",
  811. (char **)&compat, ARRAY_SIZE(compat));
  812. }
  813. qemu_fdt_setprop_cells(ms->fdt, name, "reg",
  814. 0x0, memmap[VIRT_TEST].base, 0x0, memmap[VIRT_TEST].size);
  815. qemu_fdt_setprop_cell(ms->fdt, name, "phandle", test_phandle);
  816. test_phandle = qemu_fdt_get_phandle(ms->fdt, name);
  817. g_free(name);
  818. name = g_strdup_printf("/reboot");
  819. qemu_fdt_add_subnode(ms->fdt, name);
  820. qemu_fdt_setprop_string(ms->fdt, name, "compatible", "syscon-reboot");
  821. qemu_fdt_setprop_cell(ms->fdt, name, "regmap", test_phandle);
  822. qemu_fdt_setprop_cell(ms->fdt, name, "offset", 0x0);
  823. qemu_fdt_setprop_cell(ms->fdt, name, "value", FINISHER_RESET);
  824. g_free(name);
  825. name = g_strdup_printf("/poweroff");
  826. qemu_fdt_add_subnode(ms->fdt, name);
  827. qemu_fdt_setprop_string(ms->fdt, name, "compatible", "syscon-poweroff");
  828. qemu_fdt_setprop_cell(ms->fdt, name, "regmap", test_phandle);
  829. qemu_fdt_setprop_cell(ms->fdt, name, "offset", 0x0);
  830. qemu_fdt_setprop_cell(ms->fdt, name, "value", FINISHER_PASS);
  831. g_free(name);
  832. }
  833. static void create_fdt_uart(RISCVVirtState *s, const MemMapEntry *memmap,
  834. uint32_t irq_mmio_phandle)
  835. {
  836. g_autofree char *name = NULL;
  837. MachineState *ms = MACHINE(s);
  838. name = g_strdup_printf("/soc/serial@%lx", (long)memmap[VIRT_UART0].base);
  839. qemu_fdt_add_subnode(ms->fdt, name);
  840. qemu_fdt_setprop_string(ms->fdt, name, "compatible", "ns16550a");
  841. qemu_fdt_setprop_cells(ms->fdt, name, "reg",
  842. 0x0, memmap[VIRT_UART0].base,
  843. 0x0, memmap[VIRT_UART0].size);
  844. qemu_fdt_setprop_cell(ms->fdt, name, "clock-frequency", 3686400);
  845. qemu_fdt_setprop_cell(ms->fdt, name, "interrupt-parent", irq_mmio_phandle);
  846. if (s->aia_type == VIRT_AIA_TYPE_NONE) {
  847. qemu_fdt_setprop_cell(ms->fdt, name, "interrupts", UART0_IRQ);
  848. } else {
  849. qemu_fdt_setprop_cells(ms->fdt, name, "interrupts", UART0_IRQ, 0x4);
  850. }
  851. qemu_fdt_setprop_string(ms->fdt, "/chosen", "stdout-path", name);
  852. qemu_fdt_setprop_string(ms->fdt, "/aliases", "serial0", name);
  853. }
  854. static void create_fdt_rtc(RISCVVirtState *s, const MemMapEntry *memmap,
  855. uint32_t irq_mmio_phandle)
  856. {
  857. g_autofree char *name = NULL;
  858. MachineState *ms = MACHINE(s);
  859. name = g_strdup_printf("/soc/rtc@%lx", (long)memmap[VIRT_RTC].base);
  860. qemu_fdt_add_subnode(ms->fdt, name);
  861. qemu_fdt_setprop_string(ms->fdt, name, "compatible",
  862. "google,goldfish-rtc");
  863. qemu_fdt_setprop_cells(ms->fdt, name, "reg",
  864. 0x0, memmap[VIRT_RTC].base, 0x0, memmap[VIRT_RTC].size);
  865. qemu_fdt_setprop_cell(ms->fdt, name, "interrupt-parent",
  866. irq_mmio_phandle);
  867. if (s->aia_type == VIRT_AIA_TYPE_NONE) {
  868. qemu_fdt_setprop_cell(ms->fdt, name, "interrupts", RTC_IRQ);
  869. } else {
  870. qemu_fdt_setprop_cells(ms->fdt, name, "interrupts", RTC_IRQ, 0x4);
  871. }
  872. }
  873. static void create_fdt_flash(RISCVVirtState *s, const MemMapEntry *memmap)
  874. {
  875. MachineState *ms = MACHINE(s);
  876. hwaddr flashsize = virt_memmap[VIRT_FLASH].size / 2;
  877. hwaddr flashbase = virt_memmap[VIRT_FLASH].base;
  878. g_autofree char *name = g_strdup_printf("/flash@%" PRIx64, flashbase);
  879. qemu_fdt_add_subnode(ms->fdt, name);
  880. qemu_fdt_setprop_string(ms->fdt, name, "compatible", "cfi-flash");
  881. qemu_fdt_setprop_sized_cells(ms->fdt, name, "reg",
  882. 2, flashbase, 2, flashsize,
  883. 2, flashbase + flashsize, 2, flashsize);
  884. qemu_fdt_setprop_cell(ms->fdt, name, "bank-width", 4);
  885. }
  886. static void create_fdt_fw_cfg(RISCVVirtState *s, const MemMapEntry *memmap)
  887. {
  888. MachineState *ms = MACHINE(s);
  889. hwaddr base = memmap[VIRT_FW_CFG].base;
  890. hwaddr size = memmap[VIRT_FW_CFG].size;
  891. g_autofree char *nodename = g_strdup_printf("/fw-cfg@%" PRIx64, base);
  892. qemu_fdt_add_subnode(ms->fdt, nodename);
  893. qemu_fdt_setprop_string(ms->fdt, nodename,
  894. "compatible", "qemu,fw-cfg-mmio");
  895. qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
  896. 2, base, 2, size);
  897. qemu_fdt_setprop(ms->fdt, nodename, "dma-coherent", NULL, 0);
  898. }
  899. static void create_fdt_virtio_iommu(RISCVVirtState *s, uint16_t bdf)
  900. {
  901. const char compat[] = "virtio,pci-iommu\0pci1af4,1057";
  902. void *fdt = MACHINE(s)->fdt;
  903. uint32_t iommu_phandle;
  904. g_autofree char *iommu_node = NULL;
  905. g_autofree char *pci_node = NULL;
  906. pci_node = g_strdup_printf("/soc/pci@%lx",
  907. (long) virt_memmap[VIRT_PCIE_ECAM].base);
  908. iommu_node = g_strdup_printf("%s/virtio_iommu@%x,%x", pci_node,
  909. PCI_SLOT(bdf), PCI_FUNC(bdf));
  910. iommu_phandle = qemu_fdt_alloc_phandle(fdt);
  911. qemu_fdt_add_subnode(fdt, iommu_node);
  912. qemu_fdt_setprop(fdt, iommu_node, "compatible", compat, sizeof(compat));
  913. qemu_fdt_setprop_sized_cells(fdt, iommu_node, "reg",
  914. 1, bdf << 8, 1, 0, 1, 0,
  915. 1, 0, 1, 0);
  916. qemu_fdt_setprop_cell(fdt, iommu_node, "#iommu-cells", 1);
  917. qemu_fdt_setprop_cell(fdt, iommu_node, "phandle", iommu_phandle);
  918. qemu_fdt_setprop_cells(fdt, pci_node, "iommu-map",
  919. 0, iommu_phandle, 0, bdf,
  920. bdf + 1, iommu_phandle, bdf + 1, 0xffff - bdf);
  921. }
  922. static void create_fdt_iommu_sys(RISCVVirtState *s, uint32_t irq_chip,
  923. uint32_t msi_phandle,
  924. uint32_t *iommu_sys_phandle)
  925. {
  926. const char comp[] = "riscv,iommu";
  927. void *fdt = MACHINE(s)->fdt;
  928. uint32_t iommu_phandle;
  929. g_autofree char *iommu_node = NULL;
  930. hwaddr addr = s->memmap[VIRT_IOMMU_SYS].base;
  931. hwaddr size = s->memmap[VIRT_IOMMU_SYS].size;
  932. uint32_t iommu_irq_map[RISCV_IOMMU_INTR_COUNT] = {
  933. IOMMU_SYS_IRQ + RISCV_IOMMU_INTR_CQ,
  934. IOMMU_SYS_IRQ + RISCV_IOMMU_INTR_FQ,
  935. IOMMU_SYS_IRQ + RISCV_IOMMU_INTR_PM,
  936. IOMMU_SYS_IRQ + RISCV_IOMMU_INTR_PQ,
  937. };
  938. iommu_node = g_strdup_printf("/soc/iommu@%x",
  939. (unsigned int) s->memmap[VIRT_IOMMU_SYS].base);
  940. iommu_phandle = qemu_fdt_alloc_phandle(fdt);
  941. qemu_fdt_add_subnode(fdt, iommu_node);
  942. qemu_fdt_setprop(fdt, iommu_node, "compatible", comp, sizeof(comp));
  943. qemu_fdt_setprop_cell(fdt, iommu_node, "#iommu-cells", 1);
  944. qemu_fdt_setprop_cell(fdt, iommu_node, "phandle", iommu_phandle);
  945. qemu_fdt_setprop_cells(fdt, iommu_node, "reg",
  946. addr >> 32, addr, size >> 32, size);
  947. qemu_fdt_setprop_cell(fdt, iommu_node, "interrupt-parent", irq_chip);
  948. qemu_fdt_setprop_cells(fdt, iommu_node, "interrupts",
  949. iommu_irq_map[0], FDT_IRQ_TYPE_EDGE_LOW,
  950. iommu_irq_map[1], FDT_IRQ_TYPE_EDGE_LOW,
  951. iommu_irq_map[2], FDT_IRQ_TYPE_EDGE_LOW,
  952. iommu_irq_map[3], FDT_IRQ_TYPE_EDGE_LOW);
  953. qemu_fdt_setprop_cell(fdt, iommu_node, "msi-parent", msi_phandle);
  954. *iommu_sys_phandle = iommu_phandle;
  955. }
  956. static void create_fdt_iommu(RISCVVirtState *s, uint16_t bdf)
  957. {
  958. const char comp[] = "riscv,pci-iommu";
  959. void *fdt = MACHINE(s)->fdt;
  960. uint32_t iommu_phandle;
  961. g_autofree char *iommu_node = NULL;
  962. g_autofree char *pci_node = NULL;
  963. pci_node = g_strdup_printf("/soc/pci@%lx",
  964. (long) virt_memmap[VIRT_PCIE_ECAM].base);
  965. iommu_node = g_strdup_printf("%s/iommu@%x", pci_node, bdf);
  966. iommu_phandle = qemu_fdt_alloc_phandle(fdt);
  967. qemu_fdt_add_subnode(fdt, iommu_node);
  968. qemu_fdt_setprop(fdt, iommu_node, "compatible", comp, sizeof(comp));
  969. qemu_fdt_setprop_cell(fdt, iommu_node, "#iommu-cells", 1);
  970. qemu_fdt_setprop_cell(fdt, iommu_node, "phandle", iommu_phandle);
  971. qemu_fdt_setprop_cells(fdt, iommu_node, "reg",
  972. bdf << 8, 0, 0, 0, 0);
  973. qemu_fdt_setprop_cells(fdt, pci_node, "iommu-map",
  974. 0, iommu_phandle, 0, bdf,
  975. bdf + 1, iommu_phandle, bdf + 1, 0xffff - bdf);
  976. }
  977. static void finalize_fdt(RISCVVirtState *s)
  978. {
  979. uint32_t phandle = 1, irq_mmio_phandle = 1, msi_pcie_phandle = 1;
  980. uint32_t irq_pcie_phandle = 1, irq_virtio_phandle = 1;
  981. uint32_t iommu_sys_phandle = 1;
  982. create_fdt_sockets(s, virt_memmap, &phandle, &irq_mmio_phandle,
  983. &irq_pcie_phandle, &irq_virtio_phandle,
  984. &msi_pcie_phandle);
  985. create_fdt_virtio(s, virt_memmap, irq_virtio_phandle);
  986. if (virt_is_iommu_sys_enabled(s)) {
  987. create_fdt_iommu_sys(s, irq_mmio_phandle, msi_pcie_phandle,
  988. &iommu_sys_phandle);
  989. }
  990. create_fdt_pcie(s, virt_memmap, irq_pcie_phandle, msi_pcie_phandle,
  991. iommu_sys_phandle);
  992. create_fdt_reset(s, virt_memmap, &phandle);
  993. create_fdt_uart(s, virt_memmap, irq_mmio_phandle);
  994. create_fdt_rtc(s, virt_memmap, irq_mmio_phandle);
  995. }
  996. static void create_fdt(RISCVVirtState *s, const MemMapEntry *memmap)
  997. {
  998. MachineState *ms = MACHINE(s);
  999. uint8_t rng_seed[32];
  1000. g_autofree char *name = NULL;
  1001. ms->fdt = create_device_tree(&s->fdt_size);
  1002. if (!ms->fdt) {
  1003. error_report("create_device_tree() failed");
  1004. exit(1);
  1005. }
  1006. qemu_fdt_setprop_string(ms->fdt, "/", "model", "riscv-virtio,qemu");
  1007. qemu_fdt_setprop_string(ms->fdt, "/", "compatible", "riscv-virtio");
  1008. qemu_fdt_setprop_cell(ms->fdt, "/", "#size-cells", 0x2);
  1009. qemu_fdt_setprop_cell(ms->fdt, "/", "#address-cells", 0x2);
  1010. qemu_fdt_add_subnode(ms->fdt, "/soc");
  1011. qemu_fdt_setprop(ms->fdt, "/soc", "ranges", NULL, 0);
  1012. qemu_fdt_setprop_string(ms->fdt, "/soc", "compatible", "simple-bus");
  1013. qemu_fdt_setprop_cell(ms->fdt, "/soc", "#size-cells", 0x2);
  1014. qemu_fdt_setprop_cell(ms->fdt, "/soc", "#address-cells", 0x2);
  1015. /*
  1016. * The "/soc/pci@..." node is needed for PCIE hotplugs
  1017. * that might happen before finalize_fdt().
  1018. */
  1019. name = g_strdup_printf("/soc/pci@%lx", (long) memmap[VIRT_PCIE_ECAM].base);
  1020. qemu_fdt_add_subnode(ms->fdt, name);
  1021. qemu_fdt_add_subnode(ms->fdt, "/chosen");
  1022. /* Pass seed to RNG */
  1023. qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed));
  1024. qemu_fdt_setprop(ms->fdt, "/chosen", "rng-seed",
  1025. rng_seed, sizeof(rng_seed));
  1026. qemu_fdt_add_subnode(ms->fdt, "/aliases");
  1027. create_fdt_flash(s, memmap);
  1028. create_fdt_fw_cfg(s, memmap);
  1029. create_fdt_pmu(s);
  1030. }
  1031. static inline DeviceState *gpex_pcie_init(MemoryRegion *sys_mem,
  1032. DeviceState *irqchip,
  1033. RISCVVirtState *s)
  1034. {
  1035. DeviceState *dev;
  1036. MemoryRegion *ecam_alias, *ecam_reg;
  1037. MemoryRegion *mmio_alias, *high_mmio_alias, *mmio_reg;
  1038. hwaddr ecam_base = s->memmap[VIRT_PCIE_ECAM].base;
  1039. hwaddr ecam_size = s->memmap[VIRT_PCIE_ECAM].size;
  1040. hwaddr mmio_base = s->memmap[VIRT_PCIE_MMIO].base;
  1041. hwaddr mmio_size = s->memmap[VIRT_PCIE_MMIO].size;
  1042. hwaddr high_mmio_base = virt_high_pcie_memmap.base;
  1043. hwaddr high_mmio_size = virt_high_pcie_memmap.size;
  1044. hwaddr pio_base = s->memmap[VIRT_PCIE_PIO].base;
  1045. hwaddr pio_size = s->memmap[VIRT_PCIE_PIO].size;
  1046. qemu_irq irq;
  1047. int i;
  1048. dev = qdev_new(TYPE_GPEX_HOST);
  1049. /* Set GPEX object properties for the virt machine */
  1050. object_property_set_uint(OBJECT(dev), PCI_HOST_ECAM_BASE,
  1051. ecam_base, NULL);
  1052. object_property_set_int(OBJECT(dev), PCI_HOST_ECAM_SIZE,
  1053. ecam_size, NULL);
  1054. object_property_set_uint(OBJECT(dev), PCI_HOST_BELOW_4G_MMIO_BASE,
  1055. mmio_base, NULL);
  1056. object_property_set_int(OBJECT(dev), PCI_HOST_BELOW_4G_MMIO_SIZE,
  1057. mmio_size, NULL);
  1058. object_property_set_uint(OBJECT(dev), PCI_HOST_ABOVE_4G_MMIO_BASE,
  1059. high_mmio_base, NULL);
  1060. object_property_set_int(OBJECT(dev), PCI_HOST_ABOVE_4G_MMIO_SIZE,
  1061. high_mmio_size, NULL);
  1062. object_property_set_uint(OBJECT(dev), PCI_HOST_PIO_BASE,
  1063. pio_base, NULL);
  1064. object_property_set_int(OBJECT(dev), PCI_HOST_PIO_SIZE,
  1065. pio_size, NULL);
  1066. sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
  1067. ecam_alias = g_new0(MemoryRegion, 1);
  1068. ecam_reg = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
  1069. memory_region_init_alias(ecam_alias, OBJECT(dev), "pcie-ecam",
  1070. ecam_reg, 0, ecam_size);
  1071. memory_region_add_subregion(get_system_memory(), ecam_base, ecam_alias);
  1072. mmio_alias = g_new0(MemoryRegion, 1);
  1073. mmio_reg = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 1);
  1074. memory_region_init_alias(mmio_alias, OBJECT(dev), "pcie-mmio",
  1075. mmio_reg, mmio_base, mmio_size);
  1076. memory_region_add_subregion(get_system_memory(), mmio_base, mmio_alias);
  1077. /* Map high MMIO space */
  1078. high_mmio_alias = g_new0(MemoryRegion, 1);
  1079. memory_region_init_alias(high_mmio_alias, OBJECT(dev), "pcie-mmio-high",
  1080. mmio_reg, high_mmio_base, high_mmio_size);
  1081. memory_region_add_subregion(get_system_memory(), high_mmio_base,
  1082. high_mmio_alias);
  1083. sysbus_mmio_map(SYS_BUS_DEVICE(dev), 2, pio_base);
  1084. for (i = 0; i < PCI_NUM_PINS; i++) {
  1085. irq = qdev_get_gpio_in(irqchip, PCIE_IRQ + i);
  1086. sysbus_connect_irq(SYS_BUS_DEVICE(dev), i, irq);
  1087. gpex_set_irq_num(GPEX_HOST(dev), i, PCIE_IRQ + i);
  1088. }
  1089. GPEX_HOST(dev)->gpex_cfg.bus = PCI_HOST_BRIDGE(dev)->bus;
  1090. return dev;
  1091. }
  1092. static FWCfgState *create_fw_cfg(const MachineState *ms)
  1093. {
  1094. hwaddr base = virt_memmap[VIRT_FW_CFG].base;
  1095. FWCfgState *fw_cfg;
  1096. fw_cfg = fw_cfg_init_mem_wide(base + 8, base, 8, base + 16,
  1097. &address_space_memory);
  1098. fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)ms->smp.cpus);
  1099. return fw_cfg;
  1100. }
  1101. static DeviceState *virt_create_plic(const MemMapEntry *memmap, int socket,
  1102. int base_hartid, int hart_count)
  1103. {
  1104. DeviceState *ret;
  1105. g_autofree char *plic_hart_config = NULL;
  1106. /* Per-socket PLIC hart topology configuration string */
  1107. plic_hart_config = riscv_plic_hart_config_string(hart_count);
  1108. /* Per-socket PLIC */
  1109. ret = sifive_plic_create(
  1110. memmap[VIRT_PLIC].base + socket * memmap[VIRT_PLIC].size,
  1111. plic_hart_config, hart_count, base_hartid,
  1112. VIRT_IRQCHIP_NUM_SOURCES,
  1113. ((1U << VIRT_IRQCHIP_NUM_PRIO_BITS) - 1),
  1114. VIRT_PLIC_PRIORITY_BASE,
  1115. VIRT_PLIC_PENDING_BASE,
  1116. VIRT_PLIC_ENABLE_BASE,
  1117. VIRT_PLIC_ENABLE_STRIDE,
  1118. VIRT_PLIC_CONTEXT_BASE,
  1119. VIRT_PLIC_CONTEXT_STRIDE,
  1120. memmap[VIRT_PLIC].size);
  1121. return ret;
  1122. }
  1123. static DeviceState *virt_create_aia(RISCVVirtAIAType aia_type, int aia_guests,
  1124. const MemMapEntry *memmap, int socket,
  1125. int base_hartid, int hart_count)
  1126. {
  1127. int i;
  1128. hwaddr addr = 0;
  1129. uint32_t guest_bits;
  1130. DeviceState *aplic_s = NULL;
  1131. DeviceState *aplic_m = NULL;
  1132. bool msimode = aia_type == VIRT_AIA_TYPE_APLIC_IMSIC;
  1133. if (msimode) {
  1134. if (!kvm_enabled()) {
  1135. /* Per-socket M-level IMSICs */
  1136. addr = memmap[VIRT_IMSIC_M].base +
  1137. socket * VIRT_IMSIC_GROUP_MAX_SIZE;
  1138. for (i = 0; i < hart_count; i++) {
  1139. riscv_imsic_create(addr + i * IMSIC_HART_SIZE(0),
  1140. base_hartid + i, true, 1,
  1141. VIRT_IRQCHIP_NUM_MSIS);
  1142. }
  1143. }
  1144. /* Per-socket S-level IMSICs */
  1145. guest_bits = imsic_num_bits(aia_guests + 1);
  1146. addr = memmap[VIRT_IMSIC_S].base + socket * VIRT_IMSIC_GROUP_MAX_SIZE;
  1147. for (i = 0; i < hart_count; i++) {
  1148. riscv_imsic_create(addr + i * IMSIC_HART_SIZE(guest_bits),
  1149. base_hartid + i, false, 1 + aia_guests,
  1150. VIRT_IRQCHIP_NUM_MSIS);
  1151. }
  1152. }
  1153. if (!kvm_enabled()) {
  1154. /* Per-socket M-level APLIC */
  1155. aplic_m = riscv_aplic_create(memmap[VIRT_APLIC_M].base +
  1156. socket * memmap[VIRT_APLIC_M].size,
  1157. memmap[VIRT_APLIC_M].size,
  1158. (msimode) ? 0 : base_hartid,
  1159. (msimode) ? 0 : hart_count,
  1160. VIRT_IRQCHIP_NUM_SOURCES,
  1161. VIRT_IRQCHIP_NUM_PRIO_BITS,
  1162. msimode, true, NULL);
  1163. }
  1164. /* Per-socket S-level APLIC */
  1165. aplic_s = riscv_aplic_create(memmap[VIRT_APLIC_S].base +
  1166. socket * memmap[VIRT_APLIC_S].size,
  1167. memmap[VIRT_APLIC_S].size,
  1168. (msimode) ? 0 : base_hartid,
  1169. (msimode) ? 0 : hart_count,
  1170. VIRT_IRQCHIP_NUM_SOURCES,
  1171. VIRT_IRQCHIP_NUM_PRIO_BITS,
  1172. msimode, false, aplic_m);
  1173. if (kvm_enabled() && msimode) {
  1174. riscv_aplic_set_kvm_msicfgaddr(RISCV_APLIC(aplic_s), addr);
  1175. }
  1176. return kvm_enabled() ? aplic_s : aplic_m;
  1177. }
  1178. static void create_platform_bus(RISCVVirtState *s, DeviceState *irqchip)
  1179. {
  1180. DeviceState *dev;
  1181. SysBusDevice *sysbus;
  1182. const MemMapEntry *memmap = virt_memmap;
  1183. int i;
  1184. MemoryRegion *sysmem = get_system_memory();
  1185. dev = qdev_new(TYPE_PLATFORM_BUS_DEVICE);
  1186. dev->id = g_strdup(TYPE_PLATFORM_BUS_DEVICE);
  1187. qdev_prop_set_uint32(dev, "num_irqs", VIRT_PLATFORM_BUS_NUM_IRQS);
  1188. qdev_prop_set_uint32(dev, "mmio_size", memmap[VIRT_PLATFORM_BUS].size);
  1189. sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
  1190. s->platform_bus_dev = dev;
  1191. sysbus = SYS_BUS_DEVICE(dev);
  1192. for (i = 0; i < VIRT_PLATFORM_BUS_NUM_IRQS; i++) {
  1193. int irq = VIRT_PLATFORM_BUS_IRQ + i;
  1194. sysbus_connect_irq(sysbus, i, qdev_get_gpio_in(irqchip, irq));
  1195. }
  1196. memory_region_add_subregion(sysmem,
  1197. memmap[VIRT_PLATFORM_BUS].base,
  1198. sysbus_mmio_get_region(sysbus, 0));
  1199. }
  1200. static void virt_build_smbios(RISCVVirtState *s)
  1201. {
  1202. MachineClass *mc = MACHINE_GET_CLASS(s);
  1203. MachineState *ms = MACHINE(s);
  1204. uint8_t *smbios_tables, *smbios_anchor;
  1205. size_t smbios_tables_len, smbios_anchor_len;
  1206. struct smbios_phys_mem_area mem_array;
  1207. const char *product = "QEMU Virtual Machine";
  1208. if (kvm_enabled()) {
  1209. product = "KVM Virtual Machine";
  1210. }
  1211. smbios_set_defaults("QEMU", product, mc->name);
  1212. if (riscv_is_32bit(&s->soc[0])) {
  1213. smbios_set_default_processor_family(0x200);
  1214. } else {
  1215. smbios_set_default_processor_family(0x201);
  1216. }
  1217. /* build the array of physical mem area from base_memmap */
  1218. mem_array.address = s->memmap[VIRT_DRAM].base;
  1219. mem_array.length = ms->ram_size;
  1220. smbios_get_tables(ms, SMBIOS_ENTRY_POINT_TYPE_64,
  1221. &mem_array, 1,
  1222. &smbios_tables, &smbios_tables_len,
  1223. &smbios_anchor, &smbios_anchor_len,
  1224. &error_fatal);
  1225. if (smbios_anchor) {
  1226. fw_cfg_add_file(s->fw_cfg, "etc/smbios/smbios-tables",
  1227. smbios_tables, smbios_tables_len);
  1228. fw_cfg_add_file(s->fw_cfg, "etc/smbios/smbios-anchor",
  1229. smbios_anchor, smbios_anchor_len);
  1230. }
  1231. }
  1232. static void virt_machine_done(Notifier *notifier, void *data)
  1233. {
  1234. RISCVVirtState *s = container_of(notifier, RISCVVirtState,
  1235. machine_done);
  1236. const MemMapEntry *memmap = virt_memmap;
  1237. MachineState *machine = MACHINE(s);
  1238. hwaddr start_addr = memmap[VIRT_DRAM].base;
  1239. target_ulong firmware_end_addr, kernel_start_addr;
  1240. const char *firmware_name = riscv_default_firmware_name(&s->soc[0]);
  1241. uint64_t fdt_load_addr;
  1242. uint64_t kernel_entry = 0;
  1243. BlockBackend *pflash_blk0;
  1244. RISCVBootInfo boot_info;
  1245. /*
  1246. * An user provided dtb must include everything, including
  1247. * dynamic sysbus devices. Our FDT needs to be finalized.
  1248. */
  1249. if (machine->dtb == NULL) {
  1250. finalize_fdt(s);
  1251. }
  1252. /*
  1253. * Only direct boot kernel is currently supported for KVM VM,
  1254. * so the "-bios" parameter is not supported when KVM is enabled.
  1255. */
  1256. if (kvm_enabled()) {
  1257. if (machine->firmware) {
  1258. if (strcmp(machine->firmware, "none")) {
  1259. error_report("Machine mode firmware is not supported in "
  1260. "combination with KVM.");
  1261. exit(1);
  1262. }
  1263. } else {
  1264. machine->firmware = g_strdup("none");
  1265. }
  1266. }
  1267. firmware_end_addr = riscv_find_and_load_firmware(machine, firmware_name,
  1268. &start_addr, NULL);
  1269. pflash_blk0 = pflash_cfi01_get_blk(s->flash[0]);
  1270. if (pflash_blk0) {
  1271. if (machine->firmware && !strcmp(machine->firmware, "none") &&
  1272. !kvm_enabled()) {
  1273. /*
  1274. * Pflash was supplied but bios is none and not KVM guest,
  1275. * let's overwrite the address we jump to after reset to
  1276. * the base of the flash.
  1277. */
  1278. start_addr = virt_memmap[VIRT_FLASH].base;
  1279. } else {
  1280. /*
  1281. * Pflash was supplied but either KVM guest or bios is not none.
  1282. * In this case, base of the flash would contain S-mode payload.
  1283. */
  1284. riscv_setup_firmware_boot(machine);
  1285. kernel_entry = virt_memmap[VIRT_FLASH].base;
  1286. }
  1287. }
  1288. riscv_boot_info_init(&boot_info, &s->soc[0]);
  1289. if (machine->kernel_filename && !kernel_entry) {
  1290. kernel_start_addr = riscv_calc_kernel_start_addr(&boot_info,
  1291. firmware_end_addr);
  1292. riscv_load_kernel(machine, &boot_info, kernel_start_addr,
  1293. true, NULL);
  1294. kernel_entry = boot_info.image_low_addr;
  1295. }
  1296. fdt_load_addr = riscv_compute_fdt_addr(memmap[VIRT_DRAM].base,
  1297. memmap[VIRT_DRAM].size,
  1298. machine, &boot_info);
  1299. riscv_load_fdt(fdt_load_addr, machine->fdt);
  1300. /* load the reset vector */
  1301. riscv_setup_rom_reset_vec(machine, &s->soc[0], start_addr,
  1302. virt_memmap[VIRT_MROM].base,
  1303. virt_memmap[VIRT_MROM].size, kernel_entry,
  1304. fdt_load_addr);
  1305. /*
  1306. * Only direct boot kernel is currently supported for KVM VM,
  1307. * So here setup kernel start address and fdt address.
  1308. * TODO:Support firmware loading and integrate to TCG start
  1309. */
  1310. if (kvm_enabled()) {
  1311. riscv_setup_direct_kernel(kernel_entry, fdt_load_addr);
  1312. }
  1313. virt_build_smbios(s);
  1314. if (virt_is_acpi_enabled(s)) {
  1315. virt_acpi_setup(s);
  1316. }
  1317. }
  1318. static void virt_machine_init(MachineState *machine)
  1319. {
  1320. const MemMapEntry *memmap = virt_memmap;
  1321. RISCVVirtState *s = RISCV_VIRT_MACHINE(machine);
  1322. MemoryRegion *system_memory = get_system_memory();
  1323. MemoryRegion *mask_rom = g_new(MemoryRegion, 1);
  1324. DeviceState *mmio_irqchip, *virtio_irqchip, *pcie_irqchip;
  1325. int i, base_hartid, hart_count;
  1326. int socket_count = riscv_socket_count(machine);
  1327. /* Check socket count limit */
  1328. if (VIRT_SOCKETS_MAX < socket_count) {
  1329. error_report("number of sockets/nodes should be less than %d",
  1330. VIRT_SOCKETS_MAX);
  1331. exit(1);
  1332. }
  1333. if (!virt_aclint_allowed() && s->have_aclint) {
  1334. error_report("'aclint' is only available with TCG acceleration");
  1335. exit(1);
  1336. }
  1337. /* Initialize sockets */
  1338. mmio_irqchip = virtio_irqchip = pcie_irqchip = NULL;
  1339. for (i = 0; i < socket_count; i++) {
  1340. g_autofree char *soc_name = g_strdup_printf("soc%d", i);
  1341. if (!riscv_socket_check_hartids(machine, i)) {
  1342. error_report("discontinuous hartids in socket%d", i);
  1343. exit(1);
  1344. }
  1345. base_hartid = riscv_socket_first_hartid(machine, i);
  1346. if (base_hartid < 0) {
  1347. error_report("can't find hartid base for socket%d", i);
  1348. exit(1);
  1349. }
  1350. hart_count = riscv_socket_hart_count(machine, i);
  1351. if (hart_count < 0) {
  1352. error_report("can't find hart count for socket%d", i);
  1353. exit(1);
  1354. }
  1355. object_initialize_child(OBJECT(machine), soc_name, &s->soc[i],
  1356. TYPE_RISCV_HART_ARRAY);
  1357. object_property_set_str(OBJECT(&s->soc[i]), "cpu-type",
  1358. machine->cpu_type, &error_abort);
  1359. object_property_set_int(OBJECT(&s->soc[i]), "hartid-base",
  1360. base_hartid, &error_abort);
  1361. object_property_set_int(OBJECT(&s->soc[i]), "num-harts",
  1362. hart_count, &error_abort);
  1363. sysbus_realize(SYS_BUS_DEVICE(&s->soc[i]), &error_fatal);
  1364. if (virt_aclint_allowed() && s->have_aclint) {
  1365. if (s->aia_type == VIRT_AIA_TYPE_APLIC_IMSIC) {
  1366. /* Per-socket ACLINT MTIMER */
  1367. riscv_aclint_mtimer_create(memmap[VIRT_CLINT].base +
  1368. i * RISCV_ACLINT_DEFAULT_MTIMER_SIZE,
  1369. RISCV_ACLINT_DEFAULT_MTIMER_SIZE,
  1370. base_hartid, hart_count,
  1371. RISCV_ACLINT_DEFAULT_MTIMECMP,
  1372. RISCV_ACLINT_DEFAULT_MTIME,
  1373. RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ, true);
  1374. } else {
  1375. /* Per-socket ACLINT MSWI, MTIMER, and SSWI */
  1376. riscv_aclint_swi_create(memmap[VIRT_CLINT].base +
  1377. i * memmap[VIRT_CLINT].size,
  1378. base_hartid, hart_count, false);
  1379. riscv_aclint_mtimer_create(memmap[VIRT_CLINT].base +
  1380. i * memmap[VIRT_CLINT].size +
  1381. RISCV_ACLINT_SWI_SIZE,
  1382. RISCV_ACLINT_DEFAULT_MTIMER_SIZE,
  1383. base_hartid, hart_count,
  1384. RISCV_ACLINT_DEFAULT_MTIMECMP,
  1385. RISCV_ACLINT_DEFAULT_MTIME,
  1386. RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ, true);
  1387. riscv_aclint_swi_create(memmap[VIRT_ACLINT_SSWI].base +
  1388. i * memmap[VIRT_ACLINT_SSWI].size,
  1389. base_hartid, hart_count, true);
  1390. }
  1391. } else if (tcg_enabled()) {
  1392. /* Per-socket SiFive CLINT */
  1393. riscv_aclint_swi_create(
  1394. memmap[VIRT_CLINT].base + i * memmap[VIRT_CLINT].size,
  1395. base_hartid, hart_count, false);
  1396. riscv_aclint_mtimer_create(memmap[VIRT_CLINT].base +
  1397. i * memmap[VIRT_CLINT].size + RISCV_ACLINT_SWI_SIZE,
  1398. RISCV_ACLINT_DEFAULT_MTIMER_SIZE, base_hartid, hart_count,
  1399. RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
  1400. RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ, true);
  1401. }
  1402. /* Per-socket interrupt controller */
  1403. if (s->aia_type == VIRT_AIA_TYPE_NONE) {
  1404. s->irqchip[i] = virt_create_plic(memmap, i,
  1405. base_hartid, hart_count);
  1406. } else {
  1407. s->irqchip[i] = virt_create_aia(s->aia_type, s->aia_guests,
  1408. memmap, i, base_hartid,
  1409. hart_count);
  1410. }
  1411. /* Try to use different IRQCHIP instance based device type */
  1412. if (i == 0) {
  1413. mmio_irqchip = s->irqchip[i];
  1414. virtio_irqchip = s->irqchip[i];
  1415. pcie_irqchip = s->irqchip[i];
  1416. }
  1417. if (i == 1) {
  1418. virtio_irqchip = s->irqchip[i];
  1419. pcie_irqchip = s->irqchip[i];
  1420. }
  1421. if (i == 2) {
  1422. pcie_irqchip = s->irqchip[i];
  1423. }
  1424. }
  1425. if (kvm_enabled() && virt_use_kvm_aia_aplic_imsic(s->aia_type)) {
  1426. kvm_riscv_aia_create(machine, IMSIC_MMIO_GROUP_MIN_SHIFT,
  1427. VIRT_IRQCHIP_NUM_SOURCES, VIRT_IRQCHIP_NUM_MSIS,
  1428. memmap[VIRT_APLIC_S].base,
  1429. memmap[VIRT_IMSIC_S].base,
  1430. s->aia_guests);
  1431. }
  1432. if (riscv_is_32bit(&s->soc[0])) {
  1433. #if HOST_LONG_BITS == 64
  1434. /* limit RAM size in a 32-bit system */
  1435. if (machine->ram_size > 10 * GiB) {
  1436. machine->ram_size = 10 * GiB;
  1437. error_report("Limiting RAM size to 10 GiB");
  1438. }
  1439. #endif
  1440. virt_high_pcie_memmap.base = VIRT32_HIGH_PCIE_MMIO_BASE;
  1441. virt_high_pcie_memmap.size = VIRT32_HIGH_PCIE_MMIO_SIZE;
  1442. } else {
  1443. virt_high_pcie_memmap.size = VIRT64_HIGH_PCIE_MMIO_SIZE;
  1444. virt_high_pcie_memmap.base = memmap[VIRT_DRAM].base + machine->ram_size;
  1445. virt_high_pcie_memmap.base =
  1446. ROUND_UP(virt_high_pcie_memmap.base, virt_high_pcie_memmap.size);
  1447. }
  1448. s->memmap = virt_memmap;
  1449. /* register system main memory (actual RAM) */
  1450. memory_region_add_subregion(system_memory, memmap[VIRT_DRAM].base,
  1451. machine->ram);
  1452. /* boot rom */
  1453. memory_region_init_rom(mask_rom, NULL, "riscv_virt_board.mrom",
  1454. memmap[VIRT_MROM].size, &error_fatal);
  1455. memory_region_add_subregion(system_memory, memmap[VIRT_MROM].base,
  1456. mask_rom);
  1457. /*
  1458. * Init fw_cfg. Must be done before riscv_load_fdt, otherwise the
  1459. * device tree cannot be altered and we get FDT_ERR_NOSPACE.
  1460. */
  1461. s->fw_cfg = create_fw_cfg(machine);
  1462. rom_set_fw(s->fw_cfg);
  1463. /* SiFive Test MMIO device */
  1464. sifive_test_create(memmap[VIRT_TEST].base);
  1465. /* VirtIO MMIO devices */
  1466. for (i = 0; i < VIRTIO_COUNT; i++) {
  1467. sysbus_create_simple("virtio-mmio",
  1468. memmap[VIRT_VIRTIO].base + i * memmap[VIRT_VIRTIO].size,
  1469. qdev_get_gpio_in(virtio_irqchip, VIRTIO_IRQ + i));
  1470. }
  1471. gpex_pcie_init(system_memory, pcie_irqchip, s);
  1472. create_platform_bus(s, mmio_irqchip);
  1473. serial_mm_init(system_memory, memmap[VIRT_UART0].base,
  1474. 0, qdev_get_gpio_in(mmio_irqchip, UART0_IRQ), 399193,
  1475. serial_hd(0), DEVICE_LITTLE_ENDIAN);
  1476. sysbus_create_simple("goldfish_rtc", memmap[VIRT_RTC].base,
  1477. qdev_get_gpio_in(mmio_irqchip, RTC_IRQ));
  1478. for (i = 0; i < ARRAY_SIZE(s->flash); i++) {
  1479. /* Map legacy -drive if=pflash to machine properties */
  1480. pflash_cfi01_legacy_drive(s->flash[i],
  1481. drive_get(IF_PFLASH, 0, i));
  1482. }
  1483. virt_flash_map(s, system_memory);
  1484. /* load/create device tree */
  1485. if (machine->dtb) {
  1486. machine->fdt = load_device_tree(machine->dtb, &s->fdt_size);
  1487. if (!machine->fdt) {
  1488. error_report("load_device_tree() failed");
  1489. exit(1);
  1490. }
  1491. } else {
  1492. create_fdt(s, memmap);
  1493. }
  1494. if (virt_is_iommu_sys_enabled(s)) {
  1495. DeviceState *iommu_sys = qdev_new(TYPE_RISCV_IOMMU_SYS);
  1496. object_property_set_uint(OBJECT(iommu_sys), "addr",
  1497. s->memmap[VIRT_IOMMU_SYS].base,
  1498. &error_fatal);
  1499. object_property_set_uint(OBJECT(iommu_sys), "base-irq",
  1500. IOMMU_SYS_IRQ,
  1501. &error_fatal);
  1502. object_property_set_link(OBJECT(iommu_sys), "irqchip",
  1503. OBJECT(mmio_irqchip),
  1504. &error_fatal);
  1505. sysbus_realize_and_unref(SYS_BUS_DEVICE(iommu_sys), &error_fatal);
  1506. }
  1507. s->machine_done.notify = virt_machine_done;
  1508. qemu_add_machine_init_done_notifier(&s->machine_done);
  1509. }
  1510. static void virt_machine_instance_init(Object *obj)
  1511. {
  1512. RISCVVirtState *s = RISCV_VIRT_MACHINE(obj);
  1513. virt_flash_create(s);
  1514. s->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6);
  1515. s->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8);
  1516. s->acpi = ON_OFF_AUTO_AUTO;
  1517. s->iommu_sys = ON_OFF_AUTO_AUTO;
  1518. }
  1519. static char *virt_get_aia_guests(Object *obj, Error **errp)
  1520. {
  1521. RISCVVirtState *s = RISCV_VIRT_MACHINE(obj);
  1522. return g_strdup_printf("%d", s->aia_guests);
  1523. }
  1524. static void virt_set_aia_guests(Object *obj, const char *val, Error **errp)
  1525. {
  1526. RISCVVirtState *s = RISCV_VIRT_MACHINE(obj);
  1527. s->aia_guests = atoi(val);
  1528. if (s->aia_guests < 0 || s->aia_guests > VIRT_IRQCHIP_MAX_GUESTS) {
  1529. error_setg(errp, "Invalid number of AIA IMSIC guests");
  1530. error_append_hint(errp, "Valid values be between 0 and %d.\n",
  1531. VIRT_IRQCHIP_MAX_GUESTS);
  1532. }
  1533. }
  1534. static char *virt_get_aia(Object *obj, Error **errp)
  1535. {
  1536. RISCVVirtState *s = RISCV_VIRT_MACHINE(obj);
  1537. const char *val;
  1538. switch (s->aia_type) {
  1539. case VIRT_AIA_TYPE_APLIC:
  1540. val = "aplic";
  1541. break;
  1542. case VIRT_AIA_TYPE_APLIC_IMSIC:
  1543. val = "aplic-imsic";
  1544. break;
  1545. default:
  1546. val = "none";
  1547. break;
  1548. };
  1549. return g_strdup(val);
  1550. }
  1551. static void virt_set_aia(Object *obj, const char *val, Error **errp)
  1552. {
  1553. RISCVVirtState *s = RISCV_VIRT_MACHINE(obj);
  1554. if (!strcmp(val, "none")) {
  1555. s->aia_type = VIRT_AIA_TYPE_NONE;
  1556. } else if (!strcmp(val, "aplic")) {
  1557. s->aia_type = VIRT_AIA_TYPE_APLIC;
  1558. } else if (!strcmp(val, "aplic-imsic")) {
  1559. s->aia_type = VIRT_AIA_TYPE_APLIC_IMSIC;
  1560. } else {
  1561. error_setg(errp, "Invalid AIA interrupt controller type");
  1562. error_append_hint(errp, "Valid values are none, aplic, and "
  1563. "aplic-imsic.\n");
  1564. }
  1565. }
  1566. static bool virt_get_aclint(Object *obj, Error **errp)
  1567. {
  1568. RISCVVirtState *s = RISCV_VIRT_MACHINE(obj);
  1569. return s->have_aclint;
  1570. }
  1571. static void virt_set_aclint(Object *obj, bool value, Error **errp)
  1572. {
  1573. RISCVVirtState *s = RISCV_VIRT_MACHINE(obj);
  1574. s->have_aclint = value;
  1575. }
  1576. bool virt_is_iommu_sys_enabled(RISCVVirtState *s)
  1577. {
  1578. return s->iommu_sys == ON_OFF_AUTO_ON;
  1579. }
  1580. static void virt_get_iommu_sys(Object *obj, Visitor *v, const char *name,
  1581. void *opaque, Error **errp)
  1582. {
  1583. RISCVVirtState *s = RISCV_VIRT_MACHINE(obj);
  1584. OnOffAuto iommu_sys = s->iommu_sys;
  1585. visit_type_OnOffAuto(v, name, &iommu_sys, errp);
  1586. }
  1587. static void virt_set_iommu_sys(Object *obj, Visitor *v, const char *name,
  1588. void *opaque, Error **errp)
  1589. {
  1590. RISCVVirtState *s = RISCV_VIRT_MACHINE(obj);
  1591. visit_type_OnOffAuto(v, name, &s->iommu_sys, errp);
  1592. }
  1593. bool virt_is_acpi_enabled(RISCVVirtState *s)
  1594. {
  1595. return s->acpi != ON_OFF_AUTO_OFF;
  1596. }
  1597. static void virt_get_acpi(Object *obj, Visitor *v, const char *name,
  1598. void *opaque, Error **errp)
  1599. {
  1600. RISCVVirtState *s = RISCV_VIRT_MACHINE(obj);
  1601. OnOffAuto acpi = s->acpi;
  1602. visit_type_OnOffAuto(v, name, &acpi, errp);
  1603. }
  1604. static void virt_set_acpi(Object *obj, Visitor *v, const char *name,
  1605. void *opaque, Error **errp)
  1606. {
  1607. RISCVVirtState *s = RISCV_VIRT_MACHINE(obj);
  1608. visit_type_OnOffAuto(v, name, &s->acpi, errp);
  1609. }
  1610. static HotplugHandler *virt_machine_get_hotplug_handler(MachineState *machine,
  1611. DeviceState *dev)
  1612. {
  1613. MachineClass *mc = MACHINE_GET_CLASS(machine);
  1614. RISCVVirtState *s = RISCV_VIRT_MACHINE(machine);
  1615. if (device_is_dynamic_sysbus(mc, dev) ||
  1616. object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI) ||
  1617. object_dynamic_cast(OBJECT(dev), TYPE_RISCV_IOMMU_PCI)) {
  1618. s->iommu_sys = ON_OFF_AUTO_OFF;
  1619. return HOTPLUG_HANDLER(machine);
  1620. }
  1621. return NULL;
  1622. }
  1623. static void virt_machine_device_plug_cb(HotplugHandler *hotplug_dev,
  1624. DeviceState *dev, Error **errp)
  1625. {
  1626. RISCVVirtState *s = RISCV_VIRT_MACHINE(hotplug_dev);
  1627. if (s->platform_bus_dev) {
  1628. MachineClass *mc = MACHINE_GET_CLASS(s);
  1629. if (device_is_dynamic_sysbus(mc, dev)) {
  1630. platform_bus_link_device(PLATFORM_BUS_DEVICE(s->platform_bus_dev),
  1631. SYS_BUS_DEVICE(dev));
  1632. }
  1633. }
  1634. if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) {
  1635. create_fdt_virtio_iommu(s, pci_get_bdf(PCI_DEVICE(dev)));
  1636. }
  1637. if (object_dynamic_cast(OBJECT(dev), TYPE_RISCV_IOMMU_PCI)) {
  1638. create_fdt_iommu(s, pci_get_bdf(PCI_DEVICE(dev)));
  1639. s->iommu_sys = ON_OFF_AUTO_OFF;
  1640. }
  1641. }
  1642. static void virt_machine_class_init(ObjectClass *oc, void *data)
  1643. {
  1644. MachineClass *mc = MACHINE_CLASS(oc);
  1645. HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
  1646. mc->desc = "RISC-V VirtIO board";
  1647. mc->init = virt_machine_init;
  1648. mc->max_cpus = VIRT_CPUS_MAX;
  1649. mc->default_cpu_type = TYPE_RISCV_CPU_BASE;
  1650. mc->block_default_type = IF_VIRTIO;
  1651. mc->no_cdrom = 1;
  1652. mc->pci_allow_0_address = true;
  1653. mc->possible_cpu_arch_ids = riscv_numa_possible_cpu_arch_ids;
  1654. mc->cpu_index_to_instance_props = riscv_numa_cpu_index_to_props;
  1655. mc->get_default_cpu_node_id = riscv_numa_get_default_cpu_node_id;
  1656. mc->numa_mem_supported = true;
  1657. /* platform instead of architectural choice */
  1658. mc->cpu_cluster_has_numa_boundary = true;
  1659. mc->default_ram_id = "riscv_virt_board.ram";
  1660. assert(!mc->get_hotplug_handler);
  1661. mc->get_hotplug_handler = virt_machine_get_hotplug_handler;
  1662. hc->plug = virt_machine_device_plug_cb;
  1663. machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE);
  1664. machine_class_allow_dynamic_sysbus_dev(mc, TYPE_UEFI_VARS_SYSBUS);
  1665. #ifdef CONFIG_TPM
  1666. machine_class_allow_dynamic_sysbus_dev(mc, TYPE_TPM_TIS_SYSBUS);
  1667. machine_class_allow_dynamic_sysbus_dev(mc, TYPE_TPM_CRB_SYSBUS);
  1668. #endif
  1669. object_class_property_add_bool(oc, "aclint", virt_get_aclint,
  1670. virt_set_aclint);
  1671. object_class_property_set_description(oc, "aclint",
  1672. "(TCG only) Set on/off to "
  1673. "enable/disable emulating "
  1674. "ACLINT devices");
  1675. object_class_property_add_str(oc, "aia", virt_get_aia,
  1676. virt_set_aia);
  1677. object_class_property_set_description(oc, "aia",
  1678. "Set type of AIA interrupt "
  1679. "controller. Valid values are "
  1680. "none, aplic, and aplic-imsic.");
  1681. object_class_property_add_str(oc, "aia-guests",
  1682. virt_get_aia_guests,
  1683. virt_set_aia_guests);
  1684. {
  1685. g_autofree char *str =
  1686. g_strdup_printf("Set number of guest MMIO pages for AIA IMSIC. "
  1687. "Valid value should be between 0 and %d.",
  1688. VIRT_IRQCHIP_MAX_GUESTS);
  1689. object_class_property_set_description(oc, "aia-guests", str);
  1690. }
  1691. object_class_property_add(oc, "acpi", "OnOffAuto",
  1692. virt_get_acpi, virt_set_acpi,
  1693. NULL, NULL);
  1694. object_class_property_set_description(oc, "acpi",
  1695. "Enable ACPI");
  1696. object_class_property_add(oc, "iommu-sys", "OnOffAuto",
  1697. virt_get_iommu_sys, virt_set_iommu_sys,
  1698. NULL, NULL);
  1699. object_class_property_set_description(oc, "iommu-sys",
  1700. "Enable IOMMU platform device");
  1701. }
  1702. static const TypeInfo virt_machine_typeinfo = {
  1703. .name = MACHINE_TYPE_NAME("virt"),
  1704. .parent = TYPE_MACHINE,
  1705. .class_init = virt_machine_class_init,
  1706. .instance_init = virt_machine_instance_init,
  1707. .instance_size = sizeof(RISCVVirtState),
  1708. .interfaces = (InterfaceInfo[]) {
  1709. { TYPE_HOTPLUG_HANDLER },
  1710. { }
  1711. },
  1712. };
  1713. static void virt_machine_init_register_types(void)
  1714. {
  1715. type_register_static(&virt_machine_typeinfo);
  1716. }
  1717. type_init(virt_machine_init_register_types)