Lines Matching +full:cpu +full:- +full:interrupt +full:- +full:controller

1 /* SPDX-License-Identifier: GPL-2.0-or-later */
6 #include "qemu/error-report.h"
7 #include "qemu/guest-random.h"
10 #include "hw/core/sysbus-fdt.h"
14 #include "hw/pci-host/gpex.h"
15 #include "hw/pci-host/ls7a.h"
18 #include "target/loongarch/cpu.h"
25 ms->fdt = create_device_tree(&lvms->fdt_size); in create_fdt()
26 if (!ms->fdt) { in create_fdt()
32 qemu_fdt_setprop_string(ms->fdt, "/", "compatible", in create_fdt()
33 "linux,dummy-loongson3"); in create_fdt()
34 qemu_fdt_setprop_cell(ms->fdt, "/", "#address-cells", 0x2); in create_fdt()
35 qemu_fdt_setprop_cell(ms->fdt, "/", "#size-cells", 0x2); in create_fdt()
36 qemu_fdt_add_subnode(ms->fdt, "/chosen"); in create_fdt()
40 qemu_fdt_setprop(ms->fdt, "/chosen", "rng-seed", rng_seed, sizeof(rng_seed)); in create_fdt()
49 LoongArchCPU *cpu; in fdt_add_cpu_nodes() local
53 qemu_fdt_add_subnode(ms->fdt, "/cpus"); in fdt_add_cpu_nodes()
54 qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#address-cells", 0x1); in fdt_add_cpu_nodes()
55 qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#size-cells", 0x0); in fdt_add_cpu_nodes()
57 /* cpu nodes */ in fdt_add_cpu_nodes()
58 possible_cpus = mc->possible_cpu_arch_ids(ms); in fdt_add_cpu_nodes()
59 for (num = 0; num < possible_cpus->len; num++) { in fdt_add_cpu_nodes()
60 cs = possible_cpus->cpus[num].cpu; in fdt_add_cpu_nodes()
65 nodename = g_strdup_printf("/cpus/cpu@%d", num); in fdt_add_cpu_nodes()
66 cpu = LOONGARCH_CPU(cs); in fdt_add_cpu_nodes()
68 qemu_fdt_add_subnode(ms->fdt, nodename); in fdt_add_cpu_nodes()
69 qemu_fdt_setprop_string(ms->fdt, nodename, "device_type", "cpu"); in fdt_add_cpu_nodes()
70 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", in fdt_add_cpu_nodes()
71 cpu->dtb_compatible); in fdt_add_cpu_nodes()
72 if (possible_cpus->cpus[num].props.has_node_id) { in fdt_add_cpu_nodes()
73 qemu_fdt_setprop_cell(ms->fdt, nodename, "numa-node-id", in fdt_add_cpu_nodes()
74 possible_cpus->cpus[num].props.node_id); in fdt_add_cpu_nodes()
76 qemu_fdt_setprop_cell(ms->fdt, nodename, "reg", num); in fdt_add_cpu_nodes()
77 qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle", in fdt_add_cpu_nodes()
78 qemu_fdt_alloc_phandle(ms->fdt)); in fdt_add_cpu_nodes()
82 /*cpu map */ in fdt_add_cpu_nodes()
83 qemu_fdt_add_subnode(ms->fdt, "/cpus/cpu-map"); in fdt_add_cpu_nodes()
84 for (num = 0; num < possible_cpus->len; num++) { in fdt_add_cpu_nodes()
85 cs = possible_cpus->cpus[num].cpu; in fdt_add_cpu_nodes()
90 nodename = g_strdup_printf("/cpus/cpu@%d", num); in fdt_add_cpu_nodes()
91 if (ms->smp.threads > 1) { in fdt_add_cpu_nodes()
93 "/cpus/cpu-map/socket%d/core%d/thread%d", in fdt_add_cpu_nodes()
94 num / (ms->smp.cores * ms->smp.threads), in fdt_add_cpu_nodes()
95 (num / ms->smp.threads) % ms->smp.cores, in fdt_add_cpu_nodes()
96 num % ms->smp.threads); in fdt_add_cpu_nodes()
99 "/cpus/cpu-map/socket%d/core%d", in fdt_add_cpu_nodes()
100 num / ms->smp.cores, in fdt_add_cpu_nodes()
101 num % ms->smp.cores); in fdt_add_cpu_nodes()
103 qemu_fdt_add_path(ms->fdt, map_path); in fdt_add_cpu_nodes()
104 qemu_fdt_setprop_phandle(ms->fdt, map_path, "cpu", nodename); in fdt_add_cpu_nodes()
116 qemu_fdt_add_subnode(ms->fdt, nodename); in fdt_add_memory_node()
117 qemu_fdt_setprop_cells(ms->fdt, nodename, "reg", base >> 32, base, in fdt_add_memory_node()
119 qemu_fdt_setprop_string(ms->fdt, nodename, "device_type", "memory"); in fdt_add_memory_node()
121 if (ms->numa_state && ms->numa_state->num_nodes) { in fdt_add_memory_node()
122 qemu_fdt_setprop_cell(ms->fdt, nodename, "numa-node-id", node_id); in fdt_add_memory_node()
134 ram_size = ms->ram_size; in fdt_add_memory_nodes()
137 nodes = nb_numa_nodes = ms->numa_state->num_nodes; in fdt_add_memory_nodes()
138 numa_info = ms->numa_state->nodes; in fdt_add_memory_nodes()
153 * highram: [VIRT_HIGHMEM_BASE, +(len - gap)) in fdt_add_memory_nodes()
157 size -= gap; in fdt_add_memory_nodes()
159 gap = ram_size - VIRT_LOWMEM_SIZE; in fdt_add_memory_nodes()
165 gap -= size; in fdt_add_memory_nodes()
177 qemu_fdt_add_subnode(ms->fdt, nodename); in fdt_add_fw_cfg_node()
178 qemu_fdt_setprop_string(ms->fdt, nodename, in fdt_add_fw_cfg_node()
179 "compatible", "qemu,fw-cfg-mmio"); in fdt_add_fw_cfg_node()
180 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", in fdt_add_fw_cfg_node()
182 qemu_fdt_setprop(ms->fdt, nodename, "dma-coherent", NULL, 0); in fdt_add_fw_cfg_node()
198 flash_mem = pflash_cfi01_get_memory(lvms->flash[0]); in fdt_add_flash_node()
199 flash0_base = flash_mem->addr; in fdt_add_flash_node()
202 flash_mem = pflash_cfi01_get_memory(lvms->flash[1]); in fdt_add_flash_node()
203 flash1_base = flash_mem->addr; in fdt_add_flash_node()
207 qemu_fdt_add_subnode(ms->fdt, nodename); in fdt_add_flash_node()
208 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", "cfi-flash"); in fdt_add_flash_node()
209 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", in fdt_add_flash_node()
212 qemu_fdt_setprop_cell(ms->fdt, nodename, "bank-width", 4); in fdt_add_flash_node()
222 *cpuintc_phandle = qemu_fdt_alloc_phandle(ms->fdt); in fdt_add_cpuic_node()
224 qemu_fdt_add_subnode(ms->fdt, nodename); in fdt_add_cpuic_node()
225 qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle", *cpuintc_phandle); in fdt_add_cpuic_node()
226 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", in fdt_add_cpuic_node()
227 "loongson,cpu-interrupt-controller"); in fdt_add_cpuic_node()
228 qemu_fdt_setprop(ms->fdt, nodename, "interrupt-controller", NULL, 0); in fdt_add_cpuic_node()
229 qemu_fdt_setprop_cell(ms->fdt, nodename, "#interrupt-cells", 1); in fdt_add_cpuic_node()
242 *eiointc_phandle = qemu_fdt_alloc_phandle(ms->fdt); in fdt_add_eiointc_node()
244 qemu_fdt_add_subnode(ms->fdt, nodename); in fdt_add_eiointc_node()
245 qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle", *eiointc_phandle); in fdt_add_eiointc_node()
246 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", in fdt_add_eiointc_node()
247 "loongson,ls2k2000-eiointc"); in fdt_add_eiointc_node()
248 qemu_fdt_setprop(ms->fdt, nodename, "interrupt-controller", NULL, 0); in fdt_add_eiointc_node()
249 qemu_fdt_setprop_cell(ms->fdt, nodename, "#interrupt-cells", 1); in fdt_add_eiointc_node()
250 qemu_fdt_setprop_cell(ms->fdt, nodename, "interrupt-parent", in fdt_add_eiointc_node()
252 qemu_fdt_setprop_cell(ms->fdt, nodename, "interrupts", 3); in fdt_add_eiointc_node()
253 qemu_fdt_setprop_cells(ms->fdt, nodename, "reg", 0x0, in fdt_add_eiointc_node()
267 *pch_pic_phandle = qemu_fdt_alloc_phandle(ms->fdt); in fdt_add_pch_pic_node()
269 qemu_fdt_add_subnode(ms->fdt, nodename); in fdt_add_pch_pic_node()
270 qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle", *pch_pic_phandle); in fdt_add_pch_pic_node()
271 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", in fdt_add_pch_pic_node()
272 "loongson,pch-pic-1.0"); in fdt_add_pch_pic_node()
273 qemu_fdt_setprop_cells(ms->fdt, nodename, "reg", 0, in fdt_add_pch_pic_node()
275 qemu_fdt_setprop(ms->fdt, nodename, "interrupt-controller", NULL, 0); in fdt_add_pch_pic_node()
276 qemu_fdt_setprop_cell(ms->fdt, nodename, "#interrupt-cells", 2); in fdt_add_pch_pic_node()
277 qemu_fdt_setprop_cell(ms->fdt, nodename, "interrupt-parent", in fdt_add_pch_pic_node()
279 qemu_fdt_setprop_cell(ms->fdt, nodename, "loongson,pic-base-vec", 0); in fdt_add_pch_pic_node()
292 *pch_msi_phandle = qemu_fdt_alloc_phandle(ms->fdt); in fdt_add_pch_msi_node()
294 qemu_fdt_add_subnode(ms->fdt, nodename); in fdt_add_pch_msi_node()
295 qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle", *pch_msi_phandle); in fdt_add_pch_msi_node()
296 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", in fdt_add_pch_msi_node()
297 "loongson,pch-msi-1.0"); in fdt_add_pch_msi_node()
298 qemu_fdt_setprop_cells(ms->fdt, nodename, "reg", in fdt_add_pch_msi_node()
301 qemu_fdt_setprop(ms->fdt, nodename, "interrupt-controller", NULL, 0); in fdt_add_pch_msi_node()
302 qemu_fdt_setprop_cell(ms->fdt, nodename, "interrupt-parent", in fdt_add_pch_msi_node()
304 qemu_fdt_setprop_cell(ms->fdt, nodename, "loongson,msi-base-vec", in fdt_add_pch_msi_node()
306 qemu_fdt_setprop_cell(ms->fdt, nodename, "loongson,msi-num-vecs", in fdt_add_pch_msi_node()
307 EXTIOI_IRQS - VIRT_PCH_PIC_IRQ_NUM); in fdt_add_pch_msi_node()
323 * each device's first interrupt is based on it's PCI_SLOT number. in fdt_add_pcie_irq_map_node()
326 * We only need one entry per interrupt in the table (not one per in fdt_add_pcie_irq_map_node()
327 * possible slot) seeing the interrupt-map-mask will allow the table in fdt_add_pcie_irq_map_node()
342 /* Fill PCI Interrupt cells */ in fdt_add_pcie_irq_map_node()
346 /* Fill interrupt controller phandle and cells */ in fdt_add_pcie_irq_map_node()
358 qemu_fdt_setprop(ms->fdt, nodename, "interrupt-map", full_irq_map, in fdt_add_pcie_irq_map_node()
361 qemu_fdt_setprop_cells(ms->fdt, nodename, "interrupt-map-mask", in fdt_add_pcie_irq_map_node()
380 qemu_fdt_add_subnode(ms->fdt, nodename); in fdt_add_pcie_node()
381 qemu_fdt_setprop_string(ms->fdt, nodename, in fdt_add_pcie_node()
382 "compatible", "pci-host-ecam-generic"); in fdt_add_pcie_node()
383 qemu_fdt_setprop_string(ms->fdt, nodename, "device_type", "pci"); in fdt_add_pcie_node()
384 qemu_fdt_setprop_cell(ms->fdt, nodename, "#address-cells", 3); in fdt_add_pcie_node()
385 qemu_fdt_setprop_cell(ms->fdt, nodename, "#size-cells", 2); in fdt_add_pcie_node()
386 qemu_fdt_setprop_cell(ms->fdt, nodename, "linux,pci-domain", 0); in fdt_add_pcie_node()
387 qemu_fdt_setprop_cells(ms->fdt, nodename, "bus-range", 0, in fdt_add_pcie_node()
388 PCIE_MMCFG_BUS(VIRT_PCI_CFG_SIZE - 1)); in fdt_add_pcie_node()
389 qemu_fdt_setprop(ms->fdt, nodename, "dma-coherent", NULL, 0); in fdt_add_pcie_node()
390 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", in fdt_add_pcie_node()
392 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "ranges", in fdt_add_pcie_node()
397 qemu_fdt_setprop_cells(ms->fdt, nodename, "msi-map", in fdt_add_pcie_node()
412 qemu_fdt_add_subnode(ms->fdt, nodename); in fdt_add_uart_node()
413 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", "ns16550a"); in fdt_add_uart_node()
414 qemu_fdt_setprop_cells(ms->fdt, nodename, "reg", 0x0, base, 0x0, size); in fdt_add_uart_node()
415 qemu_fdt_setprop_cell(ms->fdt, nodename, "clock-frequency", 100000000); in fdt_add_uart_node()
417 qemu_fdt_setprop_string(ms->fdt, "/chosen", "stdout-path", nodename); in fdt_add_uart_node()
419 qemu_fdt_setprop_cells(ms->fdt, nodename, "interrupts", irq, 0x4); in fdt_add_uart_node()
420 qemu_fdt_setprop_cell(ms->fdt, nodename, "interrupt-parent", in fdt_add_uart_node()
434 qemu_fdt_add_subnode(ms->fdt, nodename); in fdt_add_rtc_node()
435 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", in fdt_add_rtc_node()
436 "loongson,ls7a-rtc"); in fdt_add_rtc_node()
437 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", 2, base, 2, size); in fdt_add_rtc_node()
438 qemu_fdt_setprop_cells(ms->fdt, nodename, "interrupts", in fdt_add_rtc_node()
439 VIRT_RTC_IRQ - VIRT_GSI_BASE , 0x4); in fdt_add_rtc_node()
440 qemu_fdt_setprop_cell(ms->fdt, nodename, "interrupt-parent", in fdt_add_rtc_node()
453 ged_handle = qemu_fdt_alloc_phandle(ms->fdt); in fdt_add_ged_reset()
455 qemu_fdt_add_subnode(ms->fdt, name); in fdt_add_ged_reset()
456 qemu_fdt_setprop_string(ms->fdt, name, "compatible", "syscon"); in fdt_add_ged_reset()
457 qemu_fdt_setprop_cells(ms->fdt, name, "reg", 0x0, base, 0x0, size); in fdt_add_ged_reset()
459 qemu_fdt_setprop_cell(ms->fdt, name, "reg-shift", 0); in fdt_add_ged_reset()
460 qemu_fdt_setprop_cell(ms->fdt, name, "reg-io-width", 1); in fdt_add_ged_reset()
461 qemu_fdt_setprop_cell(ms->fdt, name, "phandle", ged_handle); in fdt_add_ged_reset()
462 ged_handle = qemu_fdt_get_phandle(ms->fdt, name); in fdt_add_ged_reset()
466 qemu_fdt_add_subnode(ms->fdt, name); in fdt_add_ged_reset()
467 qemu_fdt_setprop_string(ms->fdt, name, "compatible", "syscon-reboot"); in fdt_add_ged_reset()
468 qemu_fdt_setprop_cell(ms->fdt, name, "regmap", ged_handle); in fdt_add_ged_reset()
469 qemu_fdt_setprop_cell(ms->fdt, name, "offset", ACPI_GED_REG_RESET); in fdt_add_ged_reset()
470 qemu_fdt_setprop_cell(ms->fdt, name, "value", ACPI_GED_RESET_VALUE); in fdt_add_ged_reset()
474 qemu_fdt_add_subnode(ms->fdt, name); in fdt_add_ged_reset()
475 qemu_fdt_setprop_string(ms->fdt, name, "compatible", "syscon-poweroff"); in fdt_add_ged_reset()
476 qemu_fdt_setprop_cell(ms->fdt, name, "regmap", ged_handle); in fdt_add_ged_reset()
477 qemu_fdt_setprop_cell(ms->fdt, name, "offset", ACPI_GED_REG_SLEEP_CTL); in fdt_add_ged_reset()
478 qemu_fdt_setprop_cell(ms->fdt, name, "value", ACPI_GED_SLP_EN | in fdt_add_ged_reset()
495 /* Add cpu interrupt-controller */ in virt_fdt_setup()
497 /* Add Extend I/O Interrupt Controller node */ in virt_fdt_setup()
510 for (i = VIRT_UART_COUNT; i-- > 0;) { in virt_fdt_setup()
512 int irq = VIRT_UART_IRQ + i - VIRT_GSI_BASE; in virt_fdt_setup()
518 platform_bus_add_all_fdt_nodes(machine->fdt, "/platic", in virt_fdt_setup()
530 rom_add_blob_fixed_as("fdt", machine->fdt, lvms->fdt_size, FDT_BASE, in virt_fdt_setup()
533 rom_ptr_for_as(&address_space_memory, FDT_BASE, lvms->fdt_size)); in virt_fdt_setup()